cartography 0.102.0rc1__py3-none-any.whl → 0.103.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.

Potentially problematic release.


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

Files changed (297) hide show
  1. cartography/__main__.py +1 -2
  2. cartography/_version.py +2 -2
  3. cartography/cli.py +376 -249
  4. cartography/client/core/tx.py +39 -18
  5. cartography/config.py +28 -0
  6. cartography/driftdetect/__main__.py +1 -2
  7. cartography/driftdetect/add_shortcut.py +10 -2
  8. cartography/driftdetect/cli.py +71 -75
  9. cartography/driftdetect/detect_deviations.py +7 -3
  10. cartography/driftdetect/get_states.py +20 -8
  11. cartography/driftdetect/model.py +5 -5
  12. cartography/driftdetect/serializers.py +8 -6
  13. cartography/driftdetect/storage.py +2 -2
  14. cartography/graph/cleanupbuilder.py +35 -15
  15. cartography/graph/job.py +46 -17
  16. cartography/graph/querybuilder.py +165 -80
  17. cartography/graph/statement.py +35 -26
  18. cartography/intel/analysis.py +4 -1
  19. cartography/intel/aws/__init__.py +114 -55
  20. cartography/intel/aws/apigateway.py +134 -63
  21. cartography/intel/aws/cloudtrail.py +127 -0
  22. cartography/intel/aws/cloudwatch.py +93 -0
  23. cartography/intel/aws/config.py +56 -20
  24. cartography/intel/aws/dynamodb.py +108 -40
  25. cartography/intel/aws/ec2/__init__.py +2 -2
  26. cartography/intel/aws/ec2/auto_scaling_groups.py +181 -78
  27. cartography/intel/aws/ec2/elastic_ip_addresses.py +41 -13
  28. cartography/intel/aws/ec2/images.py +49 -20
  29. cartography/intel/aws/ec2/instances.py +234 -136
  30. cartography/intel/aws/ec2/internet_gateways.py +40 -11
  31. cartography/intel/aws/ec2/key_pairs.py +44 -20
  32. cartography/intel/aws/ec2/launch_templates.py +101 -59
  33. cartography/intel/aws/ec2/load_balancer_v2s.py +104 -39
  34. cartography/intel/aws/ec2/load_balancers.py +82 -42
  35. cartography/intel/aws/ec2/network_acls.py +89 -65
  36. cartography/intel/aws/ec2/network_interfaces.py +146 -87
  37. cartography/intel/aws/ec2/reserved_instances.py +45 -16
  38. cartography/intel/aws/ec2/route_tables.py +327 -0
  39. cartography/intel/aws/ec2/security_groups.py +71 -21
  40. cartography/intel/aws/ec2/snapshots.py +61 -22
  41. cartography/intel/aws/ec2/subnets.py +54 -18
  42. cartography/intel/aws/ec2/tgw.py +100 -34
  43. cartography/intel/aws/ec2/util.py +1 -1
  44. cartography/intel/aws/ec2/volumes.py +69 -41
  45. cartography/intel/aws/ec2/vpc.py +37 -12
  46. cartography/intel/aws/ec2/vpc_peerings.py +83 -24
  47. cartography/intel/aws/ecr.py +88 -32
  48. cartography/intel/aws/ecs.py +83 -47
  49. cartography/intel/aws/efs.py +93 -0
  50. cartography/intel/aws/eks.py +55 -29
  51. cartography/intel/aws/elasticache.py +42 -18
  52. cartography/intel/aws/elasticsearch.py +57 -20
  53. cartography/intel/aws/emr.py +61 -23
  54. cartography/intel/aws/iam.py +401 -145
  55. cartography/intel/aws/iam_instance_profiles.py +22 -22
  56. cartography/intel/aws/identitycenter.py +71 -37
  57. cartography/intel/aws/inspector.py +159 -89
  58. cartography/intel/aws/kms.py +92 -38
  59. cartography/intel/aws/lambda_function.py +103 -34
  60. cartography/intel/aws/organizations.py +30 -10
  61. cartography/intel/aws/permission_relationships.py +133 -51
  62. cartography/intel/aws/rds.py +249 -85
  63. cartography/intel/aws/redshift.py +107 -46
  64. cartography/intel/aws/resourcegroupstaggingapi.py +120 -66
  65. cartography/intel/aws/resources.py +57 -44
  66. cartography/intel/aws/route53.py +108 -61
  67. cartography/intel/aws/s3.py +168 -83
  68. cartography/intel/aws/s3accountpublicaccessblock.py +157 -0
  69. cartography/intel/aws/secretsmanager.py +24 -12
  70. cartography/intel/aws/securityhub.py +20 -9
  71. cartography/intel/aws/sns.py +166 -0
  72. cartography/intel/aws/sqs.py +60 -28
  73. cartography/intel/aws/ssm.py +70 -30
  74. cartography/intel/aws/util/arns.py +7 -7
  75. cartography/intel/aws/util/common.py +31 -4
  76. cartography/intel/azure/__init__.py +78 -19
  77. cartography/intel/azure/compute.py +101 -27
  78. cartography/intel/azure/cosmosdb.py +496 -170
  79. cartography/intel/azure/sql.py +296 -105
  80. cartography/intel/azure/storage.py +322 -113
  81. cartography/intel/azure/subscription.py +39 -23
  82. cartography/intel/azure/tenant.py +13 -4
  83. cartography/intel/azure/util/credentials.py +95 -55
  84. cartography/intel/bigfix/__init__.py +2 -2
  85. cartography/intel/bigfix/computers.py +93 -65
  86. cartography/intel/cloudflare/__init__.py +74 -0
  87. cartography/intel/cloudflare/accounts.py +57 -0
  88. cartography/intel/cloudflare/dnsrecords.py +64 -0
  89. cartography/intel/cloudflare/members.py +75 -0
  90. cartography/intel/cloudflare/roles.py +65 -0
  91. cartography/intel/cloudflare/zones.py +64 -0
  92. cartography/intel/create_indexes.py +3 -2
  93. cartography/intel/crowdstrike/__init__.py +11 -9
  94. cartography/intel/crowdstrike/endpoints.py +5 -1
  95. cartography/intel/crowdstrike/spotlight.py +8 -3
  96. cartography/intel/cve/__init__.py +46 -13
  97. cartography/intel/cve/feed.py +48 -12
  98. cartography/intel/digitalocean/__init__.py +22 -13
  99. cartography/intel/digitalocean/compute.py +75 -108
  100. cartography/intel/digitalocean/management.py +44 -80
  101. cartography/intel/digitalocean/platform.py +48 -43
  102. cartography/intel/dns.py +36 -10
  103. cartography/intel/duo/__init__.py +21 -16
  104. cartography/intel/duo/api_host.py +14 -9
  105. cartography/intel/duo/endpoints.py +50 -45
  106. cartography/intel/duo/groups.py +18 -14
  107. cartography/intel/duo/phones.py +37 -34
  108. cartography/intel/duo/tokens.py +26 -23
  109. cartography/intel/duo/users.py +54 -50
  110. cartography/intel/duo/web_authn_credentials.py +30 -25
  111. cartography/intel/entra/__init__.py +25 -7
  112. cartography/intel/entra/ou.py +112 -0
  113. cartography/intel/entra/users.py +69 -63
  114. cartography/intel/gcp/__init__.py +185 -49
  115. cartography/intel/gcp/compute.py +418 -231
  116. cartography/intel/gcp/crm.py +96 -43
  117. cartography/intel/gcp/dns.py +60 -19
  118. cartography/intel/gcp/gke.py +72 -38
  119. cartography/intel/gcp/iam.py +61 -41
  120. cartography/intel/gcp/storage.py +84 -55
  121. cartography/intel/github/__init__.py +13 -11
  122. cartography/intel/github/repos.py +270 -137
  123. cartography/intel/github/teams.py +170 -88
  124. cartography/intel/github/users.py +70 -39
  125. cartography/intel/github/util.py +36 -34
  126. cartography/intel/gsuite/__init__.py +47 -26
  127. cartography/intel/gsuite/api.py +73 -30
  128. cartography/intel/jamf/__init__.py +19 -1
  129. cartography/intel/jamf/computers.py +30 -7
  130. cartography/intel/jamf/util.py +7 -2
  131. cartography/intel/kandji/__init__.py +6 -3
  132. cartography/intel/kandji/devices.py +14 -8
  133. cartography/intel/kubernetes/namespaces.py +7 -4
  134. cartography/intel/kubernetes/pods.py +7 -4
  135. cartography/intel/kubernetes/services.py +8 -4
  136. cartography/intel/lastpass/__init__.py +2 -2
  137. cartography/intel/lastpass/users.py +23 -12
  138. cartography/intel/oci/__init__.py +44 -11
  139. cartography/intel/oci/iam.py +134 -38
  140. cartography/intel/oci/organizations.py +13 -6
  141. cartography/intel/oci/utils.py +43 -20
  142. cartography/intel/okta/__init__.py +66 -15
  143. cartography/intel/okta/applications.py +42 -20
  144. cartography/intel/okta/awssaml.py +93 -33
  145. cartography/intel/okta/factors.py +16 -4
  146. cartography/intel/okta/groups.py +56 -29
  147. cartography/intel/okta/organization.py +5 -1
  148. cartography/intel/okta/origins.py +6 -2
  149. cartography/intel/okta/roles.py +15 -5
  150. cartography/intel/okta/users.py +20 -8
  151. cartography/intel/okta/utils.py +6 -4
  152. cartography/intel/openai/__init__.py +86 -0
  153. cartography/intel/openai/adminapikeys.py +90 -0
  154. cartography/intel/openai/apikeys.py +96 -0
  155. cartography/intel/openai/projects.py +94 -0
  156. cartography/intel/openai/serviceaccounts.py +82 -0
  157. cartography/intel/openai/users.py +78 -0
  158. cartography/intel/openai/util.py +29 -0
  159. cartography/intel/pagerduty/__init__.py +8 -7
  160. cartography/intel/pagerduty/escalation_policies.py +18 -6
  161. cartography/intel/pagerduty/schedules.py +12 -4
  162. cartography/intel/pagerduty/services.py +11 -4
  163. cartography/intel/pagerduty/teams.py +8 -3
  164. cartography/intel/pagerduty/users.py +3 -1
  165. cartography/intel/pagerduty/vendors.py +3 -1
  166. cartography/intel/semgrep/__init__.py +24 -6
  167. cartography/intel/semgrep/dependencies.py +50 -28
  168. cartography/intel/semgrep/deployment.py +3 -1
  169. cartography/intel/semgrep/findings.py +42 -18
  170. cartography/intel/snipeit/__init__.py +17 -3
  171. cartography/intel/snipeit/asset.py +12 -6
  172. cartography/intel/snipeit/user.py +8 -5
  173. cartography/intel/snipeit/util.py +9 -4
  174. cartography/intel/tailscale/__init__.py +77 -0
  175. cartography/intel/tailscale/acls.py +146 -0
  176. cartography/intel/tailscale/devices.py +127 -0
  177. cartography/intel/tailscale/postureintegrations.py +81 -0
  178. cartography/intel/tailscale/tailnets.py +76 -0
  179. cartography/intel/tailscale/users.py +80 -0
  180. cartography/intel/tailscale/utils.py +132 -0
  181. cartography/models/aws/apigateway.py +21 -17
  182. cartography/models/aws/apigatewaycertificate.py +28 -22
  183. cartography/models/aws/apigatewayresource.py +28 -20
  184. cartography/models/aws/apigatewaystage.py +33 -25
  185. cartography/models/aws/cloudtrail/__init__.py +0 -0
  186. cartography/models/aws/cloudtrail/trail.py +61 -0
  187. cartography/models/aws/cloudwatch/__init__.py +0 -0
  188. cartography/models/aws/cloudwatch/loggroup.py +52 -0
  189. cartography/models/aws/dynamodb/gsi.py +30 -22
  190. cartography/models/aws/dynamodb/tables.py +25 -17
  191. cartography/models/aws/ec2/auto_scaling_groups.py +102 -82
  192. cartography/models/aws/ec2/images.py +36 -34
  193. cartography/models/aws/ec2/instances.py +51 -45
  194. cartography/models/aws/ec2/keypair.py +21 -16
  195. cartography/models/aws/ec2/keypair_instance.py +28 -21
  196. cartography/models/aws/ec2/launch_configurations.py +30 -26
  197. cartography/models/aws/ec2/launch_template_versions.py +48 -38
  198. cartography/models/aws/ec2/launch_templates.py +21 -17
  199. cartography/models/aws/ec2/load_balancer_listeners.py +27 -23
  200. cartography/models/aws/ec2/load_balancers.py +47 -37
  201. cartography/models/aws/ec2/network_acl_rules.py +38 -30
  202. cartography/models/aws/ec2/network_acls.py +38 -29
  203. cartography/models/aws/ec2/networkinterface_instance.py +52 -39
  204. cartography/models/aws/ec2/networkinterfaces.py +53 -37
  205. cartography/models/aws/ec2/privateip_networkinterface.py +32 -22
  206. cartography/models/aws/ec2/reservations.py +18 -14
  207. cartography/models/aws/ec2/route_table_associations.py +97 -0
  208. cartography/models/aws/ec2/route_tables.py +128 -0
  209. cartography/models/aws/ec2/routes.py +85 -0
  210. cartography/models/aws/ec2/securitygroup_instance.py +29 -20
  211. cartography/models/aws/ec2/securitygroup_networkinterface.py +24 -15
  212. cartography/models/aws/ec2/subnet_instance.py +24 -19
  213. cartography/models/aws/ec2/subnet_networkinterface.py +40 -31
  214. cartography/models/aws/ec2/volumes.py +47 -40
  215. cartography/models/aws/efs/__init__.py +0 -0
  216. cartography/models/aws/efs/mount_target.py +52 -0
  217. cartography/models/aws/eks/clusters.py +23 -21
  218. cartography/models/aws/emr.py +32 -30
  219. cartography/models/aws/iam/instanceprofile.py +33 -24
  220. cartography/models/aws/identitycenter/awsidentitycenter.py +18 -14
  221. cartography/models/aws/identitycenter/awspermissionset.py +37 -29
  222. cartography/models/aws/identitycenter/awsssouser.py +23 -21
  223. cartography/models/aws/inspector/findings.py +77 -65
  224. cartography/models/aws/inspector/packages.py +35 -29
  225. cartography/models/aws/s3/__init__.py +0 -0
  226. cartography/models/aws/s3/account_public_access_block.py +51 -0
  227. cartography/models/aws/sns/__init__.py +0 -0
  228. cartography/models/aws/sns/topic.py +50 -0
  229. cartography/models/aws/ssm/instance_information.py +51 -39
  230. cartography/models/aws/ssm/instance_patch.py +32 -26
  231. cartography/models/bigfix/bigfix_computer.py +42 -38
  232. cartography/models/bigfix/bigfix_root.py +3 -3
  233. cartography/models/cloudflare/__init__.py +0 -0
  234. cartography/models/cloudflare/account.py +25 -0
  235. cartography/models/cloudflare/dnsrecord.py +55 -0
  236. cartography/models/cloudflare/member.py +82 -0
  237. cartography/models/cloudflare/role.py +44 -0
  238. cartography/models/cloudflare/zone.py +59 -0
  239. cartography/models/core/common.py +12 -10
  240. cartography/models/core/nodes.py +5 -2
  241. cartography/models/core/relationships.py +14 -6
  242. cartography/models/crowdstrike/hosts.py +37 -35
  243. cartography/models/cve/cve.py +34 -32
  244. cartography/models/cve/cve_feed.py +6 -6
  245. cartography/models/digitalocean/__init__.py +0 -0
  246. cartography/models/digitalocean/account.py +21 -0
  247. cartography/models/digitalocean/droplet.py +56 -0
  248. cartography/models/digitalocean/project.py +48 -0
  249. cartography/models/duo/api_host.py +3 -3
  250. cartography/models/duo/endpoint.py +43 -41
  251. cartography/models/duo/group.py +14 -14
  252. cartography/models/duo/phone.py +27 -27
  253. cartography/models/duo/token.py +16 -16
  254. cartography/models/duo/user.py +46 -44
  255. cartography/models/duo/web_authn_credential.py +27 -19
  256. cartography/models/entra/ou.py +48 -0
  257. cartography/models/entra/tenant.py +24 -18
  258. cartography/models/entra/user.py +64 -48
  259. cartography/models/gcp/iam.py +23 -23
  260. cartography/models/github/orgs.py +5 -4
  261. cartography/models/github/teams.py +37 -31
  262. cartography/models/github/users.py +34 -23
  263. cartography/models/kandji/device.py +22 -16
  264. cartography/models/kandji/tenant.py +6 -4
  265. cartography/models/lastpass/tenant.py +3 -3
  266. cartography/models/lastpass/user.py +32 -28
  267. cartography/models/openai/__init__.py +0 -0
  268. cartography/models/openai/adminapikey.py +90 -0
  269. cartography/models/openai/apikey.py +84 -0
  270. cartography/models/openai/organization.py +17 -0
  271. cartography/models/openai/project.py +70 -0
  272. cartography/models/openai/serviceaccount.py +50 -0
  273. cartography/models/openai/user.py +49 -0
  274. cartography/models/semgrep/dependencies.py +36 -24
  275. cartography/models/semgrep/deployment.py +5 -5
  276. cartography/models/semgrep/findings.py +58 -42
  277. cartography/models/semgrep/locations.py +27 -21
  278. cartography/models/snipeit/asset.py +30 -21
  279. cartography/models/snipeit/tenant.py +6 -4
  280. cartography/models/snipeit/user.py +19 -12
  281. cartography/models/tailscale/__init__.py +0 -0
  282. cartography/models/tailscale/device.py +95 -0
  283. cartography/models/tailscale/group.py +86 -0
  284. cartography/models/tailscale/postureintegration.py +58 -0
  285. cartography/models/tailscale/tag.py +102 -0
  286. cartography/models/tailscale/tailnet.py +29 -0
  287. cartography/models/tailscale/user.py +52 -0
  288. cartography/stats.py +3 -3
  289. cartography/sync.py +113 -31
  290. cartography/util.py +84 -62
  291. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/METADATA +8 -15
  292. cartography-0.103.0.dist-info/RECORD +442 -0
  293. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/WHEEL +1 -1
  294. cartography-0.102.0rc1.dist-info/RECORD +0 -377
  295. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/entry_points.txt +0 -0
  296. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/licenses/LICENSE +0 -0
  297. {cartography-0.102.0rc1.dist-info → cartography-0.103.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,48 @@
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.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class DOProjectNodeProperties(CartographyNodeProperties):
15
+ id: PropertyRef = PropertyRef("id")
16
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
17
+ account_id: PropertyRef = PropertyRef("ACCOUNT_ID", set_in_kwargs=True)
18
+ name: PropertyRef = PropertyRef("name")
19
+ owner_uuid: PropertyRef = PropertyRef("owner_uuid")
20
+ description: PropertyRef = PropertyRef("description")
21
+ environment: PropertyRef = PropertyRef("environment")
22
+ is_default: PropertyRef = PropertyRef("is_default")
23
+ created_at: PropertyRef = PropertyRef("created_at")
24
+ updated_at: PropertyRef = PropertyRef("updated_at")
25
+
26
+
27
+ @dataclass(frozen=True)
28
+ class DOProjectToAccountRelProperties(CartographyRelProperties):
29
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ # (:DOAccount)<-[:RESOURCE]-(:DOProject)
34
+ class DOProjectToAccountRel(CartographyRelSchema):
35
+ target_node_label: str = "DOAccount"
36
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
37
+ {"id": PropertyRef("ACCOUNT_ID", set_in_kwargs=True)},
38
+ )
39
+ direction: LinkDirection = LinkDirection.OUTWARD
40
+ rel_label: str = "RESOURCE"
41
+ properties: DOProjectToAccountRelProperties = DOProjectToAccountRelProperties()
42
+
43
+
44
+ @dataclass(frozen=True)
45
+ class DOProjectSchema(CartographyNodeSchema):
46
+ label: str = "DOProject"
47
+ properties: DOProjectNodeProperties = DOProjectNodeProperties()
48
+ sub_resource_relationship: DOProjectToAccountRel = DOProjectToAccountRel()
@@ -7,11 +7,11 @@ from cartography.models.core.nodes import CartographyNodeSchema
7
7
 
