/* Main server for the project. Hides database logic and controls security/access */ #include #include #include #include #include #include #include #include #include #include #include "fdpass.h" #include static DEBUG_KEY D_PROTO ("proto","Protocol information"); enum CONNECT_TYPE { TYPE_NONE, TYPE_CONTROL, TYPE_CLIENT, TYPE_ADMIN }; struct HANDLE_INFO: public ARRAY_OBJ{ CONNECT_TYPE type; int no; std::string host; REQUEST_INFO req; std::string userid; HANDLE_INFO(){ no = -1; type = TYPE_NONE; } }; #include "proto/trlid_control.protoh" #include "proto/trlid_client.protoh" #include "proto/trlid_admin.protoh" using namespace std; #include "proto/trli-writed_client.protoch" #define trli_sessiond_client_getsessioninfovars_NOTNEED #define trli_sessiond_client_setvar_NOTNEED #include "proto/trli-sessiond_client.protoch" static int trlid_main ( const char *bind, const char *portstr, const char *control, // Unix socket const CONNECT_INFO &con, const CONNECT_INFO &con_sess, const char *user, const char *pidfile, bool daemon, const map &admin_secrets, const map &client_secrets) { int ret = -1; glocal CONNECT_INFO con = con; glocal CONNECT_INFO con_sess = con_sess; glocal const map *admin_secrets = &admin_secrets; glocal const map *client_secrets = &client_secrets; glocal unsigned long nbrequest_client = 0; glocal unsigned long nbrequest_admin = 0; glocal string unixportclient = string_f("unix:/tmp/trlid-client-%s.sock",portstr); glocal string unixportadmin = string_f("unix:/tmp/trlid-admin-%s.sock",portstr); (bind,glocal.unixportclient,5); HANDLE_INFO *n = new HANDLE_INFO; info.data = n; if (strcmp(info.port,glocal.unixportclient.c_str())==0){ n->req.secret = fdpass_findsecret (*glocal.client_secrets,info.port); if (n->req.secret.size() > 0){ n->type = TYPE_CLIENT; }else{ tlmp_error ("Rejected client connexion from port %s\n",info.port); endclient = true; } }else if (strcmp(info.port,glocal.unixportadmin.c_str())==0){ n->req.secret = fdpass_findsecret (*glocal.admin_secrets,info.port); if (n->req.secret.size() > 0){ n->type = TYPE_ADMIN; }else{ tlmp_error ("Rejected admin connexion from port %s\n",info.port); endclient = true; } }else if (strncmp(info.port,"unix:",5)==0){ n->type = TYPE_CONTROL; }else{ settcpnodelay(true); char addr[20]; ipnum_ip2a (from,addr); n->host = addr; n->req.secret = fdpass_findsecret (*glocal.client_secrets,addr); if (n->req.secret.size() > 0){ n->type = TYPE_CLIENT; }else{ n->req.secret = fdpass_findsecret (*glocal.admin_secrets,addr); if (n->req.secret.size() > 0){ n->type = TYPE_ADMIN; }else{ tlmp_error ("Rejected connexion from IP %s\n",addr); endclient = true; } } } HANDLE_INFO *c = (HANDLE_INFO*)info.data; glocal HANDLE_INFO *c = c; glocal string userid = c->userid; debug_printf (D_PROTO,"receive line: %s\n",line); if (c->type == TYPE_CONTROL){ (this,c->req,line,info.linelen, endserver, endclient, no,c,c->host.c_str()); vector tb; tb.push_back(string_f("Version %s",VERSION)); tb.push_back(string_f ("nbrequest_admin=%lu",glocal.nbrequest_admin)); tb.push_back(string_f ("nbrequest_client=%lu",glocal.nbrequest_client)); rep_status(tb); endserver = true; if (on){ debug_seton(); }else{ debug_setoff(); } debug_setfdebug (filename); endclient = true; }else if (c->type == TYPE_CLIENT){ glocal.nbrequest_client++; (this,c->req,line, info.linelen,endserver, endclient,no,c,c->host.c_str()); (glocal.con); glocal.trlid_client.rep_createsession(sessionid); (glocal.con,sessionid,email,password); glocal.trlid_client.rep_login(success); (glocal.con,sessionid); (glocal.con,name,email,password); glocal.trlid_client.rep_adduser (confirmid,msg); (glocal.con,id); glocal.trlid_client.rep_confirmuser(success,msg); (glocal.con,sessionid); glocal.trlid_client.rep_deleteuser (email,confirmid); (glocal.con,confirmid); glocal.trlid_client.rep_confirmdelete(success,msg); (glocal.con,sessionid,url,title,text); glocal.trlid_client.rep_addnews (success,newsid,msg); glocal bool success = false; glocal string newsid; ("select newsid_str from news where url='%s'",url); glocal.success = true; glocal.newsid = row[0]; rep_validnews(glocal.success,glocal.newsid); (glocal.con,sessionid,newsid,valid,type,title,text); glocal.trlid_client.rep_addproof (success,proofid,msg); (glocal.con,sessionid,proofid,vote,text); glocal.trlid_client.rep_addcomment (success,commentid,msg); (glocal.con,sessionid,blogid,content); glocal.trlid_client.rep_addblogcomment (success,msg); // sessionid newsid replyto title content = success:b msg (glocal.con,sessionid,newsid,replyto,title,content); glocal.trlid_client.rep_addargument(success,msg,argid); // sessionid newsid url content = success:b msg (glocal.con,sessionid,newsid,url,content); glocal.trlid_client.rep_addnewsurl(success,msg); // listarguments newsid offset:u nb:u = argids:v nicknames:v replytos:v titles:v contents:v submits:v levels:vu glocal vector argids; glocal vector nicknames; glocal vector replytos; glocal vector titles; glocal vector contents; glocal vector submits; glocal vector levels; ("select argid_str,id2name.name" ",(select t1.argid_str from arguments t1 where t1.argid=arguments.replyto) as replyto" ",arguments.title,arguments.content,arguments.created,arguments.level from news" " join arguments on news.newsid=arguments.newsid" " join id2name on arguments.userid = id2name.userid" " where newsid_str='%s' order by pres_order limit %u,%u",newsid,offset,nb); glocal.argids.push_back(row[0]); glocal.nicknames.push_back(row[1]); glocal.replytos.push_back(row[2]==NULL ? "" : row[2]); glocal.titles.push_back(row[3]); glocal.contents.push_back(row[4]); glocal.submits.push_back(row[5]); glocal.levels.push_back(atoi(row[6])); rep_listarguments(glocal.argids,glocal.nicknames,glocal.replytos,glocal.titles,glocal.contents,glocal.submits,glocal.levels); // argid = success:b nickname replyto title content submit level:u ("select id2name.name" ",(select t1.argid_str from arguments t1 where t1.argid=arguments.replyto) as replyto" ",arguments.title,arguments.content,arguments.created,arguments.level from arguments" " join id2name on arguments.userid = id2name.userid" " where argid_str='%s'",argid); glocal.trlid_client.rep_getargument(true,row[0],row[1]==NULL ? "" : row[1],row[2],row[3],row[4],atoi(row[5])); glocal.trlid_client.rep_getargument(false,"","","","","",0); glocal vector nicknames; glocal vector newsids; glocal vector titles; glocal vector urls; glocal vector contents; glocal vector submits; glocal vector nbproofs; glocal vector nbcomments; glocal vector verdicts; if (nb > 20) nb = 20; ("select newsid_str,title,url,content,approved,name,nbproofs,nbcomments,verdict from news join id2name on news.userid=id2name.userid" " where approved is not null order by approved desc,newsid desc limit %d,%d",offset,nb); glocal.newsids.push_back(row[0]); glocal.titles.push_back(row[1]); glocal.urls.push_back(row[2]); glocal.contents.push_back(row[3]); glocal.submits.push_back(row[4]); glocal.nicknames.push_back(row[5]); glocal.nbproofs.push_back(atoi(row[6])); glocal.nbcomments.push_back(atoi(row[7])); glocal.verdicts.push_back(atoi(row[8])); rep_listnews(glocal.nicknames,glocal.newsids,glocal.titles,glocal.urls,glocal.contents,glocal.submits ,glocal.nbproofs,glocal.nbcomments,glocal.verdicts); glocal vector nicknames; glocal vector newsids; glocal vector titles; glocal vector urls; glocal vector contents; glocal vector submits; glocal vector nbproofs; glocal vector nbcomments; glocal vector verdicts; if (nb > 20) nb = 20; string joinsub; if (subject != 0){ joinsub = string_f (" join subnews on subnews.newsid=news.newsid and subnews.subjectid=%u",subject); } ("select newsid_str,title,url,content,approved,name,nbproofs,nbcomments,verdict" " from news join id2name on news.userid=id2name.userid" "%s" " where approved is not null order by approved desc,news.newsid desc limit %d,%d",joinsub.c_str(),offset,nb); glocal.newsids.push_back(row[0]); glocal.titles.push_back(row[1]); glocal.urls.push_back(row[2]); glocal.contents.push_back(row[3]); glocal.submits.push_back(row[4]); glocal.nicknames.push_back(row[5]); glocal.nbproofs.push_back(atoi(row[6])); glocal.nbcomments.push_back(atoi(row[7])); glocal.verdicts.push_back(atoi(row[8])); rep_listnews_v1(glocal.nicknames,glocal.newsids,glocal.titles,glocal.urls,glocal.contents,glocal.submits ,glocal.nbproofs,glocal.nbcomments,glocal.verdicts); glocal vector nicknames; glocal vector newsids; glocal vector titles; glocal vector urls; glocal vector contents; glocal vector submits; glocal vector nbproofs; glocal vector nbcomments; glocal vector verdicts; glocal vector nbarguments; if (nb > 20) nb = 20; string joinsub; if (subject != 0){ joinsub = string_f (" join subnews on subnews.newsid=news.newsid and subnews.subjectid=%u",subject); } ("select newsid_str,title,url,content,approved,name,nbproofs,nbcomments,verdict,nbarguments" " from news join id2name on news.userid=id2name.userid" "%s" " where approved is not null order by approved desc,news.newsid desc limit %d,%d",joinsub.c_str(),offset,nb); glocal.newsids.push_back(row[0]); glocal.titles.push_back(row[1]); glocal.urls.push_back(row[2]); glocal.contents.push_back(row[3]); glocal.submits.push_back(row[4]); glocal.nicknames.push_back(row[5]); glocal.nbproofs.push_back(atoi(row[6])); glocal.nbcomments.push_back(atoi(row[7])); glocal.verdicts.push_back(atoi(row[8])); glocal.nbarguments.push_back(atoi(row[9])); rep_listnews_v2(glocal.nicknames,glocal.newsids,glocal.titles,glocal.urls,glocal.contents,glocal.submits ,glocal.nbproofs,glocal.nbcomments,glocal.verdicts,glocal.nbarguments); glocal vector nicknames; glocal vector newsids; glocal vector titles; glocal vector urls; glocal vector contents; glocal vector submits; glocal vector nbproofs; glocal vector nbcomments; glocal vector verdicts; glocal vector nbarguments; glocal vector nbextraurls; if (nb > 20) nb = 20; string joinsub; if (subject != 0){ joinsub = string_f (" join subnews on subnews.newsid=news.newsid and subnews.subjectid=%u",subject); } ("select newsid_str,title,url,content,approved,name,nbproofs,nbcomments,verdict,nbarguments" ",(select count(*) from extraurls where extraurls.newsid=news.newsid and extraurls.approved is not null) as nbextraurls" " from news join id2name on news.userid=id2name.userid" "%s" " where approved is not null order by approved desc,news.newsid desc limit %d,%d",joinsub.c_str(),offset,nb); glocal.newsids.push_back(row[0]); glocal.titles.push_back(row[1]); glocal.urls.push_back(row[2]); glocal.contents.push_back(row[3]); glocal.submits.push_back(row[4]); glocal.nicknames.push_back(row[5]); glocal.nbproofs.push_back(atoi(row[6])); glocal.nbcomments.push_back(atoi(row[7])); glocal.verdicts.push_back(atoi(row[8])); glocal.nbarguments.push_back(atoi(row[9])); glocal.nbextraurls.push_back(atoi(row[10])); rep_listnews_v3(glocal.nicknames,glocal.newsids,glocal.titles,glocal.urls,glocal.contents,glocal.submits ,glocal.nbproofs,glocal.nbcomments,glocal.verdicts,glocal.nbarguments,glocal.nbextraurls); glocal vector nicknames; glocal vector newsids; glocal vector titles; glocal vector urls; glocal vector contents; glocal vector submits; glocal vector nbproofs; glocal vector nbcomments; glocal vector verdicts; glocal vector nbarguments; glocal vector nbextraurls; if (nb > 20) nb = 20; string joinsub; if (subject != 0){ joinsub = string_f (" join subnews on subnews.newsid=news.newsid and subnews.subjectid=%u",subject); } const char *order_field = order ? "approved" : "updated"; ("select newsid_str,title,url,content,approved,name,nbproofs,nbcomments,verdict,nbarguments" ",(select count(*) from extraurls where extraurls.newsid=news.newsid and extraurls.approved is not null) as nbextraurls" " from news join id2name on news.userid=id2name.userid" "%s" " where approved is not null order by %s desc,news.newsid desc limit %d,%d",joinsub.c_str(),order_field,offset,nb); glocal.newsids.push_back(row[0]); glocal.titles.push_back(row[1]); glocal.urls.push_back(row[2]); glocal.contents.push_back(row[3]); glocal.submits.push_back(row[4]); glocal.nicknames.push_back(row[5]); glocal.nbproofs.push_back(atoi(row[6])); glocal.nbcomments.push_back(atoi(row[7])); glocal.verdicts.push_back(atoi(row[8])); glocal.nbarguments.push_back(atoi(row[9])); glocal.nbextraurls.push_back(atoi(row[10])); rep_listnews_v3(glocal.nicknames,glocal.newsids,glocal.titles,glocal.urls,glocal.contents,glocal.submits ,glocal.nbproofs,glocal.nbcomments,glocal.verdicts,glocal.nbarguments,glocal.nbextraurls); glocal vector ids; glocal vector texts; ("select subjectid,text from subjects"); glocal.ids.push_back(atoi(row[0])); glocal.texts.push_back(row[1]); rep_listsubjects(glocal.ids,glocal.texts); ("select name,title,url,content,approved,nbproofs,nbcomments,verdict from news join id2name on news.userid=id2name.userid where newsid_str='%s'",newsid); glocal.trlid_client.rep_getnews(true,row[0],row[1],row[2],row[3],row[4],atoi(row[5]),atoi(row[6]),atoi(row[7])); glocal.trlid_client.rep_getnews(false,"","","","","",0,0,0); ("select name,title,url,content,approved,nbproofs,nbcomments,verdict,nbarguments from news join id2name on news.userid=id2name.userid where newsid_str='%s'",newsid); glocal.trlid_client.rep_getnews_v2(true,row[0],row[1],row[2],row[3],row[4],atoi(row[5]),atoi(row[6]),atoi(row[7]),atoi(row[8])); glocal.trlid_client.rep_getnews_v2(false,"","","","","",0,0,0,0); ("select name,title,url,content,approved,nbproofs,nbcomments,verdict,nbarguments" ",(select count(*) from extraurls where extraurls.newsid=news.newsid and extraurls.approved is not null) as nbextraurls" " from news join id2name on news.userid=id2name.userid where newsid_str='%s'",newsid); glocal.trlid_client.rep_getnews_v3(true,row[0],row[1],row[2],row[3],row[4],atoi(row[5]),atoi(row[6]),atoi(row[7]),atoi(row[8]),atoi(row[9])); glocal.trlid_client.rep_getnews_v3(false,"","","","","",0,0,0,0,0); ("select name,valid,type,title,content,created,nbcomments from proofs join id2name on proofs.userid=id2name.userid where proofid_str='%s'",proofid); glocal.trlid_client.rep_getproof(true,row[0],atoi(row[1]),atoi(row[2]),row[3],row[4],row[5],atoi(row[6])); glocal.trlid_client.rep_getproof(false,"",0,0,"","","",0); glocal const char *newsid = newsid; (glocal.con_sess,sessionid); debug_printf ("getsessioninfo success=%d userid=%u\n",success,userid); if (success){ ("select valid,type,proofs.title,proofs.content,proofs.created from proofs join news on proofs.newsid=news.newsid" " where proofs.userid=%u and newsid_str='%s'",userid,glocal.newsid); glocal.trlid_client.rep_getproofuser(true,atoi(row[0]),atoi(row[1]),row[2],row[3],row[4]); glocal.trlid_client.rep_getproofuser(false,0,0,"","",""); }else{ glocal.trlid_client.rep_getproofuser(false,0,0,"","",""); } ("select name,vote,content,created from comments join id2name on comments.userid=id2name.userid where commentid_str='%s'",commentid); glocal.trlid_client.rep_getcomment(true,row[0],atoi(row[1]),row[2],row[3]); glocal.trlid_client.rep_getcomment(false,"",0,"",""); glocal const char *proofid = proofid; (glocal.con_sess,sessionid); if (success){ ("select vote,comments.content,comments.created from comments join proofs on comments.proofid=proofs.proofid" " where comments.userid=%u and proofid_str='%s'",userid,glocal.proofid); glocal.trlid_client.rep_getcommentuser(true,atoi(row[0]),row[1],row[2]); glocal.trlid_client.rep_getcommentuser(false,0,"",""); }else{ glocal.trlid_client.rep_getcommentuser(false,0,"",""); } glocal vector nicknames; glocal vector proofids; glocal vector newsids; glocal vector titles; glocal vector contents; glocal vector submits; glocal vector valids; glocal vector types; glocal vector nbcomments; if (nb > 20) nb = 20; ("select name,proofid_str,newsid_str,proofs.title,proofs.content,proofs.created,valid,type,proofs.nbcomments" " from proofs join news on proofs.newsid=news.newsid" " join id2name on proofs.userid=id2name.userid" " where newsid_str='%s' and proofs.newsid=news.newsid limit %d,%d",newsid,offset,nb); glocal.nicknames.push_back(row[0]); glocal.proofids.push_back(row[1]); glocal.newsids.push_back(row[2]); glocal.titles.push_back(row[3]); glocal.contents.push_back(row[4]); glocal.submits.push_back(row[5]); glocal.valids.push_back(atoi(row[6])); glocal.types.push_back(atoi(row[7])); glocal.nbcomments.push_back(atoi(row[8])); rep_listproofs (glocal.nicknames,glocal.proofids,glocal.newsids,glocal.submits,glocal.valids,glocal.types,glocal.titles,glocal.contents,glocal.nbcomments); glocal vector nicknames; glocal vector commentids; glocal vector proofids; glocal vector votes; glocal vector contents; glocal vector submits; if (nb > 20) nb = 20; ("select name,commentid_str,proofid_str,comments.vote,comments.content,comments.created" " from comments join proofs on comments.proofid=proofs.proofid" " join id2name on id2name.userid=comments.userid" " where proofid_str='%s' limit %d,%d",proofid,offset,nb); glocal.nicknames.push_back(row[0]); glocal.commentids.push_back(row[1]); glocal.proofids.push_back(row[2]); glocal.votes.push_back(atoi(row[3])); glocal.contents.push_back(row[4]); glocal.submits.push_back(row[5]); rep_listcomments (glocal.nicknames,glocal.commentids,glocal.proofids,glocal.votes,glocal.contents,glocal.submits); // blogid = success:b title content submit ("select title,content,created" " from blog where blogid_str = '%s'",blogid); glocal.trlid_client.rep_getblog (true,row[0],row[1],row[2]); glocal.trlid_client.rep_getblog (false,"","",""); // sessionid blogid = success:b content submit glocal const char *blogid = blogid; (glocal.con_sess,sessionid); debug_printf ("getsessioninfo success=%d userid=%u\n",success,userid); if (success){ ("select blogcomments.content,blogcomments.created" " from blog join blogcomments on blog.blogid = blogcomments.blogid and blogcomments.userid=%u" " where blogid_str = '%s'",userid,glocal.blogid); glocal.trlid_client.rep_getblogcomment (true,row[0],row[1]); glocal.trlid_client.rep_getblogcomment (false,"",""); }else{ glocal.trlid_client.rep_getblogcomment (false,"",""); } // offset:u nb:u order:u = blogids:v titles:v contents:v submits:v nbcomments:uv const char *desc = order ? "" : "desc"; if (nb > 20) nb = 20; glocal vector blogids; glocal vector titles; glocal vector contents; glocal vector createds; glocal vector nbcomments; ("select blogid_str,title,content,created" ",(select count(*) from blogcomments where blogid=blog.blogid)" " from blog order by created %s limit %u,%u" ,desc,offset,nb); glocal.blogids.push_back(row[0]); glocal.titles.push_back(row[1]); glocal.contents.push_back(row[2]); glocal.createds.push_back(row[3]); glocal.nbcomments.push_back(atoi(row[4])); rep_listblogs (glocal.blogids,glocal.titles,glocal.contents,glocal.createds,glocal.nbcomments); // blogid offset:u nb:u = nicknames:v contents:v submits:v if (nb > 20) nb = 20; glocal vector nicknames; glocal vector contents; glocal vector submits; ("select id2name.name,blogcomments.content,blogcomments.created from blog" " join blogcomments on blog.blogid=blogcomments.blogid" " join id2name on blogcomments.userid=id2name.userid" " where blog.blogid_str='%s' limit %u,%u",blogid,offset,nb); glocal.nicknames.push_back(row[0]); glocal.contents.push_back(row[1]); glocal.submits.push_back(row[2]); rep_listblogcomments (glocal.nicknames,glocal.contents,glocal.submits); // offset:u nb:u = newsids:v urls:v subjects:vv nbproofs:vu nbcomments:vu nbarguments:vu vecdict:vi glocal vector newsids; glocal vector urls; glocal vector submits; glocal vector titles; glocal vector> subjects; glocal vector nbproofs; glocal vector nbcomments; glocal vector nbarguments; glocal vector verdicts; ("select newsid,newsid_str,url,nbproofs,nbcomments,nbarguments,verdict,created,title from news order by newsid limit %u,%u",offset,nb); glocal.newsids.push_back(row[1]); glocal.urls.push_back(row[2]); glocal.nbproofs.push_back(atoi(row[3])); glocal.nbcomments.push_back(atoi(row[4])); glocal.nbarguments.push_back(atoi(row[5])); glocal.verdicts.push_back(atoi(row[6])); glocal.submits.push_back(row[7]); glocal.titles.push_back(row[8]); glocal vector subs; ("select subjects.text from subnews join subjects on subnews.subjectid=subjects.subjectid where newsid=%s",row[0]); glocal.subs.push_back(row[0]); glocal.subjects.push_back(glocal.subs); rep_getstats (glocal.newsids,glocal.urls,glocal.submits,glocal.titles,glocal.subjects,glocal.nbproofs,glocal.nbcomments,glocal.nbarguments,glocal.verdicts); // newsid = urls:v contents:v submits:v nicknames:v glocal unsigned offset = offset; glocal unsigned nb = nb; glocal vector urls; glocal vector contents; glocal vector submits; glocal vector nicknames; ("select newsid from news where newsid_str='%s'",newsid); ("select extraurls.url,extraurls.content,extraurls.created,id2name.name" " from extraurls join id2name on extraurls.userid=id2name.userid" " where newsid=%s and approved is not null order by created limit %u,%u",row[0],glocal.offset,glocal.nb); glocal.urls.push_back(row[0]); glocal.contents.push_back(row[1]); glocal.submits.push_back(row[2]); glocal.nicknames.push_back(row[3]); rep_getextraurls (glocal.urls,glocal.contents,glocal.submits,glocal.nicknames); // newsid url = success:b msg glocal const char *url = url; glocal bool success = false; glocal string msg; ("select newsid from news where newsid_str='%s'",newsid); ("select url from extraurls" " where newsid=%s and url='%s'",row[0],glocal.url); glocal.msg = "Already exist"; glocal.success = true; rep_validextraurl (glocal.success,glocal.msg); tlmp_error ("CLIENT: Invalid command: %s\n",line); endclient = true; }else if (c->type == TYPE_ADMIN){ glocal.nbrequest_admin++; (this,c->req,line, info.linelen,endserver, endclient, no,c,c->host.c_str()); // listauthor sessionid offset:u nb:u = authorid author (glocal.con,sessionid,offset,nb); vector ids,names; for (unsigned i=0; i // searchauthor sessionid name = authorid author (glocal.con,sessionid,name); glocal.trlid_admin.rep_searchauthor(authorid,author); // listnewnews sessionid offset nb = newsids:v (glocal.con,sessionid,offset,nb); vector ids; for (auto n:newsids) ids.push_back(n); glocal.trlid_admin.rep_listnewnews(success,ids); // rejectnews sessionid newsid = success:b msg (glocal.con,sessionid,newsid); glocal.trlid_admin.rep_rejectnews(success,msg); // approvenews sessionid newsid = success:b msg (glocal.con,sessionid,newsid); glocal.trlid_admin.rep_approvenews(success,msg); // modifynews sessionid newsid content = success:b msg (glocal.con,sessionid,newsid,content); glocal.trlid_admin.rep_modifynews(success,msg); glocal const char *newsid = newsid; // success:b nickname title url content submit (glocal.con_sess,sessionid); debug_printf ("getsessioninfo success=%d userid=%u admin=%d\n",success,userid,admin); if (success && admin){ ("select id2name.name,title,url,content,created from news join id2name on news.userid=id2name.userid" " where news.newsid_str='%s' and approved is null and rejected is null",glocal.newsid); glocal.trlid_admin.rep_getnewnews(true,row[0],row[1],row[2],row[3],row[4]); glocal.trlid_admin.rep_getnewnews(false,"","","","",""); } (glocal.con,sessionid,blogid,title,content,created); glocal.trlid_admin.rep_addblog (success,msg); // sessionid newsid subjects:v = success:b (glocal.con,sessionid,newsid,subjects); glocal.trlid_admin.rep_assignsubjects(success,msg); // sessionid newsid url = success:b msg (glocal.con,sessionid,newsid,url); glocal.trlid_admin.rep_approvenewsurl(success,msg); // sessionid offset:u nb:u = success:b newsids:v urls:vv glocal unsigned offset = offset; glocal unsigned last = offset+nb; glocal bool success = false; glocal vector newsids; glocal vector> urls; (glocal.con_sess,sessionid); if (success && admin){ glocal map> newsurls; ("select newsid_str,extraurls.url from extraurls" " join news on extraurls.newsid=news.newsid" " where extraurls.approved is null"); glocal.newsurls[row[0]].push_back(row[1]); unsigned pos = 0; for (auto nu:glocal.newsurls){ if (pos >= glocal.offset && pos < glocal.last){ glocal.newsids.push_back(nu.first); glocal.urls.push_back(nu.second); } } glocal.success = true; } rep_listnewnewsurl (glocal.success,glocal.newsids,glocal.urls); glocal bool sessiond1=false; glocal bool sessiond2=false; glocal bool writed = false; glocal bool bdtrli1 = false; glocal bool bdtrli2 = false; glocal bool bdusers = false; glocal bool internal_error1 = false; glocal bool compute = false; (glocal.con_sess); glocal.internal_error1 = internal_error; glocal.sessiond1 = success; (glocal.con); glocal.writed = !internal_error; glocal.sessiond2 = sessiond; glocal.bdusers = bdusers; glocal.bdtrli2 = bdtrli; glocal.compute = compute; ("select count(*) from id2name"); glocal.bdtrli1=true; glocal.trlid_admin.rep_test(glocal.internal_error1 ,glocal.writed,glocal.bdtrli1,glocal.bdtrli2,glocal.bdusers ,glocal.sessiond1,glocal.sessiond2,glocal.compute); tlmp_error ("ADMIN: Invalid command: %s\n",line); endclient = true; } bool some_errors = false; if (control != NULL && fdpass_setcontrol(s,control,user)==-1){ some_errors = true; } if (s.listen(NULL,glocal.unixportadmin)==-1){ tlmp_error ("Can't setup socket on %s (%s)\n",glocal.unixportadmin.c_str(),strerror(errno)); some_errors = true; } if (!some_errors && s.is_ok()){ chmod (glocal.unixportclient.c_str()+5,0666); chmod (glocal.unixportadmin.c_str()+5,0666); s.setrawmode (true); if (daemon){ daemon_init(pidfile,user); } s.loop(); ret = 0; } return ret; } int main (int argc, char *argv[]) { glocal int ret = -1; glocal const char *admin_secretfile = "/etc/trli/secrets.admin"; glocal const char *client_secretfile = "/etc/trli/secrets.client"; glocal const char *bind = "0.0.0.0"; glocal const char *port = "9000"; glocal const char *control = "/var/run/trlid.sock"; glocal const char *adminhost = "127.0.0.3"; glocal const char *adminport = "9100"; glocal const char *sesshost = "127.0.0.4"; glocal const char *sessport = "9200"; glocal const char *user = "trli"; glocal const char *mysecret = NULL; glocal const char *dbserv = "localhost"; glocal const char *dbname = "trli"; glocal const char *dbuser = NULL; glocal const char *sql_tcpport = NULL; glocal bool daemon = false; glocal int workers = 1; glocal const char *pidfile = "/var/run/trlid.pid"; signal (SIGPIPE,SIG_IGN); glocal.ret = (argc,argv,"tlmpsql"); setproginfo ("trlid",VERSION,"Implement all business logic"); setgrouparg ("Networking"); setarg ('b',"bindaddr","Bind to this address (TCP)",glocal.bind,false); setarg ('p',"tcpport","Listen for command on this TCP port",glocal.port,false); setarg ('c',"control","Unix socket for trlid-control",glocal.control,false); setgrouparg ("Admin server"); setarg (' ',"adminhost","Host running the trli-writed server",glocal.adminhost,false); setarg (' ',"adminport","Port to reach the trli-writed server",glocal.adminport,false); setarg (' ',"sesshost","Host running the trli-sessiond server",glocal.sesshost,false); setarg (' ',"sessport","Port to reach the trli-sessiond server",glocal.sessport,false); setarg (' ',"mysecret","Secret used to communicate with trli-writed",glocal.mysecret,true); setgrouparg ("Misc."); setarg (' ',"admin_secrets","File holding admin secrets for communication",glocal.admin_secretfile,false); setarg (' ',"client_secrets","File holding client secrets for communication",glocal.client_secretfile,false); setarg (' ',"user","Run the program as this user",glocal.user,false); setarg (' ',"daemon","Run in background",glocal.daemon,false); setarg (' ',"workers","Number of sub-process to lauch",glocal.workers,false); setarg (' ',"pidfile","FIle holding the PID of the process",glocal.pidfile,false); setgrouparg ("Database"); setarg (' ',"dbserv","Database server",glocal.dbserv,false); setarg (' ',"dbname","Database name",glocal.dbname,false); setarg (' ',"dbuser","Database user",glocal.dbuser,true); setarg (' ',"sqltcpport","Database TCP port",glocal.sql_tcpport,false); glocal const char *msg = msg; ("/tmp/err.log",true); fprintf (fout,"%s\n",glocal.msg); return 0; if (glocal.daemon){ syslog (LOG_ERR,"%s",msg); }else{ fprintf (stderr,"%s",msg); } if (glocal.daemon){ syslog (LOG_WARNING,"%s",msg); }else{ fprintf (stderr,"%s",msg); } glocal CONNECT_INFO con; glocal CONNECT_INFO con_sess; glocal map admin_secrets; glocal map client_secrets; fdpass_readsecrets (glocal.client_secretfile,glocal.client_secrets); fdpass_readsecrets (glocal.admin_secretfile,glocal.admin_secrets); //glocal.con.host = glocal.adminhost; glocal.con.port = glocal.adminport; glocal.con.secret = glocal.mysecret; glocal.con.bind = glocal.bind; //glocal.con_sess.host = glocal.sesshost; glocal.con_sess.port = glocal.sessport; glocal.con_sess.secret = glocal.mysecret; glocal.con_sess.bind = glocal.bind; if (glocal.sql_tcpport != NULL) nsql_settcpport (atoi(glocal.sql_tcpport)); { const char *dbpass = getenv("TRLID_PWD"); if (dbpass == NULL){ tlmp_error ("Can't get database password from environment,aborting\n"); exit (-1); } query_setdefaultdb (glocal.dbserv,glocal.dbname,glocal.dbuser,dbpass); } int ret = -1; if (glocal.workers==1){ ret = trlid_main (glocal.bind,glocal.port,glocal.control ,glocal.con,glocal.con_sess,glocal.user,glocal.pidfile,glocal.daemon ,glocal.admin_secrets,glocal.client_secrets); }else{ int port = atoi(glocal.port); for (int w=0; w return glocal.ret; }