2014-11-10 18:23:54 +00:00
|
|
|
package eu.siacs.conversations.ui;
|
|
|
|
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.view.View;
|
|
|
|
import android.widget.Button;
|
|
|
|
import android.widget.EditText;
|
2014-11-10 21:03:23 +00:00
|
|
|
import android.widget.RelativeLayout;
|
2014-11-10 18:23:54 +00:00
|
|
|
import android.widget.TextView;
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
import net.java.otr4j.OtrException;
|
|
|
|
import net.java.otr4j.session.Session;
|
|
|
|
|
|
|
|
import eu.siacs.conversations.R;
|
|
|
|
import eu.siacs.conversations.entities.Account;
|
|
|
|
import eu.siacs.conversations.entities.Conversation;
|
|
|
|
import eu.siacs.conversations.services.XmppConnectionService;
|
|
|
|
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
|
|
|
import eu.siacs.conversations.xmpp.jid.Jid;
|
|
|
|
|
|
|
|
public class VerifyOTRActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate {
|
|
|
|
|
|
|
|
public static final String ACTION_VERIFY_CONTACT = "verify_contact";
|
|
|
|
|
2014-11-10 21:03:23 +00:00
|
|
|
private RelativeLayout mVerificationAreaOne;
|
|
|
|
private RelativeLayout mVerificationAreaTwo;
|
|
|
|
private TextView mErrorNoSession;
|
2014-11-10 18:23:54 +00:00
|
|
|
private TextView mRemoteJid;
|
|
|
|
private TextView mRemoteFingerprint;
|
|
|
|
private TextView mYourFingerprint;
|
|
|
|
private EditText mSharedSecretHint;
|
|
|
|
private EditText mSharedSecretSecret;
|
|
|
|
private Button mButtonVerifyFingerprint;
|
|
|
|
private Button mButtonSharedSecretPositive;
|
|
|
|
private Button mButtonSharedSecretNegative;
|
|
|
|
private TextView mStatusMessage;
|
|
|
|
private Account mAccount;
|
|
|
|
private Conversation mConversation;
|
2014-11-10 21:03:23 +00:00
|
|
|
|
|
|
|
private View.OnClickListener mVerifyFingerprintListener = new View.OnClickListener() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onClick(View view) {
|
|
|
|
mConversation.verifyOtrFingerprint();
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-11-10 18:23:54 +00:00
|
|
|
private View.OnClickListener mCreateSharedSecretListener = new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(final View view) {
|
2014-11-12 11:45:59 +00:00
|
|
|
if (isAccountOnline()) {
|
|
|
|
final String question = mSharedSecretHint.getText().toString();
|
|
|
|
final String secret = mSharedSecretSecret.getText().toString();
|
|
|
|
initSmp(question, secret);
|
|
|
|
updateView();
|
2014-11-10 18:23:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private View.OnClickListener mCancelSharedSecretListener = new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(View view) {
|
2014-11-12 11:45:59 +00:00
|
|
|
if (isAccountOnline()) {
|
|
|
|
abortSmp();
|
|
|
|
updateView();
|
|
|
|
}
|
2014-11-10 18:23:54 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
private View.OnClickListener mRespondSharedSecretListener = new View.OnClickListener() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onClick(View view) {
|
2014-11-12 11:45:59 +00:00
|
|
|
if (isAccountOnline()) {
|
|
|
|
final String question = mSharedSecretHint.getText().toString();
|
|
|
|
final String secret = mSharedSecretSecret.getText().toString();
|
|
|
|
respondSmp(question, secret);
|
|
|
|
updateView();
|
|
|
|
}
|
2014-11-10 18:23:54 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
private View.OnClickListener mRetrySharedSecretListener = new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(View view) {
|
|
|
|
mConversation.smp().status = Conversation.Smp.STATUS_NONE;
|
|
|
|
mConversation.smp().hint = null;
|
|
|
|
mConversation.smp().secret = null;
|
|
|
|
updateView();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private View.OnClickListener mFinishListener = new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(View view) {
|
|
|
|
mConversation.smp().status = Conversation.Smp.STATUS_NONE;
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
protected boolean initSmp(final String question, final String secret) {
|
|
|
|
final Session session = mConversation.getOtrSession();
|
|
|
|
if (session!=null) {
|
|
|
|
try {
|
|
|
|
session.initSmp(question, secret);
|
|
|
|
mConversation.smp().status = Conversation.Smp.STATUS_WE_REQUESTED;
|
|
|
|
return true;
|
|
|
|
} catch (OtrException e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected boolean abortSmp() {
|
|
|
|
final Session session = mConversation.getOtrSession();
|
|
|
|
if (session!=null) {
|
|
|
|
try {
|
|
|
|
session.abortSmp();
|
|
|
|
mConversation.smp().status = Conversation.Smp.STATUS_NONE;
|
2014-11-10 21:03:23 +00:00
|
|
|
mConversation.smp().hint = null;
|
|
|
|
mConversation.smp().secret = null;
|
2014-11-10 18:23:54 +00:00
|
|
|
return true;
|
|
|
|
} catch (OtrException e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected boolean respondSmp(final String question, final String secret) {
|
|
|
|
final Session session = mConversation.getOtrSession();
|
|
|
|
if (session!=null) {
|
|
|
|
try {
|
|
|
|
session.respondSmp(question,secret);
|
|
|
|
return true;
|
|
|
|
} catch (OtrException e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-12 11:45:59 +00:00
|
|
|
protected boolean isAccountOnline() {
|
|
|
|
if (this.mAccount.getStatus() != Account.STATUS_ONLINE) {
|
|
|
|
Toast.makeText(this,R.string.not_connected_try_again,Toast.LENGTH_SHORT).show();
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-10 18:23:54 +00:00
|
|
|
protected boolean handleIntent(Intent intent) {
|
2014-11-10 22:47:04 +00:00
|
|
|
if (intent.getAction().equals(ACTION_VERIFY_CONTACT)) {
|
2014-11-10 18:23:54 +00:00
|
|
|
try {
|
2014-11-10 22:47:04 +00:00
|
|
|
this.mAccount = this.xmppConnectionService.findAccountByJid(Jid.fromString(intent.getExtras().getString("account")));
|
2014-11-10 18:23:54 +00:00
|
|
|
} catch (final InvalidJidException ignored) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
try {
|
2014-11-10 22:47:04 +00:00
|
|
|
this.mConversation = this.xmppConnectionService.find(this.mAccount,Jid.fromString(intent.getExtras().getString("contact")));
|
2014-11-10 18:23:54 +00:00
|
|
|
if (this.mConversation == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} catch (final InvalidJidException ignored) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onBackendConnected() {
|
|
|
|
if (handleIntent(getIntent())) {
|
|
|
|
updateView();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void updateView() {
|
2014-11-10 21:03:23 +00:00
|
|
|
if (this.mConversation.hasValidOtrSession()) {
|
|
|
|
this.mVerificationAreaOne.setVisibility(View.VISIBLE);
|
|
|
|
this.mVerificationAreaTwo.setVisibility(View.VISIBLE);
|
|
|
|
this.mErrorNoSession.setVisibility(View.GONE);
|
|
|
|
this.mYourFingerprint.setText(this.mAccount.getOtrFingerprint(xmppConnectionService));
|
|
|
|
this.mRemoteFingerprint.setText(this.mConversation.getOtrFingerprint());
|
|
|
|
this.mRemoteJid.setText(this.mConversation.getContact().getJid().toBareJid().toString());
|
|
|
|
Conversation.Smp smp = mConversation.smp();
|
|
|
|
Session session = mConversation.getOtrSession();
|
|
|
|
if (mConversation.isOtrFingerprintVerified()) {
|
|
|
|
deactivateButton(mButtonVerifyFingerprint, R.string.verified);
|
|
|
|
} else {
|
|
|
|
activateButton(mButtonVerifyFingerprint, R.string.verify, mVerifyFingerprintListener);
|
|
|
|
}
|
|
|
|
if (smp.status == Conversation.Smp.STATUS_NONE) {
|
|
|
|
activateButton(mButtonSharedSecretPositive, R.string.create, mCreateSharedSecretListener);
|
|
|
|
deactivateButton(mButtonSharedSecretNegative, R.string.cancel);
|
|
|
|
this.mSharedSecretHint.setFocusableInTouchMode(true);
|
|
|
|
this.mSharedSecretSecret.setFocusableInTouchMode(true);
|
|
|
|
this.mSharedSecretSecret.setText("");
|
|
|
|
this.mSharedSecretHint.setText("");
|
|
|
|
this.mSharedSecretHint.setVisibility(View.VISIBLE);
|
|
|
|
this.mSharedSecretSecret.setVisibility(View.VISIBLE);
|
|
|
|
this.mStatusMessage.setVisibility(View.GONE);
|
|
|
|
} else if (smp.status == Conversation.Smp.STATUS_CONTACT_REQUESTED) {
|
|
|
|
this.mSharedSecretHint.setFocusable(false);
|
|
|
|
this.mSharedSecretHint.setText(smp.hint);
|
|
|
|
this.mSharedSecretSecret.setFocusableInTouchMode(true);
|
|
|
|
this.mSharedSecretHint.setVisibility(View.VISIBLE);
|
|
|
|
this.mSharedSecretSecret.setVisibility(View.VISIBLE);
|
|
|
|
this.mStatusMessage.setVisibility(View.GONE);
|
|
|
|
deactivateButton(mButtonSharedSecretNegative, R.string.cancel);
|
|
|
|
activateButton(mButtonSharedSecretPositive, R.string.respond, mRespondSharedSecretListener);
|
|
|
|
} else if (smp.status == Conversation.Smp.STATUS_FAILED) {
|
|
|
|
activateButton(mButtonSharedSecretNegative, R.string.cancel, mFinishListener);
|
|
|
|
activateButton(mButtonSharedSecretPositive, R.string.try_again, mRetrySharedSecretListener);
|
|
|
|
this.mSharedSecretHint.setVisibility(View.GONE);
|
|
|
|
this.mSharedSecretSecret.setVisibility(View.GONE);
|
|
|
|
this.mStatusMessage.setVisibility(View.VISIBLE);
|
|
|
|
this.mStatusMessage.setText(R.string.secrets_do_not_match);
|
|
|
|
this.mStatusMessage.setTextColor(getWarningTextColor());
|
|
|
|
} else if (smp.status == Conversation.Smp.STATUS_VERIFIED) {
|
|
|
|
this.mSharedSecretHint.setVisibility(View.GONE);
|
|
|
|
this.mSharedSecretSecret.setVisibility(View.GONE);
|
|
|
|
this.mStatusMessage.setVisibility(View.VISIBLE);
|
|
|
|
this.mStatusMessage.setText(R.string.verified);
|
|
|
|
this.mStatusMessage.setTextColor(getPrimaryColor());
|
|
|
|
deactivateButton(mButtonSharedSecretNegative, R.string.cancel);
|
|
|
|
activateButton(mButtonSharedSecretPositive, R.string.finish, mFinishListener);
|
|
|
|
} else if (session != null && session.isSmpInProgress()) {
|
|
|
|
deactivateButton(mButtonSharedSecretPositive, R.string.in_progress);
|
|
|
|
activateButton(mButtonSharedSecretNegative, R.string.cancel, mCancelSharedSecretListener);
|
|
|
|
this.mSharedSecretHint.setVisibility(View.VISIBLE);
|
|
|
|
this.mSharedSecretSecret.setVisibility(View.VISIBLE);
|
|
|
|
this.mSharedSecretHint.setFocusable(false);
|
|
|
|
this.mSharedSecretSecret.setFocusable(false);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
this.mVerificationAreaOne.setVisibility(View.GONE);
|
|
|
|
this.mVerificationAreaTwo.setVisibility(View.GONE);
|
|
|
|
this.mErrorNoSession.setVisibility(View.VISIBLE);
|
2014-11-10 18:23:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void activateButton(Button button, int text, View.OnClickListener listener) {
|
|
|
|
button.setEnabled(true);
|
|
|
|
button.setTextColor(getPrimaryTextColor());
|
|
|
|
button.setText(text);
|
|
|
|
button.setOnClickListener(listener);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void deactivateButton(Button button, int text) {
|
|
|
|
button.setEnabled(false);
|
|
|
|
button.setTextColor(getSecondaryTextColor());
|
|
|
|
button.setText(text);
|
|
|
|
button.setOnClickListener(null);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
setContentView(R.layout.activity_verify_otr);
|
|
|
|
this.mRemoteFingerprint = (TextView) findViewById(R.id.remote_fingerprint);
|
|
|
|
this.mRemoteJid = (TextView) findViewById(R.id.remote_jid);
|
|
|
|
this.mYourFingerprint = (TextView) findViewById(R.id.your_fingerprint);
|
|
|
|
this.mButtonSharedSecretNegative = (Button) findViewById(R.id.button_shared_secret_negative);
|
|
|
|
this.mButtonSharedSecretPositive = (Button) findViewById(R.id.button_shared_secret_positive);
|
|
|
|
this.mButtonVerifyFingerprint = (Button) findViewById(R.id.button_verify_fingerprint);
|
|
|
|
this.mSharedSecretSecret = (EditText) findViewById(R.id.shared_secret_secret);
|
|
|
|
this.mSharedSecretHint = (EditText) findViewById(R.id.shared_secret_hint);
|
|
|
|
this.mStatusMessage= (TextView) findViewById(R.id.status_message);
|
2014-11-10 21:03:23 +00:00
|
|
|
this.mVerificationAreaOne = (RelativeLayout) findViewById(R.id.verification_area_one);
|
|
|
|
this.mVerificationAreaTwo = (RelativeLayout) findViewById(R.id.verification_area_two);
|
|
|
|
this.mErrorNoSession = (TextView) findViewById(R.id.error_no_session);
|
2014-11-10 18:23:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String getShareableUri() {
|
|
|
|
if (mAccount!=null) {
|
|
|
|
return "xmpp:"+mAccount.getJid().toBareJid();
|
|
|
|
} else {
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void onConversationUpdate() {
|
|
|
|
runOnUiThread(new Runnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
updateView();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|