8
8
  @dataclass(frozen=True)
9
9
  class DuoApiHostNodeProperties(CartographyNodeProperties):
10
- id: PropertyRef = PropertyRef('id')
11
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
10
+ id: PropertyRef = PropertyRef("id")
11
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
12
12
 
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class DuoApiHostSchema(CartographyNodeSchema):
16
- label: str = 'DuoApiHost'
16
+ label: str = "DuoApiHost"
17
17
  properties: DuoApiHostNodeProperties = DuoApiHostNodeProperties()
@@ -13,73 +13,75 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class DuoEndpointNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('epkey')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- browsers: PropertyRef = PropertyRef('browsers')
19
- computer_sid: PropertyRef = PropertyRef('computer_sid')
20
- cpu_id: PropertyRef = PropertyRef('cpu_id')
21
- device_id: PropertyRef = PropertyRef('device_id')
22
- device_identifier: PropertyRef = PropertyRef('device_identifier')
23
- device_identifier_type: PropertyRef = PropertyRef('device_identifier_type')
24
- device_name: PropertyRef = PropertyRef('device_name')
25
- device_udid: PropertyRef = PropertyRef('device_udid')
26
- device_username: PropertyRef = PropertyRef('device_username')
27
- device_username_type: PropertyRef = PropertyRef('device_username_type')
28
- disk_encryption_status: PropertyRef = PropertyRef('disk_encryption_status')
29
- domain_sid: PropertyRef = PropertyRef('domain_sid')
30
- email: PropertyRef = PropertyRef('email', extra_index=True)
31
- epkey: PropertyRef = PropertyRef('epkey', extra_index=True)
32
- firewall_status: PropertyRef = PropertyRef('firewall_status')
33
- hardware_uuid: PropertyRef = PropertyRef('hardware_uuid')
34
- health_app_client_version: PropertyRef = PropertyRef('health_app_client_version')
35
- health_data_last_collected: PropertyRef = PropertyRef('health_data_last_collected')
36
- last_updated: PropertyRef = PropertyRef('last_updated')
37
- machine_guid: PropertyRef = PropertyRef('machine_guid')
38
- model: PropertyRef = PropertyRef('model')
39
- os_build: PropertyRef = PropertyRef('os_build')
40
- os_family: PropertyRef = PropertyRef('os_family')
41
- os_version: PropertyRef = PropertyRef('os_version')
42
- password_status: PropertyRef = PropertyRef('password_status')
43
- security_agents: PropertyRef = PropertyRef('security_agents')
44
- trusted_endpoint: PropertyRef = PropertyRef('trusted_endpoint')
45
- type: PropertyRef = PropertyRef('type')
46
- username: PropertyRef = PropertyRef('username', extra_index=True)
16
+ id: PropertyRef = PropertyRef("epkey")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ browsers: PropertyRef = PropertyRef("browsers")
19
+ computer_sid: PropertyRef = PropertyRef("computer_sid")
20
+ cpu_id: PropertyRef = PropertyRef("cpu_id")
21
+ device_id: PropertyRef = PropertyRef("device_id")
22
+ device_identifier: PropertyRef = PropertyRef("device_identifier")
23
+ device_identifier_type: PropertyRef = PropertyRef("device_identifier_type")
24
+ device_name: PropertyRef = PropertyRef("device_name")
25
+ device_udid: PropertyRef = PropertyRef("device_udid")
26
+ device_username: PropertyRef = PropertyRef("device_username")
27
+ device_username_type: PropertyRef = PropertyRef("device_username_type")
28
+ disk_encryption_status: PropertyRef = PropertyRef("disk_encryption_status")
29
+ domain_sid: PropertyRef = PropertyRef("domain_sid")
30
+ email: PropertyRef = PropertyRef("email", extra_index=True)
31
+ epkey: PropertyRef = PropertyRef("epkey", extra_index=True)
32
+ firewall_status: PropertyRef = PropertyRef("firewall_status")
33
+ hardware_uuid: PropertyRef = PropertyRef("hardware_uuid")
34
+ health_app_client_version: PropertyRef = PropertyRef("health_app_client_version")
35
+ health_data_last_collected: PropertyRef = PropertyRef("health_data_last_collected")
36
+ last_updated: PropertyRef = PropertyRef("last_updated")
37
+ machine_guid: PropertyRef = PropertyRef("machine_guid")
38
+ model: PropertyRef = PropertyRef("model")
39
+ os_build: PropertyRef = PropertyRef("os_build")
40
+ os_family: PropertyRef = PropertyRef("os_family")
41
+ os_version: PropertyRef = PropertyRef("os_version")
42
+ password_status: PropertyRef = PropertyRef("password_status")
43
+ security_agents: PropertyRef = PropertyRef("security_agents")
44
+ trusted_endpoint: PropertyRef = PropertyRef("trusted_endpoint")
45
+ type: PropertyRef = PropertyRef("type")
46
+ username: PropertyRef = PropertyRef("username", extra_index=True)
47
47
 
