summaryrefslogtreecommitdiffstats
path: root/apps/twofactor_backupcodes/src
diff options
context:
space:
mode:
authorRoeland Jago Douma <roeland@famdouma.nl>2018-09-25 10:49:56 +0200
committerChristoph Wurst <christoph@winzerhof-wurst.at>2018-09-27 09:07:05 +0200
commitedc861b0414cbaa0ded51994ee7f24db2ef48689 (patch)
tree64026661573c344481903a85d4655230cedfd291 /apps/twofactor_backupcodes/src
parent7882be160a858a2958abb7657c0db86d08ff3981 (diff)
downloadnextcloud-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')
-rw-r--r--apps/twofactor_backupcodes/src/service/BackupCodesService.js21
-rw-r--r--apps/twofactor_backupcodes/src/service/PrintService.js7
-rw-r--r--apps/twofactor_backupcodes/src/settings.js9
-rw-r--r--apps/twofactor_backupcodes/src/views/PersonalSettings.vue102
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>