diff options
Diffstat (limited to 'src/com/android/se/Terminal.java')
-rwxr-xr-x | src/com/android/se/Terminal.java | 68 |
1 files changed, 57 insertions, 11 deletions
diff --git a/src/com/android/se/Terminal.java b/src/com/android/se/Terminal.java index ba8b69e..92dcec3 100755 --- a/src/com/android/se/Terminal.java +++ b/src/com/android/se/Terminal.java @@ -43,7 +43,9 @@ package com.android.se; import android.content.Context; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.secure_element.V1_0.ISecureElement; import android.hardware.secure_element.V1_0.ISecureElementHalCallback; import android.hardware.secure_element.V1_0.LogicalChannelResponse; @@ -457,17 +459,19 @@ public class Terminal { throw new IOException("Secure Element is not connected"); } - Log.w(mTag, "Enable access control on basic channel for " + packageName); - StatsLog.write( - StatsLog.SE_OMAPI_REPORTED, - StatsLog.SE_OMAPI_REPORTED__OPERATION__OPEN_CHANNEL, - mName, - packageName); - ChannelAccess channelAccess; - try { - channelAccess = setUpChannelAccess(aid, packageName, pid); - } catch (MissingResourceException e) { - return null; + ChannelAccess channelAccess = null; + if (packageName != null) { + Log.w(mTag, "Enable access control on basic channel for " + packageName); + StatsLog.write( + StatsLog.SE_OMAPI_REPORTED, + StatsLog.SE_OMAPI_REPORTED__OPERATION__OPEN_CHANNEL, + mName, + packageName); + try { + channelAccess = setUpChannelAccess(aid, packageName, pid); + } catch (MissingResourceException e) { + return null; + } } synchronized (mLock) { @@ -771,6 +775,9 @@ public class Terminal { if (isPrivilegedApplication(packageName)) { return ChannelAccess.getPrivilegeAccess(packageName, pid); + } else if (getName().startsWith(SecureElementService.UICC_TERMINAL) + && isCarrierPrivilegeApplication(packageName)) { + return ChannelAccess.getCarrierPrivilegeAccess(packageName, pid); } synchronized (mLock) { @@ -830,6 +837,45 @@ public class Terminal { return mContext; } + /** + * Checks if Carrier Privilege exists for the given package + */ + private boolean isCarrierPrivilegeApplication(String packageName) { + try { + PackageManager pm = mContext.getPackageManager(); + if (pm != null) { + PackageInfo pkgInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); + return checkCarrierPrivilegeRules(pkgInfo); + } + } catch (NameNotFoundException ne) { } + return false; + } + + /** + * Checks if Carrier Privilege exists for the given package + */ + public boolean checkCarrierPrivilegeRules(PackageInfo pInfo) { + boolean checkRefreshTag = true; + if (mAccessControlEnforcer == null || mAccessControlEnforcer.isNoRuleFound()) { + try { + initializeAccessControl(); + } catch (IOException e) { + return false; + } + checkRefreshTag = false; + } + mAccessControlEnforcer.setPackageManager(mContext.getPackageManager()); + + synchronized (mLock) { + try { + return mAccessControlEnforcer.checkCarrierPrivilege(pInfo, checkRefreshTag); + } catch (Exception e) { + Log.i(mTag, "checkCarrierPrivilege() Exception: " + e.getMessage()); + return false; + } + } + } + /** Dump data for debug purpose . */ public void dump(PrintWriter writer) { writer.println("SECURE ELEMENT SERVICE TERMINAL: " + mName); |