Browse Source

fix configeditor display text not working

Jason Rivard 4 years ago
parent
commit
dcbb41f059

+ 36 - 152
server/src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServlet.java

@@ -21,8 +21,9 @@
 package password.pwm.http.servlet.configeditor;
 package password.pwm.http.servlet.configeditor;
 
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
+import lombok.Builder;
+import lombok.Value;
 import password.pwm.AppProperty;
 import password.pwm.AppProperty;
-import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.EmailItemBean;
 import password.pwm.bean.SmsItemBean;
 import password.pwm.bean.SmsItemBean;
@@ -30,10 +31,8 @@ import password.pwm.bean.UserIdentity;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSettingCategory;
 import password.pwm.config.PwmSettingCategory;
-import password.pwm.config.PwmSettingSyntax;
 import password.pwm.config.PwmSettingTemplate;
 import password.pwm.config.PwmSettingTemplate;
 import password.pwm.config.SettingUIFunction;
 import password.pwm.config.SettingUIFunction;
-import password.pwm.config.value.StoredValue;
 import password.pwm.config.profile.EmailServerProfile;
 import password.pwm.config.profile.EmailServerProfile;
 import password.pwm.config.profile.PwmPasswordPolicy;
 import password.pwm.config.profile.PwmPasswordPolicy;
 import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.ConfigurationProperty;
@@ -41,13 +40,9 @@ import password.pwm.config.stored.StoredConfigItemKey;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfigurationModifier;
 import password.pwm.config.stored.StoredConfigurationModifier;
 import password.pwm.config.stored.StoredConfigurationUtil;
 import password.pwm.config.stored.StoredConfigurationUtil;
-import password.pwm.config.stored.ValueMetaData;
-import password.pwm.config.value.ActionValue;
 import password.pwm.config.value.FileValue;
 import password.pwm.config.value.FileValue;
-import password.pwm.config.value.PrivateKeyValue;
-import password.pwm.config.value.RemoteWebServiceValue;
+import password.pwm.config.value.StoredValue;
 import password.pwm.config.value.ValueFactory;
 import password.pwm.config.value.ValueFactory;
