Files
paralus/pkg/service/audit_log.go
Nirav ParikhandGitHub 1b7a9a1fa3 changes to view auditlogs by project role users (#247)
feat: changes to view audit logs by project and cluster role users
---------

Signed-off-by: niravparikh05 <nir.parikh05@gmail.com>
2023-09-21 11:34:56 +05:30

113 lines
3.3 KiB
Go

package service
import (
"context"
"errors"
"fmt"
"github.com/google/uuid"
"github.com/paralus/paralus/internal/dao"
v1 "github.com/paralus/paralus/proto/rpc/audit"
"github.com/uptrace/bun"
)
type AuditLogService interface {
GetAuditLog(ctx context.Context, req *v1.GetAuditLogSearchRequest) (res *v1.GetAuditLogSearchResponse, err error)
GetAuditLogByProjects(ctx context.Context, req *v1.GetAuditLogSearchRequest) (res *v1.GetAuditLogSearchResponse, err error)
}
// auditlogs permissions
const (
OrgRelayAuditPermission = "org.relayAudit.read"
ProjectRelayAuditPermission = "project.relayAudit.read"
ProjectAuditLogPermission = "project.auditLog.read"
)
func NewAuditLogElasticSearchService(url string, auditPattern string, logPrefix string, db *bun.DB) (AuditLogService, error) {
auditQuery, err := NewElasticSearchQuery(url, auditPattern, logPrefix)
if err != nil {
return nil, err
}
return &auditLogElasticSearchService{auditQuery: auditQuery, db: db}, nil
}
func NewAuditLogDatabaseService(db *bun.DB, tag string) (AuditLogService, error) {
return &auditLogDatabaseService{db: db, tag: tag}, nil
}
type RelayAuditService interface {
GetRelayAudit(ctx context.Context, req *v1.RelayAuditRequest) (res *v1.RelayAuditResponse, err error)
GetRelayAuditByProjects(ctx context.Context, req *v1.RelayAuditRequest) (res *v1.RelayAuditResponse, err error)
}
func NewRelayAuditDatabaseService(db *bun.DB, tag string) (RelayAuditService, error) {
return &relayAuditDatabaseService{db: db, tag: tag}, nil
}
func NewRelayAuditElasticSearchService(url string, auditPattern string, logPrefix string, db *bun.DB) (RelayAuditService, error) {
relayQuery, err := NewElasticSearchQuery(url, auditPattern, logPrefix)
if err != nil {
return nil, err
}
return &relayAuditElasticSearchService{relayQuery: relayQuery, db: db}, nil
}
func ValidateUserAuditReadRequest(ctx context.Context, projects []string, db *bun.DB, isRelayAudit bool) error {
var prerr error
//validate user authz with incoming request
sd, ok := GetSessionDataFromContext(ctx)
if !ok {
return errors.New("failed to get session data")
}
_log.Infow("fetching auditlogs", "account", sd)
// let's check if user has organization scoped roles associated
isOrgAdmin, err := dao.IsOrgAdmin(ctx, db, uuid.MustParse(sd.Account), uuid.MustParse(sd.Partner))
if err != nil {
return err
}
if isOrgAdmin {
return prerr
}
isOrgReadOnly, err := dao.IsOrgReadOnly(ctx, db, uuid.MustParse(sd.Account), uuid.MustParse(sd.Organization), uuid.MustParse(sd.Partner))
if err != nil {
return err
}
if isOrgReadOnly {
return prerr
}
sap, err := dao.GetAccountPermissions(ctx, db, uuid.MustParse(sd.Account), uuid.MustParse(sd.Organization), uuid.MustParse(sd.Partner))
if err != nil {
return err
}
for _, rproject := range projects {
rprojectid, err := dao.GetProjectId(ctx, db, rproject)
if err != nil {
return err
}
available := false
for _, ap := range sap {
if rprojectid == ap.ProjectId {
if isRelayAudit {
if ap.PermissionName == ProjectRelayAuditPermission {
available = true
break
}
} else {
if ap.PermissionName == ProjectAuditLogPermission {
available = true
break
}
}
}
}
if !available {
prerr = errors.Join(prerr, fmt.Errorf("not authorized for project %s", rproject))
}
}
return prerr
}