Fri, 06 Nov 2009 08:39:49 +0000
jabber: Convert to purple_debug_* convenience functions.
| 7170 | 1 | /* |
| 15884 | 2 | * purple - Jabber Protocol Plugin |
| 7170 | 3 | * |
|
28322
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28206
diff
changeset
|
4 | * Purple is the legal property of its developers, whose names are too numerous |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28206
diff
changeset
|
5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28206
diff
changeset
|
6 | * source distribution. |
| 7170 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
15884
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7170 | 21 | * |
| 22 | */ | |
| 23 | #include "internal.h" | |
| 7234 | 24 | #include "debug.h" |
| 7170 | 25 | #include "ft.h" |
| 26 | #include "util.h" | |
| 27 | ||
| 28 | #include "jabber.h" | |
| 29 | #include "iq.h" | |
|
12324
caf9784f2405
[gaim-migrate @ 14628]
Richard Laager <rlaager@pidgin.im>
parents:
12323
diff
changeset
|
30 | #include "oob.h" |
| 7170 | 31 | |
| 32 | typedef struct _JabberOOBXfer { | |
| 33 | char *address; | |
| 34 | int port; | |
| 35 | char *page; | |
| 36 | ||
| 37 | GString *headers; | |
| 38 | ||
| 39 | char *iq_id; | |
| 40 | ||
| 41 | JabberStream *js; | |
| 42 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
43 | gchar *write_buffer; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
44 | gsize written_len; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
45 | guint writeh; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
46 | |
| 7170 | 47 | } JabberOOBXfer; |
| 48 | ||
| 15884 | 49 | static void jabber_oob_xfer_init(PurpleXfer *xfer) |
| 7170 | 50 | { |
| 51 | JabberOOBXfer *jox = xfer->data; | |
| 15884 | 52 | purple_xfer_start(xfer, -1, jox->address, jox->port); |
| 7170 | 53 | } |
| 54 | ||
| 15884 | 55 | static void jabber_oob_xfer_free(PurpleXfer *xfer) |
| 7170 | 56 | { |
| 57 | JabberOOBXfer *jox = xfer->data; | |
| 7395 | 58 | jox->js->oob_file_transfers = g_list_remove(jox->js->oob_file_transfers, |
| 59 | xfer); | |
| 7170 | 60 | |
| 61 | g_string_free(jox->headers, TRUE); | |
| 62 | g_free(jox->address); | |
| 63 | g_free(jox->page); | |
| 64 | g_free(jox->iq_id); | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
65 | g_free(jox->write_buffer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
66 | if(jox->writeh) |
| 15884 | 67 | purple_input_remove(jox->writeh); |
| 7170 | 68 | g_free(jox); |
| 69 | ||
| 70 | xfer->data = NULL; | |
| 71 | } | |
| 72 | ||
| 15884 | 73 | static void jabber_oob_xfer_end(PurpleXfer *xfer) |
| 7170 | 74 | { |
| 75 | JabberOOBXfer *jox = xfer->data; | |
| 76 | JabberIq *iq; | |
| 77 | ||
| 78 | iq = jabber_iq_new(jox->js, JABBER_IQ_RESULT); | |
| 79 | xmlnode_set_attrib(iq->node, "to", xfer->who); | |
| 80 | jabber_iq_set_id(iq, jox->iq_id); | |
| 81 | ||
| 82 | jabber_iq_send(iq); | |
| 83 | ||
| 84 | jabber_oob_xfer_free(xfer); | |
| 85 | } | |
| 86 | ||
| 15884 | 87 | static void jabber_oob_xfer_request_send(gpointer data, gint source, PurpleInputCondition cond) { |
| 88 | PurpleXfer *xfer = data; | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
89 | JabberOOBXfer *jox = xfer->data; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
90 | int len, total_len = strlen(jox->write_buffer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
91 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
92 | len = write(xfer->fd, jox->write_buffer + jox->written_len, |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
93 | total_len - jox->written_len); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
94 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
95 | if(len < 0 && errno == EAGAIN) |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
96 | return; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
97 | else if(len < 0) { |
|
28828
7c1855f037e7
jabber: Convert to purple_debug_* convenience functions.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
98 | purple_debug_error("jabber", "Write error on oob xfer!\n"); |
| 15884 | 99 | purple_input_remove(jox->writeh); |
| 100 | purple_xfer_cancel_local(xfer); | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
101 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
102 | jox->written_len += len; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
103 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
104 | if(jox->written_len == total_len) { |
| 15884 | 105 | purple_input_remove(jox->writeh); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
106 | g_free(jox->write_buffer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
107 | jox->write_buffer = NULL; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
108 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
109 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
110 | |
| 15884 | 111 | static void jabber_oob_xfer_start(PurpleXfer *xfer) |
| 7170 | 112 | { |
| 113 | JabberOOBXfer *jox = xfer->data; | |
| 114 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
115 | if(jox->write_buffer == NULL) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
116 | jox->write_buffer = g_strdup_printf( |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
117 | "GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", |
| 7170 | 118 | jox->page, jox->address); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
119 | jox->written_len = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
120 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
121 | |
| 15884 | 122 | jox->writeh = purple_input_add(xfer->fd, PURPLE_INPUT_WRITE, |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
123 | jabber_oob_xfer_request_send, xfer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
124 | |
| 15884 | 125 | jabber_oob_xfer_request_send(xfer, xfer->fd, PURPLE_INPUT_WRITE); |
| 7170 | 126 | } |
| 127 | ||
| 15884 | 128 | static gssize jabber_oob_xfer_read(guchar **buffer, PurpleXfer *xfer) { |
| 7170 | 129 | JabberOOBXfer *jox = xfer->data; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
130 | char test[2048]; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
131 | char *tmp, *lenstr; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
132 | int len; |
| 7170 | 133 | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
134 | if((len = read(xfer->fd, test, sizeof(test))) > 0) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
135 | jox->headers = g_string_append_len(jox->headers, test, len); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
136 | if((tmp = strstr(jox->headers->str, "\r\n\r\n"))) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
137 | *tmp = '\0'; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
138 | lenstr = strstr(jox->headers->str, "Content-Length: "); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
139 | if(lenstr) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
140 | int size; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
141 | sscanf(lenstr, "Content-Length: %d", &size); |
| 15884 | 142 | purple_xfer_set_size(xfer, size); |
| 7170 | 143 | } |
| 15884 | 144 | purple_xfer_set_read_fnc(xfer, NULL); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
145 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
146 | tmp += 4; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
147 | |
|
14697
518c0fae208e
[gaim-migrate @ 17381]
Daniel Atallah <datallah@pidgin.im>
parents:
14356
diff
changeset
|
148 | *buffer = (unsigned char*) g_strdup(tmp); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
149 | return strlen(tmp); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
150 | } |
| 7170 | 151 | return 0; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
152 | } else if (errno != EAGAIN) { |
|
28828
7c1855f037e7
jabber: Convert to purple_debug_* convenience functions.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
153 | purple_debug_error("jabber", "Read error on oob xfer!\n"); |
| 15884 | 154 | purple_xfer_cancel_local(xfer); |
| 7170 | 155 | } |
| 7234 | 156 | |
| 7170 | 157 | return 0; |
| 158 | } | |
| 159 | ||
| 15884 | 160 | static void jabber_oob_xfer_recv_error(PurpleXfer *xfer, const char *code) { |
| 7170 | 161 | JabberOOBXfer *jox = xfer->data; |
| 162 | JabberIq *iq; | |
| 8399 | 163 | xmlnode *y, *z; |
| 7170 | 164 | |
| 165 | iq = jabber_iq_new(jox->js, JABBER_IQ_ERROR); | |
| 166 | xmlnode_set_attrib(iq->node, "to", xfer->who); | |
| 167 | jabber_iq_set_id(iq, jox->iq_id); | |
| 168 | y = xmlnode_new_child(iq->node, "error"); | |
| 8399 | 169 | xmlnode_set_attrib(y, "code", code); |
| 170 | if(!strcmp(code, "406")) { | |
| 171 | z = xmlnode_new_child(y, "not-acceptable"); | |
| 172 | xmlnode_set_attrib(y, "type", "modify"); | |
| 13808 | 173 | xmlnode_set_namespace(z, "urn:ietf:params:xml:ns:xmpp-stanzas"); |
| 8399 | 174 | } else if(!strcmp(code, "404")) { |
| 175 | z = xmlnode_new_child(y, "not-found"); | |
| 176 | xmlnode_set_attrib(y, "type", "cancel"); | |
| 13808 | 177 | xmlnode_set_namespace(z, "urn:ietf:params:xml:ns:xmpp-stanzas"); |
| 8399 | 178 | } |
| 7170 | 179 | jabber_iq_send(iq); |
| 180 | ||
| 181 | jabber_oob_xfer_free(xfer); | |
| 182 | } | |
| 183 | ||
| 15884 | 184 | static void jabber_oob_xfer_recv_denied(PurpleXfer *xfer) { |
| 8399 | 185 | jabber_oob_xfer_recv_error(xfer, "406"); |
| 186 | } | |
| 187 | ||
| 15884 | 188 | static void jabber_oob_xfer_recv_canceled(PurpleXfer *xfer) { |
| 8399 | 189 | jabber_oob_xfer_recv_error(xfer, "404"); |
| 190 | } | |
| 191 | ||
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
192 | void jabber_oob_parse(JabberStream *js, const char *from, JabberIqType type, |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
193 | const char *id, xmlnode *querynode) { |
| 7170 | 194 | JabberOOBXfer *jox; |
| 15884 | 195 | PurpleXfer *xfer; |
| 7170 | 196 | char *filename; |
| 197 | char *url; | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
198 | xmlnode *urlnode; |
| 7170 | 199 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
200 | if(type != JABBER_IQ_SET) |
| 14356 | 201 | return; |
| 202 | ||
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
203 | if(!from) |
| 7170 | 204 | return; |
| 205 | ||
| 206 | if(!(urlnode = xmlnode_get_child(querynode, "url"))) | |
| 207 | return; | |
| 208 | ||
| 209 | url = xmlnode_get_data(urlnode); | |
| 210 | ||
| 211 | jox = g_new0(JabberOOBXfer, 1); | |
|
28206
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
212 | if (!purple_url_parse(url, &jox->address, &jox->port, &jox->page, NULL, NULL)) { |
|
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
213 | g_free(url); |
|
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
214 | return; |
|
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
215 | } |
| 7170 | 216 | g_free(url); |
| 217 | jox->js = js; | |
| 218 | jox->headers = g_string_new(""); | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
219 | jox->iq_id = g_strdup(id); |
| 7170 | 220 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
221 | xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE, from); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
222 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
223 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
224 | xfer->data = jox; |
| 7170 | 225 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
226 | if(!(filename = g_strdup(g_strrstr(jox->page, "/")))) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
227 | filename = g_strdup(jox->page); |
| 7170 | 228 | |
| 15884 | 229 | purple_xfer_set_filename(xfer, filename); |
| 7170 | 230 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
231 | g_free(filename); |
| 7170 | 232 | |
| 15884 | 233 | purple_xfer_set_init_fnc(xfer, jabber_oob_xfer_init); |
| 234 | purple_xfer_set_end_fnc(xfer, jabber_oob_xfer_end); | |
| 235 | purple_xfer_set_request_denied_fnc(xfer, jabber_oob_xfer_recv_denied); | |
| 236 | purple_xfer_set_cancel_recv_fnc(xfer, jabber_oob_xfer_recv_canceled); | |
| 237 | purple_xfer_set_read_fnc(xfer, jabber_oob_xfer_read); | |
| 238 | purple_xfer_set_start_fnc(xfer, jabber_oob_xfer_start); | |
| 7170 | 239 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
240 | js->oob_file_transfers = g_list_append(js->oob_file_transfers, xfer); |
| 7170 | 241 | |
| 15884 | 242 | purple_xfer_request(xfer); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
243 | } |
| 7170 | 244 | } |
| 245 | ||
| 246 |