Respect DNS TTL, show expired DNS records

This commit is contained in:
M66B 2016-11-11 12:38:55 +01:00
parent c86508a690
commit 6829dfd321
8 changed files with 84 additions and 33 deletions

View File

@ -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" />

View File

@ -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

View File

@ -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));
}
}

View File

@ -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 = ?";

View File

@ -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);

View File

@ -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>

View File

@ -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" />

View File

@ -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>