diff options
author | Roeland Jago Douma <roeland@famdouma.nl> | 2018-09-25 10:49:56 +0200 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2018-09-27 09:07:05 +0200 |
commit | edc861b0414cbaa0ded51994ee7f24db2ef48689 (patch) | |
tree | 64026661573c344481903a85d4655230cedfd291 /apps/twofactor_backupcodes/src | |
parent | 7882be160a858a2958abb7657c0db86d08ff3981 (diff) | |
download | nextcloud-server-edc861b0414cbaa0ded51994ee7f24db2ef48689.tar.gz nextcloud-server-edc861b0414cbaa0ded51994ee7f24db2ef48689.zip |
Move to standard format
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Diffstat (limited to 'apps/twofactor_backupcodes/src')
4 files changed, 139 insertions, 0 deletions
diff --git a/apps/twofactor_backupcodes/src/service/BackupCodesService.js b/apps/twofactor_backupcodes/src/service/BackupCodesService.js new file mode 100644 index 00000000000..c7259e826a1 --- /dev/null +++ b/apps/twofactor_backupcodes/src/service/BackupCodesService.js @@ -0,0 +1,21 @@ +import axio from 'axios'; + +export function getState () { + const url = OC.generateUrl('/apps/twofactor_backupcodes/settings/state'); + + return axio.get(url, { + headers: { + requesttoken: OC.requestToken + } + }).then(resp => resp.data); +} + +export function generateCodes () { + const url = OC.generateUrl('/apps/twofactor_backupcodes/settings/create'); + + return axio.post(url, {}, { + headers: { + requesttoken: OC.requestToken + } + }).then(resp => resp.data) +} diff --git a/apps/twofactor_backupcodes/src/service/PrintService.js b/apps/twofactor_backupcodes/src/service/PrintService.js new file mode 100644 index 00000000000..a01150de7d7 --- /dev/null +++ b/apps/twofactor_backupcodes/src/service/PrintService.js @@ -0,0 +1,7 @@ +export function print (data) { + const newTab = window.open('', t('twofactor_backupcodes', 'Nextcloud backup codes')); + newTab.document.write('<h1>' + t('twofactor_backupcodes', 'Nextcloud backup codes') + '</h1>'); + newTab.document.write(data); + newTab.print(); + newTab.close(); +} diff --git a/apps/twofactor_backupcodes/src/settings.js b/apps/twofactor_backupcodes/src/settings.js new file mode 100644 index 00000000000..9534d802824 --- /dev/null +++ b/apps/twofactor_backupcodes/src/settings.js @@ -0,0 +1,9 @@ +import Vue from 'vue'; +import PersonalSettings from './views/PersonalSettings'; + +Vue.prototype.t = t; + +export default new Vue({ + el: '#twofactor-backupcodes-settings', + render: h => h(PersonalSettings) +}); diff --git a/apps/twofactor_backupcodes/src/views/PersonalSettings.vue b/apps/twofactor_backupcodes/src/views/PersonalSettings.vue new file mode 100644 index 00000000000..74a59536aef --- /dev/null +++ b/apps/twofactor_backupcodes/src/views/PersonalSettings.vue @@ -0,0 +1,102 @@ +<template> + <div> + <button v-if="!enabled" + id="generate-backup-codes">{{ t('twofactor_backupcodes', 'Generate backup codes') }}</button> + <p v-else> + <template v-if="!codes"> + {{ t('twofactor_backupcodes', 'Backup codes have been generated. {used} of {total} codes have been used.', {used, total}) }} + </template> + <template v-else> + {{ 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') }} + <ul> + <li v-for="code in codes" class="backup-code">{{code}}</li> + </ul> + <a :href="downloadUrl" + class="button" + download="Nextcloud-backup-codes.txt">{{ t('twofactor_backupcodes', 'Save backup codes') }}</a> + <button class="button" + v-on:click="printCodes">{{ t('twofactor_backupcodes', 'Print backup codes') }}</button> + </template> + </p> + <p> + <button id="generate-backup-codes" + :class="{'icon-loading-small': generatingCodes}" + v-on:click="generateBackupCodes">{{ t('twofactor_backupcodes', 'Regenerate backup codes') }}</button> + </p> + <p> + {{ t('twofactor_backupcodes', 'If you regenerate backup codes, you automatically invalidate old codes.') }} + </p> + </div> +</template> + +<script> + import confirmPassword from 'nextcloud-password-confirmation'; + + import {getState, generateCodes} from '../service/BackupCodesService'; + import {print} from '../service/PrintService'; + + export default { + name: "PersonalSettings", + data() { + return { + enabled: false, + generatingCodes: false, + codes: undefined + }; + }, + computed: { + downloadUrl: function() { + if (!this.codes) { + return ''; + } + return 'data:text/plain,' + encodeURIComponent(this.codes.reduce((prev, code) => { + return prev + code + '\r\n'; + }, '')); + } + }, + created: function() { + getState() + .then(state => { + this.enabled = state.enabled; + this.total = state.total; + this.used = state.used; + }) + .catch(console.error.bind(this)); + }, + methods: { + generateBackupCodes: function() { + confirmPassword().then(() => { + // Hide old codes + this.enabled = false; + this.generatingCodes = true; + + generateCodes().then(data => { + this.enabled = data.state.enabled; + this.total = data.state.total; + this.used = data.state.used; + this.codes = data.codes; + + this.generatingCodes = false; + }).catch(err => { + OC.Notification.showTemporary(t('twofactor_backupcodes', 'An error occurred while generating your backup codes')); + this.generatingCodes = false; + throw err; + }); + }).catch(console.error.bind(this)); + }, + + getPrintData: function(codes) { + if (!codes) { + return ''; + } + return codes.reduce((prev, code) => { + return prev + code + "<br>"; + }, ''); + }, + + printCodes: function() { + print(this.getPrintData(this.codes)); + } + } + } +</script> |