cartography 0.96.0rc3__tar.gz → 0.96.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cartography might be problematic. Click here for more details.

Files changed (368) hide show
  1. {cartography-0.96.0rc3 → cartography-0.96.1}/PKG-INFO +1 -1
  2. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/github_repos_cleanup.json +25 -0
  3. cartography-0.96.1/cartography/intel/aws/ec2/auto_scaling_groups.py +205 -0
  4. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/instances.py +2 -0
  5. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/network_acls.py +2 -1
  6. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/subnets.py +2 -0
  7. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/iam.py +4 -3
  8. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/cve/feed.py +6 -3
  9. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/repos.py +209 -27
  10. cartography-0.96.1/cartography/intel/github/teams.py +331 -0
  11. cartography-0.96.1/cartography/models/aws/ec2/auto_scaling_groups.py +204 -0
  12. cartography-0.96.1/cartography/models/aws/ec2/launch_configurations.py +55 -0
  13. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/network_acl_rules.py +1 -0
  14. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/teams.py +29 -0
  15. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/util.py +22 -0
  16. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/PKG-INFO +1 -1
  17. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/SOURCES.txt +2 -0
  18. {cartography-0.96.0rc3 → cartography-0.96.1}/setup.py +1 -1
  19. cartography-0.96.0rc3/cartography/intel/aws/ec2/auto_scaling_groups.py +0 -243
  20. cartography-0.96.0rc3/cartography/intel/github/teams.py +0 -209
  21. {cartography-0.96.0rc3 → cartography-0.96.1}/LICENSE +0 -0
  22. {cartography-0.96.0rc3 → cartography-0.96.1}/README.md +0 -0
  23. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/__init__.py +0 -0
  24. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/__main__.py +0 -0
  25. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/cli.py +0 -0
  26. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/__init__.py +0 -0
  27. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/aws/__init__.py +0 -0
  28. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/aws/iam.py +0 -0
  29. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/core/__init__.py +0 -0
  30. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/client/core/tx.py +0 -0
  31. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/config.py +0 -0
  32. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/__init__.py +0 -0
  33. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/indexes.cypher +0 -0
  34. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/__init__.py +0 -0
  35. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/__init__.py +0 -0
  36. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_asset_exposure.json +0 -0
  37. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_iaminstance.json +0 -0
  38. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_iaminstanceprofile.json +0 -0
  39. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_ec2_keypair_analysis.json +0 -0
  40. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_eks_asset_exposure.json +0 -0
  41. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_foreign_accounts.json +0 -0
  42. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_lambda_ecr.json +0 -0
  43. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/aws_s3acl_analysis.json +0 -0
  44. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gcp_compute_asset_inet_exposure.json +0 -0
  45. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gcp_gke_asset_exposure.json +0 -0
  46. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gcp_gke_basic_auth.json +0 -0
  47. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/analysis/gsuite_human_link.json +0 -0
  48. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/__init__.py +0 -0
  49. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_account_cleanup.json +0 -0
  50. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_apigateway_details.json +0 -0
  51. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_dns_cleanup.json +0 -0
  52. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_account_access_key_cleanup.json +0 -0
  53. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_apigateway_cleanup.json +0 -0
  54. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_config_cleanup.json +0 -0
  55. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ec2_launch_configurations_cleanup.json +0 -0
  56. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ec2_security_groupinfo_cleanup.json +0 -0
  57. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ecr_cleanup.json +0 -0
  58. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_ecs_cleanup.json +0 -0
  59. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_elastic_ip_addresses_cleanup.json +0 -0
  60. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_elasticache_cleanup.json +0 -0
  61. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_es_cleanup.json +0 -0
  62. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_groups_cleanup.json +0 -0
  63. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_groups_membership_cleanup.json +0 -0
  64. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_groups_policy_cleanup.json +0 -0
  65. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_identity_center_cleanup.json +0 -0
  66. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_internet_gateways_cleanup.json +0 -0
  67. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_kms_cleanup.json +0 -0
  68. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_lambda_cleanup.json +0 -0
  69. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_principals_cleanup.json +0 -0
  70. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_rds_clusters_cleanup.json +0 -0
  71. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_rds_instances_cleanup.json +0 -0
  72. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_rds_snapshots_cleanup.json +0 -0
  73. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_redshift_clusters_cleanup.json +0 -0
  74. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_reserved_instances_cleanup.json +0 -0
  75. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_roles_cleanup.json +0 -0
  76. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_roles_policy_cleanup.json +0 -0
  77. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_s3_acl_cleanup.json +0 -0
  78. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_s3_buckets_cleanup.json +0 -0
  79. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_secrets_cleanup.json +0 -0
  80. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_securityhub_cleanup.json +0 -0
  81. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_snapshots_cleanup.json +0 -0
  82. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_sqs_queues_cleanup.json +0 -0
  83. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_tags_cleanup.json +0 -0
  84. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_tgw_cleanup.json +0 -0
  85. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_users_cleanup.json +0 -0
  86. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_vpc_cleanup.json +0 -0
  87. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_import_vpc_peering_cleanup.json +0 -0
  88. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_ec2_auto_scaling_groups_cleanup.json +0 -0
  89. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_cleanup.json +0 -0
  90. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_load_balancers_v2_cleanup.json +0 -0
  91. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_ingest_subnets_cleanup.json +0 -0
  92. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_kms_details.json +0 -0
  93. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_post_ingestion_principals_cleanup.json +0 -0
  94. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/aws_s3_details.json +0 -0
  95. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_cassandra_keyspace_cleanup.json +0 -0
  96. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_cors_details.json +0 -0
  97. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_mongodb_database_cleanup.json +0 -0
  98. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_sql_database_cleanup.json +0 -0
  99. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_cosmosdb_table_resources_cleanup.json +0 -0
  100. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_database_account_cleanup.json +0 -0
  101. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_import_disks_cleanup.json +0 -0
  102. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_import_snapshots_cleanup.json +0 -0
  103. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_import_virtual_machines_cleanup.json +0 -0
  104. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_sql_server_cleanup.json +0 -0
  105. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_storage_account_cleanup.json +0 -0
  106. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json +0 -0
  107. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/azure_tenant_cleanup.json +0 -0
  108. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json +0 -0
  109. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json +0 -0
  110. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/digitalocean_project_cleanup.json +0 -0
  111. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json +0 -0
  112. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_forwarding_rules_cleanup.json +0 -0
  113. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_instance_cleanup.json +0 -0
  114. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_vpc_cleanup.json +0 -0
  115. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_compute_vpc_subnet_cleanup.json +0 -0
  116. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_crm_folder_cleanup.json +0 -0
  117. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_crm_organization_cleanup.json +0 -0
  118. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_crm_project_cleanup.json +0 -0
  119. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_dns_cleanup.json +0 -0
  120. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_gke_cluster_cleanup.json +0 -0
  121. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gcp_storage_bucket_cleanup.json +0 -0
  122. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/github_org_and_users_cleanup.json +0 -0
  123. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gsuite_ingest_groups_cleanup.json +0 -0
  124. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/gsuite_ingest_users_cleanup.json +0 -0
  125. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/jamf_import_computers_cleanup.json +0 -0
  126. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/kubernetes_import_cleanup.json +0 -0
  127. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_compartments_cleanup.json +0 -0
  128. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_groups_cleanup.json +0 -0
  129. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_groups_membership_cleanup.json +0 -0
  130. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_policies_cleanup.json +0 -0
  131. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_import_users_cleanup.json +0 -0
  132. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/oci_tenancy_cleanup.json +0 -0
  133. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/okta_groups_cleanup.json +0 -0
  134. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/okta_import_cleanup.json +0 -0
  135. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/cleanup/pagerduty_import_cleanup.json +0 -0
  136. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/scoped_analysis/__init__.py +0 -0
  137. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +0 -0
  138. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/data/permission_relationships.yaml +0 -0
  139. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/__init__.py +0 -0
  140. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/__main__.py +0 -0
  141. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/add_shortcut.py +0 -0
  142. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/cli.py +0 -0
  143. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/config.py +0 -0
  144. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/detect_deviations.py +0 -0
  145. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/get_states.py +0 -0
  146. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/model.py +0 -0
  147. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/reporter.py +0 -0
  148. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/serializers.py +0 -0
  149. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/shortcut.py +0 -0
  150. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/storage.py +0 -0
  151. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/driftdetect/util.py +0 -0
  152. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/__init__.py +0 -0
  153. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/cleanupbuilder.py +0 -0
  154. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/context.py +0 -0
  155. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/job.py +0 -0
  156. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/querybuilder.py +0 -0
  157. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/graph/statement.py +0 -0
  158. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/__init__.py +0 -0
  159. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/analysis.py +0 -0
  160. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/__init__.py +0 -0
  161. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/apigateway.py +0 -0
  162. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/config.py +0 -0
  163. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/dynamodb.py +0 -0
  164. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/__init__.py +0 -0
  165. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/elastic_ip_addresses.py +0 -0
  166. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/images.py +0 -0
  167. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/internet_gateways.py +0 -0
  168. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/key_pairs.py +0 -0
  169. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/launch_templates.py +0 -0
  170. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/load_balancer_v2s.py +0 -0
  171. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/load_balancers.py +0 -0
  172. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/network_interfaces.py +0 -0
  173. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/reserved_instances.py +0 -0
  174. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/security_groups.py +0 -0
  175. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/snapshots.py +0 -0
  176. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/tgw.py +0 -0
  177. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/util.py +0 -0
  178. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/volumes.py +0 -0
  179. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/vpc.py +0 -0
  180. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ec2/vpc_peerings.py +0 -0
  181. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ecr.py +0 -0
  182. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ecs.py +0 -0
  183. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/eks.py +0 -0
  184. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/elasticache.py +0 -0
  185. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/elasticsearch.py +0 -0
  186. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/emr.py +0 -0
  187. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/identitycenter.py +0 -0
  188. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/inspector.py +0 -0
  189. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/kms.py +0 -0
  190. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/lambda_function.py +0 -0
  191. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/organizations.py +0 -0
  192. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/permission_relationships.py +0 -0
  193. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/rds.py +0 -0
  194. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/redshift.py +0 -0
  195. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/resourcegroupstaggingapi.py +0 -0
  196. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/resources.py +0 -0
  197. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/route53.py +0 -0
  198. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/s3.py +0 -0
  199. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/secretsmanager.py +0 -0
  200. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/securityhub.py +0 -0
  201. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/sqs.py +0 -0
  202. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/ssm.py +0 -0
  203. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/util/__init__.py +0 -0
  204. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/util/arns.py +0 -0
  205. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/aws/util/common.py +0 -0
  206. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/__init__.py +0 -0
  207. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/compute.py +0 -0
  208. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/cosmosdb.py +0 -0
  209. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/sql.py +0 -0
  210. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/storage.py +0 -0
  211. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/subscription.py +0 -0
  212. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/tenant.py +0 -0
  213. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/util/__init__.py +0 -0
  214. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/azure/util/credentials.py +0 -0
  215. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/bigfix/__init__.py +0 -0
  216. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/bigfix/computers.py +0 -0
  217. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/create_indexes.py +0 -0
  218. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/__init__.py +0 -0
  219. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/endpoints.py +0 -0
  220. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/spotlight.py +0 -0
  221. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/crowdstrike/util.py +0 -0
  222. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/cve/__init__.py +0 -0
  223. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/__init__.py +0 -0
  224. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/compute.py +0 -0
  225. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/management.py +0 -0
  226. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/digitalocean/platform.py +0 -0
  227. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/dns.py +0 -0
  228. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/__init__.py +0 -0
  229. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/api_host.py +0 -0
  230. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/endpoints.py +0 -0
  231. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/groups.py +0 -0
  232. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/phones.py +0 -0
  233. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/tokens.py +0 -0
  234. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/users.py +0 -0
  235. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/duo/web_authn_credentials.py +0 -0
  236. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/__init__.py +0 -0
  237. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/compute.py +0 -0
  238. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/crm.py +0 -0
  239. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/dns.py +0 -0
  240. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/gke.py +0 -0
  241. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gcp/storage.py +0 -0
  242. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/__init__.py +0 -0
  243. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/users.py +0 -0
  244. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/github/util.py +0 -0
  245. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gsuite/__init__.py +0 -0
  246. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/gsuite/api.py +0 -0
  247. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/jamf/__init__.py +0 -0
  248. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/jamf/computers.py +0 -0
  249. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/jamf/util.py +0 -0
  250. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kandji/__init__.py +0 -0
  251. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kandji/devices.py +0 -0
  252. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/__init__.py +0 -0
  253. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/namespaces.py +0 -0
  254. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/pods.py +0 -0
  255. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/secrets.py +0 -0
  256. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/services.py +0 -0
  257. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/kubernetes/util.py +0 -0
  258. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/lastpass/__init__.py +0 -0
  259. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/lastpass/users.py +0 -0
  260. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/__init__.py +0 -0
  261. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/iam.py +0 -0
  262. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/organizations.py +0 -0
  263. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/oci/utils.py +0 -0
  264. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/__init__.py +0 -0
  265. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/applications.py +0 -0
  266. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/awssaml.py +0 -0
  267. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/factors.py +0 -0
  268. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/groups.py +0 -0
  269. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/organization.py +0 -0
  270. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/origins.py +0 -0
  271. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/roles.py +0 -0
  272. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/sync_state.py +0 -0
  273. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/users.py +0 -0
  274. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/okta/utils.py +0 -0
  275. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/__init__.py +0 -0
  276. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/escalation_policies.py +0 -0
  277. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/schedules.py +0 -0
  278. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/services.py +0 -0
  279. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/teams.py +0 -0
  280. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/users.py +0 -0
  281. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/pagerduty/vendors.py +0 -0
  282. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/__init__.py +0 -0
  283. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/dependencies.py +0 -0
  284. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/deployment.py +0 -0
  285. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/semgrep/findings.py +0 -0
  286. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/__init__.py +0 -0
  287. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/asset.py +0 -0
  288. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/user.py +0 -0
  289. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/intel/snipeit/util.py +0 -0
  290. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/__init__.py +0 -0
  291. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/__init__.py +0 -0
  292. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/dynamodb/__init__.py +0 -0
  293. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/dynamodb/gsi.py +0 -0
  294. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/dynamodb/tables.py +0 -0
  295. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/__init__.py +0 -0
  296. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/images.py +0 -0
  297. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/instances.py +0 -0
  298. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/keypairs.py +0 -0
  299. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/launch_template_versions.py +0 -0
  300. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/launch_templates.py +0 -0
  301. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/loadbalancerv2.py +0 -0
  302. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/network_acls.py +0 -0
  303. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/networkinterface_instance.py +0 -0
  304. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/networkinterfaces.py +0 -0
  305. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/privateip_networkinterface.py +0 -0
  306. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/reservations.py +0 -0
  307. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/securitygroup_instance.py +0 -0
  308. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/securitygroup_networkinterface.py +0 -0
  309. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/subnet_instance.py +0 -0
  310. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/subnet_networkinterface.py +0 -0
  311. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ec2/volumes.py +0 -0
  312. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/eks/__init__.py +0 -0
  313. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/eks/clusters.py +0 -0
  314. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/emr.py +0 -0
  315. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/__init__.py +0 -0
  316. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/awsidentitycenter.py +0 -0
  317. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/awspermissionset.py +0 -0
  318. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/identitycenter/awsssouser.py +0 -0
  319. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/inspector/__init__.py +0 -0
  320. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/inspector/findings.py +0 -0
  321. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/inspector/packages.py +0 -0
  322. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ssm/__init__.py +0 -0
  323. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ssm/instance_information.py +0 -0
  324. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/aws/ssm/instance_patch.py +0 -0
  325. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/bigfix/__init__.py +0 -0
  326. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/bigfix/bigfix_computer.py +0 -0
  327. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/bigfix/bigfix_root.py +0 -0
  328. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/__init__.py +0 -0
  329. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/common.py +0 -0
  330. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/nodes.py +0 -0
  331. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/core/relationships.py +0 -0
  332. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/cve/__init__.py +0 -0
  333. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/cve/cve.py +0 -0
  334. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/cve/cve_feed.py +0 -0
  335. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/__init__.py +0 -0
  336. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/api_host.py +0 -0
  337. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/endpoint.py +0 -0
  338. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/group.py +0 -0
  339. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/phone.py +0 -0
  340. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/token.py +0 -0
  341. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/user.py +0 -0
  342. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/duo/web_authn_credential.py +0 -0
  343. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/__init__.py +0 -0
  344. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/orgs.py +0 -0
  345. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/github/users.py +0 -0
  346. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/kandji/__init__.py +0 -0
  347. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/kandji/device.py +0 -0
  348. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/kandji/tenant.py +0 -0
  349. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/lastpass/__init__.py +0 -0
  350. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/lastpass/tenant.py +0 -0
  351. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/lastpass/user.py +0 -0
  352. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/__init__.py +0 -0
  353. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/dependencies.py +0 -0
  354. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/deployment.py +0 -0
  355. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/findings.py +0 -0
  356. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/semgrep/locations.py +0 -0
  357. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/__init__.py +0 -0
  358. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/asset.py +0 -0
  359. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/tenant.py +0 -0
  360. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/models/snipeit/user.py +0 -0
  361. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/py.typed +0 -0
  362. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/stats.py +0 -0
  363. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography/sync.py +0 -0
  364. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/dependency_links.txt +0 -0
  365. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/entry_points.txt +0 -0
  366. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/requires.txt +0 -0
  367. {cartography-0.96.0rc3 → cartography-0.96.1}/cartography.egg-info/top_level.txt +0 -0
  368. {cartography-0.96.0rc3 → cartography-0.96.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cartography
3
- Version: 0.96.0rc3
3
+ Version: 0.96.1
4
4
  Summary: Explore assets and their relationships across your technical infrastructure.
5
5
  Home-page: https://www.github.com/cartography-cncf/cartography
6
6
  Maintainer: Cartography Contributors
@@ -63,6 +63,31 @@
63
63
  "query": "MATCH (:GitHubUser)-[r:OUTSIDE_COLLAB_WRITE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
64
64
  "iterative": true,
65
65
  "iterationsize": 100
66
+ },
67
+ {
68
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_ADMIN]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
69
+ "iterative": true,
70
+ "iterationsize": 100
71
+ },
72
+ {
73
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_MAINTAIN]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
74
+ "iterative": true,
75
+ "iterationsize": 100
76
+ },
77
+ {
78
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_READ]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
79
+ "iterative": true,
80
+ "iterationsize": 100
81
+ },
82
+ {
83
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_TRIAGE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
84
+ "iterative": true,
85
+ "iterationsize": 100
86
+ },
87
+ {
88
+ "query": "MATCH (:GitHubUser)-[r:DIRECT_COLLAB_WRITE]->(:GitHubRepository) WHERE r.lastupdated <> $UPDATE_TAG WITH r LIMIT $LIMIT_SIZE DELETE (r)",
89
+ "iterative": true,
90
+ "iterationsize": 100
66
91
  }],
