1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.michaelo.tomcat.realm;
17
18 import java.security.Principal;
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.apache.catalina.TomcatPrincipal;
25 import org.ietf.jgss.GSSCredential;
26 import org.ietf.jgss.GSSName;
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public class ActiveDirectoryPrincipal implements TomcatPrincipal {
44
45 private final GSSName gssName;
46 private final Sid sid;
47 private final transient GSSCredential gssCredential;
48 private final String[] roles;
49 private final Map<String, Object> additionalAttributes;
50
51
52 public ActiveDirectoryPrincipal(GSSName gssName, Sid sid, GSSCredential gssCredential) {
53 this(gssName, sid, null, gssCredential, null);
54 }
55
56
57 public ActiveDirectoryPrincipal(
58 GSSName gssName,
59 Sid sid,
60 List<String> roles,
61 GSSCredential gssCredential,
62 Map<String, Object> additionalAttributes) {
63 this.gssName = gssName;
64 this.sid = sid;
65 if (roles == null || roles.isEmpty()) this.roles = new String[0];
66 else {
67 this.roles = roles.toArray(new String[0]);
68 Arrays.sort(this.roles);
69 }
70 this.gssCredential = gssCredential;
71 if (additionalAttributes == null || additionalAttributes.isEmpty())
72 this.additionalAttributes = Collections.emptyMap();
73 else this.additionalAttributes = Collections.unmodifiableMap(additionalAttributes);
74 }
75
76 @Override
77 public Principal getUserPrincipal() {
78 return this;
79 }
80
81 @Override
82 public String getName() {
83 return gssName.toString();
84 }
85
86
87
88
89
90
91 public GSSName getGssName() {
92 return gssName;
93 }
94
95
96
97
98
99
100 public Sid getSid() {
101 return sid;
102 }
103
104 @Override
105 public GSSCredential getGssCredential() {
106 return gssCredential;
107 }
108
109
110
111
112
113
114
115 public boolean hasRole(String role) {
116 if ("*".equals(role))
117 return true;
118 if (role == null) return false;
119 return Arrays.binarySearch(roles, role) >= 0;
120 }
121
122
123
124
125
126
127 public String[] getRoles() {
128 return Arrays.copyOf(roles, roles.length);
129 }
130
131
132
133
134
135
136 public Map<String, Object> getAdditionalAttributes() {
137 return additionalAttributes;
138 }
139
140 @Override
141 public boolean equals(Object obj) {
142 if (obj == null) return false;
143
144 if (!(obj instanceof ActiveDirectoryPrincipal)) return false;
145
146 ActiveDirectoryPrincipal other = (ActiveDirectoryPrincipal) obj;
147
148 return gssName.equals((Object) other.gssName);
149 }
150
151 @Override
152 public int hashCode() {
153 return gssName.hashCode();
154 }
155
156 @Override
157 public String toString() {
158 return gssName.toString();
159 }
160
161 @Override
162 public void logout() throws Exception {
163 if (gssCredential != null) {
164 gssCredential.dispose();
165 }
166 }
167 }