Skip to content
This repository was archived by the owner on Jun 12, 2021. It is now read-only.

Commit 5abc2fe

Browse files
committed
Form post response ContentType MUST be set to "text/html".
1 parent c334dcb commit 5abc2fe

File tree

3 files changed

+62
-30
lines changed

3 files changed

+62
-30
lines changed

src/oidcendpoint/endpoint.py

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,22 @@
3535
- _parse_args
3636
- post_construct (*)
3737
- update_http_args
38+
39+
do_response returns a dictionary that can look like this:
40+
{
41+
'response':
42+
_response as a string or as a Message instance_
43+
'http_headers': [
44+
('Content-type', 'application/json'),
45+
('Pragma', 'no-cache'),
46+
('Cache-Control', 'no-store')
47+
],
48+
'cookie': _list of cookies_
49+
}
50+
51+
"response" MUST be present
52+
"http_headers" MAY be present
53+
"cookie": MAY be present
3854
"""
3955

4056

@@ -319,6 +335,9 @@ def response_info(self, response_args, request, **kwargs):
319335
return self.construct(response_args, request, **kwargs)
320336

321337
def do_response(self, response_args=None, request=None, error="", **kwargs):
338+
"""
339+
340+
"""
322341
do_placement = True
323342
content_type = "text/html"
324343
_resp = {}
@@ -336,43 +355,47 @@ def do_response(self, response_args=None, request=None, error="", **kwargs):
336355
elif "response_msg" in kwargs:
337356
resp = kwargs["response_msg"]
338357
do_placement = False
339-
_response = "" # This is just for my IDE
340-
if self.response_format == "json":
341-
content_type = "application/json"
342-
elif self.request_format in ["jws", "jwe", "jose"]:
343-
content_type = "application/jose"
344-
else:
345-
content_type = "application/x-www-form-urlencoded"
346-
else:
347-
_response = self.response_info(response_args, request, **kwargs)
348-
349-
if do_placement:
350-
if self.response_placement == "body":
358+
_response = ""
359+
content_type = kwargs.get('content_type')
360+
if content_type is None:
351361
if self.response_format == "json":
352362
content_type = "application/json"
353-
resp = _response.to_json()
354363
elif self.request_format in ["jws", "jwe", "jose"]:
355364
content_type = "application/jose"
356-
resp = _response
357365
else:
358366
content_type = "application/x-www-form-urlencoded"
359-
resp = _response.to_urlencoded()
360-
elif self.response_placement == "url":
361-
# content_type = 'application/x-www-form-urlencoded'
362-
content_type = ""
363-
try:
364-
fragment_enc = kwargs["fragment_enc"]
365-
except KeyError:
366-
fragment_enc = fragment_encoding(kwargs["return_type"])
367+
else:
368+
_response = self.response_info(response_args, request, **kwargs)
367369

368-
if fragment_enc:
369-
resp = _response.request(kwargs["return_uri"], True)
370+
if do_placement:
371+
content_type = kwargs.get('content_type')
372+
if content_type is None:
373+
if self.response_placement == "body":
374+
if self.response_format == "json":
375+
content_type = "application/json"
376+
resp = _response.to_json()
377+
elif self.request_format in ["jws", "jwe", "jose"]:
378+
content_type = "application/jose"
379+
resp = _response
380+
else:
381+
content_type = "application/x-www-form-urlencoded"
382+
resp = _response.to_urlencoded()
383+
elif self.response_placement == "url":
384+
# content_type = 'application/x-www-form-urlencoded'
385+
content_type = ""
386+
try:
387+
fragment_enc = kwargs["fragment_enc"]
388+
except KeyError:
389+
fragment_enc = fragment_encoding(kwargs["return_type"])
390+
391+
if fragment_enc:
392+
resp = _response.request(kwargs["return_uri"], True)
393+
else:
394+
resp = _response.request(kwargs["return_uri"])
370395
else:
371-
resp = _response.request(kwargs["return_uri"])
372-
else:
373-
raise ValueError(
374-
"Don't know where that is: '{}".format(self.response_placement)
375-
)
396+
raise ValueError(
397+
"Don't know where that is: '{}".format(self.response_placement)
398+
)
376399

377400
if content_type:
378401
try:

src/oidcendpoint/oidc/authorization.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ def response_mode(self, request, **kwargs):
458458
action=kwargs["return_uri"],
459459
)
460460
kwargs["response_msg"] = msg
461+
kwargs["content_type"] = 'text/html'
461462
elif resp_mode == "fragment":
462463
if "fragment_enc" in kwargs:
463464
if not kwargs["fragment_enc"]:

tests/test_24_oidc_authorization_endpoint.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,12 +723,20 @@ def test_response_mode_form_post(self):
723723
"return_uri": "https://example.com/cb",
724724
}
725725
info = self.endpoint.response_mode(request, **info)
726-
assert set(info.keys()) == {"response_args", "return_uri", "response_msg"}
726+
assert set(info.keys()) == {"response_args", "return_uri", "response_msg", "content_type"}
727727
assert info["response_msg"] == FORM_POST.format(
728728
action="https://example.com/cb",
729729
inputs='<input type="hidden" name="foo" value="bar"/>',
730730
)
731731

732+
def test_do_response_code_form_post(self):
733+
_req = AUTH_REQ_DICT.copy()
734+
_req["response_mode"] = "form_post"
735+
_pr_resp = self.endpoint.parse_request(_req)
736+
_resp = self.endpoint.process_request(_pr_resp)
737+
msg = self.endpoint.do_response(**_resp)
738+
assert ('Content-type', 'text/html') in msg["http_headers"]
739+
732740
def test_response_mode_fragment(self):
733741
request = {"response_mode": "fragment"}
734742
self.endpoint.response_mode(request, fragment_enc=True)

0 commit comments

Comments
 (0)