#include "gb-include.h" #include "CollectionRec.h" #include "Pages.h" #include "Msg2a.h" #include "Msg8b.h" static void sendReplyWrapper ( void *state ); static bool sendReply ( void *state ); static void gotCatInfoWrapper ( void *state );//, CatRec *rec ); class StateCatdb { public: TcpSocket *m_socket; HttpRequest m_r; char m_coll[MAX_COLL_LEN]; long m_collLen; Msg2a m_msg2a; Msg8b m_msg8b; Url m_url; CatRec m_catRec; bool m_catLookup; bool m_genCatdb; long long m_startTime; }; // . returns false if blocked, true otherwise // . sets g_errno on error bool sendPageCatdb ( TcpSocket *s , HttpRequest *r ) { // are we the admin? bool isAdmin = g_collectiondb.isAdmin ( r , s ); // get the collection record CollectionRec *cr = g_collectiondb.getRec ( r ); if ( ! cr ) { log("admin: No collection record found " "for specified collection name. Could not add sites to " "tagdb. Returning HTTP status of 500."); return g_httpServer.sendErrorReply ( s , 500 , "collection does not exist"); } bool isAssassin = cr->isAssassin ( s->m_ip ); if ( isAdmin ) isAssassin = true; // bail if permission denied if ( ! isAssassin && ! cr->hasPermission ( r , s ) ) { log("admin: Bad collection name or password. Could not add " "sites to tagdb. Permission denied."); return sendPageLogin ( s , r , "Collection name or " "password is incorrect"); } // get the collection long collLen = 0; char *coll = r->getString("c", &collLen, NULL); // check for generate catdb command long genCatdb = r->getLong("gencatdb", 0); // check for a lookup url long urlLen = 0; char *url = r->getString("caturl", &urlLen, NULL); // create the State StateCatdb *st; try { st = new (StateCatdb); } catch ( ... ) { g_errno = ENOMEM; log("catdb: Unable to allocate %i bytes for StateCatdb", sizeof(StateCatdb) ); return true; } mnew ( st, sizeof(StateCatdb), "PageCatdb" ); // fill the state st->m_socket = s; st->m_r.copy(r); // copy collection if (collLen > MAX_COLL_LEN) collLen = MAX_COLL_LEN - 1; memcpy(st->m_coll, coll, collLen); st->m_coll[collLen] = '\0'; st->m_collLen = collLen; // defaults st->m_catLookup = false; st->m_genCatdb = false; st->m_startTime = gettimeofdayInMilliseconds(); // generate catdb if requested if (genCatdb == 1) { st->m_genCatdb = true; if (!st->m_msg2a.makeCatdb ( st->m_coll, st->m_collLen, false, st, sendReplyWrapper ) ) return false; } // update catdb from .new files else if (genCatdb == 2) { st->m_genCatdb = true; if (!st->m_msg2a.makeCatdb ( st->m_coll, st->m_collLen, true, st, sendReplyWrapper ) ) return false; } // lookup a url if requested else if (url && urlLen > 0) { st->m_catLookup = true; // set the url st->m_url.set(url, urlLen); // call msg8b to lookup in catdb if (!st->m_msg8b.getCatRec ( &st->m_url, st->m_coll, st->m_collLen, true, 1, &st->m_catRec, st, gotCatInfoWrapper)) //RDB_CATDB ) ) //RDB_TAGDB ) ) return false; } // otherwise return the regular page return sendReply ( st ); } void sendReplyWrapper ( void *state ) { sendReply ( state ); } void gotCatInfoWrapper ( void *state ) { // , CatRec *rec ) { sendReply ( state ); } bool sendReply ( void *state ) { StateCatdb *st = (StateCatdb*)state; // check for error if (g_errno) { if (st->m_catLookup) log("PageCatdb: Msg8b had error getting Site Rec: %s", mstrerror(g_errno)); else log("PageCatdb: Msg2a had error generating Catdb: %s", mstrerror(g_errno)); st->m_catLookup = false; g_errno = 0; } long long endTime = gettimeofdayInMilliseconds(); // page buffer SafeBuf sb; sb.reserve(64*1024); // . print standard header // . do not print big links if only an assassin, just print host ids g_pages.printAdminTop ( &sb, st->m_socket , &st->m_r ); sb.safePrintf ( "" "", LIGHT_BLUE , DARK_BLUE ); // print the generate Catdb link sb.safePrintf ( "" "", st->m_coll ); sb.safePrintf ( "" "", st->m_coll ); if (st->m_genCatdb) sb.safePrintf ( "", endTime - st->m_startTime ); // print Url Catgory Lookup sb.safePrintf ( "" "" ); // print Url Info if Lookup was done if (st->m_catLookup) { sb.safePrintf(""); } // end it sb.safePrintf ( "
" "
Catdb
" "
Update Catdb from DMOZ data.
" "" "Update Catdb " "
Generate New Catdb from DMOZ data.
" "" "Generate Catdb " "
Catdb Generation took %lli ms." "
Lookup Category of Url.m_catLookup) { sb.safeMemcpy(st->m_url.getUrl(), st->m_url.getUrlLen()); } sb.safePrintf("\">
"); // print the url sb.safeMemcpy(st->m_url.getUrl(), st->m_url.getUrlLen()); sb.safePrintf(" (%lli ms)", endTime - st->m_startTime ); // print each category id and path for (long i = 0; i < st->m_catRec.m_numCatids; i++) { sb.safePrintf("[%li] ", st->m_catRec.m_catids[i]); g_categories->printPathFromId(&sb, st->m_catRec.m_catids[i]); sb.safePrintf("
"); // lookup title and summary char title[1024]; long titleLen = 0; char summ[4096]; long summLen = 0; char anchor[256]; unsigned char anchorLen = 0; g_categories->getTitleAndSummary( st->m_url.getUrl(), st->m_url.getUrlLen(), st->m_catRec.m_catids[i], title, &titleLen, 1023, summ, &summLen, 4098, anchor, &anchorLen, 255 ); title[titleLen] = '\0'; summ[summLen] = '\0'; anchor[anchorLen] = '\0'; // print title and summary sb.safePrintf("Title: %s
" "Summary: %s
", title, summ); if (anchorLen > 0) sb.safePrintf("Anchor: %s
", anchor); sb.safePrintf("
"); } sb.safePrintf("Filenum: %li
", st->m_catRec.m_filenum); // print indirect catids if (st->m_catRec.m_numIndCatids > 0) { sb.safePrintf("
Indirect Catids [%li]:" "
\n", st->m_catRec.m_numIndCatids ); for (long i = 0; i < st->m_catRec.m_numIndCatids; i++) { sb.safePrintf("%lu
", st->m_catRec.m_indCatids[i]); } } sb.safePrintf("
" ); // print submit button sb.safePrintf ( "
" "" "
" ); // print the final tail //p += g_httpServer.printTail ( p , pend - p ); // clear g_errno, if any, so our reply send goes through g_errno = 0; // extract the socket TcpSocket *s = st->m_socket; // clear the state mdelete ( st, sizeof(StateCatdb), "PageCatdb" ); delete st; // . send this page // . encapsulates in html header and tail // . make a Mime return g_httpServer.sendDynamicPage(s , sb.getBufStart(), sb.length()); }