Skip to content

Commit 1be88ec

Browse files
committed
adds DisablePublicRequest middleware, adds router_test to test if middleware is applied at the route
1 parent 2a71eeb commit 1be88ec

10 files changed

Lines changed: 442 additions & 21 deletions

middlewares/access_control_middlewares.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,16 @@ func NeededScope(NeededScopes []string) shared.MiddlewareFunc {
9595
}
9696
}
9797

98+
func DisallowPublicRequests(next echo.HandlerFunc) echo.HandlerFunc {
99+
return func(ctx shared.Context) error {
100+
if shared.IsPublicRequest(ctx) {
101+
slog.Warn("access denied for public request in DisallowPublicRequests middleware")
102+
return echo.NewHTTPError(404, "could not find resource")
103+
}
104+
return next(ctx)
105+
}
106+
}
107+
98108
func AssetAccessControlFactory(assetRepository shared.AssetRepository) shared.RBACMiddleware {
99109
return func(obj shared.Object, act shared.Action) shared.MiddlewareFunc {
100110
return func(next echo.HandlerFunc) echo.HandlerFunc {

router/artifact_router.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ func NewArtifactRouter(
3030
assetVersionGroup AssetVersionRouter,
3131
artifactController *controllers.ArtifactController,
3232
artifactRepository shared.ArtifactRepository,
33+
assetRepository shared.AssetRepository,
3334
) ArtifactRouter {
3435
artifactRouter := assetVersionGroup.Group.Group("/artifacts/:artifactName", middlewares.ArtifactMiddleware(artifactRepository))
36+
assetScopedRBAC := middlewares.AssetAccessControlFactory(assetRepository)
3537

3638
artifactRouter.GET("/sbom.json/", artifactController.SBOMJSON)
3739
artifactRouter.GET("/sbom.xml/", artifactController.SBOMXML)
@@ -41,8 +43,8 @@ func NewArtifactRouter(
4143
artifactRouter.GET("/sbom.pdf/", artifactController.BuildPDFFromSBOM)
4244
artifactRouter.GET("/vulnerability-report.pdf/", artifactController.BuildVulnerabilityReportPDF)
4345

44-
artifactRouter.DELETE("/", artifactController.DeleteArtifact, middlewares.NeededScope([]string{"manage"}))
45-
artifactRouter.PUT("/", artifactController.UpdateArtifact, middlewares.NeededScope([]string{"manage"}))
46+
artifactRouter.DELETE("/", artifactController.DeleteArtifact, middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
47+
artifactRouter.PUT("/", artifactController.UpdateArtifact, middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
4648

4749
return ArtifactRouter{Group: artifactRouter}
4850
}

router/asset_router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func NewAssetRouter(
6767
assetRouter.POST("/in-toto/", intotoController.Create, middlewares.NeededScope([]string{"scan"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
6868

6969
assetUpdateAccessControlRequired := assetRouter.Group("", middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
70+
7071
assetUpdateAccessControlRequired.POST("/sbom-file/", scanController.ScanSbomFile)
7172
assetUpdateAccessControlRequired.POST("/integrations/gitlab/autosetup/", integrationController.AutoSetup)
7273
assetUpdateAccessControlRequired.POST("/members/", assetController.InviteMembers)

router/asset_version_router.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ func NewAssetVersionRouter(
6767
assetVersionRouter.GET("/artifacts/", assetVersionController.ListArtifacts)
6868
assetVersionRouter.GET("/artifact-root-nodes/", assetVersionController.ReadRootNodes)
6969

70-
assetVersionRouter.POST("/artifacts/", artifactController.Create, middlewares.NeededScope([]string{"manage"}))
70+
assetVersionRouter.POST("/artifacts/", artifactController.Create, middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
7171

72-
assetVersionRouter.POST("/components/licenses/refresh/", assetVersionController.RefetchLicenses, middlewares.NeededScope([]string{"manage"}))
72+
assetVersionRouter.POST("/components/licenses/refresh/", assetVersionController.RefetchLicenses, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
7373
assetVersionRouter.DELETE("/", assetVersionController.Delete, middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
7474
assetVersionRouter.POST("/make-default/", assetVersionController.MakeDefault, middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))
7575
assetVersionRouter.DELETE("/events/:eventID/", vulnEventController.DeleteEventByID, middlewares.EventMiddleware(vulnEventRepository), middlewares.NeededScope([]string{"manage"}), assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate))

router/dependency_vuln_router.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,18 @@ func NewDependencyVulnRouter(
2929
assetVersionGroup AssetVersionRouter,
3030
dependencyVulnController *controllers.DependencyVulnController,
3131
vulnEventController *controllers.VulnEventController,
32+
3233
) DependencyVulnRouter {
3334
dependencyVulnRouter := assetVersionGroup.Group.Group("/dependency-vulns")
3435
dependencyVulnRouter.GET("/", dependencyVulnController.ListPaged)
3536
dependencyVulnRouter.GET("/:dependencyVulnID/", dependencyVulnController.Read)
3637
dependencyVulnRouter.GET("/:dependencyVulnID/events/", vulnEventController.ReadAssetEventsByVulnID)
3738
dependencyVulnRouter.GET("/:dependencyVulnID/hints/", dependencyVulnController.Hints)
3839

39-
dependencyVulnRouter.POST("/sync/", dependencyVulnController.SyncDependencyVulns, middlewares.NeededScope([]string{"manage"}))
40-
dependencyVulnRouter.POST("/batch/", dependencyVulnController.BatchCreateEvent, middlewares.NeededScope([]string{"manage"}))
41-
dependencyVulnRouter.POST("/:dependencyVulnID/", dependencyVulnController.CreateEvent, middlewares.NeededScope([]string{"manage"}))
42-
dependencyVulnRouter.POST("/:dependencyVulnID/mitigate/", dependencyVulnController.Mitigate, middlewares.NeededScope([]string{"manage"}))
40+
dependencyVulnRouter.POST("/sync/", dependencyVulnController.SyncDependencyVulns, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
41+
dependencyVulnRouter.POST("/batch/", dependencyVulnController.BatchCreateEvent, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
42+
dependencyVulnRouter.POST("/:dependencyVulnID/", dependencyVulnController.CreateEvent, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
43+
dependencyVulnRouter.POST("/:dependencyVulnID/mitigate/", dependencyVulnController.Mitigate, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
4344

4445
return DependencyVulnRouter{Group: dependencyVulnRouter}
4546
}

router/external_reference_router.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package router
1818
import (
1919
"github.com/l3montree-dev/devguard/controllers"
2020
"github.com/l3montree-dev/devguard/middlewares"
21+
"github.com/l3montree-dev/devguard/shared"
2122
"github.com/labstack/echo/v4"
2223
)
2324

@@ -28,17 +29,19 @@ type ExternalReferenceRouter struct {
2829
func NewExternalReferenceRouter(
2930
assetVersionRouter AssetVersionRouter,
3031
externalReferenceController *controllers.ExternalReferenceController,
32+
assetRepository shared.AssetRepository,
3133
) ExternalReferenceRouter {
34+
assetScopedRBAC := middlewares.AssetAccessControlFactory(assetRepository)
3235
// External references are scoped to asset versions
3336
// Read access - anyone who can read the asset version can list references
3437
refGroup := assetVersionRouter.Group.Group("/external-references")
3538
refGroup.GET("/", externalReferenceController.List) // List all references for asset version
3639

3740
// Write access - requires asset update permission
3841
refWriteGroup := refGroup.Group("", middlewares.NeededScope([]string{"manage"}))
39-
refWriteGroup.POST("/", externalReferenceController.Create) // Create reference
40-
refWriteGroup.POST("/sync/", externalReferenceController.Sync) // Sync external sources
41-
refWriteGroup.DELETE("/:id/", externalReferenceController.Delete) // Delete reference
42+
refWriteGroup.POST("/", externalReferenceController.Create, assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate)) // Create reference
43+
refWriteGroup.POST("/sync/", externalReferenceController.Sync, assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate)) // Sync external sources
44+
refWriteGroup.DELETE("/:id/", externalReferenceController.Delete, assetScopedRBAC(shared.ObjectAsset, shared.ActionUpdate)) // Delete reference
4245

4346
return ExternalReferenceRouter{Group: refGroup}
4447
}

router/first_party_vuln_router.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ func NewFirstPartyVulnRouter(
3535
firstPartyVulnRouter.GET("/:firstPartyVulnID/", firstPartyVulnController.Read)
3636
firstPartyVulnRouter.GET("/:firstPartyVulnID/events/", vulnEventController.ReadAssetEventsByVulnID)
3737

38-
firstPartyVulnRouter.POST("/:firstPartyVulnID/", firstPartyVulnController.CreateEvent, middlewares.NeededScope([]string{"manage"}))
39-
firstPartyVulnRouter.POST("/:firstPartyVulnID/mitigate/", firstPartyVulnController.Mitigate, middlewares.NeededScope([]string{"manage"}))
38+
firstPartyVulnRouter.POST("/:firstPartyVulnID/", firstPartyVulnController.CreateEvent, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
39+
firstPartyVulnRouter.POST("/:firstPartyVulnID/mitigate/", firstPartyVulnController.Mitigate, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
4040

4141
return FirstPartyVulnRouter{Group: firstPartyVulnRouter}
4242
}

router/license_risk_router.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ func NewLicenseRiskRouter(
3232
licenseRiskRouter := assetVersionGroup.Group.Group("/license-risks")
3333
licenseRiskRouter.GET("/", licenseRiskController.ListPaged)
3434
licenseRiskRouter.GET("/:licenseRiskID/", licenseRiskController.Read)
35-
licenseRiskRouter.POST("/", licenseRiskController.Create, middlewares.NeededScope([]string{"manage"}))
36-
licenseRiskRouter.POST("/:licenseRiskID/", licenseRiskController.CreateEvent, middlewares.NeededScope([]string{"manage"}))
37-
licenseRiskRouter.POST("/:licenseRiskID/mitigate/", licenseRiskController.Mitigate, middlewares.NeededScope([]string{"manage"}))
38-
licenseRiskRouter.POST("/:licenseRiskID/final-license-decision/", licenseRiskController.MakeFinalLicenseDecision, middlewares.NeededScope([]string{"manage"}))
35+
licenseRiskRouter.POST("/", licenseRiskController.Create, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
36+
licenseRiskRouter.POST("/:licenseRiskID/", licenseRiskController.CreateEvent, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
37+
licenseRiskRouter.POST("/:licenseRiskID/mitigate/", licenseRiskController.Mitigate, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
38+
licenseRiskRouter.POST("/:licenseRiskID/final-license-decision/", licenseRiskController.MakeFinalLicenseDecision, middlewares.NeededScope([]string{"manage"}), middlewares.DisallowPublicRequests)
3939

4040
return LicenseRiskRouter{Group: licenseRiskRouter}
4141
}

0 commit comments

Comments
 (0)