1
2
3
4 import wx
5
6
7
8
9
10
11
12
13 from wx.lib.dialogs import *
14
15 from CertUtils import CertificateRequest
16 from CertSignDialog import CertSignDialog
17 from CertInstallDialog import CertInstallDialog
18
19 import sys
20
23
24 kwds["style"] = wx.DEFAULT_FRAME_STYLE
25 wx.Frame.__init__(self, *args, **kwds)
26 self.mainPanel = wx.Panel(self, -1)
27 self.fullNameLabel = wx.StaticText(self.mainPanel, -1, "Full name")
28 self.fullNameText = wx.TextCtrl(self.mainPanel, -1, "")
29 self.domainLabel = wx.StaticText(self.mainPanel, -1, "Domain")
30 self.domainText = wx.TextCtrl(self.mainPanel, -1, "")
31 self.emailLabel = wx.StaticText(self.mainPanel, -1, "Email")
32 self.emailText = wx.TextCtrl(self.mainPanel, -1, "")
33 self.static_line_1 = wx.StaticLine(self.mainPanel, -1)
34 self.CALabel = wx.StaticText(self.mainPanel, -1, "CA")
35 self.CAText = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_READONLY)
36 self.CAEmailLabel = wx.StaticText(self.mainPanel, -1, "CA Email")
37 self.CAEmailText = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_READONLY)
38 self.static_line_2 = wx.StaticLine(self.mainPanel, -1)
39 self.certRequestFilenameLabel = wx.StaticText(self.mainPanel, -1, "Certificate request")
40 self.certRequestFilenameText = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_READONLY)
41 self.certRequestViewButton = wx.Button(self.mainPanel, -1, "View")
42 self.certFilenameLabel = wx.StaticText(self.mainPanel, -1, "Certificate")
43 self.certFilenameText = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_READONLY)
44 self.privateKeyFilenameLabel = wx.StaticText(self.mainPanel, -1, "Private key")
45 self.privateKeyFilenameText = wx.TextCtrl(self.mainPanel, -1, "", style=wx.TE_READONLY)
46 self.generateCertRequestButton = wx.Button(self.mainPanel, -1, "1. Generate")
47 self.signRequestButton = wx.Button(self.mainPanel, -1, "2. Sign")
48 self.installCertRequestButton = wx.Button(self.mainPanel, -1, "3. Install")
49 self.certRequestCloseButton = wx.Button(self.mainPanel, -1, "Close")
50
51 self.__set_properties()
52 self.__do_layout()
53
54 self.Bind(wx.EVT_BUTTON, self.onGenerateCertRequest, self.generateCertRequestButton)
55 self.Bind(wx.EVT_BUTTON, self.onSignRequest, self.signRequestButton)
56 self.Bind(wx.EVT_BUTTON, self.onInstallCertRequest, self.installCertRequestButton)
57 self.Bind(wx.EVT_BUTTON, self.onCertRequestClose, self.certRequestCloseButton)
58
59
61
62 self.SetTitle("Certificate Request Tool")
63 self.SetSize((573, 346))
64 self.fullNameLabel.SetMinSize((150, -1))
65 self.domainLabel.SetMinSize((150, -1))
66 self.emailLabel.SetMinSize((150, -1))
67 self.CALabel.SetMinSize((150, -1))
68 self.CAText.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
69 self.CAEmailLabel.SetMinSize((150, -1))
70 self.CAEmailText.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
71 self.certRequestFilenameLabel.SetMinSize((150, -1))
72 self.certRequestFilenameText.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
73 self.certRequestViewButton.SetMinSize((-1, 27))
74 self.certFilenameLabel.SetMinSize((150, -1))
75 self.certFilenameText.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
76 self.privateKeyFilenameLabel.SetMinSize((150, -1))
77 self.privateKeyFilenameText.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE))
78 self.signRequestButton.Enable(False)
79 self.installCertRequestButton.Enable(False)
80
81
83
84 mainSizer = wx.BoxSizer(wx.VERTICAL)
85 mainRequestSizer = wx.BoxSizer(wx.VERTICAL)
86 sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
87 sizer_5 = wx.BoxSizer(wx.VERTICAL)
88 sizer_7_copy_copy_copy_copy_copy_copy = wx.BoxSizer(wx.HORIZONTAL)
89 sizer_7_copy_copy_copy_copy_copy = wx.BoxSizer(wx.HORIZONTAL)
90 sizer_7_copy_copy_copy_copy = wx.BoxSizer(wx.HORIZONTAL)
91 sizer_7_copy_copy_copy = wx.BoxSizer(wx.HORIZONTAL)
92 sizer_7_copy_copy = wx.BoxSizer(wx.HORIZONTAL)
93 sizer_7_copy = wx.BoxSizer(wx.HORIZONTAL)
94 sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
95 sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
96 sizer_6.Add(self.fullNameLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
97 sizer_6.Add(self.fullNameText, 1, 0, 0)
98 sizer_5.Add(sizer_6, 0, wx.BOTTOM|wx.EXPAND, 4)
99 sizer_7.Add(self.domainLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
100 sizer_7.Add(self.domainText, 1, 0, 0)
101 sizer_5.Add(sizer_7, 0, wx.BOTTOM|wx.EXPAND, 4)
102 sizer_7_copy.Add(self.emailLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
103 sizer_7_copy.Add(self.emailText, 1, 0, 0)
104 sizer_5.Add(sizer_7_copy, 0, wx.BOTTOM|wx.EXPAND, 4)
105 sizer_5.Add(self.static_line_1, 0, wx.BOTTOM|wx.EXPAND, 4)
106 sizer_7_copy_copy.Add(self.CALabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
107 sizer_7_copy_copy.Add(self.CAText, 1, 0, 0)
108 sizer_5.Add(sizer_7_copy_copy, 0, wx.BOTTOM|wx.EXPAND, 4)
109 sizer_7_copy_copy_copy.Add(self.CAEmailLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
110 sizer_7_copy_copy_copy.Add(self.CAEmailText, 1, 0, 0)
111 sizer_5.Add(sizer_7_copy_copy_copy, 0, wx.BOTTOM|wx.EXPAND, 4)
112 sizer_5.Add(self.static_line_2, 0, wx.BOTTOM|wx.EXPAND, 4)
113 sizer_7_copy_copy_copy_copy.Add(self.certRequestFilenameLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
114 sizer_7_copy_copy_copy_copy.Add(self.certRequestFilenameText, 1, 0, 0)
115 sizer_7_copy_copy_copy_copy.Add(self.certRequestViewButton, 0, 0, 0)
116 sizer_5.Add(sizer_7_copy_copy_copy_copy, 0, wx.BOTTOM|wx.EXPAND, 4)
117 sizer_7_copy_copy_copy_copy_copy.Add(self.certFilenameLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
118 sizer_7_copy_copy_copy_copy_copy.Add(self.certFilenameText, 1, 0, 0)
119 sizer_5.Add(sizer_7_copy_copy_copy_copy_copy, 0, wx.BOTTOM|wx.EXPAND, 4)
120 sizer_7_copy_copy_copy_copy_copy_copy.Add(self.privateKeyFilenameLabel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
121 sizer_7_copy_copy_copy_copy_copy_copy.Add(self.privateKeyFilenameText, 1, 0, 0)
122 sizer_5.Add(sizer_7_copy_copy_copy_copy_copy_copy, 0, wx.BOTTOM|wx.EXPAND, 4)
123 mainRequestSizer.Add(sizer_5, 1, wx.ALL|wx.EXPAND, 4)
124 sizer_4.Add(self.generateCertRequestButton, 0, 0, 0)
125 sizer_4.Add(self.signRequestButton, 0, 0, 0)
126 sizer_4.Add(self.installCertRequestButton, 0, 0, 0)
127 sizer_4.Add(self.certRequestCloseButton, 0, 0, 0)
128 mainRequestSizer.Add(sizer_4, 0, wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 4)
129 self.mainPanel.SetSizer(mainRequestSizer)
130 mainSizer.Add(self.mainPanel, 1, wx.ALL|wx.EXPAND, 5)
131 self.SetSizer(mainSizer)
132 self.Layout()
133 self.Centre()
134
135
136 self.__initApp()
137
139
140 self.__certRequest = CertificateRequest()
141 if not self.__certRequest.isGlobusConfigOk():
142 msg = "Could not find request configuration files:\n"
143 msg += "\n/etc/grid-security/directions or\n"
144 msg += "/etc/grid-security/grid-security.conf or\n"
145 msg += "/etc/grid-security/globus-user-ssl.conf or\n"
146 msg += "\nMake sure you have installed the request configuration packages."
147 wx.MessageBox(msg, "Certificate Request Tool")
148 sys.exit(-1)
149
150 requestList = self.__certRequest.checkPendingRequests()
151
152 if len(requestList)>0:
153 result = wx.MessageBox("Existing request(s) exists. Do you want to open existing request(s)?", "Certificate request", wx.YES_NO)
154 if result == wx.YES:
155 result = wx.GetSingleChoice("Select certificate request", "Certificate request", requestList)
156 if result!=-1:
157 self.__certRequest.loadRequest(result)
158
159 self.__updateControls()
160
162 """
163 Reset controls to initial values.
164 """
165 self.fullNameText.SetValue("")
166 self.domainText.SetValue("")
167 self.emailText.SetValue("")
168
169
171 """
172 Update controls with values from certificate request class instance.
173 """
174 self.CAText.SetValue(self.__certRequest.CAName)
175 self.CAEmailText.SetValue(self.__certRequest.CAEmail)
176 self.fullNameText.SetValue(self.__certRequest.name)
177 self.domainText.SetValue(self.__certRequest.domain)
178 self.emailText.SetValue(self.__certRequest.email)
179 self.certRequestFilenameText.SetValue(self.__certRequest.certRequestFilename)
180 self.certFilenameText.SetValue(self.__certRequest.certFilename)
181 self.privateKeyFilenameText.SetValue(self.__certRequest.keyFilename)
182
183 signingStatus = self.__certRequest.signingStatus()
184
185
186
187 if self.__certRequest.isUnknown():
188 self.generateCertRequestButton.Enable(True)
189 self.signRequestButton.Enable(False)
190 self.installCertRequestButton.Enable(False)
191 elif self.__certRequest.isGenerated():
192 self.generateCertRequestButton.Enable(False)
193 self.signRequestButton.Enable(True)
194 self.installCertRequestButton.Enable(True)
195 elif self.__certRequest.isSent():
196 self.generateCertRequestButton.Enable(False)
197 self.signRequestButton.Enable(True)
198 self.installCertRequestButton.Enable(True)
199 elif self.__certRequest.isSigned():
200 self.generateCertRequestButton.Enable(False)
201 self.signRequestButton.Enable(False)
202 self.installCertRequestButton.Enable(False)
203 else:
204 self.generateCertRequestButton.Enable(True)
205 self.signRequestButton.Enable(False)
206 self.installCertRequestButton.Enable(False)
207
208
210 """
211 Initiate the certificate request process
212 """
213
214
215
216 if self.fullNameText.GetValue() == "":
217 wx.MessageBox("Full name not given.", "Certificate request")
218 return
219
220 if self.domainText.GetValue() == "":
221 wx.MessageBox("Domain not given.", "Certificate request")
222 return
223
224 if self.emailText.GetValue() == "":
225 wx.MessageBox("Email not given.", "Certificate request")
226 return
227
228 self.__certRequest.name = self.fullNameText.GetValue()
229 self.__certRequest.domain = self.domainText.GetValue()
230 self.__certRequest.email = self.emailText.GetValue()
231
232
233
234
235 passphraseOk = False
236
237 while not passphraseOk:
238
239 passphrase = wx.GetPasswordFromUser("Enter private key password", "Certificate request", "")
240
241 if len(passphrase)==0:
242 wx.MessageBox("Certificate request cancelled.", "Certificate request")
243 return
244
245 if len(passphrase)<8:
246 wx.MessageBox("Passphrase too short (<8 characters)", "Certificate request")
247 continue
248
249 passphraseComplexity = self.__certRequest.checkPassphrase(passphrase)
250
251 if passphraseComplexity in ["Blank", "Very Weak", "Weak", "Medium"]:
252 result = wx.MessageBox("Passphrase strength is "+passphraseComplexity+". Enter a different passphrase?", "Certificate request", wx.YES_NO)
253 if result == wx.YES:
254 passphraseOk = False
255 else:
256 passphraseOk = True
257 else:
258 passphraseOk = True
259
260
261 self.__certRequest.generate(passphrase)
262
263 message = "A certificate request has been succesfully generated.\n"
264 message += "The request is stored in %s." % self.__certRequest.certRequestFilename
265
266 wx.MessageBox(message, "Certificate request")
267
268 self.__updateControls()
269
271 """
272 Installed signed certificate
273 """
274
275 if self.__certRequest.isLoaded():
276 if not self.__certRequest.isSigned():
277 certInstallDialog = CertInstallDialog(self)
278 certInstallDialog.certRequest = self.__certRequest
279 certInstallDialog.ShowModal()
280 certInstallDialog.Close()
281 self.__clearControls()
282 self.__updateControls()
283 else:
284 wx.MessageBox("Certificate already signed.")
285 else:
286 wx.MessageBox("No request has been loaded or generated.")
287
289 """
290 Close main window.
291 """
292 self.Close()
293
295 """
296 Show certificate signing dialog.
297 """
298
299 if self.__certRequest.isLoaded():
300 certSignDialog = CertSignDialog(self)
301 certSignDialog.certRequest = self.__certRequest
302 certSignDialog.ShowModal()
303 certSignDialog.Close()
304 self.__updateControls()
305 else:
306 wx.MessageBox("No request has been loaded or generated.")
307
308
309