openhound-github 0.6.6__tar.gz → 0.7.0__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.6.6 → openhound_github-0.7.0}/PKG-INFO +31 -3
- {openhound_github-0.6.6 → openhound_github-0.7.0}/README.md +30 -2
- openhound_github-0.7.0/descriptions/edges/GH_MemberOf.md +3 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/schema.json +1 -1
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/auth.py +10 -0
- openhound_github-0.7.0/src/openhound_github/github_rest_client.py +3 -0
- openhound_github-0.7.0/src/openhound_github/github_retry.py +48 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/helpers.py +36 -8
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/lookup.py +36 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/main.py +2 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/__init__.py +2 -1
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/team.py +44 -1
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/resources/enterprise.py +30 -12
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/resources/organization.py +271 -23
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/source.py +170 -32
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/transforms.py +33 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_error_resilience.py +1 -1
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_github_app_retry.py +12 -0
- openhound_github-0.7.0/tests/test_lookup.py +117 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_repository_rulesets.py +24 -1
- openhound_github-0.7.0/tests/test_source_endpoints.py +474 -0
- openhound_github-0.7.0/tests/test_team_external_groups.py +384 -0
- openhound_github-0.6.6/descriptions/edges/GH_MemberOf.md +0 -3
- openhound_github-0.6.6/tests/test_lookup.py +0 -28
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/CODE_OF_CONDUCT.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/CONTRIBUTING.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GOVERNANCE.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GitHub-COC-Header.png +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GitHub-CONTRIB-Header.png +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GitHub-GOV-Header.png +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GitHub-Header.png +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GitHub-LIC-Header.png +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/GitHub-SEC-Header.png +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/SECURITY.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/SO-Dark.svg +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/SO-FOSS-Dark.svg +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/SO-FOSS-Light.svg +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/SO-Light.svg +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/workflows/publish.yml +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/workflows/release-on-merge.yml +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.github/workflows/validate-branch.yml +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.gitignore +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.gitmodules +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/.pre-commit-config.yaml +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/LICENSE.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_AddAssignee.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_AddLabel.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_AddMember.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_AdminTo.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_AssignedTo.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanAccess.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanUseRunner.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CloseIssue.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_Contains.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CreateRepository.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CreateTag.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_CreateTeam.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DeleteTag.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DependsOn.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_DeploysTo.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasBranch.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasEnvironment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasJob.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasMember.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasRunner.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasSecret.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasStep.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasVariable.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_HasWorkflow.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_InheritedFrom.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_InstalledAs.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_InviteMember.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_IsEligibleFor.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageTopics.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_MapsToUser.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_Owns.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_SetIssueType.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_SetMilestone.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_SyncedTo.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_TransferRepository.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_UsesSecret.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_UsesVariable.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ValidToken.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_App.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_Branch.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_EnterpriseRunner.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_Environment.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_OrgRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_OrgRunner.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_Organization.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_RepoRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_RepoRunner.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_Repository.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_Team.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_TeamRole.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_User.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_Workflow.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_WorkflowJob.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/docs/og-docs.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/README.md +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/all-actions-allowed.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/default-repository-permissions.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/expired-pats.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/global-repo-perms.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/hybrid-identities.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/members-can-create-pages.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/org-owners.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/pending-pat-requests.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/public-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/repository-workflows.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/saml-configuration.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/team-membership-admin.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/team-structure.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/unprotected-branches.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/justfile +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/pyproject.toml +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/main.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/__init__.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/extension.yaml +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/graph.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/graphql.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/kinds/edges.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/kinds/nodes.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/actions_permission.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/app_installation.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/branch.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_admin.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_member.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_organization.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_role.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_team.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/enterprise_user.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/env_secret.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/env_variable.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/environment.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/environment_branch_policy.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/external_identity.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/org.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/org_role.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/org_role_member.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/org_role_team.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/org_secret.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/org_variable.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/personal_access_token.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/repository.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/repository_role.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/repository_secret.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/repository_variable.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/runner.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/saml_helpers.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/saml_issuer.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/saml_provider.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/saml_service_provider.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/scim_user.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/team_member.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/team_role.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/user.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/workflow.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/workflow_job.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/models/workflow_step.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/resources/__init__.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/runner_ids.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_app_auth.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_branch_collection_gate.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_branch_protection_traversability.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/actions-permissions.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/actionsecrets.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/app.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/appinstalls.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/branch-policies.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/branch-prot-rules.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/branches.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/custom-roles.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/environments.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/org-pat-request.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/org-pat.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/org-role-teams.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/org-role-users.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/org-roles.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/org.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/pat-repositories.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/repo-collaborators.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/repo-teams.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/repositories.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/scimusers.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/secrets.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/secretscanningalert.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/selected-org-secrets.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/variables.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_data/api/workflows.json +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_enterprise_capabilities.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_enterprise_organization.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_enterprise_resources.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_environment_model.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_environment_resources.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_environment_reviewer_lookup.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_github_rest_client.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_github_retry.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_helpers.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_org_scim_resources.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_org_secret_models.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_runner_ids.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_runner_models.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_runner_resources.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_saml_helpers.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_saml_models.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_scim_models.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_source_org_canonicalization.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_variable_models.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/tests/test_workflow_model.py +0 -0
- {openhound_github-0.6.6 → openhound_github-0.7.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: openhound-github
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
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
|
|
@@ -51,6 +51,21 @@ Enterprise GitHub App credentials accept either `client_id` or `app_id` as the
|
|
|
51
51
|
JWT issuer. When both are configured, `client_id` is preferred. At least one
|
|
52
52
|
identifier must be supplied together with `key_path` and `enterprise_name`.
|
|
53
53
|
|
|
54
|
+
### GitHub Enterprise Server endpoints
|
|
55
|
+
|
|
56
|
+
GitHub.com is the default deployment and does not require endpoint configuration.
|
|
57
|
+
To collect from GitHub Enterprise Server, set both API endpoints in `config.toml`:
|
|
58
|
+
|
|
59
|
+
```toml
|
|
60
|
+
[sources.github]
|
|
61
|
+
rest_api_url = "https://ghe.example/api/v3"
|
|
62
|
+
graphql_url = "https://ghe.example/api/graphql"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Both values must be provided together when overriding the GitHub.com defaults.
|
|
66
|
+
Endpoint URLs must use HTTPS and share the same origin. GitHub App
|
|
67
|
+
`credentials.api_uri` may override only the path on that same origin.
|
|
68
|
+
|
|
54
69
|
### Enterprise SCIM and hybrid correlations
|
|
55
70
|
|
|
56
71
|
A token with enterprise SCIM access is used to collect both `/scim/v2/enterprises/{enterprise}/Users` and `/scim/v2/enterprises/{enterprise}/Groups`. The collector emits normalized `SCIM_Organization`, `SCIM_User`, and `SCIM_Group` nodes plus `SCIM_Contains`, `SCIM_MemberOf`, and `SCIM_Provisioned` relationships. Install the BloodHound SCIM extension alongside this extension to register the shared SCIM kinds.
|
|
@@ -59,10 +74,23 @@ A token with enterprise SCIM access is used to collect both `/scim/v2/enterprise
|
|
|
59
74
|
|
|
60
75
|
Enterprise roles, including the built-in `members` role, are emitted through `GH_HasRole` and granular enterprise capability relationships. Only capability relationships with a confirmed privilege path are traversable; descriptive permissions such as `GH_WriteEnterpriseSso` remain non-traversable.
|
|
61
76
|
|
|
77
|
+
### Optional privileged collection
|
|
78
|
+
|
|
79
|
+
The collector runs successfully with the documented read-only permission set. Some higher-fidelity relationships require optional non-read-only permissions because GitHub exposes the supporting read APIs behind privileged permission names:
|
|
80
|
+
|
|
81
|
+
- Organization `Members: write` enables external group mapping collection for IdP-synced teams, which allows the converter to emit `SCIM_Provisioned` edges from `SCIM_Group` to `GH_Team`. This is useful when the organization uses team synchronization with an external identity provider; if no GitHub teams are linked to external groups, this permission does not add graph data.
|
|
82
|
+
- Classic PAT scope `manage_runners:enterprise` enables enterprise self-hosted runner group and runner collection. This is useful when the enterprise has enterprise-scoped runner groups or runners, especially runner groups shared into organizations; if all runners are organization- or repository-scoped, this scope does not add graph data.
|
|
83
|
+
|
|
84
|
+
If these optional permissions are not granted, OpenHound skips the affected resources and continues collecting the rest of the GitHub environment.
|
|
85
|
+
|
|
62
86
|
[](#about)
|
|
63
87
|
|
|
64
88
|
## Getting Started
|
|
65
89
|
|
|
66
|
-
Follow the OpenHound docs to get started:
|
|
90
|
+
Follow the OpenHound GitHub collector docs to get started:
|
|
67
91
|
|
|
68
|
-
- [
|
|
92
|
+
- [GitHub collector overview](https://bloodhound.specterops.io/openhound/collectors/github/overview)
|
|
93
|
+
- [Configure the collector](https://bloodhound.specterops.io/openhound/collectors/github/collect-data)
|
|
94
|
+
- [Configure an organization GitHub App](https://bloodhound.specterops.io/openhound/collectors/github/configure-app)
|
|
95
|
+
- [Configure an enterprise GitHub App](https://bloodhound.specterops.io/openhound/collectors/github/configure-enterprise-app)
|
|
96
|
+
- [Configure a personal access token](https://bloodhound.specterops.io/openhound/collectors/github/configure-pat)
|
|
@@ -40,6 +40,21 @@ Enterprise GitHub App credentials accept either `client_id` or `app_id` as the
|
|
|
40
40
|
JWT issuer. When both are configured, `client_id` is preferred. At least one
|
|
41
41
|
identifier must be supplied together with `key_path` and `enterprise_name`.
|
|
42
42
|
|
|
43
|
+
### GitHub Enterprise Server endpoints
|
|
44
|
+
|
|
45
|
+
GitHub.com is the default deployment and does not require endpoint configuration.
|
|
46
|
+
To collect from GitHub Enterprise Server, set both API endpoints in `config.toml`:
|
|
47
|
+
|
|
48
|
+
```toml
|
|
49
|
+
[sources.github]
|
|
50
|
+
rest_api_url = "https://ghe.example/api/v3"
|
|
51
|
+
graphql_url = "https://ghe.example/api/graphql"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Both values must be provided together when overriding the GitHub.com defaults.
|
|
55
|
+
Endpoint URLs must use HTTPS and share the same origin. GitHub App
|
|
56
|
+
`credentials.api_uri` may override only the path on that same origin.
|
|
57
|
+
|
|
43
58
|
### Enterprise SCIM and hybrid correlations
|
|
44
59
|
|
|
45
60
|
A token with enterprise SCIM access is used to collect both `/scim/v2/enterprises/{enterprise}/Users` and `/scim/v2/enterprises/{enterprise}/Groups`. The collector emits normalized `SCIM_Organization`, `SCIM_User`, and `SCIM_Group` nodes plus `SCIM_Contains`, `SCIM_MemberOf`, and `SCIM_Provisioned` relationships. Install the BloodHound SCIM extension alongside this extension to register the shared SCIM kinds.
|
|
@@ -48,10 +63,23 @@ A token with enterprise SCIM access is used to collect both `/scim/v2/enterprise
|
|
|
48
63
|
|
|
49
64
|
Enterprise roles, including the built-in `members` role, are emitted through `GH_HasRole` and granular enterprise capability relationships. Only capability relationships with a confirmed privilege path are traversable; descriptive permissions such as `GH_WriteEnterpriseSso` remain non-traversable.
|
|
50
65
|
|
|
66
|
+
### Optional privileged collection
|
|
67
|
+
|
|
68
|
+
The collector runs successfully with the documented read-only permission set. Some higher-fidelity relationships require optional non-read-only permissions because GitHub exposes the supporting read APIs behind privileged permission names:
|
|
69
|
+
|
|
70
|
+
- Organization `Members: write` enables external group mapping collection for IdP-synced teams, which allows the converter to emit `SCIM_Provisioned` edges from `SCIM_Group` to `GH_Team`. This is useful when the organization uses team synchronization with an external identity provider; if no GitHub teams are linked to external groups, this permission does not add graph data.
|
|
71
|
+
- Classic PAT scope `manage_runners:enterprise` enables enterprise self-hosted runner group and runner collection. This is useful when the enterprise has enterprise-scoped runner groups or runners, especially runner groups shared into organizations; if all runners are organization- or repository-scoped, this scope does not add graph data.
|
|
72
|
+
|
|
73
|
+
If these optional permissions are not granted, OpenHound skips the affected resources and continues collecting the rest of the GitHub environment.
|
|
74
|
+
|
|
51
75
|
[](#about)
|
|
52
76
|
|
|
53
77
|
## Getting Started
|
|
54
78
|
|
|
55
|
-
Follow the OpenHound docs to get started:
|
|
79
|
+
Follow the OpenHound GitHub collector docs to get started:
|
|
56
80
|
|
|
57
|
-
- [
|
|
81
|
+
- [GitHub collector overview](https://bloodhound.specterops.io/openhound/collectors/github/overview)
|
|
82
|
+
- [Configure the collector](https://bloodhound.specterops.io/openhound/collectors/github/collect-data)
|
|
83
|
+
- [Configure an organization GitHub App](https://bloodhound.specterops.io/openhound/collectors/github/configure-app)
|
|
84
|
+
- [Configure an enterprise GitHub App](https://bloodhound.specterops.io/openhound/collectors/github/configure-enterprise-app)
|
|
85
|
+
- [Configure a personal access token](https://bloodhound.specterops.io/openhound/collectors/github/configure-pat)
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
The traversable GH_MemberOf edge represents team membership and projection relationships, linking a team role to its parent team, a child team to a parent team in nested team hierarchies, or a GH_EnterpriseTeam to its projected GH_Team in an organization. This edge is traversable because these relationships carry effective team membership context through the graph: a user who holds a role in a child team inherits the repository permissions of ancestor teams, and enterprise-managed team membership flows into the projected organization team.
|
|
@@ -467,7 +467,7 @@
|
|
|
467
467
|
},
|
|
468
468
|
{
|
|
469
469
|
"name": "GH_MemberOf",
|
|
470
|
-
"description": "Team role is a member of a team,
|
|
470
|
+
"description": "Team role is a member of a team, team is nested under a parent team, or enterprise team maps to its projected organization team",
|
|
471
471
|
"is_traversable": true
|
|
472
472
|
},
|
|
473
473
|
{
|
|
@@ -293,6 +293,16 @@ class GitHubAppInstallationAuth(AuthConfigBase):
|
|
|
293
293
|
return True
|
|
294
294
|
|
|
295
295
|
def __call__(self, request: requests.PreparedRequest) -> requests.PreparedRequest:
|
|
296
|
+
try:
|
|
297
|
+
request_origin = _normalized_http_origin(
|
|
298
|
+
request.url or "", allow_query=True
|
|
299
|
+
)
|
|
300
|
+
except ValueError:
|
|
301
|
+
return request
|
|
302
|
+
|
|
303
|
+
if request_origin != self._api_origin:
|
|
304
|
+
return request
|
|
305
|
+
|
|
296
306
|
request.headers["Authorization"] = f"Bearer {self.token()}"
|
|
297
307
|
return request
|
|
298
308
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from requests import Response
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _response_message(response: Response) -> str:
|
|
7
|
+
try:
|
|
8
|
+
response_data = response.json()
|
|
9
|
+
except ValueError:
|
|
10
|
+
return getattr(response, "text", "")
|
|
11
|
+
if isinstance(response_data, dict):
|
|
12
|
+
return str(response_data.get("message", ""))
|
|
13
|
+
return ""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def is_primary_rate_limit_response(response: Response) -> bool:
|
|
17
|
+
if response.status_code not in (403, 429):
|
|
18
|
+
return False
|
|
19
|
+
|
|
20
|
+
message = _response_message(response).lower()
|
|
21
|
+
return (
|
|
22
|
+
response.headers.get("x-ratelimit-remaining") == "0"
|
|
23
|
+
or "api rate limit exceeded" in message
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def is_secondary_rate_limit_response(response: Response) -> bool:
|
|
28
|
+
if response.status_code not in (403, 429):
|
|
29
|
+
return False
|
|
30
|
+
|
|
31
|
+
message = _response_message(response).lower()
|
|
32
|
+
return "secondary rate limit" in message or "abuse detection" in message
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def should_retry_github_response(
|
|
36
|
+
response: Optional[Response], exception: Optional[BaseException]
|
|
37
|
+
) -> bool:
|
|
38
|
+
if response is None:
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
is_primary_rate_limit_response(response)
|
|
43
|
+
or is_secondary_rate_limit_response(response)
|
|
44
|
+
or (
|
|
45
|
+
response.status_code in (403, 429)
|
|
46
|
+
and bool(response.headers.get("Retry-After"))
|
|
47
|
+
)
|
|
48
|
+
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import time
|
|
3
3
|
from collections.abc import Iterator
|
|
4
|
-
from typing import Any, Optional
|
|
4
|
+
from typing import Any, Optional, overload
|
|
5
5
|
from urllib.parse import urlparse
|
|
6
6
|
|
|
7
7
|
from dlt.common import jsonpath
|
|
@@ -14,14 +14,45 @@ from dlt.sources.helpers.rest_client.paginators import (
|
|
|
14
14
|
from requests import Request
|
|
15
15
|
|
|
16
16
|
from openhound_github.auth import GitHubAppInstallationAuth
|
|
17
|
+
from openhound_github.github_retry import (
|
|
18
|
+
is_primary_rate_limit_response,
|
|
19
|
+
is_secondary_rate_limit_response,
|
|
20
|
+
)
|
|
17
21
|
|
|
18
22
|
logger = logging.getLogger(__name__)
|
|
19
23
|
|
|
24
|
+
DEFAULT_GITHUB_REST_API_URL = "https://api.github.com"
|
|
25
|
+
DEFAULT_GITHUB_GRAPHQL_URL = "https://api.github.com/graphql"
|
|
26
|
+
|
|
20
27
|
|
|
21
28
|
class GraphQLPaginationError(RuntimeError):
|
|
22
29
|
pass
|
|
23
30
|
|
|
24
31
|
|
|
32
|
+
@overload
|
|
33
|
+
def graphql_client_and_path(
|
|
34
|
+
rest_client: RESTClient,
|
|
35
|
+
graphql_client: RESTClient | None,
|
|
36
|
+
) -> tuple[RESTClient, str]: ...
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@overload
|
|
40
|
+
def graphql_client_and_path(
|
|
41
|
+
rest_client: RESTClient | None,
|
|
42
|
+
graphql_client: RESTClient | None,
|
|
43
|
+
) -> tuple[RESTClient | None, str]: ...
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def graphql_client_and_path(
|
|
47
|
+
rest_client: RESTClient | None,
|
|
48
|
+
graphql_client: RESTClient | None,
|
|
49
|
+
) -> tuple[RESTClient | None, str]:
|
|
50
|
+
"""Return the configured GraphQL client and its request path."""
|
|
51
|
+
if graphql_client:
|
|
52
|
+
return graphql_client, ""
|
|
53
|
+
return rest_client, "/graphql"
|
|
54
|
+
|
|
55
|
+
|
|
25
56
|
class AdaptiveGraphQLPageError(RuntimeError):
|
|
26
57
|
"""A terminal GraphQL page failure with adaptive pagination context."""
|
|
27
58
|
|
|
@@ -184,6 +215,7 @@ def _graphql_gateway_status(exception: BaseException) -> int | None:
|
|
|
184
215
|
def adaptive_graphql_paginate(
|
|
185
216
|
client: RESTClient,
|
|
186
217
|
*,
|
|
218
|
+
graphql_path: str = "/graphql",
|
|
187
219
|
query: str,
|
|
188
220
|
variables: dict[str, Any],
|
|
189
221
|
page_info_path: str,
|
|
@@ -247,7 +279,7 @@ def adaptive_graphql_paginate(
|
|
|
247
279
|
}
|
|
248
280
|
try:
|
|
249
281
|
response = client.post(
|
|
250
|
-
|
|
282
|
+
graphql_path,
|
|
251
283
|
json={"query": query, "variables": request_variables},
|
|
252
284
|
)
|
|
253
285
|
response.raise_for_status()
|
|
@@ -411,18 +443,14 @@ def github_retry_policy(auth: AuthConfigBase):
|
|
|
411
443
|
if response.status_code not in (403, 429):
|
|
412
444
|
return False
|
|
413
445
|
|
|
414
|
-
|
|
415
|
-
if (
|
|
416
|
-
headers.get("x-ratelimit-remaining") == "0"
|
|
417
|
-
or "api rate limit exceeded" in message
|
|
418
|
-
):
|
|
446
|
+
if is_primary_rate_limit_response(response):
|
|
419
447
|
reset_at = headers.get("x-ratelimit-reset")
|
|
420
448
|
delay = int(reset_at) - now if reset_at else 0
|
|
421
449
|
headers["Retry-After"] = str(delay)
|
|
422
450
|
logger.warning("Primary rate limit reached, retrying in %s seconds", delay)
|
|
423
451
|
return True
|
|
424
452
|
|
|
425
|
-
if
|
|
453
|
+
if is_secondary_rate_limit_response(response):
|
|
426
454
|
logger.warning("Secondary rate limit reached, retrying in 60 seconds")
|
|
427
455
|
headers["Retry-After"] = "60"
|
|
428
456
|
return True
|
|
@@ -205,6 +205,42 @@ class GithubLookup(LookupManager):
|
|
|
205
205
|
[org_login, slug],
|
|
206
206
|
)
|
|
207
207
|
|
|
208
|
+
@lru_cache
|
|
209
|
+
def external_group_for_team(
|
|
210
|
+
self, org_login: str, team_database_id: int
|
|
211
|
+
) -> tuple[int, str] | None:
|
|
212
|
+
row = self._find_single_row(
|
|
213
|
+
f"""
|
|
214
|
+
SELECT external_group_id, external_group_name
|
|
215
|
+
FROM {self.schema}.team_external_groups
|
|
216
|
+
WHERE org_login = ?
|
|
217
|
+
AND team_database_id = ?
|
|
218
|
+
""",
|
|
219
|
+
[org_login, team_database_id],
|
|
220
|
+
)
|
|
221
|
+
if row is None:
|
|
222
|
+
return None
|
|
223
|
+
return int(row[0]), str(row[1])
|
|
224
|
+
|
|
225
|
+
@lru_cache
|
|
226
|
+
def scim_group_id_for_team_external_group(
|
|
227
|
+
self, org_login: str, external_group_name: str
|
|
228
|
+
) -> str | None:
|
|
229
|
+
rows = self._find_all_objects(
|
|
230
|
+
f"""
|
|
231
|
+
SELECT DISTINCT esg.id
|
|
232
|
+
FROM {self.schema}.enterprise_scim_groups esg
|
|
233
|
+
JOIN {self.schema}.enterprise_organizations eo
|
|
234
|
+
ON eo.enterprise_node_id = esg.enterprise_node_id
|
|
235
|
+
WHERE eo.login = ?
|
|
236
|
+
AND esg.display_name = ?
|
|
237
|
+
""",
|
|
238
|
+
[org_login, external_group_name],
|
|
239
|
+
)
|
|
240
|
+
if not rows or len(rows) != 1:
|
|
241
|
+
return None
|
|
242
|
+
return str(rows[0][0])
|
|
243
|
+
|
|
208
244
|
@lru_cache
|
|
209
245
|
def external_identity_id_for_guid(
|
|
210
246
|
self, guid: str, environment_slug: str
|
|
@@ -61,12 +61,14 @@ def preproc(ctx: PreProcContext):
|
|
|
61
61
|
"repo_roles": "repo_roles",
|
|
62
62
|
"users": "users",
|
|
63
63
|
"teams": "teams",
|
|
64
|
+
"team_external_groups": "team_external_groups",
|
|
64
65
|
"team_members": "team_members",
|
|
65
66
|
"saml_provider": "saml_provider",
|
|
66
67
|
"external_identities": "external_identities",
|
|
67
68
|
"applications": "applications",
|
|
68
69
|
"enterprise": "enterprise",
|
|
69
70
|
"enterprise_organizations": "enterprise_organizations",
|
|
71
|
+
"enterprise_scim_groups": "enterprise_scim_groups",
|
|
70
72
|
"enterprise_runner_groups": "enterprise_runner_groups",
|
|
71
73
|
"enterprise_runner_group_organizations": "enterprise_runner_group_organizations",
|
|
72
74
|
"enterprise_runner_group_memberships": "enterprise_runner_group_memberships",
|
|
@@ -62,7 +62,7 @@ from .scim_user import (
|
|
|
62
62
|
ScimUser,
|
|
63
63
|
)
|
|
64
64
|
from .secret_scanning_alert import SecretScanningAlert
|
|
65
|
-
from .team import Team
|
|
65
|
+
from .team import Team, TeamExternalGroup
|
|
66
66
|
from .team_member import TeamMember
|
|
67
67
|
from .team_role import TeamRole
|
|
68
68
|
from .user import User
|
|
@@ -78,6 +78,7 @@ __all__ = [
|
|
|
78
78
|
"ActionPermission",
|
|
79
79
|
"User",
|
|
80
80
|
"Team",
|
|
81
|
+
"TeamExternalGroup",
|
|
81
82
|
"TeamRole",
|
|
82
83
|
"TeamMember",
|
|
83
84
|
"Repository",
|
|
@@ -15,7 +15,7 @@ from openhound_github.main import app
|
|
|
15
15
|
@dataclass
|
|
16
16
|
class GHTeamProperties(GHNodeProperties):
|
|
17
17
|
"""Team-specific properties and accordion panel queries.
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
Attributes:
|
|
20
20
|
collected: Collected/generated by OpenHound
|
|
21
21
|
github_team_id: The raw GitHub team node ID.
|
|
@@ -23,6 +23,8 @@ class GHTeamProperties(GHNodeProperties):
|
|
|
23
23
|
description: The team's description.
|
|
24
24
|
privacy: The team's privacy level (e.g., `visible`, `secret`).
|
|
25
25
|
type: The team type, such as `enterprise` for projected enterprise teams.
|
|
26
|
+
external_group_id: GitHub's org-scoped external IdP group identifier.
|
|
27
|
+
external_group_name: The external IdP group name reported by GitHub.
|
|
26
28
|
environment_name: The name of the environment (GitHub organization).
|
|
27
29
|
query_first_degree_members: Query for first degree members.
|
|
28
30
|
query_unrolled_members: Query for unrolled members.
|
|
@@ -40,6 +42,8 @@ class GHTeamProperties(GHNodeProperties):
|
|
|
40
42
|
description: str | None = None
|
|
41
43
|
privacy: str | None = None
|
|
42
44
|
type: str | None = None
|
|
45
|
+
external_group_id: int | None = None
|
|
46
|
+
external_group_name: str | None = None
|
|
43
47
|
environment_name: str | None = None
|
|
44
48
|
|
|
45
49
|
query_first_degree_members: str | None = None
|
|
@@ -74,6 +78,16 @@ class ParentTeam(BaseModel):
|
|
|
74
78
|
id: str
|
|
75
79
|
|
|
76
80
|
|
|
81
|
+
class TeamExternalGroup(BaseModel):
|
|
82
|
+
"""Raw mapping between an org team and its linked external IdP group."""
|
|
83
|
+
|
|
84
|
+
org_login: str
|
|
85
|
+
team_database_id: int
|
|
86
|
+
external_group_id: int
|
|
87
|
+
external_group_name: str
|
|
88
|
+
external_group_updated_at: str | None = None
|
|
89
|
+
|
|
90
|
+
|
|
77
91
|
@app.asset(
|
|
78
92
|
node=NodeDef(
|
|
79
93
|
kind=nk.TEAM,
|
|
@@ -89,6 +103,13 @@ class ParentTeam(BaseModel):
|
|
|
89
103
|
description="Team is a child of parent team",
|
|
90
104
|
traversable=False,
|
|
91
105
|
),
|
|
106
|
+
EdgeDef(
|
|
107
|
+
start=nk.SCIM_GROUP,
|
|
108
|
+
end=nk.TEAM,
|
|
109
|
+
kind=ek.SCIM_PROVISIONED,
|
|
110
|
+
description="SCIM group is provisioned as team",
|
|
111
|
+
traversable=True,
|
|
112
|
+
),
|
|
92
113
|
],
|
|
93
114
|
)
|
|
94
115
|
class Team(BaseAsset):
|
|
@@ -120,9 +141,16 @@ class Team(BaseAsset):
|
|
|
120
141
|
"""The ID from a GraphQL API response is the same as a regular node_id"""
|
|
121
142
|
return self.id
|
|
122
143
|
|
|
144
|
+
@property
|
|
145
|
+
def external_group(self) -> tuple[int, str] | None:
|
|
146
|
+
if self.database_id is None:
|
|
147
|
+
return None
|
|
148
|
+
return self._lookup.external_group_for_team(self.org_login, self.database_id)
|
|
149
|
+
|
|
123
150
|
@property
|
|
124
151
|
def as_node(self) -> GHNode:
|
|
125
152
|
tid = self.node_id
|
|
153
|
+
external_group = self.external_group
|
|
126
154
|
return GHNode(
|
|
127
155
|
kinds=[nk.TEAM],
|
|
128
156
|
properties=GHTeamProperties(
|
|
@@ -132,6 +160,8 @@ class Team(BaseAsset):
|
|
|
132
160
|
slug=self.slug,
|
|
133
161
|
description=self.description,
|
|
134
162
|
privacy=self.privacy,
|
|
163
|
+
external_group_id=external_group[0] if external_group else None,
|
|
164
|
+
external_group_name=external_group[1] if external_group else None,
|
|
135
165
|
environment_name=self.org_login,
|
|
136
166
|
environmentid=self.org_node_id,
|
|
137
167
|
query_first_degree_members=f"MATCH p=(:GH_User)-[:GH_HasRole]->(t:GH_TeamRole)-[:GH_MemberOf]->(:GH_Team {{node_id:'{tid}'}}) RETURN p",
|
|
@@ -176,6 +206,19 @@ class Team(BaseAsset):
|
|
|
176
206
|
properties=EdgeProperties(traversable=True),
|
|
177
207
|
)
|
|
178
208
|
|
|
209
|
+
external_group = self.external_group
|
|
210
|
+
if external_group:
|
|
211
|
+
scim_group_id = self._lookup.scim_group_id_for_team_external_group(
|
|
212
|
+
self.org_login, external_group[1]
|
|
213
|
+
)
|
|
214
|
+
if scim_group_id:
|
|
215
|
+
yield Edge(
|
|
216
|
+
kind=ek.SCIM_PROVISIONED,
|
|
217
|
+
start=EdgePath(value=scim_group_id, match_by="id"),
|
|
218
|
+
end=EdgePath(value=self.node_id, match_by="id"),
|
|
219
|
+
properties=EdgeProperties(traversable=True),
|
|
220
|
+
)
|
|
221
|
+
|
|
179
222
|
# yield from self._branch_edges
|
|
180
223
|
yield from self._bypass_pull_request_allowances_edges
|
|
181
224
|
yield from self._bypass_push_allowances_edges
|
{openhound_github-0.6.6 → openhound_github-0.7.0}/src/openhound_github/resources/enterprise.py
RENAMED
|
@@ -11,7 +11,11 @@ from openhound_github.graphql import (
|
|
|
11
11
|
ENTERPRISE_QUERY,
|
|
12
12
|
ENTERPRISE_SAML_QUERY,
|
|
13
13
|
)
|
|
14
|
-
from openhound_github.helpers import
|
|
14
|
+
from openhound_github.helpers import (
|
|
15
|
+
GraphQLCursorPaginator,
|
|
16
|
+
graphql_client_and_path,
|
|
17
|
+
scim_skip_reason,
|
|
18
|
+
)
|
|
15
19
|
from openhound_github.main import app
|
|
16
20
|
from openhound_github.models import (
|
|
17
21
|
BaseUser,
|
|
@@ -53,7 +57,9 @@ class SourceContext:
|
|
|
53
57
|
"""Shared context for GitHub API access."""
|
|
54
58
|
|
|
55
59
|
client: RESTClient
|
|
60
|
+
graphql_client: RESTClient | None = None
|
|
56
61
|
sso_client: RESTClient | None = None
|
|
62
|
+
sso_graphql_client: RESTClient | None = None
|
|
57
63
|
org_name: str | None = None
|
|
58
64
|
enterprise_name: str | None = None
|
|
59
65
|
emit_legacy_scim_correlations: bool = False
|
|
@@ -61,6 +67,14 @@ class SourceContext:
|
|
|
61
67
|
github_web_origin: str = DEFAULT_GITHUB_WEB_ORIGIN
|
|
62
68
|
|
|
63
69
|
|
|
70
|
+
def _graphql_client(ctx: SourceContext) -> tuple[RESTClient, str]:
|
|
71
|
+
return graphql_client_and_path(ctx.client, ctx.graphql_client)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _sso_graphql_client(ctx: SourceContext) -> tuple[RESTClient | None, str]:
|
|
75
|
+
return graphql_client_and_path(ctx.sso_client, ctx.sso_graphql_client)
|
|
76
|
+
|
|
77
|
+
|
|
64
78
|
def iter_enterprise_scim_resources(
|
|
65
79
|
client: RESTClient,
|
|
66
80
|
enterprise_slug: str,
|
|
@@ -111,8 +125,9 @@ def enterprise(ctx: SourceContext):
|
|
|
111
125
|
"variables": {"slug": ctx.enterprise_name, "after": None},
|
|
112
126
|
}
|
|
113
127
|
|
|
128
|
+
client, graphql_path = _graphql_client(ctx)
|
|
114
129
|
try:
|
|
115
|
-
response =
|
|
130
|
+
response = client.post(graphql_path, json=data).json()
|
|
116
131
|
page_enterprise = (response.get("data") or {}).get("enterprise")
|
|
117
132
|
if page_enterprise:
|
|
118
133
|
yield page_enterprise
|
|
@@ -139,9 +154,10 @@ def enterprise_organizations(enterprise_data: Enterprise, ctx: SourceContext):
|
|
|
139
154
|
"variables": {"slug": ctx.enterprise_name, "after": None},
|
|
140
155
|
}
|
|
141
156
|
|
|
157
|
+
client, graphql_path = _graphql_client(ctx)
|
|
142
158
|
try:
|
|
143
|
-
for page_data in
|
|
144
|
-
|
|
159
|
+
for page_data in client.paginate(
|
|
160
|
+
graphql_path,
|
|
145
161
|
method="POST",
|
|
146
162
|
json=data,
|
|
147
163
|
paginator=paginator,
|
|
@@ -263,8 +279,9 @@ def enterprise_members(enterprise_data: Enterprise, ctx: SourceContext):
|
|
|
263
279
|
"query": ENTERPRISE_MEMBERS_QUERY,
|
|
264
280
|
"variables": {"slug": ctx.enterprise_name, "count": 100, "after": None},
|
|
265
281
|
}
|
|
266
|
-
|
|
267
|
-
|
|
282
|
+
client, graphql_path = _graphql_client(ctx)
|
|
283
|
+
for page_data in client.paginate(
|
|
284
|
+
graphql_path,
|
|
268
285
|
method="POST",
|
|
269
286
|
json=data,
|
|
270
287
|
paginator=paginator,
|
|
@@ -635,8 +652,9 @@ def enterprise_admins(enterprise_data: Enterprise, ctx: SourceContext):
|
|
|
635
652
|
"query": ENTERPRISE_ADMINS_QUERY,
|
|
636
653
|
"variables": {"slug": ctx.enterprise_name, "count": 100, "after": None},
|
|
637
654
|
}
|
|
638
|
-
|
|
639
|
-
|
|
655
|
+
client, graphql_path = _graphql_client(ctx)
|
|
656
|
+
for page_data in client.paginate(
|
|
657
|
+
graphql_path,
|
|
640
658
|
method="POST",
|
|
641
659
|
json=data,
|
|
642
660
|
paginator=paginator,
|
|
@@ -665,7 +683,7 @@ def enterprise_admins(enterprise_data: Enterprise, ctx: SourceContext):
|
|
|
665
683
|
parallelized=True
|
|
666
684
|
)
|
|
667
685
|
def enterprise_saml_provider(enterprise_data: Enterprise, ctx: SourceContext):
|
|
668
|
-
client = ctx
|
|
686
|
+
client, graphql_path = _sso_graphql_client(ctx)
|
|
669
687
|
if not client:
|
|
670
688
|
logger.info(
|
|
671
689
|
"Skipping enterprise_saml_provider for enterprise '%s': no SSO client configured",
|
|
@@ -679,7 +697,7 @@ def enterprise_saml_provider(enterprise_data: Enterprise, ctx: SourceContext):
|
|
|
679
697
|
}
|
|
680
698
|
|
|
681
699
|
try:
|
|
682
|
-
response = client.post(
|
|
700
|
+
response = client.post(graphql_path, json=data).json()
|
|
683
701
|
except Exception as e:
|
|
684
702
|
logger.error(
|
|
685
703
|
f"Error in resource 'enterprise_saml_provider' processing enterprise '{ctx.enterprise_name}': {e}",
|
|
@@ -779,7 +797,7 @@ def enterprise_saml_issuer(saml_provider: SamlProvider, ctx: SourceContext):
|
|
|
779
797
|
def enterprise_external_identity(
|
|
780
798
|
saml_provider: SamlProvider, ctx: SourceContext
|
|
781
799
|
):
|
|
782
|
-
client = ctx
|
|
800
|
+
client, graphql_path = _sso_graphql_client(ctx)
|
|
783
801
|
if not client:
|
|
784
802
|
logger.info(
|
|
785
803
|
"Skipping enterprise_external_identity for enterprise '%s': no SSO client configured",
|
|
@@ -801,7 +819,7 @@ def enterprise_external_identity(
|
|
|
801
819
|
|
|
802
820
|
try:
|
|
803
821
|
for page_data in client.paginate(
|
|
804
|
-
|
|
822
|
+
graphql_path,
|
|
805
823
|
method="POST",
|
|
806
824
|
json=data,
|
|
807
825
|
paginator=paginator,
|