summaryrefslogtreecommitdiff
path: root/toxcore/Messenger.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r--toxcore/Messenger.c82
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 */
1032int 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 */
1031static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t filenumber, uint32_t file_type, 1076static 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 */
1059long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_type, uint64_t filesize, 1109long 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;