diff --git a/README.md b/README.md index 832b3a7..400828a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Flarum Passkey Login -![License](https://img.shields.io/badge/license-Apache-2.0-blue.svg) [![Latest Stable Version](https://img.shields.io/packagist/v/hikarilan/flarum-passkey-login.svg)](https://packagist.org/packages/hikarilan/flarum-passkey-login) [![Total Downloads](https://img.shields.io/packagist/dt/hikarilan/flarum-passkey-login.svg)](https://packagist.org/packages/hikarilan/flarum-passkey-login) +![License](https://img.shields.io/packagist/l/hikarilan/flarum-passkey-login) [![Latest Stable Version](https://img.shields.io/packagist/v/hikarilan/flarum-passkey-login.svg)](https://packagist.org/packages/hikarilan/flarum-passkey-login) [![Total Downloads](https://img.shields.io/packagist/dt/hikarilan/flarum-passkey-login.svg)](https://packagist.org/packages/hikarilan/flarum-passkey-login) -A [Flarum](http://flarum.org) extension. Login to Flarum with Passkey +A [Flarum](http://flarum.org) extension. Login to Flarum with Passkey. ## Installation @@ -23,5 +23,4 @@ php flarum cache:clear ## Links - [Packagist](https://packagist.org/packages/hikarilan/flarum-passkey-login) -- [GitHub](https://github.com/hikarilan/flarum-passkey-login) -- [Discuss](https://discuss.flarum.org/d/PUT_DISCUSS_SLUG_HERE) +- [GitHub](https://github.com/shaokeyibb/flarum-passkey-login) diff --git a/composer.json b/composer.json index 318695c..c8ab531 100644 --- a/composer.json +++ b/composer.json @@ -1,55 +1,64 @@ { - "name": "hikarilan/flarum-passkey-login", - "description": "Login to Flarum with Passkey", - "keywords": [ - "flarum" - ], - "type": "flarum-extension", - "license": "Apache-2.0", - "require": { - "flarum/core": "^1.2.0" + "name": "hikarilan/flarum-passkey-login", + "description": "Login to Flarum with passkey", + "keywords": [ + "flarum", + "passkey", + "webauthn", + "security", + "login" + ], + "type": "flarum-extension", + "license": "Apache-2.0", + "require": { + "flarum/core": "^1.2.0", + "web-auth/webauthn-lib": "^4.7" + }, + "authors": [ + { + "name": "HikariLan", + "email": "hikarilan@minecraft.kim", + "role": "Developer" + } + ], + "support": { + "source": "https://github.com/shaokeyibb/flarum-passkey-login", + "issues": "https://github.com/shaokeyibb/flarum-passkey-login/issues" + }, + "autoload": { + "psr-4": { + "Hikarilan\\FlarumPasskeyLogin\\": "src/" + } + }, + "extra": { + "flarum-extension": { + "title": "Passkey Login", + "category": "feature", + "icon": { + "name": "fas fa-key", + "color": "#fff", + "backgroundColor": "#61964e" + } }, - "authors": [ - { - "name": "HikariLan", - "email": "hikarilan@minecraft.kim", - "role": "Developer" - } - ], - "autoload": { - "psr-4": { - "Hikarilan\\FlarumPasskeyLogin\\": "src/" - } - }, - "extra": { - "flarum-extension": { - "title": "Flarum Passkey Login", - "category": "", - "icon": { - "name": "", - "color": "", - "backgroundColor": "" - } - }, - "flarum-cli": { - "modules": { - "admin": true, - "forum": true, - "js": true, - "jsCommon": true, - "css": true, - "locale": true, - "gitConf": true, - "githubActions": true, - "prettier": true, - "typescript": true, - "bundlewatch": true, - "backendTesting": false, - "editorConfig": true, - "styleci": true - } - } - }, - "minimum-stability": "dev", - "prefer-stable": true + "flarum-cli": { + "modules": { + "admin": true, + "forum": true, + "js": true, + "jsCommon": true, + "css": true, + "locale": true, + "gitConf": true, + "githubActions": true, + "prettier": true, + "typescript": true, + "bundlewatch": true, + "backendTesting": false, + "editorConfig": true, + "styleci": true + } + } + }, + "minimum-stability": "dev", + "prefer-stable": true } diff --git a/extend.php b/extend.php index 44ec08e..fa7d1ea 100644 --- a/extend.php +++ b/extend.php @@ -11,14 +11,69 @@ namespace Hikarilan\FlarumPasskeyLogin; +use Cose\Algorithm\Manager; +use Cose\Algorithm\Signature\ECDSA\ES256; use Flarum\Extend; +use Illuminate\Container\Container; +use Webauthn\AttestationStatement\AttestationObjectLoader; +use Webauthn\AttestationStatement\AttestationStatementSupportManager; +use Webauthn\AttestationStatement\NoneAttestationStatementSupport; +use Webauthn\AttestationStatement\PackedAttestationStatementSupport; +use Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler; +use Webauthn\AuthenticatorAssertionResponseValidator; +use Webauthn\AuthenticatorAttestationResponseValidator; +use Webauthn\PublicKeyCredentialLoader; + +$algorithmManager = Manager::create(); +$algorithmManager->add(new ES256()); + +$attestationStatementSupportManager = AttestationStatementSupportManager::create(); +$attestationStatementSupportManager->add(new NoneAttestationStatementSupport()); +$attestationStatementSupportManager->add(new PackedAttestationStatementSupport($algorithmManager)); + +$extensionOutputCheckerHandler = ExtensionOutputCheckerHandler::create(); + +$publicKeyCredentialLoader = PublicKeyCredentialLoader::create(AttestationObjectLoader::create($attestationStatementSupportManager)); +$authenticatorAttestationResponseValidator = AuthenticatorAttestationResponseValidator::create( + $attestationStatementSupportManager, + null, + null, + $extensionOutputCheckerHandler +); +$authenticatorAssertionResponseValidator = AuthenticatorAssertionResponseValidator::create( + null, + null, + $extensionOutputCheckerHandler, + $algorithmManager +); + +Container::getInstance()->instance(PublicKeyCredentialLoader::class, $publicKeyCredentialLoader); +Container::getInstance()->instance(AuthenticatorAttestationResponseValidator::class, $authenticatorAttestationResponseValidator); +Container::getInstance()->instance(AuthenticatorAssertionResponseValidator::class, $authenticatorAssertionResponseValidator); return [ (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less'), + ->js(__DIR__ . '/js/dist/forum.js') + ->css(__DIR__ . '/less/forum.less'), (new Extend\Frontend('admin')) - ->js(__DIR__.'/js/dist/admin.js') - ->css(__DIR__.'/less/admin.less'), - new Extend\Locales(__DIR__.'/locale'), + ->js(__DIR__ . '/js/dist/admin.js') + ->css(__DIR__ . '/less/admin.less'), + new Extend\Locales(__DIR__ . '/locale'), + + (new Extend\Routes('api')) + ->get("/passkeys", "passkeys.index", Api\Controllers\ListPasskeyController::class) + ->get('/passkeys/{id}', 'passkeys.show', Api\Controllers\ShowPasskeyController::class) + ->patch("/passkeys/{id}", "passkeys.update", Api\Controllers\UpdatePasskeyController::class) + ->delete("/passkeys/{id}", "passkeys.delete", Api\Controllers\DeletePasskeyController::class), + (new Extend\Routes('forum')) + ->get("/authorization/passkey/registration/options", "authorization.passkey.registration.options", Controllers\PasskeyRegistrationOptionsController::class) + ->post("/authorization/passkey/registration", "authorization.passkey.registration", Controllers\PasskeyRegistrationController::class) + ->get("/authorization/passkey/assertion/options", "authorization.passkey.assertion.options", Controllers\PasskeyAssertionOptionsController::class) + ->post("/authorization/passkey/assertion", "authorization.passkey.assertion", Controllers\PasskeyAssertionController::class), + + (new Extend\Middleware('forum')) + ->add(Middleware\ErrorHandler::class), + + (new Extend\Settings) + ->default("hikarilan-passkey-login.timeout", 60) ]; diff --git a/js/.yarnrc.yml b/js/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/js/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/js/admin.ts b/js/admin.ts index 1f9e14a..3e69ff3 100644 --- a/js/admin.ts +++ b/js/admin.ts @@ -1,2 +1 @@ -export * from './src/common'; export * from './src/admin'; diff --git a/js/dist/admin.js b/js/dist/admin.js new file mode 100644 index 0000000..ae95f9b --- /dev/null +++ b/js/dist/admin.js @@ -0,0 +1,132 @@ +/******/ (() => { // webpackBootstrap +/******/ // runtime can't be in strict mode because a global variable is assign and maybe created. +/******/ var __webpack_modules__ = ({ + +/***/ "./src/admin/index.ts": +/*!****************************!*\ + !*** ./src/admin/index.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_0__); + +flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().initializers.add('hikarilan/flarum-passkey-login', function () { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().extensionData["for"]("hikarilan-passkey-login").registerSetting({ + setting: "hikarilan-passkey-login.relying_party.name", + label: flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().translator.trans('hikarilan-passkey-login.admin.settings.relying_party.name.label'), + help: flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().translator.trans('hikarilan-passkey-login.admin.settings.relying_party.name.help'), + type: "text" + }).registerSetting({ + setting: "hikarilan-passkey-login.relying_party.id", + label: flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().translator.trans('hikarilan-passkey-login.admin.settings.relying_party.id.label'), + help: flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().translator.trans('hikarilan-passkey-login.admin.settings.relying_party.id.help'), + type: "text" + }).registerSetting({ + setting: "hikarilan-passkey-login.timeout", + label: flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().translator.trans('hikarilan-passkey-login.admin.settings.timeout.label'), + help: flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default().translator.trans('hikarilan-passkey-login.admin.settings.timeout.help'), + type: "number", + min: 1 + }); +}); + +/***/ }), + +/***/ "flarum/admin/app": +/*!**************************************************!*\ + !*** external "flarum.core.compat['admin/app']" ***! + \**************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['admin/app']; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/*!******************!*\ + !*** ./admin.ts ***! + \******************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _src_admin__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/admin */ "./src/admin/index.ts"); + +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map new file mode 100644 index 0000000..f45f837 --- /dev/null +++ b/js/dist/admin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"admin.js","mappings":";;;;;;;;;;;;;;AAAmC;AAEnCA,oEAAgB,CAACE,GAAG,CAAC,gCAAgC,EAAE,YAAM;EACzDF,qEAAiB,OAAI,CAAC,yBAAyB,CAAC,CAC3CI,eAAe,CAAC;IACbC,OAAO,EAAE,4CAA4C;IACrDC,KAAK,EAAEN,kEAAc,CAACQ,KAAK,CAAC,iEAAiE,CAAC;IAC9FC,IAAI,EAAET,kEAAc,CAACQ,KAAK,CAAC,gEAAgE,CAAC;IAC5FE,IAAI,EAAE;EACV,CAAC,CAAC,CACDN,eAAe,CAAC;IACbC,OAAO,EAAE,0CAA0C;IACnDC,KAAK,EAAEN,kEAAc,CAACQ,KAAK,CAAC,+DAA+D,CAAC;IAC5FC,IAAI,EAAET,kEAAc,CAACQ,KAAK,CAAC,8DAA8D,CAAC;IAC1FE,IAAI,EAAE;EACV,CAAC,CAAC,CACDN,eAAe,CAAC;IACbC,OAAO,EAAE,iCAAiC;IAC1CC,KAAK,EAAEN,kEAAc,CAACQ,KAAK,CAAC,sDAAsD,CAAC;IACnFC,IAAI,EAAET,kEAAc,CAACQ,KAAK,CAAC,qDAAqD,CAAC;IACjFE,IAAI,EAAE,QAAQ;IACdC,GAAG,EAAE;EACT,CAAC,CAAC;AACV,CAAC,CAAC;;;;;;;;;;;ACvBF;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D","sources":["webpack://@hikarilan/flarum-passkey-login/./src/admin/index.ts","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['admin/app']\"","webpack://@hikarilan/flarum-passkey-login/webpack/bootstrap","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/compat get default export","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/define property getters","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/hasOwnProperty shorthand","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/make namespace object"],"sourcesContent":["import app from 'flarum/admin/app';\n\napp.initializers.add('hikarilan/flarum-passkey-login', () => {\n app.extensionData.for(\"hikarilan-passkey-login\")\n .registerSetting({\n setting: \"hikarilan-passkey-login.relying_party.name\",\n label: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.name.label'),\n help: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.name.help'),\n type: \"text\",\n })\n .registerSetting({\n setting: \"hikarilan-passkey-login.relying_party.id\",\n label: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.id.label'),\n help: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.id.help'),\n type: \"text\",\n })\n .registerSetting({\n setting: \"hikarilan-passkey-login.timeout\",\n label: app.translator.trans('hikarilan-passkey-login.admin.settings.timeout.label'),\n help: app.translator.trans('hikarilan-passkey-login.admin.settings.timeout.help'),\n type: \"number\",\n min: 1\n })\n});\n","module.exports = flarum.core.compat['admin/app'];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["app","initializers","add","extensionData","registerSetting","setting","label","translator","trans","help","type","min"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js new file mode 100644 index 0000000..a5046b2 --- /dev/null +++ b/js/dist/forum.js @@ -0,0 +1,2252 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./src/forum/components/AddPasskeyButton.tsx": +/*!***************************************************!*\ + !*** ./src/forum/components/AddPasskeyButton.tsx ***! + \***************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ AddPasskeyButton) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _PasskeyButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PasskeyButton */ "./src/forum/components/PasskeyButton.tsx"); +/* harmony import */ var _hooks_passkey__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../hooks/passkey */ "./src/forum/hooks/passkey.ts"); + + + + + + +var AddPasskeyButton = /*#__PURE__*/function (_PasskeyButton) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(AddPasskeyButton, _PasskeyButton); + function AddPasskeyButton() { + return _PasskeyButton.apply(this, arguments) || this; + } + AddPasskeyButton.initAttrs = function initAttrs(attrs) { + _PasskeyButton.initAttrs.call(this, attrs); + attrs.className = "Button"; + attrs.onclick = /*#__PURE__*/(0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return (0,_hooks_passkey__WEBPACK_IMPORTED_MODULE_5__.createPasskeyCredential)(); + case 2: + case "end": + return _context.stop(); + } + }, _callee); + })); + }; + var _proto = AddPasskeyButton.prototype; + _proto.view = function view(vnode) { + // @ts-ignore + var vdom = _PasskeyButton.prototype.view.call(this, vnode); + vdom.text = flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.add-new-passkey'); + return vdom; + }; + return AddPasskeyButton; +}(_PasskeyButton__WEBPACK_IMPORTED_MODULE_4__["default"]); + + +/***/ }), + +/***/ "./src/forum/components/LoginWithPasskeyButton.tsx": +/*!*********************************************************!*\ + !*** ./src/forum/components/LoginWithPasskeyButton.tsx ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ LoginWithPasskeyButton) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _PasskeyButton__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./PasskeyButton */ "./src/forum/components/PasskeyButton.tsx"); +/* harmony import */ var _hooks_passkey__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../hooks/passkey */ "./src/forum/hooks/passkey.ts"); + + + + + + +var LoginWithPasskeyButton = /*#__PURE__*/function (_PasskeyButton) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(LoginWithPasskeyButton, _PasskeyButton); + function LoginWithPasskeyButton() { + return _PasskeyButton.apply(this, arguments) || this; + } + LoginWithPasskeyButton.initAttrs = function initAttrs(attrs) { + _PasskeyButton.initAttrs.call(this, attrs); + attrs.className = "Button Button--primary Button--block LogInButton"; + attrs.onclick = /*#__PURE__*/(0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return (0,_hooks_passkey__WEBPACK_IMPORTED_MODULE_5__.validatePasskeyCredential)(); + case 2: + case "end": + return _context.stop(); + } + }, _callee); + })); + }; + var _proto = LoginWithPasskeyButton.prototype; + _proto.view = function view(vnode) { + // @ts-ignore + var vdom = _PasskeyButton.prototype.view.call(this, vnode); + vdom.text = flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('hikarilan-passkey-login.forum.login.with-passkey'); + return vdom; + }; + return LoginWithPasskeyButton; +}(_PasskeyButton__WEBPACK_IMPORTED_MODULE_4__["default"]); + + +/***/ }), + +/***/ "./src/forum/components/PasskeyAliasSetModal.tsx": +/*!*******************************************************!*\ + !*** ./src/forum/components/PasskeyAliasSetModal.tsx ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PasskeyAliasSetModal) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/components/Modal */ "flarum/common/components/Modal"); +/* harmony import */ var flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_5__); + + + + + + +var PasskeyAliasSetModal = /*#__PURE__*/function (_Modal) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(PasskeyAliasSetModal, _Modal); + function PasskeyAliasSetModal() { + var _this; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _Modal.call.apply(_Modal, [this].concat(args)) || this; + _this.state = { + redraw: false + }; + return _this; + } + var _proto = PasskeyAliasSetModal.prototype; + _proto.className = function className() { + return "passkey-alias-set-modal"; + }; + _proto.title = function title() { + return m("p", null, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans("hikarilan-passkey-login.forum.user.settings.alias-modal.title")); + }; + _proto.content = function content() { + return m("div", { + className: "Modal-body" + }, m("div", { + className: "Form Form--centered" + }, m("p", { + className: "helpText" + }, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans("hikarilan-passkey-login.forum.user.settings.alias-modal.label")), m("div", { + className: "Form-group" + }, m("input", { + className: "FormControl", + type: "text", + name: "alias", + required: true, + minlength: "1", + maxlength: "255", + placeholder: window.navigator.platform, + disabled: this.loading + })), m("div", { + className: "Form-group" + }, m((flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_5___default()), { + className: "Button Button--primary Button--block", + type: "submit", + loading: this.loading + }, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('core.forum.change_email.submit_button'))))); + }; + _proto.onsubmit = /*#__PURE__*/function () { + var _onsubmit = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(e) { + var _elements$namedItem; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + this.loading = true; + _context.prev = 2; + _context.next = 5; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().store.find('passkeys', this.attrs.id); + case 5: + _context.next = 7; + return _context.sent.save({ + alias: (_elements$namedItem = e.target.elements.namedItem('alias')) == null ? void 0 : _elements$namedItem.value + }); + case 7: + this.state.redraw = true; + _context.next = 13; + break; + case 10: + _context.prev = 10; + _context.t0 = _context["catch"](2); + throw _context.t0; + case 13: + _context.prev = 13; + this.loading = false; + return _context.finish(13); + case 16: + _context.next = 18; + return this.hide(); + case 18: + case "end": + return _context.stop(); + } + }, _callee, this, [[2, 10, 13, 16]]); + })); + function onsubmit(_x) { + return _onsubmit.apply(this, arguments); + } + return onsubmit; + }(); + _proto.hide = /*#__PURE__*/function () { + var _hide = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee2() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + _context2.prev = 0; + _Modal.prototype.hide.call(this); + if (this.state.redraw) { + _context2.next = 6; + break; + } + _context2.next = 5; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().store.find('passkeys', this.attrs.id); + case 5: + m.redraw(); + case 6: + _context2.prev = 6; + this.state.redraw = false; + return _context2.finish(6); + case 9: + case "end": + return _context2.stop(); + } + }, _callee2, this, [[0,, 6, 9]]); + })); + function hide() { + return _hide.apply(this, arguments); + } + return hide; + }(); + return PasskeyAliasSetModal; +}((flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_4___default())); + + +/***/ }), + +/***/ "./src/forum/components/PasskeyButton.tsx": +/*!************************************************!*\ + !*** ./src/forum/components/PasskeyButton.tsx ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PasskeyButton) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _hooks_passkey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../hooks/passkey */ "./src/forum/hooks/passkey.ts"); + + + + + +var PasskeyButton = /*#__PURE__*/function (_Button) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(PasskeyButton, _Button); + function PasskeyButton() { + var _this; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _Button.call.apply(_Button, [this].concat(args)) || this; + _this.disabled = false; + return _this; + } + var _proto = PasskeyButton.prototype; + _proto.oncreate = /*#__PURE__*/function () { + var _oncreate = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(vnode) { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _Button.prototype.oncreate.call(this, vnode); + _context.next = 3; + return (0,_hooks_passkey__WEBPACK_IMPORTED_MODULE_4__.isAvailable)(); + case 3: + this.disabled = !_context.sent; + m.redraw(); + case 5: + case "end": + return _context.stop(); + } + }, _callee, this); + })); + function oncreate(_x) { + return _oncreate.apply(this, arguments); + } + return oncreate; + }(); + _proto.view = function view(vnode) { + var vdom = _Button.prototype.view.call(this, vnode); + // @ts-ignore + vdom.attrs.disabled = this.disabled; + return vdom; + }; + return PasskeyButton; +}((flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default())); + + +/***/ }), + +/***/ "./src/forum/components/PasskeyElement.tsx": +/*!*************************************************!*\ + !*** ./src/forum/components/PasskeyElement.tsx ***! + \*************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PasskeyElement) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/Component */ "flarum/common/Component"); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Component__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/helpers/icon */ "flarum/common/helpers/icon"); +/* harmony import */ var flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var flarum_common_components_LabelValue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! flarum/common/components/LabelValue */ "flarum/common/components/LabelValue"); +/* harmony import */ var flarum_common_components_LabelValue__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_LabelValue__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! flarum/common/helpers/humanTime */ "flarum/common/helpers/humanTime"); +/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_8__); + + + + + + + + + +var PasskeyElement = /*#__PURE__*/function (_Component) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(PasskeyElement, _Component); + function PasskeyElement() { + return _Component.apply(this, arguments) || this; + } + var _proto = PasskeyElement.prototype; + _proto.view = function view(vnode) { + var _this$attrs$passkey$a, + _this = this; + if (!this.attrs.passkey.exists) return null; + return m("div", { + className: "PasskeysList-item" + }, m("div", { + className: "PasskeysList-item-icon" + }, flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_5___default()('fas fa-key')), m("div", { + className: "PasskeysList-item-info" + }, m("div", { + className: "PasskeysList-item-title" + }, m("span", { + className: "PasskeysList-item-title-main" + }, (_this$attrs$passkey$a = this.attrs.passkey.alias()) != null && _this$attrs$passkey$a.length ? this.attrs.passkey.alias() : this.attrs.passkey.identifier())), m("div", { + className: "PasskeysList-item-createdAt" + }, m((flarum_common_components_LabelValue__WEBPACK_IMPORTED_MODULE_6___default()), { + label: flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('core.forum.security.created'), + value: flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_7___default()(this.attrs.passkey.createdAt()) + })), m("div", { + className: "PasskeysList-item-lastSeenAt" + }, m((flarum_common_components_LabelValue__WEBPACK_IMPORTED_MODULE_6___default()), { + label: flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('core.forum.security.last_activity'), + value: flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_7___default()(this.attrs.passkey.lastSeenAt()) + }))), m("div", { + className: "PasskeysList-item-actions" + }, m((flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_8___default()), { + className: "Button Button--danger", + onclick: function onclick() { + return _this.revoke(); + } + }, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans("hikarilan-passkey-login.forum.user.settings.item.revoke")))); + }; + _proto.revoke = /*#__PURE__*/function () { + var _revoke = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return this.attrs.passkey["delete"](); + case 2: + flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().alerts.show({ + type: 'success' + }, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans("hikarilan-passkey-login.forum.user.settings.item.revoke_success", { + count: 1 + })); + m.redraw(); + case 4: + case "end": + return _context.stop(); + } + }, _callee, this); + })); + function revoke() { + return _revoke.apply(this, arguments); + } + return revoke; + }(); + return PasskeyElement; +}((flarum_common_Component__WEBPACK_IMPORTED_MODULE_4___default())); + + +/***/ }), + +/***/ "./src/forum/components/PasskeySettings.tsx": +/*!**************************************************!*\ + !*** ./src/forum/components/PasskeySettings.tsx ***! + \**************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PasskeySettings) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/Component */ "flarum/common/Component"); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Component__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_common_components_FieldSet__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/components/FieldSet */ "flarum/common/components/FieldSet"); +/* harmony import */ var flarum_common_components_FieldSet__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_FieldSet__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _AddPasskeyButton__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./AddPasskeyButton */ "./src/forum/components/AddPasskeyButton.tsx"); +/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! flarum/common/components/LoadingIndicator */ "flarum/common/components/LoadingIndicator"); +/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var flarum_common_helpers_listItems__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! flarum/common/helpers/listItems */ "flarum/common/helpers/listItems"); +/* harmony import */ var flarum_common_helpers_listItems__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_listItems__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var flarum_common_utils_ItemList__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! flarum/common/utils/ItemList */ "flarum/common/utils/ItemList"); +/* harmony import */ var flarum_common_utils_ItemList__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(flarum_common_utils_ItemList__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var _PasskeyElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./PasskeyElement */ "./src/forum/components/PasskeyElement.tsx"); + + + + + + + + + + + +var PasskeySettings = /*#__PURE__*/function (_Component) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(PasskeySettings, _Component); + function PasskeySettings() { + var _this; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.state = { + loading: true, + error: false + }; + return _this; + } + var _proto = PasskeySettings.prototype; + _proto.oncreate = /*#__PURE__*/function () { + var _oncreate = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(vnode) { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _Component.prototype.oncreate.call(this, vnode); + _context.next = 3; + return this.loadPasskey(); + case 3: + case "end": + return _context.stop(); + } + }, _callee, this); + })); + function oncreate(_x) { + return _oncreate.apply(this, arguments); + } + return oncreate; + }(); + _proto.view = function view(vnode) { + var passkeys = flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().store.all('passkeys'); + return m((flarum_common_components_FieldSet__WEBPACK_IMPORTED_MODULE_5___default()), { + label: flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.title') + }, m("span", { + className: "helpText" + }, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.label')), this.state.loading ? m((flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_7___default()), { + containerClassName: "Passkeys-Loading" + }) : this.state.error ? m("p", null, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.error')) : !passkeys.length ? m("div", { + className: "PasskeyList--empty" + }, flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().translator.trans('core.forum.security.empty_text')) : m("div", { + className: "PasskeysList" + }, flarum_common_helpers_listItems__WEBPACK_IMPORTED_MODULE_8___default()(this.generatePasskeysList(passkeys).toArray(), 'div')), m(_AddPasskeyButton__WEBPACK_IMPORTED_MODULE_6__["default"], null)); + }; + _proto.loadPasskey = /*#__PURE__*/function () { + var _loadPasskey = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee2() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + _context2.prev = 0; + _context2.next = 3; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_3___default().store.find('passkeys'); + case 3: + m.redraw(); + _context2.next = 10; + break; + case 6: + _context2.prev = 6; + _context2.t0 = _context2["catch"](0); + this.state.error = true; + throw _context2.t0; + case 10: + _context2.prev = 10; + this.state.loading = false; + return _context2.finish(10); + case 13: + case "end": + return _context2.stop(); + } + }, _callee2, this, [[0, 6, 10, 13]]); + })); + function loadPasskey() { + return _loadPasskey.apply(this, arguments); + } + return loadPasskey; + }(); + _proto.generatePasskeysList = function generatePasskeysList(passkeys) { + var items = new (flarum_common_utils_ItemList__WEBPACK_IMPORTED_MODULE_9___default())(); + passkeys.forEach(function (passkey) { + items.add(passkey.identifier(), m(_PasskeyElement__WEBPACK_IMPORTED_MODULE_10__["default"], { + passkey: passkey + })); + }); + return items; + }; + return PasskeySettings; +}((flarum_common_Component__WEBPACK_IMPORTED_MODULE_4___default())); + + +/***/ }), + +/***/ "./src/forum/extend.ts": +/*!*****************************!*\ + !*** ./src/forum/extend.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var flarum_common_extenders__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/common/extenders */ "flarum/common/extenders"); +/* harmony import */ var flarum_common_extenders__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_common_extenders__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _models_Passkey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./models/Passkey */ "./src/forum/models/Passkey.ts"); + + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([new (flarum_common_extenders__WEBPACK_IMPORTED_MODULE_0___default().Store)().add('passkeys', _models_Passkey__WEBPACK_IMPORTED_MODULE_1__["default"])]); + +/***/ }), + +/***/ "./src/forum/extenders/add_passkey_button.tsx": +/*!****************************************************!*\ + !*** ./src/forum/extenders/add_passkey_button.tsx ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ addPasskeyButton) +/* harmony export */ }); +/* harmony import */ var flarum_common_extend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/common/extend */ "flarum/common/extend"); +/* harmony import */ var flarum_common_extend__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_common_extend__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var flarum_forum_components_LogInButtons__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/forum/components/LogInButtons */ "flarum/forum/components/LogInButtons"); +/* harmony import */ var flarum_forum_components_LogInButtons__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_components_LogInButtons__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _components_LoginWithPasskeyButton__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/LoginWithPasskeyButton */ "./src/forum/components/LoginWithPasskeyButton.tsx"); + + + +function addPasskeyButton() { + (0,flarum_common_extend__WEBPACK_IMPORTED_MODULE_0__.extend)((flarum_forum_components_LogInButtons__WEBPACK_IMPORTED_MODULE_1___default().prototype), 'items', function (items) { + items.add("login-with-passkey", m(_components_LoginWithPasskeyButton__WEBPACK_IMPORTED_MODULE_2__["default"], null), 1); + }); +} + +/***/ }), + +/***/ "./src/forum/extenders/add_passkey_settings.tsx": +/*!******************************************************!*\ + !*** ./src/forum/extenders/add_passkey_settings.tsx ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ addPasskeySettings) +/* harmony export */ }); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var flarum_common_extend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/common/extend */ "flarum/common/extend"); +/* harmony import */ var flarum_common_extend__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_common_extend__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_forum_components_UserSecurityPage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/forum/components/UserSecurityPage */ "flarum/forum/components/UserSecurityPage"); +/* harmony import */ var flarum_forum_components_UserSecurityPage__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_components_UserSecurityPage__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _components_PasskeySettings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/PasskeySettings */ "./src/forum/components/PasskeySettings.tsx"); + + + + +function addPasskeySettings() { + (0,flarum_common_extend__WEBPACK_IMPORTED_MODULE_1__.extend)((flarum_forum_components_UserSecurityPage__WEBPACK_IMPORTED_MODULE_2___default().prototype), 'settingsItems', function (items) { + if (this.user !== (flarum_forum_app__WEBPACK_IMPORTED_MODULE_0___default().session).user) { + return; + } + items.add('passkeys', m(_components_PasskeySettings__WEBPACK_IMPORTED_MODULE_3__["default"], null), 5); + }); +} + +/***/ }), + +/***/ "./src/forum/hooks/passkey.ts": +/*!************************************!*\ + !*** ./src/forum/hooks/passkey.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createPasskeyCredential: () => (/* binding */ createPasskeyCredential), +/* harmony export */ isAvailable: () => (/* binding */ isAvailable), +/* harmony export */ validatePasskeyCredential: () => (/* binding */ validatePasskeyCredential) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _simplewebauthn_browser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @simplewebauthn/browser */ "./node_modules/@simplewebauthn/browser/dist/bundle/index.js"); +/* harmony import */ var _components_PasskeyAliasSetModal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/PasskeyAliasSetModal */ "./src/forum/components/PasskeyAliasSetModal.tsx"); + + + + + +var isPlatformAuthenticatorIsAvailable = null; +function isAvailable() { + return _isAvailable.apply(this, arguments); +} +function _isAvailable() { + _isAvailable = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!(isPlatformAuthenticatorIsAvailable === null)) { + _context.next = 4; + break; + } + _context.next = 3; + return (0,_simplewebauthn_browser__WEBPACK_IMPORTED_MODULE_3__.platformAuthenticatorIsAvailable)(); + case 3: + isPlatformAuthenticatorIsAvailable = _context.sent; + case 4: + return _context.abrupt("return", isPlatformAuthenticatorIsAvailable); + case 5: + case "end": + return _context.stop(); + } + }, _callee); + })); + return _isAvailable.apply(this, arguments); +} +function createPasskeyCredential() { + return _createPasskeyCredential.apply(this, arguments); +} +function _createPasskeyCredential() { + _createPasskeyCredential = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2() { + var resp, attResp, registrationResp; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_2___default().request({ + url: "/authorization/passkey/registration/options", + method: "GET" + }); + case 2: + resp = _context2.sent; + _context2.next = 5; + return (0,_simplewebauthn_browser__WEBPACK_IMPORTED_MODULE_3__.startRegistration)(resp); + case 5: + attResp = _context2.sent; + _context2.next = 8; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_2___default().request({ + url: "/authorization/passkey/registration", + method: "POST", + headers: { + 'Content-Type': 'application/json' + }, + body: attResp + }); + case 8: + registrationResp = _context2.sent; + _context2.next = 11; + return requireSetAlias(registrationResp.id); + case 11: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return _createPasskeyCredential.apply(this, arguments); +} +function requireSetAlias(_x) { + return _requireSetAlias.apply(this, arguments); +} +function _requireSetAlias() { + _requireSetAlias = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee3(id) { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + // @ts-ignore + flarum_forum_app__WEBPACK_IMPORTED_MODULE_2___default().modal.show(_components_PasskeyAliasSetModal__WEBPACK_IMPORTED_MODULE_4__["default"], { + id: id + }); + case 1: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return _requireSetAlias.apply(this, arguments); +} +function validatePasskeyCredential() { + return _validatePasskeyCredential.apply(this, arguments); +} +function _validatePasskeyCredential() { + _validatePasskeyCredential = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee4() { + var resp, asrResp; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_2___default().request({ + url: "/authorization/passkey/assertion/options", + method: "GET" + }); + case 2: + resp = _context4.sent; + _context4.next = 5; + return (0,_simplewebauthn_browser__WEBPACK_IMPORTED_MODULE_3__.startAuthentication)(resp); + case 5: + asrResp = _context4.sent; + _context4.next = 8; + return flarum_forum_app__WEBPACK_IMPORTED_MODULE_2___default().request({ + url: "/authorization/passkey/assertion", + method: "POST", + headers: { + 'Content-Type': 'application/json' + }, + body: asrResp + }); + case 8: + window.location.reload(); + case 9: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return _validatePasskeyCredential.apply(this, arguments); +} + +/***/ }), + +/***/ "./src/forum/index.ts": +/*!****************************!*\ + !*** ./src/forum/index.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ extend: () => (/* reexport safe */ _extend__WEBPACK_IMPORTED_MODULE_3__["default"]) +/* harmony export */ }); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/forum/app */ "flarum/forum/app"); +/* harmony import */ var flarum_forum_app__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_forum_app__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _extenders_add_passkey_button__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./extenders/add_passkey_button */ "./src/forum/extenders/add_passkey_button.tsx"); +/* harmony import */ var _extenders_add_passkey_settings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./extenders/add_passkey_settings */ "./src/forum/extenders/add_passkey_settings.tsx"); +/* harmony import */ var _extend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./extend */ "./src/forum/extend.ts"); + + + + +flarum_forum_app__WEBPACK_IMPORTED_MODULE_0___default().initializers.add('hikarilan/flarum-passkey-login', function () { + (0,_extenders_add_passkey_button__WEBPACK_IMPORTED_MODULE_1__["default"])(); + (0,_extenders_add_passkey_settings__WEBPACK_IMPORTED_MODULE_2__["default"])(); +}); + +/***/ }), + +/***/ "./src/forum/models/Passkey.ts": +/*!*************************************!*\ + !*** ./src/forum/models/Passkey.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Passkey) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var flarum_common_Model__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/common/Model */ "flarum/common/Model"); +/* harmony import */ var flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Model__WEBPACK_IMPORTED_MODULE_1__); + + +var Passkey = /*#__PURE__*/function (_Model) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(Passkey, _Model); + function Passkey() { + var _this; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _Model.call.apply(_Model, [this].concat(args)) || this; + _this.identifier = flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().attribute('id'); + _this.userId = flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().attribute('user_id'); + _this.alias = flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().attribute('alias'); + _this.createdAt = flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().attribute('created_at', function (o) { + return flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().transformDate(o); + }); + _this.lastSeenAt = flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().attribute('last_seen_at', function (o) { + return flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default().transformDate(o); + }); + return _this; + } + return Passkey; +}((flarum_common_Model__WEBPACK_IMPORTED_MODULE_1___default())); + + +/***/ }), + +/***/ "flarum/common/Component": +/*!*********************************************************!*\ + !*** external "flarum.core.compat['common/Component']" ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/Component']; + +/***/ }), + +/***/ "flarum/common/Model": +/*!*****************************************************!*\ + !*** external "flarum.core.compat['common/Model']" ***! + \*****************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/Model']; + +/***/ }), + +/***/ "flarum/common/components/Button": +/*!*****************************************************************!*\ + !*** external "flarum.core.compat['common/components/Button']" ***! + \*****************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/components/Button']; + +/***/ }), + +/***/ "flarum/common/components/FieldSet": +/*!*******************************************************************!*\ + !*** external "flarum.core.compat['common/components/FieldSet']" ***! + \*******************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/components/FieldSet']; + +/***/ }), + +/***/ "flarum/common/components/LabelValue": +/*!*********************************************************************!*\ + !*** external "flarum.core.compat['common/components/LabelValue']" ***! + \*********************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/components/LabelValue']; + +/***/ }), + +/***/ "flarum/common/components/LoadingIndicator": +/*!***************************************************************************!*\ + !*** external "flarum.core.compat['common/components/LoadingIndicator']" ***! + \***************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/components/LoadingIndicator']; + +/***/ }), + +/***/ "flarum/common/components/Modal": +/*!****************************************************************!*\ + !*** external "flarum.core.compat['common/components/Modal']" ***! + \****************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/components/Modal']; + +/***/ }), + +/***/ "flarum/common/extend": +/*!******************************************************!*\ + !*** external "flarum.core.compat['common/extend']" ***! + \******************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/extend']; + +/***/ }), + +/***/ "flarum/common/extenders": +/*!*********************************************************!*\ + !*** external "flarum.core.compat['common/extenders']" ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/extenders']; + +/***/ }), + +/***/ "flarum/common/helpers/humanTime": +/*!*****************************************************************!*\ + !*** external "flarum.core.compat['common/helpers/humanTime']" ***! + \*****************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/helpers/humanTime']; + +/***/ }), + +/***/ "flarum/common/helpers/icon": +/*!************************************************************!*\ + !*** external "flarum.core.compat['common/helpers/icon']" ***! + \************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/helpers/icon']; + +/***/ }), + +/***/ "flarum/common/helpers/listItems": +/*!*****************************************************************!*\ + !*** external "flarum.core.compat['common/helpers/listItems']" ***! + \*****************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/helpers/listItems']; + +/***/ }), + +/***/ "flarum/common/utils/ItemList": +/*!**************************************************************!*\ + !*** external "flarum.core.compat['common/utils/ItemList']" ***! + \**************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['common/utils/ItemList']; + +/***/ }), + +/***/ "flarum/forum/app": +/*!**************************************************!*\ + !*** external "flarum.core.compat['forum/app']" ***! + \**************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['forum/app']; + +/***/ }), + +/***/ "flarum/forum/components/LogInButtons": +/*!**********************************************************************!*\ + !*** external "flarum.core.compat['forum/components/LogInButtons']" ***! + \**********************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['forum/components/LogInButtons']; + +/***/ }), + +/***/ "flarum/forum/components/UserSecurityPage": +/*!**************************************************************************!*\ + !*** external "flarum.core.compat['forum/components/UserSecurityPage']" ***! + \**************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = flarum.core.compat['forum/components/UserSecurityPage']; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/regeneratorRuntime.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/regeneratorRuntime.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var _typeof = (__webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/typeof.js")["default"]); +function _regeneratorRuntime() { + "use strict"; + + /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ + module.exports = _regeneratorRuntime = function _regeneratorRuntime() { + return e; + }, module.exports.__esModule = true, module.exports["default"] = module.exports; + var t, + e = {}, + r = Object.prototype, + n = r.hasOwnProperty, + o = Object.defineProperty || function (t, e, r) { + t[e] = r.value; + }, + i = "function" == typeof Symbol ? Symbol : {}, + a = i.iterator || "@@iterator", + c = i.asyncIterator || "@@asyncIterator", + u = i.toStringTag || "@@toStringTag"; + function define(t, e, r) { + return Object.defineProperty(t, e, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }), t[e]; + } + try { + define({}, ""); + } catch (t) { + define = function define(t, e, r) { + return t[e] = r; + }; + } + function wrap(t, e, r, n) { + var i = e && e.prototype instanceof Generator ? e : Generator, + a = Object.create(i.prototype), + c = new Context(n || []); + return o(a, "_invoke", { + value: makeInvokeMethod(t, r, c) + }), a; + } + function tryCatch(t, e, r) { + try { + return { + type: "normal", + arg: t.call(e, r) + }; + } catch (t) { + return { + type: "throw", + arg: t + }; + } + } + e.wrap = wrap; + var h = "suspendedStart", + l = "suspendedYield", + f = "executing", + s = "completed", + y = {}; + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + var p = {}; + define(p, a, function () { + return this; + }); + var d = Object.getPrototypeOf, + v = d && d(d(values([]))); + v && v !== r && n.call(v, a) && (p = v); + var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); + function defineIteratorMethods(t) { + ["next", "throw", "return"].forEach(function (e) { + define(t, e, function (t) { + return this._invoke(e, t); + }); + }); + } + function AsyncIterator(t, e) { + function invoke(r, o, i, a) { + var c = tryCatch(t[r], t, o); + if ("throw" !== c.type) { + var u = c.arg, + h = u.value; + return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { + invoke("next", t, i, a); + }, function (t) { + invoke("throw", t, i, a); + }) : e.resolve(h).then(function (t) { + u.value = t, i(u); + }, function (t) { + return invoke("throw", t, i, a); + }); + } + a(c.arg); + } + var r; + o(this, "_invoke", { + value: function value(t, n) { + function callInvokeWithMethodAndArg() { + return new e(function (e, r) { + invoke(t, n, e, r); + }); + } + return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); + } + }); + } + function makeInvokeMethod(e, r, n) { + var o = h; + return function (i, a) { + if (o === f) throw new Error("Generator is already running"); + if (o === s) { + if ("throw" === i) throw a; + return { + value: t, + done: !0 + }; + } + for (n.method = i, n.arg = a;;) { + var c = n.delegate; + if (c) { + var u = maybeInvokeDelegate(c, n); + if (u) { + if (u === y) continue; + return u; + } + } + if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { + if (o === h) throw o = s, n.arg; + n.dispatchException(n.arg); + } else "return" === n.method && n.abrupt("return", n.arg); + o = f; + var p = tryCatch(e, r, n); + if ("normal" === p.type) { + if (o = n.done ? s : l, p.arg === y) continue; + return { + value: p.arg, + done: n.done + }; + } + "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); + } + }; + } + function maybeInvokeDelegate(e, r) { + var n = r.method, + o = e.iterator[n]; + if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; + var i = tryCatch(o, e.iterator, r.arg); + if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; + var a = i.arg; + return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); + } + function pushTryEntry(t) { + var e = { + tryLoc: t[0] + }; + 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); + } + function resetTryEntry(t) { + var e = t.completion || {}; + e.type = "normal", delete e.arg, t.completion = e; + } + function Context(t) { + this.tryEntries = [{ + tryLoc: "root" + }], t.forEach(pushTryEntry, this), this.reset(!0); + } + function values(e) { + if (e || "" === e) { + var r = e[a]; + if (r) return r.call(e); + if ("function" == typeof e.next) return e; + if (!isNaN(e.length)) { + var o = -1, + i = function next() { + for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; + return next.value = t, next.done = !0, next; + }; + return i.next = i; + } + } + throw new TypeError(_typeof(e) + " is not iterable"); + } + return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { + value: GeneratorFunctionPrototype, + configurable: !0 + }), o(GeneratorFunctionPrototype, "constructor", { + value: GeneratorFunction, + configurable: !0 + }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { + var e = "function" == typeof t && t.constructor; + return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); + }, e.mark = function (t) { + return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; + }, e.awrap = function (t) { + return { + __await: t + }; + }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { + return this; + }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { + void 0 === i && (i = Promise); + var a = new AsyncIterator(wrap(t, r, n, o), i); + return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { + return t.done ? t.value : a.next(); + }); + }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { + return this; + }), define(g, "toString", function () { + return "[object Generator]"; + }), e.keys = function (t) { + var e = Object(t), + r = []; + for (var n in e) r.push(n); + return r.reverse(), function next() { + for (; r.length;) { + var t = r.pop(); + if (t in e) return next.value = t, next.done = !1, next; + } + return next.done = !0, next; + }; + }, e.values = values, Context.prototype = { + constructor: Context, + reset: function reset(e) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); + }, + stop: function stop() { + this.done = !0; + var t = this.tryEntries[0].completion; + if ("throw" === t.type) throw t.arg; + return this.rval; + }, + dispatchException: function dispatchException(e) { + if (this.done) throw e; + var r = this; + function handle(n, o) { + return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; + } + for (var o = this.tryEntries.length - 1; o >= 0; --o) { + var i = this.tryEntries[o], + a = i.completion; + if ("root" === i.tryLoc) return handle("end"); + if (i.tryLoc <= this.prev) { + var c = n.call(i, "catchLoc"), + u = n.call(i, "finallyLoc"); + if (c && u) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } else if (c) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + } else { + if (!u) throw new Error("try statement without catch or finally"); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } + } + } + }, + abrupt: function abrupt(t, e) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { + var i = o; + break; + } + } + i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); + var a = i ? i.completion : {}; + return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); + }, + complete: function complete(t, e) { + if ("throw" === t.type) throw t.arg; + return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; + }, + finish: function finish(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; + } + }, + "catch": function _catch(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.tryLoc === t) { + var n = r.completion; + if ("throw" === n.type) { + var o = n.arg; + resetTryEntry(r); + } + return o; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function delegateYield(e, r, n) { + return this.delegate = { + iterator: values(e), + resultName: r, + nextLoc: n + }, "next" === this.method && (this.arg = t), y; + } + }, e; +} +module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/typeof.js": +/*!*******************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! + \*******************************************************/ +/***/ ((module) => { + +function _typeof(o) { + "@babel/helpers - typeof"; + + return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(o); +} +module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/regenerator/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/regenerator/index.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// TODO(Babel 8): Remove this file. + +var runtime = __webpack_require__(/*! ../helpers/regeneratorRuntime */ "./node_modules/@babel/runtime/helpers/regeneratorRuntime.js")(); +module.exports = runtime; + +// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + if (typeof globalThis === "object") { + globalThis.regeneratorRuntime = runtime; + } else { + Function("r", "regeneratorRuntime = r")(runtime); + } +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _asyncToGenerator) +/* harmony export */ }); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + _next(undefined); + }); + }; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/construct.js": +/*!**************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/construct.js ***! + \**************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _construct) +/* harmony export */ }); +/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); +/* harmony import */ var _isNativeReflectConstruct_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isNativeReflectConstruct.js */ "./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js"); + + +function _construct(Parent, args, Class) { + if ((0,_isNativeReflectConstruct_js__WEBPACK_IMPORTED_MODULE_1__["default"])()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! + \************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _extends) +/* harmony export */ }); +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _getPrototypeOf) +/* harmony export */ }); +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***! + \******************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _inheritsLoose) +/* harmony export */ }); +/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(subClass, superClass); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _isNativeFunction) +/* harmony export */ }); +function _isNativeFunction(fn) { + try { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } catch (e) { + return typeof fn === "function"; + } +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _isNativeReflectConstruct) +/* harmony export */ }); +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _setPrototypeOf) +/* harmony export */ }); +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js": +/*!********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js ***! + \********************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ _wrapNativeSuper) +/* harmony export */ }); +/* harmony import */ var _getPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js"); +/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); +/* harmony import */ var _isNativeFunction_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isNativeFunction.js */ "./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js"); +/* harmony import */ var _construct_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./construct.js */ "./node_modules/@babel/runtime/helpers/esm/construct.js"); + + + + +function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !(0,_isNativeFunction_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return (0,_construct_js__WEBPACK_IMPORTED_MODULE_3__["default"])(Class, arguments, (0,_getPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return (0,_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Wrapper, Class); + }; + return _wrapNativeSuper(Class); +} + +/***/ }), + +/***/ "./node_modules/@simplewebauthn/browser/dist/bundle/index.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@simplewebauthn/browser/dist/bundle/index.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ WebAuthnAbortService: () => (/* binding */ WebAuthnAbortService), +/* harmony export */ base64URLStringToBuffer: () => (/* binding */ base64URLStringToBuffer), +/* harmony export */ browserSupportsWebAuthn: () => (/* binding */ browserSupportsWebAuthn), +/* harmony export */ browserSupportsWebAuthnAutofill: () => (/* binding */ browserSupportsWebAuthnAutofill), +/* harmony export */ bufferToBase64URLString: () => (/* binding */ bufferToBase64URLString), +/* harmony export */ platformAuthenticatorIsAvailable: () => (/* binding */ platformAuthenticatorIsAvailable), +/* harmony export */ startAuthentication: () => (/* binding */ startAuthentication), +/* harmony export */ startRegistration: () => (/* binding */ startRegistration) +/* harmony export */ }); +/* harmony import */ var _babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_helpers_esm_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/wrapNativeSuper */ "./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js"); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + + + + + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +/* [@simplewebauthn/browser@8.3.4] */ +function utf8StringToBuffer(value) { + return new TextEncoder().encode(value); +} +function bufferToBase64URLString(buffer) { + var bytes = new Uint8Array(buffer); + var str = ''; + for (var _iterator = _createForOfIteratorHelperLoose(bytes), _step; !(_step = _iterator()).done;) { + var charCode = _step.value; + str += String.fromCharCode(charCode); + } + var base64String = btoa(str); + return base64String.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); +} +function base64URLStringToBuffer(base64URLString) { + var base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/'); + var padLength = (4 - base64.length % 4) % 4; + var padded = base64.padEnd(base64.length + padLength, '='); + var binary = atob(padded); + var buffer = new ArrayBuffer(binary.length); + var bytes = new Uint8Array(buffer); + for (var i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return buffer; +} +function browserSupportsWebAuthn() { + var _window; + return ((_window = window) == null ? void 0 : _window.PublicKeyCredential) !== undefined && typeof window.PublicKeyCredential === 'function'; +} +function toPublicKeyCredentialDescriptor(descriptor) { + var id = descriptor.id; + return (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_3__["default"])({}, descriptor, { + id: base64URLStringToBuffer(id), + transports: descriptor.transports + }); +} +function isValidDomain(hostname) { + return hostname === 'localhost' || /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(hostname); +} +var WebAuthnError = /*#__PURE__*/function (_Error) { + (0,_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(WebAuthnError, _Error); + function WebAuthnError(_ref) { + var _this; + var message = _ref.message, + code = _ref.code, + cause = _ref.cause, + name = _ref.name; + _this = _Error.call(this, message, { + cause: cause + }) || this; + _this.name = name != null ? name : cause.name; + _this.code = code; + return _this; + } + return WebAuthnError; +}( /*#__PURE__*/(0,_babel_runtime_helpers_esm_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_2__["default"])(Error)); +function identifyRegistrationError(_ref2) { + var error = _ref2.error, + options = _ref2.options; + var publicKey = options.publicKey; + if (!publicKey) { + throw Error('options was missing required publicKey property'); + } + if (error.name === 'AbortError') { + if (options.signal instanceof AbortSignal) { + return new WebAuthnError({ + message: 'Registration ceremony was sent an abort signal', + code: 'ERROR_CEREMONY_ABORTED', + cause: error + }); + } + } else if (error.name === 'ConstraintError') { + var _publicKey$authentica, _publicKey$authentica2; + if (((_publicKey$authentica = publicKey.authenticatorSelection) == null ? void 0 : _publicKey$authentica.requireResidentKey) === true) { + return new WebAuthnError({ + message: 'Discoverable credentials were required but no available authenticator supported it', + code: 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT', + cause: error + }); + } else if (((_publicKey$authentica2 = publicKey.authenticatorSelection) == null ? void 0 : _publicKey$authentica2.userVerification) === 'required') { + return new WebAuthnError({ + message: 'User verification was required but no available authenticator supported it', + code: 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT', + cause: error + }); + } + } else if (error.name === 'InvalidStateError') { + return new WebAuthnError({ + message: 'The authenticator was previously registered', + code: 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED', + cause: error + }); + } else if (error.name === 'NotAllowedError') { + return new WebAuthnError({ + message: error.message, + code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY', + cause: error + }); + } else if (error.name === 'NotSupportedError') { + var validPubKeyCredParams = publicKey.pubKeyCredParams.filter(function (param) { + return param.type === 'public-key'; + }); + if (validPubKeyCredParams.length === 0) { + return new WebAuthnError({ + message: 'No entry in pubKeyCredParams was of type "public-key"', + code: 'ERROR_MALFORMED_PUBKEYCREDPARAMS', + cause: error + }); + } + return new WebAuthnError({ + message: 'No available authenticator supported any of the specified pubKeyCredParams algorithms', + code: 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG', + cause: error + }); + } else if (error.name === 'SecurityError') { + var effectiveDomain = window.location.hostname; + if (!isValidDomain(effectiveDomain)) { + return new WebAuthnError({ + message: window.location.hostname + " is an invalid domain", + code: 'ERROR_INVALID_DOMAIN', + cause: error + }); + } else if (publicKey.rp.id !== effectiveDomain) { + return new WebAuthnError({ + message: "The RP ID \"" + publicKey.rp.id + "\" is invalid for this domain", + code: 'ERROR_INVALID_RP_ID', + cause: error + }); + } + } else if (error.name === 'TypeError') { + if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) { + return new WebAuthnError({ + message: 'User ID was not between 1 and 64 characters', + code: 'ERROR_INVALID_USER_ID_LENGTH', + cause: error + }); + } + } else if (error.name === 'UnknownError') { + return new WebAuthnError({ + message: 'The authenticator was unable to process the specified options, or could not create a new credential', + code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR', + cause: error + }); + } + return error; +} +var BaseWebAuthnAbortService = /*#__PURE__*/function () { + function BaseWebAuthnAbortService() {} + var _proto = BaseWebAuthnAbortService.prototype; + _proto.createNewAbortSignal = function createNewAbortSignal() { + if (this.controller) { + var abortError = new Error('Cancelling existing WebAuthn API call for new one'); + abortError.name = 'AbortError'; + this.controller.abort(abortError); + } + var newController = new AbortController(); + this.controller = newController; + return newController.signal; + }; + _proto.cancelCeremony = function cancelCeremony() { + if (this.controller) { + var abortError = new Error('Manually cancelling existing WebAuthn API call'); + abortError.name = 'AbortError'; + this.controller.abort(abortError); + this.controller = undefined; + } + }; + return BaseWebAuthnAbortService; +}(); +var WebAuthnAbortService = new BaseWebAuthnAbortService(); +var attachments = ['cross-platform', 'platform']; +function toAuthenticatorAttachment(attachment) { + if (!attachment) { + return; + } + if (attachments.indexOf(attachment) < 0) { + return; + } + return attachment; +} +function startRegistration(_x) { + return _startRegistration.apply(this, arguments); +} +function _startRegistration() { + _startRegistration = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_4__.mark(function _callee(creationOptionsJSON) { + var _creationOptionsJSON$; + var publicKey, options, credential, _credential, id, rawId, response, type, transports, responsePublicKeyAlgorithm, responsePublicKey, _publicKey, responseAuthenticatorData; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_4__.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (browserSupportsWebAuthn()) { + _context.next = 2; + break; + } + throw new Error('WebAuthn is not supported in this browser'); + case 2: + publicKey = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_3__["default"])({}, creationOptionsJSON, { + challenge: base64URLStringToBuffer(creationOptionsJSON.challenge), + user: (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_3__["default"])({}, creationOptionsJSON.user, { + id: utf8StringToBuffer(creationOptionsJSON.user.id) + }), + excludeCredentials: (_creationOptionsJSON$ = creationOptionsJSON.excludeCredentials) == null ? void 0 : _creationOptionsJSON$.map(toPublicKeyCredentialDescriptor) + }); + options = { + publicKey: publicKey + }; + options.signal = WebAuthnAbortService.createNewAbortSignal(); + _context.prev = 5; + _context.next = 8; + return navigator.credentials.create(options); + case 8: + credential = _context.sent; + _context.next = 14; + break; + case 11: + _context.prev = 11; + _context.t0 = _context["catch"](5); + throw identifyRegistrationError({ + error: _context.t0, + options: options + }); + case 14: + if (credential) { + _context.next = 16; + break; + } + throw new Error('Registration was not completed'); + case 16: + _credential = credential, id = _credential.id, rawId = _credential.rawId, response = _credential.response, type = _credential.type; + transports = undefined; + if (typeof response.getTransports === 'function') { + transports = response.getTransports(); + } + responsePublicKeyAlgorithm = undefined; + if (typeof response.getPublicKeyAlgorithm === 'function') { + try { + responsePublicKeyAlgorithm = response.getPublicKeyAlgorithm(); + } catch (error) { + warnOnBrokenImplementation('getPublicKeyAlgorithm()', error); + } + } + responsePublicKey = undefined; + if (typeof response.getPublicKey === 'function') { + try { + _publicKey = response.getPublicKey(); + if (_publicKey !== null) { + responsePublicKey = bufferToBase64URLString(_publicKey); + } + } catch (error) { + warnOnBrokenImplementation('getPublicKey()', error); + } + } + if (typeof response.getAuthenticatorData === 'function') { + try { + responseAuthenticatorData = bufferToBase64URLString(response.getAuthenticatorData()); + } catch (error) { + warnOnBrokenImplementation('getAuthenticatorData()', error); + } + } + return _context.abrupt("return", { + id: id, + rawId: bufferToBase64URLString(rawId), + response: { + attestationObject: bufferToBase64URLString(response.attestationObject), + clientDataJSON: bufferToBase64URLString(response.clientDataJSON), + transports: transports, + publicKeyAlgorithm: responsePublicKeyAlgorithm, + publicKey: responsePublicKey, + authenticatorData: responseAuthenticatorData + }, + type: type, + clientExtensionResults: credential.getClientExtensionResults(), + authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment) + }); + case 25: + case "end": + return _context.stop(); + } + }, _callee, null, [[5, 11]]); + })); + return _startRegistration.apply(this, arguments); +} +function warnOnBrokenImplementation(methodName, cause) { + console.warn("The browser extension that intercepted this WebAuthn API call incorrectly implemented " + methodName + ". You should report this error to them.\n", cause); +} +function bufferToUTF8String(value) { + return new TextDecoder('utf-8').decode(value); +} +function browserSupportsWebAuthnAutofill() { + var globalPublicKeyCredential = window.PublicKeyCredential; + if (globalPublicKeyCredential.isConditionalMediationAvailable === undefined) { + return new Promise(function (resolve) { + return resolve(false); + }); + } + return globalPublicKeyCredential.isConditionalMediationAvailable(); +} +function identifyAuthenticationError(_ref3) { + var error = _ref3.error, + options = _ref3.options; + var publicKey = options.publicKey; + if (!publicKey) { + throw Error('options was missing required publicKey property'); + } + if (error.name === 'AbortError') { + if (options.signal instanceof AbortSignal) { + return new WebAuthnError({ + message: 'Authentication ceremony was sent an abort signal', + code: 'ERROR_CEREMONY_ABORTED', + cause: error + }); + } + } else if (error.name === 'NotAllowedError') { + return new WebAuthnError({ + message: error.message, + code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY', + cause: error + }); + } else if (error.name === 'SecurityError') { + var effectiveDomain = window.location.hostname; + if (!isValidDomain(effectiveDomain)) { + return new WebAuthnError({ + message: window.location.hostname + " is an invalid domain", + code: 'ERROR_INVALID_DOMAIN', + cause: error + }); + } else if (publicKey.rpId !== effectiveDomain) { + return new WebAuthnError({ + message: "The RP ID \"" + publicKey.rpId + "\" is invalid for this domain", + code: 'ERROR_INVALID_RP_ID', + cause: error + }); + } + } else if (error.name === 'UnknownError') { + return new WebAuthnError({ + message: 'The authenticator was unable to process the specified options, or could not create a new assertion signature', + code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR', + cause: error + }); + } + return error; +} +function startAuthentication(_x2, _x3) { + return _startAuthentication.apply(this, arguments); +} +function _startAuthentication() { + _startAuthentication = (0,_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__["default"])( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_4__.mark(function _callee2(requestOptionsJSON, useBrowserAutofill) { + var _requestOptionsJSON$a; + var allowCredentials, _requestOptionsJSON$a2, publicKey, options, eligibleInputs, credential, _credential2, id, rawId, response, type, userHandle; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_4__.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + if (useBrowserAutofill === void 0) { + useBrowserAutofill = false; + } + if (browserSupportsWebAuthn()) { + _context2.next = 3; + break; + } + throw new Error('WebAuthn is not supported in this browser'); + case 3: + if (((_requestOptionsJSON$a = requestOptionsJSON.allowCredentials) == null ? void 0 : _requestOptionsJSON$a.length) !== 0) { + allowCredentials = (_requestOptionsJSON$a2 = requestOptionsJSON.allowCredentials) == null ? void 0 : _requestOptionsJSON$a2.map(toPublicKeyCredentialDescriptor); + } + publicKey = (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_3__["default"])({}, requestOptionsJSON, { + challenge: base64URLStringToBuffer(requestOptionsJSON.challenge), + allowCredentials: allowCredentials + }); + options = {}; + if (!useBrowserAutofill) { + _context2.next = 16; + break; + } + _context2.next = 9; + return browserSupportsWebAuthnAutofill(); + case 9: + if (_context2.sent) { + _context2.next = 11; + break; + } + throw Error('Browser does not support WebAuthn autofill'); + case 11: + eligibleInputs = document.querySelectorAll('input[autocomplete$=\'webauthn\']'); + if (!(eligibleInputs.length < 1)) { + _context2.next = 14; + break; + } + throw Error('No with "webauthn" as the only or last value in its `autocomplete` attribute was detected'); + case 14: + options.mediation = 'conditional'; + publicKey.allowCredentials = []; + case 16: + options.publicKey = publicKey; + options.signal = WebAuthnAbortService.createNewAbortSignal(); + _context2.prev = 18; + _context2.next = 21; + return navigator.credentials.get(options); + case 21: + credential = _context2.sent; + _context2.next = 27; + break; + case 24: + _context2.prev = 24; + _context2.t0 = _context2["catch"](18); + throw identifyAuthenticationError({ + error: _context2.t0, + options: options + }); + case 27: + if (credential) { + _context2.next = 29; + break; + } + throw new Error('Authentication was not completed'); + case 29: + _credential2 = credential, id = _credential2.id, rawId = _credential2.rawId, response = _credential2.response, type = _credential2.type; + userHandle = undefined; + if (response.userHandle) { + userHandle = bufferToUTF8String(response.userHandle); + } + return _context2.abrupt("return", { + id: id, + rawId: bufferToBase64URLString(rawId), + response: { + authenticatorData: bufferToBase64URLString(response.authenticatorData), + clientDataJSON: bufferToBase64URLString(response.clientDataJSON), + signature: bufferToBase64URLString(response.signature), + userHandle: userHandle + }, + type: type, + clientExtensionResults: credential.getClientExtensionResults(), + authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment) + }); + case 33: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[18, 24]]); + })); + return _startAuthentication.apply(this, arguments); +} +function platformAuthenticatorIsAvailable() { + if (!browserSupportsWebAuthn()) { + return new Promise(function (resolve) { + return resolve(false); + }); + } + return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(); +} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/*!******************!*\ + !*** ./forum.ts ***! + \******************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ extend: () => (/* reexport safe */ _src_forum__WEBPACK_IMPORTED_MODULE_0__.extend) +/* harmony export */ }); +/* harmony import */ var _src_forum__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/forum */ "./src/forum/index.ts"); + +})(); + +module.exports = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=forum.js.map \ No newline at end of file diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map new file mode 100644 index 0000000..36d8c0c --- /dev/null +++ b/js/dist/forum.js.map @@ -0,0 +1 @@ +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@hikarilan/flarum-passkey-login/./src/forum/components/AddPasskeyButton.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/components/LoginWithPasskeyButton.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/components/PasskeyAliasSetModal.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/components/PasskeyButton.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/components/PasskeyElement.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/components/PasskeySettings.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/extend.ts","webpack://@hikarilan/flarum-passkey-login/./src/forum/extenders/add_passkey_button.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/extenders/add_passkey_settings.tsx","webpack://@hikarilan/flarum-passkey-login/./src/forum/hooks/passkey.ts","webpack://@hikarilan/flarum-passkey-login/./src/forum/index.ts","webpack://@hikarilan/flarum-passkey-login/./src/forum/models/Passkey.ts","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/Component']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/Model']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/components/Button']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/components/FieldSet']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/components/LabelValue']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/extend']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/extenders']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/helpers/humanTime']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/helpers/listItems']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['forum/app']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['forum/components/LogInButtons']\"","webpack://@hikarilan/flarum-passkey-login/external root \"flarum.core.compat['forum/components/UserSecurityPage']\"","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/typeof.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/regenerator/index.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/construct.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","webpack://@hikarilan/flarum-passkey-login/./node_modules/@simplewebauthn/browser/dist/bundle/index.js","webpack://@hikarilan/flarum-passkey-login/webpack/bootstrap","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/compat get default export","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/define property getters","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/hasOwnProperty shorthand","webpack://@hikarilan/flarum-passkey-login/webpack/runtime/make namespace object"],"sourcesContent":["import app from 'flarum/forum/app';\nimport Mithril from 'mithril'\n\nimport {IButtonAttrs} from \"flarum/common/components/Button\";\nimport PasskeyButton from \"./PasskeyButton\";\nimport {createPasskeyCredential} from \"../hooks/passkey\";\n\nexport default class AddPasskeyButton extends PasskeyButton {\n\n static initAttrs(attrs: any) {\n super.initAttrs(attrs);\n\n attrs.className = `Button`;\n\n attrs.onclick = async () => {\n await createPasskeyCredential()\n };\n }\n\n view(vnode: Mithril.VnodeDOM): JSX.Element {\n // @ts-ignore\n const vdom = super.view(vnode);\n vdom.text = app.translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.add-new-passkey') as string\n\n return vdom;\n }\n}\n","import app from 'flarum/forum/app';\nimport Mithril from 'mithril'\n\nimport {IButtonAttrs} from \"flarum/common/components/Button\";\nimport PasskeyButton from \"./PasskeyButton\";\nimport {validatePasskeyCredential} from \"../hooks/passkey\";\n\nexport default class LoginWithPasskeyButton extends PasskeyButton {\n\n static initAttrs(attrs: any) {\n super.initAttrs(attrs);\n\n attrs.className = `Button Button--primary Button--block LogInButton`;\n\n attrs.onclick = async () => {\n await validatePasskeyCredential()\n };\n }\n\n view(vnode: Mithril.VnodeDOM): JSX.Element {\n // @ts-ignore\n const vdom = super.view(vnode);\n vdom.text = app.translator.trans('hikarilan-passkey-login.forum.login.with-passkey') as string\n\n return vdom;\n }\n}\n","import app from 'flarum/forum/app';\r\nimport Modal, {IInternalModalAttrs} from 'flarum/common/components/Modal';\r\nimport Mithril from \"mithril\";\r\nimport Button from \"flarum/common/components/Button\";\r\nimport Passkey from \"../models/Passkey\";\r\n\r\ninterface IAttrs extends IInternalModalAttrs {\r\n id: string\r\n}\r\n\r\ninterface IState {\r\n redraw: boolean\r\n}\r\n\r\nexport default class PasskeyAliasSetModal extends Modal {\r\n\r\n state: IState = {\r\n redraw: false\r\n };\r\n\r\n className(): string {\r\n return \"passkey-alias-set-modal\"\r\n }\r\n\r\n title(): Mithril.Children {\r\n return

{app.translator.trans(\"hikarilan-passkey-login.forum.user.settings.alias-modal.title\")}

\r\n }\r\n\r\n content(): Mithril.Children {\r\n return
\r\n
\r\n

\r\n {app.translator.trans(\"hikarilan-passkey-login.forum.user.settings.alias-modal.label\")}\r\n

\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n }\r\n\r\n async onsubmit(e: SubmitEvent) {\r\n e.preventDefault()\r\n\r\n this.loading = true;\r\n\r\n try {\r\n await (await app.store.find('passkeys', this.attrs.id)).save({\r\n alias: ((e.target as HTMLFormElement).elements.namedItem('alias') as HTMLInputElement)?.value\r\n });\r\n this.state.redraw = true;\r\n } catch (e: unknown) {\r\n throw e;\r\n } finally {\r\n this.loading = false;\r\n }\r\n\r\n await this.hide()\r\n }\r\n\r\n async hide() {\r\n try {\r\n super.hide();\r\n if (!this.state.redraw) {\r\n await app.store.find('passkeys', this.attrs.id)\r\n m.redraw();\r\n }\r\n } finally {\r\n this.state.redraw = false;\r\n }\r\n }\r\n\r\n}\r\n","import Button, {IButtonAttrs} from \"flarum/common/components/Button\";\nimport Mithril from \"mithril\";\nimport {isAvailable} from \"../hooks/passkey\";\n\nexport default class PasskeyButton extends Button {\n\n disabled = false;\n\n async oncreate(vnode: Mithril.VnodeDOM) {\n super.oncreate(vnode);\n\n this.disabled = !await isAvailable();\n m.redraw();\n }\n\n view(vnode: Mithril.VnodeDOM): JSX.Element {\n const vdom = super.view(vnode);\n // @ts-ignore\n vdom.attrs.disabled = this.disabled\n\n return vdom\n }\n\n}\n","import app from 'flarum/forum/app';\r\nimport Component from \"flarum/common/Component\";\r\nimport Passkey from \"../models/Passkey\";\r\nimport Mithril from \"mithril\";\r\nimport icon from \"flarum/common/helpers/icon\";\r\nimport LabelValue from \"flarum/common/components/LabelValue\";\r\nimport humanTime from \"flarum/common/helpers/humanTime\";\r\nimport Button from \"flarum/common/components/Button\";\r\n\r\ninterface IAttrs {\r\n passkey: Passkey\r\n}\r\n\r\nexport default class PasskeyElement extends Component {\r\n\r\n view(vnode: Mithril.Vnode): Mithril.Children {\r\n if (!this.attrs.passkey.exists) return null\r\n return
\r\n
\r\n {icon('fas fa-key')}\r\n
\r\n
\r\n
\r\n \r\n {this.attrs.passkey.alias()?.length ? this.attrs.passkey.alias() : this.attrs.passkey.identifier()}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n }\r\n\r\n async revoke() {\r\n await this.attrs.passkey.delete()\r\n\r\n app.alerts.show({type: 'success'}, app.translator.trans(`hikarilan-passkey-login.forum.user.settings.item.revoke_success`, {count: 1}));\r\n m.redraw();\r\n }\r\n\r\n}\r\n","import app from 'flarum/forum/app';\nimport Component, {ComponentAttrs} from \"flarum/common/Component\";\nimport Mithril from \"mithril\";\nimport FieldSet from \"flarum/common/components/FieldSet\";\nimport AddPasskeyButton from \"./AddPasskeyButton\";\nimport LoadingIndicator from \"flarum/common/components/LoadingIndicator\";\nimport Passkey from \"../models/Passkey\";\nimport listItems from \"flarum/common/helpers/listItems\";\nimport ItemList from \"flarum/common/utils/ItemList\";\nimport PasskeyElement from \"./PasskeyElement\";\n\ninterface IState {\n loading: boolean;\n error: boolean;\n}\n\nexport default class PasskeySettings extends Component {\n\n state: IState = {\n loading: true,\n error: false\n };\n\n async oncreate(vnode: Mithril.VnodeDOM): Promise {\n super.oncreate(vnode);\n await this.loadPasskey();\n }\n\n view(vnode: Mithril.Vnode): Mithril.Children {\n const passkeys = app.store.all('passkeys');\n\n return
\n {app.translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.label')}\n {this.state.loading ? (\n \n ) : this.state.error ? (\n

{app.translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.error')}

\n ) : !passkeys.length ? (\n
{app.translator.trans('core.forum.security.empty_text')}
\n ) : (\n
{listItems(this.generatePasskeysList(passkeys).toArray(), 'div')}
\n )}\n \n
\n }\n\n async loadPasskey() {\n try {\n await app.store.find('passkeys');\n m.redraw();\n } catch (e: unknown) {\n this.state.error = true;\n throw e;\n } finally {\n this.state.loading = false;\n }\n }\n\n generatePasskeysList(passkeys: Passkey[]): ItemList {\n const items = new ItemList();\n\n passkeys.forEach((passkey) => {\n items.add(passkey.identifier(), );\n });\n\n return items;\n }\n\n}\n","import Extend from 'flarum/common/extenders';\nimport Passkey from \"./models/Passkey\";\n\nexport default [\n new Extend.Store()\n .add('passkeys', Passkey),\n];\n","import {extend} from 'flarum/common/extend';\r\nimport LogInButtons from 'flarum/forum/components/LogInButtons';\r\nimport LoginWithPasskeyButton from \"../components/LoginWithPasskeyButton\";\r\n\r\nexport default function addPasskeyButton() {\r\n extend(LogInButtons.prototype, 'items', function (items) {\r\n items.add(\r\n \"login-with-passkey\",\r\n ,\r\n 1\r\n );\r\n });\r\n\r\n}\r\n","import app from 'flarum/forum/app';\nimport {extend} from \"flarum/common/extend\";\nimport UserSecurityPage from \"flarum/forum/components/UserSecurityPage\";\nimport ItemList from \"flarum/common/utils/ItemList\";\nimport Mithril from \"mithril\";\nimport PasskeySettings from \"../components/PasskeySettings\";\n\nexport default function addPasskeySettings() {\n extend(UserSecurityPage.prototype, 'settingsItems', function (items: ItemList) {\n if (this.user !== app.session.user) {\n return;\n }\n\n items.add('passkeys', , 5);\n });\n}\n","import app from 'flarum/forum/app';\nimport {platformAuthenticatorIsAvailable, startAuthentication, startRegistration} from \"@simplewebauthn/browser\";\nimport {\n PublicKeyCredentialCreationOptionsJSON,\n PublicKeyCredentialRequestOptionsJSON\n} from \"@simplewebauthn/typescript-types\";\nimport PasskeyAliasSetModal from \"../components/PasskeyAliasSetModal\";\n\nlet isPlatformAuthenticatorIsAvailable: boolean | null = null\n\nexport async function isAvailable() {\n if (isPlatformAuthenticatorIsAvailable === null) {\n isPlatformAuthenticatorIsAvailable = await platformAuthenticatorIsAvailable()\n }\n return isPlatformAuthenticatorIsAvailable\n}\n\nexport async function createPasskeyCredential() {\n const resp = await app.request({\n url: \"/authorization/passkey/registration/options\",\n method: \"GET\"\n })\n const attResp = await startRegistration(resp)\n const registrationResp = await app.request<{\n id: string\n }>({\n url: \"/authorization/passkey/registration\",\n method: \"POST\",\n headers: {\n 'Content-Type': 'application/json',\n },\n body: attResp\n })\n await requireSetAlias(registrationResp.id)\n}\n\nasync function requireSetAlias(id: string) {\n // @ts-ignore\n app.modal.show(PasskeyAliasSetModal, {id})\n}\n\nexport async function validatePasskeyCredential() {\n const resp = await app.request({\n url: \"/authorization/passkey/assertion/options\",\n method: \"GET\"\n })\n const asrResp = await startAuthentication(resp)\n await app.request({\n url: \"/authorization/passkey/assertion\",\n method: \"POST\",\n headers: {\n 'Content-Type': 'application/json',\n },\n body: asrResp\n })\n window.location.reload()\n}\n","import app from 'flarum/forum/app';\nimport addPasskeyButton from \"./extenders/add_passkey_button\";\nimport addPasskeySettings from \"./extenders/add_passkey_settings\";\n\nexport {default as extend} from './extend';\n\napp.initializers.add('hikarilan/flarum-passkey-login', () => {\n addPasskeyButton()\n addPasskeySettings()\n});\n","import Model from 'flarum/common/Model';\n\nexport default class Passkey extends Model {\n identifier = Model.attribute('id');\n userId = Model.attribute('user_id');\n alias = Model.attribute('alias');\n createdAt = Model.attribute('created_at', (o) => Model.transformDate(o as string));\n lastSeenAt = Model.attribute('last_seen_at', (o) => Model.transformDate(o as string));\n}\n","module.exports = flarum.core.compat['common/Component'];","module.exports = flarum.core.compat['common/Model'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/components/FieldSet'];","module.exports = flarum.core.compat['common/components/LabelValue'];","module.exports = flarum.core.compat['common/components/LoadingIndicator'];","module.exports = flarum.core.compat['common/components/Modal'];","module.exports = flarum.core.compat['common/extend'];","module.exports = flarum.core.compat['common/extenders'];","module.exports = flarum.core.compat['common/helpers/humanTime'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/helpers/listItems'];","module.exports = flarum.core.compat['common/utils/ItemList'];","module.exports = flarum.core.compat['forum/app'];","module.exports = flarum.core.compat['forum/components/LogInButtons'];","module.exports = flarum.core.compat['forum/components/UserSecurityPage'];","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return e;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var t,\n e = {},\n r = Object.prototype,\n n = r.hasOwnProperty,\n o = Object.defineProperty || function (t, e, r) {\n t[e] = r.value;\n },\n i = \"function\" == typeof Symbol ? Symbol : {},\n a = i.iterator || \"@@iterator\",\n c = i.asyncIterator || \"@@asyncIterator\",\n u = i.toStringTag || \"@@toStringTag\";\n function define(t, e, r) {\n return Object.defineProperty(t, e, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), t[e];\n }\n try {\n define({}, \"\");\n } catch (t) {\n define = function define(t, e, r) {\n return t[e] = r;\n };\n }\n function wrap(t, e, r, n) {\n var i = e && e.prototype instanceof Generator ? e : Generator,\n a = Object.create(i.prototype),\n c = new Context(n || []);\n return o(a, \"_invoke\", {\n value: makeInvokeMethod(t, r, c)\n }), a;\n }\n function tryCatch(t, e, r) {\n try {\n return {\n type: \"normal\",\n arg: t.call(e, r)\n };\n } catch (t) {\n return {\n type: \"throw\",\n arg: t\n };\n }\n }\n e.wrap = wrap;\n var h = \"suspendedStart\",\n l = \"suspendedYield\",\n f = \"executing\",\n s = \"completed\",\n y = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var p = {};\n define(p, a, function () {\n return this;\n });\n var d = Object.getPrototypeOf,\n v = d && d(d(values([])));\n v && v !== r && n.call(v, a) && (p = v);\n var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n function defineIteratorMethods(t) {\n [\"next\", \"throw\", \"return\"].forEach(function (e) {\n define(t, e, function (t) {\n return this._invoke(e, t);\n });\n });\n }\n function AsyncIterator(t, e) {\n function invoke(r, o, i, a) {\n var c = tryCatch(t[r], t, o);\n if (\"throw\" !== c.type) {\n var u = c.arg,\n h = u.value;\n return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) {\n invoke(\"next\", t, i, a);\n }, function (t) {\n invoke(\"throw\", t, i, a);\n }) : e.resolve(h).then(function (t) {\n u.value = t, i(u);\n }, function (t) {\n return invoke(\"throw\", t, i, a);\n });\n }\n a(c.arg);\n }\n var r;\n o(this, \"_invoke\", {\n value: function value(t, n) {\n function callInvokeWithMethodAndArg() {\n return new e(function (e, r) {\n invoke(t, n, e, r);\n });\n }\n return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(e, r, n) {\n var o = h;\n return function (i, a) {\n if (o === f) throw new Error(\"Generator is already running\");\n if (o === s) {\n if (\"throw\" === i) throw a;\n return {\n value: t,\n done: !0\n };\n }\n for (n.method = i, n.arg = a;;) {\n var c = n.delegate;\n if (c) {\n var u = maybeInvokeDelegate(c, n);\n if (u) {\n if (u === y) continue;\n return u;\n }\n }\n if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n if (o === h) throw o = s, n.arg;\n n.dispatchException(n.arg);\n } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n o = f;\n var p = tryCatch(e, r, n);\n if (\"normal\" === p.type) {\n if (o = n.done ? s : l, p.arg === y) continue;\n return {\n value: p.arg,\n done: n.done\n };\n }\n \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg);\n }\n };\n }\n function maybeInvokeDelegate(e, r) {\n var n = r.method,\n o = e.iterator[n];\n if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y;\n var i = tryCatch(o, e.iterator, r.arg);\n if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y;\n var a = i.arg;\n return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y);\n }\n function pushTryEntry(t) {\n var e = {\n tryLoc: t[0]\n };\n 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);\n }\n function resetTryEntry(t) {\n var e = t.completion || {};\n e.type = \"normal\", delete e.arg, t.completion = e;\n }\n function Context(t) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], t.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(e) {\n if (e || \"\" === e) {\n var r = e[a];\n if (r) return r.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) {\n var o = -1,\n i = function next() {\n for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;\n return next.value = t, next.done = !0, next;\n };\n return i.next = i;\n }\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), o(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) {\n var e = \"function\" == typeof t && t.constructor;\n return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name));\n }, e.mark = function (t) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t;\n }, e.awrap = function (t) {\n return {\n __await: t\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {\n return this;\n }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {\n void 0 === i && (i = Promise);\n var a = new AsyncIterator(wrap(t, r, n, o), i);\n return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {\n return t.done ? t.value : a.next();\n });\n }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () {\n return this;\n }), define(g, \"toString\", function () {\n return \"[object Generator]\";\n }), e.keys = function (t) {\n var e = Object(t),\n r = [];\n for (var n in e) r.push(n);\n return r.reverse(), function next() {\n for (; r.length;) {\n var t = r.pop();\n if (t in e) return next.value = t, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, e.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(e) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);\n },\n stop: function stop() {\n this.done = !0;\n var t = this.tryEntries[0].completion;\n if (\"throw\" === t.type) throw t.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(e) {\n if (this.done) throw e;\n var r = this;\n function handle(n, o) {\n return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o;\n }\n for (var o = this.tryEntries.length - 1; o >= 0; --o) {\n var i = this.tryEntries[o],\n a = i.completion;\n if (\"root\" === i.tryLoc) return handle(\"end\");\n if (i.tryLoc <= this.prev) {\n var c = n.call(i, \"catchLoc\"),\n u = n.call(i, \"finallyLoc\");\n if (c && u) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n } else if (c) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n } else {\n if (!u) throw new Error(\"try statement without catch or finally\");\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(t, e) {\n for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n var o = this.tryEntries[r];\n if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) {\n var i = o;\n break;\n }\n }\n i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);\n var a = i ? i.completion : {};\n return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a);\n },\n complete: function complete(t, e) {\n if (\"throw\" === t.type) throw t.arg;\n return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y;\n },\n finish: function finish(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;\n }\n },\n \"catch\": function _catch(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.tryLoc === t) {\n var n = r.completion;\n if (\"throw\" === n.type) {\n var o = n.arg;\n resetTryEntry(r);\n }\n return o;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(e, r, n) {\n return this.delegate = {\n iterator: values(e),\n resultName: r,\n nextLoc: n\n }, \"next\" === this.method && (this.arg = t), y;\n }\n }, e;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default function _isNativeFunction(fn) {\n try {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n } catch (e) {\n return typeof fn === \"function\";\n }\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n return _wrapNativeSuper(Class);\n}","/* [@simplewebauthn/browser@8.3.4] */\nfunction utf8StringToBuffer(value) {\n return new TextEncoder().encode(value);\n}\n\nfunction bufferToBase64URLString(buffer) {\n const bytes = new Uint8Array(buffer);\n let str = '';\n for (const charCode of bytes) {\n str += String.fromCharCode(charCode);\n }\n const base64String = btoa(str);\n return base64String.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction base64URLStringToBuffer(base64URLString) {\n const base64 = base64URLString.replace(/-/g, '+').replace(/_/g, '/');\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, '=');\n const binary = atob(padded);\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n\nfunction browserSupportsWebAuthn() {\n return (window?.PublicKeyCredential !== undefined &&\n typeof window.PublicKeyCredential === 'function');\n}\n\nfunction toPublicKeyCredentialDescriptor(descriptor) {\n const { id } = descriptor;\n return {\n ...descriptor,\n id: base64URLStringToBuffer(id),\n transports: descriptor.transports,\n };\n}\n\nfunction isValidDomain(hostname) {\n return (hostname === 'localhost' ||\n /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i.test(hostname));\n}\n\nclass WebAuthnError extends Error {\n constructor({ message, code, cause, name, }) {\n super(message, { cause });\n this.name = name ?? cause.name;\n this.code = code;\n }\n}\n\nfunction identifyRegistrationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n return new WebAuthnError({\n message: 'Registration ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'ConstraintError') {\n if (publicKey.authenticatorSelection?.requireResidentKey === true) {\n return new WebAuthnError({\n message: 'Discoverable credentials were required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT',\n cause: error,\n });\n }\n else if (publicKey.authenticatorSelection?.userVerification === 'required') {\n return new WebAuthnError({\n message: 'User verification was required but no available authenticator supported it',\n code: 'ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT',\n cause: error,\n });\n }\n }\n else if (error.name === 'InvalidStateError') {\n return new WebAuthnError({\n message: 'The authenticator was previously registered',\n code: 'ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED',\n cause: error,\n });\n }\n else if (error.name === 'NotAllowedError') {\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'NotSupportedError') {\n const validPubKeyCredParams = publicKey.pubKeyCredParams.filter((param) => param.type === 'public-key');\n if (validPubKeyCredParams.length === 0) {\n return new WebAuthnError({\n message: 'No entry in pubKeyCredParams was of type \"public-key\"',\n code: 'ERROR_MALFORMED_PUBKEYCREDPARAMS',\n cause: error,\n });\n }\n return new WebAuthnError({\n message: 'No available authenticator supported any of the specified pubKeyCredParams algorithms',\n code: 'ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = window.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n return new WebAuthnError({\n message: `${window.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rp.id !== effectiveDomain) {\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rp.id}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'TypeError') {\n if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) {\n return new WebAuthnError({\n message: 'User ID was not between 1 and 64 characters',\n code: 'ERROR_INVALID_USER_ID_LENGTH',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new credential',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n\nclass BaseWebAuthnAbortService {\n createNewAbortSignal() {\n if (this.controller) {\n const abortError = new Error('Cancelling existing WebAuthn API call for new one');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n }\n const newController = new AbortController();\n this.controller = newController;\n return newController.signal;\n }\n cancelCeremony() {\n if (this.controller) {\n const abortError = new Error('Manually cancelling existing WebAuthn API call');\n abortError.name = 'AbortError';\n this.controller.abort(abortError);\n this.controller = undefined;\n }\n }\n}\nconst WebAuthnAbortService = new BaseWebAuthnAbortService();\n\nconst attachments = ['cross-platform', 'platform'];\nfunction toAuthenticatorAttachment(attachment) {\n if (!attachment) {\n return;\n }\n if (attachments.indexOf(attachment) < 0) {\n return;\n }\n return attachment;\n}\n\nasync function startRegistration(creationOptionsJSON) {\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n const publicKey = {\n ...creationOptionsJSON,\n challenge: base64URLStringToBuffer(creationOptionsJSON.challenge),\n user: {\n ...creationOptionsJSON.user,\n id: utf8StringToBuffer(creationOptionsJSON.user.id),\n },\n excludeCredentials: creationOptionsJSON.excludeCredentials?.map(toPublicKeyCredentialDescriptor),\n };\n const options = { publicKey };\n options.signal = WebAuthnAbortService.createNewAbortSignal();\n let credential;\n try {\n credential = (await navigator.credentials.create(options));\n }\n catch (err) {\n throw identifyRegistrationError({ error: err, options });\n }\n if (!credential) {\n throw new Error('Registration was not completed');\n }\n const { id, rawId, response, type } = credential;\n let transports = undefined;\n if (typeof response.getTransports === 'function') {\n transports = response.getTransports();\n }\n let responsePublicKeyAlgorithm = undefined;\n if (typeof response.getPublicKeyAlgorithm === 'function') {\n try {\n responsePublicKeyAlgorithm = response.getPublicKeyAlgorithm();\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKeyAlgorithm()', error);\n }\n }\n let responsePublicKey = undefined;\n if (typeof response.getPublicKey === 'function') {\n try {\n const _publicKey = response.getPublicKey();\n if (_publicKey !== null) {\n responsePublicKey = bufferToBase64URLString(_publicKey);\n }\n }\n catch (error) {\n warnOnBrokenImplementation('getPublicKey()', error);\n }\n }\n let responseAuthenticatorData;\n if (typeof response.getAuthenticatorData === 'function') {\n try {\n responseAuthenticatorData = bufferToBase64URLString(response.getAuthenticatorData());\n }\n catch (error) {\n warnOnBrokenImplementation('getAuthenticatorData()', error);\n }\n }\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n attestationObject: bufferToBase64URLString(response.attestationObject),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n transports,\n publicKeyAlgorithm: responsePublicKeyAlgorithm,\n publicKey: responsePublicKey,\n authenticatorData: responseAuthenticatorData,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\nfunction warnOnBrokenImplementation(methodName, cause) {\n console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${methodName}. You should report this error to them.\\n`, cause);\n}\n\nfunction bufferToUTF8String(value) {\n return new TextDecoder('utf-8').decode(value);\n}\n\nfunction browserSupportsWebAuthnAutofill() {\n const globalPublicKeyCredential = window\n .PublicKeyCredential;\n if (globalPublicKeyCredential.isConditionalMediationAvailable === undefined) {\n return new Promise((resolve) => resolve(false));\n }\n return globalPublicKeyCredential.isConditionalMediationAvailable();\n}\n\nfunction identifyAuthenticationError({ error, options, }) {\n const { publicKey } = options;\n if (!publicKey) {\n throw Error('options was missing required publicKey property');\n }\n if (error.name === 'AbortError') {\n if (options.signal instanceof AbortSignal) {\n return new WebAuthnError({\n message: 'Authentication ceremony was sent an abort signal',\n code: 'ERROR_CEREMONY_ABORTED',\n cause: error,\n });\n }\n }\n else if (error.name === 'NotAllowedError') {\n return new WebAuthnError({\n message: error.message,\n code: 'ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY',\n cause: error,\n });\n }\n else if (error.name === 'SecurityError') {\n const effectiveDomain = window.location.hostname;\n if (!isValidDomain(effectiveDomain)) {\n return new WebAuthnError({\n message: `${window.location.hostname} is an invalid domain`,\n code: 'ERROR_INVALID_DOMAIN',\n cause: error,\n });\n }\n else if (publicKey.rpId !== effectiveDomain) {\n return new WebAuthnError({\n message: `The RP ID \"${publicKey.rpId}\" is invalid for this domain`,\n code: 'ERROR_INVALID_RP_ID',\n cause: error,\n });\n }\n }\n else if (error.name === 'UnknownError') {\n return new WebAuthnError({\n message: 'The authenticator was unable to process the specified options, or could not create a new assertion signature',\n code: 'ERROR_AUTHENTICATOR_GENERAL_ERROR',\n cause: error,\n });\n }\n return error;\n}\n\nasync function startAuthentication(requestOptionsJSON, useBrowserAutofill = false) {\n if (!browserSupportsWebAuthn()) {\n throw new Error('WebAuthn is not supported in this browser');\n }\n let allowCredentials;\n if (requestOptionsJSON.allowCredentials?.length !== 0) {\n allowCredentials = requestOptionsJSON.allowCredentials?.map(toPublicKeyCredentialDescriptor);\n }\n const publicKey = {\n ...requestOptionsJSON,\n challenge: base64URLStringToBuffer(requestOptionsJSON.challenge),\n allowCredentials,\n };\n const options = {};\n if (useBrowserAutofill) {\n if (!(await browserSupportsWebAuthnAutofill())) {\n throw Error('Browser does not support WebAuthn autofill');\n }\n const eligibleInputs = document.querySelectorAll('input[autocomplete$=\\'webauthn\\']');\n if (eligibleInputs.length < 1) {\n throw Error('No with \"webauthn\" as the only or last value in its `autocomplete` attribute was detected');\n }\n options.mediation = 'conditional';\n publicKey.allowCredentials = [];\n }\n options.publicKey = publicKey;\n options.signal = WebAuthnAbortService.createNewAbortSignal();\n let credential;\n try {\n credential = (await navigator.credentials.get(options));\n }\n catch (err) {\n throw identifyAuthenticationError({ error: err, options });\n }\n if (!credential) {\n throw new Error('Authentication was not completed');\n }\n const { id, rawId, response, type } = credential;\n let userHandle = undefined;\n if (response.userHandle) {\n userHandle = bufferToUTF8String(response.userHandle);\n }\n return {\n id,\n rawId: bufferToBase64URLString(rawId),\n response: {\n authenticatorData: bufferToBase64URLString(response.authenticatorData),\n clientDataJSON: bufferToBase64URLString(response.clientDataJSON),\n signature: bufferToBase64URLString(response.signature),\n userHandle,\n },\n type,\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: toAuthenticatorAttachment(credential.authenticatorAttachment),\n };\n}\n\nfunction platformAuthenticatorIsAvailable() {\n if (!browserSupportsWebAuthn()) {\n return new Promise((resolve) => resolve(false));\n }\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n}\n\nexport { WebAuthnAbortService, base64URLStringToBuffer, browserSupportsWebAuthn, browserSupportsWebAuthnAutofill, bufferToBase64URLString, platformAuthenticatorIsAvailable, startAuthentication, startRegistration };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["app","PasskeyButton","createPasskeyCredential","AddPasskeyButton","_PasskeyButton","_inheritsLoose","apply","arguments","initAttrs","attrs","call","className","onclick","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_callee$","_context","prev","next","stop","_proto","prototype","view","vnode","vdom","text","translator","trans","default","validatePasskeyCredential","LoginWithPasskeyButton","Modal","Button","PasskeyAliasSetModal","_Modal","_this","_len","length","args","Array","_key","concat","state","redraw","title","m","content","type","name","required","minlength","maxlength","placeholder","window","navigator","platform","disabled","loading","onsubmit","_onsubmit","e","_elements$namedItem","preventDefault","store","find","id","sent","save","alias","target","elements","namedItem","value","t0","finish","hide","_x","_hide","_callee2","_callee2$","_context2","isAvailable","_Button","oncreate","_oncreate","Component","icon","LabelValue","humanTime","PasskeyElement","_Component","_this$attrs$passkey$a","passkey","exists","identifier","label","createdAt","lastSeenAt","revoke","_revoke","alerts","show","count","FieldSet","LoadingIndicator","listItems","ItemList","PasskeySettings","error","loadPasskey","passkeys","all","containerClassName","generatePasskeysList","toArray","_loadPasskey","items","forEach","add","Extend","Passkey","Store","extend","LogInButtons","addPasskeyButton","UserSecurityPage","addPasskeySettings","user","session","platformAuthenticatorIsAvailable","startAuthentication","startRegistration","isPlatformAuthenticatorIsAvailable","_isAvailable","abrupt","_createPasskeyCredential","resp","attResp","registrationResp","request","url","method","headers","body","requireSetAlias","_requireSetAlias","_callee3","_callee3$","_context3","modal","_validatePasskeyCredential","_callee4","asrResp","_callee4$","_context4","location","reload","initializers","Model","_Model","attribute","userId","o","transformDate","_typeof","require","module","exports","__esModule","t","r","Object","n","hasOwnProperty","defineProperty","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","Generator","create","Context","makeInvokeMethod","tryCatch","arg","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","delegate","maybeInvokeDelegate","_sent","dispatchException","TypeError","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","displayName","isGeneratorFunction","constructor","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","charAt","slice","rval","handle","complete","_catch","delegateYield","runtime","regeneratorRuntime","accidentalStrictMode","globalThis","Function","asyncGeneratorStep","gen","reject","_next","_throw","key","info","fn","self","err","undefined","isNativeReflectConstruct","_construct","Parent","Class","Reflect","construct","bind","Constructor","instance","_extends","assign","source","_getPrototypeOf","subClass","superClass","_isNativeFunction","toString","indexOf","_isNativeReflectConstruct","sham","Proxy","Boolean","valueOf","_setPrototypeOf","isNativeFunction","_wrapNativeSuper","_cache","Map","has","get","set","Wrapper","utf8StringToBuffer","TextEncoder","encode","bufferToBase64URLString","buffer","bytes","Uint8Array","str","_iterator","_createForOfIteratorHelperLoose","_step","charCode","String","fromCharCode","base64String","btoa","replace","base64URLStringToBuffer","base64URLString","base64","padLength","padded","padEnd","binary","atob","ArrayBuffer","charCodeAt","browserSupportsWebAuthn","_window","PublicKeyCredential","toPublicKeyCredentialDescriptor","descriptor","transports","isValidDomain","hostname","test","WebAuthnError","_Error","_ref","message","code","cause","identifyRegistrationError","_ref2","options","publicKey","signal","AbortSignal","_publicKey$authentica","_publicKey$authentica2","authenticatorSelection","requireResidentKey","userVerification","validPubKeyCredParams","pubKeyCredParams","filter","param","effectiveDomain","rp","byteLength","BaseWebAuthnAbortService","createNewAbortSignal","controller","abortError","abort","newController","AbortController","cancelCeremony","WebAuthnAbortService","attachments","toAuthenticatorAttachment","attachment","_startRegistration","creationOptionsJSON","_creationOptionsJSON$","credential","_credential","rawId","response","responsePublicKeyAlgorithm","responsePublicKey","_publicKey","responseAuthenticatorData","challenge","excludeCredentials","map","credentials","getTransports","getPublicKeyAlgorithm","warnOnBrokenImplementation","getPublicKey","getAuthenticatorData","attestationObject","clientDataJSON","publicKeyAlgorithm","authenticatorData","clientExtensionResults","getClientExtensionResults","authenticatorAttachment","methodName","console","warn","bufferToUTF8String","TextDecoder","decode","browserSupportsWebAuthnAutofill","globalPublicKeyCredential","isConditionalMediationAvailable","identifyAuthenticationError","_ref3","rpId","_x2","_x3","_startAuthentication","requestOptionsJSON","useBrowserAutofill","_requestOptionsJSON$a","allowCredentials","_requestOptionsJSON$a2","eligibleInputs","_credential2","userHandle","document","querySelectorAll","mediation","signature","isUserVerifyingPlatformAuthenticatorAvailable"],"sourceRoot":""} \ No newline at end of file diff --git a/js/forum.ts b/js/forum.ts index f49b871..facb26f 100644 --- a/js/forum.ts +++ b/js/forum.ts @@ -1,2 +1 @@ -export * from './src/common'; export * from './src/forum'; diff --git a/js/package.json b/js/package.json index 13e5c3d..6365976 100644 --- a/js/package.json +++ b/js/package.json @@ -24,5 +24,8 @@ "check-typings": "tsc --noEmit --emitDeclarationOnly false", "check-typings-coverage": "typescript-coverage-report" }, - "prettier": "@flarum/prettier-config" + "prettier": "@flarum/prettier-config", + "dependencies": { + "@simplewebauthn/browser": "^8.3.4" + } } diff --git a/js/src/admin/index.ts b/js/src/admin/index.ts index b6eed54..c99b08e 100644 --- a/js/src/admin/index.ts +++ b/js/src/admin/index.ts @@ -1,5 +1,24 @@ import app from 'flarum/admin/app'; app.initializers.add('hikarilan/flarum-passkey-login', () => { - console.log('[hikarilan/flarum-passkey-login] Hello, admin!'); + app.extensionData.for("hikarilan-passkey-login") + .registerSetting({ + setting: "hikarilan-passkey-login.relying_party.name", + label: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.name.label'), + help: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.name.help'), + type: "text", + }) + .registerSetting({ + setting: "hikarilan-passkey-login.relying_party.id", + label: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.id.label'), + help: app.translator.trans('hikarilan-passkey-login.admin.settings.relying_party.id.help'), + type: "text", + }) + .registerSetting({ + setting: "hikarilan-passkey-login.timeout", + label: app.translator.trans('hikarilan-passkey-login.admin.settings.timeout.label'), + help: app.translator.trans('hikarilan-passkey-login.admin.settings.timeout.help'), + type: "number", + min: 1 + }) }); diff --git a/js/src/common/index.ts b/js/src/common/index.ts deleted file mode 100644 index b3dd1bb..0000000 --- a/js/src/common/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import app from 'flarum/common/app'; - -app.initializers.add('hikarilan/flarum-passkey-login', () => { - console.log('[hikarilan/flarum-passkey-login] Hello, forum and admin!'); -}); diff --git a/js/src/forum/components/AddPasskeyButton.tsx b/js/src/forum/components/AddPasskeyButton.tsx new file mode 100644 index 0000000..cdd6fe5 --- /dev/null +++ b/js/src/forum/components/AddPasskeyButton.tsx @@ -0,0 +1,27 @@ +import app from 'flarum/forum/app'; +import Mithril from 'mithril' + +import {IButtonAttrs} from "flarum/common/components/Button"; +import PasskeyButton from "./PasskeyButton"; +import {createPasskeyCredential} from "../hooks/passkey"; + +export default class AddPasskeyButton extends PasskeyButton { + + static initAttrs(attrs: any) { + super.initAttrs(attrs); + + attrs.className = `Button`; + + attrs.onclick = async () => { + await createPasskeyCredential() + }; + } + + view(vnode: Mithril.VnodeDOM): JSX.Element { + // @ts-ignore + const vdom = super.view(vnode); + vdom.text = app.translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.add-new-passkey') as string + + return vdom; + } +} diff --git a/js/src/forum/components/LoginWithPasskeyButton.tsx b/js/src/forum/components/LoginWithPasskeyButton.tsx new file mode 100644 index 0000000..793cd3f --- /dev/null +++ b/js/src/forum/components/LoginWithPasskeyButton.tsx @@ -0,0 +1,27 @@ +import app from 'flarum/forum/app'; +import Mithril from 'mithril' + +import {IButtonAttrs} from "flarum/common/components/Button"; +import PasskeyButton from "./PasskeyButton"; +import {validatePasskeyCredential} from "../hooks/passkey"; + +export default class LoginWithPasskeyButton extends PasskeyButton { + + static initAttrs(attrs: any) { + super.initAttrs(attrs); + + attrs.className = `Button Button--primary Button--block LogInButton`; + + attrs.onclick = async () => { + await validatePasskeyCredential() + }; + } + + view(vnode: Mithril.VnodeDOM): JSX.Element { + // @ts-ignore + const vdom = super.view(vnode); + vdom.text = app.translator.trans('hikarilan-passkey-login.forum.login.with-passkey') as string + + return vdom; + } +} diff --git a/js/src/forum/components/PasskeyAliasSetModal.tsx b/js/src/forum/components/PasskeyAliasSetModal.tsx new file mode 100644 index 0000000..901aef2 --- /dev/null +++ b/js/src/forum/components/PasskeyAliasSetModal.tsx @@ -0,0 +1,80 @@ +import app from 'flarum/forum/app'; +import Modal, {IInternalModalAttrs} from 'flarum/common/components/Modal'; +import Mithril from "mithril"; +import Button from "flarum/common/components/Button"; +import Passkey from "../models/Passkey"; + +interface IAttrs extends IInternalModalAttrs { + id: string +} + +interface IState { + redraw: boolean +} + +export default class PasskeyAliasSetModal extends Modal { + + state: IState = { + redraw: false + }; + + className(): string { + return "passkey-alias-set-modal" + } + + title(): Mithril.Children { + return

