Changeset 95 in code for trunk/db.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/db.go

    r93 r95  
    1111        Username string
    1212        Password string // hashed
     13}
     14
     15type SASL struct {
     16        Mechanism string
     17
     18        Plain struct {
     19                Username string
     20                Password string
     21        }
    1322}
    1423
     
    2029        Realname string
    2130        Pass     string
     31        SASL     SASL
    2232}
    2333
     
    4454        defer db.lock.Unlock()
    4555        return db.Close()
     56}
     57
     58func fromStringPtr(ptr *string) string {
     59        if ptr == nil {
     60                return ""
     61        }
     62        return *ptr
     63}
     64
     65func toStringPtr(s string) *string {
     66        if s == "" {
     67                return nil
     68        }
     69        return &s
    4670}
    4771
     
    6387                        return nil, err
    6488                }
    65                 if password != nil {
    66                         user.Password = *password
    67                 }
     89                user.Password = fromStringPtr(password)
    6890                users = append(users, user)
    6991        }
     
    79101        defer db.lock.Unlock()
    80102
    81         var password *string
    82         if user.Password != "" {
    83                 password = &user.Password
    84         }
     103        password := toStringPtr(user.Password)
    85104        _, err := db.db.Exec("INSERT INTO User(username, password) VALUES (?, ?)", user.Username, password)
    86105        return err
     
    91110        defer db.lock.RUnlock()
    92111
    93         rows, err := db.db.Query("SELECT id, addr, nick, username, realname, pass FROM Network WHERE user = ?", username)
     112        rows, err := db.db.Query(`SELECT id, addr, nick, username, realname, pass,
     113                        sasl_mechanism, sasl_plain_username, sasl_plain_password
     114                FROM Network
     115                WHERE user = ?`,
     116                username)
    94117        if err != nil {
    95118                return nil, err
     
    101124                var net Network
    102125                var username, realname, pass *string
    103                 if err := rows.Scan(&net.ID, &net.Addr, &net.Nick, &username, &realname, &pass); err != nil {
     126                var saslMechanism, saslPlainUsername, saslPlainPassword *string
     127                err := rows.Scan(&net.ID, &net.Addr, &net.Nick, &username, &realname,
     128                        &pass, &saslMechanism, &saslPlainUsername, &saslPlainPassword)
     129                if err != nil {
    104130                        return nil, err
    105131                }
    106                 if username != nil {
    107                         net.Username = *username
    108                 }
    109                 if realname != nil {
    110                         net.Realname = *realname
    111                 }
    112                 if pass != nil {
    113                         net.Pass = *pass
    114                 }
     132                net.Username = fromStringPtr(username)
     133                net.Realname = fromStringPtr(realname)
     134                net.Pass = fromStringPtr(pass)
     135                net.SASL.Mechanism = fromStringPtr(saslMechanism)
     136                net.SASL.Plain.Username = fromStringPtr(saslPlainUsername)
     137                net.SASL.Plain.Password = fromStringPtr(saslPlainPassword)
    115138                networks = append(networks, net)
    116139        }
     
    126149        defer db.lock.Unlock()
    127150
    128         var netUsername, realname, pass *string
    129         if network.Username != "" {
    130                 netUsername = &network.Username
    131         }
    132         if network.Realname != "" {
    133                 realname = &network.Realname
    134         }
    135         if network.Pass != "" {
    136                 pass = &network.Pass
     151        netUsername := toStringPtr(network.Username)
     152        realname := toStringPtr(network.Realname)
     153        pass := toStringPtr(network.Pass)
     154
     155        var saslMechanism, saslPlainUsername, saslPlainPassword *string
     156        if network.SASL.Mechanism != "" {
     157                saslMechanism = &network.SASL.Mechanism
     158                switch network.SASL.Mechanism {
     159                case "PLAIN":
     160                        saslPlainUsername = toStringPtr(network.SASL.Plain.Username)
     161                        saslPlainPassword = toStringPtr(network.SASL.Plain.Password)
     162                }
    137163        }
    138164
     
    140166        if network.ID != 0 {
    141167                _, err = db.db.Exec(`UPDATE Network
    142                         SET addr = ?, nick = ?, username = ?, realname = ?, pass = ?
     168                        SET addr = ?, nick = ?, username = ?, realname = ?, pass = ?,
     169                                sasl_mechanism = ?, sasl_plain_username = ?, sasl_plain_password = ?
    143170                        WHERE id = ?`,
    144                         network.Addr, network.Nick, netUsername, realname, pass, network.ID)
     171                        network.Addr, network.Nick, netUsername, realname, pass,
     172                        saslMechanism, saslPlainUsername, saslPlainPassword, network.ID)
    145173        } else {
    146174                var res sql.Result
    147175                res, err = db.db.Exec(`INSERT INTO Network(user, addr, nick, username,
    148                                 realname, pass)
    149                         VALUES (?, ?, ?, ?, ?, ?)`,
    150                         username, network.Addr, network.Nick, netUsername, realname, pass)
     176                                realname, pass, sasl_mechanism, sasl_plain_username,
     177                                sasl_plain_password)
     178                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
     179                        username, network.Addr, network.Nick, netUsername, realname, pass,
     180                        saslMechanism, saslPlainUsername, saslPlainPassword)
    151181                if err != nil {
    152182                        return err
Note: See TracChangeset for help on using the changeset viewer.