support IMAP select and LOGOUT

This commit is contained in:
Daniel Stenberg 2009-12-19 23:23:26 +00:00
Родитель 344bbcf259
Коммит af7a5b297f
1 изменённых файлов: 58 добавлений и 26 удалений

Просмотреть файл

@ -348,18 +348,18 @@ if($proto eq "ftp") {
'PROT' => '500 PROT not implemented',
);
%commandfunc = ( 'PORT' => \&PORT_command,
'EPRT' => \&PORT_command,
'LIST' => \&LIST_command,
'NLST' => \&NLST_command,
'PASV' => \&PASV_command,
'EPSV' => \&PASV_command,
'RETR' => \&RETR_command,
'SIZE' => \&SIZE_command,
'REST' => \&REST_command,
'STOR' => \&STOR_command,
'APPE' => \&STOR_command, # append looks like upload
'MDTM' => \&MDTM_command,
%commandfunc = ( 'PORT' => \&PORT_ftp,
'EPRT' => \&PORT_ftp,
'LIST' => \&LIST_ftp,
'NLST' => \&NLST_ftp,
'PASV' => \&PASV_ftp,
'EPSV' => \&PASV_ftp,
'RETR' => \&RETR_ftp,
'SIZE' => \&SIZE_ftp,
'REST' => \&REST_ftp,
'STOR' => \&STOR_ftp,
'APPE' => \&STOR_ftp, # append looks like upload
'MDTM' => \&MDTM_ftp,
);
}
elsif($proto eq "pop3") {
@ -374,10 +374,12 @@ elsif($proto eq "pop3") {
}
elsif($proto eq "imap") {
%commandfunc = ('FETCH' => \&FETCH_imap,
'SELECT' => \&SELECT_imap,
);
%displaytext = ('LOGIN' => ' OK We are happy you popped in!',
'SELECT' => ' OK selection done',
'LOGOUT' => ' OK thanks for the fish',
);
}
@ -407,9 +409,33 @@ sub close_dataconn {
################ IMAP commands
################
# global to allow the command functions to read it
my $cmdid;
# what was picked by SELECT
my $selected;
sub SELECT_imap {
my ($testno) = @_;
my @data;
my $size;
logmsg "SELECT_imap got test $testno\n";
$selected = $testno;
return 0;
}
sub FETCH_imap {
my ($testno) = @_;
my @data;
my $size;
logmsg "FETCH_imap got test $testno\n";
$testno = $selected;
if($testno =~ /^verifiedserver$/) {
# this is the secret command that verifies that this actually is
@ -437,11 +463,17 @@ sub FETCH_imap {
@data = getpart("reply", "data$testpart");
}
sendcontrol "- OK Mail transfer starts\r\n";
for (@data) {
$size += length($_);
}
sendcontrol "* FETCH starts {$size}\r\n";
for my $d (@data) {
sendcontrol $d;
}
sendcontrol "$cmdid OK FETCH completed\r\n";
return 0;
}
@ -496,12 +528,12 @@ sub RETR_pop3 {
################ FTP commands
################
my $rest=0;
sub REST_command {
sub REST_ftp {
$rest = $_[0];
logmsg "Set REST position to $rest\n"
}
sub LIST_command {
sub LIST_ftp {
# print "150 ASCII data connection for /bin/ls (193.15.23.1,59196) (0 bytes)\r\n";
# this is a built-in fake-dir ;-)
@ -526,7 +558,7 @@ my @ftpdir=("total 20\r\n",
return 0;
}
sub NLST_command {
sub NLST_ftp {
my @ftpdir=("file", "with space", "fake", "..", " ..", "funny", "README");
logmsg "pass NLST data on data connection\n";
for(@ftpdir) {
@ -537,7 +569,7 @@ sub NLST_command {
return 0;
}
sub MDTM_command {
sub MDTM_ftp {
my $testno = $_[0];
my $testpart = "";
if ($testno > 10000) {
@ -564,7 +596,7 @@ sub MDTM_command {
return 0;
}
sub SIZE_command {
sub SIZE_ftp {
my $testno = $_[0];
my $testpart = "";
if ($testno > 10000) {
@ -609,7 +641,7 @@ sub SIZE_command {
return 0;
}
sub RETR_command {
sub RETR_ftp {
my ($testno) = @_;
if($testno =~ /^verifiedserver$/) {
@ -686,7 +718,7 @@ sub RETR_command {
return 0;
}
sub STOR_command {
sub STOR_ftp {
my $testno=$_[0];
my $filename = "log/upload.$testno";
@ -737,7 +769,7 @@ sub STOR_command {
return 0;
}
sub PASV_command {
sub PASV_ftp {
my ($arg, $cmd)=@_;
my $pasvport;
my $pidf=".sockdata$ftpdnum$ext.pid";
@ -843,7 +875,7 @@ sub PASV_command {
# Support both PORT and EPRT here. Consider LPRT too.
sub PORT_command {
sub PORT_ftp {
my ($arg, $cmd) = @_;
my $port;
my $addr;
@ -1055,17 +1087,17 @@ while(1) {
# Remove trailing CRLF.
s/[\n\r]+$//;
my $cmdid;
my $FTPCMD;
my $FTPARG;
my $full=$_;
if($proto eq "imap") {
# IMAP is different with its identifier first on the command line
unless (m/^([^ ]+) ([^ ]+) (.*)/i) {
sendcontrol "500 '$_': command not understood.\r\n";
unless (m/^([^ ]+) ([^ ]+) (.*)/ ||
m/^([^ ]+) ([^ ]+)/) {
sendcontrol "$1 '$_': command not understood.\r\n";
last;
}
$cmdid=$1;
$cmdid=$1; # set the global variable
$FTPCMD=$2;
$FTPARG=$3;
}