{app.translator.trans("hikarilan-passkey-login.forum.user.settings.alias-modal.title")}

+ } + + content(): Mithril.Children { + return
+
+

+ {app.translator.trans("hikarilan-passkey-login.forum.user.settings.alias-modal.label")} +

+
+ +
+
+ +
+
+
+ } + + async onsubmit(e: SubmitEvent) { + e.preventDefault() + + this.loading = true; + + try { + await (await app.store.find('passkeys', this.attrs.id)).save({ + alias: ((e.target as HTMLFormElement).elements.namedItem('alias') as HTMLInputElement)?.value + }); + this.state.redraw = true; + } catch (e: unknown) { + throw e; + } finally { + this.loading = false; + } + + await this.hide() + } + + async hide() { + try { + super.hide(); + if (!this.state.redraw) { + await app.store.find('passkeys', this.attrs.id) + m.redraw(); + } + } finally { + this.state.redraw = false; + } + } + +} diff --git a/js/src/forum/components/PasskeyButton.tsx b/js/src/forum/components/PasskeyButton.tsx new file mode 100644 index 0000000..9142f4a --- /dev/null +++ b/js/src/forum/components/PasskeyButton.tsx @@ -0,0 +1,24 @@ +import Button, {IButtonAttrs} from "flarum/common/components/Button"; +import Mithril from "mithril"; +import {isAvailable} from "../hooks/passkey"; + +export default class PasskeyButton extends Button { + + disabled = false; + + async oncreate(vnode: Mithril.VnodeDOM) { + super.oncreate(vnode); + + this.disabled = !await isAvailable(); + m.redraw(); + } + + view(vnode: Mithril.VnodeDOM): JSX.Element { + const vdom = super.view(vnode); + // @ts-ignore + vdom.attrs.disabled = this.disabled + + return vdom + } + +} diff --git a/js/src/forum/components/PasskeyElement.tsx b/js/src/forum/components/PasskeyElement.tsx new file mode 100644 index 0000000..5527139 --- /dev/null +++ b/js/src/forum/components/PasskeyElement.tsx @@ -0,0 +1,52 @@ +import app from 'flarum/forum/app'; +import Component from "flarum/common/Component"; +import Passkey from "../models/Passkey"; +import Mithril from "mithril"; +import icon from "flarum/common/helpers/icon"; +import LabelValue from "flarum/common/components/LabelValue"; +import humanTime from "flarum/common/helpers/humanTime"; +import Button from "flarum/common/components/Button"; + +interface IAttrs { + passkey: Passkey +} + +export default class PasskeyElement extends Component { + + view(vnode: Mithril.Vnode): Mithril.Children { + if (!this.attrs.passkey.exists) return null + return
+
+ {icon('fas fa-key')} +
+
+
+ + {this.attrs.passkey.alias()?.length ? this.attrs.passkey.alias() : this.attrs.passkey.identifier()} + +
+
+ +
+
+ +
+
+
+ +
+
+ } + + async revoke() { + await this.attrs.passkey.delete() + + app.alerts.show({type: 'success'}, app.translator.trans(`hikarilan-passkey-login.forum.user.settings.item.revoke_success`, {count: 1})); + m.redraw(); + } + +} diff --git a/js/src/forum/components/PasskeySettings.tsx b/js/src/forum/components/PasskeySettings.tsx new file mode 100644 index 0000000..5afdff3 --- /dev/null +++ b/js/src/forum/components/PasskeySettings.tsx @@ -0,0 +1,70 @@ +import app from 'flarum/forum/app'; +import Component, {ComponentAttrs} from "flarum/common/Component"; +import Mithril from "mithril"; +import FieldSet from "flarum/common/components/FieldSet"; +import AddPasskeyButton from "./AddPasskeyButton"; +import LoadingIndicator from "flarum/common/components/LoadingIndicator"; +import Passkey from "../models/Passkey"; +import listItems from "flarum/common/helpers/listItems"; +import ItemList from "flarum/common/utils/ItemList"; +import PasskeyElement from "./PasskeyElement"; + +interface IState { + loading: boolean; + error: boolean; +} + +export default class PasskeySettings extends Component { + + state: IState = { + loading: true, + error: false + }; + + async oncreate(vnode: Mithril.VnodeDOM): Promise { + super.oncreate(vnode); + await this.loadPasskey(); + } + + view(vnode: Mithril.Vnode): Mithril.Children { + const passkeys = app.store.all('passkeys'); + + return
+ {app.translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.label')} + {this.state.loading ? ( + + ) : this.state.error ? ( +

{app.translator.trans('hikarilan-passkey-login.forum.user.settings.passkeys.error')}

+ ) : !passkeys.length ? ( +
{app.translator.trans('core.forum.security.empty_text')}
+ ) : ( +
{listItems(this.generatePasskeysList(passkeys).toArray(), 'div')}
+ )} + +
+ } + + async loadPasskey() { + try { + await app.store.find('passkeys'); + m.redraw(); + } catch (e: unknown) { + this.state.error = true; + throw e; + } finally { + this.state.loading = false; + } + } + + generatePasskeysList(passkeys: Passkey[]): ItemList { + const items = new ItemList(); + + passkeys.forEach((passkey) => { + items.add(passkey.identifier(), ); + }); + + return items; + } + +} diff --git a/js/src/forum/extend.ts b/js/src/forum/extend.ts new file mode 100644 index 0000000..c7b17bd --- /dev/null +++ b/js/src/forum/extend.ts @@ -0,0 +1,7 @@ +import Extend from 'flarum/common/extenders'; +import Passkey from "./models/Passkey"; + +export default [ + new Extend.Store() + .add('passkeys', Passkey), +]; diff --git a/js/src/forum/extenders/add_passkey_button.tsx b/js/src/forum/extenders/add_passkey_button.tsx new file mode 100644 index 0000000..2f04c8f --- /dev/null +++ b/js/src/forum/extenders/add_passkey_button.tsx @@ -0,0 +1,14 @@ +import {extend} from 'flarum/common/extend'; +import LogInButtons from 'flarum/forum/components/LogInButtons'; +import LoginWithPasskeyButton from "../components/LoginWithPasskeyButton"; + +export default function addPasskeyButton() { + extend(LogInButtons.prototype, 'items', function (items) { + items.add( + "login-with-passkey", + , + 1 + ); + }); + +} diff --git a/js/src/forum/extenders/add_passkey_settings.tsx b/js/src/forum/extenders/add_passkey_settings.tsx new file mode 100644 index 0000000..a493bdf --- /dev/null +++ b/js/src/forum/extenders/add_passkey_settings.tsx @@ -0,0 +1,16 @@ +import app from 'flarum/forum/app'; +import {extend} from "flarum/common/extend"; +import UserSecurityPage from "flarum/forum/components/UserSecurityPage"; +import ItemList from "flarum/common/utils/ItemList"; +import Mithril from "mithril"; +import PasskeySettings from "../components/PasskeySettings"; + +export default function addPasskeySettings() { + extend(UserSecurityPage.prototype, 'settingsItems', function (items: ItemList) { + if (this.user !== app.session.user) { + return; + } + + items.add('passkeys', , 5); + }); +} diff --git a/js/src/forum/hooks/passkey.ts b/js/src/forum/hooks/passkey.ts new file mode 100644 index 0000000..15c1d0d --- /dev/null +++ b/js/src/forum/hooks/passkey.ts @@ -0,0 +1,57 @@ +import app from 'flarum/forum/app'; +import {platformAuthenticatorIsAvailable, startAuthentication, startRegistration} from "@simplewebauthn/browser"; +import { + PublicKeyCredentialCreationOptionsJSON, + PublicKeyCredentialRequestOptionsJSON +} from "@simplewebauthn/typescript-types"; +import PasskeyAliasSetModal from "../components/PasskeyAliasSetModal"; + +let isPlatformAuthenticatorIsAvailable: boolean | null = null + +export async function isAvailable() { + if (isPlatformAuthenticatorIsAvailable === null) { + isPlatformAuthenticatorIsAvailable = await platformAuthenticatorIsAvailable() + } + return isPlatformAuthenticatorIsAvailable +} + +export async function createPasskeyCredential() { + const resp = await app.request({ + url: "/authorization/passkey/registration/options", + method: "GET" + }) + const attResp = await startRegistration(resp) + const registrationResp = await app.request<{ + id: string + }>({ + url: "/authorization/passkey/registration", + method: "POST", + headers: { + 'Content-Type': 'application/json', + }, + body: attResp + }) + await requireSetAlias(registrationResp.id) +} + +async function requireSetAlias(id: string) { + // @ts-ignore + app.modal.show(PasskeyAliasSetModal, {id}) +} + +export async function validatePasskeyCredential() { + const resp = await app.request({ + url: "/authorization/passkey/assertion/options", + method: "GET" + }) + const asrResp = await startAuthentication(resp) + await app.request({ + url: "/authorization/passkey/assertion", + method: "POST", + headers: { + 'Content-Type': 'application/json', + }, + body: asrResp + }) + window.location.reload() +} diff --git a/js/src/forum/index.ts b/js/src/forum/index.ts index c45d8ad..be55bed 100644 --- a/js/src/forum/index.ts +++ b/js/src/forum/index.ts @@ -1,5 +1,10 @@ import app from 'flarum/forum/app'; +import addPasskeyButton from "./extenders/add_passkey_button"; +import addPasskeySettings from "./extenders/add_passkey_settings"; + +export {default as extend} from './extend'; app.initializers.add('hikarilan/flarum-passkey-login', () => { - console.log('[hikarilan/flarum-passkey-login] Hello, forum!'); + addPasskeyButton() + addPasskeySettings() }); diff --git a/js/src/forum/models/Passkey.ts b/js/src/forum/models/Passkey.ts new file mode 100644 index 0000000..faa7fe6 --- /dev/null +++ b/js/src/forum/models/Passkey.ts @@ -0,0 +1,9 @@ +import Model from 'flarum/common/Model'; + +export default class Passkey extends Model { + identifier = Model.attribute('id'); + userId = Model.attribute('user_id'); + alias = Model.attribute('alias'); + createdAt = Model.attribute('created_at', (o) => Model.transformDate(o as string)); + lastSeenAt = Model.attribute('last_seen_at', (o) => Model.transformDate(o as string)); +} diff --git a/js/tsconfig.json b/js/tsconfig.json index 504f800..849b8f8 100644 --- a/js/tsconfig.json +++ b/js/tsconfig.json @@ -5,20 +5,22 @@ // and also tells your Typescript server to read core's global typings for // access to `dayjs` and `$` in the global namespace. "include": [ - "src/**/*", - "../vendor/*/*/js/dist-typings/@types/**/*", -// -// - "@types/**/*" -], + "src/**/*", + "../vendor/*/*/js/dist-typings/@types/**/*", + // + // + "@types/**/*" + ], "compilerOptions": { // This will output typings to `dist-typings` "declarationDir": "./dist-typings", "baseUrl": ".", "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"], -// -// + "flarum/*": [ + "../vendor/flarum/core/js/dist-typings/*" + ] + // + // } } } diff --git a/js/yarn.lock b/js/yarn.lock index 1cb04df..d6353c4 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -1512,6 +1512,7 @@ __metadata: resolution: "@hikarilan/flarum-passkey-login@workspace:." dependencies: "@flarum/prettier-config": ^1.0.0 + "@simplewebauthn/browser": ^8.3.4 flarum-tsconfig: ^1.0.2 flarum-webpack-config: ^2.0.0 prettier: ^2.5.1 @@ -1634,6 +1635,22 @@ __metadata: languageName: node linkType: hard +"@simplewebauthn/browser@npm:^8.3.4": + version: 8.3.4 + resolution: "@simplewebauthn/browser@npm:8.3.4" + dependencies: + "@simplewebauthn/typescript-types": ^8.3.4 + checksum: dd1365f5a64b957fe9820b465948a99f70d7eb790bd0ec9a105075a91ea6b62b323402fec8c32889ffe9f7853aeea7b971423d688561f2cc922802c6038e543c + languageName: node + linkType: hard + +"@simplewebauthn/typescript-types@npm:^8.3.4": + version: 8.3.4 + resolution: "@simplewebauthn/typescript-types@npm:8.3.4" + checksum: c16484180b18a99a569440dceb0de65727c3cf182aaaa674ce9f6b5bc9e5a4e3978984eb5a6067cf38b6a97a2d603e6190436a19aa443f7b5fceb45bc23aa66f + languageName: node + linkType: hard + "@stardust-ui/react-component-event-listener@npm:~0.38.0": version: 0.38.0 resolution: "@stardust-ui/react-component-event-listener@npm:0.38.0" diff --git a/less/forum.less b/less/forum.less index e69de29..bdf9e50 100644 --- a/less/forum.less +++ b/less/forum.less @@ -0,0 +1,69 @@ +.PasskeysList { + display: flex; + flex-direction: column; + border-radius: var(--border-radius); + overflow: hidden; + width: 100%; + + &-item { + display: flex; + padding: 16px 16px 16px 0; + background-color: var(--control-bg); + color: var(--control-color); + + &-icon { + --font-size: 1.6rem; + font-size: var(--font-size); + width: calc(~"var(--font-size) + 4rem"); + display: flex; + align-items: center; + justify-content: center; + } + + &-title { + font-weight: bold; + + &-sub { + font-style: italic; + } + } + + &-actions { + display: flex; + align-items: center; + margin-left: auto; + + > *:not(:first-child) { + margin-left: 8px; + } + } + + &--active &-title-sub { + color: var(--alert-success-color); + } + } + + &--empty { + color: var(--control-color); + } +} + +@media @phone { + .PasskeysList { + &-item { + flex-wrap: wrap; + padding: 16px; + + &-icon { + justify-content: start; + padding: 8px; + width: auto; + min-width: calc(~"var(--font-size) + 4rem"); + } + + &-actions { + width: auto; + } + } + } +} diff --git a/locale/en.yml b/locale/en.yml index 084ad8c..d3a7b16 100644 --- a/locale/en.yml +++ b/locale/en.yml @@ -1,7 +1,32 @@ hikarilan-passkey-login: - # For more details on the format - # Checkout https://docs.flarum.org/extend/i18n/#appendix-a-standard-key-format admin: - my_cool_key: My Cool Key - + settings: + relying_party: + name: + label: "Relying Party Name" + help: "The Relying Party Name is a human-readable name for your site. + If keep empty, the forum title will be used." + id: + label: "Relying Party ID" + help: "The Relying Party ID is a unique identifier for your site. It shall be the domain of the website without the scheme. + For example, if your website is https://example.com, the rp ID will be example.com. + If keep empty, the current domain will be used." + timeout: + label: "Timeout" + help: "The timeout of the passkey verification in seconds. Default value is 60 seconds." forum: + login: + with-passkey: "Login with passkey" + user: + settings: + passkeys: + title: "Passkey" + label: "Passkey are a password replacement that validates your identity using touch, facial recognition, a device password, or a PIN." + add-new-passkey: "Add a passkey" + error: "An internal error occurred. Please try again later." + alias-modal: + title: "Passkey registered!" + label: "And now, let's give your passkey an alias." + item: + revoke: "=> core.forum.security.revoke_access_token" + revoke_success: "Passkey revoked successfully." diff --git a/locale/zh.yml b/locale/zh.yml new file mode 100644 index 0000000..8fb3314 --- /dev/null +++ b/locale/zh.yml @@ -0,0 +1,31 @@ +hikarilan-passkey-login: + admin: + settings: + relying_party: + name: + label: "信赖方名称(Relying Party Name)" + help: "信赖方名称是您网站的人类可读名称。如果该项保持为空,则使用论坛名称。" + id: + label: "信赖方 ID(Relying Party ID)" + help: "信赖方 ID 是您网站的唯一标识符。它应该是不包括协议头的网站域名。 + 例如,如果您的网站是 https://example.com,那么 rp ID 将是 example.com。 + 如果该项保持为空,则使用当前域名。" + timeout: + label: "超时时间" + help: "Passkey 验证的超时时间,单位为秒。默认值为 60 秒。" + forum: + login: + with-passkey: "使用 passkey 登录" + user: + settings: + passkeys: + title: "Passkey" + label: "Passkey 是一种密码替代方案,它使用指纹、面部识别、设备密码或 PIN 来验证您的身份。" + add-new-passkey: "添加一个 passkey" + error: "发生内部错误。请稍后再试。" + alias-modal: + title: "Passkey 创建成功!" + label: "现在,让我们为您的 passkey 创建一个别名。" + item: + revoke: "=> core.forum.security.revoke_access_token" + revoke_success: "已成功撤销 passkey。" diff --git a/migrations/2023_11_21_000000_create_passkey_table.php b/migrations/2023_11_21_000000_create_passkey_table.php new file mode 100644 index 0000000..926f97b --- /dev/null +++ b/migrations/2023_11_21_000000_create_passkey_table.php @@ -0,0 +1,16 @@ +uuid('id')->primary(); + $table->string('raw_id')->unique(); + $table->integer('user_id')->unsigned()->index(); + $table->text('passkey'); + $table->string('alias', 255)->nullable(); + $table->timestamp('created_at'); + $table->timestamp('last_seen_at')->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); +}); diff --git a/src/Api/Controllers/DeletePasskeyController.php b/src/Api/Controllers/DeletePasskeyController.php new file mode 100644 index 0000000..3fdcac0 --- /dev/null +++ b/src/Api/Controllers/DeletePasskeyController.php @@ -0,0 +1,36 @@ +getQueryParams(), 'id'); + + $actor->assertRegistered(); + + /** @var Passkey $passkey */ + $passkey = Passkey::query()->findOrFail($id); + + if ($passkey->user_id !== $actor->id) { + throw new ValidationException(['passkey' => 'You are not allowed to delete this passkey.']); + } + + $passkey->delete(); + } +} diff --git a/src/Api/Controllers/ListPasskeyController.php b/src/Api/Controllers/ListPasskeyController.php new file mode 100644 index 0000000..ed325bf --- /dev/null +++ b/src/Api/Controllers/ListPasskeyController.php @@ -0,0 +1,31 @@ +assertRegistered(); + + return Passkey::query()->where([ + "user_id" => $actor->id + ])->get(); + } +} diff --git a/src/Api/Controllers/ShowPasskeyController.php b/src/Api/Controllers/ShowPasskeyController.php new file mode 100644 index 0000000..ce25d51 --- /dev/null +++ b/src/Api/Controllers/ShowPasskeyController.php @@ -0,0 +1,40 @@ +getQueryParams(), 'id'); + + $actor->assertRegistered(); + + /** @var Passkey $passkey */ + $passkey = Passkey::query()->findOrFail($id); + + if ($passkey->user_id !== $actor->id) { + throw new ValidationException(['passkey' => 'You are not allowed to access this passkey.']); + } + + return $passkey; + } +} diff --git a/src/Api/Controllers/UpdatePasskeyController.php b/src/Api/Controllers/UpdatePasskeyController.php new file mode 100644 index 0000000..6eaca3f --- /dev/null +++ b/src/Api/Controllers/UpdatePasskeyController.php @@ -0,0 +1,55 @@ +assertRegistered(); + + $data = Arr::get($request->getParsedBody(), 'data'); + $attributes = Arr::get($data, 'attributes'); + + $queryId = Arr::get($request->getQueryParams(), 'id'); + $bodyId = Arr::get($data, 'id'); + if ($queryId !== $bodyId) { + throw new ValidationException(['passkey' => "It's very suspicious that the id in the query and the id in the body are mismatch."]); + } + + /** @var Passkey $passkey */ + $passkey = Passkey::query()->findOrFail($bodyId); + + if ($passkey->user_id !== $actor->id) { + throw new ValidationException(['passkey' => 'You are not allowed to update this passkey.']); + } + + Passkey::query()->where([ + "id" => $passkey->id + ])->update([ + "alias" => Arr::get($attributes, 'alias') + ]); + + + return Passkey::query()->find($passkey->id); + } +} diff --git a/src/Api/Serializers/PasskeySerializer.php b/src/Api/Serializers/PasskeySerializer.php new file mode 100644 index 0000000..bd77071 --- /dev/null +++ b/src/Api/Serializers/PasskeySerializer.php @@ -0,0 +1,26 @@ + $model->id, + 'user_id' => $model->user_id, + 'alias' => $model->alias, + 'created_at' => $this->formatDate($model->created_at), + 'last_seen_at' => $this->formatDate($model->last_seen_at), + ]; + } +} diff --git a/src/Controllers/PasskeyAssertionController.php b/src/Controllers/PasskeyAssertionController.php new file mode 100644 index 0000000..45e3702 --- /dev/null +++ b/src/Controllers/PasskeyAssertionController.php @@ -0,0 +1,131 @@ +cache = $cache; + $this->settings = $settings; + + $this->publicKeyCredentialLoader = $publicKeyCredentialLoader; + $this->authenticatorAssertionResponseValidator = $authenticatorAssertionResponseValidator; + + $this->users = $users; + $this->authenticator = $authenticator; + $this->events = $events; + } + + /** + * @throws InvalidDataException + * @throws Throwable + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + + // when already logged in, just return ok and skip. + if (!$actor->isGuest()) { + return new EmptyResponse(); + } + + $data = (string)$request->getBody(); + + $publicKeyCredential = $this->publicKeyCredentialLoader->load($data); + + $authenticatorAssertionResponse = $publicKeyCredential->response; + if (!$authenticatorAssertionResponse instanceof AuthenticatorAssertionResponse) { + return new JsonResponse([ + "error_msg" => "The public key credential you requested not a AuthenticatorAssertionResponse" + ], 400); + } + + /** @var Passkey|null $passkey + */ + $passkey = Passkey::query()->where([ + 'raw_id' => $publicKeyCredential->id + ])->first(); + if (!$passkey) { + return new JsonResponse([ + "error_msg" => "Passkey not found" + ], 400); + } + + $publicKeyCredentialSource = PublicKeyCredentialSource::createFromArray(json_decode($passkey->passkey, true)); + + /** @var Session\Store $session */ + $session = $request->getAttribute('session'); + + /** @var PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions */ + $publicKeyCredentialRequestOptions = $this->cache->get("passkey_assertion_options_{$session->getId()}"); + + $_rpId = $this->settings->get('hikarilan-passkey-login.relying_party.id'); + $rpId = empty($_rpId) ? $request->getUri()->getHost() : $_rpId; + + $publicKeyCredentialSource = $this->authenticatorAssertionResponseValidator->check( + $publicKeyCredentialSource, + $authenticatorAssertionResponse, + $publicKeyCredentialRequestOptions, + $data, + null, + [$rpId] + ); + + $passkey->update([ + 'passkey' => json_encode($publicKeyCredentialSource) + ]); + + $this->cache->forget("passkey_assertion_options_{$session->getId()}"); + + /** @var User $user */ + $user = $this->users->query()->where([ + 'id' => $passkey->user_id + ])->first(); + if (!$user) { + return new JsonResponse([ + "error_msg" => "User not found" + ], 400); + } + + $token = RememberAccessToken::generate($user->id); + $this->authenticator->logIn($session, $token); + $this->events->dispatch(new LoggedIn($this->users->findOrFail($user->id), $token)); + + return new EmptyResponse(); + } +} diff --git a/src/Controllers/PasskeyAssertionOptionsController.php b/src/Controllers/PasskeyAssertionOptionsController.php new file mode 100644 index 0000000..062fdaf --- /dev/null +++ b/src/Controllers/PasskeyAssertionOptionsController.php @@ -0,0 +1,51 @@ +settings = $settings; + $this->cache = $cache; + } + + /** + * @throws Exception + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $_rpId = $this->settings->get('hikarilan-passkey-login.relying_party.id'); + $rpId = empty($_rpId) ? $request->getUri()->getHost() : $_rpId; + + $timeout = $this->settings->get('hikarilan-passkey-login.timeout', 60); + + $publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions::create( + random_bytes(32), + rpId: $rpId, + userVerification: PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_REQUIRED, + timeout: $timeout * 1000, + ); + + /** @var Session\Store $session */ + $session = $request->getAttribute('session'); + + $this->cache->put("passkey_assertion_options_{$session->getId()}", $publicKeyCredentialRequestOptions, $timeout); + + return new JsonResponse($publicKeyCredentialRequestOptions); + } +} diff --git a/src/Controllers/PasskeyRegistrationController.php b/src/Controllers/PasskeyRegistrationController.php new file mode 100644 index 0000000..23ca95d --- /dev/null +++ b/src/Controllers/PasskeyRegistrationController.php @@ -0,0 +1,89 @@ +cache = $cache; + $this->publicKeyCredentialLoader = $publicKeyCredentialLoader; + $this->authenticatorAttestationResponseValidator = $authenticatorAttestationResponseValidator; + } + + /** + * @throws NotAuthenticatedException + * @throws InvalidDataException + * @throws Throwable + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + + $actor->assertRegistered(); + + $data = (string)$request->getBody(); + + $publicKeyCredential = $this->publicKeyCredentialLoader->load($data); + + $authenticatorAttestationResponse = $publicKeyCredential->response; + if (!$authenticatorAttestationResponse instanceof AuthenticatorAttestationResponse) { + return new JsonResponse([ + "error_msg" => "The public key credential you requested not a AuthenticatorAttestationResponse" + ], 400); + } + + /** @var Session\Store $session */ + $session = $request->getAttribute('session'); + + /** @var PublicKeyCredentialUserEntity $userEntity */ + $userEntity = $this->cache->get("passkey_registration_user_entity_{$session->getId()}"); + /** @var PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions */ + $publicKeyCredentialCreationOptions = $this->cache->get("passkey_registration_options_{$session->getId()}"); + + $publicKeyCredentialSource = $this->authenticatorAttestationResponseValidator->check( + $authenticatorAttestationResponse, + $publicKeyCredentialCreationOptions, + $data + ); + + /** @var Passkey $passkey */ + $passkey = Passkey::query()->create([ + "id" => Uuid::uuid4(), + "raw_id" => $publicKeyCredentialSource->jsonSerialize()['publicKeyCredentialId'], + "user_id" => $userEntity->id, + "passkey" => json_encode($publicKeyCredentialSource) + ]); + + $this->cache->forget("passkey_registration_user_entity_{$session->getId()}"); + $this->cache->forget("passkey_registration_options_{$session->getId()}"); + + return new JsonResponse([ + "id" => $passkey->id, + ], 200); + } +} diff --git a/src/Controllers/PasskeyRegistrationOptionsController.php b/src/Controllers/PasskeyRegistrationOptionsController.php new file mode 100644 index 0000000..5d7b789 --- /dev/null +++ b/src/Controllers/PasskeyRegistrationOptionsController.php @@ -0,0 +1,80 @@ +settings = $settings; + $this->cache = $cache; + } + + /** + * @throws NotAuthenticatedException + * @throws Exception + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + + $actor->assertRegistered(); + + $_rpName = $this->settings->get('hikarilan-passkey-login.relying_party.name'); + $rpName = empty($_rpName) ? $this->settings->get('forum_title', 'Flarum Forum') : $_rpName; + + $_rpId = $this->settings->get('hikarilan-passkey-login.relying_party.id'); + $rpId = empty($_rpId) ? $request->getUri()->getHost() : $_rpId; + + $timeout = $this->settings->get('hikarilan-passkey-login.timeout', 60); + + $rpEntity = PublicKeyCredentialRpEntity::create($rpName, $rpId); + + $userEntity = PublicKeyCredentialUserEntity::create( + $actor->username, + $actor->id, + empty($actor->display_name) ? $actor->username : $actor->display_name, + ); + + $authenticatorSelectionCriteria = AuthenticatorSelectionCriteria::create( + userVerification: AuthenticatorSelectionCriteria::USER_VERIFICATION_REQUIREMENT_REQUIRED, + residentKey: AuthenticatorSelectionCriteria::RESIDENT_KEY_REQUIREMENT_REQUIRED, + requireResidentKey: null + ); + + $publicKeyCredentialCreationOptions = PublicKeyCredentialCreationOptions::create( + $rpEntity, + $userEntity, + random_bytes(16), + authenticatorSelection: $authenticatorSelectionCriteria, + timeout: $timeout * 1000, + ); + + /** @var Session\Store $session */ + $session = $request->getAttribute('session'); + + $this->cache->put("passkey_registration_user_entity_{$session->getId()}", $userEntity, $timeout); + $this->cache->put("passkey_registration_options_{$session->getId()}", $publicKeyCredentialCreationOptions, $timeout); + + return new JsonResponse($publicKeyCredentialCreationOptions); + } +} diff --git a/src/Middleware/ErrorHandler.php b/src/Middleware/ErrorHandler.php new file mode 100644 index 0000000..75203a1 --- /dev/null +++ b/src/Middleware/ErrorHandler.php @@ -0,0 +1,50 @@ +getUri()->getPath(); + $find = false; + foreach ($this->appliedRoutes as $route) { + if (preg_match('/^' . str_replace('/', '\/', $route) . '$/', $path)) { + $find = true; + break; + } + } + + if (!$find) { + return $handler->handle($request); + } + + try { + return $handler->handle($request); + } catch (Throwable $e) { + return new JsonResponse([ + 'error_msg' => $e->getMessage(), + 'stacktrace' => $e->getTraceAsString(), + 'previous' => $e->getPrevious()->getMessage(), + ], 500); + } + } +} diff --git a/src/Models/Passkey.php b/src/Models/Passkey.php new file mode 100644 index 0000000..34daea7 --- /dev/null +++ b/src/Models/Passkey.php @@ -0,0 +1,30 @@ +