48
48
 
49
49
  @dataclass(frozen=True)
50
50
  class DuoEndpointToDuoApiHostRelProperties(CartographyRelProperties):
51
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
51
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
52
52
 
53
53
 
54
54
  @dataclass(frozen=True)
55
55
  class DuoEndpointToDuoApiHostRel(CartographyRelSchema):
56
- target_node_label: str = 'DuoApiHost'
56
+ target_node_label: str = "DuoApiHost"
57
57
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
58
- {'id': PropertyRef('DUO_API_HOSTNAME', set_in_kwargs=True)},
58
+ {"id": PropertyRef("DUO_API_HOSTNAME", set_in_kwargs=True)},
59
59
  )
60
60
  direction: LinkDirection = LinkDirection.INWARD
61
61
  rel_label: str = "RESOURCE"
62
- properties: DuoEndpointToDuoApiHostRelProperties = DuoEndpointToDuoApiHostRelProperties()
62
+ properties: DuoEndpointToDuoApiHostRelProperties = (
63
+ DuoEndpointToDuoApiHostRelProperties()
64
+ )
63
65
 
64
66
 
65
- class DuoEndpointToDuoUserProperties(CartographyRelProperties):
66
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
67
+ class DuoEndpointToDuoUserRelProperties(CartographyRelProperties):
68
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
67
69
 
