summaryrefslogtreecommitdiffstats
path: root/roles/ipsilon/files/api.py
diff options
context:
space:
mode:
authorPatrick Uiterwijk <puiterwijk@redhat.com>2015-07-08 00:33:26 +0000
committerPatrick Uiterwijk <puiterwijk@redhat.com>2015-07-08 00:33:26 +0000
commit22d3ff6cd4406de99241fa661b54e12189013a8e (patch)
tree50a8f3d52c98681fa9cedf4074ef90a4992f8a04 /roles/ipsilon/files/api.py
parentcb0f2084080b779c60bc9d36deec2fc8651e3863 (diff)
downloadansible-22d3ff6cd4406de99241fa661b54e12189013a8e.tar.gz
ansible-22d3ff6cd4406de99241fa661b54e12189013a8e.tar.xz
ansible-22d3ff6cd4406de99241fa661b54e12189013a8e.zip
Add Ipsilon OpenID API Extension
Diffstat (limited to 'roles/ipsilon/files/api.py')
-rw-r--r--roles/ipsilon/files/api.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/roles/ipsilon/files/api.py b/roles/ipsilon/files/api.py
new file mode 100644
index 000000000..dd0f8b05c
--- /dev/null
+++ b/roles/ipsilon/files/api.py
@@ -0,0 +1,98 @@
+# Copyright (C) 2015 Patrick Uiterwijk, for license see COPYING
+
+from __future__ import absolute_import
+
+from ipsilon.providers.openid.extensions.common import OpenidExtensionBase
+import ipsilon.root
+from ipsilon.util.page import Page
+from ipsilon.util.user import User
+
+import json
+import inspect
+
+
+class OpenidExtension(OpenidExtensionBase):
+
+ def __init__(self, *pargs):
+ super(OpenidExtension, self).__init__('API')
+
+ def enable(self):
+ # This is the most ugly hack in my history of python...
+ # But I need to find the root object, and that is not passed into
+ # the OpenID extension system anywhere...
+ root_obj = inspect.stack()[5][0].f_locals['self']
+ root_obj.api = APIPage(root_obj)
+
+
+class APIPage(Page):
+ def __init__(self, root_obj):
+ ipsilon.root.sites['api'] = dict()
+ ipsilon.root.sites['api']['template_env'] = \
+ ipsilon.root.sites['default']['template_env']
+ super(APIPage, self).__init__(ipsilon.root.sites['api'])
+ self.v1 = APIV1Page(root_obj)
+
+
+class APIV1Page(Page):
+ def __init__(self, root_obj):
+ ipsilon.root.sites['api_v1'] = dict()
+ ipsilon.root.sites['api_v1']['template_env'] = \
+ ipsilon.root.sites['default']['template_env']
+ super(APIV1Page, self).__init__(ipsilon.root.sites['api_v1'])
+ self.root_obj = root_obj
+
+ def root(self, *args, **kwargs):
+ return json.dumps(self._perform_call(kwargs))
+
+ def _perform_call(self, arguments):
+ fas = self.root_obj.login.fas.lm
+ openid = self.root_obj.openid
+
+ openid_request = None
+ try:
+ openid_request = openid.cfg.server.decodeRequest(arguments)
+ except Exception, ex:
+ print 'Error during openid decoding: %s' % ex
+ return {'success': False,
+ 'status': 400,
+ 'message': 'Invalid request'
+ }
+ if not openid_request:
+ print 'No OpenID request parsed'
+ return {'success': False,
+ 'status': 400,
+ 'message': 'Invalid request'
+ }
+ if not arguments['auth_module'] == 'fedoauth.auth.fas.Auth_FAS':
+ print 'Unknown auth module selected'
+ return {'success': False,
+ 'status': 400,
+ 'message': 'Unknown authentication module'
+ }
+ username = arguments['username']
+ password = arguments['password']
+ user = None
+ userdata = None
+ try:
+ _, user = fas.fpc.login(username, password)
+ userdata = fas.page.make_userdata(user.user)
+ except Exception, ex:
+ print 'Error during auth: %s' % ex
+ pass
+
+ if user is None or userdata is None:
+ print 'No user or data: %s, %s' % (user, userdata)
+ return {'success': False,
+ 'status': 400,
+ 'message': 'Authentication failed'}
+
+ us_obj = User(username)
+ fake_session = lambda: None
+ setattr(fake_session, 'get_user', lambda *args: us_obj)
+ setattr(fake_session, 'get_user_attrs', lambda *args: userdata)
+
+ openid_response = openid._response(openid_request, fake_session)
+ openid_response = openid.cfg.server.signatory.sign(openid_response).fields.toPostArgs()
+ return {'success': True,
+ 'response': openid_response}
+