#!/usr/bin/perl open (TEMPLATE, $ARGV[0]) or die "Cannot open '".$ARGV[0]."': $!"; my $template = join "", <TEMPLATE>; open (FILE, $ARGV[1]) or die "Cannot open '".$ARGV[1]."': $!"; my $file = join "", <FILE>; my $today = int(time()/(24*3600)); $template =~ s/\@TODAY\@/$today/g; my $tmp = $template; while ($tmp =~ m/^(.*?)([^\n]*):\@PASS_DES ([^:]*)\@:(.*)$/s) { my $user = $2; my $pass = $3; $tmp = $4; if ($file =~ m/^$user:/m) { $file =~ s/^$user:([^:]*):(.*)$/$user:\@PASS_DES $pass\@:$2/m; my $cryptpass = $1; # Check the password my $checkpass = qx|/usr/bin/openssl passwd -crypt -salt '$cryptpass' $pass 2>tmp/openssl.err|; chomp $checkpass; system "cat tmp/openssl.err" if ($checkpass ne $cryptpass); system "rm -f tmp/openssl.err"; die "Wrong password for $user: '$cryptpass'. Expected password: '$checkpass'\n" if ($checkpass ne $cryptpass); } else { die "No user '$user' in ".$ARGV[1].".\n"; } } $tmp = $template; while ($tmp =~ m/^(.*?)([^\n]*):\@PASS_MD5 ([^:]*)\@:(.*)$/s) { my $user = $2; my $pass = $3; $tmp = $4; if ($file =~ m/^$user:/m) { $file =~ s/^$user:([^:]*):(.*)$/$user:\@PASS_MD5 $pass\@:$2/m; my $cryptpass = $1; # Check the password my $salt = $cryptpass; $salt =~ s/^\$1\$//; $salt =~ s/\$.*$//; my $checkpass = qx|/usr/bin/openssl passwd -1 -salt '$salt' '$pass'|; chomp $checkpass; die "Wrong password for $user: '$cryptpass'. Expected password: '$checkpass'\n" if ($checkpass ne $cryptpass); } else { die "No user '$user' in ".$ARGV[1].".\n"; } } $tmp = $template; while ($tmp =~ m/^(.*?)([^\n]*):\@PASS_SHA256 ([^:]*)\@:(.*)$/s) { my $user = $2; my $pass = $3; $tmp = $4; if ($file =~ m/^$user:/m) { $file =~ s/^$user:([^:]*):(.*)$/$user:\@PASS_SHA256 $pass\@:$2/m; my $cryptpass = $1; # Check the password my $salt = $cryptpass; $salt =~ s/^\$5\$//; my $rounds = ""; if ($salt =~ s/^rounds=([0-9]*)\$//) { $rounds = "-R $1"; } $salt =~ s/\$.*$//; my $checkpass = qx!echo '$pass' | /usr/bin/mkpasswd -m sha-256 --salt '$salt' $rounds --stdin!; chomp $checkpass; die "Wrong password for $user: '$cryptpass'. Expected password: '$checkpass'\n" if ($checkpass ne $cryptpass); } else { die "No user '$user' in ".$ARGV[1].".\n"; } } $tmp = $template; while ($tmp =~ m/^(.*?)([^\n]*):\@PASS_SHA512 ([^:]*)\@:(.*)$/s) { my $user = $2; my $pass = $3; $tmp = $4; if ($file =~ m/^$user:/m) { $file =~ s/^$user:([^:]*):(.*)$/$user:\@PASS_SHA512 $pass\@:$2/m; my $cryptpass = $1; # Check the password my $salt = $cryptpass; $salt =~ s/^\$6\$//; my $rounds = ""; if ($salt =~ s/^rounds=([0-9]*)\$//) { $rounds = "-R $1"; } $salt =~ s/\$.*$//; my $checkpass = qx!echo '$pass' | /usr/bin/mkpasswd -m sha-512 --salt '$salt' $rounds --stdin!; chomp $checkpass; die "Wrong password for $user: '$cryptpass'. Expected password: '$checkpass'\n" if ($checkpass ne $cryptpass); } else { die "No user '$user' in ".$ARGV[1].".\n"; } } exit 0 if ($file =~ m/^\Q$template\E$/s); print "Files differ.\n"; system "diff", "-au", $ARGV[0], $ARGV[1]; exit 1