From ceb9913c427e28757f27633defe3450e4b0c93ab Mon Sep 17 00:00:00 2001 From: Yoriyasu Yano <430092+yorinasub17@users.noreply.github.com> Date: Fri, 9 Jun 2023 12:52:55 -0500 Subject: [PATCH] Add ability to resend initialization email to users Signed-off-by: Yoriyasu Yano <430092+yorinasub17@users.noreply.github.com> --- webstd/idp/aadb2c/aadb2c.go | 6 ++++++ webstd/idp/interface.go | 4 ++++ webstd/idp/nopidp/nopidp.go | 4 ++++ webstd/idp/zitadel/go.mod | 8 ++++---- webstd/idp/zitadel/go.sum | 24 ++++++++++++------------ webstd/idp/zitadel/zitadel.go | 25 +++++++++++++++++++++++++ 6 files changed, 55 insertions(+), 16 deletions(-) diff --git a/webstd/idp/aadb2c/aadb2c.go b/webstd/idp/aadb2c/aadb2c.go index 1e0dc15..00833c5 100644 --- a/webstd/idp/aadb2c/aadb2c.go +++ b/webstd/idp/aadb2c/aadb2c.go @@ -2,6 +2,7 @@ package aadb2c import ( "context" + "errors" "fmt" "math/rand" "net/url" @@ -215,3 +216,8 @@ func (a AADB2C) newUserFromProfile(profile idp.UserProfile) *graphmodels.User { return requestBody } + +// TODO +func (a AADB2C) ResendInviteEmail(ctx context.Context, userID string) error { + return errors.New("Not implemented") +} diff --git a/webstd/idp/interface.go b/webstd/idp/interface.go index 8994354..0b307dc 100644 --- a/webstd/idp/interface.go +++ b/webstd/idp/interface.go @@ -18,6 +18,10 @@ type Service interface { // GetLogoutURL will return the session logout URL for the IdP. GetLogoutURL(ctx context.Context) (string, error) + + // ResendInviteEmail will resend the invite email for the user from the IdP. This is useful if the activation link is + // expired on the IdP. + ResendInviteEmail(ctx context.Context, userID string) error } // UserProfile represents the profile information of a user. diff --git a/webstd/idp/nopidp/nopidp.go b/webstd/idp/nopidp/nopidp.go index d26da3c..de86e30 100644 --- a/webstd/idp/nopidp/nopidp.go +++ b/webstd/idp/nopidp/nopidp.go @@ -27,3 +27,7 @@ func (s NOPIdP) UpdateUser(ctx context.Context, profile idp.UserProfile) error { func (s NOPIdP) GetLogoutURL(ctx context.Context) (string, error) { return "", nil } + +func (s NOPIdP) ResendInviteEmail(ctx context.Context, userID string) error { + return nil +} diff --git a/webstd/idp/zitadel/go.mod b/webstd/idp/zitadel/go.mod index e5e9b1c..9ad341b 100644 --- a/webstd/idp/zitadel/go.mod +++ b/webstd/idp/zitadel/go.mod @@ -16,7 +16,7 @@ require ( github.com/coreos/go-oidc/v3 v3.5.0 // indirect github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect github.com/fensak-io/httpzaplog v0.1.3 // indirect - github.com/go-chi/chi/v5 v5.0.7 // indirect + github.com/go-chi/chi/v5 v5.0.8 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/gorilla/schema v1.2.0 // indirect @@ -27,9 +27,9 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/crypto v0.7.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect diff --git a/webstd/idp/zitadel/go.sum b/webstd/idp/zitadel/go.sum index 8c9f78a..3948850 100644 --- a/webstd/idp/zitadel/go.sum +++ b/webstd/idp/zitadel/go.sum @@ -10,11 +10,11 @@ github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22 github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/fensak-io/httpzaplog v0.1.3 h1:aSyXIj0VXZI0dXdQpX3ljh5wwhWbKMmQcc0Qe3balfM= github.com/fensak-io/httpzaplog v0.1.3/go.mod h1:BW2WvU6Dnl3kIgA8mE//leoyqr0fFaGnHBooXqJvHPg= -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo= github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -35,8 +35,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAsz github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= +github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= github.com/ory/nosurf v1.2.7 h1:YrHrbSensQyU6r6HT/V5+HPdVEgrOTMJiLoJABSBOp4= github.com/ory/nosurf v1.2.7/go.mod h1:d4L3ZBa7Amv55bqxCBtCs63wSlyaiCkWVl4vKf3OUxA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -73,11 +73,11 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -87,8 +87,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -102,7 +102,7 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= diff --git a/webstd/idp/zitadel/zitadel.go b/webstd/idp/zitadel/zitadel.go index 2ceeb9c..8fdf9ed 100644 --- a/webstd/idp/zitadel/zitadel.go +++ b/webstd/idp/zitadel/zitadel.go @@ -152,3 +152,28 @@ func (z Zitadel) GetLogoutURL(ctx context.Context) (string, error) { return idpLogoutURLParsed.String(), nil } + +func (z Zitadel) ResendInviteEmail(ctx context.Context, userID string) error { + emailReq := &pb.GetHumanEmailRequest{UserId: userID} + resp, err := z.c.GetHumanEmail(ctx, emailReq) + if err != nil { + z.logger.Errorf("Error looking up user %s email in IdP: %s", userID, err) + return err + } + + emailObj := resp.GetEmail() + if emailObj == nil { + z.logger.Errorf("Error looking up user %s email in IdP: email is empty", userID) + return err + } + + req := &pb.ResendHumanInitializationRequest{ + UserId: userID, + Email: emailObj.Email, + } + if _, err := z.c.ResendHumanInitialization(ctx, req); err != nil { + z.logger.Errorf("Error resending initialization email for user %s: %s", userID, err) + return err + } + return nil +}