浏览代码

User Add/Edit: Display password requirements, additional checks for required fields.

Nate 6 年之前
父节点
当前提交
a62d34976b
共有 2 个文件被更改,包括 267 次插入120 次删除
  1. 156 36
      core/users/app_languages.php
  2. 111 84
      core/users/user_edit.php

+ 156 - 36
core/users/app_languages.php

@@ -402,44 +402,64 @@ $text['message-cannot_delete_own_account']['sv-se'] = "Du kan inte ta bort ditt
 $text['message-cannot_delete_own_account']['uk-ua'] = "Ви не можете видалити власний обліковий запис. Будь ласка, увійдіть під іншим користувачем, потім повторіть спробу.";
 
 $text['message-invalid_user']['en-us'] = "Invalid User";
-$text['message-invalid_user']['ar-eg'] = "";
-$text['message-invalid_user']['de-at'] = ""; //copied from de-de
-$text['message-invalid_user']['de-ch'] = ""; //copied from de-de
-$text['message-invalid_user']['de-de'] = "";
-$text['message-invalid_user']['es-cl'] = "";
-$text['message-invalid_user']['es-mx'] = ""; //copied from es-cl
-$text['message-invalid_user']['fr-ca'] = ""; //copied from fr-fr
-$text['message-invalid_user']['fr-fr'] = "";
-$text['message-invalid_user']['he-il'] = "";
-$text['message-invalid_user']['it-it'] = "";
-$text['message-invalid_user']['nl-nl'] = "";
-$text['message-invalid_user']['pl-pl'] = "";
-$text['message-invalid_user']['pt-br'] = ""; //copied from pt-pt
-$text['message-invalid_user']['pt-pt'] = "";
-$text['message-invalid_user']['ro-ro'] = "";
-$text['message-invalid_user']['ru-ru'] = "";
-$text['message-invalid_user']['sv-se'] = "";
-$text['message-invalid_user']['uk-ua'] = "";
+$text['message-invalid_user']['ar-eg'] = "Invalid User";
+$text['message-invalid_user']['de-at'] = "Invalid User";
+$text['message-invalid_user']['de-ch'] = "Invalid User";
+$text['message-invalid_user']['de-de'] = "Invalid User";
+$text['message-invalid_user']['es-cl'] = "Invalid User";
+$text['message-invalid_user']['es-mx'] = "Invalid User";
+$text['message-invalid_user']['fr-ca'] = "Invalid User";
+$text['message-invalid_user']['fr-fr'] = "Invalid User";
+$text['message-invalid_user']['he-il'] = "Invalid User";
+$text['message-invalid_user']['it-it'] = "Invalid User";
+$text['message-invalid_user']['nl-nl'] = "Invalid User";
+$text['message-invalid_user']['pl-pl'] = "Invalid User";
+$text['message-invalid_user']['pt-br'] = "Invalid User";
+$text['message-invalid_user']['pt-pt'] = "Invalid User";
+$text['message-invalid_user']['ro-ro'] = "Invalid User";
+$text['message-invalid_user']['ru-ru'] = "Invalid User";
+$text['message-invalid_user']['sv-se'] = "Invalid User";
+$text['message-invalid_user']['uk-ua'] = "Invalid User";
 
 $text['message-unsaved_changes']['en-us'] = "Unsaved Changes";
-$text['message-unsaved_changes']['ar-eg'] = "";
-$text['message-unsaved_changes']['de-at'] = ""; //copied from de-de
-$text['message-unsaved_changes']['de-ch'] = ""; //copied from de-de
-$text['message-unsaved_changes']['de-de'] = "";
-$text['message-unsaved_changes']['es-cl'] = "";
-$text['message-unsaved_changes']['es-mx'] = ""; //copied from es-cl
-$text['message-unsaved_changes']['fr-ca'] = ""; //copied from fr-fr
-$text['message-unsaved_changes']['fr-fr'] = "";
-$text['message-unsaved_changes']['he-il'] = "";
-$text['message-unsaved_changes']['it-it'] = "";
-$text['message-unsaved_changes']['nl-nl'] = "";
-$text['message-unsaved_changes']['pl-pl'] = "";
-$text['message-unsaved_changes']['pt-br'] = ""; //copied from pt-pt
-$text['message-unsaved_changes']['pt-pt'] = "";
-$text['message-unsaved_changes']['ro-ro'] = "";
-$text['message-unsaved_changes']['ru-ru'] = "";
-$text['message-unsaved_changes']['sv-se'] = "";
-$text['message-unsaved_changes']['uk-ua'] = "";
+$text['message-unsaved_changes']['ar-eg'] = "Unsaved Changes";
+$text['message-unsaved_changes']['de-at'] = "Unsaved Changes";
+$text['message-unsaved_changes']['de-ch'] = "Unsaved Changes";
+$text['message-unsaved_changes']['de-de'] = "Unsaved Changes";
+$text['message-unsaved_changes']['es-cl'] = "Unsaved Changes";
+$text['message-unsaved_changes']['es-mx'] = "Unsaved Changes";
+$text['message-unsaved_changes']['fr-ca'] = "Unsaved Changes";
+$text['message-unsaved_changes']['fr-fr'] = "Unsaved Changes";
+$text['message-unsaved_changes']['he-il'] = "Unsaved Changes";
+$text['message-unsaved_changes']['it-it'] = "Unsaved Changes";
+$text['message-unsaved_changes']['nl-nl'] = "Unsaved Changes";
+$text['message-unsaved_changes']['pl-pl'] = "Unsaved Changes";
+$text['message-unsaved_changes']['pt-br'] = "Unsaved Changes";
+$text['message-unsaved_changes']['pt-pt'] = "Unsaved Changes";
+$text['message-unsaved_changes']['ro-ro'] = "Unsaved Changes";
+$text['message-unsaved_changes']['ru-ru'] = "Unsaved Changes";
+$text['message-unsaved_changes']['sv-se'] = "Unsaved Changes";
+$text['message-unsaved_changes']['uk-ua'] = "Unsaved Changes";
+
+$text['message-green_border_passwords_match']['en-us'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['ar-eg'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['de-at'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['de-ch'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['de-de'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['es-cl'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['es-mx'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['fr-ca'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['fr-fr'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['he-il'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['it-it'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['nl-nl'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['pl-pl'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['pt-br'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['pt-pt'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['ro-ro'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['ru-ru'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['sv-se'] = "Green field borders indicate typed passwords match.";
+$text['message-green_border_passwords_match']['uk-ua'] = "Green field borders indicate typed passwords match.";
 
 $text['label-web_fonts']['en-us'] = "Web Fonts";
 $text['label-web_fonts']['ar-eg'] = "الخطوط على شبكة الإنترنت";
@@ -1161,6 +1181,106 @@ $text['label-characters']['ru-ru'] = "символов";
 $text['label-characters']['sv-se'] = "Tecken";
 $text['label-characters']['uk-ua'] = "персонажі";
 
+$text['label-required']['en-us'] = "Required";
+$text['label-required']['ar-eg'] = "Required";
+$text['label-required']['de-at'] = "Required";
+$text['label-required']['de-ch'] = "Required";
+$text['label-required']['de-de'] = "Required";
+$text['label-required']['es-cl'] = "Required";
+$text['label-required']['es-mx'] = "Required";
+$text['label-required']['fr-ca'] = "Required";
+$text['label-required']['fr-fr'] = "Required";
+$text['label-required']['he-il'] = "Required";
+$text['label-required']['it-it'] = "Required";
+$text['label-required']['nl-nl'] = "Required";
+$text['label-required']['pl-pl'] = "Required";
+$text['label-required']['pt-br'] = "Required";
+$text['label-required']['pt-pt'] = "Required";
+$text['label-required']['ro-ro'] = "Required";
+$text['label-required']['ru-ru'] = "Required";
+$text['label-required']['sv-se'] = "Required";
+$text['label-required']['uk-ua'] = "Required";
+
+$text['label-number']['en-us'] = "Number";
+$text['label-number']['ar-eg'] = "Number";
+$text['label-number']['de-at'] = "Number";
+$text['label-number']['de-ch'] = "Number";
+$text['label-number']['de-de'] = "Number";
+$text['label-number']['es-cl'] = "Number";
+$text['label-number']['es-mx'] = "Number";
+$text['label-number']['fr-ca'] = "Number";
+$text['label-number']['fr-fr'] = "Number";
+$text['label-number']['he-il'] = "Number";
+$text['label-number']['it-it'] = "Number";
+$text['label-number']['nl-nl'] = "Number";
+$text['label-number']['pl-pl'] = "Number";
+$text['label-number']['pt-br'] = "Number";
+$text['label-number']['pt-pt'] = "Number";
+$text['label-number']['ro-ro'] = "Number";
+$text['label-number']['ru-ru'] = "Number";
+$text['label-number']['sv-se'] = "Number";
+$text['label-number']['uk-ua'] = "Number";
+
+$text['label-lowercase']['en-us'] = "Lowercase";
+$text['label-lowercase']['ar-eg'] = "Lowercase";
+$text['label-lowercase']['de-at'] = "Lowercase";
+$text['label-lowercase']['de-ch'] = "Lowercase";
+$text['label-lowercase']['de-de'] = "Lowercase";
+$text['label-lowercase']['es-cl'] = "Lowercase";
+$text['label-lowercase']['es-mx'] = "Lowercase";
+$text['label-lowercase']['fr-ca'] = "Lowercase";
+$text['label-lowercase']['fr-fr'] = "Lowercase";
+$text['label-lowercase']['he-il'] = "Lowercase";
+$text['label-lowercase']['it-it'] = "Lowercase";
+$text['label-lowercase']['nl-nl'] = "Lowercase";
+$text['label-lowercase']['pl-pl'] = "Lowercase";
+$text['label-lowercase']['pt-br'] = "Lowercase";
+$text['label-lowercase']['pt-pt'] = "Lowercase";
+$text['label-lowercase']['ro-ro'] = "Lowercase";
+$text['label-lowercase']['ru-ru'] = "Lowercase";
+$text['label-lowercase']['sv-se'] = "Lowercase";
+$text['label-lowercase']['uk-ua'] = "Lowercase";
+
+$text['label-uppercase']['en-us'] = "Uppercase";
+$text['label-uppercase']['ar-eg'] = "Uppercase";
+$text['label-uppercase']['de-at'] = "Uppercase";
+$text['label-uppercase']['de-ch'] = "Uppercase";
+$text['label-uppercase']['de-de'] = "Uppercase";
+$text['label-uppercase']['es-cl'] = "Uppercase";
+$text['label-uppercase']['es-mx'] = "Uppercase";
+$text['label-uppercase']['fr-ca'] = "Uppercase";
+$text['label-uppercase']['fr-fr'] = "Uppercase";
+$text['label-uppercase']['he-il'] = "Uppercase";
+$text['label-uppercase']['it-it'] = "Uppercase";
+$text['label-uppercase']['nl-nl'] = "Uppercase";
+$text['label-uppercase']['pl-pl'] = "Uppercase";
+$text['label-uppercase']['pt-br'] = "Uppercase";
+$text['label-uppercase']['pt-pt'] = "Uppercase";
+$text['label-uppercase']['ro-ro'] = "Uppercase";
+$text['label-uppercase']['ru-ru'] = "Uppercase";
+$text['label-uppercase']['sv-se'] = "Uppercase";
+$text['label-uppercase']['uk-ua'] = "Uppercase";
+
+$text['label-special']['en-us'] = "Special";
+$text['label-special']['ar-eg'] = "Special";
+$text['label-special']['de-at'] = "Special";
+$text['label-special']['de-ch'] = "Special";
+$text['label-special']['de-de'] = "Special";
+$text['label-special']['es-cl'] = "Special";
+$text['label-special']['es-mx'] = "Special";
+$text['label-special']['fr-ca'] = "Special";
+$text['label-special']['fr-fr'] = "Special";
+$text['label-special']['he-il'] = "Special";
+$text['label-special']['it-it'] = "Special";
+$text['label-special']['nl-nl'] = "Special";
+$text['label-special']['pl-pl'] = "Special";
+$text['label-special']['pt-br'] = "Special";
+$text['label-special']['pt-pt'] = "Special";
+$text['label-special']['ro-ro'] = "Special";
+$text['label-special']['ru-ru'] = "Special";
+$text['label-special']['sv-se'] = "Special";
+$text['label-special']['uk-ua'] = "Special";
+
 $text['label-center']['en-us'] = "Center";
 $text['label-center']['ar-eg'] = "مركز";
 $text['label-center']['de-at'] = "Mitte"; //copied from de-de

+ 111 - 84
core/users/user_edit.php

@@ -97,6 +97,13 @@
 			return;
 	}
 
+//retrieve password requirements
+	$required['length'] = $_SESSION['user']['password_length']['numeric'];
+	$required['number'] = ($_SESSION['user']['password_number']['boolean'] == 'true') ? true : false;
+	$required['lowercase'] = ($_SESSION['user']['password_lowercase']['boolean'] == 'true') ? true : false;
+	$required['uppercase'] = ($_SESSION['user']['password_uppercase']['boolean'] == 'true') ? true : false;
+	$required['special'] = ($_SESSION['user']['password_special']['boolean'] == 'true') ? true : false;
+
 //prepare the data
 	if (count($_POST) > 0) {
 
@@ -128,13 +135,6 @@
 				$message_key = check_str($_POST["message_key"]);
 			}
 
-		//get the password requirements
-			$required['length'] = $_SESSION['user']['password_length']['numeric'];
-			$required['number'] = ($_SESSION['user']['password_number']['boolean'] == 'true') ? true : false;
-			$required['lowercase'] = ($_SESSION['user']['password_lowercase']['boolean'] == 'true') ? true : false;
-			$required['uppercase'] = ($_SESSION['user']['password_uppercase']['boolean'] == 'true') ? true : false;
-			$required['special'] = ($_SESSION['user']['password_special']['boolean'] == 'true') ? true : false;
-
 		//check required values
 			if ($username == '') {
 				message::add($text['message-required'].$text['label-username'], 'negative', 7500);
@@ -202,7 +202,7 @@
 		//return if error
 			if (message::count() != 0) {
 				$_SESSION['tmp'][$_SERVER['PHP_SELF']]['user'] = $_POST;
-				header("Location: user_edit.php?id=".$user_uuid);
+				header("Location: user_edit.php".(permission_exists('user_edit') && $action != 'add' ? "?id=".$user_uuid : null));
 				exit;
 			}
 
@@ -511,82 +511,79 @@
 			exit;
 	}
 
-//pre-populate the form
-	if ($action == 'edit') {
-
-	//get values from session variable
-		if (
-			is_array($_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']) &&
-			sizeof($_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']) != 0)
-			{
-			$domain_uuid = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["domain_uuid"];
-			$username = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["username"];
-			$api_key = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["api_key"];
-			$user_enabled = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["user_enabled"];
-			$contact_uuid = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["contact_uuid"];
-			$user_status = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["user_status"];
-			$password_confirm = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['password_confirm'];
-			$user_settings['domain']['language']['code'] = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['user_language'];
-			$user_settings['domain']['time_zone']['name'] = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['user_time_zone'];
-			$user_email = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['user_email'];
-			$contact_name_given = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['contact_name_given'];
-			$contact_name_family = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['contact_name_family'];
-			$contact_organization = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['contact_organization'];
-			$user_settings["message"]["key"]["text"] = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['message_key'];
-
-			$unsaved = true;
-			unset($_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']);
-		}
+//populate the form with values from session variable
+	if (
+		is_array($_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']) &&
+		sizeof($_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']) != 0
+		) {
+		$domain_uuid = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["domain_uuid"];
+		$username = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["username"];
+		$password = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["password"];
+		$password_confirm = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["password_confirm"];
+		$api_key = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["api_key"];
+		$user_enabled = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["user_enabled"];
+		$contact_uuid = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["contact_uuid"];
+		$user_status = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']["user_status"];
+		$password_confirm = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['password_confirm'];
+		$user_settings['domain']['language']['code'] = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['user_language'];
+		$user_settings['domain']['time_zone']['name'] = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['user_time_zone'];
+		$user_email = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['user_email'];
+		$contact_name_given = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['contact_name_given'];
+		$contact_name_family = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['contact_name_family'];
+		$contact_organization = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['contact_organization'];
+		$user_settings["message"]["key"]["text"] = $_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']['message_key'];
+
+		$unsaved = true;
+		unset($_SESSION['tmp'][$_SERVER['PHP_SELF']]['user']);
+	}
 
-	//get values from db
-		else {
+//populate the form with values from db
+	else {
+		if ($action == 'edit') {
+			$sql = "select * from v_users where user_uuid = '".$user_uuid."' ";
+			if (!permission_exists('user_all')) {
+				$sql .= "and domain_uuid = '".$domain_uuid."' ";
+			}
+			$prep_statement = $db->prepare(check_sql($sql));
+			$prep_statement->execute();
+			$row = $prep_statement->fetch(PDO::FETCH_NAMED);
+			if (is_array($row) && sizeof($row) > 0) {
+				$domain_uuid = $row["domain_uuid"];
+				$user_uuid = $row["user_uuid"];
+				$username = $row["username"];
+				$api_key = $row["api_key"];
+				$user_enabled = $row["user_enabled"];
+				$contact_uuid = $row["contact_uuid"];
+				$user_status = $row["user_status"];
+			}
+			else {
+				message::add($text['message-invalid_user'], 'negative', 7500);
+				header("Location: user_edit.php?id=".$_SESSION['user_uuid']);
+				exit;
+			}
+			unset($sql, $prep_statement, $row);
 
-			//get user data
-				$sql = "select * from v_users where user_uuid = '".$user_uuid."' ";
-				if (!permission_exists('user_all')) {
-					$sql .= "and domain_uuid = '".$domain_uuid."' ";
-				}
-				$prep_statement = $db->prepare(check_sql($sql));
+		//get user settings
+			$sql = "select * from v_user_settings ";
+			$sql .= "where user_uuid = '".$user_uuid."' ";
+			$sql .= "and user_setting_enabled = 'true' ";
+			$prep_statement = $db->prepare($sql);
+			if ($prep_statement) {
 				$prep_statement->execute();
-				$row = $prep_statement->fetch(PDO::FETCH_NAMED);
-				if (is_array($row) && sizeof($row) > 0) {
-					$domain_uuid = $row["domain_uuid"];
-					$user_uuid = $row["user_uuid"];
-					$username = $row["username"];
-					$password = $row["password"];
-					$api_key = $row["api_key"];
-					$user_enabled = $row["user_enabled"];
-					$contact_uuid = $row["contact_uuid"];
-					$user_status = $row["user_status"];
-				}
-				else {
-					message::add($text['message-invalid_user'], 'negative', 7500);
-					header("Location: user_edit.php?id=".$_SESSION['user_uuid']);
-					exit;
-				}
-				unset($sql, $prep_statement, $row);
-
-			//get user settings
-				$sql = "select * from v_user_settings ";
-				$sql .= "where user_uuid = '".$user_uuid."' ";
-				$sql .= "and user_setting_enabled = 'true' ";
-				$prep_statement = $db->prepare($sql);
-				if ($prep_statement) {
-					$prep_statement->execute();
-					$result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
-					foreach($result as $row) {
-						$name = $row['user_setting_name'];
-						$category = $row['user_setting_category'];
-						$subcategory = $row['user_setting_subcategory'];
-						if (strlen($subcategory) == 0) {
-							//$$category[$name] = $row['domain_setting_value'];
-							$user_settings[$category][$name] = $row['user_setting_value'];
-						}
-						else {
-							$user_settings[$category][$subcategory][$name] = $row['user_setting_value'];
-						}
+				$result = $prep_statement->fetchAll(PDO::FETCH_NAMED);
+				foreach($result as $row) {
+					$name = $row['user_setting_name'];
+					$category = $row['user_setting_category'];
+					$subcategory = $row['user_setting_subcategory'];
+					if (strlen($subcategory) == 0) {
+						//$$category[$name] = $row['domain_setting_value'];
+						$user_settings[$category][$name] = $row['user_setting_value'];
+					}
+					else {
+						$user_settings[$category][$subcategory][$name] = $row['user_setting_value'];
 					}
 				}
+			}
 		}
 	}
 
@@ -648,6 +645,7 @@
 	echo "		<td width='70%' class='vtable'>";
 	if (permission_exists("user_edit")) {
 		echo "		<input type='text' class='formfld' name='username' id='username' autocomplete='new-password' value='".escape($username)."' required='required'>\n";
+		echo "		<input type='text' id='autofill_honeypot' style='display: none;'>\n";
 	}
 	else {
 		echo "		".escape($username)."\n";
@@ -660,14 +658,43 @@
 	echo "		<td class='vncell".(($action == 'add') ? 'req' : null)."' valign='top'>".$text['label-password']."</td>";
 	echo "		<td class='vtable'>";
 	echo "			<input style='display: none;' type='password'>";
-	echo "			<input type='password' autocomplete='new-password' class='formfld' name='password' id='password' value='' onkeypress='show_strength_meter();' onfocus='compare_passwords();' onkeyup='compare_passwords();' onblur='compare_passwords();'>";
-	echo "			<div id='pwstrength_progress' class='pwstrength_progress'></div>";
+	echo "			<input type='password' autocomplete='new-password' class='formfld' name='password' id='password' value=\"".escape($password)."\" ".($action == 'add' ? "required='required'" : null)." onkeypress='show_strength_meter();' onfocus='compare_passwords();' onkeyup='compare_passwords();' onblur='compare_passwords();'>";
+	echo "			<div id='pwstrength_progress' class='pwstrength_progress'></div><br />\n";
+	if ((is_numeric($required['length']) && $required['length'] != 0) || $required['number'] || $required['lowercase'] || $required['uppercase'] || $required['special']) {
+		echo $text['label-required'].': ';
+		if (is_numeric($required['length']) && $required['length'] != 0) {
+			echo $required['length']." ".$text['label-characters'];
+			if ($required['number'] || $required['lowercase'] || $required['uppercase'] || $required['special']) {
+				echo " (";
+			}
+		}
+		if ($required['number']) {
+			$required_temp[] = $text['label-number'];
+		}
+		if ($required['lowercase']) {
+			$required_temp[] = $text['label-lowercase'];
+		}
+		if ($required['uppercase']) {
+			$required_temp[] = $text['label-uppercase'];
+		}
+		if ($required['special']) {
+			$required_temp[] = $text['label-special'];
+		}
+		if (is_array($required_temp) && sizeof($required_temp) != 0) {
+			echo implode(', ',$required_temp);
+			if (is_numeric($required['length']) && $required['length'] != 0) {
+				echo ")";
+			}
+		}
+		unset($required_temp);
+	}
 	echo "		</td>";
 	echo "	</tr>";
 	echo "	<tr>";
 	echo "		<td class='vncell".(($action == 'add') ? 'req' : null)."' valign='top'>".$text['label-confirm_password']."</td>";
 	echo "		<td class='vtable'>";
-	echo "			<input type='password' autocomplete='new-password' class='formfld' name='password_confirm' id='password_confirm' value='' onfocus='compare_passwords();' onkeyup='compare_passwords();' onblur='compare_passwords();'>";
+	echo "			<input type='password' autocomplete='new-password' class='formfld' name='password_confirm' id='password_confirm' value=\"".escape($password_confirm)."\" ".($action == 'add' ? "required='required'" : null)." onfocus='compare_passwords();' onkeyup='compare_passwords();' onblur='compare_passwords();'><br />\n";
+	echo "			".$text['message-green_border_passwords_match']."\n";
 	echo "		</td>";
 	echo "	</tr>";
 
@@ -811,7 +838,7 @@
 	else if ($action == 'add' && permission_exists("user_add")) {
 		echo "	<tr>";
 		echo "		<td class='vncellreq'>".$text['label-email']."</td>";
-		echo "		<td class='vtable'><input type='text' class='formfld' name='user_email' value='".escape($user_email)."'></td>";
+		echo "		<td class='vtable'><input type='text' class='formfld' name='user_email' value='".escape($user_email)."' ".($action == 'add' ? "required='required'" : null)."></td>";
 		echo "	</tr>";
 		echo "	<tr>";
 		echo "		<td class='vncell'>".$text['label-first_name']."</td>";
@@ -885,7 +912,7 @@
 		$groups = $prep_statement->fetchAll(PDO::FETCH_NAMED);
 		if (is_array($groups)) {
 			if (isset($assigned_groups)) { echo "<br />\n"; }
-			echo "<select name='group_uuid_name' class='formfld' style='width: auto; margin-right: 3px;'>\n";
+			echo "<select name='group_uuid_name' class='formfld' style='width: auto; margin-right: 3px;' ".($action == 'add' ? "required='required'" : null).">\n";
 			echo "	<option value=''></option>\n";
 			foreach($groups as $field) {
 				if ($field['group_name'] == "superadmin" && !if_group("superadmin")) { continue; }	//only show the superadmin group to other superadmins