~ubuntu-branches/ubuntu/maverick/pyca/maverick

« back to all changes in this revision

Viewing changes to cgi-bin/cert-query.py

  • Committer: Bazaar Package Importer
  • Author(s): Lars Bahner
  • Date: 2003-12-02 19:39:35 UTC
  • Revision ID: james.westby@ubuntu.com-20031202193935-fzzt289mntvy6a8q
Tags: upstream-20031118
Import upstream version 20031118

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
"""
 
4
cert-query.py
 
5
(c) by Michael Stroeder <michael@stroeder.com>
 
6
 
 
7
CGI-BIN for querying the OpenSSL certificate DB
 
8
Outputs empty input form if queried without parameters.
 
9
"""
 
10
 
 
11
__version__ = '0.6.6'
 
12
 
 
13
import sys, os, string, re, \
 
14
       pycacnf, cgiforms, htmlbase, charset
 
15
 
 
16
from time import time,localtime,strftime,mktime
 
17
 
 
18
from pycacnf import opensslcnf, pyca_section
 
19
 
 
20
from openssl.db import \
 
21
  empty_DN_dict, \
 
22
  DB_type,DB_exp_date,DB_rev_date,DB_serial,DB_file,DB_name,DB_number, \
 
23
  DB_TYPE_REV,DB_TYPE_EXP,DB_TYPE_VAL, \
 
24
  dbtime2tuple,GetEntriesbyDN,SplitDN
 
25
 
 
26
nsBaseUrl    = pyca_section.get('nsBaseUrl','/')
 
27
nsGetCertUrl = pyca_section.get('nsGetCertUrl','get-cert.py')
 
28
nsViewCertUrl = pyca_section.get('nsViewCertUrl','view-cert.py')
 
29
ScriptMethod = pyca_section.get('ScriptMethod','POST')
 
30
HelpUrl      = pyca_section.get('HelpUrl',nsBaseUrl)
 
31
searchkeys = ['CN','Email','L','O','OU','ST','C']
 
32
optionkeys = ['casesensitive','onlyvalid','emailcerts','servercerts']
 
33
 
 
34
##############################################################################
 
35
# haeufig gebrauchte Funktionen
 
36
##############################################################################
 
37
 
 
38
# String der Hilfe-URL zu bestimmtem Parameter zurueckgeben
 
39
def HelpURL(name,text):
 
40
  return '<A HREF="%sns-enroll-help.html#%s">%s</A>' % (HelpUrl,name,charset.iso2html4(text))
 
41
 
 
42
# Ausdrucken eines leeren Eingabeformulars
 
43
def PrintEmptyForm(form,method='POST'):
 
44
 
 
45
  print '<FORM ACTION="%s" METHOD="%s" ACCEPT-CHARSET="iso-8859-1">\n' % \
 
46
        (os.environ.get('SCRIPT_NAME','cert-query.py'),method)
 
47
  print '<TABLE NOBORDER><TR>'
 
48
  for i in optionkeys:
 
49
    print '<TD>%s</TD><TD>%s</TD>' % (form.field[i][0].inputfield(),HelpURL(form.field[i][0].name,form.field[i][0].text))
 
50
  print '</TR>\n</TABLE>\n<TABLE>'
 
51
  for i in searchkeys:
 
52
    print '<TR><TD WIDTH=20%%>%s:</TD><TD>%s</TD></TR>' % (HelpURL(form.field[i][0].name,form.field[i][0].text),form.field[i][0].inputfield())
 
53
  print """</TABLE>
 
54
<INPUT TYPE="submit" VALUE="Search">
 
55
<INPUT TYPE="reset" VALUE="Reset">
 
56
</FORM>"""
 
57
 
 
58
# Ausgabe der Ergebnistabelle
 
59
def PrintFound(form,found,cellpadding=2,width=100):
 
60
 
 
61
  print '<TABLE BORDER CELLPADDING=%d%% WIDTH=%d%%>' % (cellpadding,width)
 
62
  # Tabellenueberschriften ausgeben
 
63
  print '<TR><TH>CA name</TH><TH COLSPAN=3>Serial</TH><TH>valid<BR>until</TH>'
 
64
  for i in searchkeys:
 
65
    print '<TH><FONT SIZE=-1>%s</FONT></TH>' % (form.field[i][0].text)
 
66
  print '</TR>'
 
67
 
 
68
  # Tabelleninhalte
 
69
  for ca_name in found.keys():
 
70
    ca = opensslcnf.getcadata(ca_name)
 
71
    if ca.isservercert():
 
72
      certtype='server'
 
73
    else:
 
