refactor(github): use owner instead of repository in findings attributes (#7833)

This commit is contained in:
Andoni Alonso
2025-05-26 10:40:41 +02:00
committed by GitHub
parent eaec683eb9
commit 4f099c5663
35 changed files with 59 additions and 49 deletions
+8 -4
View File
@@ -548,7 +548,7 @@ class CheckReportGithub(Check_Report):
resource_name: str
resource_id: str
repository: str
owner: str
def __init__(
self,
@@ -556,7 +556,7 @@ class CheckReportGithub(Check_Report):
resource: Any,
resource_name: str = None,
resource_id: str = None,
repository: str = "global",
owner: str = None,
) -> None:
"""Initialize the GitHub Check's finding information.
@@ -565,12 +565,16 @@ class CheckReportGithub(Check_Report):
resource: Basic information about the resource. Defaults to None.
resource_name: The name of the resource related with the finding.
resource_id: The id of the resource related with the finding.
repository: The repository of the resource related with the finding.
owner: The owner of the resource related with the finding.
"""
super().__init__(metadata, resource)
self.resource_name = resource_name or getattr(resource, "name", "")
self.resource_id = resource_id or getattr(resource, "id", "")
self.repository = repository or getattr(resource, "repository", "")
self.owner = (
owner
or getattr(resource, "owner", "") # For Repositories
or getattr(resource, "name", "") # For Organizations
)
@dataclass
+1 -1
View File
@@ -251,7 +251,7 @@ class Finding(BaseModel):
output_data["resource_uid"] = check_output.resource_id
output_data["account_name"] = provider.identity.account_name
output_data["account_uid"] = provider.identity.account_id
output_data["region"] = check_output.repository
output_data["region"] = check_output.owner
elif provider.type == "m365":
output_data["auth_method"] = (
+1 -1
View File
@@ -17,7 +17,7 @@ def stdout_report(finding, color, verbose, status, fix):
if finding.check_metadata.Provider == "kubernetes":
details = finding.namespace.lower()
if finding.check_metadata.Provider == "github":
details = finding.repository
details = finding.owner
if finding.check_metadata.Provider == "m365":
details = finding.location
if finding.check_metadata.Provider == "nhn":
@@ -22,9 +22,7 @@ class repository_branch_delete_on_merge_enabled(Check):
"""
findings = []
for repo in repository_client.repositories.values():
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = (
f"Repository {repo.name} does not delete branches on merge."
@@ -23,9 +23,7 @@ class repository_default_branch_deletion_disabled(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.default_branch_deletion is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = (
f"Repository {repo.name} does allow default branch deletion."
@@ -23,9 +23,7 @@ class repository_default_branch_disallows_force_push(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.allow_force_pushes is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = (
f"Repository {repo.name} does allow force push."
@@ -23,9 +23,7 @@ class repository_default_branch_protection_applies_to_admins(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.enforce_admins is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = f"Repository {repo.name} does not enforce administrators to be subject to the same branch protection rules as other users."
@@ -23,9 +23,7 @@ class repository_default_branch_protection_enabled(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.default_branch_protection is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = f"Repository {repo.name} does not enforce branch protection on default branch ({repo.default_branch})."
@@ -23,9 +23,7 @@ class repository_default_branch_requires_codeowners_review(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.require_code_owner_reviews is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
if repo.require_code_owner_reviews:
report.status = "PASS"
report.status_extended = f"Repository {repo.name} requires code owner approval for changes to owned code."
@@ -23,9 +23,7 @@ class repository_default_branch_requires_conversation_resolution(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.conversation_resolution is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = (
f"Repository {repo.name} does not require conversation resolution."
@@ -23,9 +23,7 @@ class repository_default_branch_requires_linear_history(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.required_linear_history is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = f"Repository {repo.name} does not require linear history on default branch ({repo.default_branch})."
@@ -23,9 +23,7 @@ class repository_default_branch_requires_multiple_approvals(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.approval_count is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = f"Repository {repo.name} does not enforce at least 2 approvals for code changes."
@@ -23,9 +23,7 @@ class repository_default_branch_requires_signed_commits(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.require_signed_commits is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "FAIL"
report.status_extended = f"Repository {repo.name} does not require signed commits on default branch ({repo.default_branch})."
@@ -24,7 +24,7 @@ class repository_default_branch_status_checks_required(Check):
for repo in repository_client.repositories.values():
if repo.status_checks is not None:
report = CheckReportGithub(
self.metadata(), resource=repo, repository=repo.name
self.metadata(), resource=repo, owner=repo.name
)
report.status = "FAIL"
report.status_extended = (
@@ -23,9 +23,7 @@ class repository_dependency_scanning_enabled(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.dependabot_alerts_enabled is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
if repo.dependabot_alerts_enabled:
report.status = "PASS"
report.status_extended = f"Repository {repo.name} has package vulnerability scanning (Dependabot alerts) enabled."
@@ -23,9 +23,7 @@ class repository_has_codeowners_file(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.codeowners_exists is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
if repo.codeowners_exists:
report.status = "PASS"
report.status_extended = (
@@ -23,9 +23,7 @@ class repository_public_has_securitymd_file(Check):
findings = []
for repo in repository_client.repositories.values():
if not repo.private and repo.securitymd is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
report.status = "PASS"
report.status_extended = (
f"Repository {repo.name} does have a SECURITY.md file."
@@ -23,9 +23,7 @@ class repository_secret_scanning_enabled(Check):
findings = []
for repo in repository_client.repositories.values():
if repo.secret_scanning_enabled is not None:
report = CheckReportGithub(
metadata=self.metadata(), resource=repo, repository=repo.name
)
report = CheckReportGithub(metadata=self.metadata(), resource=repo)
if getattr(repo, "secret_scanning_enabled", None):
report.status = "PASS"
report.status_extended = f"Repository {repo.name} has secret scanning enabled to detect sensitive data."
@@ -161,6 +161,7 @@ class Repository(GithubService):
repos[repo.id] = Repo(
id=repo.id,
name=repo.name,
owner=repo.owner.login,
full_name=repo.full_name,
default_branch=repo.default_branch,
private=repo.private,
@@ -196,6 +197,7 @@ class Repo(BaseModel):
id: int
name: str
owner: str
full_name: str
default_branch_protection: Optional[bool]
default_branch: str
@@ -35,6 +35,7 @@ class Test_repository_branch_delete_on_merge_enabled_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -77,6 +78,7 @@ class Test_repository_branch_delete_on_merge_enabled_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -38,6 +38,7 @@ class Test_repository_default_branch_deletion_disabled_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
private=False,
@@ -82,6 +83,7 @@ class Test_repository_default_branch_deletion_disabled_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
private=False,
@@ -36,6 +36,7 @@ class Test_repository_default_branch_disallows_force_push_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
allow_force_pushes=True,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_disallows_force_push_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -36,6 +36,7 @@ class Test_repository_default_branch_protection_applies_to_admins_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
private=False,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_protection_applies_to_admins_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -36,6 +36,7 @@ class Test_repository_default_branch_protection_enabled_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
private=False,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_protection_enabled_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -35,6 +35,7 @@ class Test_repository_default_branch_requires_codeowners_review:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_requires_codeowners_review:
2: Repo(
id=2,
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
private=False,
@@ -36,6 +36,7 @@ class Test_repository_default_branch_requires_conversation_resolution_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
conversation_resolution=False,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_requires_conversation_resolution_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -36,6 +36,7 @@ class Test_repository_default_branch_requires_linear_history_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
required_linear_history=False,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_requires_linear_history_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -35,6 +35,7 @@ class Test_repository_default_branch_requires_multiple_approvals:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=False,
default_branch="main",
@@ -79,6 +80,7 @@ class Test_repository_default_branch_requires_multiple_approvals:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=False,
default_branch="master",
@@ -123,6 +125,7 @@ class Test_repository_default_branch_requires_multiple_approvals:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=True,
default_branch="master",
@@ -36,6 +36,7 @@ class Test_repository_default_branch_requires_signed_commits:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_requires_signed_commits:
2: Repo(
id=2,
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
private=False,
default_branch=default_branch,
@@ -36,6 +36,7 @@ class Test_repository_default_branch_status_checks_required_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch=default_branch,
status_checks=False,
@@ -79,6 +80,7 @@ class Test_repository_default_branch_status_checks_required_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
private=False,
default_branch=default_branch,
@@ -35,6 +35,7 @@ class Test_repository_dependency_scanning_enabled:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -80,6 +81,7 @@ class Test_repository_dependency_scanning_enabled:
2: Repo(
id=2,
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
private=False,
@@ -35,6 +35,7 @@ class Test_repository_has_codeowners_file:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -79,6 +80,7 @@ class Test_repository_has_codeowners_file:
2: Repo(
id=2,
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
private=False,
@@ -35,6 +35,7 @@ class Test_repository_public_has_securitymd_file_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -78,6 +79,7 @@ class Test_repository_public_has_securitymd_file_test:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -35,6 +35,7 @@ class Test_repository_secret_scanning_enabled:
1: Repo(
id=1,
name=repo_name,
owner="account-name",
full_name="account-name/repo1",
default_branch="main",
private=False,
@@ -79,6 +80,7 @@ class Test_repository_secret_scanning_enabled:
2: Repo(
id=2,
name=repo_name,
owner="account-name",
full_name="account-name/repo2",
default_branch="main",
private=False,
@@ -13,6 +13,7 @@ def mock_list_repositories(_):
1: Repo(
id=1,
name="repo1",
owner="account-name",
full_name="account-name/repo1",
default_branch_protection=True,
default_branch="main",