67
92
  "name": "cleanup GitHub repos data"
68
93
  }
@@ -0,0 +1,205 @@
1
+ import logging
2
+ from collections import namedtuple
3
+ from typing import Any
4
+
5
+ import boto3
6
+ import neo4j
7
+
8
+ from .util import get_botocore_config
9
+ from cartography.client.core.tx import load
10
+ from cartography.graph.job import GraphJob
11
+ from cartography.models.aws.ec2.auto_scaling_groups import AutoScalingGroupSchema
12
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2InstanceAutoScalingGroupSchema
13
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2SubnetAutoScalingGroupSchema
14
+ from cartography.models.aws.ec2.launch_configurations import LaunchConfigurationSchema
15
+ from cartography.util import aws_handle_regions
16
+ from cartography.util import timeit
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ AsgData = namedtuple(
21
+ 'AsgData', [
22
+ "group_list",
23
+ "instance_list",
24
+ "subnet_list",
25
+ ],
26
+ )
27
+
28
+
29
+ @timeit
30
+ @aws_handle_regions
31
+ def get_ec2_auto_scaling_groups(boto3_session: boto3.session.Session, region: str) -> list[dict]:
32
+ client = boto3_session.client('autoscaling', region_name=region, config=get_botocore_config())
33
+ paginator = client.get_paginator('describe_auto_scaling_groups')
34
+ asgs: list[dict] = []
35
+ for page in paginator.paginate():
36
+ asgs.extend(page['AutoScalingGroups'])
37
+ return asgs
38
+
39
+
40
+ @timeit
41
+ @aws_handle_regions
42
+ def get_launch_configurations(boto3_session: boto3.session.Session, region: str) -> list[dict]:
43
+ client = boto3_session.client('autoscaling', region_name=region, config=get_botocore_config())
44
+ paginator = client.get_paginator('describe_launch_configurations')
45
+ lcs: list[dict] = []
46
+ for page in paginator.paginate():
47
+ lcs.extend(page['LaunchConfigurations'])
48
+ return lcs
49
+
50
+
51
+ def transform_launch_configurations(configurations: list[dict[str, Any]]) -> list[dict[str, Any]]:
52
+ transformed_configurations = []
53
+ for config in configurations:
54
+ transformed_configurations.append({
55
+ 'AssociatePublicIpAddress': config.get('AssociatePublicIpAddress'),
56
+ 'LaunchConfigurationARN': config.get('LaunchConfigurationARN'),
57
+ 'LaunchConfigurationName': config.get('LaunchConfigurationName'),
58
+ 'CreatedTime': config.get('CreatedTime'),
59
+ 'ImageId': config.get('ImageId'),
60
+ 'KeyName': config.get('KeyName'),
61
+ 'SecurityGroups': config.get('SecurityGroups'),
62
+ 'InstanceType': config.get('InstanceType'),
63
+ 'KernelId': config.get('KernelId'),
64
+ 'RamdiskId': config.get('RamdiskId'),
65
+ 'InstanceMonitoring': config.get('InstanceMonitoring', {}).get('Enabled'),
66
+ 'SpotPrice': config.get('SpotPrice'),
67
+ 'IamInstanceProfile': config.get('IamInstanceProfile'),
68
+ 'EbsOptimized': config.get('EbsOptimized'),
69
+ 'PlacementTenancy': config.get('PlacementTenancy'),
70
+ })
71
+ return transformed_configurations
72
+
73
+
74
+ def transform_auto_scaling_groups(groups: list[dict[str, Any]]) -> AsgData:
75
+ transformed_groups = []
76
+ related_vpcs = []
77
+ related_instances = []
78
+ for group in groups:
79
+ transformed_groups.append({
80
+ 'AutoScalingGroupARN': group['AutoScalingGroupARN'],
81
+ 'CapacityRebalance': group.get('CapacityRebalance'),
82
+ 'CreatedTime': str(group.get('CreatedTime')),
83
+ 'DefaultCooldown': group.get('DefaultCooldown'),
84
+ 'DesiredCapacity': group.get('DesiredCapacity'),
85
+ 'HealthCheckGracePeriod': group.get('HealthCheckGracePeriod'),
86
+ 'HealthCheckType': group.get('HealthCheckType'),
87
+ 'LaunchConfigurationName': group.get('LaunchConfigurationName'),
88
+ 'LaunchTemplateName': group.get('LaunchTemplate', {}).get('LaunchTemplateName'),
89
+ 'LaunchTemplateId': group.get('LaunchTemplate', {}).get('LaunchTemplateId'),
90
+ 'LaunchTemplateVersion': group.get('LaunchTemplate', {}).get('Version'),
91
+ 'MaxInstanceLifetime': group.get('MaxInstanceLifetime'),
92
+ 'MaxSize': group.get('MaxSize'),
93
+ 'MinSize': group.get('MinSize'),
94
+ 'AutoScalingGroupName': group.get('AutoScalingGroupName'),
95
+ 'NewInstancesProtectedFromScaleIn': group.get('NewInstancesProtectedFromScaleIn'),
96
+ 'Status': group.get('Status'),
97
+ })
98
+
99
+ if group.get('VPCZoneIdentifier', None):
100
+ vpclist = group['VPCZoneIdentifier']
101
+ subnet_ids = vpclist.split(',') if ',' in vpclist else [vpclist]
102
+ subnets = []
103
+ for subnet_id in subnet_ids:
104
+ subnets.append({
105
+ 'VPCZoneIdentifier': subnet_id,
106
+ 'AutoScalingGroupARN': group['AutoScalingGroupARN'],
107
+ })
108
+ related_vpcs.extend(subnets)
109
+
110
+ for instance_data in group.get('Instances', []):
111
+ related_instances.append({
112
+ 'InstanceId': instance_data['InstanceId'],
113
+ 'AutoScalingGroupARN': group['AutoScalingGroupARN'],
114
+ })
115
+
116
+ return AsgData(
117
+ group_list=transformed_groups,
118
+ instance_list=related_instances,
119
+ subnet_list=related_vpcs,
120
+ )
121
+
122
+
123
+ @timeit
124
+ def load_launch_configurations(
125
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
126
+ ) -> None:
127
+ load(
128
+ neo4j_session,
129
+ LaunchConfigurationSchema(),
130
+ data,
131
+ Region=region,
132
+ AWS_ID=current_aws_account_id,
133
+ lastupdated=update_tag,
134
+ )
135
+
136
+
137
+ def load_groups(
138
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
139
+ ) -> None:
140
+ load(
141
+ neo4j_session,
142
+ AutoScalingGroupSchema(),
143
+ data,
144
+ Region=region,
145
+ AWS_ID=current_aws_account_id,
146
+ lastupdated=update_tag,
147
+ )
148
+
149
+
150
+ def load_asg_subnets(
151
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
152
+ ) -> None:
153
+ load(
154
+ neo4j_session,
155
+ EC2SubnetAutoScalingGroupSchema(),
156
+ data,
157
+ Region=region,
158
+ AWS_ID=current_aws_account_id,
159
+ lastupdated=update_tag,
160
+ )
161
+
162
+
163
+ def load_asg_instances(
164
+ neo4j_session: neo4j.Session, data: list[dict], region: str, current_aws_account_id: str, update_tag: int,
165
+ ) -> None:
166
+ load(
167
+ neo4j_session,
168
+ EC2InstanceAutoScalingGroupSchema(),
169
+ data,
170
+ Region=region,
171
+ AWS_ID=current_aws_account_id,
172
+ lastupdated=update_tag,
173
+ )
174
+
175
+
176
+ @timeit
177
+ def load_auto_scaling_groups(
178
+ neo4j_session: neo4j.Session, data: AsgData, region: str, current_aws_account_id: str, update_tag: int,
179
+ ) -> None:
180
+ load_groups(neo4j_session, data.group_list, region, current_aws_account_id, update_tag)
181
+ load_asg_instances(neo4j_session, data.instance_list, region, current_aws_account_id, update_tag)
182
+ load_asg_subnets(neo4j_session, data.subnet_list, region, current_aws_account_id, update_tag)
183
+
184
+
185
+ @timeit
186
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: dict[str, Any]) -> None:
187
+ logger.debug("Running EC2 instance cleanup")
188
+ GraphJob.from_node_schema(AutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
189
+ GraphJob.from_node_schema(LaunchConfigurationSchema(), common_job_parameters).run(neo4j_session)
190
+
191
+
192
+ @timeit
193
+ def sync_ec2_auto_scaling_groups(
194
+ neo4j_session: neo4j.Session, boto3_session: boto3.session.Session, regions: list[str],
195
+ current_aws_account_id: str, update_tag: int, common_job_parameters: dict,
196
+ ) -> None:
197
+ for region in regions:
198
+ logger.debug("Syncing auto scaling groups for region '%s' in account '%s'.", region, current_aws_account_id)
199
+ lc_data = get_launch_configurations(boto3_session, region)
200
+ asg_data = get_ec2_auto_scaling_groups(boto3_session, region)
201
+ lc_transformed = transform_launch_configurations(lc_data)
202
+ asg_transformed = transform_auto_scaling_groups(asg_data)
203
+ load_launch_configurations(neo4j_session, lc_transformed, region, current_aws_account_id, update_tag)
204
+ load_auto_scaling_groups(neo4j_session, asg_transformed, region, current_aws_account_id, update_tag)
205
+ cleanup(neo4j_session, common_job_parameters)
@@ -11,6 +11,7 @@ import neo4j
11
11
  from cartography.client.core.tx import load
12
12
  from cartography.graph.job import GraphJob
13
13
  from cartography.intel.aws.ec2.util import get_botocore_config
14
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2InstanceAutoScalingGroupSchema
14
15
  from cartography.models.aws.ec2.instances import EC2InstanceSchema
15
16
  from cartography.models.aws.ec2.keypairs import EC2KeyPairSchema
16
17
  from cartography.models.aws.ec2.networkinterface_instance import EC2NetworkInterfaceInstanceSchema
@@ -308,6 +309,7 @@ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict[str, Any])
308
309
  logger.debug("Running EC2 instance cleanup")