74
      certtype='email'
 
75
    for i in found[ca_name]:
 
76
      # Eine Tabellenzeile ausgeben
 
77
      print '<TR><TD>%s</TD>' % (ca_name)
 
78
      if i[DB_type]==DB_TYPE_REV:
 
79
        print '<TD>%s</TD><TD>&nbsp;</TD><TD><A HREF="%s%s/%s/%s?%s">View</A></TD><TD>revoked %s</TD>' % ( \
 
80
          i[DB_serial],
 
81
          nsBaseUrl,nsViewCertUrl,ca_name,certtype,i[DB_serial],
 
82
          strftime('%Y-%m-%d %H:%M',localtime(mktime(dbtime2tuple(i[DB_rev_date]))))
 
83
        )
 
84
      elif i[DB_type]==DB_TYPE_EXP:
 
85
        print '<TD>%s</TD><TD>&nbsp;</TD><TD><A HREF="%s%s/%s/%s?%s">View</A></TD><TD>expired %s</TD>' % ( \
 
86
          i[DB_serial],
 
87
          nsBaseUrl,nsViewCertUrl,ca_name,certtype,i[DB_serial],
 
88
          strftime('%Y-%m-%d %H:%M',localtime(mktime(dbtime2tuple(i[DB_exp_date]))))
 
89
        )
 
90
      elif i[DB_type]==DB_TYPE_VAL:
 
91
        print '<TD>%s</TD><TD><A HREF="%s%s/%s/%s.crt?%s">Load</A></TD><TD><A HREF="%s%s/%s/%s?%s">View</A></TD><TD>%s</TD>' % ( \
 
92
          i[DB_serial],
 
93
          nsBaseUrl,nsGetCertUrl,ca_name,certtype,i[DB_serial],
 
94
          nsBaseUrl,nsViewCertUrl,ca_name,certtype,i[DB_serial],
 
95
          strftime('%Y-%m-%d %H:%M',localtime(mktime(dbtime2tuple(i[DB_exp_date]))))
 
96
        )
 
97
      else:
 
98
        raise ValueError
 
99
      dnfield = SplitDN(i[DB_name])
 
100
      # Spaltenelemente ausgeben
 
101
      for j in searchkeys:
 
102
        if dnfield.has_key(j) and dnfield[j]:
 
103
          if j=="Email":
 
104
            print '<TD><FONT SIZE=-1><A HREF="mailto:%s">%s</A></FONT></TD>' % (dnfield[j],dnfield[j])
 
105
          else:
 
106
            print '<TD><FONT SIZE=-1>%s</FONT></TD>' % charset.asn12html4(dnfield[j])
 
107
        else:
 
108
          # bei leeren Feldern Leerzeichen, damit Tabelle immer Raender hat
 
109
          print '<TD>&nbsp;</TD>'
 
110
      print '</TR>'
 
111
 
 
112
  print '</TABLE>'
 
113
 
 
114
  return
 
115
 
 
116
##############################################################################
 
117
# Hauptprogramm
 
118
##############################################################################
 
119
 
 
120
# form initialisieren
 
121
form = cgiforms.formClass(charset='iso-8859-1')
 
122
 
 
123
# Die gueltigen Inputattribute setzen
 
124
alphanumregex = '[0-9a-zA-Z\344\366\374\304\326\334\337�.*?_ -]*'
 
125
mailadrregex = '[0-9a-zA-Z@.*?=/_ -]*'
 
126
 
 
127
form.add(cgiforms.formCheckboxClass('casesensitive','case sensitive','yes',0))
 
128
form.add(cgiforms.formCheckboxClass('onlyvalid','only valid','yes',1))
 
129
form.add(cgiforms.formCheckboxClass('emailcerts','search e-mail certificates','yes',1))
 
130
form.add(cgiforms.formCheckboxClass('servercerts','search server certificates','yes',0))
 
131
form.add(cgiforms.formInputClass('CN','Common Name',30,alphanumregex))
 
132
form.add(cgiforms.formInputClass('Email','E-Mail',40,mailadrregex))
 
133
form.add(cgiforms.formInputClass('OU','Organizational Unit',30,alphanumregex))
 
134
form.add(cgiforms.formInputClass('O','Organization',30,alphanumregex))
 
135
form.add(cgiforms.formInputClass('L','Location',30,alphanumregex))
 
136
form.add(cgiforms.formInputClass('ST','State / Province',30,alphanumregex))
 
137
form.add(cgiforms.formInputClass('C','Country',2,'[a-zA-Z?]'*2))
 
138
 
 
139
# Schon Parameter vorhanden?
 
