Commit 1dc202e4 authored by Daniel Lenski's avatar Daniel Lenski

add getProtocol, setProtocol, getSupportedProtocols, and VPNProto to Java bindings

parent 760beff4
......@@ -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;
......@@ -135,6 +141,7 @@ public abstract class LibOpenConnect {
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 */
......@@ -149,6 +156,7 @@ public abstract class LibOpenConnect {
public synchronized native String getDTLSCipher();
public synchronized native String getCSTPCompression();
public synchronized native String getDTLSCompression();
public synchronized native String getProtocol();
/* certificate info */
......@@ -166,6 +174,7 @@ public abstract class LibOpenConnect {
public static native boolean hasStokenSupport();
public static native boolean hasOATHSupport();
public static native boolean hasYubiOATHSupport();
public static native VPNProto[] getSupportedProtocols();
/* public data structures */
......@@ -265,6 +274,13 @@ public abstract class LibOpenConnect {
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;
......
......@@ -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; \
......@@ -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)
{
......@@ -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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment