diff --git a/README.md b/README.md
index 4a3f8bc1..005c30b0 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,9 @@ in order to sync secrets, you must use a token created using a github app instal
- [docs](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-user-access-token-for-a-github-app)
- [rest api](https://docs.github.com/rest/orgs/personal-access-tokens#list-fine-grained-personal-access-tokens-with-access-to-organization-resources)
+# License Resource Type
+The `license` resource type only works with a personal access token (PAT). GitHub App installation tokens are not supported for syncing licenses.
+
# Contributing, Support and Issues
We started Baton because we were tired of taking screenshots and manually building spreadsheets. We welcome contributions, and ideas, no matter how small -- our goal is to make identity and permissions sprawl less painful for everyone. If you have questions, problems, or ideas: Please open a GitHub Issue!
diff --git a/baton_capabilities.json b/baton_capabilities.json
index 9202466f..bdfc0a87 100644
--- a/baton_capabilities.json
+++ b/baton_capabilities.json
@@ -1,6 +1,46 @@
{
"@type": "type.googleapis.com/c1.connector.v2.ConnectorCapabilities",
"resourceTypeCapabilities": [
+ {
+ "resourceType": {
+ "id": "api-key",
+ "displayName": "API Key",
+ "traits": [
+ "TRAIT_SECRET"
+ ],
+ "annotations": [
+ {
+ "@type": "type.googleapis.com/c1.connector.v2.SkipEntitlementsAndGrants"
+ }
+ ]
+ },
+ "capabilities": [
+ "CAPABILITY_SYNC"
+ ],
+ "permissions": {}
+ },
+ {
+ "resourceType": {
+ "id": "enterprise_role",
+ "displayName": "Enterprise Role",
+ "traits": [
+ "TRAIT_ROLE"
+ ],
+ "annotations": [
+ {
+ "@type": "type.googleapis.com/c1.connector.v2.V1Identifier",
+ "id": "enterprise_role"
+ },
+ {
+ "@type": "type.googleapis.com/c1.connector.v2.SkipEntitlements"
+ }
+ ]
+ },
+ "capabilities": [
+ "CAPABILITY_SYNC"
+ ],
+ "permissions": {}
+ },
{
"resourceType": {
"id": "invitation",
@@ -22,6 +62,32 @@
],
"permissions": {}
},
+ {
+ "resourceType": {
+ "id": "license",
+ "displayName": "License",
+ "traits": [
+ "TRAIT_LICENSE_PROFILE"
+ ],
+ "annotations": [
+ {
+ "@type": "type.googleapis.com/c1.connector.v2.V1Identifier",
+ "id": "license"
+ },
+ {
+ "@type": "type.googleapis.com/c1.connector.v2.SkipEntitlements"
+ },
+ {
+ "@type": "type.googleapis.com/c1.connector.v2.OptInRequired"
+ }
+ ]
+ },
+ "capabilities": [
+ "CAPABILITY_SYNC"
+ ],
+ "permissions": {},
+ "optInRequired": true
+ },
{
"resourceType": {
"id": "org",
diff --git a/cmd/baton-github-enterprise/main.go b/cmd/baton-github-enterprise/main.go
index c28c5087..9ca88d83 100644
--- a/cmd/baton-github-enterprise/main.go
+++ b/cmd/baton-github-enterprise/main.go
@@ -4,7 +4,6 @@ import (
"context"
cfg "github.com/conductorone/baton-github-enterprise/pkg/config"
- githubConnector "github.com/conductorone/baton-github/pkg/connector"
"github.com/conductorone/baton-sdk/pkg/config"
"github.com/conductorone/baton-sdk/pkg/connectorrunner"
@@ -21,6 +20,6 @@ func main() {
cfg.Config,
connector.NewLambdaConnector,
connectorrunner.WithSessionStoreEnabled(),
- connectorrunner.WithDefaultCapabilitiesConnectorBuilderV2(&githubConnector.GitHub{}),
+ connectorrunner.WithDefaultCapabilitiesConnectorBuilderV2(connector.DefaultCapabilitiesBuilder()),
)
}
diff --git a/docs/connector.mdx b/docs/connector.mdx
index afc4bb9f..0af05aff 100644
--- a/docs/connector.mdx
+++ b/docs/connector.mdx
@@ -19,18 +19,24 @@ If you access GitHub at `github.com`, go to the [GitHub](/baton/github) integrat
| Accounts | | |
| Repositories | | |
| Teams | | |
-| Orgs* | | |
-| Org roles/Enterprise licenses** | | |
+| Orgs\* | | |
+| Org roles\*\* | | |
+| Enterprise roles | | |
+| Licenses | | |
| Secrets - API keys | | |
The GitHub Enterprise connector supports [automatic account provisioning and deprovisioning](/product/admin/account-provisioning). New accounts will send an invitation to the account owner; if an invitation is pending, the account status will be shown as **Unspecified**.
-* Due to limitations on the GitHub API, syncing multiple orgs requires a personal access token (PAT). A separate connector and GitHub app is required when using the GitHub App integration.
+\* Due to limitations on the GitHub API, syncing multiple orgs requires a personal access token (PAT). A separate connector and GitHub app is required when using the GitHub App integration.
\*\* Organization roles are also referred to as "enterprise licenses" in GitHub's documentation.
[This connector can sync secrets](/product/admin/inventory) and display them on the **Inventory** page.
+
+Syncing the **Licenses** resource type only works with a personal access token (classic). GitHub App installation tokens are not supported for license sync.
+
+
## Gather GitHub Enterprise credentials
Configuring the connector requires you to pass in credentials generated in GitHub Enterprise. Gather these credentials before you move on. To set up the GitHub Enterprise connector, you can choose to create either a personal access token (classic) or a fine-grained access token.
diff --git a/go.mod b/go.mod
index 0f1e3022..f6962e98 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module github.com/conductorone/baton-github-enterprise
go 1.25.2
require (
- github.com/conductorone/baton-github v0.3.4
+ github.com/conductorone/baton-github v0.3.7
github.com/conductorone/baton-sdk v0.12.0
github.com/ennyjfrick/ruleguard-logfatal v0.0.2
github.com/quasilyte/go-ruleguard/dsl v0.3.23
diff --git a/go.sum b/go.sum
index 7d5b0aec..cc3fa7e4 100644
--- a/go.sum
+++ b/go.sum
@@ -76,8 +76,8 @@ github.com/cockroachdb/swiss v0.0.0-20251224182025-b0f6560f979b h1:VXvSNzmr8hMj8
github.com/cockroachdb/swiss v0.0.0-20251224182025-b0f6560f979b/go.mod h1:yBRu/cnL4ks9bgy4vAASdjIW+/xMlFwuHKqtmh3GZQg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
-github.com/conductorone/baton-github v0.3.4 h1:XwN2IjsO0Np8W27/haEwLE6bzv3z4DOuDchap7OXNMA=
-github.com/conductorone/baton-github v0.3.4/go.mod h1:FNqeFdfuFiweOvw3xaz0wiZzb7FtqaaHAZQu4BXohhs=
+github.com/conductorone/baton-github v0.3.7 h1:wK65opd70uLjaSeuUfl5ZkK4h5nB4kZUQBWBK2fER7E=
+github.com/conductorone/baton-github v0.3.7/go.mod h1:nnCvY6EzW768V5qbO95yEuLlMa97J2aWZ5qyirwYW/A=
github.com/conductorone/baton-sdk v0.12.0 h1:KD/7RfSo3CDRvdAJdtX87duaHBumgDQE1ro9K46QmcA=
github.com/conductorone/baton-sdk v0.12.0/go.mod h1:hNdQlCu0prYFQj8ysF/J+0zjUxdqjPPVBlZJVwMIb6o=
github.com/conductorone/dpop v0.2.6 h1:fakwai/Xm2b/fcDUwJN41WtcSI/2UhQOyRIVvnnrrNA=
diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go
index ebb24591..c7bf25b2 100644
--- a/pkg/connector/connector.go
+++ b/pkg/connector/connector.go
@@ -6,6 +6,8 @@ import (
cfg "github.com/conductorone/baton-github-enterprise/pkg/config"
githubCfg "github.com/conductorone/baton-github/pkg/config"
"github.com/conductorone/baton-github/pkg/connector"
+ v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
+ "github.com/conductorone/baton-sdk/pkg/annotations"
"github.com/conductorone/baton-sdk/pkg/cli"
"github.com/conductorone/baton-sdk/pkg/connectorbuilder"
)
@@ -24,3 +26,31 @@ func NewLambdaConnector(ctx context.Context, ghc *cfg.Githubenterprise, cliOpts
DirectCollaboratorsOnly: ghc.DirectCollaboratorsOnly,
}, cliOpts)
}
+
+func DefaultCapabilitiesBuilder() connectorbuilder.ConnectorBuilderV2 {
+ return &defaultCapabilitiesBuilder{}
+}
+
+type defaultCapabilitiesBuilder struct{}
+
+func (d *defaultCapabilitiesBuilder) Metadata(_ context.Context) (*v2.ConnectorMetadata, error) {
+ return &v2.ConnectorMetadata{DisplayName: "GitHub Enterprise"}, nil
+}
+
+func (d *defaultCapabilitiesBuilder) Validate(_ context.Context) (annotations.Annotations, error) {
+ return nil, nil
+}
+
+func (d *defaultCapabilitiesBuilder) ResourceSyncers(_ context.Context) []connectorbuilder.ResourceSyncerV2 {
+ return []connectorbuilder.ResourceSyncerV2{
+ connector.OrgBuilder(nil, nil, nil, nil, false),
+ connector.TeamBuilder(nil, nil, false),
+ connector.UserBuilder(nil, nil, nil, nil, nil, nil),
+ connector.RepositoryBuilder(nil, nil, false, false),
+ connector.OrgRoleBuilder(nil, nil),
+ connector.InvitationBuilder(connector.InvitationBuilderParams{}),
+ connector.APITokenBuilder(nil, nil),
+ connector.EnterpriseRoleBuilder(nil, nil, nil, nil),
+ connector.LicenseBuilder(nil, nil),
+ }
+}
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/api_token.go b/vendor/github.com/conductorone/baton-github/pkg/connector/api_token.go
index 6b3d0319..6525860e 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/api_token.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/api_token.go
@@ -15,6 +15,8 @@ func apiTokenResource(ctx context.Context, token *github.PersonalAccessToken) (*
options := []resourceSdk.SecretTraitOption{}
options = append(options,
+ resourceSdk.WithSecretType(v2.SecretTrait_CREDENTIAL_TYPE_STATIC_SECRET),
+ resourceSdk.WithSecretDetail("github.token.pat"),
resourceSdk.WithSecretCreatedByID(&v2.ResourceId{
ResourceType: resourceTypeUser.Id,
Resource: strconv.FormatInt(userId, 10),
@@ -128,7 +130,7 @@ func (o *apiTokenResourceType) List(
}, nil
}
-func apiTokenBuilder(client *github.Client, orgCache *orgNameCache) *apiTokenResourceType {
+func APITokenBuilder(client *github.Client, orgCache *orgNameCache) *apiTokenResourceType {
return &apiTokenResourceType{
resourceType: resourceTypeApiToken,
client: client,
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/connector.go b/vendor/github.com/conductorone/baton-github/pkg/connector/connector.go
index 06f9758f..5d1590a2 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/connector.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/connector.go
@@ -93,6 +93,18 @@ var (
Traits: []v2.ResourceType_Trait{v2.ResourceType_TRAIT_ROLE},
Annotations: skipEntitlementsAnnotations("enterprise_role"),
}
+ resourceTypeLicense = &v2.ResourceType{
+ Id: "license",
+ DisplayName: "License",
+ Traits: []v2.ResourceType_Trait{v2.ResourceType_TRAIT_LICENSE_PROFILE},
+ Annotations: annotations.New(
+ &v2.V1Identifier{
+ Id: "license",
+ },
+ &v2.SkipEntitlements{},
+ &v2.OptInRequired{},
+ ),
+ }
)
type GitHub struct {
@@ -111,12 +123,12 @@ type GitHub struct {
func (gh *GitHub) ResourceSyncers(ctx context.Context) []connectorbuilder.ResourceSyncerV2 {
resourceSyncers := []connectorbuilder.ResourceSyncerV2{
- orgBuilder(gh.client, gh.appClient, gh.orgCache, gh.orgs, gh.syncSecrets),
- teamBuilder(gh.client, gh.orgCache, gh.directCollaboratorsOnly),
- userBuilder(gh.client, gh.graphqlClient, gh.orgCache, gh.orgs, gh.customClient, gh.enterprises),
- repositoryBuilder(gh.client, gh.orgCache, gh.omitArchivedRepositories, gh.directCollaboratorsOnly),
- orgRoleBuilder(gh.client, gh.orgCache),
- invitationBuilder(invitationBuilderParams{
+ OrgBuilder(gh.client, gh.appClient, gh.orgCache, gh.orgs, gh.syncSecrets),
+ TeamBuilder(gh.client, gh.orgCache, gh.directCollaboratorsOnly),
+ UserBuilder(gh.client, gh.graphqlClient, gh.orgCache, gh.orgs, gh.customClient, gh.enterprises),
+ RepositoryBuilder(gh.client, gh.orgCache, gh.omitArchivedRepositories, gh.directCollaboratorsOnly),
+ OrgRoleBuilder(gh.client, gh.orgCache),
+ InvitationBuilder(InvitationBuilderParams{
client: gh.client,
orgCache: gh.orgCache,
orgs: gh.orgs,
@@ -124,11 +136,14 @@ func (gh *GitHub) ResourceSyncers(ctx context.Context) []connectorbuilder.Resour
}
if gh.syncSecrets {
- resourceSyncers = append(resourceSyncers, apiTokenBuilder(gh.client, gh.orgCache))
+ resourceSyncers = append(resourceSyncers, APITokenBuilder(gh.client, gh.orgCache))
}
if len(gh.enterprises) > 0 {
- resourceSyncers = append(resourceSyncers, enterpriseRoleBuilder(gh.client, gh.appClient, gh.customClient, gh.enterprises))
+ resourceSyncers = append(resourceSyncers,
+ EnterpriseRoleBuilder(gh.client, gh.appClient, gh.customClient, gh.enterprises),
+ LicenseBuilder(gh.customClient, gh.enterprises),
+ )
}
return resourceSyncers
}
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/enterprise_role.go b/vendor/github.com/conductorone/baton-github/pkg/connector/enterprise_role.go
index b8474c22..a6e79aab 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/enterprise_role.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/enterprise_role.go
@@ -176,7 +176,7 @@ func (o *enterpriseRoleResourceType) Grants(
return ret, &resourceSdk.SyncOpResults{}, nil
}
-func enterpriseRoleBuilder(client *github.Client, appClient *github.Client, customClient *customclient.Client, enterprises []string) *enterpriseRoleResourceType {
+func EnterpriseRoleBuilder(client *github.Client, appClient *github.Client, customClient *customclient.Client, enterprises []string) *enterpriseRoleResourceType {
return &enterpriseRoleResourceType{
resourceType: resourceTypeEnterpriseRole,
client: client,
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/invitation.go b/vendor/github.com/conductorone/baton-github/pkg/connector/invitation.go
index 95212ad8..52df44a2 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/invitation.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/invitation.go
@@ -520,13 +520,13 @@ func containsLower(s, substr string) bool {
return strings.Contains(strings.ToLower(s), substr)
}
-type invitationBuilderParams struct {
+type InvitationBuilderParams struct {
client *github.Client
orgCache *orgNameCache
orgs []string
}
-func invitationBuilder(p invitationBuilderParams) *invitationResourceType {
+func InvitationBuilder(p InvitationBuilderParams) *invitationResourceType {
return &invitationResourceType{
client: p.client,
orgCache: p.orgCache,
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/license.go b/vendor/github.com/conductorone/baton-github/pkg/connector/license.go
new file mode 100644
index 00000000..5e99eca2
--- /dev/null
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/license.go
@@ -0,0 +1,162 @@
+package connector
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/conductorone/baton-github/pkg/customclient"
+ v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
+ "github.com/conductorone/baton-sdk/pkg/types/entitlement"
+ "github.com/conductorone/baton-sdk/pkg/types/grant"
+ resourceSdk "github.com/conductorone/baton-sdk/pkg/types/resource"
+)
+
+const (
+ licenseEntitlementAssigned = "assigned"
+
+ // enterpriseRoleMember is the GitHub enterprise role name that maps to
+ // "this user counts as a member of the enterprise." It's the value GitHub
+ // returns in github_com_enterprise_roles for license-consuming members.
+ enterpriseRoleMember = "Member"
+)
+
+type licenseResourceType struct {
+ resourceType *v2.ResourceType
+ customClient *customclient.Client
+ enterprises []string
+}
+
+func (l *licenseResourceType) ResourceType(_ context.Context) *v2.ResourceType {
+ return l.resourceType
+}
+
+func (l *licenseResourceType) List(
+ ctx context.Context,
+ parentID *v2.ResourceId,
+ opts resourceSdk.SyncOpAttrs,
+) ([]*v2.Resource, *resourceSdk.SyncOpResults, error) {
+ var ret []*v2.Resource
+ for _, enterprise := range l.enterprises {
+ // total_seats_purchased and total_seats_consumed are enterprise-wide
+ // aggregates that the API returns identically on every page, so the
+ // first page is enough.
+ consumedLicenses, _, err := l.customClient.ListEnterpriseConsumedLicenses(ctx, enterprise, 1)
+ if err != nil {
+ return nil, nil, fmt.Errorf("baton-github: error listing enterprise consumed licenses for %s: %w", enterprise, err)
+ }
+
+ memberRoleResource, err := resourceSdk.NewResource(
+ enterpriseRoleMember,
+ resourceTypeEnterpriseRole,
+ fmt.Sprintf("%s:%s", enterprise, enterpriseRoleMember),
+ )
+ if err != nil {
+ return nil, nil, err
+ }
+
+ resource, err := licenseResource(
+ enterprise,
+ int64(consumedLicenses.TotalSeatsPurchased),
+ int64(consumedLicenses.TotalSeatsConsumed),
+ entitlement.NewEntitlementID(memberRoleResource, licenseEntitlementAssigned),
+ )
+ if err != nil {
+ return nil, nil, fmt.Errorf("baton-github: error creating license resource for enterprise %s: %w", enterprise, err)
+ }
+ ret = append(ret, resource)
+ }
+
+ return ret, &resourceSdk.SyncOpResults{}, nil
+}
+
+func (l *licenseResourceType) Entitlements(
+ _ context.Context,
+ _ *v2.Resource,
+ _ resourceSdk.SyncOpAttrs,
+) ([]*v2.Entitlement, *resourceSdk.SyncOpResults, error) {
+ return nil, &resourceSdk.SyncOpResults{}, nil
+}
+
+func (l *licenseResourceType) StaticEntitlements(
+ _ context.Context,
+ _ resourceSdk.SyncOpAttrs,
+) ([]*v2.Entitlement, *resourceSdk.SyncOpResults, error) {
+ rv := []*v2.Entitlement{
+ entitlement.NewAssignmentEntitlement(nil, licenseEntitlementAssigned,
+ entitlement.WithDisplayName("License Assigned"),
+ entitlement.WithDescription("Assignment of an enterprise license seat"),
+ entitlement.WithGrantableTo(resourceTypeUser),
+ ),
+ }
+ return rv, &resourceSdk.SyncOpResults{}, nil
+}
+
+func (l *licenseResourceType) Grants(
+ _ context.Context,
+ resource *v2.Resource,
+ _ resourceSdk.SyncOpAttrs,
+) ([]*v2.Grant, *resourceSdk.SyncOpResults, error) {
+ enterprise := resource.Id.Resource
+
+ memberRoleResource, err := resourceSdk.NewResource(
+ enterpriseRoleMember,
+ resourceTypeEnterpriseRole,
+ fmt.Sprintf("%s:%s", enterprise, enterpriseRoleMember),
+ )
+ if err != nil {
+ return nil, nil, err
+ }
+
+ grants := []*v2.Grant{
+ grant.NewGrant(resource, licenseEntitlementAssigned, memberRoleResource.Id,
+ grant.WithAnnotation(
+ &v2.GrantExpandable{
+ EntitlementIds: []string{
+ entitlement.NewEntitlementID(memberRoleResource, licenseEntitlementAssigned),
+ },
+ Shallow: true,
+ ResourceTypeIds: []string{resourceTypeUser.Id},
+ },
+ &v2.V1Identifier{
+ Id: fmt.Sprintf("license-grant:%s", enterprise),
+ },
+ ),
+ ),
+ }
+
+ return grants, &resourceSdk.SyncOpResults{}, nil
+}
+
+func licenseResource(enterprise string, purchasedSeats, consumedSeats int64, entitlementID string) (*v2.Resource, error) {
+ traitOpts := []resourceSdk.LicenseProfileTraitOption{
+ resourceSdk.WithLicenseName(enterprise),
+ resourceSdk.WithLicenseSeats(purchasedSeats, consumedSeats),
+ resourceSdk.WithLicenseEntitlementIDs(entitlementID),
+ }
+
+ licenseTrait, err := resourceSdk.NewLicenseProfileTrait(traitOpts...)
+ if err != nil {
+ return nil, err
+ }
+
+ return resourceSdk.NewResource(
+ enterprise,
+ resourceTypeLicense,
+ enterprise,
+ resourceSdk.WithAnnotation(
+ licenseTrait,
+ &v2.V1Identifier{Id: fmt.Sprintf("license:%s", enterprise)},
+ ),
+ )
+}
+
+func LicenseBuilder(
+ customClient *customclient.Client,
+ enterprises []string,
+) *licenseResourceType {
+ return &licenseResourceType{
+ resourceType: resourceTypeLicense,
+ customClient: customClient,
+ enterprises: enterprises,
+ }
+}
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/org.go b/vendor/github.com/conductorone/baton-github/pkg/connector/org.go
index 96739f77..5bf3bc43 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/org.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/org.go
@@ -418,7 +418,7 @@ func (o *orgResourceType) Revoke(ctx context.Context, grant *v2.Grant) (annotati
return nil, nil
}
-func orgBuilder(client, appClient *github.Client, orgCache *orgNameCache, orgs []string, syncSecrets bool) *orgResourceType {
+func OrgBuilder(client, appClient *github.Client, orgCache *orgNameCache, orgs []string, syncSecrets bool) *orgResourceType {
orgMap := make(map[string]struct{})
for _, o := range orgs {
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/org_role.go b/vendor/github.com/conductorone/baton-github/pkg/connector/org_role.go
index efc21138..e78c30a0 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/org_role.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/org_role.go
@@ -445,7 +445,7 @@ func (o *orgRoleResourceType) Revoke(ctx context.Context, grant *v2.Grant) (anno
return nil, nil
}
-func orgRoleBuilder(client *github.Client, orgCache *orgNameCache) *orgRoleResourceType {
+func OrgRoleBuilder(client *github.Client, orgCache *orgNameCache) *orgRoleResourceType {
return &orgRoleResourceType{
resourceType: resourceTypeOrgRole,
client: client,
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/repository.go b/vendor/github.com/conductorone/baton-github/pkg/connector/repository.go
index 0a712416..f9eb3b10 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/repository.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/repository.go
@@ -525,7 +525,7 @@ func orgBasePermissionToRepoPermissions(basePerm string) []string {
}
}
-func repositoryBuilder(client *github.Client, orgCache *orgNameCache, omitArchivedRepositories bool, directCollaboratorsOnly bool) *repositoryResourceType {
+func RepositoryBuilder(client *github.Client, orgCache *orgNameCache, omitArchivedRepositories bool, directCollaboratorsOnly bool) *repositoryResourceType {
return &repositoryResourceType{
resourceType: resourceTypeRepository,
client: client,
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/team.go b/vendor/github.com/conductorone/baton-github/pkg/connector/team.go
index d4399f95..6cd75739 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/team.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/team.go
@@ -375,7 +375,7 @@ func (o *teamResourceType) Revoke(ctx context.Context, grant *v2.Grant) (annotat
return nil, nil
}
-func teamBuilder(client *github.Client, orgCache *orgNameCache, directCollaboratorsOnly bool) *teamResourceType {
+func TeamBuilder(client *github.Client, orgCache *orgNameCache, directCollaboratorsOnly bool) *teamResourceType {
return &teamResourceType{
resourceType: resourceTypeTeam,
client: client,
diff --git a/vendor/github.com/conductorone/baton-github/pkg/connector/user.go b/vendor/github.com/conductorone/baton-github/pkg/connector/user.go
index a67df7ba..d5c6568f 100644
--- a/vendor/github.com/conductorone/baton-github/pkg/connector/user.go
+++ b/vendor/github.com/conductorone/baton-github/pkg/connector/user.go
@@ -358,7 +358,7 @@ func (u *userResourceType) Delete(ctx context.Context, resourceId *v2.ResourceId
return annotations, nil
}
-func userBuilder(client *github.Client, graphqlClient *githubv4.Client, orgCache *orgNameCache, orgs []string, customClient *customclient.Client, enterprises []string) *userResourceType {
+func UserBuilder(client *github.Client, graphqlClient *githubv4.Client, orgCache *orgNameCache, orgs []string, customClient *customclient.Client, enterprises []string) *userResourceType {
return &userResourceType{
resourceType: resourceTypeUser,
client: client,
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 6b415872..3f15fcff 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -143,7 +143,7 @@ github.com/cenkalti/backoff/v5
# github.com/cespare/xxhash/v2 v2.3.0
## explicit; go 1.11
github.com/cespare/xxhash/v2
-# github.com/conductorone/baton-github v0.3.4
+# github.com/conductorone/baton-github v0.3.7
## explicit; go 1.25.2
github.com/conductorone/baton-github/pkg/config
github.com/conductorone/baton-github/pkg/connector