diff --git a/html/cgi-bin/chpasswd.cgi b/html/cgi-bin/chpasswd.cgi
index 4930c4ca3..0a1a5c9e3 100644
--- a/html/cgi-bin/chpasswd.cgi
+++ b/html/cgi-bin/chpasswd.cgi
@@ -2,7 +2,7 @@
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
+# Copyright (C) 2007-2025 IPFire Team #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
@@ -20,10 +20,8 @@
###############################################################################
use CGI qw(param);
-use Apache::Htpasswd;
-use Crypt::PasswdMD5;
-$swroot = "/var/ipfire";
+require '/var/ipfire/general-functions.pl';
my %cgiparams;
my %mainsettings;
@@ -32,8 +30,8 @@ my %proxysettings;
$proxysettings{'NCSA_MIN_PASS_LEN'} = 6;
### Initialize environment
-&readhash("${swroot}/main/settings", \%mainsettings);
-&readhash("${swroot}/proxy/advanced/settings", \%proxysettings);
+&readhash("${General::swroot}/main/settings", \%mainsettings);
+&readhash("${General::swroot}/proxy/advanced/settings", \%proxysettings);
$language = $mainsettings{'LANGUAGE'};
### Initialize language
@@ -42,12 +40,12 @@ if ($language =~ /^(\w+)$/) {$language = $1;}
# Uncomment this to force a certain language:
# $language='en';
#
-require "${swroot}/langs/en.pl";
-require "${swroot}/langs/${language}.pl";
+require "${General::swroot}/langs/en.pl";
+require "${General::swroot}/langs/${language}.pl";
-my $userdb = "$swroot/proxy/advanced/ncsa/passwd";
+my $userdb = "$General::swroot/proxy/advanced/ncsa/passwd";
-&readhash("$swroot/ethernet/settings", \%netsettings);
+&readhash("$General::swroot/ethernet/settings", \%netsettings);
my $success = 0;
@@ -76,20 +74,13 @@ if ($cgiparams{'SUBMIT'} eq $tr{'advproxy chgwebpwd change password'})
goto ERROR;
}
- my $htpasswd = new Apache::Htpasswd("$userdb");
-
- # Check if a user with this name exists
- my $old_password = $htpasswd->fetchPass($cgiparams{'USERNAME'});
- if (!$old_password) {
- $errormessage = $tr{'advproxy errmsg invalid user'};
- goto ERROR;
- }
-
- # Reset password
- if (!$htpasswd->htpasswd($cgiparams{'USERNAME'}, $cgiparams{'NEW_PASSWORD_1'},
- $cgiparams{'OLD_PASSWORD'})) {
- $errormessage = $tr{'advproxy errmsg password incorrect'};
+ # If the htpasswd verification status is 0 then update the database
+ # otherwise respond with an error message.
+ if (&General::system("/usr/bin/htpasswd", "-bv", "$userdb", "$cgiparams{'USERNAME'}", "$cgiparams{'OLD_PASSWORD'}") != 0) {
+ $errormessage = $tr{'advproxy errmsg invalid user/password'};
goto ERROR;
+ } else {
+ &General::system("/usr/bin/htpasswd", "-bB", "-C 10", "$userdb", "$cgiparams{'USERNAME'}", "$cgiparams{'NEW_PASSWORD_1'}");
}
$success = 1;
diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
index 2d2ea9e82..815d63c1d 100644
--- a/langs/en/cgi-bin/en.pl
+++ b/langs/en/cgi-bin/en.pl
@@ -304,7 +304,7 @@
'advproxy errmsg invalid upstream proxy' => 'Invalid upstream proxy IP/hostname',
'advproxy errmsg invalid upstream proxy username or password setting' => 'Invalid upstream proxy username or password setting',
'advproxy errmsg invalid url' => 'Invalid URL',
-'advproxy errmsg invalid user' => 'Username does not exist',
+'advproxy errmsg invalid user/password' => 'Error in Username and/or Password',
'advproxy errmsg ldap base dn' => 'LDAP base DN required',
'advproxy errmsg ldap bind dn' => 'LDAP bind DN username and password required',
'advproxy errmsg ldap port' => 'Invalid LDAP port number',
diff --git a/langs/zh/cgi-bin/zh.pl b/langs/zh/cgi-bin/zh.pl
index 0d86d4638..3e15ea2e9 100644
--- a/langs/zh/cgi-bin/zh.pl
+++ b/langs/zh/cgi-bin/zh.pl
@@ -299,7 +299,7 @@
'advproxy errmsg invalid proxy port' => '无效的代理端口',
'advproxy errmsg invalid upstream proxy' => '无效的上游代理IP/主机名',
'advproxy errmsg invalid upstream proxy username or password setting' => '无效的上游代理用户名或密码设置',
-'advproxy errmsg invalid user' => '用户名不存在',
+'advproxy errmsg invalid user/password' => '无效用户名或密码',
'advproxy errmsg ldap base dn' => '需要LDAP基本DN',
'advproxy errmsg ldap bind dn' => '需要LDAP绑定DN用户名和密码',
'advproxy errmsg ldap port' => '无效的LDAP端口号',