Skip to content

Commit aa8800b

Browse files
Merge pull request #6510 from devtron-labs/approval-bypass-v2-oss
misc: Approval bypass v2 oss
2 parents 33d93e9 + 2e8051b commit aa8800b

31 files changed

+376
-204
lines changed

api/restHandler/BulkUpdateRestHandler.go

+41-6
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ package restHandler
1919
import (
2020
"encoding/json"
2121
"fmt"
22+
bean4 "github.com/devtron-labs/devtron/pkg/auth/user/bean"
2223
"github.com/devtron-labs/devtron/pkg/build/git/gitMaterial/repository"
2324
"github.com/devtron-labs/devtron/pkg/build/git/gitProvider"
2425
"github.com/devtron-labs/devtron/pkg/bulkAction/bean"
2526
"github.com/devtron-labs/devtron/pkg/bulkAction/service"
2627
"github.com/devtron-labs/devtron/pkg/cluster/environment"
28+
"github.com/devtron-labs/devtron/util"
2729
"net/http"
2830
"strconv"
2931
"strings"
@@ -212,9 +214,14 @@ func (handler BulkUpdateRestHandlerImpl) CheckAuthForBulkUpdate(AppId int, EnvId
212214

213215
}
214216
func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *http.Request) {
217+
userId, err := handler.userAuthService.GetLoggedInUser(r)
218+
if userId == 0 || err != nil {
219+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
220+
return
221+
}
215222
decoder := json.NewDecoder(r.Body)
216223
var script bean.BulkUpdateScript
217-
err := decoder.Decode(&script)
224+
err = decoder.Decode(&script)
218225
if err != nil {
219226
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
220227
return
@@ -250,8 +257,14 @@ func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *ht
250257
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
251258
}
252259
}
253-
254-
response := handler.bulkUpdateService.BulkUpdate(script.Spec)
260+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
261+
userEmail := util.GetEmailFromContext(r.Context())
262+
userMetadata := &bean4.UserMetadata{
263+
UserEmailId: userEmail,
264+
IsUserSuperAdmin: isSuperAdmin,
265+
UserId: userId,
266+
}
267+
response := handler.bulkUpdateService.BulkUpdate(script.Spec, userMetadata)
255268
common.WriteJsonResp(w, nil, response, http.StatusOK)
256269
}
257270

