diff options
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r-- | toxcore/Messenger.c | 82 |
1 files changed, 66 insertions, 16 deletions
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index 911c92da..39572dd0 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -1023,13 +1023,58 @@ void callback_file_reqchunk(Messenger *m, void (*function)(Messenger *m, uint32_ | |||
1023 | 1023 | ||
1024 | #define MAX_FILENAME_LENGTH 255 | 1024 | #define MAX_FILENAME_LENGTH 255 |
1025 | 1025 | ||
1026 | /* Copy the file transfer file id to file_id | ||
1027 | * | ||
1028 | * return 0 on success. | ||
1029 | * return -1 if friend not valid. | ||
1030 | * return -2 if filenumber not valid | ||
1031 | */ | ||
1032 | int file_get_id(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uint8_t *file_id) | ||
1033 | { | ||
1034 | if (friend_not_valid(m, friendnumber)) | ||
1035 | return -1; | ||
1036 | |||
1037 | if (m->friendlist[friendnumber].status != FRIEND_ONLINE) | ||
1038 | return -2; | ||
1039 | |||
1040 | uint32_t temp_filenum; | ||
1041 | uint8_t send_receive, file_number; | ||
1042 | |||
1043 | if (filenumber >= (1 << 16)) { | ||
1044 | send_receive = 1; | ||
1045 | temp_filenum = (filenumber >> 16) - 1; | ||
1046 | } else { | ||
1047 | send_receive = 0; | ||
1048 | temp_filenum = filenumber; | ||
1049 | } | ||
1050 | |||
1051 | if (temp_filenum >= MAX_CONCURRENT_FILE_PIPES) | ||
1052 | return -2; | ||
1053 | |||
1054 | file_number = temp_filenum; | ||
1055 | |||
1056 | struct File_Transfers *ft; | ||
1057 | |||
1058 | if (send_receive) { | ||
1059 | ft = &m->friendlist[friendnumber].file_receiving[file_number]; | ||
1060 | } else { | ||
1061 | ft = &m->friendlist[friendnumber].file_sending[file_number]; | ||
1062 | } | ||
1063 | |||
1064 | if (ft->status == FILESTATUS_NONE) | ||
1065 | return -2; | ||
1066 | |||
1067 | memcpy(file_id, ft->id, FILE_ID_LENGTH); | ||
1068 | return 0; | ||
1069 | } | ||
1070 | |||
1026 | /* Send a file send request. | 1071 | /* Send a file send request. |
1027 | * Maximum filename length is 255 bytes. | 1072 | * Maximum filename length is 255 bytes. |
1028 | * return 1 on success | 1073 | * return 1 on success |
1029 | * return 0 on failure | 1074 | * return 0 on failure |
1030 | */ | 1075 | */ |
1031 | static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t filenumber, uint32_t file_type, | 1076 | static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t filenumber, uint32_t file_type, |
1032 | uint64_t filesize, const uint8_t *filename, uint16_t filename_length) | 1077 | uint64_t filesize, const uint8_t *file_id, const uint8_t *filename, uint16_t filename_length) |
1033 | { | 1078 | { |
1034 | if (friend_not_valid(m, friendnumber)) | 1079 | if (friend_not_valid(m, friendnumber)) |
1035 | return 0; | 1080 | return 0; |
@@ -1037,13 +1082,18 @@ static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t fi | |||
1037 | if (filename_length > MAX_FILENAME_LENGTH) | 1082 | if (filename_length > MAX_FILENAME_LENGTH) |
1038 | return 0; | 1083 | return 0; |
1039 | 1084 | ||
1040 | uint8_t packet[1 + sizeof(file_type) + sizeof(filesize) + filename_length]; | 1085 | uint8_t packet[1 + sizeof(file_type) + sizeof(filesize) + FILE_ID_LENGTH + filename_length]; |
1041 | packet[0] = filenumber; | 1086 | packet[0] = filenumber; |
1042 | file_type = htonl(file_type); | 1087 | file_type = htonl(file_type); |
1043 | memcpy(packet + 1, &file_type, sizeof(file_type)); | 1088 | memcpy(packet + 1, &file_type, sizeof(file_type)); |
1044 | host_to_net((uint8_t *)&filesize, sizeof(filesize)); | 1089 | host_to_net((uint8_t *)&filesize, sizeof(filesize)); |
1045 | memcpy(packet + 1 + sizeof(file_type), &filesize, sizeof(filesize)); | 1090 | memcpy(packet + 1 + sizeof(file_type), &filesize, sizeof(filesize)); |
1046 | memcpy(packet + 1 + sizeof(file_type) + sizeof(filesize), filename, filename_length); | 1091 | memcpy(packet + 1 + sizeof(file_type) + sizeof(filesize), file_id, FILE_ID_LENGTH); |
1092 | |||
1093 | if (filename_length) { | ||
1094 | memcpy(packet + 1 + sizeof(file_type) + sizeof(filesize) + FILE_ID_LENGTH, filename, filename_length); | ||
1095 | } | ||
1096 | |||
1047 | return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_SENDREQUEST, packet, sizeof(packet), 0); | 1097 | return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_SENDREQUEST, packet, sizeof(packet), 0); |
1048 | } | 1098 | } |
1049 | 1099 | ||
@@ -1057,7 +1107,7 @@ static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t fi | |||
1057 | * | 1107 | * |
1058 | */ | 1108 | */ |
1059 | long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_type, uint64_t filesize, | 1109 | long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_type, uint64_t filesize, |
1060 | const uint8_t *filename, uint16_t filename_length) | 1110 | const uint8_t *file_id, const uint8_t *filename, uint16_t filename_length) |
1061 | { | 1111 | { |
1062 | if (friend_not_valid(m, friendnumber)) | 1112 | if (friend_not_valid(m, friendnumber)) |
1063 | return -1; | 1113 | return -1; |
@@ -1078,7 +1128,7 @@ long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_ | |||
1078 | if (i == MAX_CONCURRENT_FILE_PIPES) | 1128 | if (i == MAX_CONCURRENT_FILE_PIPES) |
1079 | return -3; | 1129 | return -3; |
1080 | 1130 | ||
1081 | if (file_sendrequest(m, friendnumber, i, file_type, filesize, filename, filename_length) == 0) | 1131 | if (file_sendrequest(m, friendnumber, i, file_type, filesize, file_id, filename, filename_length) == 0) |
1082 | return -4; | 1132 | return -4; |
1083 | 1133 | ||
1084 | struct File_Transfers *ft = &m->friendlist[friendnumber].file_sending[i]; | 1134 | struct File_Transfers *ft = &m->friendlist[friendnumber].file_sending[i]; |
@@ -1088,6 +1138,7 @@ long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_ | |||
1088 | ft->requested = 0; | 1138 | ft->requested = 0; |
1089 | ft->slots_allocated = 0; | 1139 | ft->slots_allocated = 0; |
1090 | ft->paused = FILE_PAUSE_NOT; | 1140 | ft->paused = FILE_PAUSE_NOT; |
1141 | memcpy(ft->id, file_id, FILE_ID_LENGTH); | ||
1091 | 1142 | ||
1092 | ++m->friendlist[friendnumber].num_sending_files; | 1143 | ++m->friendlist[friendnumber].num_sending_files; |
1093 | 1144 | ||
@@ -1932,9 +1983,9 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len) | |||
1932 | } | 1983 | } |
1933 | 1984 | ||
1934 | case PACKET_ID_FILE_SENDREQUEST: { | 1985 | case PACKET_ID_FILE_SENDREQUEST: { |
1935 | const unsigned int head_length = 1 + sizeof(uint32_t) + sizeof(uint64_t); | 1986 | const unsigned int head_length = 1 + sizeof(uint32_t) + sizeof(uint64_t) + FILE_ID_LENGTH; |
1936 | 1987 | ||
1937 | if (data_length < head_length + 1) | 1988 | if (data_length < head_length) |
1938 | break; | 1989 | break; |
1939 | 1990 | ||
1940 | uint8_t filenumber = data[0]; | 1991 | uint8_t filenumber = data[0]; |
@@ -1944,16 +1995,15 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len) | |||
1944 | memcpy(&file_type, data + 1, sizeof(file_type)); | 1995 | memcpy(&file_type, data + 1, sizeof(file_type)); |
1945 | file_type = ntohl(file_type); | 1996 | file_type = ntohl(file_type); |
1946 | 1997 | ||
1947 | /* Check if the name is the right size if file is avatar. */ | ||
1948 | if (file_type == FILEKIND_AVATAR && filename_length != crypto_hash_sha256_BYTES) | ||
1949 | break; | ||
1950 | |||
1951 | memcpy(&filesize, data + 1 + sizeof(uint32_t), sizeof(filesize)); | 1998 | memcpy(&filesize, data + 1 + sizeof(uint32_t), sizeof(filesize)); |
1952 | net_to_host((uint8_t *) &filesize, sizeof(filesize)); | 1999 | net_to_host((uint8_t *) &filesize, sizeof(filesize)); |
1953 | m->friendlist[i].file_receiving[filenumber].status = FILESTATUS_NOT_ACCEPTED; | 2000 | struct File_Transfers *ft = &m->friendlist[i].file_receiving[filenumber]; |
1954 | m->friendlist[i].file_receiving[filenumber].size = filesize; | 2001 | |
1955 | m->friendlist[i].file_receiving[filenumber].transferred = 0; | 2002 | ft->status = FILESTATUS_NOT_ACCEPTED; |
1956 | m->friendlist[i].file_receiving[filenumber].paused = FILE_PAUSE_NOT; | 2003 | ft->size = filesize; |
2004 | ft->transferred = 0; | ||
2005 | ft->paused = FILE_PAUSE_NOT; | ||
2006 | memcpy(ft->id, data + 1 + sizeof(uint32_t) + sizeof(uint64_t), FILE_ID_LENGTH); | ||
1957 | 2007 | ||
1958 | /* Force NULL terminate file name. */ | 2008 | /* Force NULL terminate file name. */ |
1959 | uint8_t filename_terminated[filename_length + 1]; | 2009 | uint8_t filename_terminated[filename_length + 1]; |
@@ -1965,7 +2015,7 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len) | |||
1965 | real_filenumber <<= 16; | 2015 | real_filenumber <<= 16; |
1966 | 2016 | ||
1967 | if (m->file_sendrequest) | 2017 | if (m->file_sendrequest) |
1968 | (*m->file_sendrequest)(m, i, real_filenumber, file_type, filesize, filename_terminated, filename_length, | 2018 | (*m->file_sendrequest)(m, i, real_filenumber, file_type, filesize, filename, filename_length, |
1969 | m->file_sendrequest_userdata); | 2019 | m->file_sendrequest_userdata); |
1970 | 2020 | ||
1971 | break; | 2021 | break; |