package com.constellio.dev;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.security.global.UserCredential;
import com.constellio.model.entities.security.global.UserCredentialStatus;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.extractions.RecordPopulateServices;
import com.constellio.model.services.records.reindexing.ReindexationMode;
import com.constellio.model.services.records.reindexing.ReindexingServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.security.roles.Roles;
import com.constellio.model.services.security.roles.RolesManager;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.SDKScriptUtils;
public class DeleteAllUserCredentialsExceptAdminMain {
static AppLayerFactory appLayerFactory;
private static void startBackend() {
//TODO
//Only enable this line to run in production
//appLayerFactory = startLayerFactoriesWithoutBackgroundThreads();
//Only enable this line to run on developer workstation
appLayerFactory = SDKScriptUtils.startApplicationWithoutBackgroundProcessesAndAuthentication();
}
public static void main(String argv[])
throws Exception {
RecordPopulateServices.LOG_CONTENT_MISSING = false;
startBackend();
ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory();
UserServices userServices = modelLayerFactory.newUserServices();
RecordServices recordServices = modelLayerFactory.newRecordServices();
SearchServices searchServices = modelLayerFactory.newSearchServices();
RolesManager rolesManager = modelLayerFactory.getRolesManager();
MetadataSchemasManager schemasManager = modelLayerFactory.getMetadataSchemasManager();
CollectionsListManager collectionsListManager = modelLayerFactory.getCollectionsListManager();
for (String collection : collectionsListManager.getCollections()) {
Roles collectionRoles = rolesManager.getCollectionRoles(collection);
MetadataSchemaTypes types = schemasManager.getSchemaTypes(collection);
MetadataSchema userSchema = types.getSchema(User.DEFAULT_SCHEMA);
LogicalSearchQuery collectionUsersQuery = new LogicalSearchQuery().setCondition(from(userSchema).returnAll());
List<Record> collectionUserRecords = searchServices.search(collectionUsersQuery);
for (Record collectionUserRecord : collectionUserRecords) {
User collectionUser = new User(collectionUserRecord, types, collectionRoles);
String username = collectionUser.getUsername();
if (!username.equalsIgnoreCase(User.ADMIN)) {
recordServices.logicallyDelete(collectionUserRecord, User.GOD);
}
}
}
List<UserCredential> userCredentials = userServices.getAllUserCredentials();
for (UserCredential userCredential : userCredentials) {
String username = userCredential.getUsername();
if (!username.equalsIgnoreCase(User.ADMIN)) {
List<String> globalGroups = userCredential.getGlobalGroups();
for (String globalGroup : globalGroups) {
userServices.removeUserFromGlobalGroup(username, globalGroup);
}
globalGroups = new ArrayList<>();
List<String> userCollections = userCredential.getCollections();
for (String userCollection : userCollections) {
userServices.removeUserFromCollection(userCredential, userCollection);
}
userCollections = new ArrayList<>();
System.out.println("Deleting user " + userCredential.getUsername());
UserCredential newUserCredential = userServices.createUserCredential(username, userCredential.getFirstName(),
userCredential.getLastName(), userCredential.getEmail(), userCredential.getServiceKey(),
userCredential.isSystemAdmin(), globalGroups, userCollections,
userCredential.getAccessTokens(), UserCredentialStatus.DELETED,
userCredential.getDomain(), Arrays.asList(""), null);
userCredential = newUserCredential;
userServices.removeUserCredentialAndUser(userCredential);
}
}
ReindexingServices reindexingServices = modelLayerFactory.newReindexingServices();
reindexingServices.reindexCollections(ReindexationMode.RECALCULATE_AND_REWRITE);
File tempXmlFile = File.createTempFile(DeleteAllUserCredentialsExceptAdminMain.class.getSimpleName(), ".xml");
ConfigManager configManager = modelLayerFactory.getDataLayerFactory().getConfigManager();
String userCredentialsXmlFilePath = "/userCredentialsConfig.xml";
Document userCredentialsDocument = configManager.getXML(userCredentialsXmlFilePath).getDocument();
Element rootElement = userCredentialsDocument.getRootElement();
for (Iterator<Element> it = rootElement.getChildren().iterator(); it.hasNext(); ) {
Element userCredentialElement = it.next();
String username = userCredentialElement.getAttributeValue("username");
if (!username.equals(User.ADMIN)) {
it.remove();
}
}
XMLOutputter xmlOutput = new XMLOutputter();
// display nice nice
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(userCredentialsDocument, new FileWriter(tempXmlFile));
String hash = configManager.getBinary(userCredentialsXmlFilePath).getHash();
InputStream tempXmlFileIn = new FileInputStream(tempXmlFile);
configManager.update(userCredentialsXmlFilePath, hash, tempXmlFileIn);
IOUtils.closeQuietly(tempXmlFileIn);
System.out.println("End of script");
}
}