1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.security;
35
36 import java.security.Principal;
37 import java.util.Iterator;
38 import javax.security.auth.Subject;
39
40 import info.magnolia.cms.security.auth.ACL;
41 import info.magnolia.cms.security.auth.PrincipalCollection;
42
43
44
45
46
47
48 public class PrincipalUtil {
49
50 public static Subject createSubject(User user) {
51 Subject subject = new Subject();
52 subject.getPrincipals().add(user);
53 return subject;
54 }
55
56 public static <T extends Principal> T findPrincipal(Subject subject, Class<T> clazz) {
57 return findPrincipal(subject.getPrincipals(), clazz, null);
58 }
59
60 public static ACL findAccessControlList(Iterable<Principal> principals, String name) {
61 return findPrincipal(principals, ACL.class, name);
62 }
63
64 public static ACL findAccessControlList(Subject subject, String name) {
65 return findPrincipal(subject.getPrincipals(), ACL.class, name);
66 }
67
68 public static <T extends Principal> T removePrincipal(Iterable<Principal> principals, Class<T> clazz) {
69 return removePrincipal(principals, clazz, null);
70 }
71
72 private static <T extends Principal> T findPrincipal(Iterable<Principal> principals, Class<T> clazz, String name) {
73 for (Principal principal : principals) {
74 if (matches(principal, clazz, name)) {
75 return (T) principal;
76 }
77 if (principal instanceof PrincipalCollection) {
78 T t = findPrincipal((PrincipalCollection) principal, clazz, name);
79 if (t != null) {
80 return t;
81 }
82 }
83 }
84 return null;
85 }
86
87 private static <T extends Principal> T removePrincipal(Iterable<Principal> principals, Class<T> clazz, String name) {
88 for (Iterator<Principal> iterator = principals.iterator(); iterator.hasNext(); ) {
89 Principal principal = iterator.next();
90 if (matches(principal, clazz, name)) {
91 iterator.remove();
92 return (T) principal;
93 }
94 if (principal instanceof PrincipalCollection) {
95 T t = removePrincipal((PrincipalCollection) principal, clazz, name);
96 if (t != null) {
97 return t;
98 }
99 }
100 }
101 return null;
102 }
103
104 private static boolean matches(Principal principal, Class<? extends Principal> clazz, String name) {
105 return (clazz == null || clazz.isAssignableFrom(principal.getClass())) &&
106 (name == null || name.equals(principal.getName()));
107 }
108 }