Changeset 3892 for TI12-security/trunk


Ignore:
Timestamp:
13/05/08 09:14:41 (12 years ago)
Author:
pjkersha
Message:
  • Big changes enabling modularised security from Discovery/Browse? Pylons code stack. Changes are for login only and don't include the Gatekeeper yet.
  • Updates to OpenID AuthKit? test code to enable kid templates.

ndg.security.server/ndg/security/server/sso/sso/config/ssoServiceMiddleware.py

  • include client in ndg.security.client.cfg class for globals - needed for server/sslServer config settings for SSO Client BaseController?
  • read WS-Security settings using ndg.security.common.wssecurity.WSSecurityConfig

ndg.security.server/ndg/security/server/sso/sso/controllers/login.py,
ndg.security.server/ndg/security/server/sso/sso/controllers/logout.py:

  • Give specific alias for kid templates to enable a separate security templates dir to ows_server

ndg.security.server/ndg/security/server/sso/sso/controllers/wayf.py:

  • ditto to above
  • fix to URL input into base 64 encode - convert from unicode to regular string as otherwise b64 code will fail

ndg.security.server/ndg/security/server/sso/sso/lib/base.py:

  • Provide full path to sso.* imports so that controllers can be imported across into ows_server or any other pylons code stack.
  • LoginServiceQuery? -> SSOServiceQuery

ndg.security.server/ndg/security/server/sso/sso/templates/ndg/security/wayf.kid:

  • got rid of login status info - it's confusing to the user

ndg.security.client/ndg/security/client/ssoclient/ssoClient.cfg:

  • added tracefile option for ZSI SOAP i/o display

ndg.security.client/ndg/security/client/ssoclient/ssoclient/config/ssoClientMiddleware.py:

  • SSOMiddleware interface changed to enable reading direct from an existing config object as well as from file

ndg.security.client/ndg/security/client/ssoclient/ssoclient/controllers/logout.py:

  • fixes for full path import statements + correct g config attr settings

ndg.security.client/ndg/security/client/ssoclient/ssoclient/lib/base.py:

  • enable processing of logout response from a separate SSO Service - logout flag in URL arg tells base controller to delete the security details from the cookie.

ndg.security.client/ndg/security/client/ssoclient/ssoclient/templates/ndg/security/ndgPage.kid: typo fix

Tests/authtest/development.ini,
Tests/authtest/authtest/config/environment.py,
Tests/authtest/authtest/controllers/auth.py:

  • enable kid template for OpenID signin

Tests/authtest/authtest/tests/functional/test_test2.py,
Tests/authtest/authtest/controllers/test2.py: test controller

ndg.security.common/ndg/security/common/wssecurity/init.py:

  • enable initialisation from an existing config file object

ndg.security.common/ndg/security/common/pylons/security_util.py:

ndg.security.common/ndg/security/common/init.py: fix to imports

ndg.security.common/ndg/security/common/wsSecurity.py: fix for altered WSSecurityConfig interface

ndg.security.common/ndg/security/common/m2CryptoSSLUtility.py:

  • fix to HostCheck?.call - check for peerCert is None when peer tries http instead of https
