cartography 0.104.0rc2__py3-none-any.whl → 0.123.0__py3-none-any.whl
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.
- cartography/_version.py +16 -3
- cartography/cli.py +466 -5
- cartography/client/aws/__init__.py +19 -0
- cartography/client/aws/ecr.py +51 -0
- cartography/client/core/tx.py +357 -8
- cartography/config.py +153 -0
- cartography/data/azure_permission_relationships.yaml +20 -0
- cartography/data/gcp_permission_relationships.yaml +21 -0
- cartography/data/indexes.cypher +0 -186
- cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +2 -2
- cartography/data/jobs/analysis/keycloak_inheritance.json +30 -0
- cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -12
- cartography/data/jobs/cleanup/github_repos_cleanup.json +2 -0
- cartography/driftdetect/cli.py +3 -2
- cartography/graph/cleanupbuilder.py +198 -41
- cartography/graph/job.py +54 -6
- cartography/graph/querybuilder.py +528 -27
- cartography/graph/statement.py +5 -1
- cartography/intel/airbyte/__init__.py +105 -0
- cartography/intel/airbyte/connections.py +120 -0
- cartography/intel/airbyte/destinations.py +81 -0
- cartography/intel/airbyte/organizations.py +59 -0
- cartography/intel/airbyte/sources.py +78 -0
- cartography/intel/airbyte/tags.py +64 -0
- cartography/intel/airbyte/users.py +106 -0
- cartography/intel/airbyte/util.py +122 -0
- cartography/intel/airbyte/workspaces.py +63 -0
- cartography/intel/aws/__init__.py +24 -9
- cartography/intel/aws/acm.py +124 -0
- cartography/intel/aws/apigateway.py +253 -22
- cartography/intel/aws/apigatewayv2.py +116 -0
- cartography/intel/aws/cloudtrail.py +17 -39
- cartography/intel/aws/cloudtrail_management_events.py +962 -0
- cartography/intel/aws/cloudwatch.py +150 -4
- cartography/intel/aws/codebuild.py +132 -0
- cartography/intel/aws/cognito.py +201 -0
- cartography/intel/aws/config.py +7 -3
- cartography/intel/aws/ec2/elastic_ip_addresses.py +3 -1
- cartography/intel/aws/ec2/instances.py +25 -1
- cartography/intel/aws/ec2/internet_gateways.py +4 -2
- cartography/intel/aws/ec2/load_balancer_v2s.py +11 -5
- cartography/intel/aws/ec2/network_interfaces.py +5 -1
- cartography/intel/aws/ec2/reserved_instances.py +3 -1
- cartography/intel/aws/ec2/security_groups.py +140 -122
- cartography/intel/aws/ec2/snapshots.py +47 -84
- cartography/intel/aws/ec2/subnets.py +37 -63
- cartography/intel/aws/ec2/tgw.py +11 -5
- cartography/intel/aws/ec2/volumes.py +1 -1
- cartography/intel/aws/ec2/vpc.py +140 -124
- cartography/intel/aws/ec2/vpc_peerings.py +262 -125
- cartography/intel/aws/ecr.py +269 -98
- cartography/intel/aws/ecr_image_layers.py +923 -0
- cartography/intel/aws/ecs.py +251 -380
- cartography/intel/aws/efs.py +179 -11
- cartography/intel/aws/elasticache.py +102 -79
- cartography/intel/aws/elasticsearch.py +13 -4
- cartography/intel/aws/eventbridge.py +164 -0
- cartography/intel/aws/glue.py +181 -0
- cartography/intel/aws/guardduty.py +443 -0
- cartography/intel/aws/iam.py +750 -493
- cartography/intel/aws/identitycenter.py +605 -83
- cartography/intel/aws/inspector.py +221 -105
- cartography/intel/aws/kms.py +173 -201
- cartography/intel/aws/lambda_function.py +272 -189
- cartography/intel/aws/organizations.py +10 -9
- cartography/intel/aws/permission_relationships.py +10 -20
- cartography/intel/aws/rds.py +337 -446
- cartography/intel/aws/redshift.py +9 -4
- cartography/intel/aws/resourcegroupstaggingapi.py +78 -19
- cartography/intel/aws/resources.py +18 -0
- cartography/intel/aws/route53.py +386 -332
- cartography/intel/aws/s3.py +322 -14
- cartography/intel/aws/secretsmanager.py +81 -49
- cartography/intel/aws/securityhub.py +3 -1
- cartography/intel/aws/sns.py +62 -2
- cartography/intel/aws/sqs.py +36 -90
- cartography/intel/aws/ssm.py +3 -5
- cartography/intel/azure/__init__.py +202 -48
- cartography/intel/azure/aks.py +175 -0
- cartography/intel/azure/app_service.py +105 -0
- cartography/intel/azure/compute.py +59 -112
- cartography/intel/azure/container_instances.py +95 -0
- cartography/intel/azure/cosmosdb.py +222 -361
- cartography/intel/azure/data_factory.py +85 -0
- cartography/intel/azure/data_factory_dataset.py +128 -0
- cartography/intel/azure/data_factory_linked_service.py +119 -0
- cartography/intel/azure/data_factory_pipeline.py +142 -0
- cartography/intel/azure/data_lake.py +124 -0
- cartography/intel/azure/event_grid.py +94 -0
- cartography/intel/azure/functions.py +124 -0
- cartography/intel/azure/load_balancers.py +263 -0
- cartography/intel/azure/logic_apps.py +101 -0
- cartography/intel/azure/monitor.py +105 -0
- cartography/intel/azure/network.py +467 -0
- cartography/intel/azure/permission_relationships.py +466 -0
- cartography/intel/azure/rbac.py +309 -0
- cartography/intel/azure/resource_groups.py +82 -0
- cartography/intel/azure/security_center.py +106 -0
- cartography/intel/azure/sql.py +145 -292
- cartography/intel/azure/storage.py +185 -262
- cartography/intel/azure/subscription.py +21 -43
- cartography/intel/azure/tenant.py +39 -30
- cartography/intel/azure/util/common.py +13 -0
- cartography/intel/azure/util/credentials.py +49 -174
- cartography/intel/azure/util/tag.py +41 -0
- cartography/intel/create_indexes.py +2 -1
- cartography/intel/crowdstrike/spotlight.py +5 -2
- cartography/intel/dns.py +5 -2
- cartography/intel/entra/__init__.py +100 -1
- cartography/intel/entra/app_role_assignments.py +284 -0
- cartography/intel/entra/applications.py +182 -0
- cartography/intel/entra/federation/__init__.py +0 -0
- cartography/intel/entra/federation/aws_identity_center.py +77 -0
- cartography/intel/entra/groups.py +198 -0
- cartography/intel/entra/ou.py +48 -24
- cartography/intel/entra/service_principals.py +217 -0
- cartography/intel/entra/users.py +105 -57
- cartography/intel/gcp/__init__.py +334 -396
- cartography/intel/gcp/bigtable_app_profile.py +101 -0
- cartography/intel/gcp/bigtable_backup.py +91 -0
- cartography/intel/gcp/bigtable_cluster.py +93 -0
- cartography/intel/gcp/bigtable_instance.py +86 -0
- cartography/intel/gcp/bigtable_table.py +87 -0
- cartography/intel/gcp/cai.py +292 -0
- cartography/intel/gcp/clients.py +112 -0
- cartography/intel/gcp/compute.py +128 -119
- cartography/intel/gcp/crm/__init__.py +0 -0
- cartography/intel/gcp/crm/folders.py +114 -0
- cartography/intel/gcp/crm/orgs.py +70 -0
- cartography/intel/gcp/crm/projects.py +120 -0
- cartography/intel/gcp/dns.py +83 -169
- cartography/intel/gcp/gke.py +72 -113
- cartography/intel/gcp/iam.py +111 -91
- cartography/intel/gcp/permission_relationships.py +394 -0
- cartography/intel/gcp/policy_bindings.py +225 -0
- cartography/intel/gcp/storage.py +75 -159
- cartography/intel/github/__init__.py +62 -25
- cartography/intel/github/commits.py +423 -0
- cartography/intel/github/repos.py +463 -85
- cartography/intel/github/teams.py +3 -3
- cartography/intel/github/users.py +5 -0
- cartography/intel/github/util.py +12 -0
- cartography/intel/googleworkspace/__init__.py +193 -0
- cartography/intel/googleworkspace/devices.py +254 -0
- cartography/intel/googleworkspace/groups.py +568 -0
- cartography/intel/googleworkspace/oauth_apps.py +259 -0
- cartography/intel/googleworkspace/tenant.py +85 -0
- cartography/intel/googleworkspace/users.py +138 -0
- cartography/intel/gsuite/__init__.py +17 -9
- cartography/intel/gsuite/groups.py +291 -0
- cartography/intel/gsuite/users.py +142 -0
- cartography/intel/jamf/computers.py +7 -1
- cartography/intel/keycloak/__init__.py +153 -0
- cartography/intel/keycloak/authenticationexecutions.py +322 -0
- cartography/intel/keycloak/authenticationflows.py +77 -0
- cartography/intel/keycloak/clients.py +187 -0
- cartography/intel/keycloak/groups.py +126 -0
- cartography/intel/keycloak/identityproviders.py +94 -0
- cartography/intel/keycloak/organizations.py +163 -0
- cartography/intel/keycloak/realms.py +61 -0
- cartography/intel/keycloak/roles.py +202 -0
- cartography/intel/keycloak/scopes.py +73 -0
- cartography/intel/keycloak/users.py +70 -0
- cartography/intel/keycloak/util.py +47 -0
- cartography/intel/kubernetes/__init__.py +60 -14
- cartography/intel/kubernetes/clusters.py +86 -0
- cartography/intel/kubernetes/eks.py +402 -0
- cartography/intel/kubernetes/namespaces.py +59 -57
- cartography/intel/kubernetes/pods.py +168 -75
- cartography/intel/kubernetes/rbac.py +597 -0
- cartography/intel/kubernetes/secrets.py +95 -45
- cartography/intel/kubernetes/services.py +131 -67
- cartography/intel/kubernetes/util.py +142 -14
- cartography/intel/oci/iam.py +23 -9
- cartography/intel/oci/organizations.py +3 -1
- cartography/intel/oci/utils.py +28 -5
- cartography/intel/okta/applications.py +15 -5
- cartography/intel/okta/awssaml.py +14 -10
- cartography/intel/okta/factors.py +3 -1
- cartography/intel/okta/groups.py +5 -2
- cartography/intel/okta/organization.py +3 -1
- cartography/intel/okta/origins.py +3 -1
- cartography/intel/okta/roles.py +5 -2
- cartography/intel/okta/users.py +10 -2
- cartography/intel/ontology/__init__.py +44 -0
- cartography/intel/ontology/devices.py +54 -0
- cartography/intel/ontology/users.py +54 -0
- cartography/intel/ontology/utils.py +176 -0
- cartography/intel/pagerduty/escalation_policies.py +13 -6
- cartography/intel/pagerduty/schedules.py +9 -4
- cartography/intel/pagerduty/services.py +7 -3
- cartography/intel/pagerduty/teams.py +5 -2
- cartography/intel/pagerduty/users.py +3 -1
- cartography/intel/pagerduty/vendors.py +3 -1
- cartography/intel/scaleway/__init__.py +127 -0
- cartography/intel/scaleway/iam/__init__.py +0 -0
- cartography/intel/scaleway/iam/apikeys.py +71 -0
- cartography/intel/scaleway/iam/applications.py +71 -0
- cartography/intel/scaleway/iam/groups.py +71 -0
- cartography/intel/scaleway/iam/users.py +71 -0
- cartography/intel/scaleway/instances/__init__.py +0 -0
- cartography/intel/scaleway/instances/flexibleips.py +86 -0
- cartography/intel/scaleway/instances/instances.py +92 -0
- cartography/intel/scaleway/projects.py +79 -0
- cartography/intel/scaleway/storage/__init__.py +0 -0
- cartography/intel/scaleway/storage/snapshots.py +86 -0
- cartography/intel/scaleway/storage/volumes.py +84 -0
- cartography/intel/scaleway/utils.py +37 -0
- cartography/intel/sentinelone/__init__.py +75 -0
- cartography/intel/sentinelone/account.py +140 -0
- cartography/intel/sentinelone/agent.py +139 -0
- cartography/intel/sentinelone/api.py +124 -0
- cartography/intel/sentinelone/application.py +248 -0
- cartography/intel/sentinelone/cve.py +119 -0
- cartography/intel/sentinelone/utils.py +28 -0
- cartography/intel/slack/__init__.py +78 -0
- cartography/intel/slack/channels.py +80 -0
- cartography/intel/slack/groups.py +90 -0
- cartography/intel/slack/teams.py +65 -0
- cartography/intel/slack/users.py +57 -0
- cartography/intel/slack/utils.py +29 -0
- cartography/intel/spacelift/__init__.py +161 -0
- cartography/intel/spacelift/account.py +73 -0
- cartography/intel/spacelift/ec2_ownership.py +280 -0
- cartography/intel/spacelift/runs.py +463 -0
- cartography/intel/spacelift/spaces.py +112 -0
- cartography/intel/spacelift/stacks.py +119 -0
- cartography/intel/spacelift/util.py +122 -0
- cartography/intel/spacelift/workerpools.py +131 -0
- cartography/intel/spacelift/workers.py +128 -0
- cartography/intel/trivy/__init__.py +272 -0
- cartography/intel/trivy/scanner.py +386 -0
- cartography/models/airbyte/__init__.py +0 -0
- cartography/models/airbyte/connection.py +138 -0
- cartography/models/airbyte/destination.py +75 -0
- cartography/models/airbyte/organization.py +19 -0
- cartography/models/airbyte/source.py +75 -0
- cartography/models/airbyte/stream.py +74 -0
- cartography/models/airbyte/tag.py +69 -0
- cartography/models/airbyte/user.py +115 -0
- cartography/models/airbyte/workspace.py +46 -0
- cartography/models/anthropic/apikey.py +4 -0
- cartography/models/anthropic/user.py +4 -0
- cartography/models/aws/acm/__init__.py +0 -0
- cartography/models/aws/acm/certificate.py +75 -0
- cartography/models/aws/apigateway/__init__.py +0 -0
- cartography/models/aws/apigateway/apigatewaydeployment.py +74 -0
- cartography/models/aws/apigateway/apigatewayintegration.py +79 -0
- cartography/models/aws/apigateway/apigatewaymethod.py +74 -0
- cartography/models/aws/apigatewayv2/__init__.py +0 -0
- cartography/models/aws/apigatewayv2/apigatewayv2.py +53 -0
- cartography/models/aws/cloudtrail/management_events.py +153 -0
- cartography/models/aws/cloudtrail/trail.py +45 -0
- cartography/models/aws/cloudwatch/log_metric_filter.py +79 -0
- cartography/models/aws/cloudwatch/metric_alarm.py +53 -0
- cartography/models/aws/codebuild/__init__.py +0 -0
- cartography/models/aws/codebuild/project.py +49 -0
- cartography/models/aws/cognito/__init__.py +0 -0
- cartography/models/aws/cognito/identity_pool.py +70 -0
- cartography/models/aws/cognito/user_pool.py +47 -0
- cartography/models/aws/dynamodb/tables.py +2 -0
- cartography/models/aws/ec2/instances.py +25 -1
- cartography/models/aws/ec2/networkinterfaces.py +4 -0
- cartography/models/aws/ec2/security_group_rules.py +109 -0
- cartography/models/aws/ec2/security_groups.py +90 -0
- cartography/models/aws/ec2/snapshots.py +58 -0
- cartography/models/aws/ec2/subnet_instance.py +2 -0
- cartography/models/aws/ec2/subnet_networkinterface.py +2 -0
- cartography/models/aws/ec2/subnets.py +65 -0
- cartography/models/aws/ec2/volumes.py +20 -0
- cartography/models/aws/ec2/vpc.py +46 -0
- cartography/models/aws/ec2/vpc_cidr.py +102 -0
- cartography/models/aws/ec2/vpc_peering.py +157 -0
- cartography/models/aws/ecr/__init__.py +0 -0
- cartography/models/aws/ecr/image.py +146 -0
- cartography/models/aws/ecr/image_layer.py +107 -0
- cartography/models/aws/ecr/repository.py +72 -0
- cartography/models/aws/ecr/repository_image.py +95 -0
- cartography/models/aws/ecs/__init__.py +0 -0
- cartography/models/aws/ecs/clusters.py +64 -0
- cartography/models/aws/ecs/container_definitions.py +93 -0
- cartography/models/aws/ecs/container_instances.py +84 -0
- cartography/models/aws/ecs/containers.py +101 -0
- cartography/models/aws/ecs/services.py +134 -0
- cartography/models/aws/ecs/task_definitions.py +135 -0
- cartography/models/aws/ecs/tasks.py +134 -0
- cartography/models/aws/efs/access_point.py +77 -0
- cartography/models/aws/efs/file_system.py +60 -0
- cartography/models/aws/efs/mount_target.py +29 -2
- cartography/models/aws/elasticache/__init__.py +0 -0
- cartography/models/aws/elasticache/cluster.py +65 -0
- cartography/models/aws/elasticache/topic.py +67 -0
- cartography/models/aws/eventbridge/__init__.py +0 -0
- cartography/models/aws/eventbridge/rule.py +77 -0
- cartography/models/aws/eventbridge/target.py +71 -0
- cartography/models/aws/glue/__init__.py +0 -0
- cartography/models/aws/glue/connection.py +51 -0
- cartography/models/aws/glue/job.py +69 -0
- cartography/models/aws/guardduty/__init__.py +1 -0
- cartography/models/aws/guardduty/detectors.py +50 -0
- cartography/models/aws/guardduty/findings.py +121 -0
- cartography/models/aws/iam/access_key.py +103 -0
- cartography/models/aws/iam/account_role.py +24 -0
- cartography/models/aws/iam/federated_principal.py +60 -0
- cartography/models/aws/iam/group.py +60 -0
- cartography/models/aws/iam/group_membership.py +27 -0
- cartography/models/aws/iam/inline_policy.py +78 -0
- cartography/models/aws/iam/managed_policy.py +51 -0
- cartography/models/aws/iam/policy_statement.py +57 -0
- cartography/models/aws/iam/role.py +83 -0
- cartography/models/aws/iam/root_principal.py +52 -0
- cartography/models/aws/iam/service_principal.py +30 -0
- cartography/models/aws/iam/sts_assumerole_allow.py +38 -0
- cartography/models/aws/iam/user.py +59 -0
- cartography/models/aws/identitycenter/awsidentitycenter.py +1 -0
- cartography/models/aws/identitycenter/awspermissionset.py +70 -0
- cartography/models/aws/identitycenter/awssogroup.py +70 -0
- cartography/models/aws/identitycenter/awsssouser.py +49 -9
- cartography/models/aws/inspector/findings.py +37 -0
- cartography/models/aws/inspector/packages.py +1 -31
- cartography/models/aws/kms/__init__.py +0 -0
- cartography/models/aws/kms/aliases.py +86 -0
- cartography/models/aws/kms/grants.py +65 -0
- cartography/models/aws/kms/keys.py +88 -0
- cartography/models/aws/lambda_function/__init__.py +0 -0
- cartography/models/aws/lambda_function/alias.py +74 -0
- cartography/models/aws/lambda_function/event_source_mapping.py +88 -0
- cartography/models/aws/lambda_function/lambda_function.py +91 -0
- cartography/models/aws/lambda_function/layer.py +72 -0
- cartography/models/aws/rds/__init__.py +0 -0
- cartography/models/aws/rds/cluster.py +91 -0
- cartography/models/aws/rds/event_subscription.py +146 -0
- cartography/models/aws/rds/instance.py +156 -0
- cartography/models/aws/rds/snapshot.py +108 -0
- cartography/models/aws/rds/subnet_group.py +101 -0
- cartography/models/aws/route53/__init__.py +0 -0
- cartography/models/aws/route53/dnsrecord.py +235 -0
- cartography/models/aws/route53/nameserver.py +63 -0
- cartography/models/aws/route53/subzone.py +40 -0
- cartography/models/aws/route53/zone.py +47 -0
- cartography/models/aws/s3/notification.py +24 -0
- cartography/models/aws/secretsmanager/secret.py +106 -0
- cartography/models/aws/secretsmanager/secret_version.py +0 -2
- cartography/models/aws/sns/topic_subscription.py +74 -0
- cartography/models/aws/sqs/__init__.py +0 -0
- cartography/models/aws/sqs/queue.py +89 -0
- cartography/models/azure/__init__.py +0 -0
- cartography/models/azure/aks_cluster.py +54 -0
- cartography/models/azure/aks_nodepool.py +54 -0
- cartography/models/azure/app_service.py +59 -0
- cartography/models/azure/container_instance.py +57 -0
- cartography/models/azure/cosmosdb/__init__.py +0 -0
- cartography/models/azure/cosmosdb/account.py +77 -0
- cartography/models/azure/cosmosdb/accountfailoverpolicy.py +77 -0
- cartography/models/azure/cosmosdb/cassandrakeyspace.py +82 -0
- cartography/models/azure/cosmosdb/cassandratable.py +81 -0
- cartography/models/azure/cosmosdb/corspolicy.py +74 -0
- cartography/models/azure/cosmosdb/dblocation.py +120 -0
- cartography/models/azure/cosmosdb/mongodbcollection.py +82 -0
- cartography/models/azure/cosmosdb/mongodbdatabase.py +78 -0
- cartography/models/azure/cosmosdb/privateendpointconnection.py +81 -0
- cartography/models/azure/cosmosdb/sqlcontainer.py +88 -0
- cartography/models/azure/cosmosdb/sqldatabase.py +78 -0
- cartography/models/azure/cosmosdb/tableresource.py +76 -0
- cartography/models/azure/cosmosdb/virtualnetworkrule.py +78 -0
- cartography/models/azure/data_factory/__init__.py +0 -0
- cartography/models/azure/data_factory/data_factory.py +51 -0
- cartography/models/azure/data_factory/data_factory_dataset.py +94 -0
- cartography/models/azure/data_factory/data_factory_linked_service.py +78 -0
- cartography/models/azure/data_factory/data_factory_pipeline.py +93 -0
- cartography/models/azure/data_lake_filesystem.py +51 -0
- cartography/models/azure/event_grid_topic.py +57 -0
- cartography/models/azure/function_app.py +59 -0
- cartography/models/azure/load_balancer/__init__.py +0 -0
- cartography/models/azure/load_balancer/load_balancer.py +49 -0
- cartography/models/azure/load_balancer/load_balancer_backend_pool.py +73 -0
- cartography/models/azure/load_balancer/load_balancer_frontend_ip.py +75 -0
- cartography/models/azure/load_balancer/load_balancer_inbound_nat_rule.py +78 -0
- cartography/models/azure/load_balancer/load_balancer_rule.py +108 -0
- cartography/models/azure/logic_apps.py +56 -0
- cartography/models/azure/monitor.py +54 -0
- cartography/models/azure/network_interface.py +112 -0
- cartography/models/azure/network_security_group.py +50 -0
- cartography/models/azure/permission_relationships.py +60 -0
- cartography/models/azure/principal.py +41 -0
- cartography/models/azure/public_ip_address.py +50 -0
- cartography/models/azure/rbac.py +268 -0
- cartography/models/azure/resource_groups.py +52 -0
- cartography/models/azure/security_center.py +50 -0
- cartography/models/azure/sql/__init__.py +0 -0
- cartography/models/azure/sql/databasethreatdetectionpolicy.py +85 -0
- cartography/models/azure/sql/elasticpool.py +77 -0
- cartography/models/azure/sql/failovergroup.py +73 -0
- cartography/models/azure/sql/recoverabledatabase.py +75 -0
- cartography/models/azure/sql/replicationlink.py +81 -0
- cartography/models/azure/sql/restorabledroppeddatabase.py +82 -0
- cartography/models/azure/sql/restorepoint.py +74 -0
- cartography/models/azure/sql/serveradadministrator.py +74 -0
- cartography/models/azure/sql/serverdnsalias.py +71 -0
- cartography/models/azure/sql/sqldatabase.py +85 -0
- cartography/models/azure/sql/sqlserver.py +50 -0
- cartography/models/azure/sql/transparentdataencryption.py +76 -0
- cartography/models/azure/storage/__init__.py +0 -0
- cartography/models/azure/storage/account.py +59 -0
- cartography/models/azure/storage/blobcontainer.py +85 -0
- cartography/models/azure/storage/blobservice.py +71 -0
- cartography/models/azure/storage/fileservice.py +71 -0
- cartography/models/azure/storage/fileshare.py +82 -0
- cartography/models/azure/storage/queue.py +71 -0
- cartography/models/azure/storage/queueservice.py +73 -0
- cartography/models/azure/storage/table.py +72 -0
- cartography/models/azure/storage/tableservice.py +73 -0
- cartography/models/azure/subnet.py +101 -0
- cartography/models/azure/subscription.py +47 -0
- cartography/models/azure/tags/__init__.py +0 -0
- cartography/models/azure/tags/storage_tag.py +40 -0
- cartography/models/azure/tags/tag.py +37 -0
- cartography/models/azure/tenant.py +17 -0
- cartography/models/azure/virtual_network.py +49 -0
- cartography/models/azure/vm/__init__.py +0 -0
- cartography/models/azure/vm/datadisk.py +80 -0
- cartography/models/azure/vm/disk.py +55 -0
- cartography/models/azure/vm/snapshot.py +56 -0
- cartography/models/azure/vm/virtualmachine.py +59 -0
- cartography/models/bigfix/bigfix_computer.py +1 -1
- cartography/models/cloudflare/member.py +4 -0
- cartography/models/core/common.py +1 -0
- cartography/models/core/nodes.py +15 -2
- cartography/models/core/relationships.py +44 -0
- cartography/models/crowdstrike/hosts.py +1 -1
- cartography/models/digitalocean/droplet.py +2 -0
- cartography/models/duo/endpoint.py +1 -1
- cartography/models/duo/phone.py +2 -2
- cartography/models/duo/user.py +4 -0
- cartography/models/entra/app_role_assignment.py +115 -0
- cartography/models/entra/application.py +49 -0
- cartography/models/entra/entra_user_to_aws_sso.py +41 -0
- cartography/models/entra/group.py +117 -0
- cartography/models/entra/service_principal.py +104 -0
- cartography/models/entra/user.py +42 -51
- cartography/models/gcp/__init__.py +0 -0
- cartography/models/gcp/bigtable/__init__.py +0 -0
- cartography/models/gcp/bigtable/app_profile.py +94 -0
- cartography/models/gcp/bigtable/backup.py +91 -0
- cartography/models/gcp/bigtable/cluster.py +73 -0
- cartography/models/gcp/bigtable/instance.py +52 -0
- cartography/models/gcp/bigtable/table.py +69 -0
- cartography/models/gcp/compute/__init__.py +0 -0
- cartography/models/gcp/compute/subnet.py +74 -0
- cartography/models/gcp/compute/vpc.py +50 -0
- cartography/models/gcp/crm/__init__.py +0 -0
- cartography/models/gcp/crm/folders.py +98 -0
- cartography/models/gcp/crm/organizations.py +21 -0
- cartography/models/gcp/crm/projects.py +100 -0
- cartography/models/gcp/dns.py +109 -0
- cartography/models/gcp/gke.py +69 -0
- cartography/models/gcp/iam.py +3 -0
- cartography/models/gcp/permission_relationships.py +61 -0
- cartography/models/gcp/policy_bindings.py +93 -0
- cartography/models/gcp/storage/__init__.py +0 -0
- cartography/models/gcp/storage/bucket.py +119 -0
- cartography/models/github/commits.py +63 -0
- cartography/models/github/dependencies.py +73 -0
- cartography/models/github/manifests.py +49 -0
- cartography/models/github/users.py +10 -0
- cartography/models/googleworkspace/__init__.py +0 -0
- cartography/models/googleworkspace/device.py +132 -0
- cartography/models/googleworkspace/group.py +382 -0
- cartography/models/googleworkspace/oauth_app.py +124 -0
- cartography/models/googleworkspace/tenant.py +30 -0
- cartography/models/googleworkspace/user.py +113 -0
- cartography/models/gsuite/__init__.py +0 -0
- cartography/models/gsuite/group.py +218 -0
- cartography/models/gsuite/tenant.py +29 -0
- cartography/models/gsuite/user.py +107 -0
- cartography/models/kandji/device.py +1 -2
- cartography/models/keycloak/__init__.py +0 -0
- cartography/models/keycloak/authenticationexecution.py +160 -0
- cartography/models/keycloak/authenticationflow.py +54 -0
- cartography/models/keycloak/client.py +179 -0
- cartography/models/keycloak/group.py +101 -0
- cartography/models/keycloak/identityprovider.py +89 -0
- cartography/models/keycloak/organization.py +116 -0
- cartography/models/keycloak/organizationdomain.py +73 -0
- cartography/models/keycloak/realm.py +173 -0
- cartography/models/keycloak/role.py +126 -0
- cartography/models/keycloak/scope.py +73 -0
- cartography/models/keycloak/user.py +55 -0
- cartography/models/kubernetes/__init__.py +0 -0
- cartography/models/kubernetes/clusterrolebindings.py +138 -0
- cartography/models/kubernetes/clusterroles.py +52 -0
- cartography/models/kubernetes/clusters.py +26 -0
- cartography/models/kubernetes/containers.py +133 -0
- cartography/models/kubernetes/groups.py +107 -0
- cartography/models/kubernetes/namespaces.py +51 -0
- cartography/models/kubernetes/oidc.py +51 -0
- cartography/models/kubernetes/pods.py +80 -0
- cartography/models/kubernetes/rolebindings.py +159 -0
- cartography/models/kubernetes/roles.py +76 -0
- cartography/models/kubernetes/secrets.py +79 -0
- cartography/models/kubernetes/serviceaccounts.py +77 -0
- cartography/models/kubernetes/services.py +108 -0
- cartography/models/kubernetes/users.py +105 -0
- cartography/models/lastpass/user.py +4 -0
- cartography/models/ontology/__init__.py +0 -0
- cartography/models/ontology/device.py +137 -0
- cartography/models/ontology/mapping/__init__.py +76 -0
- cartography/models/ontology/mapping/data/__init__.py +0 -0
- cartography/models/ontology/mapping/data/apikeys.py +93 -0
- cartography/models/ontology/mapping/data/computeinstance.py +95 -0
- cartography/models/ontology/mapping/data/containers.py +88 -0
- cartography/models/ontology/mapping/data/databases.py +182 -0
- cartography/models/ontology/mapping/data/devices.py +194 -0
- cartography/models/ontology/mapping/data/thirdpartyapps.py +140 -0
- cartography/models/ontology/mapping/data/useraccounts.py +416 -0
- cartography/models/ontology/mapping/data/users.py +63 -0
- cartography/models/ontology/mapping/specs.py +85 -0
- cartography/models/ontology/user.py +51 -0
- cartography/models/openai/adminapikey.py +4 -0
- cartography/models/openai/apikey.py +4 -0
- cartography/models/openai/user.py +4 -0
- cartography/models/scaleway/__init__.py +0 -0
- cartography/models/scaleway/iam/__init__.py +0 -0
- cartography/models/scaleway/iam/apikey.py +100 -0
- cartography/models/scaleway/iam/application.py +52 -0
- cartography/models/scaleway/iam/group.py +95 -0
- cartography/models/scaleway/iam/user.py +64 -0
- cartography/models/scaleway/instance/__init__.py +0 -0
- cartography/models/scaleway/instance/flexibleip.py +52 -0
- cartography/models/scaleway/instance/instance.py +120 -0
- cartography/models/scaleway/organization.py +19 -0
- cartography/models/scaleway/project.py +48 -0
- cartography/models/scaleway/storage/__init__.py +0 -0
- cartography/models/scaleway/storage/snapshot.py +78 -0
- cartography/models/scaleway/storage/volume.py +51 -0
- cartography/models/sentinelone/__init__.py +1 -0
- cartography/models/sentinelone/account.py +40 -0
- cartography/models/sentinelone/agent.py +50 -0
- cartography/models/sentinelone/application.py +44 -0
- cartography/models/sentinelone/application_version.py +96 -0
- cartography/models/sentinelone/cve.py +73 -0
- cartography/models/slack/__init__.py +0 -0
- cartography/models/slack/channels.py +92 -0
- cartography/models/slack/group.py +129 -0
- cartography/models/slack/team.py +22 -0
- cartography/models/slack/user.py +62 -0
- cartography/models/snipeit/asset.py +2 -0
- cartography/models/snipeit/user.py +4 -0
- cartography/models/spacelift/__init__.py +0 -0
- cartography/models/spacelift/cloudtrailevent.py +120 -0
- cartography/models/spacelift/run.py +162 -0
- cartography/models/spacelift/space.py +131 -0
- cartography/models/spacelift/spaceliftaccount.py +31 -0
- cartography/models/spacelift/spaceliftgitcommit.py +157 -0
- cartography/models/spacelift/stack.py +96 -0
- cartography/models/spacelift/user.py +63 -0
- cartography/models/spacelift/worker.py +97 -0
- cartography/models/spacelift/workerpool.py +90 -0
- cartography/models/tailscale/device.py +2 -1
- cartography/models/tailscale/user.py +6 -1
- cartography/models/trivy/__init__.py +0 -0
- cartography/models/trivy/findings.py +66 -0
- cartography/models/trivy/fix.py +66 -0
- cartography/models/trivy/package.py +71 -0
- cartography/rules/README.md +1 -0
- cartography/rules/__init__.py +0 -0
- cartography/rules/cli.py +261 -0
- cartography/rules/data/__init__.py +0 -0
- cartography/rules/data/rules/__init__.py +46 -0
- cartography/rules/data/rules/cloud_security_product_deactivated.py +49 -0
- cartography/rules/data/rules/compute_instance_exposed.py +51 -0
- cartography/rules/data/rules/database_instance_exposed.py +53 -0
- cartography/rules/data/rules/delegation_boundary_modifiable.py +90 -0
- cartography/rules/data/rules/identity_administration_privileges.py +100 -0
- cartography/rules/data/rules/inactive_user_active_accounts.py +48 -0
- cartography/rules/data/rules/malicious_npm_dependencies_shai_hulud.py +2222 -0
- cartography/rules/data/rules/mfa_missing.py +46 -0
- cartography/rules/data/rules/object_storage_public.py +100 -0
- cartography/rules/data/rules/policy_administration_privileges.py +104 -0
- cartography/rules/data/rules/unmanaged_accounts.py +43 -0
- cartography/rules/data/rules/workload_identity_admin_capabilities.py +193 -0
- cartography/rules/formatters.py +108 -0
- cartography/rules/runners.py +216 -0
- cartography/rules/spec/__init__.py +0 -0
- cartography/rules/spec/model.py +267 -0
- cartography/rules/spec/result.py +38 -0
- cartography/sync.py +25 -5
- cartography/util.py +101 -31
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/METADATA +61 -22
- cartography-0.123.0.dist-info/RECORD +856 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/entry_points.txt +1 -0
- cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -65
- cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -17
- cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -24
- cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -13
- cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -16
- cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -50
- cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -30
- cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -47
- cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -13
- cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -8
- cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -30
- cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -8
- cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -23
- cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -45
- cartography/data/jobs/cleanup/aws_kms_details.json +0 -10
- cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -15
- cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -85
- cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -15
- cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -25
- cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -125
- cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -95
- cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -14
- cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -9
- cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -35
- cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -17
- cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -29
- cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -17
- cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -29
- cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -23
- cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -11
- cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -70
- cartography/intel/gcp/crm.py +0 -355
- cartography/intel/gsuite/api.py +0 -342
- cartography-0.104.0rc2.dist-info/RECORD +0 -455
- /cartography/data/jobs/{analysis → scoped_analysis}/aws_s3acl_analysis.json +0 -0
- /cartography/models/aws/{apigateway.py → apigateway/apigateway.py} +0 -0
- /cartography/models/aws/{apigatewaycertificate.py → apigateway/apigatewaycertificate.py} +0 -0
- /cartography/models/aws/{apigatewayresource.py → apigateway/apigatewayresource.py} +0 -0
- /cartography/models/aws/{apigatewaystage.py → apigateway/apigatewaystage.py} +0 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/WHEEL +0 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/licenses/LICENSE +0 -0
- {cartography-0.104.0rc2.dist-info → cartography-0.123.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
7
|
+
from cartography.models.core.relationships import CartographyRelProperties
|
|
8
|
+
from cartography.models.core.relationships import CartographyRelSchema
|
|
9
|
+
from cartography.models.core.relationships import LinkDirection
|
|
10
|
+
from cartography.models.core.relationships import make_source_node_matcher
|
|
11
|
+
from cartography.models.core.relationships import make_target_node_matcher
|
|
12
|
+
from cartography.models.core.relationships import OtherRelationships
|
|
13
|
+
from cartography.models.core.relationships import SourceNodeMatcher
|
|
14
|
+
from cartography.models.core.relationships import TargetNodeMatcher
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class GoogleWorkspaceGroupNodeProperties(CartographyNodeProperties):
|
|
19
|
+
"""
|
|
20
|
+
Google Workspace group node properties
|
|
21
|
+
Compatible with Cloud Identity API response structure
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
id: PropertyRef = PropertyRef("name")
|
|
25
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
26
|
+
|
|
27
|
+
# Group identifiers and basic info
|
|
28
|
+
email: PropertyRef = PropertyRef("email", extra_index=True)
|
|
29
|
+
description: PropertyRef = PropertyRef("description")
|
|
30
|
+
|
|
31
|
+
# Cloud Identity API fields
|
|
32
|
+
name: PropertyRef = PropertyRef("name")
|
|
33
|
+
display_name: PropertyRef = PropertyRef("displayName")
|
|
34
|
+
parent: PropertyRef = PropertyRef("parent")
|
|
35
|
+
create_time: PropertyRef = PropertyRef("createTime")
|
|
36
|
+
update_time: PropertyRef = PropertyRef("updateTime")
|
|
37
|
+
labels: PropertyRef = PropertyRef("labels")
|
|
38
|
+
|
|
39
|
+
# Tenant relationship
|
|
40
|
+
customer_id: PropertyRef = PropertyRef("CUSTOMER_ID", set_in_kwargs=True)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class GoogleWorkspaceGroupToTenantRelProperties(CartographyRelProperties):
|
|
45
|
+
"""
|
|
46
|
+
Properties for Google Workspace group to tenant relationship
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class GoogleWorkspaceGroupToTenantRel(CartographyRelSchema):
|
|
54
|
+
"""
|
|
55
|
+
Relationship from Google Workspace group to Google Workspace tenant
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
target_node_label: str = "GoogleWorkspaceTenant"
|
|
59
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
60
|
+
{
|
|
61
|
+
"id": PropertyRef("CUSTOMER_ID", set_in_kwargs=True),
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
65
|
+
rel_label: str = "RESOURCE"
|
|
66
|
+
properties: GoogleWorkspaceGroupToTenantRelProperties = (
|
|
67
|
+
GoogleWorkspaceGroupToTenantRelProperties()
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True)
|
|
72
|
+
class GoogleWorkspaceGroupToMemberRelProperties(CartographyRelProperties):
|
|
73
|
+
"""
|
|
74
|
+
Properties for Google Workspace group to member relationship
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass(frozen=True)
|
|
81
|
+
class GoogleWorkspaceGroupToMemberRel(CartographyRelSchema):
|
|
82
|
+
"""
|
|
83
|
+
Relationship from Google Workspace group to its members (users or groups)
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
target_node_label: str = (
|
|
87
|
+
"GoogleWorkspaceUser" # or GoogleWorkspaceGroup for subgroup relationships
|
|
88
|
+
)
|
|
89
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
90
|
+
{
|
|
91
|
+
"primary_email": PropertyRef("member_ids", one_to_many=True),
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
95
|
+
rel_label: str = "MEMBER_OF"
|
|
96
|
+
properties: GoogleWorkspaceGroupToMemberRelProperties = (
|
|
97
|
+
GoogleWorkspaceGroupToMemberRelProperties()
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@dataclass(frozen=True)
|
|
102
|
+
class GoogleWorkspaceGroupToOwnerRelProperties(CartographyRelProperties):
|
|
103
|
+
"""
|
|
104
|
+
Properties for Google Workspace group to owner relationship
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@dataclass(frozen=True)
|
|
111
|
+
class GoogleWorkspaceGroupToOwnerRel(CartographyRelSchema):
|
|
112
|
+
"""
|
|
113
|
+
Relationship from Google Workspace group to its owners (users)
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
target_node_label: str = "GoogleWorkspaceUser"
|
|
117
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
118
|
+
{
|
|
119
|
+
"primary_email": PropertyRef("owner_ids", one_to_many=True),
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
123
|
+
rel_label: str = "OWNER_OF"
|
|
124
|
+
properties: GoogleWorkspaceGroupToOwnerRelProperties = (
|
|
125
|
+
GoogleWorkspaceGroupToOwnerRelProperties()
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@dataclass(frozen=True)
|
|
130
|
+
class GoogleWorkspaceGroupSchema(CartographyNodeSchema):
|
|
131
|
+
"""
|
|
132
|
+
Google Workspace group node schema
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
label: str = "GoogleWorkspaceGroup"
|
|
136
|
+
properties: GoogleWorkspaceGroupNodeProperties = (
|
|
137
|
+
GoogleWorkspaceGroupNodeProperties()
|
|
138
|
+
)
|
|
139
|
+
sub_resource_relationship: GoogleWorkspaceGroupToTenantRel = (
|
|
140
|
+
GoogleWorkspaceGroupToTenantRel()
|
|
141
|
+
)
|
|
142
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["GCPPrincipal"])
|
|
143
|
+
other_relationships = OtherRelationships(
|
|
144
|
+
[
|
|
145
|
+
GoogleWorkspaceGroupToMemberRel(),
|
|
146
|
+
GoogleWorkspaceGroupToOwnerRel(),
|
|
147
|
+
]
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# MatchLinks for Group => Group relationships
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@dataclass(frozen=True)
|
|
155
|
+
class GoogleWorkspaceGroupToGroupMemberRelProperties(CartographyRelProperties):
|
|
156
|
+
"""
|
|
157
|
+
Properties for Google Workspace group to group member relationship (MatchLink)
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
161
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
162
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
163
|
+
)
|
|
164
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
165
|
+
role: PropertyRef = PropertyRef("role")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@dataclass(frozen=True)
|
|
169
|
+
class GoogleWorkspaceGroupToGroupMemberRel(CartographyRelSchema):
|
|
170
|
+
"""
|
|
171
|
+
MatchLink relationship from Google Workspace parent group to member group
|
|
172
|
+
"""
|
|
173
|
+
|
|
174
|
+
target_node_label: str = "GoogleWorkspaceGroup"
|
|
175
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
176
|
+
{
|
|
177
|
+
"email": PropertyRef("subgroup_email"),
|
|
178
|
+
}
|
|
179
|
+
)
|
|
180
|
+
source_node_label: str = "GoogleWorkspaceGroup"
|
|
181
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
182
|
+
{
|
|
183
|
+
"id": PropertyRef("parent_group_id"),
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
187
|
+
rel_label: str = "MEMBER_OF"
|
|
188
|
+
properties: GoogleWorkspaceGroupToGroupMemberRelProperties = (
|
|
189
|
+
GoogleWorkspaceGroupToGroupMemberRelProperties()
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@dataclass(frozen=True)
|
|
194
|
+
class GoogleWorkspaceGroupToGroupOwnerRelProperties(CartographyRelProperties):
|
|
195
|
+
"""
|
|
196
|
+
Properties for Google Workspace group to group owner relationship (MatchLink)
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
200
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
201
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
202
|
+
)
|
|
203
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
204
|
+
role: PropertyRef = PropertyRef("role")
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(frozen=True)
|
|
208
|
+
class GoogleWorkspaceGroupToGroupOwnerRel(CartographyRelSchema):
|
|
209
|
+
"""
|
|
210
|
+
MatchLink relationship from Google Workspace parent group to owner group
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
target_node_label: str = "GoogleWorkspaceGroup"
|
|
214
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
215
|
+
{
|
|
216
|
+
"email": PropertyRef("subgroup_email"),
|
|
217
|
+
}
|
|
218
|
+
)
|
|
219
|
+
source_node_label: str = "GoogleWorkspaceGroup"
|
|
220
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
221
|
+
{
|
|
222
|
+
"id": PropertyRef("parent_group_id"),
|
|
223
|
+
}
|
|
224
|
+
)
|
|
225
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
226
|
+
rel_label: str = "OWNER_OF"
|
|
227
|
+
properties: GoogleWorkspaceGroupToGroupOwnerRelProperties = (
|
|
228
|
+
GoogleWorkspaceGroupToGroupOwnerRelProperties()
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
# Inherited relationship MatchLinks
|
|
233
|
+
@dataclass(frozen=True)
|
|
234
|
+
class GoogleWorkspaceUserToGroupInheritedMemberRelProperties(CartographyRelProperties):
|
|
235
|
+
"""
|
|
236
|
+
Properties for inherited member relationship from user to group
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
240
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
241
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
242
|
+
)
|
|
243
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
@dataclass(frozen=True)
|
|
247
|
+
class GoogleWorkspaceUserToGroupInheritedMemberRel(CartographyRelSchema):
|
|
248
|
+
"""
|
|
249
|
+
MatchLink that creates INHERITED_MEMBER_OF relationships from users to groups
|
|
250
|
+
they are indirectly members of through group hierarchy.
|
|
251
|
+
|
|
252
|
+
Example: User -> MEMBER_OF -> SubGroup -> MEMBER_OF -> ParentGroup
|
|
253
|
+
This creates: User -> INHERITED_MEMBER_OF -> ParentGroup
|
|
254
|
+
"""
|
|
255
|
+
|
|
256
|
+
target_node_label: str = "GoogleWorkspaceGroup"
|
|
257
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
258
|
+
{"id": PropertyRef("group_id")}
|
|
259
|
+
)
|
|
260
|
+
source_node_label: str = "GoogleWorkspaceUser"
|
|
261
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
262
|
+
{"id": PropertyRef("user_id")}
|
|
263
|
+
)
|
|
264
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
265
|
+
rel_label: str = "INHERITED_MEMBER_OF"
|
|
266
|
+
properties: GoogleWorkspaceUserToGroupInheritedMemberRelProperties = (
|
|
267
|
+
GoogleWorkspaceUserToGroupInheritedMemberRelProperties()
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
@dataclass(frozen=True)
|
|
272
|
+
class GoogleWorkspaceUserToGroupInheritedOwnerRelProperties(CartographyRelProperties):
|
|
273
|
+
"""
|
|
274
|
+
Properties for inherited owner relationship from user to group
|
|
275
|
+
"""
|
|
276
|
+
|
|
277
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
278
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
279
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
280
|
+
)
|
|
281
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@dataclass(frozen=True)
|
|
285
|
+
class GoogleWorkspaceUserToGroupInheritedOwnerRel(CartographyRelSchema):
|
|
286
|
+
"""
|
|
287
|
+
MatchLink that creates INHERITED_OWNER_OF relationships from users to groups
|
|
288
|
+
they are indirectly owners of through group hierarchy.
|
|
289
|
+
|
|
290
|
+
Example: User -> OWNER_OF -> SubGroup -> MEMBER_OF -> ParentGroup
|
|
291
|
+
This creates: User -> INHERITED_OWNER_OF -> ParentGroup
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
target_node_label: str = "GoogleWorkspaceGroup"
|
|
295
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
296
|
+
{"id": PropertyRef("group_id")}
|
|
297
|
+
)
|
|
298
|
+
source_node_label: str = "GoogleWorkspaceUser"
|
|
299
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
300
|
+
{"id": PropertyRef("user_id")}
|
|
301
|
+
)
|
|
302
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
303
|
+
rel_label: str = "INHERITED_OWNER_OF"
|
|
304
|
+
properties: GoogleWorkspaceUserToGroupInheritedOwnerRelProperties = (
|
|
305
|
+
GoogleWorkspaceUserToGroupInheritedOwnerRelProperties()
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
@dataclass(frozen=True)
|
|
310
|
+
class GoogleWorkspaceGroupToGroupInheritedMemberRelProperties(CartographyRelProperties):
|
|
311
|
+
"""
|
|
312
|
+
Properties for inherited member relationship from group to group
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
316
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
317
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
318
|
+
)
|
|
319
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
@dataclass(frozen=True)
|
|
323
|
+
class GoogleWorkspaceGroupToGroupInheritedMemberRel(CartographyRelSchema):
|
|
324
|
+
"""
|
|
325
|
+
MatchLink that creates INHERITED_MEMBER_OF relationships from groups to groups
|
|
326
|
+
they are indirectly members of through group hierarchy.
|
|
327
|
+
|
|
328
|
+
Example: SubGroup1 -> MEMBER_OF -> SubGroup2 -> MEMBER_OF -> ParentGroup
|
|
329
|
+
This creates: SubGroup1 -> INHERITED_MEMBER_OF -> ParentGroup
|
|
330
|
+
"""
|
|
331
|
+
|
|
332
|
+
target_node_label: str = "GoogleWorkspaceGroup"
|
|
333
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
334
|
+
{"id": PropertyRef("target_group_id")}
|
|
335
|
+
)
|
|
336
|
+
source_node_label: str = "GoogleWorkspaceGroup"
|
|
337
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
338
|
+
{"id": PropertyRef("source_group_id")}
|
|
339
|
+
)
|
|
340
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
341
|
+
rel_label: str = "INHERITED_MEMBER_OF"
|
|
342
|
+
properties: GoogleWorkspaceGroupToGroupInheritedMemberRelProperties = (
|
|
343
|
+
GoogleWorkspaceGroupToGroupInheritedMemberRelProperties()
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
@dataclass(frozen=True)
|
|
348
|
+
class GoogleWorkspaceGroupToGroupInheritedOwnerRelProperties(CartographyRelProperties):
|
|
349
|
+
"""
|
|
350
|
+
Properties for inherited owner relationship from group to group
|
|
351
|
+
"""
|
|
352
|
+
|
|
353
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
354
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
355
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
356
|
+
)
|
|
357
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
@dataclass(frozen=True)
|
|
361
|
+
class GoogleWorkspaceGroupToGroupInheritedOwnerRel(CartographyRelSchema):
|
|
362
|
+
"""
|
|
363
|
+
MatchLink that creates INHERITED_OWNER_OF relationships from groups to groups
|
|
364
|
+
they are indirectly owners of through group hierarchy.
|
|
365
|
+
|
|
366
|
+
Example: SubGroup1 -> OWNER_OF -> SubGroup2 -> MEMBER_OF -> ParentGroup
|
|
367
|
+
This creates: SubGroup1 -> INHERITED_OWNER_OF -> ParentGroup
|
|
368
|
+
"""
|
|
369
|
+
|
|
370
|
+
target_node_label: str = "GoogleWorkspaceGroup"
|
|
371
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
372
|
+
{"id": PropertyRef("target_group_id")}
|
|
373
|
+
)
|
|
374
|
+
source_node_label: str = "GoogleWorkspaceGroup"
|
|
375
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
376
|
+
{"id": PropertyRef("source_group_id")}
|
|
377
|
+
)
|
|
378
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
379
|
+
rel_label: str = "INHERITED_OWNER_OF"
|
|
380
|
+
properties: GoogleWorkspaceGroupToGroupInheritedOwnerRelProperties = (
|
|
381
|
+
GoogleWorkspaceGroupToGroupInheritedOwnerRelProperties()
|
|
382
|
+
)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
7
|
+
from cartography.models.core.relationships import CartographyRelProperties
|
|
8
|
+
from cartography.models.core.relationships import CartographyRelSchema
|
|
9
|
+
from cartography.models.core.relationships import LinkDirection
|
|
10
|
+
from cartography.models.core.relationships import make_source_node_matcher
|
|
11
|
+
from cartography.models.core.relationships import make_target_node_matcher
|
|
12
|
+
from cartography.models.core.relationships import SourceNodeMatcher
|
|
13
|
+
from cartography.models.core.relationships import TargetNodeMatcher
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class GoogleWorkspaceOAuthAppNodeProperties(CartographyNodeProperties):
|
|
18
|
+
"""
|
|
19
|
+
Google Workspace OAuth app node properties
|
|
20
|
+
Represents third-party applications that users have authorized
|
|
21
|
+
https://developers.google.com/workspace/admin/directory/reference/rest/v1/tokens
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
id: PropertyRef = PropertyRef("client_id")
|
|
25
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
26
|
+
|
|
27
|
+
# App identifiers
|
|
28
|
+
client_id: PropertyRef = PropertyRef("client_id", extra_index=True)
|
|
29
|
+
display_text: PropertyRef = PropertyRef("display_text")
|
|
30
|
+
|
|
31
|
+
# App properties
|
|
32
|
+
anonymous: PropertyRef = PropertyRef("anonymous")
|
|
33
|
+
native_app: PropertyRef = PropertyRef("native_app")
|
|
34
|
+
|
|
35
|
+
# Tenant relationship
|
|
36
|
+
customer_id: PropertyRef = PropertyRef("CUSTOMER_ID", set_in_kwargs=True)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class GoogleWorkspaceUserToOAuthAppRelProperties(CartographyRelProperties):
|
|
41
|
+
"""
|
|
42
|
+
Properties for Google Workspace user to OAuth app relationship (MatchLink)
|
|
43
|
+
Includes the scopes granted by the user to the app
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
# Required fields for MatchLinks
|
|
47
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
48
|
+
_sub_resource_label: PropertyRef = PropertyRef(
|
|
49
|
+
"_sub_resource_label", set_in_kwargs=True
|
|
50
|
+
)
|
|
51
|
+
_sub_resource_id: PropertyRef = PropertyRef("_sub_resource_id", set_in_kwargs=True)
|
|
52
|
+
|
|
53
|
+
# Custom property: scopes granted to the app
|
|
54
|
+
scopes: PropertyRef = PropertyRef("scopes")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass(frozen=True)
|
|
58
|
+
class GoogleWorkspaceUserToOAuthAppRel(CartographyRelSchema):
|
|
59
|
+
"""
|
|
60
|
+
MatchLink relationship from Google Workspace user to OAuth app
|
|
61
|
+
Connects existing users to OAuth apps with granted scopes
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
target_node_label: str = "GoogleWorkspaceOAuthApp"
|
|
65
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
66
|
+
{
|
|
67
|
+
"client_id": PropertyRef("client_id"),
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
source_node_label: str = "GoogleWorkspaceUser"
|
|
71
|
+
source_node_matcher: SourceNodeMatcher = make_source_node_matcher(
|
|
72
|
+
{
|
|
73
|
+
"id": PropertyRef("user_id"),
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
direction: LinkDirection = LinkDirection.OUTWARD
|
|
77
|
+
rel_label: str = "AUTHORIZED"
|
|
78
|
+
properties: GoogleWorkspaceUserToOAuthAppRelProperties = (
|
|
79
|
+
GoogleWorkspaceUserToOAuthAppRelProperties()
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass(frozen=True)
|
|
84
|
+
class GoogleWorkspaceOAuthAppToTenantRelProperties(CartographyRelProperties):
|
|
85
|
+
"""
|
|
86
|
+
Properties for Google Workspace OAuth app to tenant relationship
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@dataclass(frozen=True)
|
|
93
|
+
class GoogleWorkspaceOAuthAppToTenantRel(CartographyRelSchema):
|
|
94
|
+
"""
|
|
95
|
+
Relationship from Google Workspace OAuth app to Google Workspace tenant
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
target_node_label: str = "GoogleWorkspaceTenant"
|
|
99
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
100
|
+
{
|
|
101
|
+
"id": PropertyRef("CUSTOMER_ID", set_in_kwargs=True),
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
105
|
+
rel_label: str = "RESOURCE"
|
|
106
|
+
properties: GoogleWorkspaceOAuthAppToTenantRelProperties = (
|
|
107
|
+
GoogleWorkspaceOAuthAppToTenantRelProperties()
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass(frozen=True)
|
|
112
|
+
class GoogleWorkspaceOAuthAppSchema(CartographyNodeSchema):
|
|
113
|
+
"""
|
|
114
|
+
Google Workspace OAuth app node schema
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
label: str = "GoogleWorkspaceOAuthApp"
|
|
118
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["ThirdPartyApp"])
|
|
119
|
+
properties: GoogleWorkspaceOAuthAppNodeProperties = (
|
|
120
|
+
GoogleWorkspaceOAuthAppNodeProperties()
|
|
121
|
+
)
|
|
122
|
+
sub_resource_relationship: GoogleWorkspaceOAuthAppToTenantRel = (
|
|
123
|
+
GoogleWorkspaceOAuthAppToTenantRel()
|
|
124
|
+
)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class GoogleWorkspaceTenantNodeProperties(CartographyNodeProperties):
|
|
10
|
+
"""
|
|
11
|
+
Google Workspace tenant (domain/customer) node properties
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
id: PropertyRef = PropertyRef("id")
|
|
15
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
16
|
+
domain: PropertyRef = PropertyRef("customerDomain")
|
|
17
|
+
name: PropertyRef = PropertyRef("postalAddress.organizationName")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class GoogleWorkspaceTenantSchema(CartographyNodeSchema):
|
|
22
|
+
"""
|
|
23
|
+
Google Workspace tenant (domain/customer) schema
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
label: str = "GoogleWorkspaceTenant"
|
|
27
|
+
properties: GoogleWorkspaceTenantNodeProperties = (
|
|
28
|
+
GoogleWorkspaceTenantNodeProperties()
|
|
29
|
+
)
|
|
30
|
+
sub_resource_relationship: None = None # Tenant is the root level
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from cartography.models.core.common import PropertyRef
|
|
4
|
+
from cartography.models.core.nodes import CartographyNodeProperties
|
|
5
|
+
from cartography.models.core.nodes import CartographyNodeSchema
|
|
6
|
+
from cartography.models.core.nodes import ExtraNodeLabels
|
|
7
|
+
from cartography.models.core.relationships import CartographyRelProperties
|
|
8
|
+
from cartography.models.core.relationships import CartographyRelSchema
|
|
9
|
+
from cartography.models.core.relationships import LinkDirection
|
|
10
|
+
from cartography.models.core.relationships import make_target_node_matcher
|
|
11
|
+
from cartography.models.core.relationships import TargetNodeMatcher
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class GoogleWorkspaceUserNodeProperties(CartographyNodeProperties):
|
|
16
|
+
"""
|
|
17
|
+
Google Workspace user node properties
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
id: PropertyRef = PropertyRef("id")
|
|
21
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
22
|
+
|
|
23
|
+
# User identifiers and basic info
|
|
24
|
+
user_id: PropertyRef = PropertyRef("id") # Alias for id
|
|
25
|
+
primary_email: PropertyRef = PropertyRef("primaryEmail", extra_index=True)
|
|
26
|
+
email: PropertyRef = PropertyRef(
|
|
27
|
+
"primaryEmail", extra_index=True
|
|
28
|
+
) # Alias for primary_email
|
|
29
|
+
name: PropertyRef = PropertyRef("name")
|
|
30
|
+
family_name: PropertyRef = PropertyRef("family_name")
|
|
31
|
+
given_name: PropertyRef = PropertyRef("given_name")
|
|
32
|
+
|
|
33
|
+
# Organization info
|
|
34
|
+
organization_name: PropertyRef = PropertyRef("organization_name")
|
|
35
|
+
organization_title: PropertyRef = PropertyRef("organization_title")
|
|
36
|
+
organization_department: PropertyRef = PropertyRef("organization_department")
|
|
37
|
+
|
|
38
|
+
# Account settings
|
|
39
|
+
agreed_to_terms: PropertyRef = PropertyRef("agreedToTerms")
|
|
40
|
+
archived: PropertyRef = PropertyRef("archived")
|
|
41
|
+
change_password_at_next_login: PropertyRef = PropertyRef(
|
|
42
|
+
"changePasswordAtNextLogin"
|
|
43
|
+
)
|
|
44
|
+
suspended: PropertyRef = PropertyRef("suspended")
|
|
45
|
+
|
|
46
|
+
# Admin and security settings
|
|
47
|
+
is_admin: PropertyRef = PropertyRef("isAdmin")
|
|
48
|
+
is_delegated_admin: PropertyRef = PropertyRef("isDelegatedAdmin")
|
|
49
|
+
is_enforced_in_2_sv: PropertyRef = PropertyRef("isEnforcedIn2Sv")
|
|
50
|
+
is_enrolled_in_2_sv: PropertyRef = PropertyRef("isEnrolledIn2Sv")
|
|
51
|
+
ip_whitelisted: PropertyRef = PropertyRef("ipWhitelisted")
|
|
52
|
+
|
|
53
|
+
# Organization and profile
|
|
54
|
+
org_unit_path: PropertyRef = PropertyRef("orgUnitPath")
|
|
55
|
+
include_in_global_address_list: PropertyRef = PropertyRef(
|
|
56
|
+
"includeInGlobalAddressList"
|
|
57
|
+
)
|
|
58
|
+
is_mailbox_setup: PropertyRef = PropertyRef("isMailboxSetup")
|
|
59
|
+
|
|
60
|
+
# Timestamps and metadata
|
|
61
|
+
creation_time: PropertyRef = PropertyRef("creationTime")
|
|
62
|
+
last_login_time: PropertyRef = PropertyRef("lastLoginTime")
|
|
63
|
+
etag: PropertyRef = PropertyRef("etag")
|
|
64
|
+
kind: PropertyRef = PropertyRef("kind")
|
|
65
|
+
|
|
66
|
+
# Photo information
|
|
67
|
+
thumbnail_photo_etag: PropertyRef = PropertyRef("thumbnailPhotoEtag")
|
|
68
|
+
thumbnail_photo_url: PropertyRef = PropertyRef("thumbnailPhotoUrl")
|
|
69
|
+
|
|
70
|
+
# Tenant relationship
|
|
71
|
+
customer_id: PropertyRef = PropertyRef("CUSTOMER_ID", set_in_kwargs=True)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass(frozen=True)
|
|
75
|
+
class GoogleWorkspaceUserToTenantRelProperties(CartographyRelProperties):
|
|
76
|
+
"""
|
|
77
|
+
Properties for Google Workspace user to tenant relationship
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass(frozen=True)
|
|
84
|
+
class GoogleWorkspaceUserToTenantRel(CartographyRelSchema):
|
|
85
|
+
"""
|
|
86
|
+
Relationship from Google Workspace user to Google Workspace tenant
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
target_node_label: str = "GoogleWorkspaceTenant"
|
|
90
|
+
target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
|
|
91
|
+
{
|
|
92
|
+
"id": PropertyRef("CUSTOMER_ID", set_in_kwargs=True),
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
direction: LinkDirection = LinkDirection.INWARD
|
|
96
|
+
rel_label: str = "RESOURCE"
|
|
97
|
+
properties: GoogleWorkspaceUserToTenantRelProperties = (
|
|
98
|
+
GoogleWorkspaceUserToTenantRelProperties()
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@dataclass(frozen=True)
|
|
103
|
+
class GoogleWorkspaceUserSchema(CartographyNodeSchema):
|
|
104
|
+
"""
|
|
105
|
+
Google Workspace user node schema
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
label: str = "GoogleWorkspaceUser"
|
|
109
|
+
properties: GoogleWorkspaceUserNodeProperties = GoogleWorkspaceUserNodeProperties()
|
|
110
|
+
sub_resource_relationship: GoogleWorkspaceUserToTenantRel = (
|
|
111
|
+
GoogleWorkspaceUserToTenantRel()
|
|
112
|
+
)
|
|
113
|
+
extra_node_labels: ExtraNodeLabels = ExtraNodeLabels(["GCPPrincipal"])
|
|
File without changes
|