1 |
- {"version":3,"file":"settings-vue-settings-personal-webauthn.js?v=1a2126daebcda238220d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/logger.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/service/WebAuthnRegistrationSerice.js","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?5b6d","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?5011","webpack://nextcloud/./apps/settings/src/components/WebAuthn/AddDevice.vue?c9ea","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?37fa","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?a0ca","webpack://nextcloud/./apps/settings/src/components/WebAuthn/Device.vue?06c3","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?ad4f","webpack:///nextcloud/apps/settings/src/main-personal-webauth.js","webpack:///nextcloud/apps/settings/src/components/WebAuthn/AddDevice.vue?vue&type=style&index=0&id=375c9cd6&prod&scoped=true&lang=css&","webpack:///nextcloud/apps/settings/src/components/WebAuthn/Device.vue?vue&type=style&index=0&id=46d7f170&prod&scoped=true&lang=css&","webpack:///nextcloud/webpack/bootstrap","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/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (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((key) => (__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 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'\nimport '@nextcloud/password-confirmation/dist/style.css'\n\nimport logger from '../../logger.js'\nimport {\n\tstartRegistration,\n\tfinishRegistration,\n} from '../../service/WebAuthnRegistrationSerice.js'\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 * @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 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=375c9cd6&prod&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=375c9cd6&prod&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AddDevice.vue?vue&type=template&id=375c9cd6&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=375c9cd6&prod&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 \"375c9cd6\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;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\")])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;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('NcActions',{attrs:{\"force-menu\":true}},[_c('NcActionButton',{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)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!--\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<NcActions :force-menu=\"true\">\n\t\t\t<NcActionButton icon=\"icon-delete\" @click=\"$emit('delete')\">\n\t\t\t\t{{ t('settings', 'Delete') }}\n\t\t\t</NcActionButton>\n\t\t</NcActions>\n\t</div>\n</template>\n\n<script>\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\n\nexport default {\n\tname: 'Device',\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActions,\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","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 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=46d7f170&prod&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=46d7f170&prod&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Device.vue?vue&type=template&id=46d7f170&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=46d7f170&prod&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 \"46d7f170\",\n null\n \n)\n\nexport default component.exports","<!--\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 '@nextcloud/password-confirmation/dist/style.css'\nimport sortBy from 'lodash/fp/sortBy.js'\n\nimport AddDevice from './AddDevice.vue'\nimport Device from './Device.vue'\nimport logger from '../../logger.js'\nimport { removeRegistration } from '../../service/WebAuthnRegistrationSerice.js'\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=2f7f7c59&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 \"2f7f7c59\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;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)\n}\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.vue'\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-375c9cd6] {\\n\\tdisplay: inline-block;\\n\\tvertical-align: sub;\\n\\tmargin-left: 2px;\\n\\tmargin-right: 2px;\\n}\\n.new-webauthn-device[data-v-375c9cd6] {\\n\\tline-height: 300%;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/WebAuthn/AddDevice.vue\"],\"names\":[],\"mappings\":\";AA6NA;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'\\nimport '@nextcloud/password-confirmation/dist/style.css'\\n\\nimport logger from '../../logger.js'\\nimport {\\n\\tstartRegistration,\\n\\tfinishRegistration,\\n} from '../../service/WebAuthnRegistrationSerice.js'\\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-46d7f170] {\\n\\tline-height: 300%;\\n\\tdisplay: flex;\\n}\\n.icon-webauthn-device[data-v-46d7f170] {\\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\":\";AAkEA;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<NcActions :force-menu=\\\"true\\\">\\n\\t\\t\\t<NcActionButton icon=\\\"icon-delete\\\" @click=\\\"$emit('delete')\\\">\\n\\t\\t\\t\\t{{ t('settings', 'Delete') }}\\n\\t\\t\\t</NcActionButton>\\n\\t\\t</NcActions>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\\n\\nexport default {\\n\\tname: 'Device',\\n\\tcomponents: {\\n\\t\\tNcActionButton,\\n\\t\\tNcActions,\\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","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.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 = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 1602;","__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\t1602: 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 = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (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((id) => (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));","__webpack_require__.nc = undefined;","// 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, [7874], () => (__webpack_require__(63174)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","getLoggerBuilder","setApp","detectUser","build","logAndPass","logger","RegistrationSteps","Object","freeze","READY","REGISTRATION","NAMING","PERSIST","name","props","httpWarning","isHttps","type","default","isLocalhost","data","credential","step","methods","arrayToBase64String","start","console","then","catch","getRegistrationData","async","url","generateUrl","axios","publicKey","input","replace","register","id","rawId","response","clientDataJSON","attestationObject","submit","device","error","reset","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","on","_v","_s","t","staticClass","directives","rawName","value","expression","attrs","domProps","$event","indexOf","_k","keyCode","key","apply","arguments","target","composing","components","NcActionButton","NcActions","required","$emit","sortByName","AddDevice","Device","initialDevices","hasPublicKeyCredential","devices","computed","sortedDevices","deviceAdded","length","_l","deleteDevice","_e","__webpack_nonce__","btoa","OC","requestToken","Vue","WebAuthnSection","propsData","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","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","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","nc","__webpack_exports__"],"sourceRoot":""}
|