]> git.argeo.org Git - gpl/argeo-jcr.git/blob - org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAuthContext.java
Prepare next development cycle
[gpl/argeo-jcr.git] / org.argeo.cms.jcr / src / org / argeo / security / jackrabbit / ArgeoAuthContext.java
1 package org.argeo.security.jackrabbit;
2
3 import javax.security.auth.Subject;
4 import javax.security.auth.callback.CallbackHandler;
5 import javax.security.auth.login.LoginContext;
6 import javax.security.auth.login.LoginException;
7
8 import org.apache.jackrabbit.core.security.authentication.AuthContext;
9
10 /** Wraps a regular {@link LoginContext}, using the proper class loader. */
11 class ArgeoAuthContext implements AuthContext {
12 private LoginContext lc;
13
14 private String loginContextName;
15
16 public ArgeoAuthContext(String appName, Subject subject, CallbackHandler callbackHandler) {
17 this.loginContextName = appName;
18 // Context class loader for login context is set when it is created.
19 // we make sure that it uses our won class loader
20 ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader();
21 try {
22 Thread.currentThread().setContextClassLoader(SystemJackrabbitLoginModule.class.getClassLoader());
23 lc = new LoginContext(loginContextName, subject, callbackHandler);
24 } catch (LoginException e) {
25 throw new IllegalStateException("Cannot configure Jackrabbit login context", e);
26 } finally {
27 Thread.currentThread().setContextClassLoader(currentContextCl);
28 }
29 }
30
31 @Override
32 public void login() throws LoginException {
33 try {
34 lc.login();
35 } catch (LoginException e) {
36 // we force a runtime exception since Jackrabbit swallows LoginException
37 // and still create a session
38 throw new IllegalStateException("Login context " + loginContextName + " failed", e);
39 }
40 }
41
42 @Override
43 public Subject getSubject() {
44 return lc.getSubject();
45 }
46
47 @Override
48 public void logout() throws LoginException {
49 lc.logout();
50 }
51
52 }