Exemple #1
0
/* PROTO */
void
imcomm_request_awayprofile(void *handle, char *sn)
{
	pkt_t          *packet;
	struct MultiPacket *mpkt;

	mpkt = MultiPktInit();

	packet = pkt_init(3 + (uint8_t) strlen(sn));

	pkt_add16(packet, 0x0003);
	pkt_add8(packet, (uint8_t) strlen(sn));
	pkt_addraw(packet, (uint8_t *) sn, strlen(sn));

	snac_addToMulti(handle, mpkt, 0x02, 0x05, packet->data, packet->len,
			0);

	pkt_free(packet);

	packet = pkt_init(3 + (uint8_t) strlen(sn));

	pkt_add16(packet, 0x0001);
	pkt_add8(packet, (uint8_t) strlen(sn));
	pkt_addraw(packet, (uint8_t *) sn, strlen(sn));

	snac_addToMulti(handle, mpkt, 0x02, 0x05, packet->data, packet->len,
			0);
	pkt_free(packet);

	flap_sendMulti(handle, mpkt);
	MultiPktFree(mpkt);
}
Exemple #2
0
/* PROTO */
void
imcomm_im_send_message(void *handle, const char *whom, const char *msg, int automsg)
{
	pkt_t          *packet;

	packet = pkt_init(28 + strlen(whom) + strlen(msg) + (4 * automsg));

	/*
         * Message cookie?
         *
         * Putting something random seems to work.
         */
	pkt_add32(packet, 0x01020304);
	pkt_add32(packet, 0x05060708);

	pkt_add16(packet, 0x0001);
	pkt_add8(packet, (uint8_t) strlen(whom));
	pkt_addraw(packet, (uint8_t *) whom, strlen(whom));
	pkt_add16(packet, 0x0002);
	pkt_add16(packet, (uint16_t) (uint16_t) (strlen(msg) + 13));
	pkt_add32(packet, 0x05010001);
	pkt_add8(packet, 0x01);
	pkt_add16(packet, 0x0101);
	pkt_add16(packet, (uint16_t) (uint16_t) (strlen(msg) + 4));
	pkt_add32(packet, 0x00000000);
	pkt_addraw(packet, (uint8_t *) msg, strlen(msg));

	if (automsg) {
		pkt_add16(packet, 0x0004);
		pkt_add16(packet, 0x0000);
	}
	snac_sendpkt(handle, 0x04, 0x06, packet, (automsg ? 0 : 1));
	pkt_free(packet);
}
Exemple #3
0
/* Writes Excel BIFF BOUNDSHEET record */
void wbook_store_boundsheet(struct wbookctx *wbook, char *sname, int offset)
{
  uint16_t name = 0x0085;  /* Record identifier */
  uint16_t length;
  uint16_t grbit = 0x0000;
  int cch;
  struct pkt *pkt;

  length = 0x07 + strlen(sname);  /* Number of bytes to follow */
  cch = strlen(sname);

  pkt = pkt_init(0, VARIABLE_PACKET);

  /* Write header */
  pkt_add16_le(pkt, name);
  pkt_add16_le(pkt, length);

  /* Write data */
  pkt_add32_le(pkt, offset);  /* Location of worksheet BOF */
  pkt_add16_le(pkt, grbit);   /* Sheet identifier */
  pkt_add8(pkt, cch); /* Length of sheet name */
  pkt_addraw(pkt, (unsigned char *)sname, cch);

  bw_append(wbook->biff, pkt->data, pkt->len);
  pkt_free(pkt);

}
Exemple #4
0
/* PROTO */
void
imcomm_request_awaymsg(void *handle, char *sn)
{
	pkt_t          *packet;

	packet = pkt_init(3 + (uint8_t) strlen(sn));

	pkt_add16(packet, 0x0003);
	pkt_add8(packet, (uint8_t) strlen(sn));
	pkt_addraw(packet, (uint8_t *) sn, strlen(sn));

	snac_sendpkt(handle, 0x02, 0x05, packet, 0);
	pkt_free(packet);
}
Exemple #5
0
/* Write Excel BIFF STYLE record */
void wbook_store_style(struct wbookctx *wbook)
{
  uint16_t name = 0x0093;  /* Record identifier */
  uint16_t length = 0x0004; /* Bytes to follow */
  uint16_t ixfe = 0x0000;

  struct pkt *pkt;

  pkt = pkt_init(8, FIXED_PACKET);

  /* Write header */
  pkt_add16_le(pkt, name);
  pkt_add16_le(pkt, length);

  /* Write data */
  pkt_add16_le(pkt, ixfe);  /* Index to style XF */
  pkt_add8(pkt, 0x00); /* Built-in style */
  pkt_add8(pkt, 0x00); /* Outline style level */

  bw_append(wbook->biff, pkt->data, pkt->len);
  pkt_free(pkt);

}
Exemple #6
0
/* Writes Excel FORMAT record for non "built-in" numerical formats. */
static void wbook_store_num_format(struct wbookctx *wbook, char *format, int index)
{
  struct pkt *pkt;
  size_t cch;

  cch = strlen(format);
  pkt = pkt_init(0, VARIABLE_PACKET);

  /* Write header */
  pkt_add16_le(pkt, 0x041E);  /* Record identifier */
  pkt_add16_le(pkt, 0x0003 + cch);

  /* Write data */
  pkt_add16_le(pkt, index);
  pkt_add8(pkt, cch);
  pkt_addraw(pkt, (unsigned char *)format, cch);

  bw_append(wbook->biff, pkt->data, pkt->len);

  pkt_free(pkt);
}
Exemple #7
0
/* PROTO */
void
imcomm_request_massawaymsg(void *handle, char **sns, int num)
{
	pkt_t          *packet;
	int             x;
	struct MultiPacket *multipkt;

	multipkt = MultiPktInit();

	for (x = 0; x < num; x++) {
		packet = pkt_init(3 + (uint8_t) strlen(sns[x]));

		pkt_add16(packet, 0x0003);
		pkt_add8(packet, (uint8_t) strlen(sns[x]));
		pkt_addraw(packet, (uint8_t *) sns[x], strlen(sns[x]));

		snac_addToMulti(handle, multipkt, 0x02, 0x05, packet->data,
				(uint16_t) packet->len, 0);
		pkt_free(packet);
	}

	flap_sendMulti(handle, multipkt);
	MultiPktFree(multipkt);
}
Exemple #8
0
/* PROTO */
int
connect_socks5(void *handle, char *host, uint16_t port)
{
	IMCOMM         *h = (IMCOMM *) handle;
	struct sockaddr_in sin;
	struct hostent *he = NULL;
	long            addy;
	struct in_addr  ina = {0};
	pkt_t          *sockspkt;
	uint8_t         len;
	unsigned char   sockbuf[512];

#ifdef DEBUG
	printf("Connecting via SOCKS5 to %s/%u\n", host, port);
	printf("SOCKS5 proxy server: %s/%u\n", h->proxyserver, h->proxyport);
#endif

	if ((he = gethostbyname(h->proxyserver)) == NULL) {
		addy = inet_addr(h->proxyserver);
		ina.s_addr = addy;
	}
	if ((h->socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_PROXY,
						    PROXY_ERROR_CONNECT);

		return IMCOMM_RET_ERROR;
	}
	sin.sin_family = AF_INET;
	sin.sin_port = htons(h->proxyport);

	if (he == NULL)
		sin.sin_addr = ina;
	else
		sin.sin_addr = *((struct in_addr *) he->h_addr);

	memset(&(sin.sin_zero), 0, 8);

	if (connect
	    (h->socket, (struct sockaddr *) & sin,
	     sizeof(struct sockaddr)) == -1) {
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_PROXY,
						    PROXY_ERROR_CONNECT);

		return IMCOMM_RET_ERROR;
	}
	sockspkt = pkt_init(3);
	pkt_add8(sockspkt, 0x05);
	pkt_add8(sockspkt, 0x01);
	pkt_add8(sockspkt, 0x00);

	if (send(h->socket, sockspkt->data, sockspkt->len, 0) < 0) {
		pkt_free(sockspkt);
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_DISCONNECTED,
						    0);

		shutdown(h->socket, 0x02);
		h->socket = -1;
		return IMCOMM_RET_ERROR;
	}
	pkt_free(sockspkt);

	recv(h->socket, sockbuf, 2, 0);
	if (sockbuf[1] != 0x00) {
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_PROXY,
						    PROXY_ERROR_AUTH);
		return IMCOMM_RET_ERROR;
	}
	sockspkt = pkt_init(7 + strlen(host));
	pkt_add8(sockspkt, 0x05);
	pkt_add8(sockspkt, 0x01);
	pkt_add8(sockspkt, 0x00);
	pkt_add8(sockspkt, 0x03);
	pkt_add8(sockspkt, (uint8_t) strlen(host));
	pkt_addraw(sockspkt, (unsigned char *) host, strlen(host));
	pkt_add16(sockspkt, port);

	if (send(h->socket, sockspkt->data, sockspkt->len, 0) < 0) {
		pkt_free(sockspkt);
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_DISCONNECTED,
						    0);

		shutdown(h->socket, 0x02);
		h->socket = -1;
		return IMCOMM_RET_ERROR;
	}
	pkt_free(sockspkt);

	recv(h->socket, sockbuf, 4, 0);
	if (sockbuf[1] != 0x00) {
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_PROXY,
						  PROXY_ERROR_PROXYCONNECT);
		shutdown(h->socket, 0x02);
		h->socket = -1;

		return IMCOMM_RET_ERROR;
	}
	if (sockbuf[3] == 0x03) {
		recv(h->socket, &len, 1, 0);
		recv(h->socket, sockbuf, len + 2, 0);
	} else if (sockbuf[3] == 0x01) {
		recv(h->socket, sockbuf, 6, 0);
	} else {
		if (h->callbacks[IMCOMM_ERROR])
			h->callbacks[IMCOMM_ERROR] (handle, IMCOMM_ERROR_PROXY,
						    PROXY_ERROR_UNKNOWN);

		shutdown(h->socket, 0x02);
		h->socket = -1;
		return IMCOMM_RET_ERROR;
	}

	/* now we should be set to read the connection */

	return IMCOMM_RET_OK;
}