Skip to content

Commit 937f3f8

Browse files
committed
storedconfig refactoring and correctness
1 parent eaa3215 commit 937f3f8

File tree

56 files changed

+629
-459
lines changed

Some content is hidden

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

56 files changed

+629
-459
lines changed

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
import password.pwm.util.java.StringUtil;
2929
import password.pwm.util.logging.PwmLogger;
3030

31+
import javax.net.ssl.SSLContext;
3132
import java.lang.management.ManagementFactory;
3233
import java.nio.charset.Charset;
34+
import java.security.NoSuchAlgorithmException;
3335
import java.time.Instant;
3436
import java.util.Collections;
3537
import java.util.Date;
@@ -69,6 +71,7 @@ public enum PwmAboutProperty
6971
app_secureBlockAlgorithm( null, pwmApplication -> pwmApplication.getSecureService().getDefaultBlockAlgorithm().getLabel() ),
7072
app_secureHashAlgorithm( null, pwmApplication -> pwmApplication.getSecureService().getDefaultHashAlgorithm().toString() ),
7173
app_ldapProfileCount( null, pwmApplication -> Integer.toString( pwmApplication.getConfig().getLdapProfiles().size() ) ),
74+
app_ldapConnectionCount( null, pwmApplication -> Integer.toString( pwmApplication.getLdapConnectionService().connectionCount() ) ),
7275

7376
build_Time( "Build Time", pwmApplication -> PwmConstants.BUILD_TIME ),
7477
build_Number( "Build Number", pwmApplication -> PwmConstants.BUILD_NUMBER ),
@@ -91,9 +94,10 @@ public enum PwmAboutProperty
9194
java_osName( "Operating System Name", pwmApplication -> System.getProperty( "os.name" ) ),
9295
java_osVersion( "Operating System Version", pwmApplication -> System.getProperty( "os.version" ) ),
9396
java_osArch( "Operating System Architecture", pwmApplication -> System.getProperty( "os.arch" ) ),
94-
java_randomAlgorithm( null, pwmApplication -> pwmApplication.getSecureService().pwmRandom().getAlgorithm() ),
95-
java_defaultCharset( null, pwmApplication -> Charset.defaultCharset().name() ),
97+
java_randomAlgorithm( "Random Algorithm", pwmApplication -> pwmApplication.getSecureService().pwmRandom().getAlgorithm() ),
98+
java_defaultCharset( "Default Character Set", pwmApplication -> Charset.defaultCharset().name() ),
9699
java_appServerInfo( "Java AppServer Info", pwmApplication -> pwmApplication.getPwmEnvironment().getContextManager().getServerInfo() ),
100+
java_sslVersions( "Java SSL Versions", pwmApplication -> readSslVersions() ),
97101

98102
database_driverName( null,
99103
pwmApplication -> pwmApplication.getDatabaseService().getConnectionDebugProperties().get( DatabaseService.DatabaseAboutProperty.driverName ) ),
@@ -188,4 +192,16 @@ public static Map<String, String> toStringMap( final Map<PwmAboutProperty, Strin
188192
}
189193
return Collections.unmodifiableMap( outputProps );
190194
}
195+
196+
private static String readSslVersions()
197+
{
198+
try
199+
{
200+
return String.join( " ", SSLContext.getDefault().getSupportedSSLParameters().getProtocols() );
201+
}
202+
catch ( NoSuchAlgorithmException e )
203+
{
204+
return "";
205+
}
206+
}
191207
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public void outputToLog( )
135135
return;
136136
}
137137

138-
final ComparingChangeLog changeLog = new ComparingChangeLog( StoredConfigurationFactory.newStoredConfiguration(), storedConfiguration );
138+
final ComparingChangeLog changeLog = ComparingChangeLog.create( StoredConfigurationFactory.newStoredConfiguration(), storedConfiguration );
139139
final Map<String, String> debugStrings = StoredConfigurationUtil.asDebugMap( storedConfiguration, changeLog.changedValues(), PwmConstants.DEFAULT_LOCALE );
140140
final List<Supplier<CharSequence>> outputStrings = new ArrayList<>();
141141

