diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-11-01 17:27:44 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-11-01 18:34:16 +0000 |
commit | 7b2aa8033044ef7c49303a4af4429b6a19b5421a (patch) | |
tree | 361b62be4ab2ddad787b065c3ebb0ab0078b17be | |
parent | 1a44c03aa82541f38ca91e92f6f568c26a86fc56 (diff) | |
download | telepathy-salut-7b2aa8033044ef7c49303a4af4429b6a19b5421a.tar.gz |
gibber_file_transfer_new_from_stanza and friends: raise a GError
-rw-r--r-- | lib/gibber/gibber-file-transfer.c | 10 | ||||
-rw-r--r-- | lib/gibber/gibber-file-transfer.h | 5 | ||||
-rw-r--r-- | lib/gibber/gibber-oob-file-transfer.c | 73 | ||||
-rw-r--r-- | lib/gibber/gibber-oob-file-transfer.h | 2 | ||||
-rw-r--r-- | src/salut-file-transfer-channel.c | 5 |
5 files changed, 76 insertions, 19 deletions
diff --git a/lib/gibber/gibber-file-transfer.c b/lib/gibber/gibber-file-transfer.c index bbd89037..5fd49a57 100644 --- a/lib/gibber/gibber-file-transfer.c +++ b/lib/gibber/gibber-file-transfer.c @@ -355,14 +355,15 @@ GibberFileTransfer * gibber_file_transfer_new_from_stanza_with_from ( GibberXmppStanza *stanza, GibberXmppConnection *connection, - const gchar *from) + const gchar *from, + GError **error) { /* FIXME put the known backends in a list and stop when the first one * can handle the stanza */ GibberFileTransfer *ft; ft = gibber_oob_file_transfer_new_from_stanza_with_from (stanza, connection, - from); + from, error); /* it's not possible to have an outgoing transfer created from * a stanza */ g_assert (ft == NULL || @@ -373,14 +374,15 @@ gibber_file_transfer_new_from_stanza_with_from ( GibberFileTransfer * gibber_file_transfer_new_from_stanza (GibberXmppStanza *stanza, - GibberXmppConnection *connection) + GibberXmppConnection *connection, + GError **error) { const gchar *from; from = wocky_node_get_attribute (wocky_stanza_get_top_node (stanza), "from"); return gibber_file_transfer_new_from_stanza_with_from (stanza, connection, - from); + from, error); } void diff --git a/lib/gibber/gibber-file-transfer.h b/lib/gibber/gibber-file-transfer.h index 07acc6a0..65d985b9 100644 --- a/lib/gibber/gibber-file-transfer.h +++ b/lib/gibber/gibber-file-transfer.h @@ -106,10 +106,11 @@ GType gibber_file_transfer_get_type (void); gboolean gibber_file_transfer_is_file_offer (GibberXmppStanza *stanza); GibberFileTransfer *gibber_file_transfer_new_from_stanza ( - GibberXmppStanza *stanza, GibberXmppConnection *connection); + GibberXmppStanza *stanza, GibberXmppConnection *connection, + GError **error); GibberFileTransfer *gibber_file_transfer_new_from_stanza_with_from ( GibberXmppStanza *stanza, GibberXmppConnection *connection, - const gchar *from); + const gchar *from, GError **error); void gibber_file_transfer_offer (GibberFileTransfer *self); void gibber_file_transfer_send (GibberFileTransfer *self, GIOChannel *src); diff --git a/lib/gibber/gibber-oob-file-transfer.c b/lib/gibber/gibber-oob-file-transfer.c index dc68da5c..0dba39ec 100644 --- a/lib/gibber/gibber-oob-file-transfer.c +++ b/lib/gibber/gibber-oob-file-transfer.c @@ -178,7 +178,8 @@ GibberFileTransfer * gibber_oob_file_transfer_new_from_stanza_with_from ( GibberXmppStanza *stanza, GibberXmppConnection *connection, - const gchar *peer_id) + const gchar *peer_id, + GError **error) { WockyNode *node = wocky_stanza_get_top_node (stanza); GibberOobFileTransfer *self; @@ -196,32 +197,80 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( gchar *filename; if (strcmp (node->name, "iq") != 0) - return NULL; + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "Not an IQ: %s", node->name); + return NULL; + } self_id = gibber_xmpp_node_get_attribute (node, "to"); - if (peer_id == NULL || self_id == NULL) - return NULL; + + if (peer_id == NULL) + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "No 'from' attribute"); + return NULL; + } + + if (self_id == NULL) + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "No 'to' attribute"); + return NULL; + } type = gibber_xmpp_node_get_attribute (node, "type"); + if (type == NULL || strcmp (type, "set") != 0) - return NULL; + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "type != 'set': '%s'", (type == NULL ? "(null)" : type)); + return NULL; + } id = gibber_xmpp_node_get_attribute (node, "id"); + if (id == NULL) - return NULL; + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "no 'id' attribute"); + return NULL; + } query = gibber_xmpp_node_get_child (node, "query"); + if (query == NULL) - return NULL; + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "no <query> node"); + return NULL; + } url_node = gibber_xmpp_node_get_child (query, "url"); - if (url_node == NULL || url_node->content == NULL) - return NULL; + + if (url_node == NULL) + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "no <query><url> node"); + return NULL; + } + + if (url_node->content == NULL) + { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "<query><url> node has no content"); + return NULL; + } ft_type = gibber_xmpp_node_get_attribute (url_node, "type"); + if (ft_type != NULL && gibber_strdiff (ft_type, "file")) - /* We don't support directory transfer */ - return NULL; + { + /* We don't support directory transfer */ + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "<url> has a 'type' attribute other than 'file': '%s'", ft_type); + return NULL; + } /* The file name is extracted from the address */ url = g_strdup (url_node->content); @@ -229,6 +278,8 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( filename = g_strrstr (url, "/"); if (filename == NULL) { + g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, + "<url> has no '/': '%s'", url); g_free (url); return NULL; } diff --git a/lib/gibber/gibber-oob-file-transfer.h b/lib/gibber/gibber-oob-file-transfer.h index cec77141..b8ec34ad 100644 --- a/lib/gibber/gibber-oob-file-transfer.h +++ b/lib/gibber/gibber-oob-file-transfer.h @@ -64,7 +64,7 @@ gboolean gibber_oob_file_transfer_is_file_offer (GibberXmppStanza *stanza); GibberFileTransfer *gibber_oob_file_transfer_new_from_stanza_with_from ( GibberXmppStanza *stanza, GibberXmppConnection *connection, - const gchar *from); + const gchar *from, GError **error); G_END_DECLS diff --git a/src/salut-file-transfer-channel.c b/src/salut-file-transfer-channel.c index 90c73348..92f3bae7 100644 --- a/src/salut-file-transfer-channel.c +++ b/src/salut-file-transfer-channel.c @@ -1559,20 +1559,23 @@ salut_file_transfer_channel_new_from_stanza (SalutConnection *connection, GibberXmppStanza *stanza, GibberXmppConnection *conn) { + GError *error = NULL; GibberFileTransfer *ft; SalutFileTransferChannel *chan; salut_xmpp_connection_manager_take_connection (xcm , conn); - ft = gibber_file_transfer_new_from_stanza (stanza, conn); + ft = gibber_file_transfer_new_from_stanza (stanza, conn, &error); if (ft == NULL) { /* Reply with an error */ GibberXmppStanza *reply; + DEBUG ("%s", error->message); reply = gibber_iq_helper_new_error_reply (stanza, XMPP_ERROR_BAD_REQUEST, "failed to parse file offer"); gibber_xmpp_connection_send (conn, reply, NULL); + g_clear_error (&error); return NULL; } |