diff options
Diffstat (limited to 'apex/blobstore')
3 files changed, 34 insertions, 1 deletions
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java index 49b3ec1d113b..cea7fcca6e20 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java @@ -212,7 +212,10 @@ class BlobMetadata { } boolean isAccessAllowedForCaller(@NonNull String callingPackage, int callingUid) { - // TODO: verify blob is still valid (expiryTime is not elapsed) + // Don't allow the blob to be accessed after it's expiry time has passed. + if (getBlobHandle().isExpired()) { + return false; + } synchronized (mMetadataLock) { // Check if packageName already holds a lease on the blob. for (int i = 0, size = mLeasees.size(); i < size; ++i) { diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java index 7a27b2c795fb..a2bce31fc7b2 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java @@ -1059,6 +1059,18 @@ public class BlobStoreManagerService extends SystemService { } } + boolean isBlobAvailable(long blobId, int userId) { + synchronized (mBlobsLock) { + final ArrayMap<BlobHandle, BlobMetadata> userBlobs = getUserBlobsLocked(userId); + for (BlobMetadata blobMetadata : userBlobs.values()) { + if (blobMetadata.getBlobId() == blobId) { + return true; + } + } + return false; + } + } + @GuardedBy("mBlobsLock") private void dumpSessionsLocked(IndentingPrintWriter fout, DumpArgs dumpArgs) { for (int i = 0, userCount = mSessions.size(); i < userCount; ++i) { diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java index 72af323e9d5f..a4a2e80c195a 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java @@ -46,6 +46,8 @@ class BlobStoreManagerShellCommand extends ShellCommand { return runDeleteBlob(pw); case "idle-maintenance": return runIdleMaintenance(pw); + case "query-blob-existence": + return runQueryBlobExistence(pw); default: return handleDefaultCommands(cmd); } @@ -91,6 +93,16 @@ class BlobStoreManagerShellCommand extends ShellCommand { return 0; } + private int runQueryBlobExistence(PrintWriter pw) { + final ParsedArgs args = new ParsedArgs(); + if (parseOptions(pw, args) < 0) { + return -1; + } + + pw.println(mService.isBlobAvailable(args.blobId, args.userId) ? 1 : 0); + return 0; + } + @Override public void onHelp() { final PrintWriter pw = getOutPrintWriter(); @@ -121,6 +133,8 @@ class BlobStoreManagerShellCommand extends ShellCommand { pw.println(" --tag: Tag of the blob to delete."); pw.println("idle-maintenance"); pw.println(" Run idle maintenance which takes care of removing stale data."); + pw.println("query-blob-existence [-b BLOB_ID]"); + pw.println(" Prints 1 if blob exists, otherwise 0."); pw.println(); } @@ -147,6 +161,9 @@ class BlobStoreManagerShellCommand extends ShellCommand { case "--tag": args.tag = getNextArgRequired(); break; + case "-b": + args.blobId = Long.parseLong(getNextArgRequired()); + break; default: pw.println("Error: unknown option '" + opt + "'"); return -1; @@ -166,6 +183,7 @@ class BlobStoreManagerShellCommand extends ShellCommand { public long expiryTimeMillis; public CharSequence label; public String tag; + public long blobId; public BlobHandle getBlobHandle() { return BlobHandle.create(algorithm, digest, label, expiryTimeMillis, tag); |