Changeset 307 in code for trunk/db.go


Ignore:
Timestamp:
Jun 2, 2020, 9:24:22 AM (5 years ago)
Author:
fox.cpp
Message:

Implement upstream SASL EXTERNAL support

Closes: https://todo.sr.ht/~emersion/soju/47

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/db.go

    r284 r307  
    2121                Username string
    2222                Password string
     23        }
     24
     25        // TLS client certificate authentication.
     26        External struct {
     27                // X.509 certificate in DER form.
     28                CertBlob []byte
     29                // PKCS#8 private key in DER form.
     30                PrivKeyBlob []byte
    2331        }
    2432}
     
    6977        sasl_plain_username VARCHAR(255),
    7078        sasl_plain_password VARCHAR(255),
     79        sasl_external_cert BLOB DEFAULT NULL,
     80        sasl_external_key BLOB DEFAULT NULL,
    7181        FOREIGN KEY(user) REFERENCES User(username),
    7282        UNIQUE(user, addr, nick)
     
    8898        "ALTER TABLE Network ADD COLUMN connect_commands VARCHAR(1023)",
    8999        "ALTER TABLE Channel ADD COLUMN detached INTEGER NOT NULL DEFAULT 0",
     100        "ALTER TABLE Network ADD COLUMN sasl_external_cert BLOB DEFAULT NULL",
     101        "ALTER TABLE Network ADD COLUMN sasl_external_key BLOB DEFAULT NULL",
    90102}
    91103
     
    239251
    240252        rows, err := db.db.Query(`SELECT id, name, addr, nick, username, realname, pass,
    241                         connect_commands, sasl_mechanism, sasl_plain_username, sasl_plain_password
     253                        connect_commands, sasl_mechanism, sasl_plain_username, sasl_plain_password,
     254                        sasl_external_cert, sasl_external_key
    242255                FROM Network
    243256                WHERE user = ?`,
     
    254267                var saslMechanism, saslPlainUsername, saslPlainPassword *string
    255268                err := rows.Scan(&net.ID, &name, &net.Addr, &net.Nick, &username, &realname,
    256                         &pass, &connectCommands, &saslMechanism, &saslPlainUsername, &saslPlainPassword)
     269                        &pass, &connectCommands, &saslMechanism, &saslPlainUsername, &saslPlainPassword,
     270                        &net.SASL.External.CertBlob, &net.SASL.External.PrivKeyBlob)
    257271                if err != nil {
    258272                        return nil, err
     
    294308                        saslPlainUsername = toStringPtr(network.SASL.Plain.Username)
    295309                        saslPlainPassword = toStringPtr(network.SASL.Plain.Password)
     310                        network.SASL.External.CertBlob = nil
     311                        network.SASL.External.PrivKeyBlob = nil
     312                case "EXTERNAL":
     313                        // keep saslPlain* nil
    296314                default:
    297315                        return fmt.Errorf("soju: cannot store network: unsupported SASL mechanism %q", network.SASL.Mechanism)
     
    303321                _, err = db.db.Exec(`UPDATE Network
    304322                        SET name = ?, addr = ?, nick = ?, username = ?, realname = ?, pass = ?, connect_commands = ?,
    305                                 sasl_mechanism = ?, sasl_plain_username = ?, sasl_plain_password = ?
     323                                sasl_mechanism = ?, sasl_plain_username = ?, sasl_plain_password = ?,
     324                                sasl_external_cert = ?, sasl_external_key = ?
    306325                        WHERE id = ?`,
    307326                        netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
    308                         saslMechanism, saslPlainUsername, saslPlainPassword, network.ID)
     327                        saslMechanism, saslPlainUsername, saslPlainPassword,
     328                        network.SASL.External.CertBlob, network.SASL.External.PrivKeyBlob,
     329                        network.ID)
    309330        } else {
    310331                var res sql.Result
    311332                res, err = db.db.Exec(`INSERT INTO Network(user, name, addr, nick, username,
    312333                                realname, pass, connect_commands, sasl_mechanism, sasl_plain_username,
    313                                 sasl_plain_password)
    314                         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
     334                                sasl_plain_password, sasl_external_cert, sasl_external_key)
     335                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
    315336                        username, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
    316                         saslMechanism, saslPlainUsername, saslPlainPassword)
     337                        saslMechanism, saslPlainUsername, saslPlainPassword, network.SASL.External.CertBlob,
     338                        network.SASL.External.PrivKeyBlob)
    317339                if err != nil {
    318340                        return err
Note: See TracChangeset for help on using the changeset viewer.