001/* 002 * (C) Copyright 2000-2003 Yale University. All rights reserved. 003 * 004 * THIS SOFTWARE IS PROVIDED "AS IS," AND ANY EXPRESS OR IMPLIED 005 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 006 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE EXPRESSLY 007 * DISCLAIMED. IN NO EVENT SHALL YALE UNIVERSITY OR ITS EMPLOYEES BE 008 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 009 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED, THE COSTS OF 010 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR 011 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 012 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 013 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 014 * SOFTWARE, EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH 015 * DAMAGE. 016 * 017 * Redistribution and use of this software in source or binary forms, 018 * with or without modification, are permitted, provided that the 019 * following conditions are met: 020 * 021 * 1. Any redistribution must include the above copyright notice and 022 * disclaimer and this list of conditions in any related documentation 023 * and, if feasible, in the redistributed software. 024 * 025 * 2. Any redistribution must include the acknowledgment, "This product 026 * includes software developed by Yale University," in any related 027 * documentation and, if feasible, in the redistributed software. 028 * 029 * 3. The names "Yale" and "Yale University" must not be used to endorse 030 * or promote products derived from this software. 031 */ 032 033package edu.yale.its.tp.cas.client; 034 035import java.util.ArrayList; 036import java.util.List; 037 038import org.xml.sax.Attributes; 039import org.xml.sax.SAXException; 040import org.xml.sax.helpers.DefaultHandler; 041 042/** 043 * Validates PTs and optionally retrieves PGT IOUs. Subclassed instead of collapsed into parent because we don't want 044 * users to accidentally accept a proxy ticket when they mean only to accept service tickets. That is, proxy targets 045 * need to know that they're proxy targets, not first-level web applications. 046 */ 047public class ProxyTicketValidator extends ServiceTicketValidator { 048 049 // ********************************************************************* 050 // Additive state 051 052 protected List<String> proxyList; 053 054 // ********************************************************************* 055 // Accessors 056 057 /** 058 * Retrieves a list of proxies involved in the current authentication. 059 */ 060 public List<String> getProxyList() { 061 return proxyList; 062 } 063 064 // ********************************************************************* 065 // Response parser 066 067 @Override 068 protected DefaultHandler newHandler() { 069 return new ProxyHandler(); 070 } 071 072 protected class ProxyHandler extends ServiceTicketValidator.Handler { 073 074 // ********************************************** 075 // Constants 076 077 protected static final String PROXIES = "cas:proxies"; 078 079 protected static final String PROXY = "cas:proxy"; 080 081 // ********************************************** 082 // Parsing state 083 084 protected List<String> proxyList = new ArrayList<>(); 085 086 protected boolean proxyFragment = false; 087 088 // ********************************************** 089 // Parsing logic 090 091 @Override 092 public void startElement(String ns, String ln, String qn, Attributes a) { 093 super.startElement(ns, ln, qn, a); 094 if (authenticationSuccess && qn.equals(PROXIES)) 095 proxyFragment = true; 096 } 097 098 @Override 099 public void endElement(String ns, String ln, String qn) throws SAXException { 100 super.endElement(ns, ln, qn); 101 if (qn.equals(PROXIES)) 102 proxyFragment = false; 103 else if (proxyFragment && qn.equals(PROXY)) 104 proxyList.add(currentText.toString().trim()); 105 } 106 107 @Override 108 public void endDocument() throws SAXException { 109 super.endDocument(); 110 if (authenticationSuccess) 111 ProxyTicketValidator.this.proxyList = proxyList; 112 } 113 } 114 115 // ********************************************************************* 116 // Utility methods 117 118 /** 119 * Clears internally manufactured state. 120 */ 121 @Override 122 protected void clear() { 123 super.clear(); 124 proxyList = null; 125 } 126 127}