Skip to content

Commit

Permalink
Merge 3cb076e into 871b6e0
Browse files Browse the repository at this point in the history
  • Loading branch information
bsoniam committed Oct 28, 2019
2 parents 871b6e0 + 3cb076e commit 5a07fd3
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 141 deletions.
23 changes: 12 additions & 11 deletions api/account/api.go
Expand Up @@ -4,6 +4,7 @@ import (
"errors"
"regexp"

internal "github.com/cloudtrust/keycloak-bridge/internal/keycloakb"
kc "github.com/cloudtrust/keycloak-client"
)

Expand Down Expand Up @@ -107,23 +108,23 @@ func ConvertToKCUser(user AccountRepresentation) kc.UserRepresentation {
// Validate is a validator for AccountRepresentation
func (user AccountRepresentation) Validate() error {
if user.Username != nil && !matchesRegExp(*user.Username, RegExpUsername) {
return errors.New("Invalid username")
return errors.New(internal.MsgErrInvalidParam + "." + internal.Username)
}

if user.Email != nil && !matchesRegExp(*user.Email, RegExpEmail) {
return errors.New("Invalid email")
return errors.New(internal.MsgErrInvalidParam + "." + internal.Email)
}

if user.FirstName != nil && !matchesRegExp(*user.FirstName, RegExpFirstName) {
return errors.New("Invalid firstname")
return errors.New(internal.MsgErrInvalidParam + "." + internal.Firstname)
}

if user.LastName != nil && !matchesRegExp(*user.LastName, RegExpLastName) {
return errors.New("Invalid lastname")
return errors.New(internal.MsgErrInvalidParam + "." + internal.Lastname)
}

if user.PhoneNumber != nil && !matchesRegExp(*user.PhoneNumber, RegExpPhoneNumber) {
return errors.New("Invalid phone number")
return errors.New(internal.MsgErrInvalidParam + "." + internal.PhoneNumber)
}

return nil
Expand All @@ -132,15 +133,15 @@ func (user AccountRepresentation) Validate() error {
// Validate is a validator for UpdatePasswordBody
func (updatePwd UpdatePasswordBody) Validate() error {
if !matchesRegExp(updatePwd.CurrentPassword, RegExpPassword) {
return errors.New("Invalid current Password")
return errors.New(internal.MsgErrInvalidParam + "." + internal.CurrentPassword)
}

if !matchesRegExp(updatePwd.NewPassword, RegExpPassword) {
return errors.New("Invalid new Password")
return errors.New(internal.MsgErrInvalidParam + "." + internal.NewPassword)
}

if !matchesRegExp(updatePwd.ConfirmPassword, RegExpPassword) {
return errors.New("Invalid confirm Password")
return errors.New(internal.MsgErrInvalidParam + "." + internal.ConfirmPassword)
}

return nil
Expand All @@ -149,15 +150,15 @@ func (updatePwd UpdatePasswordBody) Validate() error {
// Validate is a validator for CredentialRepresentation
func (credential CredentialRepresentation) Validate() error {
if credential.ID != nil && !matchesRegExp(*credential.ID, RegExpID) {
return errors.New("Invalid Id")
return errors.New(internal.MsgErrInvalidParam + "." + internal.ID)
}

if credential.Type != nil && !matchesRegExp(*credential.Type, RegExpType) {
return errors.New("Invalid Type")
return errors.New(internal.MsgErrInvalidParam + "." + internal.Type)
}

if credential.UserLabel != nil && !matchesRegExp(*credential.UserLabel, RegExpLabel) {
return errors.New("Invalid Label")
return errors.New(internal.MsgErrInvalidParam + "." + internal.Label)
}

return nil
Expand Down
1 change: 1 addition & 0 deletions internal/keycloakb/errormessages.go
Expand Up @@ -24,6 +24,7 @@ const (
UserID = "userId"
Username = "username"
User = "user"
UserLabel = "userLabel"
Email = "email"
Firstname = "firstname"
Lastname = "lastname"
Expand Down
22 changes: 22 additions & 0 deletions internal/keycloakb/logging.go
@@ -1,9 +1,31 @@
package keycloakb

import (
"context"
"encoding/json"
)

// Logger interface for logging with level
type Logger interface {
Debug(keyvals ...interface{}) error
Info(keyvals ...interface{}) error
Warn(keyvals ...interface{}) error
Error(keyvals ...interface{}) error
}

// LogUnrecordedEvent logs the events that could not be reported in the DB
func LogUnrecordedEvent(ctx context.Context, logger Logger, eventName string, errorMessage string, values ...string) {
if len(values)%2 != 0 {
logger.Error("err", "When logging an unrecorded event the number of parameters should be even")
}
m := map[string]interface{}{"event_name": eventName}
for i := 0; i < len(values); i += 2 {
m[values[i]] = values[i+1]
}
eventJSON, errMarshal := json.Marshal(m)
if errMarshal == nil {
logger.Error("err", errorMessage, "event", string(eventJSON))
} else {
logger.Error("err", errorMessage)
}
}
41 changes: 19 additions & 22 deletions pkg/account/component.go
Expand Up @@ -67,8 +67,12 @@ func NewComponent(keycloakAccountClient KeycloakAccountClient, eventDBModule dat
}
}

func (c *component) reportEvent(ctx context.Context, apiCall string, values ...string) error {
return c.eventDBModule.ReportEvent(ctx, apiCall, "self-service", values...)
func (c *component) reportEvent(ctx context.Context, apiCall string, values ...string) {
errEvent := c.eventDBModule.ReportEvent(ctx, apiCall, "self-service", values...)
if errEvent != nil {
//store in the logs also the event that failed to be stored in the DB
internal.LogUnrecordedEvent(ctx, c.logger, apiCall, errEvent.Error(), values...)
}
}

func (c *component) UpdatePassword(ctx context.Context, currentPassword, newPassword, confirmPassword string) error {
Expand All @@ -91,18 +95,7 @@ func (c *component) UpdatePassword(ctx context.Context, currentPassword, newPass
}

//store the API call into the DB
errEvent := c.reportEvent(ctx, "PASSWORD_RESET", database.CtEventRealmName, realm, database.CtEventUserID, userID, database.CtEventUsername, username)
if errEvent != nil {
//store in the logs also the event that failed to be stored in the DB
m := map[string]interface{}{"event_name": "PASSWORD_RESET", database.CtEventRealmName: realm, database.CtEventUserID: userID, database.CtEventUsername: username}
eventJSON, errMarshal := json.Marshal(m)
if errMarshal == nil {
c.logger.Error("err", errEvent.Error(), "event", string(eventJSON))
} else {
c.logger.Error("err", errEvent.Error())
}

}
c.reportEvent(ctx, "PASSWORD_RESET", database.CtEventRealmName, realm, database.CtEventUserID, userID, database.CtEventUsername, username)

return nil
}
Expand Down Expand Up @@ -194,7 +187,7 @@ func (c *component) UpdateAccount(ctx context.Context, user api.AccountRepresent
}

//store the API call into the DB
_ = c.reportEvent(ctx, "UPDATE_ACCOUNT", database.CtEventRealmName, realm, database.CtEventUserID, userID, database.CtEventUsername, username)
c.reportEvent(ctx, "UPDATE_ACCOUNT", database.CtEventRealmName, realm, database.CtEventUserID, userID, database.CtEventUsername, username)

return nil
}
Expand All @@ -210,6 +203,9 @@ func (c *component) DeleteAccount(ctx context.Context) error {
return err
}

//store the API call into the DB
c.reportEvent(ctx, "SELF_DELETE_ACCOUNT", database.CtEventRealmName, realm)

return nil
}

Expand Down Expand Up @@ -263,7 +259,8 @@ func (c *component) UpdateLabelCredential(ctx context.Context, credentialID stri
//store the API call into the DB
// the error should be treated
additionalInfos, _ := json.Marshal(map[string]string{"credentialID": credentialID, "label": label})
_ = c.reportEvent(ctx, "SELF_UPDATE_CREDENTIAL", database.CtEventRealmName, currentRealm, database.CtEventUserID, userID, database.CtEventUsername, username, database.CtEventAdditionalInfo, string(additionalInfos))

c.reportEvent(ctx, "SELF_UPDATE_CREDENTIAL", database.CtEventRealmName, currentRealm, database.CtEventUserID, userID, database.CtEventUsername, username, database.CtEventAdditionalInfo, string(additionalInfos))

return nil
}
Expand All @@ -281,10 +278,10 @@ func (c *component) DeleteCredential(ctx context.Context, credentialID string) e
return err
}

//store the API call into the DB
// the error should be treated
additionalInfos, _ := json.Marshal(map[string]string{"credentialID": credentialID})
_ = c.reportEvent(ctx, "SELF_DELETE_CREDENTIAL", database.CtEventRealmName, currentRealm, database.CtEventUserID, userID, database.CtEventUsername, username, database.CtEventAdditionalInfo, string(additionalInfos))

//store the API call into the DB
c.reportEvent(ctx, "SELF_DELETE_CREDENTIAL", database.CtEventRealmName, currentRealm, database.CtEventUserID, userID, database.CtEventUsername, username, database.CtEventAdditionalInfo, string(additionalInfos))

return nil
}
Expand All @@ -307,10 +304,10 @@ func (c *component) MoveCredential(ctx context.Context, credentialID string, pre
return err
}

additionalInfos, err := json.Marshal(map[string]string{"credentialID": credentialID, "previousCredentialID": previousCredentialID})

//store the API call into the DB
// the error should be treated
additionalInfos, _ := json.Marshal(map[string]string{"credentialID": credentialID, "previousCredentialID": previousCredentialID})
_ = c.reportEvent(ctx, "SELF_MOVE_CREDENTIAL", database.CtEventRealmName, currentRealm, database.CtEventUserID, userID, database.CtEventUsername, username, database.CtEventAdditionalInfo, string(additionalInfos))
c.reportEvent(ctx, "SELF_MOVE_CREDENTIAL", database.CtEventRealmName, currentRealm, database.CtEventUserID, userID, database.CtEventUsername, username, database.CtEventAdditionalInfo, string(additionalInfos))

return nil
}
Expand Down
1 change: 1 addition & 0 deletions pkg/account/component_test.go
Expand Up @@ -391,6 +391,7 @@ func TestDeleteUser(t *testing.T) {
// Delete user with succces
{
mockKeycloakAccountClient.EXPECT().DeleteAccount(accessToken, realmName).Return(nil).Times(1)
mockEventDBModule.EXPECT().ReportEvent(ctx, "SELF_DELETE_ACCOUNT", "self-service", gomock.Any(), gomock.Any()).Return(nil).AnyTimes()

err := accountComponent.DeleteAccount(ctx)

Expand Down
4 changes: 2 additions & 2 deletions pkg/account/endpoint.go
Expand Up @@ -88,15 +88,15 @@ func MakeUpdateLabelCredentialEndpoint(component AccountComponent) cs.Endpoint {

err := json.Unmarshal([]byte(m["body"]), &body)
if err != nil {
return nil, errrorhandler.CreateBadRequestError("Invalid body")
return nil, errrorhandler.CreateBadRequestError(internal.MsgErrInvalidParam + "." + internal.Body)
}

if err = body.Validate(); err != nil {
return nil, errrorhandler.CreateBadRequestError(err.Error())
}

if body.UserLabel == nil {
return nil, errrorhandler.CreateBadRequestError("User label missing")
return nil, errrorhandler.CreateBadRequestError(internal.MsgErrMissingParam + "." + internal.UserLabel)
}

return nil, component.UpdateLabelCredential(ctx, m["credentialID"], *body.UserLabel)
Expand Down
22 changes: 8 additions & 14 deletions pkg/events/component.go
Expand Up @@ -2,7 +2,6 @@ package events

import (
"context"
"encoding/json"

"github.com/cloudtrust/common-service/database"
errorhandler "github.com/cloudtrust/common-service/errors"
Expand Down Expand Up @@ -32,8 +31,13 @@ func NewComponent(db app.EventsDBModule, eventDBModule database.EventsDBModule,
}
}

func (ec *component) reportEvent(ctx context.Context, apiCall string, values ...string) error {
return ec.eventDBModule.ReportEvent(ctx, apiCall, "back-office", values...)
func (ec *component) reportEvent(ctx context.Context, apiCall string, values ...string) {
errEvent := ec.eventDBModule.ReportEvent(ctx, apiCall, "back-office", values...)
if errEvent != nil {
//store in the logs also the event that failed to be stored in the DB
app.LogUnrecordedEvent(ctx, ec.logger, apiCall, errEvent.Error(), values...)
}

}

// Get events according to optional parameters
Expand Down Expand Up @@ -65,16 +69,6 @@ func (ec *component) GetUserEvents(ctx context.Context, params map[string]string
return api.AuditEventsRepresentation{}, errorhandler.CreateMissingParameterError(app.UserID)
}

err := ec.reportEvent(ctx, "GET_ACTIVITY", database.CtEventRealmName, params["realm"], database.CtEventUserID, params["userID"])
if err != nil {
//store in the logs also the event that failed to be stored in the DB
m := map[string]interface{}{"event_name": "GET_ACTIVITY", database.CtEventRealmName: params["realm"], database.CtEventUserID: params["userID"]}
eventJSON, errMarshal := json.Marshal(m)
if errMarshal == nil {
ec.logger.Error("err", err.Error(), "event", string(eventJSON))
} else {
ec.logger.Error("err", err.Error())
}
}
ec.reportEvent(ctx, "GET_ACTIVITY", database.CtEventRealmName, params["realm"], database.CtEventUserID, params["userID"])
return ec.GetEvents(ctx, params)
}

0 comments on commit 5a07fd3

Please sign in to comment.