68
70
 
69
71
  @dataclass(frozen=True)
70
72
  class DuoEndpointToDuoUserRel(CartographyRelSchema):
71
- target_node_label: str = 'DuoUser'
73
+ target_node_label: str = "DuoUser"
72
74
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
73
- {'email': PropertyRef('email')},
75
+ {"email": PropertyRef("email")},
74
76
  )
75
77
  direction: LinkDirection = LinkDirection.INWARD
76
78
  rel_label: str = "HAS_DUO_ENDPOINT"
77
- properties: DuoEndpointToDuoUserProperties = DuoEndpointToDuoUserProperties()
79
+ properties: DuoEndpointToDuoUserRelProperties = DuoEndpointToDuoUserRelProperties()
78
80
 
79
81
 
80
82
  @dataclass(frozen=True)
81
83
  class DuoEndpointSchema(CartographyNodeSchema):
82
- label: str = 'DuoEndpoint'
84
+ label: str = "DuoEndpoint"
83
85
  properties: DuoEndpointNodeProperties = DuoEndpointNodeProperties()
84
86
  sub_resource_relationship: DuoEndpointToDuoApiHostRel = DuoEndpointToDuoApiHostRel()
85
87
  other_relationships: OtherRelationships = OtherRelationships(
@@ -12,28 +12,28 @@ from cartography.models.core.relationships import TargetNodeMatcher
12
12
 
13
13
  @dataclass(frozen=True)
14
14
  class DuoGroupNodeProperties(CartographyNodeProperties):
15
- id: PropertyRef = PropertyRef('group_id')
16
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
17
- desc: PropertyRef = PropertyRef('desc')
18
- group_id: PropertyRef = PropertyRef('group_id', extra_index=True)
19
- mobile_otp_enabled: PropertyRef = PropertyRef('mobile_otp_enabled')
20
- name: PropertyRef = PropertyRef('name', extra_index=True)
21
- push_enabled: PropertyRef = PropertyRef('push_enabled')
22
- sms_enabled: PropertyRef = PropertyRef('sms_enabled')
23
- status: PropertyRef = PropertyRef('status')
24
- voice_enabled: PropertyRef = PropertyRef('voice_enabled')
15
+ id: PropertyRef = PropertyRef("group_id")
16
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
17
+ desc: PropertyRef = PropertyRef("desc")
18
+ group_id: PropertyRef = PropertyRef("group_id", extra_index=True)
19
+ mobile_otp_enabled: PropertyRef = PropertyRef("mobile_otp_enabled")
20
+ name: PropertyRef = PropertyRef("name", extra_index=True)
21
+ push_enabled: PropertyRef = PropertyRef("push_enabled")
22
+ sms_enabled: PropertyRef = PropertyRef("sms_enabled")
23
+ status: PropertyRef = PropertyRef("status")
24
+ voice_enabled: PropertyRef = PropertyRef("voice_enabled")
25
25
 
26
26
 
27
27
  @dataclass(frozen=True)
28
28
  class DuoGroupToDuoApiHostRelProperties(CartographyRelProperties):
29
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
29
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
30
30
 
31
31
 
32
32
  @dataclass(frozen=True)
33
33
  class DuoGroupToDuoApiHostRel(CartographyRelSchema):
34
- target_node_label: str = 'DuoApiHost'
34
+ target_node_label: str = "DuoApiHost"
35
35
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
36
- {'id': PropertyRef('DUO_API_HOSTNAME', set_in_kwargs=True)},
36
+ {"id": PropertyRef("DUO_API_HOSTNAME", set_in_kwargs=True)},
37
37
  )
