/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorolamobility.studio.android.certmanager.command; import java.security.KeyStore; import java.security.KeyStore.Entry; import java.security.UnrecoverableKeyException; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.jface.window.Window; import org.eclipse.ui.PlatformUI; import com.motorola.studio.android.common.utilities.EclipseUtils; import com.motorola.studio.android.common.utilities.ui.PasswordInputDialog; import com.motorolamobility.studio.android.certmanager.core.KeyStoreUtils; import com.motorolamobility.studio.android.certmanager.core.PasswordProvider; import com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEvent.EventType; import com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEventManager; import com.motorolamobility.studio.android.certmanager.exception.InvalidPasswordException; import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS; import com.motorolamobility.studio.android.certmanager.ui.model.EntryNode; import com.motorolamobility.studio.android.certmanager.ui.model.ITreeNode; import com.motorolamobility.studio.android.certmanager.ui.model.KeyStoreNode; import com.motorolamobility.studio.android.certmanager.views.KeystoreManagerView; /** * This class changes the password of a key/certificate from the tree of the {@link KeystoreManagerView} * */ public class ChangePasswordKeyHandler extends AbstractHandler2 implements IHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { //retrieves the first element of the selection //note that this command should be enabled only when selection.count == 1. ITreeNode entry = getSelection().get(0); if (entry instanceof EntryNode) { //must enter old and new password KeyStoreNode keyStoreNode = (KeyStoreNode) entry.getParent(); PasswordProvider passwordProvider = new PasswordProvider(keyStoreNode.getFile()); EntryNode entryNode = (EntryNode) entry; PasswordInputDialog passwordInputDialog = null; boolean cancelledOrChangedPassword = false; do { passwordInputDialog = new PasswordInputDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), CertificateManagerNLS.PasswordInput_EnterOldKeyPasssword_Message, true, null, EntryNode.KEY_PASSWORD_MIN_SIZE); if (passwordInputDialog.open() == Window.OK) { String newPassword = passwordInputDialog.getNewPassword(); String oldPassword = passwordInputDialog.getOldPassword(); if ((newPassword != null) && (oldPassword != null)) { try { Entry keyEntry = entryNode.getKeyEntry(oldPassword); if (keyEntry != null) { boolean tryAgain = false; boolean useSavedPass = true; String keystorePassword = null; KeyStore keyStore = null; do { if (tryAgain) { useSavedPass = false; } keystorePassword = passwordProvider .getKeyStorePassword(true, useSavedPass); tryAgain = false; if (keystorePassword != null) { try { if (keyStoreNode.isPasswordValid(keystorePassword)) { keyStore = keyStoreNode.getKeyStore(keystorePassword); } else { tryAgain = true; } } catch (InvalidPasswordException e) { tryAgain = true; } } } while (tryAgain); if (keyStore != null) { KeyStoreUtils.changeEntryPassword(keyStore, keystorePassword.toCharArray(), keyStoreNode.getFile(), entryNode.getAlias(), keyEntry, newPassword.toCharArray()); //delete old save password - if there is one if (passwordProvider.isPasswordSaved(entryNode.getAlias())) { passwordProvider.deleteSavedPassword(entryNode.getAlias()); } if (passwordInputDialog.needToStorePassword()) { //store new password at provider passwordProvider.savePassword(entryNode.getAlias(), newPassword); } //success cancelledOrChangedPassword = true; EclipseUtils.showInformationDialog( CertificateManagerNLS.PasswordChanged_Info_Title, CertificateManagerNLS.PasswordChanged_KeyInfo_Message); //update tooltip and image KeyStoreModelEventManager.getInstance().fireEvent(entryNode, EventType.UPDATE); } } } catch (UnrecoverableKeyException e) { //error - notify on screen cancelledOrChangedPassword = false; EclipseUtils .showErrorDialog( CertificateManagerNLS.ChangePasswordKeyHandler_Error_WrongOldKeyPassword, CertificateManagerNLS.ChangePasswordKeyHandler_Wrong_Key_Password); } catch (Exception e) { //error - notify on screen cancelledOrChangedPassword = false; EclipseUtils .showErrorDialog( CertificateManagerNLS.ChangePasswordKeyHandler_Error_WrongOldKeyPassword, e.getMessage()); } } } else { //user cancelled screen cancelledOrChangedPassword = true; } } while (!cancelledOrChangedPassword); } return null; } }