Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a ruletype that checks for the presence of a file header #239

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
43 changes: 43 additions & 0 deletions rule-types/common/file_header.test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
tests:
- name: "Specific file has a header"
def:
filter: LICENSE
header: |
# SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
# SPDX-License-Identifier: Apache-2.0
params: {}
expect: "pass"
git:
repo_base: test_1
- name: "Specific file doesn't have a header"
def:
filter: LICENSE
header: |
# SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
# SPDX-License-Identifier: Apache-2.0
params: {}
expect: "fail"
git:
repo_base: test_2
- name: "All go files have a header"
def:
filter: LICENSE
header: |
# SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
# SPDX-License-Identifier: Apache-2.0
params: {}
expect: "pass"
filter: "^.*\\.go$"
git:
repo_base: test_1
- name: "Not all go files have a header"
def:
filter: LICENSE
header: |
# SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
# SPDX-License-Identifier: Apache-2.0
params: {}
expect: "fail"
filter: "^.*\\.go$"
git:
repo_base: test_2
4 changes: 4 additions & 0 deletions rule-types/common/file_header.testdata/test_1/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
# SPDX-License-Identifier: Apache-2.0

Test file for license header
3 changes: 3 additions & 0 deletions rule-types/common/file_header.testdata/test_1/file.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
// SPDX-License-Identifier: Apache-2.0
package test_1
3 changes: 3 additions & 0 deletions rule-types/common/file_header.testdata/test_1/file_2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
// SPDX-License-Identifier: Apache-2.0
package test_1
3 changes: 3 additions & 0 deletions rule-types/common/file_header.testdata/test_2/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Another header

Test file for license header
3 changes: 3 additions & 0 deletions rule-types/common/file_header.testdata/test_2/file.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2023 The Minder Authors
// SPDX-License-Identifier: Apache-2.0
package test_1
1 change: 1 addition & 0 deletions rule-types/common/file_header.testdata/test_2/file_2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package test_1
73 changes: 73 additions & 0 deletions rule-types/common/file_header.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
version: v1
release_phase: alpha
type: rule-type
name: file_header
display_name: Checks for the presence of a header in a file
short_failure_message: File does not contain the expected header
severity:
value: low
context: {}
description: |
Checks for the presence of a header in a file.
guidance: |
Check if the file contains the expected header.

This rule is useful for enforcing the presence of a header in a file, such as license headers, code of conduct,
or other important information that should be present in the beginning of the file.
def:
in_entity: repository
rule_schema:
type: object
properties:
filter:
type: string
description: |
The filter is a regular expression that is used to filter the files that should be checked for the header.

For example, if you want to check all files with the extension `.yml`, you can use the following regex `^.*\.yml$`.

If you want to check a specific file, you can use the file name as the filter. For example, `main.go`.
header:
type: string
description: |
The header to check for in the file.

This is the expected content that should be present in the beginning of the file.
required:
- filter
- header
ingest:
type: git
git:
eval:
type: rego
rego:
type: constraints
def: |
package minder

import future.keywords.in
import future.keywords.if

violations[{"msg": msg}] if {
# Walk all files in the repo
files_in_repo := file.walk(".")

some current_file in files_in_repo

# Filter files based on the regex in filter
regex.match(input.profile.filter, current_file)

# Read the file
file_content := file.read(current_file)

# Check if the file contains the expected header
not startswith(file_content, input.profile.header)

msg := sprintf("File does not contain the expected header: %s", [current_file])
}
# Defines the configuration for alerting on the rule
alert:
type: security_advisory
security_advisory: {}
Loading