[Python-modules-commits] [python-social-auth] 283/322: Support SSL protocol override, default Amazon to TLSv1. Fixes #603

Wolfgang Borgert debacle at moszumanska.debian.org
Sat Dec 24 15:13:20 UTC 2016


This is an automated email from the git hooks/post-receive script.

debacle pushed a commit to tag v0.2.10
in repository python-social-auth.

commit 7ff533bce988a2753227c1aa04c31a04d9570bc7
Author: Matías Aguirre <matiasaguirre at gmail.com>
Date:   Fri May 1 01:08:48 2015 -0300

    Support SSL protocol override, default Amazon to TLSv1. Fixes #603
---
 social/backends/amazon.py |  3 +++
 social/backends/base.py   | 10 +++++++---
 social/utils.py           | 27 +++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/social/backends/amazon.py b/social/backends/amazon.py
index c97b8a0..2475744 100644
--- a/social/backends/amazon.py
+++ b/social/backends/amazon.py
@@ -2,6 +2,8 @@
 Amazon OAuth2 backend, docs at:
     http://psa.matiasaguirre.net/docs/backends/amazon.html
 """
+import ssl
+
 from social.backends.oauth import BaseOAuth2
 
 
@@ -13,6 +15,7 @@ class AmazonOAuth2(BaseOAuth2):
     DEFAULT_SCOPE = ['profile']
     REDIRECT_STATE = False
     ACCESS_TOKEN_METHOD = 'POST'
+    SSL_PROTOCOL = ssl.PROTOCOL_TLSv1
     EXTRA_DATA = [
         ('refresh_token', 'refresh_token', True),
         ('user_id', 'user_id'),
diff --git a/social/backends/base.py b/social/backends/base.py
index fcb9108..f55e8e3 100644
--- a/social/backends/base.py
+++ b/social/backends/base.py
@@ -1,6 +1,6 @@
 from requests import request, ConnectionError
 
-from social.utils import module_member, parse_qs, user_agent
+from social.utils import SSLHttpAdapter, module_member, parse_qs, user_agent
 from social.exceptions import AuthFailed
 
 
@@ -13,6 +13,7 @@ class BaseAuth(object):
     EXTRA_DATA = None
     REQUIRES_EMAIL_VALIDATION = False
     SEND_USER_AGENT = False
+    SSL_PROTOCOL = None
 
     def __init__(self, strategy=None, redirect_uri=None):
         self.strategy = strategy
@@ -210,12 +211,15 @@ class BaseAuth(object):
             kwargs.setdefault('verify', self.setting('VERIFY_SSL'))
         kwargs.setdefault('timeout', self.setting('REQUESTS_TIMEOUT') or
                                      self.setting('URLOPEN_TIMEOUT'))
-
         if self.SEND_USER_AGENT and 'User-Agent' not in kwargs['headers']:
             kwargs['headers']['User-Agent'] = user_agent()
 
         try:
-            response = request(method, url, *args, **kwargs)
+            if self.SSL_PROTOCOL:
+                session = SSLHttpAdapter.ssl_adapter_session(self.SSL_PROTOCOL)
+                response = session.request(method, url, *args, **kwargs)
+            else:
+                response = request(method, url, *args, **kwargs)
         except ConnectionError as err:
             raise AuthFailed(self, str(err))
         response.raise_for_status()
diff --git a/social/utils.py b/social/utils.py
index 27982a9..2cd41df 100644
--- a/social/utils.py
+++ b/social/utils.py
@@ -9,6 +9,9 @@ import six
 import requests
 import social
 
+from requests.adapters import HTTPAdapter
+from requests.packages.urllib3.poolmanager import PoolManager
+
 from social.exceptions import AuthCanceled, AuthUnreachableProvider
 from social.p3 import urlparse, urlunparse, urlencode, \
                       parse_qs as battery_parse_qs
@@ -19,6 +22,30 @@ SETTING_PREFIX = 'SOCIAL_AUTH'
 social_logger = logging.Logger('social')
 
 
+class SSLHttpAdapter(HTTPAdapter):
+    """"
+    Transport adapter that allows to use any SSL protocol. Based on:
+    http://requests.rtfd.org/latest/user/advanced/#example-specific-ssl-version
+    """
+    def __init__(self, ssl_protocol):
+        self.ssl_protocol = ssl_protocol
+        super(SSLHttpAdapter, self).__init__()
+
+    def init_poolmanager(self, connections, maxsize, block=False):
+        self.poolmanager = PoolManager(
+            num_pools=connections,
+            maxsize=maxsize,
+            block=block,
+            ssl_version=self.ssl_protocol
+        )
+
+    @classmethod
+    def ssl_adapter_session(cls, ssl_protocol):
+        session = requests.Session()
+        session.mount('https://', SSLHttpAdapter(ssl_protocol))
+        return session
+
+
 def import_module(name):
     __import__(name)
     return sys.modules[name]

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-social-auth.git



More information about the Python-modules-commits mailing list