KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sslexplorer > install > actions > InstallAction


1 /*
2  * SSL-Explorer
3  *
4  * Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */

19             
20 package com.sslexplorer.install.actions;
21
22 import java.io.File JavaDoc;
23 import java.io.FileInputStream JavaDoc;
24 import java.io.FileOutputStream JavaDoc;
25 import java.io.IOException JavaDoc;
26 import java.io.InputStream JavaDoc;
27 import java.net.URLConnection JavaDoc;
28 import java.util.ArrayList JavaDoc;
29 import java.util.HashMap JavaDoc;
30 import java.util.Iterator JavaDoc;
31 import java.util.List JavaDoc;
32 import java.util.Map JavaDoc;
33 import java.util.Map.Entry;
34
35 import javax.servlet.http.HttpServletRequest JavaDoc;
36 import javax.servlet.http.HttpServletResponse JavaDoc;
37
38 import org.apache.commons.logging.Log;
39 import org.apache.commons.logging.LogFactory;
40 import org.apache.struts.action.ActionForm;
41 import org.apache.struts.action.ActionForward;
42 import org.apache.struts.action.ActionMapping;
43 import org.jdom.JDOMException;
44
45 import com.sslexplorer.boot.ContextKey;
46 import com.sslexplorer.boot.KeyStoreManager;
47 import com.sslexplorer.boot.KeyStoreType;
48 import com.sslexplorer.boot.PropertyClassManager;
49 import com.sslexplorer.boot.PropertyList;
50 import com.sslexplorer.boot.RepositoryFactory;
51 import com.sslexplorer.boot.RepositoryStore;
52 import com.sslexplorer.boot.Util;
53 import com.sslexplorer.core.BundleActionMessage;
54 import com.sslexplorer.core.CoreAttributeConstants;
55 import com.sslexplorer.core.CoreEvent;
56 import com.sslexplorer.core.CoreEventConstants;
57 import com.sslexplorer.core.CoreException;
58 import com.sslexplorer.core.CoreServlet;
59 import com.sslexplorer.core.CoreUtil;
60 import com.sslexplorer.core.GlobalWarning;
61 import com.sslexplorer.core.LicenseAgreement;
62 import com.sslexplorer.core.UserDatabaseManager;
63 import com.sslexplorer.extensions.ExtensionBundle;
64 import com.sslexplorer.extensions.store.ExtensionStore;
65 import com.sslexplorer.extensions.store.ExtensionStoreDescriptor;
66 import com.sslexplorer.install.forms.ConfigureProxiesForm;
67 import com.sslexplorer.install.forms.ConfigureSuperUserForm;
68 import com.sslexplorer.install.forms.CreateNewCertificateForm;
69 import com.sslexplorer.install.forms.ImportExistingCertificateForm;
70 import com.sslexplorer.install.forms.InstallForm;
71 import com.sslexplorer.install.forms.InstallXtraForm;
72 import com.sslexplorer.install.forms.SelectCertificateSourceForm;
73 import com.sslexplorer.install.forms.SelectUserDatabaseForm;
74 import com.sslexplorer.install.forms.SetKeyStorePasswordForm;
75 import com.sslexplorer.install.forms.WebServerForm;
76 import com.sslexplorer.jdbc.JDBCUserDatabase;
77 import com.sslexplorer.policyframework.PolicyDatabaseFactory;
78 import com.sslexplorer.policyframework.PolicyUtil;
79 import com.sslexplorer.properties.Property;
80 import com.sslexplorer.properties.impl.realms.RealmKey;
81 import com.sslexplorer.properties.impl.systemconfig.SystemConfigKey;
82 import com.sslexplorer.realms.Realm;
83 import com.sslexplorer.security.Constants;
84 import com.sslexplorer.security.LogonControllerFactory;
85 import com.sslexplorer.security.PasswordPolicyViolationException;
86 import com.sslexplorer.security.PublicKeyStore;
87 import com.sslexplorer.security.Role;
88 import com.sslexplorer.security.SessionInfo;
89 import com.sslexplorer.security.User;
90 import com.sslexplorer.security.UserDatabase;
91 import com.sslexplorer.security.UserDatabaseDefinition;
92 import com.sslexplorer.setup.LicenseAgreementCallback;
93 import com.sslexplorer.tasks.Task;
94 import com.sslexplorer.tasks.TaskHttpServletRequest;
95 import com.sslexplorer.tasks.TaskInputStream;
96 import com.sslexplorer.tasks.TaskProgressBar;
97 import com.sslexplorer.wizard.AbstractWizardSequence;
98 import com.sslexplorer.wizard.WizardActionStatus;
99
100 /**
101  * Action that performs the final installation actions for the installer wizard.
102  *
103  * @author Brett Smith <a HREF="mailto: brett@3sp.com">&lt;brett@3sp.com&gt;</a>
104  */

