Skip to content

Commit d6cd7d0

Browse files
committed
Polish LogoutRequest constructors and Auth.logout overloadings
This refactor is pretty much the same done with AuthnRequest and AuthnRequestParams: in this case, the params class encapsulates all the logout request input parameters used whenever a new logout request is created for subsequent sending. This as well allows to reduce the number of LogoutRequest constructor and Auth.logout() overloadings, allows an extension to use a customized input param object which is also passed to postProcessXml and eases Auth extensibility.
1 parent 636f17b commit d6cd7d0

File tree

5 files changed

+429
-112
lines changed

5 files changed

+429
-112
lines changed

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

Lines changed: 73 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.w3c.dom.NodeList;
2222

2323
import com.onelogin.saml2.exception.ValidationError;
24-
import com.onelogin.saml2.exception.XMLEntityException;
2524
import com.onelogin.saml2.exception.SettingsException;
2625
import com.onelogin.saml2.http.HttpRequest;
2726
import com.onelogin.saml2.settings.Saml2Settings;
@@ -60,31 +59,6 @@ public class LogoutRequest {
6059
*/
6160
private final HttpRequest request;
6261

63-
/**
64-
* NameID.
65-
*/
66-
private String nameId;
67-
68-
/**
69-
* NameID Format.
70-
*/
71-
private String nameIdFormat;
72-
73-
/**
74-
* nameId NameQualifier
75-
*/
76-
private String nameIdNameQualifier;
77-
78-
/**
79-
* nameId SP NameQualifier
80-
*/
81-
private String nameIdSPNameQualifier;
82-
83-
/**
84-
* SessionIndex. When the user is logged, this stored it from the AuthnStatement of the SAML Response
85-
*/
86-
private String sessionIndex;
87-
8862
/**
8963
* URL of the current host + current view
9064
*/
@@ -117,7 +91,14 @@ public class LogoutRequest {
11791
* The NameID NameQualifier that will be set in the LogoutRequest.
11892
* @param nameIdSPNameQualifier
11993
* The SP Name Qualifier that will be set in the LogoutRequest.
94+
*
95+
* @deprecated use {@link #LogoutRequest(Saml2Settings, HttpRequest)} to build a
96+
* received request from the HTTP request, or
97+
* {@link #LogoutRequest(Saml2Settings, LogoutRequestParams)} with
98+
* {@link LogoutRequestParams#LogoutRequestParams(String, String, String, String, String)}
99+
* to build a new request to be sent
120100
*/
101+
@Deprecated
121102
public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId, String sessionIndex, String nameIdFormat, String nameIdNameQualifier, String nameIdSPNameQualifier) {
122103
this.settings = settings;
123104
this.request = request;
@@ -130,16 +111,12 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId,
130111
}
131112

132113
if (samlLogoutRequest == null) {
114+
LogoutRequestParams params = new LogoutRequestParams(sessionIndex, nameId, nameIdFormat, nameIdNameQualifier, nameIdSPNameQualifier);
133115
id = Util.generateUniqueID(settings.getUniqueIDPrefix());
134116
issueInstant = Calendar.getInstance();
135-
this.nameId = nameId;
136-
this.nameIdFormat = nameIdFormat;
137-
this.nameIdNameQualifier = nameIdNameQualifier;
138-
this.nameIdSPNameQualifier = nameIdSPNameQualifier;
139-
this.sessionIndex = sessionIndex;
140117

141-
StrSubstitutor substitutor = generateSubstitutor(settings);
142-
logoutRequestString = postProcessXml(substitutor.replace(getLogoutRequestTemplate()), settings);
118+
StrSubstitutor substitutor = generateSubstitutor(params, settings);
119+
logoutRequestString = postProcessXml(substitutor.replace(getLogoutRequestTemplate()), params, settings);
143120
} else {
144121
logoutRequestString = Util.base64decodedInflated(samlLogoutRequest);
145122
Document doc = Util.loadXML(logoutRequestString);
@@ -163,7 +140,14 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId,
163140
* The nameIdFormat that will be set in the LogoutRequest.
164141
* @param nameIdNameQualifier
165142
* The NameID NameQualifier will be set in the LogoutRequest.
143+
*
144+
* @deprecated use {@link #LogoutRequest(Saml2Settings, HttpRequest)} to build a
145+
* received request from the HTTP request, or
146+
* {@link #LogoutRequest(Saml2Settings, LogoutRequestParams)} with
147+
* {@link LogoutRequestParams#LogoutRequestParams(String, String, String, String)}
148+
* to build a new request to be sent
166149
*/
150+
@Deprecated
167151
public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId, String sessionIndex, String nameIdFormat, String nameIdNameQualifier) {
168152
this(settings, request, nameId, sessionIndex, nameIdFormat, nameIdNameQualifier, null);
169153
}
@@ -181,7 +165,14 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId,
181165
* The SessionIndex (taken from the SAML Response in the SSO process).
182166
* @param nameIdFormat
183167
* The nameIdFormat that will be set in the LogoutRequest.
168+
*
169+
* @deprecated use {@link #LogoutRequest(Saml2Settings, HttpRequest)} to build a
170+
* received request from the HTTP request, or
171+
* {@link #LogoutRequest(Saml2Settings, LogoutRequestParams)} with
172+
* {@link LogoutRequestParams#LogoutRequestParams(String, String, String)}
173+
* to build a new request to be sent
184174
*/
175+
@Deprecated
185176
public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId, String sessionIndex, String nameIdFormat) {
186177
this(settings, request, nameId, sessionIndex, nameIdFormat, null);
187178
}
@@ -197,23 +188,34 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId,
197188
* The NameID that will be set in the LogoutRequest.
198189
* @param sessionIndex
199190
* The SessionIndex (taken from the SAML Response in the SSO process).
191+
*
192+
* @deprecated use {@link #LogoutRequest(Saml2Settings, HttpRequest)} to build a
193+
* received request from the HTTP request, or
194+
* {@link #LogoutRequest(Saml2Settings, LogoutRequestParams)} with
195+
* {@link LogoutRequestParams#LogoutRequestParams(String, String)}
196+
* to build a new request to be sent
200197
*/
198+
@Deprecated
201199
public LogoutRequest(Saml2Settings settings, HttpRequest request, String nameId, String sessionIndex) {
202200
this(settings, request, nameId, sessionIndex, null);
203201
}
204202

205203
/**
206-
* Constructs the LogoutRequest object.
204+
* Constructs a LogoutRequest object when a new request should be generated
205+
* and sent.
207206
*
208207
* @param settings
209208
* OneLogin_Saml2_Settings
209+
*
210+
* @see #LogoutRequest(Saml2Settings, LogoutRequestParams)
210211
*/
211212
public LogoutRequest(Saml2Settings settings) {
212-
this(settings, null, null, null);
213+
this(settings, new LogoutRequestParams());
213214
}
214215

215216
/**
216-
* Constructs the LogoutRequest object.
217+
* Constructs the LogoutRequest object when a received request should be extracted
218+
* from the HTTP request and parsed.
217219
*
218220
* @param settings
219221
* OneLogin_Saml2_Settings
@@ -224,6 +226,26 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request) {
224226
this(settings, request, null, null);
225227
}
226228

229+
/**
230+
* Constructs the LogoutRequest object when a new request should be generated
231+
* and sent.
232+
*
233+
* @param settings
234+
* OneLogin_Saml2_Settings
235+
* @param params
236+
* a set of authentication request input parameters that shape the
237+
* request to create
238+
*/
239+
public LogoutRequest(Saml2Settings settings, LogoutRequestParams params) {
240+
this.settings = settings;
241+
this.request = null;
242+
id = Util.generateUniqueID(settings.getUniqueIDPrefix());
243+
issueInstant = Calendar.getInstance();
244+
245+
StrSubstitutor substitutor = generateSubstitutor(params, settings);
246+
logoutRequestString = postProcessXml(substitutor.replace(getLogoutRequestTemplate()), params, settings);
247+
}
248+
227249
/**
228250
* Allows for an extension class to post-process the LogoutRequest XML generated
229251
* for this request, in order to customize the result.
@@ -237,12 +259,14 @@ public LogoutRequest(Saml2Settings settings, HttpRequest request) {
237259
* @param logoutRequestXml
238260
* the XML produced for this LogoutRequest by the standard
239261
* implementation provided by {@link LogoutRequest}
262+
* @param params
263+
* the logout request input parameters
240264
* @param settings
241265
* the settings
242266
* @return the post-processed XML for this LogoutRequest, which will then be
243267
* returned by any call to {@link #getLogoutRequestXml()}
244268
*/
245-
protected String postProcessXml(final String logoutRequestXml, final Saml2Settings settings) {
269+
protected String postProcessXml(final String logoutRequestXml, final LogoutRequestParams params, final Saml2Settings settings) {
246270
return logoutRequestXml;
247271
}
248272

@@ -286,12 +310,14 @@ public String getLogoutRequestXml() {
286310
/**
287311
* Substitutes LogoutRequest variables within a string by values.
288312
*
313+
* @param params
314+
* the logout request input parameters
289315
* @param settings
290-
* Saml2Settings object. Setting data
316+
* Saml2Settings object. Setting data
291317
*
292-
* @return the StrSubstitutor object of the LogoutRequest
318+
* @return the StrSubstitutor object of the LogoutRequest
293319
*/
294-
private StrSubstitutor generateSubstitutor(Saml2Settings settings) {
320+
private StrSubstitutor generateSubstitutor(LogoutRequestParams params, Saml2Settings settings) {
295321
Map<String, String> valueMap = new HashMap<String, String>();
296322

297323
valueMap.put("id", Util.toXml(id));
@@ -308,14 +334,16 @@ private StrSubstitutor generateSubstitutor(Saml2Settings settings) {
308334

309335
valueMap.put("issuer", Util.toXml(settings.getSpEntityId()));
310336

337+
String nameId = params.getNameId();
338+
String requestedNameIdFormat = params.getNameIdFormat();
311339
String nameIdFormat = null;
312-
String spNameQualifier = this.nameIdSPNameQualifier;
313-
String nameQualifier = this.nameIdNameQualifier;
340+
String spNameQualifier = params.getNameIdSPNameQualifier();
341+
String nameQualifier = params.getNameIdNameQualifier();
314342
if (nameId != null) {
315-
if (this.nameIdFormat == null && !settings.getSpNameIDFormat().equals(Constants.NAMEID_UNSPECIFIED)) {
343+
if (requestedNameIdFormat == null && !settings.getSpNameIDFormat().equals(Constants.NAMEID_UNSPECIFIED)) {
316344
nameIdFormat = settings.getSpNameIDFormat();
317345
} else {
318-
nameIdFormat = this.nameIdFormat;
346+
nameIdFormat = requestedNameIdFormat;
319347
}
320348
} else {
321349
nameId = settings.getIdpEntityId();
@@ -348,6 +376,7 @@ private StrSubstitutor generateSubstitutor(Saml2Settings settings) {
348376
valueMap.put("nameIdStr", nameIdStr);
349377

350378
String sessionIndexStr = "";
379+
String sessionIndex = params.getSessionIndex();
351380
if (sessionIndex != null) {
352381
sessionIndexStr = " <samlp:SessionIndex>" + Util.toXml(sessionIndex) + "</samlp:SessionIndex>";
353382
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package com.onelogin.saml2.logout;
2+
3+
/**
4+
* Input parameters for a SAML 2 logout request.
5+
*/
6+
public class LogoutRequestParams {
7+
8+
/**
9+
* SessionIndex. When the user is logged, this stored it from the AuthnStatement
10+
* of the SAML Response
11+
*/
12+
private String sessionIndex;
13+
14+
/**
15+
* NameID.
16+
*/
17+
private String nameId;
18+
19+
/**
20+
* NameID Format.
21+
*/
22+
private String nameIdFormat;
23+
24+
/**
25+
* nameId NameQualifier
26+
*/
27+
private String nameIdNameQualifier;
28+
29+
/**
30+
* nameId SP NameQualifier
31+
*/
32+
private String nameIdSPNameQualifier;
33+
34+
/** Create an empty set of logout request input parameters. */
35+
public LogoutRequestParams() {
36+
}
37+
38+
/**
39+
* Create a set of logout request input parameters.
40+
*
41+
* @param sessionIndex
42+
* the session index
43+
* @param nameId
44+
* the name id of the user to log out
45+
*/
46+
public LogoutRequestParams(String sessionIndex, String nameId) {
47+
this(sessionIndex, nameId, null, null, null);
48+
}
49+
50+
/**
51+
* Create a set of logout request input parameters.
52+
*
53+
* @param sessionIndex
54+
* the session index
55+
* @param nameId
56+
* the name id of the user to log out
57+
* @param nameIdFormat
58+
* the name id format
59+
*/
60+
public LogoutRequestParams(String sessionIndex, String nameId, String nameIdFormat) {
61+
this(sessionIndex, nameId, nameIdFormat, null, null);
62+
}
63+
64+
/**
65+
* Create a set of logout request input parameters.
66+
*
67+
* @param sessionIndex
68+
* the session index
69+
* @param nameId
70+
* the name id of the user to log out
71+
* @param nameIdFormat
72+
* the name id format
73+
* @param nameIdNameQualifier
74+
* the name id qualifier
75+
*/
76+
public LogoutRequestParams(String sessionIndex, String nameId, String nameIdFormat, String nameIdNameQualifier) {
77+
this(sessionIndex, nameId, nameIdFormat, nameIdNameQualifier, null);
78+
}
79+
80+
/**
81+
* Create a set of logout request input parameters.
82+
*
83+
* @param sessionIndex
84+
* the session index
85+
* @param nameId
86+
* the name id of the user to log out
87+
* @param nameIdFormat
88+
* the name id format
89+
* @param nameIdNameQualifier
90+
* the name id qualifier
91+
* @param nameIdSPNameQualifier
92+
* the name id SP qualifier
93+
*/
94+
public LogoutRequestParams(String sessionIndex, String nameId, String nameIdFormat, String nameIdNameQualifier,
95+
String nameIdSPNameQualifier) {
96+
this.sessionIndex = sessionIndex;
97+
this.nameId = nameId;
98+
this.nameIdFormat = nameIdFormat;
99+
this.nameIdNameQualifier = nameIdNameQualifier;
100+
this.nameIdSPNameQualifier = nameIdSPNameQualifier;
101+
}
102+
103+
/**
104+
* Create a set of logout request input parameters, by copying them from another
105+
* set.
106+
*
107+
* @param source
108+
* the source set of logout request input parameters
109+
*/
110+
protected LogoutRequestParams(LogoutRequestParams source) {
111+
this.sessionIndex = source.getSessionIndex();
112+
this.nameId = source.getNameId();
113+
this.nameIdFormat = source.getNameIdFormat();
114+
this.nameIdNameQualifier = source.getNameIdNameQualifier();
115+
this.nameIdSPNameQualifier = source.getNameIdSPNameQualifier();
116+
}
117+
118+
/**
119+
* @return the name ID
120+
*/
121+
protected String getNameId() {
122+
return nameId;
123+
}
124+
125+
/**
126+
* Sets the name ID
127+
*
128+
* @param nameId
129+
* the name ID to set
130+
*/
131+
protected void setNameId(String nameId) {
132+
this.nameId = nameId;
133+
}
134+
135+
/**
136+
* @return the name ID format
137+
*/
138+
protected String getNameIdFormat() {
139+
return nameIdFormat;
140+
}
141+
142+
/**
143+
* @return the name ID name qualifier
144+
*/
145+
protected String getNameIdNameQualifier() {
146+
return nameIdNameQualifier;
147+
}
148+
149+
/**
150+
* @return the name ID SP name qualifier
151+
*/
152+
protected String getNameIdSPNameQualifier() {
153+
return nameIdSPNameQualifier;
154+
}
155+
156+
/**
157+
* @return the session index
158+
*/
159+
protected String getSessionIndex() {
160+
return sessionIndex;
161+
}
162+
}

0 commit comments

Comments
 (0)