Skip to content

Commit ac8ae33

Browse files
committed
Adding on/off settings for compression of SAML Requests and Responses. Be able to ask for deflated message on getEncodedAuthnRequest, getEncodedLogoutRequest and getEncodedLogoutResponse by a deflated parameter
1 parent 973814c commit ac8ae33

13 files changed

Lines changed: 335 additions & 20 deletions

File tree

core/src/main/java/com/onelogin/saml2/authn/AuthnRequest.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public class AuthnRequest {
3737
*/
3838
private final String id;
3939

40+
/**
41+
* Settings data.
42+
*/
43+
private final Saml2Settings settings;
44+
4045
/**
4146
* When true the AuthNRequest will set the ForceAuthn='true'
4247
*/
@@ -78,6 +83,7 @@ public AuthnRequest(Saml2Settings settings, boolean forceAuthn, boolean isPassiv
7883
this.id = Util.generateUniqueID();
7984
issueInstant = Calendar.getInstance();
8085
this.isPassive = isPassive;
86+
this.settings = settings;
8187
this.forceAuthn = forceAuthn;
8288
this.setNameIdPolicy = setNameIdPolicy;
8389

@@ -87,12 +93,33 @@ public AuthnRequest(Saml2Settings settings, boolean forceAuthn, boolean isPassiv
8793
}
8894

8995
/**
90-
* @return deflated, base64 encoded, unsigned AuthnRequest.
96+
* @return the base64 encoded unsigned AuthnRequest (deflated or not)
97+
*
98+
* @param deflated
99+
* If deflated or not the encoded AuthnRequest
100+
*
101+
* @throws IOException
102+
*/
103+
public String getEncodedAuthnRequest(Boolean deflated) throws IOException {
104+
String encodedAuthnRequest;
105+
if (deflated == null) {
106+
deflated = settings.isCompressRequestEnabled();
107+
}
108+
if (deflated) {
109+
encodedAuthnRequest = Util.deflatedBase64encoded(getAuthnRequestXml());
110+
} else {
111+
encodedAuthnRequest = Util.base64encoder(getAuthnRequestXml());
112+
}
113+
return encodedAuthnRequest;
114+
}
115+
116+
/**
117+
* @return base64 encoded, unsigned AuthnRequest (deflated or not)
91118
*
92119
* @throws IOException
93120
*/
94121
public String getEncodedAuthnRequest() throws IOException {
95-
return Util.deflatedBase64encoded(getAuthnRequestXml());
122+
return getEncodedAuthnRequest(null);
96123
}
97124

98125
/**

core/src/main/java/com/onelogin/saml2/logout/LogoutRequest.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,33 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request) throws XMLEnti
149149
}
150150

151151
/**
152-
* @return the deflated base64 encoded unsigned Logout Request
152+
* @return the base64 encoded unsigned Logout Request (deflated or not)
153+
*
154+
* @param deflated
155+
* If deflated or not the encoded Logout Request
156+
*
157+
* @throws IOException
158+
*/
159+
public String getEncodedLogoutRequest(Boolean deflated) throws IOException {
160+
String encodedLogoutRequest;
161+
if (deflated == null) {
162+
deflated = settings.isCompressRequestEnabled();
163+
}
164+
if (deflated) {
165+
encodedLogoutRequest = Util.deflatedBase64encoded(getLogoutRequestXml());
166+
} else {
167+
encodedLogoutRequest = Util.base64encoder(getLogoutRequestXml());
168+
}
169+
return encodedLogoutRequest;
170+
}
171+
172+
/**
173+
* @return the base64 encoded unsigned Logout Request (deflated or not)
153174
*
154175
* @throws IOException
155176
*/
156177
public String getEncodedLogoutRequest() throws IOException {
157-
return Util.deflatedBase64encoded(getLogoutRequestXml());
178+
return getEncodedLogoutRequest(null);
158179
}
159180

160181
/**

core/src/main/java/com/onelogin/saml2/logout/LogoutResponse.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,33 @@ public LogoutResponse(Saml2Settings settings, HttpRequest request) throws XMLEnt
106106
}
107107

108108
/**
109-
* @return the deflated, base64 encoded, unsigned Logout Response.
109+
* @return the base64 encoded unsigned Logout Response (deflated or not)
110+
*
111+
* @param deflated
112+
* If deflated or not the encoded Logout Response
113+
*
114+
* @throws IOException
115+
*/
116+
public String getEncodedLogoutResponse(Boolean deflated) throws IOException {
117+
String encodedLogoutResponse;
118+
if (deflated == null) {
119+
deflated = settings.isCompressResponseEnabled();
120+
}
121+
if (deflated) {
122+
encodedLogoutResponse = Util.deflatedBase64encoded(getLogoutResponseXml());
123+
} else {
124+
encodedLogoutResponse = Util.base64encoder(getLogoutResponseXml());
125+
}
126+
return encodedLogoutResponse;
127+
}
128+
129+
/**
130+
* @return the base64 encoded, unsigned Logout Response (deflated or not)
110131
*
111132
* @throws IOException
112133
*/
113134
public String getEncodedLogoutResponse() throws IOException {
114-
return Util.deflatedBase64encoded(getLogoutResponseXml());
135+
return getEncodedLogoutResponse(null);
115136
}
116137

117138
/**

core/src/main/java/com/onelogin/saml2/settings/Saml2Settings.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public class Saml2Settings {
7272
private String signatureAlgorithm = Constants.RSA_SHA1;
7373
private boolean rejectUnsolicitedResponsesWithInResponseTo = false;
7474

75+
// Compress
76+
private Boolean compressRequest = true;
77+
private Boolean compressResponse = true;
78+
7579
// Misc
7680
private List<Contact> contacts = new LinkedList<Contact>();
7781
private Organization organization = null;
@@ -679,6 +683,40 @@ public boolean isRejectUnsolicitedResponsesWithInResponseTo() {
679683
return rejectUnsolicitedResponsesWithInResponseTo;
680684
}
681685

686+
/**
687+
* Set the compressRequest setting value
688+
*
689+
* @param compressRequest
690+
* the compressRequest value to be set.
691+
*/
692+
public void setCompressRequest(boolean compressRequest) {
693+
this.compressRequest = compressRequest;
694+
}
695+
696+
/**
697+
* @return the compressRequest setting value
698+
*/
699+
public boolean isCompressRequestEnabled() {
700+
return compressRequest;
701+
}
702+
703+
/**
704+
* Set the compressResponse setting value
705+
*
706+
* @param compressResponse
707+
* the compressResponse value to be set.
708+
*/
709+
public void setCompressResponse(boolean compressResponse) {
710+
this.compressResponse = compressResponse;
711+
}
712+
713+
/**
714+
* @return the compressResponse setting value
715+
*/
716+
public boolean isCompressResponseEnabled() {
717+
return compressResponse;
718+
}
719+
682720
/**
683721
* Set contacts info that will be listed on the Service Provider metadata
684722
*

core/src/main/java/com/onelogin/saml2/settings/SettingsBuilder.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ public class SettingsBuilder {
8585
public final static String SECURITY_SIGNATURE_ALGORITHM = "onelogin.saml2.security.signature_algorithm";
8686
public final static String SECURITY_REJECT_UNSOLICITED_RESPONSES_WITH_INRESPONSETO = "onelogin.saml2.security.reject_unsolicited_responses_with_inresponseto";
8787

88+
// Compress
89+
public final static String COMPRESS_REQUEST = "onelogin.saml2.compress.request";
90+
public final static String COMPRESS_RESPONSE = "onelogin.saml2.compress.response";
91+
8892
// Misc
8993
public final static String CONTACT_TECHNICAL_GIVEN_NAME = "onelogin.saml2.contacts.technical.given_name";
9094
public final static String CONTACT_TECHNICAL_EMAIL_ADDRESS = "onelogin.saml2.contacts.technical.email_address";
@@ -166,6 +170,7 @@ public Saml2Settings build() throws IOException {
166170
this.loadSpSetting();
167171
this.loadIdpSetting();
168172
this.loadSecuritySetting();
173+
this.loadCompressSetting();
169174

170175
saml2Setting.setContacts(loadContacts());
171176

@@ -281,6 +286,21 @@ private void loadSecuritySetting() {
281286
}
282287
}
283288

289+
/**
290+
* Loads the compress settings from the properties file
291+
*/
292+
private void loadCompressSetting() {
293+
Boolean compressRequest = loadBooleanProperty(COMPRESS_REQUEST);
294+
if (compressRequest != null) {
295+
saml2Setting.setCompressRequest(compressRequest);
296+
}
297+
298+
Boolean compressResponse = loadBooleanProperty(COMPRESS_RESPONSE);
299+
if (compressResponse != null) {
300+
saml2Setting.setCompressResponse(compressResponse);
301+
}
302+
}
303+
284304
/**
285305
* Loads the organization settings from the properties file
286306
*/

core/src/test/java/com/onelogin/saml2/test/authn/AuthnRequestTest.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.hamcrest.CoreMatchers.containsString;
44
import static org.hamcrest.CoreMatchers.not;
55
import static org.junit.Assert.assertEquals;
6+
import static org.junit.Assert.assertNotEquals;
67
import static org.junit.Assert.assertThat;
78

89
import java.util.ArrayList;
@@ -36,10 +37,42 @@ protected String getAuthnRequestXml() {
3637
}
3738
};
3839

39-
String expectedAuthnRequestStringBase64 = Util.getFileAsString("data/requests/authn_request.xml.deflated.base64");
40-
String authnRequestStringBase64 = authnRequest.getEncodedAuthnRequest();
40+
String expectedAuthnRequestStringBase64Deflated = Util.getFileAsString("data/requests/authn_request.xml.deflated.base64");
41+
String expectedAuthnRequestStringBase64 = Util.getFileAsString("data/requests/authn_request.xml.base64");
42+
43+
String authnRequestStringBase64Deflated = authnRequest.getEncodedAuthnRequest();
44+
assertEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64Deflated);
45+
46+
authnRequestStringBase64Deflated = authnRequest.getEncodedAuthnRequest(null);
47+
assertEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64Deflated);
48+
49+
authnRequestStringBase64Deflated = authnRequest.getEncodedAuthnRequest(true);
50+
assertEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64Deflated);
51+
52+
authnRequestStringBase64Deflated = authnRequest.getEncodedAuthnRequest(false);
53+
assertNotEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64Deflated);
54+
assertEquals(authnRequestStringBase64Deflated,expectedAuthnRequestStringBase64);
55+
56+
settings.setCompressRequest(true);
57+
authnRequest = new AuthnRequest(settings) {
58+
@Override
59+
protected String getAuthnRequestXml() {
60+
return authnRequestString;
61+
}
62+
};
63+
authnRequestStringBase64Deflated = authnRequest.getEncodedAuthnRequest(null);
64+
assertEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64Deflated);
4165

