Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
0e70015
jobs rbac create update user and role group flow
Shivam-nagar23 Nov 3, 2023
9637113
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 3, 2023
f095760
sql-scripts
Shivam-nagar23 Nov 3, 2023
d2f06c2
capacity update
Shivam-nagar23 Nov 3, 2023
7ecd961
logs wip
Shivam-nagar23 Nov 3, 2023
2afe2ad
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 5, 2023
b9dce06
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 7, 2023
d3c82bd
script number change
Shivam-nagar23 Nov 7, 2023
aa182c6
fetch all workflows
Shivam-nagar23 Nov 8, 2023
83677f1
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 8, 2023
90404a2
rbac in apis
Shivam-nagar23 Nov 9, 2023
2edc613
workflow-api-change
Shivam-nagar23 Nov 10, 2023
36ff101
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 10, 2023
7e22a34
Merge branch 'testing-jobs-rbac' into feat-rbac-in-jobs
Shivam-nagar23 Nov 10, 2023
019010d
casbin-script
Shivam-nagar23 Nov 10, 2023
8d2ea1b
rbac-enforcement
Shivam-nagar23 Nov 10, 2023
c22d007
appids null
Shivam-nagar23 Nov 10, 2023
92a6977
workflow app ids len
Shivam-nagar23 Nov 10, 2023
c373c96
rbac enforcement
Shivam-nagar23 Nov 10, 2023
01d77b8
script number chnage
Shivam-nagar23 Nov 10, 2023
973cdba
appnames fetch
Shivam-nagar23 Nov 10, 2023
256331d
fetch workflow api change
Shivam-nagar23 Nov 10, 2023
8cd19b9
workflow response
Shivam-nagar23 Nov 10, 2023
1fae481
Merge branch 'testing-jobs-rbac' into feat-rbac-in-jobs
Shivam-nagar23 Nov 10, 2023
6fd44e9
app-workflow check
Shivam-nagar23 Nov 12, 2023
426365a
job env change
Shivam-nagar23 Nov 12, 2023
ff7a29c
job actual name
Shivam-nagar23 Nov 12, 2023
9a2c8ce
job actual name
Shivam-nagar23 Nov 12, 2023
4d733d8
get api changes
Shivam-nagar23 Nov 15, 2023
189e987
Merge branch 'testing-jobs-rbac' into feat-rbac-in-jobs
Shivam-nagar23 Nov 15, 2023
92206c6
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 15, 2023
788072c
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 15, 2023
a71a5b0
number change
Shivam-nagar23 Nov 15, 2023
592cfcf
env rbac
Shivam-nagar23 Nov 16, 2023
a1c7c7f
fetch jobs
Shivam-nagar23 Nov 16, 2023
800466c
fetch jobs
Shivam-nagar23 Nov 16, 2023
6fccd95
workflow get
Shivam-nagar23 Nov 16, 2023
1dd7a5e
workflow status
Shivam-nagar23 Nov 16, 2023
6823412
ci-pipeline get
Shivam-nagar23 Nov 17, 2023
1b47695
min other env
Shivam-nagar23 Nov 17, 2023
f6d8ccc
app stage status
Shivam-nagar23 Nov 17, 2023
660642b
material get
Shivam-nagar23 Nov 17, 2023
25b85bb
logs get
Shivam-nagar23 Nov 17, 2023
476ed91
get env for job
Shivam-nagar23 Nov 17, 2023
fd49dc2
pipeline get
Shivam-nagar23 Nov 17, 2023
2c47da9
app get
Shivam-nagar23 Nov 17, 2023
1940f8b
global plugins
Shivam-nagar23 Nov 17, 2023
481a679
git material
Shivam-nagar23 Nov 17, 2023
c241767
cm cs get
Shivam-nagar23 Nov 17, 2023
1db1798
global variable
Shivam-nagar23 Nov 17, 2023
e6118bd
get suggest
Shivam-nagar23 Nov 17, 2023
c088032
update app
Shivam-nagar23 Nov 17, 2023
aa2ad72
job-clone
Shivam-nagar23 Nov 17, 2023
743106d
workflow delete handling
Shivam-nagar23 Nov 17, 2023
4b6381f
omit empty
Shivam-nagar23 Nov 17, 2023
13f44d1
entity
Shivam-nagar23 Nov 17, 2023
47ce0e7
workflow empty
Shivam-nagar23 Nov 17, 2023
e854c49
review comments
Shivam-nagar23 Nov 19, 2023
91adfe2
review comments
Shivam-nagar23 Nov 19, 2023
6797749
rbac
Shivam-nagar23 Nov 19, 2023
6b8c2dd
comments-remove
Shivam-nagar23 Nov 20, 2023
c2fe525
saving role in lower
Shivam-nagar23 Nov 20, 2023
304900c
script number change
Shivam-nagar23 Nov 20, 2023
b219714
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 20, 2023
ed88602
all jobs handling
Shivam-nagar23 Nov 21, 2023
a8b37ad
workflow by app name
Shivam-nagar23 Nov 21, 2023
ce293f8
Revert "workflow by app name"
Shivam-nagar23 Nov 21, 2023
3f7c992
merge main
Shivam-nagar23 Nov 22, 2023
2ec2881
job create
Shivam-nagar23 Nov 22, 2023
c66557d
rbac
Shivam-nagar23 Nov 22, 2023
14f32b2
cm-checks
Shivam-nagar23 Nov 22, 2023
e388bbf
removing logs
Shivam-nagar23 Nov 22, 2023
d92d292
cm-edit rbac
Shivam-nagar23 Nov 23, 2023
ecdc66f
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 23, 2023
8cf9273
empty handling
Shivam-nagar23 Nov 23, 2023
16707d6
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 23, 2023
3292ef0
script
Shivam-nagar23 Nov 23, 2023
dd8ed25
comments
Shivam-nagar23 Nov 24, 2023
ec4b42c
error code
Shivam-nagar23 Nov 24, 2023
6377d3f
validations and handling
Shivam-nagar23 Nov 24, 2023
7a7770f
cancel workflow
Shivam-nagar23 Nov 24, 2023
4341c2f
error checks
Shivam-nagar23 Nov 24, 2023
70dab16
rbac
Shivam-nagar23 Nov 24, 2023
61e53d7
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 24, 2023
0ef23e2
script number chnage
Shivam-nagar23 Nov 24, 2023
7a14d95
workflow error
Shivam-nagar23 Nov 24, 2023
4e02287
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 28, 2023
24678ec
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 28, 2023
851b258
review comments
Shivam-nagar23 Nov 29, 2023
c88f18b
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 29, 2023
5ddae6c
refresh rbac
Shivam-nagar23 Nov 30, 2023
b8c295b
wire-gen
Shivam-nagar23 Nov 30, 2023
6b7702f
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 30, 2023
c91c18d
merge main
Shivam-nagar23 Nov 30, 2023
50458ec
app type
Shivam-nagar23 Nov 30, 2023
c334df8
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Nov 30, 2023
00cf520
main-merge
Shivam-nagar23 Nov 30, 2023
3a655d3
message
Shivam-nagar23 Nov 30, 2023
185137b
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Dec 1, 2023
bdf0920
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Dec 1, 2023
baf0b3a
Merge branch 'main' into feat-rbac-in-jobs
Shivam-nagar23 Dec 4, 2023
84d87de
main-merge
Shivam-nagar23 Dec 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/bean/AppView.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ type GenericNoteResponseBean struct {
type JobContainer struct {
JobId int `json:"jobId"`
JobName string `json:"jobName""`
JobActualName string `json:"appName""`
Description GenericNoteResponseBean `json:"description"`
JobCiPipelines []JobCIPipeline `json:"ciPipelines"'`
}
Expand All @@ -87,6 +88,7 @@ type JobCIPipeline struct {
type JobListingContainer struct {
JobId int `sql:"job_id" json:"jobId"`
JobName string `sql:"job_name" json:"jobName"`
JobActualName string `sql:"app_name" json:"appName"`
Description string `sql:"description" json:"description"`
CiPipelineID int `sql:"ci_pipeline_id" json:"ciPipelineID"`
CiPipelineName string `sql:"ci_pipeline_name" json:"ciPipelineName"`
Expand Down
1 change: 1 addition & 0 deletions api/bean/UserRequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ type RoleFilter struct {
Group string `json:"group"`
Kind string `json:"kind"`
Resource string `json:"resource"`
Workflow string `json:"workflow"`
}

type Role struct {
Expand Down
67 changes: 52 additions & 15 deletions api/restHandler/AppListingRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,14 +213,45 @@ func (handler AppListingRestHandlerImpl) FetchJobs(w http.ResponseWriter, r *htt
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
user, err := handler.userService.GetById(userId)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
isSuperAdmin, err := handler.userService.IsSuperAdmin(int(userId))
if !isSuperAdmin || err != nil {
if err != nil {
handler.logger.Errorw("request err, CheckSuperAdmin", "err", isSuperAdmin, "isSuperAdmin", isSuperAdmin)
}
if err != nil {
handler.logger.Errorw("request err, CheckSuperAdmin", "err", isSuperAdmin, "isSuperAdmin", isSuperAdmin)
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
var validAppIds []int
//for non super admin users
if !isSuperAdmin {
userEmailId := strings.ToLower(user.EmailId)
rbacObjectsForAllAppsMap := handler.enforcerUtil.GetRbacObjectsForAllApps(helper.Job)
rbacObjectToAppIdMap := make(map[string]int)
rbacObjects := make([]string, len(rbacObjectsForAllAppsMap))
itr := 0
for appId, object := range rbacObjectsForAllAppsMap {
rbacObjects[itr] = object
rbacObjectToAppIdMap[object] = appId
itr++
}

result := handler.enforcer.EnforceByEmailInBatch(userEmailId, casbin.ResourceJobs, casbin.ActionGet, rbacObjects)
//O(n) loop, n = len(rbacObjectsForAllAppsMap)
for object, ok := range result {
if ok {
validAppIds = append(validAppIds, rbacObjectToAppIdMap[object])
}
}

if len(validAppIds) == 0 {
handler.logger.Infow("user doesn't have access to any app", "userId", userId)
common.WriteJsonResp(w, err, bean.JobContainerResponse{}, http.StatusOK)
return
}
}
var fetchJobListingRequest app.FetchAppListingRequest
decoder := json.NewDecoder(r.Body)
err = decoder.Decode(&fetchJobListingRequest)
Expand All @@ -229,6 +260,10 @@ func (handler AppListingRestHandlerImpl) FetchJobs(w http.ResponseWriter, r *htt
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

// fetching only those jobs whose access user has by setting valid app Ids.
fetchJobListingRequest.AppIds = validAppIds

jobs, err := handler.appListingService.FetchJobs(fetchJobListingRequest)
if err != nil {
handler.logger.Errorw("service err, FetchJobs", "err", err, "payload", fetchJobListingRequest)
Expand Down Expand Up @@ -260,21 +295,21 @@ func (handler AppListingRestHandlerImpl) FetchJobOverviewCiPipelines(w http.Resp
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
isSuperAdmin, err := handler.userService.IsSuperAdmin(int(userId))
if !isSuperAdmin || err != nil {
if err != nil {
handler.logger.Errorw("request err, CheckSuperAdmin", "err", isSuperAdmin, "isSuperAdmin", isSuperAdmin)
}
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
vars := mux.Vars(r)
jobId, err := strconv.Atoi(vars["jobId"])
if err != nil {
handler.logger.Errorw("request err, GetAppMetaInfo", "err", err, "jobId", jobId)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
//RBAC
token := r.Header.Get("token")
object := handler.enforcerUtil.GetAppRBACNameByAppId(jobId)
if ok := handler.enforcer.Enforce(token, casbin.ResourceJobs, casbin.ActionGet, object); !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
//RBAC ENDS
job, err := handler.pipeline.GetApp(jobId)
if err != nil || job == nil || job.AppType != helper.Job {
handler.logger.Errorw("Job with the given Id does not exist", "err", err, "jobId", jobId)
Expand Down Expand Up @@ -719,7 +754,7 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironmentV2(w http.Respons
//for non super admin users
if !isActionUserSuperAdmin {
userEmailId := strings.ToLower(user.EmailId)
rbacObjectsForAllAppsMap := handler.enforcerUtil.GetRbacObjectsForAllApps()
rbacObjectsForAllAppsMap := handler.enforcerUtil.GetRbacObjectsForAllApps(helper.CustomApp)
rbacObjectToAppIdMap := make(map[string]int)
rbacObjects := make([]string, len(rbacObjectsForAllAppsMap))
itr := 0
Expand Down Expand Up @@ -1213,7 +1248,8 @@ func (handler AppListingRestHandlerImpl) FetchAppStageStatus(w http.ResponseWrit

// RBAC enforcer applying
object := handler.enforcerUtil.GetAppRBACName(app.AppName)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionGet)
if !ok {
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
return
}
Expand Down Expand Up @@ -1286,7 +1322,8 @@ func (handler AppListingRestHandlerImpl) FetchMinDetailOtherEnvironment(w http.R

// RBAC enforcer applying
object := handler.enforcerUtil.GetAppRBACName(app.AppName)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionGet)
if !ok {
common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden)
return
}
Expand Down
15 changes: 10 additions & 5 deletions api/restHandler/AppRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"encoding/json"
client "github.com/devtron-labs/devtron/api/helm-app"
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/internal/sql/repository/helper"
"github.com/devtron-labs/devtron/pkg/app"
"github.com/devtron-labs/devtron/pkg/bean"
"github.com/devtron-labs/devtron/pkg/genericNotes"
Expand Down Expand Up @@ -90,7 +91,7 @@ func (handler AppRestHandlerImpl) GetAllLabels(w http.ResponseWriter, r *http.Re
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
objects := handler.enforcerUtil.GetRbacObjectsForAllApps()
objects := handler.enforcerUtil.GetRbacObjectsForAllApps(helper.CustomApp)
for _, label := range labels {
object := objects[label.AppId]
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); ok {
Expand All @@ -117,7 +118,8 @@ func (handler AppRestHandlerImpl) GetAppMetaInfo(w http.ResponseWriter, r *http.
//rback implementation starts here
token := r.Header.Get("token")
object := handler.enforcerUtil.GetAppRBACNameByAppId(appId)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionGet)
if !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
Expand Down Expand Up @@ -207,14 +209,16 @@ func (handler AppRestHandlerImpl) UpdateApp(w http.ResponseWriter, r *http.Reque

// check for existing project/app permission
object := handler.enforcerUtil.GetAppRBACNameByAppId(request.Id)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionUpdate, object); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionUpdate)
if !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}

// check for request project/app permission
object = handler.enforcerUtil.GetAppRBACNameByTeamIdAndAppId(request.TeamId, request.Id)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionUpdate, object); !ok {
ok = handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionUpdate)
if !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
Expand Down Expand Up @@ -372,7 +376,8 @@ func (handler AppRestHandlerImpl) UpdateAppNote(w http.ResponseWriter, r *http.R

// check for existing project/app permission
object := handler.enforcerUtil.GetAppRBACNameByAppId(bean.Identifier)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionUpdate, object); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionUpdate)
if !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
Expand Down
102 changes: 95 additions & 7 deletions api/restHandler/AppWorkflowRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ import (
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/internal/sql/repository/app"
appWorkflow2 "github.com/devtron-labs/devtron/internal/sql/repository/appWorkflow"
"github.com/devtron-labs/devtron/internal/sql/repository/helper"
"github.com/devtron-labs/devtron/internal/util"
bean3 "github.com/devtron-labs/devtron/pkg/app/bean"
"github.com/devtron-labs/devtron/pkg/appWorkflow"
"github.com/devtron-labs/devtron/pkg/bean"
"github.com/devtron-labs/devtron/pkg/pipeline"
Expand All @@ -47,6 +49,7 @@ type AppWorkflowRestHandler interface {
FindAllWorkflows(w http.ResponseWriter, r *http.Request)
FindAppWorkflowByEnvironment(w http.ResponseWriter, r *http.Request)
GetWorkflowsViewData(w http.ResponseWriter, r *http.Request)
FindAllWorkflowsForApps(w http.ResponseWriter, r *http.Request)
}

type AppWorkflowRestHandlerImpl struct {
Expand Down Expand Up @@ -94,7 +97,8 @@ func (handler AppWorkflowRestHandlerImpl) CreateAppWorkflow(w http.ResponseWrite
token := r.Header.Get("token")
//rbac block starts from here
resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(request.AppId)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionCreate, resourceName); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, resourceName, casbin.ActionCreate)
if !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
Expand All @@ -103,6 +107,10 @@ func (handler AppWorkflowRestHandlerImpl) CreateAppWorkflow(w http.ResponseWrite

res, err := handler.appWorkflowService.CreateAppWorkflow(request)
if err != nil {
if err.Error() == bean3.WORKFLOW_EXIST_ERROR {
common.WriteJsonResp(w, err, bean3.WORKFLOW_EXIST_ERROR, http.StatusBadRequest)
return
}
handler.Logger.Errorw("error on creating", "err", err)
common.WriteJsonResp(w, err, []byte("Creation Failed"), http.StatusInternalServerError)
return
Expand Down Expand Up @@ -130,11 +138,22 @@ func (handler AppWorkflowRestHandlerImpl) DeleteAppWorkflow(w http.ResponseWrite
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
appWorkflow, err := handler.appWorkflowService.FindAppWorkflowById(appWorkflowId, appId)
if err != nil {
handler.Logger.Errorw("error in finding appWorkflow by appWorkflowId and appId", "err", err, "appWorkflowId", appWorkflowId, "appid", appId)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}

token := r.Header.Get("token")
//rbac block starts from here
resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionDelete, resourceName); !ok {
workflowResourceName := handler.enforcerUtil.GetRbacObjectNameByAppIdAndWorkflow(appId, appWorkflow.Name)
ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionDelete, resourceName)
if !ok {
ok = handler.enforcer.Enforce(token, casbin.ResourceJobs, casbin.ActionDelete, resourceName) && handler.enforcer.Enforce(token, casbin.ResourceWorkflow, casbin.ActionDelete, workflowResourceName)
}
if !ok {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
Expand Down Expand Up @@ -183,7 +202,8 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r
// RBAC enforcer applying
object := impl.enforcerUtil.GetAppRBACName(app.AppName)
impl.Logger.Debugw("rbac object for other environment list", "object", object)
if ok := impl.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); !ok {
ok := impl.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionGet)
if !ok {
common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden)
return
}
Expand Down Expand Up @@ -219,10 +239,47 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r

workflows["appId"] = app.Id
workflows["appName"] = app.AppName
if len(workflowsList) > 0 {
workflows["workflows"] = workflowsList
if len(workflowsList) > 0 && app.AppType == helper.Job {
// RBAC
userEmailId, err := impl.userAuthService.GetEmailFromToken(token)
if err != nil {
impl.Logger.Errorw("error in getting user emailId from token", "err", err)
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}

var workflowNames []string
var workflowIds []int
var updatedWorkflowList []appWorkflow.AppWorkflowDto
var rbacObjects []string
workNameObjectMap := make(map[string]appWorkflow.AppWorkflowDto)

for _, workflow := range workflowsList {
workflowNames = append(workflowNames, workflow.Name)
workflowIds = append(workflowIds, workflow.Id)
}
workflowIdToObjectMap := impl.enforcerUtil.GetAllWorkflowRBACObjectsByAppId(appId, workflowNames, workflowIds)
itr := 0
for _, val := range workflowIdToObjectMap {
rbacObjects = append(rbacObjects, val)
workNameObjectMap[val] = workflowsList[itr]
itr++
}

enforcedMap := impl.enforcer.EnforceByEmailInBatch(userEmailId, casbin.ResourceWorkflow, casbin.ActionGet, rbacObjects)
for obj, passed := range enforcedMap {
if passed {
updatedWorkflowList = append(updatedWorkflowList, workNameObjectMap[obj])
}
}
if len(updatedWorkflowList) == 0 {
updatedWorkflowList = []appWorkflow.AppWorkflowDto{}
}
workflows[bean3.Workflows] = updatedWorkflowList
} else if len(workflowsList) > 0 {
workflows[bean3.Workflows] = workflowsList
} else {
workflows["workflows"] = []appWorkflow.AppWorkflowDto{}
workflows[bean3.Workflows] = []appWorkflow.AppWorkflowDto{}
}
common.WriteJsonResp(w, err, workflows, http.StatusOK)
}
Expand Down Expand Up @@ -258,6 +315,36 @@ func (impl AppWorkflowRestHandlerImpl) FindAllWorkflows(w http.ResponseWriter, r
common.WriteJsonResp(w, nil, resp, http.StatusOK)
}

func (impl AppWorkflowRestHandlerImpl) FindAllWorkflowsForApps(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
userId, err := impl.userAuthService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
token := r.Header.Get("token")
if ok := impl.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok {
common.WriteJsonResp(w, err, "Unauthorized user", http.StatusForbidden)
return
}
//RBAC enforcer Ends
var request appWorkflow.WorkflowNamesRequest
err = decoder.Decode(&request)
if err != nil {
impl.Logger.Errorw("decode err", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

resp, err := impl.appWorkflowService.FindAllWorkflowsForApps(request)
if err != nil {
impl.Logger.Errorw("error in getting all wf component details by appId", "err", err, "request", request)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, resp, http.StatusOK)
}

func (impl AppWorkflowRestHandlerImpl) FindAppWorkflowByEnvironment(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
userId, err := impl.userAuthService.GetLoggedInUser(r)
Expand Down Expand Up @@ -359,7 +446,8 @@ func (handler *AppWorkflowRestHandlerImpl) GetWorkflowsViewData(w http.ResponseW
// RBAC enforcer applying
object := handler.enforcerUtil.GetAppRBACName(app.AppName)
handler.Logger.Debugw("rbac object for workflows view data", "object", object)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); !ok {
ok := handler.enforcerUtil.CheckAppRbacForAppOrJob(token, object, casbin.ActionGet)
if !ok {
common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden)
return
}
Expand Down
3 changes: 2 additions & 1 deletion api/restHandler/BulkUpdateRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/client/argocdServer/application"
"github.com/devtron-labs/devtron/client/gitSensor"
"github.com/devtron-labs/devtron/internal/sql/repository/helper"
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
"github.com/devtron-labs/devtron/internal/sql/repository/security"
"github.com/devtron-labs/devtron/pkg/appClone"
Expand Down Expand Up @@ -228,7 +229,7 @@ func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *ht
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
rbacObjects := handler.enforcerUtil.GetRbacObjectsForAllApps()
rbacObjects := handler.enforcerUtil.GetRbacObjectsForAllApps(helper.CustomApp)
for _, deploymentTemplateImpactedApp := range impactedApps.DeploymentTemplate {
ok := handler.CheckAuthForBulkUpdate(deploymentTemplateImpactedApp.AppId, deploymentTemplateImpactedApp.EnvId, deploymentTemplateImpactedApp.AppName, rbacObjects, token)
if !ok {
Expand Down
Loading