Skip to content

Commit 74cd802

Browse files
committed
add basic auth header support to remote web service client and config
1 parent 7d1e647 commit 74cd802

32 files changed

+692
-450
lines changed

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

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

3434
public interface StoredValue extends Serializable
3535
{
36-
List<Element> toXmlValues( String valueElementName );
36+
List<Element> toXmlValues( String valueElementName, PwmSecurityKey pwmSecurityKey );
3737

3838
Object toNativeObject( );
3939

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -997,7 +997,7 @@ else if ( setting.getSyntax() == PwmSettingSyntax.NAMED_SECRET )
997997
}
998998
else
999999
{
1000-
settingElement.addContent( value.toXmlValues( "value" ) );
1000+
settingElement.addContent( value.toXmlValues( "value", getKey() ) );
10011001
}
10021002

10031003

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,26 @@
2222

2323
package password.pwm.config.value;
2424

25+
import lombok.Value;
2526
import password.pwm.PwmConstants;
2627
import password.pwm.config.StoredValue;
28+
import password.pwm.error.ErrorInformation;
29+
import password.pwm.error.PwmError;
30+
import password.pwm.error.PwmOperationalException;
2731
import password.pwm.error.PwmUnrecoverableException;
2832
import password.pwm.util.java.JsonUtil;
33+
import password.pwm.util.secure.PwmBlockAlgorithm;
34+
import password.pwm.util.secure.PwmRandom;
35+
import password.pwm.util.secure.PwmSecurityKey;
2936
import password.pwm.util.secure.SecureEngine;
3037

3138
import java.io.Serializable;
3239
import java.util.Locale;
3340

3441
public abstract class AbstractValue implements StoredValue
3542
{
43+
static final String ENC_PW_PREFIX = "ENC-PW:";
44+
3645
public String toString( )
3746
{
3847
return toDebugString( null );
@@ -66,4 +75,68 @@ public String valueHash( ) throws PwmUnrecoverableException
6675
{
6776
return SecureEngine.hash( JsonUtil.serialize( ( Serializable ) this.toNativeObject() ), PwmConstants.SETTING_CHECKSUM_HASH_METHOD );
6877
}
78+
79+
static String decryptPwValue( final String input, final PwmSecurityKey pwmSecurityKey ) throws PwmOperationalException
80+
{
81+
if ( input == null )
82+
{
83+
return "";
84+
}
85+
86+
if ( input.startsWith( ENC_PW_PREFIX ) )
87+
{
88+
try
89+
{
90+
final String pwValueSuffix = input.substring( ENC_PW_PREFIX.length(), input.length() );
91+
final String decrpytedValue = SecureEngine.decryptStringValue( pwValueSuffix, pwmSecurityKey, PwmBlockAlgorithm.CONFIG );
92+
final StoredPwData storedPwData = JsonUtil.deserialize( decrpytedValue, StoredPwData.class );
93+
return storedPwData.getValue();
94+
}
95+
catch ( Exception e )
96+
{
97+
final String errorMsg = "unable to decrypt password value for setting: " + e.getMessage();
98+
final ErrorInformation errorInfo = new ErrorInformation( PwmError.CONFIG_FORMAT_ERROR, errorMsg );
99+
throw new PwmOperationalException( errorInfo );
100+
}
101+
}
102+
103+
return input;
104+
}
105+
106+
static String encryptPwValue( final String input, final PwmSecurityKey pwmSecurityKey )
107+
throws PwmOperationalException
108+
{
109+
if ( input == null )
110+
{
111+
return "";
112+
}
113+
114+
if ( !input.startsWith( ENC_PW_PREFIX ) )
115+
{
116+
try
117+
{
118+
final String salt = PwmRandom.getInstance().alphaNumericString( 32 );
119+
final StoredPwData storedPwData = new StoredPwData( salt, input );
120+
final String jsonData = JsonUtil.serialize( storedPwData );
121+
final String encryptedValue = SecureEngine.encryptToString( jsonData, pwmSecurityKey, PwmBlockAlgorithm.CONFIG );
122+
return ENC_PW_PREFIX + encryptedValue;
123+
}
124+
catch ( Exception e )
125+
{
126+
final String errorMsg = "unable to encrypt password value for setting: " + e.getMessage();
127+
final ErrorInformation errorInfo = new ErrorInformation( PwmError.CONFIG_FORMAT_ERROR, errorMsg );
128+
throw new PwmOperationalException( errorInfo );
129+
}
130+
}
131+
132+
return input;
133+
}
134+
135+
@Value
136+
static class StoredPwData implements Serializable
137+
{
138+
private String salt;
139+
private String value;
140+
}
141+
69142
}

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

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@
2424

2525
import com.google.gson.reflect.TypeToken;
2626
import org.jdom2.Element;
27+
import password.pwm.PwmConstants;
2728
import password.pwm.config.PwmSetting;
2829
import password.pwm.config.PwmSettingSyntax;
2930
import password.pwm.config.StoredValue;
3031
import password.pwm.config.value.data.ActionConfiguration;
3132
import password.pwm.error.PwmOperationalException;
3233
import password.pwm.util.java.JavaHelper;
3334
import password.pwm.util.java.JsonUtil;
35+
import password.pwm.util.java.StringUtil;
36+
import password.pwm.util.logging.PwmLogger;
3437
import password.pwm.util.secure.PwmSecurityKey;
3538
import password.pwm.util.secure.X509Utils;
3639

40+
import java.io.Serializable;
3741
import java.security.cert.X509Certificate;
3842
import java.util.ArrayList;
3943
import java.util.Collections;
@@ -45,6 +49,8 @@
4549

4650
public class ActionValue extends AbstractValue implements StoredValue
4751
{
52+
private static final PwmLogger LOGGER = PwmLogger.forClass( ActionValue.class );
53+
4854
final List<ActionConfiguration> values;
4955

5056
public ActionValue( final List<ActionConfiguration> values )
@@ -82,7 +88,7 @@ public ActionValue fromJson( final String input )
8288

8389
public ActionValue fromXmlElement(
8490
final Element settingElement,
85-
final PwmSecurityKey input
91+
final PwmSecurityKey pwmSecurityKey
8692
)
8793
throws PwmOperationalException
8894
{
@@ -105,7 +111,9 @@ public ActionValue fromXmlElement(
105111
}
106112
else
107113
{
108-
values.add( JsonUtil.deserialize( value, ActionConfiguration.class ) );
114+
final ActionConfiguration parsedAc = JsonUtil.deserialize( value, ActionConfiguration.class );
115+
parsedAc.setPassword( decryptPwValue( parsedAc.getPassword(), pwmSecurityKey ) );
116+
values.add( parsedAc );
109117
}
110118
}
111119
}
@@ -114,13 +122,23 @@ public ActionValue fromXmlElement(
114122
};
115123
}
116124

117-
public List<Element> toXmlValues( final String valueElementName )
125+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
118126
{
119127
final List<Element> returnList = new ArrayList<>();
120128
for ( final ActionConfiguration value : values )
121129
{
122130
final Element valueElement = new Element( valueElementName );
123-
valueElement.addContent( JsonUtil.serialize( value ) );
131+
final ActionConfiguration clonedValue = JsonUtil.cloneUsingJson( value, ActionConfiguration.class );
132+
try
133+
{
134+
clonedValue.setPassword( encryptPwValue( clonedValue.getPassword(), pwmSecurityKey ) );
135+
}
136+
catch ( PwmOperationalException e )
137+
{
138+
LOGGER.warn( "error decoding stored pw value: " + e.getMessage() );
139+
}
140+
141+
valueElement.addContent( JsonUtil.serialize( clonedValue ) );
124142
returnList.add( valueElement );
125143
}
126144
return returnList;
@@ -167,6 +185,22 @@ public List<String> validateValue( final PwmSetting pwmSetting )
167185
return Collections.emptyList();
168186
}
169187

188+
@Override
189+
public Serializable toDebugJsonObject( final Locale locale )
190+
{
191+
final ArrayList<ActionConfiguration> output = new ArrayList<>();
192+
for ( final ActionConfiguration actionConfiguration : values )
193+
{
194+
final ActionConfiguration clone = JsonUtil.cloneUsingJson( actionConfiguration, ActionConfiguration.class );
195+
if ( !StringUtil.isEmpty( clone.getPassword() ) )
196+
{
197+
clone.setPassword( PwmConstants.LOG_REMOVED_VALUE_REPLACEMENT );
198+
}
199+
output.add( clone );
200+
}
201+
return output;
202+
}
203+
170204
public String toDebugString( final Locale locale )
171205
{
172206
final StringBuilder sb = new StringBuilder();
@@ -189,6 +223,12 @@ public String toDebugString( final Locale locale )
189223
sb.append( "method=" ).append( actionConfiguration.getMethod() );
190224
sb.append( " url=" ).append( actionConfiguration.getUrl() );
191225
sb.append( " headers=" ).append( JsonUtil.serializeMap( actionConfiguration.getHeaders() ) );
226+
sb.append( " username=" ).append( actionConfiguration.getUsername() );
227+
sb.append( " password=" ).append(
228+
StringUtil.isEmpty( actionConfiguration.getPassword() )
229+
? ""
230+
: PwmConstants.LOG_REMOVED_VALUE_REPLACEMENT
231+
);
192232
sb.append( " body=" ).append( actionConfiguration.getBody() );
193233
}
194234
break;
@@ -250,4 +290,5 @@ public ActionConfiguration forName( final String name )
250290
return null;
251291
}
252292

293+
253294
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public List<String> validateValue( final PwmSetting pwmSetting )
7171
}
7272

7373
@Override
74-
public List<Element> toXmlValues( final String valueElementName )
74+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
7575
{
7676
final Element valueElement = new Element( valueElementName );
7777
valueElement.addContent( String.valueOf( value ) );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public ChallengeValue fromXmlElement(
113113
};
114114
}
115115

116-
public List<Element> toXmlValues( final String valueElementName )
116+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
117117
{
118118
final List<Element> returnList = new ArrayList<>();
119119
for ( final Map.Entry<String, List<ChallengeItemConfiguration>> entry : values.entrySet() )

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public CustomLinkValue fromXmlElement( final Element settingElement, final PwmSe
9090
};
9191
}
9292

93-
public List<Element> toXmlValues( final String valueElementName )
93+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
9494
{
9595
final List<Element> returnList = new ArrayList<>();
9696
for ( final CustomLinkConfiguration value : values )

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public EmailValue fromXmlElement(
9999
};
100100
}
101101

102-
public List<Element> toXmlValues( final String valueElementName )
102+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
103103
{
104104
final List<Element> returnList = new ArrayList<>();
105105
for ( final Map.Entry<String, EmailItemBean> entry : values.entrySet() )

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public StoredValue fromJson( final String input )
168168
};
169169
}
170170

171-
public List<Element> toXmlValues( final String valueElementName )
171+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
172172
{
173173
final List<Element> returnList = new ArrayList<>();
174174
for ( final Map.Entry<FileInformation, FileContent> entry : this.values.entrySet() )

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public FormValue fromXmlElement( final Element settingElement, final PwmSecurity
105105
};
106106
}
107107

108-
public List<Element> toXmlValues( final String valueElementName )
108+
public List<Element> toXmlValues( final String valueElementName, final PwmSecurityKey pwmSecurityKey )
109109
{
110110
final List<Element> returnList = new ArrayList<>();
111111
for ( final FormConfiguration value : values )

0 commit comments

Comments
 (0)