42-
assertEquals(authnRequestStringBase64, expectedAuthnRequestStringBase64);
66+
settings.setCompressRequest(false);
67+
authnRequest = new AuthnRequest(settings) {
68+
@Override
69+
protected String getAuthnRequestXml() {
70+
return authnRequestString;
71+
}
72+
};
73+
authnRequestStringBase64Deflated = authnRequest.getEncodedAuthnRequest(null);
74+
assertNotEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64Deflated);
75+
assertEquals(authnRequestStringBase64Deflated, expectedAuthnRequestStringBase64);
4376
}
4477

4578
/**

core/src/test/java/com/onelogin/saml2/test/logout/LogoutRequestTest.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static org.junit.Assert.assertThat;
77
import static org.junit.Assert.assertNull;
88
import static org.junit.Assert.assertFalse;
9+
import static org.junit.Assert.assertNotEquals;
910
import static org.junit.Assert.assertTrue;
1011

1112
import java.util.ArrayList;
@@ -23,6 +24,7 @@
2324

2425
import com.onelogin.saml2.logout.LogoutRequest;
2526
import com.onelogin.saml2.http.HttpRequest;
27+
import com.onelogin.saml2.authn.AuthnRequest;
2628
import com.onelogin.saml2.exception.XMLEntityException;
2729
import com.onelogin.saml2.settings.Saml2Settings;
2830
import com.onelogin.saml2.settings.SettingsBuilder;
@@ -49,10 +51,42 @@ protected String getLogoutRequestXml() {
4951
}
5052
};
5153

52-
String expectedLogoutRequestStringBase64 = Util.getFileAsString("data/logout_requests/logout_request_deflated.xml.base64");
53-
String logoutRequestStringBase64 = logoutRequest.getEncodedLogoutRequest();
54+
String expectedLogoutRequestStringBase64Deflated = Util.getFileAsString("data/logout_requests/logout_request_deflated.xml.base64");
55+
String expectedLogoutRequestStringBase64 = Util.getFileAsString("data/logout_requests/logout_request.xml.base64");
56+
57+
String logoutRequestStringBase64Deflated = logoutRequest.getEncodedLogoutRequest();
58+
assertEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64Deflated);
59+
60+
logoutRequestStringBase64Deflated = logoutRequest.getEncodedLogoutRequest(null);
61+
assertEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64Deflated);
62+
63+
logoutRequestStringBase64Deflated = logoutRequest.getEncodedLogoutRequest(true);
64+
assertEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64Deflated);
65+
66+
logoutRequestStringBase64Deflated = logoutRequest.getEncodedLogoutRequest(false);
67+
assertNotEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64Deflated);
68+
assertEquals(logoutRequestStringBase64Deflated,expectedLogoutRequestStringBase64);
69+
70+
settings.setCompressRequest(true);
71+
logoutRequest = new LogoutRequest(settings) {
72+
@Override
73+
protected String getLogoutRequestXml() {
74+
return logoutRequestString;
75+
}
76+
};
77+
logoutRequestStringBase64Deflated = logoutRequest.getEncodedLogoutRequest(null);
78+
assertEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64Deflated);
5479

55-
assertEquals(logoutRequestStringBase64, expectedLogoutRequestStringBase64);
80+
settings.setCompressRequest(false);
81+
logoutRequest = new LogoutRequest(settings) {
82+
@Override
83+
protected String getLogoutRequestXml() {
84+
return logoutRequestString;
85+
}
86+
};
87+
logoutRequestStringBase64Deflated = logoutRequest.getEncodedLogoutRequest(null);
88+
assertNotEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64Deflated);
89+
assertEquals(logoutRequestStringBase64Deflated, expectedLogoutRequestStringBase64);
5690
}
5791

5892
/**

0 commit comments

Comments
 (0)