Skip to content

Commit d027ded

Browse files
authored
AMI over TLS
1 parent dea9d37 commit d027ded

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

asterisk/ami/client.py

+21-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import re
22
import socket
3+
import ssl
34
import threading
45
from functools import partial
56

@@ -55,14 +56,17 @@ class AMIClient(object):
5556

5657
def __init__(self, address='127.0.0.1', port=5038,
5758
encoding='utf-8', encoding_errors='replace',
58-
timeout=3, buffer_size=2 ** 10,
59+
timeout=3, buffer_size=2 ** 10, ssl=False, checkcert=False, ca=False,
5960
**kwargs):
6061
self._action_counter = 0
6162
self._futures = {}
6263
self._listeners = []
6364
self._event_listeners = []
6465
self._address = address
6566
self._buffer_size = buffer_size
67+
self._ssl = ssl
68+
self._checkcert = checkcert
69+
self._ca = ca
6670
self._port = port
6771
self._socket = None
6872
self._thread = None
@@ -80,8 +84,22 @@ def next_action_id(self):
8084
return str(id)
8185

8286
def connect(self):
83-
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
84-
self._socket.settimeout(self._timeout)
87+
if self._ssl:
88+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
89+
sock.settimeout(self._timeout)
90+
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
91+
if not self._checkcert:
92+
context.check_hostname = False
93+
context.verify_mode = ssl.CERT_NONE
94+
elif self._ca:
95+
context.verify_mode = ssl.CERT_REQUIRED
96+
context.load_verify_locations(self._ca)
97+
98+
self._socket = context.wrap_socket(sock, server_hostname=self._address)
99+
else:
100+
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
101+
self._socket.settimeout(self._timeout)
102+
85103
self._socket.connect((self._address, self._port))
86104
self.finished = threading.Event()
87105
self._thread = threading.Thread(target=self.listen)

0 commit comments

Comments
 (0)