2019-05-21 09:58:35 +03:00
|
|
|
<!--
|
|
|
|
- @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
|
|
-
|
|
|
|
- @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
|
|
-
|
|
|
|
- @license GNU AGPL version 3 or any later version
|
|
|
|
-
|
|
|
|
- This program is free software: you can redistribute it and/or modify
|
|
|
|
- it under the terms of the GNU Affero General Public License as
|
|
|
|
- published by the Free Software Foundation, either version 3 of the
|
|
|
|
- License, or (at your option) any later version.
|
|
|
|
-
|
|
|
|
- This program is distributed in the hope that it will be useful,
|
|
|
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
- GNU Affero General Public License for more details.
|
|
|
|
-
|
|
|
|
- You should have received a copy of the GNU Affero General Public License
|
|
|
|
- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
-->
|
|
|
|
|
|
|
|
<template>
|
2021-03-03 13:18:33 +03:00
|
|
|
<div v-if="!hideLoginForm || directLogin">
|
2019-05-21 09:58:35 +03:00
|
|
|
<transition name="fade" mode="out-in">
|
2020-02-09 22:06:08 +03:00
|
|
|
<div v-if="!passwordlessLogin && !resetPassword && resetPasswordTarget === ''"
|
2019-09-25 19:19:42 +03:00
|
|
|
key="login">
|
2019-05-21 09:58:35 +03:00
|
|
|
<LoginForm
|
|
|
|
:username.sync="user"
|
|
|
|
:redirect-url="redirectUrl"
|
2019-05-23 18:03:04 +03:00
|
|
|
:direct-login="directLogin"
|
2019-05-21 09:58:35 +03:00
|
|
|
:messages="messages"
|
|
|
|
:errors="errors"
|
|
|
|
:throttle-delay="throttleDelay"
|
|
|
|
:inverted-colors="invertedColors"
|
|
|
|
:auto-complete-allowed="autoCompleteAllowed"
|
2019-09-25 19:19:42 +03:00
|
|
|
@submit="loading = true" />
|
2019-05-21 09:58:35 +03:00
|
|
|
<a v-if="canResetPassword && resetPasswordLink !== ''"
|
2019-09-25 19:19:42 +03:00
|
|
|
id="lost-password"
|
|
|
|
:href="resetPasswordLink">
|
2019-05-21 09:58:35 +03:00
|
|
|
{{ t('core', 'Forgot password?') }}
|
|
|
|
</a>
|
|
|
|
<a v-else-if="canResetPassword && !resetPassword"
|
2019-09-25 19:19:42 +03:00
|
|
|
id="lost-password"
|
|
|
|
:href="resetPasswordLink"
|
|
|
|
@click.prevent="resetPassword = true">
|
2019-05-21 09:58:35 +03:00
|
|
|
{{ t('core', 'Forgot password?') }}
|
|
|
|
</a>
|
2020-02-09 22:06:08 +03:00
|
|
|
<br>
|
|
|
|
<a v-if="hasPasswordless" @click.prevent="passwordlessLogin = true">
|
|
|
|
{{ t('core', 'Log in with a device') }}
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
<div v-else-if="!loading && passwordlessLogin"
|
|
|
|
key="reset"
|
|
|
|
class="login-additional">
|
|
|
|
<PasswordLessLoginForm
|
|
|
|
:username.sync="user"
|
|
|
|
:redirect-url="redirectUrl"
|
|
|
|
:inverted-colors="invertedColors"
|
|
|
|
:auto-complete-allowed="autoCompleteAllowed"
|
2020-05-15 11:37:08 +03:00
|
|
|
:is-https="isHttps"
|
|
|
|
:has-public-key-credential="hasPublicKeyCredential"
|
2020-02-09 22:06:08 +03:00
|
|
|
@submit="loading = true" />
|
|
|
|
<a @click.prevent="passwordlessLogin = false">
|
|
|
|
{{ t('core', 'Back') }}
|
|
|
|
</a>
|
2019-05-21 09:58:35 +03:00
|
|
|
</div>
|
|
|
|
<div v-else-if="!loading && canResetPassword"
|
2019-09-25 19:19:42 +03:00
|
|
|
key="reset"
|
|
|
|
class="login-additional">
|
2019-05-21 09:58:35 +03:00
|
|
|
<div class="lost-password-container">
|
|
|
|
<ResetPassword v-if="resetPassword"
|
2019-09-25 19:19:42 +03:00
|
|
|
:username.sync="user"
|
|
|
|
:reset-password-link="resetPasswordLink"
|
|
|
|
:inverted-colors="invertedColors"
|
|
|
|
@abort="resetPassword = false" />
|
2019-05-21 09:58:35 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
2019-07-25 18:04:33 +03:00
|
|
|
<div v-else-if="resetPasswordTarget !== ''">
|
|
|
|
<UpdatePassword :username.sync="user"
|
2019-09-25 19:19:42 +03:00
|
|
|
:reset-password-target="resetPasswordTarget"
|
|
|
|
:inverted-colors="invertedColors"
|
|
|
|
@done="passwordResetFinished" />
|
2019-07-25 18:04:33 +03:00
|
|
|
</div>
|
2019-05-21 09:58:35 +03:00
|
|
|
</transition>
|
|
|
|
</div>
|
2021-03-03 13:18:33 +03:00
|
|
|
<div v-else>
|
|
|
|
<transition name="fade" mode="out-in">
|
|
|
|
<div class="warning">
|
|
|
|
{{ t('core', 'Login form is disabled.') }}<br>
|
|
|
|
<small>{{ t('core', 'Please contact your administrator.') }}
|
|
|
|
</small>
|
|
|
|
</div>
|
|
|
|
</transition>
|
|
|
|
</div>
|
2019-05-21 09:58:35 +03:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
2019-09-25 19:19:42 +03:00
|
|
|
import LoginForm from '../components/login/LoginForm.vue'
|
2020-02-09 22:06:08 +03:00
|
|
|
import PasswordLessLoginForm from '../components/login/PasswordLessLoginForm.vue'
|
2019-09-25 19:19:42 +03:00
|
|
|
import ResetPassword from '../components/login/ResetPassword.vue'
|
|
|
|
import UpdatePassword from '../components/login/UpdatePassword.vue'
|
2019-05-21 09:58:35 +03:00
|
|
|
|
2019-09-25 19:19:42 +03:00
|
|
|
export default {
|
|
|
|
name: 'Login',
|
|
|
|
components: {
|
|
|
|
LoginForm,
|
2020-02-09 22:06:08 +03:00
|
|
|
PasswordLessLoginForm,
|
2019-09-25 19:19:42 +03:00
|
|
|
ResetPassword,
|
2019-11-13 15:05:10 +03:00
|
|
|
UpdatePassword,
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
props: {
|
|
|
|
username: {
|
|
|
|
type: String,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: '',
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
redirectUrl: {
|
2019-11-13 15:05:10 +03:00
|
|
|
type: String,
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
errors: {
|
|
|
|
type: Array,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: () => [],
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
messages: {
|
|
|
|
type: Array,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: () => [],
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
throttleDelay: {
|
2019-11-13 15:05:10 +03:00
|
|
|
type: Number,
|
2019-05-21 09:58:35 +03:00
|
|
|
},
|
2019-09-25 19:19:42 +03:00
|
|
|
canResetPassword: {
|
|
|
|
type: Boolean,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: false,
|
2019-05-21 09:58:35 +03:00
|
|
|
},
|
2019-09-25 19:19:42 +03:00
|
|
|
resetPasswordLink: {
|
2019-11-13 15:05:10 +03:00
|
|
|
type: String,
|
2019-07-25 18:04:33 +03:00
|
|
|
},
|
2019-09-25 19:19:42 +03:00
|
|
|
resetPasswordTarget: {
|
2019-11-13 15:05:10 +03:00
|
|
|
type: String,
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
invertedColors: {
|
|
|
|
type: Boolean,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: false,
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
autoCompleteAllowed: {
|
|
|
|
type: Boolean,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: true,
|
2019-10-15 17:27:41 +03:00
|
|
|
},
|
|
|
|
directLogin: {
|
|
|
|
type: Boolean,
|
2019-11-13 15:05:10 +03:00
|
|
|
default: false,
|
|
|
|
},
|
2020-02-09 22:06:08 +03:00
|
|
|
hasPasswordless: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false,
|
|
|
|
},
|
|
|
|
isHttps: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false,
|
|
|
|
},
|
|
|
|
hasPublicKeyCredential: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false,
|
|
|
|
},
|
2021-03-03 13:18:33 +03:00
|
|
|
hideLoginForm: {
|
|
|
|
type: Boolean,
|
2021-03-17 10:25:31 +03:00
|
|
|
default: false,
|
|
|
|
},
|
2019-09-25 19:19:42 +03:00
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
loading: false,
|
|
|
|
user: this.username,
|
2020-02-09 22:06:08 +03:00
|
|
|
passwordlessLogin: false,
|
2019-11-13 15:05:10 +03:00
|
|
|
resetPassword: false,
|
2019-09-25 19:19:42 +03:00
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
passwordResetFinished() {
|
|
|
|
this.resetPasswordTarget = ''
|
2020-01-09 15:26:40 +03:00
|
|
|
this.directLogin = true
|
2019-11-13 15:05:10 +03:00
|
|
|
},
|
|
|
|
},
|
2019-09-25 19:19:42 +03:00
|
|
|
}
|
2019-05-21 09:58:35 +03:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.fade-enter-active, .fade-leave-active {
|
|
|
|
transition: opacity .3s;
|
|
|
|
}
|
|
|
|
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
|
|
|
|
opacity: 0;
|
|
|
|
}
|
|
|
|
</style>
|