OSDN Git Service

Revert "App home directories are now 0700 for targetSdkVersion > 17"
authorNick Kralevich <nnk@google.com>
Wed, 9 Jan 2013 23:54:56 +0000 (15:54 -0800)
committerThe Android Automerger <android-build@android.com>
Thu, 10 Jan 2013 00:50:01 +0000 (16:50 -0800)
This reverts commit 92091fa9636403728fe94cc83400495a8612c2d3.

Bug: 7966399
Bug: 7208882

api/current.txt
core/java/android/content/Context.java
core/java/android/os/Build.java
services/java/com/android/server/pm/Installer.java
services/java/com/android/server/pm/PackageManagerService.java
services/java/com/android/server/pm/Settings.java

index e4d5fd1..cf24f13 100644 (file)
@@ -15737,7 +15737,6 @@ package android.os {
     field public static final int ICE_CREAM_SANDWICH_MR1 = 15; // 0xf
     field public static final int JELLY_BEAN = 16; // 0x10
     field public static final int JELLY_BEAN_MR1 = 17; // 0x11
-    field public static final int K = 10000; // 0x2710
   }
 
   public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
index 257f84e..7aa2507 100644 (file)
@@ -64,44 +64,30 @@ public abstract class Context {
      */
     public static final int MODE_PRIVATE = 0x0000;
     /**
+     * @deprecated Creating world-readable files is very dangerous, and likely
+     * to cause security holes in applications.  It is strongly discouraged;
+     * instead, applications should use more formal mechanism for interactions
+     * such as {@link ContentProvider}, {@link BroadcastReceiver}, and
+     * {@link android.app.Service}.  There are no guarantees that this
+     * access mode will remain on a file, such as when it goes through a
+     * backup and restore.
      * File creation mode: allow all other applications to have read access
      * to the created file.
-     *
-     * <b>Note:</b> Applications with {@code targetSdkVersion}
-     * {@link android.os.Build.VERSION_CODES#K} or greater have home directories
-     * with {@code 0700} permissions. Because an application's home directory
-     * is no longer world-accessible, world-readable files created within the
-     * application's home directory will not be accessible to other applications.
-     *
-     * @deprecated Creating world-readable files is very dangerous, and likely
-     *     to cause security holes in applications.  It is strongly discouraged;
-     *     instead, applications should use more formal mechanism for interactions
-     *     such as {@link ContentProvider}, {@link BroadcastReceiver}, and
-     *     {@link android.app.Service}.  There are no guarantees that this
-     *     access mode will remain on a file, such as when it goes through a
-     *     backup and restore.
      * @see #MODE_PRIVATE
      * @see #MODE_WORLD_WRITEABLE
      */
     @Deprecated
     public static final int MODE_WORLD_READABLE = 0x0001;
     /**
+     * @deprecated Creating world-writable files is very dangerous, and likely
+     * to cause security holes in applications.  It is strongly discouraged;
+     * instead, applications should use more formal mechanism for interactions
+     * such as {@link ContentProvider}, {@link BroadcastReceiver}, and
+     * {@link android.app.Service}.  There are no guarantees that this
+     * access mode will remain on a file, such as when it goes through a
+     * backup and restore.
      * File creation mode: allow all other applications to have write access
      * to the created file.
-     *
-     * <b>Note:</b> Applications with {@code targetSdkVersion}
-     * {@link android.os.Build.VERSION_CODES#K} or greater have home directories
-     * with {@code 0700} permissions. Because an application's home directory
-     * is no longer world-accessible, world-writable files created within the
-     * application's home directory will not be accessible to other applications.
-     *
-     * @deprecated Creating world-writable files is very dangerous, and likely
-     *     to cause security holes in applications.  It is strongly discouraged;
-     *     instead, applications should use more formal mechanism for interactions
-     *     such as {@link ContentProvider}, {@link BroadcastReceiver}, and
-     *     {@link android.app.Service}.  There are no guarantees that this
-     *     access mode will remain on a file, such as when it goes through a
-     *     backup and restore.
      * @see #MODE_PRIVATE
      * @see #MODE_WORLD_READABLE
      */
@@ -515,22 +501,18 @@ public abstract class Context {
         throws FileNotFoundException;
 
     /**
-     * Open a file associated with this Context's application package
+     * Open a private file associated with this Context's application package
      * for writing.  Creates the file if it doesn't already exist.
      *
-     * <b>Note:</b> Applications with {@code targetSdkVersion}
-     * {@link android.os.Build.VERSION_CODES#K} or greater have home directories
-     * with {@code 0700} permissions. Because an application's home directory
-     * is no longer world-accessible, files created with {@code mode}
-     * {@link #MODE_WORLD_READABLE} or {@link #MODE_WORLD_WRITEABLE} will not be
-     * accessible to other applications.
-     *
-     * @param name The name of the file to open; can not contain path separators.
+     * @param name The name of the file to open; can not contain path
+     *             separators.
      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
-     *     default operation, {@link #MODE_APPEND} to append to an existing file,
-     *     {@link #MODE_WORLD_READABLE} and {@link #MODE_WORLD_WRITEABLE} to control
-     *     permissions.
+     * default operation, {@link #MODE_APPEND} to append to an existing file,
+     * {@link #MODE_WORLD_READABLE} and {@link #MODE_WORLD_WRITEABLE} to control
+     * permissions.
+     *
      * @return FileOutputStream Resulting output stream.
+     *
      * @see #MODE_APPEND
      * @see #MODE_PRIVATE
      * @see #MODE_WORLD_READABLE
@@ -756,19 +738,14 @@ public abstract class Context {
      * application; you can only set the mode of the entire directory, not
      * of individual files.
      *
-     * <b>Note:</b> Applications with {@code targetSdkVersion}
-     * {@link android.os.Build.VERSION_CODES#K} or greater have home directories
-     * with {@code 0700} permissions. Because an application's home directory
-     * is no longer world-accessible, world-readable / world-writable directories
-     * created using this method will not be accessible to other applications.
-     *
      * @param name Name of the directory to retrieve.  This is a directory
-     *     that is created as part of your application data.
+     * that is created as part of your application data.
      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
-     *     default operation, {@link #MODE_WORLD_READABLE} and
-     *     {@link #MODE_WORLD_WRITEABLE} to control permissions.
+     * default operation, {@link #MODE_WORLD_READABLE} and
+     * {@link #MODE_WORLD_WRITEABLE} to control permissions.
+     *
      * @return Returns a File object for the requested directory.  The directory
-     *     will have been created if it does not already exist.
+     * will have been created if it does not already exist.
      *
      * @see #openFileOutput(String, int)
      */
@@ -778,13 +755,6 @@ public abstract class Context {
      * Open a new private SQLiteDatabase associated with this Context's
      * application package.  Create the database file if it doesn't exist.
      *
-     * <b>Note:</b> Applications with {@code targetSdkVersion}
-     * {@link android.os.Build.VERSION_CODES#K} or greater have home directories
-     * with {@code 0700} permissions. Because an application's home directory
-     * is no longer world-accessible, {@code SQLiteDatabase}s created with {@code mode}
-     * {@link #MODE_WORLD_READABLE} or {@link #MODE_WORLD_WRITEABLE} will not be
-     * accessible to other applications.
-     *
      * @param name The name (unique in the application package) of the database.
      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
      *     default operation, {@link #MODE_WORLD_READABLE}
@@ -792,8 +762,10 @@ public abstract class Context {
      *     Use {@link #MODE_ENABLE_WRITE_AHEAD_LOGGING} to enable write-ahead logging by default.
      * @param factory An optional factory class that is called to instantiate a
      *     cursor when query is called.
+     *
      * @return The contents of a newly created database with the given name.
      * @throws android.database.sqlite.SQLiteException if the database file could not be opened.
+     *
      * @see #MODE_PRIVATE
      * @see #MODE_WORLD_READABLE
      * @see #MODE_WORLD_WRITEABLE
@@ -810,13 +782,6 @@ public abstract class Context {
      * <p>Accepts input param: a concrete instance of {@link DatabaseErrorHandler} to be
      * used to handle corruption when sqlite reports database corruption.</p>
      *
-     * <b>Note:</b> Applications with {@code targetSdkVersion}
-     * {@link android.os.Build.VERSION_CODES#K} or greater have home directories
-     * with {@code 0700} permissions. Because an application's home directory
-     * is no longer world-accessible, {@code SQLiteDatabase}s created with {@code mode}
-     * {@link #MODE_WORLD_READABLE} or {@link #MODE_WORLD_WRITEABLE} will not be
-     * accessible to other applications.
-     *
      * @param name The name (unique in the application package) of the database.
      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
      *     default operation, {@link #MODE_WORLD_READABLE}
@@ -825,9 +790,10 @@ public abstract class Context {
      * @param factory An optional factory class that is called to instantiate a
      *     cursor when query is called.
      * @param errorHandler the {@link DatabaseErrorHandler} to be used when sqlite reports database
-     *     corruption. if null, {@link android.database.DefaultDatabaseErrorHandler} is assumed.
+     * corruption. if null, {@link android.database.DefaultDatabaseErrorHandler} is assumed.
      * @return The contents of a newly created database with the given name.
      * @throws android.database.sqlite.SQLiteException if the database file could not be opened.
+     *
      * @see #MODE_PRIVATE
      * @see #MODE_WORLD_READABLE
      * @see #MODE_WORLD_WRITEABLE
index d69d2a6..a7f39d5 100644 (file)
@@ -431,17 +431,6 @@ public class Build {
          * </ul>
          */
         public static final int JELLY_BEAN_MR1 = 17;
-
-        /**
-         * Android X.X: "K".  Just "K"
-         *
-         * <p>Applications targeting this or a later release will get these
-         * new changes in behavior:</p>
-         * <ul>
-         * <li>Application home directory permissions are now {@code 0700}.</li>
-         * </ul>
-         */
-        public static final int K = CUR_DEVELOPMENT;
     }
     
     /** The type of build, like "user" or "eng". */
index e96820f..02a2c1b 100644 (file)
@@ -188,12 +188,7 @@ public final class Installer {
         }
     }
 
-    /**
-     * @param restrictHomeDir if {@code true}, installd will create the application's
-     *     home directory with {@code 0700} permissions.  If false, {@code 0751} will
-     *     be used instead.
-     */
-    public int install(String name, int uid, int gid, boolean restrictHomeDir) {
+    public int install(String name, int uid, int gid) {
         StringBuilder builder = new StringBuilder("install");
         builder.append(' ');
         builder.append(name);
@@ -201,8 +196,6 @@ public final class Installer {
         builder.append(uid);
         builder.append(' ');
         builder.append(gid);
-        builder.append(' ');
-        builder.append(restrictHomeDir);
         return execute(builder.toString());
     }
 
@@ -270,12 +263,7 @@ public final class Installer {
         return execute(builder.toString());
     }
 
-    /**
-     * @param restrictHomeDir if {@code true}, installd will create the application's
-     *     home directory with {@code 0700} permissions.  If false, {@code 0751} will
-     *     be used instead.
-     */
-    public int createUserData(String name, int uid, int userId, boolean restrictHomeDir) {
+    public int createUserData(String name, int uid, int userId) {
         StringBuilder builder = new StringBuilder("mkuserdata");
         builder.append(' ');
         builder.append(name);
@@ -283,8 +271,6 @@ public final class Installer {
         builder.append(uid);
         builder.append(' ');
         builder.append(userId);
-        builder.append(' ');
-        builder.append(restrictHomeDir);
         return execute(builder.toString());
     }
 
index aa2b461..2238f17 100644 (file)
@@ -24,6 +24,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
 import static com.android.internal.util.ArrayUtils.appendInt;
 import static com.android.internal.util.ArrayUtils.removeInt;
+import static libcore.io.OsConstants.S_ISLNK;
 import static libcore.io.OsConstants.S_IRWXU;
 import static libcore.io.OsConstants.S_IRGRP;
 import static libcore.io.OsConstants.S_IXGRP;
@@ -110,6 +111,7 @@ import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.Environment.UserEnvironment;
+import android.provider.Settings.Secure;
 import android.security.SystemKeyStore;
 import android.util.DisplayMetrics;
 import android.util.EventLog;
@@ -146,11 +148,13 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import libcore.io.ErrnoException;
 import libcore.io.IoUtils;
 import libcore.io.Libcore;
+import libcore.io.OsConstants;
 import libcore.io.StructStat;
 
 /**
@@ -3578,17 +3582,16 @@ public class PackageManagerService extends IPackageManager.Stub {
         }
     }
 
-    private int createDataDirsLI(String packageName, int uid, int targetSdkVersion) {
+    private int createDataDirsLI(String packageName, int uid) {
         int[] users = sUserManager.getUserIds();
-        boolean restrictHomeDir = (targetSdkVersion >= Build.VERSION_CODES.K);
-        int res = mInstaller.install(packageName, uid, uid, restrictHomeDir);
+        int res = mInstaller.install(packageName, uid, uid);
         if (res < 0) {
             return res;
         }
         for (int user : users) {
             if (user != 0) {
                 res = mInstaller.createUserData(packageName,
-                        UserHandle.getUid(user, uid), user, restrictHomeDir);
+                        UserHandle.getUid(user, uid), user);
                 if (res < 0) {
                     return res;
                 }
@@ -3982,8 +3985,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                             recovered = true;
 
                             // And now re-install the app.
-                            ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid,
-                                    pkg.applicationInfo.targetSdkVersion);
+                            ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid);
                             if (ret == -1) {
                                 // Ack should not happen!
                                 msg = prefix + pkg.packageName
@@ -4028,9 +4030,8 @@ public class PackageManagerService extends IPackageManager.Stub {
                     if ((parseFlags & PackageParser.PARSE_CHATTY) != 0)
                         Log.v(TAG, "Want this data dir: " + dataPath);
                 }
-                // invoke installer to do the actual installation
-                int ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid,
-                        pkg.applicationInfo.targetSdkVersion);
+                //invoke installer to do the actual installation
+                int ret = createDataDirsLI(pkgName, pkg.applicationInfo.uid);
                 if (ret < 0) {
                     // Error from installer
                     mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
index f791a6e..06f11bc 100644 (file)
@@ -25,6 +25,7 @@ import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.JournaledFile;
 import com.android.internal.util.XmlUtils;
+import com.android.server.IntentResolver;
 import com.android.server.pm.PackageManagerService.DumpState;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -45,7 +46,6 @@ import android.content.pm.UserInfo;
 import android.content.pm.PackageUserState;
 import android.content.pm.VerifierDeviceIdentity;
 import android.os.Binder;
-import android.os.Build;
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.Process;
@@ -2335,11 +2335,9 @@ final class Settings {
         for (PackageSetting ps : mPackages.values()) {
             // Only system apps are initially installed.
             ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
-            boolean restrictHomeDir = (ps.pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.K);
             // Need to create a data directory for all apps under this user.
             installer.createUserData(ps.name,
-                    UserHandle.getUid(userHandle, ps.appId), userHandle,
-                    restrictHomeDir);
+                    UserHandle.getUid(userHandle, ps.appId), userHandle);
         }
         readDefaultPreferredAppsLPw(userHandle);
         writePackageRestrictionsLPr(userHandle);