Changeset 654 in code


Ignore:
Timestamp:
Oct 29, 2021, 1:51:13 PM (4 years ago)
Author:
contact
Message:

Unify BOUNCER ADDNETWORK and CHANGENETWORK

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r653 r654  
    7070}
    7171
     72func 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
    7295func getNetworkAttrs(network *network) irc.Tags {
    7396        state := "disconnected"
     
    89112        }
    90113
    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
     119func 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
     137func 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
    98158                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
    110177}
    111178
     
    22752342                        attrs := irc.ParseTags(attrsStr)
    22762343
    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
    23172353                        network, err := dc.user.createNetwork(record)
    23182354                        if err != nil {
     
    23482384
    23492385                        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 = ""
    23702392                        }
    23712393
Note: See TracChangeset for help on using the changeset viewer.