Skip to content

Commit eaa3215

Browse files
committed
immutable configuration values (refactoring)
1 parent 88fb485 commit eaa3215

39 files changed

+438
-399
lines changed

server/src/main/java/password/pwm/bean/PrivateKeyCertificate.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,16 @@
2020

2121
package password.pwm.bean;
2222

23+
import lombok.Value;
24+
2325
import java.io.Serializable;
2426
import java.security.PrivateKey;
2527
import java.security.cert.X509Certificate;
26-
import java.util.Collections;
2728
import java.util.List;
2829

30+
@Value
2931
public class PrivateKeyCertificate implements Serializable
3032
{
31-
private final List<X509Certificate> certificates;
32-
private final PrivateKey key;
33-
34-
public PrivateKeyCertificate( final List<X509Certificate> certificates, final PrivateKey key )
35-
{
36-
this.certificates = Collections.unmodifiableList( certificates );
37-
this.key = key;
38-
}
39-
40-
public List<X509Certificate> getCertificates( )
41-
{
42-
return Collections.unmodifiableList( certificates );
43-
}
44-
45-
public PrivateKey getKey( )
46-
{
47-
return key;
48-
}
33+
private List<X509Certificate> certificates;
34+
private PrivateKey key;
4935
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import password.pwm.error.PwmError;
3030
import password.pwm.error.PwmOperationalException;
3131
import password.pwm.error.PwmUnrecoverableException;
32-
import password.pwm.util.java.JsonUtil;
3332

3433
import java.net.URI;
3534
import java.security.cert.X509Certificate;
@@ -88,13 +87,14 @@ void store(
8887
{
8988
if ( actionName.equals( loopConfiguration.getName() ) )
9089
{
91-
final RemoteWebServiceConfiguration newConfig = JsonUtil.cloneUsingJson( loopConfiguration, RemoteWebServiceConfiguration.class );
92-
newConfig.setCertificates( certs );
90+
final RemoteWebServiceConfiguration newConfig = loopConfiguration.toBuilder()
91+
.certificates( certs )
92+
.build();
9393
newList.add( newConfig );
9494
}
9595
else
9696
{
97-
newList.add( JsonUtil.cloneUsingJson( loopConfiguration, RemoteWebServiceConfiguration.class ) );
97+
newList.add( loopConfiguration );
9898
}
9999
}
100100
final RemoteWebServiceValue newActionValue = new RemoteWebServiceValue( newList );

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,15 +484,15 @@ static XmlElement makeSettingsXmlElement( final StoredConfiguration storedConfig
484484
final StoredValue storedValue = storedConfiguration.readSetting( pwmSetting, profileID );
485485
final XmlElement settingElement = makeSettingXmlElement( pwmSetting, profileID, storedValue, pwmSecurityKey );
486486
decorateElementWithMetaData( storedConfiguration, StoredConfigItemKey.fromSetting( pwmSetting, profileID ), settingElement );
487-
settingsElement.addContent( settingsElement );
487+
settingsElement.addContent( settingElement );
488488
}
489489
}
490490
else
491491
{
492492
final StoredValue storedValue = storedConfiguration.readSetting( pwmSetting, null );
493493
final XmlElement settingElement = makeSettingXmlElement( pwmSetting, null, storedValue, pwmSecurityKey );
494494
decorateElementWithMetaData( storedConfiguration, StoredConfigItemKey.fromSetting( pwmSetting, null ), settingElement );
495-
settingsElement.addContent( settingsElement );
495+
settingsElement.addContent( settingElement );
496496
}
497497
}
498498
}

