mirror of https://github.com/M66B/NetGuard.git
Respect DNS TTL, show expired DNS records
This commit is contained in:
parent
c86508a690
commit
6829dfd321
28
app/app.iml
28
app/app.iml
|
@ -72,13 +72,6 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/all/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/all/renderscript" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/all/shaders" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/assets" type="java-test-resource" />
|
||||
|
@ -86,6 +79,13 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTestAll/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/testAll/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
||||
|
@ -107,13 +107,6 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/renderscript" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/renderscript" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
|
||||
|
@ -121,6 +114,13 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/renderscript" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/renderscript" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/binaries" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
||||
|
|
|
@ -61,6 +61,10 @@ public class ActivityDns extends AppCompatActivity {
|
|||
refresh();
|
||||
return true;
|
||||
|
||||
case R.id.menu_cleanup:
|
||||
cleanup();
|
||||
return true;
|
||||
|
||||
case R.id.menu_clear:
|
||||
clear();
|
||||
return true;
|
||||
|
@ -72,6 +76,22 @@ public class ActivityDns extends AppCompatActivity {
|
|||
updateAdapter();
|
||||
}
|
||||
|
||||
private void cleanup() {
|
||||
new AsyncTask<Object, Object, Object>() {
|
||||
@Override
|
||||
protected Long doInBackground(Object... objects) {
|
||||
Log.i(TAG, "Cleanup DNS");
|
||||
DatabaseHelper.getInstance(ActivityDns.this).cleanupDns();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Object result) {
|
||||
updateAdapter();
|
||||
}
|
||||
}.execute();
|
||||
}
|
||||
|
||||
private void clear() {
|
||||
new AsyncTask<Object, Object, Object>() {
|
||||
@Override
|
||||
|
|
|
@ -20,7 +20,11 @@ package eu.faircode.netguard;
|
|||
*/
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Color;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -28,10 +32,13 @@ import android.widget.CursorAdapter;
|
|||
import android.widget.TextView;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class AdapterDns extends CursorAdapter {
|
||||
private static String TAG = "NetGuard.DNS";
|
||||
|
||||
private int colorExpired;
|
||||
|
||||
private int colTime;
|
||||
private int colQName;
|
||||
private int colAName;
|
||||
|
@ -40,6 +47,14 @@ public class AdapterDns extends CursorAdapter {
|
|||
|
||||
public AdapterDns(Context context, Cursor cursor) {
|
||||
super(context, cursor, 0);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
if (prefs.getBoolean("dark_theme", false))
|
||||
colorExpired = Color.argb(128, Color.red(Color.DKGRAY), Color.green(Color.DKGRAY), Color.blue(Color.DKGRAY));
|
||||
else
|
||||
colorExpired = Color.argb(128, Color.red(Color.LTGRAY), Color.green(Color.LTGRAY), Color.blue(Color.LTGRAY));
|
||||
|
||||
colTime = cursor.getColumnIndex("time");
|
||||
colQName = cursor.getColumnIndex("qname");
|
||||
colAName = cursor.getColumnIndex("aname");
|
||||
|
@ -61,6 +76,10 @@ public class AdapterDns extends CursorAdapter {
|
|||
String resource = cursor.getString(colResource);
|
||||
int ttl = cursor.getInt(colTTL);
|
||||
|
||||
long now = new Date().getTime();
|
||||
boolean expired = (time + ttl < now);
|
||||
view.setBackgroundColor(expired ? colorExpired : Color.TRANSPARENT);
|
||||
|
||||
// Get views
|
||||
TextView tvTime = (TextView) view.findViewById(R.id.tvTime);
|
||||
TextView tvQName = (TextView) view.findViewById(R.id.tvQName);
|
||||
|
@ -73,6 +92,6 @@ public class AdapterDns extends CursorAdapter {
|
|||
tvQName.setText(qname);
|
||||
tvAName.setText(aname);
|
||||
tvResource.setText(resource);
|
||||
tvTTL.setText(Integer.toString(ttl));
|
||||
tvTTL.setText("+" + Integer.toString(ttl / 1000));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -740,7 +740,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
try {
|
||||
ContentValues cv = new ContentValues();
|
||||
cv.put("time", rr.Time);
|
||||
cv.put("ttl", rr.TTL);
|
||||
cv.put("ttl", rr.TTL * 1000L);
|
||||
|
||||
int rows = db.update("dns", cv, "qname = ? AND aname = ? AND resource = ?",
|
||||
new String[]{rr.QName, rr.AName, rr.Resource});
|
||||
|
@ -766,17 +766,16 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
}
|
||||
}
|
||||
|
||||
public void cleanupDns(long time) {
|
||||
public void cleanupDns() {
|
||||
mLock.writeLock().lock();
|
||||
try {
|
||||
SQLiteDatabase db = this.getWritableDatabase();
|
||||
db.beginTransactionNonExclusive();
|
||||
try {
|
||||
// There is no index on time for write performance
|
||||
int rows = db.delete("dns", "time < ?", new String[]{Long.toString(time)});
|
||||
Log.i(TAG, "Cleanup DNS" +
|
||||
" before=" + SimpleDateFormat.getDateTimeInstance().format(new Date(time)) +
|
||||
" rows=" + rows);
|
||||
long now = new Date().getTime();
|
||||
db.execSQL("DELETE FROM dns WHERE time + ttl < " + now);
|
||||
Log.i(TAG, "Cleanup DNS");
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
} finally {
|
||||
|
@ -838,6 +837,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
}
|
||||
|
||||
public Cursor getAccessDns(String dname) {
|
||||
long now = new Date().getTime();
|
||||
mLock.readLock().lock();
|
||||
try {
|
||||
SQLiteDatabase db = this.getReadableDatabase();
|
||||
|
@ -849,6 +849,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
|
|||
query += " LEFT JOIN dns AS d";
|
||||
query += " ON d.qname = a.daddr";
|
||||
query += " WHERE a.block >= 0";
|
||||
query += " AND d.time + d.ttl >= " + now;
|
||||
if (dname != null)
|
||||
query += " AND a.daddr = ?";
|
||||
|
||||
|
|
|
@ -524,8 +524,8 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS
|
|||
// Keep log records for three days
|
||||
DatabaseHelper.getInstance(ServiceSinkhole.this).cleanupLog(new Date().getTime() - 3 * 24 * 3600 * 1000L);
|
||||
|
||||
// Keep DNS records for one day
|
||||
DatabaseHelper.getInstance(ServiceSinkhole.this).cleanupDns(new Date().getTime() - 1 * 24 * 3600 * 1000L);
|
||||
// Clear expired DNS records
|
||||
DatabaseHelper.getInstance(ServiceSinkhole.this).cleanupDns();
|
||||
|
||||
// Check for update
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this);
|
||||
|
|
|
@ -6,12 +6,25 @@
|
|||
android:orientation="horizontal"
|
||||
tools:context=".ActivityDns">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTime"
|
||||
<LinearLayout
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTime"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTTL"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end|right"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
|
@ -49,12 +62,5 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTTL"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="end|right"
|
||||
android:textAppearance="@style/TextSmall" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
<item
|
||||
android:id="@+id/menu_refresh"
|
||||
android:title="@string/menu_refresh" />
|
||||
<item
|
||||
android:id="@+id/menu_cleanup"
|
||||
android:title="@string/menu_cleanup" />
|
||||
<item
|
||||
android:id="@+id/menu_clear"
|
||||
android:title="@string/menu_clear" />
|
||||
|
|
|
@ -45,6 +45,8 @@ however it is impossible to guarantee NetGuard will work correctly on every devi
|
|||
<string name="menu_add">Add</string>
|
||||
<string name="menu_delete">Delete</string>
|
||||
|
||||
<string name="menu_cleanup">Cleanup</string>
|
||||
|
||||
<string name="title_protocol">Protocol</string>
|
||||
<string name="title_dport">Source port</string>
|
||||
<string name="title_raddr">Destination address</string>
|
||||
|
|
Loading…
Reference in New Issue