@@ -117,7 +117,13 @@ type AuthflowController struct {
117117 OAuthClientResolver AuthflowControllerOAuthClientResolver
118118}
119119
120- func (c * AuthflowController ) HandleStartOfFlow (w http.ResponseWriter , r * http.Request , opts webapp.SessionOptions , flowReference authflow.FlowReference , handlers * AuthflowControllerHandlers ) {
120+ func (c * AuthflowController ) HandleStartOfFlow (
121+ w http.ResponseWriter ,
122+ r * http.Request ,
123+ opts webapp.SessionOptions ,
124+ flowReference authflow.FlowReference ,
125+ handlers * AuthflowControllerHandlers ,
126+ input interface {}) {
121127 if err := r .ParseForm (); err != nil {
122128 http .Error (w , err .Error (), http .StatusBadRequest )
123129 return
@@ -135,10 +141,10 @@ func (c *AuthflowController) HandleStartOfFlow(w http.ResponseWriter, r *http.Re
135141 handler .ServeHTTP (w , r )
136142 }
137143
138- screen , err := c .getScreen (s , GetXStepFromQuery (r ))
144+ screen , err := c .GetScreen (s , GetXStepFromQuery (r ))
139145 if err != nil {
140146 if errors .Is (err , authflow .ErrFlowNotFound ) {
141- screen , err := c .createScreen (r , s , flowReference )
147+ screen , err := c .createScreen (r , s , flowReference , input )
142148 if err != nil {
143149 c .Logger .WithError (err ).Errorf ("failed to create screen" )
144150 c .renderError (w , r , err )
@@ -183,7 +189,7 @@ func (c *AuthflowController) HandleOAuthCallback(w http.ResponseWriter, r *http.
183189 return
184190 }
185191
186- screen , err := c .getScreen (s , state .XStep )
192+ screen , err := c .GetScreen (s , state .XStep )
187193 if err != nil {
188194 c .Logger .WithError (err ).Errorf ("failed to get screen" )
189195 c .renderError (w , r , err )
@@ -251,7 +257,7 @@ func (c *AuthflowController) HandleResumeOfFlow(
251257 return
252258 }
253259
254- screen , err := c .createScreenWithOutput (r , s , output )
260+ screen , err := c .createScreenWithOutput (r , s , output , "" )
255261 if err != nil {
256262 c .Logger .WithError (err ).Errorf ("failed to create screen" )
257263 handleError (err )
@@ -283,7 +289,7 @@ func (c *AuthflowController) HandleStep(w http.ResponseWriter, r *http.Request,
283289 return
284290 }
285291
286- screen , err := c .getScreen (s , GetXStepFromQuery (r ))
292+ screen , err := c .GetScreen (s , GetXStepFromQuery (r ))
287293 if err != nil {
288294 c .Logger .WithError (err ).Errorf ("failed to get screen" )
289295 c .renderError (w , r , err )
@@ -345,7 +351,7 @@ func (c *AuthflowController) getOrCreateWebSession(w http.ResponseWriter, r *htt
345351 return s , nil
346352}
347353
348- func (c * AuthflowController ) getScreen (s * webapp.Session , xStep string ) (* webapp.AuthflowScreenWithFlowResponse , error ) {
354+ func (c * AuthflowController ) GetScreen (s * webapp.Session , xStep string ) (* webapp.AuthflowScreenWithFlowResponse , error ) {
349355 if s .Authflow == nil {
350356 return nil , authflow .ErrFlowNotFound
351357 }
@@ -469,11 +475,11 @@ func (c *AuthflowController) createScreenWithOutput(
469475 r * http.Request ,
470476 s * webapp.Session ,
471477 output * authflow.ServiceOutput ,
478+ prevXStep string ,
472479) (* webapp.AuthflowScreenWithFlowResponse , error ) {
473480 flowResponse := output .ToFlowResponse ()
474- emptyXStep := ""
475481 var emptyInput map [string ]interface {}
476- screen := webapp .NewAuthflowScreenWithFlowResponse (& flowResponse , emptyXStep , emptyInput )
482+ screen := webapp .NewAuthflowScreenWithFlowResponse (& flowResponse , prevXStep , emptyInput )
477483 s .RememberScreen (screen )
478484
479485 output , screen , err := c .takeBranchRecursively (s , screen )
@@ -491,21 +497,42 @@ func (c *AuthflowController) createScreenWithOutput(
491497 return screen , nil
492498}
493499
494- func (c * AuthflowController ) createScreen (r * http.Request , s * webapp.Session , flowReference authflow.FlowReference ) (screen * webapp.AuthflowScreenWithFlowResponse , err error ) {
495- output , err := c .createAuthflow (r , s , flowReference )
500+ func (c * AuthflowController ) createScreen (
501+ r * http.Request ,
502+ s * webapp.Session ,
503+ flowReference authflow.FlowReference ,
504+ input interface {}) (screen * webapp.AuthflowScreenWithFlowResponse , err error ) {
505+ output1 , err := c .createAuthflow (r , s , flowReference )
496506 if err != nil {
497507 return
498508 }
499509
500- screen , err = c .createScreenWithOutput (r , s , output )
510+ screen , err = c .createScreenWithOutput (r , s , output1 , "" )
501511 if err != nil {
502512 return
503513 }
514+
515+ if input != nil {
516+ output2 , err := c .feedInput (output1 .Flow .StateToken , input )
517+ if err != nil {
518+ return nil , err
519+ }
520+ screen , err = c .createScreenWithOutput (r , s , output2 , screen .Screen .StateToken .XStep )
521+ if err != nil {
522+ return nil , err
523+ }
524+ }
525+
504526 return
505527}
506528
507529// AdvanceWithInput is for feeding an input that would advance the flow.
508- func (c * AuthflowController ) AdvanceWithInput (r * http.Request , s * webapp.Session , screen0 * webapp.AuthflowScreenWithFlowResponse , input map [string ]interface {}) (result * webapp.Result , err error ) {
530+ func (c * AuthflowController ) AdvanceWithInput (
531+ r * http.Request ,
532+ s * webapp.Session ,
533+ screen0 * webapp.AuthflowScreenWithFlowResponse ,
534+ input map [string ]interface {},
535+ ) (result * webapp.Result , err error ) {
509536 result = & webapp.Result {}
510537
511538 output1 , err := c .feedInput (screen0 .Screen .StateToken .StateToken , input )
@@ -540,10 +567,21 @@ func (c *AuthflowController) AdvanceWithInput(r *http.Request, s *webapp.Session
540567 return
541568 }
542569
543- // Forget the session.
544- result .Cookies = append (result .Cookies , c .Cookies .ClearCookie (c .SessionCookie .Def ))
545- // Reset visitor ID.
546- result .Cookies = append (result .Cookies , c .Cookies .ClearCookie (webapp .VisitorIDCookieDef ))
570+ switch flowResponse2 .Type {
571+ case authflow .FlowTypeLogin :
572+ fallthrough
573+ case authflow .FlowTypePromote :
574+ fallthrough
575+ case authflow .FlowTypeSignup :
576+ fallthrough
577+ case authflow .FlowTypeReauth :
578+ // Forget the session.
579+ result .Cookies = append (result .Cookies , c .Cookies .ClearCookie (c .SessionCookie .Def ))
580+ // Reset visitor ID.
581+ result .Cookies = append (result .Cookies , c .Cookies .ClearCookie (webapp .VisitorIDCookieDef ))
582+ default :
583+ // Do nothing for other flows
584+ }
547585 } else {
548586 now := c .Clock .NowUTC ()
549587 s .UpdatedAt = now
@@ -748,7 +786,7 @@ func (c *AuthflowController) makeHTTPHandler(s *webapp.Session, screen *webapp.A
748786
749787func (c * AuthflowController ) takeBranch (w http.ResponseWriter , r * http.Request , s * webapp.Session , screen * webapp.AuthflowScreenWithFlowResponse ) error {
750788 xStepAtBranch := screen .Screen .BranchStateToken .XStep
751- screen , err := c .getScreen (s , xStepAtBranch )
789+ screen , err := c .GetScreen (s , xStepAtBranch )
752790 if err != nil {
753791 return err
754792 }
0 commit comments