/* 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); }
/* 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); }
/* 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); }
/* 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); }
/* 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); }
/* 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); }
/* 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); }
/* 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; }