001package org.apache.hadoop.security;
002
003import java.util.HashMap;
004import java.util.Map;
005
006import javax.security.auth.login.AppConfigurationEntry;
007import javax.security.auth.login.Configuration;
008
009public class DynamicLoginConfiguration extends Configuration {
010  private final Configuration baseConfig;
011  private final Map<String, ?> overrideOptions;
012
013  public class OverrideAppConfigurationEntry extends AppConfigurationEntry {
014
015    public OverrideAppConfigurationEntry(AppConfigurationEntry base) {
016      super(base.getLoginModuleName(), base.getControlFlag(), base.getOptions());
017    }
018
019    @Override
020    public Map<String, ?> getOptions() {
021      Map<String, ?> baseOptions = super.getOptions();
022      Map<String, Object> newOption = new HashMap<String, Object>();
023      newOption.putAll(baseOptions);
024      newOption.putAll(overrideOptions);
025      return newOption;
026    }
027  }
028
029  public DynamicLoginConfiguration(Configuration base,  Map<String,?> options) {
030    this.baseConfig = base;
031    this.overrideOptions = options;
032  }
033
034  /**
035   * Only goal here is to override the values of options at runtime.
036   *
037   * @param appName
038   * @return
039   */
040  @Override
041  public AppConfigurationEntry[] getAppConfigurationEntry(String appName) {
042    AppConfigurationEntry[] app = baseConfig.getAppConfigurationEntry(appName);
043    if (app == null) {
044      return null;
045    }
046
047    AppConfigurationEntry[] newEntries = new AppConfigurationEntry[app.length];
048    for (int i = 0; i < app.length; i++ ) {
049      AppConfigurationEntry entry = app[i];
050      newEntries[i] = new OverrideAppConfigurationEntry(entry);
051    }
052    return newEntries;
053  }
054}