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

    r305 r307  
    22
    33import (
     4        "crypto"
     5        "crypto/sha256"
    46        "crypto/tls"
     7        "crypto/x509"
    58        "encoding/base64"
    69        "errors"
     
    101104
    102105                logger.Printf("connecting to TLS server at address %q", addr)
    103                 netConn, err = tls.DialWithDialer(&dialer, "tcp", addr, nil)
     106
     107                var cfg *tls.Config
     108                if network.SASL.Mechanism == "EXTERNAL" {
     109                        if network.SASL.External.CertBlob == nil {
     110                                return nil, fmt.Errorf("missing certificate for authentication")
     111                        }
     112                        if network.SASL.External.PrivKeyBlob == nil {
     113                                return nil, fmt.Errorf("missing private key for authentication")
     114                        }
     115                        key, err := x509.ParsePKCS8PrivateKey(network.SASL.External.PrivKeyBlob)
     116                        if err != nil {
     117                                return nil, fmt.Errorf("failed to parse private key: %v", err)
     118                        }
     119                        cfg = &tls.Config{
     120                                Certificates: []tls.Certificate{
     121                                        {
     122                                                Certificate: [][]byte{network.SASL.External.CertBlob},
     123                                                PrivateKey:  key.(crypto.PrivateKey),
     124                                        },
     125                                },
     126                        }
     127                        logger.Printf("using TLS client certificate %x", sha256.Sum256(network.SASL.External.CertBlob))
     128                }
     129
     130                netConn, err = tls.DialWithDialer(&dialer, "tcp", addr, cfg)
    104131        case "irc+insecure":
    105132                if !strings.ContainsRune(addr, ':') {
     
    14001427                        uc.logger.Printf("starting SASL PLAIN authentication with username %q", auth.Plain.Username)
    14011428                        uc.saslClient = sasl.NewPlainClient("", auth.Plain.Username, auth.Plain.Password)
     1429                case "EXTERNAL":
     1430                        uc.logger.Printf("starting SASL EXTERNAL authentication")
     1431                        uc.saslClient = sasl.NewExternalClient("")
    14021432                default:
    14031433                        return fmt.Errorf("unsupported SASL mechanism %q", name)
Note: See TracChangeset for help on using the changeset viewer.