303 lines
8.1 KiB
C++
303 lines
8.1 KiB
C++
#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];
|
|
int32_t m_collLen;
|
|
Msg2a m_msg2a;
|
|
Msg8b m_msg8b;
|
|
Url m_url;
|
|
CatRec m_catRec;
|
|
bool m_catLookup;
|
|
bool m_genCatdb;
|
|
int64_t 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.hasPermission ( 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 sendPagexxxx ( s , r ,
|
|
"Collection name or "
|
|
"password is incorrect");
|
|
}
|
|
*/
|
|
|
|
|
|
// no permmission?
|
|
bool isMasterAdmin = g_conf.isMasterAdmin ( s , r );
|
|
bool isCollAdmin = g_conf.isCollAdmin ( s , r );
|
|
if ( ! isMasterAdmin &&
|
|
! isCollAdmin ) {
|
|
g_errno = ENOPERM;
|
|
g_httpServer.sendErrorReply(s,g_errno,mstrerror(g_errno));
|
|
return true;
|
|
}
|
|
|
|
|
|
// get the collection
|
|
int32_t collLen = 0;
|
|
char *coll = r->getString("c", &collLen, NULL);
|
|
// check for generate catdb command
|
|
int32_t genCatdb = r->getLong("gencatdb", 0);
|
|
// check for a lookup url
|
|
int32_t 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 %" INT32 " bytes for StateCatdb",
|
|
(int32_t)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;
|
|
gbmemcpy(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,
|
|
NULL,//st->m_coll,
|
|
0,//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;
|
|
}
|
|
int64_t 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(
|
|
"<style>"
|
|
".poo { background-color:#%s;}\n"
|
|
"</style>\n" ,
|
|
LIGHT_BLUE );
|
|
|
|
|
|
sb.safePrintf ( "<table %s>"
|
|
"<tr><td colspan=2>"
|
|
"<center><font size=+1><b>Catdb</b></font></center>"
|
|
"</td></tr>", TABLE_STYLE );
|
|
|
|
// instructions
|
|
sb.safePrintf("<tr bgcolor=#%s>"
|
|
"<td colspan=3>"
|
|
"<font size=-2>"
|
|
"<center>"
|
|
"Don't just start using this, you need to follow the "
|
|
"instructions in the <i>admin guide</i> for adding "
|
|
"DMOZ support."
|
|
"</center>"
|
|
"</font>"
|
|
"</td>"
|
|
"</tr>"
|
|
,DARK_BLUE
|
|
);
|
|
|
|
// print the generate Catdb link
|
|
sb.safePrintf ( "<tr class=poo><td>Update Catdb from DMOZ data.</td>"
|
|
"<td><center>"
|
|
"<a href=\"/admin/catdb?c=%s&gencatdb=2\">"
|
|
"Update Catdb</a> "
|
|
"</center></td></tr>",
|
|
st->m_coll );
|
|
sb.safePrintf ( "<tr class=poo>"
|
|
"<td>Generate New Catdb from DMOZ data.</td>"
|
|
"<td><center>"
|
|
"<a href=\"/admin/catdb?c=%s&gencatdb=1\">"
|
|
"Generate Catdb</a> "
|
|
"</center></td></tr>",
|
|
st->m_coll );
|
|
if (st->m_genCatdb)
|
|
sb.safePrintf ( "<tr class=poo>"
|
|
"<td> Catdb Generation took %" INT64 " ms."
|
|
"</td></tr>",
|
|
endTime - st->m_startTime );
|
|
// print Url Category Lookup
|
|
sb.safePrintf ( "<tr class=poo><td>Lookup Category of Url.</td>"
|
|
"<td><input type=text name=caturl size=80"
|
|
" value=\"");
|
|
if (st->m_catLookup) {
|
|
sb.safeMemcpy(st->m_url.getUrl(), st->m_url.getUrlLen());
|
|
}
|
|
sb.safePrintf("\"></center></td></tr>" );
|
|
// print Url Info if Lookup was done
|
|
if (st->m_catLookup) {
|
|
sb.safePrintf("<tr><td>");
|
|
// print the url
|
|
sb.safeMemcpy(st->m_url.getUrl(), st->m_url.getUrlLen());
|
|
sb.safePrintf(" (%" INT64 " ms)</td><td>",
|
|
endTime - st->m_startTime );
|
|
// print each category id and path
|
|
for (int32_t i = 0; i < st->m_catRec.m_numCatids; i++) {
|
|
sb.safePrintf("<b>[%" INT32 "] ",
|
|
st->m_catRec.m_catids[i]);
|
|
g_categories->printPathFromId(&sb,
|
|
st->m_catRec.m_catids[i]);
|
|
sb.safePrintf("</b><br>");
|
|
// lookup title and summary
|
|
char title[1024];
|
|
int32_t titleLen = 0;
|
|
char summ[4096];
|
|
int32_t 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("<b>Title:</b> %s<br>"
|
|
"<b>Summary:</b> %s<br>",
|
|
title, summ);
|
|
if (anchorLen > 0)
|
|
sb.safePrintf("<b>Anchor:</b> %s<br>",
|
|
anchor);
|
|
sb.safePrintf("<br>");
|
|
}
|
|
sb.safePrintf("<b>Filenum:</b> %" INT32 "<br>",
|
|
st->m_catRec.m_filenum);
|
|
// print indirect catids
|
|
if (st->m_catRec.m_numIndCatids > 0) {
|
|
sb.safePrintf("<hr><b>Indirect Catids [%" INT32 "]:"
|
|
"</b><br>\n",
|
|
st->m_catRec.m_numIndCatids );
|
|
for (int32_t i = 0;
|
|
i < st->m_catRec.m_numIndCatids; i++) {
|
|
sb.safePrintf("%" UINT32 "<br>",
|
|
st->m_catRec.m_indCatids[i]);
|
|
}
|
|
}
|
|
sb.safePrintf("</td></tr>");
|
|
}
|
|
// end it
|
|
sb.safePrintf ( "</center></td></tr></table>" );
|
|
// print submit button
|
|
sb.safePrintf ( "<br><center>"
|
|
"<input type=submit value=\"Submit\" border=0>"
|
|
"</form></center>" );
|
|
|
|
// 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());
|
|
}
|