mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-04 21:38:34 +02:00
103 lines
2.1 KiB
ObjectPascal
103 lines
2.1 KiB
ObjectPascal
Program TestPass;
|
|
{$mode delphi}
|
|
{Test the user's password}
|
|
{$DEFINE DEBUG}
|
|
|
|
// The funcs in shadow are linux only.
|
|
uses {$ifdef linux}shadow, {$endif} pwd ,crypth ;
|
|
|
|
Var
|
|
strUserName, Password : String;
|
|
sEntry : PPasswordFileEntry;
|
|
pEntry : PPasswd;
|
|
|
|
Const
|
|
Err_NoErr = 0;
|
|
Err_NoUser = 1;
|
|
Err_WrongPass = 2;
|
|
NoUser = '*NO USER*';
|
|
|
|
Function UserEncPass(User: String): String;
|
|
Var
|
|
A : Array[0..255] of char;
|
|
Begin
|
|
A := strUserName;
|
|
{$IFDEF DEBUG}
|
|
Writeln('User name is ',A);
|
|
{$ENDIF}
|
|
sEntry := getspnam(A);
|
|
If sEntry = nil then
|
|
Begin
|
|
{$IFDEF DEBUG}
|
|
Writeln('No shadow entry');
|
|
{$ENDIF}
|
|
pEntry := fpgetpwnam(A);
|
|
If pEntry = nil then
|
|
Begin
|
|
{$IFDEF DEBUG}
|
|
Writeln('No passwd entry');
|
|
{$ENDIF}
|
|
UserEncPass := NoUser
|
|
End
|
|
End;
|
|
if sEntry <> nil then UserEncPass := sEntry^.sp_pwdp;
|
|
if pEntry <> nil then UserEncPass := pEntry^.pw_passwd
|
|
End;
|
|
|
|
Function CheckPass(User, Pass: String): Integer;
|
|
Var
|
|
EncPass, ResultPass, SSalt : String;
|
|
PCPass, PCSalt, PCResult : Array[0..255] of Char;
|
|
I : Integer;
|
|
Begin
|
|
EncPass := UserEncPass(User);
|
|
{$IFDEF DEBUG}
|
|
Writeln('Encrypted PW is : ',EncPass);
|
|
{$ENDIF}
|
|
If EncPass = NoUser then
|
|
Begin
|
|
CheckPass := Err_NoUser;
|
|
{$IFDEF DEBUG}
|
|
Writeln('No user named ',User,'.');
|
|
{$ENDIF}
|
|
Exit
|
|
End;
|
|
PCPass := Pass;
|
|
If Copy(EncPass,1,3) = '$1$' then
|
|
Begin
|
|
I := 4;
|
|
SSalt := '$1$';
|
|
Repeat
|
|
SSalt := SSalt + EncPass[I];
|
|
Inc(I)
|
|
Until EncPass[I] = '$';
|
|
PCSalt := SSalt
|
|
End
|
|
else
|
|
PCSalt := Copy(EncPass,1,2);
|
|
{$IFDEF DEBUG}
|
|
Writeln('Salt is : ',PCSalt);
|
|
{$ENDIF}
|
|
PCResult := crypt(PCPass, PCSalt);
|
|
ResultPass := PCResult;
|
|
{$IFDEF DEBUG}
|
|
Writeln('From passwd/shadow : ',EncPass);
|
|
Writeln('From crypt : ',ResultPass);
|
|
{$ENDIF}
|
|
If ResultPass = EncPass then
|
|
CheckPass := Err_NoErr
|
|
else
|
|
CheckPass := Err_WrongPass
|
|
End;
|
|
|
|
Begin
|
|
Write('User name : ');
|
|
Readln(strUserName);
|
|
Write('Password : ');
|
|
Readln(Password);
|
|
If CheckPass(strUserName, Password) = Err_NoErr then
|
|
Writeln('User authentication succeeded')
|
|
else
|
|
Writeln('User autentication failed.');
|
|
End.
|