package com.constellio.app.services.migrations.scripts;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.List;
import org.jdom2.output.XMLOutputter;
import org.junit.Test;
import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration;
import com.constellio.model.conf.email.EmailServerConfiguration;
import com.constellio.model.services.emails.OldSmtpServerTestConfig;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.SDKFoldersLocator;
import com.constellio.sdk.tests.annotations.SlowTest;
@SlowTest
public class CoreMigrationTo_5_1_3AcceptanceTest extends ConstellioTest {
@Test
public void givenSystemWithEmailServerConfigurationWhenUpdatingFrom5_0_6ThenConfigurationReadOK()
throws OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException {
givenSystemAtVersion5_1_2WithManualSMTPConfiguration();
EmailServerConfiguration expectedConfig = new OldSmtpServerTestConfig();
EmailServerConfiguration serverConfiguration = getModelLayerFactory().getEmailConfigurationsManager()
.getEmailConfiguration("ff", false);
assertThat(serverConfiguration.getPassword())
.isEqualTo(getModelLayerFactory().newEncryptionServices().encrypt(expectedConfig.getPassword()));
assertThat(serverConfiguration.getDefaultSenderEmail()).isEqualTo(expectedConfig.getDefaultSenderEmail());
serverConfiguration = getModelLayerFactory().getEmailConfigurationsManager().getEmailConfiguration("ff", true);
assertThat(serverConfiguration.getPassword()).isEqualTo(expectedConfig.getPassword());
}
@Test
public void givenSystemWithTokensWhenMigrationTo5_1_3ThenEncrypted()
throws OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException {
givenSystemAtVersion5_1_2withTokens();
// assertThat(new XMLOutputter().outputString(getDataLayerFactory().getConfigManager().getXML("userCredentialsConfig.xml")
// .getDocument())).doesNotContain("6f9b7e63-a6c1-4783-9143-1e69edf34b4c");
List<String> adminTokens = getModelLayerFactory().newUserServices().getUserCredential("admin").getTokenKeys();
List<String> bobTokens = getModelLayerFactory().newUserServices().getUserCredential("bob").getTokenKeys();
assertThat(adminTokens).containsOnly("6f9b7e63-a6c1-4783-9143-1e69edf34b4c");
assertThat(bobTokens).isEmpty();
String newBobToken = getModelLayerFactory().newUserServices().generateToken("bob");
// assertThat(new XMLOutputter().outputString(getDataLayerFactory().getConfigManager().getXML("userCredentialsConfig.xml")
// .getDocument())).doesNotContain("6f9b7e63-a6c1-4783-9143-1e69edf34b4c").doesNotContain(newBobToken);
adminTokens = getModelLayerFactory().newUserServices().getUserCredential("admin").getTokenKeys();
bobTokens = getModelLayerFactory().newUserServices().getUserCredential("bob").getTokenKeys();
assertThat(adminTokens).containsOnly("6f9b7e63-a6c1-4783-9143-1e69edf34b4c");
assertThat(bobTokens).containsOnly(newBobToken);
}
@Test
public void givenSystemWithEncryptedTokensWhenReadingUsersTokensThenTokensDecrypted()
throws OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException {
givenSystemWithEncryptedTokens();
String validToken = "c84e2c14-f933-4399-aed2-95c538b2b7dd";
assertThat(
new XMLOutputter().outputString(getDataLayerFactory().getConfigManager().getXML("userCredentialsConfig.xml.old")
.getDocument())).doesNotContain(validToken);
List<String> adminTokens = getModelLayerFactory().newUserServices().getUserCredential("admin").getTokenKeys();
assertThat(adminTokens).contains(validToken);
assertThat(adminTokens).doesNotContain("invalidkey");
String serviceKey = getModelLayerFactory().getUserCredentialsManager().getServiceKeyByToken(validToken);
String userServiceKey = "adminkey";
assertThat(serviceKey).isEqualTo(userServiceKey);
boolean authenticated = getModelLayerFactory().newUserServices().isAuthenticated(userServiceKey, validToken);
assertThat(authenticated).isTrue();
}
private void givenSystemWithEncryptedTokens() {
givenTransactionLogIsEnabled();
File statesFolder = new SDKFoldersLocator().getInitialStatesFolder();
File state = new File(statesFolder, "saveStateWithEncryptedTokens.zip");
getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state);
}
@Test
public void givenSystemWithInvalidEmailServerConfigurationWhenUpdatingFrom5_0_6ThenConfigurationReadOK()
throws OptimisticLockingConfiguration, NoSuchAlgorithmException, IOException, InvalidKeySpecException {
givenSystemAtVersion5_1_2WithManualInvalidSMTPConfiguration();
EmailServerConfiguration serverConfiguration = getModelLayerFactory().getEmailConfigurationsManager()
.getEmailConfiguration("ff", false);
assertThat(serverConfiguration.isEnabled()).isFalse();
}
private void givenSystemAtVersion5_1_2WithManualSMTPConfiguration() {
givenTransactionLogIsEnabled();
File statesFolder = new File(new SDKFoldersLocator().getInitialStatesFolder(), "olds");
File state = new File(statesFolder, "given_system_in_5.1.2_with_ManualEmailServerConfiguration.zip");
getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state);
}
private void givenSystemAtVersion5_1_2WithManualInvalidSMTPConfiguration() {
givenTransactionLogIsEnabled();
File statesFolder = new File(new SDKFoldersLocator().getInitialStatesFolder(), "olds");
File state = new File(statesFolder, "given_system_in_5.1.2_with_ManualInvalidEmailServerConfiguration.zip");
getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state);
}
private void givenSystemAtVersion5_1_2withTokens() {
givenTransactionLogIsEnabled();
File statesFolder = new File(new SDKFoldersLocator().getInitialStatesFolder(), "olds");
File state = new File(statesFolder, "given_system_in_5.1.2.2_with_tasks,rm_modules__with_tokens.zip");
getCurrentTestSession().getFactoriesTestFeatures().givenSystemInState(state);
}
}