1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/*
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Licensed to the Apache Software Foundation (ASF) under one or more
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  contributor license agreements.  See the NOTICE file distributed with
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  this work for additional information regarding copyright ownership.
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  The ASF licenses this file to You under the Apache License, Version 2.0
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  (the "License"); you may not use this file except in compliance with
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  the License.  You may obtain a copy of the License at
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  Unless required by applicable law or agreed to in writing, software
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  distributed under the License is distributed on an "AS IS" BASIS,
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  See the License for the specific language governing permissions and
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *  limitations under the License.
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.apache.harmony.javax.security.auth.login;
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.security.AccessController;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.apache.harmony.javax.security.auth.AuthPermission;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic abstract class Configuration {
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    // the current configuration
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static Configuration configuration;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    // creates a AuthPermission object with a specify property
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final AuthPermission GET_LOGIN_CONFIGURATION = new AuthPermission(
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            "getLoginConfiguration"); //$NON-NLS-1$
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    // creates a AuthPermission object with a specify property
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final AuthPermission SET_LOGIN_CONFIGURATION = new AuthPermission(
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            "setLoginConfiguration"); //$NON-NLS-1$
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    // Key to security properties, defining default configuration provider.
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final String LOGIN_CONFIGURATION_PROVIDER = "login.configuration.provider"; //$NON-NLS-1$
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    protected Configuration() {
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        super();
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static Configuration getConfiguration() {
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        SecurityManager sm = System.getSecurityManager();
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (sm != null) {
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            sm.checkPermission(GET_LOGIN_CONFIGURATION);
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return getAccessibleConfiguration();
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Reads name of default configuration provider from security.properties,
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * loads the class and instantiates the provider.<br> In case of any
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * exception, wraps it with SecurityException and throws further.
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private static final Configuration getDefaultProvider() {
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return new Configuration() {
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			@Override
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			public void refresh() {
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			}
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			@Override
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			public AppConfigurationEntry[] getAppConfigurationEntry(
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen					String applicationName) {
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				return new AppConfigurationEntry[0];
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			}
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		};
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Shortcut accessor for friendly classes, to skip security checks.
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * If active configuration was set to <code>null</code>, tries to load a default
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * provider, so this method never returns <code>null</code>. <br>
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * This method is synchronized with setConfiguration()
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    static Configuration getAccessibleConfiguration() {
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        Configuration current = configuration;
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (current == null) {
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            synchronized (Configuration.class) {
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (configuration == null) {
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    configuration = getDefaultProvider();
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                return configuration;
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return current;
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static void setConfiguration(Configuration configuration) {
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        SecurityManager sm = System.getSecurityManager();
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (sm != null) {
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            sm.checkPermission(SET_LOGIN_CONFIGURATION);
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        Configuration.configuration = configuration;
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public abstract AppConfigurationEntry[] getAppConfigurationEntry(String applicationName);
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public abstract void refresh();
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
103