freemyid 0.2.0.dev1__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.
Files changed (100) hide show
  1. freemyid/__init__.py +2 -0
  2. freemyid/_data/brokers/LICENSE-DATA.md +28 -0
  3. freemyid/_data/brokers/registry.sample.yaml +674 -0
  4. freemyid/_data/brokers/state_laws.yaml +448 -0
  5. freemyid/_data/schema/registry.schema.json +668 -0
  6. freemyid/_data/schema/setup-config.schema.json +538 -0
  7. freemyid/_data/schema/state_laws.schema.json +222 -0
  8. freemyid/cli.py +725 -0
  9. freemyid/cli_json.py +198 -0
  10. freemyid/config.py +43 -0
  11. freemyid/consent.py +82 -0
  12. freemyid/crypto.py +197 -0
  13. freemyid/doctor.py +374 -0
  14. freemyid/engine/__init__.py +0 -0
  15. freemyid/engine/_dev/__init__.py +101 -0
  16. freemyid/engine/_dev/devrun.py +101 -0
  17. freemyid/engine/_dev/inbox/devauto.eml +7 -0
  18. freemyid/engine/_dev/registry.yaml +106 -0
  19. freemyid/engine/_dev/site/devauto.example/confirm.html +1 -0
  20. freemyid/engine/_dev/site/devauto.example/name/jane-testperson/il.html +17 -0
  21. freemyid/engine/_dev/site/devauto.example/name/jane-testperson/nc.html +4 -0
  22. freemyid/engine/_dev/site/devauto.example/name/jane-testperson/oh.html +4 -0
  23. freemyid/engine/_dev/site/devauto.example/optout/done.html +1 -0
  24. freemyid/engine/_dev/site/devauto.example/optout.html +6 -0
  25. freemyid/engine/_dev/site/devblocked.example/name/jane-testperson/il.html +3 -0
  26. freemyid/engine/_dev/site/devblocked.example/optout.html +3 -0
  27. freemyid/engine/_dev/site/devfill.example/ajax.html +20 -0
  28. freemyid/engine/_dev/site/devfill.example/aria.html +16 -0
  29. freemyid/engine/_dev/site/devfill.example/consent.html +20 -0
  30. freemyid/engine/_dev/site/devfill.example/done.html +3 -0
  31. freemyid/engine/_dev/site/devfill.example/empty.html +1 -0
  32. freemyid/engine/_dev/site/devfill.example/fullname.html +12 -0
  33. freemyid/engine/_dev/site/devfill.example/labels.html +32 -0
  34. freemyid/engine/_dev/site/devfill.example/late.html +22 -0
  35. freemyid/engine/_dev/site/devfind.example/hostile.html +12 -0
  36. freemyid/engine/_dev/site/devfind.example/p/jane-testperson-shelbyville-il.html +6 -0
  37. freemyid/engine/_dev/site/devfind.example/p/jane-testperson-springfield-il.html +6 -0
  38. freemyid/engine/_dev/site/devfind.example/results.html +11 -0
  39. freemyid/engine/_dev/site/devfind.example/search.html +16 -0
  40. freemyid/engine/_dev/site/devweb.example/remove.html +1 -0
  41. freemyid/engine/browser.py +430 -0
  42. freemyid/engine/fill_for_me.py +630 -0
  43. freemyid/engine/filler.py +523 -0
  44. freemyid/engine/handoff.py +237 -0
  45. freemyid/engine/letters.py +125 -0
  46. freemyid/engine/listing_finder.py +538 -0
  47. freemyid/engine/mail.py +406 -0
  48. freemyid/engine/mail_tls.py +198 -0
  49. freemyid/engine/matcher.py +208 -0
  50. freemyid/engine/outbox.py +421 -0
  51. freemyid/engine/plugins.py +68 -0
  52. freemyid/engine/runner.py +791 -0
  53. freemyid/engine/tiers.py +107 -0
  54. freemyid/interfaces.py +164 -0
  55. freemyid/logging_setup.py +152 -0
  56. freemyid/models.py +700 -0
  57. freemyid/netpolicy.py +145 -0
  58. freemyid/notify.py +58 -0
  59. freemyid/paths.py +83 -0
  60. freemyid/registry.py +275 -0
  61. freemyid/scheduler/__init__.py +203 -0
  62. freemyid/scheduler/render.py +91 -0
  63. freemyid/secret_backends.py +562 -0
  64. freemyid/secrets.py +25 -0
  65. freemyid/setup_config.py +311 -0
  66. freemyid/state.py +151 -0
  67. freemyid/storage/__init__.py +3 -0
  68. freemyid/storage/db.py +394 -0
  69. freemyid/submitters/__init__.py +0 -0
  70. freemyid/submitters/assisted.py +171 -0
  71. freemyid/submitters/base.py +119 -0
  72. freemyid/submitters/email.py +40 -0
  73. freemyid/submitters/web_form.py +276 -0
  74. freemyid/templates/_identity.txt.j2 +19 -0
  75. freemyid/templates/_signature.txt.j2 +7 -0
  76. freemyid/templates/ccpa.txt.j2 +16 -0
  77. freemyid/templates/follow_up.txt.j2 +15 -0
  78. freemyid/templates/generic_removal.txt.j2 +12 -0
  79. freemyid/templates/legal_demand.txt.j2 +20 -0
  80. freemyid/templates/phone_script.txt.j2 +25 -0
  81. freemyid/templates/postal_letter.txt.j2 +20 -0
  82. freemyid/templates/state_privacy.txt.j2 +17 -0
  83. freemyid/wizard/__init__.py +0 -0
  84. freemyid/wizard/dashboard.py +401 -0
  85. freemyid/wizard/desktop.py +188 -0
  86. freemyid/wizard/draft.py +627 -0
  87. freemyid/wizard/firstrun.py +42 -0
  88. freemyid/wizard/flows.py +283 -0
  89. freemyid/wizard/report.py +86 -0
  90. freemyid/wizard/server.py +834 -0
  91. freemyid/wizard/static/__init__.py +0 -0
  92. freemyid/wizard/static/app.js +98 -0
  93. freemyid/wizard/static/freemyid.png +0 -0
  94. freemyid/wizard/static/style.css +85 -0
  95. freemyid/wizard/ui.py +343 -0
  96. freemyid-0.2.0.dev1.dist-info/METADATA +396 -0
  97. freemyid-0.2.0.dev1.dist-info/RECORD +100 -0
  98. freemyid-0.2.0.dev1.dist-info/WHEEL +4 -0
  99. freemyid-0.2.0.dev1.dist-info/entry_points.txt +2 -0
  100. freemyid-0.2.0.dev1.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,668 @@
