Skip to content

Commit dc8fb08

Browse files
committed
Use SSLContext at all places where SSL connection could be opened
Without it connection will fail, at least for url https://login.microsoftonline.com/common/oauth2/v2.0/token and with Python 3.13.1 on Windows. The following error was logged: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1018)
1 parent 7312ae0 commit dc8fb08

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

emailproxy.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -1060,9 +1060,11 @@ def construct_oauth2_permission_url(permission_url, redirect_uri, client_id, sco
10601060
def start_device_authorisation_grant(permission_url):
10611061
"""Requests the device authorisation grant flow URI and user code - see https://tools.ietf.org/html/rfc8628"""
10621062
try:
1063+
ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
1064+
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2 # GitHub CodeQL issue 2
10631065
response = urllib.request.urlopen(
10641066
urllib.request.Request(permission_url, headers={'User-Agent': APP_NAME}),
1065-
timeout=AUTHENTICATION_TIMEOUT).read()
1067+
timeout=AUTHENTICATION_TIMEOUT, context=ssl_context).read()
10661068
parsed_result = json.loads(response)
10671069
verification_uri = parsed_result.get('verification_uri_complete', parsed_result['verification_uri'])
10681070
user_code = parsed_result['user_code']
@@ -1187,10 +1189,14 @@ def get_oauth2_authorisation_tokens(token_url, redirect_uri, client_id, client_s
11871189
expires_at = time.time() + expires_in
11881190
while time.time() < expires_at and not EXITING:
11891191
try:
1192+
ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
1193+
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2 # GitHub CodeQL issue 2
1194+
11901195
# in all flows except DAG, we make one attempt only
11911196
response = urllib.request.urlopen(
11921197
urllib.request.Request(token_url, data=urllib.parse.urlencode(params).encode('utf-8'),
1193-
headers={'User-Agent': APP_NAME}), timeout=AUTHENTICATION_TIMEOUT).read()
1198+
headers={'User-Agent': APP_NAME}), timeout=AUTHENTICATION_TIMEOUT,
1199+
context=ssl_context).read()
11941200
return json.loads(response)
11951201

11961202
except urllib.error.HTTPError as e:
@@ -1262,9 +1268,12 @@ def refresh_oauth2_access_token(token_url, client_id, client_secret, jwt_client_
12621268
params['client_assertion'] = jwt_client_assertion
12631269

12641270
try:
1271+
ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
1272+
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2 # GitHub CodeQL issue 2
12651273
response = urllib.request.urlopen(
12661274
urllib.request.Request(token_url, data=urllib.parse.urlencode(params).encode('utf-8'),
1267-
headers={'User-Agent': APP_NAME}), timeout=AUTHENTICATION_TIMEOUT).read()
1275+
headers={'User-Agent': APP_NAME}), timeout=AUTHENTICATION_TIMEOUT,
1276+
context=ssl_context).read()
12681277
token = json.loads(response)
12691278
if 'expires_in' in token: # some servers return integer values as strings - fix expiry values (GitHub #237)
12701279
token['expires_in'] = int(token['expires_in'])

0 commit comments

Comments
 (0)