Browse Source

Port password settings to vue

Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Carl Schwan 1 year ago
parent
commit
60c42914d8

+ 7 - 19
apps/settings/lib/Controller/ChangePasswordController.php

@@ -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,

+ 98 - 0
apps/settings/src/components/PasswordSection.vue

@@ -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>

+ 36 - 0
apps/settings/src/main-personal-password.js

@@ -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),
+})

+ 3 - 40
apps/settings/templates/settings/personal/security/password.php

@@ -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>

File diff suppressed because it is too large
+ 0 - 0
dist/core-common.js


+ 2 - 0
dist/core-common.js.LICENSE.txt

@@ -378,6 +378,8 @@
 
 /*! For license information please see NcMultiselect.js.LICENSE.txt */
 
+/*! For license information please see NcPasswordField.js.LICENSE.txt */
+
 /*! For license information please see NcRichContenteditable.js.LICENSE.txt */
 
 /*! For license information please see NcTimezonePicker.js.LICENSE.txt */

File diff suppressed because it is too large
+ 0 - 0
dist/core-common.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/core-login.js


File diff suppressed because it is too large
+ 0 - 0
dist/core-login.js.map


File diff suppressed because it is too large
+ 1 - 0
dist/settings-vue-settings-personal-password.js


+ 19 - 0
dist/settings-vue-settings-personal-password.js.LICENSE.txt

@@ -0,0 +1,19 @@
+/**
+ * @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/>.
+ *
+ */

File diff suppressed because it is too large
+ 0 - 0
dist/settings-vue-settings-personal-password.js.map


+ 9 - 7
package-lock.json

@@ -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",

+ 1 - 1
package.json

@@ -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",

+ 1 - 0
webpack.modules.js

@@ -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'),
 	},

Some files were not shown because too many files changed in this diff