Native refactoring, improvements

This commit is contained in:
M66B 2016-01-22 16:13:33 +01:00
parent a8da87fa9a
commit c7557ff2fa
4 changed files with 39 additions and 41 deletions

View File

@ -27,6 +27,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.XmlResourceParser;
import android.net.TrafficStats;
import android.os.Process;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.text.TextUtils;
@ -170,7 +171,7 @@ public class Rule {
// Build rule list
List<Rule> listRules = new ArrayList<>();
for (PackageInfo info : context.getPackageManager().getInstalledPackages(0)) {
if (info.applicationInfo.uid == android.os.Process.myUid())
if (info.applicationInfo.uid == Process.myUid())
continue;
Rule rule = new Rule(info, context);

View File

@ -46,6 +46,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
import android.os.Process;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
@ -63,7 +64,6 @@ import android.widget.RemoteViews;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
@ -116,7 +116,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
private native void jni_init();
private native void jni_start(int tun, int[] uid, boolean log, boolean filter, int loglevel);
private native void jni_start(int tun, int[] uids, boolean log, boolean filter, int loglevel);
private native void jni_stop(int tun, boolean clear);
@ -208,7 +208,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
Command cmd = (Command) intent.getSerializableExtra(EXTRA_COMMAND);
String reason = intent.getStringExtra(EXTRA_REASON);
Log.i(TAG, "Executing intent=" + intent + " command=" + cmd + " reason=" + reason +
" vpn=" + (vpn != null) + " user=" + (android.os.Process.myUid() / 100000));
" vpn=" + (vpn != null) + " user=" + (Process.myUid() / 100000));
// Check if prepared
if (cmd == Command.start || cmd == Command.reload)
@ -328,12 +328,8 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
boolean log = prefs.getBoolean("log", false);
boolean filter = prefs.getBoolean("filter", false);
if (log || filter) {
int[] uid = new int[listAllowed.size()];
for (int i = 0; i < listAllowed.size(); i++)
uid[i] = listAllowed.get(i).info.applicationInfo.uid;
int prio = Integer.parseInt(prefs.getString("loglevel", Integer.toString(Log.INFO)));
jni_start(vpn.getFd(), uid, log, filter, prio);
jni_start(vpn.getFd(), getAllowedUids(listAllowed), log, filter, prio);
}
removeDisabledNotification();
@ -373,12 +369,8 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
boolean log = prefs.getBoolean("log", false);
boolean filter = prefs.getBoolean("filter", false);
if (log || filter) {
int[] uid = new int[listAllowed.size()];
for (int i = 0; i < listAllowed.size(); i++)
uid[i] = listAllowed.get(i).info.applicationInfo.uid;
int prio = Integer.parseInt(prefs.getString("loglevel", Integer.toString(Log.INFO)));
jni_start(vpn.getFd(), uid, log, filter, prio);
jni_start(vpn.getFd(), getAllowedUids(listAllowed), log, filter, prio);
}
if (prev != null)
@ -473,7 +465,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
if (prefs.getBoolean("show_top", false)) {
if (app.size() == 0) {
for (ApplicationInfo ainfo : getPackageManager().getInstalledApplications(0))
if (ainfo.uid != android.os.Process.myUid())
if (ainfo.uid != Process.myUid())
app.put(ainfo, TrafficStats.getUidTxBytes(ainfo.uid) + TrafficStats.getUidRxBytes(ainfo.uid));
} else if (t > 0) {
@ -654,6 +646,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
}
}
private ParcelFileDescriptor startVPN(List<Rule> listAllowed) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean tethering = prefs.getBoolean("tethering", false);
@ -692,7 +685,6 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
builder.addDisallowedApplication(rule.info.packageName);
} catch (PackageManager.NameNotFoundException ex) {
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
Util.sendCrashReport(ex, this);
}
// Build configure intent
@ -773,6 +765,13 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
return listAllowed;
}
private int[] getAllowedUids(List<Rule> listAllowed) {
int[] uid = new int[listAllowed.size()];
for (int i = 0; i < listAllowed.size(); i++)
uid[i] = listAllowed.get(i).info.applicationInfo.uid;
return uid;
}
private void stopVPN(ParcelFileDescriptor pfd) {
Log.i(TAG, "Stopping");
try {
@ -842,7 +841,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
Util.logExtras(intent);
user_foreground = Intent.ACTION_USER_FOREGROUND.equals(intent.getAction());
Log.i(TAG, "User foreground=" + user_foreground + " user=" + (android.os.Process.myUid() / 100000));
Log.i(TAG, "User foreground=" + user_foreground + " user=" + (Process.myUid() / 100000));
if (user_foreground) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SinkholeService.this);
@ -1034,7 +1033,7 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
Command cmd = (Command) intent.getSerializableExtra(EXTRA_COMMAND);
String reason = intent.getStringExtra(EXTRA_REASON);
Log.i(TAG, "Start intent=" + intent + " command=" + cmd + " reason=" + reason +
" vpn=" + (vpn != null) + " user=" + (android.os.Process.myUid() / 100000));
" vpn=" + (vpn != null) + " user=" + (Process.myUid() / 100000));
// Queue command
Message msg = mServiceHandler.obtainMessage();

