| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.chemistry.opencmis.tck.tests.control; |
| |
| import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.FAILURE; |
| import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.INFO; |
| import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.SKIPPED; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.chemistry.opencmis.client.api.Document; |
| import org.apache.chemistry.opencmis.client.api.Folder; |
| import org.apache.chemistry.opencmis.client.api.Session; |
| import org.apache.chemistry.opencmis.commons.data.Ace; |
| import org.apache.chemistry.opencmis.commons.data.Acl; |
| import org.apache.chemistry.opencmis.commons.data.RepositoryInfo; |
| import org.apache.chemistry.opencmis.commons.enums.AclPropagation; |
| import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl; |
| import org.apache.chemistry.opencmis.tck.CmisTestResult; |
| import org.apache.chemistry.opencmis.tck.impl.AbstractSessionTest; |
| import org.apache.chemistry.opencmis.tck.impl.TestParameters; |
| |
| /** |
| * ACL smoke test. |
| */ |
| public class ACLSmokeTest extends AbstractSessionTest { |
| |
| @Override |
| public void init(Map<String, String> parameters) { |
| super.init(parameters); |
| setName("ACL Test"); |
| setDescription("Creates a document and checks its ACL."); |
| } |
| |
| @Override |
| public void run(Session session) { |
| CmisTestResult f; |
| |
| if (supportsACLs(session)) { |
| try { |
| // create folder and document |
| Folder testFolder = createTestFolder(session); |
| Document doc = createDocument(session, testFolder, "acltest.txt", "ACL test"); |
| |
| // check if there is an ACL |
| Acl acl = doc.getAcl(); |
| |
| f = createResult(FAILURE, "ACLs are supported but newly created document has no ACL!"); |
| addResult(assertNotNull(acl, null, f)); |
| |
| // check basic permissions |
| Acl basicAcl = session.getAcl(doc, true); |
| |
| f = createResult(FAILURE, |
| "ACLs are supported but repository does not return a basic ACL for the newly created document!"); |
| addResult(assertNotNull(basicAcl, null, f)); |
| |
| if (basicAcl != null) { |
| addResult(checkACL(session, basicAcl, false, "Basic ACL")); |
| |
| if (basicAcl.getAces() != null) { |
| for (Ace ace : basicAcl.getAces()) { |
| if (ace.getPermissions() != null) { |
| for (String permission : ace.getPermissions()) { |
| if (!"cmis:read".equals(permission) && !"cmis:write".equals(permission) |
| && !"cmis:all".equals(permission)) { |
| addResult(createResult(FAILURE, "ACE contains a non-basic permission: " |
| + permission)); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| if (getAclCapability(session) == CapabilityAcl.MANAGE |
| && !Boolean.FALSE.equals(doc.getType().isControllableAcl())) { |
| String principal = getParameters().get(TestParameters.DEFAULT_ACL_PRINCIPAL); |
| if (principal == null) { |
| principal = TestParameters.DEFAULT_ACL_PRINCIPAL_VALUE; |
| } |
| |
| // apply permission "cmis:write" |
| List<Ace> aces = new ArrayList<Ace>(); |
| aces.add(session.getObjectFactory().createAce(principal, Collections.singletonList("cmis:write"))); |
| |
| session.applyAcl(doc, aces, null, null); |
| |
| if (session.getRepositoryInfo().getAclCapabilities().getAclPropagation() != AclPropagation.REPOSITORYDETERMINED) { |
| // set permission "cmis:all" |
| aces = new ArrayList<Ace>(); |
| aces.add(session.getObjectFactory().createAce(principal, Collections.singletonList("cmis:all"))); |
| |
| session.setAcl(doc, aces); |
| } |
| } else { |
| addResult(createResult(INFO, "The repository or the type '" + doc.getType().getId() |
| + "' don't support managing ACLs.")); |
| } |
| |
| deleteObject(doc); |
| } finally { |
| deleteTestFolder(); |
| } |
| } else { |
| addResult(createResult(SKIPPED, "ACLs are not supported. Test Skipped!")); |
| } |
| } |
| |
| protected boolean supportsACLs(Session session) { |
| CapabilityAcl aclCap = getAclCapability(session); |
| return (aclCap != null) && (aclCap != CapabilityAcl.NONE); |
| } |
| |
| protected CapabilityAcl getAclCapability(Session session) { |
| RepositoryInfo repository = session.getRepositoryInfo(); |
| |
| if (repository.getCapabilities().getAclCapability() == null) { |
| return null; |
| } |
| |
| return repository.getCapabilities().getAclCapability(); |
| } |
| } |