หากเราดู source code ของ vestacp จะพบว่าไฟล์
/usr/local/vesta/bin/v-generate-password-hash
มี option ให้สร้าง password แบบ sha-512
ดังนั้น เราจะแก้ code ของ vesta ให้ใช้ sha-512 แทน md5 เวลาสร้างรหัสผ่านอีเมล์
nano /usr/local/vesta/bin/v-change-mail-account-password
# Generating hashed password
salt=$(generate_password "$PW_MATRIX" "8")
#md5="{MD5}$($BIN/v-generate-password-hash md5 $salt <<<$password)"
md5="$($BIN/v-generate-password-hash sha-512 $salt <<<$password)"
quota=$(get_object_value "mail/$domain" 'ACCOUNT' "$account" '$QUOTA')
if [[ "$MAIL_SYSTEM" =~ exim ]]; then
sed -i "/^$account:/d" $HOMEDIR/$user/conf/mail/$domain/passwd
str="$account:$md5:$user:mail::$HOMEDIR/$user:$quota"
echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
fi
บรรทัดที่ 6 : แก้ bug ของ vesta เวลาเราเปลี่ยนรหัสผ่านแล้ว quota ถูก reset
nano /usr/local/vesta/bin/v-add-mail-account
# Generating hashed password
salt=$(generate_password "$PW_MATRIX" "8")
#md5="{MD5}$($BIN/v-generate-password-hash md5 $salt <<<$password)"
md5="$($BIN/v-generate-password-hash sha-512 $salt <<<$password)"
จากนี้ไป เวลาเราสร้างอีเมล์ หรือเปลี่ยนรหัสผ่านอีเมล์ ใน control panel ของ vesta
รหัสผ่านจะถูกสร้างแบบ sha-512
ผมลอง login เข้า roundcube แล้วลองเปลี่ยนรหัสผ่านใน roundcube
ปรากฏว่า error ดังนั้น เราจึงต้องแก้ไฟล์ที่เกี่ยวกับ roundcube ด้วย
nano /usr/local/vesta/web/reset/mail/index.php
// Check arguments
if ((!empty($_POST['email'])) && (!empty($_POST['password'])) && (!empty($_POST['new']))) {
list($v_account, $v_domain) = explode('@', $_POST['email']);
$v_domain = escapeshellarg($v_domain);
$v_account = escapeshellarg($v_account);
$v_password = $_POST['password'];
// Get domain owner
exec (VESTA_CMD."v-search-domain-owner ".$v_domain." 'mail'", $output, $return_var);
if ($return_var == 0) {
$v_user = $output[0];
}
unset($output);
// Get md5 hash from vesta database
if (!empty($v_user)) {
exec (VESTA_CMD."v-get-mail-account-value '".$v_user."' ".$v_domain." ".$v_account." 'md5'", $output, $return_var);
if ($return_var == 0) {
$v_hash = $output[0];
}
}
unset($output);
// Get md5 hash from old password
if (!empty($v_user)) {
$t1 = explode('$', $v_hash); $salt=$t1[2];
exec (VESTA_CMD."v-generate-password-hash sha-512 $salt $v_password", $output, $return_var);
if ($return_var == 0) {
$n_hash = $output[0];
}
}
unset($output);
// Compare hashes
if (!empty($v_hash)) {
// $salt = explode('$', $v_hash);
// $n_hash = md5crypt($v_password, $salt[2]);
// $n_hash = '{MD5}'.$n_hash;
// Change password
if ( $v_hash == $n_hash ) {
// $v_new_password = tempnam("/tmp","vst");
// $fp = fopen($v_new_password, "w");
// fwrite($fp, $_POST['new']."\n");
// fclose($fp);
$v_new_password = $_POST['new'];
exec (VESTA_CMD."v-change-mail-account-password '".$v_user."' ".$v_domain." ".$v_account." ".$v_new_password, $output, $return_var);
if ($return_var == 0) {
echo "ok";
exit;
}
}
}
}
echo 'error';
exit;
nano /usr/share/roundcubemail/plugins/password/config.inc.php
เปลี่ยน port บรรทัดสุดท้ายให้ตรงกับ vesta
7 ส.ค. 62