#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "pop.h" #include "passwd.h" char peer[TEXTLEN]; dboxpopt::dboxpopt() { transfer=FALSE; protocol="unknown"; timeout_minutes=10; } bool dboxpopt::getcommand() { char *tptr; char line[1000]; alarm(timeout_minutes*60); fflush(stdout); if(fgets(line, 900, stdin)==NULL) return TRUE; alarm(0); tptr=strchr(line, '\r'); if(tptr!=NULL) *tptr=0; tptr=strchr(line, '\n'); if(tptr!=NULL) *tptr=0; commandline=line; return FALSE; } bool dboxpopt::login(const std::string &password) { up.setfilename(); if(check_unix_passwd(up.name, password.c_str(), uid, protocol.c_str())) { logf.printf("login", "invalid login: \"%s\"", up.name); return TRUE; } logf.printf("login", "successfull login of %s", up.name); std::string path; getboxuserdir(path, config.boxdir, up.name); path+="."; if(access(path.c_str(), 00)!=0) { up.setfilename(); makepath(up.getpath()); if(!up.lock()) { up.write(); up.unlock(); } getboxusermaildir(path, config.boxdir, up.name, ""); makepath(path.c_str()); std::string foldername="0@"; foldername+=up.name; fp.setname(foldername); fp.setfilename(); makepath(fp.getpath()); if(!fp.lock()) { fp.write(); fp.unlock(); } } transfer=TRUE; return FALSE; } void getpeer() { std::string peer_string; getpeer(peer_string); strmaxcpy(peer, peer_string.c_str(), TEXTLEN-1); } static void append(const std::string &message, userpt &up, const std::string &from) { rfcmessaget rfcm; dword nr; rfcm.data=message.c_str(); rfcm.endoffile=rfcm.data+message.size(); rfcm.endofmail=rfcm.endoffile; if(rfcm.parse() || rfcm.headerlen==0) { } else { std::string subject; rfcm.findsingleheader(subject, "Subject"); if(subject!="DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA") { std::string to; rfcm.findsingleheader(to, "X-POP3-Rcpt"); deliver_mail(rfcm, up, to, from); } } } void dboxpopt::movemail() { std::string mailbox_file, tmp_file; char pid[TEXTLEN]; snprintf(pid, TEXTLEN, "%d", getpid()); mailbox_file=GLOBALMAILDIR; mailbox_file+=up.name; if(filelength(mailbox_file.c_str())==0) return; if(lock("dkimap", "movemail", config.boxname, "movemail")) return; getdboxtempdir(tmp_file, config.dboxdir); tmp_file+="movemail."; tmp_file+=pid; unlink(tmp_file.c_str()); pid_t child_pid=fork(); switch(child_pid) { case -1: logf.printf("movemail", "fork() failed"); break; case 0: //setreuid(uid, -1); // fall back to users uid execl(MOVEMAIL, "movemail", mailbox_file.c_str(), tmp_file.c_str(), NULL); logf.printf("movemail", "failed to execl %s", MOVEMAIL); exit(1); default: int status; waitpid(child_pid, &status, 0); } std::ifstream in(tmp_file.c_str(), std::ios::in|std::ios::binary); if(in) { char line[10000], ch; std::string message, from; while(!(in.eof() || in.fail())) { if(in.get(line, 9000)) { in.get(ch); // \n lesen if(strncmp(line, "From ", 5)==0) { if(!message.empty()) { append(message, up, from); message=""; from=""; } const char *tptr=line+5; while(*tptr!=0 && *tptr!=' ' && *tptr!='\t' && *tptr!='\r' && *tptr!='\n') from+=*(tptr++); } else { message+=line; if(strchr(line, '\r')==NULL) message+='\r'; message+='\n'; } } } if(!message.empty()) append(message, up, from); } else { cout << "ERROR: movemail failed 1\n"; } unlink(tmp_file.c_str()); unlock("dkimap", "movemail", config.boxname); }