1
2
3
4
5
6
7
8
9
10
11
12
13
14 package waffle.apache;
15
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20
21 import org.apache.catalina.Realm;
22 import org.apache.catalina.realm.GenericPrincipal;
23
24 import com.google.common.base.Joiner;
25
26 import waffle.windows.auth.IWindowsAccount;
27 import waffle.windows.auth.IWindowsIdentity;
28 import waffle.windows.auth.PrincipalFormat;
29 import waffle.windows.auth.WindowsAccount;
30
31
32
33
34
35
36 public class GenericWindowsPrincipal extends GenericPrincipal {
37
38
39 private final byte[] sid;
40
41
42 private final String sidString;
43
44
45 private final Map<String, WindowsAccount> groups;
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public GenericWindowsPrincipal(final IWindowsIdentity newWindowsIdentity, final Realm newRealm,
60 final PrincipalFormat newPrincipalFormat, final PrincipalFormat newRoleFormat) {
61 super(newRealm, newWindowsIdentity.getFqn(), "",
62 GenericWindowsPrincipal.getRoles(newWindowsIdentity, newPrincipalFormat, newRoleFormat));
63 this.sid = newWindowsIdentity.getSid();
64 this.sidString = newWindowsIdentity.getSidString();
65 this.groups = GenericWindowsPrincipal.getGroups(newWindowsIdentity.getGroups());
66 }
67
68
69
70
71
72
73
74
75
76
77
78
79 private static List<String> getRoles(final IWindowsIdentity windowsIdentity, final PrincipalFormat principalFormat,
80 final PrincipalFormat roleFormat) {
81 final List<String> roles = new ArrayList<String>();
82 roles.addAll(GenericWindowsPrincipal.getPrincipalNames(windowsIdentity, principalFormat));
83 for (final IWindowsAccount group : windowsIdentity.getGroups()) {
84 roles.addAll(GenericWindowsPrincipal.getRoleNames(group, roleFormat));
85 }
86 return roles;
87 }
88
89
90
91
92
93
94
95
96 private static Map<String, WindowsAccount> getGroups(final IWindowsAccount[] groups) {
97 final Map<String, WindowsAccount> groupMap = new HashMap<String, WindowsAccount>();
98 for (final IWindowsAccount group : groups) {
99 groupMap.put(group.getFqn(), new WindowsAccount(group));
100 }
101 return groupMap;
102 }
103
104
105
106
107
108
109 public byte[] getSid() {
110 return this.sid.clone();
111 }
112
113
114
115
116
117
118 public String getSidString() {
119 return this.sidString;
120 }
121
122
123
124
125
126
127 public Map<String, WindowsAccount> getGroups() {
128 return this.groups;
129 }
130
131
132
133
134
135
136
137
138
139
140 private static List<String> getRoleNames(final IWindowsAccount group, final PrincipalFormat principalFormat) {
141 final List<String> principals = new ArrayList<String>();
142 switch (principalFormat) {
143 case FQN:
144 principals.add(group.getFqn());
145 break;
146 case SID:
147 principals.add(group.getSidString());
148 break;
149 case BOTH:
150 principals.add(group.getFqn());
151 principals.add(group.getSidString());
152 break;
153 case NONE:
154 break;
155 default:
156 break;
157 }
158 return principals;
159 }
160
161
162
163
164
165
166
167
168
169
170 private static List<String> getPrincipalNames(final IWindowsIdentity windowsIdentity,
171 final PrincipalFormat principalFormat) {
172 final List<String> principals = new ArrayList<String>();
173 switch (principalFormat) {
174 case FQN:
175 principals.add(windowsIdentity.getFqn());
176 break;
177 case SID:
178 principals.add(windowsIdentity.getSidString());
179 break;
180 case BOTH:
181 principals.add(windowsIdentity.getFqn());
182 principals.add(windowsIdentity.getSidString());
183 break;
184 case NONE:
185 break;
186 default:
187 break;
188 }
189 return principals;
190 }
191
192
193
194
195
196
197 public String getRolesString() {
198 return Joiner.on(", ").join(this.getRoles());
199 }
200 }