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.context;
35
36 import info.magnolia.cms.security.PrincipalUtil;
37 import info.magnolia.cms.security.Security;
38 import info.magnolia.cms.security.User;
39 import info.magnolia.cms.security.UserManager;
40
41 import java.util.Locale;
42
43 import javax.security.auth.Subject;
44
45 import org.apache.commons.lang.LocaleUtils;
46
47
48
49
50
51
52
53
54 public class UserContextImpl extends AbstractContext implements UserContext {
55
56 private static final long serialVersionUID = 222L;
57
58 private static final String SESSION_SUBJECT = Subject.class.getName();
59
60 private User user;
61 private Subject subject;
62
63 public UserContextImpl() {
64
65 }
66
67 @Override
68 public Locale getLocale() {
69 if (locale == null) {
70 setLocaleFor(getUser());
71 }
72 return locale;
73 }
74
75 @Override
76 public User getUser() {
77 if (user != null) {
78 return user;
79 }
80
81 user = PrincipalUtil.findPrincipal(getSubject(), User.class);
82 if (user == null) {
83 throw new IllegalStateException("Subject must have a info.magnolia.cms.security.User principal.");
84 }
85 return user;
86 }
87
88 @Override
89 public Subject getSubject() {
90 if (subject != null) {
91 return this.subject;
92 }
93
94
95 subject = (Subject) getAttribute(SESSION_SUBJECT, Context.SESSION_SCOPE);
96 if (subject != null) {
97 return this.subject;
98 }
99
100
101 login(Security.getAnonymousSubject());
102 return subject;
103 }
104
105 @Override
106 public void login(Subject subject) {
107 User user = PrincipalUtil.findPrincipal(subject, User.class);
108 if (user == null) {
109 throw new IllegalArgumentException("When logging in the Subject must have a info.magnolia.cms.security.User principal.");
110 }
111 this.subject = subject;
112 this.user = user;
113 setLocaleFor(user);
114
115 if (!user.getName().equals(UserManager.ANONYMOUS_USER)) {
116 setAttribute(SESSION_SUBJECT, subject, Context.SESSION_SCOPE);
117 }
118 }
119
120 @Override
121 public void logout() {
122 subject = null;
123 user = null;
124 locale = null;
125 removeAttribute(SESSION_SUBJECT, Context.SESSION_SCOPE);
126 }
127
128 protected void setLocaleFor(User user) {
129
130 final String userLanguage = user.getLanguage();
131 setLocale(LocaleUtils.toLocale(userLanguage));
132 }
133
134 }