- Timestamp:
- Oct 29, 2021, 1:51:13 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r653 r654 70 70 } 71 71 72 func fillNetworkAddrAttrs(attrs irc.Tags, network *Network) { 73 u, err := network.URL() 74 if err != nil { 75 return 76 } 77 78 hasHostPort := true 79 switch u.Scheme { 80 case "ircs": 81 attrs["tls"] = irc.TagValue("1") 82 case "irc+insecure": 83 attrs["tls"] = irc.TagValue("0") 84 default: // e.g. unix:// 85 hasHostPort = false 86 } 87 if host, port, err := net.SplitHostPort(u.Host); err == nil && hasHostPort { 88 attrs["host"] = irc.TagValue(host) 89 attrs["port"] = irc.TagValue(port) 90 } else if hasHostPort { 91 attrs["host"] = irc.TagValue(u.Host) 92 } 93 } 94 72 95 func getNetworkAttrs(network *network) irc.Tags { 73 96 state := "disconnected" … … 89 112 } 90 113 91 if u, err := network.URL(); err == nil { 92 hasHostPort := true 93 switch u.Scheme { 94 case "ircs": 95 attrs["tls"] = irc.TagValue("1") 96 case "irc+insecure": 97 attrs["tls"] = irc.TagValue("0") 114 fillNetworkAddrAttrs(attrs, &network.Network) 115 116 return attrs 117 } 118 119 func networkAddrFromAttrs(attrs irc.Tags) string { 120 host, ok := attrs.GetTag("host") 121 if !ok { 122 return "" 123 } 124 125 addr := host 126 if port, ok := attrs.GetTag("port"); ok { 127 addr += ":" + port 128 } 129 130 if tlsStr, ok := attrs.GetTag("tls"); ok && tlsStr == "0" { 131 addr = "irc+insecure://" + tlsStr 132 } 133 134 return addr 135 } 136 137 func updateNetworkAttrs(record *Network, attrs irc.Tags, subcommand string) error { 138 addrAttrs := irc.Tags{} 139 fillNetworkAddrAttrs(addrAttrs, record) 140 141 updateAddr := false 142 for k, v := range attrs { 143 s := string(v) 144 switch k { 145 case "host", "port", "tls": 146 updateAddr = true 147 addrAttrs[k] = v 148 case "name": 149 record.Name = s 150 case "nickname": 151 record.Nick = s 152 case "username": 153 record.Username = s 154 case "realname": 155 record.Realname = s 156 case "pass": 157 record.Pass = s 98 158 default: 99 hasHostPort = false 100 } 101 if host, port, err := net.SplitHostPort(u.Host); err == nil && hasHostPort { 102 attrs["host"] = irc.TagValue(host) 103 attrs["port"] = irc.TagValue(port) 104 } else if hasHostPort { 105 attrs["host"] = irc.TagValue(u.Host) 106 } 107 } 108 109 return attrs 159 return ircError{&irc.Message{ 160 Command: "FAIL", 161 Params: []string{"BOUNCER", "UNKNOWN_ATTRIBUTE", subcommand, k, "Unknown attribute"}, 162 }} 163 } 164 } 165 166 if updateAddr { 167 record.Addr = networkAddrFromAttrs(addrAttrs) 168 if record.Addr == "" { 169 return ircError{&irc.Message{ 170 Command: "FAIL", 171 Params: []string{"BOUNCER", "NEED_ATTRIBUTE", subcommand, "host", "Missing required host attribute"}, 172 }} 173 } 174 } 175 176 return nil 110 177 } 111 178 … … 2275 2342 attrs := irc.ParseTags(attrsStr) 2276 2343 2277 host, ok := attrs.GetTag("host") 2278 if !ok { 2279 return ircError{&irc.Message{ 2280 Command: "FAIL", 2281 Params: []string{"BOUNCER", "NEED_ATTRIBUTE", subcommand, "host", "Missing required host attribute"}, 2282 }} 2283 } 2284 2285 addr := host 2286 if port, ok := attrs.GetTag("port"); ok { 2287 addr += ":" + port 2288 } 2289 2290 if tlsStr, ok := attrs.GetTag("tls"); ok && tlsStr == "0" { 2291 addr = "irc+insecure://" + tlsStr 2292 } 2293 2294 nick, ok := attrs.GetTag("nickname") 2295 if !ok { 2296 nick = dc.nick 2297 } 2298 2299 username, _ := attrs.GetTag("username") 2300 realname, _ := attrs.GetTag("realname") 2301 pass, _ := attrs.GetTag("pass") 2302 2303 if realname == dc.user.Realname { 2304 realname = "" 2305 } 2306 2307 // TODO: reject unknown attributes 2308 2309 record := &Network{ 2310 Addr: addr, 2311 Nick: nick, 2312 Username: username, 2313 Realname: realname, 2314 Pass: pass, 2315 Enabled: true, 2316 } 2344 record := &Network{Nick: dc.nick, Enabled: true} 2345 if err := updateNetworkAttrs(record, attrs, subcommand); err != nil { 2346 return err 2347 } 2348 2349 if record.Realname == dc.user.Realname { 2350 record.Realname = "" 2351 } 2352 2317 2353 network, err := dc.user.createNetwork(record) 2318 2354 if err != nil { … … 2348 2384 2349 2385 record := net.Network // copy network record because we'll mutate it 2350 for k, v := range attrs { 2351 s := string(v) 2352 switch k { 2353 // TODO: host, port, tls 2354 case "name": 2355 record.Name = s 2356 case "nickname": 2357 record.Nick = s 2358 case "username": 2359 record.Username = s 2360 case "realname": 2361 record.Realname = s 2362 case "pass": 2363 record.Pass = s 2364 default: 2365 return ircError{&irc.Message{ 2366 Command: "FAIL", 2367 Params: []string{"BOUNCER", "UNKNOWN_ATTRIBUTE", subcommand, k, "Unknown attribute"}, 2368 }} 2369 } 2386 if err := updateNetworkAttrs(&record, attrs, subcommand); err != nil { 2387 return err 2388 } 2389 2390 if record.Realname == dc.user.Realname { 2391 record.Realname = "" 2370 2392 } 2371 2393
Note:
See TracChangeset
for help on using the changeset viewer.