Changeset 5729


Ignore:
Timestamp:
17/09/09 16:11:29 (10 years ago)
Author:
pjkersha
Message:

Preparing 1.1.0 release: first with SAML interface for Attribute Authority

Location:
TI12-security/trunk/python
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg_security_client/setup.cfg

    r5569 r5729  
    1616 
    1717[egg_info] 
    18 tag_build = rc3 
     18tag_build = rc1 
    1919tag_svn_revision = true 
    2020 
  • TI12-security/trunk/python/ndg_security_client/setup.py

    r5562 r5729  
    4444setup( 
    4545    name =                      'ndg_security_client', 
    46     version =                   '1.0.5', 
     46    version =                   '1.1.0', 
    4747    description =               'NERC DataGrid Security Client side interface', 
    4848    long_description =          _longDescription, 
  • TI12-security/trunk/python/ndg_security_common/setup.cfg

    r5569 r5729  
    1616 
    1717[egg_info] 
    18 tag_build = rc3 
     18tag_build = rc1 
    1919tag_svn_revision = true 
    2020 
  • TI12-security/trunk/python/ndg_security_common/setup.py

    r5592 r5729  
    6969setup( 
    7070    name =                      'ndg_security_common', 
    71     version =                   '1.0.5', 
     71    version =                   '1.1.0', 
    7272    description =           'NERC DataGrid Security package containing common ' 
    7373                            'utilities used by both server and client ' 
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/attributeauthority.py

    r5703 r5729  
    16141614        """ 
    16151615        raise NotImplementedError(self.getAttributes.__doc__) 
     1616 
     1617 
     1618class CSVFileAttributeInterface(AttributeInterface): 
     1619    """Attribute Interface based on a Comma Separated Variable file containing 
     1620    user identities and associated attributes.  For test/development purposes 
     1621    only.  The SAML getAttributes method is NOT implemented here 
     1622     
     1623    The expected file format is: 
     1624     
     1625    <userID>, <role1>, <role2>, ... <roleN> 
     1626    """ 
     1627    def __init__(self, propertiesFilePath=None): 
     1628        """ 
     1629        @param propertiesFilePath: file path to Comma Separated file  
     1630        containing user ids and roles 
     1631        @type propertiesFilePath: basestring 
     1632        """ 
     1633        if propertiesFilePath is None: 
     1634            raise AttributeError("Expecting propertiesFilePath setting") 
     1635         
     1636        propertiesFile = open(propertiesFilePath) 
     1637        lines = propertiesFile.readlines() 
     1638         
     1639        self.attributeMap = {} 
     1640        for line in lines: 
     1641            fields = re.split(',\W*', line.strip()) 
     1642            self.attributeMap[fields[0]] = fields[1:] 
     1643     
     1644    def getRoles(self, userId): 
     1645        """ 
     1646        @param userId: user identity to key into attributeMap 
     1647        @type userId: basestring 
     1648        """   
     1649        log.debug('CSVFileAttributeInterface.getRoles for user "%s" ...',  
     1650                  userId) 
     1651        return self.attributeMap.get(userId, []) 
     1652 
     1653 
     1654# Properties file 
     1655from ConfigParser import SafeConfigParser, NoOptionError 
     1656 
     1657try: 
     1658    # PostgreSQL interface 
     1659    from psycopg2 import connect 
     1660except ImportError: 
     1661    pass 
     1662 
     1663class PostgresAttributeInterface(AttributeInterface): 
     1664    """User Roles interface to Postgres database 
     1665     
     1666    The SAML getAttributes method is NOT implemented""" 
     1667 
     1668    CONNECTION_SECTION_NAME = "Connection" 
     1669    GETROLES_SECTION_NAME = "getRoles" 
     1670    HOST_OPTION_NAME = "host" 
     1671    DBNAME_OPTION_NAME = "dbName" 
     1672    USERNAME_OPTION_NAME = "username" 
     1673    PWD_OPTION_NAME = "pwd" 
     1674    QUERYN_OPTION_NAME = "query%d" 
     1675    DEFAULT_ROLES_OPTION_NAME = "defaultRoles" 
     1676     
     1677    def __init__(self, propertiesFilePath=None): 
     1678        """Connect to Postgres database""" 
     1679        self.__con = None 
     1680        self.__host = None 
     1681        self.__dbName = None 
     1682        self.__username = None 
     1683        self.__pwd = None 
     1684 
     1685        if propertiesFilePath is None: 
     1686            raise AttributeError("No Configuration file was set") 
     1687 
     1688        self.readConfigFile(propertiesFilePath) 
     1689 
     1690    def __del__(self): 
     1691        """Close database connection""" 
     1692        self.close() 
     1693 
     1694    def readConfigFile(self, propertiesFilePath): 
     1695        """Read the configuration for the database connection 
     1696 
     1697        @type propertiesFilePath: string 
     1698        @param propertiesFilePath: file path to config file""" 
     1699 
     1700        if not isinstance(propertiesFilePath, basestring): 
     1701            raise TypeError("Input Properties file path must be a valid " 
     1702                            "string; got %r" % type(propertiesFilePath)) 
     1703 
     1704        cfg = SafeConfigParser() 
     1705        cfg.read(propertiesFilePath) 
     1706 
     1707        self.__host = cfg.get( 
     1708                        PostgresAttributeInterface.CONNECTION_SECTION_NAME,  
     1709                        PostgresAttributeInterface.HOST_OPTION_NAME) 
     1710        self.__dbName = cfg.get( 
     1711                        PostgresAttributeInterface.CONNECTION_SECTION_NAME,  
     1712                        PostgresAttributeInterface.DBNAME_OPTION_NAME) 
     1713        self.__username = cfg.get( 
     1714                        PostgresAttributeInterface.CONNECTION_SECTION_NAME,  
     1715                        PostgresAttributeInterface.USERNAME_OPTION_NAME) 
     1716        self.__pwd = cfg.get( 
     1717                        PostgresAttributeInterface.CONNECTION_SECTION_NAME,  
     1718                        PostgresAttributeInterface.PWD_OPTION_NAME) 
     1719 
     1720        try: 
     1721            self.__getRolesQuery = [] 
     1722            for i in range(10): 
     1723                queryStr = cfg.get( 
     1724                        PostgresAttributeInterface.GETROLES_SECTION_NAME,  
     1725                        PostgresAttributeInterface.QUERYN_OPTION_NAME % i) 
     1726                self.__getRolesQuery += [queryStr] 
     1727        except NoOptionError: 
     1728             # Continue until no more query<n> items left 
     1729             pass 
     1730 
     1731        # This option may be omitted in the config file 
     1732        try: 
     1733            self.__defaultRoles = cfg.get( 
     1734                PostgresAttributeInterface.GETROLES_SECTION_NAME,  
     1735                PostgresAttributeInterface.DEFAULT_ROLES_OPTION_NAME).split() 
     1736        except NoOptionError: 
     1737            self.__defaultRoles = [] 
     1738 
     1739    def connect(self, 
     1740                username=None, 
     1741                dbName=None, 
     1742                host=None, 
     1743                pwd=None, 
     1744                prompt="Database password: "): 
     1745        """Connect to database 
     1746 
     1747        Values for keywords omitted are derived from the config file.  If pwd 
     1748        is not in the config file it will be prompted for from stdin 
     1749 
     1750        @type username: string 
     1751        @keyword username: database account username 
     1752        @type dbName: string 
     1753        @keyword dbName: name of database 
     1754        @type host: string 
     1755        @keyword host: database host machine 
     1756        @type pwd: string 
     1757        @keyword pwd: password for database account.  If omitted and not in 
     1758        the config file it will be prompted for from stdin 
     1759        @type prompt: string 
     1760        @keyword prompt: override default password prompt""" 
     1761 
     1762        if not host: 
     1763            host = self.__host 
     1764 
     1765        if not dbName: 
     1766            dbName = self.__dbName 
     1767 
     1768        if not username: 
     1769            username = self.__username 
     1770 
     1771        if not pwd: 
     1772            pwd = self.__pwd 
     1773 
     1774            if not pwd: 
     1775                import getpass 
     1776                pwd = getpass.getpass(prompt=prompt) 
     1777 
     1778        try: 
     1779            self.__db = connect("host=%s dbname=%s user=%s password=%s" % \ 
     1780                                (host, dbName, username, pwd)) 
     1781            self.__cursor = self.__db.cursor() 
     1782 
     1783        except NameError, e: 
     1784            raise AttributeInterfaceError("psycopg2 Postgres package not " 
     1785                                          "installed? %s" % e) 
     1786        except Exception, e: 
     1787            raise AttributeInterfaceError("Error connecting to database " 
     1788                                          "\"%s\": %s" % (dbName, e)) 
     1789 
     1790 
     1791    def close(self): 
     1792        """Close database connection""" 
     1793        if self.__con: 
     1794            self.__con.close() 
     1795 
     1796    def getRoles(self, userId): 
     1797        """Return valid roles for the given userId 
     1798 
     1799        @type userId: basestring 
     1800        @param userId: user identity""" 
     1801 
     1802        try: 
     1803            self.connect() 
     1804 
     1805            # Process each query in turn appending role names 
     1806            roles = self.__defaultRoles[:] 
     1807            for query in self.__getRolesQuery: 
     1808                try: 
     1809                    self.__cursor.execute(query % userId) 
     1810                    queryRes = self.__cursor.fetchall() 
     1811 
     1812                except Exception, e: 
     1813                    raise AttributeInterfaceError("Query for %s: %s" % 
     1814                                                  (userId, e)) 
     1815 
     1816                roles += [res[0] for res in queryRes if res[0]] 
     1817        finally: 
     1818            self.close() 
     1819 
     1820        return roles 
     1821 
     1822    def __getCursor(self): 
     1823        """Return a database cursor instance""" 
     1824        return self.__cursor 
     1825 
     1826    cursor = property(fget=__getCursor, doc="database cursor") 
  • TI12-security/trunk/python/ndg_security_server/setup.cfg

    r5569 r5729  
    1515 
    1616[egg_info] 
    17 tag_build = rc3 
     17tag_build = rc1 
    1818tag_svn_revision = true 
    1919 
  • TI12-security/trunk/python/ndg_security_server/setup.py

    r5562 r5729  
    6363setup( 
    6464    name =                      'ndg_security_server', 
    65     version =                   '1.0.5', 
     65    version =                   '1.1.0', 
    6666    description =               'Server side components for running NERC DataGrid ' 
    6767                            'Security Services', 
  • TI12-security/trunk/python/ndg_security_test/setup.cfg

    r5569 r5729  
    99# BSD - See LICENCE file for details 
    1010[egg_info] 
    11 tag_build = rc3 
     11tag_build = rc1 
    1212tag_svn_revision = true 
    1313 
  • TI12-security/trunk/python/ndg_security_test/setup.py

    r5562 r5729  
    2020setup( 
    2121    name =                      'ndg_security_test', 
    22     version =                   '1.0.5', 
     22    version =                   '1.1.0', 
    2323    description =               'NERC DataGrid Security Unit tests', 
    2424    long_description =          'Unit tests client - server side', 
Note: See TracChangeset for help on using the changeset viewer.