diff options
Diffstat (limited to 'dist/settings-vue-settings-personal-webauthn.js.map')
-rw-r--r-- | dist/settings-vue-settings-personal-webauthn.js.map | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/dist/settings-vue-settings-personal-webauthn.js.map b/dist/settings-vue-settings-personal-webauthn.js.map index eb597494f7c..c400ed1770c 100644 --- a/dist/settings-vue-settings-personal-webauthn.js.map +++ b/dist/settings-vue-settings-personal-webauthn.js.map @@ -1 +1 @@ -{"version":3,"file":"settings-vue-settings-personal-webauthn.js?v=4ca04d94b268f2953ad6","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/service/WebAuthnRegistrationSerice.js","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?110a","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?5011","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=template&id=f9b952b4&scoped=true&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?828a","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?06c3","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=template&id=187f22d4&scoped=true&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Section.vue","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Section.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Section.vue?3346","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Section.vue?vue&type=template&id=662cb041&scoped=true&","webpack:///nextcloud/apps/settings/src/main-personal-webauth.js","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\n/**\n *\n */\nexport async function startRegistration() {\n\tconst url = generateUrl('/settings/api/personal/webauthn/registration')\n\n\tconst resp = await axios.get(url)\n\treturn resp.data\n}\n\n/**\n * @param {any} name -\n * @param {any} data -\n */\nexport async function finishRegistration(name, data) {\n\tconst url = generateUrl('/settings/api/personal/webauthn/registration')\n\n\tconst resp = await axios.post(url, { name, data })\n\treturn resp.data\n}\n\n/**\n * @param {any} id -\n */\nexport async function removeRegistration(id) {\n\tconst url = generateUrl(`/settings/api/personal/webauthn/registration/${id}`)\n\n\tawait axios.delete(url)\n}\n","<!--\n - @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @author Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n\n<template>\n\t<div v-if=\"!isHttps && !isLocalhost\">\n\t\t{{ t('settings', 'Passwordless authentication requires a secure connection.') }}\n\t</div>\n\t<div v-else>\n\t\t<div v-if=\"step === RegistrationSteps.READY\">\n\t\t\t<button @click=\"start\">\n\t\t\t\t{{ t('settings', 'Add WebAuthn device') }}\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div v-else-if=\"step === RegistrationSteps.REGISTRATION\"\n\t\t\tclass=\"new-webauthn-device\">\n\t\t\t<span class=\"icon-loading-small webauthn-loading\" />\n\t\t\t{{ t('settings', 'Please authorize your WebAuthn device.') }}\n\t\t</div>\n\n\t\t<div v-else-if=\"step === RegistrationSteps.NAMING\"\n\t\t\tclass=\"new-webauthn-device\">\n\t\t\t<span class=\"icon-loading-small webauthn-loading\" />\n\t\t\t<input v-model=\"name\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:placeholder=\"t('settings', 'Name your device')\"\n\t\t\t\t@:keyup.enter=\"submit\">\n\t\t\t<button @click=\"submit\">\n\t\t\t\t{{ t('settings', 'Add') }}\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div v-else-if=\"step === RegistrationSteps.PERSIST\"\n\t\t\tclass=\"new-webauthn-device\">\n\t\t\t<span class=\"icon-loading-small webauthn-loading\" />\n\t\t\t{{ t('settings', 'Adding your device …') }}\n\t\t</div>\n\n\t\t<div v-else>\n\t\t\tInvalid registration step. This should not have happened.\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport confirmPassword from '@nextcloud/password-confirmation'\n\nimport logger from '../../logger'\nimport {\n\tstartRegistration,\n\tfinishRegistration,\n} from '../../service/WebAuthnRegistrationSerice'\n\nconst logAndPass = (text) => (data) => {\n\tlogger.debug(text)\n\treturn data\n}\n\nconst RegistrationSteps = Object.freeze({\n\tREADY: 1,\n\tREGISTRATION: 2,\n\tNAMING: 3,\n\tPERSIST: 4,\n})\n\nexport default {\n\tname: 'AddDevice',\n\tprops: {\n\t\thttpWarning: Boolean,\n\t\tisHttps: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisLocalhost: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tname: '',\n\t\t\tcredential: {},\n\t\t\tRegistrationSteps,\n\t\t\tstep: RegistrationSteps.READY,\n\t\t}\n\t},\n\tmethods: {\n\t\tarrayToBase64String(a) {\n\t\t\treturn btoa(String.fromCharCode(...a))\n\t\t},\n\t\tstart() {\n\t\t\tthis.step = RegistrationSteps.REGISTRATION\n\t\t\tconsole.debug('Starting WebAuthn registration')\n\n\t\t\treturn confirmPassword()\n\t\t\t\t.then(this.getRegistrationData)\n\t\t\t\t.then(this.register.bind(this))\n\t\t\t\t.then(() => { this.step = RegistrationSteps.NAMING })\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error(err.name, err.message)\n\t\t\t\t\tthis.step = RegistrationSteps.READY\n\t\t\t\t})\n\t\t},\n\n\t\tgetRegistrationData() {\n\t\t\tconsole.debug('Fetching webauthn registration data')\n\n\t\t\tconst base64urlDecode = function(input) {\n\t\t\t\t// Replace non-url compatible chars with base64 standard chars\n\t\t\t\tinput = input\n\t\t\t\t\t.replace(/-/g, '+')\n\t\t\t\t\t.replace(/_/g, '/')\n\n\t\t\t\t// Pad out with standard base64 required padding characters\n\t\t\t\tconst pad = input.length % 4\n\t\t\t\tif (pad) {\n\t\t\t\t\tif (pad === 1) {\n\t\t\t\t\t\tthrow new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding')\n\t\t\t\t\t}\n\t\t\t\t\tinput += new Array(5 - pad).join('=')\n\t\t\t\t}\n\n\t\t\t\treturn window.atob(input)\n\t\t\t}\n\n\t\t\treturn startRegistration()\n\t\t\t\t.then(publicKey => {\n\t\t\t\t\tconsole.debug(publicKey)\n\t\t\t\t\tpublicKey.challenge = Uint8Array.from(base64urlDecode(publicKey.challenge), c => c.charCodeAt(0))\n\t\t\t\t\tpublicKey.user.id = Uint8Array.from(publicKey.user.id, c => c.charCodeAt(0))\n\t\t\t\t\treturn publicKey\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('Error getting webauthn registration data from server', err)\n\t\t\t\t\tthrow new Error(t('settings', 'Server error while trying to add WebAuthn device'))\n\t\t\t\t})\n\t\t},\n\n\t\tregister(publicKey) {\n\t\t\tconsole.debug('starting webauthn registration')\n\n\t\t\treturn navigator.credentials.create({ publicKey })\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.credential = {\n\t\t\t\t\t\tid: data.id,\n\t\t\t\t\t\ttype: data.type,\n\t\t\t\t\t\trawId: this.arrayToBase64String(new Uint8Array(data.rawId)),\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tclientDataJSON: this.arrayToBase64String(new Uint8Array(data.response.clientDataJSON)),\n\t\t\t\t\t\t\tattestationObject: this.arrayToBase64String(new Uint8Array(data.response.attestationObject)),\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\tsubmit() {\n\t\t\tthis.step = RegistrationSteps.PERSIST\n\n\t\t\treturn confirmPassword()\n\t\t\t\t.then(logAndPass('confirmed password'))\n\t\t\t\t.then(this.saveRegistrationData)\n\t\t\t\t.then(logAndPass('registration data saved'))\n\t\t\t\t.then(() => this.reset())\n\t\t\t\t.then(logAndPass('app reset'))\n\t\t\t\t.catch(console.error.bind(this))\n\t\t},\n\n\t\tasync saveRegistrationData() {\n\t\t\ttry {\n\t\t\t\tconst device = await finishRegistration(this.name, JSON.stringify(this.credential))\n\n\t\t\t\tlogger.info('new device added', { device })\n\n\t\t\t\tthis.$emit('added', device)\n\t\t\t} catch (err) {\n\t\t\t\tlogger.error('Error persisting webauthn registration', { error: err })\n\t\t\t\tthrow new Error(t('settings', 'Server error while trying to complete WebAuthn device registration'))\n\t\t\t}\n\t\t},\n\n\t\treset() {\n\t\t\tthis.name = ''\n\t\t\tthis.registrationData = {}\n\t\t\tthis.step = RegistrationSteps.READY\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\t.webauthn-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: 2px;\n\t\tmargin-right: 2px;\n\t}\n\n\t.new-webauthn-device {\n\t\tline-height: 300%;\n\t}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AddDevice.vue?vue&type=template&id=f9b952b4&scoped=true&\"\nimport script from \"./AddDevice.vue?vue&type=script&lang=js&\"\nexport * from \"./AddDevice.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f9b952b4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.isHttps && !_vm.isLocalhost)?_c('div',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('settings', 'Passwordless authentication requires a secure connection.'))+\"\\n\")]):_c('div',[(_vm.step === _vm.RegistrationSteps.READY)?_c('div',[_c('button',{on:{\"click\":_vm.start}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Add WebAuthn device'))+\"\\n\\t\\t\")])]):(_vm.step === _vm.RegistrationSteps.REGISTRATION)?_c('div',{staticClass:\"new-webauthn-device\"},[_c('span',{staticClass:\"icon-loading-small webauthn-loading\"}),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Please authorize your WebAuthn device.'))+\"\\n\\t\")]):(_vm.step === _vm.RegistrationSteps.NAMING)?_c('div',{staticClass:\"new-webauthn-device\"},[_c('span',{staticClass:\"icon-loading-small webauthn-loading\"}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.name),expression:\"name\"}],attrs:{\"type\":\"text\",\"placeholder\":_vm.t('settings', 'Name your device')},domProps:{\"value\":(_vm.name)},on:{\":keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.submit.apply(null, arguments)},\"input\":function($event){if($event.target.composing){ return; }_vm.name=$event.target.value}}}),_vm._v(\" \"),_c('button',{on:{\"click\":_vm.submit}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Add'))+\"\\n\\t\\t\")])]):(_vm.step === _vm.RegistrationSteps.PERSIST)?_c('div',{staticClass:\"new-webauthn-device\"},[_c('span',{staticClass:\"icon-loading-small webauthn-loading\"}),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Adding your device …'))+\"\\n\\t\")]):_c('div',[_vm._v(\"\\n\\t\\tInvalid registration step. This should not have happened.\\n\\t\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=script&lang=js&\"","<!--\n - @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n\n<template>\n\t<div class=\"webauthn-device\">\n\t\t<span class=\"icon-webauthn-device\" />\n\t\t{{ name || t('settings', 'Unnamed device') }}\n\t\t<Actions :force-menu=\"true\">\n\t\t\t<ActionButton icon=\"icon-delete\" @click=\"$emit('delete')\">\n\t\t\t\t{{ t('settings', 'Delete') }}\n\t\t\t</ActionButton>\n\t\t</Actions>\n\t</div>\n</template>\n\n<script>\nimport Actions from '@nextcloud/vue/dist/Components/Actions'\nimport ActionButton from '@nextcloud/vue/dist/Components/ActionButton'\n\nexport default {\n\tname: 'Device',\n\tcomponents: {\n\t\tActionButton,\n\t\tActions,\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\t.webauthn-device {\n\t\tline-height: 300%;\n\t\tdisplay: flex;\n\t}\n\n\t.icon-webauthn-device {\n\t\tdisplay: inline-block;\n\t\tbackground-size: 100%;\n\t\tpadding: 3px;\n\t\tmargin: 3px;\n\t}\n</style>\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Device.vue?vue&type=template&id=187f22d4&scoped=true&\"\nimport script from \"./Device.vue?vue&type=script&lang=js&\"\nexport * from \"./Device.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"187f22d4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"webauthn-device\"},[_c('span',{staticClass:\"icon-webauthn-device\"}),_vm._v(\"\\n\\t\"+_vm._s(_vm.name || _vm.t('settings', 'Unnamed device'))+\"\\n\\t\"),_c('Actions',{attrs:{\"force-menu\":true}},[_c('ActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){return _vm.$emit('delete')}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Delete'))+\"\\n\\t\\t\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @author Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n\n<template>\n\t<div id=\"security-webauthn\" class=\"section\">\n\t\t<h2>{{ t('settings', 'Passwordless Authentication') }}</h2>\n\t\t<p class=\"settings-hint hidden-when-empty\">\n\t\t\t{{ t('settings', 'Set up your account for passwordless authentication following the FIDO2 standard.') }}\n\t\t</p>\n\t\t<p v-if=\"devices.length === 0\">\n\t\t\t{{ t('settings', 'No devices configured.') }}\n\t\t</p>\n\t\t<p v-else>\n\t\t\t{{ t('settings', 'The following devices are configured for your account:') }}\n\t\t</p>\n\t\t<Device v-for=\"device in sortedDevices\"\n\t\t\t:key=\"device.id\"\n\t\t\t:name=\"device.name\"\n\t\t\t@delete=\"deleteDevice(device.id)\" />\n\n\t\t<p v-if=\"!hasPublicKeyCredential\" class=\"warning\">\n\t\t\t{{ t('settings', 'Your browser does not support WebAuthn.') }}\n\t\t</p>\n\n\t\t<AddDevice v-if=\"hasPublicKeyCredential\"\n\t\t\t:is-https=\"isHttps\"\n\t\t\t:is-localhost=\"isLocalhost\"\n\t\t\t@added=\"deviceAdded\" />\n\t</div>\n</template>\n\n<script>\nimport confirmPassword from '@nextcloud/password-confirmation'\nimport sortBy from 'lodash/fp/sortBy'\n\nimport AddDevice from './AddDevice'\nimport Device from './Device'\nimport logger from '../../logger'\nimport { removeRegistration } from '../../service/WebAuthnRegistrationSerice'\n\nconst sortByName = sortBy('name')\n\nexport default {\n\tcomponents: {\n\t\tAddDevice,\n\t\tDevice,\n\t},\n\tprops: {\n\t\tinitialDevices: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tisHttps: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisLocalhost: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thasPublicKeyCredential: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdevices: this.initialDevices,\n\t\t}\n\t},\n\tcomputed: {\n\t\tsortedDevices() {\n\t\t\treturn sortByName(this.devices)\n\t\t},\n\t},\n\tmethods: {\n\t\tdeviceAdded(device) {\n\t\t\tlogger.debug(`adding new device to the list ${device.id}`)\n\n\t\t\tthis.devices.push(device)\n\t\t},\n\t\tasync deleteDevice(id) {\n\t\t\tlogger.info(`deleting webauthn device ${id}`)\n\n\t\t\tawait confirmPassword()\n\t\t\tawait removeRegistration(id)\n\n\t\t\tthis.devices = this.devices.filter(d => d.id !== id)\n\n\t\t\tlogger.info(`webauthn device ${id} removed successfully`)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Section.vue?vue&type=template&id=662cb041&scoped=true&\"\nimport script from \"./Section.vue?vue&type=script&lang=js&\"\nexport * from \"./Section.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"662cb041\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"section\",attrs:{\"id\":\"security-webauthn\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Passwordless Authentication')))]),_vm._v(\" \"),_c('p',{staticClass:\"settings-hint hidden-when-empty\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Set up your account for passwordless authentication following the FIDO2 standard.'))+\"\\n\\t\")]),_vm._v(\" \"),(_vm.devices.length === 0)?_c('p',[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'No devices configured.'))+\"\\n\\t\")]):_c('p',[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'The following devices are configured for your account:'))+\"\\n\\t\")]),_vm._v(\" \"),_vm._l((_vm.sortedDevices),function(device){return _c('Device',{key:device.id,attrs:{\"name\":device.name},on:{\"delete\":function($event){return _vm.deleteDevice(device.id)}}})}),_vm._v(\" \"),(!_vm.hasPublicKeyCredential)?_c('p',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Your browser does not support WebAuthn.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.hasPublicKeyCredential)?_c('AddDevice',{attrs:{\"is-https\":_vm.isHttps,\"is-localhost\":_vm.isLocalhost},on:{\"added\":_vm.deviceAdded}}):_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport WebAuthnSection from './components/WebAuthn/Section'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.prototype.t = t\n\nconst View = Vue.extend(WebAuthnSection)\nconst devices = loadState('settings', 'webauthn-devices')\nnew View({\n\tpropsData: {\n\t\tinitialDevices: devices,\n\t\tisHttps: window.location.protocol === 'https:',\n\t\tisLocalhost: window.location.hostname === 'localhost',\n\t\thasPublicKeyCredential: typeof (window.PublicKeyCredential) !== 'undefined',\n\t},\n}).$mount('#security-webauthn')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.webauthn-loading[data-v-f9b952b4] {\\n\\tdisplay: inline-block;\\n\\tvertical-align: sub;\\n\\tmargin-left: 2px;\\n\\tmargin-right: 2px;\\n}\\n.new-webauthn-device[data-v-f9b952b4] {\\n\\tline-height: 300%;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/WebAuthn/AddDevice.vue\"],\"names\":[],\"mappings\":\";AAgNA;CACA,qBAAA;CACA,mBAAA;CACA,gBAAA;CACA,iBAAA;AACA;AAEA;CACA,iBAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\\n -\\n - @author Roeland Jago Douma <roeland@famdouma.nl>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -->\\n\\n<template>\\n\\t<div v-if=\\\"!isHttps && !isLocalhost\\\">\\n\\t\\t{{ t('settings', 'Passwordless authentication requires a secure connection.') }}\\n\\t</div>\\n\\t<div v-else>\\n\\t\\t<div v-if=\\\"step === RegistrationSteps.READY\\\">\\n\\t\\t\\t<button @click=\\\"start\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Add WebAuthn device') }}\\n\\t\\t\\t</button>\\n\\t\\t</div>\\n\\n\\t\\t<div v-else-if=\\\"step === RegistrationSteps.REGISTRATION\\\"\\n\\t\\t\\tclass=\\\"new-webauthn-device\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small webauthn-loading\\\" />\\n\\t\\t\\t{{ t('settings', 'Please authorize your WebAuthn device.') }}\\n\\t\\t</div>\\n\\n\\t\\t<div v-else-if=\\\"step === RegistrationSteps.NAMING\\\"\\n\\t\\t\\tclass=\\\"new-webauthn-device\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small webauthn-loading\\\" />\\n\\t\\t\\t<input v-model=\\\"name\\\"\\n\\t\\t\\t\\ttype=\\\"text\\\"\\n\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Name your device')\\\"\\n\\t\\t\\t\\t@:keyup.enter=\\\"submit\\\">\\n\\t\\t\\t<button @click=\\\"submit\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Add') }}\\n\\t\\t\\t</button>\\n\\t\\t</div>\\n\\n\\t\\t<div v-else-if=\\\"step === RegistrationSteps.PERSIST\\\"\\n\\t\\t\\tclass=\\\"new-webauthn-device\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small webauthn-loading\\\" />\\n\\t\\t\\t{{ t('settings', 'Adding your device …') }}\\n\\t\\t</div>\\n\\n\\t\\t<div v-else>\\n\\t\\t\\tInvalid registration step. This should not have happened.\\n\\t\\t</div>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport confirmPassword from '@nextcloud/password-confirmation'\\n\\nimport logger from '../../logger'\\nimport {\\n\\tstartRegistration,\\n\\tfinishRegistration,\\n} from '../../service/WebAuthnRegistrationSerice'\\n\\nconst logAndPass = (text) => (data) => {\\n\\tlogger.debug(text)\\n\\treturn data\\n}\\n\\nconst RegistrationSteps = Object.freeze({\\n\\tREADY: 1,\\n\\tREGISTRATION: 2,\\n\\tNAMING: 3,\\n\\tPERSIST: 4,\\n})\\n\\nexport default {\\n\\tname: 'AddDevice',\\n\\tprops: {\\n\\t\\thttpWarning: Boolean,\\n\\t\\tisHttps: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t\\tisLocalhost: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tname: '',\\n\\t\\t\\tcredential: {},\\n\\t\\t\\tRegistrationSteps,\\n\\t\\t\\tstep: RegistrationSteps.READY,\\n\\t\\t}\\n\\t},\\n\\tmethods: {\\n\\t\\tarrayToBase64String(a) {\\n\\t\\t\\treturn btoa(String.fromCharCode(...a))\\n\\t\\t},\\n\\t\\tstart() {\\n\\t\\t\\tthis.step = RegistrationSteps.REGISTRATION\\n\\t\\t\\tconsole.debug('Starting WebAuthn registration')\\n\\n\\t\\t\\treturn confirmPassword()\\n\\t\\t\\t\\t.then(this.getRegistrationData)\\n\\t\\t\\t\\t.then(this.register.bind(this))\\n\\t\\t\\t\\t.then(() => { this.step = RegistrationSteps.NAMING })\\n\\t\\t\\t\\t.catch(err => {\\n\\t\\t\\t\\t\\tconsole.error(err.name, err.message)\\n\\t\\t\\t\\t\\tthis.step = RegistrationSteps.READY\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tgetRegistrationData() {\\n\\t\\t\\tconsole.debug('Fetching webauthn registration data')\\n\\n\\t\\t\\tconst base64urlDecode = function(input) {\\n\\t\\t\\t\\t// Replace non-url compatible chars with base64 standard chars\\n\\t\\t\\t\\tinput = input\\n\\t\\t\\t\\t\\t.replace(/-/g, '+')\\n\\t\\t\\t\\t\\t.replace(/_/g, '/')\\n\\n\\t\\t\\t\\t// Pad out with standard base64 required padding characters\\n\\t\\t\\t\\tconst pad = input.length % 4\\n\\t\\t\\t\\tif (pad) {\\n\\t\\t\\t\\t\\tif (pad === 1) {\\n\\t\\t\\t\\t\\t\\tthrow new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding')\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tinput += new Array(5 - pad).join('=')\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn window.atob(input)\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn startRegistration()\\n\\t\\t\\t\\t.then(publicKey => {\\n\\t\\t\\t\\t\\tconsole.debug(publicKey)\\n\\t\\t\\t\\t\\tpublicKey.challenge = Uint8Array.from(base64urlDecode(publicKey.challenge), c => c.charCodeAt(0))\\n\\t\\t\\t\\t\\tpublicKey.user.id = Uint8Array.from(publicKey.user.id, c => c.charCodeAt(0))\\n\\t\\t\\t\\t\\treturn publicKey\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch(err => {\\n\\t\\t\\t\\t\\tconsole.error('Error getting webauthn registration data from server', err)\\n\\t\\t\\t\\t\\tthrow new Error(t('settings', 'Server error while trying to add WebAuthn device'))\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tregister(publicKey) {\\n\\t\\t\\tconsole.debug('starting webauthn registration')\\n\\n\\t\\t\\treturn navigator.credentials.create({ publicKey })\\n\\t\\t\\t\\t.then(data => {\\n\\t\\t\\t\\t\\tthis.credential = {\\n\\t\\t\\t\\t\\t\\tid: data.id,\\n\\t\\t\\t\\t\\t\\ttype: data.type,\\n\\t\\t\\t\\t\\t\\trawId: this.arrayToBase64String(new Uint8Array(data.rawId)),\\n\\t\\t\\t\\t\\t\\tresponse: {\\n\\t\\t\\t\\t\\t\\t\\tclientDataJSON: this.arrayToBase64String(new Uint8Array(data.response.clientDataJSON)),\\n\\t\\t\\t\\t\\t\\t\\tattestationObject: this.arrayToBase64String(new Uint8Array(data.response.attestationObject)),\\n\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tsubmit() {\\n\\t\\t\\tthis.step = RegistrationSteps.PERSIST\\n\\n\\t\\t\\treturn confirmPassword()\\n\\t\\t\\t\\t.then(logAndPass('confirmed password'))\\n\\t\\t\\t\\t.then(this.saveRegistrationData)\\n\\t\\t\\t\\t.then(logAndPass('registration data saved'))\\n\\t\\t\\t\\t.then(() => this.reset())\\n\\t\\t\\t\\t.then(logAndPass('app reset'))\\n\\t\\t\\t\\t.catch(console.error.bind(this))\\n\\t\\t},\\n\\n\\t\\tasync saveRegistrationData() {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tconst device = await finishRegistration(this.name, JSON.stringify(this.credential))\\n\\n\\t\\t\\t\\tlogger.info('new device added', { device })\\n\\n\\t\\t\\t\\tthis.$emit('added', device)\\n\\t\\t\\t} catch (err) {\\n\\t\\t\\t\\tlogger.error('Error persisting webauthn registration', { error: err })\\n\\t\\t\\t\\tthrow new Error(t('settings', 'Server error while trying to complete WebAuthn device registration'))\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\treset() {\\n\\t\\t\\tthis.name = ''\\n\\t\\t\\tthis.registrationData = {}\\n\\t\\t\\tthis.step = RegistrationSteps.READY\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style scoped>\\n\\t.webauthn-loading {\\n\\t\\tdisplay: inline-block;\\n\\t\\tvertical-align: sub;\\n\\t\\tmargin-left: 2px;\\n\\t\\tmargin-right: 2px;\\n\\t}\\n\\n\\t.new-webauthn-device {\\n\\t\\tline-height: 300%;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.webauthn-device[data-v-187f22d4] {\\n\\tline-height: 300%;\\n\\tdisplay: flex;\\n}\\n.icon-webauthn-device[data-v-187f22d4] {\\n\\tdisplay: inline-block;\\n\\tbackground-size: 100%;\\n\\tpadding: 3px;\\n\\tmargin: 3px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/WebAuthn/Device.vue\"],\"names\":[],\"mappings\":\";AAqDA;CACA,iBAAA;CACA,aAAA;AACA;AAEA;CACA,qBAAA;CACA,qBAAA;CACA,YAAA;CACA,WAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\\n -\\n - @author 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -->\\n\\n<template>\\n\\t<div class=\\\"webauthn-device\\\">\\n\\t\\t<span class=\\\"icon-webauthn-device\\\" />\\n\\t\\t{{ name || t('settings', 'Unnamed device') }}\\n\\t\\t<Actions :force-menu=\\\"true\\\">\\n\\t\\t\\t<ActionButton icon=\\\"icon-delete\\\" @click=\\\"$emit('delete')\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Delete') }}\\n\\t\\t\\t</ActionButton>\\n\\t\\t</Actions>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport Actions from '@nextcloud/vue/dist/Components/Actions'\\nimport ActionButton from '@nextcloud/vue/dist/Components/ActionButton'\\n\\nexport default {\\n\\tname: 'Device',\\n\\tcomponents: {\\n\\t\\tActionButton,\\n\\t\\tActions,\\n\\t},\\n\\tprops: {\\n\\t\\tname: {\\n\\t\\t\\ttype: String,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style scoped>\\n\\t.webauthn-device {\\n\\t\\tline-height: 300%;\\n\\t\\tdisplay: flex;\\n\\t}\\n\\n\\t.icon-webauthn-device {\\n\\t\\tdisplay: inline-block;\\n\\t\\tbackground-size: 100%;\\n\\t\\tpadding: 3px;\\n\\t\\tmargin: 3px;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(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};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 602;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t602: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [874], function() { return __webpack_require__(9802); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","getLoggerBuilder","setApp","detectUser","build","url","generateUrl","axios","resp","data","finishRegistration","name","removeRegistration","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","component","_vm","this","_h","$createElement","_c","_self","isHttps","isLocalhost","step","RegistrationSteps","READY","on","start","_v","_s","t","REGISTRATION","staticClass","NAMING","directives","rawName","value","expression","attrs","domProps","$event","type","indexOf","_k","keyCode","key","submit","apply","arguments","target","composing","PERSIST","$emit","devices","length","_l","device","deleteDevice","hasPublicKeyCredential","_e","deviceAdded","__webpack_nonce__","btoa","OC","requestToken","Vue","WebAuthnSection","propsData","initialDevices","loadState","window","location","protocol","hostname","PublicKeyCredential","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file +{"version":3,"file":"settings-vue-settings-personal-webauthn.js?v=c68811f49af02165758f","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/logger.js","webpack:///nextcloud/apps/settings/src/service/WebAuthnRegistrationSerice.js","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?110a","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?5011","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=template&id=f9b952b4&scoped=true&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=script&lang=js&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?828a","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?06c3","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=template&id=187f22d4&scoped=true&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Section.vue","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Section.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Section.vue?3346","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Section.vue?vue&type=template&id=662cb041&scoped=true&","webpack:///nextcloud/apps/settings/src/main-personal-webauth.js","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/amd define","webpack:///nextcloud/webpack/runtime/amd options","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport default getLoggerBuilder()\n\t.setApp('settings')\n\t.detectUser()\n\t.build()\n","/**\n * @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\n/**\n *\n */\nexport async function startRegistration() {\n\tconst url = generateUrl('/settings/api/personal/webauthn/registration')\n\n\tconst resp = await axios.get(url)\n\treturn resp.data\n}\n\n/**\n * @param {any} name -\n * @param {any} data -\n */\nexport async function finishRegistration(name, data) {\n\tconst url = generateUrl('/settings/api/personal/webauthn/registration')\n\n\tconst resp = await axios.post(url, { name, data })\n\treturn resp.data\n}\n\n/**\n * @param {any} id -\n */\nexport async function removeRegistration(id) {\n\tconst url = generateUrl(`/settings/api/personal/webauthn/registration/${id}`)\n\n\tawait axios.delete(url)\n}\n","<!--\n - @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @author Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n\n<template>\n\t<div v-if=\"!isHttps && !isLocalhost\">\n\t\t{{ t('settings', 'Passwordless authentication requires a secure connection.') }}\n\t</div>\n\t<div v-else>\n\t\t<div v-if=\"step === RegistrationSteps.READY\">\n\t\t\t<button @click=\"start\">\n\t\t\t\t{{ t('settings', 'Add WebAuthn device') }}\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div v-else-if=\"step === RegistrationSteps.REGISTRATION\"\n\t\t\tclass=\"new-webauthn-device\">\n\t\t\t<span class=\"icon-loading-small webauthn-loading\" />\n\t\t\t{{ t('settings', 'Please authorize your WebAuthn device.') }}\n\t\t</div>\n\n\t\t<div v-else-if=\"step === RegistrationSteps.NAMING\"\n\t\t\tclass=\"new-webauthn-device\">\n\t\t\t<span class=\"icon-loading-small webauthn-loading\" />\n\t\t\t<input v-model=\"name\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:placeholder=\"t('settings', 'Name your device')\"\n\t\t\t\t@:keyup.enter=\"submit\">\n\t\t\t<button @click=\"submit\">\n\t\t\t\t{{ t('settings', 'Add') }}\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div v-else-if=\"step === RegistrationSteps.PERSIST\"\n\t\t\tclass=\"new-webauthn-device\">\n\t\t\t<span class=\"icon-loading-small webauthn-loading\" />\n\t\t\t{{ t('settings', 'Adding your device …') }}\n\t\t</div>\n\n\t\t<div v-else>\n\t\t\tInvalid registration step. This should not have happened.\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport confirmPassword from '@nextcloud/password-confirmation'\n\nimport logger from '../../logger'\nimport {\n\tstartRegistration,\n\tfinishRegistration,\n} from '../../service/WebAuthnRegistrationSerice'\n\nconst logAndPass = (text) => (data) => {\n\tlogger.debug(text)\n\treturn data\n}\n\nconst RegistrationSteps = Object.freeze({\n\tREADY: 1,\n\tREGISTRATION: 2,\n\tNAMING: 3,\n\tPERSIST: 4,\n})\n\nexport default {\n\tname: 'AddDevice',\n\tprops: {\n\t\thttpWarning: Boolean,\n\t\tisHttps: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisLocalhost: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tname: '',\n\t\t\tcredential: {},\n\t\t\tRegistrationSteps,\n\t\t\tstep: RegistrationSteps.READY,\n\t\t}\n\t},\n\tmethods: {\n\t\tarrayToBase64String(a) {\n\t\t\treturn btoa(String.fromCharCode(...a))\n\t\t},\n\t\tstart() {\n\t\t\tthis.step = RegistrationSteps.REGISTRATION\n\t\t\tconsole.debug('Starting WebAuthn registration')\n\n\t\t\treturn confirmPassword()\n\t\t\t\t.then(this.getRegistrationData)\n\t\t\t\t.then(this.register.bind(this))\n\t\t\t\t.then(() => { this.step = RegistrationSteps.NAMING })\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error(err.name, err.message)\n\t\t\t\t\tthis.step = RegistrationSteps.READY\n\t\t\t\t})\n\t\t},\n\n\t\tgetRegistrationData() {\n\t\t\tconsole.debug('Fetching webauthn registration data')\n\n\t\t\tconst base64urlDecode = function(input) {\n\t\t\t\t// Replace non-url compatible chars with base64 standard chars\n\t\t\t\tinput = input\n\t\t\t\t\t.replace(/-/g, '+')\n\t\t\t\t\t.replace(/_/g, '/')\n\n\t\t\t\t// Pad out with standard base64 required padding characters\n\t\t\t\tconst pad = input.length % 4\n\t\t\t\tif (pad) {\n\t\t\t\t\tif (pad === 1) {\n\t\t\t\t\t\tthrow new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding')\n\t\t\t\t\t}\n\t\t\t\t\tinput += new Array(5 - pad).join('=')\n\t\t\t\t}\n\n\t\t\t\treturn window.atob(input)\n\t\t\t}\n\n\t\t\treturn startRegistration()\n\t\t\t\t.then(publicKey => {\n\t\t\t\t\tconsole.debug(publicKey)\n\t\t\t\t\tpublicKey.challenge = Uint8Array.from(base64urlDecode(publicKey.challenge), c => c.charCodeAt(0))\n\t\t\t\t\tpublicKey.user.id = Uint8Array.from(publicKey.user.id, c => c.charCodeAt(0))\n\t\t\t\t\treturn publicKey\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('Error getting webauthn registration data from server', err)\n\t\t\t\t\tthrow new Error(t('settings', 'Server error while trying to add WebAuthn device'))\n\t\t\t\t})\n\t\t},\n\n\t\tregister(publicKey) {\n\t\t\tconsole.debug('starting webauthn registration')\n\n\t\t\treturn navigator.credentials.create({ publicKey })\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.credential = {\n\t\t\t\t\t\tid: data.id,\n\t\t\t\t\t\ttype: data.type,\n\t\t\t\t\t\trawId: this.arrayToBase64String(new Uint8Array(data.rawId)),\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tclientDataJSON: this.arrayToBase64String(new Uint8Array(data.response.clientDataJSON)),\n\t\t\t\t\t\t\tattestationObject: this.arrayToBase64String(new Uint8Array(data.response.attestationObject)),\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\tsubmit() {\n\t\t\tthis.step = RegistrationSteps.PERSIST\n\n\t\t\treturn confirmPassword()\n\t\t\t\t.then(logAndPass('confirmed password'))\n\t\t\t\t.then(this.saveRegistrationData)\n\t\t\t\t.then(logAndPass('registration data saved'))\n\t\t\t\t.then(() => this.reset())\n\t\t\t\t.then(logAndPass('app reset'))\n\t\t\t\t.catch(console.error.bind(this))\n\t\t},\n\n\t\tasync saveRegistrationData() {\n\t\t\ttry {\n\t\t\t\tconst device = await finishRegistration(this.name, JSON.stringify(this.credential))\n\n\t\t\t\tlogger.info('new device added', { device })\n\n\t\t\t\tthis.$emit('added', device)\n\t\t\t} catch (err) {\n\t\t\t\tlogger.error('Error persisting webauthn registration', { error: err })\n\t\t\t\tthrow new Error(t('settings', 'Server error while trying to complete WebAuthn device registration'))\n\t\t\t}\n\t\t},\n\n\t\treset() {\n\t\t\tthis.name = ''\n\t\t\tthis.registrationData = {}\n\t\t\tthis.step = RegistrationSteps.READY\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\t.webauthn-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: 2px;\n\t\tmargin-right: 2px;\n\t}\n\n\t.new-webauthn-device {\n\t\tline-height: 300%;\n\t}\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AddDevice.vue?vue&type=template&id=f9b952b4&scoped=true&\"\nimport script from \"./AddDevice.vue?vue&type=script&lang=js&\"\nexport * from \"./AddDevice.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AddDevice.vue?vue&type=style&index=0&id=f9b952b4&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f9b952b4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.isHttps && !_vm.isLocalhost)?_c('div',[_vm._v(\"\\n\\t\"+_vm._s(_vm.t('settings', 'Passwordless authentication requires a secure connection.'))+\"\\n\")]):_c('div',[(_vm.step === _vm.RegistrationSteps.READY)?_c('div',[_c('button',{on:{\"click\":_vm.start}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Add WebAuthn device'))+\"\\n\\t\\t\")])]):(_vm.step === _vm.RegistrationSteps.REGISTRATION)?_c('div',{staticClass:\"new-webauthn-device\"},[_c('span',{staticClass:\"icon-loading-small webauthn-loading\"}),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Please authorize your WebAuthn device.'))+\"\\n\\t\")]):(_vm.step === _vm.RegistrationSteps.NAMING)?_c('div',{staticClass:\"new-webauthn-device\"},[_c('span',{staticClass:\"icon-loading-small webauthn-loading\"}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.name),expression:\"name\"}],attrs:{\"type\":\"text\",\"placeholder\":_vm.t('settings', 'Name your device')},domProps:{\"value\":(_vm.name)},on:{\":keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.submit.apply(null, arguments)},\"input\":function($event){if($event.target.composing){ return; }_vm.name=$event.target.value}}}),_vm._v(\" \"),_c('button',{on:{\"click\":_vm.submit}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Add'))+\"\\n\\t\\t\")])]):(_vm.step === _vm.RegistrationSteps.PERSIST)?_c('div',{staticClass:\"new-webauthn-device\"},[_c('span',{staticClass:\"icon-loading-small webauthn-loading\"}),_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Adding your device …'))+\"\\n\\t\")]):_c('div',[_vm._v(\"\\n\\t\\tInvalid registration step. This should not have happened.\\n\\t\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=script&lang=js&\"","<!--\n - @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @author 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n\n<template>\n\t<div class=\"webauthn-device\">\n\t\t<span class=\"icon-webauthn-device\" />\n\t\t{{ name || t('settings', 'Unnamed device') }}\n\t\t<Actions :force-menu=\"true\">\n\t\t\t<ActionButton icon=\"icon-delete\" @click=\"$emit('delete')\">\n\t\t\t\t{{ t('settings', 'Delete') }}\n\t\t\t</ActionButton>\n\t\t</Actions>\n\t</div>\n</template>\n\n<script>\nimport Actions from '@nextcloud/vue/dist/Components/Actions'\nimport ActionButton from '@nextcloud/vue/dist/Components/ActionButton'\n\nexport default {\n\tname: 'Device',\n\tcomponents: {\n\t\tActionButton,\n\t\tActions,\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\t.webauthn-device {\n\t\tline-height: 300%;\n\t\tdisplay: flex;\n\t}\n\n\t.icon-webauthn-device {\n\t\tdisplay: inline-block;\n\t\tbackground-size: 100%;\n\t\tpadding: 3px;\n\t\tmargin: 3px;\n\t}\n</style>\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Device.vue?vue&type=template&id=187f22d4&scoped=true&\"\nimport script from \"./Device.vue?vue&type=script&lang=js&\"\nexport * from \"./Device.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Device.vue?vue&type=style&index=0&id=187f22d4&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"187f22d4\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"webauthn-device\"},[_c('span',{staticClass:\"icon-webauthn-device\"}),_vm._v(\"\\n\\t\"+_vm._s(_vm.name || _vm.t('settings', 'Unnamed device'))+\"\\n\\t\"),_c('Actions',{attrs:{\"force-menu\":true}},[_c('ActionButton',{attrs:{\"icon\":\"icon-delete\"},on:{\"click\":function($event){return _vm.$emit('delete')}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('settings', 'Delete'))+\"\\n\\t\\t\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\n - @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @author Roeland Jago Douma <roeland@famdouma.nl>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n -->\n\n<template>\n\t<div id=\"security-webauthn\" class=\"section\">\n\t\t<h2>{{ t('settings', 'Passwordless Authentication') }}</h2>\n\t\t<p class=\"settings-hint hidden-when-empty\">\n\t\t\t{{ t('settings', 'Set up your account for passwordless authentication following the FIDO2 standard.') }}\n\t\t</p>\n\t\t<p v-if=\"devices.length === 0\">\n\t\t\t{{ t('settings', 'No devices configured.') }}\n\t\t</p>\n\t\t<p v-else>\n\t\t\t{{ t('settings', 'The following devices are configured for your account:') }}\n\t\t</p>\n\t\t<Device v-for=\"device in sortedDevices\"\n\t\t\t:key=\"device.id\"\n\t\t\t:name=\"device.name\"\n\t\t\t@delete=\"deleteDevice(device.id)\" />\n\n\t\t<p v-if=\"!hasPublicKeyCredential\" class=\"warning\">\n\t\t\t{{ t('settings', 'Your browser does not support WebAuthn.') }}\n\t\t</p>\n\n\t\t<AddDevice v-if=\"hasPublicKeyCredential\"\n\t\t\t:is-https=\"isHttps\"\n\t\t\t:is-localhost=\"isLocalhost\"\n\t\t\t@added=\"deviceAdded\" />\n\t</div>\n</template>\n\n<script>\nimport confirmPassword from '@nextcloud/password-confirmation'\nimport sortBy from 'lodash/fp/sortBy'\n\nimport AddDevice from './AddDevice'\nimport Device from './Device'\nimport logger from '../../logger'\nimport { removeRegistration } from '../../service/WebAuthnRegistrationSerice'\n\nconst sortByName = sortBy('name')\n\nexport default {\n\tcomponents: {\n\t\tAddDevice,\n\t\tDevice,\n\t},\n\tprops: {\n\t\tinitialDevices: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\t\tisHttps: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisLocalhost: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thasPublicKeyCredential: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdevices: this.initialDevices,\n\t\t}\n\t},\n\tcomputed: {\n\t\tsortedDevices() {\n\t\t\treturn sortByName(this.devices)\n\t\t},\n\t},\n\tmethods: {\n\t\tdeviceAdded(device) {\n\t\t\tlogger.debug(`adding new device to the list ${device.id}`)\n\n\t\t\tthis.devices.push(device)\n\t\t},\n\t\tasync deleteDevice(id) {\n\t\t\tlogger.info(`deleting webauthn device ${id}`)\n\n\t\t\tawait confirmPassword()\n\t\t\tawait removeRegistration(id)\n\n\t\t\tthis.devices = this.devices.filter(d => d.id !== id)\n\n\t\t\tlogger.info(`webauthn device ${id} removed successfully`)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n\n</style>\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Section.vue?vue&type=template&id=662cb041&scoped=true&\"\nimport script from \"./Section.vue?vue&type=script&lang=js&\"\nexport * from \"./Section.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"662cb041\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"section\",attrs:{\"id\":\"security-webauthn\"}},[_c('h2',[_vm._v(_vm._s(_vm.t('settings', 'Passwordless Authentication')))]),_vm._v(\" \"),_c('p',{staticClass:\"settings-hint hidden-when-empty\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Set up your account for passwordless authentication following the FIDO2 standard.'))+\"\\n\\t\")]),_vm._v(\" \"),(_vm.devices.length === 0)?_c('p',[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'No devices configured.'))+\"\\n\\t\")]):_c('p',[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'The following devices are configured for your account:'))+\"\\n\\t\")]),_vm._v(\" \"),_vm._l((_vm.sortedDevices),function(device){return _c('Device',{key:device.id,attrs:{\"name\":device.name},on:{\"delete\":function($event){return _vm.deleteDevice(device.id)}}})}),_vm._v(\" \"),(!_vm.hasPublicKeyCredential)?_c('p',{staticClass:\"warning\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('settings', 'Your browser does not support WebAuthn.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.hasPublicKeyCredential)?_c('AddDevice',{attrs:{\"is-https\":_vm.isHttps,\"is-localhost\":_vm.isLocalhost},on:{\"added\":_vm.deviceAdded}}):_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport WebAuthnSection from './components/WebAuthn/Section'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.prototype.t = t\n\nconst View = Vue.extend(WebAuthnSection)\nconst devices = loadState('settings', 'webauthn-devices')\nnew View({\n\tpropsData: {\n\t\tinitialDevices: devices,\n\t\tisHttps: window.location.protocol === 'https:',\n\t\tisLocalhost: window.location.hostname === 'localhost',\n\t\thasPublicKeyCredential: typeof (window.PublicKeyCredential) !== 'undefined',\n\t},\n}).$mount('#security-webauthn')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.webauthn-loading[data-v-f9b952b4] {\\n\\tdisplay: inline-block;\\n\\tvertical-align: sub;\\n\\tmargin-left: 2px;\\n\\tmargin-right: 2px;\\n}\\n.new-webauthn-device[data-v-f9b952b4] {\\n\\tline-height: 300%;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/WebAuthn/AddDevice.vue\"],\"names\":[],\"mappings\":\";AAgNA;CACA,qBAAA;CACA,mBAAA;CACA,gBAAA;CACA,iBAAA;AACA;AAEA;CACA,iBAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright 2020, Roeland Jago Douma <roeland@famdouma.nl>\\n -\\n - @author Roeland Jago Douma <roeland@famdouma.nl>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -->\\n\\n<template>\\n\\t<div v-if=\\\"!isHttps && !isLocalhost\\\">\\n\\t\\t{{ t('settings', 'Passwordless authentication requires a secure connection.') }}\\n\\t</div>\\n\\t<div v-else>\\n\\t\\t<div v-if=\\\"step === RegistrationSteps.READY\\\">\\n\\t\\t\\t<button @click=\\\"start\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Add WebAuthn device') }}\\n\\t\\t\\t</button>\\n\\t\\t</div>\\n\\n\\t\\t<div v-else-if=\\\"step === RegistrationSteps.REGISTRATION\\\"\\n\\t\\t\\tclass=\\\"new-webauthn-device\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small webauthn-loading\\\" />\\n\\t\\t\\t{{ t('settings', 'Please authorize your WebAuthn device.') }}\\n\\t\\t</div>\\n\\n\\t\\t<div v-else-if=\\\"step === RegistrationSteps.NAMING\\\"\\n\\t\\t\\tclass=\\\"new-webauthn-device\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small webauthn-loading\\\" />\\n\\t\\t\\t<input v-model=\\\"name\\\"\\n\\t\\t\\t\\ttype=\\\"text\\\"\\n\\t\\t\\t\\t:placeholder=\\\"t('settings', 'Name your device')\\\"\\n\\t\\t\\t\\t@:keyup.enter=\\\"submit\\\">\\n\\t\\t\\t<button @click=\\\"submit\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Add') }}\\n\\t\\t\\t</button>\\n\\t\\t</div>\\n\\n\\t\\t<div v-else-if=\\\"step === RegistrationSteps.PERSIST\\\"\\n\\t\\t\\tclass=\\\"new-webauthn-device\\\">\\n\\t\\t\\t<span class=\\\"icon-loading-small webauthn-loading\\\" />\\n\\t\\t\\t{{ t('settings', 'Adding your device …') }}\\n\\t\\t</div>\\n\\n\\t\\t<div v-else>\\n\\t\\t\\tInvalid registration step. This should not have happened.\\n\\t\\t</div>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport confirmPassword from '@nextcloud/password-confirmation'\\n\\nimport logger from '../../logger'\\nimport {\\n\\tstartRegistration,\\n\\tfinishRegistration,\\n} from '../../service/WebAuthnRegistrationSerice'\\n\\nconst logAndPass = (text) => (data) => {\\n\\tlogger.debug(text)\\n\\treturn data\\n}\\n\\nconst RegistrationSteps = Object.freeze({\\n\\tREADY: 1,\\n\\tREGISTRATION: 2,\\n\\tNAMING: 3,\\n\\tPERSIST: 4,\\n})\\n\\nexport default {\\n\\tname: 'AddDevice',\\n\\tprops: {\\n\\t\\thttpWarning: Boolean,\\n\\t\\tisHttps: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t\\tisLocalhost: {\\n\\t\\t\\ttype: Boolean,\\n\\t\\t\\tdefault: false,\\n\\t\\t},\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tname: '',\\n\\t\\t\\tcredential: {},\\n\\t\\t\\tRegistrationSteps,\\n\\t\\t\\tstep: RegistrationSteps.READY,\\n\\t\\t}\\n\\t},\\n\\tmethods: {\\n\\t\\tarrayToBase64String(a) {\\n\\t\\t\\treturn btoa(String.fromCharCode(...a))\\n\\t\\t},\\n\\t\\tstart() {\\n\\t\\t\\tthis.step = RegistrationSteps.REGISTRATION\\n\\t\\t\\tconsole.debug('Starting WebAuthn registration')\\n\\n\\t\\t\\treturn confirmPassword()\\n\\t\\t\\t\\t.then(this.getRegistrationData)\\n\\t\\t\\t\\t.then(this.register.bind(this))\\n\\t\\t\\t\\t.then(() => { this.step = RegistrationSteps.NAMING })\\n\\t\\t\\t\\t.catch(err => {\\n\\t\\t\\t\\t\\tconsole.error(err.name, err.message)\\n\\t\\t\\t\\t\\tthis.step = RegistrationSteps.READY\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tgetRegistrationData() {\\n\\t\\t\\tconsole.debug('Fetching webauthn registration data')\\n\\n\\t\\t\\tconst base64urlDecode = function(input) {\\n\\t\\t\\t\\t// Replace non-url compatible chars with base64 standard chars\\n\\t\\t\\t\\tinput = input\\n\\t\\t\\t\\t\\t.replace(/-/g, '+')\\n\\t\\t\\t\\t\\t.replace(/_/g, '/')\\n\\n\\t\\t\\t\\t// Pad out with standard base64 required padding characters\\n\\t\\t\\t\\tconst pad = input.length % 4\\n\\t\\t\\t\\tif (pad) {\\n\\t\\t\\t\\t\\tif (pad === 1) {\\n\\t\\t\\t\\t\\t\\tthrow new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding')\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tinput += new Array(5 - pad).join('=')\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn window.atob(input)\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn startRegistration()\\n\\t\\t\\t\\t.then(publicKey => {\\n\\t\\t\\t\\t\\tconsole.debug(publicKey)\\n\\t\\t\\t\\t\\tpublicKey.challenge = Uint8Array.from(base64urlDecode(publicKey.challenge), c => c.charCodeAt(0))\\n\\t\\t\\t\\t\\tpublicKey.user.id = Uint8Array.from(publicKey.user.id, c => c.charCodeAt(0))\\n\\t\\t\\t\\t\\treturn publicKey\\n\\t\\t\\t\\t})\\n\\t\\t\\t\\t.catch(err => {\\n\\t\\t\\t\\t\\tconsole.error('Error getting webauthn registration data from server', err)\\n\\t\\t\\t\\t\\tthrow new Error(t('settings', 'Server error while trying to add WebAuthn device'))\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tregister(publicKey) {\\n\\t\\t\\tconsole.debug('starting webauthn registration')\\n\\n\\t\\t\\treturn navigator.credentials.create({ publicKey })\\n\\t\\t\\t\\t.then(data => {\\n\\t\\t\\t\\t\\tthis.credential = {\\n\\t\\t\\t\\t\\t\\tid: data.id,\\n\\t\\t\\t\\t\\t\\ttype: data.type,\\n\\t\\t\\t\\t\\t\\trawId: this.arrayToBase64String(new Uint8Array(data.rawId)),\\n\\t\\t\\t\\t\\t\\tresponse: {\\n\\t\\t\\t\\t\\t\\t\\tclientDataJSON: this.arrayToBase64String(new Uint8Array(data.response.clientDataJSON)),\\n\\t\\t\\t\\t\\t\\t\\tattestationObject: this.arrayToBase64String(new Uint8Array(data.response.attestationObject)),\\n\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t},\\n\\n\\t\\tsubmit() {\\n\\t\\t\\tthis.step = RegistrationSteps.PERSIST\\n\\n\\t\\t\\treturn confirmPassword()\\n\\t\\t\\t\\t.then(logAndPass('confirmed password'))\\n\\t\\t\\t\\t.then(this.saveRegistrationData)\\n\\t\\t\\t\\t.then(logAndPass('registration data saved'))\\n\\t\\t\\t\\t.then(() => this.reset())\\n\\t\\t\\t\\t.then(logAndPass('app reset'))\\n\\t\\t\\t\\t.catch(console.error.bind(this))\\n\\t\\t},\\n\\n\\t\\tasync saveRegistrationData() {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tconst device = await finishRegistration(this.name, JSON.stringify(this.credential))\\n\\n\\t\\t\\t\\tlogger.info('new device added', { device })\\n\\n\\t\\t\\t\\tthis.$emit('added', device)\\n\\t\\t\\t} catch (err) {\\n\\t\\t\\t\\tlogger.error('Error persisting webauthn registration', { error: err })\\n\\t\\t\\t\\tthrow new Error(t('settings', 'Server error while trying to complete WebAuthn device registration'))\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\treset() {\\n\\t\\t\\tthis.name = ''\\n\\t\\t\\tthis.registrationData = {}\\n\\t\\t\\tthis.step = RegistrationSteps.READY\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style scoped>\\n\\t.webauthn-loading {\\n\\t\\tdisplay: inline-block;\\n\\t\\tvertical-align: sub;\\n\\t\\tmargin-left: 2px;\\n\\t\\tmargin-right: 2px;\\n\\t}\\n\\n\\t.new-webauthn-device {\\n\\t\\tline-height: 300%;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.webauthn-device[data-v-187f22d4] {\\n\\tline-height: 300%;\\n\\tdisplay: flex;\\n}\\n.icon-webauthn-device[data-v-187f22d4] {\\n\\tdisplay: inline-block;\\n\\tbackground-size: 100%;\\n\\tpadding: 3px;\\n\\tmargin: 3px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/WebAuthn/Device.vue\"],\"names\":[],\"mappings\":\";AAqDA;CACA,iBAAA;CACA,aAAA;AACA;AAEA;CACA,qBAAA;CACA,qBAAA;CACA,YAAA;CACA,WAAA;AACA\",\"sourcesContent\":[\"<!--\\n - @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\\n -\\n - @author 2020 Christoph Wurst <christoph@winzerhof-wurst.at>\\n -\\n - @license GNU AGPL version 3 or any later version\\n -\\n - This program is free software: you can redistribute it and/or modify\\n - it under the terms of the GNU Affero General Public License as\\n - published by the Free Software Foundation, either version 3 of the\\n - License, or (at your option) any later version.\\n -\\n - This program is distributed in the hope that it will be useful,\\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\n - GNU Affero General Public License for more details.\\n -\\n - You should have received a copy of the GNU Affero General Public License\\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\\n -->\\n\\n<template>\\n\\t<div class=\\\"webauthn-device\\\">\\n\\t\\t<span class=\\\"icon-webauthn-device\\\" />\\n\\t\\t{{ name || t('settings', 'Unnamed device') }}\\n\\t\\t<Actions :force-menu=\\\"true\\\">\\n\\t\\t\\t<ActionButton icon=\\\"icon-delete\\\" @click=\\\"$emit('delete')\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Delete') }}\\n\\t\\t\\t</ActionButton>\\n\\t\\t</Actions>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport Actions from '@nextcloud/vue/dist/Components/Actions'\\nimport ActionButton from '@nextcloud/vue/dist/Components/ActionButton'\\n\\nexport default {\\n\\tname: 'Device',\\n\\tcomponents: {\\n\\t\\tActionButton,\\n\\t\\tActions,\\n\\t},\\n\\tprops: {\\n\\t\\tname: {\\n\\t\\t\\ttype: String,\\n\\t\\t\\trequired: true,\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n\\n<style scoped>\\n\\t.webauthn-device {\\n\\t\\tline-height: 300%;\\n\\t\\tdisplay: flex;\\n\\t}\\n\\n\\t.icon-webauthn-device {\\n\\t\\tdisplay: inline-block;\\n\\t\\tbackground-size: 100%;\\n\\t\\tpadding: 3px;\\n\\t\\tmargin: 3px;\\n\\t}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(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};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 602;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t602: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [874], function() { return __webpack_require__(9802); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","getLoggerBuilder","setApp","detectUser","build","url","generateUrl","axios","resp","data","finishRegistration","name","removeRegistration","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","component","_vm","this","_h","$createElement","_c","_self","isHttps","isLocalhost","step","RegistrationSteps","READY","on","start","_v","_s","t","REGISTRATION","staticClass","NAMING","directives","rawName","value","expression","attrs","domProps","$event","type","indexOf","_k","keyCode","key","submit","apply","arguments","target","composing","PERSIST","$emit","devices","length","_l","device","deleteDevice","hasPublicKeyCredential","_e","deviceAdded","__webpack_nonce__","btoa","OC","requestToken","Vue","WebAuthnSection","propsData","initialDevices","loadState","window","location","protocol","hostname","PublicKeyCredential","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","amdD","Error","amdO","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file |