9
9
"github.com/lib/pq"
10
10
11
11
"github.com/ovh/cds/engine/api/database/gorpmapping"
12
+ "github.com/ovh/cds/engine/gorpmapper"
12
13
"github.com/ovh/cds/sdk"
13
14
)
14
15
@@ -27,7 +28,7 @@ func LoadRoleGroupInWorkflow(db gorp.SqlExecutor, workflowID, groupID int64) (in
27
28
}
28
29
29
30
// AddWorkflowGroup Add permission on the given workflow for the given group
30
- func AddWorkflowGroup (ctx context.Context , db gorp. SqlExecutor , w * sdk.Workflow , gp sdk.GroupPermission ) error {
31
+ func AddWorkflowGroup (ctx context.Context , db gorpmapper. SqlExecutorWithTx , w * sdk.Workflow , gp sdk.GroupPermission ) error {
31
32
link , err := LoadLinkGroupProjectForGroupIDAndProjectID (ctx , db , gp .Group .ID , w .ProjectID )
32
33
if err != nil {
33
34
if sdk .ErrorIs (err , sdk .ErrNotFound ) {
@@ -48,24 +49,20 @@ func AddWorkflowGroup(ctx context.Context, db gorp.SqlExecutor, w *sdk.Workflow,
48
49
}
49
50
50
51
// UpdateWorkflowGroup update group permission for the given group on the current workflow
51
- func UpdateWorkflowGroup (ctx context.Context , db gorp. SqlExecutor , w * sdk.Workflow , gp sdk.GroupPermission ) error {
52
+ func UpdateWorkflowGroup (ctx context.Context , db gorpmapper. SqlExecutorWithTx , w * sdk.Workflow , gp sdk.GroupPermission ) error {
52
53
link , err := LoadLinkGroupProjectForGroupIDAndProjectID (ctx , db , gp .Group .ID , w .ProjectID )
53
54
if err != nil {
55
+ if sdk .ErrorIs (err , sdk .ErrNotFound ) {
56
+ return sdk .WithStack (sdk .ErrGroupNotFoundInProject )
57
+ }
54
58
return sdk .WrapError (err , "cannot load role for group %d in project %d" , gp .Group .ID , w .ProjectID )
55
59
}
56
60
if link .Role == sdk .PermissionReadWriteExecute && gp .Permission < link .Role {
57
61
return sdk .WithStack (sdk .ErrWorkflowPermInsufficient )
58
62
}
59
63
60
- query := `
61
- UPDATE workflow_perm
62
- SET role = $1
63
- FROM project_group
64
- WHERE project_group.id = workflow_perm.project_group_id
65
- AND workflow_perm.workflow_id = $2
66
- AND project_group.group_id = $3
67
- `
68
- if _ , err := db .Exec (query , gp .Permission , w .ID , gp .Group .ID ); err != nil {
64
+ query := "UPDATE workflow_perm SET role = $3 WHERE project_group_id = $1 AND workflow_id = $2"
65
+ if _ , err := db .Exec (query , link .ID , w .ID , gp .Permission ); err != nil {
69
66
return sdk .WithStack (err )
70
67
}
71
68
@@ -76,32 +73,40 @@ func UpdateWorkflowGroup(ctx context.Context, db gorp.SqlExecutor, w *sdk.Workfl
76
73
}
77
74
}
78
75
79
- ok , err := checkAtLeastOneGroupWithWriteRoleOnWorkflow (db , w .ID )
80
- if err != nil {
76
+ if err := checkAtLeastOneRWXRoleOnWorkflow (db , w .ID ); err != nil {
81
77
return err
82
78
}
83
- if ! ok {
84
- return sdk .WithStack (sdk .ErrLastGroupWithWriteRole )
85
- }
86
79
87
80
return nil
88
81
}
89
82
90
83
// UpsertAllWorkflowGroups upsert all groups in a workflow
91
- func UpsertAllWorkflowGroups (db gorp.SqlExecutor , w * sdk.Workflow , gps []sdk.GroupPermission ) error {
84
+ func UpsertAllWorkflowGroups (ctx context.Context , db gorpmapper.SqlExecutorWithTx , w * sdk.Workflow , gps []sdk.GroupPermission ) error {
85
+ query := "DELETE FROM workflow_perm WHERE workflow_id = $1"
86
+ if _ , err := db .Exec (query , w .ID ); err != nil {
87
+ return sdk .WrapError (err , "unable to remove group permissions for workflow %d" , w .ID )
88
+ }
89
+
92
90
for _ , gp := range gps {
91
+ link , err := LoadLinkGroupProjectForGroupIDAndProjectID (ctx , db , gp .Group .ID , w .ProjectID )
92
+ if err != nil {
93
+ if sdk .ErrorIs (err , sdk .ErrNotFound ) {
94
+ return sdk .WithStack (sdk .ErrGroupNotFoundInProject )
95
+ }
96
+ return sdk .WrapError (err , "cannot load role for group %d in project %d" , gp .Group .ID , w .ProjectID )
97
+ }
98
+ if link .Role == sdk .PermissionReadWriteExecute && gp .Permission < link .Role {
99
+ return sdk .WithStack (sdk .ErrWorkflowPermInsufficient )
100
+ }
101
+
93
102
if err := UpsertWorkflowGroup (db , w .ProjectID , w .ID , gp ); err != nil {
94
103
return err
95
104
}
96
105
}
97
106
98
- ok , err := checkAtLeastOneGroupWithWriteRoleOnWorkflow (db , w .ID )
99
- if err != nil {
107
+ if err := checkAtLeastOneRWXRoleOnWorkflow (db , w .ID ); err != nil {
100
108
return err
101
109
}
102
- if ! ok {
103
- return sdk .WithStack (sdk .ErrLastGroupWithWriteRole )
104
- }
105
110
106
111
return nil
107
112
}
@@ -134,36 +139,25 @@ func DeleteWorkflowGroup(db gorp.SqlExecutor, w *sdk.Workflow, groupID int64, in
134
139
return sdk .WithStack (err )
135
140
}
136
141
137
- ok , err := checkAtLeastOneGroupWithWriteRoleOnWorkflow (db , w .ID )
138
- if err != nil {
142
+ if err := checkAtLeastOneRWXRoleOnWorkflow (db , w .ID ); err != nil {
139
143
return err
140
144
}
141
- if ! ok {
142
- return sdk .WithStack (sdk .ErrLastGroupWithWriteRole )
143
- }
145
+
144
146
w .Groups = append (w .Groups [:index ], w .Groups [index + 1 :]... )
145
- return nil
146
- }
147
147
148
- // DeleteAllWorkflowGroups removes all group permission for the given workflow.
149
- func DeleteAllWorkflowGroups (db gorp.SqlExecutor , workflowID int64 ) error {
150
- query := `
151
- DELETE FROM workflow_perm
152
- WHERE workflow_id = $1
153
- `
154
- if _ , err := db .Exec (query , workflowID ); err != nil {
155
- return sdk .WrapError (err , "unable to remove group permissions for workflow %d" , workflowID )
156
- }
157
148
return nil
158
149
}
159
150
160
- func checkAtLeastOneGroupWithWriteRoleOnWorkflow (db gorp.SqlExecutor , wID int64 ) ( bool , error ) {
151
+ func checkAtLeastOneRWXRoleOnWorkflow (db gorp.SqlExecutor , wID int64 ) error {
161
152
query := `select count(project_group_id) from workflow_perm where workflow_id = $1 and role = $2`
162
- nb , err := db .SelectInt (query , wID , 7 )
153
+ nb , err := db .SelectInt (query , wID , sdk . PermissionReadWriteExecute )
163
154
if err != nil {
164
- return false , sdk .WithStack (err )
155
+ return sdk .WithStack (err )
156
+ }
157
+ if nb == 0 {
158
+ return sdk .WithStack (sdk .ErrLastGroupWithWriteRole )
165
159
}
166
- return nb > 0 , err
160
+ return nil
167
161
}
168
162
169
163
type LinkWorkflowGroupPermission struct {
@@ -251,3 +245,22 @@ func LoadWorkflowGroups(db gorp.SqlExecutor, workflowID int64) ([]sdk.GroupPermi
251
245
}
252
246
return wgs , nil
253
247
}
248
+
249
+ func CheckWorkflowGroups (ctx context.Context , db gorp.SqlExecutor , proj * sdk.Project , w * sdk.Workflow , consumer * sdk.AuthConsumer ) error {
250
+ if err := LoadGroupsIntoProject (ctx , db , proj ); err != nil {
251
+ return err
252
+ }
253
+ for i := range w .Groups {
254
+ if err := CheckGroupPermission (ctx , db , proj .ProjectGroups , & w .Groups [i ], consumer ); err != nil {
255
+ return err
256
+ }
257
+ }
258
+ for _ , n := range w .WorkflowData .Array () {
259
+ for i := range n .Groups {
260
+ if err := CheckGroupPermission (ctx , db , proj .ProjectGroups , & n .Groups [i ], consumer ); err != nil {
261
+ return err
262
+ }
263
+ }
264
+ }
265
+ return nil
266
+ }
0 commit comments