Port password settings to vue

Signed-off-by: Carl Schwan <carl@carlschwan.eu>
This commit is contained in:
Carl Schwan 2022-08-02 02:03:19 +02:00
parent b617f3983a
commit 60c42914d8
No known key found for this signature in database
GPG Key ID: C3AA6B3A5EFA7AC5
15 changed files with 155 additions and 67 deletions

View File

@ -49,28 +49,16 @@ use OCP\IUserManager;
use OCP\IUserSession;
class ChangePasswordController extends Controller {
/** @var string */
private $userId;
/** @var IUserManager */
private $userManager;
/** @var IL10N */
private $l;
/** @var GroupManager */
private $groupManager;
/** @var Session */
private $userSession;
/** @var IAppManager */
private $appManager;
private ?string $userId;
private IUserManager $userManager;
private IL10N $l;
private GroupManager $groupManager;
private Session $userSession;
private IAppManager $appManager;
public function __construct(string $appName,
IRequest $request,
string $userId,
?string $userId,
IUserManager $userManager,
IUserSession $userSession,
IGroupManager $groupManager,

View File

@ -0,0 +1,98 @@
<!--
- @copyright 2022 Carl Schwan <carl@carlschwan.eu>
-
- @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>
<NcSettingsSection :title="t('settings', 'Password')">
<form id="passwordform" method="POST" @submit.prevent="changePassword">
<NcPasswordField id="old-pass"
:label="t('settings', 'Current password')"
:label-visible="true"
name="oldpassword"
:value.sync="oldPass"
autocomplete="current-password"
autocapitalize="none"
autocorrect="off" />
<NcPasswordField id="new-pass"
:label="t('settings', 'New password')"
:label-visible="true"
:value.sync="newPass"
:maxlength="469"
autocomplete="new-password"
autocapitalize="none"
autocorrect="off"
:check-password-strength="true" />
<NcButton type="primary"
native-type="submit"
:disabled="newPass.length === 0 || oldPass.length === 0">
{{ t('settings', 'Change password') }}
</NcButton>
</form>
</NcSettingsSection>
</template>
<script>
import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
import NcPasswordField from '@nextcloud/vue/dist/Components/NcPasswordField.js'
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
import { showSuccess, showError } from '@nextcloud/dialogs'
export default {
name: 'PasswordSection',
components: {
NcSettingsSection,
NcButton,
NcPasswordField,
},
data() {
return {
oldPass: '',
newPass: '',
}
},
methods: {
changePassword() {
axios.post(generateUrl('/settings/personal/changepassword'), {
oldpassword: this.oldPass,
newpassword: this.newPass,
})
.then(res => res.data)
.then(data => {
if (data.status === 'error') {
this.errorMessage = data.data.message
showError(data.data.message)
} else {
showSuccess(data.data.message)
}
})
},
},
}
</script>
<style>
#passwordform {
display: flex;
flex-direction: column;
gap: 1rem;
max-width: 400px;
}
</style>

View File

@ -0,0 +1,36 @@
/**
* @copyright 2022 Carl Schwan <carl@carlschwan.eu>
*
* @license AGPL-3.0-or-later
*
* 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/>.
*
*/
import Vue from 'vue'
import PasswordSection from './components/PasswordSection.vue'
import { translate as t, translatePlural as n } from '@nextcloud/l10n'
// eslint-disable-next-line camelcase
__webpack_nonce__ = btoa(OC.requestToken)
Vue.prototype.t = t
Vue.prototype.n = n
export default new Vue({
el: '#security-password',
name: 'main-personal-password',
render: h => h(PasswordSection),
})

View File

@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
* @copyright Copyright (c) 2022 Carl Schwan <carl@carlschwan.eu>
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
*
@ -21,46 +22,8 @@
*
*/
script('settings', [
'settings',
'templates',
'vue-settings-personal-security',
]);
if ($_['passwordChangeSupported']) {
script('settings', 'security_password');
\OCP\Util::addScript('settings', 'vue-settings-personal-password');
}
?>
<?php if ($_['passwordChangeSupported']) { ?>
<div id="security-password" class="section">
<h2 class="inlineblock"><?php p($l->t('Password'));?></h2>
<span id="password-error-msg" class="msg success hidden">Saved</span>
<div class="personal-settings-setting-box personal-settings-password-box">
<form id="passwordform" method="POST">
<div class="input-control">
<label for="pass1"><?php p($l->t('Current password')); ?>: </label>
<input type="password" id="pass1" name="oldpassword"
placeholder="<?php p($l->t('Your current password'));?>"
autocomplete="current-password" autocapitalize="none" autocorrect="off" />
</div>
<div class="personal-show-container">
<label for="pass2" ><?php p($l->t('New password'));?>: </label>
<input type="password" id="pass2" name="newpassword"
maxlength="469"
placeholder="<?php p($l->t('Your new password')); ?>"
data-typetoggle="#personal-show"
autocomplete="new-password" autocapitalize="none" autocorrect="off" />
<input type="checkbox" id="personal-show" class="hidden-visually" name="show" />
<label for="personal-show" class="personal-show-label"></label>
</div>
<div>
<input id="passwordbutton" class="primary" type="submit" value="<?php p($l->t('Change password')); ?>" />
</div>
</form>
</div>
<span class="msg"></span>
</div>
<?php } ?>
<div id="security-password"></div>

BIN
dist/core-common.js vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
dist/core-login.js vendored

Binary file not shown.

BIN
dist/core-login.js.map vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

16
package-lock.json generated
View File

@ -26,7 +26,7 @@
"@nextcloud/paths": "^2.1.0",
"@nextcloud/router": "^2.0.0",
"@nextcloud/sharing": "^0.1.0",
"@nextcloud/vue": "^6.0.0-beta.4",
"@nextcloud/vue": "^6.0.0-beta.5",
"@nextcloud/vue-dashboard": "^2.0.1",
"@vue/cli-plugin-unit-jest": "^4.5.15",
"autosize": "^5.0.1",
@ -3251,9 +3251,9 @@
}
},
"node_modules/@nextcloud/vue": {
"version": "6.0.0-beta.4",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-6.0.0-beta.4.tgz",
"integrity": "sha512-1TdzH0++/gIcBzot8iNT3AnweR/1EykpCfBwkJNhMgoiY4HlMLxBj7bpe2D4ul24XTCoXVEdGMYyB32GNVc9WA==",
"version": "6.0.0-beta.5",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-6.0.0-beta.5.tgz",
"integrity": "sha512-23vdV3Z9iyUXs5mGi++uGShpL1+lhNPLfjbnCjf9rIytG6XQV/46vzdBSttbBA91CnuEYufEsTu3grjwW9JiRg==",
"dependencies": {
"@nextcloud/auth": "^2.0.0",
"@nextcloud/axios": "^2.0.0",
@ -3262,6 +3262,7 @@
"@nextcloud/capabilities": "^1.0.4",
"@nextcloud/dialogs": "^3.1.4",
"@nextcloud/event-bus": "^3.0.0",
"@nextcloud/initial-state": "^1.2.1",
"@nextcloud/l10n": "^1.6.0",
"@nextcloud/logger": "^2.2.1",
"@nextcloud/router": "^2.0.0",
@ -34467,9 +34468,9 @@
}
},
"@nextcloud/vue": {
"version": "6.0.0-beta.4",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-6.0.0-beta.4.tgz",
"integrity": "sha512-1TdzH0++/gIcBzot8iNT3AnweR/1EykpCfBwkJNhMgoiY4HlMLxBj7bpe2D4ul24XTCoXVEdGMYyB32GNVc9WA==",
"version": "6.0.0-beta.5",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-6.0.0-beta.5.tgz",
"integrity": "sha512-23vdV3Z9iyUXs5mGi++uGShpL1+lhNPLfjbnCjf9rIytG6XQV/46vzdBSttbBA91CnuEYufEsTu3grjwW9JiRg==",
"requires": {
"@nextcloud/auth": "^2.0.0",
"@nextcloud/axios": "^2.0.0",
@ -34478,6 +34479,7 @@
"@nextcloud/capabilities": "^1.0.4",
"@nextcloud/dialogs": "^3.1.4",
"@nextcloud/event-bus": "^3.0.0",
"@nextcloud/initial-state": "^1.2.1",
"@nextcloud/l10n": "^1.6.0",
"@nextcloud/logger": "^2.2.1",
"@nextcloud/router": "^2.0.0",

View File

@ -46,7 +46,7 @@
"@nextcloud/paths": "^2.1.0",
"@nextcloud/router": "^2.0.0",
"@nextcloud/sharing": "^0.1.0",
"@nextcloud/vue": "^6.0.0-beta.4",
"@nextcloud/vue": "^6.0.0-beta.5",
"@nextcloud/vue-dashboard": "^2.0.1",
"@vue/cli-plugin-unit-jest": "^4.5.15",
"autosize": "^5.0.1",

View File

@ -81,6 +81,7 @@ module.exports = {
'vue-settings-personal-info': path.join(__dirname, 'apps/settings/src', 'main-personal-info.js'),
'vue-settings-personal-security': path.join(__dirname, 'apps/settings/src', 'main-personal-security.js'),
'vue-settings-personal-webauthn': path.join(__dirname, 'apps/settings/src', 'main-personal-webauth.js'),
'vue-settings-personal-password': path.join(__dirname, 'apps/settings/src', 'main-personal-password.js'),
'legacy-admin': path.join(__dirname, 'apps/settings/src', 'admin.js'),
'apps': path.join(__dirname, 'apps/settings/src', 'apps.js'),
},