44package cmd
55
66import (
7+ "context"
78 "encoding/json"
89 "errors"
910 "fmt"
@@ -97,6 +98,7 @@ import (
9798 "github.com/communitybridge/easycla/cla-backend-go/user"
9899 v2ClaManager "github.com/communitybridge/easycla/cla-backend-go/v2/cla_manager"
99100 v2Company "github.com/communitybridge/easycla/cla-backend-go/v2/company"
101+ v2CurrentUser "github.com/communitybridge/easycla/cla-backend-go/v2/current_user"
100102 v2Health "github.com/communitybridge/easycla/cla-backend-go/v2/health"
101103 "github.com/communitybridge/easycla/cla-backend-go/v2/store"
102104 v2Template "github.com/communitybridge/easycla/cla-backend-go/v2/template"
@@ -296,6 +298,7 @@ func server(localMode bool) http.Handler {
296298 v2ProjectService := v2Project .NewService (v1ProjectService , v1CLAGroupRepo , v1ProjectClaGroupRepo )
297299 v1CompanyService := v1Company .NewService (v1CompanyRepo , configFile .CorporateConsoleV1URL , userRepo , usersService )
298300 v2CompanyService := v2Company .NewService (v1CompanyService , signaturesRepo , v1CLAGroupRepo , usersRepo , v1CompanyRepo , v1ProjectClaGroupRepo , eventsService )
301+ v2CurrentUserService := v2CurrentUser .NewService ()
299302
300303 v1RepositoriesService := v1Repositories .NewService (gitV1Repository , githubOrganizationsRepo , v1ProjectClaGroupRepo )
301304 v2RepositoriesService := v2Repositories .NewService (gitV1Repository , gitV2Repository , v1ProjectClaGroupRepo , githubOrganizationsRepo , gitlabOrganizationRepo , eventsService )
@@ -358,6 +361,7 @@ func server(localMode bool) http.Handler {
358361 gerrits .Configure (api , gerritService , v1ProjectService , eventsService )
359362 v2Gerrits .Configure (v2API , gerritService , v1ProjectService , eventsService , v1ProjectClaGroupRepo )
360363 v2Company .Configure (v2API , v2CompanyService , v1ProjectClaGroupRepo , configFile .LFXPortalURL , configFile .CorporateConsoleV1URL )
364+ v2CurrentUser .Configure (v2API , v2CurrentUserService )
361365 cla_manager .Configure (api , v1ClaManagerService , v1CompanyService , v1ProjectService , usersService , v1SignaturesService , eventsService , emailTemplateService )
362366 v2ClaManager .Configure (v2API , v2ClaManagerService , v1CompanyService , configFile .LFXPortalURL , configFile .CorporateConsoleV2URL , v1ProjectClaGroupRepo , userRepo )
363367 cla_groups .Configure (v2API , v2ClaGroupService , v1ProjectService , v1ProjectClaGroupRepo , eventsService )
@@ -371,7 +375,7 @@ func server(localMode bool) http.Handler {
371375
372376 userCreaterMiddleware := func (next http.Handler ) http.Handler {
373377 return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
374- createUserFromRequest (authorizer , usersService , eventsService , r )
378+ r = createUserFromRequest (authorizer , usersService , eventsService , r )
375379 next .ServeHTTP (w , r )
376380 })
377381 }
@@ -610,46 +614,53 @@ func responseLoggingMiddleware(next http.Handler) http.Handler {
610614
611615// create user form http authorization token
612616// this function creates user if user does not exist and token is valid
613- func createUserFromRequest (authorizer auth.Authorizer , usersService users.Service , eventsService events.Service , r * http.Request ) {
617+ func createUserFromRequest (authorizer auth.Authorizer , usersService users.Service , eventsService events.Service , r * http.Request ) * http. Request {
614618 f := logrus.Fields {
615619 "functionName" : "cmd.createUserFromRequest" ,
616620 }
617621
618622 bToken := r .Header .Get ("Authorization" )
619623 if bToken == "" {
620- return
624+ return r
621625 }
622626 t := strings .Split (bToken , " " )
623627 if len (t ) != 2 {
624628 log .WithFields (f ).Warn ("parsing of authorization header failed - expected two values separated by a space" )
625- return
629+ return r
626630 }
627631
628632 // parse user from the auth token
629633 claUser , err := authorizer .SecurityAuth (t [1 ], []string {})
630634 if err != nil {
631635 log .WithFields (f ).WithError (err ).Warn ("parsing failed" )
632- return
636+ return r
633637 }
634638 f ["claUserName" ] = claUser .Name
635639 f ["claUserID" ] = claUser .UserID
636640 f ["claUserLFUsername" ] = claUser .LFUsername
637641 f ["claUserLFEmail" ] = claUser .LFEmail
638642 f ["claUserEmails" ] = strings .Join (claUser .Emails , "," )
639643
644+ // only needed if API called is /v4/user-from-token
645+ needToStoreUser := r .URL .Path == "/v4/user-from-token"
646+
640647 // search if user exist in database by username
641648 userModel , err := usersService .GetUserByLFUserName (claUser .LFUsername )
642649 if err != nil {
643650 if _ , ok := err .(* utils.UserNotFound ); ok {
644651 log .WithFields (f ).Debug ("unable to locate user by lf-email" )
645652 } else {
646653 log .WithFields (f ).WithError (err ).Warn ("searching user by lf-username failed" )
647- return
654+ return r
648655 }
649656 }
650657 // If found - just return
651658 if userModel != nil {
652- return
659+ if ! needToStoreUser {
660+ return r
661+ }
662+ ctx := context .WithValue (r .Context (), "user" , userModel ) // nolint
663+ return r .WithContext (ctx )
653664 }
654665
655666 // search if user exist in database by username
@@ -659,12 +670,16 @@ func createUserFromRequest(authorizer auth.Authorizer, usersService users.Servic
659670 log .WithFields (f ).Debug ("unable to locate user by lf-email" )
660671 } else {
661672 log .WithFields (f ).WithError (err ).Warn ("searching user by lf-email failed" )
662- return
673+ return r
663674 }
664675 }
665676 // If found - just return
666677 if userModel != nil {
667- return
678+ if ! needToStoreUser {
679+ return r
680+ }
681+ ctx := context .WithValue (r .Context (), "user" , userModel ) // nolint
682+ return r .WithContext (ctx )
668683 }
669684
670685 // Attempt to create the user
@@ -677,7 +692,7 @@ func createUserFromRequest(authorizer auth.Authorizer, usersService users.Servic
677692 userModel , err = usersService .CreateUser (newUser , nil )
678693 if err != nil {
679694 log .WithFields (f ).WithField ("user" , newUser ).WithError (err ).Warn ("creating new user failed" )
680- return
695+ return r
681696 }
682697
683698 // Log the event
@@ -687,4 +702,9 @@ func createUserFromRequest(authorizer auth.Authorizer, usersService users.Servic
687702 UserModel : userModel ,
688703 EventData : & events.UserCreatedEventData {},
689704 })
705+ if ! needToStoreUser {
706+ return r
707+ }
708+ ctx := context .WithValue (r .Context (), "user" , userModel ) // nolint
709+ return r .WithContext (ctx )
690710}
0 commit comments