Changeset 95 in code for trunk/downstream.go


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

Add support for SASL authentication

We now store SASL credentials in the database and automatically populate
them on NickServ REGISTER/IDENTIFY.

References: https://todo.sr.ht/~emersion/jounce/10

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r93 r95  
    382382                        }
    383383
    384                         dc.logger.Printf("trying to connect to new upstream server %q", addr)
     384                        dc.logger.Printf("trying to connect to new network %q", addr)
    385385                        if err := sanityCheckServer(addr); err != nil {
    386386                                dc.logger.Printf("failed to connect to %q: %v", addr, err)
     
    391391                        }
    392392
    393                         dc.logger.Printf("auto-adding network %q", networkName)
     393                        dc.logger.Printf("auto-saving network %q", networkName)
    394394                        network, err = u.createNetwork(networkName, dc.nick)
    395395                        if err != nil {
     
    619619                        }
    620620
     621                        if upstreamName == "NickServ" {
     622                                dc.handleNickServPRIVMSG(uc, text)
     623                        }
     624
    621625                        uc.SendMessage(&irc.Message{
    622626                                Command: "PRIVMSG",
     
    630634        return nil
    631635}
     636
     637func (dc *downstreamConn) handleNickServPRIVMSG(uc *upstreamConn, text string) {
     638        username, password, ok := parseNickServCredentials(text, uc.nick)
     639        if !ok {
     640                return
     641        }
     642
     643        dc.logger.Printf("auto-saving NickServ credentials with username %q", username)
     644        n := uc.network
     645        n.SASL.Mechanism = "PLAIN"
     646        n.SASL.Plain.Username = username
     647        n.SASL.Plain.Password = password
     648        if err := dc.srv.db.StoreNetwork(dc.user.Username, &n.Network); err != nil {
     649                dc.logger.Printf("failed to save NickServ credentials: %v", err)
     650        }
     651}
     652
     653func parseNickServCredentials(text, nick string) (username, password string, ok bool) {
     654        fields := strings.Fields(text)
     655        if len(fields) < 2 {
     656                return "", "", false
     657        }
     658        cmd := strings.ToUpper(fields[0])
     659        params := fields[1:]
     660        switch cmd {
     661        case "REGISTER":
     662                username = nick
     663                password = params[0]
     664        case "IDENTIFY":
     665                if len(params) == 1 {
     666                        username = nick
     667                } else {
     668                        username = params[0]
     669                }
     670                password = params[1]
     671        }
     672        return username, password, true
     673}
Note: See TracChangeset for help on using the changeset viewer.