Skip to content

Commit 36ad6f1

Browse files
kcacademicpivovarit
authored andcommitted
Adding code for the tutorial tracked under BAEL-3073. (eugenp#7442)
1 parent 627fb4f commit 36ad6f1

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.baeldung.sasl;
2+
3+
import java.io.IOException;
4+
5+
import javax.security.auth.callback.Callback;
6+
import javax.security.auth.callback.CallbackHandler;
7+
import javax.security.auth.callback.NameCallback;
8+
import javax.security.auth.callback.PasswordCallback;
9+
import javax.security.auth.callback.UnsupportedCallbackException;
10+
import javax.security.sasl.RealmCallback;
11+
12+
public class ClientCallbackHandler implements CallbackHandler {
13+
14+
@Override
15+
public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException {
16+
for (Callback cb : cbs) {
17+
if (cb instanceof NameCallback) {
18+
NameCallback nc = (NameCallback) cb;
19+
nc.setName("username");
20+
} else if (cb instanceof PasswordCallback) {
21+
PasswordCallback pc = (PasswordCallback) cb;
22+
pc.setPassword("password".toCharArray());
23+
} else if (cb instanceof RealmCallback) {
24+
RealmCallback rc = (RealmCallback) cb;
25+
rc.setText("myServer");
26+
}
27+
}
28+
}
29+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.sasl;
2+
3+
import java.io.IOException;
4+
5+
import javax.security.auth.callback.Callback;
6+
import javax.security.auth.callback.CallbackHandler;
7+
import javax.security.auth.callback.NameCallback;
8+
import javax.security.auth.callback.PasswordCallback;
9+
import javax.security.auth.callback.UnsupportedCallbackException;
10+
import javax.security.sasl.AuthorizeCallback;
11+
import javax.security.sasl.RealmCallback;
12+
13+
public class ServerCallbackHandler implements CallbackHandler {
14+
15+
@Override
16+
public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException {
17+
for (Callback cb : cbs) {
18+
if (cb instanceof AuthorizeCallback) {
19+
AuthorizeCallback ac = (AuthorizeCallback) cb;
20+
ac.setAuthorized(true);
21+
} else if (cb instanceof NameCallback) {
22+
NameCallback nc = (NameCallback) cb;
23+
nc.setName("username");
24+
25+
} else if (cb instanceof PasswordCallback) {
26+
PasswordCallback pc = (PasswordCallback) cb;
27+
pc.setPassword("password".toCharArray());
28+
} else if (cb instanceof RealmCallback) {
29+
RealmCallback rc = (RealmCallback) cb;
30+
rc.setText("myServer");
31+
}
32+
}
33+
}
34+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.baeldung.sasl;
2+
3+
import static org.junit.Assert.assertTrue;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
6+
import java.nio.charset.StandardCharsets;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
import javax.security.sasl.Sasl;
11+
import javax.security.sasl.SaslClient;
12+
import javax.security.sasl.SaslException;
13+
import javax.security.sasl.SaslServer;
14+
15+
import org.junit.After;
16+
import org.junit.Before;
17+
import org.junit.Test;
18+
19+
public class SaslUnitTest {
20+
21+
private static final String MECHANISM = "DIGEST-MD5";
22+
private static final String SERVER_NAME = "myServer";
23+
private static final String PROTOCOL = "myProtocol";
24+
private static final String AUTHORIZATION_ID = null;
25+
private static final String QOP_LEVEL = "auth-conf";
26+
27+
private SaslServer saslServer;
28+
private SaslClient saslClient;
29+
30+
@Before
31+
public void setUp() throws SaslException {
32+
33+
ServerCallbackHandler serverHandler = new ServerCallbackHandler();
34+
ClientCallbackHandler clientHandler = new ClientCallbackHandler();
35+
36+
Map<String, String> props = new HashMap<>();
37+
props.put(Sasl.QOP, QOP_LEVEL);
38+
39+
saslServer = Sasl.createSaslServer(MECHANISM, PROTOCOL, SERVER_NAME, props, serverHandler);
40+
saslClient = Sasl.createSaslClient(new String[] { MECHANISM }, AUTHORIZATION_ID, PROTOCOL, SERVER_NAME, props, clientHandler);
41+
42+
}
43+
44+
@Test
45+
public void givenHandlers_whenStarted_thenAutenticationWorks() throws SaslException {
46+
47+
byte[] challenge;
48+
byte[] response;
49+
50+
challenge = saslServer.evaluateResponse(new byte[0]);
51+
response = saslClient.evaluateChallenge(challenge);
52+
53+
challenge = saslServer.evaluateResponse(response);
54+
response = saslClient.evaluateChallenge(challenge);
55+
56+
assertTrue(saslServer.isComplete());
57+
assertTrue(saslClient.isComplete());
58+
59+
String qop = (String) saslClient.getNegotiatedProperty(Sasl.QOP);
60+
assertEquals("auth-conf", qop);
61+
62+
byte[] outgoing = "Baeldung".getBytes();
63+
byte[] secureOutgoing = saslClient.wrap(outgoing, 0, outgoing.length);
64+
65+
byte[] secureIncoming = secureOutgoing;
66+
byte[] incoming = saslServer.unwrap(secureIncoming, 0, secureIncoming.length);
67+
assertEquals("Baeldung", new String(incoming, StandardCharsets.UTF_8));
68+
}
69+
70+
@After
71+
public void tearDown() throws SaslException {
72+
saslClient.dispose();
73+
saslServer.dispose();
74+
}
75+
76+
}

0 commit comments

Comments
 (0)