Changeset 381 in code for trunk/upstream.go


Ignore:
Timestamp:
Aug 11, 2020, 8:24:54 AM (5 years ago)
Author:
contact
Message:

Don't perform TLS handshake in connectToUpstream

This defers TLS handshake until the first read or write operation. This
allows the upcoming identd server to register the connection before the
TLS handshake is complete, and is necessary because some IRC servers
send an ident request before that.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r369 r381  
    9999        case "ircs":
    100100                addr := u.Host
    101                 if _, _, err := net.SplitHostPort(addr); err != nil {
    102                         addr = addr + ":6697"
     101                host, _, err := net.SplitHostPort(u.Host)
     102                if err != nil {
     103                        host = u.Host
     104                        addr = u.Host + ":6697"
    103105                }
    104106
    105107                logger.Printf("connecting to TLS server at address %q", addr)
    106108
    107                 var tlsConfig *tls.Config
     109                tlsConfig := &tls.Config{ServerName: host}
    108110                if network.SASL.Mechanism == "EXTERNAL" {
    109111                        if network.SASL.External.CertBlob == nil {
     
    117119                                return nil, fmt.Errorf("failed to parse private key: %v", err)
    118120                        }
    119                         tlsConfig = &tls.Config{
    120                                 Certificates: []tls.Certificate{
    121                                         {
    122                                                 Certificate: [][]byte{network.SASL.External.CertBlob},
    123                                                 PrivateKey:  key.(crypto.PrivateKey),
    124                                         },
     121                        tlsConfig.Certificates = []tls.Certificate{
     122                                {
     123                                        Certificate: [][]byte{network.SASL.External.CertBlob},
     124                                        PrivateKey:  key.(crypto.PrivateKey),
    125125                                },
    126126                        }
     
    128128                }
    129129
    130                 netConn, err = tls.DialWithDialer(&dialer, "tcp", addr, tlsConfig)
     130                netConn, err = dialer.Dial("tcp", addr)
    131131                if err != nil {
    132132                        return nil, fmt.Errorf("failed to dial %q: %v", addr, err)
    133133                }
     134
     135                // Don't do the TLS handshake immediately, because we need to register
     136                // the new connection with identd ASAP. See:
     137                // https://todo.sr.ht/~emersion/soju/69#event-41859
     138                netConn = tls.Client(netConn, tlsConfig)
    134139        case "irc+insecure":
    135140                addr := u.Host
Note: See TracChangeset for help on using the changeset viewer.