Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-msal for openSUSE:Factory 
checked in at 2022-04-06 21:52:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-msal (Old)
 and      /work/SRC/openSUSE:Factory/.python-msal.new.1900 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-msal"

Wed Apr  6 21:52:12 2022 rev:10 rq:967340 version:1.17.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-msal/python-msal.changes  2021-11-09 
23:55:28.975979301 +0100
+++ /work/SRC/openSUSE:Factory/.python-msal.new.1900/python-msal.changes        
2022-04-06 21:52:47.874672606 +0200
@@ -1,0 +2,16 @@
+Thu Mar 24 12:27:46 UTC 2022 - John Paul Adrian Glaubitz 
<[email protected]>
+
+- Update to version 1.17.0
+  + New: Define some Cloud Instance constants and the usage
+    pattern of using them (#221, #433)
+  + Enhancement: Lazy-load dependencies so that the start-up
+    and run time will usually be faster. (#423, #454)
+  + Enhancement: Bubble up token refresh exceptions (#431, #434)
+  + Enhancement: Documents a simpler http_cache usage pattern (#439)
+  + Enhancement: Expose authority discovery error for troubleshooting (#443)
+  + Enhancement: Actionable exception message when local machine
+    time error is detected (#446, #449, #453)
+  + Enhancement: Actionable exception message when username
+    password flow encounters errors with ADFS (#456, #458)
+
+-------------------------------------------------------------------

Old:
----
  msal-1.16.0.tar.gz

New:
----
  msal-1.17.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-msal.spec ++++++
--- /var/tmp/diff_new_pack.TImpYT/_old  2022-04-06 21:52:48.322667494 +0200
+++ /var/tmp/diff_new_pack.TImpYT/_new  2022-04-06 21:52:48.330667402 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-msal
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -21,7 +21,7 @@
 %define skip_python2 1
 %endif
 Name:           python-msal
-Version:        1.16.0
+Version:        1.17.0
 Release:        0
 Summary:        Microsoft Authentication Library (MSAL) for Python
 License:        MIT

++++++ msal-1.16.0.tar.gz -> msal-1.17.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/PKG-INFO new/msal-1.17.0/PKG-INFO
--- old/msal-1.16.0/PKG-INFO    2021-10-30 00:57:32.343694400 +0200
+++ new/msal-1.17.0/PKG-INFO    2022-02-11 21:25:35.391251300 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: msal
-Version: 1.16.0
+Version: 1.17.0
 Summary: The Microsoft Authentication Library (MSAL) for Python library 
enables your app to access the Microsoft Cloud by supporting authentication of 
users with Microsoft Azure Active Directory accounts (AAD) and Microsoft 
Accounts (MSA) using industry standard OAuth2 and OpenID Connect.
 Home-page: 
https://github.com/AzureAD/microsoft-authentication-library-for-python
 Author: Microsoft Corporation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal/application.py 
new/msal-1.17.0/msal/application.py
--- old/msal-1.16.0/msal/application.py 2021-10-30 00:57:23.000000000 +0200
+++ new/msal-1.17.0/msal/application.py 2022-02-11 21:25:25.000000000 +0100
@@ -11,8 +11,6 @@
 from threading import Lock
 import os
 
-import requests
-
 from .oauth2cli import Client, JwtAssertionCreator
 from .oauth2cli.oidc import decode_part
 from .authority import Authority
@@ -26,7 +24,7 @@
 
 
 # The __init__.py will import this. Not the other way around.
-__version__ = "1.16.0"
+__version__ = "1.17.0"  # When releasing, also check and bump our 
dependencies's versions if needed
 
 logger = logging.getLogger(__name__)
 
@@ -80,6 +78,10 @@
     if sys.platform != "linux":  # On other platforms, we have no browser 
preference
         return None
     browser_path = "/usr/bin/microsoft-edge"  # Use a full path owned by sys 
admin
+        # Note: /usr/bin/microsoft-edge, /usr/bin/microsoft-edge-stable, etc.
+        # are symlinks that point to the actual binaries which are found under
+        # /opt/microsoft/msedge/msedge or /opt/microsoft/msedge-beta/msedge.
+        # Either method can be used to detect an Edge installation.
     user_has_no_preference = "BROWSER" not in os.environ
     user_wont_mind_edge = "microsoft-edge" in os.environ.get("BROWSER", "")  # 
Note:
         # BROWSER could contain "microsoft-edge" or "/path/to/microsoft-edge".
@@ -231,8 +233,23 @@
 
         :param str authority:
             A URL that identifies a token authority. It should be of the format
-            https://login.microsoftonline.com/your_tenant
-            By default, we will use https://login.microsoftonline.com/common
+            ``https://login.microsoftonline.com/your_tenant``
+            By default, we will use 
``https://login.microsoftonline.com/common``
+
+            *Changed in version 1.17*: you can also use predefined constant
+            and a builder like this::
+
+                from msal.authority import (
+                    AuthorityBuilder,
+                    AZURE_US_GOVERNMENT, AZURE_CHINA, AZURE_PUBLIC)
+                my_authority = AuthorityBuilder(AZURE_PUBLIC, 
"contoso.onmicrosoft.com")
+                # Now you get an equivalent of
+                # "https://login.microsoftonline.com/contoso.onmicrosoft.com";
+
+                # You can feed such an authority to msal's ClientApplication
+                from msal import PublicClientApplication
+                app = PublicClientApplication("my_client_id", 
authority=my_authority, ...)
+
         :param bool validate_authority: (optional) Turns authority validation
             on or off. This parameter default to true.
         :param TokenCache cache:
@@ -362,10 +379,8 @@
                     with open(http_cache_filename, "rb") as f:
                         persisted_http_cache = pickle.load(f)  # Take a 
snapshot
                 except (
-                        IOError,  # A non-exist http cache file
+                        FileNotFoundError,  # Or IOError in Python 2
                         pickle.UnpicklingError,  # A corrupted http cache file
-                        EOFError,  # An empty http cache file
-                        AttributeError, ImportError, IndexError,  # Other 
corruption
                         ):
                     persisted_http_cache = {}  # Recover by starting afresh
                 atexit.register(lambda: pickle.dump(
@@ -412,6 +427,8 @@
         if http_client:
             self.http_client = http_client
         else:
+            import requests  # Lazy load
+
             self.http_client = requests.Session()
             self.http_client.verify = verify
             self.http_client.proxies = proxies
@@ -1207,7 +1224,9 @@
             if (result and "error" not in result) or (not 
access_token_from_cache):
                 return result
         except:  # The exact HTTP exception is transportation-layer dependent
-            logger.exception("Refresh token failed")  # Potential AAD outage?
+            # Typically network error. Potential AAD outage?
+            if not access_token_from_cache:  # It means there is no fall back 
option
+                raise  # We choose to bubble up the exception
         return access_token_from_cache
 
     def _acquire_token_silent_by_finding_rt_belongs_to_me_or_my_family(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal/authority.py 
new/msal-1.17.0/msal/authority.py
--- old/msal-1.16.0/msal/authority.py   2021-10-30 00:57:23.000000000 +0200
+++ new/msal-1.17.0/msal/authority.py   2022-02-11 21:25:25.000000000 +0100
@@ -5,22 +5,23 @@
     from urlparse import urlparse
 import logging
 
-# Historically some customers patched this module-wide requests instance.
-# We keep it here for now. They will be removed in next major release.
-import requests
-import requests as _requests
-
 from .exceptions import MsalServiceError
 
 
 logger = logging.getLogger(__name__)
+
+# Endpoints were copied from here
+# 
https://docs.microsoft.com/en-us/azure/active-directory/develop/authentication-national-cloud#azure-ad-authentication-endpoints
+AZURE_US_GOVERNMENT = "login.microsoftonline.us"
+AZURE_CHINA = "login.chinacloudapi.cn"
+AZURE_PUBLIC = "login.microsoftonline.com"
+
 WORLD_WIDE = 'login.microsoftonline.com'  # There was an alias 
login.windows.net
 WELL_KNOWN_AUTHORITY_HOSTS = set([
     WORLD_WIDE,
-    'login.chinacloudapi.cn',
+    AZURE_CHINA,
     'login-us.microsoftonline.com',
-    'login.microsoftonline.us',
-    'login.microsoftonline.de',
+    AZURE_US_GOVERNMENT,
     ])
 WELL_KNOWN_B2C_HOSTS = [
     "b2clogin.com",
@@ -30,6 +31,19 @@
     ]
 
 
+class AuthorityBuilder(object):
+    def __init__(self, instance, tenant):
+        """A helper to save caller from doing string concatenation.
+
+        Usage is documented in :func:`application.ClientApplication.__init__`.
+        """
+        self._instance = instance.rstrip("/")
+        self._tenant = tenant.strip("/")
+
+    def __str__(self):
+        return "https://{}/{}".format(self._instance, self._tenant)
+
+
 class Authority(object):
     """This class represents an (already-validated) authority.
 
@@ -39,9 +53,10 @@
     _domains_without_user_realm_discovery = set([])
 
     @property
-    def http_client(self):  # Obsolete. We will remove this in next major 
release.
-        # A workaround: if module-wide requests is patched, we honor it.
-        return self._http_client if requests is _requests else requests
+    def http_client(self):  # Obsolete. We will remove this eventually
+        warnings.warn(
+            "authority.http_client might be removed in MSAL Python 1.21+", 
DeprecationWarning)
+        return self._http_client
 
     def __init__(self, authority_url, http_client, validate_authority=True):
         """Creates an authority instance, and also validates it.
@@ -53,6 +68,8 @@
             performed.
         """
         self._http_client = http_client
+        if isinstance(authority_url, AuthorityBuilder):
+            authority_url = str(authority_url)
         authority, self.instance, tenant = canonicalize(authority_url)
         parts = authority.path.split('/')
         is_b2c = any(self.instance.endswith("." + d) for d in 
WELL_KNOWN_B2C_HOSTS) or (
@@ -62,7 +79,7 @@
             payload = instance_discovery(
                 "https://{}{}/oauth2/v2.0/authorize".format(
                     self.instance, authority.path),
-                self.http_client)
+                self._http_client)
             if payload.get("error") == "invalid_instance":
                 raise ValueError(
                     "invalid_instance: "
@@ -82,12 +99,13 @@
         try:
             openid_config = tenant_discovery(
                 tenant_discovery_endpoint,
-                self.http_client)
+                self._http_client)
         except ValueError:
             raise ValueError(
                 "Unable to get authority configuration for {}. "
                 "Authority would typically be in a format of "
-                "https://login.microsoftonline.com/your_tenant_name".format(
+                "https://login.microsoftonline.com/your_tenant "
+                "Also please double check your tenant name or GUID is 
correct.".format(
                 authority_url))
         logger.debug("openid_config = %s", openid_config)
         self.authorization_endpoint = openid_config['authorization_endpoint']
@@ -101,7 +119,7 @@
         # "federation_protocol", "cloud_audience_urn",
         # "federation_metadata_url", "federation_active_auth_url", etc.
         if self.instance not in 
self.__class__._domains_without_user_realm_discovery:
-            resp = response or self.http_client.get(
+            resp = response or self._http_client.get(
                 
"https://{netloc}/common/userrealm/{username}?api-version=1.0".format(
                     netloc=self.instance, username=username),
                 headers={'Accept': 'application/json',
@@ -148,7 +166,10 @@
     if 400 <= resp.status_code < 500:
         # Nonexist tenant would hit this path
         # e.g. 
https://login.microsoftonline.com/nonexist_tenant/v2.0/.well-known/openid-configuration
-        raise ValueError("OIDC Discovery endpoint rejects our request")
+        raise ValueError(
+            "OIDC Discovery endpoint rejects our request. Error: {}".format(
+                resp.text  # Expose it as-is b/c OIDC defines no error 
response format
+            ))
     # Transient network error would hit this path
     resp.raise_for_status()
     raise RuntimeError(  # A fallback here, in case resp.raise_for_status() is 
no-op
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal/oauth2cli/assertion.py 
new/msal-1.17.0/msal/oauth2cli/assertion.py
--- old/msal-1.16.0/msal/oauth2cli/assertion.py 2021-10-30 00:57:23.000000000 
+0200
+++ new/msal-1.17.0/msal/oauth2cli/assertion.py 2022-02-11 21:25:25.000000000 
+0100
@@ -4,8 +4,6 @@
 import uuid
 import logging
 
-import jwt
-
 
 logger = logging.getLogger(__name__)
 
@@ -99,6 +97,7 @@
         Parameters are defined in https://tools.ietf.org/html/rfc7523#section-3
         Key-value pairs in additional_claims will be added into payload as-is.
         """
+        import jwt  # Lazy loading
         now = time.time()
         payload = {
             'aud': audience,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal/oauth2cli/oauth2.py 
new/msal-1.17.0/msal/oauth2cli/oauth2.py
--- old/msal-1.16.0/msal/oauth2cli/oauth2.py    2021-10-30 00:57:23.000000000 
+0200
+++ new/msal-1.17.0/msal/oauth2cli/oauth2.py    2022-02-11 21:25:25.000000000 
+0100
@@ -17,8 +17,6 @@
 import string
 import hashlib
 
-import requests
-
 from .authcode import AuthCodeReceiver as _AuthCodeReceiver
 
 try:
@@ -159,6 +157,8 @@
                     "when http_client is in use")
             self._http_client = http_client
         else:
+            import requests  # Lazy loading
+
             self._http_client = requests.Session()
             self._http_client.verify = True if verify is None else verify
             self._http_client.proxies = proxies
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal/oauth2cli/oidc.py 
new/msal-1.17.0/msal/oauth2cli/oidc.py
--- old/msal-1.16.0/msal/oauth2cli/oidc.py      2021-10-30 00:57:23.000000000 
+0200
+++ new/msal-1.17.0/msal/oauth2cli/oidc.py      2022-02-11 21:25:25.000000000 
+0100
@@ -44,10 +44,11 @@
     err = None  # 
https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation
     _now = int(now or time.time())
     skew = 120  # 2 minutes
+    TIME_SUGGESTION = "Make sure your computer's time and time zone are both 
correct."
     if _now + skew < decoded.get("nbf", _now - 1):  # nbf is optional per JWT 
specs
         # This is not an ID token validation, but a JWT validation
         # https://tools.ietf.org/html/rfc7519#section-4.1.5
-        err = "0. The ID token is not yet valid."
+        err = "0. The ID token is not yet valid. " + TIME_SUGGESTION
     if issuer and issuer != decoded["iss"]:
         # 
https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationResponse
         err = ('2. The Issuer Identifier for the OpenID Provider, "%s", '
@@ -68,7 +69,7 @@
     # the TLS server validation MAY be used to validate the issuer
     # in place of checking the token signature.
     if _now - skew > decoded["exp"]:
-        err = "9. The current time MUST be before the time represented by the 
exp Claim."
+        err = "9. The ID token already expires. " + TIME_SUGGESTION
     if nonce and nonce != decoded.get("nonce"):
         err = ("11. Nonce must be the same value "
             "as the one that was sent in the Authentication Request.")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal/wstrust_request.py 
new/msal-1.17.0/msal/wstrust_request.py
--- old/msal-1.16.0/msal/wstrust_request.py     2021-10-30 00:57:23.000000000 
+0200
+++ new/msal-1.17.0/msal/wstrust_request.py     2022-02-11 21:25:25.000000000 
+0100
@@ -44,8 +44,9 @@
             soap_action = Mex.ACTION_2005
         elif '/trust/13/usernamemixed' in endpoint_address:
             soap_action = Mex.ACTION_13
-    assert soap_action in (Mex.ACTION_13, Mex.ACTION_2005), (  # A loose check 
here
-        "Unsupported soap action: %s" % soap_action)
+    if soap_action not in (Mex.ACTION_13, Mex.ACTION_2005):
+        raise ValueError("Unsupported soap action: %s. "
+            "Contact your administrator to check your ADFS's MEX settings." % 
soap_action)
     data = _build_rst(
         username, password, cloud_audience_urn, endpoint_address, soap_action)
     resp = http_client.post(endpoint_address, data=data, headers={
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal.egg-info/PKG-INFO 
new/msal-1.17.0/msal.egg-info/PKG-INFO
--- old/msal-1.16.0/msal.egg-info/PKG-INFO      2021-10-30 00:57:32.000000000 
+0200
+++ new/msal-1.17.0/msal.egg-info/PKG-INFO      2022-02-11 21:25:35.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: msal
-Version: 1.16.0
+Version: 1.17.0
 Summary: The Microsoft Authentication Library (MSAL) for Python library 
enables your app to access the Microsoft Cloud by supporting authentication of 
users with Microsoft Azure Active Directory accounts (AAD) and Microsoft 
Accounts (MSA) using industry standard OAuth2 and OpenID Connect.
 Home-page: 
https://github.com/AzureAD/microsoft-authentication-library-for-python
 Author: Microsoft Corporation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/msal.egg-info/requires.txt 
new/msal-1.17.0/msal.egg-info/requires.txt
--- old/msal-1.16.0/msal.egg-info/requires.txt  2021-10-30 00:57:32.000000000 
+0200
+++ new/msal-1.17.0/msal.egg-info/requires.txt  2022-02-11 21:25:35.000000000 
+0100
@@ -1,6 +1,6 @@
 requests<3,>=2.0.0
 PyJWT[crypto]<3,>=1.0.0
-cryptography<38,>=0.6
+cryptography<39,>=0.6
 
 [:python_version < "3.3"]
 mock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/msal-1.16.0/setup.py new/msal-1.17.0/setup.py
--- old/msal-1.16.0/setup.py    2021-10-30 00:57:23.000000000 +0200
+++ new/msal-1.17.0/setup.py    2022-02-11 21:25:25.000000000 +0100
@@ -75,7 +75,7 @@
         'requests>=2.0.0,<3',
         'PyJWT[crypto]>=1.0.0,<3',
 
-        'cryptography>=0.6,<38',
+        'cryptography>=0.6,<39',
             # load_pem_private_key() is available since 0.6
             # 
https://github.com/pyca/cryptography/blob/master/CHANGELOG.rst#06---2014-09-29
             #

Reply via email to