@@ -37,38 +37,50 @@ func (a *API) Invite(w http.ResponseWriter, r *http.Request) error {
3737 if err != nil && ! models .IsNotFoundError (err ) {
3838 return apierrors .NewInternalServerError ("Database error finding user" ).WithInternalError (err )
3939 }
40- if user != nil && user .IsConfirmed () {
41- return apierrors .NewUnprocessableEntityError (apierrors .ErrorCodeEmailExists , DuplicateEmailMsg )
42- }
4340
44- signupParams := SignupParams {
45- Email : params .Email ,
46- Data : params .Data ,
47- Aud : aud ,
48- Provider : "email" ,
49- }
41+ isCreate := user == nil
42+ isConfirmed := user != nil && user .IsConfirmed ()
5043
51- user , err = signupParams . ToUserModel ( false /* <- isSSOUser */ )
52- if err != nil {
53- return err
54- }
55- if err := a . triggerBeforeUserCreated ( r , db , user ); err != nil {
56- return err
57- }
44+ if isCreate {
45+ signupParams := SignupParams {
46+ Email : params . Email ,
47+ Data : params . Data ,
48+ Aud : aud ,
49+ Provider : "email" ,
50+ }
5851
59- err = db .Transaction (func (tx * storage.Connection ) error {
60- user , err = a .signupNewUser (tx , user )
52+ // because params above sets no password, this method
53+ // is not computationally hard so it can be used within
54+ // a database transaction
55+ user , err = signupParams .ToUserModel (false /* <- isSSOUser */ )
6156 if err != nil {
6257 return err
6358 }
64- identity , err := a .createNewIdentity (tx , user , "email" , structs .Map (provider.Claims {
65- Subject : user .ID .String (),
66- Email : user .GetEmail (),
67- }))
68- if err != nil {
59+
60+ if err := a .triggerBeforeUserCreated (r , db , user ); err != nil {
6961 return err
7062 }
71- user .Identities = []models.Identity {* identity }
63+ }
64+
65+ err = db .Transaction (func (tx * storage.Connection ) error {
66+ if ! isCreate {
67+ if isConfirmed {
68+ return apierrors .NewUnprocessableEntityError (apierrors .ErrorCodeEmailExists , DuplicateEmailMsg )
69+ }
70+ } else {
71+ user , err = a .signupNewUser (tx , user )
72+ if err != nil {
73+ return err
74+ }
75+ identity , err := a .createNewIdentity (tx , user , "email" , structs .Map (provider.Claims {
76+ Subject : user .ID .String (),
77+ Email : user .GetEmail (),
78+ }))
79+ if err != nil {
80+ return err
81+ }
82+ user .Identities = []models.Identity {* identity }
83+ }
7284
7385 if terr := models .NewAuditLogEntry (r , tx , adminUser , models .UserInvitedAction , "" , map [string ]interface {}{
7486 "user_id" : user .ID ,
0 commit comments