diff options
| author | dcashman <dcashman@google.com> | 2014-07-14 20:02:28 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-14 18:38:08 +0000 |
| commit | 9f92ffa9278db42655b4d422d887eed0a199886b (patch) | |
| tree | 011908c3d242248ffc89eb278d4a559d8e8d2103 /core/java | |
| parent | 1e6fede85e459d918f6670c9dad130c4e32f744f (diff) | |
| parent | 9d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1 (diff) | |
Merge "Initial KeySet API." into lmp-dev
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 59 | ||||
| -rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 5 | ||||
| -rw-r--r-- | core/java/android/content/pm/KeySet.java | 27 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 27 |
4 files changed, 113 insertions, 5 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 2935b8e64d98..47305599ba13 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -33,6 +33,7 @@ import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; import android.content.pm.IPackageStatsObserver; import android.content.pm.InstrumentationInfo; +import android.content.pm.KeySet; import android.content.pm.ManifestDigest; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; @@ -52,6 +53,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; @@ -59,6 +61,7 @@ import android.os.UserManager; import android.util.ArrayMap; import android.util.Log; import android.view.Display; +import com.android.internal.util.Preconditions; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -1447,6 +1450,62 @@ final class ApplicationPackageManager extends PackageManager { return false; } + @Override + public KeySet getKeySetByAlias(String packageName, String alias) { + Preconditions.checkNotNull(packageName); + Preconditions.checkNotNull(alias); + IBinder keySetToken; + try { + keySetToken = mPM.getKeySetByAlias(packageName, alias); + } catch (RemoteException e) { + return null; + } + if (keySetToken == null) { + return null; + } + return new KeySet(keySetToken); + } + + @Override + public KeySet getSigningKeySet(String packageName) { + Preconditions.checkNotNull(packageName); + IBinder keySetToken; + try { + keySetToken = mPM.getSigningKeySet(packageName); + } catch (RemoteException e) { + return null; + } + if (keySetToken == null) { + return null; + } + return new KeySet(keySetToken); + } + + + @Override + public boolean isSignedBy(String packageName, KeySet ks) { + Preconditions.checkNotNull(packageName); + Preconditions.checkNotNull(ks); + IBinder keySetToken = ks.getToken(); + try { + return mPM.isPackageSignedByKeySet(packageName, keySetToken); + } catch (RemoteException e) { + return false; + } + } + + @Override + public boolean isSignedByExactly(String packageName, KeySet ks) { + Preconditions.checkNotNull(packageName); + Preconditions.checkNotNull(ks); + IBinder keySetToken = ks.getToken(); + try { + return mPM.isPackageSignedByKeySetExactly(packageName, keySetToken); + } catch (RemoteException e) { + return false; + } + } + /** * @hide */ diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 58d3526c0b29..3a98f5d53e3c 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -429,4 +429,9 @@ interface IPackageManager { boolean setBlockUninstallForUser(String packageName, boolean blockUninstall, int userId); boolean getBlockUninstallForUser(String packageName, int userId); + + IBinder getKeySetByAlias(String packageName, String alias); + IBinder getSigningKeySet(String packageName); + boolean isPackageSignedByKeySet(String packageName, IBinder ks); + boolean isPackageSignedByKeySetExactly(String packageName, IBinder ks); } diff --git a/core/java/android/content/pm/KeySet.java b/core/java/android/content/pm/KeySet.java index 0ef09a432528..fcdaa1867391 100644 --- a/core/java/android/content/pm/KeySet.java +++ b/core/java/android/content/pm/KeySet.java @@ -16,19 +16,36 @@ package android.content.pm; -import android.os.Binder; +import android.os.IBinder; -/** @hide */ +/** + * Represents a {@code KeySet} that has been declared in the AndroidManifest.xml + * file for the application. A {@code KeySet} can be used explicitly to + * represent a trust relationship with other applications on the device. + */ public class KeySet { - private Binder token; + private IBinder token; /** @hide */ - public KeySet(Binder token) { + public KeySet(IBinder token) { + if (token == null) { + throw new NullPointerException("null value for KeySet IBinder token"); + } this.token = token; } - Binder getToken() { + /** @hide */ + public IBinder getToken() { return token; } + + @Override + public boolean equals(Object o) { + if (o instanceof KeySet) { + KeySet ks = (KeySet) o; + return token == ks.token; + } + return false; + } }
\ No newline at end of file diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 03d47019e3ed..91ebbbfe6193 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3602,6 +3602,33 @@ public abstract class PackageManager { public abstract boolean isSafeMode(); /** + * Return the {@link KeySet} associated with the String alias for this + * application. + * + * @param alias The alias for a given {@link KeySet} as defined in the + * application's AndroidManifest.xml. + */ + public abstract KeySet getKeySetByAlias(String packageName, String alias); + + /** Return the signing {@link KeySet} for this application. */ + public abstract KeySet getSigningKeySet(String packageName); + + /** + * Return whether the package denoted by packageName has been signed by all + * of the keys specified by the {@link KeySet} ks. This will return true if + * the package has been signed by additional keys (a superset) as well. + * Compare to {@link #isSignedByExactly(String packageName, KeySet ks)}. + */ + public abstract boolean isSignedBy(String packageName, KeySet ks); + + /** + * Return whether the package denoted by packageName has been signed by all + * of, and only, the keys specified by the {@link KeySet} ks. Compare to + * {@link #isSignedBy(String packageName, KeySet ks)}. + */ + public abstract boolean isSignedByExactly(String packageName, KeySet ks); + + /** * Attempts to move package resources from internal to external media or vice versa. * Since this may take a little while, the result will * be posted back to the given observer. This call may fail if the calling context |