105 public class InstallAction extends AbstractInstallWizardAction {
106     final static Log log = LogFactory.getLog(InstallAction.class);
107
108     /**
109      * Default certificate alias for SSL-Explorer web server
110      */

111     public static final String JavaDoc SSLEXPLORER_SERVER = "sslexplorer-server";
112
113     private static final long INSTALL_TASK_DELAY = 250;
114
115     /*
116      * (non-Javadoc)
117      *
118      * @see com.sslexplorer.wizard.actions.AbstractWizardAction#unspecified(org.apache.struts.action.ActionMapping,
119      * org.apache.struts.action.ActionForm,
120      * javax.servlet.http.HttpServletRequest,
121      * javax.servlet.http.HttpServletResponse)
122      */

123     public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest JavaDoc request,
124                                      HttpServletResponse JavaDoc response) throws Exception JavaDoc {
125
126         // Get the task and add some progress bars
127
Task task = (Task) request.getAttribute(TaskHttpServletRequest.ATTR_TASK);
128         TaskProgressBar overallProgress = new TaskProgressBar("overall", 0, 10, 0);
129         task.addProgressBar(overallProgress);
130         overallProgress.setNote(new BundleActionMessage("install", "taskProgress.install.overall.note"));
131         TaskProgressBar atomicProgress = new TaskProgressBar("atomic", 0, 100, 0);
132         task.addProgressBar(atomicProgress);
133
134         // Do the install
135
List JavaDoc<WizardActionStatus> actionStatus = new ArrayList JavaDoc<WizardActionStatus>();
136         ((InstallForm) form).setActionStatus(actionStatus);
137         AbstractWizardSequence seq = getWizardSequence(request);
138
139         /*
140          * Get the list of extensions to install. We do this now so that we have
141          * a max value for the overall progress bar
142          */

143         Map JavaDoc<String JavaDoc, String JavaDoc> extensionsToInstall = getExtensionsToInstall(seq);
144         overallProgress.setMaxValue(7 + extensionsToInstall.size());
145         task.configured();
146
147         /*
148          * Do common stuff and get where to go next. This must be a redirect so
149          * the task monitor works properly
150          */

151         super.unspecified(mapping, form, request, response);
152         ActionForward fwd = mapping.findForward("installDone");
153
154         doConfigureCertificate(overallProgress, atomicProgress, actionStatus, seq);
155         doConfigureUserDatabase(overallProgress, atomicProgress, actionStatus, seq);
156         doConfigureSuperUser(request, overallProgress, atomicProgress, actionStatus, seq);
157         doWebServer(overallProgress, atomicProgress, actionStatus, seq);
158         doConfigureProxies(request, overallProgress, atomicProgress, actionStatus, seq);
159         doCommitProperties(overallProgress, atomicProgress);
160         boolean forwardToLicense = doInstallExtensions(request, overallProgress, atomicProgress, actionStatus, seq, fwd,
161             extensionsToInstall);
162
163         // Finish up and redirect
164
if (forwardToLicense) {
165             fwd = mapping.findForward("licenseAgreement");
166         }
167         return fwd;
168     }
169
170     public ActionForward installDone(ActionMapping mapping, ActionForm form, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) {
171          return mapping.findForward("display");
172     }
173     
174
175     /**
176      * Redisplay.
177      *
178      * @param mapping mapping
179      * @param form form
180      * @param request request
181      * @param response response
182      * @return forward
183      * @throws Exception on any error
184      */

