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,538 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://freemyid.org/schema/setup-config.schema.json",
4
+ "$defs": {
5
+ "SetupAddress": {
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "street": {
9
+ "anyOf": [
10
+ {
11
+ "type": "string"
12
+ },
13
+ {
14
+ "type": "null"
15
+ }
16
+ ],
17
+ "default": null,
18
+ "title": "Street"
19
+ },
20
+ "city": {
21
+ "minLength": 1,
22
+ "title": "City",
23
+ "type": "string"
24
+ },
25
+ "state": {
26
+ "description": "2-letter US state, e.g. IL",
27
+ "pattern": "^[A-Za-z]{2}$",
28
+ "title": "State",
29
+ "type": "string"
30
+ },
31
+ "zip": {
32
+ "anyOf": [
33
+ {
34
+ "type": "string"
35
+ },
36
+ {
37
+ "type": "null"
38
+ }
39
+ ],
40
+ "default": null,
41
+ "title": "Zip"
42
+ },
43
+ "current": {
44
+ "default": false,
45
+ "title": "Current",
46
+ "type": "boolean"
47
+ }
48
+ },
49
+ "required": [
50
+ "city",
51
+ "state"
52
+ ],
53
+ "title": "SetupAddress",
54
+ "type": "object"
55
+ },
56
+ "SetupConsent": {
57
+ "additionalProperties": false,
58
+ "properties": {
59
+ "agreed": {
60
+ "description": "Must be true: you have read and agree to the consent text that `freemyid setup --from` prints",
61
+ "title": "Agreed",
62
+ "type": "boolean"
63
+ },
64
+ "signed_name": {
65
+ "description": "Full name of the person giving permission, typed as a signature",
66
+ "minLength": 1,
67
+ "title": "Signed Name",
68
+ "type": "string"
69
+ },
70
+ "basis": {
71
+ "default": "self",
72
+ "description": "self = I am this person; guardian_of_minor = parent or legal guardian of someone under 18; authorized_agent = signed written permission",
73
+ "enum": [
74
+ "self",
75
+ "guardian_of_minor",
76
+ "authorized_agent"
77
+ ],
78
+ "title": "Basis",
79
+ "type": "string"
80
+ },
81
+ "authorization_file": {
82
+ "anyOf": [
83
+ {
84
+ "type": "string"
85
+ },
86
+ {
87
+ "type": "null"
88
+ }
89
+ ],
90
+ "default": null,
91
+ "description": "Signed authorization form (PDF/image), required for authorized_agent. Relative paths are relative to this YAML file",
92
+ "title": "Authorization File"
93
+ }
94
+ },
95
+ "required": [
96
+ "agreed",
97
+ "signed_name"
98
+ ],
99
+ "title": "SetupConsent",
100
+ "type": "object"
101
+ },
102
+ "SetupMailbox": {
103
+ "additionalProperties": false,
104
+ "properties": {
105
+ "provider": {
106
+ "enum": [
107
+ "gmail",
108
+ "yahoo",
109
+ "icloud",
110
+ "proton_bridge",
111
+ "other"
112
+ ],
113
+ "title": "Provider",
114
+ "type": "string"
115
+ },
116
+ "address": {
117
+ "description": "The dedicated removal mailbox address",
118
+ "title": "Address",
119
+ "type": "string"
120
+ },
121
+ "username": {
122
+ "anyOf": [
123
+ {
124
+ "type": "string"
125
+ },
126
+ {
127
+ "type": "null"
128
+ }
129
+ ],
130
+ "default": null,
131
+ "description": "Login name if not the address",
132
+ "title": "Username"
133
+ },
134
+ "password_env": {
135
+ "anyOf": [
136
+ {
137
+ "type": "string"
138
+ },
139
+ {
140
+ "type": "null"
141
+ }
142
+ ],
143
+ "default": null,
144
+ "description": "Name of an environment variable holding the app password",
145
+ "title": "Password Env"
146
+ },
147
+ "password_file": {
148
+ "anyOf": [
149
+ {
150
+ "type": "string"
151
+ },
152
+ {
153
+ "type": "null"
154
+ }
155
+ ],
156
+ "default": null,
157
+ "description": "File holding the app password (first line). Keep it chmod 600",
158
+ "title": "Password File"
159
+ },
160
+ "imap_host": {
161
+ "anyOf": [
162
+ {
163
+ "type": "string"
164
+ },
165
+ {
166
+ "type": "null"
167
+ }
168
+ ],
169
+ "default": null,
170
+ "title": "Imap Host"
171
+ },
172
+ "imap_port": {
173
+ "anyOf": [
174
+ {
175
+ "maximum": 65535,
176
+ "minimum": 1,
177
+ "type": "integer"
178
+ },
179
+ {
180
+ "type": "null"
181
+ }
182
+ ],
183
+ "default": null,
184
+ "title": "Imap Port"
185
+ },
186
+ "imap_ssl": {
187
+ "anyOf": [
188
+ {
189
+ "type": "boolean"
190
+ },
191
+ {
192
+ "type": "null"
193
+ }
194
+ ],
195
+ "default": null,
196
+ "title": "Imap Ssl"
197
+ },
198
+ "imap_starttls": {
199
+ "anyOf": [
200
+ {
201
+ "type": "boolean"
202
+ },
203
+ {
204
+ "type": "null"
205
+ }
206
+ ],
207
+ "default": null,
208
+ "title": "Imap Starttls"
209
+ },
210
+ "smtp_host": {
211
+ "anyOf": [
212
+ {
213
+ "type": "string"
214
+ },
215
+ {
216
+ "type": "null"
217
+ }
218
+ ],
219
+ "default": null,
220
+ "title": "Smtp Host"
221
+ },
222
+ "smtp_port": {
223
+ "anyOf": [
224
+ {
225
+ "maximum": 65535,
226
+ "minimum": 1,
227
+ "type": "integer"
228
+ },
229
+ {
230
+ "type": "null"
231
+ }
232
+ ],
233
+ "default": null,
234
+ "title": "Smtp Port"
235
+ },
236
+ "smtp_starttls": {
237
+ "anyOf": [
238
+ {
239
+ "type": "boolean"
240
+ },
241
+ {
242
+ "type": "null"
243
+ }
244
+ ],
245
+ "default": null,
246
+ "title": "Smtp Starttls"
247
+ },
248
+ "tls_cert_sha256": {
249
+ "anyOf": [
250
+ {
251
+ "pattern": "^[0-9A-Fa-f:]{64,95}$",
252
+ "type": "string"
253
+ },
254
+ {
255
+ "type": "null"
256
+ }
257
+ ],
258
+ "default": null,
259
+ "description": "Proton Mail Bridge only: the certificate fingerprint you approved",
260
+ "title": "Tls Cert Sha256"
261
+ }
262
+ },
263
+ "required": [
264
+ "provider",
265
+ "address"
266
+ ],
267
+ "title": "SetupMailbox",
268
+ "type": "object"
269
+ },
270
+ "SetupName": {
271
+ "additionalProperties": false,
272
+ "properties": {
273
+ "first": {
274
+ "minLength": 1,
275
+ "title": "First",
276
+ "type": "string"
277
+ },
278
+ "middle": {
279
+ "anyOf": [
280
+ {
281
+ "type": "string"
282
+ },
283
+ {
284
+ "type": "null"
285
+ }
286
+ ],
287
+ "default": null,
288
+ "title": "Middle"
289
+ },
290
+ "last": {
291
+ "minLength": 1,
292
+ "title": "Last",
293
+ "type": "string"
294
+ },
295
+ "suffix": {
296
+ "anyOf": [
297
+ {
298
+ "type": "string"
299
+ },
300
+ {
301
+ "type": "null"
302
+ }
303
+ ],
304
+ "default": null,
305
+ "title": "Suffix"
306
+ }
307
+ },
308
+ "required": [
309
+ "first",
310
+ "last"
311
+ ],
312
+ "title": "SetupName",
313
+ "type": "object"
314
+ },
315
+ "SetupPermissions": {
316
+ "additionalProperties": false,
317
+ "properties": {
318
+ "allow_id_upload": {
319
+ "default": false,
320
+ "title": "Allow Id Upload",
321
+ "type": "boolean"
322
+ },
323
+ "allow_account_creation": {
324
+ "default": false,
325
+ "title": "Allow Account Creation",
326
+ "type": "boolean"
327
+ },
328
+ "allow_phone_disclosure": {
329
+ "default": false,
330
+ "title": "Allow Phone Disclosure",
331
+ "type": "boolean"
332
+ }
333
+ },
334
+ "title": "SetupPermissions",
335
+ "type": "object"
336
+ },
337
+ "SetupPerson": {
338
+ "additionalProperties": false,
339
+ "properties": {
340
+ "label": {
341
+ "anyOf": [
342
+ {
343
+ "type": "string"
344
+ },
345
+ {
346
+ "type": "null"
347
+ }
348
+ ],
349
+ "default": null,
350
+ "description": "What to call them on screen, e.g. 'Mom'. Defaults to the first name",
351
+ "title": "Label"
352
+ },
353
+ "name": {
354
+ "$ref": "#/$defs/SetupName"
355
+ },
356
+ "nicknames": {
357
+ "default": [],
358
+ "items": {
359
+ "type": "string"
360
+ },
361
+ "title": "Nicknames",
362
+ "type": "array"
363
+ },
364
+ "previous_names": {
365
+ "default": [],
366
+ "description": "Full previous/maiden names",
367
+ "items": {
368
+ "type": "string"
369
+ },
370
+ "title": "Previous Names",
371
+ "type": "array"
372
+ },
373
+ "birth_year": {
374
+ "anyOf": [
375
+ {
376
+ "minimum": 1900,
377
+ "type": "integer"
378
+ },
379
+ {
380
+ "type": "null"
381
+ }
382
+ ],
383
+ "default": null,
384
+ "description": "Only the year is kept",
385
+ "title": "Birth Year"
386
+ },
387
+ "age": {
388
+ "anyOf": [
389
+ {
390
+ "maximum": 130,
391
+ "minimum": 0,
392
+ "type": "integer"
393
+ },
394
+ {
395
+ "type": "null"
396
+ }
397
+ ],
398
+ "default": null,
399
+ "description": "If birth_year is unknown",
400
+ "title": "Age"
401
+ },
402
+ "addresses": {
403
+ "items": {
404
+ "$ref": "#/$defs/SetupAddress"
405
+ },
406
+ "maxItems": 4,
407
+ "minItems": 1,
408
+ "title": "Addresses",
409
+ "type": "array"
410
+ },
411
+ "phones": {
412
+ "default": [],
413
+ "items": {
414
+ "type": "string"
415
+ },
416
+ "title": "Phones",
417
+ "type": "array"
418
+ },
419
+ "emails": {
420
+ "default": [],
421
+ "description": "Personal emails, used only to recognize listings, never sent anywhere",
422
+ "items": {
423
+ "type": "string"
424
+ },
425
+ "title": "Emails",
426
+ "type": "array"
427
+ },
428
+ "relatives": {
429
+ "default": [],
430
+ "items": {
431
+ "type": "string"
432
+ },
433
+ "title": "Relatives",
434
+ "type": "array"
435
+ }
436
+ },
437
+ "required": [
438
+ "name",
439
+ "addresses"
440
+ ],
441
+ "title": "SetupPerson",
442
+ "type": "object"
443
+ },
444
+ "SetupSchedule": {
445
+ "additionalProperties": false,
446
+ "properties": {
447
+ "weekly_recheck": {
448
+ "default": true,
449
+ "title": "Weekly Recheck",
450
+ "type": "boolean"
451
+ },
452
+ "weekday": {
453
+ "default": 6,
454
+ "description": "0=Mon .. 6=Sun",
455
+ "maximum": 6,
456
+ "minimum": 0,
457
+ "title": "Weekday",
458
+ "type": "integer"
459
+ },
460
+ "hour": {
461
+ "default": 10,
462
+ "maximum": 23,
463
+ "minimum": 0,
464
+ "title": "Hour",
465
+ "type": "integer"
466
+ },
467
+ "install_job": {
468
+ "default": false,
469
+ "description": "Also install the background job (same as `freemyid schedule install`)",
470
+ "title": "Install Job",
471
+ "type": "boolean"
472
+ }
473
+ },
474
+ "title": "SetupSchedule",
475
+ "type": "object"
476
+ }
477
+ },
478
+ "additionalProperties": false,
479
+ "description": "Free My ID setup file, version 1. One file = one person.",
480
+ "properties": {
481
+ "version": {
482
+ "const": 1,
483
+ "description": "Setup file format version",
484
+ "title": "Version",
485
+ "type": "integer"
486
+ },
487
+ "consent": {
488
+ "$ref": "#/$defs/SetupConsent"
489
+ },
490
+ "person": {
491
+ "$ref": "#/$defs/SetupPerson"
492
+ },
493
+ "permissions": {
494
+ "$ref": "#/$defs/SetupPermissions",
495
+ "default": {
496
+ "allow_id_upload": false,
497
+ "allow_account_creation": false,
498
+ "allow_phone_disclosure": false
499
+ }
500
+ },
501
+ "mailbox": {
502
+ "anyOf": [
503
+ {
504
+ "$ref": "#/$defs/SetupMailbox"
505
+ },
506
+ {
507
+ "type": "null"
508
+ }
509
+ ],
510
+ "default": null
511
+ },
512
+ "email_mode": {
513
+ "default": "approve_each",
514
+ "enum": [
515
+ "approve_each",
516
+ "auto"
517
+ ],
518
+ "title": "Email Mode",
519
+ "type": "string"
520
+ },
521
+ "schedule": {
522
+ "$ref": "#/$defs/SetupSchedule",
523
+ "default": {
524
+ "weekly_recheck": true,
525
+ "weekday": 6,
526
+ "hour": 10,
527
+ "install_job": false
528
+ }
529
+ }
530
+ },
531
+ "required": [
532
+ "version",
533
+ "consent",
534
+ "person"
535
+ ],
536
+ "title": "SetupConfig",
537
+ "type": "object"
538
+ }