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