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