/* * 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.core; import java.io.File; import java.util.List; import org.eclipse.equinox.security.storage.ISecurePreferences; import org.eclipse.equinox.security.storage.SecurePreferencesFactory; import org.eclipse.equinox.security.storage.StorageException; import com.motorola.studio.android.common.log.StudioLogger; import com.motorola.studio.android.common.utilities.EclipseUtils; import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS; import com.motorolamobility.studio.android.certmanager.ui.model.IKeyStoreEntry; import com.motorolamobility.studio.android.certmanager.ui.model.KeyStoreNode; import com.motorolamobility.studio.android.certmanager.ui.model.SigningAndKeysModelManager; /** * Manages old MOTODEV keystore available at <user_home>\motodevstudio\tools\motodev.keystore * (to keep backward compatibility) */ public class BackwardKeystoreManager { /** * MOTODEV Studio directory. */ private static final String MOTODEV_TOOLS_PATH = File.separator + "motodevstudio" + File.separator + "tools"; //$NON-NLS-1$ //$NON-NLS-2$ /** * Path to user home directory. */ private static final String USER_HOME_PATH = System.getProperty("user.home"); //$NON-NLS-1$ /** * Full path where the files will be. */ private static final String TOOLS_FULL_PATH = USER_HOME_PATH + MOTODEV_TOOLS_PATH; private static final String KS_FILENAME_NEW = TOOLS_FULL_PATH + File.separatorChar + "motodev.keystore"; //$NON-NLS-1$ /** * The constant contains the keysotre type. */ private static final String KS_TYPE = "JCEKS"; //$NON-NLS-1$ /** * The constant contains the keystore password. */ private static final String KS_DEFAULT_PASSWD = "passwd"; //$NON-NLS-1$ /** * The constant contains the keystore password node on secure storage. */ private static final String KS_PASSWD_NODE = "com.motorola.studio.platform.tools.sign.core"; //$NON-NLS-1$ /** * The constant contains the keystore password attribute on secure storage. */ private static final String KS_PASSWD_ATTRIBUTE = "kspasswd"; //$NON-NLS-1$ /* * Removes old keystore password from Eclipse secure preferences (old format) * @return the stored password (before removal), * {@link SigningCoreConstants#KS_DEFAULT_PASSWD} if found node {@link SigningCoreConstants#KS_PASSWD_NODE} but {@link SigningCoreConstants#KS_PASSWD_ATTRIBUTE} does not exist, * null if node {@link SigningCoreConstants#KS_PASSWD_NODE} not found */ private String removeOldKeystorePassword() { String oldPassword = KS_DEFAULT_PASSWD; ISecurePreferences preferences = SecurePreferencesFactory.getDefault(); ISecurePreferences node = null; try { if (preferences.nodeExists(KS_PASSWD_NODE)) { //old format node exists = try to get from attribute node = preferences.node(KS_PASSWD_NODE); try { oldPassword = node.get(KS_PASSWD_ATTRIBUTE, KS_DEFAULT_PASSWD); } catch (StorageException e) { oldPassword = KS_DEFAULT_PASSWD; } node.remove(KS_PASSWD_ATTRIBUTE); preferences.remove(KS_PASSWD_NODE); node.flush(); } else { //node already removed => password is in the new format oldPassword = null; } } catch (Exception e) { StudioLogger.error(BackwardKeystoreManager.class, e.getMessage(), e); } return oldPassword; } /** * Maps old keystore if the <user_home>\motodevstudio\tools\motodev.keystore file exists. */ public void mapOldKeystore() { File motodevKeystoreFile = new File(KS_FILENAME_NEW); if (motodevKeystoreFile.exists()) { //we found backward (old default MOTODEV keystore) => import it KeyStoreNode keyStoreNode = new KeyStoreNode(motodevKeystoreFile, KS_TYPE); try { SigningAndKeysModelManager.getInstance().mapKeyStore(keyStoreNode); //remove old password from keystore String oldPassword = removeOldKeystorePassword(); if (oldPassword != null) { //oldPassword was in old format => add password for keystore in the new format PasswordProvider passwordProvider = new PasswordProvider(keyStoreNode.getFile()); passwordProvider.saveKeyStorePassword(oldPassword); //for each child key (save the same password as the keystore to maintain backward compatibility) List<IKeyStoreEntry> iKeyStoreEntries = keyStoreNode.getEntries(oldPassword); if (iKeyStoreEntries != null) { for (IKeyStoreEntry keyStoreEntry : iKeyStoreEntries) { passwordProvider.savePassword(keyStoreEntry.getAlias(), oldPassword); } } } } catch (Exception e) { //error EclipseUtils.showErrorDialog(CertificateManagerNLS.bind( CertificateManagerNLS.KeystoreManagerView_ErrorImportingBackwardKeystore, motodevKeystoreFile), e.getMessage()); } } } }