package dev.ukanth.ufirewall.util;
import android.content.Context;
import android.content.SharedPreferences.Editor;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Environment;
import com.stericson.RootTools.RootTools;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.StringTokenizer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import dev.ukanth.ufirewall.Api;
import dev.ukanth.ufirewall.log.Log;
public class ImportApi {
private static File getDataDir(Context ctx,String packageName) {
try {
PackageInfo packageInfo = ctx.getPackageManager().getPackageInfo(packageName, 0);
if (packageInfo == null) return null;
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if (applicationInfo == null) return null;
if (applicationInfo.dataDir == null) return null;
return new File(applicationInfo.dataDir);
} catch (NameNotFoundException ex) {
return null;
}
}
public static boolean loadSharedPreferencesFromDroidWall(Context ctx) {
boolean res = false;
try {
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/afwall/");
dir.mkdirs();
File shared_prefs = new File(getDataDir(ctx, "com.googlecode.droidwall.free") + File.separator + "shared_prefs" + File.separator + "DroidWallPrefs.xml");
File file = new File(dir,"DroidWallPrefs.xml");
RootTools.copyFile(shared_prefs.getPath(), dir.getPath(), true, false);
final Editor prefEdit = ctx.getSharedPreferences(Api.PREFS_NAME, Context.MODE_PRIVATE).edit();
// write the logic to read the copied xml
String wifi = null, g = null;
try {
String xmlStr = readTextFile(new FileInputStream(file));
Document doc = XMLfromString(xmlStr);
NodeList nodes = doc.getElementsByTagName("string");
for (int i = 0; i < nodes.getLength(); i++) {
Element e = (Element)nodes.item(i);
if(e.getAttribute("name").equals("AllowedUidsWifi")) {
wifi = getElementValue(e);
Log.d("AllowedUidsWifi", wifi);
} else if(e.getAttribute("name").equals("AllowedUids3G")){
g = getElementValue(e);
Log.d("AllowedUids3G", g);
}
}
} catch (FileNotFoundException e) {
}
if(wifi != null) {
prefEdit.putString(Api.PREF_WIFI_PKG, getPackageListFromUID(ctx,wifi));
prefEdit.putString(Api.PREF_WIFI_PKG_UIDS, wifi);
}
if(g != null ){
prefEdit.putString(Api.PREF_3G_PKG, getPackageListFromUID(ctx,g));
prefEdit.putString(Api.PREF_3G_PKG_UIDS, g);
}
prefEdit.commit();
res = true;
} catch(Exception e){
}
return res;
}
private static String getElementValue( Node elem ) {
Node kid;
if( elem != null){
if (elem.hasChildNodes()){
for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){
if( kid.getNodeType() == Node.TEXT_NODE ){
return kid.getNodeValue();
}
}
}
}
return "";
}
private static String readTextFile(InputStream inputStream) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final byte buf[] = new byte[4096];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
}
return outputStream.toString();
}
private static Document XMLfromString(String v){
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(v));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
} catch (SAXException e) {
} catch (IOException e) {
}
return doc;
}
private static String getPackageListFromUID(Context ctx,final String uids) {
final PackageManager pm = ctx.getPackageManager();
final StringBuilder pkg = new StringBuilder();
final StringTokenizer tok = new StringTokenizer(uids, "|");
while (tok.hasMoreTokens()) {
final int uid = Integer.parseInt(tok.nextToken());
String[] pack = pm.getPackagesForUid(uid);
if(pack != null && pack.length == 1){
pkg.append(pack[0] + "|");
}
if(uid == 1000) {
pkg.append("android|");
}
}
return pkg.toString();
}
}