From 4b387f09f4ac4ef027a5fd506e3704f1d7860d53 Mon Sep 17 00:00:00 2001 From: Yves Fischer Date: Tue, 29 Nov 2016 22:54:00 +0100 Subject: Pass the request-type (qtype) to iodine Closes #18 --- jni/iodine-client.c | 14 +++++++++++++- jni/iodine/src/client.c | 3 +++ src/main/java/org/xapek/andiodine/IodineClient.java | 3 ++- src/main/java/org/xapek/andiodine/IodineVpnService.java | 2 +- .../org/xapek/andiodine/config/IodineConfiguration.java | 10 +++++++++- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/jni/iodine-client.c b/jni/iodine-client.c index 0a0c8ce..6b9fcea 100644 --- a/jni/iodine-client.c +++ b/jni/iodine-client.c @@ -87,7 +87,8 @@ JNIEXPORT jint JNICALL Java_org_xapek_andiodine_IodineClient_getDnsFd( JNIEXPORT jint JNICALL Java_org_xapek_andiodine_IodineClient_connect( JNIEnv *env, jclass klass, jstring j_nameserv_addr, jstring j_topdomain, jboolean j_raw_mode, jboolean j_lazy_mode, - jstring j_password, jint j_request_hostname_size, jint j_response_fragment_size) { + jstring j_password, jint j_request_hostname_size, jint j_response_fragment_size, + jstring j_request_type) { // XXX strdup leaks const char *__p_nameserv_addr = (*env)->GetStringUTFChars(env, @@ -105,12 +106,22 @@ JNIEXPORT jint JNICALL Java_org_xapek_andiodine_IodineClient_connect( (*env)->ReleaseStringUTFChars(env, j_topdomain, __p_topdomain); __android_log_print(ANDROID_LOG_ERROR, "iodine", "Topdomain from vm: %s", p_topdomain); + // extract password parameter const char *p_password = (*env)->GetStringUTFChars(env, j_password, NULL); char passwordField[33]; memset(passwordField, 0, 33); strncpy(passwordField, p_password, 32); (*env)->ReleaseStringUTFChars(env, j_password, p_password); + // extract request type parameter + const char *p_requestType = (*env)->GetStringUTFChars(env, j_request_type, NULL); + char requestTypeField[8]; + memset(requestTypeField, 0, 8); + strncpy(requestTypeField, p_requestType, 7); + (*env)->ReleaseStringUTFChars(env, j_request_type, p_requestType); + __android_log_print(ANDROID_LOG_ERROR, "iodine", "Request Type from vm: %s", requestTypeField); + + tun_config_android.request_disconnect = 0; int selecttimeout = 2; // original: 4 @@ -140,6 +151,7 @@ JNIEXPORT jint JNICALL Java_org_xapek_andiodine_IodineClient_connect( client_set_topdomain(p_topdomain); client_set_hostname_maxlen(hostname_maxlen); client_set_password(passwordField); + client_set_qtype(requestTypeField); if ((dns_fd = open_dns_from_host(NULL, 0, AF_INET, AI_PASSIVE)) == -1) { printf("Could not open dns socket: %s", strerror(errno)); diff --git a/jni/iodine/src/client.c b/jni/iodine/src/client.c index 979f668..70ebe65 100644 --- a/jni/iodine/src/client.c +++ b/jni/iodine/src/client.c @@ -187,6 +187,9 @@ client_set_qtype(char *qtype) do_qtype = T_SRV; else if (!strcasecmp(qtype, "TXT")) do_qtype = T_TXT; + // Added for Andiodine: + else + do_qtype = T_UNSET; return (do_qtype == T_UNSET); } diff --git a/src/main/java/org/xapek/andiodine/IodineClient.java b/src/main/java/org/xapek/andiodine/IodineClient.java index 056a5a3..fd90674 100644 --- a/src/main/java/org/xapek/andiodine/IodineClient.java +++ b/src/main/java/org/xapek/andiodine/IodineClient.java @@ -9,7 +9,8 @@ public class IodineClient { public static native int getDnsFd(); public static native int connect(String nameserv_addr, String topdomain, boolean raw_mode, boolean lazy_mode, - String password, int request_hostname_size, int response_fragment_size); + String password, int request_hostname_size, int response_fragment_size, + String request_type); public static native String getIp(); diff --git a/src/main/java/org/xapek/andiodine/IodineVpnService.java b/src/main/java/org/xapek/andiodine/IodineVpnService.java index ac0f45c..d54e95b 100644 --- a/src/main/java/org/xapek/andiodine/IodineVpnService.java +++ b/src/main/java/org/xapek/andiodine/IodineVpnService.java @@ -275,7 +275,7 @@ public class IodineVpnService extends VpnService implements Runnable { int ret = IodineClient.connect(tunnelNameserver, mConfiguration.getTopDomain(), mConfiguration.getRawMode(), mConfiguration.getLazyMode(), password, mConfiguration.getRequestHostnameSize(), - mConfiguration.getResponseFragmentSize()); + mConfiguration.getResponseFragmentSize(), mConfiguration.getRequestType().getIodineName()); String errorMessage = ""; switch (ret) { diff --git a/src/main/java/org/xapek/andiodine/config/IodineConfiguration.java b/src/main/java/org/xapek/andiodine/config/IodineConfiguration.java index d3e73f2..e07ecd4 100644 --- a/src/main/java/org/xapek/andiodine/config/IodineConfiguration.java +++ b/src/main/java/org/xapek/andiodine/config/IodineConfiguration.java @@ -11,7 +11,15 @@ public class IodineConfiguration { } public static enum RequestType { - AUTODETECT, NULL, TXT, SRV, MX, CNAME, A + AUTODETECT, NULL, TXT, SRV, MX, CNAME, A; + + public String getIodineName() { + if (this == AUTODETECT) { + return ""; + } else { + return name(); + } + } } private final ContentValues v; -- cgit v1.2.1