@@ -261,7 +274,15 @@ func (handler BulkUpdateRestHandlerImpl) BulkHibernate(w http.ResponseWriter, r
261274
return // response already written by the helper on error.
262275
}
263276
token := r.Header.Get("token")
264-
response, err := handler.bulkUpdateService.BulkHibernate(request, r.Context(), w, token, handler.checkAuthForBulkHibernateAndUnhibernate)
277+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
278+
userEmail := util.GetEmailFromContext(r.Context())
279+
userMetadata := &bean4.UserMetadata{
280+
UserEmailId: userEmail,
281+
IsUserSuperAdmin: isSuperAdmin,
282+
UserId: request.UserId,
283+
}
284+
285+
response, err := handler.bulkUpdateService.BulkHibernate(r.Context(), request, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata)
265286
if err != nil {
266287
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
267288
return
@@ -298,7 +319,14 @@ func (handler BulkUpdateRestHandlerImpl) BulkUnHibernate(w http.ResponseWriter,
298319
return // response already written by the helper on error.
299320
}
300321
token := r.Header.Get("token")
301-
response, err := handler.bulkUpdateService.BulkUnHibernate(request, r.Context(), w, token, handler.checkAuthForBulkHibernateAndUnhibernate)
322+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
323+
userEmail := util.GetEmailFromContext(r.Context())
324+
userMetadata := &bean4.UserMetadata{
325+
UserEmailId: userEmail,
326+
IsUserSuperAdmin: isSuperAdmin,
327+
UserId: request.UserId,
328+
}
329+
response, err := handler.bulkUpdateService.BulkUnHibernate(r.Context(), request, handler.checkAuthForBulkHibernateAndUnhibernate, userMetadata)
302330
if err != nil {
303331
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
304332
return
@@ -326,7 +354,14 @@ func (handler BulkUpdateRestHandlerImpl) BulkDeploy(w http.ResponseWriter, r *ht
326354
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
327355
return
328356
}
329-
response, err := handler.bulkUpdateService.BulkDeploy(&request, token, handler.checkAuthBatch)
357+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
358+
userEmail := util.GetEmailFromContext(r.Context())
359+
userMetadata := &bean4.UserMetadata{
360+
UserEmailId: userEmail,
361+
IsUserSuperAdmin: isSuperAdmin,
362+
UserId: userId,
363+
}
364+
response, err := handler.bulkUpdateService.BulkDeploy(&request, token, handler.checkAuthBatch, userMetadata)
330365
if err != nil {
331366
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
332367
return

api/restHandler/ConfigMapRestHandler.go

+17-48
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package restHandler
1919
import (
2020
"encoding/json"
2121
"fmt"
22+
"github.com/devtron-labs/devtron/pkg/auth/user/util"
2223
"github.com/devtron-labs/devtron/pkg/pipeline/draftAwareConfigService"
2324
"net/http"
2425
"strconv"
@@ -125,12 +126,8 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter,
125126
//RBAC END
126127
ctx := r.Context()
127128
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
128-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
129-
if err != nil {
130-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
131-
return
132-
}
133-
res, err := handler.draftAwareResourceService.CMGlobalAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
129+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
130+
res, err := handler.draftAwareResourceService.CMGlobalAddUpdate(ctx, &configMapRequest, userMetadata)
134131
if err != nil {
135132
handler.Logger.Errorw("service err, CMGlobalAddUpdate", "err", err, "payload", configMapRequest)
136133
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -175,12 +172,8 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentAddUpdate(w http.ResponseWr
175172
//RBAC END
176173
ctx := r.Context()
177174
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
178-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
179-
if err != nil {
180-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
181-
return
182-
}
183-
res, err := handler.draftAwareResourceService.CMEnvironmentAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
175+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
176+
res, err := handler.draftAwareResourceService.CMEnvironmentAddUpdate(ctx, &configMapRequest, userMetadata)
184177
if err != nil {
185178
handler.Logger.Errorw("service err, CMEnvironmentAddUpdate", "err", err, "payload", configMapRequest)
186179
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -378,12 +371,8 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter,
378371
//RBAC END
379372
ctx := r.Context()
380373
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
381-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
382-
if err != nil {
383-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
384-
return
385-
}
386-
res, err := handler.draftAwareResourceService.CSGlobalAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
374+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
375+
res, err := handler.draftAwareResourceService.CSGlobalAddUpdate(ctx, &configMapRequest, userMetadata)
387376
if err != nil {
388377
handler.Logger.Errorw("service err, CSGlobalAddUpdate", "err", err, "payload", configMapRequest)
389378
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -429,12 +418,8 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWr
429418
//RBAC END
430419
ctx := r.Context()
431420
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
432-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
433-
if err != nil {
434-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
435-
return
436-
}
437-
res, err := handler.draftAwareResourceService.CSEnvironmentAddUpdate(ctx, &configMapRequest, isSuperAdmin, userEmail)
421+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
422+
res, err := handler.draftAwareResourceService.CSEnvironmentAddUpdate(ctx, &configMapRequest, userMetadata)
438423
if err != nil {
439424
handler.Logger.Errorw("service err, CSEnvironmentAddUpdate", "err", err, "payload", configMapRequest)
440425
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -548,17 +533,13 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalDelete(w http.ResponseWriter, r
548533
//RBAC END
549534
ctx := r.Context()
550535
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
551-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
552-
if err != nil {
553-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
554-
return
555-
}
536+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
556537
deleteReq := &bean.ConfigDataRequest{
557538
Id: id,
558539
AppId: appId,
559540
UserId: userId,
560541
}
561-
res, err := handler.draftAwareResourceService.CMGlobalDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
542+
res, err := handler.draftAwareResourceService.CMGlobalDelete(ctx, name, deleteReq, userMetadata)
562543
if err != nil {
563544
handler.Logger.Errorw("service err, CMGlobalDelete", "err", err, "appId", appId, "id", id, "name", name)
564545
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -614,17 +595,13 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentDelete(w http.ResponseWrite
614595
//RBAC END
615596
ctx := r.Context()
616597
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
617-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
618-
if err != nil {
619-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
620-
return
621-
}
598+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
622599
deleteReq := &bean.ConfigDataRequest{
623600
Id: id,
624601
AppId: appId,
625602
UserId: userId,
626603
}
627-
res, err := handler.draftAwareResourceService.CMEnvironmentDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
604+
res, err := handler.draftAwareResourceService.CMEnvironmentDelete(ctx, name, deleteReq, userMetadata)
628605
if err != nil {
629606
handler.Logger.Errorw("service err, CMEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id)
630607
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -666,17 +643,13 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalDelete(w http.ResponseWriter, r
666643
//RBAC END
667644
ctx := r.Context()
668645
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
669-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
670-
if err != nil {
671-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
672-
return
673-
}
646+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
674647
deleteReq := &bean.ConfigDataRequest{
675648
Id: id,
676649
AppId: appId,
677650
UserId: userId,
678651
}
679-
res, err := handler.draftAwareResourceService.CSGlobalDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
652+
res, err := handler.draftAwareResourceService.CSGlobalDelete(ctx, name, deleteReq, userMetadata)
680653
if err != nil {
681654
handler.Logger.Errorw("service err, CSGlobalDelete", "err", err, "appId", appId, "id", id, "name", name)
682655
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -732,17 +705,13 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentDelete(w http.ResponseWrite
732705
//RBAC END
733706
ctx := r.Context()
734707
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
735-
userEmail, err := handler.userAuthService.GetActiveEmailById(userId)
736-
if err != nil {
737-
common.WriteJsonResp(w, fmt.Errorf("userEmail not found by userId"), "userEmail not found by userId", http.StatusNotFound)
738-
return
739-
}
708+
userMetadata := util.GetUserMetadata(r.Context(), userId, isSuperAdmin)
740709
deleteReq := &bean.ConfigDataRequest{
741710
Id: id,
742711
AppId: appId,
743712
UserId: userId,
744713
}
745-
res, err := handler.draftAwareResourceService.CSEnvironmentDelete(ctx, name, deleteReq, isSuperAdmin, userEmail)
714+
res, err := handler.draftAwareResourceService.CSEnvironmentDelete(ctx, name, deleteReq, userMetadata)
746715
if err != nil {
747716
handler.Logger.Errorw("service err, CSEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id)
748717
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)

api/restHandler/app/appList/AppListingRestHandler.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
util4 "github.com/devtron-labs/devtron/pkg/appStore/util"
3939
"github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin"
4040
"github.com/devtron-labs/devtron/pkg/auth/user"
41+
"github.com/devtron-labs/devtron/pkg/auth/user/bean"
4142
bean5 "github.com/devtron-labs/devtron/pkg/cluster/bean"
4243
bean2 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean"
4344
common2 "github.com/devtron-labs/devtron/pkg/deployment/common"
@@ -49,6 +50,7 @@ import (
4950
k8sApplication "github.com/devtron-labs/devtron/pkg/k8s/application"
5051
"github.com/devtron-labs/devtron/pkg/pipeline"
5152
bean6 "github.com/devtron-labs/devtron/pkg/team/bean"
53+
util2 "github.com/devtron-labs/devtron/util"
5254
"github.com/devtron-labs/devtron/util/rbac"
5355
"github.com/go-pg/pg"
5456
"github.com/gorilla/mux"
@@ -469,6 +471,11 @@ func (handler AppListingRestHandlerImpl) FetchOverviewAppsByEnvironment(w http.R
469471
}
470472

471473
func (handler AppListingRestHandlerImpl) FetchAppDetailsV2(w http.ResponseWriter, r *http.Request) {
474+
userId, err := handler.userService.GetLoggedInUser(r)
475+
if userId == 0 || err != nil {
476+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
477+
return
478+
}
472479
vars := mux.Vars(r)
473480
token := r.Header.Get("token")
474481
appId, err := strconv.Atoi(vars["app-id"])
@@ -486,14 +493,21 @@ func (handler AppListingRestHandlerImpl) FetchAppDetailsV2(w http.ResponseWriter
486493
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden)
487494
return
488495
}
496+
isSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*")
497+
userEmail := util2.GetEmailFromContext(r.Context())
498+
userMetadata := &bean.UserMetadata{
499+
UserEmailId: userEmail,
500+
IsUserSuperAdmin: isSuperAdmin,
501+
UserId: userId,
502+
}
489503
appDetail, err := handler.appListingService.FetchAppDetails(r.Context(), appId, envId)
490504
if err != nil {
491505
handler.logger.Errorw("service err, FetchAppDetailsV2", "err", err, "appId", appId, "envId", envId)
492506
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
493507
return
494508
}
495509

496-
appDetail, err = handler.updateApprovalConfigDataInAppDetailResp(appDetail, appId, envId)
510+
appDetail, err = handler.updateApprovalConfigDataInAppDetailResp(r.Context(), appDetail, appId, envId, userMetadata)
497511
if err != nil {
498512
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
499513
return

api/restHandler/app/appList/AppListingRestHandler_ent.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package appList
22

33
import (
4+
"context"
45
"github.com/devtron-labs/devtron/api/bean/AppView"
6+
userBean "github.com/devtron-labs/devtron/pkg/auth/user/bean"
57
"net/http"
68
)
79

@@ -14,6 +16,6 @@ func (handler AppListingRestHandlerImpl) FetchAutocompleteJobCiPipelines(w http.
1416
func (handler AppListingRestHandlerImpl) GetAllAppEnvsFromResourceNames(w http.ResponseWriter, r *http.Request) {
1517
}
1618

17-
func (handler AppListingRestHandlerImpl) updateApprovalConfigDataInAppDetailResp(appDetail AppView.AppDetailContainer, appId, envId int) (AppView.AppDetailContainer, error) {
19+
func (handler AppListingRestHandlerImpl) updateApprovalConfigDataInAppDetailResp(ctx context.Context, appDetail AppView.AppDetailContainer, appId, envId int, userMetadata *userBean.UserMetadata) (AppView.AppDetailContainer, error) {
1820
return appDetail, nil
1921
}

0 commit comments

Comments
 (0)