@@ -26,9 +26,10 @@ import (
26
26
"github.com/caarlos0/env/v6"
27
27
k8sCommonBean "github.com/devtron-labs/common-lib/utils/k8s/commonBean"
28
28
"github.com/devtron-labs/common-lib/utils/k8s/health"
29
+ k8sObjectUtils "github.com/devtron-labs/common-lib/utils/k8sObjectsUtil"
29
30
"github.com/devtron-labs/devtron/api/bean"
30
31
client "github.com/devtron-labs/devtron/api/helm-app"
31
- bean2 "github.com/devtron-labs/devtron/api/restHandler/bean"
32
+
32
33
"github.com/devtron-labs/devtron/api/restHandler/common"
33
34
"github.com/devtron-labs/devtron/client/argocdServer/application"
34
35
"github.com/devtron-labs/devtron/client/cron"
@@ -212,14 +213,45 @@ func (handler AppListingRestHandlerImpl) FetchJobs(w http.ResponseWriter, r *htt
212
213
common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusUnauthorized )
213
214
return
214
215
}
216
+ user , err := handler .userService .GetById (userId )
217
+ if userId == 0 || err != nil {
218
+ common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusUnauthorized )
219
+ return
220
+ }
215
221
isSuperAdmin , err := handler .userService .IsSuperAdmin (int (userId ))
216
- if ! isSuperAdmin || err != nil {
217
- if err != nil {
218
- handler .logger .Errorw ("request err, CheckSuperAdmin" , "err" , isSuperAdmin , "isSuperAdmin" , isSuperAdmin )
219
- }
222
+ if err != nil {
223
+ handler .logger .Errorw ("request err, CheckSuperAdmin" , "err" , isSuperAdmin , "isSuperAdmin" , isSuperAdmin )
220
224
common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusForbidden )
221
225
return
222
226
}
227
+ var validAppIds []int
228
+ //for non super admin users
229
+ if ! isSuperAdmin {
230
+ userEmailId := strings .ToLower (user .EmailId )
231
+ rbacObjectsForAllAppsMap := handler .enforcerUtil .GetRbacObjectsForAllApps (helper .Job )
232
+ rbacObjectToAppIdMap := make (map [string ]int )
233
+ rbacObjects := make ([]string , len (rbacObjectsForAllAppsMap ))
234
+ itr := 0
235
+ for appId , object := range rbacObjectsForAllAppsMap {
236
+ rbacObjects [itr ] = object
237
+ rbacObjectToAppIdMap [object ] = appId
238
+ itr ++
239
+ }
240
+
241
+ result := handler .enforcer .EnforceByEmailInBatch (userEmailId , casbin .ResourceJobs , casbin .ActionGet , rbacObjects )
242
+ //O(n) loop, n = len(rbacObjectsForAllAppsMap)
243
+ for object , ok := range result {
244
+ if ok {
245
+ validAppIds = append (validAppIds , rbacObjectToAppIdMap [object ])
246
+ }
247
+ }
248
+
249
+ if len (validAppIds ) == 0 {
250
+ handler .logger .Infow ("user doesn't have access to any app" , "userId" , userId )
251
+ common .WriteJsonResp (w , err , bean.JobContainerResponse {}, http .StatusOK )
252
+ return
253
+ }
254
+ }
223
255
var fetchJobListingRequest app.FetchAppListingRequest
224
256
decoder := json .NewDecoder (r .Body )
225
257
err = decoder .Decode (& fetchJobListingRequest )
@@ -228,6 +260,10 @@ func (handler AppListingRestHandlerImpl) FetchJobs(w http.ResponseWriter, r *htt
228
260
common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
229
261
return
230
262
}
263
+
264
+ // fetching only those jobs whose access user has by setting valid app Ids.
265
+ fetchJobListingRequest .AppIds = validAppIds
266
+
231
267
jobs , err := handler .appListingService .FetchJobs (fetchJobListingRequest )
232
268
if err != nil {
233
269
handler .logger .Errorw ("service err, FetchJobs" , "err" , err , "payload" , fetchJobListingRequest )
@@ -259,21 +295,21 @@ func (handler AppListingRestHandlerImpl) FetchJobOverviewCiPipelines(w http.Resp
259
295
common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusUnauthorized )
260
296
return
261
297
}
262
- isSuperAdmin , err := handler .userService .IsSuperAdmin (int (userId ))
263
- if ! isSuperAdmin || err != nil {
264
- if err != nil {
265
- handler .logger .Errorw ("request err, CheckSuperAdmin" , "err" , isSuperAdmin , "isSuperAdmin" , isSuperAdmin )
266
- }
267
- common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusForbidden )
268
- return
269
- }
270
298
vars := mux .Vars (r )
271
299
jobId , err := strconv .Atoi (vars ["jobId" ])
272
300
if err != nil {
273
301
handler .logger .Errorw ("request err, GetAppMetaInfo" , "err" , err , "jobId" , jobId )
274
302
common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
275
303
return
276
304
}
305
+ //RBAC
306
+ token := r .Header .Get ("token" )
307
+ object := handler .enforcerUtil .GetAppRBACNameByAppId (jobId )
308
+ if ok := handler .enforcer .Enforce (token , casbin .ResourceJobs , casbin .ActionGet , object ); ! ok {
309
+ common .WriteJsonResp (w , err , "Unauthorized User" , http .StatusForbidden )
310
+ return
311
+ }
312
+ //RBAC ENDS
277
313
job , err := handler .pipeline .GetApp (jobId )
278
314
if err != nil || job == nil || job .AppType != helper .Job {
279
315
handler .logger .Errorw ("Job with the given Id does not exist" , "err" , err , "jobId" , jobId )
@@ -718,7 +754,7 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironmentV2(w http.Respons
718
754
//for non super admin users
719
755
if ! isActionUserSuperAdmin {
720
756
userEmailId := strings .ToLower (user .EmailId )
721
- rbacObjectsForAllAppsMap := handler .enforcerUtil .GetRbacObjectsForAllApps ()
757
+ rbacObjectsForAllAppsMap := handler .enforcerUtil .GetRbacObjectsForAllApps (helper . CustomApp )
722
758
rbacObjectToAppIdMap := make (map [string ]int )
723
759
rbacObjects := make ([]string , len (rbacObjectsForAllAppsMap ))
724
760
itr := 0
@@ -1212,7 +1248,8 @@ func (handler AppListingRestHandlerImpl) FetchAppStageStatus(w http.ResponseWrit
1212
1248
1213
1249
// RBAC enforcer applying
1214
1250
object := handler .enforcerUtil .GetAppRBACName (app .AppName )
1215
- if ok := handler .enforcer .Enforce (token , casbin .ResourceApplications , casbin .ActionGet , object ); ! ok {
1251
+ ok := handler .enforcerUtil .CheckAppRbacForAppOrJob (token , object , casbin .ActionGet )
1252
+ if ! ok {
1216
1253
common .WriteJsonResp (w , fmt .Errorf ("unauthorized user" ), "Unauthorized User" , http .StatusForbidden )
1217
1254
return
1218
1255
}
@@ -1285,7 +1322,8 @@ func (handler AppListingRestHandlerImpl) FetchMinDetailOtherEnvironment(w http.R
1285
1322
1286
1323
// RBAC enforcer applying
1287
1324
object := handler .enforcerUtil .GetAppRBACName (app .AppName )
1288
- if ok := handler .enforcer .Enforce (token , casbin .ResourceApplications , casbin .ActionGet , object ); ! ok {
1325
+ ok := handler .enforcerUtil .CheckAppRbacForAppOrJob (token , object , casbin .ActionGet )
1326
+ if ! ok {
1289
1327
common .WriteJsonResp (w , err , "unauthorized user" , http .StatusForbidden )
1290
1328
return
1291
1329
}
@@ -1542,7 +1580,7 @@ func (handler AppListingRestHandlerImpl) fetchResourceTree(w http.ResponseWriter
1542
1580
handler .logger .Errorw ("error in getting pods by label" , "err" , err , "clusterId" , cdPipeline .Environment .ClusterId , "namespace" , cdPipeline .Environment .Namespace , "label" , label )
1543
1581
return resourceTree , err
1544
1582
}
1545
- ephemeralContainersMap := bean2 .ExtractEphemeralContainers (pods )
1583
+ ephemeralContainersMap := k8sObjectUtils .ExtractEphemeralContainers (pods )
1546
1584
for _ , metaData := range resp .PodMetadata {
1547
1585
metaData .EphemeralContainers = ephemeralContainersMap [metaData .Name ]
1548
1586
}
0 commit comments