source: filezilla/trunk/fuentes/src/engine/tlssocket.h @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 3 years ago

First release to xenial

File size: 3.4 KB
Line 
1#ifndef __TLSSOCKET_H__
2#define __TLSSOCKET_H__
3
4#include <gnutls/gnutls.h>
5#include "backend.h"
6#include "socket.h"
7
8class CControlSocket;
9class CTlsSocket final : protected CEventHandler, public CBackend
10{
11public:
12        enum class TlsState
13        {
14                noconn,
15                handshake,
16                verifycert,
17                conn,
18                closing,
19                closed
20        };
21
22        CTlsSocket(CEventHandler* pEvtHandler, CSocket& pSocket, CControlSocket* pOwner);
23        virtual ~CTlsSocket();
24
25        bool Init();
26        void Uninit();
27
28        int Handshake(const CTlsSocket* pPrimarySocket = 0, bool try_resume = 0);
29
30        virtual int Read(void *buffer, unsigned int size, int& error);
31        virtual int Peek(void *buffer, unsigned int size, int& error);
32        virtual int Write(const void *buffer, unsigned int size, int& error);
33
34        int Shutdown();
35
36        void TrustCurrentCert(bool trusted);
37
38        TlsState GetState() const { return m_tlsState; }
39
40        wxString GetProtocolName();
41        wxString GetKeyExchange();
42        wxString GetCipherName();
43        wxString GetMacName();
44        int GetAlgorithmWarnings();
45
46        bool ResumedSession() const;
47
48        static wxString ListTlsCiphers(wxString priority);
49
50protected:
51
52        bool InitSession();
53        void UninitSession();
54        bool CopySessionData(const CTlsSocket* pPrimarySocket);
55
56        virtual void OnRateAvailable(enum CRateLimiter::rate_direction direction);
57
58        int ContinueHandshake();
59        void ContinueShutdown();
60
61        int VerifyCertificate();
62        bool CertificateIsBlacklisted(std::vector<CCertificate> const& certificates);
63
64        TlsState m_tlsState{TlsState::noconn};
65
66        CControlSocket* m_pOwner{};
67
68        bool m_initialized{};
69        gnutls_session_t m_session{};
70
71        gnutls_certificate_credentials_t m_certCredentials{};
72
73        void LogError(int code, const wxString& function, MessageType logLegel = MessageType::Error);
74        void PrintAlert(MessageType logLevel);
75
76        // Failure logs the error, uninits the session and sends a close event
77        void Failure(int code, bool send_close, const wxString& function = wxString());
78
79        static ssize_t PushFunction(gnutls_transport_ptr_t ptr, const void* data, size_t len);
80        static ssize_t PullFunction(gnutls_transport_ptr_t ptr, void* data, size_t len);
81        ssize_t PushFunction(const void* data, size_t len);
82        ssize_t PullFunction(void* data, size_t len);
83
84        int DoCallGnutlsRecordRecv(void* data, size_t len);
85
86        void TriggerEvents();
87
88        virtual void operator()(CEventBase const& ev);
89        void OnSocketEvent(CSocketEventSource* source, SocketEventType t, int error);
90
91        void OnRead();
92        void OnSend();
93
94        bool ExtractCert(gnutls_datum_t const* datum, CCertificate& out);
95        std::vector<wxString> GetCertSubjectAltNames(gnutls_x509_crt_t cert);
96
97        bool m_canReadFromSocket{true};
98        bool m_canWriteToSocket{true};
99        bool m_canCheckCloseSocket{false};
100
101        bool m_canTriggerRead{false};
102        bool m_canTriggerWrite{true};
103
104        bool m_socketClosed{};
105
106        CSocketBackend* m_pSocketBackend{};
107        CSocket& m_socket;
108
109        bool m_shutdown_requested{};
110
111        // Due to the strange gnutls_record_send semantics, call it again
112        // with 0 data and 0 length after GNUTLS_E_AGAIN and store the number
113        // of bytes written. These bytes get skipped on next write from the
114        // application.
115        // This avoids the rule to call it again with the -same- data after
116        // GNUTLS_E_AGAIN.
117        void CheckResumeFailedReadWrite();
118        bool m_lastReadFailed{true};
119        bool m_lastWriteFailed{false};
120        unsigned int m_writeSkip{};
121
122        // Peek data
123        char* m_peekData{};
124        unsigned int m_peekDataLen{};
125
126        gnutls_datum_t m_implicitTrustedCert;
127
128        bool m_socket_eof{};
129        int m_socket_error{ECONNABORTED}; // Set in the push and pull functions if reading/writing fails fatally
130};
131
132#endif //__TLSSOCKET_H__
Note: See TracBrowser for help on using the repository browser.