fpc/packages/users/examples/testpass.pp
2008-02-02 19:26:40 +00:00

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.