1 /* vim:set ts=2 sw=2 et cindent: */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef mozilla_net_TLSServerSocket_h 7 #define mozilla_net_TLSServerSocket_h 8 9 #include "nsAutoPtr.h" 10 #include "nsITLSServerSocket.h" 11 #include "nsServerSocket.h" 12 #include "nsString.h" 13 #include "mozilla/Mutex.h" 14 #include "seccomon.h" 15 16 namespace mozilla { 17 namespace net { 18 19 class TLSServerSocket final : public nsServerSocket 20 , public nsITLSServerSocket 21 { 22 public: 23 NS_DECL_ISUPPORTS_INHERITED 24 NS_FORWARD_NSISERVERSOCKET(nsServerSocket::) 25 NS_DECL_NSITLSSERVERSOCKET 26 27 // Override methods from nsServerSocket 28 virtual void CreateClientTransport(PRFileDesc* clientFD, 29 const NetAddr& clientAddr) override; 30 virtual nsresult SetSocketDefaults() override; 31 virtual nsresult OnSocketListen() override; 32 33 TLSServerSocket(); 34 35 private: 36 virtual ~TLSServerSocket(); 37 38 static SECStatus AuthCertificateHook(void* arg, PRFileDesc* fd, 39 PRBool checksig, PRBool isServer); 40 41 nsCOMPtr<nsIX509Cert> mServerCert; 42 }; 43 44 class TLSServerConnectionInfo : public nsITLSServerConnectionInfo 45 , public nsITLSClientStatus 46 { 47 friend class TLSServerSocket; 48 49 public: 50 NS_DECL_THREADSAFE_ISUPPORTS 51 NS_DECL_NSITLSSERVERCONNECTIONINFO 52 NS_DECL_NSITLSCLIENTSTATUS 53 54 TLSServerConnectionInfo(); 55 56 private: 57 virtual ~TLSServerConnectionInfo(); 58 59 static void HandshakeCallback(PRFileDesc* aFD, void* aArg); 60 nsresult HandshakeCallback(PRFileDesc* aFD); 61 62 RefPtr<TLSServerSocket> mServerSocket; 63 // Weak ref to the transport, to avoid cycles since the transport holds a 64 // reference to the TLSServerConnectionInfo object. This is not handed out to 65 // anyone, and is only used in HandshakeCallback to close the transport in 66 // case of an error. After this, it's set to nullptr. 67 nsISocketTransport* mTransport; 68 nsCOMPtr<nsIX509Cert> mPeerCert; 69 int16_t mTlsVersionUsed; 70 nsCString mCipherName; 71 uint32_t mKeyLength; 72 uint32_t mMacLength; 73 // lock protects access to mSecurityObserver 74 mozilla::Mutex mLock; 75 nsCOMPtr<nsITLSServerSecurityObserver> mSecurityObserver; 76 }; 77 78 } // namespace net 79 } // namespace mozilla 80 81 #endif // mozilla_net_TLSServerSocket_h 82