Skip to content

Commit 3283aca

Browse files
committed
fix: refactor response handling in OAuth2 authorization and improve error page generation
1 parent 33e21a4 commit 3283aca

File tree

4 files changed

+66
-34
lines changed

4 files changed

+66
-34
lines changed

Project/Sources/Classes/OAuth2Authorization.4dm

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,49 @@ shared singleton Class constructor()
22

33
Function getResponse($request : 4D.IncomingMessage) : 4D.OutgoingMessage
44

5-
var $response : 4D.OutgoingMessage:=4D.OutgoingMessage.new()
5+
var $outgoingResponse : 4D.OutgoingMessage:=4D.OutgoingMessage.new()
6+
var $errorBody : Text
67
If ($request#Null)
78

8-
var $responseBody : Blob
99
var $state : Text:=cs.Tools.me.getURLParameterValue($request.url; "state")
1010
var $redirectURI : Text:=($request.urlPath.length>0) ? "/"+$request.urlPath[0]+"/@" : $request.url
1111
var $options : Object:={state: $state; redirectURI: $redirectURI}
12+
var $response : Object:={}
1213

1314
If (Value type($request.urlQuery)=Is object)
1415
$options.result:=OB Copy($request.urlQuery; ck shared)
1516
End if
1617

17-
If (_authorize($options; ->$responseBody))
18+
If (_authorize($options; $response))
1819

19-
$response.setStatus(200)
20-
$response.setBody($responseBody)
21-
$response.setHeader("Content-Type"; "text/html")
20+
// If the response contains a redirect URL, we send a 302 Temporary Redirect
21+
If ((Value type($response.redirectURL)=Is text) && (Length($response.redirectURL)>0))
22+
$outgoingResponse.setStatus(302) // Temporary redirect
23+
$outgoingResponse.setHeader("Location"; String($response.redirectURL))
24+
Else
25+
$outgoingResponse.setStatus($response.status)
26+
$outgoingResponse.setBody($response.body)
27+
$outgoingResponse.setHeader("Content-Type"; $response.contentType)
28+
End if
2229
Else
2330

2431
// Send a 403 status line
2532
// This is not strictly necessary, but it makes it clear that the request was forbidden
2633
// and not just a 404 Not Found
27-
$response.setStatus(403)
28-
var $errorBody : Text:="<html><body><h1>403 Forbidden</h1><p>Access denied</p></body></html>"
29-
$response.setBody($errorBody)
30-
$response.setHeader("Content-Type"; "text/html")
34+
$errorBody:=cs.Tools.me.buildPageFromTemplate(Localized string("OAuth2_Response_Title"); "403 Forbidden"; "Access denied.")
35+
$outgoingResponse.setStatus(403)
36+
$outgoingResponse.setBody($errorBody)
37+
$outgoingResponse.setHeader("Content-Type"; "text/html")
3138

3239
End if
3340
Else
3441
var $error : Object:=cs.Tools.me.makeError(9; {which: "request (4D.IncomingMessage)"; function: "OAuth2Authorization.getResponse"})
3542

36-
$response.setStatus(500)
37-
$response.setBody("Internal Server Error:\r\n\r\n"+JSON Stringify($error; *))
38-
$response.setHeader("Content-Type"; "text/plain")
43+
$errorBody:=cs.Tools.me.buildPageFromTemplate(Localized string("OAuth2_Response_Title"); "500 Internal Server Error"; JSON Stringify($error; *))
44+
$outgoingResponse.setStatus(500)
45+
$outgoingResponse.setBody($errorBody)
46+
$outgoingResponse.setHeader("Content-Type"; "text/plain")
3947
End if
40-
$response.setHeader("X-Request-Handler"; String(OB Class(This).name))
48+
$outgoingResponse.setHeader("X-Request-Handler"; String(OB Class(This).name))
4149

42-
return $response
50+
return $outgoingResponse

Project/Sources/Classes/Tools.4dm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,3 +566,17 @@ Function makeError($inCode : Integer; $inParameters : Object) : Object
566566
var $error : Object:={errCode: $inCode; componentSignature: "4DNK"; message: $description}
567567

568568
return $error
569+
570+
571+
// ----------------------------------------------------
572+
573+
574+
Function buildPageFromTemplate($inTitle : Text; $inMessage : Text; $inDetails : Text) : Text
575+
576+
var $responseTemplateFile : 4D.File:=Folder(fk resources folder).file("responseTemplate.html")
577+
var $responseTemplateContent : Text:=$responseTemplateFile.getText()
578+
var $responseBody : Text:=""
579+
580+
PROCESS 4D TAGS($responseTemplateContent; $responseBody; $inTitle; $inMessage; $inDetails)
581+
582+
return $responseBody

Project/Sources/Methods/_authorize.4dm

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//%attributes = {"invisible":true}
2-
#DECLARE($inOptions : Object; $outResponseBodyPtr : Pointer) : Boolean
2+
#DECLARE($inOptions : Object; $outResponse : Object) : Boolean
33

44
var $redirectURI : Text
55
var $URL : Text:=$inOptions.redirectURI
@@ -60,14 +60,9 @@ If ($URL=$redirectURI)
6060

6161
PROCESS 4D TAGS($responseFileContent; $outResponseBody; $pageTitle; $pageMessage; $pageDetails)
6262

63-
If (Type($outResponseBodyPtr)=Is pointer)
64-
Case of
65-
: (Type($outResponseBodyPtr->)=Is text)
66-
$outResponseBodyPtr->:=$outResponseBody
67-
: (Type($outResponseBodyPtr->)=Is BLOB)
68-
CONVERT FROM TEXT($outResponseBody; "UTF-8"; $outResponseBodyPtr->)
69-
End case
70-
End if
63+
$outResponse.status:=200
64+
$outResponse.body:=$outResponseBody
65+
$outResponse.contentType:="text/html; charset=UTF-8"
7166

7267
return True
7368

Project/Sources/Methods/_onWebConnection.4dm

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,38 @@ If ($URL=$redirectURI)
3131
$options.result:=$result
3232
End if
3333

34-
var $responseBody : Blob
35-
If (_authorize($options; ->$responseBody))
34+
var $response : Object:={}
35+
var $statusLine : Text
36+
var $responseBody : Text
37+
38+
If (_authorize($options; $response))
3639

37-
var $contentType : Text:="Content-Type: text/html"
38-
WEB SET HTTP HEADER($contentType)
39-
WEB SEND RAW DATA($responseBody)
40+
// If the response contains a redirect URL, we send a 302 Temporary Redirect
41+
If ((Value type($response.redirectURL)=Is text) && (Length($response.redirectURL)>0))
42+
var $responseHeader : Text:="X-STATUS: 302 Found"+Char(13)+Char(10)+"Location: "+String($response.redirectURL)
43+
WEB SET HTTP HEADER($responseHeader)
44+
Else
45+
46+
$responseBody:=$response.body
47+
var $contentType : Text:=$response.contentType
48+
WEB SEND TEXT($responseBody; $contentType)
49+
End if
4050
Else
4151

4252
// Send a 403 status line
4353
// This is not strictly necessary, but it makes it clear that the request was forbidden
4454
// and not just a 404 Not Found
45-
var $statusLine : Text:="X-STATUS: 403 Forbidden"
55+
$responseBody:=cs.Tools.me.buildPageFromTemplate(Localized string("OAuth2_Response_Title"); "403 Forbidden"; "Access denied.")
56+
$statusLine:="X-STATUS: 403 Forbidden"
4657
WEB SET HTTP HEADER($statusLine)
47-
var $errorBody : Text:="<html><body><h1>403 Forbidden</h1><p>Access denied</p></body></html>"
48-
WEB SEND TEXT($errorBody; "text/html")
58+
WEB SEND TEXT($responseBody; "text/html")
4959
End if
5060

61+
Else
62+
63+
// Send a 404 status line
64+
$responseBody:=cs.Tools.me.buildPageFromTemplate(Localized string("OAuth2_Response_Title"); "404 Not Found"; "The requested resource could not be found.")
65+
$statusLine:="X-STATUS: 404 Not Found"
66+
WEB SET HTTP HEADER($statusLine)
67+
WEB SEND TEXT($responseBody; "text/html")
5168
End if
52-
53-
// Nothing to do... 404 will be automatically sent

0 commit comments

Comments
 (0)