Index: branches/5.1.x/core/kernel/utility/formatters/password_formatter.php =================================================================== diff -u -N -r12127 -r12657 --- branches/5.1.x/core/kernel/utility/formatters/password_formatter.php (.../password_formatter.php) (revision 12127) +++ branches/5.1.x/core/kernel/utility/formatters/password_formatter.php (.../password_formatter.php) (revision 12657) @@ -1,6 +1,6 @@ $field_name, 'formatter' => 'kPasswordFormatter'); - if (isset($field_options['encryption_method'])) { - $options['encryption_method'] = $field_options['encryption_method']; + if ( isset( $field_options['verify_field'] ) ) { + $add_fields = Array (); + $options = Array ('master_field' => $field_name, 'formatter' => 'kPasswordFormatter'); + + $copy_options = Array ('encryption_method', 'salt', 'required', 'skip_empty'); + foreach ($copy_options as $copy_option) { + if (array_key_exists($copy_option, $field_options)) { + $options[$copy_option] = $field_options[$copy_option]; + } } - if (isset($field_options['salt'])) { - $options['salt'] = $field_options['salt']; - } - if (isset($field_options['required'])) { - $options['required'] = $field_options['required']; - } + $add_fields[ $field_options['verify_field'] ] = $options; $add_fields[$field_name.'_plain'] = Array('type'=>'string', 'error_field'=>$field_name); @@ -57,63 +55,68 @@ { $options = $object->GetFieldOptions($field_name); - $fields = Array('master_field','verify_field'); - $fields_set = true; $flip_count = 0; - while($flip_count < 2) - { - if( getArrayValue($options,$fields[0]) ) - { + $fields_set = true; + $fields = Array ('master_field', 'verify_field'); + + // 1. collect values from both Password and VerifyPassword fields + while ($flip_count < 2) { + if ( getArrayValue($options, $fields[0]) ) { $object->SetDBField($field_name.'_plain', $value); - if( !getArrayValue($object->Fields[ $options[ $fields[0] ] ], $fields[1].'_set') ) - { + + if ( !getArrayValue($object->Fields[ $options[ $fields[0] ] ], $fields[1].'_set') ) { $object->Fields[ $options[ $fields[0] ] ][$fields[1].'_set'] = true; } $password_field = $options[ $fields[0] ]; $verify_field = $field_name; } + $fields = array_reverse($fields); $flip_count++; } $salt = isset($object->Fields[$password_field]['salt']) ? $object->Fields[$password_field]['salt'] : ''; - if( getArrayValue($object->Fields[$password_field], 'verify_field_set') && getArrayValue($object->Fields[$verify_field], 'master_field_set') ) - { - $new_password = $object->GetDBField($password_field.'_plain'); - $verify_password = $object->GetDBField($verify_field.'_plain'); - if($new_password == '' && $verify_password == '') - { - if( $object->GetDBField($password_field) != $this->EncryptPassword('', $salt) ) - { - if ($options['encryption_method'] == 'plain') return $value; + if (getArrayValue($object->Fields[$password_field], 'verify_field_set') && getArrayValue($object->Fields[$verify_field], 'master_field_set')) { + $new_password = $object->GetDBField($password_field . '_plain'); + $verify_password = $object->GetDBField($verify_field . '_plain'); + + if ($new_password == '' && $verify_password == '') { + // both passwords are empty -> keep old password + if ($object->GetDBField($password_field) != $this->EncryptPassword('', $salt)) { + if ($options['encryption_method'] == 'plain') { + return $value; + } + return $this->EncryptPassword($value); } - else - { - $object->Fields[$password_field.'_plain']['required'] = true; - $object->Fields[$verify_field.'_plain']['required'] = true; - return null; + else { + return $value; } } - $min_length = $this->Application->ConfigValue('Min_Password'); - if (mb_strlen($new_password) >= $min_length) { - if ($new_password != $verify_password) { - $object->SetError($password_field, 'passwords_do_not_match', 'lu_passwords_do_not_match'); - $object->SetError($verify_field, 'passwords_do_not_match', 'lu_passwords_do_not_match'); - } + if ($new_password != $verify_password) { + // passwords don't match (no matter what is their length) + $object->SetError($verify_field, 'passwords_do_not_match', 'lu_passwords_do_not_match'); } - else { - $error_msg = '+'.sprintf($this->Application->Phrase('lu_passwords_too_short'), $min_length); // + -> not phrase + + $min_length = $this->Application->ConfigValue('Min_Password'); // for error message too + + if (mb_strlen($new_password) < $min_length) { + $error_msg = '+' . sprintf($this->Application->Phrase('lu_passwords_too_short'), $min_length); // + -> not phrase $object->SetError($password_field, 'passwords_min_length', $error_msg); - $object->SetError($verify_field, 'passwords_min_length', $error_msg); } } - if($value == '') return $object->GetDBField($field_name); - if ($options['encryption_method'] == 'plain') return $value; + if ($value == '') { + return $object->GetDBField($field_name); + } + + if ($options['encryption_method'] == 'plain') { + return $value; + } + return $this->EncryptPassword($value, $salt); }