#include #include #include #include #include #include #include #include #include "imap.h" static int vimap_auth( IMAP_INFO &info, IMAP_STUFF &data, const char *default_domain, const char *user, const char *password) { IMAP_STUFF *data; IMAP_INFO *info; const char *pass; bool found; bool locked; glocal.data = &data; glocal.info = &info; glocal.pass = password; glocal.found = false; glocal.locked = false; const char *pt = strchr(user,'@'); if (pt == NULL) pt = strchr(user,'#'); if (pt == NULL) pt = strchr(user,'/'); if (pt != NULL){ info.user.setfrom (user,(int)(pt-user)); info.domain.setfrom (pt+1); }else{ info.user.setfrom (user); info.domain.setfrom (default_domain); } info.pass.setfrom (password); ("select domainid from domains where domain='%s'" ,info.domain.get()); syslog (LOG_ERR,"Unknown domain %s -> %s",glocal.info->user.get() ,glocal.info->domain.get()); glocal.data->domainid = atoi(row[0]); ("select userid,mayretrieve,password from accounts" " where domainid=%s and name='%s'" ,row[0],glocal.info->user.get()); if (strcmp(row[2],crypt(glocal.pass,row[2]))==0){ glocal.data->userid = atoi(row[0]); glocal.found = true; if (row[1][0] == 'Y'){ glocal.data->userid = atoi(row[0]); sql_action ("update accounts set lastaccess=now() where userid=%s" ,row[0]); }else{ glocal.locked = true; } } if (!glocal.found || glocal.locked){ return -1; } syslog (LOG_NOTICE,"Auth ok:domainid='%d',name='%s'",data.domainid ,info.user.get()); return 0; } int main (int argc, char *argv[]) { const char *port; int timeout; const char *dbserv; const char *db; const char *dbuser; const char *dbpass; const char *default_domain; FILE *logcmd; glocal.default_domain = NULL; glocal.port = "imap"; glocal.timeout = 30*60; glocal.db = "mailsql"; glocal.dbserv = "localhost"; glocal.dbuser = NULL; glocal.dbpass = NULL; glocal.logcmd = NULL; static const char *tbdic[]={"tlmpsql",NULL}; int ret = (argc,argv,tbdic); extern const char *version; fprintf (stderr,"vimap_sql version %s\n",version); int ret = -1; if (strcmp(opt,"--port")==0){ ret = 1; glocal.port = val; }else if (strcmp(opt,"--timeout")==0){ ret = 1; glocal.timeout = atoi(val); }else if (strcmp(opt,"--db")==0){ ret = 1; glocal.db = val; }else if (strcmp(opt,"--dbuser")==0){ ret = 1; glocal.dbuser = val; }else if (strcmp(opt,"--dbserv")==0){ ret = 1; glocal.dbserv = val; }else if (strcmp(opt,"--dbpass")==0){ ret = 1; glocal.dbpass = val; }else if (strcmp(opt,"--default_domain")==0){ ret = 1; glocal.default_domain = val; }else if (strcmp(opt,"--logcmd")==0){ ret = 1; glocal.logcmd = fopen (val,"a"); if (glocal.logcmd == NULL){ syslog (LOG_ERR,"Can't open log command file %s (%m)",val); }else{ syslog (LOG_INFO,"Opening log command file %s",val); } } return ret; query_setdefaultdb (glocal.dbserv,glocal.db,glocal.dbuser ,glocal.dbpass); (); return vimap_auth (info,data,glocal.default_domain,user,password) != -1; IMAP_STATUS *rep; time_t sessiontime; int folderid; glocal.folderid = -1; ("select folderid from folders" " where userid=%d and foldername='%s'" ,data.userid,info.folder.get()); glocal.folderid = atoi(row[0]); data.folderid = glocal.folderid; rep.uid = glocal.folderid; rep.flags = 0; rep.exists = 0; rep.recent = 0; glocal.rep = &rep; glocal.sessiontime = info.sessiontime; ("select deleted,UNIX_TIMESTAMP(daterec) from messages" " where userid=%d and domainid=%d and folderid=%d" ,data.userid,data.domainid,data.folderid); glocal.rep->exists++; if (atoi(row[1]) > glocal.sessiontime) glocal.rep->recent++; // if (row[0][0] == 'Y') return -1; return -1; return -1; long used; glocal.used = 0; ("select length(message) from messages" " where userid=%d and domainid=%d and folderid=%d and deleted='Y'" ,data.userid,data.domainid,data.folderid); glocal.used += atoi(row[0]); sql_action ("delete from messages" " where userid=%d and domainid=%d and folderid=%d and deleted='Y'" ,data.userid,data.domainid,data.folderid); sql_action ("update accounts set used=used-%ld where userid=%d" ,glocal.used,data.userid); return 0; int nbline; int no; glocal.nbline = 10; glocal.no = msgid; ("select header,message,deleted from messages" " where userid=%d and folderid=%d and domainid=%d" " order by daterec limit %d,1" ,data.userid,data.folderid,data.domainid,msgid-1); if (row[2][0] == 'Y'){ glocal.IMAP.sendf ("* BAD message %d has been marked for deletion\r\n" ,glocal.no); }else{ // fprintf (glocal.fout,"+OK message %d (%d octets):\r\n" // ,glocal.no,strlen(row[0])+strlen(row[1])); glocal.IMAP.sendf (row[0]); if (glocal.nbline == -1){ glocal.IMAP.sendf (row[1]); }else{ const char *msg = row[1]; while (*msg != '\0' && glocal.nbline > 0){ const char *start = msg; while (*msg != '\0' && *msg != '\n') msg++; if (msg > start){ int len = (int)(msg-start); glocal.IMAP.sendf ("* FETCH %*.*s\r\n" ,len,len,start); } if (*msg == '\n'){ glocal.nbline--; msg++; } } } // fputs (".\r\n",glocal.fout); } glocal.IMAP.sendf ("* BAD invalid message; number out of range\r\n"); SSTRINGS *tb; glocal.tb = &tb; ("select foldername from folders where userid=%d" ,data.userid); glocal.tb->add (new SSTRING(row[0])); IMAP *imap; glocal.imap = &imap; (glocal.port,glocal.timeout); glocal.imap->newclient (no); glocal.imap->endclient (no); if (glocal.logcmd != NULL){ fprintf (glocal.logcmd,"%d: %s\n",no,line); fflush (glocal.logcmd); } if (glocal.imap->oneline(no,line)==-1) endclient = true; tcp.loop(); return 0; return ret; }