309
310
  GraphJob.from_node_schema(EC2ReservationSchema(), common_job_parameters).run(neo4j_session)
310
311
  GraphJob.from_node_schema(EC2InstanceSchema(), common_job_parameters).run(neo4j_session)
312
+ GraphJob.from_node_schema(EC2InstanceAutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
311
313
 
312
314
 
313
315
  @timeit
@@ -69,7 +69,8 @@ def transform_network_acl_data(
69
69
  direction = 'egress' if rule['Egress'] else 'inbound'
70
70
  transformed_rule = {
71
71
  'Id': f"{network_acl['NetworkAclId']}/{direction}/{rule['RuleNumber']}",
72
- 'CidrBlock': rule['CidrBlock'],
72
+ 'CidrBlock': rule.get('CidrBlock'),
73
+ 'Ipv6CidrBlock': rule.get('Ipv6CidrBlock'),
73
74
  'Egress': rule['Egress'],
74
75
  'Protocol': rule['Protocol'],
75
76
  'RuleAction': rule['RuleAction'],
@@ -7,6 +7,7 @@ import neo4j
7
7
 
8
8
  from .util import get_botocore_config
9
9
  from cartography.graph.job import GraphJob
10
+ from cartography.models.aws.ec2.auto_scaling_groups import EC2SubnetAutoScalingGroupSchema
10
11
  from cartography.models.aws.ec2.subnet_instance import EC2SubnetInstanceSchema
11
12
  from cartography.util import aws_handle_regions
12
13
  from cartography.util import run_cleanup_job
@@ -79,6 +80,7 @@ def load_subnets(
79
80
  def cleanup_subnets(neo4j_session: neo4j.Session, common_job_parameters: Dict) -> None:
80
81
  run_cleanup_job('aws_ingest_subnets_cleanup.json', neo4j_session, common_job_parameters)
81
82
  GraphJob.from_node_schema(EC2SubnetInstanceSchema(), common_job_parameters).run(neo4j_session)
83
+ GraphJob.from_node_schema(EC2SubnetAutoScalingGroupSchema(), common_job_parameters).run(neo4j_session)
82
84
 
83
85
 
84
86
  @timeit
@@ -539,11 +539,12 @@ def _transform_policy_statements(statements: Any, policy_id: str) -> List[Dict]:
539
539
  if not isinstance(statements, list):
540
540
  statements = [statements]
541
541
  for stmt in statements:
542
- if "Sid" not in stmt:
542
+ if "Sid" in stmt and stmt["Sid"]:
543
+ statement_id = stmt["Sid"]
544
+ else:
543
545
  statement_id = count
544
546
  count += 1
545
- else:
546
- statement_id = stmt["Sid"]
547
+
547
548
  stmt["id"] = f"{policy_id}/statement/{statement_id}"
548
549
  if "Resource" in stmt:
549
550
  stmt["Resource"] = ensure_list(stmt["Resource"])
@@ -22,9 +22,9 @@ from cartography.util import timeit
22
22
 
23
23
  logger = logging.getLogger(__name__)
24
24
 
25
- MAX_RETRIES = 3
26
- # Connect and read timeouts of 60 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
27
- CONNECT_AND_READ_TIMEOUT = (60, 60)
25
+ MAX_RETRIES = 8
26
+ # Connect and read timeouts of 120 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
27
+ CONNECT_AND_READ_TIMEOUT = (30, 120)
28
28
  CVE_FEED_ID = "NIST_NVD"
29
29
  BATCH_SIZE_DAYS = 120
30
30
  RESULTS_PER_PAGE = 2000
@@ -98,6 +98,9 @@ def _call_cves_api(url: str, api_key: str | None, params: Dict[str, Any]) -> Dic
98
98
  retries += 1
99
99
  if retries >= MAX_RETRIES:
100
100
  raise
101
+ # Exponential backoff
102
+ sleep_time *= 2
103
+ time.sleep(sleep_time)
101
104
  continue
102
105
  data = res.json()
103
106
  _map_cve_dict(results, data)
@@ -1,5 +1,6 @@
1
1
  import configparser
2
2
  import logging
3
+ from collections import namedtuple
3
4
  from string import Template
4
5
  from typing import Any
5
6
  from typing import Dict
@@ -12,11 +13,28 @@ from packaging.requirements import Requirement
12
13
  from packaging.utils import canonicalize_name
13
14
 
14
15
  from cartography.intel.github.util import fetch_all
16
+ from cartography.intel.github.util import PaginatedGraphqlData
17
+ from cartography.util import backoff_handler
18
+ from cartography.util import retries_with_backoff
15
19
  from cartography.util import run_cleanup_job
16
20
  from cartography.util import timeit
17
21
 
18
22
  logger = logging.getLogger(__name__)
19
23
 
24
+
25
+ # Representation of a user's permission level and affiliation to a GitHub repo. See:
26
+ # - Permission: https://docs.github.com/en/graphql/reference/enums#repositorypermission
27
+ # - Affiliation: https://docs.github.com/en/graphql/reference/enums#collaboratoraffiliation
28
+ UserAffiliationAndRepoPermission = namedtuple(
29
+ 'UserAffiliationAndRepoPermission',
30
+ [
31
+ 'user', # Dict
32
+ 'permission', # 'WRITE', 'MAINTAIN', 'ADMIN', etc
33
+ 'affiliation', # 'OUTSIDE', 'DIRECT'
34
+ ],
35
+ )
36
+
37
+
20
38
  GITHUB_ORG_REPOS_PAGINATED_GRAPHQL = """
21
39
  query($login: String!, $cursor: String) {
22
40
  organization(login: $login)
@@ -59,17 +77,11 @@ GITHUB_ORG_REPOS_PAGINATED_GRAPHQL = """
59
77
  login
60
78
  __typename
61
79
  }
62
- collaborators(affiliation: OUTSIDE, first: 50) {
63
- edges {
64
- permission
65
- }
66
- nodes {
67
- url
68
- login
69
- name
70
- email
71
- company
72
- }
80
+ directCollaborators: collaborators(first: 100, affiliation: DIRECT) {
81
+ totalCount
82
+ }
83
+ outsideCollaborators: collaborators(first: 100, affiliation: OUTSIDE) {
84
+ totalCount
73
85
  }
74
86
  requirements:object(expression: "HEAD:requirements.txt") {
75
87
  ... on Blob {
@@ -89,6 +101,142 @@ GITHUB_ORG_REPOS_PAGINATED_GRAPHQL = """
89
101
  # Note: In the above query, `HEAD` references the default branch.
90
102
  # See https://stackoverflow.com/questions/48935381/github-graphql-api-default-branch-in-repository
91
103
 
104
+ GITHUB_REPO_COLLABS_PAGINATED_GRAPHQL = """
105
+ query($login: String!, $repo: String!, $affiliation: CollaboratorAffiliation!, $cursor: String) {
106
+ organization(login: $login) {
107
+ url
108
+ login
109
+ repository(name: $repo){
110
+ name
111
+ collaborators(first: 50, affiliation: $affiliation, after: $cursor) {
112
+ edges {
113
+ permission
114
+ }
115
+ nodes {
116
+ url
117
+ login
118
+ name
119
+ email
120
+ company
121
+ }
122
+ pageInfo{
123
+ endCursor
124
+ hasNextPage
125
+ }
126
+ }
127
+ }
128
+ }
129
+ rateLimit {
130
+ limit
131
+ cost
132
+ remaining
133
+ resetAt
134
+ }
135
+ }
136
+ """
137
+
138
+
139
+ def _get_repo_collaborators_inner_func(
140
+ org: str,
141
+ api_url: str,
142
+ token: str,
143
+ repo_name: str,
144
+ affiliation: str,
145
+ collab_users: list[dict[str, Any]],
146
+ collab_permission: list[str],
147
+ ) -> None:
148
+ logger.info(f"Loading {affiliation} collaborators for repo {repo_name}.")
149
+ collaborators = _get_repo_collaborators(token, api_url, org, repo_name, affiliation)
150
+
151
+ # nodes and edges are expected to always be present given that we only call for them if totalCount is > 0
152
+ # however sometimes GitHub returns None, as in issue 1334 and 1404.
153
+ for collab in collaborators.nodes or []:
154
+ collab_users.append(collab)
155
+
156
+ # The `or []` is because `.edges` can be None.
157
+ for perm in collaborators.edges or []:
158
+ collab_permission.append(perm['permission'])
159
+
160
+
161
+ def _get_repo_collaborators_for_multiple_repos(
162
+ repo_raw_data: list[dict[str, Any]],
163
+ affiliation: str,
164
+ org: str,
165
+ api_url: str,
166
+ token: str,
167
+ ) -> dict[str, list[UserAffiliationAndRepoPermission]]:
168
+ """
169
+ For every repo in the given list, retrieve the collaborators.
170
+ :param repo_raw_data: A list of dicts representing repos. See tests.data.github.repos.GET_REPOS for data shape.
171
+ :param affiliation: The type of affiliation to retrieve collaborators for. Either 'DIRECT' or 'OUTSIDE'.
172
+ See https://docs.github.com/en/graphql/reference/enums#collaboratoraffiliation
173
+ :param org: The name of the target Github organization as string.
174
+ :param api_url: The Github v4 API endpoint as string.
175
+ :param token: The Github API token as string.
176
+ :return: A dictionary of repo URL to list of UserAffiliationAndRepoPermission
177
+ """
178
+ result: dict[str, list[UserAffiliationAndRepoPermission]] = {}
179
+ for repo in repo_raw_data:
180
+ repo_name = repo['name']
181
+ repo_url = repo['url']
182
+
183
+ if ((affiliation == 'OUTSIDE' and repo['outsideCollaborators']['totalCount'] == 0) or
184
+ (affiliation == 'DIRECT' and repo['directCollaborators']['totalCount'] == 0)):
185
+ # repo has no collabs of the affiliation type we're looking for, so don't waste time making an API call
186
+ result[repo_url] = []
187
+ continue
188
+
189
+ collab_users: List[dict[str, Any]] = []
190
+ collab_permission: List[str] = []
191
+
192
+ retries_with_backoff(
193
+ _get_repo_collaborators_inner_func,
194
+ TypeError,
195
+ 5,
196
+ backoff_handler,
197
+ )(
198
+ org=org,
199
+ api_url=api_url,
200
+ token=token,
201
+ repo_name=repo_name,
202
+ affiliation=affiliation,
203
+ collab_users=collab_users,
204
+ collab_permission=collab_permission,
205
+ )
206
+
207
+ result[repo_url] = [
208
+ UserAffiliationAndRepoPermission(user, permission, affiliation)
209
+ for user, permission in zip(collab_users, collab_permission)
210
+ ]
211
+ return result
212
+
213
+
214
+ def _get_repo_collaborators(
215
+ token: str, api_url: str, organization: str, repo: str, affiliation: str,
216
+ ) -> PaginatedGraphqlData:
217
+ """
218
+ Retrieve a list of collaborators for a given repository, as described in
219
+ https://docs.github.com/en/graphql/reference/objects#repositorycollaboratorconnection.
220
+ :param token: The Github API token as string.
221
+ :param api_url: The Github v4 API endpoint as string.
222
+ :param organization: The name of the target Github organization as string.
223
+ :pram repo: The name of the target Github repository as string.
224
+ :param affiliation: The type of affiliation to retrieve collaborators for. Either 'DIRECT' or 'OUTSIDE'.
225
+ See https://docs.github.com/en/graphql/reference/enums#collaboratoraffiliation
226
+ :return: A list of dicts representing repos. See tests.data.github.repos for data shape.
227
+ """
228
+ collaborators, _ = fetch_all(
229
+ token,
230
+ api_url,
231
+ organization,
232
+ GITHUB_REPO_COLLABS_PAGINATED_GRAPHQL,
233
+ 'repository',
234
+ resource_inner_type='collaborators',
235
+ repo=repo,
236
+ affiliation=affiliation,
237
+ )
238
+ return collaborators
239
+
92
240
 
93
241
  @timeit
94
242
  def get(token: str, api_url: str, organization: str) -> List[Dict]:
@@ -111,11 +259,18 @@ def get(token: str, api_url: str, organization: str) -> List[Dict]:
111
259
  return repos.nodes
112
260
 
113
261
 
114
- def transform(repos_json: List[Dict]) -> Dict:
262
+ def transform(
263
+ repos_json: List[Dict], direct_collaborators: dict[str, List[UserAffiliationAndRepoPermission]],
264
+ outside_collaborators: dict[str, List[UserAffiliationAndRepoPermission]],
265
+ ) -> Dict:
115
266
  """
116
267
  Parses the JSON returned from GitHub API to create data for graph ingestion
117
- :param repos_json: the list of individual repository nodes from GitHub. See tests.data.github.repos.GET_REPOS for
118
- data shape.
268
+ :param repos_json: the list of individual repository nodes from GitHub.
269
+ See tests.data.github.repos.GET_REPOS for data shape.
270
+ :param direct_collaborators: dict of repo URL to list of direct collaborators.
271
+ See tests.data.github.repos.DIRECT_COLLABORATORS for data shape.
272
+ :param outside_collaborators: dict of repo URL to list of outside collaborators.
273
+ See tests.data.github.repos.OUTSIDE_COLLABORATORS for data shape.
119
274
  :return: Dict containing the repos, repo->language mapping, owners->repo mapping, outside collaborators->repo
120
275
  mapping, and Python requirements files (if any) in a repo.
121
276
  """
@@ -123,7 +278,10 @@ def transform(repos_json: List[Dict]) -> Dict:
123
278
  transformed_repo_languages: List[Dict] = []
124
279
  transformed_repo_owners: List[Dict] = []
125
280
  # See https://docs.github.com/en/graphql/reference/enums#repositorypermission
126
- transformed_collaborators: Dict[str, List[Any]] = {
281
+ transformed_outside_collaborators: Dict[str, List[Any]] = {
282
+ 'ADMIN': [], 'MAINTAIN': [], 'READ': [], 'TRIAGE': [], 'WRITE': [],
283
+ }
284
+ transformed_direct_collaborators: Dict[str, List[Any]] = {
127
285
  'ADMIN': [], 'MAINTAIN': [], 'READ': [], 'TRIAGE': [], 'WRITE': [],
128
286
  }
129
287
  transformed_requirements_files: List[Dict] = []
@@ -131,14 +289,22 @@ def transform(repos_json: List[Dict]) -> Dict:
131
289
  _transform_repo_languages(repo_object['url'], repo_object, transformed_repo_languages)
132
290
  _transform_repo_objects(repo_object, transformed_repo_list)
133
291
  _transform_repo_owners(repo_object['owner']['url'], repo_object, transformed_repo_owners)
134
- _transform_collaborators(repo_object['collaborators'], repo_object['url'], transformed_collaborators)
292
+ _transform_collaborators(
293
+ repo_object['url'], outside_collaborators[repo_object['url']],
294
+ transformed_outside_collaborators,
295
+ )
296
+ _transform_collaborators(
297
+ repo_object['url'], direct_collaborators[repo_object['url']],
298
+ transformed_direct_collaborators,
299
+ )
135
300
  _transform_requirements_txt(repo_object['requirements'], repo_object['url'], transformed_requirements_files)
136
301
  _transform_setup_cfg_requirements(repo_object['setupCfg'], repo_object['url'], transformed_requirements_files)
137
302
  results = {
138
303
  'repos': transformed_repo_list,
139
304
  'repo_languages': transformed_repo_languages,
140
305
  'repo_owners': transformed_repo_owners,
141
- 'repo_collaborators': transformed_collaborators,
306
+ 'repo_outside_collaborators': transformed_outside_collaborators,
307
+ 'repo_direct_collaborators': transformed_direct_collaborators,
142
308
  'python_requirements': transformed_requirements_files,
143
309
  }
144
310
  return results
@@ -229,11 +395,15 @@ def _transform_repo_languages(repo_url: str, repo: Dict, repo_languages: List[Di
229
395
  })
230
396
 
231
397
 
232
- def _transform_collaborators(collaborators: Dict, repo_url: str, transformed_collaborators: Dict) -> None:
398
+ def _transform_collaborators(
399
+ repo_url: str, collaborators: List[UserAffiliationAndRepoPermission], transformed_collaborators: Dict,
400
+ ) -> None:
233
401
  """
234
- Performs data adjustments for outside collaborators in a GitHub repo.
402
+ Performs data adjustments for collaborators in a GitHub repo.
235
403
  Output data shape = [{permission, repo_url, url (the user's URL), login, name}, ...]
236
- :param collaborators: See cartography.tests.data.github.repos for data shape.
404
+ :param collaborators: For data shape, see
405
+ cartography.tests.data.github.repos.DIRECT_COLLABORATORS
406
+ cartography.tests.data.github.repos.OUTSIDE_COLLABORATORS
237
407
  :param repo_url: The URL of the GitHub repo.
238
408
  :param transformed_collaborators: Output dict. Data shape =
239
409
  {'ADMIN': [{ user }, ...], 'MAINTAIN': [{ user }, ...], 'READ': [ ... ], 'TRIAGE': [ ... ], 'WRITE': [ ... ]}
@@ -241,10 +411,11 @@ def _transform_collaborators(collaborators: Dict, repo_url: str, transformed_col
241
411
  """
242
412
  # `collaborators` is sometimes None
243
413
  if collaborators:
244
- for idx, user in enumerate(collaborators['nodes']):
245
- user_permission = collaborators['edges'][idx]['permission']
414
+ for collaborator in collaborators:
415
+ user = collaborator.user
246
416
  user['repo_url'] = repo_url
247
- transformed_collaborators[user_permission].append(user)
417
+ user['affiliation'] = collaborator.affiliation
418
+ transformed_collaborators[collaborator.permission].append(user)
248
419
 
249
420
 
250
421
  def _transform_requirements_txt(
@@ -482,7 +653,7 @@ def load_github_owners(neo4j_session: neo4j.Session, update_tag: int, repo_owner
482
653
 
483
654
 
484
655
  @timeit
485
- def load_collaborators(neo4j_session: neo4j.Session, update_tag: int, collaborators: Dict) -> None:
656
+ def load_collaborators(neo4j_session: neo4j.Session, update_tag: int, collaborators: Dict, affiliation: str) -> None:
486
657
  query = Template("""
487
658
  UNWIND $UserData as user
488
659
 
@@ -502,7 +673,7 @@ def load_collaborators(neo4j_session: neo4j.Session, update_tag: int, collaborat
502
673
  SET o.lastupdated = $UpdateTag
503
674
  """)
504
675
  for collab_type in collaborators.keys():
505
- relationship_label = f"OUTSIDE_COLLAB_{collab_type}"
676
+ relationship_label = f"{affiliation}_COLLAB_{collab_type}"
506
677
  neo4j_session.run(
507
678
  query.safe_substitute(rel_label=relationship_label),
508
679
  UserData=collaborators[collab_type],
@@ -515,7 +686,12 @@ def load(neo4j_session: neo4j.Session, common_job_parameters: Dict, repo_data: D
515
686
  load_github_repos(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repos'])
516
687
  load_github_owners(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_owners'])
517
688
  load_github_languages(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_languages'])
518
- load_collaborators(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_collaborators'])
689
+ load_collaborators(
690
+ neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_direct_collaborators'], 'DIRECT',
691
+ )
692
+ load_collaborators(
693
+ neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['repo_outside_collaborators'], 'OUTSIDE',
694
+ )
519
695
  load_python_requirements(neo4j_session, common_job_parameters['UPDATE_TAG'], repo_data['python_requirements'])
520
696
 
521
697
 
@@ -561,6 +737,12 @@ def sync(
561
737
  """
562
738
  logger.info("Syncing GitHub repos")
563
739
  repos_json = get(github_api_key, github_url, organization)
564
- repo_data = transform(repos_json)
740
+ direct_collabs = _get_repo_collaborators_for_multiple_repos(
741
+ repos_json, "DIRECT", organization, github_url, github_api_key,
742
+ )
743
+ outside_collabs = _get_repo_collaborators_for_multiple_repos(
744
+ repos_json, "OUTSIDE", organization, github_url, github_api_key,
745
+ )
746
+ repo_data = transform(repos_json, direct_collabs, outside_collabs)
565
747
  load(neo4j_session, common_job_parameters, repo_data)
566
748
  run_cleanup_job('github_repos_cleanup.json', neo4j_session, common_job_parameters)