summaryrefslogtreecommitdiff
path: root/beinc_weechat.py
diff options
context:
space:
mode:
Diffstat (limited to 'beinc_weechat.py')
-rw-r--r--beinc_weechat.py63
1 files changed, 44 insertions, 19 deletions
diff --git a/beinc_weechat.py b/beinc_weechat.py
index 5f7da5a..442b01f 100644
--- a/beinc_weechat.py
+++ b/beinc_weechat.py
@@ -1,4 +1,3 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*- 1# -*- coding: utf-8 -*-
3 2
4# Blackmore's Enhanced IRC-Notification Collection (BEINC) v2.0 3# Blackmore's Enhanced IRC-Notification Collection (BEINC) v2.0
@@ -54,34 +53,61 @@ except:
54 pass 53 pass
55 54
56 55
57class ValidHTTPSConnection(httplib.HTTPConnection): 56class BEINCCustomHTTPSConnection(httplib.HTTPConnection):
58 """
59 Implements a simple CERT verification functionality
60 """ 57 """
58 This class allows communication via SSL.
61 59
60 It is a reimplementation of httplib.HTTPSConnection and
61 allows the server certificate to be validated against CA
62 This functionality lacks in Python < 2.7.9
63 """
62 default_port = httplib.HTTPS_PORT 64 default_port = httplib.HTTPS_PORT
63 65
64 def __init__(self, *args, **kwargs): 66 def __init__(self, host, port=None, key_file=None, cert_file=None,
65 httplib.HTTPConnection.__init__(self, *args, **kwargs) 67 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
68 source_address=None, custom_ssl_options={}):
69 httplib.HTTPConnection.__init__(self, host, port, strict, timeout,
70 source_address)
71 self.key_file = key_file
72 self.cert_file = cert_file
73 self.custom_ssl_options = custom_ssl_options
66 74
67 def connect(self): 75 def connect(self):
76 "Connect to a host on a given (SSL) port."
68 sock = socket.create_connection((self.host, self.port), 77 sock = socket.create_connection((self.host, self.port),
69 self.timeout, self.source_address) 78 self.timeout, self.source_address)
70 if self._tunnel_host: 79 if self._tunnel_host:
71 self.sock = sock 80 self.sock = sock
72 self._tunnel() 81 self._tunnel()
73 self.sock = ssl.wrap_socket(sock, 82 self.sock = ssl.wrap_socket(sock,
74 ca_certs=global_beinc_cert_file, 83 self.key_file,
75 cert_reqs=ssl.CERT_REQUIRED) 84 self.cert_file,
85 **self.custom_ssl_options)
76 86
77 87
78class ValidHTTPSHandler(urllib2.HTTPSHandler): 88class BEINCCustomSafeTransport(xmlrpclib.Transport):
79 """
80 Implements a simple CERT verification functionality
81 """
82 89
83 def https_open(self, req): 90 def __init__(self, use_datetime=0, custom_ssl_options={}):
84 return self.do_open(ValidHTTPSConnection, req) 91 xmlrpclib.Transport.__init__(self, use_datetime=use_datetime)
92 self.custom_ssl_options = custom_ssl_options
93
94 def make_connection(self, host):
95 if self._connection and host == self._connection[0]:
96 return self._connection[1]
97 try:
98 HTTPS = BEINCCustomHTTPSConnection
99 except AttributeError:
100 raise NotImplementedError(
101 "your version of httplib doesn't support HTTPS"
102 )
103 else:
104 chost, self._extra_headers, x509 = self.get_host_info(host)
105 self._connection = host, HTTPS(
106 chost,
107 None,
108 custom_ssl_options=self.custom_ssl_options,
109 **(x509 or {}))
110 return self._connection[1]
85 111
86 112
87class WeechatTarget(object): 113class WeechatTarget(object):
@@ -321,14 +347,13 @@ class WeechatTarget(object):
321 if sys.hexversion >= 0x20709f0: 347 if sys.hexversion >= 0x20709f0:
322 # Python >= 2.7.9 348 # Python >= 2.7.9
323 context = ssl.SSLContext(ssl_version) 349 context = ssl.SSLContext(ssl_version)
324 context.verify_mode = ssl.CERT_REQUIRED 350 context.verify_mode = ssl.CERT_NONE
325 if not self.__cert_file:
326 context.verify_mode = ssl.CERT_NONE
327 context.check_hostname = bool(
328 not self.__disable_hostname_check)
329 if self.__cert_file: 351 if self.__cert_file:
352 context.verify_mode = ssl.CERT_REQUIRED
330 context.load_verify_locations(os.path.expanduser( 353 context.load_verify_locations(os.path.expanduser(
331 self.__cert_file)) 354 self.__cert_file))
355 context.check_hostname = bool(
356 not self.__disable_hostname_check)
332 if self.__ciphers: 357 if self.__ciphers:
333 context.set_ciphers(self.__ciphers) 358 context.set_ciphers(self.__ciphers)
334 transport = xmlrpclib.SafeTransport(context=context) 359 transport = xmlrpclib.SafeTransport(context=context)