185     public ActionForward redisplay(ActionMapping mapping, ActionForm form, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
186                     throws Exception JavaDoc {
187         return mapping.findForward("display");
188     }
189
190     /**
191      * Exit the installation wizard and shutdown.
192      *
193      * @param mapping mapping
194      * @param form form
195      * @param request request
196      * @param response response
197      * @return forward
198      * @throws Exception on any error
199      */

200     public ActionForward exit(ActionMapping mapping, ActionForm form, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
201                     throws Exception JavaDoc {
202         request.getSession().removeAttribute(Constants.WIZARD_SEQUENCE);
203         return mapping.findForward("exitInstaller");
204     }
205
206     /**
207      * Re-run the installation wizard.
208      *
209      * @param mapping mapping
210      * @param form form
211      * @param request request
212      * @param response response
213      * @return forward
214      * @throws Exception on any error
215      */

216     public ActionForward rerun(ActionMapping mapping, ActionForm form, HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
217                     throws Exception JavaDoc {
218         return mapping.findForward("rerun");
219     }
220
221     private Map JavaDoc<String JavaDoc, String JavaDoc> getExtensionsToInstall(AbstractWizardSequence seq) throws IOException JavaDoc, JDOMException {
222         Map JavaDoc<String JavaDoc, String JavaDoc> extensionsToInstall = new HashMap JavaDoc<String JavaDoc, String JavaDoc>();
223         ExtensionStore store = ExtensionStore.getInstance();
224         if (seq.getAttribute(InstallXtraForm.ATTR_INSTALL_XTRA, "false").equals("true")) {
225             // JB we have no version at this point, so we can only add
226
// extensions with extension bundles.
227
// extensionsToInstall.add(InstallXtraForm.ENTERPRISE_CORE_BUNDLE_ID);
228
ExtensionStoreDescriptor descriptor = store.getDownloadableExtensionStoreDescriptor(true);
229             for (Iterator JavaDoc i = descriptor.getExtensionBundles().iterator(); i.hasNext();) {
230                 ExtensionBundle bundle = (ExtensionBundle) i.next();
231                 if (bundle.getId().startsWith("sslexplorer-enterprise")) {
232                     if (!store.isExtensionLoaded(bundle.getId())) {
233                         extensionsToInstall.put(bundle.getId(), bundle.getVersion().toString());
234                     }
235                 }
236             }
237         }
238         return extensionsToInstall;
239     }
240
241     private void doConfigureCertificate(TaskProgressBar overallProgress, TaskProgressBar atomicProgress,
242                                         List JavaDoc<WizardActionStatus> actionStatus, AbstractWizardSequence seq)
243                     throws InterruptedException JavaDoc {
244         // Certificates (1)
245
overallProgress.setValue(1);
246         atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.certificates.note"));
247         Thread.sleep(INSTALL_TASK_DELAY);
248         actionStatus.add(configureCertificate(seq));
249         Thread.sleep(INSTALL_TASK_DELAY);
250     }
251
252     private void doConfigureUserDatabase(TaskProgressBar overallProgress, TaskProgressBar atomicProgress,
253                                          List JavaDoc<WizardActionStatus> actionStatus, AbstractWizardSequence seq) throws Exception JavaDoc,
254                     InterruptedException JavaDoc {
255         // User database (2)
256
overallProgress.setValue(2);
257         atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.userDatabase.note"));
258         Thread.sleep(INSTALL_TASK_DELAY);
259         actionStatus.add(configureUserDatabase(seq));
260         Thread.sleep(INSTALL_TASK_DELAY);
261     }
262
263     private void doConfigureSuperUser(HttpServletRequest JavaDoc request, TaskProgressBar overallProgress, TaskProgressBar atomicProgress,
264                                       List JavaDoc<WizardActionStatus> actionStatus, AbstractWizardSequence seq)
265                     throws InterruptedException JavaDoc {
266         // Super user (3)
267
overallProgress.setValue(3);
268         atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.superUser.note"));
269         Thread.sleep(INSTALL_TASK_DELAY);
270         actionStatus.addAll(configureSuperUser(seq, request));
271         Thread.sleep(INSTALL_TASK_DELAY);
272     }
273
274     private void doWebServer(TaskProgressBar overallProgress, TaskProgressBar atomicProgress,
275                              List JavaDoc<WizardActionStatus> actionStatus, AbstractWizardSequence seq) throws InterruptedException JavaDoc {
276         // Web server (4)
277
overallProgress.setValue(4);
278         atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.webServer.note"));
279         Thread.sleep(INSTALL_TASK_DELAY);
280         actionStatus.add(webServer(seq));
281         Thread.sleep(INSTALL_TASK_DELAY);
282     }
283
284     private void doConfigureProxies(HttpServletRequest JavaDoc request, TaskProgressBar overallProgress, TaskProgressBar atomicProgress,
285                                     List JavaDoc<WizardActionStatus> actionStatus, AbstractWizardSequence seq) throws InterruptedException JavaDoc {
286         // Proxies (5)
287
overallProgress.setValue(5);
288         atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.proxies.note"));
289         Thread.sleep(INSTALL_TASK_DELAY);
290         actionStatus.add(configureProxies(seq, request));
291         Thread.sleep(INSTALL_TASK_DELAY);
292     }
293
294     private void doCommitProperties(TaskProgressBar overallProgress, TaskProgressBar atomicProgress) throws InterruptedException JavaDoc {
295         // Now commit properties (6)
296
overallProgress.setValue(6);
297         atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.commitProperties.note"));
298         Thread.sleep(INSTALL_TASK_DELAY);
299         PropertyClassManager.getInstance().commit();
300         Thread.sleep(INSTALL_TASK_DELAY);
301     }
302
303     private boolean doInstallExtensions(HttpServletRequest JavaDoc request, TaskProgressBar overallProgress,
304                                         TaskProgressBar atomicProgress, List JavaDoc<WizardActionStatus> actionStatus,
305                                         AbstractWizardSequence seq, ActionForward fwd, Map JavaDoc<String JavaDoc, String JavaDoc> extensionsToInstall)
306                     throws InterruptedException JavaDoc, IOException JavaDoc, JDOMException {
307         // Install the extensions (7)
308
boolean forwardToLicense = installExtensions(request, actionStatus, extensionsToInstall, fwd, overallProgress,
309             atomicProgress);
310         Thread.sleep(INSTALL_TASK_DELAY);
311         return forwardToLicense;
312     }
313
314     WizardActionStatus configureProxies(AbstractWizardSequence seq, HttpServletRequest JavaDoc request) {
315         try {
316             // boolean useSOCKSProxy =
317
// "true".equals(seq.getAttribute(ConfigureProxiesForm.ATTR_USE_SOCKS_PROXY,
318
// "false"));
319
boolean useHTTPProxy = "true".equals(seq.getAttribute(ConfigureProxiesForm.ATTR_USE_HTTP_PROXY, "false"));
320
321             /*
322              * Configure SOCKS proxy. Note Maverick HTTP does not yet support
323              * this but will at some point ;-)
324              */

325             // if (useSOCKSProxy) {
326
// PropertyUtil.getPropertyUtil().setProperty(0, null,
327
// "proxies.socksProxyHost",
328
// (String)
329
// seq.getAttribute(ConfigureProxiesForm.ATTR_SOCKS_PROXY_HOSTNAME,
330
// ""), seq.getSession());
331
// PropertyUtil.getPropertyUtil().setProperty(0, null,
332
// "proxies.socksProxyPort",
333
// (String)
334
// seq.getAttribute(ConfigureProxiesForm.ATTR_SOCKS_PROXY_PORT, ""),
335
// getSessionInfo());
336
// PropertyUtil.getPropertyUtil().setProperty(0, null,
337
// "proxies.socksProxyUser",
338
// (String)
339
// seq.getAttribute(ConfigureProxiesForm.ATTR_SOCKS_PROXY_USERNAME,
340
// ""), getSessionInfo());
341
// PropertyUtil.getPropertyUtil().setProperty(0, null,
342
// "proxies.socksProxyPassword",
343
// (String)
344
// seq.getAttribute(ConfigureProxiesForm.ATTR_SOCKS_PROXY_PASSWORD,
345
// ""), getSessionInfo());
346
// } else {
347
// PropertyUtil.getPropertyUtil().setProperty(0, null,
348
// "proxies.socksProxyHost", "", getSessionInfo());
349
// PropertyUtil.getPropertyUtil().setProperty(0, null,
350
// "proxies.socksProxyPort", "3128", getSessionInfo());
351
// PropertyUtil.getPropertyUtil().setProperty(0, null,
352
// "proxies.socksProxyUser", "", getSessionInfo());
353
// PropertyUtil.getPropertyUtil().setProperty(0, null,
354
// "proxies.socksProxyPassword", "", getSessionInfo());
355
// }
356
/*
357              * Configure HTTP proxy. Supported by both Java API and Maverick
358              * HTTP.
359              */

360             SessionInfo sessionInfo = getSessionInfo(request);
361             if (useHTTPProxy) {
362                 Property.setProperty(new ContextKey("proxies.http.proxyHost"), (String JavaDoc) seq.getAttribute(
363                     ConfigureProxiesForm.ATTR_HTTP_PROXY_HOSTNAME, ""), sessionInfo);
364                 Property.setProperty(new ContextKey("proxies.http.proxyPort"), (String JavaDoc) seq.getAttribute(
365                     ConfigureProxiesForm.ATTR_HTTP_PROXY_PORT, ""), sessionInfo);
366                 Property.setProperty(new ContextKey("proxies.http.proxyUser"), (String JavaDoc) seq.getAttribute(
367                     ConfigureProxiesForm.ATTR_HTTP_PROXY_USERNAME, ""), sessionInfo);
368                 Property.setProperty(new ContextKey("proxies.http.proxyPassword"), (String JavaDoc) seq.getAttribute(
369                     ConfigureProxiesForm.ATTR_HTTP_PROXY_PASSWORD, ""), sessionInfo);
370                 Property.setProperty(new ContextKey("proxies.http.nonProxyHosts"), ((PropertyList) seq.getAttribute(
371                     ConfigureProxiesForm.ATTR_HTTP_NON_PROXY_HOSTS, null)), sessionInfo);
372             } else {
373                 Property.setProperty(new ContextKey("proxies.http.proxyHost"), "", sessionInfo);
374                 Property.setProperty(new ContextKey("proxies.http.proxyPort"), 1080, sessionInfo);
375                 Property.setProperty(new ContextKey("proxies.http.proxyUser"), "", sessionInfo);
376                 Property.setProperty(new ContextKey("proxies.http.proxyPassword"), "", sessionInfo);
377                 Property.setProperty(new ContextKey("proxies.http.nonProxyHosts"), PropertyList.EMPTY_LIST, sessionInfo);
378             }
379             return new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.proxiesConfigured");
380         } catch (Exception JavaDoc e) {
381             log.error("Failed to configure web server.", e);
382             return new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
383                             "installation.install.status.failedToConfigureProxies", e.getMessage());
384         }
385     }
386
387     WizardActionStatus configureUserDatabase(AbstractWizardSequence seq) throws Exception JavaDoc {
388         Realm r = UserDatabaseManager.getInstance().getDefaultRealm();
389         String JavaDoc newDatabase = (String JavaDoc) seq.getAttribute(SelectUserDatabaseForm.ATTR_USER_DATABASE, "");
390         Boolean JavaDoc changed = (Boolean JavaDoc) seq.getAttribute(SelectUserDatabaseForm.ATTR_USER_DATABASE_CHANGED, Boolean.FALSE);
391         UserDatabase defaultUserDatabase = UserDatabaseManager.getInstance().getDefaultUserDatabase();
392
393         // if the defaultUserDatabase couldn't be opened previously then there's
394
// nothing we can do here
395
if (changed.booleanValue() && defaultUserDatabase.isOpen()) {
396             User[] listAllUsers = defaultUserDatabase.listAllUsers("*");
397             for (User user : listAllUsers) {
398                 PolicyDatabaseFactory.getInstance().revokeAllPoliciesFromPrincipal(user);
399             }
400
401             Role[] listAllRoles = defaultUserDatabase.listAllRoles("*");
402             for (Role role : listAllRoles) {
403                 PolicyDatabaseFactory.getInstance().revokeAllPoliciesFromPrincipal(role);
404             }
405
406             // close the old database.
407
defaultUserDatabase.close();
408         }
409         Property.setProperty(new RealmKey("security.userDatabase", r), newDatabase, seq.getSession());
410         return new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.userDatabaseConfigured");
411     }
412
413     WizardActionStatus webServer(AbstractWizardSequence seq) {
414         Property.setProperty(new ContextKey("webServer.port"),
415             (String JavaDoc) seq.getAttribute(WebServerForm.ATTR_WEB_SERVER_PORT, "443"), seq.getSession());
416         Property.setProperty(new ContextKey("webServer.protocol"), (String JavaDoc) seq.getAttribute(
417             WebServerForm.ATTR_WEB_SERVER_PROTOCOL, "https"), seq.getSession());
418         PropertyList l = PropertyList.createFromTextFieldText((String JavaDoc) seq
419                         .getAttribute(WebServerForm.ATTR_LISTENING_INTERFACES, ""));
420         Property.setProperty(new ContextKey("webServer.bindAddress"), l, seq.getSession());
421         l = PropertyList.createFromTextFieldText((String JavaDoc) seq.getAttribute(WebServerForm.ATTR_VALID_EXTERNAL_HOSTS, ""));
422         Property.setProperty(new SystemConfigKey("webServer.validExternalHostnames"), l, seq.getSession());
423         Property.setProperty(new SystemConfigKey("webServer.invalidHostnameAction"), (String JavaDoc) seq.getAttribute(
424             WebServerForm.ATTR_INVALID_HOSTNAME_ACTION, "none"), seq.getSession());
425         return new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.webServerConfigured");
426     }
427
428     List JavaDoc<WizardActionStatus> configureSuperUser(AbstractWizardSequence seq, HttpServletRequest JavaDoc request) {
429
430         List JavaDoc<WizardActionStatus> l = new ArrayList JavaDoc<WizardActionStatus>();
431
432         String JavaDoc superUser = (String JavaDoc) seq.getAttribute(ConfigureSuperUserForm.ATTR_SUPER_USER, null);
433         String JavaDoc superUserPassword = (String JavaDoc) seq.getAttribute(ConfigureSuperUserForm.ATTR_SUPER_USER_PASSWORD, "");
434         String JavaDoc email = (String JavaDoc) seq.getAttribute(ConfigureSuperUserForm.ATTR_SUPER_USER_EMAIL, "");
435
436         // TODO implement as special policy instead of default administrator
437
try {
438             UserDatabase udb = (UserDatabase) seq.getAttribute(SelectUserDatabaseForm.ATTR_USER_DATABASE_INSTANCE, null);
439             if (!udb.isOpen()) {
440                 udb.open(CoreServlet.getServlet(), udb.getRealm());
441             }
442
443             User user = null;
444             try {
445                 /*
446                  * Try and get the super user. If an exception occurs we assume
447                  * it doesn't exist and so try to create, otherwise it is
448                  * updated
449                  */

450
451                 user = udb.getAccount(superUser);
452                 resetUser(request, user);
453
454                 /*
455                  * The super exists so just update it
456                  */

457                 if (isSuperUserCreationSupported(udb)) {
458                     // (Probably) Already exists, just update
459
udb.updateAccount(user, email, user.getFullname(), user.getRoles());
460                     l.add(new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.superUserUpdated"));
461                 }
462             } catch (Exception JavaDoc unfe) {
463                 if (isSuperUserCreationSupported(udb)) {
464                     udb.createAccount(superUser, superUserPassword, email, "Super User", new Role[] {});
465                     l.add(new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.superUserCreated"));
466                     user = udb.getAccount(superUser);
467                     resetUser(request, user);
468                 }
469             }
470
471             Property.setProperty(new RealmKey("security.administrators", user.getRealm().getResourceId()), superUser, seq
472                             .getSession());
473
474             /*
475              * Set the super user password
476              */

477             if (udb.supportsPasswordChange() && !superUserPassword.equals("")) {
478                 udb.changePassword(superUser, "", superUserPassword, false);
479                 l.add(new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.superUserPasswordSet"));
480             }
481         } catch (PasswordPolicyViolationException e) {
482             log.error("Failed to configure super user.", e);
483             l.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
484                             "installation.install.status.failedToInstallExtension.password"));
485         } catch (Exception JavaDoc e) {
486             log.error("Failed to configure super user.", e);
487             l.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
488                             "installation.install.status.failedToConfigureSuperUser", e.getMessage()));
489         }
490         return l;
491     }
492
493     private void resetUser(HttpServletRequest JavaDoc request, User user) throws Exception JavaDoc {
494         boolean disabled = !PolicyUtil.isEnabled(user);
495         SessionInfo session = this.getSessionInfo(request);
496         if (disabled) {
497             if (log.isInfoEnabled())
498                 log.info("Re-enabling user " + user.getPrincipalName());
499             PolicyUtil.setEnabled(user, true, null, session);
500         }
501         LogonControllerFactory.getInstance().unlockUser(user.getPrincipalName());
502
503         /**
504          * LDP - Reset the private key for this user, if they have lost their
505          * password this is the only way to reset but they will be asked for
506          * their old password if we do not reset this.
507          */

508         if (PublicKeyStore.getInstance().hasPrivateKey(user.getPrincipalName())) {
509             PublicKeyStore.getInstance().removeKeys(user.getPrincipalName());
510         }
511     }
512
513     private boolean isSuperUserCreationSupported(UserDatabase userDatabase) {
514         UserDatabaseDefinition userDatabaseDefinition = UserDatabaseManager.getInstance().getUserDatabaseDefinition(
515             JDBCUserDatabase.DATABASE_TYPE);
516         if (userDatabaseDefinition == null) {
517             return false;
518         }
519         Class JavaDoc userDatabaseClass = userDatabaseDefinition.getUserDatabaseClass();
520         boolean isJdbcDatabase = userDatabaseClass.equals(userDatabase.getClass());
521         return isJdbcDatabase && userDatabase.supportsAccountCreation();
522     }
523
524     private boolean installExtensions(HttpServletRequest JavaDoc request, List JavaDoc<WizardActionStatus> actionStatus,
525                                       Map JavaDoc<String JavaDoc, String JavaDoc> extensionsToInstall, ActionForward fwd, TaskProgressBar overallProgress,
526                                       TaskProgressBar atomicProgress) throws IOException JavaDoc {
527         boolean forwardToLicense = false;
528         int val = 7;
529         request.setAttribute(TaskHttpServletRequest.ATTR_TASK_PROGRESS_HANDLED_EXTERNALLY, Boolean.TRUE);
530         for (Iterator JavaDoc<Entry<String JavaDoc, String JavaDoc>> i = extensionsToInstall.entrySet().iterator(); i.hasNext();) {
531             overallProgress.setValue(val++);
532             atomicProgress.setValue(0);
533             atomicProgress.setMinValue(0);
534             atomicProgress.setMaxValue(100);
535             atomicProgress.setValue(100);
536             Entry<String JavaDoc, String JavaDoc> ext = i.next();
537             atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.installExtension.note", ext
538                             .getKey()));
539             URLConnection JavaDoc con = ExtensionStore.getInstance().downloadExtension(ext.getKey(), ext.getValue());
540             InputStream JavaDoc in = null;
541             try {
542                 atomicProgress.setMaxValue(con.getContentLength());
543                 atomicProgress.setValue(0);
544                 ExtensionBundle bundle = null;
545                 in = con.getInputStream();
546                 in = new TaskInputStream(atomicProgress, in);
547                 if (ExtensionStore.getInstance().isExtensionBundleLoaded(ext.getKey())) {
548                     bundle = ExtensionStore.getInstance().updateExtension(ext.getKey(), in, request, con.getContentLength());
549                     if (bundle.isContainsPlugin())
550                         CoreUtil.addMultipleGlobalWarning(GlobalWarning.MANAGEMENT_USERS, new BundleActionMessage("extensions",
551                                         "extensionStore.message.extensionUpdatedRestartRequired"));
552                 } else {
553                     bundle = ExtensionStore.getInstance().installExtensionFromStore(ext.getKey(), in, request, con.getContentLength());
554                     File JavaDoc licenseFile = bundle.getLicenseFile();
555                     final RepositoryStore repStore = RepositoryFactory.getRepository().getStore(ExtensionStore.ARCHIVE_STORE);
556                     if (licenseFile != null && licenseFile.exists()) {
557                         forwardToLicense = true;
558                         CoreUtil.requestLicenseAgreement(request.getSession(), new LicenseAgreement(bundle.getName(), licenseFile,
559                                         new ExtensionLicenseAgreementCallback(repStore, bundle, actionStatus), fwd));
560                     } else {
561                         ExtensionStore.getInstance().postInstallExtension(bundle, request);
562                         actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_OK,
563                                         "installation.install.status.installedExtension", bundle.getName(), bundle.getId()));
564                     }
565                 }
566
567             } catch (CoreException ce) {
568                 log.error("Failed to install extension " + ext.getKey() + ".", ce);
569                 actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
570                                 "installation.install.status.failedToInstallExtension", ext.getKey(), ce
571                                                 .getLocalizedMessage(request.getSession())));
572             } catch (Exception JavaDoc e) {
573                 log.error("Failed to install extension " + ext.getKey() + ".", e);
574                 actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
575                                 "installation.install.status.failedToInstallExtension", ext.getKey(), e.getMessage()));
576             } finally {
577                 Util.closeStream(in);
578             }
579
580         }
581         return forwardToLicense;
582     }
583
584     WizardActionStatus configureCertificate(AbstractWizardSequence seq) {
585         String JavaDoc certSource = (String JavaDoc) seq.getAttribute(SelectCertificateSourceForm.ATTR_CERTIFICATE_SOURCE, "");
586         if (certSource.equals(SelectCertificateSourceForm.CREATE_NEW_CERTIFICATE)) {
587             return createNewCertificate(seq);
588         } else if (certSource.equals(SelectCertificateSourceForm.IMPORT_EXISTING_CERTIFICATE)) {
589             return importCertificate(seq);
590         } else {
591             return new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.usedCurrentCertificate");
592         }
593     }
594
595     WizardActionStatus createNewCertificate(AbstractWizardSequence seq) {
596
597         try {
598
599             KeyStoreManager mgr = KeyStoreManager.getInstance(KeyStoreManager.DEFAULT_KEY_STORE);
600
601             if (mgr.isKeyStoreExists()) {
602                 mgr.deleteKeyStore();
603             }
604
605             String JavaDoc alias = InstallAction.SSLEXPLORER_SERVER;
606             String JavaDoc passphrase = (String JavaDoc) seq.getAttribute(SetKeyStorePasswordForm.ATTR_KEY_STORE_PASSWORD, null);
607             if (passphrase != null && !passphrase.equals("")) {
608                 Property.setProperty(new ContextKey("webServer.keystore.sslCertificate.password"), passphrase, seq.getSession());
609                 mgr.setStorePassword(passphrase);
610             }
611
612             mgr.createKeyStore();
613             String JavaDoc dname = "cn="
614                             + Util.escapeForDNString((String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_HOSTNAME, ""))
615                             + ", ou="
616                             + Util.escapeForDNString((String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT,
617                                 "")) + ", o="
618                             + Util.escapeForDNString((String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_COMPANY, "")) + ", l="
619                             + Util.escapeForDNString((String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_CITY, "")) + ", st="
620                             + Util.escapeForDNString((String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_STATE, "")) + ", c="
621                             + Util.escapeForDNString((String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_COUNTRY_CODE, ""));
622             mgr.createKey(alias, dname);
623             Property.setProperty(new ContextKey("webServer.keyStoreType"), KeyStoreManager.TYPE_JKS.getName(), null);
624             Property.setProperty(new ContextKey("webServer.alias"), alias, null);
625
626             CoreEvent coreEvent = new CoreEvent(this, CoreEventConstants.KEYSTORE_CERTIFICATE_CREATED, alias, null).addAttribute(
627                 CoreAttributeConstants.EVENT_ATTR_CERTIFICATE_ALIAS, alias).addAttribute(CreateNewCertificateForm.ATTR_HOSTNAME,
628                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_HOSTNAME, "")).addAttribute(
629                 CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT,
630                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, "")).addAttribute(
631                 CreateNewCertificateForm.ATTR_COMPANY, (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_COMPANY, ""))
632                             .addAttribute(CreateNewCertificateForm.ATTR_STATE,
633                                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_STATE, "")).addAttribute(
634                                 CreateNewCertificateForm.ATTR_CITY,
635                                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_CITY, "")).addAttribute(
636                                 CreateNewCertificateForm.ATTR_COUNTRY_CODE,
637                                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_COUNTRY_CODE, ""));
638
639             CoreServlet.getServlet().fireCoreEvent(coreEvent);
640
641         } catch (Exception JavaDoc e) {
642             log.error("Failed to create keystore / certificate.", e);
643             return new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
644                             "installation.install.status.failedToCreateNewCertificate", e.getMessage());
645         }
646         return new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.newCertificateCreated");
647     }
648
649     WizardActionStatus importCertificate(AbstractWizardSequence seq) {
650
651         try {
652
653             KeyStoreManager mgr = KeyStoreManager.getInstance(KeyStoreManager.DEFAULT_KEY_STORE);
654
655             if (mgr.isKeyStoreExists()) {
656                 mgr.deleteKeyStore();
657             }
658
659             String JavaDoc alias = (String JavaDoc) seq.getAttribute(ImportExistingCertificateForm.ATTR_ALIAS, null);
660             String JavaDoc passphrase = (String JavaDoc) seq.getAttribute(ImportExistingCertificateForm.ATTR_PASSPHRASE, "");
661             KeyStoreType keyStoreType = KeyStoreManager.getKeyStoreType((String JavaDoc) seq.getAttribute(
662                 ImportExistingCertificateForm.ATTR_KEY_STORE_TYPE, ""));
663             File JavaDoc uploadedFile = (File JavaDoc) seq.getAttribute(ImportExistingCertificateForm.ATTR_UPLOADED_FILE, null);
664
665             mgr.setStorePassword(passphrase);
666
667             if (keyStoreType.equals(KeyStoreManager.TYPE_PKCS12)) {
668                 mgr.setKeyStoreType(KeyStoreManager.TYPE_JKS);
669                 alias = mgr.importPKCS12Key(uploadedFile, passphrase, alias, SSLEXPLORER_SERVER);
670             } else {
671                 FileOutputStream JavaDoc out = new FileOutputStream JavaDoc(mgr.getKeyStoreFile());
672                 try {
673                     FileInputStream JavaDoc in = new FileInputStream JavaDoc(uploadedFile);
674                     try {
675                         Util.copy(in, out);
676                     } finally {
677                         in.close();
678                     }
679                 } finally {
680                     out.close();
681                 }
682             }
683
684             Property.setProperty(new ContextKey("webServer.alias"), alias, null);
685             Property.setProperty(new ContextKey("webServer.keystore.sslCertificate.password"), passphrase, null);
686             CoreEvent coreEvent = new CoreEvent(this, CoreEventConstants.KEYSTORE_IMPORTED, null, null).addAttribute(
687                 CoreAttributeConstants.EVENT_ATTR_CERTIFICATE_ALIAS, alias).addAttribute(CreateNewCertificateForm.ATTR_HOSTNAME,
688                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_HOSTNAME, "")).addAttribute(
689                 CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT,
690                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, "")).addAttribute(
691                 CreateNewCertificateForm.ATTR_COMPANY, (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_COMPANY, ""))
692                             .addAttribute(CreateNewCertificateForm.ATTR_STATE,
693                                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_STATE, "")).addAttribute(
694                                 CreateNewCertificateForm.ATTR_CITY,
695                                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_CITY, "")).addAttribute(
696                                 CreateNewCertificateForm.ATTR_COUNTRY_CODE,
697                                 (String JavaDoc) seq.getAttribute(CreateNewCertificateForm.ATTR_COUNTRY_CODE, ""));
698
699             CoreServlet.getServlet().fireCoreEvent(coreEvent);
700
701         } catch (Exception JavaDoc e) {
702             log.error("Failed to create keystore / certificate.", e);
703             return new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
704                             "installation.install.status.failedToImportCertificate", e.getMessage());
705         } finally {
706         }
707         return new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.certificateImported");
708     }
709
710     class ExtensionLicenseAgreementCallback implements LicenseAgreementCallback {
711
712         private ExtensionBundle bundle;
713         private RepositoryStore repStore;
714         private List JavaDoc<WizardActionStatus> actionStatus;
715
716         ExtensionLicenseAgreementCallback(RepositoryStore repStore, ExtensionBundle bundle, List JavaDoc<WizardActionStatus> actionStatus) {
717             this.bundle = bundle;
718             this.repStore = repStore;
719             this.actionStatus = actionStatus;
720
721         }
722
723         public void licenseAccepted(HttpServletRequest JavaDoc request) {
724             try {
725                 ExtensionStore.getInstance().postInstallExtension(bundle, request);
726                 actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_OK,
727                                 "installation.install.status.installedExtension", bundle.getName(), bundle.getId()));
728             } catch (Exception JavaDoc e) {
729                 log.error("Failed to install extension " + bundle.getId() + ".", e);
730                 actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
731                                 "installation.install.status.failedToInstallExtension", bundle.getId(), e.getMessage()));
732
733             }
734         }
735
736         public void licenseRejected(HttpServletRequest JavaDoc request) {
737
738             actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS,
739                             "installation.install.status.licenseRejected", bundle.getId()));
740
741             // Remove the repository entry if it is in use
742
if (ExtensionStore.getInstance().isRepositoryBacked()) {
743                 try {
744                     repStore.removeEntry(bundle.getId() + ".zip");
745                 } catch (IOException JavaDoc ex) {
746                 }
747             }
748
749             // Remove the expanded bundle
750
if (bundle.getBaseDir().exists()) {
751                 Util.delTree(bundle.getBaseDir());
752             }
753
754             // Reload the extension store
755
try {
756                 ExtensionStore.getInstance().reload(bundle.getId());
757             } catch (Exception JavaDoc e) {
758                 log.error("Failed to reload extension store.");
759             }
760         }
761     }
762 }
Popular Tags