blob: 05d5f59f6de7f8e9a17bd409c989f3908128cee3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.core.util;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.security.storage.EncodingUtils;
import org.eclipse.equinox.security.storage.ISecurePreferences;
import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
import org.eclipse.equinox.security.storage.StorageException;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.repositories.core.ILocationService;
import org.eclipse.mylyn.commons.repositories.core.auth.ICredentialsStore;
import org.eclipse.mylyn.internal.commons.repositories.core.LocationService;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.tasks.core.TaskRepository;
/**
* Reads all data from the old "org.eclipse.mylyn.tasks.core" secure store node and writes it to the
* {@link ICredentialsStore} provided by the {@link ILocationService}.
*
* @author Sam Davis
*/
public class TaskRepositorySecureStoreMigrator {
private final ILocationService service = LocationService.getDefault();
public void migrateCredentials(Collection<TaskRepository> repositories) {
if (!SecurePreferencesFactory.getDefault().nodeExists(ITasksCoreConstants.ID_PLUGIN)) {
// check that the old node exists so that we don't create an empty node
return;
}
StatusHandler.log(new Status(IStatus.INFO, ITasksCoreConstants.ID_PLUGIN,
"Migrating task repository credentials from old secure store node.")); //$NON-NLS-1$
Set<String> repositoryUrls = getRepositoryUrls(repositories);
ISecurePreferences oldRootNode = SecurePreferencesFactory.getDefault().node(ITasksCoreConstants.ID_PLUGIN);
for (String child : oldRootNode.childrenNames()) {
ISecurePreferences repositoryNode = oldRootNode.node(child);
String repositoryUrl = EncodingUtils.decodeSlashes(repositoryNode.name());
if (repositoryUrls.contains(repositoryUrl)) {
ICredentialsStore store = service.getCredentialsStore(repositoryUrl);
for (String key : repositoryNode.keys()) {
try {
String value = repositoryNode.get(key, null);
store.put(key, value, repositoryNode.isEncrypted(key));
} catch (StorageException e) {
StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
"Error migrating secure store credentials for " + repositoryUrl, e)); //$NON-NLS-1$
}
}
}
}
}
private Set<String> getRepositoryUrls(Collection<TaskRepository> repositories) {
Set<String> repositoryUrls = new HashSet<String>();
for (TaskRepository taskRepository : repositories) {
repositoryUrls.add(taskRepository.getRepositoryUrl());
}
return repositoryUrls;
}
}