From 2070de4fc57980527dadd2ef88340e7455269e09 Mon Sep 17 00:00:00 2001 From: ylecollen Date: Tue, 3 Jan 2017 17:20:18 +0100 Subject: initInboundSessionWithAccount triggers an exception when it fails. --- .../java/org/matrix/olm/OlmSessionTest.java | 70 +++++++++++++++++++--- .../src/main/java/org/matrix/olm/OlmSession.java | 28 ++++----- .../OlmLibSdk/olm-sdk/src/main/jni/olm_session.cpp | 28 ++++++++- .../OlmLibSdk/olm-sdk/src/main/jni/olm_session.h | 2 +- 4 files changed, 102 insertions(+), 26 deletions(-) diff --git a/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSessionTest.java b/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSessionTest.java index 099f2a5..6c888d0 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSessionTest.java +++ b/java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSessionTest.java @@ -19,6 +19,7 @@ package org.matrix.olm; import android.content.Context; import android.support.test.runner.AndroidJUnit4; +import android.text.TextUtils; import android.util.Log; import org.json.JSONObject; @@ -126,7 +127,13 @@ public class OlmSessionTest { assertTrue("Exception Msg="+e.getMessage(), false); } assertTrue(0!=bobSession.getOlmSessionId()); - assertTrue(0==bobSession.initInboundSessionWithAccount(bobAccount, encryptedMsgToBob.mCipherText)); + + try { + bobSession.initInboundSessionWithAccount(bobAccount, encryptedMsgToBob.mCipherText); + } catch (Exception e) { + assertTrue("initInboundSessionWithAccount failed " + e.getMessage(), false); + } + String decryptedMsg = bobSession.decryptMessage(encryptedMsgToBob); assertNotNull(decryptedMsg); @@ -218,8 +225,14 @@ public class OlmSessionTest { } catch (OlmException e) { assertTrue("Exception Msg="+e.getMessage(), false); } + assertTrue(0!=bobSession.getOlmSessionId()); - assertTrue(0==bobSession.initInboundSessionWithAccount(bobAccount, encryptedAliceToBobMsg1.mCipherText)); + + try { + bobSession.initInboundSessionWithAccount(bobAccount, encryptedAliceToBobMsg1.mCipherText); + } catch (Exception e) { + assertTrue("initInboundSessionWithAccount failed " + e.getMessage(), false); + } // DECRYPT MESSAGE FROM ALICE String decryptedMsg01 = bobSession.decryptMessage(encryptedAliceToBobMsg1); @@ -375,7 +388,11 @@ public class OlmSessionTest { assertFalse(bobSession.matchesInboundSession(encryptedAliceToBobMsg1.mCipherText)); // init bob session with alice PRE KEY - assertTrue(0==bobSession.initInboundSessionWithAccount(bobAccount, encryptedAliceToBobMsg1.mCipherText)); + try { + bobSession.initInboundSessionWithAccount(bobAccount, encryptedAliceToBobMsg1.mCipherText); + } catch (Exception e) { + assertTrue("initInboundSessionWithAccount failed " + e.getMessage(), false); + } // test matchesInboundSession() and matchesInboundSessionFrom() assertTrue(bobSession.matchesInboundSession(encryptedAliceToBobMsg1.mCipherText)); @@ -461,7 +478,13 @@ public class OlmSessionTest { assertTrue("Exception Msg="+e.getMessage(), false); } assertTrue(0!=bobSession.getOlmSessionId()); - assertTrue(0==bobSession.initInboundSessionWithAccount(bobAccount, encryptedAliceToBobMsg1.mCipherText)); + + // init bob session with alice PRE KEY + try { + bobSession.initInboundSessionWithAccount(bobAccount, encryptedAliceToBobMsg1.mCipherText); + } catch (Exception e) { + assertTrue("initInboundSessionWithAccount failed " + e.getMessage(), false); + } // DECRYPT MESSAGE FROM ALICE String decryptedMsg01 = bobSession.decryptMessage(encryptedAliceToBobMsg1); @@ -604,11 +627,42 @@ public class OlmSessionTest { OlmSession bobSession = null; try { bobSession = new OlmSession(); - assertTrue(-1==bobSession.initInboundSessionWithAccount(null, encryptedMsgToBob.mCipherText)); - assertTrue(-1==bobSession.initInboundSessionWithAccount(bobAccount, null)); - assertTrue(-1==bobSession.initInboundSessionWithAccount(bobAccount, INVALID_PRE_KEY)); + String errorMessage = null; + try { + bobSession.initInboundSessionWithAccount(null, encryptedMsgToBob.mCipherText); + } catch (Exception e) { + errorMessage = e.getMessage(); + } + + assertTrue(!TextUtils.isEmpty(errorMessage)); + + errorMessage = null; + try { + bobSession.initInboundSessionWithAccount(bobAccount, null); + } catch (Exception e) { + errorMessage = e.getMessage(); + } + + assertTrue(!TextUtils.isEmpty(errorMessage)); + + errorMessage = null; + try { + bobSession.initInboundSessionWithAccount(bobAccount, INVALID_PRE_KEY); + } catch (Exception e) { + errorMessage = e.getMessage(); + } + + assertTrue(!TextUtils.isEmpty(errorMessage)); + // init properly - assertTrue(0==bobSession.initInboundSessionWithAccount(bobAccount, encryptedMsgToBob.mCipherText)); + errorMessage = null; + try { + bobSession.initInboundSessionWithAccount(bobAccount, encryptedMsgToBob.mCipherText); + } catch (Exception e) { + errorMessage = e.getMessage(); + } + + assertTrue(TextUtils.isEmpty(errorMessage)); } catch (OlmException e) { assertTrue("Exception Msg="+e.getMessage(), false); } diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmSession.java b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmSession.java index a58036f..85804a1 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmSession.java +++ b/java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmSession.java @@ -150,7 +150,7 @@ public class OlmSession extends CommonSerializeUtils implements Serializable { * Getter on the session ID. * @return native session ID */ - public long getOlmSessionId(){ + long getOlmSessionId(){ return mNativeId; } @@ -209,11 +209,9 @@ public class OlmSession extends CommonSerializeUtils implements Serializable { */ private native long createNewSessionJni(); - /** * Creates a new out-bound session for sending messages to a recipient * identified by an identity key and a one time key.
- * Public API for {@link #initOutboundSessionWithAccount(OlmAccount, String, String)}. * @param aAccount the account to associate with this session * @param aTheirIdentityKey the identity key of the recipient * @param aTheirOneTimeKey the one time key of the recipient @@ -222,7 +220,7 @@ public class OlmSession extends CommonSerializeUtils implements Serializable { public int initOutboundSessionWithAccount(OlmAccount aAccount, String aTheirIdentityKey, String aTheirOneTimeKey) { int retCode=-1; - if((null==aAccount) || TextUtils.isEmpty(aTheirIdentityKey) || TextUtils.isEmpty(aTheirOneTimeKey)){ + if ((null == aAccount) || TextUtils.isEmpty(aTheirIdentityKey) || TextUtils.isEmpty(aTheirOneTimeKey)) { Log.e(LOG_TAG, "## initOutboundSession(): invalid input parameters"); } else { try { @@ -240,30 +238,32 @@ public class OlmSession extends CommonSerializeUtils implements Serializable { /** * Create a new in-bound session for sending/receiving messages from an * incoming PRE_KEY message ({@link OlmMessage#MESSAGE_TYPE_PRE_KEY}).
- * Public API for {@link #initInboundSessionJni(long, byte[])}. * This API may be used to process a "m.room.encrypted" event when type = 1 (PRE_KEY). * @param aAccount the account to associate with this session * @param aPreKeyMsg PRE KEY message - * @return 0 if operation succeed, -1 otherwise + * @exception Exception the failure reason */ - public int initInboundSessionWithAccount(OlmAccount aAccount, String aPreKeyMsg) { - int retCode = -1; - + public void initInboundSessionWithAccount(OlmAccount aAccount, String aPreKeyMsg) throws Exception { if ((null == aAccount) || TextUtils.isEmpty(aPreKeyMsg)){ Log.e(LOG_TAG, "## initInboundSessionWithAccount(): invalid input parameters"); + throw new Exception("invalid input parameters"); } else { + StringBuffer errorMsg = new StringBuffer(); + try { - retCode = initInboundSessionJni(aAccount.getOlmAccountId(), aPreKeyMsg.getBytes("UTF-8")); + initInboundSessionJni(aAccount.getOlmAccountId(), aPreKeyMsg.getBytes("UTF-8"), errorMsg); } catch (Exception e) { Log.e(LOG_TAG, "## initInboundSessionWithAccount(): " + e.getMessage()); + errorMsg.append(errorMsg); } - } - return retCode; + if (errorMsg.length() != 0) { + throw new Exception(errorMsg.toString()); + } + } } - private native int initInboundSessionJni(long aOlmAccountId, byte[] aOneTimeKeyMsg); - + private native int initInboundSessionJni(long aOlmAccountId, byte[] aOneTimeKeyMsg, StringBuffer aErrorMsg); /** * Create a new in-bound session for sending/receiving messages from an diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.cpp b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.cpp index 5ae68d0..3731d14 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.cpp +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.cpp @@ -205,12 +205,14 @@ JNIEXPORT jint OLM_SESSION_FUNC_DEF(initOutboundSessionJni)(JNIEnv *env, jobject * @param aOneTimeKeyMsg PRE_KEY message * @return ERROR_CODE_OK if operation succeed, ERROR_CODE_KO otherwise */ -JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionJni)(JNIEnv *env, jobject thiz, jlong aOlmAccountId, jbyteArray aOneTimeKeyMsgBuffer) +JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionJni)(JNIEnv *env, jobject thiz, jlong aOlmAccountId, jbyteArray aOneTimeKeyMsgBuffer, jobject aErrorMsg) { jint retCode = ERROR_CODE_KO; OlmSession *sessionPtr = NULL; OlmAccount *accountPtr = NULL; size_t sessionResult; + jclass errorMsgJClass = 0; + jmethodID errorMsgMethodId = 0; if (!(sessionPtr = (OlmSession*)getSessionInstanceId(env,thiz))) { @@ -224,6 +226,18 @@ JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionJni)(JNIEnv *env, jobject { LOGE("## initInboundSessionJni(): failure - invalid message"); } + else if (!aErrorMsg) + { + LOGE(" ## initInboundSessionJni(): failure - invalid error output"); + } + else if (!(errorMsgJClass = env->GetObjectClass(aErrorMsg))) + { + LOGE(" ## initInboundSessionJni(): failure - unable to get error class"); + } + else if (!(errorMsgMethodId = env->GetMethodID(errorMsgJClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;"))) + { + LOGE(" ## initInboundSessionJni(): failure - unable to get error method ID"); + } else { jbyte* messagePtr = env->GetByteArrayElements(aOneTimeKeyMsgBuffer, 0); @@ -241,7 +255,15 @@ JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionJni)(JNIEnv *env, jobject if (sessionResult == olm_error()) { - LOGE("## initInboundSessionJni(): failure - init inbound session creation Msg=%s",(const char *)olm_session_last_error(sessionPtr)); + const char *errorMsgPtr = olm_session_last_error(sessionPtr); + LOGE("## initInboundSessionJni(): failure - init inbound session creation Msg=%s", errorMsgPtr); + + jstring errorJstring = env->NewStringUTF(errorMsgPtr); + + if (errorJstring) + { + env->CallObjectMethod(aErrorMsg, errorMsgMethodId, errorJstring); + } } else { @@ -818,7 +840,7 @@ JNIEXPORT jstring OLM_SESSION_FUNC_DEF(serializeDataWithKeyJni)(JNIEnv *env, job const char *errorMsgPtr = olm_session_last_error(sessionPtr); LOGE(" ## serializeDataWithKeyJni(): failure - olm_pickle_session() Msg=%s",errorMsgPtr); - if(0 != (errorJstring = env->NewStringUTF(errorMsgPtr))) + if ((errorJstring = env->NewStringUTF(errorMsgPtr))) { env->CallObjectMethod(aErrorMsg, errorMsgMethodId, errorJstring); } diff --git a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.h b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.h index 924b439..9ce12d4 100644 --- a/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.h +++ b/java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.h @@ -36,7 +36,7 @@ JNIEXPORT jlong OLM_SESSION_FUNC_DEF(createNewSessionJni)(JNIEnv *env, jobject t JNIEXPORT jint OLM_SESSION_FUNC_DEF(initOutboundSessionJni)(JNIEnv *env, jobject thiz, jlong aOlmAccountId, jbyteArray aTheirIdentityKey, jbyteArray aTheirOneTimeKey); // inbound sessions: establishment based on PRE KEY message -JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionJni)(JNIEnv *env, jobject thiz, jlong aOlmAccountId, jbyteArray aOneTimeKeyMsg); +JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionJni)(JNIEnv *env, jobject thiz, jlong aOlmAccountId, jbyteArray aOneTimeKeyMsg, jobject aErrorMsg); JNIEXPORT jint OLM_SESSION_FUNC_DEF(initInboundSessionFromIdKeyJni)(JNIEnv *env, jobject thiz, jlong aOlmAccountId, jbyteArray aTheirIdentityKey, jbyteArray aOneTimeKeyMsg); // match inbound sessions: based on PRE KEY message -- cgit v1.2.3