/
mavis_ftp_passwd.pl
executable file
·72 lines (61 loc) · 1.5 KB
/
mavis_ftp_passwd.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/env perl
# mavis_ftp_passwd.pl
# (C)2001-2006 Marc Huber <Marc.Huber@web.de>
# All rights reserved.
#
# Sample script for testing libmavis_external.so.
#
# This script performs password authentication for FTP requests,
# based on information returned by getpwnam().
#
use strict;
use lib '/usr/local/lib/mavis';
use Mavis;
$| = 1;
my ($in);
$/ = "\n=\n";
while ($in = <>) {
my ($a);
my (@V);
my (@pwent);
my ($result);
@V = ();
@pwent = undef;
$result = MAVIS_DEFERRED;
chomp $in;
foreach $a (split (/\n/, $in)) {
next unless $a =~ /^(\d+) (.*)$/;
$V[$1] = $2;
}
if (defined $V[AV_A_TYPE] && $V[AV_A_TYPE] ne AV_V_TYPE_FTP) {
$result = MAVIS_DOWN;
}
elsif (!defined $V[AV_A_USER] || !defined $V[AV_A_PASSWORD]) {
$V[AV_A_COMMENT] = "AV_A_USER or AV_A_PASSWORD not set";
$V[AV_A_RESULT] = AV_V_RESULT_ERROR;
$result = MAVIS_FINAL;
}
elsif (!(@pwent = getpwnam ($V[AV_A_USER]))) {
$V[AV_A_COMMENT] = "getpwnam failed";
$result = MAVIS_DOWN;
} else {
if ($pwent[1] ne crypt ($V[AV_A_PASSWORD], $pwent[1])) {
$V[AV_A_COMMENT] = "password mismatch";
$V[AV_A_RESULT] = AV_V_RESULT_FAIL;
$result = MAVIS_FINAL;
} else {
$V[AV_A_UID] = $pwent[2];
$V[AV_A_GID] = $pwent[3];
$V[AV_A_HOME] = $pwent[7];
$V[AV_A_ROOT] = "/";
$V[AV_A_DBPASSWORD] = $V[AV_A_PASSWORD];
$result = MAVIS_FINAL;
}
}
my ($out) = "";
for (my $i = 0; $i <= $#V; $i++) {
$out .= sprintf ("%d %s\n", $i, $V[$i]) if defined $V[$i];
}
$out .= sprintf ("=%d\n", $result);
print $out;
}