@atproto/oauth-provider 0.4.0 → 0.5.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/.linguirc +57 -0
- package/CHANGELOG.md +29 -0
- package/dist/account/account-manager.d.ts +17 -3
- package/dist/account/account-manager.d.ts.map +1 -1
- package/dist/account/account-manager.js +102 -8
- package/dist/account/account-manager.js.map +1 -1
- package/dist/account/account-store.d.ts +81 -15
- package/dist/account/account-store.d.ts.map +1 -1
- package/dist/account/account-store.js +70 -19
- package/dist/account/account-store.js.map +1 -1
- package/dist/account/sign-in-data.d.ts +28 -0
- package/dist/account/sign-in-data.d.ts.map +1 -0
- package/dist/account/sign-in-data.js +16 -0
- package/dist/account/sign-in-data.js.map +1 -0
- package/dist/account/sign-up-data.d.ts +26 -0
- package/dist/account/sign-up-data.d.ts.map +1 -0
- package/dist/account/sign-up-data.js +11 -0
- package/dist/account/sign-up-data.js.map +1 -0
- package/dist/assets/app/bundle-manifest.json +598 -6
- package/dist/assets/app/index-ItwwtJ8r.js +36 -0
- package/dist/assets/app/index-ItwwtJ8r.js.map +1 -0
- package/dist/assets/app/main-B_dNxQo_.js +4 -0
- package/dist/assets/app/main-B_dNxQo_.js.map +1 -0
- package/dist/assets/app/main-CSatvmRR.css +3 -0
- package/dist/assets/app/main-CSatvmRR.js +306 -0
- package/dist/assets/app/main-CSatvmRR.js.map +1 -0
- package/dist/assets/app/messages-BQeltXSF.js +4 -0
- package/dist/assets/app/messages-BQeltXSF.js.map +1 -0
- package/dist/assets/app/messages-BQkEhfjg.js +4 -0
- package/dist/assets/app/messages-BQkEhfjg.js.map +1 -0
- package/dist/assets/app/messages-BUjKj_UJ.js +4 -0
- package/dist/assets/app/messages-BUjKj_UJ.js.map +1 -0
- package/dist/assets/app/messages-BWIQa8fO.js +4 -0
- package/dist/assets/app/messages-BWIQa8fO.js.map +1 -0
- package/dist/assets/app/messages-BaNVb0bp.js +4 -0
- package/dist/assets/app/messages-BaNVb0bp.js.map +1 -0
- package/dist/assets/app/messages-BaizVXcF.js +4 -0
- package/dist/assets/app/messages-BaizVXcF.js.map +1 -0
- package/dist/assets/app/messages-BfoClA1Y.js +4 -0
- package/dist/assets/app/messages-BfoClA1Y.js.map +1 -0
- package/dist/assets/app/messages-BsKGDZnC.js +4 -0
- package/dist/assets/app/messages-BsKGDZnC.js.map +1 -0
- package/dist/assets/app/messages-Bu-TJhml.js +4 -0
- package/dist/assets/app/messages-Bu-TJhml.js.map +1 -0
- package/dist/assets/app/messages-BvOKnBQk.js +4 -0
- package/dist/assets/app/messages-BvOKnBQk.js.map +1 -0
- package/dist/assets/app/messages-BxDzCiWz.js +4 -0
- package/dist/assets/app/messages-BxDzCiWz.js.map +1 -0
- package/dist/assets/app/messages-CDgFOy4S.js +4 -0
- package/dist/assets/app/messages-CDgFOy4S.js.map +1 -0
- package/dist/assets/app/messages-CLbTz0o9.js +4 -0
- package/dist/assets/app/messages-CLbTz0o9.js.map +1 -0
- package/dist/assets/app/messages-CNwSh0t7.js +4 -0
- package/dist/assets/app/messages-CNwSh0t7.js.map +1 -0
- package/dist/assets/app/messages-CSMNJ6P8.js +4 -0
- package/dist/assets/app/messages-CSMNJ6P8.js.map +1 -0
- package/dist/assets/app/messages-CZQUw3mp.js +4 -0
- package/dist/assets/app/messages-CZQUw3mp.js.map +1 -0
- package/dist/assets/app/messages-CZT41oVp.js +4 -0
- package/dist/assets/app/messages-CZT41oVp.js.map +1 -0
- package/dist/assets/app/messages-C_b-d3t8.js +4 -0
- package/dist/assets/app/messages-C_b-d3t8.js.map +1 -0
- package/dist/assets/app/messages-C_u3MTc2.js +4 -0
- package/dist/assets/app/messages-C_u3MTc2.js.map +1 -0
- package/dist/assets/app/messages-Cn8nHZic.js +4 -0
- package/dist/assets/app/messages-Cn8nHZic.js.map +1 -0
- package/dist/assets/app/messages-CtDywJUm.js +4 -0
- package/dist/assets/app/messages-CtDywJUm.js.map +1 -0
- package/dist/assets/app/messages-CurtIjBF.js +4 -0
- package/dist/assets/app/messages-CurtIjBF.js.map +1 -0
- package/dist/assets/app/messages-Cv6zIbaP.js +4 -0
- package/dist/assets/app/messages-Cv6zIbaP.js.map +1 -0
- package/dist/assets/app/messages-D1eLQuPE.js +4 -0
- package/dist/assets/app/messages-D1eLQuPE.js.map +1 -0
- package/dist/assets/app/messages-D8vHEaYW.js +4 -0
- package/dist/assets/app/messages-D8vHEaYW.js.map +1 -0
- package/dist/assets/app/messages-DJ1Q4GeC.js +4 -0
- package/dist/assets/app/messages-DJ1Q4GeC.js.map +1 -0
- package/dist/assets/app/messages-DRL3exqd.js +4 -0
- package/dist/assets/app/messages-DRL3exqd.js.map +1 -0
- package/dist/assets/app/messages-DWLPQRTp.js +4 -0
- package/dist/assets/app/messages-DWLPQRTp.js.map +1 -0
- package/dist/assets/app/messages-DjVaE9YE.js +4 -0
- package/dist/assets/app/messages-DjVaE9YE.js.map +1 -0
- package/dist/assets/app/messages-DqpMfFJR.js +4 -0
- package/dist/assets/app/messages-DqpMfFJR.js.map +1 -0
- package/dist/assets/app/messages-ETjhJBEN.js +4 -0
- package/dist/assets/app/messages-ETjhJBEN.js.map +1 -0
- package/dist/assets/app/messages-EUKrgrGn.js +4 -0
- package/dist/assets/app/messages-EUKrgrGn.js.map +1 -0
- package/dist/assets/app/messages-QQrOUcPW.js +4 -0
- package/dist/assets/app/messages-QQrOUcPW.js.map +1 -0
- package/dist/assets/app/messages-e2QGqFL6.js +4 -0
- package/dist/assets/app/messages-e2QGqFL6.js.map +1 -0
- package/dist/assets/app/messages-p61py7gD.js +4 -0
- package/dist/assets/app/messages-p61py7gD.js.map +1 -0
- package/dist/assets/asset.d.ts +1 -0
- package/dist/assets/asset.d.ts.map +1 -1
- package/dist/assets/assets-middleware.d.ts.map +1 -1
- package/dist/assets/assets-middleware.js +12 -7
- package/dist/assets/assets-middleware.js.map +1 -1
- package/dist/assets/index.d.ts +3 -2
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +13 -1
- package/dist/assets/index.js.map +1 -1
- package/dist/client/client-store.d.ts +3 -3
- package/dist/client/client-store.d.ts.map +1 -1
- package/dist/client/client-store.js +6 -5
- package/dist/client/client-store.js.map +1 -1
- package/dist/device/device-manager.d.ts +9 -8
- package/dist/device/device-manager.d.ts.map +1 -1
- package/dist/device/device-manager.js.map +1 -1
- package/dist/device/device-store.d.ts +3 -3
- package/dist/device/device-store.d.ts.map +1 -1
- package/dist/device/device-store.js +10 -9
- package/dist/device/device-store.js.map +1 -1
- package/dist/dpop/dpop-manager.d.ts +15 -7
- package/dist/dpop/dpop-manager.d.ts.map +1 -1
- package/dist/dpop/dpop-manager.js +17 -3
- package/dist/dpop/dpop-manager.js.map +1 -1
- package/dist/dpop/dpop-nonce.d.ts +11 -5
- package/dist/dpop/dpop-nonce.d.ts.map +1 -1
- package/dist/dpop/dpop-nonce.js +47 -38
- package/dist/dpop/dpop-nonce.js.map +1 -1
- package/dist/errors/handle-unavailable-error.d.ts +11 -0
- package/dist/errors/handle-unavailable-error.d.ts.map +1 -0
- package/dist/errors/handle-unavailable-error.js +19 -0
- package/dist/errors/handle-unavailable-error.js.map +1 -0
- package/dist/errors/invalid-request-error.d.ts +6 -8
- package/dist/errors/invalid-request-error.d.ts.map +1 -1
- package/dist/errors/invalid-request-error.js +10 -8
- package/dist/errors/invalid-request-error.js.map +1 -1
- package/dist/lib/csp/index.d.ts +18 -0
- package/dist/lib/csp/index.d.ts.map +1 -0
- package/dist/lib/csp/index.js +72 -0
- package/dist/lib/csp/index.js.map +1 -0
- package/dist/lib/hcaptcha.d.ts +177 -0
- package/dist/lib/hcaptcha.d.ts.map +1 -0
- package/dist/lib/hcaptcha.js +155 -0
- package/dist/lib/hcaptcha.js.map +1 -0
- package/dist/lib/html/build-document.d.ts +11 -3
- package/dist/lib/html/build-document.d.ts.map +1 -1
- package/dist/lib/html/build-document.js +51 -15
- package/dist/lib/html/build-document.js.map +1 -1
- package/dist/lib/http/middleware.d.ts.map +1 -1
- package/dist/lib/http/middleware.js +4 -1
- package/dist/lib/http/middleware.js.map +1 -1
- package/dist/lib/http/request.d.ts +5 -2
- package/dist/lib/http/request.d.ts.map +1 -1
- package/dist/lib/http/request.js +16 -1
- package/dist/lib/http/request.js.map +1 -1
- package/dist/lib/http/response.d.ts +4 -2
- package/dist/lib/http/response.d.ts.map +1 -1
- package/dist/lib/http/response.js +23 -5
- package/dist/lib/http/response.js.map +1 -1
- package/dist/lib/locale.d.ts +15 -0
- package/dist/lib/locale.d.ts.map +1 -0
- package/dist/lib/locale.js +17 -0
- package/dist/lib/locale.js.map +1 -0
- package/dist/lib/util/function.d.ts +2 -2
- package/dist/lib/util/function.d.ts.map +1 -1
- package/dist/lib/util/function.js.map +1 -1
- package/dist/lib/util/type.d.ts +88 -1
- package/dist/lib/util/type.d.ts.map +1 -1
- package/dist/lib/util/type.js +41 -0
- package/dist/lib/util/type.js.map +1 -1
- package/dist/metadata/build-metadata.d.ts +2 -2
- package/dist/metadata/build-metadata.d.ts.map +1 -1
- package/dist/metadata/build-metadata.js.map +1 -1
- package/dist/oauth-errors.d.ts +1 -0
- package/dist/oauth-errors.d.ts.map +1 -1
- package/dist/oauth-errors.js +3 -1
- package/dist/oauth-errors.js.map +1 -1
- package/dist/oauth-hooks.d.ts +60 -3
- package/dist/oauth-hooks.d.ts.map +1 -1
- package/dist/oauth-hooks.js +3 -3
- package/dist/oauth-hooks.js.map +1 -1
- package/dist/oauth-provider.d.ts +23 -18
- package/dist/oauth-provider.d.ts.map +1 -1
- package/dist/oauth-provider.js +207 -204
- package/dist/oauth-provider.js.map +1 -1
- package/dist/oauth-verifier.d.ts +1 -1
- package/dist/oauth-verifier.d.ts.map +1 -1
- package/dist/oauth-verifier.js +2 -1
- package/dist/oauth-verifier.js.map +1 -1
- package/dist/output/build-authorize-data.d.ts +0 -1
- package/dist/output/build-authorize-data.d.ts.map +1 -1
- package/dist/output/build-authorize-data.js +0 -1
- package/dist/output/build-authorize-data.js.map +1 -1
- package/dist/output/build-customization-data.d.ts +241 -0
- package/dist/output/build-customization-data.d.ts.map +1 -0
- package/dist/output/build-customization-data.js +174 -0
- package/dist/output/build-customization-data.js.map +1 -0
- package/dist/output/output-manager.d.ts +16 -9
- package/dist/output/output-manager.d.ts.map +1 -1
- package/dist/output/output-manager.js +78 -42
- package/dist/output/output-manager.js.map +1 -1
- package/dist/output/send-authorize-redirect.d.ts +9 -6
- package/dist/output/send-authorize-redirect.d.ts.map +1 -1
- package/dist/output/send-authorize-redirect.js +20 -14
- package/dist/output/send-authorize-redirect.js.map +1 -1
- package/dist/output/send-web-page.d.ts +7 -2
- package/dist/output/send-web-page.d.ts.map +1 -1
- package/dist/output/send-web-page.js +37 -21
- package/dist/output/send-web-page.js.map +1 -1
- package/dist/request/request-manager.d.ts +1 -1
- package/dist/request/request-manager.d.ts.map +1 -1
- package/dist/request/request-manager.js +4 -4
- package/dist/request/request-manager.js.map +1 -1
- package/dist/request/request-store.d.ts +3 -3
- package/dist/request/request-store.d.ts.map +1 -1
- package/dist/request/request-store.js +11 -10
- package/dist/request/request-store.js.map +1 -1
- package/dist/token/token-store.d.ts +4 -4
- package/dist/token/token-store.d.ts.map +1 -1
- package/dist/token/token-store.js +13 -12
- package/dist/token/token-store.js.map +1 -1
- package/package.json +43 -20
- package/rollup.config.js +61 -17
- package/src/account/account-manager.ts +159 -8
- package/src/account/account-store.ts +127 -32
- package/src/account/sign-in-data.ts +15 -0
- package/src/account/sign-up-data.ts +11 -0
- package/src/assets/app/app.tsx +31 -16
- package/src/assets/app/backend-data.ts +15 -60
- package/src/assets/app/backend-types.ts +66 -0
- package/src/assets/app/components/forms/button-toggle-visibility.tsx +43 -0
- package/src/assets/app/components/forms/button.tsx +60 -0
- package/src/assets/app/components/forms/fieldset.tsx +55 -0
- package/src/assets/app/components/forms/form-card-async.tsx +103 -0
- package/src/assets/app/components/forms/form-card.tsx +49 -0
- package/src/assets/app/components/forms/input-checkbox.tsx +73 -0
- package/src/assets/app/components/forms/input-container.tsx +107 -0
- package/src/assets/app/components/forms/input-email-address.tsx +66 -0
- package/src/assets/app/components/forms/input-new-password.tsx +62 -0
- package/src/assets/app/components/forms/input-password.tsx +88 -0
- package/src/assets/app/components/forms/input-text.tsx +76 -0
- package/src/assets/app/components/forms/input-token.tsx +94 -0
- package/src/assets/app/components/forms/wizard-card.tsx +116 -0
- package/src/assets/app/components/layouts/layout-title-page.tsx +77 -0
- package/src/assets/app/components/layouts/layout-welcome.tsx +73 -0
- package/src/assets/app/components/utils/account-identifier.tsx +23 -0
- package/src/assets/app/components/utils/account-image.tsx +33 -0
- package/src/assets/app/components/utils/admonition.tsx +52 -0
- package/src/assets/app/components/utils/client-name.tsx +45 -0
- package/src/assets/app/components/utils/error-card.tsx +93 -0
- package/src/assets/app/components/utils/error-message.tsx +62 -0
- package/src/assets/app/components/utils/help-card.tsx +46 -0
- package/src/assets/app/components/utils/icons.tsx +88 -0
- package/src/assets/app/components/utils/link-anchor.tsx +28 -0
- package/src/assets/app/components/utils/link-title.tsx +26 -0
- package/src/assets/app/components/utils/multi-lang-string.tsx +56 -0
- package/src/assets/app/components/utils/password-strength-label.tsx +37 -0
- package/src/assets/app/components/utils/password-strength-meter.tsx +58 -0
- package/src/assets/app/components/{url-viewer.tsx → utils/url-viewer.tsx} +9 -6
- package/src/assets/app/hooks/use-api.ts +128 -55
- package/src/assets/app/hooks/use-async-action.ts +120 -0
- package/src/assets/app/hooks/use-browser-color-scheme.ts +31 -0
- package/src/assets/app/hooks/use-csrf-token.ts +1 -1
- package/src/assets/app/hooks/use-random-string.ts +37 -0
- package/src/assets/app/hooks/use-stepper.ts +87 -0
- package/src/assets/app/index.html +182 -0
- package/src/assets/app/lib/api.ts +248 -79
- package/src/assets/app/lib/clsx.ts +5 -8
- package/src/assets/app/lib/json-client.ts +94 -0
- package/src/assets/app/lib/password.ts +98 -0
- package/src/assets/app/lib/ref.ts +17 -0
- package/src/assets/app/locales/an/messages.po +492 -0
- package/src/assets/app/locales/ast/messages.po +492 -0
- package/src/assets/app/locales/ca/messages.po +492 -0
- package/src/assets/app/locales/da/messages.po +492 -0
- package/src/assets/app/locales/de/messages.po +492 -0
- package/src/assets/app/locales/el/messages.po +492 -0
- package/src/assets/app/locales/en/messages.po +492 -0
- package/src/assets/app/locales/en-GB/messages.po +492 -0
- package/src/assets/app/locales/es/messages.po +492 -0
- package/src/assets/app/locales/eu/messages.po +492 -0
- package/src/assets/app/locales/fi/messages.po +492 -0
- package/src/assets/app/locales/fr/messages.po +492 -0
- package/src/assets/app/locales/ga/messages.po +492 -0
- package/src/assets/app/locales/gl/messages.po +492 -0
- package/src/assets/app/locales/hi/messages.po +492 -0
- package/src/assets/app/locales/hu/messages.po +492 -0
- package/src/assets/app/locales/ia/messages.po +492 -0
- package/src/assets/app/locales/id/messages.po +492 -0
- package/src/assets/app/locales/it/messages.po +492 -0
- package/src/assets/app/locales/ja/messages.po +492 -0
- package/src/assets/app/locales/km/messages.po +492 -0
- package/src/assets/app/locales/ko/messages.po +492 -0
- package/src/assets/app/locales/load.ts +8 -0
- package/src/assets/app/locales/locale-context.ts +19 -0
- package/src/assets/app/locales/locale-provider.tsx +112 -0
- package/src/assets/app/locales/locale-selector.tsx +58 -0
- package/src/assets/app/locales/locales.ts +168 -0
- package/src/assets/app/locales/ne/messages.po +492 -0
- package/src/assets/app/locales/nl/messages.po +492 -0
- package/src/assets/app/locales/pl/messages.po +492 -0
- package/src/assets/app/locales/pt-BR/messages.po +492 -0
- package/src/assets/app/locales/ro/messages.po +492 -0
- package/src/assets/app/locales/ru/messages.po +492 -0
- package/src/assets/app/locales/sv/messages.po +492 -0
- package/src/assets/app/locales/th/messages.po +492 -0
- package/src/assets/app/locales/tr/messages.po +492 -0
- package/src/assets/app/locales/uk/messages.po +492 -0
- package/src/assets/app/locales/vi/messages.po +492 -0
- package/src/assets/app/locales/zh-CN/messages.po +492 -0
- package/src/assets/app/locales/zh-HK/messages.po +492 -0
- package/src/assets/app/locales/zh-TW/messages.po +492 -0
- package/src/assets/app/main.css +23 -2
- package/src/assets/app/main.tsx +24 -8
- package/src/assets/app/views/authorize/accept/accept-form.tsx +150 -0
- package/src/assets/app/views/authorize/accept/accept-view.tsx +70 -0
- package/src/assets/app/views/authorize/authorize-view.tsx +180 -0
- package/src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx +88 -0
- package/src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx +80 -0
- package/src/assets/app/views/authorize/reset-password/reset-password-view.tsx +127 -0
- package/src/assets/app/views/authorize/sign-in/sign-in-form.tsx +244 -0
- package/src/assets/app/views/authorize/sign-in/sign-in-picker.tsx +116 -0
- package/src/assets/app/views/authorize/sign-in/sign-in-view.tsx +145 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx +140 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx +51 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx +289 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-hcaptcha-form.tsx +108 -0
- package/src/assets/app/views/authorize/sign-up/sign-up-view.tsx +158 -0
- package/src/assets/app/views/authorize/welcome/welcome-view.tsx +56 -0
- package/src/assets/app/views/error/error-view.tsx +31 -0
- package/src/assets/asset.ts +1 -0
- package/src/assets/assets-middleware.ts +13 -8
- package/src/assets/index.ts +15 -2
- package/src/client/client-store.ts +10 -12
- package/src/device/device-manager.ts +8 -12
- package/src/device/device-store.ts +9 -15
- package/src/dpop/dpop-manager.ts +20 -8
- package/src/dpop/dpop-nonce.ts +58 -40
- package/src/errors/handle-unavailable-error.ts +18 -0
- package/src/errors/invalid-request-error.ts +10 -8
- package/src/lib/csp/index.ts +98 -0
- package/src/lib/hcaptcha.ts +182 -0
- package/src/lib/html/build-document.ts +60 -16
- package/src/lib/http/middleware.ts +4 -3
- package/src/lib/http/request.ts +31 -1
- package/src/lib/http/response.ts +22 -9
- package/src/lib/locale.ts +21 -0
- package/src/lib/util/function.ts +0 -3
- package/src/lib/util/type.ts +130 -1
- package/src/metadata/build-metadata.ts +2 -1
- package/src/oauth-errors.ts +1 -0
- package/src/oauth-hooks.ts +69 -3
- package/src/oauth-provider.ts +403 -307
- package/src/oauth-verifier.ts +3 -1
- package/src/output/build-authorize-data.ts +1 -3
- package/src/output/build-customization-data.ts +228 -0
- package/src/output/output-manager.ts +111 -48
- package/src/output/send-authorize-redirect.ts +43 -36
- package/src/output/send-web-page.ts +40 -26
- package/src/request/request-manager.ts +4 -4
- package/src/request/request-store.ts +12 -16
- package/src/token/token-store.ts +14 -18
- package/tailwind.config.js +5 -0
- package/tsconfig.backend.tsbuildinfo +1 -1
- package/tsconfig.frontend.tsbuildinfo +1 -1
- package/tsconfig.tools.tsbuildinfo +1 -1
- package/vite.config.mjs +16 -0
- package/.postcssrc.yml +0 -3
- package/dist/assets/app/main.css +0 -3
- package/dist/assets/app/main.js +0 -20
- package/dist/assets/app/main.js.map +0 -1
- package/dist/output/customization.d.ts +0 -27
- package/dist/output/customization.d.ts.map +0 -1
- package/dist/output/customization.js +0 -88
- package/dist/output/customization.js.map +0 -1
- package/src/assets/app/components/accept-form.tsx +0 -137
- package/src/assets/app/components/account-identifier.tsx +0 -18
- package/src/assets/app/components/account-picker.tsx +0 -127
- package/src/assets/app/components/button.tsx +0 -34
- package/src/assets/app/components/client-name.tsx +0 -37
- package/src/assets/app/components/fieldset.tsx +0 -26
- package/src/assets/app/components/form-card.tsx +0 -47
- package/src/assets/app/components/help-card.tsx +0 -42
- package/src/assets/app/components/icons/alert-icon.tsx +0 -5
- package/src/assets/app/components/icons/at-symbol-icon.tsx +0 -5
- package/src/assets/app/components/icons/caret-right-icon.tsx +0 -5
- package/src/assets/app/components/icons/lock-icon.tsx +0 -5
- package/src/assets/app/components/icons/token-icon.tsx +0 -5
- package/src/assets/app/components/icons/util.tsx +0 -17
- package/src/assets/app/components/info-card.tsx +0 -45
- package/src/assets/app/components/input-checkbox.tsx +0 -47
- package/src/assets/app/components/input-container.tsx +0 -37
- package/src/assets/app/components/input-layout.tsx +0 -47
- package/src/assets/app/components/input-text.tsx +0 -69
- package/src/assets/app/components/layout-title-page.tsx +0 -60
- package/src/assets/app/components/layout-welcome.tsx +0 -74
- package/src/assets/app/components/sign-in-form.tsx +0 -337
- package/src/assets/app/components/sign-up-account-form.tsx +0 -194
- package/src/assets/app/components/sign-up-disclaimer.tsx +0 -44
- package/src/assets/app/views/accept-view.tsx +0 -55
- package/src/assets/app/views/authorize-view.tsx +0 -106
- package/src/assets/app/views/error-view.tsx +0 -36
- package/src/assets/app/views/sign-in-view.tsx +0 -111
- package/src/assets/app/views/sign-up-view.tsx +0 -86
- package/src/assets/app/views/welcome-view.tsx +0 -54
- package/src/output/customization.ts +0 -118
@@ -0,0 +1,174 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.customizationSchema = exports.brandingConfigSchema = exports.linkDefinitionSchema = exports.linkRelSchema = exports.localizedStringSchema = exports.colorsDefinitionSchema = exports.colorNameSchema = exports.colorNames = exports.hcaptchaConfigSchema = void 0;
|
4
|
+
exports.buildCustomizationData = buildCustomizationData;
|
5
|
+
exports.buildCustomizationCss = buildCustomizationCss;
|
6
|
+
const zod_1 = require("zod");
|
7
|
+
const hcaptcha_js_1 = require("../lib/hcaptcha.js");
|
8
|
+
const build_document_js_1 = require("../lib/html/build-document.js");
|
9
|
+
const locale_js_1 = require("../lib/locale.js");
|
10
|
+
var hcaptcha_js_2 = require("../lib/hcaptcha.js");
|
11
|
+
Object.defineProperty(exports, "hcaptchaConfigSchema", { enumerable: true, get: function () { return hcaptcha_js_2.hcaptchaConfigSchema; } });
|
12
|
+
// Matches colors defined in tailwind.config.js
|
13
|
+
exports.colorNames = ['brand', 'error', 'warning', 'success'];
|
14
|
+
exports.colorNameSchema = zod_1.z.enum(exports.colorNames);
|
15
|
+
const parsedColorSchema = zod_1.z.string().transform((value, ctx) => {
|
16
|
+
try {
|
17
|
+
const { r, g, b, a } = parseColor(value);
|
18
|
+
if (a != null) {
|
19
|
+
ctx.addIssue({
|
20
|
+
code: zod_1.z.ZodIssueCode.custom,
|
21
|
+
message: 'Alpha values are not supported',
|
22
|
+
});
|
23
|
+
}
|
24
|
+
return { r, g, b };
|
25
|
+
}
|
26
|
+
catch (e) {
|
27
|
+
ctx.addIssue({
|
28
|
+
code: zod_1.z.ZodIssueCode.custom,
|
29
|
+
message: e instanceof Error ? e.message : 'Invalid color value',
|
30
|
+
});
|
31
|
+
// Won't actually be used (since an issue was added):
|
32
|
+
return { r: 0, g: 0, b: 0 };
|
33
|
+
}
|
34
|
+
});
|
35
|
+
exports.colorsDefinitionSchema = zod_1.z.record(exports.colorNameSchema, parsedColorSchema.optional());
|
36
|
+
exports.localizedStringSchema = zod_1.z.union([
|
37
|
+
zod_1.z.string(),
|
38
|
+
locale_js_1.multiLangStringSchema,
|
39
|
+
]);
|
40
|
+
exports.linkRelSchema = zod_1.z.string().refine(build_document_js_1.isLinkRel, 'Invalid link rel');
|
41
|
+
exports.linkDefinitionSchema = zod_1.z.object({
|
42
|
+
title: exports.localizedStringSchema,
|
43
|
+
href: zod_1.z.string().url(),
|
44
|
+
rel: exports.linkRelSchema.optional(),
|
45
|
+
});
|
46
|
+
/**
|
47
|
+
* Aesthetic customization
|
48
|
+
*/
|
49
|
+
exports.brandingConfigSchema = zod_1.z.object({
|
50
|
+
name: zod_1.z.string().optional(),
|
51
|
+
logo: zod_1.z.string().optional(),
|
52
|
+
colors: exports.colorsDefinitionSchema.optional(),
|
53
|
+
links: zod_1.z.array(exports.linkDefinitionSchema).readonly().optional(),
|
54
|
+
});
|
55
|
+
exports.customizationSchema = zod_1.z.object({
|
56
|
+
/**
|
57
|
+
* Available user domains that can be used to sign up. A non-empty array
|
58
|
+
* is required to enable the sign-up feature.
|
59
|
+
*/
|
60
|
+
availableUserDomains: zod_1.z.array(zod_1.z.string()).optional(),
|
61
|
+
/**
|
62
|
+
* UI customizations
|
63
|
+
*/
|
64
|
+
branding: exports.brandingConfigSchema.optional(),
|
65
|
+
/**
|
66
|
+
* Is an invite code required to sign up?
|
67
|
+
*/
|
68
|
+
inviteCodeRequired: zod_1.z.boolean().optional(),
|
69
|
+
/**
|
70
|
+
* Enables hCaptcha during sign-up.
|
71
|
+
*/
|
72
|
+
hcaptcha: hcaptcha_js_1.hcaptchaConfigSchema.optional(),
|
73
|
+
});
|
74
|
+
function buildCustomizationData({ branding, availableUserDomains, inviteCodeRequired, hcaptcha, }) {
|
75
|
+
// @NOTE the front end does not need colors here as they will be injected as
|
76
|
+
// CSS variables.
|
77
|
+
// @NOTE We only copy the values explicitly needed to avoid leaking sensitive
|
78
|
+
// data (in case the caller passed more than what we expect).
|
79
|
+
return {
|
80
|
+
availableUserDomains,
|
81
|
+
inviteCodeRequired,
|
82
|
+
hcaptchaSiteKey: hcaptcha?.siteKey,
|
83
|
+
name: branding?.name,
|
84
|
+
logo: branding?.logo,
|
85
|
+
links: branding?.links,
|
86
|
+
};
|
87
|
+
}
|
88
|
+
function buildCustomizationCss({ branding }) {
|
89
|
+
const vars = Array.from(buildCustomizationVars(branding));
|
90
|
+
if (vars.length)
|
91
|
+
return `:root { ${vars.join(' ')} }`;
|
92
|
+
return '';
|
93
|
+
}
|
94
|
+
function* buildCustomizationVars(branding) {
|
95
|
+
if (branding?.colors) {
|
96
|
+
for (const name of exports.colorNames) {
|
97
|
+
const value = branding.colors[name];
|
98
|
+
if (!value)
|
99
|
+
continue; // Skip missing colors
|
100
|
+
const { r, g, b } = value;
|
101
|
+
const contrast = computeLuma({ r, g, b }) > 128 ? '0 0 0' : '255 255 255';
|
102
|
+
yield `--color-${name}: ${r} ${g} ${b};`;
|
103
|
+
yield `--color-${name}-c: ${contrast};`;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
107
|
+
function parseColor(color) {
|
108
|
+
if (color.startsWith('#')) {
|
109
|
+
return parseHexColor(color);
|
110
|
+
}
|
111
|
+
if (color.startsWith('rgba(')) {
|
112
|
+
return parseRgbaColor(color);
|
113
|
+
}
|
114
|
+
if (color.startsWith('rgb(')) {
|
115
|
+
return parseRgbColor(color);
|
116
|
+
}
|
117
|
+
// Should never happen (as long as the input is a validated WebColor)
|
118
|
+
throw new TypeError(`Invalid color value: ${color}`);
|
119
|
+
}
|
120
|
+
function parseHexColor(v) {
|
121
|
+
// parseInt('az', 16) does not return NaN so we need to check the format
|
122
|
+
if (!/^#[0-9a-f]+$/i.test(v)) {
|
123
|
+
throw new TypeError(`Invalid hex color value: ${v}`);
|
124
|
+
}
|
125
|
+
if (v.length === 4 || v.length === 5) {
|
126
|
+
const r = parseUi8Hex(v.slice(1, 2));
|
127
|
+
const g = parseUi8Hex(v.slice(2, 3));
|
128
|
+
const b = parseUi8Hex(v.slice(3, 4));
|
129
|
+
const a = v.length > 4 ? parseUi8Hex(v.slice(4, 5)) : undefined;
|
130
|
+
return { r, g, b, a };
|
131
|
+
}
|
132
|
+
if (v.length === 7 || v.length === 9) {
|
133
|
+
const r = parseUi8Hex(v.slice(1, 3));
|
134
|
+
const g = parseUi8Hex(v.slice(3, 5));
|
135
|
+
const b = parseUi8Hex(v.slice(5, 7));
|
136
|
+
const a = v.length > 8 ? parseUi8Hex(v.slice(7, 9)) : undefined;
|
137
|
+
return { r, g, b, a };
|
138
|
+
}
|
139
|
+
throw new TypeError(`Invalid hex color value: ${v}`);
|
140
|
+
}
|
141
|
+
function parseRgbColor(v) {
|
142
|
+
const matches = v.match(/^\s*rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/);
|
143
|
+
if (!matches)
|
144
|
+
throw new TypeError(`Invalid rgb color value: ${v}`);
|
145
|
+
const r = parseUi8Dec(matches[1]);
|
146
|
+
const g = parseUi8Dec(matches[2]);
|
147
|
+
const b = parseUi8Dec(matches[3]);
|
148
|
+
return { r, g, b };
|
149
|
+
}
|
150
|
+
function parseRgbaColor(v) {
|
151
|
+
const matches = v.match(/^\s*rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)\s*$/);
|
152
|
+
if (!matches)
|
153
|
+
throw new TypeError(`Invalid rgba color value: ${v}`);
|
154
|
+
const r = parseUi8Dec(matches[1]);
|
155
|
+
const g = parseUi8Dec(matches[2]);
|
156
|
+
const b = parseUi8Dec(matches[3]);
|
157
|
+
const a = parseUi8Dec(matches[4]);
|
158
|
+
return { r, g, b, a };
|
159
|
+
}
|
160
|
+
function computeLuma({ r, g, b }) {
|
161
|
+
return 0.299 * r + 0.587 * g + 0.114 * b;
|
162
|
+
}
|
163
|
+
function parseUi8Hex(v) {
|
164
|
+
return asUi8(parseInt(v, 16));
|
165
|
+
}
|
166
|
+
function parseUi8Dec(v) {
|
167
|
+
return asUi8(parseInt(v, 10));
|
168
|
+
}
|
169
|
+
function asUi8(v) {
|
170
|
+
if (v >= 0 && v <= 255 && v === (v | 0))
|
171
|
+
return v;
|
172
|
+
throw new TypeError(`Invalid color component "${v}" (expected an integer between 0 and 255)`);
|
173
|
+
}
|
174
|
+
//# sourceMappingURL=build-customization-data.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"build-customization-data.js","sourceRoot":"","sources":["../../src/output/build-customization-data.ts"],"names":[],"mappings":"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"}
|
@@ -1,15 +1,22 @@
|
|
1
1
|
import type { ServerResponse } from 'node:http';
|
2
2
|
import { Asset } from '../assets/asset.js';
|
3
|
-
import {
|
3
|
+
import { CspConfig } from '../lib/csp/index.js';
|
4
|
+
import { Html, LinkAttrs, MetaAttrs } from '../lib/html/index.js';
|
5
|
+
import { Locale } from '../lib/locale.js';
|
4
6
|
import { AuthorizationResultAuthorize } from './build-authorize-data.js';
|
5
|
-
import { Customization } from './customization.js';
|
7
|
+
import { Customization, LinkDefinition } from './build-customization-data.js';
|
8
|
+
export type SendPageOptions = {
|
9
|
+
preferredLocales?: readonly string[];
|
10
|
+
};
|
6
11
|
export declare class OutputManager {
|
7
|
-
readonly
|
8
|
-
readonly
|
9
|
-
readonly
|
10
|
-
readonly
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
readonly links?: readonly LinkDefinition[];
|
13
|
+
readonly meta: readonly MetaAttrs[];
|
14
|
+
readonly scripts: readonly (Asset | Html)[];
|
15
|
+
readonly styles: readonly (Asset | Html)[];
|
16
|
+
readonly csp: CspConfig;
|
17
|
+
constructor(customization: Customization);
|
18
|
+
sendAuthorizePage(res: ServerResponse, data: AuthorizationResultAuthorize, options?: SendPageOptions): Promise<void>;
|
19
|
+
sendErrorPage(res: ServerResponse, err: unknown, options?: SendPageOptions): Promise<void>;
|
20
|
+
buildLinks(locale: Locale): LinkAttrs[] | undefined;
|
14
21
|
}
|
15
22
|
//# sourceMappingURL=output-manager.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"output-manager.d.ts","sourceRoot":"","sources":["../../src/output/output-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,IAAI,
|
1
|
+
{"version":3,"file":"output-manager.d.ts","sourceRoot":"","sources":["../../src/output/output-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAY,MAAM,qBAAqB,CAAA;AACzD,OAAO,EACL,IAAI,EACJ,SAAS,EACT,SAAS,EAIV,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAqB,MAAM,EAAqB,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EACL,4BAA4B,EAE7B,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,aAAa,EACb,cAAc,EAGf,MAAM,+BAA+B,CAAA;AAWtC,MAAM,MAAM,eAAe,GAAG;IAC5B,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAGlC;IACD,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAA;IAC1C,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;gBAEX,aAAa,EAAE,aAAa;IAmClC,iBAAiB,CACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,4BAA4B,EAClC,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC;IAmBV,aAAa,CACjB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC;IAkBhB,UAAU,CAAC,MAAM,EAAE,MAAM;CAW1B"}
|
@@ -2,68 +2,104 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.OutputManager = void 0;
|
4
4
|
const index_js_1 = require("../assets/index.js");
|
5
|
-
const index_js_2 = require("../lib/
|
5
|
+
const index_js_2 = require("../lib/csp/index.js");
|
6
|
+
const index_js_3 = require("../lib/html/index.js");
|
7
|
+
const locale_js_1 = require("../lib/locale.js");
|
6
8
|
const build_authorize_data_js_1 = require("./build-authorize-data.js");
|
9
|
+
const build_customization_data_js_1 = require("./build-customization-data.js");
|
7
10
|
const build_error_payload_js_1 = require("./build-error-payload.js");
|
8
|
-
const customization_js_1 = require("./customization.js");
|
9
11
|
const send_web_page_js_1 = require("./send-web-page.js");
|
12
|
+
const HCAPTCHA_CSP = {
|
13
|
+
'script-src': ['https://hcaptcha.com', 'https://*.hcaptcha.com'],
|
14
|
+
'frame-src': ['https://hcaptcha.com', 'https://*.hcaptcha.com'],
|
15
|
+
'style-src': ['https://hcaptcha.com', 'https://*.hcaptcha.com'],
|
16
|
+
'connect-src': ['https://hcaptcha.com', 'https://*.hcaptcha.com'],
|
17
|
+
};
|
10
18
|
class OutputManager {
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
(0, index_js_1.getAsset)('main.js'),
|
20
|
-
(0, index_js_1.getAsset)('main.css'),
|
21
|
-
]);
|
19
|
+
links;
|
20
|
+
meta = [
|
21
|
+
{ name: 'robots', content: 'noindex' },
|
22
|
+
{ name: 'description', content: 'ATProto OAuth authorization page' },
|
23
|
+
];
|
24
|
+
scripts;
|
25
|
+
styles;
|
26
|
+
csp;
|
22
27
|
constructor(customization) {
|
23
|
-
|
28
|
+
this.links = customization.branding?.links;
|
29
|
+
const scripts = Array.from((0, index_js_1.enumerateAssets)('application/javascript'));
|
30
|
+
const styles = Array.from((0, index_js_1.enumerateAssets)('text/css'));
|
31
|
+
// Note: building scripts/styles/csp here for two reasons:
|
24
32
|
// 1. To avoid re-building it on every request
|
25
|
-
// 2. To throw during init if the customization is invalid
|
26
|
-
this.
|
27
|
-
|
28
|
-
|
33
|
+
// 2. To throw during init if the customization/config is invalid
|
34
|
+
this.scripts = [
|
35
|
+
(0, send_web_page_js_1.declareBackendData)('__availableLocales', locale_js_1.AVAILABLE_LOCALES),
|
36
|
+
(0, send_web_page_js_1.declareBackendData)('__customizationData', (0, build_customization_data_js_1.buildCustomizationData)(customization)),
|
37
|
+
// Last (to be able to read the "backend data" variables)
|
38
|
+
...scripts.filter((asset) => asset.isEntry),
|
39
|
+
];
|
40
|
+
this.styles = [
|
41
|
+
// First (to be overridden by customization)
|
42
|
+
...styles,
|
43
|
+
(0, index_js_3.cssCode)((0, build_customization_data_js_1.buildCustomizationCss)(customization)),
|
44
|
+
];
|
45
|
+
const customizationCsp = customization?.hcaptcha ? HCAPTCHA_CSP : undefined;
|
46
|
+
const assetsCsp = {
|
47
|
+
'script-src': scripts.map(send_web_page_js_1.assetToCsp),
|
48
|
+
'style-src': styles.map(send_web_page_js_1.assetToCsp),
|
49
|
+
};
|
50
|
+
this.csp = (0, index_js_2.mergeCsp)(customizationCsp, assetsCsp);
|
29
51
|
}
|
30
|
-
async sendAuthorizePage(res, data) {
|
31
|
-
const
|
52
|
+
async sendAuthorizePage(res, data, options) {
|
53
|
+
const locale = negotiateLocale(data.parameters.ui_locales?.split(' ') ?? options?.preferredLocales);
|
32
54
|
return (0, send_web_page_js_1.sendWebPage)(res, {
|
33
55
|
scripts: [
|
34
56
|
(0, send_web_page_js_1.declareBackendData)('__authorizeData', (0, build_authorize_data_js_1.buildAuthorizeData)(data)),
|
35
|
-
this.
|
36
|
-
jsAsset, // Last (to be able to read the "backend data" variables)
|
57
|
+
...this.scripts,
|
37
58
|
],
|
38
|
-
styles:
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
title: 'Authorize',
|
45
|
-
body: (0, index_js_2.html) `<div id="root"></div>`,
|
59
|
+
styles: this.styles,
|
60
|
+
meta: this.meta,
|
61
|
+
links: this.buildLinks(locale),
|
62
|
+
htmlAttrs: { lang: locale },
|
63
|
+
body: (0, index_js_3.html) `<div id="root"></div>`,
|
64
|
+
csp: this.csp,
|
46
65
|
});
|
47
66
|
}
|
48
|
-
async sendErrorPage(res, err) {
|
49
|
-
const
|
67
|
+
async sendErrorPage(res, err, options) {
|
68
|
+
const locale = negotiateLocale(options?.preferredLocales);
|
50
69
|
return (0, send_web_page_js_1.sendWebPage)(res, {
|
51
70
|
status: (0, build_error_payload_js_1.buildErrorStatus)(err),
|
52
71
|
scripts: [
|
53
72
|
(0, send_web_page_js_1.declareBackendData)('__errorData', (0, build_error_payload_js_1.buildErrorPayload)(err)),
|
54
|
-
this.
|
55
|
-
jsAsset, // Last (to be able to read the "backend data" variables)
|
56
|
-
],
|
57
|
-
styles: [
|
58
|
-
cssAsset, // First (to be overridden by customization)
|
59
|
-
this.customizationStyle,
|
73
|
+
...this.scripts,
|
60
74
|
],
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
75
|
+
styles: this.styles,
|
76
|
+
meta: this.meta,
|
77
|
+
links: this.buildLinks(locale),
|
78
|
+
htmlAttrs: { lang: locale },
|
79
|
+
body: (0, index_js_3.html) `<div id="root"></div>`,
|
80
|
+
csp: this.csp,
|
65
81
|
});
|
66
82
|
}
|
83
|
+
buildLinks(locale) {
|
84
|
+
return this.links
|
85
|
+
?.map(({ rel, href, title }) => (0, index_js_3.isLinkRel)(rel)
|
86
|
+
? typeof title === 'string'
|
87
|
+
? { href, rel, title }
|
88
|
+
: { href, rel, title: title[locale] || title.en }
|
89
|
+
: undefined)
|
90
|
+
.filter((v) => v != null);
|
91
|
+
}
|
67
92
|
}
|
68
93
|
exports.OutputManager = OutputManager;
|
94
|
+
function negotiateLocale(desiredLocales) {
|
95
|
+
if (desiredLocales) {
|
96
|
+
for (const locale of desiredLocales) {
|
97
|
+
if (locale === '*')
|
98
|
+
break; // use default
|
99
|
+
if ((0, locale_js_1.isAvailableLocale)(locale))
|
100
|
+
return locale;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
return 'en';
|
104
|
+
}
|
69
105
|
//# sourceMappingURL=output-manager.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"output-manager.js","sourceRoot":"","sources":["../../src/output/output-manager.ts"],"names":[],"mappings":";;;AAEA,
|
1
|
+
{"version":3,"file":"output-manager.js","sourceRoot":"","sources":["../../src/output/output-manager.ts"],"names":[],"mappings":"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"}
|
@@ -1,22 +1,25 @@
|
|
1
1
|
import type { ServerResponse } from 'node:http';
|
2
2
|
import { OAuthAuthorizationRequestParameters, OAuthTokenType } from '@atproto/oauth-types';
|
3
3
|
import { Code } from '../request/code.js';
|
4
|
-
|
5
|
-
|
4
|
+
/**
|
5
|
+
* @note `iss` and `state` will be added from the
|
6
|
+
* {@link AuthorizationResultRedirect} object.
|
7
|
+
*/
|
8
|
+
export type AuthorizationRedirectParameters = {
|
9
|
+
code: Code;
|
6
10
|
id_token?: string;
|
7
11
|
access_token?: string;
|
8
12
|
token_type?: OAuthTokenType;
|
9
13
|
expires_in?: string;
|
10
|
-
|
11
|
-
|
12
|
-
error?: string;
|
14
|
+
} | {
|
15
|
+
error: string;
|
13
16
|
error_description?: string;
|
14
17
|
error_uri?: string;
|
15
18
|
};
|
16
19
|
export type AuthorizationResultRedirect = {
|
17
20
|
issuer: string;
|
18
21
|
parameters: OAuthAuthorizationRequestParameters;
|
19
|
-
redirect:
|
22
|
+
redirect: AuthorizationRedirectParameters;
|
20
23
|
};
|
21
24
|
export declare function sendAuthorizeRedirect(res: ServerResponse, result: AuthorizationResultRedirect): Promise<void>;
|
22
25
|
//# sourceMappingURL=send-authorize-redirect.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send-authorize-redirect.d.ts","sourceRoot":"","sources":["../../src/output/send-authorize-redirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EACL,mCAAmC,EACnC,cAAc,EACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAMzC,MAAM,MAAM,+BAA+B,
|
1
|
+
{"version":3,"file":"send-authorize-redirect.d.ts","sourceRoot":"","sources":["../../src/output/send-authorize-redirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EACL,mCAAmC,EACnC,cAAc,EACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAMzC;;;GAGG;AACH,MAAM,MAAM,+BAA+B,GACvC;IAGE,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACD;IAGE,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAYL,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,mCAAmC,CAAA;IAC/C,QAAQ,EAAE,+BAA+B,CAAA;CAC1C,CAAA;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
@@ -6,26 +6,32 @@ const index_js_1 = require("../lib/html/index.js");
|
|
6
6
|
const send_web_page_js_1 = require("./send-web-page.js");
|
7
7
|
// https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-11#section-7.5.4
|
8
8
|
const REDIRECT_STATUS_CODE = 303;
|
9
|
+
const SUCCESS_REDIRECT_KEYS = [
|
10
|
+
'code',
|
11
|
+
'id_token',
|
12
|
+
'access_token',
|
13
|
+
'expires_in',
|
14
|
+
'token_type',
|
15
|
+
];
|
16
|
+
const ERROR_REDIRECT_KEYS = ['error', 'error_description', 'error_uri'];
|
9
17
|
async function sendAuthorizeRedirect(res, result) {
|
10
18
|
const { issuer, parameters, redirect } = result;
|
11
19
|
const uri = parameters.redirect_uri;
|
12
20
|
if (!uri)
|
13
21
|
throw new invalid_request_error_js_1.InvalidRequestError('No redirect_uri');
|
14
22
|
const mode = parameters.response_mode || 'query'; // @TODO: default should depend on response_type
|
15
|
-
const entries =
|
16
|
-
iss
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
error_uri: redirect.error_uri,
|
28
|
-
}).filter((entry) => entry[1] != null);
|
23
|
+
const entries = [
|
24
|
+
['iss', issuer], // rfc9207
|
25
|
+
];
|
26
|
+
if (parameters.state != null) {
|
27
|
+
entries.push(['state', parameters.state]);
|
28
|
+
}
|
29
|
+
const keys = 'code' in redirect ? SUCCESS_REDIRECT_KEYS : ERROR_REDIRECT_KEYS;
|
30
|
+
for (const key of keys) {
|
31
|
+
const value = redirect[key];
|
32
|
+
if (value != null)
|
33
|
+
entries.push([key, value]);
|
34
|
+
}
|
29
35
|
res.setHeader('Cache-Control', 'no-store');
|
30
36
|
switch (mode) {
|
31
37
|
case 'query':
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send-authorize-redirect.js","sourceRoot":"","sources":["../../src/output/send-authorize-redirect.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"send-authorize-redirect.js","sourceRoot":"","sources":["../../src/output/send-authorize-redirect.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,12 @@
|
|
1
1
|
import type { ServerResponse } from 'node:http';
|
2
|
-
import {
|
2
|
+
import { CspConfig, CspValue } from '../lib/csp/index.js';
|
3
|
+
import { AssetRef, BuildDocumentOptions, Html } from '../lib/html/index.js';
|
3
4
|
import { WriteResponseOptions } from '../lib/http/response.js';
|
4
5
|
export declare function declareBackendData(name: string, data: unknown): Html;
|
5
|
-
export type SendWebPageOptions = BuildDocumentOptions & WriteResponseOptions
|
6
|
+
export type SendWebPageOptions = BuildDocumentOptions & WriteResponseOptions & {
|
7
|
+
csp?: CspConfig;
|
8
|
+
};
|
6
9
|
export declare function sendWebPage(res: ServerResponse, options: SendWebPageOptions): Promise<void>;
|
10
|
+
export declare function assetsToCsp(assets?: Iterable<Html | AssetRef>): Generator<CspValue>;
|
11
|
+
export declare function assetToCsp(asset: Html | AssetRef): CspValue;
|
7
12
|
//# sourceMappingURL=send-web-page.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send-web-page.d.ts","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,
|
1
|
+
{"version":3,"file":"send-web-page.d.ts","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,qBAAqB,CAAA;AAC7E,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,IAAI,EAGL,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,oBAAoB,EAAa,MAAM,yBAAyB,CAAA;AAEzE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,QAM7D;AAED,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GACnD,oBAAoB,GAAG;IACrB,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB,CAAA;AAEH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED,wBAAiB,WAAW,CAC1B,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,GACjC,SAAS,CAAC,QAAQ,CAAC,CAMrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAO3D"}
|
@@ -2,17 +2,36 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.declareBackendData = declareBackendData;
|
4
4
|
exports.sendWebPage = sendWebPage;
|
5
|
+
exports.assetsToCsp = assetsToCsp;
|
6
|
+
exports.assetToCsp = assetToCsp;
|
5
7
|
const node_crypto_1 = require("node:crypto");
|
6
|
-
const index_js_1 = require("../lib/
|
8
|
+
const index_js_1 = require("../lib/csp/index.js");
|
9
|
+
const index_js_2 = require("../lib/html/index.js");
|
7
10
|
const response_js_1 = require("../lib/http/response.js");
|
8
11
|
function declareBackendData(name, data) {
|
9
12
|
// The script tag is removed after the data is assigned to the global variable
|
10
13
|
// to prevent other scripts from deducing the value of the variable. The "app"
|
11
14
|
// script will read the global variable and then unset it. See
|
12
|
-
// "readBackendData" in "src/assets/app/backend-
|
13
|
-
return (0,
|
15
|
+
// "readBackendData" in "src/assets/app/backend-types.ts".
|
16
|
+
return (0, index_js_2.js) `window[${name}]=${data};document.currentScript.remove();`;
|
14
17
|
}
|
15
18
|
async function sendWebPage(res, options) {
|
19
|
+
const csp = (0, index_js_1.mergeCsp)(options.csp, {
|
20
|
+
'default-src': ["'none'"],
|
21
|
+
'base-uri': options.base?.origin,
|
22
|
+
'script-src': ["'self'", ...assetsToCsp(options.scripts)],
|
23
|
+
'style-src': ["'self'", ...assetsToCsp(options.styles)],
|
24
|
+
'img-src': ["'self'", 'data:', 'https:'],
|
25
|
+
'connect-src': ["'self'"],
|
26
|
+
'upgrade-insecure-requests': true,
|
27
|
+
// Prevents the CSP to be embedded in a page <meta>:
|
28
|
+
'frame-ancestors': ["'none'"],
|
29
|
+
});
|
30
|
+
// @NOTE the csp string might become too long. However, since we need to
|
31
|
+
// specify the "frame-ancestors" directive, we can't use a meta tag. For that
|
32
|
+
// reason, we won't try to avoid too long headers and let the proxy throw
|
33
|
+
// in case of a too long header.
|
34
|
+
res.setHeader('Content-Security-Policy', (0, index_js_1.buildCsp)(csp));
|
16
35
|
// @TODO: make these headers configurable (?)
|
17
36
|
res.setHeader('Permissions-Policy', 'otp-credentials=*, document-domain=()');
|
18
37
|
res.setHeader('Cross-Origin-Embedder-Policy', 'credentialless');
|
@@ -23,26 +42,23 @@ async function sendWebPage(res, options) {
|
|
23
42
|
res.setHeader('X-Content-Type-Options', 'nosniff');
|
24
43
|
res.setHeader('X-XSS-Protection', '0');
|
25
44
|
res.setHeader('Strict-Transport-Security', 'max-age=63072000');
|
26
|
-
|
27
|
-
`default-src 'none'`,
|
28
|
-
`frame-ancestors 'none'`,
|
29
|
-
`form-action 'none'`,
|
30
|
-
`base-uri ${options.base?.origin || `'none'`}`,
|
31
|
-
`script-src 'self' ${options.scripts?.map(assetToHash).map(hashToCspRule).join(' ') ?? ''}`,
|
32
|
-
`style-src 'self' ${options.styles?.map(assetToHash).map(hashToCspRule).join(' ') ?? ''}`,
|
33
|
-
`img-src 'self' data: https:`,
|
34
|
-
`connect-src 'self'`,
|
35
|
-
`upgrade-insecure-requests`,
|
36
|
-
].join('; '));
|
37
|
-
const html = (0, index_js_1.buildDocument)(options);
|
45
|
+
const html = (0, index_js_2.buildDocument)(options);
|
38
46
|
return (0, response_js_1.writeHtml)(res, html.toString(), options);
|
39
47
|
}
|
40
|
-
function
|
41
|
-
|
42
|
-
|
43
|
-
|
48
|
+
function* assetsToCsp(assets) {
|
49
|
+
if (assets) {
|
50
|
+
for (const asset of assets) {
|
51
|
+
yield assetToCsp(asset);
|
52
|
+
}
|
53
|
+
}
|
44
54
|
}
|
45
|
-
function
|
46
|
-
|
55
|
+
function assetToCsp(asset) {
|
56
|
+
if (asset instanceof index_js_2.Html) {
|
57
|
+
const hash = (0, node_crypto_1.createHash)('sha256').update(asset.toString()).digest('base64');
|
58
|
+
return `'sha256-${hash}'`;
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
return `'sha256-${asset.sha256}'`;
|
62
|
+
}
|
47
63
|
}
|
48
64
|
//# sourceMappingURL=send-web-page.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send-web-page.js","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"send-web-page.js","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":";;AAYA,gDAMC;AAOD,kCAqCC;AAED,kCAQC;AAED,gCAOC;AAjFD,6CAAwC;AAExC,kDAA6E;AAC7E,mDAM6B;AAC7B,yDAAyE;AAEzE,SAAgB,kBAAkB,CAAC,IAAY,EAAE,IAAa;IAC5D,8EAA8E;IAC9E,8EAA8E;IAC9E,8DAA8D;IAC9D,0DAA0D;IAC1D,OAAO,IAAA,aAAE,EAAA,UAAU,IAAI,KAAK,IAAI,mCAAmC,CAAA;AACrE,CAAC;AAOM,KAAK,UAAU,WAAW,CAC/B,GAAmB,EACnB,OAA2B;IAE3B,MAAM,GAAG,GAAG,IAAA,mBAAQ,EAAC,OAAO,CAAC,GAAG,EAAE;QAChC,aAAa,EAAE,CAAC,QAAQ,CAAC;QACzB,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,MAAyC;QACnE,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,WAAW,EAAE,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvD,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACxC,aAAa,EAAE,CAAC,QAAQ,CAAC;QACzB,2BAA2B,EAAE,IAAI;QAEjC,oDAAoD;QACpD,iBAAiB,EAAE,CAAC,QAAQ,CAAC;KAC9B,CAAC,CAAA;IAEF,wEAAwE;IACxE,6EAA6E;IAC7E,yEAAyE;IACzE,gCAAgC;IAChC,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC,CAAA;IAEvD,6CAA6C;IAC7C,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAA;IAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,CAAA;IAC/D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAA;IAC5D,GAAG,CAAC,SAAS,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAA;IAC1D,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IAC/C,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACxC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;IAClD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,kBAAkB,CAAC,CAAA;IAE9D,MAAM,IAAI,GAAG,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAA;IAEnC,OAAO,IAAA,uBAAS,EAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAED,QAAe,CAAC,CAAC,WAAW,CAC1B,MAAkC;IAElC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,KAAsB;IAC/C,IAAI,KAAK,YAAY,eAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC3E,OAAO,WAAW,IAAI,GAAG,CAAA;IAC3B,CAAC;SAAM,CAAC;QACN,OAAO,WAAW,KAAK,CAAC,MAAM,GAAG,CAAA;IACnC,CAAC;AACH,CAAC"}
|