diff --git a/src/basic_api.cc b/src/basic_api.cc index 3fe1e63..08c46c7 100644 --- a/src/basic_api.cc +++ b/src/basic_api.cc @@ -252,7 +252,7 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1trustOwnKey( ::trust_own_key(session(), _ident); } -JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine_importKey( +JNIEXPORT jobject JNICALL Java_foundation_pEp_jniadapter_Engine__1importKey( JNIEnv *env, jobject obj, jbyteArray key @@ -271,18 +271,27 @@ JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine_importKey( if(_key == NULL){ throw_pEp_Exception(env, PEP_OUT_OF_MEMORY); - return; + return NULL; } - PEP_STATUS status = ::import_key(session(), _key, _size, NULL); + identity_list *_identities; + + PEP_STATUS status = ::import_key(session(), _key, _size, &_identities); if (status != PEP_STATUS_OK && status != PEP_KEY_IMPORTED) { throw_pEp_Exception(env, status); - return; + return NULL; + } + + jobject identities_ = NULL; + if (_identities) { + identities_ = from_identitylist(env, _identities); } env->ReleaseByteArrayElements(key, (jbyte *) _key, JNI_ABORT); + return identities_; } + JNIEXPORT void JNICALL Java_foundation_pEp_jniadapter_Engine__1config_1passive_1mode( JNIEnv *env, jobject obj, diff --git a/src/gen_java_Engine.ysl2 b/src/gen_java_Engine.ysl2 index c1faee1..f625efa 100644 --- a/src/gen_java_Engine.ysl2 +++ b/src/gen_java_Engine.ysl2 @@ -30,7 +30,7 @@ tstylesheet { const "jtype" call "toJava" with "type", "@type"; choose { - when "name(parm/*[1])='bytearray'" + when "name(parm/*[1])='bytearray|identitylist'" || public native «$itype» «@name»(`apply "parm/*", mode=basic_iparm`); @@ -49,7 +49,18 @@ tstylesheet { |> return new Identity(_«@name»(`apply "parm/*", mode=basic_parm_name`)); when "@type = 'bool'" |> return new Boolean(_«@name»(`apply "parm/*", mode=basic_parm_name`)); - otherwise + when "@type = 'identitylist'" { + || + Vector<_Identity> glist = _«@name»(`apply "parm/*", mode=basic_parm_name`); + Vector ret = new Vector(); + if(glist != null) { + for (_Identity i : glist) { + ret.add(new Identity(i)); + } + } + return ret; + || + } otherwise |> return AbstractEngine.toUTF16(_«@name»(`apply "parm/*", mode=basic_parm_name`)); } || @@ -83,6 +94,8 @@ tstylesheet { > IdentityList when "name(.) = 'bool'" > Boolean + when "name(.) = 'bytearray'" + > byte[] otherwise > «name(.)» } @@ -115,6 +128,8 @@ tstylesheet { | «$pitype» _«$pname» = «$pname».getBytes(); when "$ptype = 'bool'" | «$pitype» _«$pname» = «$pname».booleanValue(); + when "$ptype = 'bytearray'" + | «$pitype» _«$pname» = «$pname».clone(); when "$ptype = 'int'" | «$pitype» _«$pname» = «$pname»; when "ancestor::namespace/child::enum[@name=$ptype]" diff --git a/src/pEp.yml2 b/src/pEp.yml2 index 603f4fe..5ac43bd 100644 --- a/src/pEp.yml2 +++ b/src/pEp.yml2 @@ -267,7 +267,7 @@ namespace pEp { basic void keyResetTrust(identity ident); basic void trustPersonalKey(identity ident); basic void trustOwnKey(identity ident); - basic void importKey(bytearray key); + basic identitylist importKey(bytearray key); basic void blacklist_add(string fpr); basic void blacklist_delete(string fpr); basic bool blacklist_is_listed(string fpr); diff --git a/test/java/foundation/pEp/jniadapter/test/jni96/Makefile b/test/java/foundation/pEp/jniadapter/test/jni96/Makefile new file mode 100644 index 0000000..101e87d --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/jni96/Makefile @@ -0,0 +1,37 @@ +include ../../../../../../../Makefile.conf +include ../Makefile.conf + +TEST_UNIT_NAME=jni96 + +JAVA_CLASSES = \ + TestAlice.class \ + ../utils/AdapterBaseTestContext.class \ + ../utils/AdapterTestUtils.class \ + ../utils/TestCallbacks.class + +.PHONY: pitytest compile alice test clean + +all: alice compile + +pitytest: + $(MAKE) -C $(PITYTEST_DIR) + +alice: compile clean-pep-home-alice + cd $(JAVA_CWD);pwd;HOME=$(JAVA_PEP_HOME_DIR_ALICE) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestAlice + +compile: $(JAVA_CLASSES) pitytest + +%.class: %.java + cd $(JAVA_CWD);javac -cp $(CLASSPATH) $(JAVA_PKG_BASEPATH)/$(TEST_UNIT_NAME)/$< + +clean: + rm -f $(JAVA_CLASSES) + rm -f *.class + rm -f *.log + rm -Rf .gnupg + rm -Rf .lldb + +clean-pep-home: clean-pep-home-alice + +clean-pep-home-alice: + rm -rf $(PEP_HOME_DIR_ALICE)/.pEp diff --git a/test/java/foundation/pEp/jniadapter/test/jni96/TestAlice.java b/test/java/foundation/pEp/jniadapter/test/jni96/TestAlice.java new file mode 100644 index 0000000..f9ee818 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/jni96/TestAlice.java @@ -0,0 +1,70 @@ +package foundation.pEp.jniadapter.test.jni96; +import static foundation.pEp.pitytest.TestLogger.*; + +import foundation.pEp.jniadapter.Identity; +import foundation.pEp.pitytest.*; +import foundation.pEp.pitytest.utils.TestUtils; +import foundation.pEp.jniadapter.test.utils.*; + +import static foundation.pEp.pitytest.TestLogger.log; + +import java.util.Vector; + +class TestAlice { + public static void main(String[] args) throws Exception { + TestSuite.getDefault().setVerbose(true); + TestSuite.getDefault().setTestColor(TestUtils.TermColor.GREEN); + + new TestUnit("import_key() 1 pub key",new AdapterBaseTestContext() , ctx -> { + Vector privKeys = null; + privKeys = ctx.engine.importKey(ctx.keyAlicePub); + log(AdapterTestUtils.identityListToString(privKeys, false)); + assert privKeys.size() == 0: "pub key should not be in return"; + }); + + new TestUnit("import_key() 1 sec key",new AdapterBaseTestContext() , ctx -> { + Vector privKeys = null; + privKeys = ctx.engine.importKey(ctx.keyAliceSec); + log(AdapterTestUtils.identityListToString(privKeys, false)); + assert privKeys.size() == 1: "imported sec key should be returned"; + }); + + new TestUnit("import_key() 2 pub keys",new AdapterBaseTestContext() , ctx -> { + byte[] keys = concat(ctx.keyAlicePub, ctx.keyBobPub); + + Vector privKeys = null; + privKeys = ctx.engine.importKey(keys); + log(AdapterTestUtils.identityListToString(privKeys, false)); + assert privKeys.size() == 0: "imported pub keys should not be returned"; + }); + + new TestUnit("import_key() 2 sec keys",new AdapterBaseTestContext() , ctx -> { + byte[] keys = concat(ctx.keyAliceSec, ctx.keyBobSec); + + Vector privKeys = null; + privKeys = ctx.engine.importKey(keys); + log(AdapterTestUtils.identityListToString(privKeys, false)); + assert privKeys.size() == 2: "imported sec keys should be returned"; + }); + + new TestUnit("import_key() 4 keys pub/sec",new AdapterBaseTestContext() , ctx -> { + byte[] keys = concat(ctx.keyAlicePub, concat(ctx.keyAliceSec, concat(ctx.keyBobPub, ctx.keyBobSec))); + + Vector privKeys = null; + privKeys = ctx.engine.importKey(keys); + log(AdapterTestUtils.identityListToString(privKeys, false)); + assert privKeys.size() == 2: "nr of imported keys doesnt match"; + }); + + TestSuite.getDefault().run(); + } + + public static byte[] concat(byte[] a, byte[] b) { + byte[] c = new byte[a.length + b.length]; + System.arraycopy(a, 0, c, 0, a.length); + System.arraycopy(b, 0, c, a.length, b.length); + return c; + } +} + + diff --git a/test/java/foundation/pEp/jniadapter/test/utils/AdapterBaseTestContext.java b/test/java/foundation/pEp/jniadapter/test/utils/AdapterBaseTestContext.java index 8bb1562..aa38878 100644 --- a/test/java/foundation/pEp/jniadapter/test/utils/AdapterBaseTestContext.java +++ b/test/java/foundation/pEp/jniadapter/test/utils/AdapterBaseTestContext.java @@ -44,10 +44,10 @@ public class AdapterBaseTestContext extends AbstractTestContext { private String filenameBobPub = "../resources/test_keys/bob-pub.asc"; public byte[] keyAlicePub; - private String filenameAlicePub = "../resources/test_keys/alice-pub.asc"; + private String filenameAlicePub = "../resources/test_keys/alicenew-pub.asc"; public byte[] keyAliceSec; - private String filenameAliceSec = "../resources/test_keys/alice-sec.asc"; + private String filenameAliceSec = "../resources/test_keys/alicenew-sec.asc"; // Messages public Message msgToSelf; diff --git a/test/resources/test_keys/alicenew-pub.asc b/test/resources/test_keys/alicenew-pub.asc new file mode 100644 index 0000000..e64a7d9 --- /dev/null +++ b/test/resources/test_keys/alicenew-pub.asc @@ -0,0 +1,29 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF77LLsBEACxl2LCTG3LX0wPSO0N1xV7AZ2eaDWoN7OvtHLAfue97NN+Pgno +Y5hPIoDnj5IeV3wfmB7DSYGZcCDwxQB08jWYfQabCslb+Y3lvFoudI5Ju02vBJgD +UUCJKxTDB63OOd0ip+xZVCImqB3wk6XjzMNQHhWO7tm82kr/VavTu4s2eUQYYwJ7 +zDXvNubwNVEANaEgzvlSryALoc9rjSNa6c7RYOKKXKCgu3dBzMahI41XvLEA0SP9 +9IK83/1tJo/Vtx8e38m+/2Jok1DBR2umfum7cX296RueS6ZIZyDgJ4tLTbtJ/vOC +oxBPDnwKYakEGRHTi2ZJS/TCh21XWMeRap1UGgLPBkwyuU4+Rr8unEglrgUfHw5t +jPfoDb02jyFXlG+O+X7PQAxPU9dynDx2Be8UJsPU+5qyZsDH8yl11reWEOtkIa+s +XQ9kkK5MQ+v4Pa1OfGIccFq4ugsWscqEDVCLNfdxqaAU8WSZza7E3LR4poKHVe10 +wzctxDu+aJNqOKDePdMBkp3zej5rZkm97a3DJa5IsWGfluaV02kl0hg27/lP6yu1 +n8oS/GSnRh7O2gL9T7m0JO6Rfhsc/LOy+5/MAl5Jven/qtdRYPm9HEF3lj4zebPS +V1j1kkSuGjSnJWyouz5Zt8a520WN1i81iOZWYjC/Kdm3g9a6rKUvjXXmQwARAQAB +tBlhbGljZSA8YWxpY2VAcGVwdGVzdC5vcmc+iQJUBBMBCgA+FiEEpQcDf0hg4gMz +sPkzUANH/1pQNMUFAl77LLsCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgEC +F4AACgkQUANH/1pQNMWs/hAApmKtGrgNcdvfecKjV+6tCApp6enFqMOZj/JxUV6R +3ihMD7bvQtlww+TyqL3OjCSJn/28t93QAjJvFPQRI9cq0p9F0WaxXqmUH8O+f6mz +rgpbnBDJzujBNOTFXJO8CygxD7r2g3ymxIycB3x9LNKg0id0uBKPyOaMFmaB9BrW +pn6TngljSHEjzmxDp1ERKxbHRhqhQishh3xIB0hPUdOIyy00nEknG7q/CIqqb8In +iLs+G7l4g/ARpjxTucZj0/h1svsY1uB52JgsfL88bgu/ir8lmg0AWkd/AEN9WSit +0ZgxEcVnqP3MxkJMaQipWXYtzGpKrmOnEh+D9Ni4Y1gw/4p6gCR+nlfY54JftSG5 +btniW+aqleTwqTqaJtOyAg5D4y2lulnMyrIkA2hnJjY5fin4LUBAW6IgsmqcdCUT +RJmwOJIa466AROUMDL/tdErYhVVTSTAeuQD/VE2rfwmYrVXRg3mGYZS++hG9rXEF +IN7L6SzgKNO84WSHjmQi9o1XMXGYPc4w7ICG/vwxwlpDeTEYNQknDTnZNS8mdqtU +x1zjgOVfs4bfotWxh3KV0ZbwQyZw+jhcbb/bU2VxUMEKyN3sRxMYuo5lGNLShVFx +mE9bF+17VxGQIQvcne1kfETNdGJPH15Zt1hLACSmwn5H5wy+yj9ZhtLpmNuHMO7V +qf8= +=40gV +-----END PGP PUBLIC KEY BLOCK----- diff --git a/test/resources/test_keys/alicenew-sec.asc b/test/resources/test_keys/alicenew-sec.asc new file mode 100644 index 0000000..0d73303 --- /dev/null +++ b/test/resources/test_keys/alicenew-sec.asc @@ -0,0 +1,55 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +=4Oz/ +-----END PGP PRIVATE KEY BLOCK-----