pop3d на awk (pop3 awk)
Ключевые слова: pop3, awk, (найти похожие документы)
- RU.UNIX (2:5077/15.22) -------------------------------------------- RU.UNIX -
From : Valentin Davydov 2:5020/400 28 Nov 00 13:35:30
Subj : pop3d на awk
-------------------------------------------------------------------------------
From: Valentin Davydov <val@trc-net.co.jp>
> From: Serg Oskin <Serg.Oskin@f20.n5020.z2.fidonet.org>
> Date: Tue, 28 Nov 2000 11:44:04 +0300
>
>Посоветуйте pls. приличный pop3 и/или imap сервер, умеющий раздавать почту
>виртуальным(?) юзерам, т.е. тем, которых нет в /etc/passwd.
>Free или для некоммерческого использования.
Вот, надысь налабал поппер. Юзерская почта хранится в директориях
/maildrop/user, которые не должны быть доступны никому, кроме мэйлера
и поппера, отдельными файлами с именем, равным md5 от содержимого.
Там же лежит и файл .passwd с паролём. Запускается это дело из inetdа,
под pop/mail, с перенаправлением stderr в лог. Штука очень сырая,
пару багов видно сходу, но зато нет багов, свойственных другим попперам.
Вылизывать лень, пойду лучше ещё мэйлер напишу ;-)
#!/usr/bin/awk -f
BEGIN{IGNORECASE=1;FS="[[:space:]]+";ORS="\r\n";state="A"
getline < "/proc/curproc/status";
close("/proc/curproc/status");
gsub (",","."); x="<" $2 "." $8 "@";
"hostname" | getline; close("hostname");
x=x $1 ">"
print "+OK POP3", x;fflush()};
/^QUIT/{if(state=="T")state="U";exit};
/^APOP /&&state=="A"{us=$2; user="/maildrop/" us;
if(system("cd " user))
{print "-ERR Unknown user"}
else
{getline i < (user "/.passwd"); close(user "/.passwd")
"echo '" x i "'|md5" | getline hash; close("echo '" x i "|'md5")
if(hash==substr($3,1,32)){v=0;n=0;
while(x="ls -ltr " user|getline)
{if(NF-2){v+=$5;n+=1;mbox[n]=$9;sz[n]=$5;st[n]="N"}}
close("ls -ltr " user)
print "+OK " user " locked";
state="T"}
else{print "-ERR Invalid password"; state="A"}}
fflush();next}
/^USER /&&state=="A"{us=$2; user="/maildrop/" us;
if(system("cd " user))
{print "-ERR Unknown user"}
else
{print "+OK Please supply PASS for " user;
state="AU"};
fflush();next};
/^PASS /&&state=="AU"{"echo " us " " substr($0,6,length-6) "|md5" | getline
hash
close("echo " us " " $2 "|md5")
getline < (user "/.passwd")
close(user "/.passwd")
if(hash==$0){v=0;n=0;
while(x="ls -ltr " user|getline)
{if(NF-2){v+=$5;n+=1;mbox[n]=$9;sz[n]=$5;st[n]="N"}}
close("ls -ltr " user)
print "+OK " user " locked";
state="T"}
else{print "-ERR Invalid PASS"; state="A"}
fflush();next}
/^STAT/&&state=="T"{print "+OK",n,v;
fflush();next}
/^LIST/&&state=="T"{if(length($2)==0)
{print "+OK Listing follows";
for(i in mbox)
{if(st[i]~/N|R/)print i,sz[i]};
print "."}
else
{if(st[$2]~/N|R/){print "+OK",$2,sz[$2]}
else{print "-ERR No message",$2}}
fflush();next}
/^RETR /&&state=="T"{if(st[f=$2]~/N|R/){print "+OK Message",f,"follows"
while(x="tail +2 " user "/" mbox[f]|getline){
if(/^\./){$0="." $0};print}
print ".";fflush()
close("tail +2 " user "/" mbox[f])
st[f]="R"}
else{print "-ERR No message",f;fflush()}
next}
/^DELE /&&state=="T"{if(st[f=$2]~/N|R/){print "+OK Message",$2,"deleted"
fflush();st[$2]="D";n-=1;v-=sz[$2]}
else{print "-ERR No message", $2;fflush()}
next}
/^NOOP/&&state=="T"{print "+OK";fflush();next}
/^RSET/&&state=="T"{x=0;for(i in mbox){if(st[i]~/D/)
{st[i]="R";v+=sz[i];n+=1;x+=1}}
print "+OK", x, x-1?"messages":"message", "restored"
fflush();next}
/^TOP /&&state=="T"{if(st[f=$2]~/N|R/){if((i=$3+1)>1){}else i=0
print "+OK Header and possible", e=i-(i>0), e-1?"lines":"line", "of
body follows"
e=0
while(x="tail +2 " user "/" mbox[f]|getline){
if(/^\./){$0="." $0}
if(/^[[:space:]]*$/){e=1}
i-=e
if(i>=0) print; else break}
close("tail +2 " user "/" mbox[f])
print "."}
else{print "-ERR No message",f};fflush();next}
/^UIDL/&&state=="T"{if(length($2)==0)
{print "+OK Unique-id listing follows";
for(i in mbox)
{if(st[i]~/N|R/)print i,mbox[i]};
print "."}
else
{if(st[$2]~/N|R/){print "+OK",$2,mbox[$2]}
else{print "-ERR No message", $2}}
fflush();next}
{print "-ERR Command `" $1 "' not implemented or invalid";fflush()}
END{if(state=="U"){print "+OK Updating " user; fflush(); ORS="\n"
for(i in mbox){if(st[i]~/D/){print (user "/" mbox[i]) | "xargs rm"}}}}
#Вал. Дав.
--- ifmail v.2.15dev5
* Origin: St. Petersburg State University (2:5020/400)