Location:
TI12-security/trunk/python
Files:
3 added
27 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/Tests/authtest/authtest/config/environment.py

    r3830 r3892  
    2121    # Initialize config with the basic options 
    2222    config.init_app(global_conf, app_conf, package='authtest', 
    23                     template_engine='mako', paths=paths) 
     23                    #template_engine='mako',  
     24                    template_engine='kid',  
     25                    paths=paths) 
    2426 
    2527    config['routes.map'] = make_map() 
     
    3234    # CONFIGURATION OPTIONS HERE (note: all config options will override 
    3335    # any Pylons config options) 
     36#    kidopts = {'kid.assume_encoding':'utf-8', 'kid.encoding':'utf-8'} 
     37#    config.add_template_engine('kid', 'authtest.templates', kidopts) 
     38 
  • TI12-security/trunk/python/Tests/authtest/authtest/controllers/auth.py

    r3830 r3892  
    3636    def signout(self): 
    3737        return Response("Successfully signed out!") 
     38     
     39    def testkid(self): 
     40        return render('signin') 
  • TI12-security/trunk/python/Tests/authtest/development.ini

    r3830 r3892  
    5656authkit.openid.baseurl = http://localhost:5000 
    5757 
     58# Template for signin 
     59authkit.openid.template.obj = authtest.lib.template:make_template 
     60 
    5861# Logging configuration 
    5962[loggers] 
  • TI12-security/trunk/python/ndg.security.client/ndg/security/client/ssoclient/ssoClient.cfg

    r3755 r3892  
    1616server:                 http://localhost/ssoClient 
    1717wayfURI:                https://localhost/sso/wayf 
    18 # Use Client side logout instead 
    19 #logoutURI:             https://localhost/sso/logout 
     18 
     19# File object to direct SOAP trace to.  Leave blank or set to None for no trace 
     20tracefile:              sys.stderr 
    2021layout:         %(server)s/layout/ 
    2122icondir:        %(server)s/layout/icons/ 
  • TI12-security/trunk/python/ndg.security.client/ndg/security/client/ssoclient/ssoclient/config/ssoClientMiddleware.py

    r3751 r3892  
    1818class SSOMiddleware(object): 
    1919     
    20     def __init__(self, app, cfgFilePath, appGlobals): 
     20    def __init__(self, app, cfg, appGlobals, **kw): 
    2121         
    2222        log.debug("SSOMiddleware.__init__ ...") 
    2323        self.app = app 
    24         ndg.security.client.ssoclient.cfg = SSOClientConfig(cfgFilePath) 
    25         ndg.security.client.ssoclient.cfg.read() 
     24 
     25        ndg.security.client.ssoclient.cfg = SSOClientConfig(cfg, **kw) 
    2626        appGlobals.ndg = ndg 
    2727 
     
    4040    """Get Security related parameters from the Pylons NDG config file""" 
    4141 
    42     def __init__(self, cfgFilePath=None): 
    43         '''Get PKI settings for Attribute Authority and Session Manager from 
    44         the configuration file 
     42    def __init__(self, cfg=None, **parseKw): 
     43        '''Get settings for Single Sign On client''' 
     44         
     45        if isinstance(cfg, basestring): 
     46            # Assume file path to be read 
     47            self.read(cfg) 
     48        else: 
     49            # Assume existing config type object 
     50            self.cfg = cfg 
     51 
     52        if self.cfg: 
     53            self.parse(**parseKw) 
     54             
     55    def read(self, cfgFilePath): 
     56        '''Read config file into SafeConfigParser instance 
    4557         
    4658        @type cfgFilePath: pylons config file object 
    47         @param cfgFilePath: reference to NDG configuration file.  If omitted  
    48         defaults to request.environ['ndgConfig']''' 
    49          
    50         self.cfgFilePath = cfgFilePath 
    51  
    52     def read(self): 
    53         '''Read content of config file into object''' 
    54         cfg = ConfigParser() 
    55         cfg.read(self.cfgFilePath) 
     59        @param cfgFilePath: reference to NDG configuration file.''' 
     60        self.cfg = ConfigParser() 
     61        self.cfg.read(cfgFilePath) 
     62  
     63    def parse(self, defSection='DEFAULT', layoutSection='layout'): 
     64        '''Extract content of config file object into self''' 
     65        
    5666        # Hostname 
    57         self.server=cfg.get('DEFAULT', 'server', '') 
     67        self.server=self.cfg.get(defSection, 'server') 
    5868 
    5969        # For secure connections 
    60         self.sslServer = cfg.get('DEFAULT', 'sslServer', '') 
     70        self.sslServer = self.cfg.get(defSection, 'sslServer') 
    6171                       
    6272        # Where Are You From URI - defaults to server root if not set in 
    6373        # config - i.e. assumes same host as client  
    64         if cfg.has_option('DEFAULT', 'wayfURI'):         
    65             self.wayfuri = cfg.get('DEFAULT','wayfURI','') 
     74        if self.cfg.has_option(defSection, 'wayfURI'):         
     75            self.wayfuri = self.cfg.get(defSection, 'wayfURI') 
    6676        else: 
    6777            self.wayfuri = '%s/wayf' % self.server 
     
    6979        # Logout URI can reside on this server or somewhere else determined by 
    7080        # the logout config file setting 
    71         if cfg.has_option('DEFAULT', 'logoutURI'):         
    72             self.logoutURI = cfg.get('DEFAULT','logoutURI','') 
     81        if self.cfg.has_option(defSection, 'logoutURI'):         
     82            self.logoutURI = self.cfg.get(defSection, 'logoutURI') 
    7383        else: 
    7484            self.logoutURI = '%s/logout' % self.server 
    75  
    76         self.localLink=cfg.get('layout', 'localLink', None) 
    77         self.localImage=cfg.get('layout', 'localImage', None) 
    78         self.localAlt=cfg.get('layout', 'localAlt', 'Visit Local Site') 
    79         self.ndgLink=cfg.get('layout', 'ndgLink', 'http://ndg.nerc.ac.uk') 
    80         self.ndgImage=cfg.get('layout', 'ndgImage', None) 
    81         self.ndgAlt=cfg.get('layout', 'ndgAlt','Visit NDG') 
    82         self.stfcLink=cfg.get('layout', 'stfcLink') 
    83         self.stfcImage=cfg.get('layout', 'stfcImage') 
    84         self.helpIcon=cfg.get('layout', 'helpIcon') 
    85         self.LeftAlt=cfg.get('layout', 'HdrLeftAlt') 
    86         self.LeftLogo=cfg.get('layout', 'HdrLeftLogo') 
     85             
     86        self.localLink=self.cfg.get(layoutSection, 'localLink', None) 
     87        self.localImage=self.cfg.get(layoutSection, 'localImage', None) 
     88        self.localAlt=self.cfg.get(layoutSection, 'localAlt', 'Visit Local Site') 
     89        self.ndgLink=self.cfg.get(layoutSection, 'ndgLink', 'http://ndg.nerc.ac.uk') 
     90        self.ndgImage=self.cfg.get(layoutSection, 'ndgImage', None) 
     91        self.ndgAlt=self.cfg.get(layoutSection, 'ndgAlt','Visit NDG') 
     92        self.stfcLink=self.cfg.get(layoutSection, 'stfcLink') 
     93        self.stfcImage=self.cfg.get(layoutSection, 'stfcImage') 
     94        self.helpIcon=self.cfg.get(layoutSection, 'helpIcon') 
     95        self.LeftAlt=self.cfg.get(layoutSection, 'HdrLeftAlt') 
     96        self.LeftLogo=self.cfg.get(layoutSection, 'HdrLeftLogo') 
    8797        self.pageLogo="bodcHdr" 
    88         self.icons_xml=cfg.get('layout','Xicon') 
    89         self.icons_plot=cfg.get('layout','plot') 
    90         self.icons_prn=cfg.get('layout', 'printer') 
     98        self.icons_xml=self.cfg.get(layoutSection,'Xicon') 
     99        self.icons_plot=self.cfg.get(layoutSection,'plot') 
     100        self.icons_prn=self.cfg.get(layoutSection, 'printer') 
    91101         
    92         self.disclaimer = cfg.get('DEFAULT', 'disclaimer') 
     102        self.disclaimer = self.cfg.get(defSection, 'disclaimer') 
    93103    
    94104        # TODO: re-include security settings to enable logout via Session 
  • TI12-security/trunk/python/ndg.security.client/ndg/security/client/ssoclient/ssoclient/controllers/logout.py

    r3751 r3892  
    1 from ssoclient.lib.base import * 
     1from ndg.security.client.ssoclient.ssoclient.lib.base import * 
    22 
    33log = logging.getLogger(__name__) 
     
    2222        '''Logout - remove session from Session Manager tidy up cookie''' 
    2323 
    24         log.info("LogoutController.index ...") 
     24        log.debug("LogoutController.index ...") 
    2525         
    2626 
     
    3333            smClnt = SessionMgrClient(uri=session['ndgSec']['h'], 
    3434                    tracefile=g.ndg.security.client.ssoclient.cfg.tracefile, 
    35                     **g.ndg.security.server.ssoservice.cfg.wss)        
     35                    **g.ndg.security.client.ssoclient.cfg.wss)        
    3636        except Exception, e: 
    3737            log.error("logout - creating Session Manager client: %s" % e) 
     
    5353    def _cleanupAndRedirect(self): 
    5454        """Remove security session and call _redirect""" 
     55        log.debug("LogoutController._cleanupAndRedirect...") 
     56         
    5557        try: 
    5658            # easy to kill our cookie 
  • TI12-security/trunk/python/ndg.security.client/ndg/security/client/ssoclient/ssoclient/lib/base.py

    r3751 r3892  
    1111from pylons.templating import render 
    1212 
    13 import ssoclient.lib.helpers as h 
    14 import ssoclient.model as model 
     13import ndg.security.client.ssoclient.ssoclient.lib.helpers as h 
     14import ndg.security.client.ssoclient.ssoclient.model as model 
    1515 
    1616import urllib 
     
    1919 
    2020from ndg.security.common.pylons.security_util import setSecuritySession, \ 
    21     LoginServiceQuery 
     21    SSOServiceQuery, SecuritySession 
    2222 
    2323import logging 
     
    5151             
    5252            log.debug('Switching from https to http...') 
    53             returnToURL = g.ndg.security.client.ssoclient.cfg.server + self.pathInfo 
     53            returnToURL = g.ndg.security.client.ssoclient.cfg.server + \ 
     54                self.pathInfo 
    5455 
    55             # Re-construct the URL removing the security related arguments 
    56             qs = LoginServiceQuery.stripFromURI() 
     56            # Reconstruct the URL removing the security related arguments 
     57            qs = SSOServiceQuery.stripFromURI() 
    5758            if qs: 
    5859                returnToURL += "?" + qs 
    59                  
     60                
    6061            log.debug('URL transport switched to http: "%s"' % returnToURL) 
    6162            h.redirect_to(returnToURL) 
    62                          
     63             
     64        elif 'logout' in request.params: 
     65            # Request comes from a successful logout call.  Clean up any 
     66            # security cookies in this domain 
     67            log.debug("Removing security details following logout ...") 
     68 
     69            returnToURL = g.ndg.security.client.ssoclient.cfg.server + \ 
     70                self.pathInfo 
     71                 
     72            # Reconstruct the URL removing the logout flag argument 
     73            qs = SSOServiceQuery.stripFromURI('logout') 
     74            if qs: 
     75                returnToURL += "?" + qs 
     76             
     77            # Delete security session cookie details 
     78            SecuritySession.delete() 
     79             
     80            # Redirect to cleaned up URL 
     81            h.redirect_to(returnToURL) 
     82                          
     83                          
    6384    def __call__(self, environ, start_response):         
    6485        # Insert any code to be run per request here. The Routes match 
     
    7192        log.debug("environ = %s" % environ) 
    7293        log.debug("_"*80) 
    73         log.debug("start_response = %s" % start_response) 
    74         log.debug("_"*80) 
    7594         
    7695        self.pathInfo = urllib.quote(environ.get('PATH_INFO', ''))  
     
    7897        # construct URL picking up setting of server name from config to  
    7998        # avoid exposing absolute URL hidden behind mod_proxy see #857  
    80         c.requestURL = g.ndg.security.client.ssoclient.cfg.server + self.pathInfo 
     99        c.requestURL = g.ndg.security.client.ssoclient.cfg.server + \ 
     100            self.pathInfo 
    81101        qs = '&'.join(["%s=%s" % item for item in request.params.items()]) 
    82102        if qs: 
    83103            c.requestURL += '?' + qs 
    84104 
     105        self._environ = environ 
     106         
    85107        return WSGIController.__call__(self, environ, start_response) 
    86108     
  • TI12-security/trunk/python/ndg.security.client/ndg/security/client/ssoclient/ssoclient/templates/ndg/security/ndgPage.kid

    r3751 r3892  
    9797            c.b64encReturnTo = urlsafe_b64encode(c.requestURL) 
    9898            ?> 
    99         <form action="$g.ndg.security.client.ssoclie6nt.cfg.logoutURI"> 
     99        <form action="$g.ndg.security.client.ssoclient.cfg.logoutURI"> 
    100100            <input type="hidden" name="r" value="${c.b64encReturnTo}"/> 
    101101            <input type="submit" value="Logout"/> 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/__init__.py

    r2954 r3892  
    1818# installation of SQLObject 
    1919__all__ = [ 
     20    'authz', 
    2021    'AttAuthority', 
    2122    'AttCert', 
     
    2324    'm2CryptoSSLUtility', 
    2425    'openssl', 
    25     'SessionCookie', 
     26    'sessionCookie', 
    2627    'SessionMgr', 
    2728    'wsSecurity', 
    2829    'X509', 
    29     'XMLSec' 
     30    'XMLSec', 
     31    'zsi_utils' 
    3032    ] 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/m2CryptoSSLUtility.py

    r2954 r3892  
    8080        @param host: name of host to check 
    8181        """ 
     82        if peerCert is None: 
     83            raise SSL.Checker.NoCertificate(\ 
     84                                        'SSL Peer did not return certificate') 
     85 
    8286        peerCertDN = '/'+peerCert.get_subject().as_text().replace(', ', '/') 
    8387        try: 
     
    100104                           x509Cert2Verify=X509Cert(m2CryptoX509=peerCert)) 
    101105            except Exception, e: 
    102                 raise InvalidCertSignature, \ 
    103                 "Peer certificate verification against CA cert failed: %s" % e 
     106                raise InvalidCertSignature( 
     107                "Peer certificate verification against CA cert failed: %s" % e) 
    104108               
    105109        # They match - drop the exception and return all OK instead           
     
    129133        if not isinstance(caCertFilePathList, list) and \ 
    130134           not isinstance(caCertFilePathList, tuple): 
    131             raise AttributeError, \ 
    132                         'Expecting a list or tuple for "caCertFilePathList"' 
     135            raise AttributeError( 
     136                        'Expecting a list or tuple for "caCertFilePathList"') 
    133137 
    134138        self.__caCertStack = X509Stack() 
     
    175179        if 'readTimeout' in kw: 
    176180            if not isinstance(readTimeout, SSL.timeout): 
    177                 raise AttributeError, "readTimeout must be of type " + \ 
    178                                       "M2Crypto.SSL.timeout"  
     181                raise AttributeError("readTimeout must be of type " + \ 
     182                                     "M2Crypto.SSL.timeout") 
    179183            self.readTimeout = readTimeout 
    180184            del kw['readTimeout'] 
     
    184188        if 'writeTimeout' in kw: 
    185189            if not isinstance(writeTimeout, SSL.timeout): 
    186                 raise AttributeError, "writeTimeout must be of type " + \ 
    187                                       "M2Crypto.SSL.timeout"  
     190                raise AttributeError("writeTimeout must be of type " + \ 
     191                                     "M2Crypto.SSL.timeout")  
    188192            self.writeTimeout = writeTimeout 
    189193            del kw['writeTimeout'] 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/pylons/security_util.py

    r3755 r3892  
    7171            
    7272class LoginServiceQueryError(Exception): 
    73     """Error handling for LoginServiceQuery - a class which handles the  
     73    """Error handling for SSOServiceQuery - a class which handles the  
    7474    parsing of security args in a HTTP GET request for the LoginService""" 
    7575     
    76 class LoginServiceQuery(object): 
     76class SSOServiceQuery(object): 
    7777    """Create query string containing security credentials.  This is used by 
    7878    the Identity Provider pass the credentials over a HTTP GET back to the  
     
    124124        @return: URL query string with security args removed""" 
    125125        keys = params or cls.keys 
    126         return cls.argSep.join(['%s=%s' % (i, request.params[i]) \ 
    127                                 for i in request.params if i not in keys]) 
     126        return str(cls.argSep.join(['%s=%s' % (i, request.params[i]) \ 
     127                                for i in request.params if i not in keys])) 
    128128 
    129129    @classmethod 
     
    151151 
    152152        return keys 
     153 
     154# Backwards compatibility 
     155LoginServiceQuery = SSOServiceQuery 
    153156 
    154157# TODO: this could be used in the future to replace parts of BaseController. 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wsSecurity.py

    r3790 r3892  
    254254        if cfgFilePath: 
    255255            log.debug("SignatureHandler.__init__: Processing config file...") 
    256             self.cfg.read(cfgFilePath, section=cfgFileSection) 
     256            self.cfg.read(cfgFilePath) 
     257            self.cfg.parse(section=cfgFileSection) 
    257258         
    258259        # Also update config from keywords set  
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wssecurity/__init__.py

    r3790 r3892  
    4545     
    4646    def __init__(self, cfg=SafeConfigParser()): 
     47        '''Initialise settings from an existing config file object or the 
     48        given path to config file 
     49         
     50        @type cfg: SafeConfigParser or string 
     51        @param cfg: config object instance or file path to config file to be 
     52        parsed''' 
     53         
    4754        dict.__init__(self) 
    48         self._cfg = cfg 
    4955         
    5056        # Initialise parameters from ref in class var 
    5157        self._param = WSSecurityConfig.defParam.copy() 
    5258         
    53  
    54     def read(self, *arg, **kw): 
    55         '''Read ConfigParser object but also set _param dict''' 
     59        if isinstance(cfg, basestring): 
     60            # Assume file path to be read 
     61            self.read(cfg) 
     62        else: 
     63            # Assume existing config type object 
     64            self._cfg = cfg 
     65         
     66 
     67    def read(self, *arg): 
     68        '''Read ConfigParser object''' 
     69        self._cfg = SafeConfigParser() 
    5670        self._cfg.read(*arg) 
    57          
    58         # This enables WS-Security params to be set in a config file with 
    59         # other sections e.g. params could be under the section 'wssecurity' 
     71 
     72 
     73    def parse(self, **kw): 
     74        '''Extract items from config file and place in dict 
     75        @type **kw: dict 
     76        @param **kw: this enables WS-Security params to be set in a config file 
     77        with other sections e.g. params could be under the section 'wssecurity' 
     78        ''' 
    6079        if 'section' in kw: 
    6180            section = kw['section'] 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/config/ssoServiceMiddleware.py

    r3754 r3892  
    44P J Kershaw 18/03/08 
    55''' 
     6from os.path import expandvars as xpdvars 
     7import logging 
     8log = logging.getLogger(__name__) 
    69 
    710class ndg: 
     
    1316            class ssoservice: 
    1417                cfg = None 
     18        class client: 
     19            '''Client class is also needed for BaseController handler to handle 
     20            responses from Single Sign On IdP''' 
     21            class ssoclient: 
     22                class cfg: 
     23                    '''Placeholder for server and sslServer attributes''' 
    1524 
    1625class SSOMiddleware: 
    17      
    18     def __init__(self, app, cfgFilePath, appGlobals): 
     26             
     27    def __init__(self, app, cfg, appGlobals, **kw): 
     28        log.debug("SSOMiddleware.__init__ ...") 
    1929        self.app = app 
    20         ndg.security.server.ssoservice.cfg = SecurityConfig(cfgFilePath) 
    21         ndg.security.server.ssoservice.cfg.read() 
     30        ndg.security.server.ssoservice.cfg = SSOServiceConfig(cfg, **kw) 
     31         
     32        # Copy into client for the benefit of 
     33        # ndg.security.client.ssoclient.ssoclient.lib.base.BaseController 
     34        # used to process responses back from SSO IdP 
     35        ndg.security.client.ssoclient.cfg.server = \ 
     36            ndg.security.server.ssoservice.cfg.server 
     37        ndg.security.client.ssoclient.cfg.sslServer = \ 
     38            ndg.security.server.ssoservice.cfg.sslServer 
     39             
    2240        appGlobals.ndg = ndg 
    2341           
    2442    def __call__(self, environ, start_response): 
    2543         
    26 #        environ['securityConfig'] = self.config 
    2744        return self.app(environ, start_response) 
    2845 
     
    3249from ndg.security.common.wssecurity import WSSecurityConfig 
    3350 
    34 class SecurityConfigError(Exception): 
     51class SSOServiceConfigError(Exception): 
    3552    """Handle errors from parsing security config items""" 
    3653        
    37 class SecurityConfig(object): 
     54class SSOServiceConfig(object): 
    3855    """Get Security related parameters from the Pylons NDG config file""" 
    3956 
    40     def __init__(self, cfgFilePath=None): 
     57    def __init__(self, cfg=None, **parseKw): 
    4158        '''Get PKI settings for Attribute Authority and Session Manager from 
    4259        the configuration file 
    4360         
    44         @type cfgFilePath: pylons config file object 
    45         @param cfgFilePath: reference to NDG configuration file.  If omitted  
    46         defaults to request.environ['ndgConfig']''' 
     61        @type cfg: config file object or string 
     62        @param cfg: reference to NDG configuration file or config file object 
     63        ''' 
    4764         
    48         self.cfgFilePath = cfgFilePath 
    49         self.gk = None 
    5065        self.wss = {} 
    5166         
    52     def read(self): 
     67        if isinstance(cfg, basestring): 
     68            # Assume file path to be read 
     69            self.read(cfg) 
     70        else: 
     71            # Assume existing config type object 
     72            self.cfg = cfg 
     73 
     74        if self.cfg: 
     75            self.parse(**parseKw) 
     76 
     77         
     78    def read(self, cfgFilePath): 
    5379        '''Read content of config file into object''' 
    54         cfg = ConfigParser() 
    55         cfg.read(self.cfgFilePath) 
    56         
    57         tracefileExpr = cfg.get('NDG_SECURITY', 'tracefile') 
    58         if tracefileExpr: 
    59             self.tracefile = eval(tracefileExpr) 
     80        self.cfg = ConfigParser() 
     81        self.cfg.read(cfgFilePath) 
     82  
    6083 
    61         self.smURI = cfg.get('NDG_SECURITY', 'sessionMgrURI')         
    62         self.aaURI = cfg.get('NDG_SECURITY', 'attAuthorityURI') 
     84    def parse(self,  
     85              defSection='DEFAULT',  
     86              layoutSection='layout', 
     87              wssSection='NDG_SECURITY.wssecurity'): 
     88        '''Extract content of config file object into self''' 
     89               
     90        if self.cfg.has_option(defSection, 'tracefile'):         
     91            self.tracefile = eval(self.cfg.get(defSection,'tracefile'))     
     92        else: 
     93            self.tracefile = None 
     94             
     95        self.smURI = self.cfg.get(defSection, 'sessionMgrURI')         
     96        self.aaURI = self.cfg.get(defSection, 'attAuthorityURI') 
    6397         
    6498        # ... for SSL connections to security web services 
    6599        try: 
    66100            self.sslCACertFilePathList = \ 
    67             cfg.get('NDG_SECURITY', 'sslCACertFilePathList').split() 
     101            xpdvars(self.cfg.get(defSection, 'sslCACertFilePathList')).split() 
    68102                 
    69103        except AttributeError: 
    70             raise SecurityConfigError, \ 
     104            raise SSOServiceConfigError, \ 
    71105                        'No "sslCACertFilePathList" security setting' 
    72106 
    73         self.sslPeerCertCN = cfg.get('NDG_SECURITY', 'sslPeerCertCN', None) 
     107        # If no separate WS-Security config file is set then read these params 
     108        # from the current config file 
     109        if self.cfg.has_option(defSection, 'wssCfgFilePath'): 
     110            path = self.cfg.get(defSection,'wssCfgFilePath', None)  
     111            wssCfgFilePath = xpdvars(path) 
     112        else: 
     113            wssCfgFilePath = None 
     114             
     115        wss = WSSecurityConfig(cfg=wssCfgFilePath or self.cfg) 
     116        wss.parse(section=wssSection) 
    74117 
    75         wssCfgFilePath = cfg.get('NDG_SECURITY', 'wssCfgFilePath', None) 
    76         wss = WSSecurityConfig() 
    77         wss.read(wssCfgFilePath) 
    78118         
    79119        # Cast to standard dict because WSSecurityConfig object can't be 
     
    81121        # TODO: check for cleaner solution - dict(wss) 
    82122        self.wss = dict(wss.items()) 
    83          
    84 #        # ...and for WS-Security digital signature 
    85 #        self.wssCertFilePath = cfg.get('NDG_SECURITY', 'wssCertFilePath') 
    86 #        self.wssPriKeyFilePath = cfg.get('NDG_SECURITY', 'wssKeyFilePath') 
    87 #        self.wssPriKeyPwd = cfg.get('NDG_SECURITY', 'wssKeyPwd') 
    88 # 
    89 #        try: 
    90 #            self.wssCACertFilePathList = \ 
    91 #                cfg.get('NDG_SECURITY', 'wssCACertFilePathList').split() 
    92 #                 
    93 #        except AttributeError: 
    94 #            raise SecurityConfigError, \ 
    95 #                                'No "wssCACertFilePathList" security setting' 
    96 # 
    97 #        # Inclusive namespace prefixes for Exclusive C14N 
    98 #        try: 
    99 #            self.wssRefInclNS = cfg.get('NDG_SECURITY', 'wssRefInclNS').split() 
    100 #                 
    101 #        except AttributeError: 
    102 #            raise SecurityConfigError, 'No "wssRefInclNS" security setting' 
    103 # 
    104 #        try: 
    105 #            self.wssSignedInfoInclNS = cfg.get('NDG_SECURITY',  
    106 #                                               'wssSignedInfoInclNS').split()            
    107 #        except AttributeError: 
    108 #            raise SecurityConfigError, \ 
    109 #                                    'No "wssSignedInfoInclNS" security setting' 
    110123 
    111124         
     
    113126         
    114127        # Attribute Certificate Issuer 
    115         self.acIssuer = cfg.get('NDG_SECURITY', 'acIssuer') 
     128        self.acIssuer = self.cfg.get(defSection, 'acIssuer') 
    116129         
    117130        # verification of X.509 cert back to CA 
    118131        try: 
    119             self.acCACertFilePathList = cfg.get('NDG_SECURITY',  
    120                                             'acCACertFilePathList').split()           
     132            self.acCACertFilePathList = xpdvars(self.cfg.get(defSection,  
     133                                            'acCACertFilePathList')).split()           
    121134        except AttributeError: 
    122             raise SecurityConfigError, \ 
    123                                 'No "acCACertFilePathList" security setting' 
     135            raise SSOServiceConfigError( 
     136                                'No "acCACertFilePathList" security setting') 
    124137 
    125138        # Hostname 
    126         self.server=cfg.get('NDG_SECURITY', 'server', '') 
     139        self.server=self.cfg.get(defSection, 'server', '') 
    127140 
    128141        # For secure connections 
    129         self.sslServer = cfg.get('NDG_SECURITY', 'sslServer', '') 
     142        self.sslServer = self.cfg.get(defSection, 'sslServer', '') 
    130143         
    131144        # These URLs are referred from template files 
    132145        self.getCredentials = '%s/getCredentials' % self.sslServer        
    133         self.logout = '%s/logout' % self.server 
     146        self.logoutURI = '%s/logout' % self.server 
    134147                       
    135148        # Where Are You From URI           
    136149        self.wayfuri='%s/wayf' % self.server 
    137150 
    138         self.localLink=cfg.get('layout', 'localLink', None) 
    139         self.localImage=cfg.get('layout', 'localImage', None) 
    140         self.localAlt=cfg.get('layout', 'localAlt', 'Visit Local Site') 
    141         self.ndgLink=cfg.get('layout', 'ndgLink', 'http://ndg.nerc.ac.uk') 
    142         self.ndgImage=cfg.get('layout', 'ndgImage', None) 
    143         self.ndgAlt=cfg.get('layout', 'ndgAlt','Visit NDG') 
    144         self.stfcLink=cfg.get('layout', 'stfcLink') 
    145         self.stfcImage=cfg.get('layout', 'stfcImage') 
    146         self.helpIcon=cfg.get('layout', 'helpIcon') 
    147         self.LeftAlt=cfg.get('layout', 'HdrLeftAlt') 
    148         self.LeftLogo=cfg.get('layout', 'HdrLeftLogo') 
     151        self.localLink=self.cfg.get(layoutSection, 'localLink', None) 
     152        self.localImage=self.cfg.get(layoutSection, 'localImage', None) 
     153        self.localAlt=self.cfg.get(layoutSection, 'localAlt', 'Visit Local Site') 
     154        self.ndgLink=self.cfg.get(layoutSection, 'ndgLink', 'http://ndg.nerc.ac.uk') 
     155        self.ndgImage=self.cfg.get(layoutSection, 'ndgImage', None) 
     156        self.ndgAlt=self.cfg.get(layoutSection, 'ndgAlt','Visit NDG') 
     157        self.stfcLink=self.cfg.get(layoutSection, 'stfcLink') 
     158        self.stfcImage=self.cfg.get(layoutSection, 'stfcImage') 
     159        self.helpIcon=self.cfg.get(layoutSection, 'helpIcon') 
     160        self.LeftAlt=self.cfg.get(layoutSection, 'HdrLeftAlt') 
     161        self.LeftLogo=self.cfg.get(layoutSection, 'HdrLeftLogo') 
    149162        self.pageLogo="bodcHdr" 
    150         self.icons_xml=cfg.get('layout','Xicon') 
    151         self.icons_plot=cfg.get('layout','plot') 
    152         self.icons_prn=cfg.get('layout', 'printer') 
     163        self.icons_xml=self.cfg.get(layoutSection,'Xicon') 
     164        self.icons_plot=self.cfg.get(layoutSection,'plot') 
     165        self.icons_prn=self.cfg.get(layoutSection, 'printer') 
    153166         
    154         self.disclaimer = cfg.get('DEFAULT', 'disclaimer') 
     167        self.disclaimer = self.cfg.get('DEFAULT', 'disclaimer') 
    155168             
    156169             
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/controllers/login.py

    r3754 r3892  
    11import logging 
    22 
    3 from sso.lib.base import * 
    4 from ndg.security.common.pylons.security_util import setSecuritySession, SecuritySession, \ 
    5     LoginServiceQuery 
     3from ndg.security.server.sso.sso.lib.base import * 
     4from ndg.security.common.pylons.security_util import setSecuritySession, \ 
     5    SecuritySession, SSOServiceQuery 
    66from ndg.security.common.AttAuthority import AttAuthorityClient 
    77from ndg.security.common.SessionMgr import SessionMgrClient, SessionExpired, \ 
     
    2727        if 'ndgSec' not in session:  
    2828            log.debug('No security session details found - offering login...') 
    29             return render('ndg.security.login') 
     29            return render('ndg.security.kid', 'ndg.security.login') 
    3030         
    3131        # Session is set in this domain - check it  
     
    4242            SecuritySession.delete() 
    4343            response.status_code = 400 
    44             return render('ndg.security.login') 
     44            return render('ndg.security.kid', 'ndg.security.login') 
    4545         
    4646        # Check session status 
     
    5555            SecuritySession.delete() 
    5656            response.status_code = 400 
    57             return render('ndg.security.login') 
     57            return render('ndg.security.kid', 'ndg.security.login') 
    5858    
    5959        if bSessOK: 
     
    6666                      "from cookie and re-displaying login...") 
    6767            SecuritySession.delete() 
    68             return render('ndg.security.login') 
     68            return render('ndg.security.kid', 'ndg.security.login') 
    6969 
    7070 
     
    7979        if 'username' not in request.params: 
    8080            log.debug("No username set - rendering login...") 
    81             return render('ndg.security.login') 
     81            return render('ndg.security.kid', 'ndg.security.login') 
    8282         
    8383        try:     
     
    9595            log.error("Login: initialising SessionMgrClient: %s" % e) 
    9696            response.status_code = 400 
    97             return render('ndg.security.login') 
     97            return render('ndg.security.kid', 'ndg.security.login') 
    9898         
    9999        # Connect to Session Manager 
     
    107107            log.error("Session Manager connect returned: %s" % e) 
    108108            response.status_code = 401 
    109             return render('ndg.security.login') 
     109            return render('ndg.security.kid', 'ndg.security.login') 
    110110         
    111111        # Cache user attributes in Session Manager 
     
    119119            c.xml = "Session has expired, please re-login" 
    120120            response.status_code = 401 
    121             return render('ndg.security.login') 
     121            return render('ndg.security.kid', 'ndg.security.login') 
    122122             
    123123        except AttributeRequestDenied, e: 
     
    126126                    "account.  Please check with your site administrator." 
    127127            response.status_code = 401 
    128             return render('ndg.security.login') 
     128            return render('ndg.security.kid', 'ndg.security.login') 
    129129             
    130130        except Exception, e: 
     
    133133                    "your site administrator." 
    134134            response.status_code = 400 
    135             return render('ndg.security.login') 
     135            return render('ndg.security.kid', 'ndg.security.login') 
    136136 
    137137        log.debug('Completing login...') 
     
    145145        session.save() 
    146146 
     147        log.debug("session = %s" % session) 
    147148        log.info("user %s logged in with roles %s" % (session['ndgSec']['u'], 
    148149                                                  session['ndgSec']['roles'])) 
     
    177178                # details into the URL query string 
    178179                if '?' in returnToURL: 
    179                     returnToURL += '&%s' % LoginServiceQuery() 
     180                    returnToURL += '&%s' % SSOServiceQuery() 
    180181                else: 
    181                     returnToURL += '?%s' % LoginServiceQuery() 
     182                    returnToURL += '?%s' % SSOServiceQuery() 
    182183             
    183184            # Check return-to address by examining peer cert 
     
    197198            "Attribute Authority [%s] expecting DN for SSL peer one of: %s" % \ 
    198199                (g.ndg.security.server.ssoservice.cfg.aaURI, requestServerDN)) 
    199             hostCheck=HostCheck(acceptedDNs=requestServerDN, 
    200                     caCertFilePathList=g.ndg.security.server.ssoservice.cfg.sslCACertFilePathList)             
     200             
     201            hostCheck = HostCheck(acceptedDNs=requestServerDN, 
     202                                  caCertFilePathList=\ 
     203                    g.ndg.security.server.ssoservice.cfg.sslCACertFilePathList) 
     204             
    201205            testConnection = HTTPSConnection(returnToURLHostname,  
    202206                                             None,  
     
    213217  Please report this to your site administrator.""" % returnToURLHostname 
    214218                    response.status_code = 400 
    215                     return render('ndg.security.login') 
     219                    return render('ndg.security.kid', 'ndg.security.login') 
    216220            finally:     
    217221                testConnection.close() 
     
    225229        "LoginController._redirect: no redirect URL set - render login page") 
    226230            c.xml='Logged in' 
    227             return render('ndg.security.login') 
     231            return render('ndg.security.kid', 'ndg.security.login') 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/controllers/logout.py

    r3754 r3892  
    1 from sso.lib.base import * 
     1from ndg.security.server.sso.sso.lib.base import * 
    22from ndg.security.common.pylons.security_util import SecuritySession 
    33import logging 
     
    1616    ''' 
    1717 
    18      
    1918    def index(self): 
    2019        '''Logout - remove session from Session Manager tidy up cookie''' 
     
    7675                log.error("logout - decoding return URL: %s" % e)  
    7776                c.xml = "Error carrying out browser redirect following logout" 
    78                 return render('ndg.security.error') 
     77                return render('ndg.security.kid', 'ndg.security.error') 
    7978             
    8079            # Check for 'getCredentials' - avoid in case username/password 
     
    8685                b64decReturnTo = b64decReturnTo[:getCredentialsIdx] + '/login' 
    8786             
     87            # Add flag indicating to caller that logout succeeded.  The caller 
     88            # can use this to remove any security cookie present in their 
     89            # domain - See: 
     90            # ndg.security.client.ssoclient.ssoclient.lib.base.BaseController 
     91            if '?' in b64decReturnTo: 
     92                b64decReturnTo += '&logout=1' 
     93            else: 
     94                b64decReturnTo += '?logout=1' 
     95 
    8896            # and now go back to whence we had come 
    8997            log.debug("LogoutController._redirect: redirect to %s" % \ 
     
    92100        else: 
    93101            log.debug("LogoutController._redirect: no redirect URL set.") 
    94             return render('ndg.security.error') 
     102            return render('ndg.security.kid', 'ndg.security.error') 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/controllers/wayf.py

    r3754 r3892  
    11import logging 
    22 
    3 from sso.lib.base import * 
     3from ndg.security.server.sso.sso.lib.base import * 
    44from ndg.security.common.AttAuthority import AttAuthorityClient 
    55import base64 
     
    1515        """For each action, get 'r' return to URL argument from current URL  
    1616        query string.  c.b64encReturnTo is used in some of the .kid files""" 
    17         c.b64encReturnTo = request.params.get('r', '')  
     17        c.b64encReturnTo = str(request.params.get('r', '')) 
    1818        log.debug("WayfController.__before__: c.b64encReturnTo = %s" % \ 
    1919                                                              c.b64encReturnTo) 
     
    5555        session.save() 
    5656         
    57         return render('ndg.security.wayf') 
     57        # Use an alias 'ndg.security.kid' to integration with another pylons 
     58        # code stack.  The alias tells render to pick up the template from a 
     59        # separate SSO templates directory to whatever is the default 
     60        return render('ndg.security.kid', 'ndg.security.wayf') 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/lib/base.py

    r3754 r3892  
    1111from pylons.templating import render 
    1212 
    13 import sso.lib.helpers as h 
    14 import sso.model as model 
     13import ndg.security.server.sso.sso.lib.helpers as h 
     14import ndg.security.server.sso.sso.model as model 
    1515 
    1616import urllib 
     
    1919 
    2020from ndg.security.common.pylons.security_util import setSecuritySession, \ 
    21     LoginServiceQuery 
     21    SSOServiceQuery 
    2222 
    2323import logging 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/templates/ndg/security/wayf.kid

    r3754 r3892  
    2121        redirected back to the URL: <a href="${c.returnTo}">${c.returnTo}</a></p> 
    2222                </div> 
    23         <div py:replace="footer()"/> 
     23        <div py:replace="footer(showLoginStatus=False)"/> 
    2424    </body> 
    25      
    26         <div py:def="footer(showLoginStatus=False)" id="Footer"> 
    27         <center><table><tbody> 
    28             <tr> 
    29                 <td align="center" width="60%"> 
    30                     <table><tbody> 
    31                     <tr><td><span py:replace="linkimage(g.ndg.security.server.ssoservice.cfg.ndgLink,g.ndg.security.server.ssoservice.cfg.ndgImage,'NDG')"/></td> 
    32                     <td> This portal is a product of the <a href="http://ndg.nerc.ac.uk"> NERC DataGrid</a> 
    33                     Not all functionality is completely implemented, bugs and problems are expected </td> 
    34                     </tr> 
    35                     </tbody></table> 
    36                 </td> 
    37                 <td width="40%" align="center"> 
    38                     <div id="loginStatus"> 
    39                         <!--! now we choose one of the next two (logged in or not) --> 
    40                         <div py:if="'ndgSec' in session"><table><tbody><tr><td> User [${session['ndgSec']['u']}] logged in 
    41                         at [${session['ndgSec']['h']}] with roles [${session['ndgSec']['roles']}]</td><td> 
    42                         &nbsp;<span py:replace="logOut()"/></td></tr></tbody></table></div> 
    43                         <div py:if="'ndgSec' not in session"></div> 
    44                     </div> 
    45                 </td> 
    46                 <td><span py:replace="linkimage(g.ndg.security.server.ssoservice.cfg.stfcLink,g.ndg.security.server.ssoservice.cfg.stfcImage,'Hosted by the STFC CEDA')"/></td> 
    47             </tr> 
    48         </tbody></table></center> 
    49     </div> 
    5025</html> 
Note: See TracChangeset for help on using the changeset viewer.