-import password.pwm.config.value.X509CertificateValue;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
@@ -104,7 +99,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Optional;
-import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.TreeMap;
@@ -251,122 +245,36 @@ public class ConfigEditorServlet extends ControlledPwmServlet
     {
     {
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final StoredConfiguration storedConfig = configManagerBean.getStoredConfiguration();
         final StoredConfiguration storedConfig = configManagerBean.getStoredConfiguration();
-
         final String key = pwmRequest.readParameterAsString( "key" );
         final String key = pwmRequest.readParameterAsString( "key" );
-        final Object returnValue;
-        final LinkedHashMap<String, Object> returnMap = new LinkedHashMap<>();
-        final PwmSetting theSetting = PwmSetting.forKey( key )
-                .orElseThrow( () -> new IllegalStateException( "invalid setting parameter value" ) );
 
 
+        final ReadSettingResponse readSettingResponse;
         if ( key.startsWith( "localeBundle" ) )
         if ( key.startsWith( "localeBundle" ) )
         {
         {
-            final StringTokenizer st = new StringTokenizer( key, "-" );
-            st.nextToken();
-            final String localeBundleName = st.nextToken();
-            final PwmLocaleBundle pwmLocaleBundle = PwmLocaleBundle.forKey( localeBundleName )
-                    .orElseThrow( () -> new IllegalArgumentException( "unknown locale bundle name '" + localeBundleName + "'" ) );
-            final String keyName = st.nextToken();
-            final Map<String, String> bundleMap = storedConfig.readLocaleBundleMap( pwmLocaleBundle, keyName );
-            if ( bundleMap == null || bundleMap.isEmpty() )
-            {
-                final Map<String, String> defaultValueMap = new LinkedHashMap<>();
-                final String defaultLocaleValue = ResourceBundle.getBundle( pwmLocaleBundle.getTheClass().getName(), PwmConstants.DEFAULT_LOCALE ).getString( keyName );
-                for ( final Locale locale : pwmRequest.getConfig().getKnownLocales() )
-                {
-                    final ResourceBundle localeBundle = ResourceBundle.getBundle( pwmLocaleBundle.getTheClass().getName(), locale );
-                    if ( locale.toString().equalsIgnoreCase( PwmConstants.DEFAULT_LOCALE.toString() ) )
-                    {
-                        defaultValueMap.put( "", defaultLocaleValue );
-                    }
-                    else
-                    {
-                        final String valueStr = localeBundle.getString( keyName );
-                        if ( !defaultLocaleValue.equals( valueStr ) )
-                        {
-                            final String localeStr = locale.toString();
-                            defaultValueMap.put( localeStr, localeBundle.getString( keyName ) );
-                        }
-                    }
-                }
-                returnValue = defaultValueMap;
-                returnMap.put( "isDefault", true );
-            }
-            else
-            {
-                returnValue = bundleMap;
-                returnMap.put( "isDefault", false );
-            }
-            returnMap.put( "key", key );
-        }
-        else if ( theSetting == null )
-        {
-            final String errorStr = "readSettingAsString request for unknown key: " + key;
-            LOGGER.warn( () -> errorStr );
-            pwmRequest.outputJsonResult( RestResultBean.fromError( new ErrorInformation( PwmError.ERROR_INTERNAL, errorStr ) ) );
-            return ProcessStatus.Halt;
+            readSettingResponse = ConfigEditorServletUtils.handleLocaleBundleReadSetting( pwmRequest, storedConfig, key );
         }
         }
         else
         else
         {
         {
-            final String profile = theSetting.getCategory().hasProfiles() ? pwmRequest.readParameterAsString( "profile" ) : null;
-            switch ( theSetting.getSyntax() )
-            {
-                case PASSWORD:
-                    returnValue = Collections.singletonMap( "isDefault", storedConfig.isDefaultValue( theSetting, profile ) );
-                    break;
-
-                case X509CERT:
-                    returnValue = ( ( X509CertificateValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap( true );
-                    break;
-
-                case PRIVATE_KEY:
-                    returnValue = ( ( PrivateKeyValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap( true );
-                    break;
-
-                case ACTION:
-                    returnValue = ( ( ActionValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap();
-                    break;
-
-                case REMOTE_WEB_SERVICE:
-                    returnValue = ( ( RemoteWebServiceValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap();
-                    break;
-
-                case FILE:
-                    returnValue = ( ( FileValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap();
-                    break;
-
-                default:
-                    returnValue = storedConfig.readSetting( theSetting, profile ).toNativeObject();
-
-            }
-
-            returnMap.put( "isDefault", storedConfig.isDefaultValue( theSetting, profile ) );
-            if ( theSetting.getSyntax() == PwmSettingSyntax.SELECT )
-            {
-                returnMap.put( "options", theSetting.getOptions() );
-            }
-            {
-                final ValueMetaData settingMetaData = storedConfig.readSettingMetadata( theSetting, profile );
-                if ( settingMetaData != null )
-                {
-                    if ( settingMetaData.getModifyDate() != null )
-                    {
-                        returnMap.put( "modifyTime", settingMetaData.getModifyDate() );
-                    }
-                    if ( settingMetaData.getUserIdentity() != null )
-                    {
-                        returnMap.put( "modifyUser", settingMetaData.getUserIdentity() );
-                    }
-                }
-            }
-            returnMap.put( "key", key );
-            returnMap.put( "category", theSetting.getCategory().toString() );
-            returnMap.put( "syntax", theSetting.getSyntax().toString() );
+            readSettingResponse = ConfigEditorServletUtils.handleReadSetting( pwmRequest, storedConfig, key );
         }
         }
-        returnMap.put( "value", returnValue );
-        pwmRequest.outputJsonResult( RestResultBean.withData( returnMap ) );
+
+        pwmRequest.outputJsonResult( RestResultBean.withData( readSettingResponse ) );
         return ProcessStatus.Halt;
         return ProcessStatus.Halt;
     }
     }
 
 
+    @Value
+    @Builder
+    static class ReadSettingResponse implements Serializable
+    {
+        private final boolean isDefault;
+        private final String key;
+        private final String category;
+        private final Instant modifyTime;
+        private final UserIdentity modifyUser;
+        private final String syntax;
+        private final Object value;
+        private final Map<String, String> options;
+    }
+
     @ActionHandler( action = "writeSetting" )
     @ActionHandler( action = "writeSetting" )
     private ProcessStatus restWriteSetting(
     private ProcessStatus restWriteSetting(
             final PwmRequest pwmRequest
             final PwmRequest pwmRequest
@@ -377,12 +285,8 @@ public class ConfigEditorServlet extends ControlledPwmServlet
         final StoredConfigurationModifier modifier = StoredConfigurationModifier.newModifier( configManagerBean.getStoredConfiguration() );
         final StoredConfigurationModifier modifier = StoredConfigurationModifier.newModifier( configManagerBean.getStoredConfiguration() );
         final String key = pwmRequest.readParameterAsString( "key" );
         final String key = pwmRequest.readParameterAsString( "key" );
         final String bodyString = pwmRequest.readRequestBodyAsString();
         final String bodyString = pwmRequest.readRequestBodyAsString();
-        final PwmSetting setting = PwmSetting.forKey( key )
-                .orElseThrow( () -> new IllegalStateException( "invalid setting parameter value" ) );
-        final LinkedHashMap<String, Object> returnMap = new LinkedHashMap<>();
-        final UserIdentity loggedInUser = pwmRequest.getPwmSession().isAuthenticated()
-                ? pwmRequest.getPwmSession().getUserInfo().getUserIdentity()
-                : null;
+        final UserIdentity loggedInUser = pwmRequest.getUserInfoIfLoggedIn();
+        final ReadSettingResponse readSettingResponse;
 
 
         final StoredConfiguration storedConfiguration;
         final StoredConfiguration storedConfiguration;
         if ( key.startsWith( "localeBundle" ) )
         if ( key.startsWith( "localeBundle" ) )
@@ -396,37 +300,28 @@ public class ConfigEditorServlet extends ControlledPwmServlet
             final Map<String, String> outputMap = new LinkedHashMap<>( valueMap );
             final Map<String, String> outputMap = new LinkedHashMap<>( valueMap );
 
 
             modifier.writeLocaleBundleMap( pwmLocaleBundle, keyName, outputMap );
             modifier.writeLocaleBundleMap( pwmLocaleBundle, keyName, outputMap );
-            returnMap.put( "isDefault", outputMap.isEmpty() );
-            returnMap.put( "key", key );
             storedConfiguration = modifier.newStoredConfiguration();
             storedConfiguration = modifier.newStoredConfiguration();
+            readSettingResponse = ConfigEditorServletUtils.handleLocaleBundleReadSetting( pwmRequest, storedConfiguration, key );
         }
         }
         else
         else
         {
         {
+            final PwmSetting setting = PwmSetting.forKey( key )
+                    .orElseThrow( () -> new IllegalStateException( "invalid setting parameter value" ) );
             final String profileID = setting.getCategory().hasProfiles() ? pwmRequest.readParameterAsString( "profile" ) : null;
             final String profileID = setting.getCategory().hasProfiles() ? pwmRequest.readParameterAsString( "profile" ) : null;
             try
             try
             {
             {
                 final StoredValue storedValue = ValueFactory.fromJson( setting, bodyString );
                 final StoredValue storedValue = ValueFactory.fromJson( setting, bodyString );
-                final List<String> errorMsgs = storedValue.validateValue( setting );
-                if ( errorMsgs != null && !errorMsgs.isEmpty() )
-                {
-                    returnMap.put( "errorMessage", setting.getLabel( pwmRequest.getLocale() ) + ": " + errorMsgs.get( 0 ) );
-                }
                 modifier.writeSetting( setting, profileID, storedValue, loggedInUser );
                 modifier.writeSetting( setting, profileID, storedValue, loggedInUser );
+                storedConfiguration = modifier.newStoredConfiguration();
             }
             }
-            catch ( final Exception e )
+            catch ( final PwmOperationalException e )
             {
             {
-                final String errorMsg = "error writing default value for setting " + setting.toString() + ", error: " + e.getMessage();
-                LOGGER.error( () -> errorMsg, e );
-                throw new IllegalStateException( errorMsg, e );
+                throw new PwmUnrecoverableException( e.getErrorInformation() );
             }
             }
-            storedConfiguration = modifier.newStoredConfiguration();
-            returnMap.put( "key", key );
-            returnMap.put( "category", setting.getCategory().toString() );
-            returnMap.put( "syntax", setting.getSyntax().toString() );
-            returnMap.put( "isDefault", storedConfiguration.isDefaultValue( setting, profileID ) );
+            readSettingResponse = ConfigEditorServletUtils.handleReadSetting( pwmRequest, storedConfiguration, key );
         }
         }
         configManagerBean.setStoredConfiguration( storedConfiguration );
         configManagerBean.setStoredConfiguration( storedConfiguration );
-        pwmRequest.outputJsonResult( RestResultBean.withData( returnMap ) );
+        pwmRequest.outputJsonResult( RestResultBean.withData( readSettingResponse ) );
         return ProcessStatus.Halt;
         return ProcessStatus.Halt;
     }
     }
 
 
@@ -440,9 +335,6 @@ public class ConfigEditorServlet extends ControlledPwmServlet
         final StoredConfigurationModifier modifier = StoredConfigurationModifier.newModifier( configManagerBean.getStoredConfiguration() );
         final StoredConfigurationModifier modifier = StoredConfigurationModifier.newModifier( configManagerBean.getStoredConfiguration() );
         final UserIdentity loggedInUser = pwmRequest.getUserInfoIfLoggedIn();
         final UserIdentity loggedInUser = pwmRequest.getUserInfoIfLoggedIn();
         final String key = pwmRequest.readParameterAsString( "key" );
         final String key = pwmRequest.readParameterAsString( "key" );
-        final PwmSetting setting = PwmSetting.forKey( key )
-                .orElseThrow( () -> new IllegalStateException( "invalid setting parameter value" ) );
-
 
 
         if ( key.startsWith( "localeBundle" ) )
         if ( key.startsWith( "localeBundle" ) )
         {
         {
@@ -455,6 +347,8 @@ public class ConfigEditorServlet extends ControlledPwmServlet
         }
         }
         else
         else
         {
         {
+            final PwmSetting setting = PwmSetting.forKey( key )
+                    .orElseThrow( () -> new IllegalStateException( "invalid setting parameter value" ) );
             final String profileID = setting.getCategory().hasProfiles() ? pwmRequest.readParameterAsString( "profile" ) : null;
             final String profileID = setting.getCategory().hasProfiles() ? pwmRequest.readParameterAsString( "profile" ) : null;
             modifier.resetSetting( setting, profileID, loggedInUser );
             modifier.resetSetting( setting, profileID, loggedInUser );
         }
         }
@@ -965,24 +859,14 @@ public class ConfigEditorServlet extends ControlledPwmServlet
             throws IOException, PwmUnrecoverableException
             throws IOException, PwmUnrecoverableException
     {
     {
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
         final ConfigManagerBean configManagerBean = getBean( pwmRequest );
-        final LinkedHashMap<String, Object> returnMap = new LinkedHashMap<>( ConfigEditorServletUtils.generateSettingData(
+        final ConfigEditorServletUtils.SettingData settingData =  ConfigEditorServletUtils.generateSettingData(
                 pwmRequest.getPwmApplication(),
                 pwmRequest.getPwmApplication(),
                 configManagerBean.getStoredConfiguration(),
                 configManagerBean.getStoredConfiguration(),
                 pwmRequest.getLabel(),
                 pwmRequest.getLabel(),
                 pwmRequest.getLocale()
                 pwmRequest.getLocale()
-        )
         );
         );
 
 
-        if ( pwmRequest.getPwmApplication().getApplicationMode() == PwmApplicationMode.CONFIGURATION && !PwmConstants.TRIAL_MODE )
-        {
-            if ( !configManagerBean.isConfigUnlockedWarningShown() )
-            {
-                returnMap.put( "configUnlocked", true );
-                configManagerBean.setConfigUnlockedWarningShown( true );
-            }
-        }
-
-        final RestResultBean restResultBean = RestResultBean.withData( new LinkedHashMap<>( returnMap ) );
+        final RestResultBean restResultBean = RestResultBean.withData( settingData );
         pwmRequest.outputJsonResult( restResultBean );
         pwmRequest.outputJsonResult( restResultBean );
         return ProcessStatus.Halt;
         return ProcessStatus.Halt;
     }
     }

+ 149 - 9
server/src/main/java/password/pwm/http/servlet/configeditor/ConfigEditorServletUtils.java

@@ -20,18 +20,25 @@
 
 
 package password.pwm.http.servlet.configeditor;
 package password.pwm.http.servlet.configeditor;
 
 
+import lombok.Builder;
+import lombok.Value;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.SessionLabel;
 import password.pwm.bean.SessionLabel;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSettingCategory;
 import password.pwm.config.PwmSettingCategory;
+import password.pwm.config.PwmSettingSyntax;
 import password.pwm.config.PwmSettingTemplateSet;
 import password.pwm.config.PwmSettingTemplateSet;
-import password.pwm.config.stored.ConfigurationProperty;
 import password.pwm.config.stored.StoredConfigItemKey;
 import password.pwm.config.stored.StoredConfigItemKey;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfiguration;
 import password.pwm.config.stored.StoredConfigurationUtil;
 import password.pwm.config.stored.StoredConfigurationUtil;
+import password.pwm.config.stored.ValueMetaData;
+import password.pwm.config.value.ActionValue;
 import password.pwm.config.value.FileValue;
 import password.pwm.config.value.FileValue;
+import password.pwm.config.value.PrivateKeyValue;
+import password.pwm.config.value.RemoteWebServiceValue;
+import password.pwm.config.value.X509CertificateValue;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
@@ -50,13 +57,16 @@ import password.pwm.ws.server.rest.bean.HealthData;
 
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletException;
 import java.io.IOException;
 import java.io.IOException;
+import java.io.Serializable;
 import java.time.Instant;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map;
+import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.Set;
+import java.util.StringTokenizer;
 
 
 public class ConfigEditorServletUtils
 public class ConfigEditorServletUtils
 {
 {
@@ -175,7 +185,20 @@ public class ConfigEditorServletUtils
         return HealthData.builder().build();
         return HealthData.builder().build();
     }
     }
 
 
-    public static Map<String, Object> generateSettingData(
+    @Value
+    @Builder
+    public static class SettingData implements Serializable
+    {
+        private final Map<String, Object> settings;
+        private final Map<String, Object> categories;
+        private final Map<String, Object> locales;
+        private final Object ldapProfileIds;
+        private final PwmSettingTemplateSet currentTemplate;
+        private final Map<String, Object> var;
+
+    }
+
+    public static SettingData generateSettingData(
             final PwmApplication pwmApplication,
             final PwmApplication pwmApplication,
             final StoredConfiguration storedConfiguration,
             final StoredConfiguration storedConfiguration,
             final SessionLabel sessionLabel,
             final SessionLabel sessionLabel,
@@ -185,9 +208,9 @@ public class ConfigEditorServletUtils
             throws PwmUnrecoverableException
             throws PwmUnrecoverableException
     {
     {
         final Instant startTime = Instant.now();
         final Instant startTime = Instant.now();
-        final LinkedHashMap<String, Object> returnMap = new LinkedHashMap<>();
         final MacroMachine macroMachine = MacroMachine.forNonUserSpecific( pwmApplication, sessionLabel );
         final MacroMachine macroMachine = MacroMachine.forNonUserSpecific( pwmApplication, sessionLabel );
         final PwmSettingTemplateSet template = storedConfiguration.getTemplateSet();
         final PwmSettingTemplateSet template = storedConfiguration.getTemplateSet();
+        final SettingData.SettingDataBuilder builder = SettingData.builder();
 
 
         {
         {
             final LinkedHashMap<String, Object> settingMap = new LinkedHashMap<>();
             final LinkedHashMap<String, Object> settingMap = new LinkedHashMap<>();
@@ -196,7 +219,7 @@ public class ConfigEditorServletUtils
 
 
                 settingMap.put( setting.getKey(), SettingInfo.forSetting( setting, template, macroMachine, locale ) );
                 settingMap.put( setting.getKey(), SettingInfo.forSetting( setting, template, macroMachine, locale ) );
             }
             }
-            returnMap.put( "settings", settingMap );
+            builder.settings( settingMap );
         }
         }
         {
         {
             final LinkedHashMap<String, Object> categoryMap = new LinkedHashMap<>();
             final LinkedHashMap<String, Object> categoryMap = new LinkedHashMap<>();
@@ -204,7 +227,7 @@ public class ConfigEditorServletUtils
             {
             {
                 categoryMap.put( category.getKey(), CategoryInfo.forCategory( category, macroMachine, locale ) );
                 categoryMap.put( category.getKey(), CategoryInfo.forCategory( category, macroMachine, locale ) );
             }
             }
-            returnMap.put( "categories", categoryMap );
+            builder.categories( categoryMap );
         }
         }
         {
         {
             final LinkedHashMap<String, Object> labelMap = new LinkedHashMap<>();
             final LinkedHashMap<String, Object> labelMap = new LinkedHashMap<>();
@@ -216,17 +239,134 @@ public class ConfigEditorServletUtils
                 localeInfo.adminOnly = localeBundle.isAdminOnly();
                 localeInfo.adminOnly = localeBundle.isAdminOnly();
                 labelMap.put( localeBundle.getTheClass().getSimpleName(), localeInfo );
                 labelMap.put( localeBundle.getTheClass().getSimpleName(), localeInfo );
             }
             }
-            returnMap.put( "locales", labelMap );
+            builder.locales( labelMap );
         }
         }
         {
         {
             final LinkedHashMap<String, Object> varMap = new LinkedHashMap<>();
             final LinkedHashMap<String, Object> varMap = new LinkedHashMap<>();
             varMap.put( "ldapProfileIds", storedConfiguration.readSetting( PwmSetting.LDAP_PROFILE_LIST, null ).toNativeObject() );
             varMap.put( "ldapProfileIds", storedConfiguration.readSetting( PwmSetting.LDAP_PROFILE_LIST, null ).toNativeObject() );
             varMap.put( "currentTemplate", storedConfiguration.getTemplateSet() );
             varMap.put( "currentTemplate", storedConfiguration.getTemplateSet() );
-            varMap.put( "configurationNotes", storedConfiguration.readConfigProperty( ConfigurationProperty.NOTES ) );
-            returnMap.put( "var", varMap );
+            builder.var( varMap );
         }
         }
         LOGGER.trace( sessionLabel, () -> "generated settingData", () -> TimeDuration.fromCurrent( startTime ) );
         LOGGER.trace( sessionLabel, () -> "generated settingData", () -> TimeDuration.fromCurrent( startTime ) );
-        return Collections.unmodifiableMap( returnMap );
+        return builder.build();
+
+    }
+
+    static ConfigEditorServlet.ReadSettingResponse handleLocaleBundleReadSetting(
+            final PwmRequest pwmRequest,
+            final StoredConfiguration storedConfig,
+            final String key
+
+    )
+    {
+        final ConfigEditorServlet.ReadSettingResponse.ReadSettingResponseBuilder builder = ConfigEditorServlet.ReadSettingResponse.builder();
+        final StringTokenizer st = new StringTokenizer( key, "-" );
+        st.nextToken();
+        final String localeBundleName = st.nextToken();
+        final PwmLocaleBundle pwmLocaleBundle = PwmLocaleBundle.forKey( localeBundleName )
+                .orElseThrow( () -> new IllegalArgumentException( "unknown locale bundle name '" + localeBundleName + "'" ) );
+        final String keyName = st.nextToken();
+        final Map<String, String> bundleMap = storedConfig.readLocaleBundleMap( pwmLocaleBundle, keyName );
+        if ( bundleMap == null || bundleMap.isEmpty() )
+        {
+            final Map<String, String> defaultValueMap = new LinkedHashMap<>();
+            final String defaultLocaleValue = ResourceBundle.getBundle( pwmLocaleBundle.getTheClass().getName(), PwmConstants.DEFAULT_LOCALE ).getString( keyName );
+            for ( final Locale locale : pwmRequest.getConfig().getKnownLocales() )
+            {
+                final ResourceBundle localeBundle = ResourceBundle.getBundle( pwmLocaleBundle.getTheClass().getName(), locale );
+                if ( locale.toString().equalsIgnoreCase( PwmConstants.DEFAULT_LOCALE.toString() ) )
+                {
+                    defaultValueMap.put( "", defaultLocaleValue );
+                }
+                else
+                {
+                    final String valueStr = localeBundle.getString( keyName );
+                    if ( !defaultLocaleValue.equals( valueStr ) )
+                    {
+                        final String localeStr = locale.toString();
+                        defaultValueMap.put( localeStr, localeBundle.getString( keyName ) );
+                    }
+                }
+            }
+            builder.value( defaultValueMap );
+            builder.isDefault( true );
+        }
+        else
+        {
+            builder.value( bundleMap );
+            builder.isDefault( false );
+        }
+        builder.key( key );
+        return builder.build();
+    }
 
 
+    static ConfigEditorServlet.ReadSettingResponse handleReadSetting(
+            final PwmRequest pwmRequest,
+            final StoredConfiguration storedConfig,
+            final String key
+    )
+            throws PwmUnrecoverableException
+    {
+        final ConfigEditorServlet.ReadSettingResponse.ReadSettingResponseBuilder builder = ConfigEditorServlet.ReadSettingResponse.builder();
+        final PwmSetting theSetting = PwmSetting.forKey( key )
+                .orElseThrow( () -> new IllegalStateException( "invalid setting parameter value" ) );
+
+        final Object returnValue;
+        final String profile = theSetting.getCategory().hasProfiles() ? pwmRequest.readParameterAsString( "profile" ) : null;
+        switch ( theSetting.getSyntax() )
+        {
+            case PASSWORD:
+                returnValue = Collections.singletonMap( "isDefault", storedConfig.isDefaultValue( theSetting, profile ) );
+                break;
+
+            case X509CERT:
+                returnValue = ( ( X509CertificateValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap( true );
+                break;
+
+            case PRIVATE_KEY:
+                returnValue = ( ( PrivateKeyValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap( true );
+                break;
+
+            case ACTION:
+                returnValue = ( ( ActionValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap();
+                break;
+
+            case REMOTE_WEB_SERVICE:
+                returnValue = ( ( RemoteWebServiceValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap();
+                break;
+
+            case FILE:
+                returnValue = ( ( FileValue ) storedConfig.readSetting( theSetting, profile ) ).toInfoMap();
+                break;
+
+            default:
+                returnValue = storedConfig.readSetting( theSetting, profile ).toNativeObject();
+
+        }
+        builder.value( returnValue );
+
+        builder.isDefault( storedConfig.isDefaultValue( theSetting, profile ) );
+        if ( theSetting.getSyntax() == PwmSettingSyntax.SELECT )
+        {
+            builder.options( theSetting.getOptions() );
+        }
+        {
+            final ValueMetaData settingMetaData = storedConfig.readSettingMetadata( theSetting, profile );
+            if ( settingMetaData != null )
+            {
+                if ( settingMetaData.getModifyDate() != null )
+                {
+                    builder.modifyTime( settingMetaData.getModifyDate() );
+                }
+                if ( settingMetaData.getUserIdentity() != null )
+                {
+                    builder.modifyUser( settingMetaData.getUserIdentity() );
+                }
+            }
+        }
+        builder.key( key );
+        builder.category( theSetting.getCategory().toString() );
+        builder.syntax( theSetting.getSyntax().toString() );
+        return builder.build();
     }
     }
 }
 }

+ 2 - 3
server/src/main/java/password/pwm/http/servlet/configguide/ConfigGuideServlet.java

@@ -669,15 +669,14 @@ public class ConfigGuideServlet extends ControlledPwmServlet
         final ConfigGuideBean configGuideBean = getBean( pwmRequest );
         final ConfigGuideBean configGuideBean = getBean( pwmRequest );
         final StoredConfiguration storedConfiguration = ConfigGuideForm.generateStoredConfig( configGuideBean );
         final StoredConfiguration storedConfiguration = ConfigGuideForm.generateStoredConfig( configGuideBean );
 
 
-        final LinkedHashMap<String, Object> returnMap = new LinkedHashMap<>( ConfigEditorServletUtils.generateSettingData(
+        final ConfigEditorServletUtils.SettingData settingData = ConfigEditorServletUtils.generateSettingData(
                 pwmRequest.getPwmApplication(),
                 pwmRequest.getPwmApplication(),
                 storedConfiguration,
                 storedConfiguration,
                 pwmRequest.getLabel(),
                 pwmRequest.getLabel(),
                 pwmRequest.getLocale()
                 pwmRequest.getLocale()
-        )
         );
         );
 
 
-        final RestResultBean restResultBean = RestResultBean.withData( new LinkedHashMap<>( returnMap ) );
+        final RestResultBean restResultBean = RestResultBean.withData( settingData );
         pwmRequest.outputJsonResult( restResultBean );
         pwmRequest.outputJsonResult( restResultBean );
         return ProcessStatus.Halt;
         return ProcessStatus.Halt;
     }
     }