Changeset 73 in code for trunk/downstream.go


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

File:
1 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",
Note: See TracChangeset for help on using the changeset viewer.