/* | |
* 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.job; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.core.runtime.SubMonitor; | |
import org.eclipse.core.runtime.jobs.Job; | |
import com.motorola.studio.android.common.log.StudioLogger; | |
import com.motorola.studio.android.common.utilities.EclipseUtils; | |
import com.motorolamobility.studio.android.certmanager.core.PasswordProvider; | |
import com.motorolamobility.studio.android.certmanager.exception.InvalidPasswordException; | |
import com.motorolamobility.studio.android.certmanager.exception.KeyStoreManagerException; | |
import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS; | |
import com.motorolamobility.studio.android.certmanager.ui.composite.NewKeyBlock; | |
import com.motorolamobility.studio.android.certmanager.ui.model.CertificateDetailsInfo; | |
import com.motorolamobility.studio.android.certmanager.ui.model.EntryNode; | |
import com.motorolamobility.studio.android.certmanager.ui.model.IKeyStore; | |
import com.motorolamobility.studio.android.certmanager.ui.model.IKeyStoreEntry; | |
import com.motorolamobility.studio.android.certmanager.ui.wizards.CreateKeyWizard; | |
/** | |
* Creating a key is a time expensive task. | |
* In order to not block the UI while creating the key, a new | |
* job is creating and executed in the background. | |
*/ | |
public class CreateKeyJob extends Job | |
{ | |
private static final String KEY_PASSWORD_SAVED = "Key password saved"; | |
private static final String SAVING_KEY_PASSWORD = "Saving key password"; | |
private static final String KEY_CREATED = "Key created"; | |
private static final String CREATING_KEY = "Creating key"; | |
private static final String GETTING_KEY_INFO = "Getting key info"; | |
private static final int NUMBER_OF_TASKS = 5; | |
/* | |
* Key block, used to retrieve information from the create key wizard. | |
*/ | |
private NewKeyBlock newKeyBlock = null; | |
/* | |
* Information to create key | |
*/ | |
private CertificateDetailsInfo certificateDetailsInfo = null; | |
private IKeyStore keystore = null; | |
private String keyStorePass; | |
public CreateKeyJob(String jobName, NewKeyBlock newKeyBlock, | |
CertificateDetailsInfo certificateDetailsInfo, IKeyStore keystore, String keyStorePass) | |
{ | |
super(jobName); | |
this.certificateDetailsInfo = certificateDetailsInfo; | |
this.newKeyBlock = newKeyBlock; | |
this.keystore = keystore; | |
this.keyStorePass = keyStorePass; | |
if (this.keyStorePass == null) | |
{ | |
try | |
{ | |
this.keyStorePass = keystore.getPasswordProvider().getKeyStorePassword(false); | |
} | |
catch (KeyStoreManagerException e) | |
{ | |
StudioLogger.error("Error while accessing keystore manager. " + e.getMessage()); | |
} | |
} | |
} | |
@Override | |
protected IStatus run(IProgressMonitor monitor) | |
{ | |
SubMonitor subMonitor = SubMonitor.convert(monitor); | |
subMonitor.beginTask(CREATING_KEY, NUMBER_OF_TASKS); | |
StudioLogger.debug(GETTING_KEY_INFO); | |
subMonitor.worked(1); | |
IKeyStoreEntry entryNode = null; | |
try | |
{ | |
StudioLogger.debug(CREATING_KEY); | |
subMonitor.worked(1); | |
String keystorePassword = getKeyStorePassword(); | |
if (keystorePassword != null) | |
{ | |
entryNode = | |
EntryNode.createSelfSignedNode(keystore, keystorePassword, | |
certificateDetailsInfo.getAlias(), certificateDetailsInfo); | |
StudioLogger.debug(KEY_CREATED); | |
subMonitor.worked(1); | |
if (newKeyBlock.needToSaveKeyPassword()) | |
{ | |
StudioLogger.debug(SAVING_KEY_PASSWORD); | |
subMonitor.worked(1); | |
PasswordProvider passwordProvider = new PasswordProvider(keystore.getFile()); | |
passwordProvider.savePassword(entryNode.getAlias(), | |
newKeyBlock.getKeyPassword()); | |
StudioLogger.debug(KEY_PASSWORD_SAVED); | |
subMonitor.worked(1); | |
} | |
} | |
} | |
catch (KeyStoreManagerException e) | |
{ | |
EclipseUtils.showErrorDialog( | |
CertificateManagerNLS.CreateKeyWizard_ErrorCreatingKey_DialogTitle, | |
e.getMessage()); | |
StudioLogger.error(CreateKeyWizard.class, | |
CertificateManagerNLS.CreateKeyWizard_ErrorCreatingKey_DialogTitle, e); | |
} | |
subMonitor.done(); | |
return Status.OK_STATUS; | |
} | |
private String getKeyStorePassword() throws KeyStoreManagerException | |
{ | |
boolean invalidPass = true; | |
String keystorePassword = this.keyStorePass; | |
try | |
{ | |
if (keystorePassword != null) | |
{ | |
this.keystore.isPasswordValid(keystorePassword); | |
invalidPass = false; | |
} | |
} | |
catch (InvalidPasswordException e1) | |
{ | |
invalidPass = true; | |
} | |
while (invalidPass) | |
{ | |
try | |
{ | |
this.keystore.isPasswordValid(keystorePassword); | |
invalidPass = false; | |
} | |
catch (InvalidPasswordException e) | |
{ | |
invalidPass = true; | |
PasswordProvider passwordProvider = new PasswordProvider(this.keystore.getFile()); | |
keystorePassword = passwordProvider.getKeyStorePassword(true, false); | |
if (keystorePassword == null) | |
{ | |
invalidPass = false; | |
} | |
} | |
} | |
return keystorePassword; | |
} | |
public String getCreatedKeyAlias() | |
{ | |
return this.certificateDetailsInfo.getAlias(); | |
} | |
public IKeyStore getKeyStore() | |
{ | |
return this.keystore; | |
} | |
} |