Skip to content
Snippets Groups Projects
Commit 2070de4f authored by ylecollen's avatar ylecollen
Browse files

initInboundSessionWithAccount triggers an exception when it fails.

parent 45a98c20
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
......
......@@ -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
......
......@@ -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);
}
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment