From: Michael Tremer <michael.tremer@ipfire.org>
To: Adolf Belka <adolf.belka@ipfire.org>
Cc: "IPFire: Development-List" <development@lists.ipfire.org>
Subject: Re: [PATCH v2] chpasswd.cgi: Fixes bug12755 - v2 with password verification correction
Date: Fri, 9 May 2025 13:30:05 +0100 [thread overview]
Message-ID: <976976E9-DC51-4E47-BC09-49953DAC1259@ipfire.org> (raw)
In-Reply-To: <b9a5f8ee-e17a-4f83-95b0-a34d72117a84@ipfire.org>
Hello Adolf,
> On 9 May 2025, at 13:15, Adolf Belka <adolf.belka@ipfire.org> wrote:
>
> Hi Michael,
>
> On 08/05/2025 15:11, Michael Tremer wrote:
>> Hello Adolf,
>> I just gave this a try:
>> ipfire build chroot (x86_64) root:~$ htpasswd -vb /var/ipfire/auth/users admin ipfire; echo $?
>> User admin not found
>> 6
>> ipfire build chroot (x86_64) root:~$ htpasswd -b /var/ipfire/auth/users admin ipfire
>> Adding password for user admin
>> ipfire build chroot (x86_64) root:~$ htpasswd -vb /var/ipfire/auth/users admin ipfire; echo $?
>> Password for user admin correct.
>> 0
>> ipfire build chroot (x86_64) root:~$ htpasswd -vb /var/ipfire/auth/users admin ipfire2; echo $?
>> password verification failed
>> 3
>> ipfire build chroot (x86_64) root:~$ htpasswd -vb /var/ipfire/auth/users admin2 ipfire2; echo $?
>> User admin2 not found
>> 6
>> This is in the dev system, so the password file was empty to start with.
>> Basically if the username and password match the return code is zero. If something else happened it isn’t. And this is exactly what I would check for: Okay on zero, not okay on anything else. I would not even case why htpasswd was upset because it does not matter in our use-case.
>
> Okay, so the $? contains the status of the bash command htpasswd but how do I access that via the perl system_output command. I have tried making the result of the system_output command be fed to a $variable but I just get a 1 for all the different conditions you tried.
> I also tried making the system_output command be fed to an array variable and then printing all the elements of that array variable out but there was no status value.
You don’t use the system_output() function, you should use the &General::system() function. On there, we fetch the return code and return it:
https://git.ipfire.org/?p=ipfire-2.x.git;a=blob;f=config/cfgroot/general-functions.pl;h=8ba6e3f79f0a9660ba8f8630ad0c7f1a3f6c988d;hb=HEAD#l32
Perl stores the value in $? like bash, but weirdly shifts it by 8 bits, so we have to shift it back.
So your code should read a bit like:
if (&General::system(“htpasswd”, “-B”, …) == 0) {
// success
} else {
// fail
}
> It will probably turn out to be very simple but I am afraid I am not having any luck figuring out how to do it.
Not a problem :)
The &General::system_output() function does not return the return code because it is already returning the output of the command. If the command fails there won't be any output - and that is not a very good way to check things normally.
-Michael
> All feedback gladly welcomed.
>
> Regards,
> Adolf.
>
>> -Michael
>>> On 7 May 2025, at 15:02, Adolf Belka <adolf.belka@ipfire.org> wrote:
>>>
>>> Hi Michael,
>>>
>>> On 07/05/2025 15:52, Adolf Belka wrote:
>>>> Hi Michael,
>>>> On 07/05/2025 14:44, Michael Tremer wrote:
>>>>> Hello Adolf,
>>>>>
>>>>> Thanks for the patch. Is there no return code that we get from htpasswd instead of parsing the output?
>>>> It gives a return code for everything, with numbers of 0 to 7, except for the use of the -v option to verify the password.
>>> There might be a status code returned. The man page says
>>>
>>> 3 if the password was entered interactively and the verification entry didn't match
>>>
>>> but elsewhere it does suggest that interactively is not via the -bv option but where you just use -v and manually type the password when requested on the command line.
>>>
>>> If the status 3 is a valid status code, how can I access that from the output of the &General::system_output subroutine?
>>>
>>> I could give it a try out and if it does work then I could do a v3 patch.
>>>
>>> Regards,
>>>
>>> Adolf.
>>>
>>>> This gives
>>>> password verification failed
>>>> if the existing password for the specified user is not correct and
>>>> Password for user fred correct.
>>>> if the user specified was fred and the specified password was correct.
>>>> It does the above for both the interactive -v and the batch mode using the command line of -bv
>>>> I had to use the check for if the string was found in the return variable because if I checked if the string matched the contents of the variable it always failed so I think there is a hidden Carriage Return or something in the output from htpasswd for the verification test.
>>>> Regards,
>>>> Adolf.
>>>>>
>>>>> -Michael
>>>>>
>>>>>> On 7 May 2025, at 13:42, Adolf Belka <adolf.belka@ipfire.org> wrote:
>>>>>>
>>>>>> - Realised that I had not tested the old password beinhg correct or not. Previous check
>>>>>> gave the same answer irrespective of the output coming from the htpasswd verification.
>>>>>> - This changes the variable used for the system_output result to an array and then
>>>>>> checks if the first element contains the failure message that htpasswd gives if
>>>>>> password verification fails.
>>>>>> - Tested out with correct and incorrect old passwords and gave the correct answer in
>>>>>> both cases. Confirmed also that the check for the user being present works correctly
>>>>>> for both an existing and new user name, which it did.
>>>>>>
>>>>>> Fixes: bug12755
>>>>>> Tested-by: Adolf Belka <adolf.belka@ipfire.org>
>>>>>> Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
>>>>>> ---
>>>>>> html/cgi-bin/chpasswd.cgi | 4 ++--
>>>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/html/cgi-bin/chpasswd.cgi b/html/cgi-bin/chpasswd.cgi
>>>>>> index c00caca20..46c3e02f6 100644
>>>>>> --- a/html/cgi-bin/chpasswd.cgi
>>>>>> +++ b/html/cgi-bin/chpasswd.cgi
>>>>>> @@ -77,11 +77,11 @@ if ($cgiparams{'SUBMIT'} eq $tr{'advproxy chgwebpwd change password'})
>>>>>> # Check if a user with this name and password exists in the userdb file
>>>>>> # and if it does then change the password to the new one
>>>>>> my $user = &General::system_output("grep", "$cgiparams{'USERNAME'}", "$userdb");
>>>>>> - my $old_password = &General::system_output("/usr/bin/htpasswd", "-bv", "$userdb", "$cgiparams{'USERNAME'}", "$cgiparams{'OLD_PASSWORD'}");
>>>>>> + my @old_password = &General::system_output("/usr/bin/htpasswd", "-bv", "$userdb", "$cgiparams{'USERNAME'}", "$cgiparams{'OLD_PASSWORD'}");
>>>>>> if (!$user) {
>>>>>> $errormessage = $tr{'advproxy errmsg invalid user'};
>>>>>> goto ERROR;
>>>>>> - } elsif (!$old_password) {
>>>>>> + } elsif (@old_password[0] =~ /password verification failed/) {
>>>>>> $errormessage = $tr{'advproxy errmsg password incorrect'};
>>>>>> goto ERROR;
>>>>>> } else {
>>>>>> --
>>>>>> 2.49.0
prev parent reply other threads:[~2025-05-09 12:30 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-07 12:42 Adolf Belka
2025-05-07 12:44 ` Michael Tremer
2025-05-07 13:52 ` Adolf Belka
2025-05-07 14:02 ` Adolf Belka
2025-05-08 13:11 ` Michael Tremer
2025-05-09 12:15 ` Adolf Belka
2025-05-09 12:30 ` Michael Tremer [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=976976E9-DC51-4E47-BC09-49953DAC1259@ipfire.org \
--to=michael.tremer@ipfire.org \
--cc=adolf.belka@ipfire.org \
--cc=development@lists.ipfire.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox