Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5f451f3 authored by Android (Google) Code Review's avatar Android (Google) Code Review Committed by The Android Open Source Project
Browse files

am 3bb69233: Merge change 6620 into donut

Merge commit '3bb69233'

* commit '3bb69233':
  Keep Gears permissions in sync with system location settings.
parents 97b3ed69 3bb69233
Loading
Loading
Loading
Loading
+170 −0
Original line number Original line Diff line number Diff line
@@ -16,15 +16,27 @@


package android.webkit;
package android.webkit;


import android.content.ContentValues;
import android.content.Context;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Build;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.preference.PreferenceManager;
import android.provider.Checkin;
import android.provider.Checkin;
import android.provider.Settings;
import android.util.Log;


import java.io.File;
import java.lang.SecurityException;
import java.lang.SecurityException;

import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteStatement;


import java.util.HashSet;
import java.util.Locale;
import java.util.Locale;


/**
/**
@@ -185,6 +197,43 @@ public class WebSettings {
    private boolean         mAppCacheEnabled = false;
    private boolean         mAppCacheEnabled = false;
    private boolean         mDomStorageEnabled = false;
    private boolean         mDomStorageEnabled = false;


    // Donut-specific hack to keep Gears permissions in sync with the
    // system location setting.
    // TODO: Make sure this hack is removed in  Eclair, when Gears
    // is also removed.
    // Used to remember if we checked the Gears permissions already.
    static boolean mCheckedGearsPermissions = false;
    // The Gears permissions database directory.
    private final static String GEARS_DATABASE_DIR = "gears";
    // The Gears permissions database file name.
    private final static String GEARS_DATABASE_FILE = "permissions.db";
    // The Gears location permissions table.
    private final static String GEARS_LOCATION_ACCESS_TABLE_NAME = 
        "LocationAccess";
    // The Gears storage access permissions table.
    private final static String GEARS_STORAGE_ACCESS_TABLE_NAME = "Access";
    // The Gears permissions db schema version table.
    private final static String GEARS_SCHEMA_VERSION_TABLE_NAME =
        "VersionInfo";
    // The shared pref name.
    private static final String LAST_KNOWN_LOCATION_SETTING =
        "lastKnownLocationSystemSetting";
    // The Browser package name.
    private static final String BROWSER_PACKAGE_NAME = "com.android.browser";
    // The Google URLs whitelisted for Gears location access.
    private static HashSet<String> sGearsWhiteList;

    static {
        sGearsWhiteList = new HashSet<String>();
        // NOTE: DO NOT ADD A "/" AT THE END!
        sGearsWhiteList.add("http://www.google.com");
        sGearsWhiteList.add("http://www.google.co.uk");
    }

    private static final String LOGTAG = "webcore";
    static final boolean DEBUG = false;
    static final boolean LOGV_ENABLED = DEBUG;

    // Class to handle messages before WebCore is ready.
    // Class to handle messages before WebCore is ready.
    private class EventHandler {
    private class EventHandler {
        // Message id for syncing
        // Message id for syncing
@@ -205,6 +254,7 @@ public class WebSettings {
                    switch (msg.what) {
                    switch (msg.what) {
                        case SYNC:
                        case SYNC:
                            synchronized (WebSettings.this) {
                            synchronized (WebSettings.this) {
                                checkGearsPermissions();
                                if (mBrowserFrame.mNativeFrame != 0) {
                                if (mBrowserFrame.mNativeFrame != 0) {
                                    nativeSync(mBrowserFrame.mNativeFrame);
                                    nativeSync(mBrowserFrame.mNativeFrame);
                                }
                                }
@@ -1277,6 +1327,126 @@ public class WebSettings {
        return size;
        return size;
    }
    }


    private void checkGearsPermissions() {
        // Did we already check the permissions?
        if (mCheckedGearsPermissions) {
            return;
        }
        // Are we running in the browser?
        if (!BROWSER_PACKAGE_NAME.equals(mContext.getPackageName())) {
            return;
        }
        // Is the pluginsPath sane?
        if (mPluginsPath == null || mPluginsPath.length() == 0) {
            // We don't yet have a meaningful plugin path, so
            // we can't do anything about the Gears permissions.
            return;
        }
        // Remember we checked the Gears permissions.
        mCheckedGearsPermissions = true;
        // Get the current system settings.
        int setting = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Secure.USE_LOCATION_FOR_SERVICES, -1);
        // Check if we need to set the Gears permissions.
        if (setting != -1 && locationSystemSettingChanged(setting)) {
            setGearsPermissionForGoogleDomains(setting);
        }
    }

    private boolean locationSystemSettingChanged(int newSetting) {
        SharedPreferences prefs =
            PreferenceManager.getDefaultSharedPreferences(mContext);
        int oldSetting = 0;
        oldSetting = prefs.getInt(LAST_KNOWN_LOCATION_SETTING, oldSetting);
        if (oldSetting == newSetting) {
            return false;
        }
        Editor ed = prefs.edit();
        ed.putInt(LAST_KNOWN_LOCATION_SETTING, newSetting);
        ed.commit();
        return true;
    }

    private void setGearsPermissionForGoogleDomains(int systemPermission) {
        // Transform the system permission into a Gears permission
        int gearsPermission = (systemPermission == 1 ? 1 : 2);
        // Build the path to the Gears library.

        File file = new File(mPluginsPath).getParentFile();
        if (file == null) {
            return;
        }
        // Build the Gears database file name.
        file = new File(file.getAbsolutePath() + File.separator 
                + GEARS_DATABASE_DIR + File.separator + GEARS_DATABASE_FILE);
        // Remember whether or not we need to create the LocationAccess table.
        boolean needToCreateTables = !file.exists();
        // Try opening the Gears database.
        SQLiteDatabase permissions;
        try {
            permissions = SQLiteDatabase.openOrCreateDatabase(file, null);
        } catch (SQLiteException e) {
            if (LOGV_ENABLED) {
                Log.v(LOGTAG, "Could not open Gears permission DB: " +
                        e.getMessage());
            }
            // Just bail out.
            return;
        }
        // We now have a database open. Begin a transaction.
        permissions.beginTransaction();
        try {
            if (needToCreateTables) {
                // Create the tables. Note that this creates the
                // Gears tables for the permissions DB schema version 2.
                // The Gears schema upgrade process will take care of the rest.
                // First, the storage access table.
                SQLiteStatement statement = permissions.compileStatement(
                        "CREATE TABLE IF NOT EXISTS " +
                        GEARS_STORAGE_ACCESS_TABLE_NAME +
                        " (Name TEXT UNIQUE, Value)");
                statement.execute();
                // Next the location access table.
                statement = permissions.compileStatement(
                        "CREATE TABLE IF NOT EXISTS " +
                        GEARS_LOCATION_ACCESS_TABLE_NAME +
                        " (Name TEXT UNIQUE, Value)");
                statement.execute();
                // Finally, the schema version table.
                statement = permissions.compileStatement(
                        "CREATE TABLE IF NOT EXISTS " +
                        GEARS_SCHEMA_VERSION_TABLE_NAME +
                        " (Name TEXT UNIQUE, Value)");
                statement.execute();
                // Set the schema version to 2.
                ContentValues schema = new ContentValues();
                schema.put("Name", "Version");
                schema.put("Value", 2);
                permissions.insert(GEARS_SCHEMA_VERSION_TABLE_NAME, null,
                        schema);
            }

            ContentValues permissionValues = new ContentValues();

            for (String url : sGearsWhiteList) {
                permissionValues.put("Name", url);
                permissionValues.put("Value", gearsPermission);
                permissions.replace(GEARS_LOCATION_ACCESS_TABLE_NAME, null,
                        permissionValues);
                permissionValues.clear();
            }
            // Commit the transaction.
            permissions.setTransactionSuccessful();
        } catch (SQLiteException e) {
            if (LOGV_ENABLED) {
                Log.v(LOGTAG, "Could not set the Gears permissions: " +
                        e.getMessage());
            }
        } finally {
            permissions.endTransaction();
            permissions.close();
        }
    }
    /* Post a SYNC message to handle syncing the native settings. */
    /* Post a SYNC message to handle syncing the native settings. */
    private synchronized void postSync() {
    private synchronized void postSync() {
        // Only post if a sync is not pending
        // Only post if a sync is not pending