Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: multitenancy emailverification impl #319

Merged
merged 3 commits into from
Jul 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions recipe/dashboard/api/userdetails/userEmailVerifyPut.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func UserEmailVerifyPut(apiInterface dashboardmodels.APIInterface, options dashb
}

if *readBody.Verified {
tokenResponse, tokenErr := emailverification.CreateEmailVerificationToken(*readBody.UserID, nil, userContext)
tokenResponse, tokenErr := emailverification.CreateEmailVerificationToken("public", *readBody.UserID, nil, userContext) // TODO multitenancy pass tenantId

if tokenErr != nil {
return userEmailVerifyPutResponse{}, tokenErr
Expand All @@ -71,7 +71,7 @@ func UserEmailVerifyPut(apiInterface dashboardmodels.APIInterface, options dashb
}, nil
}

verifyResponse, verifyErr := emailverification.VerifyEmailUsingToken(tokenResponse.OK.Token, userContext)
verifyResponse, verifyErr := emailverification.VerifyEmailUsingToken("public", tokenResponse.OK.Token, userContext) // TODO multitenancy pass tenantId

if verifyErr != nil {
return userEmailVerifyPutResponse{}, verifyErr
Expand Down
5 changes: 3 additions & 2 deletions recipe/dashboard/api/userdetails/userEmailVerifyTokenPost.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func UserEmailVerifyTokenPost(apiInterface dashboardmodels.APIInterface, options
return userEmailVerifyTokenPost{}, errors.New("Should never come here")
}

emailVerificationToken, tokenError := emailverification.CreateEmailVerificationToken(*readBody.UserId, &emailresponse.OK.Email)
emailVerificationToken, tokenError := emailverification.CreateEmailVerificationToken("public", *readBody.UserId, &emailresponse.OK.Email) // TODO multitenancy pass tenantId

if tokenError != nil {
return userEmailVerifyTokenPost{}, tokenError
Expand All @@ -76,11 +76,12 @@ func UserEmailVerifyTokenPost(apiInterface dashboardmodels.APIInterface, options
}

emailVerificationURL := fmt.Sprintf(
"%s%s/verify-email?token=%s&rid=%s",
"%s%s/verify-email?token=%s&rid=%s&tenantId=%s",
options.AppInfo.WebsiteDomain.GetAsStringDangerous(),
options.AppInfo.WebsiteBasePath.GetAsStringDangerous(),
emailVerificationToken.OK.Token,
options.RecipeID,
"public", // TODO multitenancy pass tenantId
)

emailverification.SendEmail(emaildelivery.EmailType{
Expand Down
26 changes: 13 additions & 13 deletions recipe/emailpassword/emailExistsAndVerificationCheck_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -969,8 +969,8 @@ func TestThatTheHandlePostEmailVerificationCallBackIsCalledOnSuccessFullVerifica
Override: &evmodels.OverrideStruct{
APIs: func(originalImplementation evmodels.APIInterface) evmodels.APIInterface {
originalVerifyEmailPost := *originalImplementation.VerifyEmailPOST
*originalImplementation.VerifyEmailPOST = func(token string, sessionContainer sessmodels.SessionContainer, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
res, err := originalVerifyEmailPost(token, sessionContainer, options, userContext)
*originalImplementation.VerifyEmailPOST = func(token string, sessionContainer sessmodels.SessionContainer, tenantId string, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
res, err := originalVerifyEmailPost(token, sessionContainer, tenantId, options, userContext)
if err != nil {
log.Fatal(err.Error())
}
Expand Down Expand Up @@ -1238,8 +1238,8 @@ func TestTheEmailVerifyAPIwithValidInputOverridingAPIs(t *testing.T) {
Override: &evmodels.OverrideStruct{
APIs: func(originalImplementation evmodels.APIInterface) evmodels.APIInterface {
originalVerifyEmailPost := *originalImplementation.VerifyEmailPOST
*originalImplementation.VerifyEmailPOST = func(token string, sessionContainer sessmodels.SessionContainer, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
res, err := originalVerifyEmailPost(token, sessionContainer, options, userContext)
*originalImplementation.VerifyEmailPOST = func(token string, sessionContainer sessmodels.SessionContainer, tenantId string, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
res, err := originalVerifyEmailPost(token, sessionContainer, tenantId, options, userContext)
if err != nil {
log.Fatal(err.Error())
}
Expand Down Expand Up @@ -1344,8 +1344,8 @@ func TestTheEmailVerifyAPIwithValidInputAndOverridingFunctions(t *testing.T) {
Override: &evmodels.OverrideStruct{
Functions: func(originalImplementation evmodels.RecipeInterface) evmodels.RecipeInterface {
originalVerifyUsingToken := *originalImplementation.VerifyEmailUsingToken
*originalImplementation.VerifyEmailUsingToken = func(token string, userContext supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
res, err := originalVerifyUsingToken(token, userContext)
*originalImplementation.VerifyEmailUsingToken = func(token string, tenantId string, userContext supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
res, err := originalVerifyUsingToken(token, tenantId, userContext)
if err != nil {
log.Fatal(err.Error())
}
Expand Down Expand Up @@ -1450,8 +1450,8 @@ func TestTheEmailVerifyAPIwithValidInputThrowsErrorOnSuchOverriding(t *testing.T
Override: &evmodels.OverrideStruct{
APIs: func(originalImplementation evmodels.APIInterface) evmodels.APIInterface {
originalVerifyEmailPost := *originalImplementation.VerifyEmailPOST
*originalImplementation.VerifyEmailPOST = func(token string, sessionContainer sessmodels.SessionContainer, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
res, err := originalVerifyEmailPost(token, sessionContainer, options, userContext)
*originalImplementation.VerifyEmailPOST = func(token string, sessionContainer sessmodels.SessionContainer, tenantId string, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
res, err := originalVerifyEmailPost(token, sessionContainer, tenantId, options, userContext)
if err != nil {
log.Fatal(err.Error())
}
Expand Down Expand Up @@ -1554,8 +1554,8 @@ func TestTheEmailVerifyAPIWithValidInputOverridingFunctionsThrowsError(t *testin
Override: &evmodels.OverrideStruct{
Functions: func(originalImplementation evmodels.RecipeInterface) evmodels.RecipeInterface {
originalVerifyUsingToken := *originalImplementation.VerifyEmailUsingToken
*originalImplementation.VerifyEmailUsingToken = func(token string, userContext supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
res, err := originalVerifyUsingToken(token, userContext)
*originalImplementation.VerifyEmailUsingToken = func(token string, tenantId string, userContext supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
res, err := originalVerifyUsingToken(token, tenantId, userContext)
if err != nil {
log.Fatal(err.Error())
}
Expand Down Expand Up @@ -1698,15 +1698,15 @@ func TestTheGenerateTokenAPIWithValidInputAndThenRemoveToken(t *testing.T) {

userId := response["user"].(map[string]interface{})["id"]

res, err := emailverification.CreateEmailVerificationToken(userId.(string), nil)
res, err := emailverification.CreateEmailVerificationToken("public", userId.(string), nil)
if err != nil {
t.Error(err.Error())
}
verifyToken := res.OK.Token

emailverification.RevokeEmailVerificationTokens(userId.(string), nil)
emailverification.RevokeEmailVerificationTokens("public", userId.(string), nil)

res1, err := emailverification.VerifyEmailUsingToken(verifyToken)
res1, err := emailverification.VerifyEmailUsingToken("public", verifyToken)
assert.NoError(t, err)
assert.NotNil(t, res1.EmailVerificationInvalidTokenError)
assert.Nil(t, res1.OK)
Expand Down
4 changes: 2 additions & 2 deletions recipe/emailpassword/ev_session_claim_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ func TestEVGenerateUpdatesSessionClaims(t *testing.T) {
infoFromResponse := unittesting.ExtractInfoFromResponse(resp)
antiCsrf := infoFromResponse["antiCsrf"]

token, err := emailverification.CreateEmailVerificationToken(userId, nil)
token, err := emailverification.CreateEmailVerificationToken("public", userId, nil)
assert.NoError(t, err)
_, err = emailverification.VerifyEmailUsingToken(token.OK.Token)
_, err = emailverification.VerifyEmailUsingToken("public", token.OK.Token)
assert.NoError(t, err)

resp, err = unittesting.EmailVerifyTokenRequest(
Expand Down
4 changes: 2 additions & 2 deletions recipe/emailverification/api/emailverify.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (
"github.com/supertokens/supertokens-golang/supertokens"
)

func EmailVerify(apiImplementation evmodels.APIInterface, options evmodels.APIOptions, userContext supertokens.UserContext) error {
func EmailVerify(apiImplementation evmodels.APIInterface, tenantId string, options evmodels.APIOptions, userContext supertokens.UserContext) error {
var result map[string]interface{}
if options.Req.Method == http.MethodPost {
if apiImplementation.VerifyEmailPOST == nil ||
Expand Down Expand Up @@ -69,7 +69,7 @@ func EmailVerify(apiImplementation evmodels.APIInterface, options evmodels.APIOp
return supertokens.BadInputError{Msg: "The email verification token must be a string"}
}

response, err := (*apiImplementation.VerifyEmailPOST)(token.(string), sessionContainer, options, userContext)
response, err := (*apiImplementation.VerifyEmailPOST)(token.(string), sessionContainer, tenantId, options, userContext)
if err != nil {
return err
}
Expand Down
9 changes: 5 additions & 4 deletions recipe/emailverification/api/implementation.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import (
)

func MakeAPIImplementation() evmodels.APIInterface {
verifyEmailPOST := func(token string, sessionContainer sessmodels.SessionContainer, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
resp, err := (*options.RecipeImplementation.VerifyEmailUsingToken)(token, userContext)
verifyEmailPOST := func(token string, sessionContainer sessmodels.SessionContainer, tenantId string, options evmodels.APIOptions, userContext supertokens.UserContext) (evmodels.VerifyEmailPOSTResponse, error) {
resp, err := (*options.RecipeImplementation.VerifyEmailUsingToken)(token, tenantId, userContext)
if err != nil {
return evmodels.VerifyEmailPOSTResponse{}, err
}
Expand Down Expand Up @@ -99,7 +99,7 @@ func MakeAPIImplementation() evmodels.APIInterface {
EmailAlreadyVerifiedError: &struct{}{},
}, nil
}
response, err := (*options.RecipeImplementation.CreateEmailVerificationToken)(userID, email.OK.Email, userContext)
response, err := (*options.RecipeImplementation.CreateEmailVerificationToken)(userID, email.OK.Email, "public", userContext) // TODO multitenancy pass tenantId from session
if err != nil {
return evmodels.GenerateEmailVerifyTokenPOSTResponse{}, err
}
Expand All @@ -123,11 +123,12 @@ func MakeAPIImplementation() evmodels.APIInterface {
Email: email.OK.Email,
}
emailVerificationURL := fmt.Sprintf(
"%s%s/verify-email?token=%s&rid=%s",
"%s%s/verify-email?token=%s&rid=%s&tenantId=%s",
options.AppInfo.WebsiteDomain.GetAsStringDangerous(),
options.AppInfo.WebsiteBasePath.GetAsStringDangerous(),
response.OK.Token,
options.RecipeID,
"public", // TODO multitenancy pass tenantId from session
)

supertokens.LogDebugMessage(fmt.Sprintf("Sending email verification email to %s", email.OK.Email))
Expand Down
2 changes: 1 addition & 1 deletion recipe/emailverification/evmodels/apiInterface.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ type APIOptions struct {
}

type APIInterface struct {
VerifyEmailPOST *func(token string, sessionContainer sessmodels.SessionContainer, options APIOptions, userContext supertokens.UserContext) (VerifyEmailPOSTResponse, error)
VerifyEmailPOST *func(token string, sessionContainer sessmodels.SessionContainer, tenantId string, options APIOptions, userContext supertokens.UserContext) (VerifyEmailPOSTResponse, error)
IsEmailVerifiedGET *func(sessionContainer sessmodels.SessionContainer, options APIOptions, userContext supertokens.UserContext) (IsEmailVerifiedGETResponse, error)
GenerateEmailVerifyTokenPOST *func(sessionContainer sessmodels.SessionContainer, options APIOptions, userContext supertokens.UserContext) (GenerateEmailVerifyTokenPOSTResponse, error)
}
Expand Down
6 changes: 3 additions & 3 deletions recipe/emailverification/evmodels/recipeInterface.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ package evmodels
import "github.com/supertokens/supertokens-golang/supertokens"

type RecipeInterface struct {
CreateEmailVerificationToken *func(userID, email string, userContext supertokens.UserContext) (CreateEmailVerificationTokenResponse, error)
VerifyEmailUsingToken *func(token string, userContext supertokens.UserContext) (VerifyEmailUsingTokenResponse, error)
CreateEmailVerificationToken *func(userID, email string, tenantId string, userContext supertokens.UserContext) (CreateEmailVerificationTokenResponse, error)
VerifyEmailUsingToken *func(token string, tenantId string, userContext supertokens.UserContext) (VerifyEmailUsingTokenResponse, error)
IsEmailVerified *func(userID, email string, userContext supertokens.UserContext) (bool, error)
RevokeEmailVerificationTokens *func(userId, email string, userContext supertokens.UserContext) (RevokeEmailVerificationTokensResponse, error)
RevokeEmailVerificationTokens *func(userId, email string, tenantId string, userContext supertokens.UserContext) (RevokeEmailVerificationTokensResponse, error)
UnverifyEmail *func(userId, email string, userContext supertokens.UserContext) (UnverifyEmailResponse, error)
}

Expand Down
12 changes: 6 additions & 6 deletions recipe/emailverification/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func Init(config evmodels.TypeInput) supertokens.Recipe {
return recipeInit(config)
}

func CreateEmailVerificationToken(userID string, email *string, userContext ...supertokens.UserContext) (evmodels.CreateEmailVerificationTokenResponse, error) {
func CreateEmailVerificationToken(tenantId string, userID string, email *string, userContext ...supertokens.UserContext) (evmodels.CreateEmailVerificationTokenResponse, error) {
instance, err := getRecipeInstanceOrThrowError()
if err != nil {
return evmodels.CreateEmailVerificationTokenResponse{}, err
Expand All @@ -51,18 +51,18 @@ func CreateEmailVerificationToken(userID string, email *string, userContext ...s
return evmodels.CreateEmailVerificationTokenResponse{}, errors.New("unknown user id provided without email")
}
}
return (*instance.RecipeImpl.CreateEmailVerificationToken)(userID, *email, userContext[0])
return (*instance.RecipeImpl.CreateEmailVerificationToken)(userID, *email, tenantId, userContext[0])
}

func VerifyEmailUsingToken(token string, userContext ...supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
func VerifyEmailUsingToken(tenantId string, token string, userContext ...supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
instance, err := getRecipeInstanceOrThrowError()
if err != nil {
return evmodels.VerifyEmailUsingTokenResponse{}, err
}
if len(userContext) == 0 {
userContext = append(userContext, &map[string]interface{}{})
}
return (*instance.RecipeImpl.VerifyEmailUsingToken)(token, userContext[0])
return (*instance.RecipeImpl.VerifyEmailUsingToken)(token, tenantId, userContext[0])
}

func IsEmailVerified(userID string, email *string, userContext ...supertokens.UserContext) (bool, error) {
Expand All @@ -89,7 +89,7 @@ func IsEmailVerified(userID string, email *string, userContext ...supertokens.Us
return (*instance.RecipeImpl.IsEmailVerified)(userID, *email, userContext[0])
}

func RevokeEmailVerificationTokens(userID string, email *string, userContext ...supertokens.UserContext) (evmodels.RevokeEmailVerificationTokensResponse, error) {
func RevokeEmailVerificationTokens(tenantId string, userID string, email *string, userContext ...supertokens.UserContext) (evmodels.RevokeEmailVerificationTokensResponse, error) {
instance, err := getRecipeInstanceOrThrowError()
if err != nil {
return evmodels.RevokeEmailVerificationTokensResponse{}, err
Expand All @@ -112,7 +112,7 @@ func RevokeEmailVerificationTokens(userID string, email *string, userContext ...
return evmodels.RevokeEmailVerificationTokensResponse{}, errors.New("unknown user id provided without email")
}
}
return (*instance.RecipeImpl.RevokeEmailVerificationTokens)(userID, *email, userContext[0])
return (*instance.RecipeImpl.RevokeEmailVerificationTokens)(userID, *email, tenantId, userContext[0])
}

func UnverifyEmail(userID string, email *string, userContext ...supertokens.UserContext) (evmodels.UnverifyEmailResponse, error) {
Expand Down
2 changes: 1 addition & 1 deletion recipe/emailverification/recipe.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ func (r *Recipe) handleAPIRequest(id string, tenantId string, req *http.Request,
if id == generateEmailVerifyTokenAPI {
return api.GenerateEmailVerifyToken(r.APIImpl, options, userContext)
} else {
return api.EmailVerify(r.APIImpl, options, userContext)
return api.EmailVerify(r.APIImpl, tenantId, options, userContext)
}
}

Expand Down
12 changes: 6 additions & 6 deletions recipe/emailverification/recipeimplementation.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ import (
)

func makeRecipeImplementation(querier supertokens.Querier) evmodels.RecipeInterface {
createEmailVerificationToken := func(userID, email string, userContext supertokens.UserContext) (evmodels.CreateEmailVerificationTokenResponse, error) {
response, err := querier.SendPostRequest("/recipe/user/email/verify/token", map[string]interface{}{
createEmailVerificationToken := func(userID, email string, tenantId string, userContext supertokens.UserContext) (evmodels.CreateEmailVerificationTokenResponse, error) {
response, err := querier.SendPostRequest(tenantId+"/recipe/user/email/verify/token", map[string]interface{}{
"userId": userID,
"email": email,
})
Expand All @@ -41,8 +41,8 @@ func makeRecipeImplementation(querier supertokens.Querier) evmodels.RecipeInterf
}, nil
}

verifyEmailUsingToken := func(token string, userContext supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
response, err := querier.SendPostRequest("/recipe/user/email/verify", map[string]interface{}{
verifyEmailUsingToken := func(token string, tenantId string, userContext supertokens.UserContext) (evmodels.VerifyEmailUsingTokenResponse, error) {
response, err := querier.SendPostRequest(tenantId+"/recipe/user/email/verify", map[string]interface{}{
"method": "token",
"token": token,
})
Expand Down Expand Up @@ -74,8 +74,8 @@ func makeRecipeImplementation(querier supertokens.Querier) evmodels.RecipeInterf
return response["isVerified"].(bool), nil
}

revokeEmailVerificationTokens := func(userId string, email string, userContext supertokens.UserContext) (evmodels.RevokeEmailVerificationTokensResponse, error) {
_, err := querier.SendPostRequest("/recipe/user/email/verify/token/remove", map[string]interface{}{
revokeEmailVerificationTokens := func(userId string, email string, tenantId string, userContext supertokens.UserContext) (evmodels.RevokeEmailVerificationTokensResponse, error) {
_, err := querier.SendPostRequest(tenantId+"/recipe/user/email/verify/token/remove", map[string]interface{}{
"userId": userId,
"email": email,
})
Expand Down
Loading
Loading