Changeset 73 in code for trunk


Ignore:
Timestamp:
Mar 4, 2020, 2:44:13 PM (5 years ago)
Author:
contact
Message:

Allow clients to specify an upstream name in their username

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r72 r73  
    5959        username   string
    6060        realname   string
     61        upstream   *Upstream
    6162}
    6263
     
    9899}
    99100
     101func (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
    100110func (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
    107133}
    108134
     
    275301
    276302func (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)
    278313        if u == nil {
    279                 dc.logger.Printf("failed authentication: unknown username %q", dc.username)
     314                dc.logger.Printf("failed authentication: unknown username %q", username)
    280315                dc.SendMessage(&irc.Message{
    281316                        Prefix:  dc.srv.prefix(),
     
    286321        }
    287322
     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
    288336        dc.registered = true
    289337        dc.user = u
     
    320368        })
    321369
    322         u.forEachUpstream(func(uc *upstreamConn) {
     370        dc.forEachUpstream(func(uc *upstreamConn) {
    323371                // TODO: fix races accessing upstream connection data
    324372                for _, ch := range uc.channels {
     
    328376                }
    329377
    330                 // TODO: let clients specify the ring buffer name in their username
    331                 historyName := ""
     378                historyName := dc.username
    332379
    333380                var seqPtr *uint64
     
    377424                }}
    378425        case "NICK":
    379                 dc.user.forEachUpstream(func(uc *upstreamConn) {
     426                dc.forEachUpstream(func(uc *upstreamConn) {
    380427                        uc.SendMessage(msg)
    381428                })
     
    449496
    450497                        if modeStr != "" {
    451                                 dc.user.forEachUpstream(func(uc *upstreamConn) {
     498                                dc.forEachUpstream(func(uc *upstreamConn) {
    452499                                        uc.SendMessage(&irc.Message{
    453500                                                Command: "MODE",
  • trunk/server.go

    r71 r73  
    8383}
    8484
    85 func (u *user) getChannel(name string) (*upstreamChannel, error) {
     85func (u *user) getChannel(name string, upstream *Upstream) (*upstreamChannel, error) {
    8686        var channel *upstreamChannel
    8787        var err error
    8888        u.forEachUpstream(func(uc *upstreamConn) {
    8989                if err != nil {
     90                        return
     91                }
     92                if upstream != nil && uc.upstream != upstream {
    9093                        return
    9194                }
     
    197200}
    198201
     202func (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
    199211func (s *Server) Serve(ln net.Listener) error {
    200212        for {
  • trunk/upstream.go

    r72 r73  
    101101}
    102102
     103func (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
    103112func (uc *upstreamConn) getChannel(name string) (*upstreamChannel, error) {
    104113        ch, ok := uc.channels[name]
     
    141150                        }
    142151
    143                         uc.user.forEachDownstream(func(dc *downstreamConn) {
     152                        uc.forEachDownstream(func(dc *downstreamConn) {
    144153                                dc.SendMessage(&irc.Message{
    145154                                        Prefix:  dc.marshalUserPrefix(uc, msg.Prefix),
     
    211220                        }
    212221
    213                         uc.user.forEachDownstream(func(dc *downstreamConn) {
     222                        uc.forEachDownstream(func(dc *downstreamConn) {
    214223                                dc.SendMessage(&irc.Message{
    215224                                        Prefix:  dc.marshalUserPrefix(uc, msg.Prefix),
     
    241250                        }
    242251
    243                         uc.user.forEachDownstream(func(dc *downstreamConn) {
     252                        uc.forEachDownstream(func(dc *downstreamConn) {
    244253                                dc.SendMessage(&irc.Message{
    245254                                        Prefix:  dc.marshalUserPrefix(uc, msg.Prefix),
     
    327336                ch.complete = true
    328337
    329                 uc.user.forEachDownstream(func(dc *downstreamConn) {
     338                uc.forEachDownstream(func(dc *downstreamConn) {
    330339                        forwardChannel(dc, ch)
    331340                })
Note: See TracChangeset for help on using the changeset viewer.