// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed 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 com.google.enterprise.connector.util.filter;
import com.google.common.base.Strings;
import com.google.enterprise.connector.spi.Document;
import com.google.enterprise.connector.spi.Principal;
import com.google.enterprise.connector.spi.Property;
import com.google.enterprise.connector.spi.SpiConstants;
import com.google.enterprise.connector.spi.SpiConstants.CaseSensitivityType;
import com.google.enterprise.connector.spi.Value;
import com.google.enterprise.connector.spiimpl.PrincipalValue;
import com.google.enterprise.connector.test.ConnectorTestUtils;
import java.util.ArrayList;
import java.util.Map;
public class AclpropertyFilterTest extends DocumentFilterTest {
/** Creates a AclPropertyFilter. */
protected Document createFilter(Document doc,
CaseSensitivityType caseSensitivityType, String userDomain,
boolean overwriteUserDomain) throws Exception {
AclPropertyFilter factory = new AclPropertyFilter();
if (caseSensitivityType != null) {
factory.setCaseSensitivityType(caseSensitivityType.toString());
}
if (!Strings.isNullOrEmpty(userDomain)) {
factory.setUserDomain(userDomain);
factory.setOverwriteUserDomain(overwriteUserDomain);
}
return factory.newDocumentFilter(doc);
}
public void testAclFilterFindPropertyWithPrincipalValue() throws Exception {
Map<String, Object> props = ConnectorTestUtils
.createSimpleDocumentBasicProperties("testDocId");
Principal principal = new Principal(
SpiConstants.PrincipalType.UNQUALIFIED,null, "John Doe",
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLUSERS, principal);
Document input = ConnectorTestUtils.createSimpleDocument(props);
Document output = createFilter(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, null, false);
Property prop = output.findProperty(SpiConstants.PROPNAME_ACLUSERS);
Value value = prop.nextValue();
Principal newPrincipal = ((PrincipalValue) value).getPrincipal();
assertEquals(principal.getName(), newPrincipal.getName());
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
}
public void testAclFilterFindPropertyWithSamePrincipalValue()
throws Exception {
Map<String, Object> props = ConnectorTestUtils
.createSimpleDocumentBasicProperties("testDocId");
Principal principal = new Principal(
SpiConstants.PrincipalType.UNQUALIFIED, null, "John Doe",
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLUSERS, principal);
Document input = ConnectorTestUtils.createSimpleDocument(props);
Document output = createFilter(input,
CaseSensitivityType.EVERYTHING_CASE_SENSITIVE, null, false);
Property prop = output.findProperty(SpiConstants.PROPNAME_ACLUSERS);
Value value = prop.nextValue();
Principal newPrincipal = ((PrincipalValue) value).getPrincipal();
assertEquals(principal.getName(), newPrincipal.getName());
assertTrue(newPrincipal.getCaseSensitivityType().equals(
CaseSensitivityType.EVERYTHING_CASE_SENSITIVE));
}
public void testAclFilterFindPropertyWithNoPrincipalValue()
throws Exception {
Map<String, Object> props = ConnectorTestUtils
.createSimpleDocumentBasicProperties("testDocId");
Principal principal = new Principal(
SpiConstants.PrincipalType.UNQUALIFIED, null, "John Doe",
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLUSERS, principal);
Document input = ConnectorTestUtils.createSimpleDocument(props);
AclPropertyFilter factory = new AclPropertyFilter();
Document output = factory.newDocumentFilter(input);
Property prop = output.findProperty(SpiConstants.PROPNAME_ACLUSERS);
Value value = prop.nextValue();
Principal newPrincipal = ((PrincipalValue) value).getPrincipal();
assertEquals(principal.getName(), newPrincipal.getName());
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
}
public void testAclFilterFindPropertyWithAclInheritFrom()
throws Exception {
Map<String, Object> props = ConnectorTestUtils
.createSimpleDocumentBasicProperties("testDocId");
Principal principal = new Principal(
SpiConstants.PrincipalType.UNQUALIFIED, null, "John Doe",
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLUSERS, principal);
props.put(SpiConstants.PROPNAME_ACLINHERITFROM, "parentId");
Document input = ConnectorTestUtils.createSimpleDocument(props);
AclPropertyFilter factory = new AclPropertyFilter();
Document output = factory.newDocumentFilter(input);
Property prop = output.findProperty(SpiConstants.PROPNAME_ACLUSERS);
Value value = prop.nextValue();
Principal newPrincipal = ((PrincipalValue) value).getPrincipal();
assertEquals(principal.getName(), newPrincipal.getName());
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
Property propInheritFrom =
output.findProperty(SpiConstants.PROPNAME_ACLINHERITFROM);
Value valueInheritfrom = propInheritFrom.nextValue();
assertEquals("parentId", valueInheritfrom.toString());
}
public void testAclFilterFindPropertyWithStringValues() throws Exception {
Map<String, Object> props = ConnectorTestUtils
.createSimpleDocumentBasicProperties("testDocId");
ArrayList<String> userList = new ArrayList<String>();
userList.add("John Doe");
userList.add("GI Joe");
props.put(SpiConstants.PROPNAME_ACLUSERS, userList);
Document input = ConnectorTestUtils.createSimpleDocument(props);
Document output = createFilter(input,
CaseSensitivityType.EVERYTHING_CASE_SENSITIVE, null, false);
Property prop = output.findProperty(SpiConstants.PROPNAME_ACLUSERS);
Value value;
while ((value = prop.nextValue()) != null) {
if (value instanceof PrincipalValue) {
Principal newPrincipal = ((PrincipalValue) value).getPrincipal();
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
}
}
}
public Document createDocument(String username, String denyUser) {
Map<String, Object> props =
ConnectorTestUtils.createSimpleDocumentBasicProperties("testDocId");
if (!Strings.isNullOrEmpty(username)) {
Principal principal =
new Principal(SpiConstants.PrincipalType.UNKNOWN, null, username,
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLUSERS, principal);
}
if (!Strings.isNullOrEmpty(denyUser)) {
Principal denyprincipal =
new Principal(SpiConstants.PrincipalType.UNKNOWN, null, denyUser,
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLDENYUSERS, denyprincipal);
}
return ConnectorTestUtils.createSimpleDocument(props);
}
public Principal getPrincipal(Document output, String name)
throws Exception {
Property prop = output.findProperty(name);
Value value = prop.nextValue();
return ((PrincipalValue) value).getPrincipal();
}
public Principal createFilterAndGetPrinicpal(Document input,
CaseSensitivityType caseSensitivity, String newUserDomain,
boolean overwriteUserDomain, String name) throws Exception {
Document output = createFilter(input, caseSensitivity, newUserDomain,
overwriteUserDomain);
return getPrincipal(output, name);
}
public void testAclFilterFindPropertyWithUserDomainValue() throws Exception {
Document input = createDocument("John Doe", null);
String newUserDomain = "MyCompany";
Principal newPrincipal =
createFilterAndGetPrinicpal(input, null, newUserDomain, false,
SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyWithPrincipalValueAndUserDomainValue()
throws Exception {
Document input = createDocument("John Doe", null);
String newUserDomain = "MyCompany";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain,
false, SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyWithEmptyUserDomainValue()
throws Exception {
Document input = createDocument("John Doe", null);
String newUserDomain = "";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain, false,
SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertEquals("John Doe", newPrincipal.getName());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyWithEmptyDenyUserDomainValue()
throws Exception {
Document input = createDocument(null, "John Doe");
String newUserDomain = "";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain, false,
SpiConstants.PROPNAME_ACLDENYUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertEquals("John Doe", newPrincipal.getName());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyOverwriteUserDomainValue()
throws Exception {
Document input = createDocument("noCompany\\John Doe", null);
String newUserDomain = "MyCompany";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain, true,
SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyOverwriteDenyUserDomainValue()
throws Exception {
Document input = createDocument(null, "noCompany\\John Doe");
String newUserDomain = "MyCompany";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain, true,
SpiConstants.PROPNAME_ACLDENYUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyOverwriteUserDomainValueFormat2()
throws Exception {
Document input = createDocument("John Doe@noCompany", null);
String newUserDomain = "MyCompany";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain, true,
SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyOverwriteDenyUserDomainValueFormat2()
throws Exception {
Document input = createDocument(null, "John Doe@noCompany");
String newUserDomain = "MyCompany";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE, newUserDomain, true,
SpiConstants.PROPNAME_ACLDENYUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_INSENSITIVE,
newPrincipal.getCaseSensitivityType());
assertTrue(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyNoOverwriteUserDomainValue()
throws Exception {
Document input = createDocument("noCompany\\John Doe", null);
String newUserDomain = "MyCompany";
Principal newPrincipal =
createFilterAndGetPrinicpal(input, null, newUserDomain, false,
SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
assertEquals("noCompany\\John Doe", newPrincipal.getName());
assertFalse(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterFindPropertyNoOverwriteDenyUserDomainValue()
throws Exception {
Document input = createDocument(null, "noCompany\\John Doe");
String newUserDomain = "MyCompany";
Principal newPrincipal =
createFilterAndGetPrinicpal(input, null, newUserDomain, false,
SpiConstants.PROPNAME_ACLDENYUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
assertEquals("noCompany\\John Doe", newPrincipal.getName());
assertFalse(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterUserDomainForPrincipalType() throws Exception {
Map<String, Object> props = ConnectorTestUtils
.createSimpleDocumentBasicProperties("testDocId");
Principal principal = new Principal(
SpiConstants.PrincipalType.UNQUALIFIED, null, "John Doe",
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(SpiConstants.PROPNAME_ACLUSERS, principal);
Document input = ConnectorTestUtils.createSimpleDocument(props);
String newUserDomain = "MyCompany";
Principal newPrincipal = createFilterAndGetPrinicpal(input,
CaseSensitivityType.EVERYTHING_CASE_SENSITIVE, newUserDomain, false,
SpiConstants.PROPNAME_ACLUSERS);
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
assertEquals(principal.getName(), newPrincipal.getName());
assertFalse(newPrincipal.getName().contains(newUserDomain));
}
public void testAclFilterWithNoFilterChanges() throws Exception {
Document input = createDocument("Jane Doe", "John Doe");
AclPropertyFilter factory = new AclPropertyFilter();
Document output = factory.newDocumentFilter(input);
Property prop = output.findProperty(SpiConstants.PROPNAME_ACLUSERS);
Value value = prop.nextValue();
Principal newPrincipal = ((PrincipalValue) value).getPrincipal();
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
newPrincipal.getCaseSensitivityType());
assertEquals("Jane Doe", newPrincipal.getName());
Property denyprop =
output.findProperty(SpiConstants.PROPNAME_ACLDENYUSERS);
Value denyvalue = denyprop.nextValue();
Principal denyPrincipal = ((PrincipalValue) denyvalue).getPrincipal();
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
denyPrincipal.getCaseSensitivityType());
assertEquals("John Doe", denyPrincipal.getName());
}
public void assertValues(Principal principal, String userName, String domain,
boolean changeDomain) {
assertEquals(CaseSensitivityType.EVERYTHING_CASE_SENSITIVE,
principal.getCaseSensitivityType());
assertEquals(userName, principal.getName());
if (changeDomain) {
assertTrue(principal.getName().contains(domain));
} else {
assertFalse(principal.getName().contains(domain));
}
}
public void addPrincipalToDocument(Map<String, Object> props, String key,
String name) {
Principal principal =
new Principal(SpiConstants.PrincipalType.UNKNOWN, null, name,
SpiConstants.CaseSensitivityType.EVERYTHING_CASE_SENSITIVE);
props.put(key, principal);
}
public void testAclFilterForGroupDomainChange() throws Exception {
Map<String, Object> props =
ConnectorTestUtils.createSimpleDocumentBasicProperties("testDocId");
addPrincipalToDocument(props, SpiConstants.PROPNAME_ACLUSERS,
"noCompany\\John Doe");
addPrincipalToDocument(props, SpiConstants.PROPNAME_ACLDENYUSERS,
"anyCompany\\Jane Doe");
addPrincipalToDocument(props, SpiConstants.PROPNAME_ACLGROUPS,
"noCompany\\Sales");
addPrincipalToDocument(props, SpiConstants.PROPNAME_ACLDENYGROUPS,
"anyCompany\\Testing");
Document input = ConnectorTestUtils.createSimpleDocument(props);
String newUserDomain = "MyCompany";
Document output = createFilter(input,
CaseSensitivityType.EVERYTHING_CASE_SENSITIVE, newUserDomain, true);
Principal newPrincipal = getPrincipal(output,
SpiConstants.PROPNAME_ACLUSERS);
assertValues(newPrincipal, "MyCompany\\John Doe", newUserDomain, true);
Principal newDenyPrincipal = getPrincipal(output,
SpiConstants.PROPNAME_ACLDENYUSERS);
assertValues(newDenyPrincipal, "MyCompany\\Jane Doe", newUserDomain, true);
Principal newGroupPrincipal = getPrincipal(output,
SpiConstants.PROPNAME_ACLGROUPS);
assertValues(newGroupPrincipal, "noCompany\\Sales", newUserDomain, false);
Principal groupDenyPrincipal = getPrincipal(output,
SpiConstants.PROPNAME_ACLDENYGROUPS);
assertValues(groupDenyPrincipal, "anyCompany\\Testing",
newUserDomain, false);
}
}