Skip to content

Commit

Permalink
SMQ-2670 - Fix Unauthorized User IDs can be added to domain entity ro…
Browse files Browse the repository at this point in the history
…le members (#2684)

Signed-off-by: nyagamunene <[email protected]>
  • Loading branch information
nyagamunene authored Feb 28, 2025
1 parent 17b5224 commit 98bc206
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
1 change: 1 addition & 0 deletions groups/middleware/authorization.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ func (am *authorizationMiddleware) CreateGroup(ctx context.Context, session auth
return groups.Group{}, []roles.RoleProvision{}, errors.Wrap(svcerr.ErrUnauthorizedPAT, err)
}
}

if err := am.extAuthorize(ctx, groups.DomainOpCreateGroup, smqauthz.PolicyReq{
Domain: session.DomainID,
SubjectType: policies.UserType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/absmach/supermq/pkg/authn"
smqauthz "github.com/absmach/supermq/pkg/authz"
"github.com/absmach/supermq/pkg/errors"
svcerr "github.com/absmach/supermq/pkg/errors/service"
"github.com/absmach/supermq/pkg/policies"
"github.com/absmach/supermq/pkg/roles"
"github.com/absmach/supermq/pkg/svcutil"
Expand Down Expand Up @@ -209,6 +210,10 @@ func (ram RoleManagerAuthorizationMiddleware) RoleAddMembers(ctx context.Context
}); err != nil {
return []string{}, err
}

if err := ram.authorizeMembers(ctx, session, members); err != nil {
return []string{}, err
}
return ram.svc.RoleAddMembers(ctx, session, entityID, roleID, members)
}

Expand Down Expand Up @@ -314,3 +319,39 @@ func (ram RoleManagerAuthorizationMiddleware) authorize(ctx context.Context, op
func (ram RoleManagerAuthorizationMiddleware) RemoveMemberFromAllRoles(ctx context.Context, session authn.Session, memberID string) (err error) {
return ram.svc.RemoveMemberFromAllRoles(ctx, session, memberID)
}

func (ram RoleManagerAuthorizationMiddleware) authorizeMembers(ctx context.Context, session authn.Session, members []string) error {
switch ram.entityType {
case policies.DomainType:
for _, member := range members {
if err := ram.authz.Authorize(ctx, smqauthz.PolicyReq{
Permission: policies.MembershipPermission,
Subject: member,
SubjectType: policies.UserType,
SubjectKind: policies.UsersKind,
Object: policies.SuperMQObject,
ObjectType: policies.PlatformType,
}); err != nil {
return errors.Wrap(errors.ErrAuthorization, err)
}
}
return nil

case policies.ChannelType, policies.GroupType, policies.ClientType:
for _, member := range members {
if err := ram.authz.Authorize(ctx, smqauthz.PolicyReq{
Permission: policies.MembershipPermission,
Subject: policies.EncodeDomainUserID(session.DomainID, member),
SubjectType: policies.UserType,
SubjectKind: policies.UsersKind,
Object: session.DomainID,
ObjectType: policies.DomainType,
}); err != nil {
return errors.Wrap(svcerr.ErrDomainAuthorization, err)
}
}
return nil
default:
return errors.Wrap(errors.ErrAuthorization, errors.New("unsupported policies type"))
}
}

0 comments on commit 98bc206

Please sign in to comment.