aboutsummaryrefslogtreecommitdiff
path: root/src/components/mfa_form
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/mfa_form')
-rw-r--r--src/components/mfa_form/recovery_form.js41
-rw-r--r--src/components/mfa_form/recovery_form.vue65
-rw-r--r--src/components/mfa_form/totp_form.js40
-rw-r--r--src/components/mfa_form/totp_form.vue67
4 files changed, 213 insertions, 0 deletions
diff --git a/src/components/mfa_form/recovery_form.js b/src/components/mfa_form/recovery_form.js
new file mode 100644
index 00000000..7a3cc22d
--- /dev/null
+++ b/src/components/mfa_form/recovery_form.js
@@ -0,0 +1,41 @@
+import mfaApi from '../../services/new_api/mfa.js'
+import { mapState, mapGetters, mapActions, mapMutations } from 'vuex'
+
+export default {
+ data: () => ({
+ code: null,
+ error: false
+ }),
+ computed: {
+ ...mapGetters({
+ authApp: 'authFlow/app',
+ authSettings: 'authFlow/settings'
+ }),
+ ...mapState({ instance: 'instance' })
+ },
+ methods: {
+ ...mapMutations('authFlow', ['requireTOTP', 'abortMFA']),
+ ...mapActions({ login: 'authFlow/login' }),
+ clearError () { this.error = false },
+ submit () {
+ const data = {
+ app: this.authApp,
+ instance: this.instance.server,
+ mfaToken: this.authSettings.mfa_token,
+ code: this.code
+ }
+
+ mfaApi.verifyRecoveryCode(data).then((result) => {
+ if (result.error) {
+ this.error = result.error
+ this.code = null
+ return
+ }
+
+ this.login(result).then(() => {
+ this.$router.push({ name: 'friends' })
+ })
+ })
+ }
+ }
+}
diff --git a/src/components/mfa_form/recovery_form.vue b/src/components/mfa_form/recovery_form.vue
new file mode 100644
index 00000000..57294630
--- /dev/null
+++ b/src/components/mfa_form/recovery_form.vue
@@ -0,0 +1,65 @@
+<template>
+ <div class="login panel panel-default">
+ <!-- Default panel contents -->
+
+ <div class="panel-heading">
+ {{ $t('login.heading.recovery') }}
+ </div>
+
+ <div class="panel-body">
+ <form
+ class="login-form"
+ @submit.prevent="submit"
+ >
+ <div class="form-group">
+ <label for="code">{{ $t('login.recovery_code') }}</label>
+ <input
+ id="code"
+ v-model="code"
+ class="form-control"
+ >
+ </div>
+
+ <div class="form-group">
+ <div class="login-bottom">
+ <div>
+ <a
+ href="#"
+ @click.prevent="requireTOTP"
+ >
+ {{ $t('login.enter_two_factor_code') }}
+ </a>
+ <br>
+ <a
+ href="#"
+ @click.prevent="abortMFA"
+ >
+ {{ $t('general.cancel') }}
+ </a>
+ </div>
+ <button
+ type="submit"
+ class="btn btn-default"
+ >
+ {{ $t('general.verify') }}
+ </button>
+ </div>
+ </div>
+ </form>
+ </div>
+
+ <div
+ v-if="error"
+ class="form-group"
+ >
+ <div class="alert error">
+ {{ error }}
+ <i
+ class="button-icon icon-cancel"
+ @click="clearError"
+ />
+ </div>
+ </div>
+ </div>
+</template>
+<script src="./recovery_form.js" ></script>
diff --git a/src/components/mfa_form/totp_form.js b/src/components/mfa_form/totp_form.js
new file mode 100644
index 00000000..778bf8dc
--- /dev/null
+++ b/src/components/mfa_form/totp_form.js
@@ -0,0 +1,40 @@
+import mfaApi from '../../services/new_api/mfa.js'
+import { mapState, mapGetters, mapActions, mapMutations } from 'vuex'
+export default {
+ data: () => ({
+ code: null,
+ error: false
+ }),
+ computed: {
+ ...mapGetters({
+ authApp: 'authFlow/app',
+ authSettings: 'authFlow/settings'
+ }),
+ ...mapState({ instance: 'instance' })
+ },
+ methods: {
+ ...mapMutations('authFlow', ['requireRecovery', 'abortMFA']),
+ ...mapActions({ login: 'authFlow/login' }),
+ clearError () { this.error = false },
+ submit () {
+ const data = {
+ app: this.authApp,
+ instance: this.instance.server,
+ mfaToken: this.authSettings.mfa_token,
+ code: this.code
+ }
+
+ mfaApi.verifyOTPCode(data).then((result) => {
+ if (result.error) {
+ this.error = result.error
+ this.code = null
+ return
+ }
+
+ this.login(result).then(() => {
+ this.$router.push({ name: 'friends' })
+ })
+ })
+ }
+ }
+}
diff --git a/src/components/mfa_form/totp_form.vue b/src/components/mfa_form/totp_form.vue
new file mode 100644
index 00000000..a344b395
--- /dev/null
+++ b/src/components/mfa_form/totp_form.vue
@@ -0,0 +1,67 @@
+<template>
+ <div class="login panel panel-default">
+ <!-- Default panel contents -->
+
+ <div class="panel-heading">
+ {{ $t('login.heading.totp') }}
+ </div>
+
+ <div class="panel-body">
+ <form
+ class="login-form"
+ @submit.prevent="submit"
+ >
+ <div class="form-group">
+ <label for="code">
+ {{ $t('login.authentication_code') }}
+ </label>
+ <input
+ id="code"
+ v-model="code"
+ class="form-control"
+ >
+ </div>
+
+ <div class="form-group">
+ <div class="login-bottom">
+ <div>
+ <a
+ href="#"
+ @click.prevent="requireRecovery"
+ >
+ {{ $t('login.enter_recovery_code') }}
+ </a>
+ <br>
+ <a
+ href="#"
+ @click.prevent="abortMFA"
+ >
+ {{ $t('general.cancel') }}
+ </a>
+ </div>
+ <button
+ type="submit"
+ class="btn btn-default"
+ >
+ {{ $t('general.verify') }}
+ </button>
+ </div>
+ </div>
+ </form>
+ </div>
+
+ <div
+ v-if="error"
+ class="form-group"
+ >
+ <div class="alert error">
+ {{ error }}
+ <i
+ class="button-icon icon-cancel"
+ @click="clearError"
+ />
+ </div>
+ </div>
+ </div>
+</template>
+<script src="./totp_form.js"></script>