Skip to content

Commit 7ceb429

Browse files
committed
immutable storedconfigimpl
1 parent 0b93c62 commit 7ceb429

File tree

75 files changed

+1037
-1096
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1037
-1096
lines changed

server/src/main/java/password/pwm/PwmApplication.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import password.pwm.bean.UserIdentity;
2929
import password.pwm.config.Configuration;
3030
import password.pwm.config.PwmSetting;
31+
import password.pwm.config.stored.StoredConfiguration;
32+
import password.pwm.config.stored.StoredConfigurationUtil;
3133
import password.pwm.error.ErrorInformation;
3234
import password.pwm.error.PwmError;
3335
import password.pwm.error.PwmException;
@@ -101,8 +103,8 @@
101103
import java.util.Locale;
102104
import java.util.Map;
103105
import java.util.concurrent.ExecutorService;
104-
105106
import java.util.concurrent.atomic.AtomicInteger;
107+
import java.util.function.Supplier;
106108

107109
/**
108110
* A repository for objects common to the servlet context. A singleton
@@ -307,20 +309,18 @@ private void postInitTasks( )
307309

308310
try
309311
{
310-
pwmEnvironment.getConfig().outputToLog();
312+
outputConfigurationToLog( this );
311313
}
312314
catch ( PwmException e )
313315
{
314316
LOGGER.error( "error outputting log to debug: " + e.getMessage() );
315317
}
316-
317-
318-
318+
319319
// detect if config has been modified since previous startup
320320
try
321321
{
322322
final String previousHash = readAppAttribute( AppAttribute.CONFIG_HASH, String.class );
323-
final String currentHash = pwmEnvironment.getConfig().configurationHash();
323+
final String currentHash = pwmEnvironment.getConfig().configurationHash( this.getSecureService() );
324324
if ( previousHash == null || !previousHash.equals( currentHash ) )
325325
{
326326
writeAppAttribute( AppAttribute.CONFIG_HASH, currentHash );
@@ -520,6 +520,31 @@ private static void outputTomcatConf( final PwmApplication pwmApplication ) thro
520520
}
521521
}
522522

523+
private static void outputConfigurationToLog( final PwmApplication pwmApplication )
524+
throws PwmUnrecoverableException
525+
{
526+
if ( !LOGGER.isEnabled( PwmLogLevel.TRACE ) )
527+
{
528+
return;
529+
}
530+
531+
final StoredConfiguration storedConfiguration = pwmApplication.getConfig().getStoredConfiguration();
532+
final Map<String, String> debugStrings = StoredConfigurationUtil.makeDebugMap( storedConfiguration, storedConfiguration.modifiedItems(), PwmConstants.DEFAULT_LOCALE );
533+
final List<Supplier<CharSequence>> outputStrings = new ArrayList<>();
534+
535+
for ( final Map.Entry<String, String> entry : debugStrings.entrySet() )
536+
{
537+
final String spacedValue = entry.getValue().replace( "\n", "\n " );
538+
final String output = " " + entry.getKey() + "\n " + spacedValue + "\n";
539+
outputStrings.add( () -> output );
540+
}
541+
542+
LOGGER.trace( () -> "--begin current configuration output--" );
543+
outputStrings.forEach( LOGGER::trace );
544+
LOGGER.trace( () -> "--end current configuration output--" );
545+
}
546+
547+
523548
public String getInstanceID( )
524549
{
525550
return instanceID;

server/src/main/java/password/pwm/PwmConstants.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.apache.commons.csv.CSVFormat;
2424
import password.pwm.util.java.JsonUtil;
2525
import password.pwm.util.java.StringUtil;
26-
import password.pwm.util.secure.PwmHashAlgorithm;
2726

2827
import java.io.InputStream;
2928
import java.net.URL;
@@ -119,9 +118,6 @@ public abstract class PwmConstants
119118
public static final String REQUEST_ATTR_FORGOTTEN_PW_AVAIL_TOKEN_DEST_CACHE = "ForgottenPw-AvailableTokenDestCache";
120119
public static final String REQUEST_ATTR_PWM_APPLICATION = "PwmApplication";
121120

122-
public static final PwmHashAlgorithm SETTING_CHECKSUM_HASH_METHOD = PwmHashAlgorithm.SHA256;
123-
124-
125121
public static final String LOG_REMOVED_VALUE_REPLACEMENT = readPwmConstantsBundle( "log.removedValue" );
126122

127123
public static final Collection<Locale> INCLUDED_LOCALES;

server/src/main/java/password/pwm/PwmEnvironment.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ public enum ApplicationParameter
7474
AppliancePort,
7575
ApplianceHostnameFile,
7676
ApplianceTokenFile,
77-
InstanceID,;
77+
InstanceID,
78+
InitConsoleLogLevel,;
7879

7980
public static ApplicationParameter forString( final String input )
8081
{
@@ -317,7 +318,7 @@ public static Map<ApplicationParameter, String> readApplicationParmsFromSystem(
317318
final String rawValue = readValueFromSystem( EnvironmentParameter.applicationParamFile, contextName );
318319
if ( rawValue != null )
319320
{
320-
return parseApplicationParamValueParameter( rawValue );
321+
return readAppParametersFromPath( rawValue );
321322
}
322323
return Collections.emptyMap();
323324
}
@@ -393,7 +394,7 @@ public static Collection<ApplicationFlag> parseApplicationFlagValueParameter( fi
393394
return returnFlags;
394395
}
395396

396-
public static Map<ApplicationParameter, String> parseApplicationParamValueParameter( final String input )
397+
public static Map<ApplicationParameter, String> readAppParametersFromPath( final String input )
397398
{
398399
if ( input == null )
399400
{

server/src/main/java/password/pwm/config/Configuration.java

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,8 @@
4545
import password.pwm.config.profile.PwmPasswordRule;
4646
import password.pwm.config.profile.SetupOtpProfile;
4747
import password.pwm.config.profile.UpdateProfileProfile;
48-
import password.pwm.config.stored.ComparingChangeLog;
4948
import password.pwm.config.stored.StoredConfigItemKey;
5049
import password.pwm.config.stored.StoredConfiguration;
51-
import password.pwm.config.stored.StoredConfigurationFactory;
5250
import password.pwm.config.stored.StoredConfigurationUtil;
5351
import password.pwm.config.value.BooleanValue;
5452
import password.pwm.config.value.CustomLinkValue;
@@ -80,6 +78,7 @@
8078
import password.pwm.util.logging.PwmLogger;
8179
import password.pwm.util.secure.PwmRandom;
8280
import password.pwm.util.secure.PwmSecurityKey;
81+
import password.pwm.util.secure.SecureService;
8382

8483
import java.lang.reflect.InvocationTargetException;
8584
import java.security.cert.X509Certificate;
@@ -97,7 +96,6 @@
9796
import java.util.Optional;
9897
import java.util.Set;
9998
import java.util.TreeMap;
100-
import java.util.function.Supplier;
10199

102100
/**
103101
* @author Jason D. Rivard
@@ -110,8 +108,6 @@ public class Configuration implements SettingReader
110108

111109
private DataCache dataCache = new DataCache();
112110

113-
private String cashedConfigurationHash;
114-
115111
public Configuration( final StoredConfiguration storedConfiguration )
116112
{
117113
this.storedConfiguration = storedConfiguration;
@@ -127,30 +123,6 @@ public static void deprecatedSettingException( final PwmSetting pwmSetting, fina
127123
}
128124
}
129125

130-
public void outputToLog( )
131-
throws PwmUnrecoverableException
132-
{
133-
if ( !LOGGER.isEnabled( PwmLogLevel.TRACE ) )
134-
{
135-
return;
136-
}
137-
138-
final ComparingChangeLog changeLog = ComparingChangeLog.create( StoredConfigurationFactory.newStoredConfiguration(), storedConfiguration );
139-
final Map<String, String> debugStrings = StoredConfigurationUtil.asDebugMap( storedConfiguration, changeLog.changedValues(), PwmConstants.DEFAULT_LOCALE );
140-
final List<Supplier<CharSequence>> outputStrings = new ArrayList<>();
141-
142-
for ( final Map.Entry<String, String> entry : debugStrings.entrySet() )
143-
{
144-
final String spacedValue = entry.getValue().replace( "\n", "\n " );
145-
final String output = " " + entry.getKey() + "\n " + spacedValue + "\n";
146-
outputStrings.add( () -> output );
147-
}
148-
149-
LOGGER.trace( () -> "--begin current configuration output--" );
150-
outputStrings.forEach( LOGGER::trace );
151-
LOGGER.trace( () -> "--end current configuration output--" );
152-
}
153-
154126
public List<FormConfiguration> readSettingAsForm( final PwmSetting setting )
155127
{
156128
final StoredValue value = readStoredValue( setting );
@@ -647,7 +619,7 @@ protected PwmPasswordPolicy initPasswordPolicy( final String profile, final Loca
647619

648620
// set case sensitivity
649621
final String caseSensitivitySetting = JavaTypeConverter.valueToString( storedConfiguration.readSetting(
650-
PwmSetting.PASSWORD_POLICY_CASE_SENSITIVITY ) );
622+
PwmSetting.PASSWORD_POLICY_CASE_SENSITIVITY, null ) );
651623
if ( !"read".equals( caseSensitivitySetting ) )
652624
{
653625
passwordPolicySettings.put( PwmPasswordRule.CaseSensitive.getKey(), caseSensitivitySetting );
@@ -678,7 +650,7 @@ public String readSettingAsLocalizedString( final PwmSetting setting, final Loca
678650

679651
public boolean isDefaultValue( final PwmSetting pwmSetting )
680652
{
681-
return storedConfiguration.isDefaultValue( pwmSetting );
653+
return storedConfiguration.isDefaultValue( pwmSetting, null );
682654
}
683655

684656
public Collection<Locale> localesForSetting( final PwmSetting setting )
@@ -716,7 +688,7 @@ public boolean readSettingAsBoolean( final PwmSetting setting )
716688

717689
public Map<FileValue.FileInformation, FileValue.FileContent> readSettingAsFile( final PwmSetting setting )
718690
{
719-
final FileValue fileValue = ( FileValue ) storedConfiguration.readSetting( setting );
691+
final FileValue fileValue = ( FileValue ) storedConfiguration.readSetting( setting, null );
720692
return ( Map ) fileValue.toNativeObject();
721693
}
722694

@@ -1013,7 +985,7 @@ private StoredValue readStoredValue( final PwmSetting setting )
1013985
return dataCache.settings.get( setting );
1014986
}
1015987

1016-
final StoredValue readValue = storedConfiguration.readSetting( setting );
988+
final StoredValue readValue = storedConfiguration.readSetting( setting, null );
1017989
dataCache.settings.put( setting, readValue );
1018990
return readValue;
1019991
}
@@ -1127,30 +1099,26 @@ private Profile newProfileForID( final ProfileDefinition profileDefinition, fina
11271099
return profileFactory.makeFromStoredConfiguration( storedConfiguration, profileID );
11281100
}
11291101

1130-
public StoredConfiguration getStoredConfiguration( ) throws PwmUnrecoverableException
1102+
public StoredConfiguration getStoredConfiguration( )
11311103
{
1132-
return this.storedConfiguration.copy();
1104+
return this.storedConfiguration;
11331105
}
11341106

11351107
public boolean isDevDebugMode( )
11361108
{
11371109
return Boolean.parseBoolean( readAppProperty( AppProperty.LOGGING_DEV_OUTPUT ) );
11381110
}
11391111

1140-
public String configurationHash( )
1112+
public String configurationHash( final SecureService secureService )
11411113
throws PwmUnrecoverableException
11421114
{
1143-
if ( this.cashedConfigurationHash == null )
1144-
{
1145-
this.cashedConfigurationHash = storedConfiguration.settingChecksum();
1146-
}
1147-
return cashedConfigurationHash;
1115+
return storedConfiguration.valueHash();
11481116
}
11491117

11501118
public Set<PwmSetting> nonDefaultSettings( )
11511119
{
11521120
final Set<PwmSetting> returnSet = new LinkedHashSet<>();
1153-
for ( final StoredConfigItemKey key : this.storedConfiguration.modifiedSettings() )
1121+
for ( final StoredConfigItemKey key : this.storedConfiguration.modifiedItems() )
11541122
{
11551123
if ( key.getRecordType() == StoredConfigItemKey.RecordType.SETTING )
11561124
{
@@ -1166,7 +1134,6 @@ public CertificateMatchingMode readCertificateMatchingMode()
11661134
return mode == null
11671135
? CertificateMatchingMode.CA_ONLY
11681136
: mode;
1169-
11701137
}
11711138

11721139
public Optional<PeopleSearchProfile> getPublicPeopleSearchProfile()

server/src/main/java/password/pwm/config/SettingUIFunction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
package password.pwm.config;
2222

23-
import password.pwm.config.stored.StoredConfiguration;
23+
import password.pwm.config.stored.StoredConfigurationModifier;
2424
import password.pwm.http.PwmRequest;
2525

2626
import java.io.Serializable;
@@ -29,7 +29,7 @@ public interface SettingUIFunction
2929
{
3030
Serializable provideFunction(
3131
PwmRequest pwmRequest,
32-
StoredConfiguration storedConfiguration,
32+
StoredConfigurationModifier modifier,
3333
PwmSetting setting,
3434
String profile,
3535
String extraData

server/src/main/java/password/pwm/config/StoredValue.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131

3232
public interface StoredValue extends Serializable
3333
{
34-
3534
List<XmlElement> toXmlValues( String valueElementName, XmlOutputProcessData xmlOutputProcessData );
3635

3736
Object toNativeObject( );
@@ -52,5 +51,5 @@ StoredValue fromXmlElement( PwmSetting pwmSetting, XmlElement settingElement, Pw
5251
throws PwmException;
5352
}
5453

55-
String valueHash( );
54+
String valueHash();
5655
}

server/src/main/java/password/pwm/config/function/AbstractUriCertImportFunction.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import password.pwm.config.Configuration;
2525
import password.pwm.config.PwmSetting;
2626
import password.pwm.config.SettingUIFunction;
27-
import password.pwm.config.stored.StoredConfiguration;
27+
import password.pwm.config.stored.StoredConfigurationModifier;
2828
import password.pwm.config.value.X509CertificateValue;
2929
import password.pwm.error.ErrorInformation;
3030
import password.pwm.error.PwmError;
@@ -45,7 +45,7 @@ abstract class AbstractUriCertImportFunction implements SettingUIFunction
4545
@Override
4646
public String provideFunction(
4747
final PwmRequest pwmRequest,
48-
final StoredConfiguration storedConfiguration,
48+
final StoredConfigurationModifier modifier,
4949
final PwmSetting setting,
5050
final String profile,
5151
final String extraData )
@@ -54,17 +54,17 @@ public String provideFunction(
5454
final PwmSession pwmSession = pwmRequest.getPwmSession();
5555
final List<X509Certificate> certs;
5656

57-
final String urlString = getUri( storedConfiguration, setting, profile, extraData );
57+
final String urlString = getUri( modifier, setting, profile, extraData );
5858
try
5959
{
6060
final URI uri = URI.create( urlString );
6161
if ( "https".equalsIgnoreCase( uri.getScheme() ) )
6262
{
63-
certs = X509Utils.readRemoteHttpCertificates( pwmRequest.getPwmApplication(), pwmSession.getLabel(), uri, new Configuration( storedConfiguration ) );
63+
certs = X509Utils.readRemoteHttpCertificates( pwmRequest.getPwmApplication(), pwmSession.getLabel(), uri, new Configuration( modifier.newStoredConfiguration() ) );
6464
}
6565
else
6666
{
67-
final Configuration configuration = new Configuration( storedConfiguration );
67+
final Configuration configuration = new Configuration( modifier.newStoredConfiguration() );
6868
certs = X509Utils.readRemoteCertificates( URI.create( urlString ), configuration );
6969
}
7070
}
@@ -80,7 +80,7 @@ public String provideFunction(
8080

8181

8282
final UserIdentity userIdentity = pwmSession.isAuthenticated() ? pwmSession.getUserInfo().getUserIdentity() : null;
83-
store( certs, storedConfiguration, setting, profile, extraData, userIdentity );
83+
store( certs, modifier, setting, profile, extraData, userIdentity );
8484

8585
final StringBuffer returnStr = new StringBuffer();
8686
for ( final X509Certificate loopCert : certs )
@@ -91,12 +91,18 @@ public String provideFunction(
9191
return returnStr.toString();
9292
}
9393

94-
abstract String getUri( StoredConfiguration storedConfiguration, PwmSetting pwmSetting, String profile, String extraData ) throws PwmOperationalException;
94+
abstract String getUri(
95+
StoredConfigurationModifier modifier,
96+
PwmSetting pwmSetting,
97+
String profile,
98+
String extraData
99+
)
100+
throws PwmOperationalException, PwmUnrecoverableException;
95101

96102

97103
void store(
98104
final List<X509Certificate> certs,
99-
final StoredConfiguration storedConfiguration,
105+
final StoredConfigurationModifier storedConfiguration,
100106
final PwmSetting pwmSetting,
101107
final String profile,
102108
final String extraData,

0 commit comments

Comments
 (0)