Changeset 6512
- Timestamp:
- 08/02/10 17:12:29 (11 years ago)
- Location:
- TI12-security/trunk/NDGSecurity/python
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
TI12-security/trunk/NDGSecurity/python/Makefile
r6440 r6512 10 10 # @license: BSD - LICENSE file 11 11 # 12 # $Id $12 # $Id:$ 13 13 EGG_DIRS=ndg_security_common ndg_security_client ndg_security_server \ 14 14 ndg_security_test ndg_security … … 17 17 PYTHON=python 18 18 19 eggs: 19 Eggs: 20 @echo "Running setup bdist_egg in these directories ${EGG_DIRS} ..." 20 21 @-for dir in ${EGG_DIRS}; do \ 21 22 cd $$dir; \ … … 45 46 force: replace 46 47 47 NDG_EGG_DIST_USER=48 NDG_EGG_DIST_HOST=49 NDG_EGG_DIST_DIR=48 #NDG_EGG_DIST_USER= 49 #NDG_EGG_DIST_HOST= 50 #NDG_EGG_DIST_DIR= 50 51 51 install_eggs: eggs 52 install_eggs: Eggs 53 @echo "Installing eggs to ${NDG_EGG_DIST_HOST}:${NDG_EGG_DIST_DIR} ..." 54 chown ${NDG_EGG_DIST_USER}:cedadev ndg_*/dist/*.egg 52 55 scp ndg_*/dist/*.egg ${NDG_EGG_DIST_USER}@${NDG_EGG_DIST_HOST}:${NDG_EGG_DIST_DIR} 53 56 -
TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/credentialwallet.py
r6202 r6512 297 297 credentialWallet = cls() 298 298 credentialWallet.parseConfig(cfg, **kw) 299 300 return credentialWallet 299 301 300 302 def parseConfig(self, cfg, prefix='', section='DEFAULT'): … … 410 412 Attribute Assertions 411 413 """ 412 __slots__ = () 414 CONFIG_FILE_OPTNAMES = CredentialWalletBase.CONFIG_FILE_OPTNAMES + ( 415 "clockSkewTolerance", ) 416 __slots__ = ("__clockSkewTolerance",) 413 417 414 418 CREDENTIAL_REPOSITORY_NOT_SUPPORTED_MSG = ("SAMLCredentialWallet doesn't " … … 417 421 "interface") 418 422 419 @classmethod 420 def fromConfig(cls, cfg, **kw): 421 '''Alternative constructor makes object from config file settings 422 @type cfg: basestring /ConfigParser derived type 423 @param cfg: configuration file path or ConfigParser type object 424 @rtype: ndg.security.common.credentialWallet.SAMLCredentialWallet 425 @return: new instance of this class 426 ''' 427 credentialWallet = cls() 428 credentialWallet.parseConfig(cfg, **kw) 429 430 return credentialWallet 423 def __init__(self): 424 super(SAMLCredentialWallet, self).__init__() 425 self.__clockSkewTolerance = timedelta(seconds=0.) 426 427 def _getClockSkewTolerance(self): 428 return self.__clockSkewTolerance 429 430 def _setClockSkewTolerance(self, value): 431 if isinstance(value, (float, int, long)): 432 self.__clockSkewTolerance = timedelta(seconds=value) 433 434 elif isinstance(value, basestring): 435 self.__clockSkewTolerance = timedelta(seconds=float(value)) 436 else: 437 raise TypeError('Expecting float, int, long or string type for ' 438 '"clockSkewTolerance"; got %r' % type(value)) 439 440 clockSkewTolerance = property(_getClockSkewTolerance, 441 _setClockSkewTolerance, 442 doc="Allow a tolerance (seconds) for " 443 "checking timestamps of the form: " 444 "notBeforeTime - tolerance < now < " 445 "notAfterTime + tolerance") 431 446 432 447 def parseConfig(self, cfg, prefix='', section='DEFAULT'): … … 461 476 credential, 462 477 attributeAuthorityURI=None, 463 bUpdateCredentialRepository=False): 478 bUpdateCredentialRepository=False, 479 verifyCredential=True): 464 480 """Add a new assertion to the list of assertion credentials held. 465 481 … … 473 489 @type bUpdateCredentialRepository: bool 474 490 @param bUpdateCredentialRepository: if set to True, and a repository 475 exists it will be updated with the new credentials also 491 exists it will be updated with the new credentials also. Nb. a derived 492 class will need to be implemented to enable this capability - see 493 the updateCredentialRepository method. 494 @type verifyCredential: bool 495 @param verifyCredential: if set to True, test validity of credential 496 by calling isValidCredential method. 476 497 477 498 @rtype: bool 478 @return: True if c ertificatewas added otherwise False. - If an499 @return: True if credential was added otherwise False. - If an 479 500 existing certificate from the same issuer has a later expiry it will 480 501 take precedence and the new input certificate is ignored.""" … … 485 506 "%r type object" % Assertion) 486 507 487 if not self.isValidCredential(credential):508 if verifyCredential and not self.isValidCredential(credential): 488 509 raise CredentialWalletError("Validity time error with assertion %r" 489 % assertion)510 % credential) 490 511 491 512 # Check to see if there is an existing Attribute Certificate held 492 513 # that was issued by the same host. If so, compare the expiry time. 493 514 # The one with the latest expiry will be retained and the other 494 # i ngored515 # ignored 495 516 bUpdateCred = True 517 if credential.issuer is None: 518 raise AttributeError("Adding SAML assertion to wallet: no issuer " 519 "set") 520 496 521 issuerName = credential.issuer.value 497 522 … … 551 576 """Validate SAML assertion time validity""" 552 577 utcNow = datetime.utcnow() 553 if utcNow < assertion.conditions.notBefore :578 if utcNow < assertion.conditions.notBefore - self.clockSkewTolerance: 554 579 msg = ('The current clock time [%s] is before the SAML Attribute ' 555 'Response assertion conditions not before time [%s]' % 580 'Response assertion conditions not before time [%s] ' 581 '(with clock skew tolerance = %s)' % 556 582 (SAMLDateTime.toString(utcNow), 557 assertion.conditions.notBefore)) 583 assertion.conditions.notBefore, 584 self.clockSkewTolerance)) 558 585 log.warning(msg) 559 586 return False 560 587 561 if utcNow >= assertion.conditions.notOnOrAfter: 588 if (utcNow >= 589 assertion.conditions.notOnOrAfter + self.clockSkewTolerance): 562 590 msg = ('The current clock time [%s] is on or after the SAML ' 563 591 'Attribute Response assertion conditions not on or after ' 564 'time [%s] ' %592 'time [%s] (with clock skew tolerance = %s)' % 565 593 (SAMLDateTime.toString(utcNow), 566 assertion.conditions.notOnOrAfter)) 594 assertion.conditions.notOnOrAfter, 595 self.clockSkewTolerance)) 567 596 log.warning(msg) 568 597 return False … … 834 863 _dict = super(NDGCredentialWallet, self).__getstate__() 835 864 836 for attrName in SAMLCredentialWallet.__slots__:865 for attrName in NDGCredentialWallet.__slots__: 837 866 # Ugly hack to allow for derived classes setting private member 838 867 # variables -
TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/wsgi/authz/__init__.py
r6284 r6512 586 586 uri=attributeAuthorityURI) 587 587 for assertion in response.assertions: 588 credentialWallet.addCredential(assertion) 588 credentialWallet.addCredential(assertion, 589 attributeAuthorityURI=attributeAuthorityURI, 590 verifyCredential=False) 589 591 590 592 log.debug("SamlPIPMiddleware.attributeQuery: updating Credential " -
TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/wsgi/saml/__init__.py
r6069 r6512 223 223 response = soapResponse.serialize() 224 224 225 log.debug("SOAPAttributeInterfaceMiddleware.__call__: sending response " 226 "...\n\n%s", 227 response) 225 228 start_response("200 OK", 226 229 [('Content-length', str(len(response))), -
TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/authz/msi/policy-1.1.xml
r6022 r6512 25 25 </Attributes> 26 26 </Target> 27 <!-- Test inclusion of ampersand --> 28 <Target> 29 <URIPattern>^/test_securedURI[?&]MyQueryParam=100</URIPattern> 30 <Attributes> 31 <Attribute> 32 <Name>urn:siteA:security:authz:1.0:attr:staff</Name> 33 <AttributeAuthorityURI>http://localhost:7443/AttributeAuthority</AttributeAuthorityURI> 34 </Attribute> 35 </Attributes> 36 </Target> 27 37 </Policy> -
TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/authz/msi/test_msi.py
r6069 r6512 59 59 assert(attribute.attributeAuthorityURI) 60 60 61 61 62 62 63 class PIPPlaceholder(PIPBase): … … 81 82 PERMITTED_RESOURCE_URI = '/test_securedURI' 82 83 DENIED_RESOURCE_URI = '/test_accessDeniedToSecuredURI' 84 WITH_ESCAPE_CHARS_RESOURCE_URI = '/test_securedURI?MyQueryParam=100' 83 85 84 86 def setUp(self): … … 104 106 self.assert_(response.status == Response.DECISION_DENY) 105 107 108 def test03WithEscapeCharsInPolicy(self): 109 self.request.resource[Resource.URI_NS 110 ] = PDPTestCase.WITH_ESCAPE_CHARS_RESOURCE_URI 111 response = self.pdp.evaluate(self.request) 112 113 self.assert_(response.status == Response.DECISION_PERMIT) 114 106 115 107 116 if __name__ == "__main__": -
TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/credentialwallet/test_credentialwallet.py
r6069 r6512 248 248 249 249 def setUp(self): 250 self.assertion = self._createAssertion()250 self.assertion = self._createAssertion() 251 251 252 252 def _createAssertion(self, timeNow=None, validityDuration=60*60*8, … … 322 322 self.assert_(len(wallet.credentials) == 0) 323 323 324 def test04ReplaceCredential(self): 324 def test04ClockSkewTolerance(self): 325 # Add a short lived credential but with the wallet set to allow for 326 # a clock skew of 327 shortExpiryAssertion = self._createAssertion(validityDuration=1) 328 wallet = SAMLCredentialWallet() 329 330 # Set a tolerance of five seconds 331 wallet.clockSkewTolerance = 5.*60*60 332 wallet.addCredential(shortExpiryAssertion) 333 334 self.assert_(len(wallet.credentials) == 1) 335 sleep(2) 336 wallet.audit() 337 self.assert_(len(wallet.credentials) == 1) 338 339 def test05ReplaceCredential(self): 325 340 # Replace an existing credential from a given institution with a more 326 341 # up to date one … … 332 347 wallet.addCredential(newAssertion) 333 348 self.assert_(len(wallet.credentials) == 1) 334 self.assert_(newAssertion.conditions.notOnOrAfter ==\349 self.assert_(newAssertion.conditions.notOnOrAfter == \ 335 350 wallet.credentials[ 336 351 SAMLCredentialWalletTestCase.SITEA_SAML_ISSUER_NAME 337 352 ].credential.conditions.notOnOrAfter) 338 353 339 def test0 5CredentialsFromSeparateSites(self):354 def test06CredentialsFromSeparateSites(self): 340 355 wallet = self._addCredential() 341 356 wallet.addCredential(self._createAssertion(issuerName="MySite")) 342 357 self.assert_(len(wallet.credentials) == 2) 343 358 344 def test0 6Pickle(self):359 def test07Pickle(self): 345 360 wallet = self._addCredential() 346 361 outFile = open(SAMLCredentialWalletTestCase.PICKLE_FILEPATH, 'w') … … 353 368 SAMLCredentialWalletTestCase.SITEA_ATTRIBUTEAUTHORITY_SAML_URI)) 354 369 370 self.assert_(unpickledWallet.credentials.items()[0][1].issuerName == \ 371 BaseTestCase.SITEA_SAML_ISSUER_NAME) 372 373 def test08CreateFromConfig(self): 374 wallet = SAMLCredentialWallet.fromConfig( 375 SAMLCredentialWalletTestCase.CONFIG_FILEPATH) 376 self.assert_(wallet.clockSkewTolerance == timedelta(seconds=0.01)) 377 self.assert_(wallet.userId == 'https://openid.localhost/philip.kershaw') 355 378 356 379 if __name__ == "__main__": -
TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/credentialwallet/test_samlcredentialwallet.cfg
r6040 r6512 9 9 # $Id:$ 10 10 [DEFAULT] 11 clockSkew = 0.11 clockSkewTolerance = 0.01 12 12 userId = https://openid.localhost/philip.kershaw 13 issuerDN = /O=Site A/CN=Authorisation Service14 attributeAuthorityURI = https://localhost:5443/AttributeAuthority/saml15 queryAttributes.0 = urn:esg:first:name, FirstName, http://www.w3.org/2001/XMLSchema#string16 queryAttributes.roles = urn:siteA:security:authz:1.0:attr, , http://www.w3.org/2001/XMLSchema#string17 18 # SSL Context Proxy settings19 sslCACertDir = $NDGSEC_TEST_CONFIG_DIR/ca20 sslCertFilePath = $NDGSEC_TEST_CONFIG_DIR/pki/test.crt21 sslPriKeyFilePath = $NDGSEC_TEST_CONFIG_DIR/pki/test.key22 sslValidDNs = /C=UK/ST=Oxfordshire/O=BADC/OU=Security/CN=localhost, /O=Site A/CN=Attribute Authority
Note: See TracChangeset
for help on using the changeset viewer.