@@ -86,33 +86,26 @@ func (s *Server) postElevateJSON(c *gin.Context) {
8686 return
8787 }
8888
89- // Parse as raw JSON to detect request type
90- var rawData map [ string ] any
91- if err := json .Unmarshal (body , & rawData ); err != nil {
92- s .getErrorPage (c , http .StatusBadRequest , "Invalid JSON payload" , err )
89+ // This is a standard elevation request
90+ var request models. ElevateRequest
91+ if err := json .Unmarshal (body , & request ); err != nil {
92+ s .getErrorPage (c , http .StatusBadRequest , "Invalid standard request payload" , err )
9393 return
9494 }
9595
96- // Check if this is a dynamic request (has providers array, permissions array, etc.)
97- if providers , hasProviders := rawData ["providers" ].([]any ); hasProviders && len (providers ) > 0 {
98- // This is a dynamic request
99- var dynamicRequest models.ElevateDynamicRequest
100- if err := json .Unmarshal (body , & dynamicRequest ); err != nil {
101- s .getErrorPage (c , http .StatusBadRequest , "Invalid dynamic request payload" , err )
102- return
103- }
104- s .handleDynamicRequest (c , dynamicRequest )
96+ if request .IsValid () {
97+ s .elevate (c , request )
10598 return
10699 }
107100
108- // This is a standard elevation request
109- var request models.ElevateRequest
110- if err := json .Unmarshal (body , & request ); err != nil {
111- s .getErrorPage (c , http .StatusBadRequest , "Invalid standard request payload" , err )
101+ // Parse as raw JSON to detect request type
102+ var dynamicRequest models.ElevateDynamicRequest
103+ if err := json .Unmarshal (body , & dynamicRequest ); err != nil {
104+ s .getErrorPage (c , http .StatusBadRequest , "Invalid dynamic request payload" , err )
112105 return
113106 }
107+ s .handleDynamicRequest (c , dynamicRequest )
114108
115- s .elevate (c , request )
116109}
117110
118111func (s * Server ) handleDynamicRequest (c * gin.Context , dynamicRequest models.ElevateDynamicRequest ) {
@@ -182,27 +175,35 @@ func (s *Server) elevate(c *gin.Context, request models.ElevateRequest) {
182175 // lets attach a user session to the request.
183176 if s .Config .IsServer () {
184177
185- // Get the auth provider from the workflow if set
186- authProvider := []string {}
178+ if len (request .Workflow ) == 0 {
179+ s .getErrorPage (c , http .StatusBadRequest , "No workflow specified for elevation request" )
180+ return
181+ }
187182
188- if len (request .Workflow ) > 0 {
189- workflowDef , err := s .Config .GetWorkflowByName (request .Workflow )
190- if err != nil {
191- s .getErrorPage (c , http .StatusBadRequest , "Invalid workflow specified" , err )
192- return
193- }
194- authProvider = []string {workflowDef .GetAuthentication ()}
183+ workflowDef , err := s .Config .GetWorkflowByName (request .Workflow )
184+
185+ if err != nil {
186+ s .getErrorPage (c , http .StatusBadRequest , "Invalid workflow specified" , err )
187+ return
195188 }
196189
197- foundUser , err := s .getUser (c , authProvider ... )
190+ authProvider := workflowDef .GetAuthentication ()
191+
192+ foundUser , err := s .getUser (c , authProvider )
198193
199194 if err != nil {
200195 s .getErrorPage (c , http .StatusUnauthorized , "Unauthorized: unable to get user for list of available roles" , err )
201196 return
202197 }
203198
204199 if foundUser != nil {
205- request .Session = foundUser .ToLocalSession (s .Config .GetServices ().GetEncryption ())
200+
201+ exportableSession := & models.ExportableSession {
202+ Session : foundUser ,
203+ Provider : authProvider ,
204+ }
205+
206+ request .Session = exportableSession .ToLocalSession (s .Config .GetServices ().GetEncryption ())
206207 }
207208
208209 }
@@ -323,7 +324,8 @@ func (s *Server) getElevateAuthOAuth2(c *gin.Context) {
323324 })
324325
325326 if err != nil {
326- s .getErrorPage (c , http .StatusInternalServerError , "Failed to create session for elevation request" , err )
327+ s .getErrorPage (c , http .StatusInternalServerError ,
328+ "Failed to create session for elevation request" , err )
327329 return
328330 }
329331
@@ -332,7 +334,13 @@ func (s *Server) getElevateAuthOAuth2(c *gin.Context) {
332334
333335 workflowTask .SetUser (session .User )
334336
335- localSession := session .ToLocalSession (s .Config .GetServices ().GetEncryption ())
337+ exportableSession := & models.ExportableSession {
338+ Session : session ,
339+ Provider : authProvider ,
340+ }
341+
342+ localSession := exportableSession .ToLocalSession (
343+ s .Config .GetServices ().GetEncryption ())
336344
337345 if err := s .setAuthCookie (c , authProvider , localSession ); err != nil {
338346 s .getErrorPage (c , http .StatusInternalServerError , "Failed to set auth cookie" , err )
0 commit comments