diff --git a/internal/app/bridge.go b/internal/app/bridge.go index d174f544..9a911ffb 100644 --- a/internal/app/bridge.go +++ b/internal/app/bridge.go @@ -56,6 +56,13 @@ func withBridge( //nolint:funlen cookieJar http.CookieJar, fn func(*bridge.Bridge, <-chan events.Event) error, ) error { + // Delete old go-imap cache files + if deleteOldGoIMAPFiles { + if err := locations.CleanGoIMAPCache(); err != nil { + logrus.WithError(err).Error("Failed to remove old go-imap cache") + } + } + // Create the underlying dialer used by the bridge. // It only connects to trusted servers and reports any untrusted servers it finds. pinningDialer := dialer.NewPinningTLSDialer( @@ -64,13 +71,6 @@ func withBridge( //nolint:funlen dialer.NewTLSPinChecker(dialer.TrustedAPIPins), ) - // Delete old go-imap cache files - if deleteOldGoIMAPFiles { - if err := locations.CleanGoIMAPCache(); err != nil { - logrus.WithError(err).Error("Failed to remove old go-imap cache") - } - } - // Create a proxy dialer which switches to a proxy if the request fails. proxyDialer := dialer.NewProxyTLSDialer(pinningDialer, constants.APIHost) diff --git a/internal/dialer/dialer_pinning_checker.go b/internal/dialer/dialer_pinning_checker.go index 5c918295..7e9463ce 100644 --- a/internal/dialer/dialer_pinning_checker.go +++ b/internal/dialer/dialer_pinning_checker.go @@ -18,11 +18,9 @@ package dialer import ( - "crypto/tls" "crypto/x509" "errors" "fmt" - "net" "github.com/ProtonMail/proton-bridge/v2/pkg/algo" ) @@ -40,28 +38,6 @@ func NewTLSPinChecker(trustedPins []string) *TLSPinChecker { } } -// CheckCertificate returns whether the connection presents a known TLS certificate. -func (p *TLSPinChecker) CheckCertificate(conn net.Conn) error { - tlsConn, ok := conn.(*tls.Conn) - if !ok { - return errors.New("connection is not a TLS connection") - } - - connState := tlsConn.ConnectionState() - - for _, peerCert := range connState.PeerCertificates { - fingerprint := certFingerprint(peerCert) - - for _, pin := range p.trustedPins { - if pin == fingerprint { - return nil - } - } - } - - return ErrTLSMismatch -} - func certFingerprint(cert *x509.Certificate) string { return fmt.Sprintf(`pin-sha256=%q`, algo.HashBase64SHA256(string(cert.RawSubjectPublicKeyInfo))) } diff --git a/internal/dialer/dialer_pinning_checker_default.go b/internal/dialer/dialer_pinning_checker_default.go new file mode 100644 index 00000000..107a437e --- /dev/null +++ b/internal/dialer/dialer_pinning_checker_default.go @@ -0,0 +1,48 @@ +// Copyright (c) 2022 Proton AG +// +// This file is part of Proton Mail Bridge.Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +//go:build !build_qa + +package dialer + +import ( + "crypto/tls" + "errors" + "net" +) + +// CheckCertificate returns whether the connection presents a known TLS certificate. +func (p *TLSPinChecker) CheckCertificate(conn net.Conn) error { + tlsConn, ok := conn.(*tls.Conn) + if !ok { + return errors.New("connection is not a TLS connection") + } + + connState := tlsConn.ConnectionState() + + for _, peerCert := range connState.PeerCertificates { + fingerprint := certFingerprint(peerCert) + + for _, pin := range p.trustedPins { + if pin == fingerprint { + return nil + } + } + } + + return ErrTLSMismatch +} diff --git a/internal/dialer/dialer_pinning_checker_qa.go b/internal/dialer/dialer_pinning_checker_qa.go new file mode 100644 index 00000000..0429dff3 --- /dev/null +++ b/internal/dialer/dialer_pinning_checker_qa.go @@ -0,0 +1,28 @@ +// Copyright (c) 2022 Proton AG +// +// This file is part of Proton Mail Bridge.Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +//go:build build_qa + +package dialer + +import "net" + +// CheckCertificate returns whether the connection presents a known TLS certificate. +// The QA implementation always returns nil. +func (p *TLSPinChecker) CheckCertificate(conn net.Conn) error { + return nil +}