38
38
  direction: LinkDirection = LinkDirection.INWARD
39
39
  rel_label: str = "RESOURCE"
@@ -42,6 +42,6 @@ class DuoGroupToDuoApiHostRel(CartographyRelSchema):
42
42
 
43
43
  @dataclass(frozen=True)
44
44
  class DuoGroupSchema(CartographyNodeSchema):
45
- label: str = 'DuoGroup'
45
+ label: str = "DuoGroup"
46
46
  properties: DuoGroupNodeProperties = DuoGroupNodeProperties()
47
47
  sub_resource_relationship: DuoGroupToDuoApiHostRel = DuoGroupToDuoApiHostRel()
@@ -13,60 +13,60 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class DuoPhoneNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('phone_id')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- activated: PropertyRef = PropertyRef('activated')
19
- capabilities: PropertyRef = PropertyRef('capabilities')
20
- encrypted: PropertyRef = PropertyRef('encrypted')
21
- extension: PropertyRef = PropertyRef('extension')
22
- fingerprint: PropertyRef = PropertyRef('fingerprint')
23
- last_seen: PropertyRef = PropertyRef('last_seen')
24
- model: PropertyRef = PropertyRef('model')
25
- name: PropertyRef = PropertyRef('name')
26
- phone_id: PropertyRef = PropertyRef('phone_id', extra_index=True)
27
- platform: PropertyRef = PropertyRef('platform')
28
- postdelay: PropertyRef = PropertyRef('postdelay')
29
- predelay: PropertyRef = PropertyRef('predelay')
30
- screenlock: PropertyRef = PropertyRef('screenlock')
31
- sms_passcodes_sent: PropertyRef = PropertyRef('sms_passcodes_sent')
32
- tampered: PropertyRef = PropertyRef('tampered')
33
- type: PropertyRef = PropertyRef('type')
16
+ id: PropertyRef = PropertyRef("phone_id")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ activated: PropertyRef = PropertyRef("activated")
19
+ capabilities: PropertyRef = PropertyRef("capabilities")
20
+ encrypted: PropertyRef = PropertyRef("encrypted")
21
+ extension: PropertyRef = PropertyRef("extension")
22
+ fingerprint: PropertyRef = PropertyRef("fingerprint")
23
+ last_seen: PropertyRef = PropertyRef("last_seen")
24
+ model: PropertyRef = PropertyRef("model")
25
+ name: PropertyRef = PropertyRef("name")
26
+ phone_id: PropertyRef = PropertyRef("phone_id", extra_index=True)
27
+ platform: PropertyRef = PropertyRef("platform")
28
+ postdelay: PropertyRef = PropertyRef("postdelay")
29
+ predelay: PropertyRef = PropertyRef("predelay")
30
+ screenlock: PropertyRef = PropertyRef("screenlock")
31
+ sms_passcodes_sent: PropertyRef = PropertyRef("sms_passcodes_sent")
32
+ tampered: PropertyRef = PropertyRef("tampered")
33
+ type: PropertyRef = PropertyRef("type")
34
34
 
