1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44:
45: import ;
46: import ;
47:
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55:
56:
59: public class CramMD5Client
60: extends ClientMechanism
61: implements SaslClient
62: {
63: public CramMD5Client()
64: {
65: super(Registry.SASL_CRAM_MD5_MECHANISM);
66: }
67:
68: protected void initMechanism() throws SaslException
69: {
70: }
71:
72: protected void resetMechanism() throws SaslException
73: {
74: }
75:
76: public boolean hasInitialResponse()
77: {
78: return false;
79: }
80:
81: public byte[] evaluateChallenge(final byte[] challenge) throws SaslException
82: {
83: if (challenge == null)
84: throw new SaslException("null challenge");
85: try
86: {
87: final String username;
88: final char[] password;
89: Callback[] callbacks;
90: if ((! properties.containsKey(Registry.SASL_USERNAME))
91: && (! properties.containsKey(Registry.SASL_PASSWORD)))
92: {
93: callbacks = new Callback[2];
94: final NameCallback nameCB;
95: final String defaultName = System.getProperty("user.name");
96: if (defaultName == null)
97: nameCB = new NameCallback("username: ");
98: else
99: nameCB = new NameCallback("username: ", defaultName);
100: final PasswordCallback pwdCB = new PasswordCallback("password: ",
101: false);
102: callbacks[0] = nameCB;
103: callbacks[1] = pwdCB;
104: this.handler.handle(callbacks);
105: username = nameCB.getName();
106: password = pwdCB.getPassword();
107: }
108: else
109: {
110: if (properties.containsKey(Registry.SASL_USERNAME))
111: username = (String) properties.get(Registry.SASL_USERNAME);
112: else
113: {
114: callbacks = new Callback[1];
115: final NameCallback nameCB;
116: final String defaultName = System.getProperty("user.name");
117: if (defaultName == null)
118: nameCB = new NameCallback("username: ");
119: else
120: nameCB = new NameCallback("username: ", defaultName);
121: callbacks[0] = nameCB;
122: this.handler.handle(callbacks);
123: username = nameCB.getName();
124: }
125:
126: if (properties.containsKey(Registry.SASL_PASSWORD))
127: password = ((String) properties.get(Registry.SASL_PASSWORD)).toCharArray();
128: else
129: {
130: callbacks = new Callback[1];
131: final PasswordCallback pwdCB = new PasswordCallback("password: ",
132: false);
133: callbacks[0] = pwdCB;
134: this.handler.handle(callbacks);
135: password = pwdCB.getPassword();
136: }
137: }
138: if (password == null)
139: throw new SaslException("null password supplied");
140: final byte[] digest;
141: try
142: {
143: digest = CramMD5Util.createHMac(password, challenge);
144: }
145: catch (InvalidKeyException x)
146: {
147: throw new AuthenticationException("evaluateChallenge()", x);
148: }
149: final String response = username + " "
150: + Util.toString(digest).toLowerCase();
151: this.complete = true;
152: return response.getBytes("UTF-8");
153: }
154: catch (UnsupportedCallbackException x)
155: {
156: throw new AuthenticationException("evaluateChallenge()", x);
157: }
158: catch (IOException x)
159: {
160: throw new AuthenticationException("evaluateChallenge()", x);
161: }
162: }
163:
164: protected String getNegotiatedQOP()
165: {
166: return Registry.QOP_AUTH;
167: }
168: }