1
2
3
4
5
6
7
8
9
10
11
12
13 package org.abstracthorizon.mercury.common;
14
15 import java.io.IOException;
16
17 import javax.mail.Folder;
18 import javax.mail.MessagingException;
19 import javax.security.auth.callback.Callback;
20 import javax.security.auth.callback.CallbackHandler;
21 import javax.security.auth.callback.NameCallback;
22 import javax.security.auth.callback.PasswordCallback;
23 import javax.security.auth.callback.UnsupportedCallbackException;
24 import javax.security.auth.login.LoginContext;
25 import javax.security.auth.login.LoginException;
26
27 import org.abstracthorizon.mercury.common.exception.UserRejectedException;
28
29
30
31
32
33
34
35 public class SimpleJAASStorageManager extends SimpleStorageManager {
36
37
38 protected String loginContext;
39
40
41
42
43 public SimpleJAASStorageManager() {
44 }
45
46
47
48
49
50 public void setLoginContext(String loginContext) {
51 this.loginContext = loginContext;
52 }
53
54
55
56
57
58 public String getLoginContext() {
59 return loginContext;
60 }
61
62
63
64
65
66
67
68
69
70
71 @Override
72 public Folder findInbox(String mailbox, String domain, char[] password) throws UserRejectedException, MessagingException {
73 Folder folder = super.findInbox(mailbox, domain, password);
74 String loginContext = getLoginContext();
75 if ((loginContext != null) && (loginContext.length() > 0)) {
76 LoginContext lc = null;
77 try {
78 lc = new LoginContext(loginContext, new Handler(mailbox, password));
79 lc.login();
80 } catch (LoginException e) {
81 throw new UserRejectedException("Access to mailbox " + mailbox + " is rejected");
82 } finally {
83 if (lc != null) {
84 try {
85 lc.logout();
86 } catch (LoginException ignore) {
87 }
88 }
89 }
90 }
91
92 return folder;
93 }
94
95
96
97
98 protected static class Handler implements CallbackHandler {
99
100 protected String user;
101
102 protected char[] pass;
103
104
105
106
107
108
109 protected Handler(String user, char[] pass) {
110 this.user = user;
111 this.pass = pass;
112 }
113
114
115
116
117
118
119
120 public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
121 for (int i = 0; i < callbacks.length; i++) {
122 if (callbacks[i] instanceof NameCallback) {
123 NameCallback nc = (NameCallback)callbacks[i];
124 nc.setName(user);
125 } else if (callbacks[i] instanceof PasswordCallback) {
126 PasswordCallback pc = (PasswordCallback)callbacks[i];
127 pc.setPassword(pass);
128 }
129 }
130 }
131 }
132
133
134 }