1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.kuali.rice.kim.client.acegi;
18
19 import java.io.StringReader;
20
21 import javax.xml.parsers.DocumentBuilder;
22 import javax.xml.parsers.DocumentBuilderFactory;
23
24 import org.acegisecurity.AuthenticationServiceException;
25 import org.acegisecurity.BadCredentialsException;
26 import org.acegisecurity.providers.cas.TicketResponse;
27 import org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator;
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.kuali.rice.kim.sesn.DistributedSession;
31 import org.w3c.dom.Document;
32 import org.w3c.dom.Element;
33 import org.w3c.dom.NodeList;
34 import org.xml.sax.InputSource;
35
36 import edu.yale.its.tp.cas.client.ProxyTicketValidator;
37
38
39
40
41
42
43
44
45
46
47 public class KualiCasProxyTicketValidator extends CasProxyTicketValidator {
48
49
50 private static final Log logger = LogFactory.getLog(KualiCasProxyTicketValidator.class);
51
52 private DistributedSession distributedSession;
53
54
55
56
57
58
59
60
61
62 protected TicketResponse validateNow(ProxyTicketValidator pv)
63 throws AuthenticationServiceException, BadCredentialsException {
64 String sAuthenticationSource = null;
65 String sDST = null;
66
67 try {
68 pv.validate();
69 } catch (Exception internalProxyTicketValidatorProblem) {
70 throw new AuthenticationServiceException(internalProxyTicketValidatorProblem.getMessage());
71 }
72
73 if (!pv.isAuthenticationSuccesful()) {
74 throw new BadCredentialsException(pv.getErrorCode() + ": " + pv.getErrorMessage());
75 }
76
77 logger.debug("PROXY RESPONSE: " + pv.getResponse());
78
79 if (logger.isDebugEnabled()) {
80 logger.debug("DEBUG");
81 }
82
83 try {
84 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
85 DocumentBuilder builder = factory.newDocumentBuilder();
86 InputSource inStream = new InputSource();
87 inStream.setCharacterStream(new StringReader(pv.getResponse()));
88 Document doc = builder.parse(inStream);
89 Element head = doc.getDocumentElement();
90 NodeList attrs = head.getElementsByTagName("cas:attribute");
91 for (int i=0; i<attrs.getLength(); i++) {
92 logger.debug(("Field name:" + ((Element)attrs.item(i)).getAttribute("name")) + "=" + ((Element)attrs.item(i)).getAttribute("value"));
93 if ( ((Element)attrs.item(i)).getAttribute("name").equals("authenticationMethod") ) {
94 sAuthenticationSource = ((Element)attrs.item(i)).getAttribute("value");
95 } else if ( ((Element)attrs.item(i)).getAttribute("name").equals("DST") ) {
96 sDST = ((Element)attrs.item(i)).getAttribute("value");
97 }
98 }
99 if (sAuthenticationSource != null && sDST != null) {
100 String sPrincipal = pv.getUser() + "@" + sAuthenticationSource;
101
102 if (logger.isDebugEnabled()) {
103 logger.debug("Updating session: " + sDST + " " + sPrincipal);
104 }
105
106 distributedSession.touchSesn(sDST);
107
108 } else {
109 if (logger.isDebugEnabled()) {
110 logger.debug("Incomplete data from CAS:" + sAuthenticationSource + ":" + sDST);
111 }
112 }
113 } catch (Exception e) {
114 logger.error("Error parsing CAS Result", e);
115 }
116
117 logger.debug("Authentication Method:" + sAuthenticationSource);
118 return new KualiTicketResponse(pv.getUser(), pv.getProxyList(), pv.getPgtIou(), sDST);
119 }
120
121
122
123
124
125 public void setDistributedSession(DistributedSession distributedSession) {
126 this.distributedSession = distributedSession;
127 }
128
129
130 }