@geekity/cms 0.31.0 → 0.32.1
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.
- package/admin/components/badge.njk +4 -0
- package/admin/components/fields.njk +41 -24
- package/admin/components/job-status.njk +45 -0
- package/admin/components/setting-fields.njk +38 -0
- package/admin/layouts/settings-page.njk +16 -0
- package/admin/pages/comments/all.njk +1 -2
- package/admin/pages/documents/editor.njk +17 -15
- package/admin/pages/documents/syndication.njk +4 -4
- package/admin/pages/federation/followers.njk +56 -6
- package/admin/pages/federation/settings.njk +1 -1
- package/admin/pages/media/library.njk +52 -3
- package/admin/pages/navigation/menus.njk +2 -2
- package/admin/pages/plugins/screen.njk +5 -46
- package/admin/pages/settings/discussion.njk +76 -47
- package/admin/pages/settings/email.njk +75 -47
- package/admin/pages/settings/general.njk +15 -15
- package/admin/pages/settings/permalinks.njk +8 -8
- package/admin/pages/settings/privacy.njk +6 -6
- package/admin/pages/settings/reading.njk +36 -36
- package/admin/pages/tools/dev-mode.njk +29 -3
- package/admin/pages/tools/export.njk +89 -0
- package/admin/pages/tools/maintenance.njk +51 -0
- package/admin/pages/users/apps.njk +2 -2
- package/admin/pages/users/edit.njk +3 -3
- package/admin/pages/users/new.njk +2 -2
- package/admin/static/admin.css +80 -0
- package/dist/admin/app-activity.d.ts.map +1 -1
- package/dist/admin/app-activity.js +2 -3
- package/dist/admin/app-activity.js.map +1 -1
- package/dist/admin/appearance.d.ts +1 -5
- package/dist/admin/appearance.d.ts.map +1 -1
- package/dist/admin/appearance.js +9 -16
- package/dist/admin/appearance.js.map +1 -1
- package/dist/admin/comments.d.ts.map +1 -1
- package/dist/admin/comments.js +2 -3
- package/dist/admin/comments.js.map +1 -1
- package/dist/admin/confirm-password.d.ts +4 -0
- package/dist/admin/confirm-password.d.ts.map +1 -0
- package/dist/admin/confirm-password.js +11 -0
- package/dist/admin/confirm-password.js.map +1 -0
- package/dist/admin/connected-apps.d.ts.map +1 -1
- package/dist/admin/connected-apps.js +17 -22
- package/dist/admin/connected-apps.js.map +1 -1
- package/dist/admin/dev-mode.d.ts.map +1 -1
- package/dist/admin/dev-mode.js +35 -10
- package/dist/admin/dev-mode.js.map +1 -1
- package/dist/admin/documents.d.ts.map +1 -1
- package/dist/admin/documents.js +22 -10
- package/dist/admin/documents.js.map +1 -1
- package/dist/admin/editor-actions.d.ts.map +1 -1
- package/dist/admin/editor-actions.js +1 -2
- package/dist/admin/editor-actions.js.map +1 -1
- package/dist/admin/editor-layout.js +1 -1
- package/dist/admin/editor-layout.js.map +1 -1
- package/dist/admin/export.d.ts +10 -0
- package/dist/admin/export.d.ts.map +1 -0
- package/dist/admin/export.js +72 -0
- package/dist/admin/export.js.map +1 -0
- package/dist/admin/federation.d.ts +7 -14
- package/dist/admin/federation.d.ts.map +1 -1
- package/dist/admin/federation.js +48 -94
- package/dist/admin/federation.js.map +1 -1
- package/dist/admin/index.d.ts +2 -5
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +2 -4
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/indieauth-consent.d.ts.map +1 -1
- package/dist/admin/indieauth-consent.js +5 -7
- package/dist/admin/indieauth-consent.js.map +1 -1
- package/dist/admin/job-status.d.ts +25 -0
- package/dist/admin/job-status.d.ts.map +1 -0
- package/dist/admin/job-status.js +53 -0
- package/dist/admin/job-status.js.map +1 -0
- package/dist/admin/legacy-migrations.d.ts.map +1 -1
- package/dist/admin/legacy-migrations.js +7 -6
- package/dist/admin/legacy-migrations.js.map +1 -1
- package/dist/admin/maintenance.d.ts +9 -0
- package/dist/admin/maintenance.d.ts.map +1 -0
- package/dist/admin/maintenance.js +42 -0
- package/dist/admin/maintenance.js.map +1 -0
- package/dist/admin/media.d.ts +4 -1
- package/dist/admin/media.d.ts.map +1 -1
- package/dist/admin/media.js +16 -1
- package/dist/admin/media.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +4 -0
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/messages.d.ts.map +1 -1
- package/dist/admin/messages.js +2 -3
- package/dist/admin/messages.js.map +1 -1
- package/dist/admin/navigation.d.ts.map +1 -1
- package/dist/admin/navigation.js +27 -23
- package/dist/admin/navigation.js.map +1 -1
- package/dist/admin/plugins.d.ts.map +1 -1
- package/dist/admin/plugins.js +19 -66
- package/dist/admin/plugins.js.map +1 -1
- package/dist/admin/preview.d.ts.map +1 -1
- package/dist/admin/preview.js +5 -6
- package/dist/admin/preview.js.map +1 -1
- package/dist/admin/recovery.js +2 -2
- package/dist/admin/recovery.js.map +1 -1
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +6 -3
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/setting-overrides.d.ts +4 -0
- package/dist/admin/setting-overrides.d.ts.map +1 -0
- package/dist/admin/setting-overrides.js +24 -0
- package/dist/admin/setting-overrides.js.map +1 -0
- package/dist/admin/settings-discussion.d.ts +6 -4
- package/dist/admin/settings-discussion.d.ts.map +1 -1
- package/dist/admin/settings-discussion.js +75 -45
- package/dist/admin/settings-discussion.js.map +1 -1
- package/dist/admin/settings-email.d.ts +11 -8
- package/dist/admin/settings-email.d.ts.map +1 -1
- package/dist/admin/settings-email.js +88 -77
- package/dist/admin/settings-email.js.map +1 -1
- package/dist/admin/settings-federation.d.ts +0 -7
- package/dist/admin/settings-federation.d.ts.map +1 -1
- package/dist/admin/settings-federation.js +0 -36
- package/dist/admin/settings-federation.js.map +1 -1
- package/dist/admin/settings-fields.d.ts +32 -0
- package/dist/admin/settings-fields.d.ts.map +1 -0
- package/dist/admin/settings-fields.js +368 -0
- package/dist/admin/settings-fields.js.map +1 -0
- package/dist/admin/settings-general.d.ts.map +1 -1
- package/dist/admin/settings-general.js +10 -19
- package/dist/admin/settings-general.js.map +1 -1
- package/dist/admin/settings-page.d.ts +3 -29
- package/dist/admin/settings-page.d.ts.map +1 -1
- package/dist/admin/settings-page.js +38 -53
- package/dist/admin/settings-page.js.map +1 -1
- package/dist/admin/settings-permalinks.js +2 -2
- package/dist/admin/settings-permalinks.js.map +1 -1
- package/dist/admin/settings-privacy.js +1 -1
- package/dist/admin/settings-privacy.js.map +1 -1
- package/dist/admin/settings-reading.js +13 -13
- package/dist/admin/settings-reading.js.map +1 -1
- package/dist/admin/settings-renderer.d.ts +32 -0
- package/dist/admin/settings-renderer.d.ts.map +1 -0
- package/dist/admin/settings-renderer.js +79 -0
- package/dist/admin/settings-renderer.js.map +1 -0
- package/dist/admin/site-setting-edit.d.ts +4 -0
- package/dist/admin/site-setting-edit.d.ts.map +1 -0
- package/dist/admin/site-setting-edit.js +20 -0
- package/dist/admin/site-setting-edit.js.map +1 -0
- package/dist/admin/taxonomy.d.ts.map +1 -1
- package/dist/admin/taxonomy.js +10 -19
- package/dist/admin/taxonomy.js.map +1 -1
- package/dist/admin/templates.d.ts +2 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +2 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/admin/users.js +1 -1
- package/dist/admin/users.js.map +1 -1
- package/dist/avatars/avatars.d.ts +0 -2
- package/dist/avatars/avatars.d.ts.map +1 -1
- package/dist/avatars/avatars.js +9 -10
- package/dist/avatars/avatars.js.map +1 -1
- package/dist/avatars/index.d.ts +1 -1
- package/dist/avatars/index.d.ts.map +1 -1
- package/dist/avatars/index.js +1 -1
- package/dist/avatars/index.js.map +1 -1
- package/dist/cache.d.ts +0 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +2 -4
- package/dist/cache.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +500 -86
- package/dist/cli.js.map +1 -1
- package/dist/cms/app.d.ts +1 -1
- package/dist/cms/app.d.ts.map +1 -1
- package/dist/cms/app.js +13 -2
- package/dist/cms/app.js.map +1 -1
- package/dist/cms/boot.d.ts +12 -0
- package/dist/cms/boot.d.ts.map +1 -1
- package/dist/cms/boot.js +43 -17
- package/dist/cms/boot.js.map +1 -1
- package/dist/cms/create.d.ts +24 -0
- package/dist/cms/create.d.ts.map +1 -1
- package/dist/cms/create.js +14 -0
- package/dist/cms/create.js.map +1 -1
- package/dist/cms/services.d.ts +3 -1
- package/dist/cms/services.d.ts.map +1 -1
- package/dist/cms/services.js +83 -26
- package/dist/cms/services.js.map +1 -1
- package/dist/cms/site-records.d.ts.map +1 -1
- package/dist/cms/site-records.js +0 -2
- package/dist/cms/site-records.js.map +1 -1
- package/dist/comments/akismet.d.ts +13 -46
- package/dist/comments/akismet.d.ts.map +1 -1
- package/dist/comments/akismet.js +29 -68
- package/dist/comments/akismet.js.map +1 -1
- package/dist/comments/conversation.d.ts +14 -8
- package/dist/comments/conversation.d.ts.map +1 -1
- package/dist/comments/conversation.js.map +1 -1
- package/dist/comments/index.d.ts +4 -4
- package/dist/comments/index.d.ts.map +1 -1
- package/dist/comments/index.js +3 -3
- package/dist/comments/index.js.map +1 -1
- package/dist/comments/policy.d.ts +23 -26
- package/dist/comments/policy.d.ts.map +1 -1
- package/dist/comments/policy.js +13 -20
- package/dist/comments/policy.js.map +1 -1
- package/dist/comments/records.d.ts +0 -2
- package/dist/comments/records.d.ts.map +1 -1
- package/dist/comments/records.js +2 -3
- package/dist/comments/records.js.map +1 -1
- package/dist/comments/reply-notices.d.ts +5 -6
- package/dist/comments/reply-notices.d.ts.map +1 -1
- package/dist/comments/reply-notices.js +27 -15
- package/dist/comments/reply-notices.js.map +1 -1
- package/dist/comments/reply-post.d.ts.map +1 -1
- package/dist/comments/reply-post.js +2 -3
- package/dist/comments/reply-post.js.map +1 -1
- package/dist/comments/submission.d.ts +0 -2
- package/dist/comments/submission.d.ts.map +1 -1
- package/dist/comments/submission.js +1 -3
- package/dist/comments/submission.js.map +1 -1
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +2 -1
- package/dist/config-loader.js.map +1 -1
- package/dist/config.d.ts +27 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/contact/delivery.d.ts +2 -4
- package/dist/contact/delivery.d.ts.map +1 -1
- package/dist/contact/delivery.js +1 -2
- package/dist/contact/delivery.js.map +1 -1
- package/dist/contact/index.d.ts +1 -1
- package/dist/contact/index.d.ts.map +1 -1
- package/dist/contact/index.js +1 -1
- package/dist/contact/index.js.map +1 -1
- package/dist/contact/records.d.ts +0 -2
- package/dist/contact/records.d.ts.map +1 -1
- package/dist/contact/records.js +3 -5
- package/dist/contact/records.js.map +1 -1
- package/dist/content/citation.d.ts +1 -0
- package/dist/content/citation.d.ts.map +1 -1
- package/dist/content/citation.js.map +1 -1
- package/dist/content/document-form.d.ts +3 -1
- package/dist/content/document-form.d.ts.map +1 -1
- package/dist/content/document-form.js.map +1 -1
- package/dist/content/enclosure-form.d.ts.map +1 -1
- package/dist/content/enclosure-form.js +5 -6
- package/dist/content/enclosure-form.js.map +1 -1
- package/dist/content/excerpt.d.ts +1 -0
- package/dist/content/excerpt.d.ts.map +1 -1
- package/dist/content/excerpt.js +3 -0
- package/dist/content/excerpt.js.map +1 -1
- package/dist/content/index.d.ts +3 -3
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +2 -2
- package/dist/content/index.js.map +1 -1
- package/dist/content/kept-properties.d.ts +0 -1
- package/dist/content/kept-properties.d.ts.map +1 -1
- package/dist/content/kept-properties.js +2 -2
- package/dist/content/kept-properties.js.map +1 -1
- package/dist/content/locations.d.ts +0 -1
- package/dist/content/locations.d.ts.map +1 -1
- package/dist/content/locations.js +2 -2
- package/dist/content/locations.js.map +1 -1
- package/dist/content/media.d.ts +7 -0
- package/dist/content/media.d.ts.map +1 -1
- package/dist/content/media.js +12 -1
- package/dist/content/media.js.map +1 -1
- package/dist/content/metadata/strip-job.d.ts +16 -0
- package/dist/content/metadata/strip-job.d.ts.map +1 -0
- package/dist/content/metadata/strip-job.js +24 -0
- package/dist/content/metadata/strip-job.js.map +1 -0
- package/dist/content/metadata/sweep.d.ts +13 -1
- package/dist/content/metadata/sweep.d.ts.map +1 -1
- package/dist/content/metadata/sweep.js +47 -25
- package/dist/content/metadata/sweep.js.map +1 -1
- package/dist/content/permalink-file.d.ts +2 -1
- package/dist/content/permalink-file.d.ts.map +1 -1
- package/dist/content/permalink-file.js +3 -3
- package/dist/content/permalink-file.js.map +1 -1
- package/dist/content/photo-form.d.ts +1 -0
- package/dist/content/photo-form.d.ts.map +1 -1
- package/dist/content/photo-form.js +8 -5
- package/dist/content/photo-form.js.map +1 -1
- package/dist/content/photo.d.ts +1 -0
- package/dist/content/photo.d.ts.map +1 -1
- package/dist/content/photo.js +1 -1
- package/dist/content/photo.js.map +1 -1
- package/dist/content/post-fields.d.ts.map +1 -1
- package/dist/content/post-fields.js +5 -9
- package/dist/content/post-fields.js.map +1 -1
- package/dist/content/read-form.d.ts +10 -3
- package/dist/content/read-form.d.ts.map +1 -1
- package/dist/content/read-form.js +67 -9
- package/dist/content/read-form.js.map +1 -1
- package/dist/content/read.d.ts +9 -2
- package/dist/content/read.d.ts.map +1 -1
- package/dist/content/read.js +22 -3
- package/dist/content/read.js.map +1 -1
- package/dist/content/store.d.ts +0 -1
- package/dist/content/store.d.ts.map +1 -1
- package/dist/content/store.js +0 -1
- package/dist/content/store.js.map +1 -1
- package/dist/content/uploads.d.ts +1 -1
- package/dist/content/uploads.d.ts.map +1 -1
- package/dist/content/uploads.js +6 -1
- package/dist/content/uploads.js.map +1 -1
- package/dist/content/write.d.ts +1 -1
- package/dist/content/write.d.ts.map +1 -1
- package/dist/content/write.js +7 -3
- package/dist/content/write.js.map +1 -1
- package/dist/dev-mode.d.ts +4 -26
- package/dist/dev-mode.d.ts.map +1 -1
- package/dist/dev-mode.js +4 -53
- package/dist/dev-mode.js.map +1 -1
- package/dist/export/export-archives.d.ts +29 -0
- package/dist/export/export-archives.d.ts.map +1 -0
- package/dist/export/export-archives.js +88 -0
- package/dist/export/export-archives.js.map +1 -0
- package/dist/export/export-job.d.ts +21 -0
- package/dist/export/export-job.d.ts.map +1 -0
- package/dist/export/export-job.js +63 -0
- package/dist/export/export-job.js.map +1 -0
- package/dist/export/site-export.d.ts +101 -0
- package/dist/export/site-export.d.ts.map +1 -0
- package/dist/export/site-export.js +243 -0
- package/dist/export/site-export.js.map +1 -0
- package/dist/export/site-import.d.ts +75 -0
- package/dist/export/site-import.d.ts.map +1 -0
- package/dist/export/site-import.js +492 -0
- package/dist/export/site-import.js.map +1 -0
- package/dist/exports.d.ts +9 -4
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +3 -1
- package/dist/exports.js.map +1 -1
- package/dist/federation/article.d.ts +5 -11
- package/dist/federation/article.d.ts.map +1 -1
- package/dist/federation/article.js +67 -35
- package/dist/federation/article.js.map +1 -1
- package/dist/federation/backfill.d.ts +3 -1
- package/dist/federation/backfill.d.ts.map +1 -1
- package/dist/federation/backfill.js +5 -3
- package/dist/federation/backfill.js.map +1 -1
- package/dist/federation/cited-post.d.ts +1 -1
- package/dist/federation/cited-post.d.ts.map +1 -1
- package/dist/federation/cited-post.js +1 -1
- package/dist/federation/cited-post.js.map +1 -1
- package/dist/federation/delivery.d.ts +5 -2
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +30 -14
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/federation.d.ts +7 -7
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js +6 -13
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/handles.d.ts +1 -1
- package/dist/federation/handles.d.ts.map +1 -1
- package/dist/federation/handles.js +1 -1
- package/dist/federation/handles.js.map +1 -1
- package/dist/federation/inbox.d.ts.map +1 -1
- package/dist/federation/inbox.js +5 -8
- package/dist/federation/inbox.js.map +1 -1
- package/dist/federation/index.d.ts +1 -0
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +1 -0
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/keys.js +3 -3
- package/dist/federation/keys.js.map +1 -1
- package/dist/federation/object-ids.d.ts +50 -0
- package/dist/federation/object-ids.d.ts.map +1 -0
- package/dist/federation/object-ids.js +134 -0
- package/dist/federation/object-ids.js.map +1 -0
- package/dist/federation/profiles.d.ts +1 -1
- package/dist/federation/profiles.d.ts.map +1 -1
- package/dist/federation/profiles.js +1 -1
- package/dist/federation/profiles.js.map +1 -1
- package/dist/federation/queue.d.ts +32 -17
- package/dist/federation/queue.d.ts.map +1 -1
- package/dist/federation/queue.js +173 -39
- package/dist/federation/queue.js.map +1 -1
- package/dist/federation/relays.d.ts +6 -2
- package/dist/federation/relays.d.ts.map +1 -1
- package/dist/federation/relays.js +43 -36
- package/dist/federation/relays.js.map +1 -1
- package/dist/federation/resend-job.d.ts +44 -0
- package/dist/federation/resend-job.d.ts.map +1 -0
- package/dist/federation/resend-job.js +59 -0
- package/dist/federation/resend-job.js.map +1 -0
- package/dist/files/atomic.d.ts +9 -0
- package/dist/files/atomic.d.ts.map +1 -1
- package/dist/files/atomic.js +1 -1
- package/dist/files/atomic.js.map +1 -1
- package/dist/files/data-files.d.ts +104 -0
- package/dist/files/data-files.d.ts.map +1 -0
- package/dist/files/data-files.js +330 -0
- package/dist/files/data-files.js.map +1 -0
- package/dist/files/export-archives.d.ts +12 -0
- package/dist/files/export-archives.d.ts.map +1 -0
- package/dist/files/export-archives.js +67 -0
- package/dist/files/export-archives.js.map +1 -0
- package/dist/files/static-files.d.ts.map +1 -1
- package/dist/files/static-files.js +7 -22
- package/dist/files/static-files.js.map +1 -1
- package/dist/files/tar.d.ts +29 -0
- package/dist/files/tar.d.ts.map +1 -0
- package/dist/files/tar.js +206 -0
- package/dist/files/tar.js.map +1 -0
- package/dist/files/upload-types.d.ts +81 -0
- package/dist/files/upload-types.d.ts.map +1 -0
- package/dist/files/upload-types.js +234 -0
- package/dist/files/upload-types.js.map +1 -0
- package/dist/forms/protection.d.ts +0 -8
- package/dist/forms/protection.d.ts.map +1 -1
- package/dist/forms/protection.js +2 -10
- package/dist/forms/protection.js.map +1 -1
- package/dist/images/icons.d.ts.map +1 -1
- package/dist/images/icons.js +2 -0
- package/dist/images/icons.js.map +1 -1
- package/dist/images/index.d.ts +1 -1
- package/dist/images/index.d.ts.map +1 -1
- package/dist/images/index.js +1 -1
- package/dist/images/index.js.map +1 -1
- package/dist/images/markup.d.ts +4 -1
- package/dist/images/markup.d.ts.map +1 -1
- package/dist/images/markup.js +10 -6
- package/dist/images/markup.js.map +1 -1
- package/dist/images/paths.d.ts +1 -4
- package/dist/images/paths.d.ts.map +1 -1
- package/dist/images/paths.js +6 -12
- package/dist/images/paths.js.map +1 -1
- package/dist/images/variants.d.ts +4 -2
- package/dist/images/variants.d.ts.map +1 -1
- package/dist/images/variants.js +21 -21
- package/dist/images/variants.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/indexnow.d.ts +4 -2
- package/dist/indexnow.d.ts.map +1 -1
- package/dist/indexnow.js +32 -20
- package/dist/indexnow.js.map +1 -1
- package/dist/indieauth/tokens.d.ts +0 -2
- package/dist/indieauth/tokens.d.ts.map +1 -1
- package/dist/indieauth/tokens.js +2 -4
- package/dist/indieauth/tokens.js.map +1 -1
- package/dist/jobs/file-records.d.ts +13 -0
- package/dist/jobs/file-records.d.ts.map +1 -0
- package/dist/jobs/file-records.js +104 -0
- package/dist/jobs/file-records.js.map +1 -0
- package/dist/jobs/in-process.d.ts +10 -0
- package/dist/jobs/in-process.d.ts.map +1 -0
- package/dist/jobs/in-process.js +45 -0
- package/dist/jobs/in-process.js.map +1 -0
- package/dist/jobs/lock-file.d.ts +13 -0
- package/dist/jobs/lock-file.d.ts.map +1 -0
- package/dist/jobs/lock-file.js +107 -0
- package/dist/jobs/lock-file.js.map +1 -0
- package/dist/jobs/processes.d.ts +11 -0
- package/dist/jobs/processes.d.ts.map +1 -0
- package/dist/jobs/processes.js +50 -0
- package/dist/jobs/processes.js.map +1 -0
- package/dist/jobs/queue.d.ts +18 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +220 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/types.d.ts +159 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +22 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/mail/index.d.ts +0 -2
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +0 -1
- package/dist/mail/index.js.map +1 -1
- package/dist/maintenance.d.ts +5 -42
- package/dist/maintenance.d.ts.map +1 -1
- package/dist/maintenance.js +4 -67
- package/dist/maintenance.js.map +1 -1
- package/dist/media/library.d.ts +1 -1
- package/dist/media/library.d.ts.map +1 -1
- package/dist/media/library.js +4 -1
- package/dist/media/library.js.map +1 -1
- package/dist/media/uploads.d.ts +1 -1
- package/dist/media/uploads.d.ts.map +1 -1
- package/dist/media/uploads.js +1 -1
- package/dist/media/uploads.js.map +1 -1
- package/dist/micropub/endpoint.js +10 -10
- package/dist/micropub/endpoint.js.map +1 -1
- package/dist/micropub/media.d.ts +0 -2
- package/dist/micropub/media.d.ts.map +1 -1
- package/dist/micropub/media.js +5 -7
- package/dist/micropub/media.js.map +1 -1
- package/dist/notifications/comments.d.ts +4 -2
- package/dist/notifications/comments.d.ts.map +1 -1
- package/dist/notifications/comments.js +77 -65
- package/dist/notifications/comments.js.map +1 -1
- package/dist/notifications/digest.d.ts +2 -4
- package/dist/notifications/digest.d.ts.map +1 -1
- package/dist/notifications/digest.js +9 -10
- package/dist/notifications/digest.js.map +1 -1
- package/dist/notifications/index.d.ts +3 -3
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +3 -3
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/mail-service.d.ts +10 -8
- package/dist/notifications/mail-service.d.ts.map +1 -1
- package/dist/notifications/mail-service.js +70 -70
- package/dist/notifications/mail-service.js.map +1 -1
- package/dist/notifications/optouts.d.ts +0 -2
- package/dist/notifications/optouts.d.ts.map +1 -1
- package/dist/notifications/optouts.js +2 -4
- package/dist/notifications/optouts.js.map +1 -1
- package/dist/notifications/tokens.d.ts +0 -2
- package/dist/notifications/tokens.d.ts.map +1 -1
- package/dist/notifications/tokens.js +2 -28
- package/dist/notifications/tokens.js.map +1 -1
- package/dist/notify.d.ts +4 -2
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +27 -15
- package/dist/notify.js.map +1 -1
- package/dist/plugin.d.ts +36 -16
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/changes.d.ts +0 -1
- package/dist/plugins/changes.d.ts.map +1 -1
- package/dist/plugins/changes.js +2 -3
- package/dist/plugins/changes.js.map +1 -1
- package/dist/plugins/data.d.ts +19 -0
- package/dist/plugins/data.d.ts.map +1 -0
- package/dist/plugins/data.js +117 -0
- package/dist/plugins/data.js.map +1 -0
- package/dist/plugins/enabled.d.ts +1 -13
- package/dist/plugins/enabled.d.ts.map +1 -1
- package/dist/plugins/enabled.js +11 -23
- package/dist/plugins/enabled.js.map +1 -1
- package/dist/plugins/install.d.ts +1 -1
- package/dist/plugins/install.d.ts.map +1 -1
- package/dist/plugins/install.js +7 -42
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/migrate-settings.d.ts +7 -0
- package/dist/plugins/migrate-settings.d.ts.map +1 -0
- package/dist/plugins/migrate-settings.js +41 -0
- package/dist/plugins/migrate-settings.js.map +1 -0
- package/dist/plugins/registry.d.ts +10 -14
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +56 -36
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/settings.d.ts +5 -57
- package/dist/plugins/settings.d.ts.map +1 -1
- package/dist/plugins/settings.js +47 -180
- package/dist/plugins/settings.js.map +1 -1
- package/dist/plugins/site.d.ts +2 -1
- package/dist/plugins/site.d.ts.map +1 -1
- package/dist/plugins/site.js +5 -5
- package/dist/plugins/site.js.map +1 -1
- package/dist/privacy/retention.d.ts +4 -0
- package/dist/privacy/retention.d.ts.map +1 -1
- package/dist/privacy/retention.js +12 -5
- package/dist/privacy/retention.js.map +1 -1
- package/dist/settings/akismet.d.ts +9 -0
- package/dist/settings/akismet.d.ts.map +1 -0
- package/dist/settings/akismet.js +46 -0
- package/dist/settings/akismet.js.map +1 -0
- package/dist/settings/declare.d.ts +15 -0
- package/dist/settings/declare.d.ts.map +1 -0
- package/dist/settings/declare.js +20 -0
- package/dist/settings/declare.js.map +1 -0
- package/dist/settings/dev-mode.d.ts +29 -0
- package/dist/settings/dev-mode.d.ts.map +1 -0
- package/dist/settings/dev-mode.js +77 -0
- package/dist/settings/dev-mode.js.map +1 -0
- package/dist/settings/kinds.d.ts +13 -0
- package/dist/settings/kinds.d.ts.map +1 -0
- package/dist/settings/kinds.js +108 -0
- package/dist/settings/kinds.js.map +1 -0
- package/dist/settings/mail.d.ts +10 -0
- package/dist/settings/mail.d.ts.map +1 -0
- package/dist/settings/mail.js +92 -0
- package/dist/settings/mail.js.map +1 -0
- package/dist/settings/maintenance.d.ts +6 -0
- package/dist/settings/maintenance.d.ts.map +1 -0
- package/dist/settings/maintenance.js +33 -0
- package/dist/settings/maintenance.js.map +1 -0
- package/dist/settings/names.d.ts +7 -0
- package/dist/settings/names.d.ts.map +1 -0
- package/dist/settings/names.js +31 -0
- package/dist/settings/names.js.map +1 -0
- package/dist/settings/presence.d.ts +2 -0
- package/dist/settings/presence.d.ts.map +1 -0
- package/dist/settings/presence.js +7 -0
- package/dist/settings/presence.js.map +1 -0
- package/dist/settings/registry.d.ts +14 -0
- package/dist/settings/registry.d.ts.map +1 -0
- package/dist/settings/registry.js +369 -0
- package/dist/settings/registry.js.map +1 -0
- package/dist/settings/types.d.ts +176 -0
- package/dist/settings/types.d.ts.map +1 -0
- package/dist/settings/types.js +2 -0
- package/dist/settings/types.js.map +1 -0
- package/dist/site/namespace.d.ts +88 -0
- package/dist/site/namespace.d.ts.map +1 -0
- package/dist/site/namespace.js +471 -0
- package/dist/site/namespace.js.map +1 -0
- package/dist/site/setting-rows.d.ts +9 -10
- package/dist/site/setting-rows.d.ts.map +1 -1
- package/dist/site/setting-rows.js +109 -228
- package/dist/site/setting-rows.js.map +1 -1
- package/dist/site/settings-form.d.ts.map +1 -1
- package/dist/site/settings-form.js +6 -10
- package/dist/site/settings-form.js.map +1 -1
- package/dist/site/settings.d.ts +6 -322
- package/dist/site/settings.d.ts.map +1 -1
- package/dist/site/settings.js +13 -76
- package/dist/site/settings.js.map +1 -1
- package/dist/site/site-json.d.ts +0 -31
- package/dist/site/site-json.d.ts.map +1 -1
- package/dist/site/site-json.js +5 -49
- package/dist/site/site-json.js.map +1 -1
- package/dist/site/users.d.ts +0 -9
- package/dist/site/users.d.ts.map +1 -1
- package/dist/site/users.js +2 -11
- package/dist/site/users.js.map +1 -1
- package/dist/store/deliveries.d.ts +2 -0
- package/dist/store/deliveries.d.ts.map +1 -1
- package/dist/store/deliveries.js +7 -0
- package/dist/store/deliveries.js.map +1 -1
- package/dist/store/queue-database.d.ts +11 -0
- package/dist/store/queue-database.d.ts.map +1 -0
- package/dist/store/queue-database.js +39 -0
- package/dist/store/queue-database.js.map +1 -0
- package/dist/supervisor/control.d.ts +1 -0
- package/dist/supervisor/control.d.ts.map +1 -1
- package/dist/supervisor/control.js +10 -0
- package/dist/supervisor/control.js.map +1 -1
- package/dist/supervisor/primary.d.ts.map +1 -1
- package/dist/supervisor/primary.js +15 -3
- package/dist/supervisor/primary.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/theme/site-data.d.ts +1 -1
- package/dist/theme/site-data.d.ts.map +1 -1
- package/dist/theme/site-data.js.map +1 -1
- package/dist/web/asset-routes.d.ts +6 -2
- package/dist/web/asset-routes.d.ts.map +1 -1
- package/dist/web/asset-routes.js +12 -4
- package/dist/web/asset-routes.js.map +1 -1
- package/dist/web/comment-routes.d.ts.map +1 -1
- package/dist/web/comment-routes.js +4 -4
- package/dist/web/comment-routes.js.map +1 -1
- package/dist/web/contact-routes.js +1 -1
- package/dist/web/contact-routes.js.map +1 -1
- package/dist/web/context.d.ts +5 -0
- package/dist/web/context.d.ts.map +1 -1
- package/dist/web/context.js +9 -4
- package/dist/web/context.js.map +1 -1
- package/dist/web/conversation.d.ts +1 -1
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +59 -43
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/document-page.d.ts.map +1 -1
- package/dist/web/document-page.js +5 -4
- package/dist/web/document-page.js.map +1 -1
- package/dist/web/document-site.d.ts +1 -1
- package/dist/web/document-site.d.ts.map +1 -1
- package/dist/web/document-site.js +2 -1
- package/dist/web/document-site.js.map +1 -1
- package/dist/web/embed.js +1 -1
- package/dist/web/embed.js.map +1 -1
- package/dist/web/env.d.ts +9 -0
- package/dist/web/env.d.ts.map +1 -1
- package/dist/web/federation-routes.d.ts.map +1 -1
- package/dist/web/federation-routes.js +5 -2
- package/dist/web/federation-routes.js.map +1 -1
- package/dist/web/feed-item.js +1 -1
- package/dist/web/feed-item.js.map +1 -1
- package/dist/web/feed-routes.d.ts +3 -4
- package/dist/web/feed-routes.d.ts.map +1 -1
- package/dist/web/feed-routes.js +17 -15
- package/dist/web/feed-routes.js.map +1 -1
- package/dist/web/health.js +1 -1
- package/dist/web/health.js.map +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js.map +1 -1
- package/dist/web/indieauth-activity-log.d.ts +0 -2
- package/dist/web/indieauth-activity-log.d.ts.map +1 -1
- package/dist/web/indieauth-activity-log.js +2 -4
- package/dist/web/indieauth-activity-log.js.map +1 -1
- package/dist/web/indieauth-bearer.js +2 -2
- package/dist/web/indieauth-bearer.js.map +1 -1
- package/dist/web/indieauth-discovery.d.ts +0 -4
- package/dist/web/indieauth-discovery.d.ts.map +1 -1
- package/dist/web/indieauth-discovery.js +3 -10
- package/dist/web/indieauth-discovery.js.map +1 -1
- package/dist/web/indieauth-token.d.ts.map +1 -1
- package/dist/web/indieauth-token.js +3 -3
- package/dist/web/indieauth-token.js.map +1 -1
- package/dist/web/listing-pages.d.ts.map +1 -1
- package/dist/web/listing-pages.js +1 -2
- package/dist/web/listing-pages.js.map +1 -1
- package/dist/web/maintenance.js +3 -3
- package/dist/web/maintenance.js.map +1 -1
- package/dist/web/page-sources.d.ts +1 -2
- package/dist/web/page-sources.d.ts.map +1 -1
- package/dist/web/page-sources.js +6 -7
- package/dist/web/page-sources.js.map +1 -1
- package/dist/web/paths.js +1 -1
- package/dist/web/paths.js.map +1 -1
- package/dist/web/pingback-routes.d.ts.map +1 -1
- package/dist/web/pingback-routes.js +3 -3
- package/dist/web/pingback-routes.js.map +1 -1
- package/dist/web/plugin-federation.js +50 -40
- package/dist/web/plugin-federation.js.map +1 -1
- package/dist/web/render.d.ts +12 -5
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +36 -22
- package/dist/web/render.js.map +1 -1
- package/dist/web/request.js +1 -1
- package/dist/web/request.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +8 -9
- package/dist/web/routes.js.map +1 -1
- package/dist/web/site-index.d.ts.map +1 -1
- package/dist/web/site-index.js +1 -2
- package/dist/web/site-index.js.map +1 -1
- package/dist/web/site-view.d.ts +0 -2
- package/dist/web/site-view.d.ts.map +1 -1
- package/dist/web/site-view.js +0 -2
- package/dist/web/site-view.js.map +1 -1
- package/dist/web/webmention-routes.d.ts.map +1 -1
- package/dist/web/webmention-routes.js +2 -2
- package/dist/web/webmention-routes.js.map +1 -1
- package/dist/web/well-known.d.ts.map +1 -1
- package/dist/web/well-known.js +6 -7
- package/dist/web/well-known.js.map +1 -1
- package/dist/webmention/cited-picture.js +1 -1
- package/dist/webmention/cited-picture.js.map +1 -1
- package/dist/webmention/pingback.d.ts +1 -8
- package/dist/webmention/pingback.d.ts.map +1 -1
- package/dist/webmention/pingback.js +2 -11
- package/dist/webmention/pingback.js.map +1 -1
- package/dist/webmention/receive.d.ts +3 -1
- package/dist/webmention/receive.d.ts.map +1 -1
- package/dist/webmention/receive.js +5 -3
- package/dist/webmention/receive.js.map +1 -1
- package/dist/webmention/reply-contexts.d.ts +14 -3
- package/dist/webmention/reply-contexts.d.ts.map +1 -1
- package/dist/webmention/reply-contexts.js +12 -10
- package/dist/webmention/reply-contexts.js.map +1 -1
- package/dist/webmention/service.d.ts +3 -1
- package/dist/webmention/service.d.ts.map +1 -1
- package/dist/webmention/service.js +66 -53
- package/dist/webmention/service.js.map +1 -1
- package/package.json +13 -11
- package/themes/default/partials/post-list.njk +19 -14
- package/themes/default/src/style.css +12 -0
- package/themes/default/static/style.css +19 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { pipeline } from 'node:stream/promises';
|
|
2
|
+
import { createGunzip } from 'node:zlib';
|
|
3
|
+
/**
|
|
4
|
+
* A ustar archive, written one entry at a time, and read whole or as a stream. A name that
|
|
5
|
+
* does not fit the header's 100 bytes, or is not ASCII, and a size past the
|
|
6
|
+
* header's octal field, travel in a PAX extended header before the entry, as
|
|
7
|
+
* GNU and BSD tar read them.
|
|
8
|
+
*/
|
|
9
|
+
const BLOCK = 512;
|
|
10
|
+
const NAME_BYTES = 100;
|
|
11
|
+
const SIZE_LIMIT = 8 ** 11;
|
|
12
|
+
export const TAR_END = Buffer.alloc(BLOCK * 2);
|
|
13
|
+
export function tarPadding(size) {
|
|
14
|
+
return Buffer.alloc((BLOCK - (size % BLOCK)) % BLOCK);
|
|
15
|
+
}
|
|
16
|
+
function octal(value, width) {
|
|
17
|
+
return `${value.toString(8).padStart(width - 1, '0')}\0`;
|
|
18
|
+
}
|
|
19
|
+
function header(fields) {
|
|
20
|
+
const block = Buffer.alloc(BLOCK);
|
|
21
|
+
block.write(fields.name, 0, NAME_BYTES, 'utf8');
|
|
22
|
+
block.write(octal(fields.mode & 0o7777, 8), 100, 'ascii');
|
|
23
|
+
block.write(octal(0, 8), 108, 'ascii');
|
|
24
|
+
block.write(octal(0, 8), 116, 'ascii');
|
|
25
|
+
block.write(octal(fields.size, 12), 124, 'ascii');
|
|
26
|
+
block.write(octal(fields.mtime, 12), 136, 'ascii');
|
|
27
|
+
block.write(fields.type, 156, 'ascii');
|
|
28
|
+
block.write('ustar\0', 257, 'ascii');
|
|
29
|
+
block.write('00', 263, 'ascii');
|
|
30
|
+
return sealHeader(block);
|
|
31
|
+
}
|
|
32
|
+
export function sealHeader(block) {
|
|
33
|
+
block.write(' '.repeat(8), 148, 'ascii');
|
|
34
|
+
const sum = block.reduce((total, byte) => total + byte, 0);
|
|
35
|
+
block.write(`${sum.toString(8).padStart(6, '0')}\0 `, 148, 'ascii');
|
|
36
|
+
return block;
|
|
37
|
+
}
|
|
38
|
+
function paxRecord(key, value) {
|
|
39
|
+
const text = ` ${key}=${value}\n`;
|
|
40
|
+
let length = Buffer.byteLength(text) + 1;
|
|
41
|
+
while (String(length).length + Buffer.byteLength(text) !== length) {
|
|
42
|
+
length = String(length).length + Buffer.byteLength(text);
|
|
43
|
+
}
|
|
44
|
+
return `${String(length)}${text}`;
|
|
45
|
+
}
|
|
46
|
+
export function tarHeader(file) {
|
|
47
|
+
const mtime = Math.floor(file.mtime.getTime() / 1000);
|
|
48
|
+
const fitsName = /^[\x20-\x7e]*$/.test(file.name) && file.name.length <= NAME_BYTES;
|
|
49
|
+
const fitsSize = file.size < SIZE_LIMIT;
|
|
50
|
+
const plain = header({
|
|
51
|
+
name: fitsName ? file.name : file.name.slice(0, NAME_BYTES).replace(/[^\x20-\x7e]/g, '_'),
|
|
52
|
+
mode: file.mode,
|
|
53
|
+
size: fitsSize ? file.size : 0,
|
|
54
|
+
mtime,
|
|
55
|
+
type: '0',
|
|
56
|
+
});
|
|
57
|
+
if (fitsName && fitsSize)
|
|
58
|
+
return plain;
|
|
59
|
+
const records = Buffer.from((fitsName ? '' : paxRecord('path', file.name)) +
|
|
60
|
+
(fitsSize ? '' : paxRecord('size', String(file.size))));
|
|
61
|
+
return Buffer.concat([
|
|
62
|
+
header({ name: 'PaxHeader', mode: 0o644, size: records.length, mtime, type: 'x' }),
|
|
63
|
+
records,
|
|
64
|
+
tarPadding(records.length),
|
|
65
|
+
plain,
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
function field(block, start, length) {
|
|
69
|
+
return block
|
|
70
|
+
.subarray(start, start + length)
|
|
71
|
+
.toString('utf8')
|
|
72
|
+
.replace(/\0.*$/s, '');
|
|
73
|
+
}
|
|
74
|
+
function paxValues(records) {
|
|
75
|
+
const values = new Map();
|
|
76
|
+
for (const record of records.split('\n')) {
|
|
77
|
+
const match = /^\d+ ([^=]+)=(.*)$/s.exec(record);
|
|
78
|
+
if (match?.[1] !== undefined && match[2] !== undefined)
|
|
79
|
+
values.set(match[1], match[2]);
|
|
80
|
+
}
|
|
81
|
+
return values;
|
|
82
|
+
}
|
|
83
|
+
function typeOf(flag) {
|
|
84
|
+
if (flag === '0' || flag === '\0')
|
|
85
|
+
return 'file';
|
|
86
|
+
if (flag === '5')
|
|
87
|
+
return 'directory';
|
|
88
|
+
if (flag === '1' || flag === '2')
|
|
89
|
+
return 'link';
|
|
90
|
+
return 'other';
|
|
91
|
+
}
|
|
92
|
+
const EXTENDED_HEADER_LIMIT = 1024 * 1024;
|
|
93
|
+
function cutShort() {
|
|
94
|
+
return new Error('The archive is cut short: it ends inside an entry.');
|
|
95
|
+
}
|
|
96
|
+
class ByteReader {
|
|
97
|
+
#chunks;
|
|
98
|
+
#held = Buffer.alloc(0);
|
|
99
|
+
constructor(chunks) {
|
|
100
|
+
this.#chunks = chunks[Symbol.asyncIterator]();
|
|
101
|
+
}
|
|
102
|
+
async #more() {
|
|
103
|
+
const next = await this.#chunks.next();
|
|
104
|
+
if (next.done === true)
|
|
105
|
+
return false;
|
|
106
|
+
this.#held = this.#held.length === 0 ? next.value : Buffer.concat([this.#held, next.value]);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
async exactly(count) {
|
|
110
|
+
while (this.#held.length < count) {
|
|
111
|
+
if (!(await this.#more())) {
|
|
112
|
+
if (this.#held.length === 0)
|
|
113
|
+
return undefined;
|
|
114
|
+
throw cutShort();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const taken = this.#held.subarray(0, count);
|
|
118
|
+
this.#held = this.#held.subarray(count);
|
|
119
|
+
return taken;
|
|
120
|
+
}
|
|
121
|
+
async piece(most) {
|
|
122
|
+
if (this.#held.length === 0 && !(await this.#more()))
|
|
123
|
+
throw cutShort();
|
|
124
|
+
const taken = this.#held.subarray(0, Math.min(most, this.#held.length));
|
|
125
|
+
this.#held = this.#held.subarray(taken.length);
|
|
126
|
+
return taken;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export async function* readTarStream(gzipped) {
|
|
130
|
+
const gunzip = createGunzip();
|
|
131
|
+
pipeline(gzipped, gunzip).catch(() => undefined);
|
|
132
|
+
const reader = new ByteReader(gunzip);
|
|
133
|
+
let pax = new Map();
|
|
134
|
+
let longName;
|
|
135
|
+
try {
|
|
136
|
+
for (;;) {
|
|
137
|
+
const block = await reader.exactly(BLOCK);
|
|
138
|
+
if (block === undefined || block.every((byte) => byte === 0))
|
|
139
|
+
return;
|
|
140
|
+
const flag = String.fromCharCode(block[156] ?? 0);
|
|
141
|
+
const size = Number(pax.get('size') ?? Number.parseInt(field(block, 124, 12).trim() || '0', 8));
|
|
142
|
+
if (!Number.isSafeInteger(size) || size < 0) {
|
|
143
|
+
throw new Error('The archive holds an entry with a size that is not a whole number.');
|
|
144
|
+
}
|
|
145
|
+
const padding = tarPadding(size).length;
|
|
146
|
+
if (flag === 'x' || flag === 'L') {
|
|
147
|
+
if (size > EXTENDED_HEADER_LIMIT)
|
|
148
|
+
throw new Error('The archive holds an oversized header.');
|
|
149
|
+
const body = (await reader.exactly(size + padding)) ?? Buffer.alloc(0);
|
|
150
|
+
if (body.length < size)
|
|
151
|
+
throw cutShort();
|
|
152
|
+
const text = body.subarray(0, size).toString('utf8');
|
|
153
|
+
if (flag === 'x')
|
|
154
|
+
pax = paxValues(text);
|
|
155
|
+
else
|
|
156
|
+
longName = text.replace(/\0.*$/s, '');
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const prefix = field(block, 345, 155);
|
|
160
|
+
const name = pax.get('path') ?? longName ?? (prefix === '' ? '' : `${prefix}/`) + field(block, 0, 100);
|
|
161
|
+
const seconds = Number(pax.get('mtime') ?? Number.parseInt(field(block, 136, 12).trim() || '0', 8));
|
|
162
|
+
pax = new Map();
|
|
163
|
+
longName = undefined;
|
|
164
|
+
let left = size;
|
|
165
|
+
yield {
|
|
166
|
+
name,
|
|
167
|
+
type: typeOf(flag),
|
|
168
|
+
mode: Number.parseInt(field(block, 100, 8).trim() || '0', 8),
|
|
169
|
+
size,
|
|
170
|
+
mtime: new Date(Math.floor(seconds * 1000)),
|
|
171
|
+
body: {
|
|
172
|
+
async *[Symbol.asyncIterator]() {
|
|
173
|
+
while (left > 0) {
|
|
174
|
+
const piece = await reader.piece(left);
|
|
175
|
+
left -= piece.length;
|
|
176
|
+
yield piece;
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
while (left > 0)
|
|
182
|
+
left -= (await reader.piece(left)).length;
|
|
183
|
+
if (padding > 0 && (await reader.exactly(padding)) === undefined)
|
|
184
|
+
throw cutShort();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
gunzip.destroy();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export async function readTar(gzipped) {
|
|
192
|
+
const entries = [];
|
|
193
|
+
for await (const entry of readTarStream([gzipped])) {
|
|
194
|
+
const pieces = [];
|
|
195
|
+
for await (const piece of entry.body)
|
|
196
|
+
pieces.push(piece);
|
|
197
|
+
entries.push({
|
|
198
|
+
name: entry.name,
|
|
199
|
+
type: entry.type,
|
|
200
|
+
mode: entry.mode,
|
|
201
|
+
body: Buffer.concat(pieces),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return entries;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=tar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.js","sourceRoot":"","sources":["../../src/files/tar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;GAKG;AAEH,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC;AA4B3B,MAAM,CAAC,MAAM,OAAO,GAAW,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAEvD,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,KAAa;IACzC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CAAC,MAMf;IACC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1D,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACrC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAClC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QAClE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;QACzF,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK;QACL,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;IACH,IAAI,QAAQ,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACzD,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAClF,OAAO;QACP,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1B,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,KAAa,EAAE,MAAc;IACzD,OAAO,KAAK;SACT,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;SAC/B,QAAQ,CAAC,MAAM,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACrC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IAChD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,SAAS,QAAQ;IACf,OAAO,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU;IACL,OAAO,CAAwB;IACxC,KAAK,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,YAAY,MAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAC9C,MAAM,QAAQ,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAAE,MAAM,QAAQ,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,aAAa,CAClC,OAAyD;IAEzD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,IAAI,QAA4B,CAAC;IACjC,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC;gBAAE,OAAO;YACrE,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,CACjB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAC3E,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAExC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,IAAI,IAAI,GAAG,qBAAqB;oBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5F,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvE,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;oBAAE,MAAM,QAAQ,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACrD,IAAI,IAAI,KAAK,GAAG;oBAAE,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;;oBACnC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC3C,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GACR,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5F,MAAM,OAAO,GAAG,MAAM,CACpB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAC5E,CAAC;YACF,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,QAAQ,GAAG,SAAS,CAAC;YAErB,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,MAAM;gBACJ,IAAI;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;gBAC5D,IAAI;gBACJ,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;gBAC3C,IAAI,EAAE;oBACJ,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;wBAC3B,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC;4BAChB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACvC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;4BACrB,MAAM,KAAK,CAAC;wBACd,CAAC;oBACH,CAAC;iBACF;aACF,CAAC;YACF,OAAO,IAAI,GAAG,CAAC;gBAAE,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS;gBAAE,MAAM,QAAQ,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What may be uploaded into `content/uploads/`, described once.
|
|
3
|
+
*
|
|
4
|
+
* The upload endpoint is the only door into the content directory that does
|
|
5
|
+
* not write Markdown, so what it accepts is a list rather than a judgement:
|
|
6
|
+
* an extension the CMS has never heard of is refused, and one it has is
|
|
7
|
+
* checked against the media type the browser declared and, where the format
|
|
8
|
+
* has one, against the bytes the file actually starts with.
|
|
9
|
+
*
|
|
10
|
+
* The table lives here rather than beside the endpoint because
|
|
11
|
+
* {@link ResolvedConfig} validates a site's allowlist against it and the
|
|
12
|
+
* static file server serves each upload as the type named here, and neither
|
|
13
|
+
* may depend on the admin or the content layer.
|
|
14
|
+
*/
|
|
15
|
+
/** Bytes a file of some format carries at a fixed offset. */
|
|
16
|
+
export interface UploadSignature {
|
|
17
|
+
/** Where in the file the bytes are. */
|
|
18
|
+
offset: number;
|
|
19
|
+
/** The bytes themselves. */
|
|
20
|
+
bytes: readonly number[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* What an upload is for, which decides what the CMS offers to do with it.
|
|
24
|
+
*
|
|
25
|
+
* An image is embedded and gets variants, audio and video can be a post's
|
|
26
|
+
* enclosure and are held to their own size limit, and a document is linked.
|
|
27
|
+
*/
|
|
28
|
+
export type UploadKind = 'image' | 'audio' | 'video' | 'document';
|
|
29
|
+
/** One kind of file the upload endpoint knows about. */
|
|
30
|
+
export interface UploadMediaType {
|
|
31
|
+
/**
|
|
32
|
+
* Media types a browser may declare for this extension. An empty string is
|
|
33
|
+
* always accepted alongside these: a browser that does not recognise a file
|
|
34
|
+
* sends no type at all, and there is then nothing to disagree with.
|
|
35
|
+
*/
|
|
36
|
+
declared: readonly [string, ...string[]];
|
|
37
|
+
/** What the file is for. */
|
|
38
|
+
kind: UploadKind;
|
|
39
|
+
/**
|
|
40
|
+
* Byte patterns that identify the format, as alternatives: a file matches
|
|
41
|
+
* when every part of any one of them matches. Absent for the text formats,
|
|
42
|
+
* which have no header to check.
|
|
43
|
+
*/
|
|
44
|
+
signatures?: readonly (readonly UploadSignature[])[] | undefined;
|
|
45
|
+
text?: true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Every extension the upload endpoint can accept, and what it takes to be one.
|
|
49
|
+
*
|
|
50
|
+
* SVG is deliberately absent. An SVG is a document that may carry script, and
|
|
51
|
+
* an upload is served from the site's own origin, so accepting one would hand
|
|
52
|
+
* anybody who can reach the editor a stored cross-site scripting hole. A site
|
|
53
|
+
* that wants them anyway can put `.svg` in `uploadTypes` — and then it has
|
|
54
|
+
* chosen that, which is the point.
|
|
55
|
+
*/
|
|
56
|
+
export declare const UPLOAD_MEDIA_TYPES: ReadonlyMap<string, UploadMediaType>;
|
|
57
|
+
/** The extensions a site may put in its allowlist, sorted. */
|
|
58
|
+
export declare const KNOWN_UPLOAD_TYPES: readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* An extension as the allowlist spells it: lower case, with the dot.
|
|
61
|
+
*
|
|
62
|
+
* `PNG`, `.Png` and `png` are all the same thing to somebody writing a config
|
|
63
|
+
* file, so they are the same thing here.
|
|
64
|
+
*/
|
|
65
|
+
export declare function normalizeUploadType(value: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* The media type a feed or an attachment announces for this kind of file: the
|
|
68
|
+
* first one {@link UploadMediaType.declared} lists, which is the registered
|
|
69
|
+
* name where a browser may also send an older one.
|
|
70
|
+
*/
|
|
71
|
+
export declare function canonicalType(media: UploadMediaType): string;
|
|
72
|
+
export declare function servedType(media: UploadMediaType): string;
|
|
73
|
+
/**
|
|
74
|
+
* Whether the first bytes of a file are the ones its extension implies.
|
|
75
|
+
*
|
|
76
|
+
* A format with no signature — the text ones — matches anything, because there
|
|
77
|
+
* is nothing to compare. Returns `false` for a file too short to hold the
|
|
78
|
+
* header it claims.
|
|
79
|
+
*/
|
|
80
|
+
export declare function matchesSignature(media: UploadMediaType, bytes: Uint8Array): boolean;
|
|
81
|
+
//# sourceMappingURL=upload-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-types.d.ts","sourceRoot":"","sources":["../../src/files/upload-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAElE,wDAAwD;AACxD,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACzC,4BAA4B;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,eAAe,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;IACjE,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAgBD;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAkKlE,CAAC;AAEH,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAA0C,CAAC;AAE3F;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE5D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAGzD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CASnF"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What may be uploaded into `content/uploads/`, described once.
|
|
3
|
+
*
|
|
4
|
+
* The upload endpoint is the only door into the content directory that does
|
|
5
|
+
* not write Markdown, so what it accepts is a list rather than a judgement:
|
|
6
|
+
* an extension the CMS has never heard of is refused, and one it has is
|
|
7
|
+
* checked against the media type the browser declared and, where the format
|
|
8
|
+
* has one, against the bytes the file actually starts with.
|
|
9
|
+
*
|
|
10
|
+
* The table lives here rather than beside the endpoint because
|
|
11
|
+
* {@link ResolvedConfig} validates a site's allowlist against it and the
|
|
12
|
+
* static file server serves each upload as the type named here, and neither
|
|
13
|
+
* may depend on the admin or the content layer.
|
|
14
|
+
*/
|
|
15
|
+
/** The bytes of an ASCII string, for spelling a signature readably. */
|
|
16
|
+
function ascii(value) {
|
|
17
|
+
return [...value].map((character) => character.charCodeAt(0));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* An ISO base media file — MP4, M4A, M4V — whatever its brand: a box length,
|
|
21
|
+
* then `ftyp`.
|
|
22
|
+
*/
|
|
23
|
+
const ISO_BASE_MEDIA = [{ offset: 4, bytes: ascii('ftyp') }];
|
|
24
|
+
/** An Ogg page, whatever codec is inside it. */
|
|
25
|
+
const OGG = [{ offset: 0, bytes: ascii('OggS') }];
|
|
26
|
+
/**
|
|
27
|
+
* Every extension the upload endpoint can accept, and what it takes to be one.
|
|
28
|
+
*
|
|
29
|
+
* SVG is deliberately absent. An SVG is a document that may carry script, and
|
|
30
|
+
* an upload is served from the site's own origin, so accepting one would hand
|
|
31
|
+
* anybody who can reach the editor a stored cross-site scripting hole. A site
|
|
32
|
+
* that wants them anyway can put `.svg` in `uploadTypes` — and then it has
|
|
33
|
+
* chosen that, which is the point.
|
|
34
|
+
*/
|
|
35
|
+
export const UPLOAD_MEDIA_TYPES = new Map([
|
|
36
|
+
[
|
|
37
|
+
'.png',
|
|
38
|
+
{
|
|
39
|
+
declared: ['image/png'],
|
|
40
|
+
kind: 'image',
|
|
41
|
+
signatures: [[{ offset: 0, bytes: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a] }]],
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
'.jpg',
|
|
46
|
+
{
|
|
47
|
+
declared: ['image/jpeg', 'image/jpg'],
|
|
48
|
+
kind: 'image',
|
|
49
|
+
signatures: [[{ offset: 0, bytes: [0xff, 0xd8, 0xff] }]],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
[
|
|
53
|
+
'.jpeg',
|
|
54
|
+
{
|
|
55
|
+
declared: ['image/jpeg', 'image/jpg'],
|
|
56
|
+
kind: 'image',
|
|
57
|
+
signatures: [[{ offset: 0, bytes: [0xff, 0xd8, 0xff] }]],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
[
|
|
61
|
+
'.gif',
|
|
62
|
+
{
|
|
63
|
+
declared: ['image/gif'],
|
|
64
|
+
kind: 'image',
|
|
65
|
+
signatures: [
|
|
66
|
+
[{ offset: 0, bytes: ascii('GIF87a') }],
|
|
67
|
+
[{ offset: 0, bytes: ascii('GIF89a') }],
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
[
|
|
72
|
+
'.webp',
|
|
73
|
+
{
|
|
74
|
+
declared: ['image/webp'],
|
|
75
|
+
kind: 'image',
|
|
76
|
+
// A WebP is a RIFF container whose form type is WEBP, so both halves of
|
|
77
|
+
// the header have to be there.
|
|
78
|
+
signatures: [
|
|
79
|
+
[
|
|
80
|
+
{ offset: 0, bytes: ascii('RIFF') },
|
|
81
|
+
{ offset: 8, bytes: ascii('WEBP') },
|
|
82
|
+
],
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
[
|
|
87
|
+
'.avif',
|
|
88
|
+
{
|
|
89
|
+
declared: ['image/avif'],
|
|
90
|
+
kind: 'image',
|
|
91
|
+
// An ISO base media file: a length, then `ftyp`, then the brand.
|
|
92
|
+
signatures: [
|
|
93
|
+
[
|
|
94
|
+
{ offset: 4, bytes: ascii('ftyp') },
|
|
95
|
+
{ offset: 8, bytes: ascii('avif') },
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
{ offset: 4, bytes: ascii('ftyp') },
|
|
99
|
+
{ offset: 8, bytes: ascii('avis') },
|
|
100
|
+
],
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
[
|
|
105
|
+
'.pdf',
|
|
106
|
+
{
|
|
107
|
+
declared: ['application/pdf'],
|
|
108
|
+
kind: 'document',
|
|
109
|
+
signatures: [[{ offset: 0, bytes: ascii('%PDF-') }]],
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
// The two text formats have no header. Nothing is sniffed, and nothing needs
|
|
113
|
+
// to be: they are served as text, and `application/octet-stream` is allowed
|
|
114
|
+
// because that is what a browser sends for a file type it does not know.
|
|
115
|
+
['.txt', { declared: ['text/plain', 'application/octet-stream'], kind: 'document', text: true }],
|
|
116
|
+
[
|
|
117
|
+
'.md',
|
|
118
|
+
{
|
|
119
|
+
declared: ['text/markdown', 'text/x-markdown', 'text/plain', 'application/octet-stream'],
|
|
120
|
+
kind: 'document',
|
|
121
|
+
text: true,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
// WebVTT opens with its name, after a byte order mark when the editor that
|
|
125
|
+
// wrote it added one. SubRip has no header, so it is taken as text like the
|
|
126
|
+
// two formats above.
|
|
127
|
+
[
|
|
128
|
+
'.vtt',
|
|
129
|
+
{
|
|
130
|
+
declared: ['text/vtt', 'text/plain', 'application/octet-stream'],
|
|
131
|
+
kind: 'document',
|
|
132
|
+
text: true,
|
|
133
|
+
signatures: [
|
|
134
|
+
[{ offset: 0, bytes: ascii('WEBVTT') }],
|
|
135
|
+
[{ offset: 0, bytes: [0xef, 0xbb, 0xbf, ...ascii('WEBVTT')] }],
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
[
|
|
140
|
+
'.srt',
|
|
141
|
+
{
|
|
142
|
+
declared: ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'],
|
|
143
|
+
kind: 'document',
|
|
144
|
+
text: true,
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
[
|
|
148
|
+
'.mp3',
|
|
149
|
+
{
|
|
150
|
+
declared: ['audio/mpeg', 'audio/mp3'],
|
|
151
|
+
kind: 'audio',
|
|
152
|
+
// An ID3 tag, or straight into an MPEG audio frame: eleven sync bits,
|
|
153
|
+
// then MPEG-1 or MPEG-2 layer III, with or without a CRC.
|
|
154
|
+
signatures: [
|
|
155
|
+
[{ offset: 0, bytes: ascii('ID3') }],
|
|
156
|
+
[{ offset: 0, bytes: [0xff, 0xfb] }],
|
|
157
|
+
[{ offset: 0, bytes: [0xff, 0xfa] }],
|
|
158
|
+
[{ offset: 0, bytes: [0xff, 0xf3] }],
|
|
159
|
+
[{ offset: 0, bytes: [0xff, 0xf2] }],
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
[
|
|
164
|
+
'.m4a',
|
|
165
|
+
{
|
|
166
|
+
declared: ['audio/mp4', 'audio/x-m4a', 'audio/m4a'],
|
|
167
|
+
kind: 'audio',
|
|
168
|
+
signatures: [ISO_BASE_MEDIA],
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
[
|
|
172
|
+
'.aac',
|
|
173
|
+
{
|
|
174
|
+
declared: ['audio/aac', 'audio/x-aac', 'audio/aacp'],
|
|
175
|
+
kind: 'audio',
|
|
176
|
+
// A raw ADTS stream: twelve sync bits, MPEG-4 or MPEG-2, no CRC.
|
|
177
|
+
signatures: [[{ offset: 0, bytes: [0xff, 0xf1] }], [{ offset: 0, bytes: [0xff, 0xf9] }]],
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
['.ogg', { declared: ['audio/ogg', 'application/ogg'], kind: 'audio', signatures: [OGG] }],
|
|
181
|
+
['.oga', { declared: ['audio/ogg', 'application/ogg'], kind: 'audio', signatures: [OGG] }],
|
|
182
|
+
['.opus', { declared: ['audio/ogg', 'audio/opus'], kind: 'audio', signatures: [OGG] }],
|
|
183
|
+
['.mp4', { declared: ['video/mp4'], kind: 'video', signatures: [ISO_BASE_MEDIA] }],
|
|
184
|
+
['.m4v', { declared: ['video/mp4', 'video/x-m4v'], kind: 'video', signatures: [ISO_BASE_MEDIA] }],
|
|
185
|
+
[
|
|
186
|
+
'.webm',
|
|
187
|
+
{
|
|
188
|
+
declared: ['video/webm', 'audio/webm'],
|
|
189
|
+
kind: 'video',
|
|
190
|
+
// The EBML header every Matroska file, WebM included, opens with.
|
|
191
|
+
signatures: [[{ offset: 0, bytes: [0x1a, 0x45, 0xdf, 0xa3] }]],
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
]);
|
|
195
|
+
/** The extensions a site may put in its allowlist, sorted. */
|
|
196
|
+
export const KNOWN_UPLOAD_TYPES = [...UPLOAD_MEDIA_TYPES.keys()].sort();
|
|
197
|
+
/**
|
|
198
|
+
* An extension as the allowlist spells it: lower case, with the dot.
|
|
199
|
+
*
|
|
200
|
+
* `PNG`, `.Png` and `png` are all the same thing to somebody writing a config
|
|
201
|
+
* file, so they are the same thing here.
|
|
202
|
+
*/
|
|
203
|
+
export function normalizeUploadType(value) {
|
|
204
|
+
const trimmed = value.trim().toLowerCase();
|
|
205
|
+
if (trimmed === '')
|
|
206
|
+
return '';
|
|
207
|
+
return trimmed.startsWith('.') ? trimmed : `.${trimmed}`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The media type a feed or an attachment announces for this kind of file: the
|
|
211
|
+
* first one {@link UploadMediaType.declared} lists, which is the registered
|
|
212
|
+
* name where a browser may also send an older one.
|
|
213
|
+
*/
|
|
214
|
+
export function canonicalType(media) {
|
|
215
|
+
return media.declared[0];
|
|
216
|
+
}
|
|
217
|
+
export function servedType(media) {
|
|
218
|
+
const type = canonicalType(media);
|
|
219
|
+
return media.text === true ? `${type}; charset=utf-8` : type;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Whether the first bytes of a file are the ones its extension implies.
|
|
223
|
+
*
|
|
224
|
+
* A format with no signature — the text ones — matches anything, because there
|
|
225
|
+
* is nothing to compare. Returns `false` for a file too short to hold the
|
|
226
|
+
* header it claims.
|
|
227
|
+
*/
|
|
228
|
+
export function matchesSignature(media, bytes) {
|
|
229
|
+
const alternatives = media.signatures;
|
|
230
|
+
if (alternatives === undefined)
|
|
231
|
+
return true;
|
|
232
|
+
return alternatives.some((signature) => signature.every((part) => part.bytes.every((byte, index) => bytes[part.offset + index] === byte)));
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=upload-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-types.js","sourceRoot":"","sources":["../../src/files/upload-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,14 +59,6 @@ export type FormTimingRefusal =
|
|
|
59
59
|
* a forged field rather than a fast typist.
|
|
60
60
|
*/
|
|
61
61
|
export declare function formTimingRefusal(loaded: string, now: Date): FormTimingRefusal | undefined;
|
|
62
|
-
/**
|
|
63
|
-
* Where the salt that hides submitters' addresses lives, under `dataDir`.
|
|
64
|
-
*
|
|
65
|
-
* Named after comments because comments minted it first and a site that has
|
|
66
|
-
* one must go on using it: a new salt would make every hash already in a
|
|
67
|
-
* comment file incomparable with every hash written after it.
|
|
68
|
-
*/
|
|
69
|
-
export declare const ADDRESS_SALT_FILE = "comment-salt";
|
|
70
62
|
/**
|
|
71
63
|
* A submitter's address as the hash a stored record keeps, or `null` when the
|
|
72
64
|
* site could not tell where the request came from.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protection.d.ts","sourceRoot":"","sources":["../../src/forms/protection.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,6EAA6E;AAC7E,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAe,CAAC;AAErD,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAQ5E;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB;AAC3B,kEAAkE;AAChE,OAAO;AACT,4CAA4C;GAC1C,WAAW,CAAC;AAEhB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,iBAAiB,GAAG,SAAS,CAK1F;AAED
|
|
1
|
+
{"version":3,"file":"protection.d.ts","sourceRoot":"","sources":["../../src/forms/protection.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,6EAA6E;AAC7E,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAe,CAAC;AAErD,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAQ5E;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB;AAC3B,kEAAkE;AAChE,OAAO;AACT,4CAA4C;GAC1C,WAAW,CAAC;AAEhB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,iBAAiB,GAAG,SAAS,CAK1F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO7F;AAaD,wFAAwF;AACxF,eAAO,MAAM,UAAU,eAAe,CAAC"}
|
package/dist/forms/protection.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
-
import path from 'node:path';
|
|
3
2
|
import { readFileIfPresentSync, writeFileAtomicallySync } from '../files/atomic.js';
|
|
3
|
+
import { COMMENT_SALT, dataPath } from '../files/data-files.js';
|
|
4
4
|
/**
|
|
5
5
|
* What every form on the public site defends itself with.
|
|
6
6
|
*
|
|
@@ -73,14 +73,6 @@ export function formTimingRefusal(loaded, now) {
|
|
|
73
73
|
return 'too-quick';
|
|
74
74
|
return undefined;
|
|
75
75
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Where the salt that hides submitters' addresses lives, under `dataDir`.
|
|
78
|
-
*
|
|
79
|
-
* Named after comments because comments minted it first and a site that has
|
|
80
|
-
* one must go on using it: a new salt would make every hash already in a
|
|
81
|
-
* comment file incomparable with every hash written after it.
|
|
82
|
-
*/
|
|
83
|
-
export const ADDRESS_SALT_FILE = 'comment-salt';
|
|
84
76
|
/**
|
|
85
77
|
* A submitter's address as the hash a stored record keeps, or `null` when the
|
|
86
78
|
* site could not tell where the request came from.
|
|
@@ -105,7 +97,7 @@ export function hashClientAddress(dataDir, address) {
|
|
|
105
97
|
}
|
|
106
98
|
/** The site's address salt, minted on first use. */
|
|
107
99
|
function addressSalt(dataDir) {
|
|
108
|
-
const file =
|
|
100
|
+
const file = dataPath(dataDir, COMMENT_SALT);
|
|
109
101
|
const held = readFileIfPresentSync(file)?.trim();
|
|
110
102
|
if (held !== undefined && held !== '')
|
|
111
103
|
return held;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/forms/protection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/forms/protection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC,mFAAmF;AACnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAErD,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,GAAS;IACtD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,yEAAyE;IACzE,2EAA2E;IAC3E,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3C,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,GAAS;IACzD,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,wBAAwB;QAAE,OAAO,OAAO,CAAC;IACxE,IAAI,GAAG,GAAG,sBAAsB;QAAE,OAAO,WAAW,CAAC;IACrD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,OAA2B;IAC5E,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;SAC5C,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,oDAAoD;AACpD,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,uBAAuB,CAAC,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/images/icons.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAiCD,8CAA8C;AAC9C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAiD1C,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAK1F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,GAAG,SAAS,CAEpB;AAED,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAiBtF;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,EAAE,CAiB9F;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/images/icons.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAiCD,8CAA8C;AAC9C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAiD1C,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAK1F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,GAAG,SAAS,CAEpB;AAED,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAiBtF;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,EAAE,CAiB9F;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAiGD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,eAAe,GAAG,cAAc,CAAA;CAAE,CAcpE"}
|
package/dist/images/icons.js
CHANGED
|
@@ -150,6 +150,8 @@ export async function deriveSiteIcon(config, source, name) {
|
|
|
150
150
|
try {
|
|
151
151
|
const encoded = await drawIcon(file, shape);
|
|
152
152
|
const directory = derivedDir(config, source);
|
|
153
|
+
if (directory === undefined)
|
|
154
|
+
return false;
|
|
153
155
|
await mkdir(directory, { recursive: true });
|
|
154
156
|
await writeFileAtomically(path.join(directory, name), encoded);
|
|
155
157
|
return true;
|