mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
backout a965cebe4462 32220d7085e0 3689bb4199d8 d0c82cb6eb28 b295c8825acd and 95ab5c738512
This commit is contained in:
parent
b18e3bbd15
commit
eddf07cdb6
@ -39,9 +39,6 @@
|
|||||||
|
|
||||||
package @ANDROID_PACKAGE_NAME@;
|
package @ANDROID_PACKAGE_NAME@;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import android.database.Cursor;
|
|
||||||
|
|
||||||
public interface Actions {
|
public interface Actions {
|
||||||
|
|
||||||
@ -95,9 +92,4 @@ public interface Actions {
|
|||||||
void sendSpecialKey(SpecialKey key);
|
void sendSpecialKey(SpecialKey key);
|
||||||
|
|
||||||
void drag(int startingX, int endingX, int startingY, int endingY);
|
void drag(int startingX, int endingX, int startingY, int endingY);
|
||||||
|
|
||||||
/**
|
|
||||||
* Run a sql query on the specified database
|
|
||||||
*/
|
|
||||||
public Cursor querySql(String dbPath, String sql);
|
|
||||||
}
|
}
|
||||||
|
@ -166,13 +166,21 @@ public class FennecMochitestAssert implements Assert {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void is(Object a, Object b, String name) {
|
public void is(Object a, Object b, String name) {
|
||||||
boolean pass = checkObjectsEqual(a,b);
|
boolean pass = a.equals(b);
|
||||||
ok(pass, name, getEqualString(a,b, pass));
|
String diag = "got " + a.toString() + ", expected " + b.toString();
|
||||||
|
if (pass) {
|
||||||
|
diag = a.toString() + " should equal " + b.toString();
|
||||||
|
}
|
||||||
|
ok(pass, name, diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void isnot(Object a, Object b, String name) {
|
public void isnot(Object a, Object b, String name) {
|
||||||
boolean pass = checkObjectsNotEqual(a,b);
|
boolean pass = !a.equals(b);
|
||||||
ok(pass, name, getNotEqualString(a,b,pass));
|
String diag = "didn't expect " + a.toString() + ", but got it";
|
||||||
|
if (pass) {
|
||||||
|
diag = a.toString() + " should not equal " + b.toString();
|
||||||
|
}
|
||||||
|
ok(pass, name, diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ispixel(int actual, int r, int g, int b, String name) {
|
public void ispixel(int actual, int r, int g, int b, String name) {
|
||||||
@ -199,50 +207,21 @@ public class FennecMochitestAssert implements Assert {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void todo_is(Object a, Object b, String name) {
|
public void todo_is(Object a, Object b, String name) {
|
||||||
boolean pass = checkObjectsEqual(a,b);
|
boolean pass = a.equals(b);
|
||||||
todo(pass, name, getEqualString(a,b,pass));
|
String diag = "got " + a.toString() + ", expected " + b.toString();
|
||||||
}
|
|
||||||
|
|
||||||
public void todo_isnot(Object a, Object b, String name) {
|
|
||||||
boolean pass = checkObjectsNotEqual(a,b);
|
|
||||||
todo(pass, name, getNotEqualString(a,b,pass));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkObjectsEqual(Object a, Object b) {
|
|
||||||
if (a == null || b == null) {
|
|
||||||
if (a == null && b == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return a.equals(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getEqualString(Object a, Object b, boolean pass) {
|
|
||||||
if (pass) {
|
if (pass) {
|
||||||
return a + " should equal " + b;
|
diag = a.toString() + " should equal " + b.toString();
|
||||||
}
|
}
|
||||||
return "got " + a + ", expected " + b;
|
todo(pass, name, diag);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkObjectsNotEqual(Object a, Object b) {
|
public void todo_isnot(Object a, Object b, String name) {
|
||||||
if (a == null || b == null) {
|
boolean pass = !a.equals(b);
|
||||||
if ((a == null && b != null) || (a != null && b == null)) {
|
String diag = "didn't expect " + a.toString() + ", but got it";
|
||||||
return true;
|
if (pass) {
|
||||||
} else {
|
diag = a.toString() + " should not equal " + b.toString();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return !a.equals(b);
|
|
||||||
}
|
}
|
||||||
}
|
todo(pass, name, diag);
|
||||||
|
|
||||||
private String getNotEqualString(Object a, Object b, boolean pass) {
|
|
||||||
if(pass) {
|
|
||||||
return a + " should not equal " + b;
|
|
||||||
}
|
|
||||||
return "didn't expect " + a + ", but got it";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void info(String name, String message) {
|
public void info(String name, String message) {
|
||||||
|
@ -40,24 +40,19 @@
|
|||||||
package @ANDROID_PACKAGE_NAME@;
|
package @ANDROID_PACKAGE_NAME@;
|
||||||
|
|
||||||
import java.lang.Class;
|
import java.lang.Class;
|
||||||
import java.lang.ClassLoader;
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Proxy;
|
import java.lang.reflect.Proxy;
|
||||||
import java.lang.reflect.InvocationHandler;
|
import java.lang.reflect.InvocationHandler;
|
||||||
import java.lang.Long;
|
import java.lang.Long;
|
||||||
import java.util.concurrent.SynchronousQueue;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
import android.database.Cursor;
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.util.Log;
|
|
||||||
|
import java.util.concurrent.SynchronousQueue;
|
||||||
|
|
||||||
import org.json.*;
|
import org.json.*;
|
||||||
|
|
||||||
@ -79,7 +74,6 @@ public class FennecNativeActions implements Actions {
|
|||||||
private Method mSendGE;
|
private Method mSendGE;
|
||||||
private Method mGetLayerClient;
|
private Method mGetLayerClient;
|
||||||
private Method mSetDrawListener;
|
private Method mSetDrawListener;
|
||||||
private static final String LOGTAG = "FennecNativeActions";
|
|
||||||
|
|
||||||
public FennecNativeActions(Activity activity, Solo robocop, Instrumentation instrumentation) {
|
public FennecNativeActions(Activity activity, Solo robocop, Instrumentation instrumentation) {
|
||||||
mSolo = robocop;
|
mSolo = robocop;
|
||||||
@ -355,36 +349,4 @@ public class FennecNativeActions implements Actions {
|
|||||||
public void drag(int startingX, int endingX, int startingY, int endingY) {
|
public void drag(int startingX, int endingX, int startingY, int endingY) {
|
||||||
mSolo.drag(startingX, endingX, startingY, endingY, 10);
|
mSolo.drag(startingX, endingX, startingY, endingY, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Cursor querySql(String dbPath, String sql) {
|
|
||||||
try {
|
|
||||||
ClassLoader classLoader = mGeckoApp.getClassLoader();
|
|
||||||
Class sqlClass = classLoader.loadClass("org.mozilla.gecko.sqlite.SQLiteBridge");
|
|
||||||
Class stringClass = String.class;
|
|
||||||
Class stringArrayClass = String[].class;
|
|
||||||
Class appshell = classLoader.loadClass("org.mozilla.gecko.GeckoAppShell");
|
|
||||||
Class contextClass = Context.class;
|
|
||||||
|
|
||||||
Constructor bridgeConstructor = sqlClass.getConstructor(stringClass);
|
|
||||||
Method query = sqlClass.getMethod("rawQuery", stringClass, stringArrayClass);
|
|
||||||
Method loadSQLiteLibs = appshell.getMethod("loadSQLiteLibs", contextClass, stringClass);
|
|
||||||
|
|
||||||
Object bridge = bridgeConstructor.newInstance(dbPath);
|
|
||||||
|
|
||||||
String resourcePath = mGeckoApp.getApplication().getPackageResourcePath();
|
|
||||||
loadSQLiteLibs.invoke(null, mGeckoApp, resourcePath);
|
|
||||||
return (Cursor)query.invoke(bridge, sql, null);
|
|
||||||
} catch(ClassNotFoundException ex) {
|
|
||||||
Log.e(LOGTAG, "Error getting class", ex);
|
|
||||||
} catch(NoSuchMethodException ex) {
|
|
||||||
Log.e(LOGTAG, "Error getting method", ex);
|
|
||||||
} catch(InvocationTargetException ex) {
|
|
||||||
Log.e(LOGTAG, "Error invoking method", ex);
|
|
||||||
} catch(InstantiationException ex) {
|
|
||||||
Log.e(LOGTAG, "Error calling constructor", ex);
|
|
||||||
} catch(IllegalAccessException ex) {
|
|
||||||
Log.e(LOGTAG, "Error using field", ex);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
<uses-permission android:name="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"/>
|
|
||||||
|
|
||||||
#ifdef MOZ_WEBSMS_BACKEND
|
#ifdef MOZ_WEBSMS_BACKEND
|
||||||
<!-- WebSMS -->
|
<!-- WebSMS -->
|
||||||
@ -117,13 +116,6 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<receiver android:name="org.mozilla.gecko.GeckoMessageReceiver"
|
|
||||||
android:permission="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="org.mozilla.gecko.INIT_PW"></action>
|
|
||||||
</intent-filter>
|
|
||||||
</receiver>
|
|
||||||
|
|
||||||
<activity android:name="Restarter"
|
<activity android:name="Restarter"
|
||||||
android:process="@ANDROID_PACKAGE_NAME@Restarter"
|
android:process="@ANDROID_PACKAGE_NAME@Restarter"
|
||||||
android:theme="@style/Gecko"
|
android:theme="@style/Gecko"
|
||||||
@ -179,8 +171,8 @@
|
|||||||
|
|
||||||
<provider android:name="@ANDROID_PACKAGE_NAME@.db.PasswordsProvider"
|
<provider android:name="@ANDROID_PACKAGE_NAME@.db.PasswordsProvider"
|
||||||
android:authorities="@ANDROID_PACKAGE_NAME@.db.passwords"
|
android:authorities="@ANDROID_PACKAGE_NAME@.db.passwords"
|
||||||
android:permission="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"
|
android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"
|
||||||
android:process="org.mozilla.gecko.PasswordsProvider"/>
|
android:protectionLevel="signature"/>
|
||||||
|
|
||||||
<provider android:name="@ANDROID_PACKAGE_NAME@.db.FormHistoryProvider"
|
<provider android:name="@ANDROID_PACKAGE_NAME@.db.FormHistoryProvider"
|
||||||
android:authorities="@ANDROID_PACKAGE_NAME@.db.formhistory"
|
android:authorities="@ANDROID_PACKAGE_NAME@.db.formhistory"
|
||||||
@ -197,9 +189,6 @@
|
|||||||
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"
|
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"
|
||||||
android:protectionLevel="signature"/>
|
android:protectionLevel="signature"/>
|
||||||
|
|
||||||
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"
|
|
||||||
android:protectionLevel="signature"/>
|
|
||||||
|
|
||||||
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"
|
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"
|
||||||
android:protectionLevel="signature"/>
|
android:protectionLevel="signature"/>
|
||||||
|
|
||||||
|
@ -109,7 +109,6 @@ abstract public class GeckoApp
|
|||||||
public static final String ACTION_BOOKMARK = "org.mozilla.gecko.BOOKMARK";
|
public static final String ACTION_BOOKMARK = "org.mozilla.gecko.BOOKMARK";
|
||||||
public static final String ACTION_LOAD = "org.mozilla.gecko.LOAD";
|
public static final String ACTION_LOAD = "org.mozilla.gecko.LOAD";
|
||||||
public static final String ACTION_UPDATE = "org.mozilla.gecko.UPDATE";
|
public static final String ACTION_UPDATE = "org.mozilla.gecko.UPDATE";
|
||||||
public static final String ACTION_INIT_PW = "org.mozilla.gecko.INIT_PW";
|
|
||||||
public static final String SAVED_STATE_URI = "uri";
|
public static final String SAVED_STATE_URI = "uri";
|
||||||
public static final String SAVED_STATE_TITLE = "title";
|
public static final String SAVED_STATE_TITLE = "title";
|
||||||
public static final String SAVED_STATE_VIEWPORT = "viewport";
|
public static final String SAVED_STATE_VIEWPORT = "viewport";
|
||||||
@ -122,6 +121,7 @@ abstract public class GeckoApp
|
|||||||
public static SurfaceView cameraView;
|
public static SurfaceView cameraView;
|
||||||
public static GeckoApp mAppContext;
|
public static GeckoApp mAppContext;
|
||||||
public static boolean mDOMFullScreen = false;
|
public static boolean mDOMFullScreen = false;
|
||||||
|
public static File sGREDir = null;
|
||||||
public static Menu sMenu;
|
public static Menu sMenu;
|
||||||
private static GeckoThread sGeckoThread = null;
|
private static GeckoThread sGeckoThread = null;
|
||||||
public GeckoAppHandler mMainHandler;
|
public GeckoAppHandler mMainHandler;
|
||||||
@ -1616,7 +1616,7 @@ abstract public class GeckoApp
|
|||||||
enableStrictMode();
|
enableStrictMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
GeckoAppShell.loadMozGlue();
|
System.loadLibrary("mozglue");
|
||||||
mMainHandler = new GeckoAppHandler();
|
mMainHandler = new GeckoAppHandler();
|
||||||
Log.w(LOGTAG, "zerdatime " + SystemClock.uptimeMillis() + " - onCreate");
|
Log.w(LOGTAG, "zerdatime " + SystemClock.uptimeMillis() + " - onCreate");
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
@ -1687,6 +1687,9 @@ abstract public class GeckoApp
|
|||||||
mBrowserToolbar.updateTabCount(1);
|
mBrowserToolbar.updateTabCount(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sGREDir == null)
|
||||||
|
sGREDir = new File(this.getApplicationInfo().dataDir);
|
||||||
|
|
||||||
Uri data = intent.getData();
|
Uri data = intent.getData();
|
||||||
if (data != null && "http".equals(data.getScheme()) &&
|
if (data != null && "http".equals(data.getScheme()) &&
|
||||||
isHostOnPrefetchWhitelist(data.getHost())) {
|
isHostOnPrefetchWhitelist(data.getHost())) {
|
||||||
@ -2510,7 +2513,7 @@ abstract public class GeckoApp
|
|||||||
fileExt = name.substring(period);
|
fileExt = name.substring(period);
|
||||||
fileName = name.substring(0, period);
|
fileName = name.substring(0, period);
|
||||||
}
|
}
|
||||||
File file = File.createTempFile(fileName, fileExt, GeckoAppShell.getGREDir(GeckoApp.mAppContext));
|
File file = File.createTempFile(fileName, fileExt, sGREDir);
|
||||||
|
|
||||||
FileOutputStream fos = new FileOutputStream(file);
|
FileOutputStream fos = new FileOutputStream(file);
|
||||||
InputStream is = cr.openInputStream(uri);
|
InputStream is = cr.openInputStream(uri);
|
||||||
|
@ -112,9 +112,6 @@ public class GeckoAppShell
|
|||||||
static File sHomeDir = null;
|
static File sHomeDir = null;
|
||||||
static private int sDensityDpi = 0;
|
static private int sDensityDpi = 0;
|
||||||
private static Boolean sSQLiteLibsLoaded = false;
|
private static Boolean sSQLiteLibsLoaded = false;
|
||||||
private static Boolean sNSSLibsLoaded = false;
|
|
||||||
private static Boolean sLibsSetup = false;
|
|
||||||
private static File sGREDir = null;
|
|
||||||
|
|
||||||
private static HashMap<String, ArrayList<GeckoEventListener>> mEventListeners;
|
private static HashMap<String, ArrayList<GeckoEventListener>> mEventListeners;
|
||||||
|
|
||||||
@ -141,8 +138,7 @@ public class GeckoAppShell
|
|||||||
public static native void callObserver(String observerKey, String topic, String data);
|
public static native void callObserver(String observerKey, String topic, String data);
|
||||||
public static native void removeObserver(String observerKey);
|
public static native void removeObserver(String observerKey);
|
||||||
public static native void loadGeckoLibsNative(String apkName);
|
public static native void loadGeckoLibsNative(String apkName);
|
||||||
public static native void loadSQLiteLibsNative(String apkName);
|
public static native void loadSQLiteLibsNative(String apkName, boolean shouldExtract);
|
||||||
public static native void loadNSSLibsNative(String apkName);
|
|
||||||
public static native void onChangeNetworkLinkStatus(String status);
|
public static native void onChangeNetworkLinkStatus(String status);
|
||||||
|
|
||||||
public static void reportJavaCrash(Throwable e) {
|
public static void reportJavaCrash(Throwable e) {
|
||||||
@ -216,16 +212,16 @@ public class GeckoAppShell
|
|||||||
return GeckoBackgroundThread.getHandler();
|
return GeckoBackgroundThread.getHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File getCacheDir(Context context) {
|
public static File getCacheDir() {
|
||||||
if (sCacheFile == null)
|
if (sCacheFile == null)
|
||||||
sCacheFile = context.getCacheDir();
|
sCacheFile = GeckoApp.mAppContext.getCacheDir();
|
||||||
return sCacheFile;
|
return sCacheFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getFreeSpace(Context context) {
|
public static long getFreeSpace() {
|
||||||
try {
|
try {
|
||||||
if (sFreeSpace == -1) {
|
if (sFreeSpace == -1) {
|
||||||
File cacheDir = getCacheDir(context);
|
File cacheDir = getCacheDir();
|
||||||
if (cacheDir != null) {
|
if (cacheDir != null) {
|
||||||
StatFs cacheStats = new StatFs(cacheDir.getPath());
|
StatFs cacheStats = new StatFs(cacheDir.getPath());
|
||||||
sFreeSpace = cacheStats.getFreeBlocks() *
|
sFreeSpace = cacheStats.getFreeBlocks() *
|
||||||
@ -240,37 +236,17 @@ public class GeckoAppShell
|
|||||||
return sFreeSpace;
|
return sFreeSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File getGREDir(Context context) {
|
|
||||||
if (sGREDir == null)
|
|
||||||
sGREDir = new File(context.getApplicationInfo().dataDir);
|
|
||||||
return sGREDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
// java-side stuff
|
// java-side stuff
|
||||||
public static void loadLibsSetup(Context context) {
|
public static boolean loadLibsSetup(String apkName) {
|
||||||
if (sLibsSetup)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// The package data lib directory isn't placed in ld.so's
|
// The package data lib directory isn't placed in ld.so's
|
||||||
// search path, so we have to manually load libraries that
|
// search path, so we have to manually load libraries that
|
||||||
// libxul will depend on. Not ideal.
|
// libxul will depend on. Not ideal.
|
||||||
GeckoProfile profile = GeckoProfile.get(context);
|
GeckoApp geckoApp = GeckoApp.mAppContext;
|
||||||
|
GeckoProfile profile = geckoApp.getProfile();
|
||||||
|
profile.moveProfilesToAppInstallLocation();
|
||||||
|
|
||||||
File cacheFile = getCacheDir(context);
|
|
||||||
putenv("GRE_HOME=" + getGREDir(context).getPath());
|
|
||||||
|
|
||||||
// setup the libs cache
|
|
||||||
String linkerCache = System.getenv("MOZ_LINKER_CACHE");
|
|
||||||
if (System.getenv("MOZ_LINKER_CACHE") == null) {
|
|
||||||
GeckoAppShell.putenv("MOZ_LINKER_CACHE=" + cacheFile.getPath());
|
|
||||||
}
|
|
||||||
sLibsSetup = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setupPluginEnvironment(GeckoApp context) {
|
|
||||||
// setup plugin path directories
|
|
||||||
try {
|
try {
|
||||||
String[] dirs = context.getPluginDirectories();
|
String[] dirs = GeckoApp.mAppContext.getPluginDirectories();
|
||||||
StringBuffer pluginSearchPath = new StringBuffer();
|
StringBuffer pluginSearchPath = new StringBuffer();
|
||||||
for (int i = 0; i < dirs.length; i++) {
|
for (int i = 0; i < dirs.length; i++) {
|
||||||
Log.i(LOGTAG, "dir: " + dirs[i]);
|
Log.i(LOGTAG, "dir: " + dirs[i]);
|
||||||
@ -278,22 +254,49 @@ public class GeckoAppShell
|
|||||||
pluginSearchPath.append(":");
|
pluginSearchPath.append(":");
|
||||||
}
|
}
|
||||||
GeckoAppShell.putenv("MOZ_PLUGIN_PATH="+pluginSearchPath);
|
GeckoAppShell.putenv("MOZ_PLUGIN_PATH="+pluginSearchPath);
|
||||||
|
|
||||||
File pluginDataDir = context.getDir("plugins", 0);
|
|
||||||
GeckoAppShell.putenv("ANDROID_PLUGIN_DATADIR=" + pluginDataDir.getPath());
|
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Log.i(LOGTAG, "exception getting plugin dirs", ex);
|
Log.i(LOGTAG, "exception getting plugin dirs", ex);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static void setupDownloadEnvironment(GeckoApp context) {
|
GeckoAppShell.putenv("HOME=" + profile.getFilesDir().getPath());
|
||||||
|
GeckoAppShell.putenv("GRE_HOME=" + GeckoApp.sGREDir.getPath());
|
||||||
|
Intent i = geckoApp.getIntent();
|
||||||
|
String env = i.getStringExtra("env0");
|
||||||
|
Log.i(LOGTAG, "env0: "+ env);
|
||||||
|
for (int c = 1; env != null; c++) {
|
||||||
|
GeckoAppShell.putenv(env);
|
||||||
|
env = i.getStringExtra("env" + c);
|
||||||
|
Log.i(LOGTAG, "env"+ c +": "+ env);
|
||||||
|
}
|
||||||
|
|
||||||
|
File f = geckoApp.getDir("tmp", Context.MODE_WORLD_READABLE |
|
||||||
|
Context.MODE_WORLD_WRITEABLE );
|
||||||
|
|
||||||
|
if (!f.exists())
|
||||||
|
f.mkdirs();
|
||||||
|
|
||||||
|
GeckoAppShell.putenv("TMPDIR=" + f.getPath());
|
||||||
|
|
||||||
|
f = Environment.getDownloadCacheDirectory();
|
||||||
|
GeckoAppShell.putenv("EXTERNAL_STORAGE=" + f.getPath());
|
||||||
|
|
||||||
|
File cacheFile = getCacheDir();
|
||||||
|
String linkerCache = System.getenv("MOZ_LINKER_CACHE");
|
||||||
|
if (System.getenv("MOZ_LINKER_CACHE") == null) {
|
||||||
|
GeckoAppShell.putenv("MOZ_LINKER_CACHE=" + cacheFile.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
File pluginDataDir = GeckoApp.mAppContext.getDir("plugins", 0);
|
||||||
|
GeckoAppShell.putenv("ANDROID_PLUGIN_DATADIR=" + pluginDataDir.getPath());
|
||||||
|
|
||||||
|
// gingerbread introduces File.getUsableSpace(). We should use that.
|
||||||
|
long freeSpace = getFreeSpace();
|
||||||
try {
|
try {
|
||||||
File downloadDir = null;
|
File downloadDir = null;
|
||||||
File updatesDir = null;
|
File updatesDir = null;
|
||||||
if (Build.VERSION.SDK_INT >= 8) {
|
if (Build.VERSION.SDK_INT >= 8) {
|
||||||
downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
|
downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
|
||||||
updatesDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
|
updatesDir = GeckoApp.mAppContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
|
||||||
} else {
|
} else {
|
||||||
updatesDir = downloadDir = new File(Environment.getExternalStorageDirectory().getPath(), "download");
|
updatesDir = downloadDir = new File(Environment.getExternalStorageDirectory().getPath(), "download");
|
||||||
}
|
}
|
||||||
@ -303,76 +306,38 @@ public class GeckoAppShell
|
|||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
Log.i(LOGTAG, "No download directory has been found: " + e);
|
Log.i(LOGTAG, "No download directory has been found: " + e);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static void setupGeckoEnvironment(Context context) {
|
|
||||||
GeckoProfile profile = GeckoProfile.get(context);
|
|
||||||
profile.moveProfilesToAppInstallLocation();
|
|
||||||
|
|
||||||
setupPluginEnvironment((GeckoApp) context);
|
|
||||||
setupDownloadEnvironment((GeckoApp) context);
|
|
||||||
|
|
||||||
// profile home path
|
|
||||||
GeckoAppShell.putenv("HOME=" + profile.getFilesDir().getPath());
|
|
||||||
|
|
||||||
Intent i = null;
|
|
||||||
i = ((Activity)context).getIntent();
|
|
||||||
|
|
||||||
// if we have an intent (we're being launched by an activity)
|
|
||||||
// read in any environmental variables from it here
|
|
||||||
String env = i.getStringExtra("env0");
|
|
||||||
Log.i(LOGTAG, "env0: "+ env);
|
|
||||||
for (int c = 1; env != null; c++) {
|
|
||||||
GeckoAppShell.putenv(env);
|
|
||||||
env = i.getStringExtra("env" + c);
|
|
||||||
Log.i(LOGTAG, "env"+ c +": "+ env);
|
|
||||||
}
|
|
||||||
// setup the tmp path
|
|
||||||
File f = context.getDir("tmp", Context.MODE_WORLD_READABLE |
|
|
||||||
Context.MODE_WORLD_WRITEABLE );
|
|
||||||
if (!f.exists())
|
|
||||||
f.mkdirs();
|
|
||||||
GeckoAppShell.putenv("TMPDIR=" + f.getPath());
|
|
||||||
|
|
||||||
// setup the downloads path
|
|
||||||
f = Environment.getDownloadCacheDirectory();
|
|
||||||
GeckoAppShell.putenv("EXTERNAL_STORAGE=" + f.getPath());
|
|
||||||
|
|
||||||
putLocaleEnv();
|
putLocaleEnv();
|
||||||
|
|
||||||
|
boolean extractLibs = GeckoApp.ACTION_DEBUG.equals(i.getAction());
|
||||||
|
if (!extractLibs) {
|
||||||
|
// remove any previously extracted libs
|
||||||
|
File[] files = cacheFile.listFiles();
|
||||||
|
if (files != null) {
|
||||||
|
Iterator<File> cacheFiles = Arrays.asList(files).iterator();
|
||||||
|
while (cacheFiles.hasNext()) {
|
||||||
|
File libFile = cacheFiles.next();
|
||||||
|
if (libFile.getName().endsWith(".so"))
|
||||||
|
libFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return extractLibs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void loadSQLiteLibs(Context context, String apkName) {
|
public static void ensureSQLiteLibsLoaded(String apkName) {
|
||||||
if (sSQLiteLibsLoaded)
|
if (sSQLiteLibsLoaded)
|
||||||
return;
|
return;
|
||||||
synchronized(sSQLiteLibsLoaded) {
|
synchronized(sSQLiteLibsLoaded) {
|
||||||
if (sSQLiteLibsLoaded)
|
if (sSQLiteLibsLoaded)
|
||||||
return;
|
return;
|
||||||
loadMozGlue();
|
loadSQLiteLibsNative(apkName, loadLibsSetup(apkName));
|
||||||
loadLibsSetup(context);
|
|
||||||
loadSQLiteLibsNative(apkName);
|
|
||||||
sSQLiteLibsLoaded = true;
|
sSQLiteLibsLoaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void loadNSSLibs(Context context, String apkName) {
|
|
||||||
if (sNSSLibsLoaded)
|
|
||||||
return;
|
|
||||||
synchronized(sNSSLibsLoaded) {
|
|
||||||
if (sNSSLibsLoaded)
|
|
||||||
return;
|
|
||||||
loadMozGlue();
|
|
||||||
loadLibsSetup(context);
|
|
||||||
loadNSSLibsNative(apkName);
|
|
||||||
sNSSLibsLoaded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void loadMozGlue() {
|
|
||||||
System.loadLibrary("mozglue");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void loadGeckoLibs(String apkName) {
|
public static void loadGeckoLibs(String apkName) {
|
||||||
loadLibsSetup(GeckoApp.mAppContext);
|
boolean extractLibs = loadLibsSetup(apkName);
|
||||||
loadGeckoLibsNative(apkName);
|
loadGeckoLibsNative(apkName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
package org.mozilla.gecko;
|
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class GeckoMessageReceiver extends BroadcastReceiver {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
final String action = intent.getAction();
|
|
||||||
if (GeckoApp.ACTION_INIT_PW.equals(action)) {
|
|
||||||
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Passwords:Init", null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -66,7 +66,7 @@ public class GeckoThread extends Thread {
|
|||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
final GeckoApp app = GeckoApp.mAppContext;
|
final GeckoApp app = GeckoApp.mAppContext;
|
||||||
File cacheFile = GeckoAppShell.getCacheDir(app);
|
File cacheFile = GeckoAppShell.getCacheDir();
|
||||||
File libxulFile = new File(cacheFile, "libxul.so");
|
File libxulFile = new File(cacheFile, "libxul.so");
|
||||||
|
|
||||||
if ((!libxulFile.exists() ||
|
if ((!libxulFile.exists() ||
|
||||||
@ -86,13 +86,9 @@ public class GeckoThread extends Thread {
|
|||||||
// At some point while loading the gecko libs our default locale gets set
|
// At some point while loading the gecko libs our default locale gets set
|
||||||
// so just save it to locale here and reset it as default after the join
|
// so just save it to locale here and reset it as default after the join
|
||||||
Locale locale = Locale.getDefault();
|
Locale locale = Locale.getDefault();
|
||||||
|
|
||||||
String resourcePath = app.getApplication().getPackageResourcePath();
|
String resourcePath = app.getApplication().getPackageResourcePath();
|
||||||
GeckoAppShell.setupGeckoEnvironment(app);
|
GeckoAppShell.ensureSQLiteLibsLoaded(resourcePath);
|
||||||
GeckoAppShell.loadSQLiteLibs(app, resourcePath);
|
|
||||||
GeckoAppShell.loadNSSLibs(app, resourcePath);
|
|
||||||
GeckoAppShell.loadGeckoLibs(resourcePath);
|
GeckoAppShell.loadGeckoLibs(resourcePath);
|
||||||
|
|
||||||
Locale.setDefault(locale);
|
Locale.setDefault(locale);
|
||||||
Resources res = app.getBaseContext().getResources();
|
Resources res = app.getBaseContext().getResources();
|
||||||
Configuration config = res.getConfiguration();
|
Configuration config = res.getConfiguration();
|
||||||
@ -112,6 +108,5 @@ public class GeckoThread extends Thread {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
GeckoAppShell.reportJavaCrash(e);
|
GeckoAppShell.reportJavaCrash(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,14 +88,12 @@ FENNEC_JAVA_FILES = \
|
|||||||
GeckoEventListener.java \
|
GeckoEventListener.java \
|
||||||
GeckoEventResponder.java \
|
GeckoEventResponder.java \
|
||||||
GeckoInputConnection.java \
|
GeckoInputConnection.java \
|
||||||
GeckoMessageReceiver.java \
|
|
||||||
GeckoPreferences.java \
|
GeckoPreferences.java \
|
||||||
GeckoProfile.java \
|
GeckoProfile.java \
|
||||||
GeckoStateListDrawable.java \
|
GeckoStateListDrawable.java \
|
||||||
GeckoThread.java \
|
GeckoThread.java \
|
||||||
GlobalHistory.java \
|
GlobalHistory.java \
|
||||||
LinkPreference.java \
|
LinkPreference.java \
|
||||||
NSSBridge.java \
|
|
||||||
ProfileMigrator.java \
|
ProfileMigrator.java \
|
||||||
PromptService.java \
|
PromptService.java \
|
||||||
sqlite/ByteBufferInputStream.java \
|
sqlite/ByteBufferInputStream.java \
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
package org.mozilla.gecko;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.content.Context;
|
|
||||||
import java.lang.String;
|
|
||||||
|
|
||||||
public class NSSBridge {
|
|
||||||
private static final String LOGTAG = "NSSBridge";
|
|
||||||
|
|
||||||
private static native String nativeEncrypt(String aDb, String aValue);
|
|
||||||
private static native String nativeDecrypt(String aDb, String aValue);
|
|
||||||
|
|
||||||
static public String encrypt(Context context, String aValue) {
|
|
||||||
String resourcePath = context.getPackageResourcePath();
|
|
||||||
GeckoAppShell.loadNSSLibs(context, resourcePath);
|
|
||||||
|
|
||||||
String res = "";
|
|
||||||
try {
|
|
||||||
String path = GeckoProfile.get(context).getDir().toString();
|
|
||||||
res = nativeEncrypt(path, aValue);
|
|
||||||
} catch(Exception ex) { }
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static public String encrypt(Context context, String profilePath, String aValue) {
|
|
||||||
String resourcePath = context.getPackageResourcePath();
|
|
||||||
GeckoAppShell.loadNSSLibs(context, resourcePath);
|
|
||||||
|
|
||||||
String res = "";
|
|
||||||
try {
|
|
||||||
res = nativeEncrypt(profilePath, aValue);
|
|
||||||
} catch(Exception ex) { }
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static public String decrypt(Context context, String aValue) {
|
|
||||||
String resourcePath = context.getPackageResourcePath();
|
|
||||||
GeckoAppShell.loadNSSLibs(context, resourcePath);
|
|
||||||
|
|
||||||
String res = "";
|
|
||||||
try {
|
|
||||||
String path = GeckoProfile.get(context).getDir().toString();
|
|
||||||
res = nativeDecrypt(path, aValue);
|
|
||||||
} catch(Exception ex) { }
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static public String decrypt(Context context, String profilePath, String aValue) {
|
|
||||||
String resourcePath = context.getPackageResourcePath();
|
|
||||||
GeckoAppShell.loadNSSLibs(context, resourcePath);
|
|
||||||
|
|
||||||
String res = "";
|
|
||||||
try {
|
|
||||||
res = nativeDecrypt(profilePath, aValue);
|
|
||||||
} catch(Exception ex) { }
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
@ -640,7 +640,7 @@ public class ProfileMigrator {
|
|||||||
File dbFileShm = new File(dbPathShm);
|
File dbFileShm = new File(dbPathShm);
|
||||||
|
|
||||||
SQLiteBridge db = null;
|
SQLiteBridge db = null;
|
||||||
GeckoAppShell.loadSQLiteLibs(GeckoApp.mAppContext, GeckoApp.mAppContext.getApplication().getPackageResourcePath());
|
GeckoAppShell.ensureSQLiteLibsLoaded(GeckoApp.mAppContext.getApplication().getPackageResourcePath());
|
||||||
try {
|
try {
|
||||||
db = new SQLiteBridge(dbPath);
|
db = new SQLiteBridge(dbPath);
|
||||||
calculateReroot(db);
|
calculateReroot(db);
|
||||||
@ -664,7 +664,7 @@ public class ProfileMigrator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void cleanupXULLibCache() {
|
protected void cleanupXULLibCache() {
|
||||||
File cacheFile = GeckoAppShell.getCacheDir(GeckoApp.mAppContext);
|
File cacheFile = GeckoAppShell.getCacheDir();
|
||||||
File[] files = cacheFile.listFiles();
|
File[] files = cacheFile.listFiles();
|
||||||
if (files != null) {
|
if (files != null) {
|
||||||
Iterator<File> cacheFiles = Arrays.asList(files).iterator();
|
Iterator<File> cacheFiles = Arrays.asList(files).iterator();
|
||||||
|
@ -45,10 +45,15 @@ public class BrowserContract {
|
|||||||
public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
|
public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
|
||||||
|
|
||||||
public static final String PASSWORDS_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.passwords";
|
public static final String PASSWORDS_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.passwords";
|
||||||
|
public static final String DELETED_PASSWORDS_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.deleted-passwords";
|
||||||
|
|
||||||
public static final Uri PASSWORDS_AUTHORITY_URI = Uri.parse("content://" + PASSWORDS_AUTHORITY);
|
public static final Uri PASSWORDS_AUTHORITY_URI = Uri.parse("content://" + PASSWORDS_AUTHORITY);
|
||||||
|
public static final Uri DELETED_PASSWORDS_AUTHORITY_URI = Uri.parse("content://" + DELETED_PASSWORDS_AUTHORITY);
|
||||||
|
|
||||||
public static final String FORM_HISTORY_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.formhistory";
|
public static final String FORM_HISTORY_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.formhistory";
|
||||||
|
public static final String DELETED_FORM_HISTORY_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.deleted-formhistory";
|
||||||
public static final Uri FORM_HISTORY_AUTHORITY_URI = Uri.parse("content://" + FORM_HISTORY_AUTHORITY);
|
public static final Uri FORM_HISTORY_AUTHORITY_URI = Uri.parse("content://" + FORM_HISTORY_AUTHORITY);
|
||||||
|
public static final Uri DELETED_FORM_HISTORY_AUTHORITY_URI = Uri.parse("content://" + DELETED_FORM_HISTORY_AUTHORITY);
|
||||||
|
|
||||||
public static final String TABS_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.tabs";
|
public static final String TABS_AUTHORITY = "@ANDROID_PACKAGE_NAME@.db.tabs";
|
||||||
public static final Uri TABS_AUTHORITY_URI = Uri.parse("content://" + TABS_AUTHORITY);
|
public static final Uri TABS_AUTHORITY_URI = Uri.parse("content://" + TABS_AUTHORITY);
|
||||||
@ -163,7 +168,7 @@ public class BrowserContract {
|
|||||||
public static final class DeletedPasswords implements DeletedColumns {
|
public static final class DeletedPasswords implements DeletedColumns {
|
||||||
private DeletedPasswords() {}
|
private DeletedPasswords() {}
|
||||||
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/deleted-passwords";
|
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/deleted-passwords";
|
||||||
public static final Uri CONTENT_URI = Uri.withAppendedPath(PASSWORDS_AUTHORITY_URI, "deleted-passwords");
|
public static final Uri CONTENT_URI = Uri.withAppendedPath(DELETED_PASSWORDS_AUTHORITY_URI, "deleted-formhistory");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class FormHistory {
|
public static final class FormHistory {
|
||||||
@ -182,7 +187,7 @@ public class BrowserContract {
|
|||||||
|
|
||||||
public static final class DeletedFormHistory implements DeletedColumns {
|
public static final class DeletedFormHistory implements DeletedColumns {
|
||||||
private DeletedFormHistory() {}
|
private DeletedFormHistory() {}
|
||||||
public static final Uri CONTENT_URI = Uri.withAppendedPath(FORM_HISTORY_AUTHORITY_URI, "deleted-formhistory");
|
public static final Uri CONTENT_URI = Uri.withAppendedPath(DELETED_FORM_HISTORY_AUTHORITY_URI, "deleted-formhistory");
|
||||||
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/deleted-formhistory";
|
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/deleted-formhistory";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ public class DBUtils {
|
|||||||
aValues.remove(aOriginalKey);
|
aValues.remove(aOriginalKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aValues.containsKey(aNewKey)) {
|
if (!aValues.containsKey(aOriginalKey)) {
|
||||||
aValues.put(aNewKey, value);
|
aValues.put(aNewKey, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,9 @@ import android.content.ContentValues;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.UriMatcher;
|
import android.content.UriMatcher;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
import android.database.sqlite.SQLiteQueryBuilder;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@ -57,7 +60,7 @@ public class FormHistoryProvider extends GeckoProvider {
|
|||||||
static {
|
static {
|
||||||
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
|
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
|
||||||
URI_MATCHER.addURI(BrowserContract.FORM_HISTORY_AUTHORITY, "formhistory", FORM_HISTORY);
|
URI_MATCHER.addURI(BrowserContract.FORM_HISTORY_AUTHORITY, "formhistory", FORM_HISTORY);
|
||||||
URI_MATCHER.addURI(BrowserContract.FORM_HISTORY_AUTHORITY, "deleted-formhistory", DELETED_FORM_HISTORY);
|
URI_MATCHER.addURI(BrowserContract.DELETED_FORM_HISTORY_AUTHORITY, "deleted-formhistory", DELETED_FORM_HISTORY);
|
||||||
FORM_HISTORY_PROJECTION_MAP = new HashMap<String, String>();
|
FORM_HISTORY_PROJECTION_MAP = new HashMap<String, String>();
|
||||||
DELETED_FORM_HISTORY_PROJECTION_MAP = new HashMap<String, String>();
|
DELETED_FORM_HISTORY_PROJECTION_MAP = new HashMap<String, String>();
|
||||||
}
|
}
|
||||||
@ -143,29 +146,4 @@ public class FormHistoryProvider extends GeckoProvider {
|
|||||||
public void initGecko() {
|
public void initGecko() {
|
||||||
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("FormHistory:Init", null));
|
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("FormHistory:Init", null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPreInsert(ContentValues values, Uri uri, SQLiteBridge db) {
|
|
||||||
if (!values.containsKey(FormHistory.GUID)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String guid = values.getAsString(FormHistory.GUID);
|
|
||||||
String where = BrowserContract.DeletedFormHistory.GUID + " = ?";
|
|
||||||
String[] args = new String[] { guid };
|
|
||||||
if (guid == null) {
|
|
||||||
where = BrowserContract.DeletedFormHistory.GUID + " IS NULL";
|
|
||||||
args = null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
db.delete(TABLE_DELETED_FORM_HISTORY, where, args);
|
|
||||||
} catch(SQLiteBridgeException ex) {
|
|
||||||
Log.w(getLogTag(), "Error removing entry with GUID " + guid, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPreUpdate(ContentValues values, Uri uri, SQLiteBridge db) { }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPostQuery(Cursor cursor, Uri uri, SQLiteBridge db) { }
|
|
||||||
}
|
}
|
||||||
|
@ -88,9 +88,6 @@ public abstract class GeckoProvider extends ContentProvider {
|
|||||||
|
|
||||||
boolean dbNeedsSetup = true;
|
boolean dbNeedsSetup = true;
|
||||||
try {
|
try {
|
||||||
String resourcePath = context.getPackageResourcePath();
|
|
||||||
GeckoAppShell.loadSQLiteLibs(context, resourcePath);
|
|
||||||
GeckoAppShell.loadNSSLibs(context, resourcePath);
|
|
||||||
bridge = new SQLiteBridge(databasePath);
|
bridge = new SQLiteBridge(databasePath);
|
||||||
int version = bridge.getVersion();
|
int version = bridge.getVersion();
|
||||||
Log.i(mLogTag, version + " == " + mDBVersion);
|
Log.i(mLogTag, version + " == " + mDBVersion);
|
||||||
@ -222,8 +219,6 @@ public abstract class GeckoProvider extends ContentProvider {
|
|||||||
|
|
||||||
setupDefaults(uri, values);
|
setupDefaults(uri, values);
|
||||||
|
|
||||||
onPreInsert(values, uri, db);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
id = db.insert(getTable(uri), null, values);
|
id = db.insert(getTable(uri), null, values);
|
||||||
} catch(SQLiteBridgeException ex) {
|
} catch(SQLiteBridgeException ex) {
|
||||||
@ -245,8 +240,6 @@ public abstract class GeckoProvider extends ContentProvider {
|
|||||||
if (db == null)
|
if (db == null)
|
||||||
return updated;
|
return updated;
|
||||||
|
|
||||||
onPreUpdate(values, uri, db);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
updated = db.update(getTable(uri), values, selection, selectionArgs);
|
updated = db.update(getTable(uri), values, selection, selectionArgs);
|
||||||
} catch(SQLiteBridgeException ex) {
|
} catch(SQLiteBridgeException ex) {
|
||||||
@ -272,7 +265,6 @@ public abstract class GeckoProvider extends ContentProvider {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
cursor = db.query(getTable(uri), projection, selection, selectionArgs, null, null, sortOrder, null);
|
cursor = db.query(getTable(uri), projection, selection, selectionArgs, null, null, sortOrder, null);
|
||||||
onPostQuery(cursor, uri, db);
|
|
||||||
} catch (SQLiteBridgeException ex) {
|
} catch (SQLiteBridgeException ex) {
|
||||||
Log.e(mLogTag, "Error querying database", ex);
|
Log.e(mLogTag, "Error querying database", ex);
|
||||||
}
|
}
|
||||||
@ -287,10 +279,4 @@ public abstract class GeckoProvider extends ContentProvider {
|
|||||||
public abstract void setupDefaults(Uri uri, ContentValues values);
|
public abstract void setupDefaults(Uri uri, ContentValues values);
|
||||||
|
|
||||||
public abstract void initGecko();
|
public abstract void initGecko();
|
||||||
|
|
||||||
public abstract void onPreInsert(ContentValues values, Uri uri, SQLiteBridge db);
|
|
||||||
|
|
||||||
public abstract void onPreUpdate(ContentValues values, Uri uri, SQLiteBridge db);
|
|
||||||
|
|
||||||
public abstract void onPostQuery(Cursor cursor, Uri uri, SQLiteBridge db);
|
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,12 @@ import org.mozilla.gecko.GeckoAppShell;
|
|||||||
import org.mozilla.gecko.GeckoEvent;
|
import org.mozilla.gecko.GeckoEvent;
|
||||||
import org.mozilla.gecko.GeckoEventListener;
|
import org.mozilla.gecko.GeckoEventListener;
|
||||||
import org.mozilla.gecko.GeckoProfile;
|
import org.mozilla.gecko.GeckoProfile;
|
||||||
import org.mozilla.gecko.NSSBridge;
|
import org.mozilla.gecko.db.BrowserContract.CommonColumns;
|
||||||
import org.mozilla.gecko.db.DBUtils;
|
import org.mozilla.gecko.db.DBUtils;
|
||||||
import org.mozilla.gecko.db.BrowserContract.Passwords;
|
import org.mozilla.gecko.db.BrowserContract.Passwords;
|
||||||
import org.mozilla.gecko.db.BrowserContract.DeletedPasswords;
|
import org.mozilla.gecko.db.BrowserContract.DeletedPasswords;
|
||||||
import org.mozilla.gecko.db.BrowserContract.SyncColumns;
|
import org.mozilla.gecko.db.BrowserContract.SyncColumns;
|
||||||
import org.mozilla.gecko.db.BrowserContract;
|
import org.mozilla.gecko.db.BrowserContract;
|
||||||
import org.mozilla.gecko.sqlite.MatrixBlobCursor;
|
|
||||||
import org.mozilla.gecko.sqlite.SQLiteBridge;
|
import org.mozilla.gecko.sqlite.SQLiteBridge;
|
||||||
import org.mozilla.gecko.sqlite.SQLiteBridgeException;
|
import org.mozilla.gecko.sqlite.SQLiteBridgeException;
|
||||||
import org.mozilla.gecko.sync.Utils;
|
import org.mozilla.gecko.sync.Utils;
|
||||||
@ -32,9 +31,11 @@ import android.content.ContentProvider;
|
|||||||
import android.content.ContentUris;
|
import android.content.ContentUris;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.UriMatcher;
|
import android.content.UriMatcher;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
import android.database.sqlite.SQLiteQueryBuilder;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@ -81,13 +82,12 @@ public class PasswordsProvider extends GeckoProvider {
|
|||||||
PASSWORDS_PROJECTION_MAP.put(Passwords.TIME_PASSWORD_CHANGED, Passwords.TIME_PASSWORD_CHANGED);
|
PASSWORDS_PROJECTION_MAP.put(Passwords.TIME_PASSWORD_CHANGED, Passwords.TIME_PASSWORD_CHANGED);
|
||||||
PASSWORDS_PROJECTION_MAP.put(Passwords.TIMES_USED, Passwords.TIMES_USED);
|
PASSWORDS_PROJECTION_MAP.put(Passwords.TIMES_USED, Passwords.TIMES_USED);
|
||||||
|
|
||||||
URI_MATCHER.addURI(BrowserContract.PASSWORDS_AUTHORITY, "deleted-passwords", DELETED_PASSWORDS);
|
URI_MATCHER.addURI(BrowserContract.DELETED_PASSWORDS_AUTHORITY, "deleted-passwords", DELETED_PASSWORDS);
|
||||||
|
|
||||||
DELETED_PASSWORDS_PROJECTION_MAP = new HashMap<String, String>();
|
DELETED_PASSWORDS_PROJECTION_MAP = new HashMap<String, String>();
|
||||||
DELETED_PASSWORDS_PROJECTION_MAP.put(DeletedPasswords.ID, DeletedPasswords.ID);
|
DELETED_PASSWORDS_PROJECTION_MAP.put(DeletedPasswords.ID, DeletedPasswords.ID);
|
||||||
DELETED_PASSWORDS_PROJECTION_MAP.put(DeletedPasswords.GUID, DeletedPasswords.GUID);
|
DELETED_PASSWORDS_PROJECTION_MAP.put(DeletedPasswords.GUID, DeletedPasswords.GUID);
|
||||||
DELETED_PASSWORDS_PROJECTION_MAP.put(DeletedPasswords.TIME_DELETED, DeletedPasswords.TIME_DELETED);
|
DELETED_PASSWORDS_PROJECTION_MAP.put(DeletedPasswords.TIME_DELETED, DeletedPasswords.TIME_DELETED);
|
||||||
System.loadLibrary("mozglue");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -168,6 +168,9 @@ public class PasswordsProvider extends GeckoProvider {
|
|||||||
values.put(Passwords.GUID, guid);
|
values.put(Passwords.GUID, guid);
|
||||||
}
|
}
|
||||||
String nowString = new Long(now).toString();
|
String nowString = new Long(now).toString();
|
||||||
|
DBUtils.replaceKey(values, CommonColumns._ID, Passwords.ID, "");
|
||||||
|
DBUtils.replaceKey(values, SyncColumns.DATE_CREATED, Passwords.TIME_CREATED, nowString);
|
||||||
|
DBUtils.replaceKey(values, SyncColumns.DATE_MODIFIED, Passwords.TIME_PASSWORD_CHANGED, nowString);
|
||||||
DBUtils.replaceKey(values, null, Passwords.HOSTNAME, "");
|
DBUtils.replaceKey(values, null, Passwords.HOSTNAME, "");
|
||||||
DBUtils.replaceKey(values, null, Passwords.HTTP_REALM, "");
|
DBUtils.replaceKey(values, null, Passwords.HTTP_REALM, "");
|
||||||
DBUtils.replaceKey(values, null, Passwords.FORM_SUBMIT_URL, "");
|
DBUtils.replaceKey(values, null, Passwords.FORM_SUBMIT_URL, "");
|
||||||
@ -189,97 +192,5 @@ public class PasswordsProvider extends GeckoProvider {
|
|||||||
@Override
|
@Override
|
||||||
public void initGecko() {
|
public void initGecko() {
|
||||||
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Passwords:Init", null));
|
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Passwords:Init", null));
|
||||||
Intent initIntent = new Intent(GeckoApp.ACTION_INIT_PW);
|
|
||||||
mContext.sendBroadcast(initIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String doCrypto(String initialValue, Uri uri, Boolean encrypt) {
|
|
||||||
String profilePath = null;
|
|
||||||
if (uri != null) {
|
|
||||||
profilePath = uri.getQueryParameter(BrowserContract.PARAM_PROFILE_PATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
String result = "";
|
|
||||||
if (encrypt) {
|
|
||||||
if (profilePath != null) result = NSSBridge.encrypt(mContext, profilePath, initialValue);
|
|
||||||
else result = NSSBridge.encrypt(mContext, initialValue);
|
|
||||||
} else {
|
|
||||||
if (profilePath != null) result = NSSBridge.decrypt(mContext, profilePath, initialValue);
|
|
||||||
else result = NSSBridge.decrypt(mContext, initialValue);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPreInsert(ContentValues values, Uri uri, SQLiteBridge db) {
|
|
||||||
if (values.containsKey(Passwords.GUID)) {
|
|
||||||
String guid = values.getAsString(Passwords.GUID);
|
|
||||||
String where = BrowserContract.DeletedPasswords.GUID + " = ?";
|
|
||||||
String[] args = new String[] { guid };
|
|
||||||
if (guid == null) {
|
|
||||||
where = BrowserContract.DeletedPasswords.GUID + " IS NULL";
|
|
||||||
args = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
db.delete(TABLE_DELETED_PASSWORDS, where, args);
|
|
||||||
} catch(SQLiteBridgeException ex) {
|
|
||||||
Log.w(getLogTag(), "Error removing entry with GUID " + guid, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (values.containsKey(Passwords.ENCRYPTED_PASSWORD)) {
|
|
||||||
String res = doCrypto(values.getAsString(Passwords.ENCRYPTED_PASSWORD), uri, true);
|
|
||||||
values.put(Passwords.ENCRYPTED_PASSWORD, res);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (values.containsKey(Passwords.ENCRYPTED_USERNAME)) {
|
|
||||||
String res = doCrypto(values.getAsString(Passwords.ENCRYPTED_USERNAME), uri, true);
|
|
||||||
values.put(Passwords.ENCRYPTED_USERNAME, res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPreUpdate(ContentValues values, Uri uri, SQLiteBridge db) {
|
|
||||||
if (values.containsKey(Passwords.ENCRYPTED_PASSWORD)) {
|
|
||||||
String res = doCrypto(values.getAsString(Passwords.ENCRYPTED_PASSWORD), uri, true);
|
|
||||||
values.put(Passwords.ENCRYPTED_PASSWORD, res);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (values.containsKey(Passwords.ENCRYPTED_USERNAME)) {
|
|
||||||
String res = doCrypto(values.getAsString(Passwords.ENCRYPTED_USERNAME), uri, true);
|
|
||||||
values.put(Passwords.ENCRYPTED_USERNAME, res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPostQuery(Cursor cursor, Uri uri, SQLiteBridge db) {
|
|
||||||
int passwordIndex = -1;
|
|
||||||
int usernameIndex = -1;
|
|
||||||
String profilePath = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
passwordIndex = cursor.getColumnIndexOrThrow(Passwords.ENCRYPTED_PASSWORD);
|
|
||||||
} catch(Exception ex) { }
|
|
||||||
try {
|
|
||||||
usernameIndex = cursor.getColumnIndexOrThrow(Passwords.ENCRYPTED_USERNAME);
|
|
||||||
} catch(Exception ex) { }
|
|
||||||
|
|
||||||
if (passwordIndex > -1 || usernameIndex > -1) {
|
|
||||||
MatrixBlobCursor m = (MatrixBlobCursor)cursor;
|
|
||||||
if (cursor.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
if (passwordIndex > -1) {
|
|
||||||
String decrypted = doCrypto(cursor.getString(passwordIndex), uri, false);;
|
|
||||||
m.set(passwordIndex, decrypted);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usernameIndex > -1) {
|
|
||||||
String decrypted = doCrypto(cursor.getString(usernameIndex), uri, false);
|
|
||||||
m.set(usernameIndex, decrypted);
|
|
||||||
}
|
|
||||||
} while(cursor.moveToNext());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,21 +228,8 @@ public class MatrixBlobCursor extends AbstractCursor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set(int column, Object value) {
|
|
||||||
if (column < 0 || column >= columnCount) {
|
|
||||||
throw new CursorIndexOutOfBoundsException("Requested column: "
|
|
||||||
+ column + ", # of columns: " + columnCount);
|
|
||||||
}
|
|
||||||
if (mPos < 0) {
|
|
||||||
throw new CursorIndexOutOfBoundsException("Before first row.");
|
|
||||||
}
|
|
||||||
if (mPos >= rowCount) {
|
|
||||||
throw new CursorIndexOutOfBoundsException("After last row.");
|
|
||||||
}
|
|
||||||
data[mPos * columnCount + column] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// AbstractCursor implementation.
|
// AbstractCursor implementation.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getCount() {
|
||||||
return rowCount;
|
return rowCount;
|
||||||
|
@ -6,12 +6,9 @@ import @ANDROID_PACKAGE_NAME@.*;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
import android.database.Cursor;
|
|
||||||
import android.content.ContentValues;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.test.ActivityInstrumentationTestCase2;
|
import android.test.ActivityInstrumentationTestCase2;
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
@ -28,7 +25,6 @@ abstract class BaseTest extends ActivityInstrumentationTestCase2<Activity> {
|
|||||||
protected String mBaseUrl;
|
protected String mBaseUrl;
|
||||||
private String mTestType;
|
private String mTestType;
|
||||||
private String mLogFile;
|
private String mLogFile;
|
||||||
protected String mProfile;
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
try {
|
try {
|
||||||
@ -50,8 +46,7 @@ abstract class BaseTest extends ActivityInstrumentationTestCase2<Activity> {
|
|||||||
|
|
||||||
// Create the intent to be used with all the important arguments.
|
// Create the intent to be used with all the important arguments.
|
||||||
Intent i = new Intent(Intent.ACTION_MAIN);
|
Intent i = new Intent(Intent.ACTION_MAIN);
|
||||||
mProfile = (String)config.get("profile");
|
i.putExtra("args", "-no-remote -profile " + (String)config.get("profile"));
|
||||||
i.putExtra("args", "-no-remote -profile " + mProfile);
|
|
||||||
|
|
||||||
// Start the activity
|
// Start the activity
|
||||||
setActivityIntent(i);
|
setActivityIntent(i);
|
||||||
@ -153,55 +148,4 @@ abstract class BaseTest extends ActivityInstrumentationTestCase2<Activity> {
|
|||||||
protected interface BooleanTest {
|
protected interface BooleanTest {
|
||||||
public boolean test();
|
public boolean test();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({"unchecked", "non-varargs"})
|
|
||||||
public void SqliteCompare(String dbName, String sqlCommand, ContentValues[] cvs) {
|
|
||||||
File profile = new File(mProfile);
|
|
||||||
String dbPath = new File(profile, dbName).getPath();
|
|
||||||
|
|
||||||
Cursor c = mActions.querySql(dbPath, sqlCommand);
|
|
||||||
SqliteCompare(c, cvs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean CursorMatches(Cursor c, String[] columns, ContentValues cv) {
|
|
||||||
for (int i = 0; i < columns.length; i++) {
|
|
||||||
String column = columns[i];
|
|
||||||
if (cv.containsKey(column)) {
|
|
||||||
mAsserter.info("Comparing", "Column value " + c.getString(i) + " ?= " + cv.get(column).toString());
|
|
||||||
if (!cv.get(column).toString().equals(c.getString(i))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings({"unchecked", "non-varargs"})
|
|
||||||
public void SqliteCompare(Cursor c, ContentValues[] cvs) {
|
|
||||||
mAsserter.is(c.getCount(), cvs.length, "List is correct length");
|
|
||||||
if (c.moveToFirst()) {
|
|
||||||
do {
|
|
||||||
boolean found = false;
|
|
||||||
for (int i = 0; !found && i < cvs.length; i++) {
|
|
||||||
if (CursorMatches(c, cvs[i])) {
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mAsserter.is(found, true, "Password was found");
|
|
||||||
} while(c.moveToNext());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean CursorMatches(Cursor c, ContentValues cv) {
|
|
||||||
for (int i = 0; i < c.getColumnCount(); i++) {
|
|
||||||
String column = c.getColumnName(i);
|
|
||||||
if (cv.containsKey(column)) {
|
|
||||||
mAsserter.info("Pass","Column value " + c.getString(i) + " ?= " + cv.get(column).toString());
|
|
||||||
if (!cv.get(column).toString().equals(c.getString(i))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,6 @@
|
|||||||
[testAxisLocking]
|
[testAxisLocking]
|
||||||
[testAboutPage]
|
[testAboutPage]
|
||||||
[testWebContentContextMenu]
|
[testWebContentContextMenu]
|
||||||
[testPasswordProvider]
|
|
||||||
[testFormHistory]
|
|
||||||
|
|
||||||
# Used for Talos, please don't use in mochitest
|
# Used for Talos, please don't use in mochitest
|
||||||
#[testPan]
|
#[testPan]
|
||||||
|
@ -1,91 +0,0 @@
|
|||||||
#filter substitution
|
|
||||||
package @ANDROID_PACKAGE_NAME@.tests;
|
|
||||||
|
|
||||||
import @ANDROID_PACKAGE_NAME@.*;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.ContentValues;
|
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.Uri;
|
|
||||||
import java.io.File;
|
|
||||||
import java.lang.ClassLoader;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A basic form history contentprovider test.
|
|
||||||
* - inserts an element in form history when it is not yet set up
|
|
||||||
* - inserts an element in form history
|
|
||||||
* - updates an element in form history
|
|
||||||
* - deletes an element in form history
|
|
||||||
*/
|
|
||||||
public class testFormHistory extends BaseTest {
|
|
||||||
private static final String DB_NAME = "formhistory.sqlite";
|
|
||||||
public void testFormHistory() {
|
|
||||||
setTestType("mochitest");
|
|
||||||
Context context = (Context)getActivity();
|
|
||||||
ContentResolver cr = context.getContentResolver();
|
|
||||||
ContentValues[] cvs = new ContentValues[1];
|
|
||||||
cvs[0] = new ContentValues();
|
|
||||||
|
|
||||||
Actions.EventExpecter contentEventExpecter = mActions.expectGeckoEvent("Gecko:Ready");
|
|
||||||
contentEventExpecter.blockForEvent();
|
|
||||||
|
|
||||||
Uri formHistoryUri;
|
|
||||||
try {
|
|
||||||
ClassLoader classLoader = getActivity().getClassLoader();
|
|
||||||
Class fh = classLoader.loadClass("org.mozilla.gecko.db.BrowserContract$FormHistory");
|
|
||||||
|
|
||||||
cvs[0].put("fieldname", "fieldname");
|
|
||||||
cvs[0].put("value", "value");
|
|
||||||
cvs[0].put("timesUsed", "0");
|
|
||||||
cvs[0].put("guid", "guid");
|
|
||||||
|
|
||||||
// Attempt to insert into the db
|
|
||||||
formHistoryUri = (Uri)fh.getField("CONTENT_URI").get(null);
|
|
||||||
Uri.Builder builder = formHistoryUri.buildUpon();
|
|
||||||
formHistoryUri = builder.appendQueryParameter("profilePath", mProfile).build();
|
|
||||||
} catch(ClassNotFoundException ex) {
|
|
||||||
mAsserter.is(false, true, "Error getting class");
|
|
||||||
return;
|
|
||||||
} catch(NoSuchFieldException ex) {
|
|
||||||
mAsserter.is(false, true, "Error getting field");
|
|
||||||
return;
|
|
||||||
} catch(IllegalAccessException ex) {
|
|
||||||
mAsserter.is(false, true, "Error using field");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trying to insert should fail the first time round because there is no form history database
|
|
||||||
// Wait for gecko to reply and then we'll try again
|
|
||||||
contentEventExpecter = mActions.expectGeckoEvent("FormHistory:Init:Return");
|
|
||||||
Uri uri = cr.insert(formHistoryUri, cvs[0]);
|
|
||||||
mAsserter.is(uri, null, "Insert returned null correctly");
|
|
||||||
contentEventExpecter.blockForEvent();
|
|
||||||
|
|
||||||
uri = cr.insert(formHistoryUri, cvs[0]);
|
|
||||||
Uri expectedUri = formHistoryUri.buildUpon().appendPath("1").build();
|
|
||||||
mAsserter.is(expectedUri.toString(), uri.toString(), "Insert returned correct uri");
|
|
||||||
SqliteCompare(DB_NAME, "SELECT * FROM moz_formhistory", cvs);
|
|
||||||
|
|
||||||
cvs[0].put("fieldname", "fieldname2");
|
|
||||||
|
|
||||||
int numUpdated = cr.update(formHistoryUri, cvs[0], null, null);
|
|
||||||
mAsserter.is(1, numUpdated, "Correct number updated");
|
|
||||||
SqliteCompare(DB_NAME, "SELECT * FROM moz_formhistory", cvs);
|
|
||||||
|
|
||||||
int numDeleted = cr.delete(formHistoryUri, null, null);
|
|
||||||
mAsserter.is(1, numDeleted, "Correct number deleted");
|
|
||||||
cvs = new ContentValues[0];
|
|
||||||
SqliteCompare(DB_NAME, "SELECT * FROM moz_formhistory", cvs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void tearDown() throws Exception {
|
|
||||||
super.tearDown();
|
|
||||||
|
|
||||||
// remove the entire signons.sqlite file
|
|
||||||
File profile = new File(mProfile);
|
|
||||||
File db = new File(profile, "formhistory.sqlite");
|
|
||||||
db.delete();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,93 +0,0 @@
|
|||||||
#filter substitution
|
|
||||||
package @ANDROID_PACKAGE_NAME@.tests;
|
|
||||||
|
|
||||||
import @ANDROID_PACKAGE_NAME@.*;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.ContentValues;
|
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.Uri;
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A basic password contentprovider test.
|
|
||||||
* - inserts a password when the database is not yet set up
|
|
||||||
* - inserts a password
|
|
||||||
* - updates a password
|
|
||||||
* - deletes a password
|
|
||||||
*/
|
|
||||||
public class testPasswordProvider extends BaseTest {
|
|
||||||
private static final String DB_NAME = "signons.sqlite";
|
|
||||||
public void testPasswordProvider() {
|
|
||||||
setTestType("mochitest");
|
|
||||||
Context context = (Context)getActivity();
|
|
||||||
ContentResolver cr = context.getContentResolver();
|
|
||||||
ContentValues[] cvs = new ContentValues[1];
|
|
||||||
cvs[0] = new ContentValues();
|
|
||||||
|
|
||||||
Actions.EventExpecter contentEventExpecter = mActions.expectGeckoEvent("Gecko:Ready");
|
|
||||||
contentEventExpecter.blockForEvent();
|
|
||||||
|
|
||||||
Uri passwordUri;
|
|
||||||
try {
|
|
||||||
ClassLoader classLoader = getActivity().getClassLoader();
|
|
||||||
Class pwds = classLoader.loadClass("org.mozilla.gecko.db.BrowserContract$Passwords");
|
|
||||||
|
|
||||||
cvs[0].put("hostname", "http://www.example.com");
|
|
||||||
cvs[0].put("httpRealm", "http://www.example.com");
|
|
||||||
cvs[0].put("formSubmitURL", "http://www.example.com");
|
|
||||||
cvs[0].put("usernameField", "usernameField");
|
|
||||||
cvs[0].put("passwordField", "passwordField");
|
|
||||||
cvs[0].put("encryptedUsername", "username");
|
|
||||||
cvs[0].put("encryptedPassword", "password");
|
|
||||||
cvs[0].put("encType", "0");
|
|
||||||
|
|
||||||
// Attempt to insert into the db
|
|
||||||
passwordUri = (Uri)pwds.getField("CONTENT_URI").get(null);
|
|
||||||
Uri.Builder builder = passwordUri.buildUpon();
|
|
||||||
passwordUri = builder.appendQueryParameter("profilePath", mProfile).build();
|
|
||||||
} catch(ClassNotFoundException ex) {
|
|
||||||
mAsserter.is(false, true, "Error getting class");
|
|
||||||
return;
|
|
||||||
} catch(NoSuchFieldException ex) {
|
|
||||||
mAsserter.is(false, true, "Error getting field");
|
|
||||||
return;
|
|
||||||
} catch(IllegalAccessException ex) {
|
|
||||||
mAsserter.is(false, true, "Error using field");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Trying to inset should fail the first time round because there is no pw database
|
|
||||||
// Wait for gecko to reply and then we'll try again
|
|
||||||
contentEventExpecter = mActions.expectGeckoEvent("Passwords:Init:Return");
|
|
||||||
Uri uri = cr.insert(passwordUri, cvs[0]);
|
|
||||||
mAsserter.is(uri, null, "Insert returned null correctly");
|
|
||||||
contentEventExpecter.blockForEvent();
|
|
||||||
|
|
||||||
uri = cr.insert(passwordUri, cvs[0]);
|
|
||||||
SqliteCompare(DB_NAME, "SELECT * FROM moz_logins", cvs);
|
|
||||||
Uri expectedUri = passwordUri.buildUpon().appendPath("1").build();
|
|
||||||
mAsserter.is(expectedUri.toString(), uri.toString(), "Insert returned correct uri");
|
|
||||||
|
|
||||||
cvs[0].put("usernameField", "usernameField2");
|
|
||||||
cvs[0].put("passwordField", "passwordField2");
|
|
||||||
|
|
||||||
int numUpdated = cr.update(passwordUri, cvs[0], null, null);
|
|
||||||
mAsserter.is(1, numUpdated, "Correct number updated");
|
|
||||||
SqliteCompare(DB_NAME, "SELECT * FROM moz_logins", cvs);
|
|
||||||
|
|
||||||
int numDeleted = cr.delete(passwordUri, null, null);
|
|
||||||
mAsserter.is(1, numDeleted, "Correct number deleted");
|
|
||||||
cvs = new ContentValues[0];
|
|
||||||
SqliteCompare(DB_NAME, "SELECT * FROM moz_logins", cvs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void tearDown() throws Exception {
|
|
||||||
super.tearDown();
|
|
||||||
|
|
||||||
// remove the entire signons.sqlite file
|
|
||||||
File profile = new File(mProfile);
|
|
||||||
File db = new File(profile, "signons.sqlite");
|
|
||||||
db.delete();
|
|
||||||
}
|
|
||||||
}
|
|
@ -66,7 +66,6 @@
|
|||||||
#include "Zip.h"
|
#include "Zip.h"
|
||||||
#include "sqlite3.h"
|
#include "sqlite3.h"
|
||||||
#include "SQLiteBridge.h"
|
#include "SQLiteBridge.h"
|
||||||
#include "NSSBridge.h"
|
|
||||||
#ifndef MOZ_OLD_LINKER
|
#ifndef MOZ_OLD_LINKER
|
||||||
#include "ElfLoader.h"
|
#include "ElfLoader.h"
|
||||||
#endif
|
#endif
|
||||||
@ -77,8 +76,6 @@
|
|||||||
#define RUSAGE_THREAD 1
|
#define RUSAGE_THREAD 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef int mozglueresult;
|
|
||||||
|
|
||||||
enum StartupEvent {
|
enum StartupEvent {
|
||||||
#define mozilla_StartupTimeline_Event(ev, z) ev,
|
#define mozilla_StartupTimeline_Event(ev, z) ev,
|
||||||
#include "StartupTimeline.h"
|
#include "StartupTimeline.h"
|
||||||
@ -102,23 +99,6 @@ getLibraryMapping()
|
|||||||
return lib_mapping;
|
return lib_mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
JNI_Throw(JNIEnv* jenv, const char* classname, const char* msg)
|
|
||||||
{
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Throw\n");
|
|
||||||
jclass cls = jenv->FindClass(classname);
|
|
||||||
if (cls == NULL) {
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't find exception class (or exception pending) %s\n", classname);
|
|
||||||
exit(FAILURE);
|
|
||||||
}
|
|
||||||
int rc = jenv->ThrowNew(cls, msg);
|
|
||||||
if (rc < 0) {
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Error throwing exception %s\n", msg);
|
|
||||||
exit(FAILURE);
|
|
||||||
}
|
|
||||||
jenv->DeleteLocalRef(cls);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MOZ_OLD_LINKER
|
#ifdef MOZ_OLD_LINKER
|
||||||
static int
|
static int
|
||||||
createAshmem(size_t bytes, const char *name)
|
createAshmem(size_t bytes, const char *name)
|
||||||
@ -333,9 +313,79 @@ SHELL_WRAPPER3(notifyReadingMessageListFailed, jint, jint, jlong)
|
|||||||
|
|
||||||
static void * xul_handle = NULL;
|
static void * xul_handle = NULL;
|
||||||
static void * sqlite_handle = NULL;
|
static void * sqlite_handle = NULL;
|
||||||
static void * nss_handle = NULL;
|
#ifdef MOZ_OLD_LINKER
|
||||||
static void * nspr_handle = NULL;
|
static time_t apk_mtime = 0;
|
||||||
static void * plc_handle = NULL;
|
#ifdef DEBUG
|
||||||
|
extern "C" int extractLibs = 1;
|
||||||
|
#else
|
||||||
|
extern "C" int extractLibs = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
extractFile(const char * path, Zip::Stream &s)
|
||||||
|
{
|
||||||
|
uint32_t size = s.GetUncompressedSize();
|
||||||
|
|
||||||
|
struct stat status;
|
||||||
|
if (!stat(path, &status) &&
|
||||||
|
status.st_size == size &&
|
||||||
|
apk_mtime < status.st_mtime)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int fd = open(path, O_CREAT | O_NOATIME | O_TRUNC | O_RDWR, S_IRWXU);
|
||||||
|
if (fd == -1) {
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't open %s to decompress library", path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ftruncate(fd, size) == -1) {
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't ftruncate %s to decompress library", path);
|
||||||
|
close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * buf = mmap(NULL, size, PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED, fd, 0);
|
||||||
|
if (buf == (void *)-1) {
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't mmap decompression buffer");
|
||||||
|
close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
z_stream strm = {
|
||||||
|
next_in: (Bytef *)s.GetBuffer(),
|
||||||
|
avail_in: s.GetSize(),
|
||||||
|
total_in: 0,
|
||||||
|
|
||||||
|
next_out: (Bytef *)buf,
|
||||||
|
avail_out: size,
|
||||||
|
total_out: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
ret = inflateInit2(&strm, -MAX_WBITS);
|
||||||
|
if (ret != Z_OK)
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "inflateInit failed: %s", strm.msg);
|
||||||
|
|
||||||
|
if (inflate(&strm, Z_FINISH) != Z_STREAM_END)
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "inflate failed: %s", strm.msg);
|
||||||
|
|
||||||
|
if (strm.total_out != size)
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "extracted %d, expected %d!", strm.total_out, size);
|
||||||
|
|
||||||
|
ret = inflateEnd(&strm);
|
||||||
|
if (ret != Z_OK)
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "inflateEnd failed: %s", strm.msg);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
#ifdef ANDROID_ARM_LINKER
|
||||||
|
/* We just extracted data that is going to be executed in the future.
|
||||||
|
* We thus need to ensure Instruction and Data cache coherency. */
|
||||||
|
cacheflush((unsigned) buf, (unsigned) buf + size, 0);
|
||||||
|
#endif
|
||||||
|
munmap(buf, size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MOZ_CRASHREPORTER) || defined(MOZ_OLD_LINKER)
|
#if defined(MOZ_CRASHREPORTER) || defined(MOZ_OLD_LINKER)
|
||||||
static void
|
static void
|
||||||
@ -460,6 +510,25 @@ static void * mozload(const char * path, Zip *zip)
|
|||||||
if (!zip->GetStream(path, &s))
|
if (!zip->GetStream(path, &s))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (extractLibs) {
|
||||||
|
char fullpath[PATH_MAX];
|
||||||
|
snprintf(fullpath, PATH_MAX, "%s/%s", getenv("MOZ_LINKER_CACHE"), path);
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "resolved %s to %s", path, fullpath);
|
||||||
|
extractFile(fullpath, s);
|
||||||
|
handle = __wrap_dlopen(fullpath, RTLD_LAZY);
|
||||||
|
if (!handle)
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't load %s because %s", fullpath, __wrap_dlerror());
|
||||||
|
#ifdef DEBUG
|
||||||
|
gettimeofday(&t1, 0);
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "%s: spent %d", path,
|
||||||
|
(((long long)t1.tv_sec * 1000000LL) +
|
||||||
|
(long long)t1.tv_usec) -
|
||||||
|
(((long long)t0.tv_sec * 1000000LL) +
|
||||||
|
(long long)t0.tv_usec));
|
||||||
|
#endif
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
bool skipLibCache = false;
|
bool skipLibCache = false;
|
||||||
int fd;
|
int fd;
|
||||||
void * buf = NULL;
|
void * buf = NULL;
|
||||||
@ -572,11 +641,17 @@ report_mapping(char *name, void *base, uint32_t len, uint32_t offset)
|
|||||||
extern "C" void simple_linker_init(void);
|
extern "C" void simple_linker_init(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static mozglueresult
|
static void
|
||||||
loadGeckoLibs(const char *apkName)
|
loadGeckoLibs(const char *apkName)
|
||||||
{
|
{
|
||||||
chdir(getenv("GRE_HOME"));
|
chdir(getenv("GRE_HOME"));
|
||||||
|
|
||||||
|
#ifdef MOZ_OLD_LINKER
|
||||||
|
struct stat status;
|
||||||
|
if (!stat(apkName, &status))
|
||||||
|
apk_mtime = status.st_mtime;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct timeval t0, t1;
|
struct timeval t0, t1;
|
||||||
gettimeofday(&t0, 0);
|
gettimeofday(&t0, 0);
|
||||||
struct rusage usage1;
|
struct rusage usage1;
|
||||||
@ -597,16 +672,19 @@ loadGeckoLibs(const char *apkName)
|
|||||||
delete[] file;
|
delete[] file;
|
||||||
#else
|
#else
|
||||||
#define MOZLOAD(name) mozload("lib" name ".so", zip)
|
#define MOZLOAD(name) mozload("lib" name ".so", zip)
|
||||||
if (!MOZLOAD("mozalloc")) return FAILURE;
|
MOZLOAD("mozalloc");
|
||||||
if (!MOZLOAD("plds4")) return FAILURE;
|
MOZLOAD("nspr4");
|
||||||
if (!MOZLOAD("nssutil3")) return FAILURE;
|
MOZLOAD("plc4");
|
||||||
if (!MOZLOAD("ssl3")) return FAILURE;
|
MOZLOAD("plds4");
|
||||||
if (!MOZLOAD("smime3")) return FAILURE;
|
MOZLOAD("nssutil3");
|
||||||
|
MOZLOAD("nss3");
|
||||||
|
MOZLOAD("ssl3");
|
||||||
|
MOZLOAD("smime3");
|
||||||
xul_handle = MOZLOAD("xul");
|
xul_handle = MOZLOAD("xul");
|
||||||
if (!MOZLOAD("xpcom")) return FAILURE;
|
MOZLOAD("xpcom");
|
||||||
if (!MOZLOAD("nssckbi")) return FAILURE;
|
MOZLOAD("nssckbi");
|
||||||
if (!MOZLOAD("freebl3")) return FAILURE;
|
MOZLOAD("freebl3");
|
||||||
if (!MOZLOAD("softokn3")) return FAILURE;
|
MOZLOAD("softokn3");
|
||||||
#undef MOZLOAD
|
#undef MOZLOAD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -615,10 +693,8 @@ loadGeckoLibs(const char *apkName)
|
|||||||
file_ids = NULL;
|
file_ids = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!xul_handle) {
|
if (!xul_handle)
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libxul!");
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libxul!");
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GETFUNC(name) f_ ## name = (name ## _t) __wrap_dlsym(xul_handle, "Java_org_mozilla_gecko_GeckoAppShell_" #name)
|
#define GETFUNC(name) f_ ## name = (name ## _t) __wrap_dlsym(xul_handle, "Java_org_mozilla_gecko_GeckoAppShell_" #name)
|
||||||
GETFUNC(nativeInit);
|
GETFUNC(nativeInit);
|
||||||
@ -662,15 +738,18 @@ loadGeckoLibs(const char *apkName)
|
|||||||
|
|
||||||
StartupTimeline_Record(LINKER_INITIALIZED, &t0);
|
StartupTimeline_Record(LINKER_INITIALIZED, &t0);
|
||||||
StartupTimeline_Record(LIBRARIES_LOADED, &t1);
|
StartupTimeline_Record(LIBRARIES_LOADED, &t1);
|
||||||
return SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int loadSQLiteLibs(const char *apkName)
|
static void loadSQLiteLibs(const char *apkName)
|
||||||
{
|
{
|
||||||
chdir(getenv("GRE_HOME"));
|
chdir(getenv("GRE_HOME"));
|
||||||
|
|
||||||
#ifdef MOZ_OLD_LINKER
|
#ifdef MOZ_OLD_LINKER
|
||||||
simple_linker_init();
|
simple_linker_init();
|
||||||
|
|
||||||
|
struct stat status;
|
||||||
|
if (!stat(apkName, &status))
|
||||||
|
apk_mtime = status.st_mtime;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RefPtr<Zip> zip = new Zip(apkName);
|
RefPtr<Zip> zip = new Zip(apkName);
|
||||||
@ -696,80 +775,10 @@ static int loadSQLiteLibs(const char *apkName)
|
|||||||
file_ids = NULL;
|
file_ids = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!sqlite_handle) {
|
if (!sqlite_handle)
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libmozsqlite3!");
|
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libmozsqlite3!");
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
setup_sqlite_functions(sqlite_handle);
|
setup_sqlite_functions(sqlite_handle);
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static mozglueresult
|
|
||||||
loadNSSLibs(const char *apkName)
|
|
||||||
{
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "loadNSSLibs");
|
|
||||||
chdir(getenv("GRE_HOME"));
|
|
||||||
|
|
||||||
#ifdef MOZ_OLD_LINKER
|
|
||||||
simple_linker_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Zip *zip = new Zip(apkName);
|
|
||||||
lib_mapping = (struct mapping_info *)calloc(MAX_MAPPING_INFO, sizeof(*lib_mapping));
|
|
||||||
|
|
||||||
#ifdef MOZ_CRASHREPORTER
|
|
||||||
file_ids = (char *)extractBuf("lib.id", zip);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MOZ_OLD_LINKER
|
|
||||||
char *file = new char[strlen(apkName) + sizeof("!/libnss3.so")];
|
|
||||||
sprintf(file, "%s!/libnss3.so", apkName);
|
|
||||||
nss_handle = __wrap_dlopen(file, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
delete [] file;
|
|
||||||
|
|
||||||
file = new char[strlen(apkName) + sizeof("!/libnspr4.so")];
|
|
||||||
sprintf(file, "%s!/libnspr4.so", apkName);
|
|
||||||
nspr_handle = __wrap_dlopen(file, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
delete [] file;
|
|
||||||
|
|
||||||
file = new char[strlen(apkName) + sizeof("!/libplc4.so")];
|
|
||||||
sprintf(file, "%s!/libplc4.so", apkName);
|
|
||||||
plc_handle = __wrap_dlopen(file, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
delete [] file;
|
|
||||||
#else
|
|
||||||
#define MOZLOAD(name) mozload("lib" name ".so", zip)
|
|
||||||
nss_handle = MOZLOAD("libnss3");
|
|
||||||
nspr_handle = MOZLOAD("libnspr4");
|
|
||||||
plc_handle = MOZLOAD("libplc4");
|
|
||||||
#undef MOZLOAD
|
|
||||||
#endif
|
|
||||||
|
|
||||||
delete zip;
|
|
||||||
|
|
||||||
#ifdef MOZ_CRASHREPORTER
|
|
||||||
free(file_ids);
|
|
||||||
file_ids = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "loadNSSLibs 2");
|
|
||||||
if (!nss_handle) {
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libnss3!");
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nspr_handle) {
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libnspr4!");
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!plc_handle) {
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libplc4!");
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "loadNSSLibs 3");
|
|
||||||
return setup_nss_functions(nss_handle, nspr_handle, plc_handle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" NS_EXPORT void JNICALL
|
extern "C" NS_EXPORT void JNICALL
|
||||||
@ -782,16 +791,20 @@ Java_org_mozilla_gecko_GeckoAppShell_loadGeckoLibsNative(JNIEnv *jenv, jclass jG
|
|||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int res = loadGeckoLibs(str);
|
loadGeckoLibs(str);
|
||||||
if (res != SUCCESS) {
|
|
||||||
JNI_Throw(jenv, "java/lang/Exception", "Error loading gecko libraries");
|
|
||||||
}
|
|
||||||
jenv->ReleaseStringUTFChars(jApkName, str);
|
jenv->ReleaseStringUTFChars(jApkName, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" NS_EXPORT void JNICALL
|
extern "C" NS_EXPORT void JNICALL
|
||||||
Java_org_mozilla_gecko_GeckoAppShell_loadSQLiteLibsNative(JNIEnv *jenv, jclass jGeckoAppShellClass, jstring jApkName, jboolean jShouldExtract) {
|
Java_org_mozilla_gecko_GeckoAppShell_loadSQLiteLibsNative(JNIEnv *jenv, jclass jGeckoAppShellClass, jstring jApkName, jboolean jShouldExtract) {
|
||||||
putenv("MOZ_LINKER_EXTRACT=1");
|
if (jShouldExtract) {
|
||||||
|
#ifdef MOZ_OLD_LINKER
|
||||||
|
extractLibs = 1;
|
||||||
|
#else
|
||||||
|
putenv("MOZ_LINKER_EXTRACT=1");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
const char* str;
|
const char* str;
|
||||||
// XXX: java doesn't give us true UTF8, we should figure out something
|
// XXX: java doesn't give us true UTF8, we should figure out something
|
||||||
// better to do here
|
// better to do here
|
||||||
@ -799,30 +812,7 @@ Java_org_mozilla_gecko_GeckoAppShell_loadSQLiteLibsNative(JNIEnv *jenv, jclass j
|
|||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Load sqlite start\n");
|
loadSQLiteLibs(str);
|
||||||
mozglueresult rv = loadSQLiteLibs(str);
|
|
||||||
if (rv != SUCCESS) {
|
|
||||||
JNI_Throw(jenv, "java/lang/Exception", "Error loading sqlite libraries");
|
|
||||||
}
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Load sqlite done\n");
|
|
||||||
jenv->ReleaseStringUTFChars(jApkName, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" NS_EXPORT void JNICALL
|
|
||||||
Java_org_mozilla_gecko_GeckoAppShell_loadNSSLibsNative(JNIEnv *jenv, jclass jGeckoAppShellClass, jstring jApkName) {
|
|
||||||
const char* str;
|
|
||||||
// XXX: java doesn't give us true UTF8, we should figure out something
|
|
||||||
// better to do here
|
|
||||||
str = jenv->GetStringUTFChars(jApkName, NULL);
|
|
||||||
if (str == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Load nss start\n");
|
|
||||||
mozglueresult rv = loadNSSLibs(str);
|
|
||||||
if (rv != SUCCESS) {
|
|
||||||
JNI_Throw(jenv, "java/lang/Exception", "Error loading nss libraries");
|
|
||||||
}
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Load nss done\n");
|
|
||||||
jenv->ReleaseStringUTFChars(jApkName, str);
|
jenv->ReleaseStringUTFChars(jApkName, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -846,8 +836,9 @@ Java_org_mozilla_gecko_GeckoAppShell_nativeRun(JNIEnv *jenv, jclass jc, jstring
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef int GeckoProcessType;
|
typedef int GeckoProcessType;
|
||||||
|
typedef int nsresult;
|
||||||
|
|
||||||
extern "C" NS_EXPORT mozglueresult
|
extern "C" NS_EXPORT int
|
||||||
ChildProcessInit(int argc, char* argv[])
|
ChildProcessInit(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -862,21 +853,14 @@ ChildProcessInit(int argc, char* argv[])
|
|||||||
#ifdef MOZ_OLD_LINKER
|
#ifdef MOZ_OLD_LINKER
|
||||||
fillLibCache(argv[argc - 1]);
|
fillLibCache(argv[argc - 1]);
|
||||||
#endif
|
#endif
|
||||||
if (loadNSSLibs(argv[i]) != SUCCESS) {
|
loadSQLiteLibs(argv[i]);
|
||||||
return FAILURE;
|
loadGeckoLibs(argv[i]);
|
||||||
}
|
|
||||||
if (loadSQLiteLibs(argv[i]) != SUCCESS) {
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
if (loadGeckoLibs(argv[i]) != SUCCESS) {
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't pass the last arg - it's only recognized by the lib cache
|
// don't pass the last arg - it's only recognized by the lib cache
|
||||||
argc--;
|
argc--;
|
||||||
|
|
||||||
typedef GeckoProcessType (*XRE_StringToChildProcessType_t)(char*);
|
typedef GeckoProcessType (*XRE_StringToChildProcessType_t)(char*);
|
||||||
typedef mozglueresult (*XRE_InitChildProcess_t)(int, char**, GeckoProcessType);
|
typedef nsresult (*XRE_InitChildProcess_t)(int, char**, GeckoProcessType);
|
||||||
XRE_StringToChildProcessType_t fXRE_StringToChildProcessType =
|
XRE_StringToChildProcessType_t fXRE_StringToChildProcessType =
|
||||||
(XRE_StringToChildProcessType_t)__wrap_dlsym(xul_handle, "XRE_StringToChildProcessType");
|
(XRE_StringToChildProcessType_t)__wrap_dlsym(xul_handle, "XRE_StringToChildProcessType");
|
||||||
XRE_InitChildProcess_t fXRE_InitChildProcess =
|
XRE_InitChildProcess_t fXRE_InitChildProcess =
|
||||||
@ -884,6 +868,10 @@ ChildProcessInit(int argc, char* argv[])
|
|||||||
|
|
||||||
GeckoProcessType proctype = fXRE_StringToChildProcessType(argv[--argc]);
|
GeckoProcessType proctype = fXRE_StringToChildProcessType(argv[--argc]);
|
||||||
|
|
||||||
return fXRE_InitChildProcess(argc, argv, proctype);
|
nsresult rv = fXRE_InitChildProcess(argc, argv, proctype);
|
||||||
|
if (rv != 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,8 +37,6 @@
|
|||||||
#ifndef APKOpen_h
|
#ifndef APKOpen_h
|
||||||
#define APKOpen_h
|
#define APKOpen_h
|
||||||
|
|
||||||
#include <jni.h>
|
|
||||||
|
|
||||||
#ifndef NS_EXPORT
|
#ifndef NS_EXPORT
|
||||||
#define NS_EXPORT __attribute__ ((visibility("default")))
|
#define NS_EXPORT __attribute__ ((visibility("default")))
|
||||||
#endif
|
#endif
|
||||||
@ -53,10 +51,6 @@ struct mapping_info {
|
|||||||
|
|
||||||
const struct mapping_info * getLibraryMapping();
|
const struct mapping_info * getLibraryMapping();
|
||||||
|
|
||||||
static const int SUCCESS = 0;
|
|
||||||
static const int FAILURE = 1;
|
|
||||||
void JNI_Throw(JNIEnv* jenv, const char* classname, const char* msg);
|
|
||||||
|
|
||||||
#define MAX_LIB_CACHE_ENTRIES 32
|
#define MAX_LIB_CACHE_ENTRIES 32
|
||||||
#define MAX_LIB_CACHE_NAME_LEN 32
|
#define MAX_LIB_CACHE_NAME_LEN 32
|
||||||
|
|
||||||
@ -69,5 +63,4 @@ struct lib_cache_info {
|
|||||||
|
|
||||||
NS_EXPORT const struct lib_cache_info * getLibraryCache();
|
NS_EXPORT const struct lib_cache_info * getLibraryCache();
|
||||||
|
|
||||||
|
|
||||||
#endif /* APKOpen_h */
|
#endif /* APKOpen_h */
|
||||||
|
@ -55,7 +55,6 @@ CPPSRCS = \
|
|||||||
nsGeckoUtils.cpp \
|
nsGeckoUtils.cpp \
|
||||||
APKOpen.cpp \
|
APKOpen.cpp \
|
||||||
SQLiteBridge.cpp \
|
SQLiteBridge.cpp \
|
||||||
NSSBridge.cpp \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
LOCAL_INCLUDES += -I$(DEPTH)/build
|
LOCAL_INCLUDES += -I$(DEPTH)/build
|
||||||
@ -64,28 +63,6 @@ LOCAL_INCLUDES += -I$(topsrcdir)/xpcom/build
|
|||||||
LOCAL_INCLUDES += -I$(srcdir)/../linker
|
LOCAL_INCLUDES += -I$(srcdir)/../linker
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/components/startup
|
LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/components/startup
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/db/sqlite3/src
|
LOCAL_INCLUDES += -I$(topsrcdir)/db/sqlite3/src
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/base/src
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/nsprpub/lib/ds
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/nsprpub/lib/libc/include
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/nsprpub/pr/include
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/ipc/chromium/src/base/third_party/nspr
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/ipc/chromium/src
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/nss
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/util
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/softoken
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/pk11wrap
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/cmd/ecperf
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/pkcs7
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/certdb
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/cryptohi
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/dev
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/base
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/pki
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/smime
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/freebl/
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/lib/ssl
|
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/security/nss/cmd/lib/
|
|
||||||
|
|
||||||
ifdef MOZ_OLD_LINKER
|
ifdef MOZ_OLD_LINKER
|
||||||
DEFINES += -DMOZ_OLD_LINKER
|
DEFINES += -DMOZ_OLD_LINKER
|
||||||
LOCAL_INCLUDES += -I$(topsrcdir)/other-licenses/android
|
LOCAL_INCLUDES += -I$(topsrcdir)/other-licenses/android
|
||||||
|
@ -1,300 +0,0 @@
|
|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "dlfcn.h"
|
|
||||||
#include "NSSBridge.h"
|
|
||||||
#include "APKOpen.h"
|
|
||||||
#ifdef ANDROID
|
|
||||||
#include <jni.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MOZ_OLD_LINKER
|
|
||||||
#include "ElfLoader.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DEBUG 1
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define LOG(x...) __android_log_print(ANDROID_LOG_INFO, "GeckoJNI", x)
|
|
||||||
#else
|
|
||||||
#define LOG(x...) printf(x);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool initialized = false;
|
|
||||||
|
|
||||||
#define NSS_WRAPPER_INT(name) name ## _t f_ ## name;
|
|
||||||
NSS_WRAPPER_INT(NSS_Initialize)
|
|
||||||
NSS_WRAPPER_INT(NSS_Shutdown)
|
|
||||||
NSS_WRAPPER_INT(SECITEM_ZfreeItem)
|
|
||||||
NSS_WRAPPER_INT(PK11SDR_Encrypt)
|
|
||||||
NSS_WRAPPER_INT(PK11SDR_Decrypt)
|
|
||||||
NSS_WRAPPER_INT(PK11_GetInternalKeySlot)
|
|
||||||
NSS_WRAPPER_INT(PK11_NeedUserInit)
|
|
||||||
NSS_WRAPPER_INT(PK11_InitPin)
|
|
||||||
NSS_WRAPPER_INT(PR_ErrorToString)
|
|
||||||
NSS_WRAPPER_INT(PR_GetError)
|
|
||||||
NSS_WRAPPER_INT(PR_Free)
|
|
||||||
NSS_WRAPPER_INT(PL_Base64Encode)
|
|
||||||
NSS_WRAPPER_INT(PL_Base64Decode)
|
|
||||||
NSS_WRAPPER_INT(PL_strfree)
|
|
||||||
|
|
||||||
int
|
|
||||||
setup_nss_functions(void *nss_handle,
|
|
||||||
void *nspr_handle,
|
|
||||||
void *plc_handle)
|
|
||||||
{
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "setup nss 1");
|
|
||||||
if (nss_handle == NULL || nspr_handle == NULL || plc_handle == NULL) {
|
|
||||||
LOG("missing handle\n");
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
#define GETFUNC(name) f_ ## name = (name ## _t) __wrap_dlsym(nss_handle, #name); \
|
|
||||||
if (!f_ ##name) return FAILURE;
|
|
||||||
GETFUNC(NSS_Initialize);
|
|
||||||
GETFUNC(NSS_Shutdown);
|
|
||||||
GETFUNC(PK11SDR_Encrypt);
|
|
||||||
GETFUNC(PK11SDR_Decrypt);
|
|
||||||
GETFUNC(PK11_GetInternalKeySlot);
|
|
||||||
GETFUNC(PK11_NeedUserInit);
|
|
||||||
GETFUNC(PK11_InitPin);
|
|
||||||
GETFUNC(SECITEM_ZfreeItem);
|
|
||||||
#undef GETFUNC
|
|
||||||
#define NSPRFUNC(name) f_ ## name = (name ## _t) __wrap_dlsym(nspr_handle, #name); \
|
|
||||||
if (!f_ ##name) return FAILURE;
|
|
||||||
NSPRFUNC(PR_ErrorToString);
|
|
||||||
NSPRFUNC(PR_GetError);
|
|
||||||
NSPRFUNC(PR_Free);
|
|
||||||
#undef NSPRFUNC
|
|
||||||
#define PLCFUNC(name) f_ ## name = (name ## _t) __wrap_dlsym(plc_handle, #name); \
|
|
||||||
if (!f_ ##name) return FAILURE;
|
|
||||||
PLCFUNC(PL_Base64Encode);
|
|
||||||
PLCFUNC(PL_Base64Decode);
|
|
||||||
PLCFUNC(PL_strfree);
|
|
||||||
#undef PLCFUNC
|
|
||||||
|
|
||||||
return SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Throws the current NSS error. */
|
|
||||||
static void
|
|
||||||
throwError(JNIEnv* jenv, const char * funcString) {
|
|
||||||
char *msg;
|
|
||||||
|
|
||||||
PRErrorCode perr = f_PR_GetError();
|
|
||||||
char * errString = f_PR_ErrorToString(perr, 0);
|
|
||||||
asprintf(&msg, "%s returned error %d: %s\n", funcString, perr, errString);
|
|
||||||
LOG("Throwing error: %s\n", msg);
|
|
||||||
|
|
||||||
JNI_Throw(jenv, "java/lang/Exception", msg);
|
|
||||||
free(msg);
|
|
||||||
LOG("Error thrown\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" NS_EXPORT jstring JNICALL
|
|
||||||
Java_org_mozilla_gecko_NSSBridge_nativeEncrypt(JNIEnv* jenv, jclass,
|
|
||||||
jstring jPath,
|
|
||||||
jstring jValue)
|
|
||||||
{
|
|
||||||
jstring ret = jenv->NewStringUTF("");
|
|
||||||
|
|
||||||
const char* path;
|
|
||||||
path = jenv->GetStringUTFChars(jPath, NULL);
|
|
||||||
|
|
||||||
const char* value;
|
|
||||||
value = jenv->GetStringUTFChars(jValue, NULL);
|
|
||||||
|
|
||||||
char* result;
|
|
||||||
SECStatus rv = doCrypto(jenv, path, value, &result, true);
|
|
||||||
if (rv == SECSuccess) {
|
|
||||||
ret = jenv->NewStringUTF(result);
|
|
||||||
free(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
jenv->ReleaseStringUTFChars(jValue, value);
|
|
||||||
jenv->ReleaseStringUTFChars(jPath, path);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" NS_EXPORT jstring JNICALL
|
|
||||||
Java_org_mozilla_gecko_NSSBridge_nativeDecrypt(JNIEnv* jenv, jclass,
|
|
||||||
jstring jPath,
|
|
||||||
jstring jValue)
|
|
||||||
{
|
|
||||||
jstring ret = jenv->NewStringUTF("");
|
|
||||||
|
|
||||||
const char* path;
|
|
||||||
path = jenv->GetStringUTFChars(jPath, NULL);
|
|
||||||
|
|
||||||
const char* value;
|
|
||||||
value = jenv->GetStringUTFChars(jValue, NULL);
|
|
||||||
|
|
||||||
char* result;
|
|
||||||
SECStatus rv = doCrypto(jenv, path, value, &result, false);
|
|
||||||
if (rv == SECSuccess) {
|
|
||||||
ret = jenv->NewStringUTF(result);
|
|
||||||
free(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
jenv->ReleaseStringUTFChars(jValue, value);
|
|
||||||
jenv->ReleaseStringUTFChars(jPath, path);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Encrypts or decrypts a string. result should be freed with free() when done */
|
|
||||||
SECStatus
|
|
||||||
doCrypto(JNIEnv* jenv, const char *path, const char *value, char** result, bool encrypt)
|
|
||||||
{
|
|
||||||
SECStatus rv;
|
|
||||||
PK11SlotInfo *slot;
|
|
||||||
if (!initialized) {
|
|
||||||
LOG("initialize crypto %s\n", path);
|
|
||||||
rv = f_NSS_Initialize(path, "", "", "secmod.db", NSS_INIT_NOROOTINIT);
|
|
||||||
if (rv != SECSuccess) {
|
|
||||||
throwError(jenv, "NSS_Initialize");
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
slot = f_PK11_GetInternalKeySlot();
|
|
||||||
if (!slot) {
|
|
||||||
throwError(jenv, "PK11_GetInternalKeySlot");
|
|
||||||
return SECFailure;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f_PK11_NeedUserInit(slot)) {
|
|
||||||
LOG("Initializing key3.db with default blank password.");
|
|
||||||
rv = f_PK11_InitPin(slot, NULL, NULL);
|
|
||||||
if (rv != SECSuccess) {
|
|
||||||
throwError(jenv, "PK11_InitPin");
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECItem request;
|
|
||||||
SECItem reply;
|
|
||||||
|
|
||||||
reply.data = 0;
|
|
||||||
reply.len = 0;
|
|
||||||
|
|
||||||
if (encrypt) {
|
|
||||||
LOG("encrypting %s\n", value);
|
|
||||||
request.data = (unsigned char*)value;
|
|
||||||
request.len = strlen(value);
|
|
||||||
|
|
||||||
SECItem keyid;
|
|
||||||
keyid.data = 0;
|
|
||||||
keyid.len = 0;
|
|
||||||
rv = f_PK11SDR_Encrypt(&keyid, &request, &reply, NULL);
|
|
||||||
|
|
||||||
if (rv != SECSuccess) {
|
|
||||||
throwError(jenv, "PK11SDR_Encrypt");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = encode(reply.data, reply.len, result);
|
|
||||||
if (rv != SECSuccess) {
|
|
||||||
throwError(jenv, "encode");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
LOG("encrypted %s\n", *result);
|
|
||||||
} else {
|
|
||||||
LOG("decoding %s\n", value);
|
|
||||||
rv = decode(value, &request.data, (PRInt32*)&request.len);
|
|
||||||
if (rv != SECSuccess) {
|
|
||||||
throwError(jenv, "decode");
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = f_PK11SDR_Decrypt(&request, &reply, NULL);
|
|
||||||
if (rv != SECSuccess) {
|
|
||||||
throwError(jenv, "PK11SDR_Decrypt");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = (char *)malloc(reply.len);
|
|
||||||
(*result)[reply.len] = '\0';
|
|
||||||
strncpy(*result, (char *)reply.data, reply.len);
|
|
||||||
//asprintf(result, "%s", (char *)reply.data);
|
|
||||||
|
|
||||||
LOG("decoded %i letters %s\n", reply.len, *result);
|
|
||||||
free(request.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
f_SECITEM_ZfreeItem(&reply, false);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Base64 encodes the data passed in. The caller must deallocate _retval using free();
|
|
||||||
*/
|
|
||||||
SECStatus
|
|
||||||
encode(const unsigned char *data, PRInt32 dataLen, char **_retval)
|
|
||||||
{
|
|
||||||
SECStatus rv = SECSuccess;
|
|
||||||
char *encoded = f_PL_Base64Encode((const char *)data, dataLen, NULL);
|
|
||||||
if (!encoded)
|
|
||||||
rv = SECFailure;
|
|
||||||
if (!*encoded)
|
|
||||||
rv = SECFailure;
|
|
||||||
|
|
||||||
if (rv == SECSuccess) {
|
|
||||||
*_retval = (char *)malloc(strlen(encoded));
|
|
||||||
strcpy(*_retval, encoded);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (encoded) {
|
|
||||||
f_PR_Free(encoded);
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Base64 decodes the data passed in. The caller must deallocate result using free();
|
|
||||||
*/
|
|
||||||
SECStatus
|
|
||||||
decode(const char *data, unsigned char **result, PRInt32 *length)
|
|
||||||
{
|
|
||||||
SECStatus rv = SECSuccess;
|
|
||||||
PRUint32 len = strlen(data);
|
|
||||||
int adjust = 0;
|
|
||||||
|
|
||||||
/* Compute length adjustment */
|
|
||||||
if (len > 0 && data[len-1] == '=') {
|
|
||||||
adjust++;
|
|
||||||
if (data[len-2] == '=') adjust++;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *decoded;
|
|
||||||
decoded = f_PL_Base64Decode(data, len, NULL);
|
|
||||||
if (!decoded) {
|
|
||||||
return SECFailure;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG("xxx Decoded: %s\n", decoded);
|
|
||||||
|
|
||||||
if (!*decoded) {
|
|
||||||
return SECFailure;
|
|
||||||
}
|
|
||||||
|
|
||||||
*length = (len*3)/4 - adjust;
|
|
||||||
*result = (unsigned char*)malloc((size_t)len);
|
|
||||||
|
|
||||||
if (!*result) {
|
|
||||||
rv = SECFailure;
|
|
||||||
} else {
|
|
||||||
memcpy((char*)*result, decoded, len);
|
|
||||||
}
|
|
||||||
f_PR_Free(decoded);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
|||||||
#ifndef NSSBridge_h
|
|
||||||
#define NSSBridge_h
|
|
||||||
|
|
||||||
#include "nss.h"
|
|
||||||
#include "seccomon.h"
|
|
||||||
#include "secmodt.h"
|
|
||||||
#include "secutil.h"
|
|
||||||
#include "pk11func.h"
|
|
||||||
#include <jni.h>
|
|
||||||
|
|
||||||
int setup_nss_functions(void *nss_handle, void *nssutil_handle, void *plc_handle);
|
|
||||||
|
|
||||||
#define NSS_WRAPPER(name, return_type, args...) \
|
|
||||||
typedef return_type (*name ## _t)(args); \
|
|
||||||
extern name ## _t f_ ## name;
|
|
||||||
|
|
||||||
NSS_WRAPPER(NSS_Initialize, SECStatus, const char*, const char*, const char*, const char*, PRUint32)
|
|
||||||
NSS_WRAPPER(NSS_Shutdown, void, void)
|
|
||||||
NSS_WRAPPER(PK11SDR_Encrypt, SECStatus, SECItem *, SECItem *, SECItem *, void *)
|
|
||||||
NSS_WRAPPER(PK11SDR_Decrypt, SECStatus, SECItem *, SECItem *, void *)
|
|
||||||
NSS_WRAPPER(SECITEM_ZfreeItem, void, SECItem*, PRBool)
|
|
||||||
NSS_WRAPPER(PR_ErrorToString, char *, PRErrorCode, PRLanguageCode)
|
|
||||||
NSS_WRAPPER(PR_GetError, PRErrorCode, void)
|
|
||||||
NSS_WRAPPER(PR_Free, PRErrorCode, char *)
|
|
||||||
NSS_WRAPPER(PL_Base64Encode, char*, const char*, PRUint32, char*)
|
|
||||||
NSS_WRAPPER(PL_Base64Decode, char*, const char*, PRUint32, char*)
|
|
||||||
NSS_WRAPPER(PL_strfree, void, char*)
|
|
||||||
NSS_WRAPPER(PK11_GetInternalKeySlot, PK11SlotInfo *, void)
|
|
||||||
NSS_WRAPPER(PK11_NeedUserInit, PRBool, PK11SlotInfo *)
|
|
||||||
NSS_WRAPPER(PK11_InitPin, SECStatus, PK11SlotInfo*, const char*, const char*)
|
|
||||||
|
|
||||||
bool setPassword(PK11SlotInfo *slot);
|
|
||||||
SECStatus doCrypto(JNIEnv* jenv, const char *path, const char *value, char** result, bool doEncrypt);
|
|
||||||
SECStatus encode(const unsigned char *data, PRInt32 dataLen, char **_retval);
|
|
||||||
SECStatus decode(const char *data, unsigned char **result, PRInt32 * _retval);
|
|
||||||
#endif /* NSS_h */
|
|
@ -101,6 +101,21 @@ static jmethodID jByteBufferAllocateDirect;
|
|||||||
static jmethodID jCursorConstructor;
|
static jmethodID jCursorConstructor;
|
||||||
static jmethodID jCursorAddRow;
|
static jmethodID jCursorAddRow;
|
||||||
|
|
||||||
|
static void
|
||||||
|
JNI_Throw(JNIEnv* jenv, const char* name, const char* msg)
|
||||||
|
{
|
||||||
|
jclass cls = jenv->FindClass(name);
|
||||||
|
if (cls == NULL) {
|
||||||
|
LOG("Couldn't find exception class (or exception pending)\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int rc = jenv->ThrowNew(cls, msg);
|
||||||
|
if (rc < 0) {
|
||||||
|
LOG("Error throwing exception\n");
|
||||||
|
}
|
||||||
|
jenv->DeleteLocalRef(cls);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
JNI_Setup(JNIEnv* jenv)
|
JNI_Setup(JNIEnv* jenv)
|
||||||
{
|
{
|
||||||
|
@ -43,6 +43,7 @@ static const char *dl_errors[] = {
|
|||||||
#define unlikely(expr) __builtin_expect (expr, 0)
|
#define unlikely(expr) __builtin_expect (expr, 0)
|
||||||
|
|
||||||
static pthread_mutex_t dl_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t dl_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
extern int extractLibs;
|
||||||
|
|
||||||
static void set_dlerror(int err)
|
static void set_dlerror(int err)
|
||||||
{
|
{
|
||||||
@ -53,6 +54,9 @@ static void set_dlerror(int err)
|
|||||||
|
|
||||||
void *__wrap_dlopen(const char *filename, int flag)
|
void *__wrap_dlopen(const char *filename, int flag)
|
||||||
{
|
{
|
||||||
|
if (extractLibs)
|
||||||
|
return dlopen(filename, flag);
|
||||||
|
|
||||||
soinfo *ret;
|
soinfo *ret;
|
||||||
|
|
||||||
pthread_mutex_lock(&dl_lock);
|
pthread_mutex_lock(&dl_lock);
|
||||||
@ -84,6 +88,9 @@ void *moz_mapped_dlopen(const char *filename, int flag,
|
|||||||
|
|
||||||
const char *__wrap_dlerror(void)
|
const char *__wrap_dlerror(void)
|
||||||
{
|
{
|
||||||
|
if (extractLibs)
|
||||||
|
return dlerror();
|
||||||
|
|
||||||
const char *tmp = dl_err_str;
|
const char *tmp = dl_err_str;
|
||||||
dl_err_str = NULL;
|
dl_err_str = NULL;
|
||||||
return (const char *)tmp;
|
return (const char *)tmp;
|
||||||
@ -91,6 +98,9 @@ const char *__wrap_dlerror(void)
|
|||||||
|
|
||||||
void *__wrap_dlsym(void *handle, const char *symbol)
|
void *__wrap_dlsym(void *handle, const char *symbol)
|
||||||
{
|
{
|
||||||
|
if (extractLibs)
|
||||||
|
return dlsym(handle, symbol);
|
||||||
|
|
||||||
soinfo *found;
|
soinfo *found;
|
||||||
Elf32_Sym *sym;
|
Elf32_Sym *sym;
|
||||||
unsigned bind;
|
unsigned bind;
|
||||||
@ -173,6 +183,9 @@ int __wrap_dladdr(void *addr, Dl_info *info)
|
|||||||
|
|
||||||
int __wrap_dlclose(void *handle)
|
int __wrap_dlclose(void *handle)
|
||||||
{
|
{
|
||||||
|
if (extractLibs)
|
||||||
|
return dlclose(handle);
|
||||||
|
|
||||||
pthread_mutex_lock(&dl_lock);
|
pthread_mutex_lock(&dl_lock);
|
||||||
(void)unload_library((soinfo*)handle);
|
(void)unload_library((soinfo*)handle);
|
||||||
pthread_mutex_unlock(&dl_lock);
|
pthread_mutex_unlock(&dl_lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user