server/src/main/java/password/pwm/config/value/ActionValue.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import password.pwm.config.StoredValueEncoder;
2929
import password.pwm.config.stored.StoredConfigXmlConstants;
3030
import password.pwm.config.value.data.ActionConfiguration;
31-
import password.pwm.config.value.data.ActionConfigurationOldVersion1;
3231
import password.pwm.error.PwmOperationalException;
3332
import password.pwm.util.java.JavaHelper;
3433
import password.pwm.util.java.JsonUtil;
@@ -113,13 +112,15 @@ public ActionValue fromXmlElement(
113112
{
114113
if ( loopValueElement.getAttributeValue( StoredConfigXmlConstants.XML_ATTRIBUTE_LOCALE ) == null )
115114
{
116-
final ActionConfigurationOldVersion1 oldVersion1 = ActionConfigurationOldVersion1.parseOldConfigString( stringValue );
115+
final ActionConfiguration.ActionConfigurationOldVersion1 oldVersion1 = ActionConfiguration.ActionConfigurationOldVersion1
116+
.parseOldConfigString( stringValue );
117117
values.add( convertOldVersion1Values( oldVersion1 ) );
118118
}
119119
}
120120
else
121121
{
122-
final ActionConfigurationOldVersion1 parsedAc = JsonUtil.deserialize( stringValue, ActionConfigurationOldVersion1.class );
122+
final ActionConfiguration.ActionConfigurationOldVersion1 parsedAc = JsonUtil
123+
.deserialize( stringValue, ActionConfiguration.ActionConfigurationOldVersion1.class );
123124
if ( parsedAc != null )
124125
{
125126
final Optional<String> decodedValue = StoredValueEncoder.decode(
@@ -128,8 +129,7 @@ public ActionValue fromXmlElement(
128129
pwmSecurityKey );
129130
decodedValue.ifPresent( s ->
130131
{
131-
parsedAc.setPassword( s );
132-
values.add( convertOldVersion1Values( parsedAc ) );
132+
values.add( convertOldVersion1Values( parsedAc.toBuilder().password( s ).build() ) );
133133
} );
134134
}
135135
}
@@ -407,7 +407,7 @@ private static int figureCurrentStoredSyntax( final XmlElement settingElement )
407407
return 0;
408408
}
409409

410-
private static ActionConfiguration convertOldVersion1Values( final ActionConfigurationOldVersion1 oldAction )
410+
private static ActionConfiguration convertOldVersion1Values( final ActionConfiguration.ActionConfigurationOldVersion1 oldAction )
411411
{
412412
final ActionConfiguration.ActionConfigurationBuilder builder = ActionConfiguration.builder();
413413
builder.name( oldAction.getName() );

server/src/main/java/password/pwm/config/value/BooleanValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
public class BooleanValue implements StoredValue
4040
{
41-
private boolean value;
41+
private final boolean value;
4242

4343
public BooleanValue( final boolean value )
4444
{

server/src/main/java/password/pwm/config/value/ChallengeValue.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ public class ChallengeValue extends AbstractValue implements StoredValue
4343
private static final PwmLogger LOGGER = PwmLogger.forClass( ChallengeValue.class );
4444

4545
//locale str as key.
46-
final Map<String, List<ChallengeItemConfiguration>> values;
46+
private final Map<String, List<ChallengeItemConfiguration>> values;
4747

4848
ChallengeValue( final Map<String, List<ChallengeItemConfiguration>> values )
4949
{
50-
this.values = values;
50+
this.values = values == null ? Collections.emptyMap() : Collections.unmodifiableMap( values );
5151
}
5252

5353
public static StoredValueFactory factory( )
@@ -231,7 +231,12 @@ private static ChallengeItemConfiguration parseOldVersionString(
231231
adminDefined = false;
232232
}
233233

234-
return new ChallengeItemConfiguration( challengeText, minLength, maxLength, adminDefined );
234+
return ChallengeItemConfiguration.builder()
235+
.text( challengeText )
236+
.minLength( minLength )
237+
.maxLength( maxLength )
238+
.adminDefined( adminDefined )
239+
.build();
235240
}
236241

237242
public String toDebugString( final Locale locale )

server/src/main/java/password/pwm/config/value/CustomLinkValue.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
package password.pwm.config.value;
2222

2323
import com.google.gson.reflect.TypeToken;
24-
import password.pwm.config.CustomLinkConfiguration;
24+
import password.pwm.config.value.data.CustomLinkConfiguration;
2525
import password.pwm.config.PwmSetting;
2626
import password.pwm.config.StoredValue;
2727
import password.pwm.error.PwmOperationalException;
@@ -39,11 +39,11 @@
3939

4040
public class CustomLinkValue extends AbstractValue implements StoredValue
4141
{
42-
final List<CustomLinkConfiguration> values;
42+
private final List<CustomLinkConfiguration> values;
4343

4444
public CustomLinkValue( final List<CustomLinkConfiguration> values )
4545
{
46-
this.values = values;
46+
this.values = values == null ? Collections.emptyList() : Collections.unmodifiableList( values );
4747
}
4848

4949
public static StoredValueFactory factory( )

server/src/main/java/password/pwm/config/value/EmailValue.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@
4242
public class EmailValue extends AbstractValue implements StoredValue
4343
{
4444
//key is locale identifier
45-
final Map<String, EmailItemBean> values;
45+
private final Map<String, EmailItemBean> values;
4646

4747
EmailValue( final Map<String, EmailItemBean> values )
4848
{
49-
this.values = values;
49+
this.values = values == null ? Collections.emptyMap() : Collections.unmodifiableMap( values );
5050
}
5151

5252
public static StoredValueFactory factory( )

server/src/main/java/password/pwm/config/value/FileValue.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import password.pwm.PwmConstants;
2626
import password.pwm.config.PwmSetting;
2727
import password.pwm.config.StoredValue;
28-
import password.pwm.error.PwmOperationalException;
28+
import password.pwm.config.stored.StoredConfigXmlConstants;
2929
import password.pwm.error.PwmUnrecoverableException;
3030
import password.pwm.http.bean.ImmutableByteArray;
3131
import password.pwm.util.java.JsonUtil;
@@ -53,6 +53,8 @@ public class FileValue extends AbstractValue implements StoredValue
5353
private static final PwmLogger LOGGER = PwmLogger.forClass( FileValue.class );
5454

5555
private static final int ENCODING_LINE_LENGTH = 120;
56+
private static final String XML_ELEMENT_FILE_INFORMATION = "FileInformation";
57+
private static final String XML_ELEMENT_FILE_CONTENT = "FileContent";
5658

5759
private final Map<FileInformation, FileContent> values;
5860

@@ -61,28 +63,28 @@ public static class FileInformation implements Serializable
6163
{
6264
private String filename;
6365
private String filetype;
64-
}
66+
}
6567

6668
@Value
6769
public static class FileContent implements Serializable
6870
{
6971
private ImmutableByteArray contents;
7072

71-
72-
public static FileContent fromEncodedString( final String input )
73+
static FileContent fromEncodedString( final String input )
7374
throws IOException
7475
{
75-
final byte[] convertedBytes = StringUtil.base64Decode( input );
76+
final String whitespaceStrippedInput = StringUtil.stripAllWhitespace( input );
77+
final byte[] convertedBytes = StringUtil.base64Decode( whitespaceStrippedInput );
7678
return new FileContent( ImmutableByteArray.of( convertedBytes ) );
7779
}
7880

79-
public String toEncodedString( )
81+
String toEncodedString( )
8082
throws IOException
8183
{
8284
return StringUtil.base64Encode( contents.copyOf(), StringUtil.Base64Options.GZIP );
8385
}
8486

85-
public String sha512sum( )
87+
String sha512sum( )
8688
throws PwmUnrecoverableException
8789
{
8890
return SecureEngine.hash( new ByteArrayInputStream( contents.copyOf() ), PwmHashAlgorithm.SHA512 );
@@ -96,7 +98,7 @@ public int size( )
9698

9799
public FileValue( final Map<FileInformation, FileContent> values )
98100
{
99-
this.values = values == null ? Collections.emptyMap() : values;
101+
this.values = values == null ? Collections.emptyMap() : Collections.unmodifiableMap( values );
100102
}
101103

102104
public static StoredValueFactory factory( )
@@ -105,20 +107,19 @@ public static StoredValueFactory factory( )
105107
{
106108

107109
public FileValue fromXmlElement( final PwmSetting pwmSetting, final XmlElement settingElement, final PwmSecurityKey input )
108-
throws PwmOperationalException
109110
{
110-
final List<XmlElement> valueElements = settingElement.getChildren( "value" );
111+
final List<XmlElement> valueElements = settingElement.getChildren( StoredConfigXmlConstants.XML_ELEMENT_VALUE );
111112
final Map<FileInformation, FileContent> values = new LinkedHashMap<>();
112113
for ( final XmlElement loopValueElement : valueElements )
113114
{
114-
final Optional<XmlElement> loopFileInformation = loopValueElement.getChild( "FileInformation" );
115+
final Optional<XmlElement> loopFileInformation = loopValueElement.getChild( XML_ELEMENT_FILE_INFORMATION );
115116
if ( loopFileInformation.isPresent() )
116117
{
117118
final String loopFileInformationJson = loopFileInformation.get().getText();
118119
final FileInformation fileInformation = JsonUtil.deserialize( loopFileInformationJson,
119120
FileInformation.class );
120121

121-
final Optional<XmlElement> loopFileContentElement = loopValueElement.getChild( "FileContent" );
122+
final Optional<XmlElement> loopFileContentElement = loopValueElement.getChild( XML_ELEMENT_FILE_CONTENT );
122123
if ( loopFileContentElement.isPresent() )
123124
{
124125
final String fileContentString = loopFileContentElement.get().getText();
@@ -154,15 +155,17 @@ public List<XmlElement> toXmlValues( final String valueElementName, final Output
154155
final FileContent fileContent = entry.getValue();
155156
final XmlElement valueElement = XmlFactory.getFactory().newElement( valueElementName );
156157

157-
final XmlElement fileInformationElement = XmlFactory.getFactory().newElement( "FileInformation" );
158+
final XmlElement fileInformationElement = XmlFactory.getFactory().newElement( XML_ELEMENT_FILE_INFORMATION );
158159
fileInformationElement.addText( JsonUtil.serialize( fileInformation ) );
159160
valueElement.addContent( fileInformationElement );
160161

161-
final XmlElement fileContentElement = XmlFactory.getFactory().newElement( "FileContent" );
162-
//final String encodedLineBreaks = StringUtil.insertineBreaks( fileContent.toEncodedString(), ENCODING_LINE_LENGTH );
162+
final XmlElement fileContentElement = XmlFactory.getFactory().newElement( XML_ELEMENT_FILE_CONTENT );
163+
163164
try
164165
{
165-
fileContentElement.addText( fileContent.toEncodedString() );
166+
final String encodedLineBreaks = StringUtil.insertRepeatedLineBreaks(
167+
fileContent.toEncodedString(), ENCODING_LINE_LENGTH );
168+
fileContentElement.addText( encodedLineBreaks );
166169
}
167170
catch ( final IOException e )
168171
{
@@ -202,7 +205,7 @@ public Serializable toDebugJsonObject( final Locale locale )
202205
return ( Serializable ) asMetaData();
203206
}
204207

205-
public List<Map<String, Object>> asMetaData( )
208+
List<Map<String, Object>> asMetaData( )
206209
{
207210
final List<Map<String, Object>> output = new ArrayList<>();
208211
for ( final Map.Entry<FileInformation, FileContent> entry : this.values.entrySet() )

server/src/main/java/password/pwm/config/value/FormValue.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,11 @@
4242

4343
public class FormValue extends AbstractValue implements StoredValue
4444
{
45-
final List<FormConfiguration> values;
46-
47-
private boolean needsXmlUpdate;
45+
private final List<FormConfiguration> values;
4846

4947
public FormValue( final List<FormConfiguration> values )
5048
{
51-
this.values = values;
49+
this.values = values == null ? Collections.emptyList() : Collections.unmodifiableList( values );
5250
}
5351

5452
public static StoredValueFactory factory( )
@@ -59,14 +57,14 @@ public FormValue fromJson( final String input )
5957
{
6058
if ( input == null )
6159
{
62-
return new FormValue( Collections.<FormConfiguration>emptyList() );
60+
return new FormValue( Collections.emptyList() );
6361
}
6462
else
6563
{
6664
List<FormConfiguration> srcList = JsonUtil.deserialize( input, new TypeToken<List<FormConfiguration>>()
6765
{
6866
} );
69-
srcList = srcList == null ? Collections.<FormConfiguration>emptyList() : srcList;
67+
srcList = srcList == null ? Collections.emptyList() : srcList;
7068
while ( srcList.contains( null ) )
7169
{
7270
srcList.remove( null );
@@ -98,7 +96,6 @@ public FormValue fromXmlElement( final PwmSetting pwmSetting, final XmlElement s
9896
}
9997
}
10098
final FormValue formValue = new FormValue( values );
101-
formValue.needsXmlUpdate = oldType;
10299
return formValue;
103100
}
104101
};
@@ -156,11 +153,6 @@ public List<String> validateValue( final PwmSetting pwmSetting )
156153
return Collections.emptyList();
157154
}
158155

159-
public boolean isNeedsXmlUpdate( )
160-
{
161-
return needsXmlUpdate;
162-
}
163-
164156
public String toDebugString( final Locale locale )
165157
{
166158
if ( values != null && !values.isEmpty() )

0 commit comments

Comments
 (0)