35
35
 
36
36
  @dataclass(frozen=True)
37
37
  class DuoPhoneToDuoApiHostRelProperties(CartographyRelProperties):
38
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
38
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
39
39
 
40
40
 
41
41
  @dataclass(frozen=True)
42
42
  class DuoPhoneToDuoApiHostRel(CartographyRelSchema):
43
- target_node_label: str = 'DuoApiHost'
43
+ target_node_label: str = "DuoApiHost"
44
44
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
45
- {'id': PropertyRef('DUO_API_HOSTNAME', set_in_kwargs=True)},
45
+ {"id": PropertyRef("DUO_API_HOSTNAME", set_in_kwargs=True)},
46
46
  )
47
47
  direction: LinkDirection = LinkDirection.INWARD
48
48
  rel_label: str = "RESOURCE"
49
49
  properties: DuoPhoneToDuoApiHostRelProperties = DuoPhoneToDuoApiHostRelProperties()
50
50
 
51
51
 
52
- class DuoPhoneToDuoUserProperties(CartographyRelProperties):
53
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
52
+ class DuoPhoneToDuoUserRelProperties(CartographyRelProperties):
53
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
54
54
 
55
55
 
56
56
  @dataclass(frozen=True)
57
57
  class DuoPhoneToDuoUserRel(CartographyRelSchema):
58
- target_node_label: str = 'DuoUser'
58
+ target_node_label: str = "DuoUser"
59
59
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
60
- {'user_id': PropertyRef('user_id')},
60
+ {"user_id": PropertyRef("user_id")},
61
61
  )
62
62
  direction: LinkDirection = LinkDirection.INWARD
63
63
  rel_label: str = "HAS_DUO_PHONE"
64
- properties: DuoPhoneToDuoUserProperties = DuoPhoneToDuoUserProperties()
64
+ properties: DuoPhoneToDuoUserRelProperties = DuoPhoneToDuoUserRelProperties()
65
65
 
66
66
 
67
67
  @dataclass(frozen=True)
68
68
  class DuoPhoneSchema(CartographyNodeSchema):
69
- label: str = 'DuoPhone'
69
+ label: str = "DuoPhone"
70
70
  properties: DuoPhoneNodeProperties = DuoPhoneNodeProperties()
71
71
  sub_resource_relationship: DuoPhoneToDuoApiHostRel = DuoPhoneToDuoApiHostRel()
