150 } |
150 } |
151 |
151 |
152 // check if the md5 hash is valid ([a-fA-F0-9){32}) |
152 // check if the md5 hash is valid ([a-fA-F0-9){32}) |
153 if (ft->hash != NULL && (strlen(ft->hash) != 32 || !is_md5_hash(ft->hash))) { |
153 if (ft->hash != NULL && (strlen(ft->hash) != 32 || !is_md5_hash(ft->hash))) { |
154 g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE, |
154 g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE, |
155 "the offered file has an invalid filename"); |
155 "the offered file has an invalid hash"); |
156 g_free(ft->name); |
156 g_free(ft->name); |
157 g_free(ft); |
157 g_free(ft); |
158 return NULL; |
158 return NULL; |
159 } |
159 } |
160 ft->hash = g_strndup(ft->hash, 32); |
160 ft->hash = g_strndup(ft->hash, 32); |
161 |
161 |
162 return (gconstpointer) ft; |
162 return (gconstpointer) ft; |
163 } |
163 } |
164 |
164 |
165 gboolean jingle_ft_handle(JingleAction action, gconstpointer data, LmMessageNode *node) |
165 gboolean jingle_ft_handle(JingleAction action, gconstpointer data, |
|
166 LmMessageNode *node) |
166 { |
167 { |
167 if (action == JINGLE_SESSION_INFO) { |
168 if (action == JINGLE_SESSION_INFO) { |
168 if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"), NS_JINGLE_APP_FT_INFO) |
169 if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"), |
|
170 NS_JINGLE_APP_FT_INFO) |
169 && !g_strcmp0(node->name, "hash")) { |
171 && !g_strcmp0(node->name, "hash")) { |
170 ((JingleFT *)data)->hash = lm_message_node_get_value(node); |
172 ((JingleFT *)data)->hash = g_strdup(lm_message_node_get_value(node)); |
171 return TRUE; |
173 return TRUE; |
172 } |
174 } |
173 return FALSE; |
175 return FALSE; |
174 } |
176 } |
175 return FALSE; |
177 return FALSE; |
274 session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING); |
276 session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING); |
275 |
277 |
276 jft->desc = g_strdup(args[0]); |
278 jft->desc = g_strdup(args[0]); |
277 jft->type = JINGLE_FT_OFFER; |
279 jft->type = JINGLE_FT_OFFER; |
278 jft->name = g_path_get_basename(filename); |
280 jft->name = g_path_get_basename(filename); |
|
281 // TODO: Transform date to a good format (ios8601) |
279 jft->date = fileinfo.st_mtime; |
282 jft->date = fileinfo.st_mtime; |
280 jft->size = fileinfo.st_size; |
283 jft->size = fileinfo.st_size; |
281 jft->outfile = g_io_channel_new_file (filename, "r", NULL); |
284 jft->outfile = g_io_channel_new_file (filename, "r", NULL); |
282 if (jft->outfile == NULL) { |
285 if (jft->outfile == NULL) { |
283 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot open file %s", args[1]); |
286 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot open file %s", args[1]); |
433 // When we got a session-terminate |
436 // When we got a session-terminate |
434 void jingle_ft_stop(gconstpointer data) |
437 void jingle_ft_stop(gconstpointer data) |
435 { |
438 { |
436 JingleFT *jft = (JingleFT*)data; |
439 JingleFT *jft = (JingleFT*)data; |
437 |
440 |
438 if (jft->hash != NULL) { |
441 if (jft->hash != NULL && jft->md5 != NULL) { |
439 if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) { |
442 if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) { |
440 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File corrupt (%s)", jft->name); |
443 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File corrupt (%s)", jft->name); |
441 } else { |
444 } else { |
442 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) and verified", jft->name); |
445 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) and verified", jft->name); |
443 } |
446 } |
445 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) but not verified", jft->name); |
448 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) but not verified", jft->name); |
446 } |
449 } |
447 |
450 |
448 g_checksum_free(jft->md5); |
451 g_checksum_free(jft->md5); |
449 |
452 |
450 g_io_channel_flush(jft->outfile, NULL); |
453 if (jft->outfile != NULL) { |
451 |
454 g_io_channel_flush(jft->outfile, NULL); |
452 g_io_channel_unref(jft->outfile); |
455 |
|
456 g_io_channel_unref(jft->outfile); |
|
457 } |
453 } |
458 } |
454 |
459 |
455 static void jingle_ft_init(void) |
460 static void jingle_ft_init(void) |
456 { |
461 { |
457 jingle_register_app(NS_JINGLE_APP_FT, &funcs, JINGLE_TRANSPORT_STREAMING); |
462 jingle_register_app(NS_JINGLE_APP_FT, &funcs, JINGLE_TRANSPORT_STREAMING); |