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.
Files changed (430) hide show
  1. {openhound_github-0.10.0 → openhound_github-0.10.1}/PKG-INFO +1 -1
  2. openhound_github-0.10.1/descriptions/edges/GH_CanRequestOIDCTokenFor.md +26 -0
  3. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Environment.md +3 -0
  4. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_WorkflowJob.md +2 -1
  5. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/schema.json +5 -0
  6. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/kinds/edges.py +2 -1
  7. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/lookup.py +19 -4
  8. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_job.py +40 -2
  9. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_repository_rulesets.py +2 -1
  10. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_runner_models.py +3 -3
  11. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_workflow_interception_path.py +37 -2
  12. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_workflow_model.py +129 -0
  13. openhound_github-0.10.1/tests/test_workflow_resources.py +213 -0
  14. openhound_github-0.10.0/tests/test_workflow_resources.py +0 -98
  15. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/CODE_OF_CONDUCT.md +0 -0
  16. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/CONTRIBUTING.md +0 -0
  17. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GOVERNANCE.md +0 -0
  18. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-COC-Header.png +0 -0
  19. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-CONTRIB-Header.png +0 -0
  20. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-GOV-Header.png +0 -0
  21. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-Header.png +0 -0
  22. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-LIC-Header.png +0 -0
  23. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/GitHub-SEC-Header.png +0 -0
  24. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SECURITY.md +0 -0
  25. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-Dark.svg +0 -0
  26. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-FOSS-Dark.svg +0 -0
  27. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-FOSS-Light.svg +0 -0
  28. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/SO-Light.svg +0 -0
  29. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/workflows/publish.yml +0 -0
  30. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/workflows/release-on-merge.yml +0 -0
  31. {openhound_github-0.10.0 → openhound_github-0.10.1}/.github/workflows/validate-branch.yml +0 -0
  32. {openhound_github-0.10.0 → openhound_github-0.10.1}/.gitignore +0 -0
  33. {openhound_github-0.10.0 → openhound_github-0.10.1}/.gitmodules +0 -0
  34. {openhound_github-0.10.0 → openhound_github-0.10.1}/.pre-commit-config.yaml +0 -0
  35. {openhound_github-0.10.0 → openhound_github-0.10.1}/LICENSE.md +0 -0
  36. {openhound_github-0.10.0 → openhound_github-0.10.1}/README.md +0 -0
  37. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddAssignee.md +0 -0
  38. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddCollaborator.md +0 -0
  39. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddLabel.md +0 -0
  40. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddMember.md +0 -0
  41. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AdminTo.md +0 -0
  42. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
  43. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_AssignedTo.md +0 -0
  44. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
  45. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
  46. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CallsWorkflow.md +0 -0
  47. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAccess.md +0 -0
  48. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAccessSecret.md +0 -0
  49. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
  50. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateBranch.md +0 -0
  51. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
  52. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
  53. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
  54. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
  55. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
  56. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
  57. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
  58. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
  59. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanEditProtection.md +0 -0
  60. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanInterceptJob.md +0 -0
  61. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanPwnRequest.md +0 -0
  62. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanReadSecret.md +0 -0
  63. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
  64. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanUseRunner.md +0 -0
  65. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanWriteBranch.md +0 -0
  66. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CloseDiscussion.md +0 -0
  67. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CloseIssue.md +0 -0
  68. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ClosePullRequest.md +0 -0
  69. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_Contains.md +0 -0
  70. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
  71. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
  72. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
  73. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateRepository.md +0 -0
  74. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
  75. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateTag.md +0 -0
  76. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateTeam.md +0 -0
  77. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
  78. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
  79. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
  80. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteIssue.md +0 -0
  81. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteTag.md +0 -0
  82. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DependsOn.md +0 -0
  83. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeploysTo.md +0 -0
  84. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
  85. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
  86. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
  87. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
  88. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
  89. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
  90. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
  91. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoProtections.md +0 -0
  92. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasBaseRole.md +0 -0
  93. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
  94. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasMember.md +0 -0
  95. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
  96. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
  97. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasRole.md +0 -0
  98. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasRunner.md +0 -0
  99. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
  100. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasSecret.md +0 -0
  101. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasVariable.md +0 -0
  102. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_InheritedFrom.md +0 -0
  103. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_InstalledAs.md +0 -0
  104. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_InviteMember.md +0 -0
  105. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_IsEligibleFor.md +0 -0
  106. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
  107. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
  108. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
  109. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
  110. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
  111. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
  112. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
  113. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
  114. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
  115. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
  116. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
  117. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
  118. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
  119. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
  120. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
  121. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
  122. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
  123. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageTopics.md +0 -0
  124. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageWebhooks.md +0 -0
  125. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MapsToUser.md +0 -0
  126. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
  127. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
  128. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_MemberOf.md +0 -0
  129. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
  130. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
  131. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
  132. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
  133. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_Owns.md +0 -0
  134. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ProtectedBy.md +0 -0
  135. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
  136. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
  137. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
  138. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
  139. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
  140. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
  141. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
  142. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
  143. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
  144. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
  145. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadRepoContents.md +0 -0
  146. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RemoveAssignee.md +0 -0
  147. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RemoveLabel.md +0 -0
  148. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
  149. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenIssue.md +0 -0
  150. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
  151. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RequestPrReview.md +0 -0
  152. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
  153. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
  154. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
  155. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RunOrgMigration.md +0 -0
  156. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_RunsOn.md +0 -0
  157. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
  158. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
  159. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetIssueType.md +0 -0
  160. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetMilestone.md +0 -0
  161. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetSocialPreview.md +0 -0
  162. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_SyncedTo.md +0 -0
  163. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
  164. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
  165. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_TransferRepository.md +0 -0
  166. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_UsesSecret.md +0 -0
  167. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_UsesVariable.md +0 -0
  168. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ValidToken.md +0 -0
  169. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
  170. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
  171. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
  172. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
  173. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
  174. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
  175. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
  176. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
  177. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
  178. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
  179. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
  180. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
  181. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
  182. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
  183. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
  184. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
  185. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
  186. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteRepoContents.md +0 -0
  187. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
  188. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_App.md +0 -0
  189. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_AppInstallation.md +0 -0
  190. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Branch.md +0 -0
  191. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
  192. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Enterprise.md +0 -0
  193. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
  194. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
  195. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunner.md +0 -0
  196. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
  197. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
  198. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
  199. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
  200. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
  201. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
  202. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRole.md +0 -0
  203. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRunner.md +0 -0
  204. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
  205. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgSecret.md +0 -0
  206. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgVariable.md +0 -0
  207. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Organization.md +0 -0
  208. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
  209. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
  210. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoRole.md +0 -0
  211. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoRunner.md +0 -0
  212. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoSecret.md +0 -0
  213. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoVariable.md +0 -0
  214. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Repository.md +0 -0
  215. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Runner.md +0 -0
  216. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RunnerGroup.md +0 -0
  217. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
  218. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Secret.md +0 -0
  219. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
  220. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Team.md +0 -0
  221. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_TeamRole.md +0 -0
  222. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_User.md +0 -0
  223. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Variable.md +0 -0
  224. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Workflow.md +0 -0
  225. {openhound_github-0.10.0 → openhound_github-0.10.1}/descriptions/nodes/GH_WorkflowStep.md +0 -0
  226. {openhound_github-0.10.0 → openhound_github-0.10.1}/docs/og-docs.json +0 -0
  227. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
  228. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
  229. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
  230. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
  231. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
  232. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-organizations.json +0 -0
  233. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
  234. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
  235. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
  236. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
  237. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
  238. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
  239. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/README.md +0 -0
  240. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
  241. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/active-leaked-secrets.json +0 -0
  242. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
  243. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/all-actions-allowed.json +0 -0
  244. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/app-installations-all-repos.json +0 -0
  245. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
  246. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
  247. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
  248. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
  249. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
  250. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
  251. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-self-approval.json +0 -0
  252. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
  253. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/bypass-pr-requirements.json +0 -0
  254. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dangerous-branch-perms.json +0 -0
  255. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/default-repository-permissions.json +0 -0
  256. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
  257. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
  258. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
  259. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
  260. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/environments-admin-bypass.json +0 -0
  261. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/expired-pats.json +0 -0
  262. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/external-identities-without-scim.json +0 -0
  263. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/github-to-azure-identity.json +0 -0
  264. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/global-repo-perms.json +0 -0
  265. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/hybrid-identities.json +0 -0
  266. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
  267. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-create-pages.json +0 -0
  268. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-create-public-repos.json +0 -0
  269. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-delete-repos.json +0 -0
  270. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
  271. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
  272. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/org-owners.json +0 -0
  273. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/orgs-without-2fa.json +0 -0
  274. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/pats-all-repo-access.json +0 -0
  275. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/pending-pat-requests.json +0 -0
  276. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
  277. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
  278. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
  279. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/public-repos.json +0 -0
  280. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
  281. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/push-to-protected-branches.json +0 -0
  282. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
  283. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
  284. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/repository-workflows.json +0 -0
  285. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/saml-configuration.json +0 -0
  286. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/secret-scanning-alerts.json +0 -0
  287. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
  288. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
  289. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/self-hosted-runners-can-intercept-broad-token-jobs.json +0 -0
  290. {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
  291. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/team-membership-admin.json +0 -0
  292. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/team-structure.json +0 -0
  293. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-branches.json +0 -0
  294. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
  295. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-default-branches.json +0 -0
  296. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
  297. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-interceptable-by-self-hosted-runners.json +0 -0
  298. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-broad-token-write-permissions.json +0 -0
  299. {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
  300. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-id-token-write.json +0 -0
  301. {openhound_github-0.10.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-observed-oidc-auth-steps.json +0 -0
  302. {openhound_github-0.10.0 → openhound_github-0.10.1}/justfile +0 -0
  303. {openhound_github-0.10.0 → openhound_github-0.10.1}/pyproject.toml +0 -0
  304. {openhound_github-0.10.0 → openhound_github-0.10.1}/scripts/generate_gh_description_docs.py +0 -0
  305. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/main.py +0 -0
  306. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/__init__.py +0 -0
  307. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/auth.py +0 -0
  308. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/extension.yaml +0 -0
  309. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/github_rest_client.py +0 -0
  310. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/github_retry.py +0 -0
  311. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/graph.py +0 -0
  312. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/graphql.py +0 -0
  313. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/helpers.py +0 -0
  314. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/kinds/nodes.py +0 -0
  315. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/main.py +0 -0
  316. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/__init__.py +0 -0
  317. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/actions_permission.py +0 -0
  318. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/app_installation.py +0 -0
  319. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch.py +0 -0
  320. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
  321. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_protection_rule.py +0 -0
  322. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_push_allowance.py +0 -0
  323. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise.py +0 -0
  324. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_admin.py +0 -0
  325. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_helpers.py +0 -0
  326. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_managed_user.py +0 -0
  327. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_member.py +0 -0
  328. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_organization.py +0 -0
  329. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role.py +0 -0
  330. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role_team.py +0 -0
  331. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role_user.py +0 -0
  332. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team.py +0 -0
  333. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_member.py +0 -0
  334. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_organization.py +0 -0
  335. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_role.py +0 -0
  336. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_user.py +0 -0
  337. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/env_secret.py +0 -0
  338. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/env_variable.py +0 -0
  339. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/environment.py +0 -0
  340. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/environment_branch_policy.py +0 -0
  341. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/external_identity.py +0 -0
  342. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org.py +0 -0
  343. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role.py +0 -0
  344. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role_member.py +0 -0
  345. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role_team.py +0 -0
  346. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_secret.py +0 -0
  347. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/org_variable.py +0 -0
  348. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token.py +0 -0
  349. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token_access.py +0 -0
  350. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token_request.py +0 -0
  351. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/projected_enterprise_team.py +0 -0
  352. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repo_role_assignment.py +0 -0
  353. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository.py +0 -0
  354. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_role.py +0 -0
  355. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_secret.py +0 -0
  356. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_variable.py +0 -0
  357. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/runner.py +0 -0
  358. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
  359. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_helpers.py +0 -0
  360. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_issuer.py +0 -0
  361. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_provider.py +0 -0
  362. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_service_provider.py +0 -0
  363. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/scim_user.py +0 -0
  364. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/secret_scanning_alert.py +0 -0
  365. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/team.py +0 -0
  366. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/team_member.py +0 -0
  367. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/team_role.py +0 -0
  368. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/user.py +0 -0
  369. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow.py +0 -0
  370. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_reference.py +0 -0
  371. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_step.py +0 -0
  372. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/resources/__init__.py +0 -0
  373. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/resources/enterprise.py +0 -0
  374. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/resources/organization.py +0 -0
  375. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/runner_ids.py +0 -0
  376. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/source.py +0 -0
  377. {openhound_github-0.10.0 → openhound_github-0.10.1}/src/openhound_github/transforms.py +0 -0
  378. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_app_auth.py +0 -0
  379. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_branch_collection_gate.py +0 -0
  380. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_branch_protection_traversability.py +0 -0
  381. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/actions-permissions.json +0 -0
  382. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/actionsecrets.json +0 -0
  383. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/app.json +0 -0
  384. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/appinstalls.json +0 -0
  385. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/branch-policies.json +0 -0
  386. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/branch-prot-rules.json +0 -0
  387. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/branches.json +0 -0
  388. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/custom-roles.json +0 -0
  389. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/environments.json +0 -0
  390. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-pat-request.json +0 -0
  391. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-pat.json +0 -0
  392. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-role-teams.json +0 -0
  393. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-role-users.json +0 -0
  394. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org-roles.json +0 -0
  395. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/org.json +0 -0
  396. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/pat-repositories.json +0 -0
  397. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/repo-collaborators.json +0 -0
  398. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/repo-teams.json +0 -0
  399. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/repositories.json +0 -0
  400. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/scimusers.json +0 -0
  401. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/secrets.json +0 -0
  402. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/secretscanningalert.json +0 -0
  403. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/selected-org-secrets.json +0 -0
  404. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/variables.json +0 -0
  405. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_data/api/workflows.json +0 -0
  406. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_description_docs.py +0 -0
  407. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_enterprise_capabilities.py +0 -0
  408. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_enterprise_organization.py +0 -0
  409. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_enterprise_resources.py +0 -0
  410. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_environment_model.py +0 -0
  411. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_environment_resources.py +0 -0
  412. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_environment_reviewer_lookup.py +0 -0
  413. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_error_resilience.py +0 -0
  414. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_github_app_retry.py +0 -0
  415. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_github_rest_client.py +0 -0
  416. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_github_retry.py +0 -0
  417. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_helpers.py +0 -0
  418. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_lookup.py +0 -0
  419. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_org_scim_resources.py +0 -0
  420. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_org_secret_models.py +0 -0
  421. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_runner_ids.py +0 -0
  422. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_runner_resources.py +0 -0
  423. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_saml_helpers.py +0 -0
  424. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_saml_models.py +0 -0
  425. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_scim_models.py +0 -0
  426. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_source_endpoints.py +0 -0
  427. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_source_org_canonicalization.py +0 -0
  428. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_team_external_groups.py +0 -0
  429. {openhound_github-0.10.0 → openhound_github-0.10.1}/tests/test_variable_models.py +0 -0
  430. {openhound_github-0.10.0 → openhound_github-0.10.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openhound-github
3
- Version: 0.10.0
3
+ Version: 0.10.1
4
4
  Summary: Github collector for OpenHound
5
5
  Author-email: "jdreijer@specterops.io" <jdreijer@specterops.io>, Jared Atkinson <jatkinson@specterops.io>
6
6
  License-File: LICENSE.md
@@ -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
- node_id: str, raw_labels: Any, ephemeral: bool | None
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 matching_runners
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],
@@ -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
- if self._lookup.environment(self.environment, self.repository_node_id):
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=self.environment.upper()),
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 ('R_1', 'read', false), ('R_2', NULL, NULL)"
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, 11, 'acme'), (1, 12, 'acme'), (1, 13, 'acme'), (2, 11, 'acme'), (2, 12, 'acme'), (3, 11, 'acme')"
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')"
@@ -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 [can_use, inherited_from, has_runner, can_intercept, can_access_secret]
219
- ] == [True, True, True, True, True]
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",)