Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
Archivo: curl.c Proyecto: cinelli/burp
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;
}