72
72
  other_relationships: OtherRelationships = OtherRelationships(
@@ -13,49 +13,49 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class DuoTokenNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('token_id')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- admins: PropertyRef = PropertyRef('admins')
19
- serial: PropertyRef = PropertyRef('serial', extra_index=True)
20
- token_id: PropertyRef = PropertyRef('token_id', extra_index=True)
21
- totp_step: PropertyRef = PropertyRef('totp_step')
22
- type: PropertyRef = PropertyRef('type')
16
+ id: PropertyRef = PropertyRef("token_id")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ admins: PropertyRef = PropertyRef("admins")
19
+ serial: PropertyRef = PropertyRef("serial", extra_index=True)
20
+ token_id: PropertyRef = PropertyRef("token_id", extra_index=True)
21
+ totp_step: PropertyRef = PropertyRef("totp_step")
22
+ type: PropertyRef = PropertyRef("type")
23
23
 
24
24
 
25
25
  @dataclass(frozen=True)
26
26
  class DuoTokenToDuoApiHostRelProperties(CartographyRelProperties):
27
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
27
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
28
28
 
29
29
 
30
30
  @dataclass(frozen=True)
31
31
  class DuoTokenToDuoApiHostRel(CartographyRelSchema):
32
- target_node_label: str = 'DuoApiHost'
32
+ target_node_label: str = "DuoApiHost"
33
33
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
34
- {'id': PropertyRef('DUO_API_HOSTNAME', set_in_kwargs=True)},
34
+ {"id": PropertyRef("DUO_API_HOSTNAME", set_in_kwargs=True)},
35
35
  )
36
36
  direction: LinkDirection = LinkDirection.INWARD
37
37
  rel_label: str = "RESOURCE"
38
38
  properties: DuoTokenToDuoApiHostRelProperties = DuoTokenToDuoApiHostRelProperties()
39
39
 
40
40
 
41
- class DuoTokenToDuoUserProperties(CartographyRelProperties):
42
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
41
+ class DuoTokenToDuoUserRelProperties(CartographyRelProperties):
42
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
43
43
 
44
44
 
45
45
  @dataclass(frozen=True)
46
46
  class DuoTokenToDuoUserRel(CartographyRelSchema):
47
- target_node_label: str = 'DuoUser'
47
+ target_node_label: str = "DuoUser"
48
48
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
49
- {'user_id': PropertyRef('user_id')},
49
+ {"user_id": PropertyRef("user_id")},
50
50
  )
51
51
  direction: LinkDirection = LinkDirection.INWARD
52
52
  rel_label: str = "HAS_DUO_TOKEN"
53
- properties: DuoTokenToDuoUserProperties = DuoTokenToDuoUserProperties()
53
+ properties: DuoTokenToDuoUserRelProperties = DuoTokenToDuoUserRelProperties()
54
54
 
55
55
 
56
56
  @dataclass(frozen=True)
57
57
  class DuoTokenSchema(CartographyNodeSchema):
58
- label: str = 'DuoToken'
58
+ label: str = "DuoToken"
59
59
  properties: DuoTokenNodeProperties = DuoTokenNodeProperties()
60
60
  sub_resource_relationship: DuoTokenToDuoApiHostRel = DuoTokenToDuoApiHostRel()
61
61
  other_relationships: OtherRelationships = OtherRelationships(
@@ -13,39 +13,39 @@ from cartography.models.core.relationships import TargetNodeMatcher
13
13
 
14
14
  @dataclass(frozen=True)
15
15
  class DuoUserNodeProperties(CartographyNodeProperties):
16
- id: PropertyRef = PropertyRef('user_id')
17
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
- alias1: PropertyRef = PropertyRef('alias1')
19
- alias2: PropertyRef = PropertyRef('alias2')
20
- alias3: PropertyRef = PropertyRef('alias3')
21
- alias4: PropertyRef = PropertyRef('alias4')
22
- aliases: PropertyRef = PropertyRef('aliases')
23
- created: PropertyRef = PropertyRef('created')
24
- desktoptokens: PropertyRef = PropertyRef('desktoptokens')
25
- email: PropertyRef = PropertyRef('email', extra_index=True)
26
- firstname: PropertyRef = PropertyRef('firstname')
27
- is_enrolled: PropertyRef = PropertyRef('is_enrolled')
28
- last_directory_sync: PropertyRef = PropertyRef('last_directory_sync')
29
- last_login: PropertyRef = PropertyRef('last_login')
30
- lastname: PropertyRef = PropertyRef('lastname')
31
- notes: PropertyRef = PropertyRef('notes')
32
- realname: PropertyRef = PropertyRef('realname')
33
- status: PropertyRef = PropertyRef('status')
34
- u2ftokens: PropertyRef = PropertyRef('u2ftokens')
35
- user_id: PropertyRef = PropertyRef('user_id', extra_index=True)
36
- username: PropertyRef = PropertyRef('username', extra_index=True)
16
+ id: PropertyRef = PropertyRef("user_id")
17
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
18
+ alias1: PropertyRef = PropertyRef("alias1")
19
+ alias2: PropertyRef = PropertyRef("alias2")
20
+ alias3: PropertyRef = PropertyRef("alias3")
21
+ alias4: PropertyRef = PropertyRef("alias4")
22
+ aliases: PropertyRef = PropertyRef("aliases")
23
+ created: PropertyRef = PropertyRef("created")
24
+ desktoptokens: PropertyRef = PropertyRef("desktoptokens")
25
+ email: PropertyRef = PropertyRef("email", extra_index=True)
26
+ firstname: PropertyRef = PropertyRef("firstname")
27
+ is_enrolled: PropertyRef = PropertyRef("is_enrolled")
28
+ last_directory_sync: PropertyRef = PropertyRef("last_directory_sync")
29
+ last_login: PropertyRef = PropertyRef("last_login")
30
+ lastname: PropertyRef = PropertyRef("lastname")
31
+ notes: PropertyRef = PropertyRef("notes")
32
+ realname: PropertyRef = PropertyRef("realname")
33
+ status: PropertyRef = PropertyRef("status")
34
+ u2ftokens: PropertyRef = PropertyRef("u2ftokens")
35
+ user_id: PropertyRef = PropertyRef("user_id", extra_index=True)
36
+ username: PropertyRef = PropertyRef("username", extra_index=True)
37
37
 
38
38
 
39
39
  @dataclass(frozen=True)
40
40
  class DuoUserToDuoApiHostRelProperties(CartographyRelProperties):
41
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
41
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
42
42
 
43
43
 
44
44
  @dataclass(frozen=True)
45
45
  class DuoUserToDuoApiHostRel(CartographyRelSchema):
46
- target_node_label: str = 'DuoApiHost'
46
+ target_node_label: str = "DuoApiHost"
47
47
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
48
- {'id': PropertyRef('DUO_API_HOSTNAME', set_in_kwargs=True)},
48
+ {"id": PropertyRef("DUO_API_HOSTNAME", set_in_kwargs=True)},
49
49
  )
