/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig 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 the following location:
*
* 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.jasig.cas.login;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import net.sourceforge.jwebunit.HttpUnitDialog;
/**
* Tests the /validate legacy (CAS 1.0) ticket validation service of a CAS server.
*
* @author Scott Battaglia
* @author Andrew Petro
* @author Drew Mazurek
* @since 3.0
*/
public class ValidateCompatibilityTests extends AbstractCompatibilityTests {
/**
* CAS 1.0 response indicating that the ticket was invalid.
*/
public static final String LEGACY_NO_RESPONSE = "no\n\n";
public ValidateCompatibilityTests() throws IOException {
super();
}
public ValidateCompatibilityTests(final String name) throws IOException {
super(name);
}
/**
* Test /validate with no parameters set.
*/
public void testNoParameters() {
beginAt("/validate");
assertTextPresent("no");
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
HttpUnitDialog htDialog = getDialog();
String validateOutput = htDialog.getResponseText();
String exactExpectedResponse = LEGACY_NO_RESPONSE;
assertEquals(exactExpectedResponse, validateOutput);
}
/**
* Test that validating a bad service ticket results in the CAS 1 validation failure
* response.
* @throws UnsupportedEncodingException
*/
public void testBadServiceTicket() throws UnsupportedEncodingException {
final String service = "https://localhost:8443/contacts-cas/j_acegi_cas_security_check";
beginAt("/validate?service=" + URLEncoder.encode(service, "UTF-8") + "&ticket=test");
assertTextPresent("no");
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
HttpUnitDialog htDialog = getDialog();
String validateOutput = htDialog.getResponseText();
assertEquals(LEGACY_NO_RESPONSE, validateOutput);
}
/**
* Test for the correct CAS1 validation success response.
* @throws IOException
*/
public void testProperCredentialsAndServiceTicket() throws IOException {
// log into CAS and obtain a service ticket
final String service = "http://www.cnn.com";
beginAt("/login?service=" + URLEncoder.encode(service, "UTF-8"));
setFormElement("username", getUsername());
setFormElement("password", getGoodPassword());
submit();
HttpUnitDialog htDialog = getDialog();
String serviceTicket = LoginHelper.serviceTicketFromResponse(htDialog.getResponse());
beginAt("/validate?service=" + URLEncoder.encode(service, "UTF-8") + "&ticket=" + serviceTicket);
assertTextPresent("yes");
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
htDialog = getDialog();
String validateOutput = htDialog.getResponseText();
String expected = "yes\n" + getUsername() + "\n";
assertEquals(expected, validateOutput);
// test that a second validation of the same ticket fails
beginAt("/validate?service=" + URLEncoder.encode(service, "UTF-8") + "&ticket=" + serviceTicket);
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
htDialog = getDialog();
String secondValidateOutput = htDialog.getResponseText();
assertEquals(LEGACY_NO_RESPONSE, secondValidateOutput);
}
/**
* Test that validating a ticket for a service other than that declared at
* validation (declaring different services at /login and at /validate)
* causes the ticket validation failure response.
* @throws IOException
*/
public void testServiceMismatch() throws IOException {
// log into CAS and obtain a service ticket
final String loginService = "http://www.rutgers.edu";
final String validateService = "http://www.yale.edu";
beginAt("/login?service=" + URLEncoder.encode(loginService, "UTF-8"));
setFormElement("username", getUsername());
setFormElement("password", getGoodPassword());
submit();
HttpUnitDialog htDialog = getDialog();
String serviceTicket = LoginHelper.serviceTicketFromResponse(htDialog.getResponse());
beginAt("/validate?service=" + URLEncoder.encode(validateService, "UTF-8") + "&ticket=" + serviceTicket);
assertTextPresent("no");
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
htDialog = getDialog();
String validateOutput = htDialog.getResponseText();
assertEquals(LEGACY_NO_RESPONSE, validateOutput);
// test that validation will now fail even if we specify the right service,
// that is, that the ticket is now invalid
beginAt("/validate?service=" + URLEncoder.encode(loginService, "UTF-8") + "&ticket=" + serviceTicket);
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
htDialog = getDialog();
String secondValidateOutput = htDialog.getResponseText();
assertEquals(LEGACY_NO_RESPONSE, secondValidateOutput);
}
/**
* Test that attempting to validate a ticket without declaring
* a service returns the ticket validation failure response and
* invalidates the ticket causing subsequent attempts to validate the
* ticket to fail with the ticket validation failure response.
* @throws IOException
*/
public void testNoService() throws IOException {
// log into CAS and obtain a service ticket
final String service = "http://www.ja-sig.org";
beginAt("/login?service=" + URLEncoder.encode(service, "UTF-8"));
setFormElement("username", getUsername());
setFormElement("password", getGoodPassword());
submit();
HttpUnitDialog htDialog = getDialog();
String serviceTicket = LoginHelper.serviceTicketFromResponse(htDialog.getResponse());
beginAt("/validate?ticket=" + serviceTicket);
assertTextPresent("no");
// here we test that the response was exactly that specified
// in section 2.4.2 of the CAS spec
htDialog = getDialog();
String validateOutput = htDialog.getResponseText();
assertEquals(LEGACY_NO_RESPONSE, validateOutput);
// whether ticket validation would now succeed if we were to validate
// specifying the correct service is unspecified, so we do not test it.
}
public void testNoValidateProxyTickets() {
//TODO test that validation of a proxy ticket fails.
}
}