package org.awesomeapp.messenger.push; import android.support.annotation.NonNull; import android.util.Log; import net.java.otr4j.OtrException; import net.java.otr4j.crypto.OtrTlvHandler; import net.java.otr4j.session.SessionID; import net.java.otr4j.session.TLV; import org.chatsecure.pushsecure.PushSecureClient; import java.io.UnsupportedEncodingException; import timber.log.Timber; /** * Facilitates the ChatSecure-Push Whitelist Token Exchange over OTR TLV. * Call {@link #processTlv(TLV)} whenever new TLV messages arrive, and receive notification * via {@link #tlvSender} when outgoing TLVs are requested in response to those received. * Created by dbro on 9/28/15. */ public class WhitelistTokenTlvHandler implements OtrTlvHandler { private static final String TAG = "TokenTlvHandler"; private final TlvSender tlvSender; private SessionID sessionID; private PushManager pushManager; public WhitelistTokenTlvHandler(@NonNull PushManager pushManager, @NonNull SessionID sessionID, @NonNull TlvSender tlvSender) { this.pushManager = pushManager; this.sessionID = sessionID; this.tlvSender = tlvSender; } /** * Processes the given tlv, blocking until complete * * @throws OtrException */ @Override public synchronized void processTlv(final TLV tlv) { if (tlv.getType() == WhitelistTokenTlv.TLV_WHITELIST_TOKEN) { try { WhitelistTokenTlv tokenTlv = WhitelistTokenTlv.parseTlv(tlv); Timber.d("Got TLV: %s", tokenTlv); pushManager.insertReceivedWhitelistTokensTlv(tokenTlv, PushManager.stripJabberIdResource(sessionID.getLocalUserId()), PushManager.stripJabberIdResource(sessionID.getRemoteUserId())); pushManager.createWhitelistTokenExchangeTlv( PushManager.stripJabberIdResource(sessionID.getLocalUserId()), PushManager.stripJabberIdResource(sessionID.getRemoteUserId()), new PushSecureClient.RequestCallback<TLV>() { @Override public void onSuccess(@NonNull TLV response) { Log.d(TAG, "Notifying Whitelist Token Exchange TLV response"); tlvSender.onSendRequested(response, sessionID); } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to create Whitelist Token Exchange TLV", t); } }, null); } catch (UnsupportedEncodingException e) { Log.e(TAG, "Failed to save Whitelist token payload", e); } } } public interface TlvSender { void onSendRequested(@NonNull TLV tlv, @NonNull SessionID sessionID); } }