aboutsummaryrefslogtreecommitdiff
path: root/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'java/android')
-rw-r--r--java/android/OlmLibSdk/olm-sdk/src/androidTest/java/org/matrix/olm/OlmSessionTest.java70
-rw-r--r--java/android/OlmLibSdk/olm-sdk/src/main/java/org/matrix/olm/OlmSession.java28
-rw-r--r--java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.cpp28
-rw-r--r--java/android/OlmLibSdk/olm-sdk/src/main/jni/olm_session.h2
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.<br>
- * 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}).<br>
- * 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