1
+ {
2
+ "$defs": {
3
+ "Broker": {
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "id": {
7
+ "pattern": "^[a-z0-9_]{1,64}$",
8
+ "title": "Id",
9
+ "type": "string"
10
+ },
11
+ "name": {
12
+ "title": "Name",
13
+ "type": "string"
14
+ },
15
+ "url": {
16
+ "format": "uri",
17
+ "maxLength": 2083,
18
+ "minLength": 1,
19
+ "title": "Url",
20
+ "type": "string"
21
+ },
22
+ "category": {
23
+ "$ref": "#/$defs/BrokerCategory"
24
+ },
25
+ "domains": {
26
+ "description": "Hostnames the engine may contact",
27
+ "items": {
28
+ "type": "string"
29
+ },
30
+ "minItems": 1,
31
+ "title": "Domains",
32
+ "type": "array"
33
+ },
34
+ "search_url_pattern": {
35
+ "anyOf": [
36
+ {
37
+ "type": "string"
38
+ },
39
+ {
40
+ "type": "null"
41
+ }
42
+ ],
43
+ "default": null,
44
+ "description": "Python format string. Placeholders: {first} {last} {middle} {city} {state} {state_name} {zip} {phone}; values are slugified/URL-encoded by the engine",
45
+ "title": "Search Url Pattern"
46
+ },
47
+ "opt_out_url": {
48
+ "anyOf": [
49
+ {
50
+ "format": "uri",
51
+ "maxLength": 2083,
52
+ "minLength": 1,
53
+ "type": "string"
54
+ },
55
+ {
56
+ "type": "null"
57
+ }
58
+ ],
59
+ "default": null,
60
+ "title": "Opt Out Url"
61
+ },
62
+ "search_page_url": {
63
+ "anyOf": [
64
+ {
65
+ "format": "uri",
66
+ "maxLength": 2083,
67
+ "minLength": 1,
68
+ "type": "string"
69
+ },
70
+ {
71
+ "type": "null"
72
+ }
73
+ ],
74
+ "default": null,
75
+ "description": "Page with the people-search form, if not Broker.url (listing finder)",
76
+ "title": "Search Page Url"
77
+ },
78
+ "method": {
79
+ "$ref": "#/$defs/Method"
80
+ },
81
+ "alt_methods": {
82
+ "default": [],
83
+ "items": {
84
+ "$ref": "#/$defs/Method"
85
+ },
86
+ "title": "Alt Methods",
87
+ "type": "array"
88
+ },
89
+ "opt_out_email": {
90
+ "anyOf": [
91
+ {
92
+ "type": "string"
93
+ },
94
+ {
95
+ "type": "null"
96
+ }
97
+ ],
98
+ "default": null,
99
+ "title": "Opt Out Email"
100
+ },
101
+ "postal": {
102
+ "anyOf": [
103
+ {
104
+ "$ref": "#/$defs/PostalContact"
105
+ },
106
+ {
107
+ "type": "null"
108
+ }
109
+ ],
110
+ "default": null
111
+ },
112
+ "phone": {
113
+ "anyOf": [
114
+ {
115
+ "type": "string"
116
+ },
117
+ {
118
+ "type": "null"
119
+ }
120
+ ],
121
+ "default": null,
122
+ "title": "Phone"
123
+ },
124
+ "required_fields": {
125
+ "default": [],
126
+ "items": {
127
+ "$ref": "#/$defs/ProfileField"
128
+ },
129
+ "title": "Required Fields",
130
+ "type": "array"
131
+ },
132
+ "needs_email_verification": {
133
+ "default": false,
134
+ "title": "Needs Email Verification",
135
+ "type": "boolean"
136
+ },
137
+ "confirmation_domains": {
138
+ "default": [],
139
+ "description": "Only links on these domains are auto-clicked from IMAP",
140
+ "items": {
141
+ "type": "string"
142
+ },
143
+ "title": "Confirmation Domains",
144
+ "type": "array"
145
+ },
146
+ "has_captcha": {
147
+ "default": false,
148
+ "title": "Has Captcha",
149
+ "type": "boolean"
150
+ },
151
+ "needs_id_upload": {
152
+ "default": false,
153
+ "title": "Needs Id Upload",
154
+ "type": "boolean"
155
+ },
156
+ "typical_processing_days": {
157
+ "default": 30,
158
+ "maximum": 365,
159
+ "minimum": 0,
160
+ "title": "Typical Processing Days",
161
+ "type": "integer"
162
+ },
163
+ "recheck_interval_days": {
164
+ "default": 30,
165
+ "maximum": 365,
166
+ "minimum": 1,
167
+ "title": "Recheck Interval Days",
168
+ "type": "integer"
169
+ },
170
+ "parent_company": {
171
+ "anyOf": [
172
+ {
173
+ "type": "string"
174
+ },
175
+ {
176
+ "type": "null"
177
+ }
178
+ ],
179
+ "default": null,
180
+ "title": "Parent Company"
181
+ },
182
+ "feeds_from": {
183
+ "default": [],
184
+ "description": "Broker ids this site copies from",
185
+ "items": {
186
+ "type": "string"
187
+ },
188
+ "title": "Feeds From",
189
+ "type": "array"
190
+ },
191
+ "covered_by": {
192
+ "anyOf": [
193
+ {
194
+ "type": "string"
195
+ },
196
+ {
197
+ "type": "null"
198
+ }
199
+ ],
200
+ "default": null,
201
+ "description": "Broker id whose opt-out also removes this site (shared suppression center); engine submits once to covered_by and only re-scans this one",
202
+ "title": "Covered By"
203
+ },
204
+ "legal_basis_notes": {
205
+ "anyOf": [
206
+ {
207
+ "type": "string"
208
+ },
209
+ {
210
+ "type": "null"
211
+ }
212
+ ],
213
+ "default": null,
214
+ "title": "Legal Basis Notes"
215
+ },
216
+ "ca_registered": {
217
+ "anyOf": [
218
+ {
219
+ "type": "boolean"
220
+ },
221
+ {
222
+ "type": "null"
223
+ }
224
+ ],
225
+ "default": null,
226
+ "title": "Ca Registered"
227
+ },
228
+ "vt_registered": {
229
+ "anyOf": [
230
+ {
231
+ "type": "boolean"
232
+ },
233
+ {
234
+ "type": "null"
235
+ }
236
+ ],
237
+ "default": null,
238
+ "title": "Vt Registered"
239
+ },
240
+ "steps": {
241
+ "default": [],
242
+ "description": "Human-readable step-by-step notes",
243
+ "items": {
244
+ "type": "string"
245
+ },
246
+ "title": "Steps",
247
+ "type": "array"
248
+ },
249
+ "search": {
250
+ "anyOf": [
251
+ {
252
+ "$ref": "#/$defs/SearchSpec"
253
+ },
254
+ {
255
+ "type": "null"
256
+ }
257
+ ],
258
+ "default": null
259
+ },
260
+ "form": {
261
+ "default": [],
262
+ "items": {
263
+ "$ref": "#/$defs/FormStep"
264
+ },
265
+ "title": "Form",
266
+ "type": "array"
267
+ },
268
+ "success_text": {
269
+ "default": [],
270
+ "description": "Visible text that means the opt-out was accepted (any match). Used by 'Fill it in for me' when the form steps have no expect_text",
271
+ "items": {
272
+ "type": "string"
273
+ },
274
+ "title": "Success Text",
275
+ "type": "array"
276
+ },
277
+ "success_url_pattern": {
278
+ "anyOf": [
279
+ {
280
+ "maxLength": 200,
281
+ "type": "string"
282
+ },
283
+ {
284
+ "type": "null"
285
+ }
286
+ ],
287
+ "default": null,
288
+ "description": "Regex matched against the URL path+query after submit; a match = success",
289
+ "title": "Success Url Pattern"
290
+ },
291
+ "safe_checkboxes": {
292
+ "default": [],
293
+ "description": "CSS selectors of plain consent checkboxes 'Fill it in for me' may tick (never CAPTCHA, never marketing opt-ins). Empty = tick nothing",
294
+ "items": {
295
+ "type": "string"
296
+ },
297
+ "title": "Safe Checkboxes",
298
+ "type": "array"
299
+ },
300
+ "listing_url_pattern": {
301
+ "anyOf": [
302
+ {
303
+ "maxLength": 200,
304
+ "type": "string"
305
+ },
306
+ {
307
+ "type": "null"
308
+ }
309
+ ],
310
+ "default": null,
311
+ "description": "Regex matched against a listing page's URL path (listing finder)",
312
+ "title": "Listing Url Pattern"
313
+ },
314
+ "submitter": {
315
+ "anyOf": [
316
+ {
317
+ "type": "string"
318
+ },
319
+ {
320
+ "type": "null"
321
+ }
322
+ ],
323
+ "default": null,
324
+ "description": "Optional custom submitter 'module:Class'",
325
+ "title": "Submitter"
326
+ },
327
+ "source_urls": {
328
+ "default": [],
329
+ "description": "Citations for opt-out info",
330
+ "items": {
331
+ "format": "uri",
332
+ "maxLength": 2083,
333
+ "minLength": 1,
334
+ "type": "string"
335
+ },
336
+ "title": "Source Urls",
337
+ "type": "array"
338
+ },
339
+ "verification_status": {
340
+ "$ref": "#/$defs/VerificationStatus",
341
+ "default": "unverified"
342
+ },
343
+ "verification_notes": {
344
+ "anyOf": [
345
+ {
346
+ "type": "string"
347
+ },
348
+ {
349
+ "type": "null"
350
+ }
351
+ ],
352
+ "default": null,
353
+ "title": "Verification Notes"
354
+ },
355
+ "last_verified": {
356
+ "anyOf": [
357
+ {
358
+ "format": "date",
359
+ "type": "string"
360
+ },
361
+ {
362
+ "type": "null"
363
+ }
364
+ ],
365
+ "default": null,
366
+ "title": "Last Verified"
367
+ },
368
+ "priority": {
369
+ "default": 50,
370
+ "description": "Higher runs first",
371
+ "maximum": 100,
372
+ "minimum": 0,
373
+ "title": "Priority",
374
+ "type": "integer"
375
+ },
376
+ "enabled": {
377
+ "default": true,
378
+ "title": "Enabled",
379
+ "type": "boolean"
380
+ }
381
+ },
382
+ "required": [
383
+ "id",
384
+ "name",
385
+ "url",
386
+ "category",
387
+ "domains",
388
+ "method"
389
+ ],
390
+ "title": "Broker",
391
+ "type": "object"
392
+ },
393
+ "BrokerCategory": {
394
+ "enum": [
395
+ "people_search",
396
+ "background_check",
397
+ "data_broker",
398
+ "risk_data",
399
+ "family_tree",
400
+ "phone_lookup",
401
+ "other"
402
+ ],
403
+ "title": "BrokerCategory",
404
+ "type": "string"
405
+ },
406
+ "FormStep": {
407
+ "additionalProperties": false,
408
+ "description": "Declarative web-form step, so most brokers need no Python.\n\n`value` is a jinja2 template rendered with {profile, listing, mailbox, broker}.",
409
+ "properties": {
410
+ "action": {
411
+ "enum": [
412
+ "goto",
413
+ "fill",
414
+ "select",
415
+ "check",
416
+ "click",
417
+ "wait_for",
418
+ "screenshot",
419
+ "submit",
420
+ "expect_text",
421
+ "human"
422
+ ],
423
+ "title": "Action",
424
+ "type": "string"
425
+ },
426
+ "selector": {
427
+ "anyOf": [
428
+ {
429
+ "type": "string"
430
+ },
431
+ {
432
+ "type": "null"
433
+ }
434
+ ],
435
+ "default": null,
436
+ "title": "Selector"
437
+ },
438
+ "value": {
439
+ "anyOf": [
440
+ {
441
+ "type": "string"
442
+ },
443
+ {
444
+ "type": "null"
445
+ }
446
+ ],
447
+ "default": null,
448
+ "title": "Value"
449
+ },
450
+ "url": {
451
+ "anyOf": [
452
+ {
453
+ "type": "string"
454
+ },
455
+ {
456
+ "type": "null"
457
+ }
458
+ ],
459
+ "default": null,
460
+ "title": "Url"
461
+ },
462
+ "timeout_ms": {
463
+ "default": 15000,
464
+ "title": "Timeout Ms",
465
+ "type": "integer"
466
+ },
467
+ "note": {
468
+ "anyOf": [
469
+ {
470
+ "type": "string"
471
+ },
472
+ {
473
+ "type": "null"
474
+ }
475
+ ],
476
+ "default": null,
477
+ "title": "Note"
478
+ }
479
+ },
480
+ "required": [
481
+ "action"
482
+ ],
483
+ "title": "FormStep",
484
+ "type": "object"
485
+ },
486
+ "Method": {
487
+ "enum": [
488
+ "web_form",
489
+ "email",
490
+ "postal",
491
+ "phone",
492
+ "account_required"
493
+ ],
494
+ "title": "Method",
495
+ "type": "string"
496
+ },
497
+ "PostalContact": {
498
+ "additionalProperties": false,
499
+ "properties": {
500
+ "recipient": {
501
+ "title": "Recipient",
502
+ "type": "string"
503
+ },
504
+ "lines": {
505
+ "items": {
506
+ "type": "string"
507
+ },
508
+ "title": "Lines",
509
+ "type": "array"
510
+ }
511
+ },
512
+ "required": [
513
+ "recipient",
514
+ "lines"
515
+ ],
516
+ "title": "PostalContact",
517
+ "type": "object"
518
+ },
519
+ "ProfileField": {
520
+ "description": "Profile data a broker's opt-out may require.",
521
+ "enum": [
522
+ "full_name",
523
+ "first_name",
524
+ "last_name",
525
+ "middle_name",
526
+ "city",
527
+ "state",
528
+ "zip",
529
+ "street_address",
530
+ "age",
531
+ "dob",
532
+ "phone",
533
+ "email",
534
+ "listing_url",
535
+ "id_document"
536
+ ],
537
+ "title": "ProfileField",
538
+ "type": "string"
539
+ },
540
+ "SearchSpec": {
541
+ "additionalProperties": false,
542
+ "description": "How to find listings. Selectors are CSS; all optional so researcher can fill later.",
543
+ "properties": {
544
+ "result_selector": {
545
+ "anyOf": [
546
+ {
547
+ "type": "string"
548
+ },
549
+ {
550
+ "type": "null"
551
+ }
552
+ ],
553
+ "default": null,
554
+ "title": "Result Selector"
555
+ },
556
+ "name_selector": {
557
+ "anyOf": [
558
+ {
559
+ "type": "string"
560
+ },
561
+ {
562
+ "type": "null"
563
+ }
564
+ ],
565
+ "default": null,
566
+ "title": "Name Selector"
567
+ },
568
+ "age_selector": {
569
+ "anyOf": [
570
+ {
571
+ "type": "string"
572
+ },
573
+ {
574
+ "type": "null"
575
+ }
576
+ ],
577
+ "default": null,
578
+ "title": "Age Selector"
579
+ },
580
+ "location_selector": {
581
+ "anyOf": [
582
+ {
583
+ "type": "string"
584
+ },
585
+ {
586
+ "type": "null"
587
+ }
588
+ ],
589
+ "default": null,
590
+ "title": "Location Selector"
591
+ },
592
+ "relatives_selector": {
593
+ "anyOf": [
594
+ {
595
+ "type": "string"
596
+ },
597
+ {
598
+ "type": "null"
599
+ }
600
+ ],
601
+ "default": null,
602
+ "title": "Relatives Selector"
603
+ },
604
+ "link_selector": {
605
+ "anyOf": [
606
+ {
607
+ "type": "string"
608
+ },
609
+ {
610
+ "type": "null"
611
+ }
612
+ ],
613
+ "default": null,
614
+ "title": "Link Selector"
615
+ },
616
+ "no_results_text": {
617
+ "anyOf": [
618
+ {
619
+ "type": "string"
620
+ },
621
+ {
622
+ "type": "null"
623
+ }
624
+ ],
625
+ "default": null,
626
+ "title": "No Results Text"
627
+ }
628
+ },
629
+ "title": "SearchSpec",
630
+ "type": "object"
631
+ },
632
+ "VerificationStatus": {
633
+ "enum": [
634
+ "verified",
635
+ "unverified",
636
+ "broken"
637
+ ],
638
+ "title": "VerificationStatus",
639
+ "type": "string"
640
+ }
641
+ },
642
+ "additionalProperties": false,
643
+ "properties": {
644
+ "version": {
645
+ "title": "Version",
646
+ "type": "string"
647
+ },
648
+ "updated": {
649
+ "format": "date",
650
+ "title": "Updated",
651
+ "type": "string"
652
+ },
653
+ "brokers": {
654
+ "items": {
655
+ "$ref": "#/$defs/Broker"
656
+ },
657
+ "title": "Brokers",
658
+ "type": "array"
659
+ }
660
+ },
661
+ "required": [
662
+ "version",
663
+ "updated",
664
+ "brokers"
665
+ ],
666
+ "title": "Registry",
667
+ "type": "object"
668
+ }