1 19 20 package com.sslexplorer.install.actions; 21 22 import java.io.File ; 23 import java.io.FileInputStream ; 24 import java.io.FileOutputStream ; 25 import java.io.IOException ; 26 import java.io.InputStream ; 27 import java.net.URLConnection ; 28 import java.util.ArrayList ; 29 import java.util.HashMap ; 30 import java.util.Iterator ; 31 import java.util.List ; 32 import java.util.Map ; 33 import java.util.Map.Entry; 34 35 import javax.servlet.http.HttpServletRequest ; 36 import javax.servlet.http.HttpServletResponse ; 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 105 public class InstallAction extends AbstractInstallWizardAction { 106 final static Log log = LogFactory.getLog(InstallAction.class); 107 108 111 public static final String SSLEXPLORER_SERVER = "sslexplorer-server"; 112 113 private static final long INSTALL_TASK_DELAY = 250; 114 115 123 public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, 124 HttpServletResponse response) throws Exception { 125 126 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 List <WizardActionStatus> actionStatus = new ArrayList <WizardActionStatus>(); 136 ((InstallForm) form).setActionStatus(actionStatus); 137 AbstractWizardSequence seq = getWizardSequence(request); 138 139 143 Map <String , String > extensionsToInstall = getExtensionsToInstall(seq); 144 overallProgress.setMaxValue(7 + extensionsToInstall.size()); 145 task.configured(); 146 147 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 if (forwardToLicense) { 165 fwd = mapping.findForward("licenseAgreement"); 166 } 167 return fwd; 168 } 169 170 public ActionForward installDone(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { 171 return mapping.findForward("display"); 172 } 173 174 175 185 public ActionForward redisplay(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 186 throws Exception { 187 return mapping.findForward("display"); 188 } 189 190 200 public ActionForward exit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 201 throws Exception { 202 request.getSession().removeAttribute(Constants.WIZARD_SEQUENCE); 203 return mapping.findForward("exitInstaller"); 204 } 205 206 216 public ActionForward rerun(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 217 throws Exception { 218 return mapping.findForward("rerun"); 219 } 220 221 private Map <String , String > getExtensionsToInstall(AbstractWizardSequence seq) throws IOException , JDOMException { 222 Map <String , String > extensionsToInstall = new HashMap <String , String >(); 223 ExtensionStore store = ExtensionStore.getInstance(); 224 if (seq.getAttribute(InstallXtraForm.ATTR_INSTALL_XTRA, "false").equals("true")) { 225 ExtensionStoreDescriptor descriptor = store.getDownloadableExtensionStoreDescriptor(true); 229 for (Iterator 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 <WizardActionStatus> actionStatus, AbstractWizardSequence seq) 243 throws InterruptedException { 244 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 <WizardActionStatus> actionStatus, AbstractWizardSequence seq) throws Exception , 254 InterruptedException { 255 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 request, TaskProgressBar overallProgress, TaskProgressBar atomicProgress, 264 List <WizardActionStatus> actionStatus, AbstractWizardSequence seq) 265 throws InterruptedException { 266 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 <WizardActionStatus> actionStatus, AbstractWizardSequence seq) throws InterruptedException { 276 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 request, TaskProgressBar overallProgress, TaskProgressBar atomicProgress, 285 List <WizardActionStatus> actionStatus, AbstractWizardSequence seq) throws InterruptedException { 286 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 { 295 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 request, TaskProgressBar overallProgress, 304 TaskProgressBar atomicProgress, List <WizardActionStatus> actionStatus, 305 AbstractWizardSequence seq, ActionForward fwd, Map <String , String > extensionsToInstall) 306 throws InterruptedException , IOException , JDOMException { 307 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 request) { 315 try { 316 boolean useHTTPProxy = "true".equals(seq.getAttribute(ConfigureProxiesForm.ATTR_USE_HTTP_PROXY, "false")); 320 321 325 360 SessionInfo sessionInfo = getSessionInfo(request); 361 if (useHTTPProxy) { 362 Property.setProperty(new ContextKey("proxies.http.proxyHost"), (String ) seq.getAttribute( 363 ConfigureProxiesForm.ATTR_HTTP_PROXY_HOSTNAME, ""), sessionInfo); 364 Property.setProperty(new ContextKey("proxies.http.proxyPort"), (String ) seq.getAttribute( 365 ConfigureProxiesForm.ATTR_HTTP_PROXY_PORT, ""), sessionInfo); 366 Property.setProperty(new ContextKey("proxies.http.proxyUser"), (String ) seq.getAttribute( 367 ConfigureProxiesForm.ATTR_HTTP_PROXY_USERNAME, ""), sessionInfo); 368 Property.setProperty(new ContextKey("proxies.http.proxyPassword"), (String ) 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 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 { 388 Realm r = UserDatabaseManager.getInstance().getDefaultRealm(); 389 String newDatabase = (String ) seq.getAttribute(SelectUserDatabaseForm.ATTR_USER_DATABASE, ""); 390 Boolean changed = (Boolean ) seq.getAttribute(SelectUserDatabaseForm.ATTR_USER_DATABASE_CHANGED, Boolean.FALSE); 391 UserDatabase defaultUserDatabase = UserDatabaseManager.getInstance().getDefaultUserDatabase(); 392 393 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 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 ) seq.getAttribute(WebServerForm.ATTR_WEB_SERVER_PORT, "443"), seq.getSession()); 416 Property.setProperty(new ContextKey("webServer.protocol"), (String ) seq.getAttribute( 417 WebServerForm.ATTR_WEB_SERVER_PROTOCOL, "https"), seq.getSession()); 418 PropertyList l = PropertyList.createFromTextFieldText((String ) seq 419 .getAttribute(WebServerForm.ATTR_LISTENING_INTERFACES, "")); 420 Property.setProperty(new ContextKey("webServer.bindAddress"), l, seq.getSession()); 421 l = PropertyList.createFromTextFieldText((String ) 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 ) 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 <WizardActionStatus> configureSuperUser(AbstractWizardSequence seq, HttpServletRequest request) { 429 430 List <WizardActionStatus> l = new ArrayList <WizardActionStatus>(); 431 432 String superUser = (String ) seq.getAttribute(ConfigureSuperUserForm.ATTR_SUPER_USER, null); 433 String superUserPassword = (String ) seq.getAttribute(ConfigureSuperUserForm.ATTR_SUPER_USER_PASSWORD, ""); 434 String email = (String ) seq.getAttribute(ConfigureSuperUserForm.ATTR_SUPER_USER_EMAIL, ""); 435 436 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 450 451 user = udb.getAccount(superUser); 452 resetUser(request, user); 453 454 457 if (isSuperUserCreationSupported(udb)) { 458 udb.updateAccount(user, email, user.getFullname(), user.getRoles()); 460 l.add(new WizardActionStatus(WizardActionStatus.COMPLETED_OK, "installation.install.status.superUserUpdated")); 461 } 462 } catch (Exception 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 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 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 request, User user) throws Exception { 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 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 userDatabaseClass = userDatabaseDefinition.getUserDatabaseClass(); 520 boolean isJdbcDatabase = userDatabaseClass.equals(userDatabase.getClass()); 521 return isJdbcDatabase && userDatabase.supportsAccountCreation(); 522 } 523 524 private boolean installExtensions(HttpServletRequest request, List <WizardActionStatus> actionStatus, 525 Map <String , String > extensionsToInstall, ActionForward fwd, TaskProgressBar overallProgress, 526 TaskProgressBar atomicProgress) throws IOException { 527 boolean forwardToLicense = false; 528 int val = 7; 529 request.setAttribute(TaskHttpServletRequest.ATTR_TASK_PROGRESS_HANDLED_EXTERNALLY, Boolean.TRUE); 530 for (Iterator <Entry<String , String >> 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 , String > ext = i.next(); 537 atomicProgress.setNote(new BundleActionMessage("install", "taskProgress.install.atomic.installExtension.note", ext 538 .getKey())); 539 URLConnection con = ExtensionStore.getInstance().downloadExtension(ext.getKey(), ext.getValue()); 540 InputStream 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 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 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 certSource = (String ) 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 alias = InstallAction.SSLEXPLORER_SERVER; 606 String passphrase = (String ) 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 dname = "cn=" 614 + Util.escapeForDNString((String ) seq.getAttribute(CreateNewCertificateForm.ATTR_HOSTNAME, "")) 615 + ", ou=" 616 + Util.escapeForDNString((String ) seq.getAttribute(CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, 617 "")) + ", o=" 618 + Util.escapeForDNString((String ) seq.getAttribute(CreateNewCertificateForm.ATTR_COMPANY, "")) + ", l=" 619 + Util.escapeForDNString((String ) seq.getAttribute(CreateNewCertificateForm.ATTR_CITY, "")) + ", st=" 620 + Util.escapeForDNString((String ) seq.getAttribute(CreateNewCertificateForm.ATTR_STATE, "")) + ", c=" 621 + Util.escapeForDNString((String ) 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 ) seq.getAttribute(CreateNewCertificateForm.ATTR_HOSTNAME, "")).addAttribute( 629 CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, 630 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, "")).addAttribute( 631 CreateNewCertificateForm.ATTR_COMPANY, (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_COMPANY, "")) 632 .addAttribute(CreateNewCertificateForm.ATTR_STATE, 633 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_STATE, "")).addAttribute( 634 CreateNewCertificateForm.ATTR_CITY, 635 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_CITY, "")).addAttribute( 636 CreateNewCertificateForm.ATTR_COUNTRY_CODE, 637 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_COUNTRY_CODE, "")); 638 639 CoreServlet.getServlet().fireCoreEvent(coreEvent); 640 641 } catch (Exception 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 alias = (String ) seq.getAttribute(ImportExistingCertificateForm.ATTR_ALIAS, null); 660 String passphrase = (String ) seq.getAttribute(ImportExistingCertificateForm.ATTR_PASSPHRASE, ""); 661 KeyStoreType keyStoreType = KeyStoreManager.getKeyStoreType((String ) seq.getAttribute( 662 ImportExistingCertificateForm.ATTR_KEY_STORE_TYPE, "")); 663 File uploadedFile = (File ) 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 out = new FileOutputStream (mgr.getKeyStoreFile()); 672 try { 673 FileInputStream in = new FileInputStream (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 ) seq.getAttribute(CreateNewCertificateForm.ATTR_HOSTNAME, "")).addAttribute( 689 CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, 690 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_ORGANISATIONAL_UNIT, "")).addAttribute( 691 CreateNewCertificateForm.ATTR_COMPANY, (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_COMPANY, "")) 692 .addAttribute(CreateNewCertificateForm.ATTR_STATE, 693 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_STATE, "")).addAttribute( 694 CreateNewCertificateForm.ATTR_CITY, 695 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_CITY, "")).addAttribute( 696 CreateNewCertificateForm.ATTR_COUNTRY_CODE, 697 (String ) seq.getAttribute(CreateNewCertificateForm.ATTR_COUNTRY_CODE, "")); 698 699 CoreServlet.getServlet().fireCoreEvent(coreEvent); 700 701 } catch (Exception 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 <WizardActionStatus> actionStatus; 715 716 ExtensionLicenseAgreementCallback(RepositoryStore repStore, ExtensionBundle bundle, List <WizardActionStatus> actionStatus) { 717 this.bundle = bundle; 718 this.repStore = repStore; 719 this.actionStatus = actionStatus; 720 721 } 722 723 public void licenseAccepted(HttpServletRequest 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 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 request) { 737 738 actionStatus.add(new WizardActionStatus(WizardActionStatus.COMPLETED_WITH_ERRORS, 739 "installation.install.status.licenseRejected", bundle.getId())); 740 741 if (ExtensionStore.getInstance().isRepositoryBacked()) { 743 try { 744 repStore.removeEntry(bundle.getId() + ".zip"); 745 } catch (IOException ex) { 746 } 747 } 748 749 if (bundle.getBaseDir().exists()) { 751 Util.delTree(bundle.getBaseDir()); 752 } 753 754 try { 756 ExtensionStore.getInstance().reload(bundle.getId()); 757 } catch (Exception e) { 758 log.error("Failed to reload extension store."); 759 } 760 } 761 } 762 } | Popular Tags |