140
if not form.contentlength:
 
141
 
 
142
  # Aufruf erfolgte ohne Parameter =>
 
143
  # 0. Schritt: leeres Eingabeformular ausgeben
 
144
 
 
145
  htmlbase.PrintHeader('Search certificates')
 
146
  htmlbase.PrintHeading('Search certificates')
 
147
  print """You can search for certificates in the
 
148
certificate database.<P>Just type in substrings or
 
149
regular expressions as search criteria."""
 
150
  PrintEmptyForm(form)
 
151
  htmlbase.PrintFooter()
 
152
  sys.exit(0)
 
153
 
 
154
# Aufruf erfolgte mit Parametern
 
155
try:
 
156
  form.getparams()
 
157
except cgiforms.formContentLengthException,e:
 
158
  htmlbase.PrintErrorMsg('Content length invalid.')
 
159
  sys.exit(0)
 
160
except cgiforms.formParamNameException,e:
 
161
  htmlbase.PrintErrorMsg('Unknown parameter "%s".' % (e.name))
 
162
  sys.exit(0)
 
163
except cgiforms.formParamContentException,e:
 
164
  htmlbase.PrintErrorMsg('Content of field "%s" has invalid format.' % (e.text))
 
165
  sys.exit(0)
 
166
except cgiforms.formParamStructException,e:
 
167
  htmlbase.PrintErrorMsg('Too many (%d) parameters for field "%s".' % (e.count,e.name))
 
168
  sys.exit(0)
 
169
except cgiforms.formParamLengthException,e:
 
170
  htmlbase.PrintErrorMsg('Content too long. Field "%s" has %d characters.' % (e.text,e.length))
 
171
  sys.exit(0)
 
172
except:
 
173
  htmlbase.PrintErrorMsg('Unknown exception.')
 
174
  sys.exit(0)
 
175
 
 
176
# Parameter sind ok
 
177
 
 
178
# Anfrage zurecht formatieren
 
179
query = empty_DN_dict
 
180
 
 
181
for i in searchkeys:
 
182
  query[i] = form.field[i][0].content
 
183
 
 
184
found ={}
 
185
old_db_filenames = []
 
186
 
 
187
if 'casesensitive' in form.inputkeys:
 
188
  casesensitive = form.field['casesensitive'][0].content=='yes'
 
189
else:
 
190
  casesensitive = 0
 
191
if 'onlyvalid' in form.inputkeys:
 
192
  onlyvalid = form.field['onlyvalid'][0].content=='yes'
 
193
else:
 
194
  onlyvalid = 1
 
195
if 'emailcerts' in form.inputkeys:
 
196
  emailcerts = form.field['emailcerts'][0].content=='yes'
 
197
else:
 
198
  emailcerts = 0
 
199
if 'servercerts' in form.inputkeys:
 
200
  servercerts = form.field['servercerts'][0].content=='yes'
 
201
else:
 
202
  servercerts = 0
 
203
 
 
204
ca_names = opensslcnf.sectionkeys.get('ca',[])
 
205
 
 
206
for ca_name in ca_names:
 
207
 
 
208
  ca = opensslcnf.getcadata(ca_name)
 
209
 
 
210
  # Ist der Zertifikattyp 'S/MIME for client use' ?
 
211
  if (emailcerts and ca.isemailcert()) or \
 
212
     (servercerts and ca.isservercert()):
 
213
 
 
214
    # Stammverzeichnis der CA
 
215
    # Zertifikat-DB schon vorher mal behandelt?
 
216
    if not ca.database in old_db_filenames:
 
217
      old_db_filenames.append(ca.database)
 
218
      if os.path.isfile(ca.database):
 
219
        # Anfrage starten
 
220
        try:
 
221
          found[ca_name] = GetEntriesbyDN(
 
222
            ca.database,
 
223
            query,
 
224
            form.field['casesensitive'][0].content=='yes',
 
225
            form.field['onlyvalid'][0].content=='yes'
 
226
          )
 
227
        except re.error:
 
228
          htmlbase.PrintErrorMsg('Error parsing regular expression.')
 
229
          sys.exit(0)
 
230
 
 
231
# Nix gefunden!
 
232
if not found:
 
233
  htmlbase.PrintErrorMsg('No matching entries found.')
 
234
  sys.exit(0)
 
235
 
 
236
# Ausgabe des Suchergebnisses
 
237
htmlbase.PrintHeader('Search results')
 
238
PrintFound(form,found)
 
239
htmlbase.PrintFooter()
 
240
 
 
241
sys.exit(0)
 
242