diff options
3 files changed, 101 insertions, 51 deletions
diff --git a/core/java/android/security/net/config/ApplicationConfig.java b/core/java/android/security/net/config/ApplicationConfig.java index 48359d47f091..b6276418c49d 100644 --- a/core/java/android/security/net/config/ApplicationConfig.java +++ b/core/java/android/security/net/config/ApplicationConfig.java @@ -144,18 +144,4 @@ public final class ApplicationConfig { return sInstance; } } - - /** @hide */ - public static ApplicationConfig getPlatformDefault() { - return new ApplicationConfig(new ConfigSource() { - @Override - public NetworkSecurityConfig getDefaultConfig() { - return NetworkSecurityConfig.DEFAULT; - } - @Override - public Set<Pair<Domain, NetworkSecurityConfig>> getPerDomainConfigs() { - return null; - } - }); - } } diff --git a/core/java/android/security/net/config/ManifestConfigSource.java b/core/java/android/security/net/config/ManifestConfigSource.java new file mode 100644 index 000000000000..bf1fb8a5a721 --- /dev/null +++ b/core/java/android/security/net/config/ManifestConfigSource.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.net.config; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.util.Log; +import android.util.Pair; +import java.util.Set; + +/** @hide */ +public class ManifestConfigSource implements ConfigSource { + public static final String META_DATA_NETWORK_SECURITY_CONFIG = + "android.security.net.config"; + private static final boolean DBG = true; + private static final String LOG_TAG = "NetworkSecurityConfig"; + + private final Object mLock = new Object(); + private final Context mContext; + + private ConfigSource mConfigSource; + + public ManifestConfigSource(Context context) { + mContext = context; + } + + @Override + public Set<Pair<Domain, NetworkSecurityConfig>> getPerDomainConfigs() { + return getConfigSource().getPerDomainConfigs(); + } + + @Override + public NetworkSecurityConfig getDefaultConfig() { + return getConfigSource().getDefaultConfig(); + } + + private ConfigSource getConfigSource() { + synchronized (mLock) { + if (mConfigSource != null) { + return mConfigSource; + } + ApplicationInfo info; + try { + info = mContext.getPackageManager().getApplicationInfo(mContext.getPackageName(), + PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + throw new RuntimeException("Failed to look up ApplicationInfo", e); + } + int configResourceId = 0; + if (info != null && info.metaData != null) { + configResourceId = info.metaData.getInt(META_DATA_NETWORK_SECURITY_CONFIG); + } + + ConfigSource source; + if (configResourceId != 0) { + boolean debugBuild = (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + if (DBG) { + Log.d(LOG_TAG, "Using Network Security Config from resource " + + mContext.getResources().getResourceEntryName(configResourceId) + + " debugBuild: " + debugBuild); + } + source = new XmlConfigSource(mContext, configResourceId, debugBuild); + } else { + if (DBG) { + Log.d(LOG_TAG, "No Network Security Config specified, using platform default"); + } + source = new DefaultConfigSource(); + } + mConfigSource = source; + return mConfigSource; + } + } + + private static final class DefaultConfigSource implements ConfigSource { + @Override + public NetworkSecurityConfig getDefaultConfig() { + return NetworkSecurityConfig.DEFAULT; + } + + @Override + public Set<Pair<Domain, NetworkSecurityConfig>> getPerDomainConfigs() { + return null; + } + } +} diff --git a/core/java/android/security/net/config/NetworkSecurityConfigProvider.java b/core/java/android/security/net/config/NetworkSecurityConfigProvider.java index ac762efe85d2..5ebc7ac5f242 100644 --- a/core/java/android/security/net/config/NetworkSecurityConfigProvider.java +++ b/core/java/android/security/net/config/NetworkSecurityConfigProvider.java @@ -17,20 +17,13 @@ package android.security.net.config; import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.util.Log; import java.security.Security; import java.security.Provider; /** @hide */ public final class NetworkSecurityConfigProvider extends Provider { - private static final String LOG_TAG = "NetworkSecurityConfig"; private static final String PREFIX = NetworkSecurityConfigProvider.class.getPackage().getName() + "."; - public static final String META_DATA_NETWORK_SECURITY_CONFIG = - "android.security.net.config"; - private static final boolean DBG = true; public NetworkSecurityConfigProvider() { // TODO: More clever name than this @@ -40,36 +33,7 @@ public final class NetworkSecurityConfigProvider extends Provider { } public static void install(Context context) { - ApplicationInfo info = null; - // TODO: This lookup shouldn't be done in the app startup path, it should be done lazily. - try { - info = context.getPackageManager().getApplicationInfo(context.getPackageName(), - PackageManager.GET_META_DATA); - } catch (PackageManager.NameNotFoundException e) { - throw new RuntimeException("Failed to look up ApplicationInfo", e); - } - int configResourceId = 0; - if (info != null && info.metaData != null) { - configResourceId = info.metaData.getInt(META_DATA_NETWORK_SECURITY_CONFIG); - } - - ApplicationConfig config; - if (configResourceId != 0) { - boolean debugBuild = (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; - if (DBG) { - Log.d(LOG_TAG, "Using Network Security Config from resource " - + context.getResources().getResourceEntryName(configResourceId) - + " debugBuild: " + debugBuild); - } - ConfigSource source = new XmlConfigSource(context, configResourceId, debugBuild); - config = new ApplicationConfig(source); - } else { - if (DBG) { - Log.d(LOG_TAG, "No Network Security Config specified, using platform default"); - } - config = ApplicationConfig.getPlatformDefault(); - } - + ApplicationConfig config = new ApplicationConfig(new ManifestConfigSource(context)); ApplicationConfig.setDefaultInstance(config); int pos = Security.insertProviderAt(new NetworkSecurityConfigProvider(), 1); if (pos != 1) { |