void decode_message(struct TCPRECORD *sess, struct NetFrame *frame, const unsigned char *px, unsigned length, unsigned is_outgoing) { struct FerretEngine *eng = sess->eng; struct Ferret *ferret = eng->ferret; const unsigned char *msg = px; unsigned msg_length = length; unsigned msg_offset = 0; if (msg_length > 2 && ex16be(msg+msg_offset) == 0x501) { /*unsigned flags = ex16be(msg+msg_offset);*/ unsigned len=0; msg_offset += 2; if (msg_offset+2 < msg_length) { len = ex16be(msg+msg_offset); msg_offset += len+2; } if (msg_offset+2 < msg_length) msg_offset += 2; /* block info */ if (msg_offset+2 < msg_length) { len = ex16be(msg+msg_offset); msg_offset += 2; /* block length */ } msg_offset += 4; /* character set */ if (len > 4) len -= 4; /* subtract the charset info from the block lenght*/ if (msg_offset > msg_length) { FRAMERR(frame, "%s: integer overflow\n", "AIM"); return; } if (msg_offset + len > msg_length) len = msg_length - msg_offset; if (len > 6 && strnicmp((const char*)msg+msg_offset, "<HTML>", 6)==0) { unsigned char *msg2 = alloca(len); unsigned msg2_len; msg2_len = strip_html_tags(msg+msg_offset, len, msg2, len); if (is_outgoing) JOTDOWN(ferret, JOT_SRC("ID-IP",frame), JOT_PRINT("AIM-Message-To", sess->str[1].the_string, sess->str[1].length), JOT_PRINT("AIM-Message", msg2, msg2_len), 0); else JOTDOWN(ferret, JOT_DST("ID-IP",frame), JOT_PRINT("AIM-Message-From", sess->str[1].the_string, sess->str[1].length), JOT_PRINT("AIM-Message", msg2, msg2_len), 0); } else { if (is_outgoing) JOTDOWN(ferret, JOT_SRC("ID-IP",frame), JOT_PRINT("AIM-Message-To", sess->str[1].the_string, sess->str[1].length), JOT_PRINT("AIM-Message", msg+msg_offset, msg_length-msg_offset), 0); else JOTDOWN(ferret, JOT_DST("ID-IP",frame), JOT_PRINT("AIM-Message-From", sess->str[1].the_string, sess->str[1].length), JOT_PRINT("AIM-Message", msg+msg_offset, msg_length-msg_offset), 0); } } else { while (msg_offset<msg_length && msg[msg_offset] < 26) msg_offset++; if (is_outgoing) JOTDOWN(ferret, JOT_SRC("ID-IP",frame), JOT_PRINT("AIM-Message-To", sess->str[1].the_string, sess->str[1].length), JOT_PRINT("AIM-Message", msg+msg_offset, msg_length-msg_offset), 0); else JOTDOWN(ferret, JOT_DST("ID-IP",frame), JOT_PRINT("AIM-Message-From", sess->str[1].the_string, sess->str[1].length), JOT_PRINT("AIM-Message", msg+msg_offset, msg_length-msg_offset), 0); } }
long aur_upload(const char *taurball, const char *csrf_token) { char *errormsg; char category[3], errbuffer[CURL_ERROR_SIZE] = {0}; const char *display_name, *error_start, *error_end; long httpcode, ret = 1; CURLcode status; struct curl_httppost *post = NULL, *last = NULL; struct curl_slist *headers = NULL; struct write_result response = { NULL, 0 }; struct stat st; double *ul_shipped, *ul_delivered; /* make sure the resolved path is a regular file */ if (stat(taurball, &st) != 0) { fprintf(stderr, "error: failed to stat `%s': %s\n", taurball, strerror(errno)); return ret; } if (!S_ISREG(st.st_mode)) { fprintf(stderr, "error: `%s\' is not a file\n", taurball); return ret; } display_name = strrchr(taurball, '/'); if (display_name) { display_name++; } else { display_name = taurball; } curl_formadd(&post, &last, CURLFORM_COPYNAME, "pkgsubmit", CURLFORM_COPYCONTENTS, "1", CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "pfile", CURLFORM_FILE, taurball, CURLFORM_END); snprintf(category, 3, "%d", config->catnum); curl_formadd(&post, &last, CURLFORM_COPYNAME, "category", CURLFORM_COPYCONTENTS, category, CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "token", CURLFORM_COPYCONTENTS, csrf_token); if (config->verbose) { printf("submitting form:\n"); printf(" pkgsubmit=1\n"); printf(" prfile=%s\n", taurball); printf(" category=%s\n", category); printf(" token=%s\n", csrf_token); } headers = curl_slist_append(headers, "Expect:"); curl_easy_setopt(curl, CURLOPT_URL, AUR_SUBMIT_URL); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuffer); if (config->verbose) { printf("Uploading taurball: %s\n", display_name); } status = curl_easy_perform(curl); if (status != CURLE_OK) { fprintf(stderr, "error: unable to send data to %s: %s\n", AUR_SUBMIT_URL, errbuffer); goto cleanup; } curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode); if (httpcode != 200) { fprintf(stderr, "error: server responded with HTTP %ld\n", httpcode); goto cleanup; } debug("%s\n", response.memory); curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_UPLOAD, &ul_shipped); curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &ul_delivered); if (ul_delivered == ul_shipped) { printf("%s has been uploaded successfully.\n", display_name); ret = 0; goto cleanup; } /* failboat */ error_start = memmem(response.memory, response.size, ERROR_STARTTAG, strlen(ERROR_STARTTAG)); if (error_start) { error_start += strlen(ERROR_STARTTAG); error_end = memmem(error_start, response.size - (error_start - response.memory), ERROR_ENDTAG, strlen(ERROR_ENDTAG)); if (error_end) { errormsg = strip_html_tags(error_start, error_end - error_start); if (errormsg) { fprintf(stderr, "[AUR] %s\n", errormsg); FREE(errormsg); } goto cleanup; } } fprintf(stderr, "error: unexpected failure uploading `%s'\n", taurball); cleanup: curl_slist_free_all(headers); curl_formfree(post); free(response.memory); return ret; }