// Copyright 2009 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.servlet;
import com.google.enterprise.connector.servlet.AuthorizationParser.ConnectorQueries;
import com.google.enterprise.connector.servlet.AuthorizationParser.QueryResources;
import com.google.enterprise.connector.spi.AuthenticationIdentity;
import com.google.enterprise.connector.spi.SimpleAuthenticationIdentity;
import junit.framework.TestCase;
/**
* Tests the AuthorizationParser class
*/
public class AuthorizationParserTest extends TestCase {
private static final String TWO_IDENTITIES_TWO_CONNECTORS =
"<AuthorizationQuery>\n" + "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1a</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2a</Resource>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1b</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2b</Resource>\n"
+ "</ConnectorQuery>\n" + "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username2</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1c</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/doc?"
+ "docid=doc2c</Resource>\n"
+ " <Resource>googleconnector://connector1.localhost/doc?"
+ "docid=doc1d</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/doc?"
+ "docid=doc2d</Resource>\n"
+ "</ConnectorQuery>\n"
+ "</AuthorizationQuery>\n";
private static final String ONE_IDENTITY_TWO_QUERIES =
"<AuthorizationQuery>\n" + "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1a</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2a</Resource>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1b</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2b</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1c</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2c</Resource>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1d</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2d</Resource>\n"
+ "</ConnectorQuery>\n"
+ "</AuthorizationQuery>\n";
private static final String TWO_IDENTITIES_MULTIPLE_QUERIES =
"<AuthorizationQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username1</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1a</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username2</Identity>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2a</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username1</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1b</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity source=\"connector\">username2</Identity>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2b</Resource>\n"
+ "</ConnectorQuery>\n"
+ "</AuthorizationQuery>\n";
private static final String MALFORMED_XML =
"<AuthorizationQuery>\n"
+ "<ConnectorQuery>\n"
+ "</AuthorizationQuery>\n"
+ "";
private ConnectorQueries getConnectorQueriesByIdentity(AuthorizationParser p,
AuthenticationIdentity identity) {
ConnectorQueries result = null;
for (AuthenticationIdentity i : p.getIdentities()) {
String username = identity.getUsername();
String password = identity.getPassword();
String domain = identity.getDomain();
if (AuthorizationParser.matchesIdentity(i, username, password, domain)) {
assertNull("Should be only one identity with username \""
+ username + "\" and password \"" + password + "\" and domain \""
+ domain + "\"", result);
result = p.getConnectorQueriesForIdentity(i);
}
}
return result;
}
private int countConnectorsForUsername(AuthorizationParser p,
String username) {
AuthenticationIdentity i = new SimpleAuthenticationIdentity(username);
return countConnectorsForIdentity(p, i);
}
private int countConnectorsForIdentity(AuthorizationParser p,
AuthenticationIdentity i) {
ConnectorQueries connectorQueries = getConnectorQueriesByIdentity(p, i);
return (connectorQueries == null) ? 0 : connectorQueries.size();
}
private int countUrlsForUsernameConnectorPair(AuthorizationParser p,
String username, String connectorName) {
AuthenticationIdentity i = new SimpleAuthenticationIdentity(username);
return countUrlsForIdentityConnectorPair(p, i, connectorName);
}
private int countUrlsForIdentityConnectorPair(AuthorizationParser p,
AuthenticationIdentity i, String connectorName) {
ConnectorQueries cq = getConnectorQueriesByIdentity(p, i);
assertNotNull(cq);
QueryResources queryUrls = cq.getQueryResources(connectorName);
if (queryUrls == null) {
return 0;
}
return queryUrls.size();
}
public void testSimple() {
AuthorizationParser ap =
new AuthorizationParser(AuthorizationTest.TEST_XML1);
assertEquals(2, ap.countParsedIdentities());
assertEquals(1, countConnectorsForUsername(ap, "username"));
assertEquals(2, countConnectorsForUsername(ap, "CN=foo"));
assertEquals(1, countUrlsForUsernameConnectorPair(ap, "username",
"connector3"));
}
public void testTwoIdentitiesTwoConnectors() {
AuthorizationParser ap =
new AuthorizationParser(TWO_IDENTITIES_TWO_CONNECTORS);
assertEquals(2, ap.countParsedIdentities());
assertEquals(2, countConnectorsForUsername(ap, "username"));
assertEquals(2, countConnectorsForUsername(ap, "username2"));
assertEquals(2, countUrlsForUsernameConnectorPair(ap, "username",
"connector2"));
}
public void testOneIdentityTwoQueries() {
AuthorizationParser ap =
new AuthorizationParser(ONE_IDENTITY_TWO_QUERIES);
assertEquals(1, ap.countParsedIdentities());
assertEquals(2, countConnectorsForUsername(ap, "username"));
assertEquals(4, countUrlsForUsernameConnectorPair(ap, "username",
"connector2"));
}
public void testTwoIdentitiesMultipleQueries() {
AuthorizationParser ap =
new AuthorizationParser(TWO_IDENTITIES_MULTIPLE_QUERIES);
assertEquals(2, ap.countParsedIdentities());
assertEquals(1, countConnectorsForUsername(ap, "username1"));
assertEquals(0, countUrlsForUsernameConnectorPair(ap, "username1",
"connector2"));
}
public void testMalformedXml() {
AuthorizationParser ap = new AuthorizationParser(MALFORMED_XML);
assertEquals(ConnectorMessageCode.ERROR_PARSING_XML_REQUEST,
ap.getStatus().getMessageId());
}
private static final String ONE_DOMAINSPECIFIC_IDENTITY =
"<AuthorizationQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity domain=\"foodomain\" source=\"connector\">"
+ "username</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1a</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2a</Resource>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1b</Resource>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2b</Resource>\n"
+ "</ConnectorQuery>\n"
+ "</AuthorizationQuery>\n";
public void testOneDomainSpecificIdentity() {
AuthorizationParser ap =
new AuthorizationParser(ONE_DOMAINSPECIFIC_IDENTITY);
assertEquals(1, ap.countParsedIdentities());
SimpleAuthenticationIdentity id =
new SimpleAuthenticationIdentity("username", null, "foodomain");
assertEquals(2, countConnectorsForIdentity(ap, id));
assertEquals(2, countUrlsForIdentityConnectorPair(ap, id, "connector1"));
assertEquals(2, countUrlsForIdentityConnectorPair(ap, id, "connector2"));
}
private static final String TWO_DOMAINSPECIFIC_IDENTITIES_MULTIPLE_QUERIES =
"<AuthorizationQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity domain=\"arglebargle\" source=\"connector\">"
+ "xyzzy</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1a</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity domain=\"bazfaz\" source=\"connector\">"
+ "xyzzy</Identity>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2a</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity domain=\"arglebargle\" source=\"connector\">"
+ "xyzzy</Identity>\n"
+ " <Resource>googleconnector://connector1.localhost/"
+ "doc?docid=doc1b</Resource>\n"
+ "</ConnectorQuery>\n"
+ "<ConnectorQuery>\n"
+ " <Identity domain=\"bazfaz\" source=\"connector\">"
+ "xyzzy</Identity>\n"
+ " <Resource>googleconnector://connector2.localhost/"
+ "doc?docid=doc2b</Resource>\n"
+ "</ConnectorQuery>\n"
+ "</AuthorizationQuery>\n";
public void testTwoDomainSpecificIdentitiesMultipleQueries() {
AuthorizationParser ap =
new AuthorizationParser(TWO_DOMAINSPECIFIC_IDENTITIES_MULTIPLE_QUERIES);
assertEquals(2, ap.countParsedIdentities());
SimpleAuthenticationIdentity i1 =
new SimpleAuthenticationIdentity("xyzzy", null, "arglebargle");
assertEquals(1, countConnectorsForIdentity(ap, i1));
assertEquals(2, countUrlsForIdentityConnectorPair(ap, i1, "connector1"));
assertEquals(0, countUrlsForIdentityConnectorPair(ap, i1, "connector2"));
SimpleAuthenticationIdentity i2 =
new SimpleAuthenticationIdentity("xyzzy", null, "bazfaz");
assertEquals(1, countConnectorsForIdentity(ap, i2));
assertEquals(0, countUrlsForIdentityConnectorPair(ap, i2, "connector1"));
assertEquals(2, countUrlsForIdentityConnectorPair(ap, i2, "connector2"));
}
private static final String PASSWORD_IDENTITY = "<AuthorizationQuery>\n"
+ " <ConnectorQuery>\n"
+ " <Identity password=\"password\" source=\"connector\">username</Identity>\n"
+ " <Resource>googleconnector://ex-tca-01.localhost/doc?docid=doc1</Resource>\n"
+ " <Resource>googleconnector://ex-tca-01.localhost/doc?docid=doc2</Resource>\n"
+ " <Resource>googleconnector://ex-tca-02.localhost/doc?docid=doc3</Resource>\n"
+ " <Resource>googleconnector://ex-tca-02.localhost/doc?docid=doc4</Resource>\n"
+ " </ConnectorQuery>\n"
+ "</AuthorizationQuery>\n";
public void testPasswordQuery() {
AuthorizationParser ap = new AuthorizationParser(PASSWORD_IDENTITY);
assertEquals(1, ap.countParsedIdentities());
SimpleAuthenticationIdentity id =
new SimpleAuthenticationIdentity("username", "password");
assertEquals(2, countConnectorsForIdentity(ap, id));
assertEquals(2, countUrlsForIdentityConnectorPair(ap, id, "ex-tca-01"));
assertEquals(2, countUrlsForIdentityConnectorPair(ap, id, "ex-tca-02"));
}
public void testMatchesIdentity() {
AuthenticationIdentity nameId =
new SimpleAuthenticationIdentity("user1");
assertTrue(AuthorizationParser.matchesIdentity(nameId,
"user1", null, null));
assertTrue(AuthorizationParser.matchesIdentity(nameId,
"user1", "", null));
assertTrue(AuthorizationParser.matchesIdentity(nameId,
"user1", null, ""));
assertTrue(AuthorizationParser.matchesIdentity(nameId,
"user1", "", ""));
assertFalse(AuthorizationParser.matchesIdentity(nameId,
"user2", null, null));
assertFalse(AuthorizationParser.matchesIdentity(nameId,
"user1", "pass1", null));
assertFalse(AuthorizationParser.matchesIdentity(nameId,
"user1", null, "domain1"));
AuthenticationIdentity namePassId =
new SimpleAuthenticationIdentity("user1", "pass1");
assertTrue(AuthorizationParser.matchesIdentity(namePassId,
"user1", "pass1", null));
assertTrue(AuthorizationParser.matchesIdentity(namePassId,
"user1", "pass1", ""));
assertFalse(AuthorizationParser.matchesIdentity(namePassId,
"user2", "pass1", null));
assertFalse(AuthorizationParser.matchesIdentity(namePassId,
"user1", "pass2", null));
assertFalse(AuthorizationParser.matchesIdentity(namePassId,
"user1", "", null));
AuthenticationIdentity namePassDomainId =
new SimpleAuthenticationIdentity("user1", "pass1", "domain1");
assertTrue(AuthorizationParser.matchesIdentity(namePassDomainId,
"user1", "pass1", "domain1"));
assertFalse(AuthorizationParser.matchesIdentity(namePassDomainId,
"user1", "pass1", "domain2"));
assertFalse(AuthorizationParser.matchesIdentity(namePassDomainId,
"user1", "pass2", "domain1"));
assertFalse(AuthorizationParser.matchesIdentity(namePassDomainId,
"user2", "pass1", "domain1"));
AuthenticationIdentity nameDomainId =
new SimpleAuthenticationIdentity("user1", null, "domain1");
assertTrue(AuthorizationParser.matchesIdentity(nameDomainId,
"user1", "", "domain1"));
assertTrue(AuthorizationParser.matchesIdentity(nameDomainId,
"user1", null, "domain1"));
assertFalse(AuthorizationParser.matchesIdentity(nameDomainId,
"user1", "pass1", "domain1"));
assertFalse(AuthorizationParser.matchesIdentity(nameDomainId,
"user1", null, "domain2"));
assertFalse(AuthorizationParser.matchesIdentity(nameDomainId,
"user2", null, "domain2"));
}
}