View File

@ -102,7 +102,7 @@ Java_eu_faircode_netguard_SinkholeService_jni_1init(JNIEnv *env) {
JNIEXPORT void JNICALL
Java_eu_faircode_netguard_SinkholeService_jni_1start(
JNIEnv *env, jobject instance,
jint tun, jintArray uid_,
jint tun, jintArray uids_,
jboolean log, jboolean filter,
jint loglevel_) {
@ -127,16 +127,16 @@ Java_eu_faircode_netguard_SinkholeService_jni_1start(
struct arguments *args = malloc(sizeof(struct arguments));
args->instance = (*env)->NewGlobalRef(env, instance);
args->tun = tun;
args->count = (*env)->GetArrayLength(env, uid_);
args->uid = malloc(args->count * sizeof(jint));
jint *uid = (*env)->GetIntArrayElements(env, uid_, NULL);
memcpy(args->uid, uid, args->count * sizeof(jint));
(*env)->ReleaseIntArrayElements(env, uid_, uid, 0);
args->count = (*env)->GetArrayLength(env, uids_);
args->uids = malloc(args->count * sizeof(jint));
jint *uids = (*env)->GetIntArrayElements(env, uids_, NULL);
memcpy(args->uids, uids, args->count * sizeof(jint));
(*env)->ReleaseIntArrayElements(env, uids_, uids, 0);
args->log = log;
args->filter = filter;
for (int i = 0; i < args->count; i++)
log_android(ANDROID_LOG_DEBUG, "Allowed uid %d", args->uid[i]);
log_android(ANDROID_LOG_DEBUG, "Allowed uid %d", args->uids[i]);
// Start native thread
int err = pthread_create(&thread_id, NULL, handle_events, (void *) args);
@ -367,7 +367,7 @@ void handle_events(void *a) {
log_android(ANDROID_LOG_ERROR, "DetachCurrentThread failed");
// Cleanup
free(args->uid);
free(args->uids);
free(args);
log_android(ANDROID_LOG_INFO, "Stopped events tun=%d thread %lu", args->tun, thread_id);
@ -867,7 +867,7 @@ void handle_ip(const struct arguments *args, const uint8_t *buffer, const uint16
jboolean allowed = !syn;
if (syn && args->filter && uid >= 0) {
for (int i = 0; i < args->count; i++)
if (args->uid[i] == uid) {
if (args->uids[i] == uid) {
allowed = 1;
break;
}
@ -880,7 +880,7 @@ void handle_ip(const struct arguments *args, const uint8_t *buffer, const uint16
allowed = handle_udp(args, buffer, length, uid);
else if (protocol == IPPROTO_TCP) {
allowed = handle_tcp(args, buffer, length, uid);
if (!allowed)
if (!allowed && loglevel < ANDROID_LOG_WARN)
log = 1;
}
else
@ -1133,22 +1133,20 @@ jboolean handle_tcp(const struct arguments *args, const uint8_t *buffer, uint16_
if (send(cur->socket, buffer + dataoff, datalen, 0) < 0) {
log_android(ANDROID_LOG_ERROR, "send error %d: %s", errno, strerror(errno));
ok = 0;
write_rst(args, cur, args->tun);
return 0;
}
if (tcphdr->fin ||
cur->state == TCP_FIN_WAIT1 ||
cur->state == TCP_FIN_WAIT2 ||
cur->state == TCP_CLOSING)
cur->remote_seq += datalen; // FIN will send ACK or no ACK
else {
if (tcphdr->fin ||
cur->state == TCP_FIN_WAIT1 ||
cur->state == TCP_FIN_WAIT2 ||
cur->state == TCP_CLOSING)
cur->remote_seq += datalen; // FIN will send ACK or no ACK
else {
if (write_ack(args, cur, datalen, args->tun) >= 0)
cur->remote_seq += datalen;
else
ok = 0;
}
if (write_ack(args, cur, datalen, args->tun) >= 0)
cur->remote_seq += datalen;
else
ok = 0;
}
}

View File

@ -29,7 +29,7 @@ struct arguments {
jobject instance;
int tun;
jint count;
jint *uid;
jint *uids;
jboolean log;
jboolean filter;
};