@@ -1129,9 +1129,7 @@ private Profile newProfileForID( final ProfileDefinition profileDefinition, fina
11291129

11301130
public StoredConfiguration getStoredConfiguration( ) throws PwmUnrecoverableException
11311131
{
1132-
final StoredConfiguration copiedStoredConfiguration = this.storedConfiguration.copy();
1133-
copiedStoredConfiguration.lock();
1134-
return copiedStoredConfiguration;
1132+
return this.storedConfiguration.copy();
11351133
}
11361134

11371135
public boolean isDevDebugMode( )

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@
3737
import java.util.Collections;
3838
import java.util.HashSet;
3939
import java.util.LinkedHashMap;
40+
import java.util.LinkedHashSet;
4041
import java.util.List;
4142
import java.util.Locale;
4243
import java.util.Map;
4344
import java.util.Optional;
4445
import java.util.Set;
46+
import java.util.TreeMap;
4547
import java.util.function.Supplier;
4648
import java.util.regex.Pattern;
4749
import java.util.regex.PatternSyntaxException;
@@ -1710,5 +1712,15 @@ private static TemplateSetAssociation associationForTempleSet(
17101712

17111713
return associationSets.iterator().next();
17121714
}
1715+
1716+
public static Set<PwmSetting> sortedByMenuLocation( final Locale locale )
1717+
{
1718+
final TreeMap<String, PwmSetting> treeMap = new TreeMap<>();
1719+
for ( final PwmSetting pwmSetting : PwmSetting.values() )
1720+
{
1721+
treeMap.put( pwmSetting.toMenuLocationDebug( null, locale ), pwmSetting );
1722+
}
1723+
return Collections.unmodifiableSet( new LinkedHashSet<>( treeMap.values() ) );
1724+
}
17131725
}
17141726

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

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

2121
package password.pwm.config;
2222

23-
import lombok.Builder;
24-
import lombok.Value;
23+
import password.pwm.config.stored.XmlOutputProcessData;
2524
import password.pwm.error.PwmException;
2625
import password.pwm.util.java.XmlElement;
2726
import password.pwm.util.secure.PwmSecurityKey;
@@ -32,15 +31,8 @@
3231

