Merge "Add (hidden) fixupAppDir() API." into rvc-dev

This commit is contained in:
Martijn Coenen
2020-03-25 12:56:47 +00:00
committed by Android (Google) Code Review
3 changed files with 51 additions and 0 deletions

View File

@@ -194,4 +194,5 @@ interface IStorageManager {
boolean needsCheckpoint() = 86;
void abortChanges(in String message, boolean retry) = 87;
void clearUserKeyAuth(int userId, int serialNumber, in byte[] token, in byte[] secret) = 88;
void fixupAppDir(in String path) = 89;
}

View File

@@ -2470,6 +2470,36 @@ public class StorageManager {
}
}
/**
* Asks StorageManager to fixup the permissions of an application-private directory.
*
* On devices without sdcardfs, filesystem permissions aren't magically fixed up. This
* is problematic mostly in application-private directories, which are owned by the
* application itself; if another process with elevated permissions creates a file
* in these directories, the UID will be wrong, and the owning package won't be able
* to access the files.
*
* This API can be used to recursively fix up the permissions on the passed in path.
* The default platform user of this API is the DownloadProvider, which can download
* things in application-private directories on their behalf.
*
* This API doesn't require any special permissions, because it merely changes the
* permissions of a directory to what they should anyway be.
*
* @param path the path for which we should fix up the permissions
*
* @hide
*/
public void fixupAppDir(@NonNull File path) {
try {
mStorageManager.fixupAppDir(path.getCanonicalPath());
} catch (IOException e) {
Log.e(TAG, "Failed to get canonical path for " + path.getPath(), e);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/** {@hide} */
private static void setCacheBehavior(File path, String name, boolean enabled)
throws IOException {

View File

@@ -155,6 +155,7 @@ import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.pm.Installer;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.storage.AppFuseBridge;
import com.android.server.storage.StorageSessionController;
import com.android.server.storage.StorageSessionController.ExternalStorageServiceException;
@@ -3268,6 +3269,25 @@ class StorageManagerService extends IStorageManager.Stub
}
}
@Override
public void fixupAppDir(String path) {
final Matcher matcher = KNOWN_APP_DIR_PATHS.matcher(path);
if (matcher.matches()) {
AndroidPackage pkg = mPmInternal.getPackage(matcher.group(3));
if (pkg != null) {
try {
mVold.fixupAppDir(path + "/", pkg.getUid());
} catch (RemoteException | ServiceSpecificException e) {
Log.e(TAG, "Failed to fixup app dir for " + pkg.getPackageName(), e);
}
} else {
Log.e(TAG, "Can't find package belonging to " + path);
}
} else {
Log.e(TAG, "Path " + path + " is not a valid application-specific directory");
}
}
/** Not thread safe */
class AppFuseMountScope extends AppFuseBridge.MountScope {
private boolean mMounted = false;