1package eu.siacs.conversations.crypto.sasl;
2
3import com.google.common.base.Preconditions;
4import com.google.common.base.Strings;
5import com.google.common.io.BaseEncoding;
6import eu.siacs.conversations.entities.Account;
7import javax.net.ssl.SSLSocket;
8
9public class Plain extends SaslMechanism {
10
11 public static final String MECHANISM = "PLAIN";
12
13 public Plain(final Account account) {
14 super(account);
15 }
16
17 @Override
18 public int getPriority() {
19 return 10;
20 }
21
22 @Override
23 public String getMechanism() {
24 return MECHANISM;
25 }
26
27 @Override
28 public String getClientFirstMessage(final SSLSocket sslSocket) {
29 Preconditions.checkState(
30 this.state == State.INITIAL, "Calling getClientFirstMessage from invalid state");
31 this.state = State.AUTH_TEXT_SENT;
32 final String message = '\u0000' + account.getUsername() + '\u0000' + account.getPassword();
33 return BaseEncoding.base64().encode(message.getBytes());
34 }
35
36 @Override
37 public String getResponse(final String challenge, final SSLSocket sslSocket)
38 throws AuthenticationException {
39 checkState(State.AUTH_TEXT_SENT);
40 if (Strings.isNullOrEmpty(challenge)) {
41 this.state = State.VALID_SERVER_RESPONSE;
42 return null;
43 }
44 throw new AuthenticationException("Unexpected server response");
45 }
46}