openhound-github 0.10.0__tar.gz → 0.10.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openhound_github-0.10.0 → openhound_github-0.10.1}/PKG-INFO +1 -1
- openhound_github-0.10.1/descriptions/edges/GH_CanRequestOIDCTokenFor.md +26 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Environment.md +3 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_WorkflowJob.md +2 -1
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/schema.json +5 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/kinds/edges.py +2 -1
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/lookup.py +19 -4
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_job.py +40 -2
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_repository_rulesets.py +2 -1
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_runner_models.py +3 -3
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_workflow_interception_path.py +37 -2
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_workflow_model.py +129 -0
- openhound_github-0.10.1/tests/test_workflow_resources.py +213 -0
- openhound_github-0.10.0/tests/test_workflow_resources.py +0 -98
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/CODE_OF_CONDUCT.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/CONTRIBUTING.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GOVERNANCE.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-COC-Header.png +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-CONTRIB-Header.png +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-GOV-Header.png +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-Header.png +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-LIC-Header.png +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-SEC-Header.png +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SECURITY.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-Dark.svg +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-FOSS-Dark.svg +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-FOSS-Light.svg +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-Light.svg +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/workflows/publish.yml +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/workflows/release-on-merge.yml +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/workflows/validate-branch.yml +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.gitignore +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.gitmodules +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/.pre-commit-config.yaml +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/LICENSE.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/README.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddAssignee.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddCollaborator.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddLabel.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddMember.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AdminTo.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AssignedTo.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CallsWorkflow.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAccess.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAccessSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateBranch.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanEditProtection.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanInterceptJob.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanPwnRequest.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanReadSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanUseRunner.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanWriteBranch.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CloseDiscussion.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CloseIssue.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ClosePullRequest.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_Contains.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateRepository.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateTag.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateTeam.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteIssue.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteTag.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DependsOn.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeploysTo.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoProtections.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasBaseRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasMember.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasRunner.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasVariable.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_InheritedFrom.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_InstalledAs.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_InviteMember.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_IsEligibleFor.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageTopics.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageWebhooks.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MapsToUser.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MemberOf.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_Owns.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ProtectedBy.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadRepoContents.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RemoveAssignee.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RemoveLabel.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenIssue.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RequestPrReview.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RunOrgMigration.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RunsOn.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetIssueType.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetMilestone.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetSocialPreview.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SyncedTo.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_TransferRepository.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_UsesSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_UsesVariable.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ValidToken.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteRepoContents.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_App.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_AppInstallation.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Branch.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Enterprise.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunner.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRunner.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgVariable.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Organization.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoRunner.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoSecret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoVariable.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Repository.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Runner.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RunnerGroup.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Secret.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Team.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_TeamRole.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_User.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Variable.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Workflow.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_WorkflowStep.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/docs/og-docs.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-organizations.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/README.md +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/active-leaked-secrets.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/all-actions-allowed.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/app-installations-all-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-self-approval.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/bypass-pr-requirements.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dangerous-branch-perms.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/default-repository-permissions.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/environments-admin-bypass.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/expired-pats.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/external-identities-without-scim.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/github-to-azure-identity.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/global-repo-perms.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/hybrid-identities.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-create-pages.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-create-public-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-delete-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/org-owners.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/orgs-without-2fa.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/pats-all-repo-access.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/pending-pat-requests.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/public-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/push-to-protected-branches.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/repository-workflows.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/saml-configuration.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/secret-scanning-alerts.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/self-hosted-runners-can-intercept-broad-token-jobs.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/team-membership-admin.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/team-structure.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-branches.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-default-branches.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-interceptable-by-self-hosted-runners.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-broad-token-write-permissions.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-id-token-write.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-observed-oidc-auth-steps.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/justfile +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/pyproject.toml +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/scripts/generate_gh_description_docs.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/main.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/__init__.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/auth.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/extension.yaml +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/github_rest_client.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/github_retry.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/graph.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/graphql.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/helpers.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/kinds/nodes.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/main.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/__init__.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/actions_permission.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/app_installation.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_protection_rule.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_push_allowance.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_admin.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_helpers.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_managed_user.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_member.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_organization.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role_team.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role_user.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_member.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_organization.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_role.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_user.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/env_secret.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/env_variable.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/environment.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/environment_branch_policy.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/external_identity.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role_member.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role_team.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_secret.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_variable.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token_access.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token_request.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/projected_enterprise_team.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repo_role_assignment.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_role.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_secret.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_variable.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/runner.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_helpers.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_issuer.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_provider.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_service_provider.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/scim_user.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/secret_scanning_alert.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/team.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/team_member.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/team_role.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/user.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_reference.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_step.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/resources/__init__.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/resources/enterprise.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/resources/organization.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/runner_ids.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/source.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/transforms.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_app_auth.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_branch_collection_gate.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_branch_protection_traversability.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/actions-permissions.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/actionsecrets.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/app.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/appinstalls.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/branch-policies.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/branch-prot-rules.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/branches.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/custom-roles.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/environments.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-pat-request.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-pat.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-role-teams.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-role-users.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-roles.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/pat-repositories.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/repo-collaborators.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/repo-teams.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/repositories.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/scimusers.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/secrets.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/secretscanningalert.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/selected-org-secrets.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/variables.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/workflows.json +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_description_docs.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_enterprise_capabilities.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_enterprise_organization.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_enterprise_resources.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_environment_model.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_environment_resources.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_environment_reviewer_lookup.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_error_resilience.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_github_app_retry.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_github_rest_client.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_github_retry.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_helpers.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_lookup.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_org_scim_resources.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_org_secret_models.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_runner_ids.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_runner_resources.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_saml_helpers.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_saml_models.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_scim_models.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_source_endpoints.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_source_org_canonicalization.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_team_external_groups.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_variable_models.py +0 -0
- {openhound_github-0.10.0 → openhound_github-0.10.1}/uv.lock +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# GH_CanRequestOIDCTokenFor
|
|
2
|
+
|
|
3
|
+
## General Information
|
|
4
|
+
|
|
5
|
+
The traversable GH_CanRequestOIDCTokenFor edge represents a static upper-bound capability: based on the collected workflow configuration, a GitHub Actions workflow job execution context may be able to request a GitHub-signed OIDC token containing claims for its associated GitHub Environment.
|
|
6
|
+
|
|
7
|
+
This edge is derived from the existing GH_DeploysTo relationship and the job's calculated `effective_github_token_permissions`. The collector emits it only when the job targets a statically resolved environment and its effective permissions include `id-token:write`.
|
|
8
|
+
|
|
9
|
+
This is a capability edge, not evidence that the workflow has historically requested a token or contains an explicit OIDC-related step. Code executing in a job with `id-token:write` can request the token directly.
|
|
10
|
+
|
|
11
|
+
The edge does not model run-specific permission recalculation. In particular, a `pull_request` run originating from a fork may receive downgraded `GITHUB_TOKEN` permissions at runtime and therefore may not be able to request an OIDC token even when this edge exists. The edge should not be interpreted as proof that every execution of the job can request OIDC.
|
|
12
|
+
|
|
13
|
+
## Edge Schema
|
|
14
|
+
|
|
15
|
+
| Source | Destination | Traversable |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `GH_WorkflowJob` | `GH_Environment` | `true` |
|
|
18
|
+
|
|
19
|
+
## Diagram
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
graph LR
|
|
23
|
+
n0["GH_WorkflowJob"]
|
|
24
|
+
n1["GH_Environment"]
|
|
25
|
+
n0 -->|GH_CanRequestOIDCTokenFor| n1
|
|
26
|
+
```
|
|
@@ -6,6 +6,8 @@ Represents a GitHub Actions deployment environment configured on a repository. E
|
|
|
6
6
|
|
|
7
7
|
Repositories always contain their environments. When custom branch policies are configured, the environment also contains one or more GH_EnvironmentBranchPolicy nodes that describe which branches are allowed to deploy. Environment-scoped secrets and variables are modeled as child nodes of the environment and become available to workflow jobs that reference it.
|
|
8
8
|
|
|
9
|
+
GH_CanRequestOIDCTokenFor edges from GH_WorkflowJob nodes identify jobs with a static upper-bound capability to request a GitHub-signed OIDC token for this environment because their effective `GITHUB_TOKEN` permissions include `id-token:write`. Runtime permission recalculation, such as forked `pull_request` permission downgrades, may prevent a specific execution from requesting OIDC even when this edge exists.
|
|
10
|
+
|
|
9
11
|
## Properties
|
|
10
12
|
|
|
11
13
|
| Property | Type | Description |
|
|
@@ -57,4 +59,5 @@ graph LR
|
|
|
57
59
|
n8 -.->|GH_ApprovesDeploymentTo| n1
|
|
58
60
|
n8 -->|GH_CanDeployToEnvironment| n1
|
|
59
61
|
n9 -.->|GH_DeploysTo| n1
|
|
62
|
+
n9 -->|GH_CanRequestOIDCTokenFor| n1
|
|
60
63
|
```
|
|
@@ -8,7 +8,7 @@ When the job has a statically resolvable self-hosted `runs-on` selector, GH_Runs
|
|
|
8
8
|
|
|
9
9
|
When present, `job_permissions` captures the job-level `permissions` declaration from the workflow YAML. `effective_github_token_permissions` captures the calculated static `GITHUB_TOKEN` permissions after applying the repository default, workflow-level declaration, and job-level declaration.
|
|
10
10
|
|
|
11
|
-
GH_CanAccessSecret edges identify secrets statically referenced by the job's modeled steps or job-level `env` block that the job execution context can access. GH_CanInterceptJob edges from GH_Runner nodes not explicitly marked ephemeral identify jobs whose future execution context may be exposed if that runner is controlled.
|
|
11
|
+
GH_CanAccessSecret edges identify secrets statically referenced by the job's modeled steps or job-level `env` block that the job execution context can access. GH_CanInterceptJob edges from GH_Runner nodes not explicitly marked ephemeral identify jobs whose future execution context may be exposed if that runner is controlled. When a job targets an environment and its effective permissions include `id-token:write`, GH_CanRequestOIDCTokenFor identifies a static upper-bound OIDC capability for that environment. Runtime permission recalculation, such as forked `pull_request` permission downgrades, may prevent a specific execution from requesting OIDC even when this edge exists.
|
|
12
12
|
|
|
13
13
|
When `runs_on_is_dynamic` is true, runner matching and interception status remain unresolved: the collector does not emit GH_CanInterceptJob edges for the job, so `query_interceptable_jobs` cannot match it and the absence of an edge must not be treated as evidence that the job is definitively non-interceptable.
|
|
14
14
|
|
|
@@ -70,6 +70,7 @@ graph LR
|
|
|
70
70
|
n1 -->|GH_CanAccessSecret| n3
|
|
71
71
|
n1 -->|GH_CanAccessSecret| n5
|
|
72
72
|
n1 -->|GH_CanAccessSecret| n7
|
|
73
|
+
n1 -->|GH_CanRequestOIDCTokenFor| n2
|
|
73
74
|
n9 -->|GH_CanInterceptJob| n1
|
|
74
75
|
n1 -.->|GH_CallsWorkflow| n0
|
|
75
76
|
n1 -.->|GH_DependsOn| n1
|
|
@@ -1055,6 +1055,11 @@
|
|
|
1055
1055
|
"description": "[Computed] Workflow job execution context can access a statically referenced secret — GH_WorkflowJob → GH_RepoSecret / GH_OrgSecret / GH_EnvironmentSecret",
|
|
1056
1056
|
"is_traversable": true
|
|
1057
1057
|
},
|
|
1058
|
+
{
|
|
1059
|
+
"name": "GH_CanRequestOIDCTokenFor",
|
|
1060
|
+
"description": "[Computed] Workflow job has a static upper-bound capability to request a GitHub OIDC token for its deployment environment — GH_WorkflowJob → GH_Environment",
|
|
1061
|
+
"is_traversable": true
|
|
1062
|
+
},
|
|
1058
1063
|
{
|
|
1059
1064
|
"name": "GH_UsesVariable",
|
|
1060
1065
|
"description": "[Workflow] Job or step references a variable by name — GH_WorkflowJob / GH_WorkflowStep → GH_RepoVariable / GH_OrgVariable / GH_EnvironmentVariable (scope match)",
|
|
@@ -20,7 +20,8 @@ CAN_ACCESS = "GH_CanAccess"
|
|
|
20
20
|
CAN_USE_RUNNER = "GH_CanUseRunner"
|
|
21
21
|
RUNS_ON = "GH_RunsOn"
|
|
22
22
|
CAN_INTERCEPT_JOB = "GH_CanInterceptJob"
|
|
23
|
-
CAN_ACCESS_SECRET = "GH_CanAccessSecret"
|
|
23
|
+
CAN_ACCESS_SECRET = "GH_CanAccessSecret" # noqa: S105 - OpenGraph edge kind
|
|
24
|
+
CAN_REQUEST_OIDC_TOKEN_FOR = "GH_CanRequestOIDCTokenFor" # noqa: S105 - OpenGraph edge kind
|
|
24
25
|
IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
|
|
25
26
|
CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
|
|
26
27
|
CAN_CREATE_BRANCH = "GH_CanCreateBranch"
|
|
@@ -243,18 +243,21 @@ class GithubLookup(LookupManager):
|
|
|
243
243
|
|
|
244
244
|
repository_visibility, actions_enabled = repository
|
|
245
245
|
required_labels = {str(label).casefold() for label in labels}
|
|
246
|
-
matching_runners: list[tuple[str, bool | None]] = []
|
|
246
|
+
matching_runners: list[tuple[int, str, bool | None]] = []
|
|
247
247
|
seen_runner_node_ids: set[str] = set()
|
|
248
248
|
|
|
249
249
|
def add_matching_runner(
|
|
250
|
-
|
|
250
|
+
source_order: int,
|
|
251
|
+
node_id: str,
|
|
252
|
+
raw_labels: Any,
|
|
253
|
+
ephemeral: bool | None,
|
|
251
254
|
) -> None:
|
|
252
255
|
if node_id in seen_runner_node_ids:
|
|
253
256
|
return
|
|
254
257
|
if not required_labels.issubset(self._runner_label_names(raw_labels)):
|
|
255
258
|
return
|
|
256
259
|
seen_runner_node_ids.add(node_id)
|
|
257
|
-
matching_runners.append((node_id, ephemeral))
|
|
260
|
+
matching_runners.append((source_order, node_id, ephemeral))
|
|
258
261
|
|
|
259
262
|
if group_name is None:
|
|
260
263
|
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
@@ -266,6 +269,7 @@ class GithubLookup(LookupManager):
|
|
|
266
269
|
[repository_node_id],
|
|
267
270
|
):
|
|
268
271
|
add_matching_runner(
|
|
272
|
+
0,
|
|
269
273
|
runner_node_id(repository_node_id, int(runner_id)),
|
|
270
274
|
raw_labels,
|
|
271
275
|
ephemeral,
|
|
@@ -345,6 +349,7 @@ class GithubLookup(LookupManager):
|
|
|
345
349
|
[enterprise_node_id, enterprise_runner_group_id],
|
|
346
350
|
):
|
|
347
351
|
add_matching_runner(
|
|
352
|
+
2,
|
|
348
353
|
runner_node_id(enterprise_node_id, int(runner_id)),
|
|
349
354
|
raw_labels,
|
|
350
355
|
ephemeral,
|
|
@@ -364,12 +369,19 @@ class GithubLookup(LookupManager):
|
|
|
364
369
|
[org_login, runner_group_id],
|
|
365
370
|
):
|
|
366
371
|
add_matching_runner(
|
|
372
|
+
1,
|
|
367
373
|
runner_node_id(self.org_id_for_login(org_login), int(runner_id)),
|
|
368
374
|
raw_labels,
|
|
369
375
|
ephemeral,
|
|
370
376
|
)
|
|
371
377
|
|
|
372
|
-
return
|
|
378
|
+
return [
|
|
379
|
+
(node_id, ephemeral)
|
|
380
|
+
for _source_order, node_id, ephemeral in sorted(
|
|
381
|
+
matching_runners,
|
|
382
|
+
key=lambda runner: (runner[0], runner[1]),
|
|
383
|
+
)
|
|
384
|
+
]
|
|
373
385
|
|
|
374
386
|
@lru_cache
|
|
375
387
|
def workflow_job_runner_node_ids(
|
|
@@ -594,6 +606,9 @@ class GithubLookup(LookupManager):
|
|
|
594
606
|
repository_can_approve_pull_request_reviews
|
|
595
607
|
FROM {self.schema}.workflows
|
|
596
608
|
WHERE repository_node_id = ?
|
|
609
|
+
ORDER BY
|
|
610
|
+
repository_default_workflow_permissions IS NULL,
|
|
611
|
+
repository_can_approve_pull_request_reviews IS NULL
|
|
597
612
|
LIMIT 1
|
|
598
613
|
""",
|
|
599
614
|
[repository_node_id],
|
{openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_job.py
RENAMED
|
@@ -198,6 +198,13 @@ class GHWorkflowJobProperties(GHNodeProperties):
|
|
|
198
198
|
description="Workflow job execution context can access environment secret",
|
|
199
199
|
traversable=True,
|
|
200
200
|
),
|
|
201
|
+
EdgeDef(
|
|
202
|
+
start=nk.WORKFLOW_JOB,
|
|
203
|
+
end=nk.ENVIRONMENT,
|
|
204
|
+
kind=ek.CAN_REQUEST_OIDC_TOKEN_FOR,
|
|
205
|
+
description="Workflow job has a static upper-bound capability to request an OIDC token for environment",
|
|
206
|
+
traversable=True,
|
|
207
|
+
),
|
|
201
208
|
],
|
|
202
209
|
)
|
|
203
210
|
class WorkflowJob(BaseAsset):
|
|
@@ -419,7 +426,10 @@ class WorkflowJob(BaseAsset):
|
|
|
419
426
|
@property
|
|
420
427
|
def _environment_edges(self):
|
|
421
428
|
if self.environment and not TEMPLATE_RE.search(self.environment):
|
|
422
|
-
|
|
429
|
+
persisted_environment_name = self._lookup.environment(
|
|
430
|
+
self.environment, self.repository_node_id
|
|
431
|
+
)
|
|
432
|
+
if persisted_environment_name:
|
|
423
433
|
yield Edge(
|
|
424
434
|
kind=ek.DEPLOYS_TO,
|
|
425
435
|
start=EdgePath(value=self.node_id, match_by="id"),
|
|
@@ -429,12 +439,39 @@ class WorkflowJob(BaseAsset):
|
|
|
429
439
|
PropertyMatch(
|
|
430
440
|
key="repository_id", value=self.repository_node_id
|
|
431
441
|
),
|
|
432
|
-
PropertyMatch(key="name", value=
|
|
442
|
+
PropertyMatch(key="name", value=persisted_environment_name),
|
|
433
443
|
],
|
|
434
444
|
),
|
|
435
445
|
properties=EdgeProperties(traversable=False),
|
|
436
446
|
)
|
|
437
447
|
|
|
448
|
+
def _can_request_oidc_token_for_query(self) -> str:
|
|
449
|
+
return (
|
|
450
|
+
f"MATCH p=(job:GH_WorkflowJob {{node_id:'{self.node_id}'}})"
|
|
451
|
+
"-[:GH_DeploysTo]->(:GH_Environment) "
|
|
452
|
+
"WHERE 'id-token:write' IN job.effective_github_token_permissions "
|
|
453
|
+
"RETURN p"
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
@property
|
|
457
|
+
def _can_request_oidc_token_for_edges(self):
|
|
458
|
+
if "id-token:write" not in (
|
|
459
|
+
self.calculated_effective_github_token_permissions or []
|
|
460
|
+
):
|
|
461
|
+
return
|
|
462
|
+
|
|
463
|
+
for environment_edge in self._environment_edges:
|
|
464
|
+
yield Edge(
|
|
465
|
+
kind=ek.CAN_REQUEST_OIDC_TOKEN_FOR,
|
|
466
|
+
start=environment_edge.start,
|
|
467
|
+
end=environment_edge.end,
|
|
468
|
+
properties=GHEdgeProperties(
|
|
469
|
+
traversable=True,
|
|
470
|
+
composed=True,
|
|
471
|
+
query_composition=self._can_request_oidc_token_for_query(),
|
|
472
|
+
),
|
|
473
|
+
)
|
|
474
|
+
|
|
438
475
|
@property
|
|
439
476
|
def _calls_workflows_edge(self):
|
|
440
477
|
if self.uses_reusable and self.uses_reusable.startswith("./.github/workflows/"):
|
|
@@ -573,3 +610,4 @@ class WorkflowJob(BaseAsset):
|
|
|
573
610
|
yield from self._runs_on_edges
|
|
574
611
|
yield from self._can_intercept_job_edges
|
|
575
612
|
yield from self._can_access_secret_edges
|
|
613
|
+
yield from self._can_request_oidc_token_for_edges
|
|
@@ -443,7 +443,8 @@ def test_repository_workflow_permissions_lookup_returns_collected_policy() -> No
|
|
|
443
443
|
"CREATE TABLE github.workflows (repository_node_id VARCHAR, repository_default_workflow_permissions VARCHAR, repository_can_approve_pull_request_reviews BOOLEAN)"
|
|
444
444
|
)
|
|
445
445
|
connection.execute(
|
|
446
|
-
"INSERT INTO github.workflows VALUES
|
|
446
|
+
"INSERT INTO github.workflows VALUES "
|
|
447
|
+
"('R_1', NULL, NULL), ('R_1', 'read', false), ('R_2', NULL, NULL)"
|
|
447
448
|
)
|
|
448
449
|
|
|
449
450
|
lookup = GithubLookup(connection)
|
|
@@ -65,9 +65,9 @@ def _workflow_runner_lookup() -> GithubLookup:
|
|
|
65
65
|
)
|
|
66
66
|
connection.execute(
|
|
67
67
|
"""INSERT INTO github.org_runners VALUES
|
|
68
|
-
(11, '[{"name":"self-hosted"},{"name":"Linux"},{"name":"X64"}]', false, 'acme'),
|
|
69
68
|
(12, '[{"name":"self-hosted"},{"name":"Linux"},{"name":"ARM64"}]', true, 'acme'),
|
|
70
|
-
(13, '[{"name":"self-hosted"},{"name":"Windows"},{"name":"X64"}]', NULL, 'acme')
|
|
69
|
+
(13, '[{"name":"self-hosted"},{"name":"Windows"},{"name":"X64"}]', NULL, 'acme'),
|
|
70
|
+
(11, '[{"name":"self-hosted"},{"name":"Linux"},{"name":"X64"}]', false, 'acme')"""
|
|
71
71
|
)
|
|
72
72
|
connection.execute(
|
|
73
73
|
"""INSERT INTO github.org_runner_group_access VALUES
|
|
@@ -77,7 +77,7 @@ def _workflow_runner_lookup() -> GithubLookup:
|
|
|
77
77
|
(4, 'enterprise-prod', 'selected', true, false, true, '["REPO_1"]', 'acme')"""
|
|
78
78
|
)
|
|
79
79
|
connection.execute(
|
|
80
|
-
"INSERT INTO github.org_runner_group_memberships VALUES (1,
|
|
80
|
+
"INSERT INTO github.org_runner_group_memberships VALUES (1, 13, 'acme'), (1, 12, 'acme'), (1, 11, 'acme'), (2, 12, 'acme'), (2, 11, 'acme'), (3, 11, 'acme')"
|
|
81
81
|
)
|
|
82
82
|
connection.execute(
|
|
83
83
|
"INSERT INTO github.enterprise_organizations VALUES ('ORG_1', 'ENT_1')"
|
{openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_workflow_interception_path.py
RENAMED
|
@@ -81,6 +81,10 @@ def _cross_org_enterprise_runner_lookup() -> GithubLookup:
|
|
|
81
81
|
"CREATE TABLE github.environment_secrets "
|
|
82
82
|
"(name VARCHAR, repository_node_id VARCHAR, environment_name VARCHAR)"
|
|
83
83
|
)
|
|
84
|
+
connection.execute(
|
|
85
|
+
"CREATE TABLE github.environments "
|
|
86
|
+
"(name VARCHAR, repository_node_id VARCHAR)"
|
|
87
|
+
)
|
|
84
88
|
connection.execute(
|
|
85
89
|
"INSERT INTO github.organizations VALUES "
|
|
86
90
|
"('attacker', 'ORG_A'), ('victim', 'ORG_B')"
|
|
@@ -122,6 +126,9 @@ def _cross_org_enterprise_runner_lookup() -> GithubLookup:
|
|
|
122
126
|
connection.execute(
|
|
123
127
|
"INSERT INTO github.repository_secrets VALUES ('DEPLOY_TOKEN', 'REPO_B')"
|
|
124
128
|
)
|
|
129
|
+
connection.execute(
|
|
130
|
+
"INSERT INTO github.environments VALUES ('prod', 'REPO_B')"
|
|
131
|
+
)
|
|
125
132
|
return GithubLookup(connection)
|
|
126
133
|
|
|
127
134
|
|
|
@@ -171,6 +178,8 @@ def test_cross_org_enterprise_runner_interception_path_is_traversable() -> None:
|
|
|
171
178
|
repository_node_id="REPO_B",
|
|
172
179
|
org_login="victim",
|
|
173
180
|
runs_on={"group": "enterprise-prod", "labels": ["self-hosted", "linux"]},
|
|
181
|
+
environment="prod",
|
|
182
|
+
permissions={"id-token": "write"},
|
|
174
183
|
)
|
|
175
184
|
victim_job._lookup = lookup
|
|
176
185
|
victim_step = WorkflowStep(
|
|
@@ -209,15 +218,27 @@ def test_cross_org_enterprise_runner_interception_path_is_traversable() -> None:
|
|
|
209
218
|
can_intercept = _find_edge(
|
|
210
219
|
job_edges, ek.CAN_INTERCEPT_JOB, "ENT_1_runner_31", "JOB_B"
|
|
211
220
|
)
|
|
221
|
+
deploys_to = _find_edge(job_edges, ek.DEPLOYS_TO, "JOB_B")
|
|
212
222
|
contains_step = _find_edge(job_edges + step_edges, ek.CONTAINS, "JOB_B", "STEP_B")
|
|
213
223
|
uses_secret = _find_edge(step_edges, ek.USES_SECRET, "STEP_B")
|
|
214
224
|
can_access_secret = _find_edge(job_edges, ek.CAN_ACCESS_SECRET, "JOB_B")
|
|
225
|
+
can_request_oidc_token = _find_edge(
|
|
226
|
+
job_edges, ek.CAN_REQUEST_OIDC_TOKEN_FOR, "JOB_B"
|
|
227
|
+
)
|
|
215
228
|
|
|
216
229
|
assert [
|
|
217
230
|
edge.properties.traversable
|
|
218
|
-
for edge in [
|
|
219
|
-
|
|
231
|
+
for edge in [
|
|
232
|
+
can_use,
|
|
233
|
+
inherited_from,
|
|
234
|
+
has_runner,
|
|
235
|
+
can_intercept,
|
|
236
|
+
can_access_secret,
|
|
237
|
+
can_request_oidc_token,
|
|
238
|
+
]
|
|
239
|
+
] == [True, True, True, True, True, True]
|
|
220
240
|
assert runs_on.properties.traversable is False
|
|
241
|
+
assert deploys_to.properties.traversable is False
|
|
221
242
|
assert contains_step.properties.traversable is False
|
|
222
243
|
assert uses_secret.properties.traversable is False
|
|
223
244
|
assert uses_secret.end.kind == nk.REPO_SECRET
|
|
@@ -229,6 +250,20 @@ def test_cross_org_enterprise_runner_interception_path_is_traversable() -> None:
|
|
|
229
250
|
"name": "DEPLOY_TOKEN",
|
|
230
251
|
"repository_id": "REPO_B",
|
|
231
252
|
}
|
|
253
|
+
assert can_request_oidc_token.end.kind == nk.ENVIRONMENT
|
|
254
|
+
assert {
|
|
255
|
+
matcher.key: matcher.value
|
|
256
|
+
for matcher in can_request_oidc_token.end.property_matchers
|
|
257
|
+
} == {
|
|
258
|
+
"name": "prod",
|
|
259
|
+
"repository_id": "REPO_B",
|
|
260
|
+
}
|
|
261
|
+
assert {
|
|
262
|
+
matcher.key: matcher.value for matcher in deploys_to.end.property_matchers
|
|
263
|
+
} == {
|
|
264
|
+
"name": "prod",
|
|
265
|
+
"repository_id": "REPO_B",
|
|
266
|
+
}
|
|
232
267
|
|
|
233
268
|
|
|
234
269
|
def test_inherited_runner_lookup_survives_upgraded_enterprise_runner_group_stub() -> None:
|
|
@@ -476,6 +476,134 @@ def test_workflow_job_emits_can_access_secret_edges_for_step_references() -> Non
|
|
|
476
476
|
assert "GH_UsesSecret" in edges[0].properties.query_composition
|
|
477
477
|
|
|
478
478
|
|
|
479
|
+
def test_workflow_job_emits_can_request_oidc_token_for_environment_without_oidc_step() -> None:
|
|
480
|
+
job = WorkflowJob(
|
|
481
|
+
node_id="JOB_1",
|
|
482
|
+
name="deploy",
|
|
483
|
+
job_key="deploy",
|
|
484
|
+
workflow_node_id="WORKFLOW_1",
|
|
485
|
+
repository_name="repo",
|
|
486
|
+
repository_node_id="REPO_1",
|
|
487
|
+
org_login="github",
|
|
488
|
+
environment="prod",
|
|
489
|
+
permissions={"id-token": "write"},
|
|
490
|
+
)
|
|
491
|
+
lookup = _org_reference_lookup()
|
|
492
|
+
lookup.environment.return_value = "prod"
|
|
493
|
+
job._lookup = lookup
|
|
494
|
+
|
|
495
|
+
environment_edges = list(job._environment_edges)
|
|
496
|
+
edges = list(job._can_request_oidc_token_for_edges)
|
|
497
|
+
|
|
498
|
+
assert len(environment_edges) == 1
|
|
499
|
+
assert _matcher_values(environment_edges[0]) == {
|
|
500
|
+
"repository_id": "REPO_1",
|
|
501
|
+
"name": "prod",
|
|
502
|
+
}
|
|
503
|
+
assert len(edges) == 1
|
|
504
|
+
assert edges[0].kind == ek.CAN_REQUEST_OIDC_TOKEN_FOR
|
|
505
|
+
assert edges[0].start.value == "JOB_1"
|
|
506
|
+
assert edges[0].end.kind == nk.ENVIRONMENT
|
|
507
|
+
assert _matcher_values(edges[0]) == {
|
|
508
|
+
"repository_id": "REPO_1",
|
|
509
|
+
"name": "prod",
|
|
510
|
+
}
|
|
511
|
+
assert edges[0].properties.traversable is True
|
|
512
|
+
assert edges[0].properties.composed is True
|
|
513
|
+
assert edges[0].properties.query_composition == (
|
|
514
|
+
"MATCH p=(job:GH_WorkflowJob {node_id:'JOB_1'})"
|
|
515
|
+
"-[:GH_DeploysTo]->(:GH_Environment) "
|
|
516
|
+
"WHERE 'id-token:write' IN job.effective_github_token_permissions "
|
|
517
|
+
"RETURN p"
|
|
518
|
+
)
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def test_workflow_job_can_request_oidc_token_for_requires_permission_and_environment() -> None:
|
|
522
|
+
no_permission = WorkflowJob(
|
|
523
|
+
node_id="JOB_NO_PERMISSION",
|
|
524
|
+
name="deploy",
|
|
525
|
+
job_key="deploy",
|
|
526
|
+
workflow_node_id="WORKFLOW_1",
|
|
527
|
+
repository_name="repo",
|
|
528
|
+
repository_node_id="REPO_1",
|
|
529
|
+
org_login="github",
|
|
530
|
+
environment="prod",
|
|
531
|
+
permissions={"contents": "read"},
|
|
532
|
+
)
|
|
533
|
+
no_environment = WorkflowJob(
|
|
534
|
+
node_id="JOB_NO_ENVIRONMENT",
|
|
535
|
+
name="deploy",
|
|
536
|
+
job_key="deploy",
|
|
537
|
+
workflow_node_id="WORKFLOW_1",
|
|
538
|
+
repository_name="repo",
|
|
539
|
+
repository_node_id="REPO_1",
|
|
540
|
+
org_login="github",
|
|
541
|
+
permissions={"id-token": "write"},
|
|
542
|
+
)
|
|
543
|
+
lookup = _org_reference_lookup()
|
|
544
|
+
lookup.environment.return_value = "prod"
|
|
545
|
+
no_permission._lookup = lookup
|
|
546
|
+
no_environment._lookup = lookup
|
|
547
|
+
|
|
548
|
+
assert list(no_permission._can_request_oidc_token_for_edges) == []
|
|
549
|
+
assert list(no_environment._can_request_oidc_token_for_edges) == []
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
def test_workflow_job_can_request_oidc_token_for_edges_are_per_job_and_idempotent() -> None:
|
|
553
|
+
jobs = [
|
|
554
|
+
WorkflowJob(
|
|
555
|
+
node_id="JOB_1",
|
|
556
|
+
name="deploy",
|
|
557
|
+
job_key="deploy",
|
|
558
|
+
workflow_node_id="WORKFLOW_1",
|
|
559
|
+
repository_name="repo",
|
|
560
|
+
repository_node_id="REPO_1",
|
|
561
|
+
org_login="github",
|
|
562
|
+
environment="prod",
|
|
563
|
+
permissions={"id-token": "write"},
|
|
564
|
+
),
|
|
565
|
+
WorkflowJob(
|
|
566
|
+
node_id="JOB_2",
|
|
567
|
+
name="publish",
|
|
568
|
+
job_key="publish",
|
|
569
|
+
workflow_node_id="WORKFLOW_1",
|
|
570
|
+
repository_name="repo",
|
|
571
|
+
repository_node_id="REPO_1",
|
|
572
|
+
org_login="github",
|
|
573
|
+
environment="prod",
|
|
574
|
+
permissions={"id-token": "write"},
|
|
575
|
+
),
|
|
576
|
+
WorkflowJob(
|
|
577
|
+
node_id="JOB_3",
|
|
578
|
+
name="build",
|
|
579
|
+
job_key="build",
|
|
580
|
+
workflow_node_id="WORKFLOW_1",
|
|
581
|
+
repository_name="repo",
|
|
582
|
+
repository_node_id="REPO_1",
|
|
583
|
+
org_login="github",
|
|
584
|
+
environment="prod",
|
|
585
|
+
permissions={"contents": "read"},
|
|
586
|
+
),
|
|
587
|
+
]
|
|
588
|
+
lookup = _org_reference_lookup()
|
|
589
|
+
lookup.environment.return_value = "prod"
|
|
590
|
+
for job in jobs:
|
|
591
|
+
job._lookup = lookup
|
|
592
|
+
|
|
593
|
+
edges = [
|
|
594
|
+
edge
|
|
595
|
+
for job in jobs
|
|
596
|
+
for edge in job.edges
|
|
597
|
+
if edge.kind == ek.CAN_REQUEST_OIDC_TOKEN_FOR
|
|
598
|
+
]
|
|
599
|
+
|
|
600
|
+
assert [(edge.start.value, _matcher_values(edge)) for edge in edges] == [
|
|
601
|
+
("JOB_1", {"repository_id": "REPO_1", "name": "prod"}),
|
|
602
|
+
("JOB_2", {"repository_id": "REPO_1", "name": "prod"}),
|
|
603
|
+
]
|
|
604
|
+
assert len(list(jobs[0]._can_request_oidc_token_for_edges)) == 1
|
|
605
|
+
|
|
606
|
+
|
|
479
607
|
def test_workflow_job_can_access_secret_edges_deduplicate_step_references() -> None:
|
|
480
608
|
job = WorkflowJob(
|
|
481
609
|
node_id="JOB_1",
|
|
@@ -592,6 +720,7 @@ def _org_reference_lookup() -> MagicMock:
|
|
|
592
720
|
lookup = MagicMock()
|
|
593
721
|
lookup.org_id_for_login.return_value = ORG_NODE_ID
|
|
594
722
|
lookup.repository_workflow_permissions.return_value = None
|
|
723
|
+
lookup.environment.return_value = None
|
|
595
724
|
lookup.workflow_step_secret_reference_names.return_value = []
|
|
596
725
|
lookup.repo_secret.return_value = None
|
|
597
726
|
lookup.org_secret.return_value = ("DEPLOY_TOKEN",)
|