1 line
12 KiB
Plaintext
1 line
12 KiB
Plaintext
{"version":3,"file":"twofactor_backupcodes-settings-personal.mjs","sources":["../build/frontend/apps/twofactor_backupcodes/src/service/logger.ts","../build/frontend/apps/twofactor_backupcodes/src/service/PrintService.ts","../build/frontend/apps/twofactor_backupcodes/src/service/BackupCodesService.ts","../build/frontend/apps/twofactor_backupcodes/src/store/index.ts","../build/frontend/apps/twofactor_backupcodes/src/views/PersonalSettings.vue","../build/frontend/apps/twofactor_backupcodes/src/settings-personal.ts"],"sourcesContent":["/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nexport const logger = getLoggerBuilder()\n\t.detectLogLevel()\n\t.setApp('twofactor_backupcodes')\n\t.build()\n","/*!\n * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { showError } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\n\n/**\n * Open a new tab and print the given backup codes\n *\n * @param data - The backup codes to print\n */\nexport function print(data: string[]): void {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst name = (getCapabilities() as any).theming.name || 'Nextcloud'\n\tconst newTab = window.open('', t('twofactor_backupcodes', '{name} backup codes', { name }))\n\tif (!newTab) {\n\t\tshowError(t('twofactor_backupcodes', 'Unable to open a new tab for printing'))\n\t\tthrow new Error('Unable to open a new tab for printing')\n\t}\n\n\tconst heading = newTab.document.createElement('h1')\n\theading.textContent = t('twofactor_backupcodes', '{name} backup codes', { name })\n\tconst pre = newTab.document.createElement('pre')\n\tfor (const code of data) {\n\t\tconst codeLine = newTab.document.createTextNode(code)\n\t\tpre.appendChild(codeLine)\n\t\tpre.appendChild(newTab.document.createElement('br'))\n\t}\n\n\tnewTab.document.body.innerHTML = ''\n\tnewTab.document.body.appendChild(heading)\n\tnewTab.document.body.appendChild(pre)\n\n\tnewTab.print()\n\tnewTab.close()\n}\n","/**\n * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\n\nexport interface ITwoFactorBackupCodesState {\n\tenabled: boolean\n\ttotal: number\n\tused: number\n}\n\nexport interface IApiResponse {\n\tcodes: string[]\n\tstate: ITwoFactorBackupCodesState\n}\n\n/**\n * Generate new backup codes\n */\nexport async function generateCodes(): Promise<IApiResponse> {\n\tconst url = generateUrl('/apps/twofactor_backupcodes/settings/create')\n\n\tconst { data } = await axios.post<IApiResponse>(url)\n\treturn data\n}\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ITwoFactorBackupCodesState } from '../service/BackupCodesService.ts'\n\nimport { loadState } from '@nextcloud/initial-state'\nimport { defineStore } from 'pinia'\nimport { ref } from 'vue'\nimport { generateCodes } from '../service/BackupCodesService.ts'\n\nconst initialState = loadState<ITwoFactorBackupCodesState>('twofactor_backupcodes', 'state')\n\nexport const useStore = defineStore('twofactor_backupcodes', () => {\n\tconst enabled = ref(initialState.enabled)\n\tconst total = ref(initialState.total)\n\tconst used = ref(initialState.used)\n\tconst codes = ref<string[]>([])\n\n\t/**\n\t * Generate new backup codes and update the store state\n\t */\n\tasync function generate(): Promise<void> {\n\t\tenabled.value = false\n\n\t\tconst { codes: newCodes, state } = await generateCodes()\n\t\tenabled.value = state.enabled\n\t\ttotal.value = state.total\n\t\tused.value = state.used\n\t\tcodes.value = newCodes\n\t}\n\n\treturn {\n\t\tenabled,\n\t\ttotal,\n\t\tused,\n\t\tcodes,\n\n\t\tgenerate,\n\t}\n})\n","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { showError } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport { confirmPassword } from '@nextcloud/password-confirmation'\nimport { computed, ref } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport { logger } from '../service/logger.ts'\nimport { print } from '../service/PrintService.js'\nimport { useStore } from '../store/index.ts'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst instanceName = (getCapabilities() as any).theming.name ?? 'Nextcloud'\n\nconst store = useStore()\nconst generatingCodes = ref(false)\n\nconst hasCodes = computed(() => {\n\treturn store.codes && store.codes.length > 0\n})\n\nconst downloadFilename = instanceName + '-backup-codes.txt'\nconst downloadUrl = computed(() => {\n\tif (!hasCodes.value) {\n\t\treturn ''\n\t}\n\treturn 'data:text/plain,' + encodeURIComponent(store.codes.reduce((prev, code) => {\n\t\treturn prev + code + '\\n'\n\t}, ''))\n})\n\n/**\n * Generate new backup codes\n */\nasync function generateBackupCodes() {\n\tawait confirmPassword()\n\t// Hide old codes\n\tgeneratingCodes.value = true\n\n\ttry {\n\t\tawait store.generate()\n\t} catch (error) {\n\t\tlogger.error('Error generating backup codes', { error })\n\t\tshowError(t('twofactor_backupcodes', 'An error occurred while generating your backup codes'))\n\t} finally {\n\t\tgeneratingCodes.value = false\n\t}\n}\n\n/**\n * Print the backup codes\n */\nfunction printCodes() {\n\tprint(!store.codes || store.codes.length === 0 ? [] : store.codes)\n}\n</script>\n\n<template>\n\t<div :class=\"$style.backupcodesSettings\">\n\t\t<NcButton\n\t\t\tv-if=\"!store.enabled\"\n\t\t\t:disabled=\"generatingCodes\"\n\t\t\tvariant=\"primary\"\n\t\t\t@click=\"generateBackupCodes\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon v-if=\"generatingCodes\" />\n\t\t\t</template>\n\t\t\t{{ t('twofactor_backupcodes', 'Generate backup codes') }}\n\t\t</NcButton>\n\t\t<template v-else>\n\t\t\t<p>\n\t\t\t\t<template v-if=\"!hasCodes\">\n\t\t\t\t\t{{ t('twofactor_backupcodes', 'Backup codes have been generated. {used} of {total} codes have been used.', { used: store.used, total: store.total }) }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ t('twofactor_backupcodes', 'These are your backup codes. Please save and/or print them as you will not be able to read the codes again later.') }}\n\t\t\t\t\t<ul :aria-label=\"t('twofactor_backupcodes', 'List of backup codes')\">\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tv-for=\"code in store.codes\"\n\t\t\t\t\t\t\t:key=\"code\"\n\t\t\t\t\t\t\t:class=\"$style.backupcodesSettings__code\">\n\t\t\t\t\t\t\t{{ code }}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\t\t\t</p>\n\t\t\t<p :class=\"$style.backupcodesSettings__actions\">\n\t\t\t\t<NcButton\n\t\t\t\t\tid=\"generate-backup-codes\"\n\t\t\t\t\tvariant=\"error\"\n\t\t\t\t\t@click=\"generateBackupCodes\">\n\t\t\t\t\t{{ t('twofactor_backupcodes', 'Regenerate backup codes') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<template v-if=\"hasCodes\">\n\t\t\t\t\t<NcButton @click=\"printCodes\">\n\t\t\t\t\t\t{{ t('twofactor_backupcodes', 'Print backup codes') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\t:href=\"downloadUrl\"\n\t\t\t\t\t\t:download=\"downloadFilename\"\n\t\t\t\t\t\tvariant=\"primary\">\n\t\t\t\t\t\t{{ t('twofactor_backupcodes', 'Save backup codes') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</template>\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<em>\n\t\t\t\t\t{{ t('twofactor_backupcodes', 'If you regenerate backup codes, you automatically invalidate old codes.') }}\n\t\t\t\t</em>\n\t\t\t</p>\n\t\t</template>\n\t</div>\n</template>\n\n<style module>\n.backupcodesSettings {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.backupcodesSettings__code {\n\tfont-family: monospace;\n\tletter-spacing: 0.02em;\n\tfont-size: 1.2em;\n}\n\n.backupcodesSettings__actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--default-grid-baseline);\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createPinia } from 'pinia'\nimport { createApp } from 'vue'\nimport PersonalSettings from './views/PersonalSettings.vue'\n\nconst pinia = createPinia()\nconst app = createApp(PersonalSettings)\napp.use(pinia)\napp.mount('#twofactor-backupcodes-settings')\n"],"names":["logger","getLoggerBuilder","print","data","name","getCapabilities","newTab","t","showError","heading","pre","code","codeLine","generateCodes","url","generateUrl","axios","initialState","loadState","useStore","defineStore","enabled","ref","total","used","codes","generate","newCodes","state","instanceName","store","generatingCodes","hasCodes","computed","downloadFilename","downloadUrl","prev","generateBackupCodes","confirmPassword","error","printCodes","_createElementBlock","_normalizeClass","$style","_unref","_Fragment","_createElementVNode","_createTextVNode","_toDisplayString","_openBlock","_renderList","_createVNode","NcButton","_createBlock","NcLoadingIcon","pinia","createPinia","app","createApp","PersonalSettings"],"mappings":"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"} |