3332
public interface StoredValue extends Serializable
3433
{
35-
@Value
36-
@Builder
37-
class OutputConfiguration
38-
{
39-
private StoredValueEncoder.SecureOutputMode secureOutputMode;
40-
private PwmSecurityKey pwmSecurityKey;
41-
}
4234

43-
List<XmlElement> toXmlValues( String valueElementName, OutputConfiguration outputConfiguration );
35+
List<XmlElement> toXmlValues( String valueElementName, XmlOutputProcessData xmlOutputProcessData );
4436

4537
Object toNativeObject( );
4638

server/src/main/java/password/pwm/config/stored/ComparingChangeLog.java

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

2121
package password.pwm.config.stored;
2222

23+
import password.pwm.config.StoredValue;
2324
import password.pwm.error.PwmUnrecoverableException;
2425
import password.pwm.util.java.TimeDuration;
2526
import password.pwm.util.logging.PwmLogger;
@@ -28,23 +29,32 @@
2829
import java.util.Collections;
2930
import java.util.HashSet;
3031
import java.util.Objects;
32+
import java.util.Optional;
3133
import java.util.Set;
3234
import java.util.stream.Collectors;
3335

3436
public class ComparingChangeLog implements ConfigChangeLog
3537
{
3638
public static final PwmLogger LOGGER = PwmLogger.forClass( ComparingChangeLog.class );
3739

38-
private final StoredConfiguration originalConfiguration;
39-
private final StoredConfiguration modifiedConfiguration;
40+
private final StoredConfigurationSpi originalConfiguration;
41+
private final StoredConfigurationSpi modifiedConfiguration;
4042

41-
public ComparingChangeLog(
43+
private ComparingChangeLog(
4244
final StoredConfiguration originalConfiguration,
4345
final StoredConfiguration modifiedConfiguration
4446
)
4547
{
46-
this.originalConfiguration = originalConfiguration;
47-
this.modifiedConfiguration = modifiedConfiguration;
48+
this.originalConfiguration = ( StoredConfigurationSpi ) originalConfiguration;
49+
this.modifiedConfiguration = ( StoredConfigurationSpi ) modifiedConfiguration;
50+
}
51+
52+
public static ComparingChangeLog create(
53+
final StoredConfiguration originalConfiguration,
54+
final StoredConfiguration modifiedConfiguration
55+
)
56+
{
57+
return new ComparingChangeLog( originalConfiguration, modifiedConfiguration );
4858
}
4959

5060
@Override
@@ -59,9 +69,9 @@ public Set<StoredConfigItemKey> changedValues ()
5969
final Set<StoredConfigItemKey> deltaReferences = interestedReferences.parallelStream()
6070
.filter( reference ->
6171
{
62-
final String hash = StoredConfigurationUtil.valueForReference( originalConfiguration, reference ).valueHash();
63-
final String hash2 = StoredConfigurationUtil.valueForReference( modifiedConfiguration, reference ).valueHash();
64-
return !Objects.equals( hash, hash2 );
72+
final Optional<String> hash = originalConfiguration.readStoredValue( reference ).map( StoredValue::valueHash );
73+
final Optional<String> hash2 = modifiedConfiguration.readStoredValue( reference ).map( StoredValue::valueHash );
74+
return hash.isPresent() && hash2.isPresent() && !Objects.equals( hash.get(), hash2.get() );
6575
}
6676
).collect( Collectors.toSet() );
6777

server/src/main/java/password/pwm/config/stored/ConfigurationCleaner.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import password.pwm.config.option.RecoveryMinLifetimeOption;
3030
import password.pwm.config.option.WebServiceUsage;
3131
import password.pwm.config.value.OptionListValue;
32+
import password.pwm.config.value.StoredValueEncoder;
3233
import password.pwm.config.value.StringArrayValue;
3334
import password.pwm.config.value.StringValue;
3435
import password.pwm.error.PwmUnrecoverableException;
@@ -227,17 +228,23 @@ public void accept( final XmlDocument xmlDocument ) throws PwmUnrecoverableExcep
227228
}
228229
}
229230

230-
private static void attachStringSettingElement( final XmlDocument xmlDocument, final PwmSetting pwmSetting, final String stringValue )
231+
private static void attachStringSettingElement(
232+
final XmlDocument xmlDocument,
233+
final PwmSetting pwmSetting,
234+
final String stringValue
235+
)
231236
throws PwmUnrecoverableException
232237
{
233238
final StoredConfigurationFactory.XmlInputDocumentReader inputDocumentReader = new StoredConfigurationFactory.XmlInputDocumentReader( xmlDocument );
234239

235240
final PwmSecurityKey pwmSecurityKey = inputDocumentReader.getKey();
236241

237242
final XmlElement settingElement = StoredConfigurationFactory.XmlOutputHandler.makeSettingXmlElement(
243+
null,
238244
pwmSetting,
239245
null,
240-
new StringValue( stringValue ), pwmSecurityKey );
246+
new StringValue( stringValue ),
247+
XmlOutputProcessData.builder().storedValueEncoderMode( StoredValueEncoder.Mode.PLAIN ).pwmSecurityKey( pwmSecurityKey ).build() );
241248
final Optional<XmlElement> settingsElement = xmlDocument.getRootElement().getChild( StoredConfigXmlConstants.XML_ELEMENT_SETTING );
242249
settingsElement.ifPresent( xmlElement -> xmlElement.addContent( settingElement ) );
243250
}
@@ -278,7 +285,7 @@ public void accept( final XmlDocument xmlDocument ) throws PwmUnrecoverableExcep
278285

