Skip to content

Commit

Permalink
add getProtocol, setProtocol, getSupportedProtocols, and VPNProto to …
Browse files Browse the repository at this point in the history
…Java bindings
  • Loading branch information
dlenski committed Aug 5, 2018
1 parent 760beff commit 1dc202e
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
16 changes: 16 additions & 0 deletions java/src/org/infradead/libopenconnect/LibOpenConnect.java
Expand Up @@ -22,6 +22,12 @@ public abstract class LibOpenConnect {

/* constants */

public static final int OC_PROTO_PROXY = 1;
public static final int OC_PROTO_CSD = 2;
public static final int OC_PROTO_AUTH_CERT = 4;
public static final int OC_PROTO_AUTH_OTP = 8;
public static final int OC_PROTO_AUTH_STOKEN = 16;

public static final int OC_FORM_OPT_TEXT = 1;
public static final int OC_FORM_OPT_PASSWORD = 2;
public static final int OC_FORM_OPT_SELECT = 3;
Expand Down Expand Up @@ -135,6 +141,7 @@ public synchronized native void setMobileInfo(String mobilePlatformVersion,
public synchronized native void setReqMTU(int mtu);
public synchronized native void setPFS(boolean isEnabled);
public synchronized native void setSystemTrust(boolean isEnabled);
public synchronized native int setProtocol(String protocol);

/* connection info */

Expand All @@ -149,6 +156,7 @@ public synchronized native void setMobileInfo(String mobilePlatformVersion,
public synchronized native String getDTLSCipher();
public synchronized native String getCSTPCompression();
public synchronized native String getDTLSCompression();
public synchronized native String getProtocol();

/* certificate info */

Expand All @@ -166,6 +174,7 @@ public synchronized native void setMobileInfo(String mobilePlatformVersion,
public static native boolean hasStokenSupport();
public static native boolean hasOATHSupport();
public static native boolean hasYubiOATHSupport();
public static native VPNProto[] getSupportedProtocols();

/* public data structures */

Expand Down Expand Up @@ -265,6 +274,13 @@ public static class VPNStats {
public Object userData;
};

public static class VPNProto {
public String name;
public String prettyName;
public String description;
public int flags;
};

/* Optional storage for caller's data */

public Object userData;
Expand Down
68 changes: 68 additions & 0 deletions jni.c
Expand Up @@ -1197,6 +1197,14 @@ JNIEXPORT jstring JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_getCS
RETURN_STRING_END
}

JNIEXPORT jstring JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_getProtocol(
JNIEnv *jenv, jobject jobj)
{
RETURN_STRING_START
buf = openconnect_get_protocol(ctx->vpninfo);
RETURN_STRING_END
}

#define SET_STRING_START(ret) \
struct libctx *ctx = getctx(jenv, jobj); \
const char *arg = NULL; \
Expand Down Expand Up @@ -1247,6 +1255,16 @@ JNIEXPORT jint JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_setHTTPP
return ret;
}

JNIEXPORT jint JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_setProtocol(
JNIEnv *jenv, jobject jobj, jstring jarg)
{
int ret;
SET_STRING_START(-ENOMEM)
ret = openconnect_set_protocol(ctx->vpninfo, arg);
SET_STRING_END();
return ret;
}

JNIEXPORT void JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_setXMLSHA1(
JNIEnv *jenv, jobject jobj, jstring jarg)
{
Expand Down Expand Up @@ -1381,3 +1399,53 @@ JNIEXPORT jobject JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_getIP

return jobj;
}

JNIEXPORT jobjectArray JNICALL Java_org_infradead_libopenconnect_LibOpenConnect_getSupportedProtocols(
JNIEnv *jenv, jclass jcls)
{
jmethodID mid;
jobjectArray result;
struct libctx ctx = { .jenv = jenv, .jobj = NULL, .async_lock = NULL, vpninfo = -1, loglevel = -1 };

/* call C library */
struct oc_vpn_proto *protos;
int np, ii;
np = openconnect_get_supported_protocols(&protos);
if (np < 0)
return NULL;

/* get VPNProto class, its init method, and create array */
jcls = (*jenv)->FindClass(jenv,
"org/infradead/libopenconnect/LibOpenConnect$VPNProto");
if (jcls == NULL)
goto err;
mid = (*jenv)->GetMethodID(jenv, jcls, "<init>", "()V");
if (!mid)
goto err;
result = (*jenv)->NewObjectArray(jenv, np, jcls, NULL);
if (result == NULL)
goto nomem;

for (ii=0; ii<np; ii++) {
jobject jobj = (*jenv)->NewObject(jenv, jcls, mid);
if (!jobj)
goto nomem;

if (set_string(&ctx, jobj, "name", protos[ii].name) ||
set_string(&ctx, jobj, "prettyName", protos[ii].pretty_name) ||
set_string(&ctx, jobj, "description", protos[ii].description) ||
set_int (&ctx, jobj, "flags", protos[ii].flags))
goto nomem;

(*jenv)->SetObjectArrayElement(jenv, result, ii, jobj);
}

openconnect_free_supported_protocols(protos);
return result;

nomem:
OOM(jenv);
err:
openconnect_free_supported_protocols(protos);
return NULL;
}

0 comments on commit 1dc202e

Please sign in to comment.