static int friendreq_handlepacket(void *object, uint8_t *source_pubkey, uint8_t *packet, uint32_t length) { if (length == 0) return 1; ++packet; --length; Friend_Requests *fr = object; if (fr->handle_friendrequest_isset == 0) return 1; if (length <= sizeof(fr->nospam)) return 1; if (request_received(fr, source_pubkey)) return 1; if (memcmp(packet, &fr->nospam, sizeof(fr->nospam)) != 0) return 1; if (fr->filter_function) if ((*fr->filter_function)(source_pubkey, fr->filter_function_userdata) != 0) return 1; addto_receivedlist(fr, source_pubkey); packet[length - 1] = 0; /* Force NULL terminator. */ (*fr->handle_friendrequest)(source_pubkey, packet + 4, length - 4, fr->handle_friendrequest_userdata); return 0; }
static int friendreq_handlepacket(IP_Port source, uint8_t * packet, uint32_t length) { if (packet[0] == 32) { if (length <= crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1 + ENCRYPTION_PADDING || length > MAX_DATA_SIZE + ENCRYPTION_PADDING) return 1; if (memcmp(packet + 1, self_public_key, crypto_box_PUBLICKEYBYTES) == 0) {// check if request is for us. if (handle_friendrequest_isset == 0) return 1; uint8_t public_key[crypto_box_PUBLICKEYBYTES]; uint8_t data[MAX_DATA_SIZE]; int len = handle_request(public_key, data, packet, length); if (len == -1) return 1; if (request_received(public_key)) return 1; addto_receivedlist(public_key); (*handle_friendrequest)(public_key, data, len); } else { /* if request is not for us, try routing it. */ if(route_packet(packet + 1, packet, length) == length) return 0; } } return 1; }
static int friendreq_handlepacket(void *object, IP_Port source, uint8_t *source_pubkey, uint8_t *packet, uint32_t length) { Friend_Requests *fr = object; if (fr->handle_friendrequest_isset == 0) return 1; if (length <= sizeof(fr->nospam)) return 1; if (request_received(fr, source_pubkey)) return 1; if (memcmp(packet, &fr->nospam, sizeof(fr->nospam)) != 0) return 1; addto_receivedlist(fr, source_pubkey); (*fr->handle_friendrequest)(source_pubkey, packet + 4, length - 4, fr->handle_friendrequest_userdata); return 0; }
static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length, void *userdata) { Friend_Requests *fr = (Friend_Requests *)object; if (length <= 1 + sizeof(fr->nospam) || length > ONION_CLIENT_MAX_DATA_SIZE) { return 1; } ++packet; --length; if (fr->handle_friendrequest_isset == 0) { return 1; } if (request_received(fr, source_pubkey)) { return 1; } if (memcmp(packet, &fr->nospam, sizeof(fr->nospam)) != 0) { return 1; } if (fr->filter_function) { if ((*fr->filter_function)(source_pubkey, fr->filter_function_userdata) != 0) { return 1; } } addto_receivedlist(fr, source_pubkey); uint32_t message_len = length - sizeof(fr->nospam); uint8_t message[message_len + 1]; memcpy(message, packet + sizeof(fr->nospam), message_len); message[sizeof(message) - 1] = 0; /* Be sure the message is null terminated. */ (*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata); return 0; }