Changeset 6837
- Timestamp:
- 21/04/10 16:40:42 (11 years ago)
- Location:
- TI12-security/trunk/MyProxyClient
- Files:
-
- 6 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
TI12-security/trunk/MyProxyClient/.pydevproject
r6835 r6837 4 4 <pydev_project> 5 5 <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> 6 <path>/MyProxyClient -pyopenssl</path>6 <path>/MyProxyClient</path> 7 7 </pydev_pathproperty> 8 8 <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property> -
TI12-security/trunk/MyProxyClient/myproxy/client.py
r6829 r6837 4 4 5 5 Major re-write of an original class. This updated version implements methods 6 with SSL calls with M2Cryptorather use calls to myproxy client executables as6 with SSL calls with PyOpenSSL rather use calls to myproxy client executables as 7 7 in the original. This version is adapted and extended from an original 8 8 program myproxy_logon by Tom Uram <turam@mcs.anl.gov> … … 26 26 import os 27 27 import socket 28 from M2Crypto import X509, RSA, EVP, m2, BIO, SSL, util29 28 import base64 29 import re 30 import traceback 30 31 from ConfigParser import SafeConfigParser 32 33 from OpenSSL import crypto, SSL 31 34 32 35 from myproxy.utils.openssl import OpenSSLConfig, OpenSSLConfigError … … 43 46 44 47 45 class _HostCheck(SSL.Checker.Checker): 46 """Override SSL.Checker.Checker to allow additional check of MyProxy 47 server identity. If hostname doesn't match, allow match of host's 48 Distinguished Name against MYPROXY_SERVER_DN setting""" 49 48 class MyProxyServerSSLCertVerification(object): 49 """Check MyProxy server identity. If hostname doesn't match, allow match of 50 host's Distinguished Name against MYPROXY_SERVER_DN setting""" 51 DN_LUT = { 52 'commonName': 'CN', 53 'organisationalUnitName': 'OU', 54 'organisation': 'O', 55 'countryName': 'C', 56 'emailAddress': 'EMAILADDRESS', 57 'localityName': 'L', 58 'stateOrProvinceName': 'ST', 59 'streetAddress': 'STREET', 60 'domainComponent': 'DC', 61 'userid': 'UID' 62 } 63 PARSER_RE_STR = '/(%s)=' % '|'.join(DN_LUT.keys() + DN_LUT.values()) 64 PARSER_RE = re.compile(PARSER_RE_STR) 65 50 66 def __init__(self, 51 67 myProxyServerDN=os.environ.get('MYPROXY_SERVER_DN'), … … 65 81 this keyword to '' or None to override and omit the prefix""" 66 82 67 SSL.Checker.Checker.__init__(self, **kw) 68 69 self.myProxyServerDN = myProxyServerDN 83 # Allow for quoted DN 84 myProxyServerDN = myProxyServerDN.strip('"') 85 86 dnFields = self.__class__.PARSER_RE.split(myProxyServerDN) 87 if len(dnFields) < 2: 88 raise MyProxyClientError('Error parsing DN string: "%s"' % 89 myProxyServerDN) 90 91 self.myProxyServerDN = zip(dnFields[1::2], dnFields[2::2]) 92 self.myProxyServerDN.sort() 70 93 self.cnHostPfx = cnHostPfx 71 94 72 95 73 def __call__(self, peerCert, host=None): 74 """Carry out checks on server ID 96 def __call__(self, connection, peerCert, errorStatus, errorDepth, 97 successStatus): 98 """Verify MyProxy server certificate 99 100 @type connection: OpenSSL.SSL.Connection 101 @param connection: SSL connection object 75 102 @type peerCert: basestring 76 @param peerCert: MyProxy server host certificate as M2Crypto.X509.X509103 @param peerCert: MyProxy server host certificate as OpenSSL.crypto.X509 77 104 instance 78 @type host: basestring 79 @param host: name of host to check 105 @type errorStatus: int 106 @param errorStatus: error code to return if verification fails 107 @type errorDepth: int 108 @param errorDepth: 109 @type successStatus: int 110 @param successStatus: 111 @rtype: int 112 @return: status code 80 113 """ 81 82 # Globus host certificate has a "host/" prefix - see explanation in 83 # __init__.__doc__ 84 cnHostPfx = isinstance(self.cnHostPfx, basestring) \ 85 and self.cnHostPfx or '' 86 host = None or cnHostPfx + self.host 87 88 try: 89 SSL.Checker.Checker.__call__(self, peerCert, host=host) 90 91 except SSL.Checker.WrongHost, e: 92 # Try match against DN set from MYPROXY_SERVER_DN / config 93 # file setting 94 peerCertDN = '/'+peerCert.get_subject().as_text().replace(', ','/') 95 96 # If they match drop the exception and return all OK instead 97 if peerCertDN != self.myProxyServerDN: 98 raise 99 100 return True 114 return errorStatus 115 116 if peerCert.has_expired(): 117 # Any expired certificate in the chain should result in an error 118 if log.getEffectiveLevel() == logging.DEBUG: 119 log.debug('Certificate %r in peer certificate chain has ', 120 'expired', peerCert.get_subject()) 121 122 return errorStatus 123 124 elif errorDepth == 0: 125 # Only interested in DN of last certificate in the chain - this must 126 # match the expected MyProxy Server DN setting 127 peerCertDN = peerCert.get_subject().get_components() 128 peerCertDN.sort() 129 130 if peerCertDN == self.myProxyServerDN: 131 return successStatus 132 else: 133 return errorStatus 134 else: 135 return successStatus 136 101 137 102 138 … … 453 489 validation of MyProxy server certificate. 454 490 455 Set to None to make M2Crypto.SSL.Context.load_verify_locations ignore491 Set to None to make OpenSSL.SSL.Context.load_verify_locations ignore 456 492 this parameter 457 493 … … 503 539 not needed in the case of a proxy private key 504 540 """ 505 506 541 # Must be version 3 for MyProxy 507 context = SSL.Context( protocol='sslv3')508 542 context = SSL.Context(SSL.SSLv3_METHOD) 543 509 544 if self.caCertFilePath or self.caCertDir: 510 context.load_verify_locations(cafile=self.caCertFilePath, 511 capath=self.caCertDir) 512 513 # Stop if peer's certificate can't be verified 514 context.set_allow_unknown_ca(False) 515 else: 516 context.set_allow_unknown_ca(True) 545 context.load_verify_locations(self.caCertFilePath, self.caCertDir) 517 546 518 547 if ownerCertFile: 519 548 try: 520 context.load_cert_chain(ownerCertFile, 521 keyfile=ownerKeyFile, 522 callback=lambda *ar, **kw: ownerPassphrase) 523 except Exception, e: 549 context.use_certificate_chain_file(ownerCertFile) 550 def pwdCallback(passphraseMaxLen, 551 promptPassphraseTwice, 552 passphrase): 553 if len(passphrase) > passphraseMaxLen: 554 log.error('Passphrase length %d is greater than the ' 555 'maximum length allowed %d', 556 len(passphrase), passphraseMaxLen) 557 return '' 558 559 return passphrase 560 561 context.set_passwd_cb(pwdCallback, ownerPassphrase) 562 context.use_privatekey_file(ownerKeyFile) 563 except Exception: 524 564 raise MyProxyClientConfigError("Loading certificate " 525 565 "and private key for SSL " 526 566 "connection [also check CA " 527 "certificate settings]: %s" % e) 528 529 # Verify peer's certificate 530 context.set_verify(SSL.verify_peer, 1) 567 "certificate settings]: %s" % 568 traceback.format_exc()) 569 570 # Verify peer's (MyProxy server) certificate 571 context.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, 572 MyProxyServerSSLCertVerification()) 531 573 532 574 … … 534 576 # globus doesn't handle this case, apparently, and instead 535 577 # chokes in proxy delegation code 536 context.set_options( m2.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)578 context.set_options(SSL.OP_DONT_INSERT_EMPTY_FRAGMENTS) 537 579 538 580 # connect to myproxy server 539 conn = SSL.Connection(context, sock =socket.socket())581 conn = SSL.Connection(context, socket.socket()) 540 582 541 583 # Check server host identity - if host doesn't match use explicit 542 584 # 'serverDN' 543 585 # host/<hostname> one 544 hostCheck = _HostCheck(host=self.hostname,545 myProxyServerDN=self.serverDN,546 cnHostPfx=self.serverCNPrefix)547 conn.set_post_connection_check_callback(hostCheck)586 # hostCheck = _HostCheck(host=self.hostname, 587 # myProxyServerDN=self.serverDN, 588 # cnHostPfx=self.serverCNPrefix) 589 # conn.set_post_connection_check_callback(hostCheck) 548 590 549 591 return conn 550 592 551 def _createKey s(self, nBitsForKey=PRIKEY_NBITS):593 def _createKeyPair(self, nBitsForKey=PRIKEY_NBITS): 552 594 """Generate key pair and return as PEM encoded string 553 595 @type nBitsForKey: int … … 557 599 @return: public/private key pair 558 600 """ 559 keyPair = RSA.gen_key(nBitsForKey, 65537L,#m2.RSA_F4,560 callback=lambda *arg, **kw: None)601 keyPair = crypto.PKey() 602 keyPair.generate_key(crypto.TYPE_RSA, nBitsForKey) 561 603 562 604 return keyPair … … 578 620 # Check all required certifcate request DN parameters are set 579 621 # Create certificate request 580 req = X509.Request()622 certReq = crypto.X509Req() 581 623 582 624 # Create public key object 583 pubKey = EVP.PKey() 584 pubKey.assign_rsa(keyPair) 625 certReq.set_pubkey(keyPair) 585 626 586 627 # Add the public key to the request 587 req.set_version(0) 588 req.set_pubkey(pubKey) 589 590 defaultReqDN = self._openSSLConfig.reqDN 591 592 # Set DN 593 x509Name = X509.X509_Name() 594 x509Name.CN = CN 595 596 if defaultReqDN: 597 x509Name.OU = defaultReqDN['OU'] 598 x509Name.O = defaultReqDN['O'] 599 600 req.set_subject_name(x509Name) 601 req.sign(pubKey, messageDigest) 602 603 return req.as_der() 628 certReq.sign(keyPair, messageDigest) 629 630 derCertReq = crypto.dump_certificate_request(crypto.FILETYPE_ASN1, 631 certReq) 632 633 return derCertReq 604 634 605 635 def _deserializeResponse(self, msg, *fieldNames): … … 648 678 649 679 @return list containing the equivalent to the input in PEM format""" 650 pemCerts = [] 680 pemCerts = [] 651 681 dat = inputDat 652 682 653 while dat: 683 while dat: 654 684 # find start of cert, get length 655 685 ind = dat.find('\x30\x82') … … 661 691 # extract der-format cert, and convert to pem 662 692 derCert = dat[ind:ind+len+4] 663 664 x509 = X509.load_cert_der_string(derCert) 665 pemCert = x509.as_pem() 666 693 x509Cert = crypto.load_certificate(crypto.FILETYPE_ASN1, derCert) 694 pemCert = crypto.dump_certificate(crypto.FILETYPE_PEM, x509Cert) 667 695 pemCerts.append(pemCert) 668 696 … … 1009 1037 1010 1038 # Send certificate and private key 1011 certTxt = X509.load_cert(certFile).as_pem()1039 certTxt = open(certFile).read() 1012 1040 keyTxt = open(keyFile).read() 1013 1041 … … 1051 1079 # If no key pair was passed, generate here 1052 1080 if keyPair is None: 1053 keyPair = self._createKey s(nBitsForKey=nBitsForKey)1081 keyPair = self._createKeyPair(nBitsForKey=nBitsForKey) 1054 1082 1055 1083 certReq = self._createCertReq(username, keyPair) 1056 1084 1057 1085 if keyPair is not None: 1058 pemKeyPair = keyPair.as_pem(cipher=None, 1059 callback=util.no_passphrase_callback) 1086 pemKeyPair = crypto.dump_privatekey(crypto.FILETYPE_PEM, keyPair) 1060 1087 1061 1088 # Set-up SSL connection … … 1147 1174 for tries in range(MyProxyClient.MAX_RECV_TRIES): 1148 1175 dat += conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 1149 except SSL.S SLError:1176 except SSL.SysCallError: 1150 1177 # Expect this exception when response content exhausted 1151 1178 pass -
TI12-security/trunk/MyProxyClient/myproxy/test/proxy.crt
r6829 r6837 1 1 -----BEGIN CERTIFICATE----- 2 MIICf DCCAeWgAwIBAgIEFEquwTANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH3 YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjE wOTI5MDNaFw0xMDA04 MjIw MzM0MDNaMDkxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy5 MR IwEAYDVQQDEwkzNDA0Mzg3MjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK6 AoIBAQDySWTRVbS6L5T9UUoTpARD+Jk6H8NFp9Y1TjFWPaKySKa9ep0Gdj0vM83B 7 84Hz0U2R6FgdoaTBFIB2pbugjbm3pl8FIRZKaq7gdO6otmC21Y5XpjVA0s/fgyBG 8 y0iKqG78lSDnaBmVyaCra+2a7kkqsxGwUCMAlnxmZPqsHKXuRozRwTassH+BdUIt 9 A3oUe7M1PQLo3e5hwJWg/7igRHc7kHItaSRUcXeZ7RNnY/DNSU6ww/ovWFZajqpt 10 cCyFpmRZ6nPx2jhxWyKvu8xi+NeKlkwc9mmqcWdJD1iRomQWNJAgG85Bm2oZSlMV 11 xJwMoiEZRxNk1yzBTMlqRW+Tcu69AgMBAAGjITAfMB0GCCsGAQUFBwEOAQH/BA4w 12 DDAKBggrBgEFBQcVATANBgkqhkiG9w0BAQUFAAOBgQDcbaaHn/fP61V97xl+24v/ 13 qFaFG4F415QD6o7ZTV0o1dub1ygXO5FaVBYgDa7bxV72qZw24rxbLs5fxVkKBAWc 14 HYidDjG9FlDcgEC43Y6NSyugvuoPowBx/IPdRe2e/ub0qbZrAm7Xz8mNJKfVXkV8 15 vhj9yMRFrxmIyqFVoSI+QA==2 MIICfTCCAeagAwIBAgIEeVU+zzANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 3 YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjExNTMxMjVaFw0xMDA0 4 MjIwOTM2MjVaMDoxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 5 MRMwEQYDVQQDEwoyMDM1NjI5Nzc1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 6 CgKCAQEA3xsYzad74OW10LnCPO+DRZDbhin7/L1E8XKdPKrmau0Gt1HrpEiXsAa4 7 WwhdCJZ/i/eDwRCNQDvcqQ6O4fBpyl3pk3LOjZOHsZir1ya8pODOjhfQI4hRY1Da 8 R7PIh2woa13qFj0lTlaeYMEtxcC6Mp1q/wdnAzIJtQgXlVlPfB4cnQBFp8q5+8RO 9 ZGe8ie2yHT9mo02ymoKwtWHUJbhLc7LFkV1D9/GdtmfrfyOd8oOleGM9p29omtA8 10 0qnnaj2oqr5XvEFu3ThxSC0Y3QI16QKJCdK+0PyEtj5NZ3OqtYK+GnkgLftKfjUL 11 1c078kBWkcwS042lIMhmgAjM0hD7ZwIDAQABoyEwHzAdBggrBgEFBQcBDgEB/wQO 12 MAwwCgYIKwYBBQUHFQEwDQYJKoZIhvcNAQEFBQADgYEAlyn+pgDT0AuKZpBRdLLN 13 lbNBVlVrOz1tBvBpyuuzhuS8GpAO7AJb8FuvyWNqXPSjSXzzm6CDFX0pXKuaA0VM 14 QZ/gG61o1ky2xhbJfgMxousIyu32YlPfUrmv5xM7pgl3NCuK67fJMC13hjq+RkT1 15 wDMNhY1ngTo1sxV8UnKjcx0= 16 16 -----END CERTIFICATE----- 17 17 -----BEGIN CERTIFICATE----- -
TI12-security/trunk/MyProxyClient/myproxy/test/proxy.key
r6829 r6837 1 1 -----BEGIN RSA PRIVATE KEY----- 2 MAMCAQA= 2 MIIEpQIBAAKCAQEA3xsYzad74OW10LnCPO+DRZDbhin7/L1E8XKdPKrmau0Gt1Hr 3 pEiXsAa4WwhdCJZ/i/eDwRCNQDvcqQ6O4fBpyl3pk3LOjZOHsZir1ya8pODOjhfQ 4 I4hRY1DaR7PIh2woa13qFj0lTlaeYMEtxcC6Mp1q/wdnAzIJtQgXlVlPfB4cnQBF 5 p8q5+8ROZGe8ie2yHT9mo02ymoKwtWHUJbhLc7LFkV1D9/GdtmfrfyOd8oOleGM9 6 p29omtA80qnnaj2oqr5XvEFu3ThxSC0Y3QI16QKJCdK+0PyEtj5NZ3OqtYK+Gnkg 7 LftKfjUL1c078kBWkcwS042lIMhmgAjM0hD7ZwIDAQABAoIBAQDMuCiCTPS24RF8 8 fXdmQsDJzKoi6dN3jpT8mJb/XDIiW2yWOm1nSdUmiIQRxBLaFn7jCDO1rGJwVn2c 9 AufJGrl4H8R8sBQohP82T0kfG0RuZnoimGc8s5E6+K3SrX2MBgrwujRaQ7E/uOuL 10 DLfbhYVVfGz5puk3XWra2poJSPJOh/vigFF9mrKUSMNHr9wfRr9nPCMBLv7MUkwW 11 OsrFCEQpm75myJT82mWiGaKrSz8y4rvrPq2XhalnJ0DeeXFB3wU+h90McG3tL1PT 12 2cKoPfU9yYtTBgxJHwFnrjS87jg8RgExm9PX03VPzErXjHbTpl3z9PGU2asNhCOv 13 +Qjsj/jBAoGBAPnhuzgJqnYEWDzs6D3QM3EorD4I2lhi+6cURqD6C0AbFyQjvXqG 14 3+mD46Vn9Vdymzcf8pXtT0QHmrfZWBoRB/SeuhOr6YblQdH9YaNSXojtixp0S4O5 15 oYDjRiwKpny0oB4c71QXPezoMNELdhb5x8HoZKvBRW8TOFTID029yE3TAoGBAOSR 16 iHekrljQLNyk0DnVZymRQIdkmW1gWyvr7q8rdWzxaxEE+VamO8CtQhUYyk9cuD8m 17 +r/P+cquLcEpKJhpP8DuOte2g5cPtlHnMNnCoAIkCFYLUpU9ynhNO4I0bq+cSnkQ 18 3Fwy6DhquW5efNFCltDUO/Ucp8Xo2ot8Y+sDbBudAoGBAOCEzxgxryStEK9lWeK4 19 YJBLMD/o6m7COUTNNgzLvjISZT+GkWg3KZcCdxeWid3Rzt6/6NKHUFJa1sxcEAoT 20 xWco+x5Tt9cJxJMuLH13tBMqBHN3jKZFs3RAQTuvMhoYnUmRTATtgSmNEtexiaBp 21 O+/hpBqi5IVB6rpaq015uTEbAoGBAODjmGQvsiNMYHeP6hidMe2iLt2IS7VkUxA6 22 CRRtLBJOzstmG3X4BV6kmhpr09KWJeptDdZgaSPUkMw3FOww0jufqmHIAF1HZlnb 23 oSMA7bJthY4zgcO5klcflmeb8zPyEQxhXI+Svw2TZHOFoEW8wOsjhwK6eRCu9Si8 24 8QqwyVO5AoGAf6j/gey0WC0iOKfqCyMLdNo+M89ZVn4IFkhfoi6DwCK267cijame 25 DcLmr0Za8pGkCIxPlOk7Pogjpd1nPNqhjJp0xZlLMZE+e1/T6OMPE4rFvZBwekC7 26 L8tXaFgdgISSCpi6wRCS5omokEY4QpYVtJJmowwLTwnq4GO0Cl6pjG8= 3 27 -----END RSA PRIVATE KEY----- -
TI12-security/trunk/MyProxyClient/myproxy/test/test_myproxyclient.py
r6829 r6837 20 20 from os import path 21 21 22 from M2Crypto import X50922 from OpenSSL import crypto 23 23 24 24 from myproxy.client import CaseSensitiveConfigParser, MyProxyClient … … 102 102 print "proxy credentials:" 103 103 print ''.join(creds) 104 open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:])) 104 open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:])) 105 105 open(proxyKeyFile, 'w').write(creds[1]) 106 106 … … 117 117 118 118 credExists, errorTxt, fields = self.clnt.info( 119 120 121 122 119 thisSection['username'], 120 path.expandvars(thisSection['ownerCertFile']), 121 path.expandvars(thisSection['ownerKeyFile']), 122 ownerPassphrase=ownerPassphrase) 123 123 print "test3Info... " 124 124 print "credExists: %s" % credExists … … 182 182 if fileName.endswith('.0'): 183 183 # test parsing certificate 184 cert = X509.load_cert_string(fileContents, X509.FORMAT_PEM) 184 cert = crypto.load_certificate(crypto.FILETYPE_PEM, 185 fileContents) 185 186 self.assert_(cert) 186 self.assert_(isinstance(cert, X509.X509))187 self.assert_(isinstance(cert, crypto.X509)) 187 188 subj = cert.get_subject() 188 189 self.assert_(subj) -
TI12-security/trunk/MyProxyClient/myproxy/utils/openssl.py
r5048 r6837 10 10 __contact__ = "Philip.Kershaw@stfc.ac.uk" 11 11 __revision__ = '$Id:openssl.py 4643 2008-12-15 14:53:53Z pjkersha $' 12 13 12 import re 14 13 import os 15 14 from ConfigParser import SafeConfigParser 16 from M2Crypto.X509 import X509_Name17 15 18 16 … … 35 33 @cvar _gridCASubDir: sub-directory of globus user for CA settings""" 36 34 37 _certReqDNParamName = X509_Name.nid.keys() 35 _certReqDNParamName = ( 36 'countryName', 37 'C', 38 'stateOrProvinceName', 39 'ST', 40 'localityName', 41 'L' 42 'organizationName', 43 'O', 44 'organizationalUnitName', 45 'OU', 46 'commonName', 47 'CN', 48 'emailAddress' 49 ) 50 38 51 _caDirPat = re.compile('\$dir') 39 52 _gridCASubDir = os.path.join(".globus", "simpleCA") 40 53 41 42 54 def __init__(self, filePath=None, caDir=None): 43 55 """Initial OpenSSL configuration optionally setting a file path to … … 80 92 self._filePath = filePath 81 93 82 83 94 def _getFilePath(self): 84 95 """Get property method … … 90 101 fset=_setFilePath, 91 102 doc="file path for configuration file") 92 93 103 94 104 def setCADir(self, caDir): 95 105 """Set property method … … 118 128 self._caDir = caDir 119 129 120 121 130 def _getCADir(self): 122 131 """Get property method … … 129 138 doc="directory path for CA configuration files") 130 139 131 132 140 def _getReqDN(self): 133 141 """Get property method … … 135 143 @return reqDN: Distinguished Name for certificate request""" 136 144 return self._reqDN 137 138 145 139 146 def _setReqDN(self, reqDN): … … 153 160 154 161 self._reqDN = reqDN 155 156 162 157 163 reqDN = property(fget=_getReqDN, … … 191 197 self._setReqDN() 192 198 193 194 199 def _filtOptVal(self, optVal): 195 200 """For option value, filter out comments and substitute $dir with … … 204 209 else: 205 210 # Leave $dir in place as no CA directory has been set 206 return filtVal 207 211 return filtVal 208 212 209 213 def readfp(self, fp): … … 212 216 parsing errors""" 213 217 raise NotImplementedError("Use read method instead") 214 215 218 216 219 def _setReqDN(self): … … 228 231 except Exception, e: 229 232 raise OpenSSLConfigError('Setting content of Distinguished Name ' 230 'from file "%s": %s' % (self._filePath,e))233 'from file "%s": %s' % (self._filePath, e)) -
TI12-security/trunk/MyProxyClient/setup.py
r6069 r6837 2 2 """Distribution Utilities setup program for MyProxy Client Package 3 3 4 NERC Data 4 NERC DataGrid Project 5 5 """ 6 6 __author__ = "P J Kershaw" 7 7 __date__ = "12/12/08" 8 __copyright__ = "(C) 20 09Science and Technology Facilities Council"8 __copyright__ = "(C) 2010 Science and Technology Facilities Council" 9 9 __license__ = """BSD - See LICENSE file in top-level directory 10 10 … … 27 27 28 28 setup( 29 name = 30 version = '0.9.0',31 description = 32 long_description = 33 author = 34 author_email = 35 maintainer = 36 maintainer_email = 37 url = 38 platforms = 39 install_requires = ['M2Crypto'],40 license = 41 test_suite = 'test',42 packages = 43 package_data = 44 ' test': ['*.cfg', '*.conf', '*.crt', '*.key', 'README']29 name = 'MyProxyClient', 30 version = '0.9.1', 31 description = 'MyProxy Client', 32 long_description = 'Pure Python implementation of MyProxy client interface', 33 author = 'Philip Kershaw', 34 author_email = 'Philip.Kershaw@stfc.ac.uk', 35 maintainer = 'Philip Kershaw', 36 maintainer_email = 'Philip.Kershaw@stfc.ac.uk', 37 url = 'http://proj.badc.rl.ac.uk/ndg/wiki/Security/MyProxyClient', 38 platforms = ['POSIX', 'Linux', 'Windows'], 39 install_requires = ['PyOpenSSL'], 40 license = __license__, 41 test_suite = 'myproxy.test', 42 packages = find_packages(), 43 package_data = { 44 'myproxy.test': ['*.cfg', '*.conf', '*.crt', '*.key', 'README'] 45 45 }, 46 classifiers =[46 classifiers = [ 47 47 'Development Status :: 4 - Beta', 48 48 'Environment :: Console',
Note: See TracChangeset
for help on using the changeset viewer.