package com.constellio.app.api.cmis.accept;
import static com.constellio.model.entities.security.global.AuthorizationAddRequest.authorizationInCollection;
import static com.constellio.model.entities.security.global.AuthorizationAddRequest.authorizationForUsers;
import static java.util.Arrays.asList;
import static org.apache.chemistry.opencmis.commons.enums.AclPropagation.REPOSITORYDETERMINED;
import static org.apache.chemistry.opencmis.commons.enums.IncludeRelationships.NONE;
import static org.apache.commons.io.IOUtils.toByteArray;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.apache.chemistry.opencmis.commons.spi.Holder;
import org.assertj.core.api.Condition;
import org.assertj.core.api.Fail;
import org.assertj.core.api.ListAssert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.global.AuthorizationAddRequest;
import com.constellio.model.services.contents.ContentManagementAcceptTest;
import com.constellio.model.services.migrations.ConstellioEIMConfigs;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.security.AuthorizationsServices;
import com.constellio.model.services.taxonomies.ConceptNodesTaxonomySearchServices;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.taxonomies.TaxonomiesSearchOptions;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
import com.constellio.model.services.taxonomies.TaxonomySearchRecord;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.setups.Users;
/**
* Created by Constelio on 2016-10-26.
*/
public class CmisSecurityAcceptanceTest extends ConstellioTest {
private static final Logger LOGGER = LoggerFactory.getLogger(CmisACLAcceptanceTest.class);
private final String PDF_MIMETYPE = "application/pdf";
private long pdf1Length = 170039L;
private long pdf2Length = 167347L;
private String pdf1Hash = "KN8RjbrnBgq1EDDV2U71a6/6gd4=";
private String pdf2Hash = "T+4zq4cGP/tXkdJp/qz1WVWYhoQ=";
UserServices userServices;
TaxonomiesManager taxonomiesManager;
MetadataSchemasManager metadataSchemasManager;
RecordServices recordServices;
Users users = new Users();
CmisAcceptanceTestSetup zeCollectionSchemas = new CmisAcceptanceTestSetup(zeCollection);
CmisAcceptanceTestSetup.Records zeCollectionRecords;
TaxonomiesSearchServices taxonomiesSearchServices;
List<String> R = asList("cmis:read");
List<String> RW = asList("cmis:read", "cmis:write");
List<String> RWD = asList("cmis:read", "cmis:write", "cmis:delete");
Session session;
AuthorizationsServices authorizationsServices;
String aliceId, bobId, charlesId, dakotaId, edouardId, chuckId, gandalfId, robinId, heroesId;
@Before
public void setup()
throws Exception {
userServices = getModelLayerFactory().newUserServices();
taxonomiesManager = getModelLayerFactory().getTaxonomiesManager();
metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
recordServices = getModelLayerFactory().newRecordServices();
taxonomiesSearchServices = getModelLayerFactory().newTaxonomiesSearchService();
users.setUp(userServices);
defineSchemasManager().using(zeCollectionSchemas.withContentMetadata());
CmisAcceptanceTestSetup.allSchemaTypesSupported(getAppLayerFactory());
taxonomiesManager.addTaxonomy(zeCollectionSchemas.getTaxonomy1(), metadataSchemasManager);
taxonomiesManager.addTaxonomy(zeCollectionSchemas.getTaxonomy2(), metadataSchemasManager);
taxonomiesManager.setPrincipalTaxonomy(zeCollectionSchemas.getTaxonomy2(), metadataSchemasManager);
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getSchemaType(zeCollectionSchemas.administrativeUnit.type().getCode()).setSecurity(true);
types.getSchemaType(zeCollectionSchemas.classificationStation.type().getCode()).setSecurity(true);
types.getSchemaType(zeCollectionSchemas.documentFond.type().getCode()).setSecurity(false);
types.getSchemaType(zeCollectionSchemas.category.type().getCode()).setSecurity(false);
types.getSchemaType(zeCollectionSchemas.folderSchema.type().getCode()).setSecurity(true);
types.getSchemaType(zeCollectionSchemas.documentSchema.type().getCode()).setSecurity(true);
}
});
zeCollectionRecords = zeCollectionSchemas.givenRecords(recordServices);
userServices.addUserToCollection(users.alice(), zeCollection);
userServices.addUserToCollection(users.bob(), zeCollection);
userServices.addUserToCollection(users.charles(), zeCollection);
userServices.addUserToCollection(users.dakotaLIndien(), zeCollection);
userServices.addUserToCollection(users.edouardLechat(), zeCollection);
userServices.addUserToCollection(users.gandalfLeblanc(), zeCollection);
userServices.addUserToCollection(users.chuckNorris(), zeCollection);
userServices.addUserToCollection(users.sasquatch(), zeCollection);
userServices.addUserToCollection(users.robin(), zeCollection);
userServices.addUserToCollection(users.admin(), zeCollection);
userServices.addUserToCollection(users.chuckNorris(), zeCollection);
recordServices.update(users.adminIn(zeCollection).setCollectionAllAccess(true));
recordServices.update(users.aliceIn(zeCollection).setCollectionReadAccess(true));
recordServices.update(users.dakotaIn(zeCollection).setCollectionReadAccess(true).setCollectionWriteAccess(true));
authorizationsServices = getModelLayerFactory().newAuthorizationsServices();
aliceId = users.aliceIn(zeCollection).getId();
bobId = users.bobIn(zeCollection).getId();
charlesId = users.charlesIn(zeCollection).getId();
dakotaId = users.dakotaIn(zeCollection).getId();
edouardId = users.edouardIn(zeCollection).getId();
gandalfId = users.gandalfIn(zeCollection).getId();
chuckId = users.chuckNorrisIn(zeCollection).getId();
heroesId = users.heroesIn(zeCollection).getId();
robinId = users.robinIn(zeCollection).getId();
givenConfig(ConstellioEIMConfigs.CMIS_NEVER_RETURN_ACL, false);
givenFolderInheritingTaxonomyAuthorizations();
startApplication();
CmisAcceptanceTestSetup.giveUseCMISPermissionToUsers(getModelLayerFactory());
metadataSchemasManager.modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getSchemaType(zeCollectionSchemas.documentFond.type().getCode()).setSecurity(true);
types.getSchemaType(zeCollectionSchemas.category.type().getCode()).setSecurity(true);
}
});
}
@After
public void stopApplicationAfterTest() {
stopApplication();
}
//TODO Gabriel @Test
public void whenNavigatingThenEverybodyHaveAccessToRoot() {
//Test is passing, but not on workbench
//FAIL ONLY WHEN GETDescendants
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
CmisObject root = session.getObjectByPath("/");
getChildren(root);
assertThat(false).isTrue();
}
@Test
public void whenGetParentOfRecordWithoutReadAccessThenError()
throws Exception {
String recordId = zeCollectionRecords.folder1_doc1.getId();
session = newCMISSessionAsUserInZeCollection(admin);
List<ObjectParentData> bindingParents = session.getBinding().getNavigationService().getObjectParents(
session.getRepositoryInfo().getId(), recordId, null, false, NONE, null, true, null);
assertThat(bindingParents).extracting("object.id").containsOnly(zeCollectionRecords.folder1.getId());
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
bindingParents = session.getBinding().getNavigationService().getObjectParents(
session.getRepositoryInfo().getId(), recordId, null, false, NONE, null, true, null);
assertThat(bindingParents).extracting("object.id").containsOnly(zeCollectionRecords.folder1.getId());
session = newCMISSessionAsUserInZeCollection(dakota);
bindingParents = session.getBinding().getNavigationService().getObjectParents(
session.getRepositoryInfo().getId(), recordId, null, false, NONE, null, true, null);
assertThat(bindingParents).extracting("object.id").containsOnly(zeCollectionRecords.folder1.getId());
session = newCMISSessionAsUserInZeCollection(bobGratton);
try {
bindingParents = session.getBinding().getNavigationService().getObjectParents(
session.getRepositoryInfo().getId(), recordId, null, false, NONE, null, true, null);
fail("Exception expected");
} catch (CmisRuntimeException e) {
assertThat(e.getMessage())
.isEqualTo("L'utilisateur bob n'a pas de droit en lecture sur l'enregistrement folder1_doc1 - folder1_doc1");
}
}
@Test
public void givenRecordAsAuthOnALeafRecordThenCanCallGetChildrenAndGetParentsOnNodeLeadingToIt()
throws Exception {
authorizationsServices.add(authorizationForUsers(users.robinIn(zeCollection))
.on(zeCollectionRecords.folder1_doc1).givingReadAccess(), users.adminIn(zeCollection));
session = newCMISSessionAsUserInZeCollection(admin);
assertThatChildren(session.getRootFolder()).containsOnly("taxo_taxo1", "taxo_taxo2");
assertThatChildren("taxo_taxo1").containsOnly("zetaxo1_fond1");
assertThatChildren("zetaxo1_fond1").containsOnly("zetaxo1_fond1_1", "zetaxo1_category2");
assertThatChildren("zetaxo1_fond1_1").containsOnly("zetaxo1_category1");
assertThatChildren("zetaxo1_category1").containsOnly("folder1", "folder2");
assertThatChildren("folder1").containsOnly("folder1_doc1");
assertThatChildren("taxo_taxo2").containsOnly("zetaxo2_unit1");
assertThatChildren("zetaxo2_unit1").containsOnly("zetaxo2_station2", "zetaxo2_unit1_1");
assertThatChildren("zetaxo2_station2").containsOnly("folder1", "zetaxo2_station2_1");
assertThatChildren("folder1").containsOnly("folder1_doc1");
session = newCMISSessionAsUserInZeCollection(robin);
assertThatChildren(session.getRootFolder()).containsOnly("taxo_taxo1", "taxo_taxo2");
assertThatChildren("taxo_taxo1").containsOnly("zetaxo1_fond1");
assertThatChildren("zetaxo1_fond1").containsOnly("zetaxo1_fond1_1", "zetaxo1_category2");
assertThatChildren("zetaxo1_fond1_1").containsOnly("zetaxo1_category1");
assertThatChildren("zetaxo1_category1").containsOnly("folder1");
assertThatChildren("folder1").containsOnly("folder1_doc1");
assertThatChildren("taxo_taxo2").containsOnly("zetaxo2_unit1");
assertThatChildren("zetaxo2_unit1").containsOnly("zetaxo2_station2");
assertThatChildren("zetaxo2_station2").containsOnly("folder1");
assertThatChildren("folder1").containsOnly("folder1_doc1");
}
private ListAssert<Object> assertThatChildren(String id) {
Folder folder = (Folder) session.getObject(id);
return assertThatChildren(folder);
}
private ListAssert<Object> assertThatChildren(Folder folder) {
List<CmisObject> children = new ArrayList<>();
for (CmisObject object : folder.getChildren()) {
List<ObjectParentData> bindingParents = session.getBinding().getNavigationService().getObjectParents(
session.getRepositoryInfo().getId(), object.getId(), null, false, NONE, null, true, null);
assertThat(bindingParents).extracting("object.id").contains(folder.getId());
children.add(object);
}
return assertThat(children).extracting("id");
}
@Test
public void whenNavigatingThenReturnOnlyReadableFolders()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder cmisFolder1_doc1 = cmisFolder(zeCollectionRecords.folder1_doc1);
Folder cmisFolder2 = cmisFolder(zeCollectionRecords.folder2);
cmisFolder1_doc1.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
cmisFolder2.addAcl(asList(ace(bobGratton, RW)), REPOSITORYDETERMINED);
List<CmisObject> descendants = getDescendants("/");
assertThat(descendants).hasSize(35);
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
descendants = getDescendants("/");
assertThat(descendants).hasSize(35);
session = newCMISSessionAsUserInZeCollection(dakota);
descendants = getDescendants("/");
assertThat(descendants).hasSize(35);
session = newCMISSessionAsUserInZeCollection(bobGratton);
//Bob can access this record, because it contains record which he has access.
assertThat(session.getObjectByPath("/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/zetaxo2_station2_1")).isNotNull();
assertThat(session.getObject("zetaxo2_station2_1")).isNotNull();
session.getObjectByPath("/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/folder1/folder1_doc1");
descendants = getDescendants("/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/zetaxo2_station2_1/folder2");
assertThat(descendants).hasSize(4);
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
session.getObjectByPath("/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/folder1/folder1_doc1");
try {
session.getObjectByPath("/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/zetaxo2_station2_1/folder2");
Fail.fail("Charles has access to folder2 but should not");
} catch (Exception e) {
assertThat(e.getMessage())
.contains("L'utilisateur charles n'a pas de droit en lecture sur l'enregistrement folder2 - folder2");
}
try {
session.getObject("folder2");
Fail.fail("Charles has access to folder2 but should not");
} catch (Exception e) {
assertThat(e.getMessage())
.contains("L'utilisateur charles n'a pas de droit en lecture sur l'enregistrement folder2 - folder2");
}
}
@Test
public void whenCreatingFolderInFolderThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
String parentId = "folder2";
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder2);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record createdRecord = createNewFolderWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
createNewFolderWithTestPropertiesExpectingPermissionError(parentId);
session = newCMISSessionAsUserInZeCollection(dakota);
createdRecord = createNewFolderWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(bobGratton);
createdRecord = createNewFolderWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
createNewFolderWithTestPropertiesExpectingPermissionError(parentId);
}
@Test
public void whenCreatingRecordsInSecondaryTaxonomyAttachingThemToPrimaryTaxonomyUsingPropertyThenSecurised()
throws RecordServicesException {
String parentId = "folder2";
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.taxo1_category1);
Map<String, Object> properties = new HashMap<>();
properties.put(PropertyIds.OBJECT_TYPE_ID, zeCollectionSchemas.folderSchema.code());
properties.put(PropertyIds.NAME, "Folder");
properties.put(zeCollectionSchemas.folderSchema.taxonomy2().getLocalCode(), zeCollectionRecords.taxo2_station1.getId());
assertThat(parent.createFolder(properties)).isNotNull();
session = newCMISSessionAsUserInZeCollection(dakota);
parent = cmisFolder(zeCollectionRecords.taxo1_category1);
properties = new HashMap<>();
properties.put(PropertyIds.OBJECT_TYPE_ID, zeCollectionSchemas.folderSchema.code());
properties.put(PropertyIds.NAME, "Folder");
properties.put(zeCollectionSchemas.folderSchema.taxonomy2().getLocalCode(), zeCollectionRecords.taxo2_station1.getId());
assertThat(parent.createFolder(properties)).isNotNull();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
parent = cmisFolder(zeCollectionRecords.taxo1_category1);
properties = new HashMap<>();
properties.put(PropertyIds.OBJECT_TYPE_ID, zeCollectionSchemas.folderSchema.code());
properties.put(PropertyIds.NAME, "Folder");
properties.put(zeCollectionSchemas.folderSchema.taxonomy2().getLocalCode(), zeCollectionRecords.taxo2_station1.getId());
try {
assertThat(parent.createFolder(properties)).isNotNull();
} catch (CmisRuntimeException e) {
assertThat(e.getMessage().startsWith("L'utilisateur alice n'a pas de droit en ecriture sur l'enregistrement"));
}
session = newCMISSessionAsUserInZeCollection(edouard);
parent = cmisFolder(zeCollectionRecords.taxo1_category1);
properties = new HashMap<>();
properties.put(PropertyIds.OBJECT_TYPE_ID, zeCollectionSchemas.folderSchema.code());
properties.put(PropertyIds.NAME, "Folder");
properties.put(zeCollectionSchemas.folderSchema.taxonomy2().getLocalCode(), zeCollectionRecords.taxo2_station1.getId());
try {
assertThat(parent.createFolder(properties)).isNotNull();
} catch (CmisRuntimeException e) {
assertThat(e.getMessage().startsWith("L'utilisateur edouard n'a pas de droit en ecriture sur l'enregistrement"));
}
}
@Test
public void whenCreatingFolderInAdministrativeUnitThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
String parentId = "zetaxo2_station1";
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.taxo2_station1);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record createdRecord = createNewFolderWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
createNewFolderWithTestPropertiesExpectingPermissionError(parentId);
session = newCMISSessionAsUserInZeCollection(dakota);
createdRecord = createNewFolderWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(bobGratton);
createdRecord = createNewFolderWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
createNewFolderWithTestPropertiesExpectingPermissionError(parentId);
}
@Test
public void whenCreatingDocumentInFolderThenOnlyWorksWithParentWriteAuthorization()
throws Exception {
String parentId = "folder2";
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder2);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record createdRecord = createNewDocumentWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
createNewDocumentWithTestPropertiesExpectingPermissionError(parentId);
session = newCMISSessionAsUserInZeCollection(dakota);
createdRecord = createNewDocumentWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(bobGratton);
createdRecord = createNewDocumentWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
createNewDocumentWithTestPropertiesExpectingPermissionError(parentId);
}
@Test
public void whenCreatingDocumentInAdministrativeUnitThenOnlyWorksWithParentWriteAuthorization()
throws Exception {
String parentId = zeCollectionRecords.folder1.getId();
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder1);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record createdRecord = createNewDocumentWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
createNewDocumentWithTestPropertiesExpectingPermissionError(parentId);
session = newCMISSessionAsUserInZeCollection(dakota);
createdRecord = createNewDocumentWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
assertThat(users.bobIn(zeCollection).hasWriteAccess().on(recordServices.getDocumentById(parentId))).isTrue();
session = newCMISSessionAsUserInZeCollection(bobGratton);
createdRecord = createNewDocumentWithTestProperties(parentId);
assertThat(createdRecord).isNotNull();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
createNewDocumentWithTestPropertiesExpectingPermissionError(parentId);
}
@Test
public void givenUserWithoutAnyPermissionGetSecondaryConceptByIdThenObtained()
throws Exception {
session = newCMISSessionAsUserInZeCollection(sasquatch);
assertThat(session.getObject(zeCollectionRecords.taxo1_fond1_1.getId())).isNotNull();
assertThat(session.getObject(zeCollectionRecords.taxo1_category2_1.getId())).isNotNull();
}
@Test
public void whenEditingFolderInAdministrativeUnitThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
String path = "/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2_1/";
String parentId = "zetaxo2_station2_1";
session = newCMISSessionAsUserInZeCollection(admin);
Record newFolder = createNewFolderWithTestProperties(parentId);
Folder parent = cmisFolder(zeCollectionRecords.taxo2_station2_1);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
CmisObject object = session.getObjectByPath(path + newFolder.getId());
updateFolderWithTestProperties(object, "modifiedTitle");
assertThat(object.getName()).isEqualTo("modifiedTitle");
updateFolderWithTestProperties(object, "folderTest");
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
object = session.getObjectByPath(path + newFolder.getId());
updateFolderWithTestPropertiesExpectingPermissionError(object, "modifiedTitle");
assertThat(object.getName()).isNotEqualTo("modifiedTitle");
session = newCMISSessionAsUserInZeCollection(dakota);
object = session.getObjectByPath(path + newFolder.getId());
updateFolderWithTestProperties(object, "modifiedTitle");
assertThat(object.getName()).isEqualTo("modifiedTitle");
updateFolderWithTestProperties(object, "folderTest");
session = newCMISSessionAsUserInZeCollection(bobGratton);
object = session.getObjectByPath(path + newFolder.getId());
updateFolderWithTestProperties(object, "modifiedTitle");
assertThat(object.getName()).isEqualTo("modifiedTitle");
updateFolderWithTestProperties(object, "folderTest");
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
object = session.getObjectByPath(path + newFolder.getId());
updateFolderWithTestPropertiesExpectingPermissionError(object, "modifiedTitle");
assertThat(object.getName()).isNotEqualTo("modifiedTitle");
}
@Test
public void whenEditingFolderInFolderThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
String path = "/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/zetaxo2_station2_1/folder2/folder2_2";
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder2);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
CmisObject object = session.getObjectByPath(path);
updateFolderWithTestProperties(object, "folderTest");
assertThat(object.getName()).isEqualTo("folderTest");
updateFolderWithTestProperties(object, "folder2_2");
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
object = session.getObjectByPath(path);
updateFolderWithTestPropertiesExpectingPermissionError(object, "folderTest");
assertThat(object.getName()).isNotEqualTo("folderTest");
updateFolderWithTestPropertiesExpectingPermissionError(object, "folder2_2");
session = newCMISSessionAsUserInZeCollection(dakota);
object = session.getObjectByPath(path);
updateFolderWithTestProperties(object, "folderTest");
assertThat(object.getName()).isEqualTo("folderTest");
updateFolderWithTestProperties(object, "folder2_2");
session = newCMISSessionAsUserInZeCollection(bobGratton);
object = session.getObjectByPath(path);
updateFolderWithTestProperties(object, "folderTest");
assertThat(object.getName()).isEqualTo("folderTest");
updateFolderWithTestProperties(object, "folder2_2");
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
object = session.getObjectByPath(path);
updateFolderWithTestPropertiesExpectingPermissionError(object, "folderTest");
assertThat(object.getName()).isNotEqualTo("folderTest");
updateFolderWithTestPropertiesExpectingPermissionError(object, "folder2_2");
}
@Test
public void whenEditingDocumentInAdministrativeUnitThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
String path = "/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2_1/folder2/";
String parentId = "folder2";
session = newCMISSessionAsUserInZeCollection(admin);
Record newDocument = createNewDocumentWithTestProperties(parentId);
Folder parent = cmisFolder(zeCollectionRecords.folder2);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
CmisObject object = session.getObjectByPath(path + newDocument.getId());
updateDocumentWithTestProperties(object, "modifiedTitle");
assertThat(object.getName()).isEqualTo("modifiedTitle");
updateDocumentWithTestProperties(object, "testDocument");
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
object = session.getObjectByPath(path + newDocument.getId());
updateDocumentWithTestPropertiesExpectingPermissionError(object, "modifiedTitle");
assertThat(object.getName()).isNotEqualTo("modifiedTitle");
session = newCMISSessionAsUserInZeCollection(dakota);
object = session.getObjectByPath(path + newDocument.getId());
updateDocumentWithTestProperties(object, "modifiedTitle");
assertThat(object.getName()).isEqualTo("modifiedTitle");
updateDocumentWithTestProperties(object, "testDocument");
session = newCMISSessionAsUserInZeCollection(bobGratton);
object = session.getObjectByPath(path + newDocument.getId());
updateDocumentWithTestProperties(object, "modifiedTitle");
assertThat(object.getName()).isEqualTo("modifiedTitle");
updateDocumentWithTestProperties(object, "testDocument");
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
object = session.getObjectByPath(path + newDocument.getId());
updateDocumentWithTestPropertiesExpectingPermissionError(object, "modifiedTitle");
assertThat(object.getName()).isNotEqualTo("modifiedTitle");
}
@Test
public void whenEditingDocumentInFolderThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
String path = "/taxo_taxo2/zetaxo2_unit1/zetaxo2_station2/zetaxo2_station2_1/folder2/folder2_2/folder2_2_doc1";
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder2_2);
parent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
CmisObject object = session.getObjectByPath(path);
updateDocumentWithTestProperties(object, "documentTest");
assertThat(object.getName()).isEqualTo("documentTest");
updateDocumentWithTestProperties(object, "folder2_2_doc1");
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
object = session.getObjectByPath(path);
updateDocumentWithTestPropertiesExpectingPermissionError(object, "documentTest");
assertThat(object.getName()).isNotEqualTo("documentTest");
session = newCMISSessionAsUserInZeCollection(dakota);
object = session.getObjectByPath(path);
updateDocumentWithTestProperties(object, "documentTest");
assertThat(object.getName()).isEqualTo("documentTest");
updateDocumentWithTestProperties(object, "folder2_2_doc1");
session = newCMISSessionAsUserInZeCollection(bobGratton);
object = session.getObjectByPath(path);
updateDocumentWithTestProperties(object, "documentTest");
assertThat(object.getName()).isEqualTo("documentTest");
updateDocumentWithTestProperties(object, "folder2_2_doc1");
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
object = session.getObjectByPath(path);
updateDocumentWithTestPropertiesExpectingPermissionError(object, "documentTest");
assertThat(object.getName()).isNotEqualTo("documentTest");
}
@Test
public void whenMovingFolderInFolderThenOnlyWorksWithNewParentWriteAuthorization()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder oldParent = cmisFolder(zeCollectionRecords.folder2);
oldParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
Folder movedFolder = cmisFolder(zeCollectionRecords.folder2_2);
movedFolder.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
Folder newParent = cmisFolder(zeCollectionRecords.folder1);
newParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record record = zeCollectionRecords.folder2_2;
String newParentID = zeCollectionRecords.folder1.getId();
assertThat(canBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
assertThat(canBeMovedTo(record, newParentID)).isFalse();
session = newCMISSessionAsUserInZeCollection(dakota);
assertThat(canBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(bobGratton);
assertThat(canBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
assertThat(canBeMovedTo(record, newParentID)).isFalse();
}
@Test
public void whenMovingFolderInFolderWithoutParentWriteAuthorizationThenGoodErrorMessage()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder oldParent = cmisFolder(zeCollectionRecords.folder2);
oldParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
Folder movedFolder = cmisFolder(zeCollectionRecords.folder2_2);
movedFolder.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
Folder newParent = cmisFolder(zeCollectionRecords.folder1);
newParent.addAcl(asList(ace(bobGratton, R), ace(charles, R)), REPOSITORYDETERMINED);
Record record = zeCollectionRecords.folder2_2;
String newParentID = zeCollectionRecords.folder1.getId();
session = newCMISSessionAsUserInZeCollection(bobGratton);
assertThat(validateErrorFromFunctionCanBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
assertThat(validateErrorFromFunctionCanBeMovedTo(record, newParentID)).isTrue();
}
@Test
public void whenMovingFolderInAdministrativeUnitThenOnlyWorksWithNewParentWriteAuthorization()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder oldParent = cmisFolder(zeCollectionRecords.taxo2_station2_1);
oldParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Folder movedFolder = cmisFolder(zeCollectionRecords.folder2);
movedFolder.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Folder newParent = cmisFolder(zeCollectionRecords.taxo2_unit1_1);
newParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record record = zeCollectionRecords.folder2;
String newParentID = zeCollectionRecords.taxo2_unit1_1.getId();
assertThat(canBeMovedTo(record, newParentID, zeCollectionRecords.taxo2_station2_1)).isTrue();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
assertThat(canBeMovedTo(record, newParentID, zeCollectionRecords.taxo2_station2_1)).isFalse();
session = newCMISSessionAsUserInZeCollection(dakota);
assertThat(canBeMovedTo(record, newParentID, zeCollectionRecords.taxo2_station2_1)).isTrue();
session = newCMISSessionAsUserInZeCollection(bobGratton);
assertThat(canBeMovedTo(record, newParentID, zeCollectionRecords.taxo2_station2_1)).isTrue();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
assertThat(canBeMovedTo(record, newParentID, zeCollectionRecords.taxo2_station2_1)).isFalse();
}
@Test
public void whenMovingDocumentInFolderThenOnlyWorksWithParentWriteAuthorization()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder oldParent = cmisFolder(zeCollectionRecords.folder1);
oldParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
Folder movedFolder = cmisFolder(zeCollectionRecords.folder1_doc1);
movedFolder.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
Folder newParent = cmisFolder(zeCollectionRecords.folder2);
newParent.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
Record record = zeCollectionRecords.folder1_doc1;
String newParentID = zeCollectionRecords.folder2.getId();
assertThat(canBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(aliceWonderland);
assertThat(canBeMovedTo(record, newParentID)).isFalse();
session = newCMISSessionAsUserInZeCollection(dakota);
assertThat(canBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(bobGratton);
assertThat(canBeMovedTo(record, newParentID)).isTrue();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
assertThat(canBeMovedTo(record, newParentID)).isFalse();
}
@Test
public void whenDeletingFolderInFolderThenOnlyWorksWithParentDeleteAuthorization()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder1);
parent.addAcl(asList(ace(bobGratton, RWD), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
String parentID = parent.getId();
Record deletedRecord = createAndDeleteNewFolder(admin, parentID);
assertThat(deletedRecord).isNull();
deletedRecord = createAndDeleteNewFolder(aliceWonderland, parentID);
assertThat(deletedRecord).isNotNull();
deletedRecord = createAndDeleteNewFolder(dakota, parentID);
assertThat(deletedRecord).isNotNull();
deletedRecord = createAndDeleteNewFolder(bobGratton, parentID);
assertThat(deletedRecord).isNull();
deletedRecord = createAndDeleteNewFolder(charlesFrancoisXavier, parentID);
assertThat(deletedRecord).isNotNull();
}
@Test
public void whenDeletingFolderInAdministrativeUnitThenOnlyWorksWithParentDeleteAuthorization()
throws RecordServicesException {
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.taxo2_station2_1);
parent.addAcl(asList(ace(bobGratton, RWD), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
String parentID = parent.getId();
Record deletedRecord = createAndDeleteNewFolder(admin, parentID);
assertThat(deletedRecord).isNull();
deletedRecord = createAndDeleteNewFolder(aliceWonderland, parentID);
assertThat(deletedRecord).isNotNull();
deletedRecord = createAndDeleteNewFolder(dakota, parentID);
assertThat(deletedRecord).isNotNull();
deletedRecord = createAndDeleteNewFolder(bobGratton, parentID);
assertThat(deletedRecord).isNull();
deletedRecord = createAndDeleteNewFolder(charlesFrancoisXavier, parentID);
assertThat(deletedRecord).isNotNull();
}
@Test
public void whenDeletingDocumentInFolderThenOnlyWorksWithParentDeleteAuthorization()
throws Exception {
session = newCMISSessionAsUserInZeCollection(admin);
Folder parent = cmisFolder(zeCollectionRecords.folder1);
parent.addAcl(asList(ace(bobGratton, RWD), ace(charlesFrancoisXavier, RW)), REPOSITORYDETERMINED);
String parentID = parent.getId();
Record deletedRecord = createAndDeleteNewDocument(admin, parentID);
assertThat(deletedRecord).isNull();
deletedRecord = createAndDeleteNewDocument(aliceWonderland, parentID);
assertThat(deletedRecord).isNotNull();
deletedRecord = createAndDeleteNewDocument(dakota, parentID);
assertThat(deletedRecord).isNotNull();
deletedRecord = createAndDeleteNewDocument(bobGratton, parentID);
assertThat(deletedRecord).isNull();
deletedRecord = createAndDeleteNewDocument(charlesFrancoisXavier, parentID);
assertThat(deletedRecord).isNotNull();
}
@Test
public void whenGetContentInputStreamThenOnlyWorkIfUserHasAccess()
throws Exception {
session = newCMISSessionAsUserInZeCollection(admin);
Map<String, Object> properties = new HashMap<>();
properties.put(PropertyIds.NAME, "cmis:document");
properties.put(PropertyIds.OBJECT_TYPE_ID, "document_default");
Folder document = cmisFolder(zeCollectionRecords.folder1).createFolder(properties);
document.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
properties = new HashMap<>();
properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
//properties.put("metadata", "content");
String id = document.createDocument(properties, pdf1ContentStream(), VersioningState.MAJOR).getId();
for (String user : asList(charlesFrancoisXavier, bobGratton, admin, aliceWonderland, dakota)) {
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
assertThat(toByteArray(((Document) session.getObject(id)).getContentStream().getStream()).length)
.isEqualTo((int) pdf1Length);
}
for (String user : asList(robin, edouard)) {
session = newCMISSessionAsUserInZeCollection(robin);
try {
toByteArray(((Document) session.getObject(id)).getContentStream().getStream());
fail("Exception expected");
} catch (CmisRuntimeException e) {
assertThat(e.getMessage()).contains("permission CMIS CAN_GET_CONTENT_STREAM");
}
}
}
@Test
public void whenCheckingInThenOnlyWorksIfUserIsBorrower()
throws Exception {
session = newCMISSessionAsUserInZeCollection(admin);
Map<String, Object> properties = new HashMap<>();
properties.put(PropertyIds.NAME, "cmis:document");
properties.put(PropertyIds.OBJECT_TYPE_ID, "document_default");
Folder document = cmisFolder(zeCollectionRecords.folder1).createFolder(properties);
document.addAcl(asList(ace(bobGratton, RW), ace(charlesFrancoisXavier, R)), REPOSITORYDETERMINED);
properties = new HashMap<>();
properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
//properties.put("metadata", "content");
Document content = document.createDocument(properties, pdf1ContentStream(), VersioningState.MAJOR);
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
content = (Document) session.getObject(content.getId());
try {
content.checkOut();
fail("Exception expected");
} catch (CmisRuntimeException e) {
assertThat(e.getMessage()).contains("permission CMIS CAN_CHECK_OUT");
}
session = newCMISSessionAsUserInZeCollection(admin);
content = (Document) session.getObject(content.getId());
content.checkOut();
session = newCMISSessionAsUserInZeCollection(charlesFrancoisXavier);
content = (Document) session.getObject(content.getId());
try {
content.checkIn(true, new HashMap<String, Object>(), pdf2ContentStream(), "Ze comment");
fail("Exception expected");
} catch (CmisRuntimeException e) {
assertThat(e.getMessage()).contains("permission CMIS CAN_CHECK_IN");
}
session = newCMISSessionAsUserInZeCollection(admin);
content = (Document) session.getObject(content.getId());
content.checkIn(true, new HashMap<String, Object>(), pdf2ContentStream(), "Ze comment");
}
private ContentStream pdf1ContentStream()
throws IOException {
String filename = "pdf1.pdf";
BigInteger length = BigInteger.valueOf(pdf1Length);
InputStream stream = getTestResourceInputStream(CmisSinglevalueContentManagementAcceptTest.class, "pdf1.pdf");
return new ContentStreamImpl(filename, length, PDF_MIMETYPE, stream);
}
private ContentStream pdf2ContentStream()
throws IOException {
String filename = "pdf2.pdf";
BigInteger length = BigInteger.valueOf(pdf2Length);
String mimetype = PDF_MIMETYPE;
InputStream stream = getTestResourceInputStream(CmisSinglevalueContentManagementAcceptTest.class, "pdf2.pdf");
return new ContentStreamImpl(filename, length, mimetype, stream);
}
private List<CmisObject> getChildren(CmisObject parent) {
List<CmisObject> children = new ArrayList<>();
if (parent.getBaseTypeId().value().equals("CMIS_FOLDER")) {
Iterator<CmisObject> childrenIterator = ((Folder) parent).getChildren().iterator();
while (childrenIterator.hasNext()) {
children.add(childrenIterator.next());
}
}
return children;
}
private List<CmisObject> getDescendants(String parentPath) {
CmisObject parent = session.getObjectByPath(parentPath);
return getDescendants(parent);
}
private List<CmisObject> getDescendants(CmisObject parent) {
List<CmisObject> children = new ArrayList<>();
List<CmisObject> descendants = new ArrayList<>();
Iterator<CmisObject> childrenIterator = ((Folder) parent).getChildren().iterator();
if (childrenIterator != null) {
while (childrenIterator.hasNext()) {
children.add(childrenIterator.next());
}
}
for (CmisObject child : children) {
descendants.addAll(getDescendants(child));
}
children.addAll(descendants);
return children;
}
private void givenFolderInheritingTaxonomyAuthorizations() {
AuthorizationAddRequest authorization = authorizationInCollection(zeCollection).forUsers(users.edouardIn(zeCollection))
.on(zeCollectionRecords.taxo2_station2_1).givingReadWriteAccess();
getModelLayerFactory().newAuthorizationsServices().add(authorization, users.adminIn(zeCollection));
try {
waitForBatchProcess();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
private Ace ace(String principal, List<String> permissions) {
return session.getObjectFactory().createAce(principal, permissions);
}
private Folder cmisFolder(Record record) {
return (Folder) session.getObject(record.getId());
}
private String createNewFolderWithTestProperties(String parent, String objectType) {
ObjectId parentFolderId = new ObjectIdImpl(parent);
Map<String, Object> newFolderProperties = new HashMap<>();
newFolderProperties.put(PropertyIds.OBJECT_TYPE_ID, objectType);
newFolderProperties.put("title", "testFolder");
newFolderProperties.put("numberMeta", 42.666);
return session.createFolder(newFolderProperties, parentFolderId).getId();
}
private Record createNewFolderWithTestProperties(String parentId) {
return recordServices.getDocumentById(createNewFolderWithTestProperties(parentId, "folder_default"));
}
private void createNewFolderWithTestPropertiesExpectingPermissionError(String parentId) {
try {
createNewFolderWithTestProperties(parentId);
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_CREATE_FOLDER")) {
//OK
} else {
throw e;
}
}
}
private void createNewDocumentWithTestPropertiesExpectingPermissionError(String parentId) {
try {
createNewDocumentWithTestProperties(parentId);
fail("Exception expected");
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_CREATE_FOLDER")) {
//OK
} else {
throw e;
}
}
}
private Record createNewDocumentWithTestProperties(String parentId) {
String title = "testDocument";
String mimeType = "image/tiff";
File documentFile = getTestResourceFile(ContentManagementAcceptTest.class, "pdf1.pdf");
return recordServices.getDocumentById(addDocumentToFolder(documentFile, title, mimeType, parentId));
}
private String addDocumentToFolder(File documentFile, String title, String mimeType, String savedInFolder) {
ObjectId savedInFolderObjectId = new ObjectIdImpl(savedInFolder);
//
//-- Create a document (considered as a Folder by CMIS)
Map<String, Object> documentProperties = new HashMap<>();
documentProperties.put(PropertyIds.OBJECT_TYPE_ID, "document_default");
documentProperties.put("title", title);
ObjectId newDocumentId = session.createFolder(documentProperties, savedInFolderObjectId);
return newDocumentId.getId();
}
private Record createAndDeleteNewFolder(String user, String parentId) {
session = newCMISSessionAsUserInZeCollection(admin);
String id = createNewFolderWithTestProperties(parentId, "folder_default");
session = newCMISSessionAsUserInZeCollection(user);
ObjectId objectId = new ObjectIdImpl(id);
try {
((Folder) session.getObject(objectId)).deleteTree(true, UnfileObject.DELETE, true);
} catch (CmisRuntimeException e) {
//OK
}
try {
return recordServices.getDocumentById(id);
} catch (Exception e) {
return null;
}
}
private Record createAndDeleteNewDocument(String user, String parentId)
throws Exception {
session = newCMISSessionAsUserInZeCollection(admin);
String id = createNewDocumentWithTestProperties(parentId).getId();
session = newCMISSessionAsUserInZeCollection(user);
ObjectId objectId = new ObjectIdImpl(id);
try {
((Folder) session.getObject(objectId)).deleteTree(true, UnfileObject.DELETE, true);
} catch (CmisRuntimeException e) {
//OK
}
try {
return recordServices.getDocumentById(id);
} catch (Exception e) {
return null;
}
}
private void updateFolderWithTestPropertiesExpectingPermissionError(CmisObject objectList, String title) {
try {
updateFolderWithTestProperties(objectList, title);
fail("Exception expected");
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_UPDATE_PROPERTIES")) {
//OK
} else {
throw e;
}
}
}
private void updateFolderWithTestProperties(CmisObject objectList, String title) {
Map<String, Object> newFolderProperties = new HashMap<>();
newFolderProperties.put(PropertyIds.OBJECT_TYPE_ID, "folder_default");
newFolderProperties.put("title", title);
// newFolderProperties.put("numberMeta", 42.666);
((Folder) objectList).updateProperties(newFolderProperties);
}
private void updateDocumentWithTestPropertiesExpectingPermissionError(CmisObject objectList, String title) {
try {
updateDocumentWithTestProperties(objectList, title);
fail("Exception expected");
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_UPDATE_PROPERTIES")) {
//OK
} else {
throw e;
}
}
}
private void updateDocumentWithTestProperties(CmisObject objectList, String title) {
Map<String, Object> contentProperties = new HashMap<>();
contentProperties.put(PropertyIds.OBJECT_TYPE_ID, "document_default");
contentProperties.put("title", title);
((Folder) objectList).updateProperties(contentProperties);
}
private void moveObject(Record record, String parentTargetId) {
CmisObject object = session.getObject(record.getId());
Holder<String> objectIdHolder = new Holder<String>(object.getId());
session.getBinding().getObjectService()
.moveObject(session.getRepositoryInfo().getId(), objectIdHolder, parentTargetId, record.getId(), null);
recordServices.refresh(record);
}
private boolean canBeMovedTo(Record record, String parentTargetId) {
String oldParentID = record.getParentId();
try {
moveObject(record, parentTargetId);
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_MOVE_OBJECT") ||
e.getMessage().contains("permission CMIS CAN_CREATE_FOLDER")) {
return false;
} else {
throw e;
}
}
boolean isMovable = record.getParentId().equals(parentTargetId);
moveObject(record, oldParentID);
return isMovable;
}
private boolean validateErrorFromFunctionCanBeMovedTo(Record record, String parentTargetId) {
String oldParentID = record.getParentId();
try {
moveObject(record, parentTargetId);
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_MOVE_OBJECT") ||
e.getMessage().contains("permission CMIS CAN_CREATE_FOLDER")) {
return true;
}
}
return false;
}
private boolean canBeMovedTo(Record record, String parentTargetId, Record oldParent) {
try {
moveObject(record, parentTargetId);
} catch (CmisRuntimeException e) {
if (e.getMessage().contains("permission CMIS CAN_MOVE_OBJECT")) {
return false;
} else {
throw e;
}
}
boolean isMovable = !record.get(Schemas.PATH).toString()
.equals(oldParent.get(Schemas.PATH).toString() + "/" + record.getId());
moveObject(record, oldParent.getId());
return isMovable;
}
private void printTaxonomies(User user) {
StringBuilder stringBuilder = new StringBuilder();
for (Taxonomy taxonomy : taxonomiesManager.getEnabledTaxonomies(zeCollection)) {
stringBuilder.append(taxonomy.getCode() + " : \n");
for (Record record : new ConceptNodesTaxonomySearchServices(getModelLayerFactory())
.getRootConcept(zeCollection, taxonomy.getCode(), new TaxonomiesSearchOptions().setRows(100))) {
printConcept(user, taxonomy.getCode(), record, 1, stringBuilder);
}
stringBuilder.append("\n\n");
}
System.out.println(stringBuilder.toString());
}
private void printConcept(User user, String taxonomy, Record record, int level, StringBuilder stringBuilder) {
for (int i = 0; i < level; i++) {
stringBuilder.append("\t");
}
stringBuilder.append(record.getId() + "\n");
for (TaxonomySearchRecord child : taxonomiesSearchServices
.getVisibleChildConcept(user, taxonomy, record, new TaxonomiesSearchOptions().setRows(100))) {
printConcept(user, taxonomy, child.getRecord(), level + 1, stringBuilder);
}
}
private Condition<? super CmisObject> property(final String key, final Object value) {
return new Condition<CmisObject>() {
@Override
public boolean matches(CmisObject objectData) {
assertThat(objectData.getPropertyValue(key)).describedAs(key).isEqualTo(value);
return true;
}
};
}
}