The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

pop3d на awk (pop3 awk)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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 <[email protected]> > From: Serg Oskin <[email protected]> > 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)

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру