#include "blogxmlrpc.h" #include "utils.h" #include "codes.h" #include "base64_encode.h" char *blog_xmlrpc_post(char *commanddata, char *bloghost, char *blogurl, char *blogserverip, int blogserverport, char *blogtype) { char *appkey, *blogid, *user, *pass, *title, *link, *author, *message; // message has + where space (url encoded) char *newmessage, *newtitle, *newlink, *newauthor; char *bnewmessage, *bnewtitle, *bnewlink, *bnewauthor; char *i; char *readbuff; int result; char *sendmessage; int smeslen; int readdata; // commanddata == ?appkey=KEY&blogid=ID&user=USER&pass=PASS&message=MESSAGE&title=TITLE&link=LINK&author=AUTHOR appkey = strsep(&commanddata, "="); // ?appkey appkey = strsep(&commanddata, "&"); // value blogid = strsep(&commanddata, "="); // blogid blogid = strsep(&commanddata, "&"); // value user = strsep(&commanddata, "="); // user user = strsep(&commanddata, "&"); // value pass = strsep(&commanddata, "="); // pass pass = strsep(&commanddata, "&"); // value message = strsep(&commanddata, "="); // message message = strsep(&commanddata, "&"); // value title = strsep(&commanddata, "="); // title, metaWebLog title = strsep(&commanddata, "&"); // title, metaWebLog link = strsep(&commanddata, "="); // link link = strsep(&commanddata, "&"); // link author = strsep(&commanddata, "="); // author author = strsep(&commanddata, "&"); // author //printf("appkey %s, blogid %s, user %s, pass %s, message %s", appkey, blogid, user, pass, message); if ((appkey == NULL) || (blogid == NULL) || (user == NULL) || (pass == NULL) || (message == NULL) || (strlen(appkey) < 1) || (strlen(blogid) < 1) || (strlen(user) < 2) || (strlen(pass) < 2) || (strlen(message) < 1)) { log_message_pid(5, "failure to find all blog data -- returning empty result", getpid()); log_message(9, "appkey:"); log_message(9, appkey); log_message(9, "blogid:"); log_message(9, blogid); log_message(9, "user:"); log_message(9, user); log_message(9, "pass:"); log_message(9, pass); log_message(9, "message:"); log_message(9, message); if (strlen(appkey) < 2) { return(NOAPPKEY_CODE); } else if (strlen(blogid) < 2) { return(NOBLOGID_CODE); } else if (strlen(user) < 2) { return(NOBLOGUSER_CODE); } else if (strlen(pass) < 2) { return(NOBLOGPASS_CODE); } else if (strlen(message) < 2) { return(NOMESSAGE_CODE); } else { return(MISSING_BLOG_DATA_CODE); } } if ((blogtype == NULL) || (strlen(blogtype) < 2)) { return(NOKNOWNBLOGTYPE_CODE); } while ((i = index(message, 43)) != NULL) // replace + with space { *i = ' '; } if (message != NULL) { newmessage = calloc(strlen(message), sizeof(char)); unescapeString(message, newmessage); } else { newmessage = "NULL"; } if (title != NULL) { newtitle = calloc(strlen(title), sizeof(char)); unescapeString(title, newtitle); } else { newtitle = "NULL"; } if (link != NULL) { newlink = calloc(strlen(link), sizeof(char)); unescapeString(link, newlink); } else { newlink = "NULL"; } if (author != NULL) { newauthor = calloc(strlen(author), sizeof(char)); unescapeString(author, newauthor); } else { newauthor = "NULL"; } if (strcmp(blogtype, BLOGGER_API) == 0) { // blogger API smeslen = strlen(appkey) + strlen(blogid) + strlen(user) + strlen(pass) + strlen(newmessage); sendmessage = calloc(sizeof(char), (smeslen + 600)); // xml len rough, plus fudge factor snprintf(sendmessage, (smeslen + 600), "POST %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Script-engine 1.0\r\nContent-Type: text/xml\r\nContent-length: %d\r\n\r\nblogger.newPost%s%s%s%s1\r\n\r\n", blogurl, bloghost, (smeslen + 402), appkey, blogid, user, pass, newmessage); // more fudging; what, sue me over >10bytes? } else { if (newmessage != NULL) { bnewmessage = calloc(strlen(newmessage) * 2, sizeof(char)); base64_encode(bnewmessage, newmessage, strlen(newmessage)); } else { bnewmessage = "NULL"; } if (newtitle != NULL) { bnewtitle = calloc(strlen(newtitle) * 2, sizeof(char)); base64_encode(bnewtitle, newtitle, strlen(newtitle)); } else { bnewtitle = "NULL"; } if (newlink != NULL) { bnewlink = calloc(strlen(newlink) * 2, sizeof(char)); base64_encode(bnewlink, newlink, strlen(newlink)); } else { bnewlink = "NULL"; } if (newauthor != NULL) { bnewauthor = calloc(strlen(newauthor) * 2, sizeof(char)); base64_encode(bnewauthor, newauthor, strlen(newauthor)); } else { bnewauthor = "NULL"; } // metaWebLog API smeslen = strlen(blogid) + strlen(user) + strlen(pass) + strlen(bnewmessage) + strlen(bnewtitle) + strlen(bnewlink) + strlen(bnewauthor); sendmessage = calloc(sizeof(char), (smeslen + 800)); // xml len rough, plus fudge factor // newtitle newlink newauthor snprintf(sendmessage, (smeslen + 800), "POST %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Script-engine 1.0\r\nContent-Type: text/xml\r\nContent-length: %d\r\n\r\nmetaWeblog.newPost%s%s%stitle%slink%sauthor%sdescription%s1\r\n\r\n", blogurl, bloghost, (smeslen + 618), blogid, user, pass, bnewtitle, bnewlink, bnewauthor, bnewmessage); // more fudging; what, sue me over >10bytes? } free(newmessage); log_message(9, "message to blogger is:"); log_message(9, sendmessage); readbuff = sendTCPSocketTextMessage(sendmessage, blogserverip, blogserverport); log_message(9, "response from blogger was:"); log_message(9, readbuff); if (readbuff == NULL) { // queue return queueMessage(appkey, blogid, user, pass, message, title, link, author); } return parseSuccess(readbuff); } char *parseSuccess(char *readbuff) { int success = 0; if ((strstr(readbuff, "Error") != NULL) || (strstr(readbuff, "Exception") != NULL)) { success = 0; } else { success = 1; } free(readbuff); if (success == 1) { return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 96\r\nDate: Sat, 12 Apr 2003 18:26:55 GMT\r\nServer: Apache Tomcat/4.0.4 (HTTP/1.1 Connector)\r\n\r\nYou have successfully posted to your blog. You can close the browser.\r\n"; } else { return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 190\r\nDate: Sat, 12 Apr 2003 18:26:55 GMT\r\nServer: Apache Tomcat/4.0.4 (HTTP/1.1 Connector)\r\n\r\nThere was a problem posting to your blog. Send a copy of your /tmp/socketserver.log and /tmp/socketserver.stderr to 0@zeroaltitude.org. You can close the browser.\r\n"; } } char *queueMessage(char *appkey, char *blogid, char *blogus, char *blogpw, char *message, char *title, char *link, char *author) { FILE *queuefile; int _fstat; struct passwd *pw; uid_t myuid; char *qfilename; myuid = geteuid(); pw = getpwuid(myuid); qfilename = calloc(sizeof(char), strlen(pw->pw_dir) + 1 + 17); // .konfabblogqueue strcpy(qfilename, pw->pw_dir); strcat(qfilename, "/"); strcat(qfilename, ".konfabblogqueue"); log_message(9, "queuing message to:"); log_message(9, qfilename); queuefile = fopen(qfilename, "a"); if (queuefile == NULL) { perror("bad open"); return(QUEUE_UNSUCCESSFUL_CODE); } fprintf(queuefile, "%s:;:%s:;:%s:;:%s:;:%s:;:%s:;:%s:;:%s\n", appkey, blogid, blogus, blogpw, message, title, link, author); fflush(queuefile); _fstat = fclose (queuefile); if (_fstat < 0) { perror("bad close"); return(QUEUE_UNSUCCESSFUL_CODE); } return(QUEUED_CODE); }