package org.jasig.cas.test.client;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.restlet.Client;
/**
* An example Java client to authenticate against CAS using REST services.
* Please ensure you have followed the necessary setup found on the wiki.
*
* @author jesse lauren farinacci
* @since 3.4.2
*/
public final class RestClient
{
private static final Logger LOG = Logger.getLogger(Client.class.getName());
private RestClient()
{
// static-only access
}
public static String getTicket(final String server, final String username,
final String password, final String service)
{
notNull(server, "server must not be null");
notNull(username, "username must not be null");
notNull(password, "password must not be null");
notNull(service, "service must not be null");
return getServiceTicket(server, getTicketGrantingTicket(server, username,
password), service);
}
private static String getServiceTicket(final String server,
final String ticketGrantingTicket, final String service)
{
if (ticketGrantingTicket == null)
return null;
LOG.info(ticketGrantingTicket);
final HttpClient client = new HttpClient();
final PostMethod post = new PostMethod(server + "/" + ticketGrantingTicket);
post.setRequestBody(new NameValuePair[] { new NameValuePair("service",
service) });
try
{
client.executeMethod(post);
final String response = post.getResponseBodyAsString();
switch (post.getStatusCode())
{
case 200:
return response;
default:
LOG.warning("Invalid response code (" + post.getStatusCode()
+ ") from CAS server!");
LOG.info("Response (1k): "
+ response.substring(0, Math.min(1024, response.length())));
break;
}
}
catch (final IOException e)
{
LOG.warning(e.getMessage());
}
finally
{
post.releaseConnection();
}
return null;
}
private static String getTicketGrantingTicket(final String server,
final String username, final String password)
{
final HttpClient client = new HttpClient();
final PostMethod post = new PostMethod(server);
post.setRequestBody(new NameValuePair[] {
new NameValuePair("username", username),
new NameValuePair("password", password) });
try
{
client.executeMethod(post);
final String response = post.getResponseBodyAsString();
switch (post.getStatusCode())
{
case 201:
{
final Matcher matcher = Pattern.compile(".*action=\".*/(.*?)\".*")
.matcher(response);
if (matcher.matches())
return matcher.group(1);
LOG
.warning("Successful ticket granting request, but no ticket found!");
LOG.info("Response (1k): "
+ response.substring(0, Math.min(1024, response.length())));
break;
}
default:
LOG.warning("Invalid response code (" + post.getStatusCode()
+ ") from CAS server!");
LOG.info("Response (1k): "
+ response.substring(0, Math.min(1024, response.length())));
break;
}
}
catch (final IOException e)
{
LOG.warning(e.getMessage());
}
finally
{
post.releaseConnection();
}
return null;
}
public static String validateTicket(final String server,
final String serviceTicket, final String service) {
return validateTicket(server, serviceTicket, service, null);
}
public static String validateTicket(final String server,
final String serviceTicket, final String service,
final String delegatingUserName)
{
if (serviceTicket == null)
return null;
final HttpClient client = new HttpClient();
final PostMethod post = new PostMethod(server + "/serviceValidate");
List nameValuePairs = new ArrayList();
nameValuePairs.add(new NameValuePair("service", service));
if (delegatingUserName == null) {
nameValuePairs.add(new NameValuePair("ticket", serviceTicket));
} else {
nameValuePairs.add(new NameValuePair("ticket", delegatingUserName + ":" + serviceTicket));
}
post.setRequestBody(nameValuePairs.toArray(new NameValuePair[]{}));
try
{
client.executeMethod(post);
final String response = post.getResponseBodyAsString();
switch (post.getStatusCode())
{
case 200:
return response;
default:
LOG.warning("Invalid response code (" + post.getStatusCode()
+ ") from CAS server!");
LOG.info("Response (1k): "
+ response.substring(0, Math.min(1024, response.length())));
break;
}
}
catch (final IOException e)
{
LOG.warning(e.getMessage());
}
finally
{
post.releaseConnection();
}
return null;
}
private static void notNull(final Object object, final String message)
{
if (object == null)
throw new IllegalArgumentException(message);
}
public static void main(final String[] args)
{
final String server = "http://localhost:9080/cas/v1/tickets";
final String server2 = "http://localhost:9080/cas";
// final String username = "container";
// final String password = "DfqnIUD&@dqa32sd";
final String username = "dawidl@icm.edu.pl";
final String password = "1";
final String service = "http://localhost:9080/service";
final String delegatingUserName = "portal";
String serviceTicket = getTicket(server, username, password, service);
LOG.info(serviceTicket);
String response = validateTicket(server2, serviceTicket, service);
LOG.info(response);
// response = validateTicket(server2, serviceTicket, service, delegatingUserName);
// LOG.info(response);
//serviceValidate?service=http%3A%2F%2Fwww.service.com&ticket=ST-1856339-aA5Yuvrxzpv8Tau1cYQ7
}
}