Changeset 964 for TI12-security


Ignore:
Timestamp:
19/05/06 14:33:28 (14 years ago)
Author:
pjkersha
Message:

Tests/SecurityClientTest?.py: get proxy cert from call to Session Manager WS connect call rather
than from a local file.

conf/myProxyProperties.xml: config file just for MyProxy? - contains settings copied from
sessionMgrProperties.xml. Isolate for use by new MyProxyAdmin?.py tool. Eventually MyProxy?
config settings may be removed and kept spearate from sessionMgrProperties.xml.

conf/gatekeeperProperties.xml: properties file for NDG Gatekeeper

bin/MyProxyAdmin.py: new command line tool for MyProxy? administration. It enables new users
to be added from the command line of the host running MyProxy?. This may replace the current
Session Manager WS addUser method.

NDG/AttAuthority.py: Make sure sys.path is copied by content rather than reference in init

NDG/log_services_server.py: added reposID var for recording of version from SVN.

NDG/Gatekeeper.py: added readAccess, writeAccess and executeAccess methods.

Location:
TI12-security/trunk/python
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/NDG/AttAuthority.py

    r930 r964  
    157157            try: 
    158158                # Temporarily extend system path ready for import 
    159                 sysPathBak = sys.path 
     159                sysPathBak = sys.path[:] 
    160160                sys.path.append(self.__prop['usrRolesModFilePath']) 
    161161                 
     
    169169                                     self.__prop['usrRolesClassName']) 
    170170            finally: 
    171                 sys.path = sysPathBak 
     171                sys.path[:] = sysPathBak 
    172172                                 
    173173        except Exception, e: 
  • TI12-security/trunk/python/NDG/Gatekeeper.py

    r930 r964  
    1616import cElementTree as ElementTree 
    1717 
    18 # Alter system path for dynamic import of user roles class 
     18# Alter system path for dynamic import of resource interface class 
    1919import sys 
    2020 
     
    3939     
    4040    __validKeys = ( 'resrcURI', 
    41                     'resrcURImodFilePath', 
    42                     'resrcURImodName', 
    43                     'resrcURIclassName', 
    44                     'resrcURIpropFile') 
     41                    'resrcModFilePath', 
     42                    'resrcModName', 
     43                    'resrcClassName', 
     44                    'resrcPropFile', 
     45                    'caCertFilePath') 
    4546     
    4647    #_________________________________________________________________________ 
     
    4849          
    4950        self.__propFilePath = propFilePath                
    50         self.__resrcURIobj = None 
     51        self.__resrcObj = None 
    5152        self.__prop = {}.fromkeys(self.__validKeys) 
    5253         
     
    6566        if max(self.__prop.values()) is not None: 
    6667            # Initialize if all required resource URI class properties are set 
    67             self.initResrcURIinterface() 
     68            self.initResrcinterface() 
    6869        
    6970         
    7071    #_________________________________________________________________________ 
    71     def initResrcURIinterface(self): 
     72    def initResrcinterface(self): 
    7273        """Set-up Resource URI interface to Gatekeeper""" 
    7374         
     
    7576            try: 
    7677                # Temporarily extend system path ready for import 
    77                 sysPathBak = sys.path 
    78                 sys.path.append(self.__prop['resrcURImodFilePath']) 
     78                sysPathBak = sys.path[:] 
     79                sys.path.append(self.__prop['resrcModFilePath']) 
    7980                 
    8081                # Import module name specified in properties file 
    81                 resrcURImod = __import__(self.__prop['resrcURImodName'], 
    82                                          globals(), 
    83                                          locals(), 
    84                                          [self.__prop['resrcURIclassName']]) 
    85      
    86                 resrcURIclass = eval('resrcURImod.' + \ 
    87                                         self.__prop['resrcURIclassName']) 
     82                resrcMod = __import__(self.__prop['resrcModName'], 
     83                                      globals(), 
     84                                      locals(), 
     85                                      [self.__prop['resrcClassName']]) 
     86     
     87                resrcClass = eval('resrcMod.' + self.__prop['resrcClassName']) 
     88                 
    8889            finally: 
    89                 sys.path = sysPathBak 
     90                sys.path[:] = sysPathBak 
    9091                                 
    9192        except KeyError, e: 
     
    9798 
    9899 
    99         # Check class inherits from GatekeeperResrcURI abstract base class 
    100         if not issubclass(resrcURIclass, GatekeeperResrcURI): 
     100        # Check class inherits from GatekeeperResrc abstract base class 
     101        if not issubclass(resrcClass, GatekeeperResrc): 
    101102            raise GatekeeperError(\ 
    102103                "Resource URI interface class %s must be derived from " + \ 
    103                 "GatekeeperResrcURI" % self.__prop['resrcURIclassName']) 
     104                "GatekeeperResrc" % self.__prop['resrcClassName']) 
    104105 
    105106 
    106107        # Instantiate custom class 
    107108        try: 
    108             self.__resrcURIobj = resrcURIclass(\ 
    109                                     filePath=self.__prop['resrcURIpropFile'])             
     109            self.__resrcObj = resrcClass(\ 
     110                                    resrcID=self.__prop['resrcID'], 
     111                                    filePath=self.__prop['resrcPropFile'])             
    110112        except Exception, e: 
    111113            raise GatekeeperError(\ 
     
    123125        if propFilePath is not None: 
    124126            if not isinstance(propFilePath, basestring): 
    125                 raise AttAuthorityError("Input Properties file path " + \ 
     127                raise GatekeeperError("Input Properties file path " + \ 
    126128                                        "must be a valid string.") 
    127129             
     
    130132 
    131133        try: 
    132             tree = ElementTree.parse(self.__propFilePath) 
     134            elems = ElementTree.parse(self.__propFilePath).getroot() 
    133135             
    134136        except IOError, ioErr: 
    135             raise AttAuthorityError(\ 
     137            raise GatekeeperError(\ 
    136138                                "Error parsing properties file \"%s\": %s" % \ 
    137139                                (ioErr.filename, ioErr.strerror)) 
    138  
    139      
    140     #_________________________________________________________________________ 
    141     def __call__(self, input): 
    142          
    143         if isinstance(input, basestring): 
     140                                 
     141        # Copy properties from file as dictionary 
     142        self.__prop = dict([(elem.tag, elem.text) for elem in elems]) 
     143 
     144 
     145        # Check for missing properties 
     146        propKeys = self.__prop.keys() 
     147        missingKeys = [key for key in Gatekeeper.__validKeys \ 
     148                       if key not in propKeys] 
     149        if missingKeys != []: 
     150            raise GatekeeperError("The following properties are " + \ 
     151                                  "missing from the properties file: " + \ 
     152                                  ', '.join(missingKeys)) 
     153 
     154 
     155    def __formatInput(self, input): 
     156        """Convert generic input into a list of roles - use with access 
     157        routines""" 
     158         
     159        if isinstance(input, list): 
     160            # Input is list of roles 
     161            return input 
     162               
     163        elif isinstance(input, basestring): 
    144164            # Input is a role 
    145             roleList = [input] 
    146              
    147         elif isinstance(input, list): 
    148             # Input is list of roles 
    149             roleList = input 
     165            return [input] 
    150166             
    151167        elif isinstance(input, AttCert): 
    152168            # Input is an Attribute Certificate 
    153             roleList = input.getRoles() 
     169            # Check signature of AttCert 
     170            try: 
     171                attCert.isValid(raiseExcep=True,  
     172                            certFilePathList=self.__prop['caCertFilePath'])                             
     173            except Exception, e: 
     174                raise GateKeeperError, "Access denied for input: %s" % str(e) 
     175             
     176            return input.getRoles() 
    154177        else: 
    155178            raise GatekeeperError("Input must be a role, role list or " + \ 
    156179                                  "Attribute Certificate type") 
    157                                    
     180 
     181    
     182    #_________________________________________________________________________ 
     183    def __call__(self, input): 
     184        """Get the permissions for the input rile, list of roles or  
     185        Attribute Certificate containing roles.  A Dictionary of permissions 
     186        are returned indexed by role name.  Permissions are expressed as a  
     187        tuple containing the relevant permissions flags e.g. ('r', 'w', 'x') 
     188        for read/write/execute permission or e.g. ('x') for exceute only 
     189        permission""" 
     190         
     191        roleList = self.__formatInput(input) 
    158192                                       
    159         return dict([(role, self.__resrcURIobj.getPermissions(role)) \ 
     193        return dict([(role, self.__resrcObj.getPermissions(role)) \ 
    160194                     for role in roleList]) 
    161195         
    162196     
    163197    getPermissions = __call__ 
    164  
    165  
     198     
     199     
     200    #_________________________________________________________________________ 
     201    def readAccess(self, input): 
     202        """Determine read access permitted against the given 
     203        input role/role list or Attribute Certificate roles 
     204         
     205        Return a dictionary of booleans for access granted/denied keyed 
     206        by role name""" 
     207         
     208        roleList = self.__formatInput(input) 
     209         
     210        return dict([(role, self.__resrcObj.readAccess(role)) \ 
     211                     for role in roleList]) 
     212     
     213     
     214    #_________________________________________________________________________ 
     215    def writeAccess(self, input): 
     216        """Determine write access permitted against the given 
     217        input role/role list or Attribute Certificate roles 
     218         
     219        Return a dictionary of booleans for access granted/denied keyed 
     220        by role name""" 
     221         
     222        roleList = self.__formatInput(input) 
     223         
     224        return dict([(role, self.__resrcObj.writeAccess(role)) \ 
     225                     for role in roleList]) 
     226     
     227     
     228    #_________________________________________________________________________ 
     229    def executeAccess(self, input): 
     230        """Determine execute access permitted against the given 
     231        input role/role list or Attribute Certificate roles 
     232         
     233        Return a dictionary of booleans for access granted/denied keyed 
     234        by role name""" 
     235         
     236        roleList = self.__formatInput(input) 
     237         
     238        return dict([(role, self.__resrcObj.executeAccess(role)) \ 
     239                     for role in roleList]) 
     240                      
    166241 
    167242#_____________________________________________________________________________ 
    168 class GatekeeperResrcURIError(Exception): 
    169     """Exception handling for NDG Attribute Authority User Roles interface 
     243class GatekeeperResrcError(GateKeeperError): 
     244    """Exception handling for NDG Gatekeeper Resource interface class 
    170245    class.""" 
    171      
    172     def __init__(self, msg): 
    173         self.__msg = msg 
    174           
    175     def __str__(self): 
    176         return self.__msg 
    177  
     246    pass 
    178247 
    179248 
    180249#_____________________________________________________________________________ 
    181 class GatekeeperResrcURI: 
    182     """An abstract base class to define the resource URI -> role interface  
     250class GatekeeperResrc: 
     251    """An abstract base class to define the resource -> role interface  
    183252    for the Gatekeeper. 
    184253 
    185254    Each NDG resource should implement a derived class which implements 
    186     the way a resource roles is served from the given resource URI.""" 
     255    the way a resource roles is served from the given resource.""" 
    187256 
    188257    # User defined class may wish to specify a URI or path for a configuration 
    189258    # file 
    190     def __init__(self, uri=None, filePath=None): 
    191         """Roles abstract base class - derive from this class to define 
     259    def __init__(self, resrcID=None, filePath=None): 
     260        """Abstract base class - derive from this class to define 
    192261        resource role interface to Gatekeeper""" 
    193262        raise NotImplementedError(\ 
    194263            self.__init__.__doc__.replace('\n       ','')) 
    195  
    196  
    197     def __getRole(self): 
    198         """Derived method should return the role for the resource 
    199         This method is not essential to interface with GateKeeper class""" 
    200         raise NotImplementedError( 
    201             self.__getRole.__doc__.replace('\n       ','')) 
    202      
    203     role = property(fget=__getRole, doc="Access resource access role") 
    204264     
    205265 
     
    217277        raise NotImplementedError( 
    218278            self.__getPermissions.__doc__.replace('\n       ','')) 
     279 
     280 
     281    def readAccess(self, role): 
     282        """Derived method should return the role for read access to the  
     283        resource - should return boolean for access granted/denied""" 
     284        raise NotImplementedError( 
     285            self.readAccess.__doc__.replace('\n       ','')) 
     286 
     287 
     288    def writeAccess(self, role): 
     289        """Derived method should return the role for write access to the  
     290        resource - should return boolean for access granted/denied""" 
     291        raise NotImplementedError( 
     292            self.writeAccess.__doc__.replace('\n       ','')) 
     293 
     294 
     295    def executeAccess(self, role): 
     296        """Derived method should return the role for execute access to the  
     297        resource - should return boolean for access granted/denied""" 
     298        raise NotImplementedError( 
     299            self.executeAccess.__doc__.replace('\n       ','')) 
     300     
     301             
  • TI12-security/trunk/python/NDG/log_services_server.py

    r920 r964  
    1313version 1.0 or later. 
    1414""" 
     15reposID = '$Id$' 
     16 
    1517import os 
    1618 
  • TI12-security/trunk/python/Tests/SecurityClientTest.py

    r941 r964  
    105105        try: 
    106106            # Connect as a command line client - a proxyCert is returned         
    107             proxyCert = self.sessClnt.connect(userName,  
     107            self.proxyCert = self.sessClnt.connect(userName,  
    108108                                          pPhraseFilePath="./tmp", 
    109109                                          createServerSess=True, 
     
    111111                                          clntPriKeyPwd=self.__clntPriKeyPwd) 
    112112            print "User '%s' connected to Session Manager:\n%s" % \ 
    113                 (userName, proxyCert) 
     113                (userName, self.proxyCert) 
    114114 
    115115        except Exception, e: 
     
    196196        pdb.set_trace() 
    197197        try: 
    198             proxyCert = open("./proxy.pem").read().strip() 
     198            # Alternative means of getting proxy cert - from file 
     199            #self.proxyCert = open("./proxy.pem").read().strip() 
     200            self.proxyCertConnectTest() 
    199201            userAttCert = None 
    200202             
    201203            ac = self.aaClnt.reqAuthorisation( 
    202                                        proxyCert=proxyCert, 
     204                                       proxyCert=self.proxyCert, 
    203205                                       userAttCert=userAttCert, 
    204206                                       clntPriKeyPwd=self.__clntPriKeyPwd) 
  • TI12-security/trunk/python/conf/gatekeeperProperties.xml

    r930 r964  
    11<?xml version="1.0" encoding="utf-8"?> 
    22<gatekeeperProp> 
    3     <resrcURI></resrcURI> 
    4     <resrcURImodFilePath></resrcURImodFilePath> 
    5     <resrcURImodName></resrcURImodName> 
    6     <resrcURIclassName></resrcURIclassName> 
    7     <resrcURIpropFile></resrcURIpropFile> 
     3        <!-- Resource identifier e.g. a URI --> 
     4    <resrcID></resrcID> 
     5        <!-- Resource interface class --> 
     6    <resrcModFilePath></resrcModFilePath> 
     7    <resrcModName></resrcModName> 
     8    <resrcClassName></resrcClassName> 
     9    <resrcPropFile></resrcPropFile> 
     10        <!-- CA Certificate used in validation of Attribute Certificate XML  
     11        singature --> 
     12        <caCertFilePath></caCertFilePath> 
    813</gatekeeperProp> 
  • TI12-security/trunk/python/conf/sessionMgrProperties.xml

    r784 r964  
    99    <cookieDomain></cookieDomain> 
    1010    <myProxyProp> 
    11         <myProxyServer></myProxyServer> 
    12         <gridSecurityDir></gridSecurityDir> 
    13         <credStorageDir></credStorageDir> 
    14         <openSSLConfFileName></openSSLConfFileName> 
     11        <myProxyServer></myProxyServer> 
     12        <gridSecurityDir></gridSecurityDir> 
     13        <credStorageDir></credStorageDir> 
     14        <openSSLConfFileName></openSSLConfFileName> 
    1515        <tmpDir></tmpDir> 
    16         <path></path> 
    17         <proxyCertMaxLifetime></proxyCertMaxLifetime> 
    18         <proxyCertLifetime></proxyCertLifetime> <!-- in hours --> 
    19         <simpleCACltProp> 
    20             <wsdl></wsdl> 
    21             <xmlSigKeyFile></xmlSigKeyFile> 
     16        <path></path> 
     17        <proxyCertMaxLifetime></proxyCertMaxLifetime> 
     18        <proxyCertLifetime></proxyCertLifetime> <!-- in hours --> 
     19        <simpleCACltProp> 
     20            <wsdl></wsdl> 
     21            <xmlSigKeyFile></xmlSigKeyFile> 
    2222            <xmlSigCertFile></xmlSigCertFile> 
    2323            <xmlSigCertPPhrase></xmlSigCertPPhrase> 
    24         </simpleCACltProp> 
    25         <!-- 
    26         <simpleCASrvProp> 
    27             <certExpiryDate></certExpiryDate> 
    28             <certLifetimeDays></certLifetimeDays> 
    29             <certTmpDir></certTmpDir> 
    30             <caCertFile></caCertFile> 
    31             <signExe></signExe> 
    32             <path></path> 
    33         </simpleCASrvProp> 
    34         --> 
     24        </simpleCACltProp 
     25        <!-- 
     26        <simpleCASrvProp> 
     27            <certExpiryDate></certExpiryDate> 
     28            <certLifetimeDays></certLifetimeDays> 
     29            <certTmpDir></certTmpDir> 
     30            <caCertFile></caCertFile> 
     31            <signExe></signExe> 
     32            <path></path> 
     33        </simpleCASrvProp> 
     34        --> 
    3535    </myProxyProp> 
    3636    <credReposProp> 
    37         <dbURI></dbURI> 
     37        <dbURI></dbURI> 
    3838    </credReposProp> 
    3939</sessMgrProp> 
Note: See TracChangeset for help on using the changeset viewer.