Plain.java

 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}