279286
final List<String> existingValues = new ArrayList<>();
280287
{
281-
final Optional<StoredConfigData.ValueAndMetaTuple> valueAndMetaTuple = documentReader.readSetting( PwmSetting.APP_PROPERTY_OVERRIDES, null );
288+
final Optional<StoredConfigData.ValueAndMetaCarrier> valueAndMetaTuple = documentReader.readSetting( PwmSetting.APP_PROPERTY_OVERRIDES, null );
282289
valueAndMetaTuple.ifPresent( ( t ) -> existingValues.addAll( ( List<String> ) t.getValue().toNativeObject() ) );
283290
}
284291
existingValues.add( newValue );
@@ -302,9 +309,11 @@ private static void rewriteAppPropertySettingElement( final XmlDocument xmlDocum
302309
final PwmSecurityKey pwmSecurityKey = inputDocumentReader.getKey();
303310

304311
final XmlElement settingElement = StoredConfigurationFactory.XmlOutputHandler.makeSettingXmlElement(
312+
null,
305313
PwmSetting.APP_PROPERTY_OVERRIDES,
306314
null,
307-
new StringArrayValue( newValues ), pwmSecurityKey );
315+
new StringArrayValue( newValues ),
316+
XmlOutputProcessData.builder().storedValueEncoderMode( StoredValueEncoder.Mode.PLAIN ).pwmSecurityKey( pwmSecurityKey ).build() );
308317
final Optional<XmlElement> settingsElement = xmlDocument.getRootElement().getChild( StoredConfigXmlConstants.XML_ELEMENT_SETTING );
309318
settingsElement.ifPresent( ( s ) -> s.addContent( settingElement ) );
310319
}

server/src/main/java/password/pwm/config/stored/ConfigurationProperty.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum ConfigurationProperty
2727
LDAP_TEMPLATE( "configTemplate" ),
2828
NOTES( "notes" ),
2929
PASSWORD_HASH( "configPasswordHash" ),
30+
STORE_PLAINTEXT_VALUES( "storePlaintextValues" ),
3031
SAVE_CONFIG_ON_START( "saveConfigOnStart" ),
3132
MODIFICATION_TIMESTAMP( "modificationTimestamp" ),
3233
IMPORT_LDAP_CERTIFICATES( "importLdapCertificates" ),;

server/src/main/java/password/pwm/config/stored/ConfigurationReader.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,6 @@ public Configuration getConfiguration( ) throws PwmUnrecoverableException
109109
? StoredConfigurationFactory.newStoredConfiguration()
110110
: this.storedConfiguration;
111111
configuration = new Configuration( newStoredConfig );
112-
if ( storedConfiguration != null )
113-
{
114-
storedConfiguration.lock();
115-
}
116112
}
117113
return configuration;
118114
}

server/src/main/java/password/pwm/config/stored/StoredConfigData.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
import password.pwm.config.StoredValue;
2727

2828
import java.time.Instant;
29+
import java.util.Collection;
2930
import java.util.Map;
31+
import java.util.stream.Collectors;
3032

3133
@Value
3234
@Builder( toBuilder = true )
@@ -45,10 +47,24 @@ class StoredConfigData
4547
private Map<StoredConfigItemKey, ValueMetaData> metaDatas;
4648

4749
@Value
48-
static class ValueAndMetaTuple
50+
static class ValueAndMetaCarrier
4951
{
5052
private final StoredConfigItemKey key;
5153
private final StoredValue value;
5254
private final ValueMetaData metaData;
5355
}
56+
57+
static Map<StoredConfigItemKey, ValueMetaData> carrierAsMetaDataMap( final Collection<ValueAndMetaCarrier> input )
58+
{
59+
return input.stream()
60+
.filter( ( t ) -> t.getKey() != null && t.getMetaData() != null )
61+
.collect( Collectors.toMap( StoredConfigData.ValueAndMetaCarrier::getKey, StoredConfigData.ValueAndMetaCarrier::getMetaData ) );
62+
}
63+
64+
static Map<StoredConfigItemKey, StoredValue> carrierAsStoredValueMap( final Collection<ValueAndMetaCarrier> input )
65+
{
66+
return input.stream()
67+
.filter( ( t ) -> t.getKey() != null && t.getValue() != null )
68+
.collect( Collectors.toMap( StoredConfigData.ValueAndMetaCarrier::getKey, StoredConfigData.ValueAndMetaCarrier::getValue ) );
69+
}
5470
}

