Skip to content

Commit

Permalink
[CLOUDTRUST-2295] Bridge endpoint to self-ask for an email validation
Browse files Browse the repository at this point in the history
[CLOUDTRUST-2296] Bridge endpoint to self-ask for a phone number validation
[CLOUDTRUST-2299] Send email when user updates his email/phone. Unvalidate his account validation
  • Loading branch information
fperot74 committed Feb 19, 2020
1 parent e0a8bc5 commit a9780fa
Show file tree
Hide file tree
Showing 13 changed files with 290 additions and 114 deletions.
28 changes: 14 additions & 14 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@

[[constraint]]
name = "github.com/cloudtrust/common-service"
branch = "master"
version = "v1.2.5"

[[constraint]]
name = "github.com/cloudtrust/keycloak-client"
branch = "dev"
branch = "jira-2296"

[[constraint]]
name = "github.com/go-kit/kit"
Expand Down
17 changes: 16 additions & 1 deletion api/account/swagger-api_account.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,22 @@ paths:
responses:
200:
description: Successful operation.

/account/send-verify-email:
put:
tags:
- Account
summary: Request an email verification
responses:
200:
description: successful operation
/account/send-verify-phone-number:
put:
tags:
- Account
summary: Request a phone number verification
responses:
200:
description: successful operation
components:
schemas:
UpdatePassword:
Expand Down
7 changes: 7 additions & 0 deletions cmd/keycloakb/keycloak_bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,8 @@ func main() {
UpdateLabelCredential: prepareEndpoint(account.MakeUpdateLabelCredentialEndpoint(accountComponent), "update_label_credential", influxMetrics, accountLogger, tracer, rateLimit["account"]),
MoveCredential: prepareEndpoint(account.MakeMoveCredentialEndpoint(accountComponent), "move_credential", influxMetrics, accountLogger, tracer, rateLimit["account"]),
GetConfiguration: prepareEndpoint(account.MakeGetConfigurationEndpoint(accountComponent), "get_configuration", influxMetrics, accountLogger, tracer, rateLimit["account"]),
SendVerifyEmail: prepareEndpoint(account.MakeSendVerifyEmailEndpoint(accountComponent), "send_verify_email", influxMetrics, accountLogger, tracer, rateLimit["account"]),
SendVerifyPhoneNumber: prepareEndpoint(account.MakeSendVerifyPhoneNumberEndpoint(accountComponent), "send_verify_phone_number", influxMetrics, accountLogger, tracer, rateLimit["account"]),
}
}

