### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.ui Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF,v retrieving revision 1.415 diff -u -r1.415 MANIFEST.MF --- META-INF/MANIFEST.MF 7 Apr 2010 20:54:55 -0000 1.415 +++ META-INF/MANIFEST.MF 18 May 2010 10:56:10 -0000 @@ -10,6 +10,7 @@ org.eclipse.core.expressions, org.eclipse.core.net, org.eclipse.core.resources, + org.eclipse.equinox.security, org.eclipse.jface.text, org.eclipse.ui.browser, org.eclipse.ui.editors, Index: src/org/eclipse/mylyn/internal/tasks/ui/messages.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties,v retrieving revision 1.17 diff -u -r1.17 messages.properties --- src/org/eclipse/mylyn/internal/tasks/ui/messages.properties 10 Apr 2010 10:34:56 -0000 1.17 +++ src/org/eclipse/mylyn/internal/tasks/ui/messages.properties 18 May 2010 10:56:10 -0000 @@ -84,3 +84,6 @@ TaskHyperlink_Open_Task_X_in_X=Open Task {0} in {1} AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL=Retrieving summary from URL + +MigrateToSecureStorageJob_migration_failed=Could not migrate credentials to secure storage for {0} +MigrateToSecureStorageJob_title=Migrating passwords to secure storage Index: src/org/eclipse/mylyn/internal/tasks/ui/Messages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java,v retrieving revision 1.12 diff -u -r1.12 Messages.java --- src/org/eclipse/mylyn/internal/tasks/ui/Messages.java 10 Apr 2010 10:34:56 -0000 1.12 +++ src/org/eclipse/mylyn/internal/tasks/ui/Messages.java 18 May 2010 10:56:10 -0000 @@ -25,6 +25,10 @@ NLS.initializeMessages(BUNDLE_NAME, Messages.class); } + public static String MigrateToSecureStorageJob_migration_failed; + + public static String MigrateToSecureStorageJob_title; + public static String ActiveContextExternalizationParticipant_Active_Task_Context; public static String ActivityExternalizationParticipant_Activity_Context; Index: src/org/eclipse/mylyn/tasks/ui/MigrateToSecureStorageJob.java =================================================================== RCS file: src/org/eclipse/mylyn/tasks/ui/MigrateToSecureStorageJob.java diff -N src/org/eclipse/mylyn/tasks/ui/MigrateToSecureStorageJob.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/tasks/ui/MigrateToSecureStorageJob.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.ui; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.commons.net.AuthenticationCredentials; +import org.eclipse.mylyn.commons.net.AuthenticationType; +import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; +import org.eclipse.mylyn.internal.tasks.ui.Messages; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.osgi.util.NLS; + +public class MigrateToSecureStorageJob extends Job { + + private final String kind; + + public MigrateToSecureStorageJob(String kind) { + super(Messages.MigrateToSecureStorageJob_title); + this.kind = kind; + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + Set repos = TasksUiPlugin.getRepositoryManager().getRepositories(kind); + if (repos != null) { + for (TaskRepository repo : repos) { + migrateToSecureStorage(repo); + } + } + return Status.OK_STATUS; + } + + @SuppressWarnings( { "deprecation" }) + public static boolean migrateToSecureStorage(TaskRepository repository) { + if (repository.getProperty(ITasksCoreConstants.PROPERTY_USE_SECURE_STORAGE) == null + && !"local".equals(repository.getUrl())) { //$NON-NLS-1$ + try { + AuthenticationCredentials creds = repository.getCredentials(AuthenticationType.REPOSITORY), httpCreds = repository.getCredentials(AuthenticationType.HTTP), proxyCreds = repository.getCredentials(AuthenticationType.PROXY); + boolean savePassword = repository.getSavePassword(AuthenticationType.REPOSITORY), httpSavePassword = repository.getSavePassword(AuthenticationType.HTTP), proxySavePassword = repository.getSavePassword(AuthenticationType.PROXY); + + repository.setProperty(ITasksCoreConstants.PROPERTY_USE_SECURE_STORAGE, "true"); //$NON-NLS-1$ + + if (creds != null) { + repository.setCredentials(AuthenticationType.REPOSITORY, creds, savePassword); + } + + if (httpCreds != null) { + repository.setCredentials(AuthenticationType.HTTP, httpCreds, httpSavePassword); + } + + if (proxyCreds != null) { + repository.setCredentials(AuthenticationType.PROXY, proxyCreds, proxySavePassword); + } + + try { + Platform.flushAuthorizationInfo(new URL(repository.getUrl()), "", "Basic"); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (MalformedURLException ex) { + Platform.flushAuthorizationInfo(new URL("http://eclipse.org/mylyn"), repository.getUrl(), "Basic"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + return true; + } catch (Exception e) { + StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, NLS.bind( + Messages.MigrateToSecureStorageJob_migration_failed, repository.getUrl()), e)); + } + } + return false; + } +} #P org.eclipse.mylyn.tasks.core Index: src/org/eclipse/mylyn/tasks/core/TaskRepository.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepository.java,v retrieving revision 1.90 diff -u -r1.90 TaskRepository.java --- src/org/eclipse/mylyn/tasks/core/TaskRepository.java 4 Mar 2010 18:41:21 -0000 1.90 +++ src/org/eclipse/mylyn/tasks/core/TaskRepository.java 18 May 2010 10:56:11 -0000 @@ -650,8 +650,25 @@ * Legacy support for < 2.2. Remove in 2.3. */ private String getUserName(AuthenticationType authType) { - AuthenticationCredentials credentials = getCredentials(authType); - return (credentials != null) ? credentials.getUserName() : null; + String key = getKeyPrefix(authType); + + String enabled = getProperty(key + ENABLED); + if (enabled == null || "true".equals(enabled)) { //$NON-NLS-1$ + String userName = getAuthInfo(key + USERNAME); + + if (userName == null) { + userName = ""; //$NON-NLS-1$ + } + + if (enabled == null && userName.length() == 0) { + // API30: legacy support for versions prior to 2.2 that did not set the enable flag, remove for 3.0 + return null; + } + + return userName; + } else { + return null; + } } public String getVersion() { #P org.eclipse.mylyn.tasks.tests Index: src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java,v retrieving revision 1.44 diff -u -r1.44 TaskRepositoryManagerTest.java --- src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java 11 Jan 2010 02:23:44 -0000 1.44 +++ src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java 18 May 2010 10:56:12 -0000 @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,6 +39,7 @@ import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector; import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery; import org.eclipse.mylyn.tasks.tests.connector.MockTask; +import org.eclipse.mylyn.tasks.ui.MigrateToSecureStorageJob; /** * @author Mik Kersten @@ -67,6 +69,12 @@ private final String AUTH_HTTP_USERNAME = AUTH_HTTP + USERNAME; + private final String AUTH_PROXY = "org.eclipse.mylyn.tasklist.repositories.proxy"; //$NON-NLS-1$ + + private final String AUTH_PROXY_PASSWORD = AUTH_PROXY + PASSWORD; + + private final String AUTH_PROXY_USERNAME = AUTH_PROXY + USERNAME; + private final String AUTH_SCHEME = "Basic"; //$NON-NLS-1$ private final String AUTH_REALM = ""; //$NON-NLS-1$ @@ -126,37 +134,40 @@ assertEquals("httpPassword", map.get(AUTH_HTTP_PASSWORD)); } - // FIXME 3.4 re-enable test -// public void testMigrationToSecureStorage() throws Exception { -// TaskRepository repository1 = new TaskRepository("bugzilla", "http://repository1/"); -// -// Map map = new HashMap(); -// map.put(AUTH_USERNAME, "testuser"); -// map.put(AUTH_PASSWORD, "testpassword"); -// map.put(AUTH_HTTP_USERNAME, "testhttpuser"); -// map.put(AUTH_HTTP_PASSWORD, "testhttppassword"); -// -// Platform.addAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME, map); -// -// map = Platform.getAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME); -// -// assertEquals("testuser", map.get(AUTH_USERNAME)); -// assertEquals("testpassword", map.get(AUTH_PASSWORD)); -// assertEquals("testhttpuser", map.get(AUTH_HTTP_USERNAME)); -// assertEquals("testhttppassword", map.get(AUTH_HTTP_PASSWORD)); -// -// assertTrue(manager.migrateToSecureStorage(repository1)); -// -// assertNull(Platform.getAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME)); -// -// ISecurePreferences securePreferences = SecurePreferencesFactory.getDefault() -// .node(ITasksCoreConstants.ID_PLUGIN); -// securePreferences = securePreferences.node(EncodingUtils.encodeSlashes(repository1.getUrl())); -// assertEquals("testuser", securePreferences.get(AUTH_USERNAME, null)); -// assertEquals("testpassword", securePreferences.get(AUTH_PASSWORD, null)); -// assertEquals("testhttpuser", securePreferences.get(AUTH_HTTP_USERNAME, null)); -// assertEquals("testhttppassword", securePreferences.get(AUTH_HTTP_PASSWORD, null)); -// } + public void testMigrationToSecureStorage() throws Exception { + TaskRepository repository1 = new TaskRepository("bugzilla", "http://repository1/"); + + Map map = new HashMap(); + map.put(AUTH_USERNAME, "testuser"); + map.put(AUTH_PASSWORD, "testpassword"); + map.put(AUTH_HTTP_USERNAME, "testhttpuser"); + map.put(AUTH_HTTP_PASSWORD, "testhttppassword"); + map.put(AUTH_PROXY_USERNAME, "testproxyuser"); + map.put(AUTH_PROXY_PASSWORD, "testproxypassword"); + + Platform.addAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME, map); + + map = Platform.getAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME); + + assertEquals("testuser", map.get(AUTH_USERNAME)); + assertEquals("testpassword", map.get(AUTH_PASSWORD)); + assertEquals("testhttpuser", map.get(AUTH_HTTP_USERNAME)); + assertEquals("testhttppassword", map.get(AUTH_HTTP_PASSWORD)); + + assertTrue(MigrateToSecureStorageJob.migrateToSecureStorage(repository1)); + + assertNull(Platform.getAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME)); + + ISecurePreferences securePreferences = SecurePreferencesFactory.getDefault() + .node(ITasksCoreConstants.ID_PLUGIN); + securePreferences = securePreferences.node(EncodingUtils.encodeSlashes(repository1.getUrl())); + assertEquals("testuser", repository1.getUserName()); + assertEquals("testpassword", securePreferences.get(AUTH_PASSWORD, null)); + assertEquals("testhttpuser", securePreferences.get(AUTH_HTTP_USERNAME, null)); + assertEquals("testhttppassword", securePreferences.get(AUTH_HTTP_PASSWORD, null)); + assertEquals("testproxyuser", securePreferences.get(AUTH_PROXY_USERNAME, null)); + assertEquals("testproxypassword", securePreferences.get(AUTH_PROXY_PASSWORD, null)); + } public void testRepositoryWithSlash() throws MalformedURLException { #P org.eclipse.mylyn.bugzilla.ui Index: src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java,v retrieving revision 1.61 diff -u -r1.61 BugzillaUiPlugin.java --- src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java 2 Oct 2009 20:24:49 -0000 1.61 +++ src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java 18 May 2010 10:56:13 -0000 @@ -14,12 +14,16 @@ import java.util.ArrayList; import java.util.List; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient; import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin; import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector; import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants; import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration; +import org.eclipse.mylyn.tasks.ui.MigrateToSecureStorageJob; import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; @@ -91,6 +95,18 @@ TasksUi.getRepositoryManager().addListener(bugzillaConnector.getClientManager()); + if (!getPreferenceStore().getBoolean(IBugzillaConstants.PREFERENCE_SECURE_STORAGE_MIGRATED)) { + Job migrateJob = new MigrateToSecureStorageJob(BugzillaCorePlugin.CONNECTOR_KIND); + migrateJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + super.done(event); + getPreferenceStore().setValue(IBugzillaConstants.PREFERENCE_SECURE_STORAGE_MIGRATED, Boolean.TRUE); + } + }); + migrateJob.schedule(); + } + // NOTE: initializing extensions in start(..) has caused race // conditions previously BugzillaUiExtensionReader.initStartupExtensions(); Index: src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java,v retrieving revision 1.98 diff -u -r1.98 BugzillaRepositorySettingsPage.java --- src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java 8 Feb 2010 04:00:26 -0000 1.98 +++ src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java 18 May 2010 10:56:14 -0000 @@ -35,6 +35,7 @@ import org.eclipse.mylyn.tasks.core.RepositoryStatus; import org.eclipse.mylyn.tasks.core.RepositoryTemplate; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.MigrateToSecureStorageJob; import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage; import org.eclipse.swt.SWT; @@ -267,6 +268,8 @@ @Override public void applyTo(TaskRepository repository) { + MigrateToSecureStorageJob.migrateToSecureStorage(repository); + super.applyTo(repository); repository.setProperty(IBugzillaConstants.REPOSITORY_SETTING_SHORT_LOGIN, String.valueOf(cleanQAContact.getSelection())); #P org.eclipse.mylyn.bugzilla.core Index: src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java,v retrieving revision 1.82 diff -u -r1.82 IBugzillaConstants.java --- src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java 1 Sep 2009 04:13:59 -0000 1.82 +++ src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java 18 May 2010 10:56:15 -0000 @@ -160,7 +160,6 @@ static final String VALUES_TARGET = "org.eclipse.mylyn.bugzilla.values.target"; //$NON-NLS-1$ - // Default values for keys static final String[] DEFAULT_STATUS_VALUES = { "Unconfirmed", "New", "Assigned", "Reopened", "Resolved", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$ @@ -272,4 +271,6 @@ public static final String LAST_COMPONENT_SELECTION = "last.selection.component"; //$NON-NLS-1$ + public static final String PREFERENCE_SECURE_STORAGE_MIGRATED = "secure_storage.migration.done"; //$NON-NLS-1$ + }