server/src/main/java/password/pwm/config/stored/StoredConfigItemKey.java

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import lombok.Value;
2424
import password.pwm.PwmConstants;
2525
import password.pwm.config.PwmSetting;
26+
import password.pwm.i18n.Config;
2627
import password.pwm.i18n.PwmLocaleBundle;
28+
import password.pwm.util.i18n.LocaleHelper;
2729
import password.pwm.util.java.JavaHelper;
2830
import password.pwm.util.java.StringUtil;
2931

@@ -36,11 +38,24 @@ public class StoredConfigItemKey implements Serializable, Comparable
3638
{
3739
public enum RecordType
3840
{
39-
SETTING,
40-
LOCALE_BUNDLE,
41-
PROPERTY,
41+
SETTING( "Setting" ),
42+
LOCALE_BUNDLE ( "Localization" ),
43+
PROPERTY ( "Property" ),;
44+
45+
private final String label;
46+
47+
RecordType( final String label )
48+
{
49+
this.label = label;
50+
}
51+
52+
public String getLabel()
53+
{
54+
return label;
55+
}
4256
}
4357

58+
4459
private final RecordType recordType;
4560
private final String recordID;
4661
private final String profileID;
@@ -70,6 +85,20 @@ static StoredConfigItemKey fromConfigurationProperty( final ConfigurationPropert
7085
return new StoredConfigItemKey( RecordType.PROPERTY, configurationProperty.getKey(), null );
7186
}
7287

88+
public boolean isValid()
89+
{
90+
try
91+
{
92+
validate();
93+
return true;
94+
}
95+
catch ( final IllegalStateException e )
96+
{
97+
/* ignore */
98+
}
99+
return false;
100+
}
101+
73102
public void validate()
74103
{
75104
switch ( recordType )
@@ -93,7 +122,7 @@ else if ( !pwmSetting.getCategory().hasProfiles() && hasProfileID )
93122
{
94123
Objects.requireNonNull( profileID, "profileID is required when recordType is LOCALE_BUNDLE" );
95124
final PwmLocaleBundle pwmLocaleBundle = toLocaleBundle();
96-
if ( !pwmLocaleBundle.getKeys().contains( profileID ) )
125+
if ( !pwmLocaleBundle.getDisplayKeys().contains( profileID ) )
97126
{
98127
throw new IllegalStateException( "key '" + profileID + "' is unrecognized for locale bundle " + pwmLocaleBundle.name() );
99128
}
@@ -117,19 +146,22 @@ public String toString()
117146

118147
public String toString( final Locale locale )
119148
{
149+
final String separator = LocaleHelper.getLocalizedMessage( locale, Config.Display_SettingNavigationSeparator, null );
150+
120151
switch ( recordType )
121152
{
122153
case SETTING:
123-
return "Setting-" + toPwmSetting().toMenuLocationDebug( profileID, locale );
154+
return recordType.getLabel() + separator + toPwmSetting().toMenuLocationDebug( profileID, locale );
124155

125156
case PROPERTY:
126-
return "Property-"
127-
+ this.getRecordID();
157+
return recordType.getLabel() + separator + this.getRecordID();
128158

129159
case LOCALE_BUNDLE:
130-
return "LocaleBundle-"
160+
toLocaleBundle().getKey();
161+
return recordType.getLabel()
162+
+ separator
131163
+ this.getRecordID()
132-
+ "-"
164+
+ separator
133165
+ this.getProfileID();
134166

135167
default:

0 commit comments

Comments
 (0)