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 return getMessage(account.getUsername(), account.getPassword());
33 }
34
35 public static String getMessage(final String username, final String password) {
36 final String message = '\u0000' + username + '\u0000' + password;
37 return BaseEncoding.base64().encode(message.getBytes());
38 }
39
40 @Override
41 public String getResponse(final String challenge, final SSLSocket sslSocket)
42 throws AuthenticationException {
43 checkState(State.AUTH_TEXT_SENT);
44 if (Strings.isNullOrEmpty(challenge)) {
45 this.state = State.VALID_SERVER_RESPONSE;
46 return null;
47 }
48 throw new AuthenticationException("Unexpected server response");
49 }
50}