blob: 83f4ce250dfcf7ab24ede82959493c8aa16cd416 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.security.tests.storage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import org.eclipse.core.tests.harness.BundleTestingHelper;
import org.eclipse.equinox.internal.security.storage.friends.InternalExchangeUtils;
import org.eclipse.equinox.internal.security.storage.friends.ReEncrypter;
import org.eclipse.equinox.internal.security.tests.SecurityTestsActivator;
import org.eclipse.equinox.security.storage.ISecurePreferences;
import org.eclipse.equinox.security.storage.StorageException;
import org.junit.Test;
import org.osgi.framework.*;
public class ReEncrypterTest extends StorageAbstractTest {
final private static int MAX_TIME_PER_BUNDLE = 10000; // maximum time to wait for bundle event in milliseconds
final private static String TEST_FILES_ROOT = "Plugin_Testing/";
final private static String key = "password";
final private static String value = "p[[pkknb#";
final private static String clearTextKey = "data";
final private static String clearTextValue = "-> this should not be encrypted <-";
final private static String defaultValue = "default";
@Test
public void testFlushAfterEncrypt() throws IOException, StorageException, BundleException {
URL location = getStorageLocation();
assertNotNull(location);
Bundle bundle = null;
try {
bundle = installBundle("controlled_provider");
{ // block1: fill and save
ISecurePreferences preferences = newPreferences(location, getOptions());
fill(preferences);
preferences.flush();
closePreferences(preferences);
}
{ // block2: re-encrypt
ISecurePreferences preferences = newPreferences(location, getOptions());
ReEncrypter reEncrypter = new ReEncrypter(preferences, getModuleID());
boolean decryptResult = reEncrypter.decrypt();
assertTrue(decryptResult);
boolean switchToNewPasswordResult = reEncrypter.switchToNewPassword();
assertTrue(switchToNewPasswordResult);
boolean encryptResult = reEncrypter.encrypt();
assertTrue(encryptResult);
}
{ // block3: re-load and check
ISecurePreferences preferences = newPreferences(location, getOptions());
check(preferences);
}
} finally {
if (bundle != null)
bundle.uninstall();
}
}
@Override
protected String getModuleID() {
return ControlledPasswordProvider.MODULE_ID;
}
protected Map<String, Object> getOptions() {
// Don't specify default password for those tests; they need to have
// password providers
return getOptions(null);
}
/**
* Fills the secure preferences with some encrypted and non encrypted values.
*/
private void fill(ISecurePreferences preferences) throws StorageException {
assertFalse(isModified(preferences));
preferences.put(key, value, true); // puts encrypted entry at the root node
preferences.put(clearTextKey, clearTextValue, false); // puts clear text entry at the root node
assertTrue(isModified(preferences));
}
/**
* Checks that there isn't any change in the secure preferences and it contains
* the same values preciously saved.
*/
private void check(ISecurePreferences preferences) throws StorageException {
assertFalse(isModified(preferences));
assertEquals(value, preferences.get(key, defaultValue)); // checks entry at the root node
assertEquals(clearTextValue, preferences.get(clearTextKey, defaultValue));
}
/**
* The method reaches into internal classes to check if modified flag is set on
* secure preference data.
*/
private boolean isModified(ISecurePreferences node) {
return InternalExchangeUtils.isModified(node);
}
/**
* Dynamically installs a bundle that should contribute an Extension to the
* org.eclipse.equinox.security.secureStorage Extension Point.
*
* Copied from DynamicPreferencesTest.
*/
protected Bundle installBundle(String bundlePath) throws MalformedURLException, BundleException, IOException {
BundleContext bundleContext = SecurityTestsActivator.getDefault().getBundleContext();
Bundle bundle = null;
WaitingRegistryListener listener = new WaitingRegistryListener();
listener.register("org.eclipse.equinox.security.secureStorage");
try {
bundle = BundleTestingHelper.installBundle("0.1", bundleContext, TEST_FILES_ROOT + bundlePath);
BundleTestingHelper.refreshPackages(bundleContext, new Bundle[] { bundle });
// synchronization: listener should receive 1 group of events
assertTrue(listener.waitFor(1, MAX_TIME_PER_BUNDLE) == 1);
} finally {
listener.unregister();
}
return bundle;
}
}