50
50
  direction: LinkDirection = LinkDirection.INWARD
51
51
  rel_label: str = "RESOURCE"
@@ -53,29 +53,31 @@ class DuoUserToDuoApiHostRel(CartographyRelSchema):
53
53
 
54
54
 
55
55
  class DuoWebAuthnCredentialToDuoUserRelProperties(CartographyRelProperties):
56
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
56
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
57
57
 
58
58
 
59
59
  @dataclass(frozen=True)
60
60
  class DuoWebAuthnCredentialToDuoUserRel(CartographyRelSchema):
61
- target_node_label: str = 'DuoWebAuthnCredential'
61
+ target_node_label: str = "DuoWebAuthnCredential"
62
62
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
63
- {'webauthnkey': PropertyRef('webauthnkey')},
63
+ {"webauthnkey": PropertyRef("webauthnkey")},
64
64
  )
65
65
  direction: LinkDirection = LinkDirection.OUTWARD
66
66
  rel_label: str = "HAS_DUO_WEB_AUTHN_CREDENTIAL"
67
- properties: DuoWebAuthnCredentialToDuoUserRelProperties = DuoWebAuthnCredentialToDuoUserRelProperties()
67
+ properties: DuoWebAuthnCredentialToDuoUserRelProperties = (
68
+ DuoWebAuthnCredentialToDuoUserRelProperties()
69
+ )
68
70
 
69
71
 
70
72
  class DuoTokenToDuoUserRelProperties(CartographyRelProperties):
71
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
73
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
72
74
 
73
75
 
74
76
  @dataclass(frozen=True)
75
77
  class DuoTokenToDuoUserRel(CartographyRelSchema):
76
- target_node_label: str = 'DuoToken'
78
+ target_node_label: str = "DuoToken"
77
79
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
78
- {'token_id': PropertyRef('token_id')},
80
+ {"token_id": PropertyRef("token_id")},
79
81
  )
80
82
  direction: LinkDirection = LinkDirection.OUTWARD
81
83
  rel_label: str = "HAS_DUO_TOKEN"
@@ -83,14 +85,14 @@ class DuoTokenToDuoUserRel(CartographyRelSchema):
83
85
 
84
86
 
85
87
  class DuoPhoneToDuoUserRelProperties(CartographyRelProperties):
86
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
88
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
87
89
 
88
90
 
89
91
  @dataclass(frozen=True)
90
92
  class DuoPhoneToDuoUserRel(CartographyRelSchema):
91
- target_node_label: str = 'DuoPhone'
93
+ target_node_label: str = "DuoPhone"
92
94
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
93
- {'phone_id': PropertyRef('phone_id')},
95
+ {"phone_id": PropertyRef("phone_id")},
94
96
  )
95
97
  direction: LinkDirection = LinkDirection.OUTWARD
96
98
  rel_label: str = "HAS_DUO_PHONE"
@@ -98,14 +100,14 @@ class DuoPhoneToDuoUserRel(CartographyRelSchema):
98
100
 
99
101
 
100
102
  class DuoEndpointToDuoUserRelProperties(CartographyRelProperties):
101
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
103
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
102
104
 
103
105
 
104
106
  @dataclass(frozen=True)
105
107
  class DuoEndpointToDuoUserRel(CartographyRelSchema):
106
- target_node_label: str = 'DuoEndpoint'
108
+ target_node_label: str = "DuoEndpoint"
107
109
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
108
- {'email': PropertyRef('email')},
110
+ {"email": PropertyRef("email")},
109
111
  )
110
112
  direction: LinkDirection = LinkDirection.OUTWARD
111
113
  rel_label: str = "HAS_DUO_ENDPOINT"
@@ -113,14 +115,14 @@ class DuoEndpointToDuoUserRel(CartographyRelSchema):
113
115
 
114
116
 
115
117
  class DuoGroupToDuoUserRelProperties(CartographyRelProperties):
116
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
118
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
117
119
 
118
120
 
119
121
  @dataclass(frozen=True)
120
122
  class DuoGroupToDuoUserRel(CartographyRelSchema):
121
- target_node_label: str = 'DuoGroup'
123
+ target_node_label: str = "DuoGroup"
122
124
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
123
- {'group_id': PropertyRef('group_id')},
125
+ {"group_id": PropertyRef("group_id")},
124
126
  )
125
127
  direction: LinkDirection = LinkDirection.OUTWARD
126
128
  rel_label: str = "MEMBER_OF_DUO_GROUP"
@@ -129,15 +131,15 @@ class DuoGroupToDuoUserRel(CartographyRelSchema):
129
131
 
130
132
  @dataclass(frozen=True)
131
133
  class DuoUserToHumanRelProperties(CartographyRelProperties):
132
- lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
134
+ lastupdated: PropertyRef = PropertyRef("lastupdated", set_in_kwargs=True)
133
135
 
134
136
 
135
137
  @dataclass(frozen=True)
136
138
  # (:DuoUser)<-[:IDENTITY_DUO]-(:Human)
137
139
  class DuoUserToHumanRel(CartographyRelSchema):
138
- target_node_label: str = 'Human'
140
+ target_node_label: str = "Human"
139
141
  target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
140
- {'email': PropertyRef('email')},
142
+ {"email": PropertyRef("email")},
141
143
  )
142
144
  direction: LinkDirection = LinkDirection.INWARD
143
145
  rel_label: str = "IDENTITY_DUO"
@@ -146,7 +148,7 @@ class DuoUserToHumanRel(CartographyRelSchema):
146
148
 
147
149
  @dataclass(frozen=True)
148
150
  class DuoUserSchema(CartographyNodeSchema):
149
- label: str = 'DuoUser'
151
+ label: str = "DuoUser"
150
152
  properties: DuoUserNodeProperties = DuoUserNodeProperties()
151
153
  sub_resource_relationship: DuoUserToDuoApiHostRel = DuoUserToDuoApiHostRel()
152
154
  other_relationships: OtherRelationships = OtherRelationships(