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        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}