TrustAgentUtils.java revision ec1052dbadbc472c0afff943a9b61e6d95ab8089
16f482447b05492906755d91ac4c29ec505a8a544Ido Ofir/* 26f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * Copyright (C) 2014 The Android Open Source Project 36f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * 46f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * Licensed under the Apache License, Version 2.0 (the "License"); 56f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * you may not use this file except in compliance with the License. 66f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * You may obtain a copy of the License at 76f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * 86f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * http://www.apache.org/licenses/LICENSE-2.0 96f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * 106f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * Unless required by applicable law or agreed to in writing, software 116f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * distributed under the License is distributed on an "AS IS" BASIS, 126f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * See the License for the specific language governing permissions and 146f482447b05492906755d91ac4c29ec505a8a544Ido Ofir * limitations under the License 156f482447b05492906755d91ac4c29ec505a8a544Ido Ofir */ 166f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 176f482447b05492906755d91ac4c29ec505a8a544Ido Ofirpackage com.android.settings; 186f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 196f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.content.ComponentName; 206f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.content.pm.PackageManager; 216f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.content.pm.ResolveInfo; 226f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.content.res.Resources; 236f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.content.res.TypedArray; 246f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.content.res.XmlResourceParser; 256f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.service.trust.TrustAgentService; 266f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.util.AttributeSet; 27da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roosimport android.util.Log; 286f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.util.Slog; 296f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport android.util.Xml; 306f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 316f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport org.xmlpull.v1.XmlPullParser; 326f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport org.xmlpull.v1.XmlPullParserException; 336f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 346f482447b05492906755d91ac4c29ec505a8a544Ido Ofirimport java.io.IOException; 356f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 36ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 37ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka 386f482447b05492906755d91ac4c29ec505a8a544Ido Ofirpublic class TrustAgentUtils { 396f482447b05492906755d91ac4c29ec505a8a544Ido Ofir static final String TAG = "TrustAgentUtils"; 406f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 416f482447b05492906755d91ac4c29ec505a8a544Ido Ofir private static final String TRUST_AGENT_META_DATA = TrustAgentService.TRUST_AGENT_META_DATA; 428b0ff9ac9cf14c51cf4485aa9f4a0c4cfcd52842Amith Yamasani private static final String PERMISSION_PROVIDE_AGENT = android.Manifest.permission.PROVIDE_TRUST_AGENT; 43da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos 44da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos /** 45da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos * @return true, if the service in resolveInfo has the permission to provide a trust agent. 46da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos */ 47da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos public static boolean checkProvidePermission(ResolveInfo resolveInfo, PackageManager pm) { 48da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos String packageName = resolveInfo.serviceInfo.packageName; 49da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos if (pm.checkPermission(PERMISSION_PROVIDE_AGENT, packageName) 50da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos != PackageManager.PERMISSION_GRANTED) { 51da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos Log.w(TAG, "Skipping agent because package " + packageName 52da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos + " does not have permission " + PERMISSION_PROVIDE_AGENT + "."); 53da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos return false; 54da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos } 55da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos return true; 56da113638122dc1d9e8b3b621ca1c7740b3752d1cAdrian Roos } 576f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 586f482447b05492906755d91ac4c29ec505a8a544Ido Ofir public static class TrustAgentComponentInfo { 596f482447b05492906755d91ac4c29ec505a8a544Ido Ofir ComponentName componentName; 606f482447b05492906755d91ac4c29ec505a8a544Ido Ofir String title; 616f482447b05492906755d91ac4c29ec505a8a544Ido Ofir String summary; 62ec1052dbadbc472c0afff943a9b61e6d95ab8089Sudheer Shanka EnforcedAdmin admin = null; 636f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 646f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 656f482447b05492906755d91ac4c29ec505a8a544Ido Ofir public static ComponentName getComponentName(ResolveInfo resolveInfo) { 666f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (resolveInfo == null || resolveInfo.serviceInfo == null) return null; 676f482447b05492906755d91ac4c29ec505a8a544Ido Ofir return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name); 686f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 696f482447b05492906755d91ac4c29ec505a8a544Ido Ofir 706f482447b05492906755d91ac4c29ec505a8a544Ido Ofir public static TrustAgentComponentInfo getSettingsComponent( 716f482447b05492906755d91ac4c29ec505a8a544Ido Ofir PackageManager pm, ResolveInfo resolveInfo) { 726f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (resolveInfo == null || resolveInfo.serviceInfo == null 736f482447b05492906755d91ac4c29ec505a8a544Ido Ofir || resolveInfo.serviceInfo.metaData == null) return null; 746f482447b05492906755d91ac4c29ec505a8a544Ido Ofir String cn = null; 756f482447b05492906755d91ac4c29ec505a8a544Ido Ofir TrustAgentComponentInfo trustAgentComponentInfo = new TrustAgentComponentInfo(); 766f482447b05492906755d91ac4c29ec505a8a544Ido Ofir XmlResourceParser parser = null; 776f482447b05492906755d91ac4c29ec505a8a544Ido Ofir Exception caughtException = null; 786f482447b05492906755d91ac4c29ec505a8a544Ido Ofir try { 796f482447b05492906755d91ac4c29ec505a8a544Ido Ofir parser = resolveInfo.serviceInfo.loadXmlMetaData(pm, TRUST_AGENT_META_DATA); 806f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (parser == null) { 816f482447b05492906755d91ac4c29ec505a8a544Ido Ofir Slog.w(TAG, "Can't find " + TRUST_AGENT_META_DATA + " meta-data"); 826f482447b05492906755d91ac4c29ec505a8a544Ido Ofir return null; 836f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 846f482447b05492906755d91ac4c29ec505a8a544Ido Ofir Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo); 856f482447b05492906755d91ac4c29ec505a8a544Ido Ofir AttributeSet attrs = Xml.asAttributeSet(parser); 866f482447b05492906755d91ac4c29ec505a8a544Ido Ofir int type; 876f482447b05492906755d91ac4c29ec505a8a544Ido Ofir while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 886f482447b05492906755d91ac4c29ec505a8a544Ido Ofir && type != XmlPullParser.START_TAG) { 896f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 906f482447b05492906755d91ac4c29ec505a8a544Ido Ofir String nodeName = parser.getName(); 916f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (!"trust-agent".equals(nodeName)) { 926f482447b05492906755d91ac4c29ec505a8a544Ido Ofir Slog.w(TAG, "Meta-data does not start with trust-agent tag"); 936f482447b05492906755d91ac4c29ec505a8a544Ido Ofir return null; 946f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 956f482447b05492906755d91ac4c29ec505a8a544Ido Ofir TypedArray sa = 966f482447b05492906755d91ac4c29ec505a8a544Ido Ofir res.obtainAttributes(attrs, com.android.internal.R.styleable.TrustAgent); 976f482447b05492906755d91ac4c29ec505a8a544Ido Ofir trustAgentComponentInfo.summary = 986f482447b05492906755d91ac4c29ec505a8a544Ido Ofir sa.getString(com.android.internal.R.styleable.TrustAgent_summary); 996f482447b05492906755d91ac4c29ec505a8a544Ido Ofir trustAgentComponentInfo.title = 1006f482447b05492906755d91ac4c29ec505a8a544Ido Ofir sa.getString(com.android.internal.R.styleable.TrustAgent_title); 1016f482447b05492906755d91ac4c29ec505a8a544Ido Ofir cn = sa.getString(com.android.internal.R.styleable.TrustAgent_settingsActivity); 1026f482447b05492906755d91ac4c29ec505a8a544Ido Ofir sa.recycle(); 1036f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } catch (PackageManager.NameNotFoundException e) { 1046f482447b05492906755d91ac4c29ec505a8a544Ido Ofir caughtException = e; 1056f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } catch (IOException e) { 1066f482447b05492906755d91ac4c29ec505a8a544Ido Ofir caughtException = e; 1076f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } catch (XmlPullParserException e) { 1086f482447b05492906755d91ac4c29ec505a8a544Ido Ofir caughtException = e; 1096f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } finally { 1106f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (parser != null) parser.close(); 1116f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 1126f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (caughtException != null) { 1136f482447b05492906755d91ac4c29ec505a8a544Ido Ofir Slog.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException); 1146f482447b05492906755d91ac4c29ec505a8a544Ido Ofir return null; 1156f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 1166f482447b05492906755d91ac4c29ec505a8a544Ido Ofir if (cn != null && cn.indexOf('/') < 0) { 1176f482447b05492906755d91ac4c29ec505a8a544Ido Ofir cn = resolveInfo.serviceInfo.packageName + "/" + cn; 1186f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 1196f482447b05492906755d91ac4c29ec505a8a544Ido Ofir trustAgentComponentInfo.componentName = (cn == null) ? null : ComponentName.unflattenFromString(cn); 1206f482447b05492906755d91ac4c29ec505a8a544Ido Ofir return trustAgentComponentInfo; 1216f482447b05492906755d91ac4c29ec505a8a544Ido Ofir } 1226f482447b05492906755d91ac4c29ec505a8a544Ido Ofir} 123