1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.michaelo.tomcat.authenticator;
17
18 import java.io.IOException;
19
20 import javax.servlet.http.HttpServletResponse;
21
22 import net.sf.michaelo.tomcat.StringUtils;
23
24 import org.apache.catalina.authenticator.AuthenticatorBase;
25 import org.apache.catalina.connector.Request;
26 import org.apache.juli.logging.Log;
27 import org.apache.juli.logging.LogFactory;
28 import org.apache.tomcat.util.res.StringManager;
29 import org.ietf.jgss.GSSException;
30 import org.ietf.jgss.Oid;
31
32
33
34
35
36 abstract class GSSAuthenticatorBase extends AuthenticatorBase {
37
38 protected final Log logger = LogFactory.getLog(getClass());
39 protected final StringManager sm = StringManager.getManager(getClass());
40
41 protected static final Oid KRB5_MECHANISM;
42 protected static final Oid SPNEGO_MECHANISM;
43
44 static {
45 try {
46 KRB5_MECHANISM = new Oid("1.2.840.113554.1.2.2");
47 } catch (GSSException e) {
48 throw new IllegalStateException("Failed to create OID for Kerberos 5 mechanism");
49 }
50
51 try {
52 SPNEGO_MECHANISM = new Oid("1.3.6.1.5.5.2");
53 } catch (GSSException e) {
54 throw new IllegalStateException("Failed to create OID for SPNEGO mechanism");
55 }
56 }
57
58 private String loginEntryName;
59 private boolean omitErrorMessages;
60 private boolean errorMessagesAsHeaders;
61 private boolean storeDelegatedCredential;
62
63
64
65
66
67
68 public void setLoginEntryName(String loginEntryName) {
69 this.loginEntryName = loginEntryName;
70 }
71
72
73
74
75
76
77 public String getLoginEntryName() {
78 return loginEntryName;
79 }
80
81
82
83
84
85
86 public boolean isOmitErrorMessages() {
87 return omitErrorMessages;
88 }
89
90
91
92
93
94
95 public void setOmitErrorMessages(boolean omitErrorMessages) {
96 this.omitErrorMessages = omitErrorMessages;
97 }
98
99
100
101
102
103
104 public boolean isErrorMessagesAsHeaders() {
105 return errorMessagesAsHeaders;
106 }
107
108
109
110
111
112
113
114
115
116
117
118
119
120 public void setErrorMessagesAsHeaders(boolean errorMessagesAsHeaders) {
121 this.errorMessagesAsHeaders = errorMessagesAsHeaders;
122 }
123
124
125
126
127
128
129 public boolean isStoreDelegatedCredential() {
130 return storeDelegatedCredential;
131 }
132
133
134
135
136
137
138 public void setStoreDelegatedCredential(boolean storeDelegatedCredential) {
139 this.storeDelegatedCredential = storeDelegatedCredential;
140 }
141
142 protected void respondErrorMessage(
143 Request request, HttpServletResponse response, int statusCode, String messageKey, Object... params)
144 throws IOException {
145
146 String message = null;
147 if (!omitErrorMessages && StringUtils.isNotEmpty(messageKey)) message = sm.getString(messageKey, params);
148
149 if (errorMessagesAsHeaders) {
150 if (StringUtils.isNotEmpty(message)) {
151 String headerName;
152 switch (statusCode) {
153 case HttpServletResponse.SC_UNAUTHORIZED:
154 headerName = "Auth-Error";
155 break;
156 case HttpServletResponse.SC_INTERNAL_SERVER_ERROR:
157 headerName = "Server-Error";
158 break;
159 default:
160 throw new IllegalArgumentException(String.format("Status code %s not supported", statusCode));
161 }
162
163 response.setHeader(headerName, message);
164 }
165
166 response.setStatus(statusCode);
167 } else response.sendError(statusCode, message);
168 }
169
170 protected void sendInternalServerError(
171 Request request, HttpServletResponse response, String messageKey, Object... params) throws IOException {
172 respondErrorMessage(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, messageKey, params);
173 }
174
175 protected void sendUnauthorized(Request request, HttpServletResponse response, String scheme) throws IOException {
176 sendUnauthorized(request, response, scheme, null);
177 }
178
179 protected void sendUnauthorized(
180 Request request, HttpServletResponse response, String scheme, String messageKey, Object... params)
181 throws IOException {
182 response.addHeader(AUTH_HEADER_NAME, scheme);
183
184 respondErrorMessage(request, response, HttpServletResponse.SC_UNAUTHORIZED, messageKey, params);
185 }
186 }