[Python-modules-commits] [python-openid-teams] 01/04: Initial import of python-openid-teams_1.1.orig.tar.gz

Sergio Durigan Junior sergiodj-guest at moszumanska.debian.org
Tue Jul 5 03:58:02 UTC 2016


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

sergiodj-guest pushed a commit to branch master
in repository python-openid-teams.

commit 0adbf6d9702ab727275021feac1368e363450ccd
Author: Sergio Durigan Junior <sergiodj at sergiodj.net>
Date:   Sun Jul 3 22:16:24 2016 -0400

    Initial import of python-openid-teams_1.1.orig.tar.gz
---
 .gitignore               |  35 ++++++
 COPYING                  |  24 ++++
 README.md                |   4 +
 openid_teams/__init__.py |  25 ++++
 openid_teams/teams.py    | 307 +++++++++++++++++++++++++++++++++++++++++++++++
 setup.py                 |  48 ++++++++
 6 files changed, 443 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d2d6f36
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,35 @@
+*.py[cod]
+
+# C extensions
+*.so
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+lib
+lib64
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+nosetests.xml
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..4ac8615
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,24 @@
+Copyright (c) 2013, Patrick Uiterwijk <puiterwijk at gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of Patrick Uiterwijk nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL Patrick Uiterwijk BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b7ff7c8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+python-openid-teams
+===================
+
+Teams extension for python-openid
diff --git a/openid_teams/__init__.py b/openid_teams/__init__.py
new file mode 100644
index 0000000..d4ec196
--- /dev/null
+++ b/openid_teams/__init__.py
@@ -0,0 +1,25 @@
+# Copyright (c) 2013, Patrick Uiterwijk <puiterwijk at gmail.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of Patrick Uiterwijk nor the
+#       names of its contributors may be used to endorse or promote products
+#       derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL Patrick Uiterwijk BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/openid_teams/teams.py b/openid_teams/teams.py
new file mode 100644
index 0000000..0fd3843
--- /dev/null
+++ b/openid_teams/teams.py
@@ -0,0 +1,307 @@
+# Copyright (c) 2013, Patrick Uiterwijk <puiterwijk at gmail.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of Patrick Uiterwijk nor the
+#       names of its contributors may be used to endorse or promote products
+#       derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL Patrick Uiterwijk BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Teams extension request and response parsing and object representation
+
+This module contains objects representing team extension requests
+and responses that can be used with both OpenID relying parties and
+OpenID providers.
+
+    1. The relying party creates a request object and adds it to the
+       C{L{AuthRequest<openid.consumer.consumer.AuthRequest>}} object
+       before making the C{checkid_} request to the OpenID provider::
+
+        auth_request.addExtension(TeamsRequest(requested=['team']))
+
+    2. The OpenID provider extracts the teams extension request from
+       the OpenID request using C{L{TeamsRequest.fromOpenIDRequest}},
+       gets the user's approval and team membership, creates a C{L{TeamsResponse}}
+       object and adds it to the C{id_res} response::
+
+        teams_req = TeamsRequest.fromOpenIDRequest(checkid_request)
+        # [ get the user's approval and team membership, informing the user that
+        #   the groups in teams_response were requested and accepted ]
+        teams_resp = TeamsResponse.extractResponse(teams_req, group_memberships)
+        teams_resp.toMessage(openid_response.fields)
+
+    3. The relying party uses C{L{TeamsResponse.fromSuccessResponse}} to
+       exxtract the data from the OpenID response::
+
+        teams_resp = TeamsResponse.fromSuccessResponse(success_response)
+
+ at var teams_uri: The URI used for the teams extension namespace and XRD Type Value
+"""
+
+import logging
+
+from openid.message import registerNamespaceAlias, \
+     NamespaceAliasRegistrationError
+from openid.extension import Extension
+
+import six
+
+__all__ = [
+    'TeamsRequest',
+    'TeamsResponse',
+    'teams_uri',
+    'supportsTeams',
+    ]
+
+# The namespace for this extension
+teams_uri = 'http://ns.launchpad.net/2007/openid-teams'
+
+try:
+    registerNamespaceAlias(teams_uri, 'lp')
+except NamespaceAliasRegistrationError as e:
+    logging.exception('registerNamespaceAlias(%r, %r) failed: %s' % (teams_uri,
+                                                               'teams', str(e),))
+
+def supportsTeams(endpoint):
+    """Does the given endpoint advertise support for team extension?
+
+    @param endpoint: The endpoint object as returned by OpenID discovery
+    @type endpoint: openid.consumer.discover.OpenIDEndpoint
+
+    @returns: Whether an teams extension type was advertised by the endpoint
+    @rtype: bool
+    """
+    return endpoint.usesExtension(teams_uri)
+
+class TeamsRequest(Extension):
+    """An object to hold the state of a teams extension request.
+
+    @ivar requested: A list of team names in this teams extension request
+    @type required: [str]
+
+    @group Consumer: requestField, requestFields, getExtensionArgs, addToOpenIDRequest
+    @group Server: fromOpenIDRequest, parseExtensionArgs
+    """
+    ns_uri = 'http://ns.launchpad.net/2007/openid-teams'
+    ns_alias = 'lp'
+
+    def __init__(self, requested=None):
+        """Initialize an empty teams extension request"""
+        Extension.__init__(self)
+        self.requested = []
+
+        if requested:
+            self.requestTeams(requested)
+
+    def requestedTeams(self):
+        return self.requested
+
+    def fromOpenIDRequest(cls, request):
+        """Create a simple teams extension request that contains the
+        team names that were requested in the OpenID request with the
+        given arguments
+
+        @param request: The OpenID request
+        @type request: openid.server.CheckIDRequest
+
+        @returns: The newly created teams extension request
+        @rtype: C{L{TeamsRequest}}
+        """
+        self = cls()
+
+        # Since we're going to mess with namespace URI mapping, don't
+        # mutate the object that was passed in.
+        message = request.message.copy()
+
+        args = message.getArgs(self.ns_uri)
+        self.parseExtensionArgs(args)
+
+        return self
+
+    fromOpenIDRequest = classmethod(fromOpenIDRequest)
+
+    def parseExtensionArgs(self, args):
+        """Parse the unqualified teams extension request
+        parameters and add them to this object.
+
+        This method is essentially the inverse of
+        C{L{getExtensionArgs}}. This method restores the serialized teams
+        extension team names.
+
+        If you are extracting arguments from a standard OpenID
+        checkid_* request, you probably want to use C{L{fromOpenIDRequest}},
+        which will extract the teams extension namespace and arguments from the
+        OpenID request. This method is intended for cases where the
+        OpenID server needs more control over how the arguments are
+        parsed than that method provides.
+
+        >>> args = message.getArgs(teams_uri)
+        >>> request.parseExtensionArgs(args)
+
+        @param args: The unqualified teams extension arguments
+        @type args: {str:str}
+
+        @returns: None; updates this object
+        """
+        items = args.get('query_membership')
+        if items:
+            for team_name in items.split(','):
+                self.requestTeam(team_name)
+
+    def wereTeamsRequested(self):
+        """Have any teams been requested?
+
+        @rtype: bool
+        """
+        return bool(self.requested)
+
+    def __requests__(self, team_name):
+        """Was this team in the request team names?"""
+        return team_name in self.requested
+
+    def requestTeam(self, team_name):
+        """Request the specified team membership from the OpenID user
+
+        @param team_name: the unqualified team name
+        @type team_name: str
+        """
+        if not team_name in self.requested:
+            self.requested.append(team_name)
+
+    def requestTeams(self, team_names):
+        """Add the given list of team names to the request.
+
+        @param team_names: The team names to request
+        @type team_names: [str]
+        """
+        if isinstance(team_names, six.string_types):
+            raise TypeError('Teams should be passed as a list of '
+                            'strings (not %r)' % (type(field_names),))
+
+        for team_name in team_names:
+            self.requestTeam(team_name)
+
+    def getExtensionArgs(self):
+        """Get a dictionary of unqualified team extension
+        arguments representing this request.
+
+        This method is essentially the inverse of
+        C{L{parseExtensionArgs}}. This method serializes the team
+        extension request fields.
+
+        @rtype: {str:str}
+        """
+        args = {}
+
+        if self.requested:
+            args['query_membership'] = ','.join(self.requested)
+
+        return args
+
+class TeamsResponse(Extension):
+    """Represents the data returned in a simple registration response
+    inside of an OpenID C{id_res} response. This object will be
+    created by the OpenID server, added to the C{id_res} response
+    object, and then extracted from the C{id_res} message by the
+    Consumer.
+
+    @ivar data: The simple registration data, keyed by the unqualified
+        simple registration name of the field (i.e. nickname is keyed
+        by C{'nickname'})
+
+    @ivar ns_uri: The URI under which the simple registration data was
+        stored in the response message.
+
+    @group Server: extractResponse
+    @group Consumer: fromSuccessResponse
+    @group Read-only dictionary interface: keys, iterkeys, items, iteritems,
+        __iter__, get, __getitem__, keys, has_key
+    """
+
+    ns_uri = 'http://ns.launchpad.net/2007/openid-teams'
+    ns_alias = 'lp'
+
+    def __init__(self, teams=None):
+        Extension.__init__(self)
+        if teams is None:
+            self.teams = []
+        else:
+            self.teams = teams
+
+    def extractResponse(cls, request, teams):
+        """Take a C{L{TeamsRequest}} and a list of groups
+        the user is member of and create a C{L{TeamsResponse}}
+        object containing the list of team names that are both
+        requested and in the membership list of the user.
+
+        @param request: The teams extension request object
+        @type request: TeamsRequest
+
+        @param teams: The list of teams the user is a member of
+        @type teams: [str]
+
+        @returns: a teams extension response object
+        @rtype: TeamsResponse
+        """
+        self = cls()
+        for team in request.requestedTeams():
+            if team in teams:
+                self.teams.append(team)
+        return self
+
+    extractResponse = classmethod(extractResponse)
+
+    def fromSuccessResponse(cls, success_response, signed_only=True):
+        """Create a C{L{TeamsResponse}} object from a successful OpenID
+        library response
+        (C{L{openid.consumer.consumer.SuccessResponse}}) response
+        message
+
+        @param success_response: A SuccessResponse from consumer.complete()
+        @type success_response: C{L{openid.consumer.consumer.SuccessResponse}}
+
+        @param signed_only: Whether to process only data that was
+            signed in the id_res message from the server.
+        @type signed_only: bool
+
+        @rtype: TeamsResponse
+        @returns: A teams extension response with the teams the OpenID
+            provider provided.
+        """
+        self = cls()
+        if signed_only:
+            args = success_response.getSignedNS(self.ns_uri)
+        else:
+            args = success_response.message.getArgs(self.ns_uri)
+
+        if not args:
+            return None
+
+        self.teams = args['is_member'].split(',')
+
+        return self
+
+    fromSuccessResponse = classmethod(fromSuccessResponse)
+
+    def getExtensionArgs(self):
+        """Get the fields to put in the teams extension namespace
+        when adding them to an id_res message.
+
+        @see: openid.extension
+        """
+        return {'is_member': ','.join(self.teams)}
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..4b5a5f4
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,48 @@
+# Copyright (c) 2013, Patrick Uiterwijk <puiterwijk at gmail.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of Patrick Uiterwijk nor the
+#       names of its contributors may be used to endorse or promote products
+#       derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL Patrick Uiterwijk BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import sys
+from setuptools import setup, find_packages
+
+install_requires = ['six']
+
+if sys.version_info[0] == 2:
+    install_requires.append('python-openid>=2.2.5')
+elif sys.version_info[0] == 3:
+    install_requires.append('python3-openid')
+
+setup(
+    name = "python-openid-teams",
+    version = "1.1",
+    install_requires = install_requires,
+    zip_safe = True,
+    packages = ['openid_teams'],
+    author = 'Patrick Uiterwijk',
+    author_email = 'puiterwijk at gmail.com',
+    description = 'This is an implementation of the OpenID teams extension for python-openid',
+    license = 'BSD',
+    keywords = 'openid teams',
+    url = 'http://www.github.com/puiterwijk/python-openid-teams/',
+)

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



More information about the Python-modules-commits mailing list