- Timestamp:
- Mar 4, 2020, 2:44:13 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r72 r73 59 59 username string 60 60 realname string 61 upstream *Upstream 61 62 } 62 63 … … 98 99 } 99 100 101 func (dc *downstreamConn) forEachUpstream(f func(*upstreamConn)) { 102 dc.user.forEachUpstream(func(uc *upstreamConn) { 103 if dc.upstream != nil && uc.upstream != dc.upstream { 104 return 105 } 106 f(uc) 107 }) 108 } 109 100 110 func (dc *downstreamConn) unmarshalChannel(name string) (*upstreamConn, string, error) { 101 // TODO: extract network name from channel name 102 ch, err := dc.user.getChannel(name) 103 if err != nil { 104 return nil, "", err 105 } 106 return ch.conn, ch.Name, nil 111 // TODO: extract network name from channel name if dc.upstream == nil 112 var channel *upstreamChannel 113 var err error 114 dc.forEachUpstream(func(uc *upstreamConn) { 115 if err != nil { 116 return 117 } 118 if ch, ok := uc.channels[name]; ok { 119 if channel != nil { 120 err = fmt.Errorf("ambiguous channel name %q", name) 121 } else { 122 channel = ch 123 } 124 } 125 }) 126 if channel == nil { 127 return nil, "", ircError{&irc.Message{ 128 Command: irc.ERR_NOSUCHCHANNEL, 129 Params: []string{name, "No such channel"}, 130 }} 131 } 132 return channel.conn, channel.Name, nil 107 133 } 108 134 … … 275 301 276 302 func (dc *downstreamConn) register() error { 277 u := dc.srv.getUser(strings.TrimPrefix(dc.username, "~")) 303 username := strings.TrimPrefix(dc.username, "~") 304 var network string 305 if i := strings.LastIndexAny(username, "/@"); i >= 0 { 306 network = username[i+1:] 307 } 308 if i := strings.IndexAny(username, "/@"); i >= 0 { 309 username = username[:i] 310 } 311 312 u := dc.srv.getUser(username) 278 313 if u == nil { 279 dc.logger.Printf("failed authentication: unknown username %q", dc.username)314 dc.logger.Printf("failed authentication: unknown username %q", username) 280 315 dc.SendMessage(&irc.Message{ 281 316 Prefix: dc.srv.prefix(), … … 286 321 } 287 322 323 if network != "" { 324 dc.upstream = dc.srv.getUpstream(network) 325 if dc.upstream == nil { 326 dc.logger.Printf("failed registration: unknown upstream %q", network) 327 dc.SendMessage(&irc.Message{ 328 Prefix: dc.srv.prefix(), 329 Command: irc.ERR_PASSWDMISMATCH, 330 Params: []string{"*", fmt.Sprintf("Unknown upstream server %q", network)}, 331 }) 332 return nil 333 } 334 } 335 288 336 dc.registered = true 289 337 dc.user = u … … 320 368 }) 321 369 322 u.forEachUpstream(func(uc *upstreamConn) {370 dc.forEachUpstream(func(uc *upstreamConn) { 323 371 // TODO: fix races accessing upstream connection data 324 372 for _, ch := range uc.channels { … … 328 376 } 329 377 330 // TODO: let clients specify the ring buffer name in their username 331 historyName := "" 378 historyName := dc.username 332 379 333 380 var seqPtr *uint64 … … 377 424 }} 378 425 case "NICK": 379 dc. user.forEachUpstream(func(uc *upstreamConn) {426 dc.forEachUpstream(func(uc *upstreamConn) { 380 427 uc.SendMessage(msg) 381 428 }) … … 449 496 450 497 if modeStr != "" { 451 dc. user.forEachUpstream(func(uc *upstreamConn) {498 dc.forEachUpstream(func(uc *upstreamConn) { 452 499 uc.SendMessage(&irc.Message{ 453 500 Command: "MODE", -
trunk/server.go
r71 r73 83 83 } 84 84 85 func (u *user) getChannel(name string ) (*upstreamChannel, error) {85 func (u *user) getChannel(name string, upstream *Upstream) (*upstreamChannel, error) { 86 86 var channel *upstreamChannel 87 87 var err error 88 88 u.forEachUpstream(func(uc *upstreamConn) { 89 89 if err != nil { 90 return 91 } 92 if upstream != nil && uc.upstream != upstream { 90 93 return 91 94 } … … 197 200 } 198 201 202 func (s *Server) getUpstream(name string) *Upstream { 203 for i, upstream := range s.Upstreams { 204 if upstream.Addr == name { 205 return &s.Upstreams[i] 206 } 207 } 208 return nil 209 } 210 199 211 func (s *Server) Serve(ln net.Listener) error { 200 212 for { -
trunk/upstream.go
r72 r73 101 101 } 102 102 103 func (uc *upstreamConn) forEachDownstream(f func(*downstreamConn)) { 104 uc.user.forEachDownstream(func(dc *downstreamConn) { 105 if dc.upstream != nil && dc.upstream != uc.upstream { 106 return 107 } 108 f(dc) 109 }) 110 } 111 103 112 func (uc *upstreamConn) getChannel(name string) (*upstreamChannel, error) { 104 113 ch, ok := uc.channels[name] … … 141 150 } 142 151 143 uc. user.forEachDownstream(func(dc *downstreamConn) {152 uc.forEachDownstream(func(dc *downstreamConn) { 144 153 dc.SendMessage(&irc.Message{ 145 154 Prefix: dc.marshalUserPrefix(uc, msg.Prefix), … … 211 220 } 212 221 213 uc. user.forEachDownstream(func(dc *downstreamConn) {222 uc.forEachDownstream(func(dc *downstreamConn) { 214 223 dc.SendMessage(&irc.Message{ 215 224 Prefix: dc.marshalUserPrefix(uc, msg.Prefix), … … 241 250 } 242 251 243 uc. user.forEachDownstream(func(dc *downstreamConn) {252 uc.forEachDownstream(func(dc *downstreamConn) { 244 253 dc.SendMessage(&irc.Message{ 245 254 Prefix: dc.marshalUserPrefix(uc, msg.Prefix), … … 327 336 ch.complete = true 328 337 329 uc. user.forEachDownstream(func(dc *downstreamConn) {338 uc.forEachDownstream(func(dc *downstreamConn) { 330 339 forwardChannel(dc, ch) 331 340 })
Note:
See TracChangeset
for help on using the changeset viewer.