Expand Down Expand Up @@ -934,6 +936,8 @@ func main() {
var updateAccountHandler = configureAccountHandler(keycloakb.ComponentName, ComponentID, idGenerator, keycloakClient, audienceRequired, tracer, logger)(accountEndpoints.UpdateAccount)
var deleteAccountHandler = configureAccountHandler(keycloakb.ComponentName, ComponentID, idGenerator, keycloakClient, audienceRequired, tracer, logger)(accountEndpoints.DeleteAccount)
var getConfigurationHandler = configureAccountHandler(keycloakb.ComponentName, ComponentID, idGenerator, keycloakClient, audienceRequired, tracer, logger)(accountEndpoints.GetConfiguration)
var sendVerifyEmailHandler = configureAccountHandler(keycloakb.ComponentName, ComponentID, idGenerator, keycloakClient, audienceRequired, tracer, logger)(accountEndpoints.SendVerifyEmail)
var sendVerifyPhoneNumberHandler = configureAccountHandler(keycloakb.ComponentName, ComponentID, idGenerator, keycloakClient, audienceRequired, tracer, logger)(accountEndpoints.SendVerifyPhoneNumber)

route.Path("/account").Methods("GET").Handler(getAccountHandler)
route.Path("/account").Methods("POST").Handler(updateAccountHandler)
Expand All @@ -948,6 +952,9 @@ func main() {
route.Path("/account/credentials/{credentialID}").Methods("PUT").Handler(updateLabelCredentialHandler)
route.Path("/account/credentials/{credentialID}/after/{previousCredentialID}").Methods("POST").Handler(moveCredentialHandler)

route.Path("/account/send-verify-email").Methods("PUT").Handler(sendVerifyEmailHandler)
route.Path("/account/send-verify-phone-number").Methods("PUT").Handler(sendVerifyPhoneNumberHandler)

var handler http.Handler = route

if accessLogsEnabled {
Expand Down
10 changes: 10 additions & 0 deletions pkg/account/authorization.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,16 @@ func (c *authorizationComponentMW) GetConfiguration(ctx context.Context, realmID
return c.next.GetConfiguration(ctx, realmIDOverride)
}

func (c *authorizationComponentMW) SendVerifyEmail(ctx context.Context) error {
// No restriction for this call
return c.next.SendVerifyEmail(ctx)
}

func (c *authorizationComponentMW) SendVerifyPhoneNumber(ctx context.Context) error {
// No restriction for this call
return c.next.SendVerifyPhoneNumber(ctx)
}

func isEnabled(booleanPtr *bool) bool {
return booleanPtr != nil && *booleanPtr
}
78 changes: 51 additions & 27 deletions pkg/account/authorization_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func TestNoRestrictions(t *testing.T) {

var mockLogger = log.NewNopLogger()
var mockConfigurationDBModule = mock.NewConfigurationDBModule(mockCtrl)
var mockAccountComponent = mock.NewAccountComponent(mockCtrl)
var mockAccountComponent = mock.NewComponent(mockCtrl)

var accessToken = "TOKEN=="
var realmName = "master"
Expand All @@ -36,29 +36,53 @@ func TestNoRestrictions(t *testing.T) {
var ctx = context.WithValue(context.Background(), cs.CtContextAccessToken, accessToken)
ctx = context.WithValue(ctx, cs.CtContextRealm, realmName)

mockAccountComponent.EXPECT().GetCredentials(ctx).Return([]api.CredentialRepresentation{}, nil).Times(1)
_, err = authorizationMW.GetCredentials(ctx)
assert.Nil(t, err)

mockAccountComponent.EXPECT().GetCredentialRegistrators(ctx).Return([]string{}, nil).Times(1)
_, err = authorizationMW.GetCredentialRegistrators(ctx)
assert.Nil(t, err)

mockAccountComponent.EXPECT().UpdateLabelCredential(ctx, credentialID, "newLabel").Return(nil).Times(1)
err = authorizationMW.UpdateLabelCredential(ctx, credentialID, "newLabel")
assert.Nil(t, err)

mockAccountComponent.EXPECT().MoveCredential(ctx, credentialID, credentialID).Return(nil).Times(1)
err = authorizationMW.MoveCredential(ctx, credentialID, credentialID)
assert.Nil(t, err)

mockAccountComponent.EXPECT().GetAccount(ctx).Return(api.AccountRepresentation{}, nil).Times(1)
_, err = authorizationMW.GetAccount(ctx)
assert.Nil(t, err)

mockAccountComponent.EXPECT().GetConfiguration(ctx, "").Return(api.Configuration{}, nil).Times(1)
_, err = authorizationMW.GetConfiguration(ctx, "")
assert.Nil(t, err)
t.Run("GetCredentials", func(t *testing.T) {
mockAccountComponent.EXPECT().GetCredentials(ctx).Return([]api.CredentialRepresentation{}, nil).Times(1)
_, err = authorizationMW.GetCredentials(ctx)
assert.Nil(t, err)
})

t.Run("GetCredentialRegistrators", func(t *testing.T) {
mockAccountComponent.EXPECT().GetCredentialRegistrators(ctx).Return([]string{}, nil).Times(1)
_, err = authorizationMW.GetCredentialRegistrators(ctx)
assert.Nil(t, err)
})

t.Run("UpdateLabelCredential", func(t *testing.T) {
mockAccountComponent.EXPECT().UpdateLabelCredential(ctx, credentialID, "newLabel").Return(nil).Times(1)
err = authorizationMW.UpdateLabelCredential(ctx, credentialID, "newLabel")
assert.Nil(t, err)
})

t.Run("MoveCredential", func(t *testing.T) {
mockAccountComponent.EXPECT().MoveCredential(ctx, credentialID, credentialID).Return(nil).Times(1)
err = authorizationMW.MoveCredential(ctx, credentialID, credentialID)
assert.Nil(t, err)
})

t.Run("GetAccount", func(t *testing.T) {
mockAccountComponent.EXPECT().GetAccount(ctx).Return(api.AccountRepresentation{}, nil).Times(1)
_, err = authorizationMW.GetAccount(ctx)
assert.Nil(t, err)
})

t.Run("GetConfiguration", func(t *testing.T) {
mockAccountComponent.EXPECT().GetConfiguration(ctx, "").Return(api.Configuration{}, nil).Times(1)
_, err = authorizationMW.GetConfiguration(ctx, "")
assert.Nil(t, err)
})

t.Run("SendVerifyEmail", func(t *testing.T) {
mockAccountComponent.EXPECT().SendVerifyEmail(ctx).Return(nil).Times(1)
err = authorizationMW.SendVerifyEmail(ctx)
assert.Nil(t, err)
})

t.Run("SendVerifyPhoneNumber", func(t *testing.T) {
mockAccountComponent.EXPECT().SendVerifyPhoneNumber(ctx).Return(nil).Times(1)
err = authorizationMW.SendVerifyPhoneNumber(ctx)
assert.Nil(t, err)
})
}
}

Expand All @@ -68,7 +92,7 @@ func TestDeny(t *testing.T) {

var mockLogger = log.NewNopLogger()
var mockConfigurationDBModule = mock.NewConfigurationDBModule(mockCtrl)
var mockAccountComponent = mock.NewAccountComponent(mockCtrl)
var mockAccountComponent = mock.NewComponent(mockCtrl)

var accessToken = "TOKEN=="
var realmName = "master"
Expand Down Expand Up @@ -116,7 +140,7 @@ func TestAllowed(t *testing.T) {

var mockLogger = log.NewNopLogger()
var mockConfigurationDBModule = mock.NewConfigurationDBModule(mockCtrl)
var mockAccountComponent = mock.NewAccountComponent(mockCtrl)
var mockAccountComponent = mock.NewComponent(mockCtrl)

var accessToken = "TOKEN=="
var realmName = "master"
Expand Down Expand Up @@ -169,7 +193,7 @@ func TestError(t *testing.T) {

var mockLogger = log.NewNopLogger()
var mockConfigurationDBModule = mock.NewConfigurationDBModule(mockCtrl)
var mockAccountComponent = mock.NewAccountComponent(mockCtrl)
var mockAccountComponent = mock.NewComponent(mockCtrl)

var accessToken = "TOKEN=="
var realmName = "master"
Expand Down
Loading

0 comments on commit a9780fa

Please sign in to comment.