Skip to content

Commit

Permalink
support for named config backups
Browse files Browse the repository at this point in the history
  • Loading branch information
IngoZenz committed Nov 30, 2019
1 parent 2fcd156 commit b9a4d41
Show file tree
Hide file tree
Showing 7 changed files with 339 additions and 72 deletions.
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dnsfilter.android"
android:versionCode="1503401"
android:versionName="1.50.34.2" >
android:versionCode="1503403"
android:versionName="1.50.34.3" >

<uses-sdk android:minSdkVersion="14" />

Expand Down
8 changes: 5 additions & 3 deletions app/src/main/java/dnsfilter/ConfigurationAccess.java
Expand Up @@ -64,13 +64,15 @@ public boolean isLocal() {

abstract public long[] getFilterStatistics() throws IOException;

abstract public void triggerUpdateFilter() throws IOException;;
abstract public void triggerUpdateFilter() throws IOException;

abstract public void doBackup() throws IOException ;
abstract public String[] getAvailableBackups() throws IOException;

abstract public void doBackup(String name) throws IOException ;

abstract public void doRestoreDefaults() throws IOException;

abstract public void doRestore()throws IOException;
abstract public void doRestore(String name) throws IOException;

abstract public void wakeLock() throws IOException;

Expand Down
40 changes: 31 additions & 9 deletions app/src/main/java/dnsfilter/DNSFilterManager.java
Expand Up @@ -38,13 +38,16 @@ of the License, or (at your option) any later version.
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;

import dnsfilter.remote.RemoteAccessServer;
import util.ExecutionEnvironment;
Expand All @@ -57,7 +60,7 @@ of the License, or (at your option) any later version.

public class DNSFilterManager extends ConfigurationAccess {

public static final String VERSION = "1503402";
public static final String VERSION = "1503403";

private static DNSFilterManager INSTANCE = new DNSFilterManager();

Expand Down Expand Up @@ -421,11 +424,30 @@ private void copyLocalFile(String from, String to) throws IOException {
}

@Override
public void doBackup() throws IOException {
public String[] getAvailableBackups() throws IOException {
File file = new File(WORKDIR+"backup");
String[] names = new String[0];
if (file.exists())
names = file.list();

ArrayList<String> result = new ArrayList<String>();

for(String name : names)
{
if (new File(WORKDIR+"backup/" + name).isDirectory())
result.add(name);
}
Collections.sort(result);
return (String[]) result.toArray(new String[0]);
}


@Override
public void doBackup(String name) throws IOException {
try {
copyLocalFile("dnsfilter.conf", "backup/dnsfilter.conf");
copyLocalFile("additionalHosts.txt", "backup/additionalHosts.txt");
copyLocalFile("VERSION.TXT", "backup/VERSION.TXT");
copyLocalFile("dnsfilter.conf", "backup/"+name+"/dnsfilter.conf");
copyLocalFile("additionalHosts.txt", "backup/"+name+"/additionalHosts.txt");
copyLocalFile("VERSION.TXT", "backup/"+name+"/VERSION.TXT");
} catch (IOException e) {
throw new ConfigurationAccessException(e.getMessage(), e);
}
Expand Down Expand Up @@ -464,16 +486,16 @@ public void doRestoreDefaults() throws IOException {
}

@Override
public void doRestore() throws IOException {
public void doRestore(String name) throws IOException {

try {
if (!canStop())
throw new IOException("Cannot stop! Pending Operation!");

stop();
copyLocalFile("backup/dnsfilter.conf", "dnsfilter.conf");
copyLocalFile("backup/additionalHosts.txt", "additionalHosts.txt");
copyLocalFile("backup/VERSION.TXT", "VERSION.TXT");
copyLocalFile("backup/"+name+"/dnsfilter.conf", "dnsfilter.conf");
copyLocalFile("backup/"+name+"/additionalHosts.txt", "additionalHosts.txt");
copyLocalFile("backup/"+name+"/VERSION.TXT", "VERSION.TXT");

//cleanup hostsfile and index in order to force reload
String filterHostFile = null;
Expand Down
136 changes: 129 additions & 7 deletions app/src/main/java/dnsfilter/android/DNSProxyActivity.java
Expand Up @@ -75,6 +75,8 @@ of the License, or (at your option) any later version.
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
import java.util.Stack;
import java.util.StringTokenizer;
Expand Down Expand Up @@ -108,9 +110,12 @@ public class DNSProxyActivity extends Activity implements ExecutionEnvironmentIn
protected static Button backupBtn;
protected static Button restoreBtn;
protected static Button restoreDefaultsBtn;
protected static Button backupDnBtn;
protected static Button backupUpBtn;
protected static TextView addFilterBtn;
protected static TextView removeFilterBtn;
protected static CheckBox appWhiteListCheck;
protected static boolean appWhitelistingEnabled;
protected static ScrollView appWhiteListScroll;
protected static AppSelectorView appSelector;
protected static CheckBox keepAwakeCheck;
Expand All @@ -132,6 +137,8 @@ public class DNSProxyActivity extends Activity implements ExecutionEnvironmentIn
protected static Spanned donate_field_txt = fromHtml("<strong>Want to support us? Feel free to <a href='https://www.paypal.me/iZenz'>DONATE</a></strong>!");
protected static MenuItem add_filter;
protected static MenuItem remove_filter;
protected static String[] availableBackups;
protected static int selectedBackup;


protected static boolean additionalHostsChanged = false;
Expand Down Expand Up @@ -404,6 +411,10 @@ public void onCreate(Bundle savedInstanceState) {
restoreBtn.setOnClickListener(this);
restoreDefaultsBtn = (Button) findViewById(R.id.RestoreDefaultBtn);
restoreDefaultsBtn.setOnClickListener(this);
backupDnBtn = (Button) findViewById(R.id.BackupIdDn);
backupDnBtn.setOnClickListener(this);
backupUpBtn = (Button) findViewById(R.id.BackupIdUp);
backupUpBtn.setOnClickListener(this);
addFilterBtn = (TextView) findViewById(R.id.addFilterBtn);
addFilterBtn.setOnClickListener(this);
removeFilterBtn = (TextView) findViewById(R.id.removeFilterBtn);
Expand Down Expand Up @@ -493,7 +504,7 @@ public void onCreate(Bundle savedInstanceState) {

findViewById(R.id.copyfromlog).setVisibility(View.GONE);

handleAdvancedConfig();
handleAdvancedConfig(null);

if (myLogger != null) {
if (CONFIG.isLocal()) {
Expand Down Expand Up @@ -553,11 +564,56 @@ protected void showFilterRate() {
}
}

private String getBackupSubFolder() {
String subFolder = ".";
String txt = ((TextView) findViewById(R.id.BackupId)).getText().toString();
if (selectedBackup != -1 || !txt.equals("<default>")) {
if (selectedBackup!=-1)
subFolder = availableBackups[selectedBackup];

if (!txt.equals(subFolder)) {
//edited name

//Check if in List
for (int i = 0; i < availableBackups.length; i++)
if (txt.equals(availableBackups[i])) {
selectedBackup = i;
return txt;
}

//new entry => add to list
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < availableBackups.length; i++)
list.add(availableBackups[i]);

list.add(txt);

Collections.sort(list);
availableBackups = list.toArray(new String[list.size()]);

for (int i = 0; i < availableBackups.length; i++)
if (txt.equals(availableBackups[i])) {
selectedBackup = i;
return txt;

}

//something wrong
Logger.getLogger().logException(new Exception("Something is wrong!"));
return txt;
}
else return txt;
}
else return ".";
}



protected void doBackup() {

TextView backupStatusView = findViewById(R.id.backupLog);
try {
CONFIG.doBackup();
CONFIG.doBackup(getBackupSubFolder());
backupStatusView.setTextColor(Color.parseColor("#23751C"));
backupStatusView.setText("Backup Success!");
} catch (IOException eio) {
Expand All @@ -582,7 +638,7 @@ protected void doRestoreDefaults() {
protected void doRestore() {
TextView backupStatusView = findViewById(R.id.backupLog);
try {
CONFIG.doRestore();
CONFIG.doRestore(getBackupSubFolder());
backupStatusView.setTextColor(Color.parseColor("#23751C"));
loadAndApplyConfig(false);
backupStatusView.setText("Restore Success!");
Expand Down Expand Up @@ -978,6 +1034,9 @@ public void onClick(View destination) {
} else if (destination == restoreDefaultsBtn) {
doRestoreDefaults();
return;
} else if (destination == backupDnBtn || destination == backupUpBtn) {
handleBackUpIdChange(destination == backupUpBtn);
return;
}


Expand All @@ -986,7 +1045,7 @@ public void onClick(View destination) {
if (destination == remoteCtrlBtn) {
//close advanced settings to force reload from new config
advancedConfigCheck.setChecked(false);
handleAdvancedConfig();
handleAdvancedConfig(null);
handleRemoteControl();
}
if (destination == startBtn || destination == enableAdFilterCheck)
Expand All @@ -997,8 +1056,9 @@ public void onClick(View destination) {
handlefilterReload();

if (destination == advancedConfigCheck || destination == editAdditionalHostsCheck || destination == editFilterLoadCheck || destination == appWhiteListCheck || destination == backupRestoreCheck) {
handleAdvancedConfig();
handleAdvancedConfig((CheckBox)destination);
}

if (destination == keepAwakeCheck) {
if (keepAwakeCheck.isChecked()) {
remoteWakeLock();
Expand All @@ -1008,6 +1068,22 @@ public void onClick(View destination) {
}
}

private void handleBackUpIdChange(boolean up) {
if (up && selectedBackup==availableBackups.length-1)
selectedBackup = -1;
else if (!up && selectedBackup == -1)
selectedBackup = availableBackups.length-1;
else if (up)
selectedBackup++;
else if (!up)
selectedBackup--;
String txt = "<default>";
if (selectedBackup != -1)
txt = availableBackups[selectedBackup];

((TextView)findViewById(R.id.BackupId)).setText(txt);
}

private void onRemoteConnected(ConfigurationAccess remote){
CONFIG =remote;
((GroupedLogger) Logger.getLogger()).detachLogger(myLogger);
Expand Down Expand Up @@ -1102,24 +1178,66 @@ private void handleScrollLock() {
}
}

private void handleAdvancedConfig() {
private void handleAdvancedConfig(CheckBox dest) {
((TextView) findViewById(R.id.backupLog)).setText("");
if (advancedConfigCheck.isChecked()) {
//App Whitelisting only supported on SDK >= 21
if (Build.VERSION.SDK_INT >= 21 && CONFIG.isLocal())
if (Build.VERSION.SDK_INT >= 21 && CONFIG.isLocal()) {
appWhiteListCheck.setVisibility(View.VISIBLE);
appWhitelistingEnabled=true;
}
else { //Not supported for remote access currently
appWhiteListCheck.setVisibility(View.GONE);
appWhiteListCheck.setChecked(false);
appWhitelistingEnabled=false;
}

keepAwakeCheck.setVisibility(View.VISIBLE);
editAdditionalHostsCheck.setVisibility(View.VISIBLE);
editFilterLoadCheck.setVisibility(View.VISIBLE);
backupRestoreCheck.setVisibility(View.VISIBLE);

if (dest != advancedConfigCheck && dest != null) {

if (dest.isChecked()) {
keepAwakeCheck.setVisibility(View.GONE);
if (dest != editAdditionalHostsCheck) {
editAdditionalHostsCheck.setChecked(false);
editAdditionalHostsCheck.setVisibility(View.GONE);
}
if (dest != editFilterLoadCheck) {
editFilterLoadCheck.setChecked(false);
editFilterLoadCheck.setVisibility(View.GONE);
}
if (dest != appWhiteListCheck) {
appWhiteListCheck.setChecked(false);
appWhiteListCheck.setVisibility(View.GONE);
}
if (dest != backupRestoreCheck) {
backupRestoreCheck.setChecked(false);
backupRestoreCheck.setVisibility(View.GONE);
}
} else {
keepAwakeCheck.setVisibility(View.VISIBLE);
editAdditionalHostsCheck.setVisibility(View.VISIBLE);
editFilterLoadCheck.setVisibility(View.VISIBLE);
if (appWhitelistingEnabled) appWhiteListCheck.setVisibility(View.VISIBLE);
backupRestoreCheck.setVisibility(View.VISIBLE);
}
}

if (backupRestoreCheck.isChecked()) {
findViewById(R.id.backupRestoreView).setVisibility(View.VISIBLE);
try {
availableBackups=CONFIG.getAvailableBackups();
selectedBackup = -1;
((TextView)findViewById(R.id.BackupId)).setText("<default>");
} catch (IOException e) {
Logger.getLogger().logException(e);
backupRestoreCheck.setChecked(false);
findViewById(R.id.backupRestoreView).setVisibility(View.GONE);
}

} else {
findViewById(R.id.backupRestoreView).setVisibility(View.GONE);
}
Expand Down Expand Up @@ -1153,13 +1271,17 @@ private void handleAdvancedConfig() {
filterCfg.clear();
findViewById(R.id.addHostsScroll).setVisibility(View.GONE);
appWhiteListCheck.setVisibility(View.GONE);
appWhiteListCheck.setChecked(false);
appWhiteListScroll.setVisibility(View.GONE);
appSelector.clear();
findViewById(R.id.backupRestoreView).setVisibility(View.GONE);
keepAwakeCheck.setVisibility(View.GONE);
editAdditionalHostsCheck.setVisibility(View.GONE);
editAdditionalHostsCheck.setChecked(false);
editFilterLoadCheck.setVisibility(View.GONE);
editFilterLoadCheck.setChecked(false);
backupRestoreCheck.setVisibility(View.GONE);
backupRestoreCheck.setChecked(false);
editAdditionalHostsCheck.setChecked(false);
additionalHostsField.setText("");
additionalHostsChanged = false;
Expand Down

0 comments on commit b9a4d41

Please sign in to comment.