source: TI12-security/trunk/python/bin/SimpleCAServer.py @ 930

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/bin/SimpleCAServer.py@930
Revision 930, 4.9 KB checked in by pjkersha, 14 years ago (diff)
  • Added Gatekeeper class.
  • Changed 'cvsID' ref global var in all files to 'reposID'
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/bin/env python
2
3"""NDG Attribute Authority Web Services server interface
4
5NERC Data Grid Project
6
7P J Kershaw 02/08/05
8
9Copyright (C) 2005 CCLRC & NERC
10
11This software may be distributed under the terms of the Q Public License,
12version 1.0 or later.
13"""
14
15reposID = '$Id$'
16
17# Handle socket errors from WS
18import socket 
19
20from ZSI import dispatch
21from NDG.simpleCA_services import reqCertResponseWrapper
22import sys
23from NDG.SimpleCA import *
24
25# Certificate request is a class to encapsulate digital signature handling
26from NDG.CertReq import *
27
28# Command line processing
29import sys
30import os
31import getopt
32
33
34def reqCert(usrCertReq):
35
36    """NDG SimpleCA WS interface for certificate request."""
37   
38    resp = reqCertResponseWrapper()
39    resp._usrCert = ''
40    resp._errMsg = ''
41
42    if debug:
43        import pdb
44        pdb.set_trace()     
45
46    # Check digital signature
47    #
48    # Nb. Ensure string is converted from unicode
49    try:
50        certReq = CertReqParse(str(usrCertReq),
51                               certFilePathList=simpleCA['caCertFile'])
52
53        if not certReq.isValidSig():
54            raise Exception("signature for request message is invalid")
55       
56    except Exception, e:
57        resp._errMsg = "Certificate request: %s" % str(e)
58        return resp
59
60   
61    # Request a new X.509 certificate from the CA
62    try:
63        resp._usrCert = simpleCA.sign(certReq.certReqTxt)
64       
65    except Exception, e:
66        resp._errMsg = "New certificate: %s" % e
67   
68    return resp
69
70
71
72
73def usage():
74    """Describes how to call SimpleCAServer from the command line"""
75    print "usage: %s " % sys.argv[0].split(os.sep)[-1]
76    print """   
77[-h | --help]
78    print usage summary
79   
80[-f <properties file path> | --file=<properties file path>]
81    path to properties file.  If not set, defaults to
82    $NDG_DIR/conf/simpleCAProperties.xml
83   
84[-c <configuration file path> | --conf=<configuration file path>]
85    path to configuration file used to set CA pass-phrase.  If not set,
86    user is prompted for pass-phrase.
87
88[-p <port #> | --port=<port #>
89    port number for server to listen on
90
91[-d | --debug]
92    set to stop in debugger on receipt of WS request
93"""
94
95
96
97
98if __name__ == '__main__':
99
100    try:
101        opts, args = getopt.getopt(sys.argv[1:],
102                                   "hf:c:p:d",
103                                   ["help","file=","conf=","port=","debug"])       
104    except getopt.GetoptError:
105        usage()
106        sys.exit(1)
107
108
109    propFilePath = None
110    configFilePath = None
111    port = 5500 #80 # temporary port for testing
112    debug = False
113   
114    for opt, arg in opts:
115        if opt in ("-h", "--help"):
116            usage()                     
117            sys.exit(0)
118           
119        elif opt in ("-d", "--debug"):
120            debug = True
121           
122        elif opt in ("-f", "--file"):
123            propFilePath = arg
124           
125        elif opt in ("-c", "--conf"):
126            configFilePath = arg
127
128        elif opt in ("-p", "--port"):
129            port = int(arg)
130
131
132    if propFilePath is None:
133        # Check in installation area otherwise assume local directory
134        if 'NDG_DIR' in os.environ:
135            propFileDir = os.path.join(os.environ['NDG_DIR'], "conf")
136        else:
137            propFileDir = "."
138
139        propFilePath = os.path.join(propFileDir, 'simpleCAProperties.xml')
140
141       
142    # Create server instance at start up
143    try:
144        simpleCA = SimpleCA(propFilePath=propFilePath, 
145                            configFilePath=configFilePath)
146       
147    except Exception, e:
148        sys.stderr.write("Initialising SimpleCA: %s\n" % e)
149        sys.exit(1)
150
151
152    # If no configuration file path was provided, read from stdin
153    if configFilePath is None:
154        import getpass
155
156        nTries = 0
157        while nTries < 10:
158            try:
159                simpleCA.caPassPhrase = \
160                    getpass.getpass(prompt="SimpleCA Pass-phrase: ")
161                break
162           
163            except KeyboardInterrupt:
164                sys.exit(1)
165               
166            except SimpleCAPassPhraseError, e:
167                nTries += 1
168                if nTries >= 10:
169                    sys.stderr.write(\
170                        "Invalid Pass-phrase - exiting after 10 attempts\n")
171                    sys.exit(1)
172                else:
173                    sys.stderr.write("Invalid Pass-phrase\n")
174           
175            except Exception, e:
176                # Catch all
177                sys.stderr.write(\
178                    "Error checking Simple CA pass-phrase: %s\n" % e)
179                sys.exit(1)
180                       
181       
182    print "SimpleCA Server listening..."
183    try:
184        dispatch.AsServer(port=port)
185
186    except KeyboardInterrupt:
187        sys.exit(0)
188
189    except socket.error, e:
190        sys.stderr.write("SimpleCA Server socket error: %s\n" % \
191                         e[1])
192        sys.exit(1)
193
194    except Exception, e:
195        sys.stderr.write("SimpleCA Server: %s\n" % e)
196        sys.exit(1)
Note: See TracBrowser for help on using the repository browser.