|
| 1 | +package rbac |
| 2 | + |
| 3 | +import ( |
| 4 | + "context" |
| 5 | + |
| 6 | + "github.com/go-gorp/gorp" |
| 7 | + "github.com/lib/pq" |
| 8 | + "github.com/rockbears/log" |
| 9 | + |
| 10 | + "github.com/ovh/cds/engine/api/database/gorpmapping" |
| 11 | + "github.com/ovh/cds/engine/gorpmapper" |
| 12 | + "github.com/ovh/cds/sdk" |
| 13 | +) |
| 14 | + |
| 15 | +func insertRbacProject(ctx context.Context, db gorpmapper.SqlExecutorWithTx, dbRP *rbacProject) error { |
| 16 | + if err := gorpmapping.InsertAndSign(ctx, db, dbRP); err != nil { |
| 17 | + return err |
| 18 | + } |
| 19 | + |
| 20 | + for _, rbProjectID := range dbRP.RBACProjectsIDs { |
| 21 | + if err := insertRbacProjectIdentifiers(ctx, db, dbRP.ID, rbProjectID); err != nil { |
| 22 | + return err |
| 23 | + } |
| 24 | + } |
| 25 | + for _, rbUserID := range dbRP.RBACUsersIDs { |
| 26 | + if err := insertRbacProjectUser(ctx, db, dbRP.ID, rbUserID); err != nil { |
| 27 | + return err |
| 28 | + } |
| 29 | + } |
| 30 | + for _, rbGroupID := range dbRP.RBACGroupsIDs { |
| 31 | + if err := insertRbacProjectGroup(ctx, db, dbRP.ID, rbGroupID); err != nil { |
| 32 | + return err |
| 33 | + } |
| 34 | + } |
| 35 | + return nil |
| 36 | +} |
| 37 | + |
| 38 | +func insertRbacProjectIdentifiers(ctx context.Context, db gorpmapper.SqlExecutorWithTx, rbacParentID int64, projectID int64) error { |
| 39 | + identifier := rbacProjectIdentifiers{ |
| 40 | + RbacProjectID: rbacParentID, |
| 41 | + ProjectID: projectID, |
| 42 | + } |
| 43 | + if err := gorpmapping.InsertAndSign(ctx, db, &identifier); err != nil { |
| 44 | + return err |
| 45 | + } |
| 46 | + return nil |
| 47 | +} |
| 48 | + |
| 49 | +func insertRbacProjectUser(ctx context.Context, db gorpmapper.SqlExecutorWithTx, rbacProjectID int64, userID string) error { |
| 50 | + rgu := rbacProjectUser{ |
| 51 | + RbacProjectID: rbacProjectID, |
| 52 | + RbacProjectUserID: userID, |
| 53 | + } |
| 54 | + if err := gorpmapping.InsertAndSign(ctx, db, &rgu); err != nil { |
| 55 | + return err |
| 56 | + } |
| 57 | + return nil |
| 58 | +} |
| 59 | + |
| 60 | +func insertRbacProjectGroup(ctx context.Context, db gorpmapper.SqlExecutorWithTx, rbacProjectID int64, groupID int64) error { |
| 61 | + rgu := rbacProjectGroup{ |
| 62 | + RbacProjectID: rbacProjectID, |
| 63 | + RbacProjectGroupID: groupID, |
| 64 | + } |
| 65 | + if err := gorpmapping.InsertAndSign(ctx, db, &rgu); err != nil { |
| 66 | + return err |
| 67 | + } |
| 68 | + return nil |
| 69 | +} |
| 70 | + |
| 71 | +func getAllRbacProjects(ctx context.Context, db gorp.SqlExecutor, q gorpmapping.Query) ([]rbacProject, error) { |
| 72 | + var rbacProjects []rbacProject |
| 73 | + if err := gorpmapping.GetAll(ctx, db, q, &rbacProjects); err != nil { |
| 74 | + return nil, err |
| 75 | + } |
| 76 | + |
| 77 | + projectsFiltered := make([]rbacProject, 0, len(rbacProjects)) |
| 78 | + for _, projectDatas := range rbacProjects { |
| 79 | + isValid, err := gorpmapping.CheckSignature(projectDatas, projectDatas.Signature) |
| 80 | + if err != nil { |
| 81 | + return nil, sdk.WrapError(err, "error when checking signature for rbac_project %d", projectDatas.ID) |
| 82 | + } |
| 83 | + if !isValid { |
| 84 | + log.Error(ctx, "rbac.getAllRbacProjects> rbac_project %d data corrupted", projectDatas.ID) |
| 85 | + continue |
| 86 | + } |
| 87 | + projectsFiltered = append(projectsFiltered, projectDatas) |
| 88 | + } |
| 89 | + return projectsFiltered, nil |
| 90 | +} |
| 91 | + |
| 92 | +func loadRbacProjectsByRoleAndIDs(ctx context.Context, db gorp.SqlExecutor, role string, rbacProjectIDs []int64) ([]rbacProject, error) { |
| 93 | + q := gorpmapping.NewQuery(`SELECT * from rbac_project WHERE role = $1 AND id = ANY($2)`).Args(role, pq.Int64Array(rbacProjectIDs)) |
| 94 | + return getAllRbacProjects(ctx, db, q) |
| 95 | +} |
0 commit comments