Changeset 4565 for TI12-security/trunk/python
- Timestamp:
- 08/12/08 17:00:33 (12 years ago)
- Location:
- TI12-security/trunk/python
- Files:
-
- 26 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
TI12-security/trunk/python/ndg.security.server/ndg/security/server/pylons/development.ini
r4154 r4565 52 52 53 53 # OpenID Provider 54 #openid _provider.path.openidserver=/openidserver55 #openid _provider.path.login=/login56 #openid _provider.path.loginsubmit=/loginsubmit57 #openid _provider.path.id=/id58 #openid _provider.path.yadis=/yadis59 #openid _provider.path.serveryadis=/serveryadis60 #openid _provider.path.allow=/allow61 #openid _provider.path.decide=/decide62 #openid _provider.path.mainpage=/54 #openid.provider.path.openidserver=/openidserver 55 #openid.provider.path.login=/login 56 #openid.provider.path.loginsubmit=/loginsubmit 57 #openid.provider.path.id=/id 58 #openid.provider.path.yadis=/yadis 59 #openid.provider.path.serveryadis=/serveryadis 60 #openid.provider.path.allow=/allow 61 #openid.provider.path.decide=/decide 62 #openid.provider.path.mainpage=/ 63 63 64 openid _provider.path.openidserver=/openid/openidserver65 openid _provider.path.login=/openid/login66 openid _provider.path.loginsubmit=/openid/loginsubmit67 openid _provider.path.id=/openid/id68 openid _provider.path.yadis=/openid/yadis69 openid _provider.path.serveryadis=/openid/serveryadis70 openid _provider.path.allow=/openid/allow71 openid _provider.path.decide=/openid/decide72 openid _provider.path.mainpage=/openid73 openid _provider.session_middleware=beaker.session74 #openid _provider.base_url=http://localhost:820075 openid _provider.base_url=https://gabriel.badc.rl.ac.uk76 #openid _provider.consumer_store_dirpath=./77 openid _provider.charset=None78 openid _provider.trace=False79 openid _provider.renderingClass=ndg.security.server.pylons.container.lib.openid_provider_util.OpenIDProviderKidRendering80 openid _provider.sregResponseHandler=ndg.security.server.pylons.container.lib.openid_provider_util:esgSRegResponseHandler81 openid _provider.axResponseHandler=ndg.security.server.pylons.container.lib.openid_provider_util:esgAXResponseHandler64 openid.provider.path.openidserver=/openid/openidserver 65 openid.provider.path.login=/openid/login 66 openid.provider.path.loginsubmit=/openid/loginsubmit 67 openid.provider.path.id=/openid/id 68 openid.provider.path.yadis=/openid/yadis 69 openid.provider.path.serveryadis=/openid/serveryadis 70 openid.provider.path.allow=/openid/allow 71 openid.provider.path.decide=/openid/decide 72 openid.provider.path.mainpage=/openid 73 openid.provider.session_middleware=beaker.session 74 #openid.provider.base_url=http://localhost:8200 75 openid.provider.base_url=https://gabriel.badc.rl.ac.uk 76 #openid.provider.consumer_store_dirpath=./ 77 openid.provider.charset=None 78 openid.provider.trace=False 79 openid.provider.renderingClass=ndg.security.server.pylons.container.lib.openid.provider_util.OpenIDProviderKidRendering 80 openid.provider.sregResponseHandler=ndg.security.server.pylons.container.lib.openid.provider_util:esgSRegResponseHandler 81 openid.provider.axResponseHandler=ndg.security.server.pylons.container.lib.openid.provider_util:esgAXResponseHandler 82 82 83 83 # Basic authentication for testing/admin - comma delimited list of 84 84 # <username>:<password> pairs 85 openid _provider.usercreds=pjk:test, luca:esgndgtest85 openid.provider.usercreds=pjk:test, luca:esgndgtest 86 86 87 87 # Logging configuration -
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/__init__.py
r4559 r4565 168 168 """OpenID Provider WSGI Middleware Error""" 169 169 170 class OpenIDProviderConfigError( Exception):170 class OpenIDProviderConfigError(OpenIDProviderMiddlewareError): 171 171 """OpenID Provider Configuration Error""" 172 172 173 class OpenIDProviderMissingRequiredAXAttrs(OpenIDProviderMiddlewareError): 174 """Raise if a Relying Party *requires* one or more attributes via 175 the AX interface but this OpenID Provider cannot return them. This doesn't 176 apply to attributes that are optional""" 177 178 class OpenIDProviderMissingAXResponseHandler(OpenIDProviderMiddlewareError): 179 """Raise if a Relying Party *requires* one or more attributes via 180 the AX interface but no AX Response handler has been set""" 181 173 182 class OpenIDProviderMiddleware(object): 174 183 """WSGI Middleware to implement an OpenID Provider … … 253 262 # Convert from string type where required 254 263 opt['charset'] = opt.get('charset', '') 255 opt['trace'] = bool(opt.get('trace', 'False'))264 opt['trace'] = opt.get('trace', 'false').lower() == 'true' 256 265 257 266 renderingClassVal = opt.get('renderingClass', None) … … 293 302 self._authN = authNInterfaceClass(**authNInterfaceProperties) 294 303 except Exception, e: 295 log.error("Error instantiating authentication interface ...")304 log.error("Error instantiating authentication interface: %s" % e) 296 305 raise 297 306 … … 333 342 (renderingClass, 334 343 RenderingInterface)) 344 345 # Extract rendering interface specific properties 346 renderingProperties = dict([(k.replace('rendering_', ''), v) 347 for k,v in opt.items() 348 if k.startswith('rendering_')]) 335 349 336 350 try: 337 self._render = renderingClass(self._authN, 338 self.base_url, 339 self.urls) 351 self._render = renderingClass(self._authN, 352 self.base_url, 353 self.urls, 354 **renderingProperties) 340 355 except Exception, e: 341 log.error("Error instantiating rendering interface ...")356 log.error("Error instantiating rendering interface: %s" % e) 342 357 raise 343 358 … … 374 389 app_conf or keywords 375 390 391 Nb. exclusions for authN and rendering interface properties. 392 376 393 @type opt: dict 377 394 @param opt: existing options set. These will be updated by this … … 393 410 # Allow for authN.* properties used by the Authentication 394 411 # Interface 395 if filtK not in cls.defOpt and not filtK.startswith('authN_'): 412 if filtK not in cls.defOpt and \ 413 not filtK.startswith('authN_') and \ 414 not filtK.startswith('rendering_'): 396 415 badOpt += [k] 397 416 else: … … 593 612 594 613 try: 595 oidResponse = self._identityApproved(oidRequest, identity) 614 oidResponse = self._identityApprovedPostProcessing(oidRequest, 615 identity) 616 617 except (OpenIDProviderMissingRequiredAXAttrs, 618 OpenIDProviderMissingAXResponseHandler): 619 response = self._render.errorPage(environ, start_response, 620 'The site where you wish to signin requires ' 621 'additional information which this site isn\'t ' 622 'configured to provide. Please report this fault to ' 623 'your site administrator.') 624 return response 625 596 626 except Exception, e: 597 627 log.error("Setting response following ID Approval: %s" % e) 598 628 return self._render.errorPage(environ, start_response, 599 'Error setting response.'600 'Please report the error to'601 'your site administrator.')629 'An error occurred setting additional parameters ' 630 'required by the site requesting your ID. Please ' 631 'report this fault to your site administrator.') 602 632 else: 603 633 return self._displayResponse(oidResponse) … … 761 791 not oidRequest.idSelect(): 762 792 try: 763 response = self._identityApproved(oidRequest, 764 oidRequest.identity) 793 response = self._identityApprovedPostProcessing(oidRequest, 794 oidRequest.identity) 795 except (OpenIDProviderMissingRequiredAXAttrs, 796 OpenIDProviderMissingAXResponseHandler): 797 response = self._render.errorPage(environ, start_response, 798 'The site where you wish to signin requires ' 799 'additional information which this site isn\'t ' 800 'configured to provide. Please report this fault to ' 801 'your site administrator.') 802 return response 803 765 804 except Exception, e: 766 805 log.error("Setting response following ID Approval: %s" % e) 767 806 response = self._render.errorPage(environ, start_response, 768 'Error setting response.'769 'Please report the error to'770 'your site administrator.')807 'An error occurred setting additional parameters ' 808 'required by the site requesting your ID. Please ' 809 'report this fault to your site administrator.') 771 810 return response 772 811 … … 870 909 "been set" % requiredAttr) 871 910 log.error(msg) 872 raise OpenIDProvider ConfigError(msg)911 raise OpenIDProviderMissingAXResponseHandler(msg) 873 912 874 913 return … … 878 917 # possibly via FetchRequest.getRequiredAttrs() 879 918 try: 880 self.axResponseHandler(ax_req, ax_resp, 881 self.session.get('username')) 919 self.axResponseHandler(ax_req,ax_resp,self.session.get('username')) 920 921 except OpenIDProviderMissingRequiredAXAttrs, e: 922 log.error("OpenID Provider is unable to set the AX attributes " 923 "required by the Relying Party's request: %s" % e) 924 raise 925 882 926 except Exception, e: 883 927 log.error("%s exception raised setting requested Attribute " … … 888 932 889 933 890 def _identityApproved (self, oidRequest, identifier=None):934 def _identityApprovedPostProcessing(self, oidRequest, identifier=None): 891 935 '''Action following approval of a Relying Party by the user. Add 892 936 Simple Registration and/or Attribute Exchange parameters if handlers 893 were specified - See _addSRegResponse and _addAXResponse methods 937 were specified - See _addSRegResponse and _addAXResponse methods - and 938 only if the Relying Party has requested them 894 939 895 940 @type oidRequest: openid.server.server.CheckIDRequest … … 935 980 # User has approved this Relying Party 936 981 try: 937 oidResponse = self._identityApproved(oidRequest) 982 oidResponse = self._identityApprovedPostProcessing( 983 oidRequest) 984 except (OpenIDProviderMissingRequiredAXAttrs, 985 OpenIDProviderMissingAXResponseHandler): 986 response = self._render.errorPage(environ, start_response, 987 'The site where you wish to signin requires ' 988 'additional information which this site isn\'t ' 989 'configured to provide. Please report this fault to ' 990 'your site administrator.') 991 return response 992 938 993 except Exception, e: 939 994 log.error("Setting response following ID Approval: %s" % e) 940 995 response = self._render.errorPage(environ, start_response, 941 'Error setting response. Please report the error to ' 942 'your site administrator.') 996 'An error occurred setting additional parameters ' 997 'required by the site requesting your ID. Please ' 998 'report this fault to your site administrator.') 943 999 return response 944 1000 -
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/authninterface/basic.py
r4559 r4565 18 18 import logging 19 19 log = logging.getLogger(__name__) 20 20 21 from ndg.security.server.wsgi.openid.provider import AbstractAuthNInterface 22 21 23 22 24 class BasicAuthNInterface(AbstractAuthNInterface): … … 64 66 raise AuthNInterfaceConfigError('Mismatch between usernames in ' 65 67 '"userCreds" and ' 66 '"username2UserIdentifiers" options') 68 '"username2UserIdentifiers" ' 69 'options') 67 70 68 71 def logon(self, environ, userIdentifier, username, password): -
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/authninterface/sessionmanager.py
r4545 r4565 31 31 '''Authentication interface class for OpenIDProviderMiddleware to enable 32 32 authentication to a Session Manager instance running in the same WSGI 33 stack or via a SOAP call to a remote service''' 33 stack or via a SOAP call to a remote service 34 35 @type dbParamNames: tuple 36 @cvar dbParamNames: permitted config keywords. Nb. SQL queries takes 37 String Template style '$' substitutions for username, password and OpenID 38 identifier''' 34 39 35 40 dbParamNames = ( … … 87 92 88 93 try: 89 queryInputs = dict(username=username, 90 userIdentifier=userIdentifier) 91 query = Template(self.logonSQLQuery).substitute(queryInputs) 92 result = connection.execute(query) 94 try: 95 queryInputs = dict(username=username, 96 userIdentifier=userIdentifier) 97 query=Template(self.logonSQLQuery).substitute(queryInputs) 98 result = connection.execute(query) 99 except Exception, e: 100 log.error('Connecting database for user logon query : %s' % 101 e) 102 raise 103 93 104 if not result.rowcount: 94 105 raise AuthNInterfaceUsername2IdentifierMismatch() -
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/renderinginterface/buffet/__init__.py
r4554 r4565 12 12 __contact__ = "Philip.Kershaw@stfc.ac.uk" 13 13 __revision__ = "$Id$" 14 import pylons15 from pylons.templating import Buffet16 from pylons import config17 14 import logging 18 15 log = logging.getLogger(__name__) 19 16 17 import httplib 18 from pylons.templating import Buffet 19 20 # Rendering classes for OpenID Provider must derive from generic render 21 # interface 20 22 from ndg.security.server.wsgi.openid.provider import RenderingInterface, \ 21 23 AuthNInterfaceConfigError … … 25 27 def _update_names(self, ns): 26 28 return ns 27 28 try:29 def_eng = config['buffet.template_engines'][0]30 buffet = OpenIDProviderRenderingBuffet(31 def_eng['engine'],32 template_root=def_eng['template_root'],33 **def_eng['template_options']34 )35 36 for e in config['buffet.template_engines'][1:]:37 buffet.prepare(38 e['engine'],39 template_root=e['template_root'],40 alias=e['alias'],41 **e['template_options']42 )43 except:44 templateRoot = 'ndg.security.server.pylons.container.templates'45 buffet = OpenIDProviderRenderingBuffet('kid', template_root=templateRoot)46 #{'mako.directories': ['/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/container/templates'],47 #'myghty.component_root': [{'templates': '/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/container/templates'}],48 #'myghty.data_dir': '/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/data/templates',49 #'kid.encoding': 'utf-8',50 #'kid.assume_encoding': 'utf-8',51 #'mako.module_directory': '/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/data/templates',52 #'myghty.allow_globals': ['c', 'g', 'h', 'render', 'request', 'session', 'translator', 'ungettext', '_', 'N_'],53 #'myghty.output_encoding': 'utf-8',54 #'myghty.raise_error': True,55 #'mako.output_encoding': 'utf-8',56 #'mako.filesystem_checks': True}57 58 59 class State:60 '''Convenience class for passing parameters from rendering interface to61 individual template files'''62 def __init__(self, urls={}, session={}):63 self.title = ''64 self.xml = ''65 self.headExtras = ''66 self.session = session67 self.loginStatus = True68 self.urls = urls69 70 import httplib71 72 # Rendering classes for OpenID Provider must derive from generic render73 # interface74 from ndg.security.server.wsgi.openid.provider import RenderingInterface75 29 76 30 class BuffetRendering(RenderingInterface): … … 92 46 ) 93 47 94 def __init__(self, **prop): 48 def __init__(self, *arg, **opt): 49 '''Extend RenderingInterface to include config and set-up for Buffet 50 object 51 52 @type *arg: tuple 53 @param *arg: RenderingInterface parent class arguments 54 @type **opt: dict 55 @param **opt: additional keywords to set-up Buffet rendering''' 56 super(BuffetRendering, self).__init__(*arg, **opt) 57 95 58 try: 96 for p in prop:97 setattr(self, p, prop[p])59 for i in opt: 60 setattr(self, i, opt[i]) 98 61 except KeyError, e: 99 62 raise AuthNInterfaceConfigError("Missing property: %s" % e) 100 63 101 self._buffet =OpenIDProviderRenderingBuffet(self.templateType,102 template_root=templateRoot)64 self._buffet = OpenIDProviderRenderingBuffet(self.templateType, 65 template_root=self.templateRoot) 103 66 104 def _render(self, templateName, **kw): 67 self.title = '' 68 self.xml = '' 69 self.headExtras = '' 70 self.loginStatus = True 71 72 def _render(self, templateName, c=None, **kw): 105 73 '''Wrapper for Buffet.render''' 74 if c is None: 75 c = self 76 77 kw['c'] = c 78 106 79 rendering = self._buffet.render(template_name=templateName, 107 80 namespace=kw) … … 111 84 msg=''): 112 85 """Set-up template for OpenID Provider Login""" 113 c = State(urls=self.urls, session=self.session) 114 c.title = "OpenID Login" 115 c.success_to = success_to or self.urls['url_mainpage'] 116 c.fail_to = fail_to or self.urls['url_mainpage'] 117 c.xml = msg 86 self.title = "OpenID Login" 87 self.success_to = success_to or self.urls['url_mainpage'] 88 self.fail_to = fail_to or self.urls['url_mainpage'] 89 self.xml = msg 118 90 119 response = BuffetRendering._render('ndg.security.login', 120 c=c, g=config, h=h) 91 response = self._render('ndg.security.login') 121 92 start_response('200 OK', 122 93 [('Content-type', 'text/html'+self.charset), … … 127 98 def mainPage(self, environ, start_response): 128 99 """Set-up template for OpenID Provider Login""" 129 c = State(urls=self.urls, session=self.session) 130 c.title = "OpenID Provider" 131 c.headExtras = '<meta http-equiv="x-xrds-location" content="%s"/>' % \ 100 self.title = "OpenID Provider" 101 self.headExtras = '<meta http-equiv="x-xrds-location" content="%s"/>'%\ 132 102 self.urls['url_serveryadis'] 133 103 134 response = BuffetRendering._render('ndg.security.mainPage', 135 c=c, g=config, h=h) 104 response = self._render('ndg.security.mainPage') 136 105 start_response('200 OK', 137 106 [('Content-type', 'text/html'+self.charset), … … 147 116 h.redirect_to(self.urls['url_mainpage']) 148 117 149 c = State(urls=self.urls, session=self.session) 150 c.title = "OpenID Identity Page" 118 self.title = "OpenID Identity Page" 151 119 152 120 link_tag = '<link rel="openid.server" href="%s"/>' % \ 153 self.urls['url_openidserver']121 self.urls['url_openidserver'] 154 122 155 123 yadis_loc_tag = '<meta http-equiv="x-xrds-location" content="%s"/>' % \ 156 124 (self.urls['url_yadis']+'/'+userIdentifier) 157 125 158 c.headExtras = link_tag + yadis_loc_tag126 self.headExtras = link_tag + yadis_loc_tag 159 127 identityURL = self.base_url + path 160 c.xml = "<b><pre>%s</pre></b>" % identityURL128 self.xml = "<b><pre>%s</pre></b>" % identityURL 161 129 162 response = BuffetRendering._render('ndg.security.identityPage', 163 c=c, g=config, h=h) 130 response = self._render('ndg.security.identityPage') 164 131 start_response("200 OK", 165 132 [('Content-type', 'text/html'+self.charset), … … 171 138 """Handle user interaction required before final submit back to Relying 172 139 Party""" 173 c = State(urls=self.urls, session=self.session)174 c.title = 'Approve OpenID Request?'175 c.trust_root = oidRequest.trust_root176 c.oidRequest = oidRequest140 self.title = 'Approve OpenID Request?' 141 self.trust_root = oidRequest.trust_root 142 self.oidRequest = oidRequest 143 self.environ = environ 177 144 178 response=BuffetRendering._render('ndg.security.decidePage', 179 c=c, g=config, h=h) 145 response = self._render('ndg.security.decidePage') 180 146 start_response("200 OK", 181 147 [('Content-type', 'text/html'+self.charset), … … 185 151 186 152 def errorPage(self, environ, start_response, msg, code=500): 187 c = State(urls=self.urls, session=self.session) 188 c.title = 'Error with OpenID Provider' 189 c.xml = msg 153 '''Display error information''' 154 self.title = 'Error with OpenID Provider' 155 self.xml = msg 156 response = self._render('ndg.security.error') 190 157 start_response('%d %s' % (code, httplib.responses[code]), 191 158 [('Content-type', 'text/html'+self.charset), 192 159 ('Content-length', str(len(response)))]) 193 response = BuffetRendering._render('ndg.security.error',194 c=c, g=config, h=h)195 160 return response -
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/renderinginterface/buffet/templates/ndg/security/decidePage.kid
r4554 r4565 12 12 <?python 13 13 if c.oidRequest.idSelect(): 14 identityURL = c.urls['url_id']+'/'+c.session['username'] 14 userIdentifier = c._authN.username2UserIdentifiers( 15 c.environ, 16 c.session['username'])[0] 17 identityURL = c.urls['url_id']+'/'+userIdentifier 15 18 else: 16 19 identityURL = c.oidRequest.identity … … 33 36 <form method="POST" action="${c.urls['url_allow']}"> 34 37 <table> 38 <input type="hidden" name="identity" value="$identityURL" /> 35 39 <tr> 36 40 <td> -
TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/renderinginterface/buffet/templates/ndg/security/ndgPage.kid
r4554 r4565 26 26 <div py:def="header()"> 27 27 <div id="header"/> 28 <div id="logo"><img src="${ g['LeftLogo']}" alt="${g['LeftAlt']}" /></div>28 <div id="logo"><img src="${c.leftLogo}" alt="${c.leftAlt}" /></div> 29 29 </div> 30 30 … … 59 59 <td align="left" width="60%"> 60 60 <table><tbody> 61 <tr><td><span py:replace="linkimage( g.ndgLink,g.ndgImage,'NDG')"/></td>61 <tr><td><span py:replace="linkimage(c.ndgLink,c.ndgImage,'NDG')"/></td> 62 62 <td>OpenID Provider Site for <a href="http://ndg.nerc.ac.uk"> NERC DataGrid</a> 63 ${ g.disclaimer} </td>63 ${c.disclaimer} </td> 64 64 </tr> 65 65 </tbody></table> … … 93 93 </div> 94 94 </td> 95 <td align="right"><span py:replace="linkimage( g.stfcLink,g.stfcImage,'Hosted by the STFC CEDA')"/></td>95 <td align="right"><span py:replace="linkimage(c.stfcLink,c.stfcImage,'Hosted by the STFC CEDA')"/></td> 96 96 </tr> 97 97 </tbody></table></center> -
TI12-security/trunk/python/ndg.security.test/ndg/security/test/combinedservices/serverapp.py
r4538 r4565 167 167 from paste.httpserver import serve 168 168 from paste.deploy import loadapp 169 169 170 from paste.urlparser import StaticURLParser 171 from paste.cascade import Cascade 172 170 173 app = loadapp('config:%s' % cfgFilePath) 171 serve(app, host='0.0.0.0', port=port) 174 rootPath = os.path.join(os.environ['NDGSEC_COMBINED_SRVS_UNITTEST_DIR'], 175 'openidprovider') 176 177 # Include to enable stylesheet and graphics 178 staticURLParser = StaticURLParser(rootPath) 179 app2 = Cascade([staticURLParser, app]) 180 serve(app2, host='0.0.0.0', port=port) -
TI12-security/trunk/python/ndg.security.test/ndg/security/test/combinedservices/services.ini
r4554 r4565 330 330 openid.provider.rendering.templateType = kid 331 331 openid.provider.rendering.templateRoot = ndg.security.server.wsgi.openid.provider.renderinginterface.buffet.templates 332 openid.provider.rendering.kid.assume_encoding= utf-8 333 openid.provider.rendering.kid.encoding = utf-8 332 334 333 335 # Layout 334 openid.provider.rendering.baseURL = http://localhost:8000336 openid.provider.rendering.baseURL = %(openid.provider.base_url)s 335 337 openid.provider.rendering.leftLogo = %(openid.provider.rendering.baseURL)s/layout/NERC_Logo.gif 336 338 openid.provider.rendering.leftAlt = Natural Environment Research Council
Note: See TracChangeset
for help on using the changeset viewer.