package com.constellio.app.services.migrations.scripts;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import org.apache.commons.io.FileUtils;
import com.constellio.app.entities.modules.MigrationResourcesProvider;
import com.constellio.app.entities.modules.MigrationScript;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.data.conf.DataLayerConfiguration;
import com.constellio.data.dao.services.bigVault.solr.BigVaultException;
import com.constellio.data.dao.services.factories.DataLayerFactory;
import com.constellio.model.conf.ModelLayerConfiguration;
import com.constellio.model.conf.email.EmailConfigurationsManager;
import com.constellio.model.conf.email.EmailServerConfiguration;
import com.constellio.model.conf.ldap.LDAPConfigurationManager;
import com.constellio.model.conf.ldap.config.LDAPServerConfiguration;
import com.constellio.model.conf.ldap.config.LDAPUserSyncConfiguration;
import com.constellio.model.services.encrypt.EncryptionServices;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.users.UserCredentialsManager;
public class CoreMigrationTo_5_1_3 implements MigrationScript {
@Override
public String getVersion() {
return "5.1.3";
}
@Override
public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory appLayerFactory)
throws Exception {
initEncryption(collection, provider, appLayerFactory);
appLayerFactory.getSystemGlobalConfigsManager().setReindexingRequired(true);
}
public static void initEncryption(String collection, MigrationResourcesProvider provider, AppLayerFactory appLayerFactory) {
ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory();
DataLayerFactory dataLayerFactory = modelLayerFactory.getDataLayerFactory();
EncryptionServices encryptionServices;
try {
if (isFirstInit(dataLayerFactory)) {
createKeyFile(modelLayerFactory.getConfiguration(), dataLayerFactory.getDataLayerConfiguration());
createKeyDocument(dataLayerFactory);
encryptionServices = modelLayerFactory.newEncryptionServices();
encryptLdapPassword(modelLayerFactory, encryptionServices);
encryptUserTokens(modelLayerFactory.getUserCredentialsManager());
} else {
encryptionServices = modelLayerFactory.newEncryptionServices();
}
encryptEmailServerPassword(modelLayerFactory.getEmailConfigurationsManager(), collection);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void encryptEmailServerPassword(EmailConfigurationsManager emailManager,
String collection) {
EmailServerConfiguration config = emailManager.getEmailConfiguration(collection, false);
if (config != null) {
emailManager.updateEmailServerConfiguration(config, collection, true);
}
}
private static void encryptUserTokens(UserCredentialsManager userCredentialsManager) {
userCredentialsManager.rewrite();
}
private static void encryptLdapPassword(ModelLayerFactory modelLayerFactory, EncryptionServices encryptionServices) {
LDAPConfigurationManager ldapConfigManager = modelLayerFactory
.getLdapConfigurationManager();
LDAPServerConfiguration serverConfiguration = ldapConfigManager.getLDAPServerConfiguration();
LDAPUserSyncConfiguration userSynchConfiguration = ldapConfigManager
.getLDAPUserSyncConfiguration(false);
if (userSynchConfiguration != null && userSynchConfiguration.getUser() != null) {
ldapConfigManager.saveLDAPConfiguration(serverConfiguration, userSynchConfiguration, false);
}
}
private static void createKeyDocument(DataLayerFactory dataLayerFactory) {
dataLayerFactory.saveEncryptionKey();
}
private static void createKeyFile(ModelLayerConfiguration modelLayerConfiguration, DataLayerConfiguration dataLayerConfiguration)
throws IOException {
File encryptionFile = modelLayerConfiguration.getConstellioEncryptionFile();
Random random = new Random();
String fileKeyPart =
"constellio_" + dataLayerConfiguration.createRandomUniqueKey() + "_ext";
FileUtils.writeByteArrayToFile(encryptionFile, fileKeyPart.getBytes());
}
private static boolean isFirstInit(DataLayerFactory dataLayerFactory) {
try {
dataLayerFactory.readEncryptionKey();
return false;
} catch (BigVaultException e) {
return true;
}
}
}