Mercurial > pidgin.yaz
annotate src/protocols/yahoo/yahoo.c @ 13849:8d1c55309e3c
[gaim-migrate @ 16306]
Keep track of the Yahoo! IMVironment specified by the people we're
IMing with. When we reply to their IMs, we now send the same IMVironment
instead of always sending an empty IMVironment because sending an
empty IMVironment would reset their IMVironment back to nothing.
This shouldn't negatively affect the Doodle stuff... but it didn't
work for me when I tested it, so it's hard to tell.
This is a change I made while at Meebo
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 22 Jun 2006 06:26:38 +0000 |
parents | a9ff4499d9ce |
children | b5ff22440a5b |
rev | line source |
---|---|
2681 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
2681 | 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 | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
9369 | 23 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
24 #include "internal.h" |
2681 | 25 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
26 #include "account.h" |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
27 #include "accountopt.h" |
6760 | 28 #include "blist.h" |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
29 #include "cipher.h" |
10119 | 30 #include "cmds.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
31 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
32 #include "notify.h" |
6760 | 33 #include "privacy.h" |
2681 | 34 #include "prpl.h" |
35 #include "proxy.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
36 #include "request.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
37 #include "server.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
38 #include "util.h" |
9943 | 39 #include "version.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
40 |
6513 | 41 #include "yahoo.h" |
6729 | 42 #include "yahoochat.h" |
8349 | 43 #include "yahoo_auth.h" |
12417
d30c0a7a5619
[gaim-migrate @ 14724]
Richard Laager <rlaager@wiktel.com>
parents:
12378
diff
changeset
|
44 #include "yahoo_crypt.h" |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
45 #include "yahoo_doodle.h" |
12417
d30c0a7a5619
[gaim-migrate @ 14724]
Richard Laager <rlaager@wiktel.com>
parents:
12378
diff
changeset
|
46 #include "yahoo_filexfer.h" |
d30c0a7a5619
[gaim-migrate @ 14724]
Richard Laager <rlaager@wiktel.com>
parents:
12378
diff
changeset
|
47 #include "yahoo_friend.h" |
d30c0a7a5619
[gaim-migrate @ 14724]
Richard Laager <rlaager@wiktel.com>
parents:
12378
diff
changeset
|
48 #include "yahoo_packet.h" |
d30c0a7a5619
[gaim-migrate @ 14724]
Richard Laager <rlaager@wiktel.com>
parents:
12378
diff
changeset
|
49 #include "yahoo_picture.h" |
d30c0a7a5619
[gaim-migrate @ 14724]
Richard Laager <rlaager@wiktel.com>
parents:
12378
diff
changeset
|
50 #include "ycht.h" |
2795
536bb833fdeb
[gaim-migrate @ 2808]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2786
diff
changeset
|
51 |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
52 /* #define YAHOO_DEBUG */ |
2681 | 53 |
9285 | 54 static void yahoo_add_buddy(GaimConnection *gc, GaimBuddy *, GaimGroup *); |
9410 | 55 static void yahoo_login_page_cb(void *user_data, const char *buf, size_t len); |
11653 | 56 static void yahoo_set_status(GaimAccount *account, GaimStatus *status); |
9306 | 57 |
10937 | 58 static void |
59 yahoo_add_permit(GaimConnection *gc, const char *who) | |
60 { | |
61 gaim_debug_info("yahoo", | |
62 "Permitting ID %s local contact rights for account %s\n", who, gc->account); | |
63 gaim_privacy_permit_add(gc->account,who,TRUE); | |
64 } | |
65 | |
66 static void | |
67 yahoo_rem_permit(GaimConnection *gc, const char *who) | |
68 { | |
69 gaim_debug_info("yahoo", | |
70 "Denying ID %s local contact rights for account %s\n", who, gc->account); | |
71 gaim_privacy_permit_remove(gc->account,who,TRUE); | |
72 } | |
73 | |
74 gboolean yahoo_privacy_check(GaimConnection *gc, const char *who) | |
75 { | |
76 /* returns TRUE if allowed through, FALSE otherwise */ | |
11111
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
77 gboolean permitted; |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
78 |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
79 permitted = gaim_privacy_check(gc->account, who); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
80 |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
81 /* print some debug info */ |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
82 if (!permitted) { |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
83 char *deb = NULL; |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
84 switch (gc->account->perm_deny) |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
85 { |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
86 case GAIM_PRIVACY_DENY_ALL: |
11644 | 87 deb = "GAIM_PRIVACY_DENY_ALL"; |
88 break; | |
11111
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
89 case GAIM_PRIVACY_DENY_USERS: |
11644 | 90 deb = "GAIM_PRIVACY_DENY_USERS"; |
91 break; | |
11111
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
92 case GAIM_PRIVACY_ALLOW_BUDDYLIST: |
11644 | 93 deb = "GAIM_PRIVACY_ALLOW_BUDDYLIST"; |
94 break; | |
11111
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
95 } |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
96 if(deb) |
10937 | 97 gaim_debug_info("yahoo", |
11111
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
98 "%s blocked data received from %s (%s)\n", |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
99 gc->account->username,who, deb); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
100 } else if (gc->account->perm_deny == GAIM_PRIVACY_ALLOW_USERS) { |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
101 gaim_debug_info("yahoo", |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
102 "%s allowed data received from %s (GAIM_PRIVACY_ALLOW_USERS)\n", |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11109
diff
changeset
|
103 gc->account->username,who); |
10937 | 104 } |
105 | |
106 return permitted; | |
107 } | |
6784 | 108 |
9278 | 109 static void yahoo_update_status(GaimConnection *gc, const char *name, YahooFriend *f) |
6784 | 110 { |
9983 | 111 char *status = NULL; |
6840 | 112 |
6784 | 113 if (!gc || !name || !f || !gaim_find_buddy(gaim_connection_get_account(gc), name)) |
114 return; | |
115 | |
6840 | 116 if (f->status == YAHOO_STATUS_OFFLINE) |
11250 | 117 { |
118 return; | |
119 } | |
6840 | 120 |
9983 | 121 switch (f->status) { |
122 case YAHOO_STATUS_AVAILABLE: | |
10373 | 123 status = YAHOO_STATUS_TYPE_AVAILABLE; |
9983 | 124 break; |
125 case YAHOO_STATUS_BRB: | |
10373 | 126 status = YAHOO_STATUS_TYPE_BRB; |
9983 | 127 break; |
128 case YAHOO_STATUS_BUSY: | |
10373 | 129 status = YAHOO_STATUS_TYPE_BUSY; |
9983 | 130 break; |
131 case YAHOO_STATUS_NOTATHOME: | |
10373 | 132 status = YAHOO_STATUS_TYPE_NOTATHOME; |
9983 | 133 break; |
134 case YAHOO_STATUS_NOTATDESK: | |
10373 | 135 status = YAHOO_STATUS_TYPE_NOTATDESK; |
9983 | 136 break; |
137 case YAHOO_STATUS_NOTINOFFICE: | |
10373 | 138 status = YAHOO_STATUS_TYPE_NOTINOFFICE; |
9983 | 139 break; |
140 case YAHOO_STATUS_ONPHONE: | |
10373 | 141 status = YAHOO_STATUS_TYPE_ONPHONE; |
9983 | 142 break; |
143 case YAHOO_STATUS_ONVACATION: | |
10373 | 144 status = YAHOO_STATUS_TYPE_ONVACATION; |
9983 | 145 break; |
146 case YAHOO_STATUS_OUTTOLUNCH: | |
10373 | 147 status = YAHOO_STATUS_TYPE_OUTTOLUNCH; |
9983 | 148 break; |
149 case YAHOO_STATUS_STEPPEDOUT: | |
10373 | 150 status = YAHOO_STATUS_TYPE_STEPPEDOUT; |
9983 | 151 break; |
152 case YAHOO_STATUS_INVISIBLE: /* this should never happen? */ | |
10373 | 153 status = YAHOO_STATUS_TYPE_INVISIBLE; |
9983 | 154 break; |
155 case YAHOO_STATUS_CUSTOM: | |
13686
2d31d61f572c
[gaim-migrate @ 16089]
Richard Laager <rlaager@wiktel.com>
parents:
13558
diff
changeset
|
156 case YAHOO_STATUS_IDLE: |
9983 | 157 if (!f->away) |
11970 | 158 status = YAHOO_STATUS_TYPE_AVAILABLE; |
9983 | 159 else |
10373 | 160 status = YAHOO_STATUS_TYPE_AWAY; |
9983 | 161 break; |
162 default: | |
163 gaim_debug_warning("yahoo", "Warning, unknown status %d\n", f->status); | |
164 break; | |
165 } | |
166 | |
167 if (status) { | |
168 if (f->status == YAHOO_STATUS_CUSTOM) | |
169 gaim_prpl_got_user_status(gaim_connection_get_account(gc), name, status, "message", | |
170 yahoo_friend_get_status_message(f), NULL); | |
171 else | |
172 gaim_prpl_got_user_status(gaim_connection_get_account(gc), name, status, NULL); | |
173 } | |
174 | |
10141 | 175 if (f->idle != 0) |
10746 | 176 gaim_prpl_got_user_idle(gaim_connection_get_account(gc), name, TRUE, f->idle); |
10141 | 177 else |
10746 | 178 gaim_prpl_got_user_idle(gaim_connection_get_account(gc), name, FALSE, 0); |
6784 | 179 } |
180 | |
5583 | 181 static void yahoo_process_status(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 182 { |
9983 | 183 GaimAccount *account = gaim_connection_get_account(gc); |
2681 | 184 struct yahoo_data *yd = gc->proto_data; |
185 GSList *l = pkt->hash; | |
9278 | 186 YahooFriend *f = NULL; |
2681 | 187 char *name = NULL; |
6784 | 188 |
7892 | 189 if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) { |
8383 | 190 gc->wants_to_die = TRUE; |
10746 | 191 gaim_connection_error(gc, _("You have signed on from another location.")); |
7892 | 192 return; |
193 } | |
6686 | 194 |
2681 | 195 while (l) { |
196 struct yahoo_pair *pair = l->data; | |
197 | |
198 switch (pair->key) { | |
199 case 0: /* we won't actually do anything with this */ | |
200 break; | |
201 case 1: /* we don't get the full buddy list here. */ | |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
202 if (!yd->logged_in) { |
7664 | 203 gaim_connection_set_display_name(gc, pair->value); |
5583 | 204 gaim_connection_set_state(gc, GAIM_CONNECTED); |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
205 yd->logged_in = TRUE; |
9306 | 206 if (yd->picture_upload_todo) { |
207 yahoo_buddy_icon_upload(gc, yd->picture_upload_todo); | |
208 yd->picture_upload_todo = NULL; | |
209 } | |
11653 | 210 yahoo_set_status(account, gaim_account_get_active_status(account)); |
2681 | 211 |
3147 | 212 /* this requests the list. i have a feeling that this is very evil |
213 * | |
6686 | 214 * scs.yahoo.com sends you the list before this packet without it being |
3147 | 215 * requested |
216 * | |
217 * do_import(gc, NULL); | |
218 * newpkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YAHOO_STATUS_OFFLINE, 0); | |
10392 | 219 * yahoo_packet_send_and_free(newpkt, yd); |
3147 | 220 */ |
221 | |
222 } | |
2681 | 223 break; |
224 case 8: /* how many online buddies we have */ | |
225 break; | |
226 case 7: /* the current buddy */ | |
10553 | 227 if (name && f) /* update the previous buddy before changing the variables */ |
228 yahoo_update_status(gc, name, f); | |
2681 | 229 name = pair->value; |
9886 | 230 if (name && g_utf8_validate(name, -1, NULL)) |
231 f = yahoo_friend_find_or_new(gc, name); | |
9888 | 232 else { |
233 f = NULL; | |
234 name = NULL; | |
235 } | |
2681 | 236 break; |
237 case 10: /* state */ | |
6784 | 238 if (!f) |
239 break; | |
240 | |
241 f->status = strtol(pair->value, NULL, 10); | |
242 if ((f->status >= YAHOO_STATUS_BRB) && (f->status <= YAHOO_STATUS_STEPPEDOUT)) | |
243 f->away = 1; | |
244 else | |
245 f->away = 0; | |
10141 | 246 |
247 if (f->status == YAHOO_STATUS_IDLE) { | |
248 /* Idle may have already been set in a more precise way in case 137 */ | |
249 if (f->idle == 0) | |
250 f->idle = time(NULL); | |
251 } else | |
6804 | 252 f->idle = 0; |
10141 | 253 |
9283 | 254 if (f->status != YAHOO_STATUS_CUSTOM) |
255 yahoo_friend_set_status_message(f, NULL); | |
6847 | 256 |
257 f->sms = 0; | |
2681 | 258 break; |
259 case 19: /* custom message */ | |
9283 | 260 if (f) |
261 yahoo_friend_set_status_message(f, yahoo_string_decode(gc, pair->value, FALSE)); | |
2681 | 262 break; |
6686 | 263 case 11: /* this is the buddy's session id */ |
2681 | 264 break; |
265 case 17: /* in chat? */ | |
266 break; | |
6784 | 267 case 47: /* is custom status away or not? 2=idle*/ |
268 if (!f) | |
269 break; | |
8441 | 270 |
271 /* I have no idea what it means when this is | |
272 * set when someone's available, but it doesn't | |
273 * mean idle. */ | |
274 if (f->status == YAHOO_STATUS_AVAILABLE) | |
275 break; | |
10141 | 276 |
6784 | 277 f->away = strtol(pair->value, NULL, 10); |
10141 | 278 if (f->away == 2) { |
279 /* Idle may have already been set in a more precise way in case 137 */ | |
280 if (f->idle == 0) | |
281 f->idle = time(NULL); | |
282 } | |
283 | |
6686 | 284 break; |
6784 | 285 case 138: /* either we're not idle, or we are but won't say how long */ |
286 if (!f) | |
287 break; | |
288 | |
289 if (f->idle) | |
290 f->idle = -1; | |
291 break; | |
292 case 137: /* usually idle time in seconds, sometimes login time */ | |
293 if (!f) | |
294 break; | |
295 | |
296 if (f->status != YAHOO_STATUS_AVAILABLE) | |
297 f->idle = time(NULL) - strtol(pair->value, NULL, 10); | |
6686 | 298 break; |
299 case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */ | |
6784 | 300 if (strtol(pair->value, NULL, 10) == 0) { |
301 if (f) | |
302 f->status = YAHOO_STATUS_OFFLINE; | |
9983 | 303 gaim_prpl_got_user_status(account, name, "offline", NULL); |
2807
f01e6a425136
[gaim-migrate @ 2820]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2805
diff
changeset
|
304 break; |
2805
9b3c7d2a6e9a
[gaim-migrate @ 2818]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2795
diff
changeset
|
305 } |
6784 | 306 break; |
307 case 60: /* SMS */ | |
308 if (f) { | |
309 f->sms = strtol(pair->value, NULL, 10); | |
310 yahoo_update_status(gc, name, f); | |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
311 } |
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
312 break; |
9292 | 313 case 197: /* Avatars */ |
9277 | 314 { |
11137 | 315 guchar *decoded; |
11127 | 316 char *tmp; |
317 gsize len; | |
9277 | 318 |
319 if (pair->value) { | |
11127 | 320 decoded = gaim_base64_decode(pair->value, &len); |
9277 | 321 if (len) { |
322 tmp = gaim_str_binary_to_ascii(decoded, len); | |
323 gaim_debug_info("yahoo", "Got key 197, value = %s\n", tmp); | |
324 g_free(tmp); | |
325 } | |
326 g_free(decoded); | |
327 } | |
328 break; | |
329 } | |
9292 | 330 case 192: /* Pictures, aka Buddy Icons, checksum */ |
331 { | |
332 int cksum = strtol(pair->value, NULL, 10); | |
333 GaimBuddy *b; | |
334 | |
335 if (!name) | |
336 break; | |
337 | |
9325 | 338 b = gaim_find_buddy(gc->account, name); |
339 | |
9292 | 340 if (!cksum || (cksum == -1)) { |
9325 | 341 if (f) |
342 yahoo_friend_set_buddy_icon_need_request(f, TRUE); | |
9292 | 343 gaim_buddy_icons_set_for_user(gc->account, name, NULL, 0); |
9325 | 344 if (b) |
345 gaim_blist_node_remove_setting((GaimBlistNode *)b, YAHOO_ICON_CHECKSUM_KEY); | |
9292 | 346 break; |
347 } | |
348 | |
349 if (!f) | |
350 break; | |
9325 | 351 |
9292 | 352 yahoo_friend_set_buddy_icon_need_request(f, FALSE); |
353 if (cksum != gaim_blist_node_get_int((GaimBlistNode*)b, YAHOO_ICON_CHECKSUM_KEY)) | |
9310 | 354 yahoo_send_picture_request(gc, name); |
9292 | 355 |
356 break; | |
357 } | |
2979 | 358 case 16: /* Custom error message */ |
7827 | 359 { |
360 char *tmp = yahoo_string_decode(gc, pair->value, TRUE); | |
361 gaim_notify_error(gc, NULL, tmp, NULL); | |
362 g_free(tmp); | |
363 } | |
2951 | 364 break; |
2681 | 365 default: |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
366 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
367 "Unknown status key %d\n", pair->key); |
2681 | 368 break; |
369 } | |
370 | |
371 l = l->next; | |
372 } | |
10553 | 373 |
374 if (name && f) /* update the last buddy */ | |
375 yahoo_update_status(gc, name, f); | |
2681 | 376 } |
377 | |
9285 | 378 static void yahoo_do_group_check(GaimAccount *account, GHashTable *ht, const char *name, const char *group) |
6820 | 379 { |
380 GaimBuddy *b; | |
381 GaimGroup *g; | |
382 GSList *list, *i; | |
383 gboolean onlist = 0; | |
384 char *oname = NULL; | |
9015 | 385 char **oname_p = &oname; |
386 GSList **list_p = &list; | |
387 | |
388 if (!g_hash_table_lookup_extended(ht, gaim_normalize(account, name), (gpointer *) oname_p, (gpointer *) list_p)) | |
6820 | 389 list = gaim_find_buddies(account, name); |
390 else | |
391 g_hash_table_steal(ht, name); | |
392 | |
393 for (i = list; i; i = i->next) { | |
394 b = i->data; | |
12088 | 395 g = gaim_buddy_get_group(b); |
6820 | 396 if (!gaim_utf8_strcasecmp(group, g->name)) { |
397 gaim_debug(GAIM_DEBUG_MISC, "yahoo", | |
398 "Oh good, %s is in the right group (%s).\n", name, group); | |
399 list = g_slist_delete_link(list, i); | |
400 onlist = 1; | |
401 break; | |
402 } | |
403 } | |
404 | |
405 if (!onlist) { | |
406 gaim_debug(GAIM_DEBUG_MISC, "yahoo", | |
407 "Uhoh, %s isn't on the list (or not in this group), adding him to group %s.\n", name, group); | |
408 if (!(g = gaim_find_group(group))) { | |
409 g = gaim_group_new(group); | |
410 gaim_blist_add_group(g, NULL); | |
411 } | |
412 b = gaim_buddy_new(account, name, NULL); | |
413 gaim_blist_add_buddy(b, NULL, g, NULL); | |
414 } | |
415 | |
416 if (list) { | |
417 if (!oname) | |
7823 | 418 oname = g_strdup(gaim_normalize(account, name)); |
6820 | 419 g_hash_table_insert(ht, oname, list); |
420 } else if (oname) | |
421 g_free(oname); | |
422 } | |
423 | |
424 static void yahoo_do_group_cleanup(gpointer key, gpointer value, gpointer user_data) | |
425 { | |
426 char *name = key; | |
427 GSList *list = value, *i; | |
428 GaimBuddy *b; | |
429 GaimGroup *g; | |
430 | |
431 for (i = list; i; i = i->next) { | |
432 b = i->data; | |
12088 | 433 g = gaim_buddy_get_group(b); |
6820 | 434 gaim_debug(GAIM_DEBUG_MISC, "yahoo", "Deleting Buddy %s from group %s.\n", name, g->name); |
435 gaim_blist_remove_buddy(b); | |
436 } | |
437 } | |
438 | |
7651 | 439 static char *_getcookie(char *rawcookie) |
440 { | |
441 char *cookie = NULL; | |
442 char *tmpcookie; | |
443 char *cookieend; | |
444 | |
445 if (strlen(rawcookie) < 2) | |
446 return NULL; | |
447 tmpcookie = g_strdup(rawcookie+2); | |
448 cookieend = strchr(tmpcookie, ';'); | |
449 | |
450 if (cookieend) | |
451 *cookieend = '\0'; | |
452 | |
453 cookie = g_strdup(tmpcookie); | |
454 g_free(tmpcookie); | |
455 | |
456 return cookie; | |
457 } | |
458 | |
459 static void yahoo_process_cookie(struct yahoo_data *yd, char *c) | |
460 { | |
461 if (c[0] == 'Y') { | |
462 if (yd->cookie_y) | |
463 g_free(yd->cookie_y); | |
11077 | 464 yd->cookie_y = _getcookie(c); |
7651 | 465 } else if (c[0] == 'T') { |
466 if (yd->cookie_t) | |
467 g_free(yd->cookie_t); | |
468 yd->cookie_t = _getcookie(c); | |
469 } | |
470 } | |
471 | |
5583 | 472 static void yahoo_process_list(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 473 { |
474 GSList *l = pkt->hash; | |
475 gboolean export = FALSE; | |
6760 | 476 gboolean got_serv_list = FALSE; |
6695 | 477 GaimBuddy *b; |
478 GaimGroup *g; | |
9278 | 479 YahooFriend *f = NULL; |
6820 | 480 GaimAccount *account = gaim_connection_get_account(gc); |
6784 | 481 struct yahoo_data *yd = gc->proto_data; |
6820 | 482 GHashTable *ht; |
6784 | 483 |
484 char **lines; | |
485 char **split; | |
486 char **buddies; | |
7823 | 487 char **tmp, **bud, *norm_bud; |
7827 | 488 char *grp = NULL; |
2681 | 489 |
7651 | 490 if (pkt->id) |
491 yd->session_id = pkt->id; | |
492 | |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
493 while (l) { |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
494 struct yahoo_pair *pair = l->data; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
495 l = l->next; |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
496 |
6760 | 497 switch (pair->key) { |
498 case 87: | |
6784 | 499 if (!yd->tmp_serv_blist) |
500 yd->tmp_serv_blist = g_string_new(pair->value); | |
501 else | |
502 g_string_append(yd->tmp_serv_blist, pair->value); | |
6760 | 503 break; |
504 case 88: | |
6784 | 505 if (!yd->tmp_serv_ilist) |
506 yd->tmp_serv_ilist = g_string_new(pair->value); | |
507 else | |
508 g_string_append(yd->tmp_serv_ilist, pair->value); | |
6760 | 509 break; |
7651 | 510 case 59: /* cookies, yum */ |
511 yahoo_process_cookie(yd, pair->value); | |
512 break; | |
12010 | 513 case YAHOO_SERVICE_PRESENCE_PERM: |
12203
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
514 if (!yd->tmp_serv_plist) |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
515 yd->tmp_serv_plist = g_string_new(pair->value); |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
516 else |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
517 g_string_append(yd->tmp_serv_plist, pair->value); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
518 break; |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
519 } |
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
520 } |
2681 | 521 |
6784 | 522 if (pkt->status != 0) |
523 return; | |
524 | |
525 if (yd->tmp_serv_blist) { | |
6820 | 526 ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_slist_free); |
527 | |
6784 | 528 lines = g_strsplit(yd->tmp_serv_blist->str, "\n", -1); |
529 for (tmp = lines; *tmp; tmp++) { | |
530 split = g_strsplit(*tmp, ":", 2); | |
531 if (!split) | |
532 continue; | |
533 if (!split[0] || !split[1]) { | |
534 g_strfreev(split); | |
535 continue; | |
536 } | |
7827 | 537 grp = yahoo_string_decode(gc, split[0], FALSE); |
6784 | 538 buddies = g_strsplit(split[1], ",", -1); |
539 for (bud = buddies; bud && *bud; bud++) { | |
7823 | 540 norm_bud = g_strdup(gaim_normalize(account, *bud)); |
9279 | 541 f = yahoo_friend_find_or_new(gc, norm_bud); |
542 | |
7827 | 543 if (!(b = gaim_find_buddy(account, norm_bud))) { |
544 if (!(g = gaim_find_group(grp))) { | |
545 g = gaim_group_new(grp); | |
6784 | 546 gaim_blist_add_group(g, NULL); |
547 } | |
7823 | 548 b = gaim_buddy_new(account, norm_bud, NULL); |
6784 | 549 gaim_blist_add_buddy(b, NULL, g, NULL); |
550 export = TRUE; | |
6820 | 551 } |
6784 | 552 |
9285 | 553 yahoo_do_group_check(account, ht, norm_bud, grp); |
7823 | 554 g_free(norm_bud); |
6784 | 555 } |
556 g_strfreev(buddies); | |
557 g_strfreev(split); | |
7827 | 558 g_free(grp); |
6784 | 559 } |
560 g_strfreev(lines); | |
561 | |
562 g_string_free(yd->tmp_serv_blist, TRUE); | |
563 yd->tmp_serv_blist = NULL; | |
9285 | 564 g_hash_table_foreach(ht, yahoo_do_group_cleanup, NULL); |
6820 | 565 g_hash_table_destroy(ht); |
6784 | 566 } |
567 | |
568 if (yd->tmp_serv_ilist) { | |
569 buddies = g_strsplit(yd->tmp_serv_ilist->str, ",", -1); | |
570 for (bud = buddies; bud && *bud; bud++) { | |
571 /* The server is already ignoring the user */ | |
572 got_serv_list = TRUE; | |
573 gaim_privacy_deny_add(gc->account, *bud, 1); | |
574 } | |
575 g_strfreev(buddies); | |
576 | |
577 g_string_free(yd->tmp_serv_ilist, TRUE); | |
578 yd->tmp_serv_ilist = NULL; | |
579 } | |
580 | |
10937 | 581 if (got_serv_list && |
582 ((gc->account->perm_deny != GAIM_PRIVACY_ALLOW_BUDDYLIST) && | |
583 (gc->account->perm_deny != GAIM_PRIVACY_DENY_ALL) && | |
584 (gc->account->perm_deny != GAIM_PRIVACY_ALLOW_USERS))) | |
585 { | |
586 gc->account->perm_deny = GAIM_PRIVACY_DENY_USERS; | |
12138
4e729e3d8f0b
[gaim-migrate @ 14439]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
587 gaim_debug_info("yahoo", "%s privacy defaulting to GAIM_PRIVACY_DENY_USERS.\n", |
10937 | 588 gc->account->username); |
6784 | 589 } |
10937 | 590 |
12203
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
591 if (yd->tmp_serv_plist) { |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
592 buddies = g_strsplit(yd->tmp_serv_plist->str, ",", -1); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
593 for (bud = buddies; bud && *bud; bud++) { |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
594 f = yahoo_friend_find(gc, *bud); |
12138
4e729e3d8f0b
[gaim-migrate @ 14439]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
595 if (f) { |
4e729e3d8f0b
[gaim-migrate @ 14439]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
596 gaim_debug_info("yahoo", "%s setting presence for %s to PERM_OFFLINE\n", |
4e729e3d8f0b
[gaim-migrate @ 14439]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
597 gc->account->username, *bud); |
12010 | 598 f->presence = YAHOO_PRESENCE_PERM_OFFLINE; |
12138
4e729e3d8f0b
[gaim-migrate @ 14439]
Richard Laager <rlaager@wiktel.com>
parents:
12088
diff
changeset
|
599 } |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
600 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
601 g_strfreev(buddies); |
12203
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
602 g_string_free(yd->tmp_serv_plist, TRUE); |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
603 yd->tmp_serv_plist = NULL; |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
604 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
605 } |
2681 | 606 } |
607 | |
5583 | 608 static void yahoo_process_notify(GaimConnection *gc, struct yahoo_packet *pkt) |
2993 | 609 { |
610 char *msg = NULL; | |
611 char *from = NULL; | |
3019 | 612 char *stat = NULL; |
613 char *game = NULL; | |
9278 | 614 YahooFriend *f = NULL; |
2993 | 615 GSList *l = pkt->hash; |
6784 | 616 |
2993 | 617 while (l) { |
618 struct yahoo_pair *pair = l->data; | |
619 if (pair->key == 4) | |
620 from = pair->value; | |
621 if (pair->key == 49) | |
622 msg = pair->value; | |
3001 | 623 if (pair->key == 13) |
3019 | 624 stat = pair->value; |
625 if (pair->key == 14) | |
626 game = pair->value; | |
2993 | 627 l = l->next; |
628 } | |
3640 | 629 |
6784 | 630 if (!from || !msg) |
3640 | 631 return; |
6686 | 632 |
10937 | 633 if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING")) |
634 && (yahoo_privacy_check(gc, from))) { | |
3019 | 635 if (*stat == '1') |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5685
diff
changeset
|
636 serv_got_typing(gc, from, 0, GAIM_TYPING); |
3019 | 637 else |
638 serv_got_typing_stopped(gc, from); | |
4793 | 639 } else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) { |
6695 | 640 GaimBuddy *bud = gaim_find_buddy(gc->account, from); |
6784 | 641 |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
642 if (!bud) { |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
643 gaim_debug(GAIM_DEBUG_WARNING, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
644 "%s is playing a game, and doesn't want " |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
645 "you to know.\n", from); |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
646 } |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
647 |
9279 | 648 f = yahoo_friend_find(gc, from); |
6784 | 649 if (!f) |
650 return; /* if they're not on the list, don't bother */ | |
651 | |
9283 | 652 yahoo_friend_set_game(f, NULL); |
6784 | 653 |
3019 | 654 if (*stat == '1') { |
9283 | 655 yahoo_friend_set_game(f, game); |
3020 | 656 if (bud) |
6784 | 657 yahoo_update_status(gc, from, f); |
3019 | 658 } |
659 } | |
2993 | 660 } |
661 | |
7827 | 662 |
663 struct _yahoo_im { | |
664 char *from; | |
665 int time; | |
666 int utf8; | |
9284 | 667 int buddy_icon; |
7827 | 668 char *msg; |
669 }; | |
670 | |
5583 | 671 static void yahoo_process_message(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 672 { |
13849 | 673 struct yahoo_data *yd = gc->proto_data; |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
674 GSList *l = pkt->hash; |
7827 | 675 GSList *list = NULL; |
676 struct _yahoo_im *im = NULL; | |
11608 | 677 |
13461
b6a63c9b0cb4
[gaim-migrate @ 15836]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13343
diff
changeset
|
678 const char *imv = NULL; |
6069 | 679 |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
680 if (pkt->status <= 1 || pkt->status == 5) { |
11914
2219f4bf4a57
[gaim-migrate @ 14205]
Richard Laager <rlaager@wiktel.com>
parents:
11897
diff
changeset
|
681 while (l != NULL) { |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
682 struct yahoo_pair *pair = l->data; |
7827 | 683 if (pair->key == 4) { |
684 im = g_new0(struct _yahoo_im, 1); | |
685 list = g_slist_append(list, im); | |
686 im->from = pair->value; | |
687 im->time = time(NULL); | |
688 } | |
689 if (pair->key == 97) | |
690 if (im) | |
691 im->utf8 = strtol(pair->value, NULL, 10); | |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
692 if (pair->key == 15) |
7827 | 693 if (im) |
694 im->time = strtol(pair->value, NULL, 10); | |
9284 | 695 if (pair->key == 206) |
696 if (im) | |
697 im->buddy_icon = strtol(pair->value, NULL, 10); | |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
698 if (pair->key == 14) { |
7827 | 699 if (im) |
700 im->msg = pair->value; | |
6687 | 701 } |
11801
81806e9241be
[gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents:
11800
diff
changeset
|
702 /* IMV key */ |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
703 if (pair->key == 63) |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
704 { |
13461
b6a63c9b0cb4
[gaim-migrate @ 15836]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13343
diff
changeset
|
705 imv = pair->value; |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
706 } |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
707 l = l->next; |
6687 | 708 } |
2681 | 709 } else if (pkt->status == 2) { |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5367
diff
changeset
|
710 gaim_notify_error(gc, NULL, |
10386 | 711 _("Your Yahoo! message did not get sent."), NULL); |
2681 | 712 } |
11608 | 713 |
13461
b6a63c9b0cb4
[gaim-migrate @ 15836]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13343
diff
changeset
|
714 /** TODO: It seems that this check should be per IM, not global */ |
11801
81806e9241be
[gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents:
11800
diff
changeset
|
715 /* Check for the Doodle IMV */ |
13849 | 716 if (im != NULL && imv!= NULL && im->from != NULL) |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
717 { |
13849 | 718 g_hash_table_replace(yd->imvironments, g_strdup(im->from), g_strdup(imv)); |
719 | |
720 if (strcmp(imv, "doodle;11") == 0) | |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
721 { |
13849 | 722 GaimWhiteboard *wb; |
723 | |
724 if (!yahoo_privacy_check(gc, im->from)) { | |
725 gaim_debug_info("yahoo", "Doodle request from %s dropped.\n", im->from); | |
726 return; | |
727 } | |
728 | |
729 wb = gaim_whiteboard_get_session(gc->account, im->from); | |
730 | |
731 /* If a Doodle session doesn't exist between this user */ | |
732 if(wb == NULL) | |
733 { | |
734 wb = gaim_whiteboard_create(gc->account, im->from, DOODLE_STATE_REQUESTED); | |
735 | |
736 yahoo_doodle_command_send_request(gc, im->from); | |
737 yahoo_doodle_command_send_ready(gc, im->from); | |
738 } | |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
739 } |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
740 } |
7827 | 741 |
742 for (l = list; l; l = l->next) { | |
9306 | 743 YahooFriend *f; |
7827 | 744 char *m, *m2; |
745 im = l->data; | |
746 | |
747 if (!im->from || !im->msg) { | |
748 g_free(im); | |
749 continue; | |
750 } | |
751 | |
10937 | 752 if (!yahoo_privacy_check(gc, im->from)) { |
753 gaim_debug_info("yahoo", "Message from %s dropped.\n", im->from); | |
754 return; | |
755 } | |
756 | |
7827 | 757 m = yahoo_string_decode(gc, im->msg, im->utf8); |
12994
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
758 /* This may actually not be necessary, but it appears |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
759 * that at least at one point some clients were sending |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
760 * "\r\n" as line delimiters, so we want to avoid double |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
761 * lines. */ |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
762 m2 = gaim_strreplace(m, "\r\n", "\n"); |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
763 g_free(m); |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
764 m = m2; |
6ea877c5a444
[gaim-migrate @ 15347]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12970
diff
changeset
|
765 gaim_util_chrreplace(m, '\r', '\n'); |
8375 | 766 |
767 if (!strcmp(m, "<ding>")) { | |
11338 | 768 GaimConversation *c = gaim_conversation_new(GAIM_CONV_TYPE_IM, |
8375 | 769 gaim_connection_get_account(gc), im->from); |
770 gaim_conv_im_write(GAIM_CONV_IM(c), "", _("Buzz!!"), GAIM_MESSAGE_NICK|GAIM_MESSAGE_RECV, | |
771 im->time); | |
772 g_free(m); | |
773 g_free(im); | |
774 continue; | |
775 } | |
776 | |
7827 | 777 m2 = yahoo_codes_to_html(m); |
778 g_free(m); | |
779 serv_got_im(gc, im->from, m2, 0, im->time); | |
780 g_free(m2); | |
9284 | 781 |
782 if ((f = yahoo_friend_find(gc, im->from)) && im->buddy_icon == 2) { | |
783 if (yahoo_friend_get_buddy_icon_need_request(f)) { | |
9310 | 784 yahoo_send_picture_request(gc, im->from); |
9284 | 785 yahoo_friend_set_buddy_icon_need_request(f, FALSE); |
786 } | |
787 } | |
788 | |
7827 | 789 g_free(im); |
790 } | |
791 g_slist_free(list); | |
2681 | 792 } |
793 | |
7865 | 794 static void yahoo_process_sysmessage(GaimConnection *gc, struct yahoo_packet *pkt) |
795 { | |
796 GSList *l = pkt->hash; | |
10070 | 797 char *prim, *me = NULL, *msg = NULL, *escmsg = NULL; |
7865 | 798 |
799 while (l) { | |
800 struct yahoo_pair *pair = l->data; | |
801 | |
802 if (pair->key == 5) | |
803 me = pair->value; | |
804 if (pair->key == 14) | |
805 msg = pair->value; | |
806 | |
807 l = l->next; | |
808 } | |
809 | |
10070 | 810 if (!msg || !g_utf8_validate(msg, -1, NULL)) |
7865 | 811 return; |
812 | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10687
diff
changeset
|
813 escmsg = g_markup_escape_text(msg, -1); |
10070 | 814 |
7865 | 815 prim = g_strdup_printf(_("Yahoo! system message for %s:"), |
816 me?me:gaim_connection_get_display_name(gc)); | |
10070 | 817 gaim_notify_info(NULL, NULL, prim, escmsg); |
7865 | 818 g_free(prim); |
10070 | 819 g_free(escmsg); |
7865 | 820 } |
821 | |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
822 struct yahoo_add_request { |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
823 GaimConnection *gc; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
824 char *id; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
825 char *who; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
826 char *msg; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
827 }; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
828 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
829 static void |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
830 yahoo_buddy_add_authorize_cb(struct yahoo_add_request *add_req, const char *msg) { |
12378
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
831 GaimBuddy *buddy = gaim_find_buddy(add_req->gc->account, add_req->who); |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
832 |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
833 if (buddy != NULL) |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
834 gaim_account_notify_added(add_req->gc->account, add_req->who, |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
835 add_req->id, NULL, add_req->msg); |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
836 else |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
837 gaim_account_request_add(add_req->gc->account, add_req->who, |
c9aeafdb445e
[gaim-migrate @ 14682]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
838 add_req->id, NULL, add_req->msg); |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
839 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
840 g_free(add_req->id); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
841 g_free(add_req->who); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
842 g_free(add_req->msg); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
843 g_free(add_req); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
844 } |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
845 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
846 static void |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
847 yahoo_buddy_add_deny_cb(struct yahoo_add_request *add_req, const char *msg) { |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
848 struct yahoo_packet *pkt; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
849 char *encoded_msg = NULL; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
850 struct yahoo_data *yd = add_req->gc->proto_data; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
851 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
852 if (msg) |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
853 encoded_msg = yahoo_string_encode(add_req->gc, msg, NULL); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
854 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
855 pkt = yahoo_packet_new(YAHOO_SERVICE_REJECTCONTACT, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
856 YAHOO_STATUS_AVAILABLE, 0); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
857 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
858 yahoo_packet_hash(pkt, "sss", |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
859 1, gaim_normalize(add_req->gc->account, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
860 gaim_account_get_username( |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
861 gaim_connection_get_account( |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
862 add_req->gc))), |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
863 7, add_req->who, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
864 14, encoded_msg ? encoded_msg : ""); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
865 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
866 yahoo_packet_send_and_free(pkt, yd); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
867 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
868 g_free(encoded_msg); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
869 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
870 g_free(add_req->id); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
871 g_free(add_req->who); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
872 g_free(add_req->msg); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
873 g_free(add_req); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
874 } |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
875 |
6686 | 876 static void yahoo_buddy_added_us(GaimConnection *gc, struct yahoo_packet *pkt) { |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
877 struct yahoo_add_request *add_req; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
878 char *msg = NULL; |
2681 | 879 GSList *l = pkt->hash; |
880 | |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
881 add_req = g_new0(struct yahoo_add_request, 1); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
882 add_req->gc = gc; |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
883 |
2681 | 884 while (l) { |
885 struct yahoo_pair *pair = l->data; | |
6686 | 886 |
887 switch (pair->key) { | |
888 case 1: | |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
889 add_req->id = g_strdup(pair->value); |
6686 | 890 break; |
891 case 3: | |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
892 add_req->who = g_strdup(pair->value); |
6686 | 893 break; |
894 case 15: /* time, for when they add us and we're offline */ | |
895 break; | |
896 case 14: | |
2681 | 897 msg = pair->value; |
6686 | 898 break; |
899 } | |
2681 | 900 l = l->next; |
901 } | |
902 | |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
903 if (add_req->id) { |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
904 char *prompt_msg; |
7827 | 905 if (msg) |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
906 add_req->msg = yahoo_string_decode(gc, msg, FALSE); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
907 |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
908 /* TODO: this is almost exactly the same as what MSN does, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
909 * this should probably be moved to the core. |
11644 | 910 */ |
11109
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
911 prompt_msg = g_strdup_printf(_("The user %s wants to add %s to " |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
912 "his or her buddy list%s%s."), |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
913 add_req->who, add_req->id, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
914 add_req->msg ? ": " : "", |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
915 add_req->msg ? add_req->msg : ""); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
916 gaim_request_input(gc, NULL, prompt_msg, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
917 _("Message (optional) :"), |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
918 NULL, TRUE, FALSE, NULL, |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
919 _("Authorize"), G_CALLBACK( |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
920 yahoo_buddy_add_authorize_cb), |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
921 _("Deny"), G_CALLBACK( |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
922 yahoo_buddy_add_deny_cb), |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
923 add_req); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
924 g_free(prompt_msg); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
925 } else { |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
926 g_free(add_req->id); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
927 g_free(add_req->who); |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
928 /*g_free(add_req->msg);*/ |
b8f11f70cf97
[gaim-migrate @ 13161]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11078
diff
changeset
|
929 g_free(add_req); |
7827 | 930 } |
6686 | 931 } |
932 | |
933 static void yahoo_buddy_denied_our_add(GaimConnection *gc, struct yahoo_packet *pkt) | |
934 { | |
935 char *who = NULL; | |
936 char *msg = NULL; | |
937 GSList *l = pkt->hash; | |
938 GString *buf = NULL; | |
6784 | 939 struct yahoo_data *yd = gc->proto_data; |
6686 | 940 |
941 while (l) { | |
942 struct yahoo_pair *pair = l->data; | |
943 | |
944 switch (pair->key) { | |
945 case 3: | |
946 who = pair->value; | |
947 break; | |
948 case 14: | |
949 msg = pair->value; | |
950 break; | |
951 } | |
952 l = l->next; | |
953 } | |
954 | |
955 if (who) { | |
7827 | 956 char *msg2; |
6686 | 957 buf = g_string_sized_new(0); |
7827 | 958 if (!msg) { |
6686 | 959 g_string_printf(buf, _("%s has (retroactively) denied your request to add them to your list."), who); |
7827 | 960 } else { |
961 msg2 = yahoo_string_decode(gc, msg, FALSE); | |
962 g_string_printf(buf, _("%s has (retroactively) denied your request to add them to your list for the following reason: %s."), who, msg2); | |
963 g_free(msg2); | |
964 } | |
6840 | 965 gaim_notify_info(gc, NULL, _("Add buddy rejected"), buf->str); |
6686 | 966 g_string_free(buf, TRUE); |
6784 | 967 g_hash_table_remove(yd->friends, who); |
9983 | 968 gaim_prpl_got_user_status(gaim_connection_get_account(gc), who, "offline", NULL); /* FIXME: make this set not on list status instead */ |
11838 | 969 /* TODO: Shouldn't we remove the buddy from our local list? */ |
6686 | 970 } |
971 } | |
972 | |
973 static void yahoo_process_contact(GaimConnection *gc, struct yahoo_packet *pkt) | |
974 { | |
975 switch (pkt->status) { | |
976 case 1: | |
977 yahoo_process_status(gc, pkt); | |
978 return; | |
979 case 3: | |
980 yahoo_buddy_added_us(gc, pkt); | |
981 break; | |
982 case 7: | |
983 yahoo_buddy_denied_our_add(gc, pkt); | |
984 break; | |
985 default: | |
986 break; | |
2683
4836eae8dd8c
[gaim-migrate @ 2696]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2682
diff
changeset
|
987 } |
2681 | 988 } |
989 | |
7747 | 990 #define OUT_CHARSET "utf-8" |
991 | |
992 static char *yahoo_decode(const char *text) | |
993 { | |
9221 | 994 char *converted = NULL; |
8125 | 995 char *n, *new; |
996 const char *end, *p; | |
8616 | 997 int i, k; |
8125 | 998 |
7771 | 999 n = new = g_malloc(strlen (text) + 1); |
8118 | 1000 end = text + strlen(text); |
1001 | |
8125 | 1002 for (p = text; p < end; p++, n++) { |
7747 | 1003 if (*p == '\\') { |
9064 | 1004 if (p[1] >= '0' && p[1] <= '7') { |
1005 p += 1; | |
1006 for (i = 0, k = 0; k < 3; k += 1) { | |
1007 char c = p[k]; | |
9065 | 1008 if (c < '0' || c > '7') break; |
9064 | 1009 i *= 8; |
1010 i += c - '0'; | |
1011 } | |
1012 *n = i; | |
1013 p += k - 1; | |
1014 } else { /* bug 959248 */ | |
1015 /* If we see a \ not followed by an octal number, | |
1016 * it means that it is actually a \\ with one \ | |
1017 * already eaten by some unknown function. | |
1018 * This is arguably broken. | |
1019 * | |
1020 * I think wing is wrong here, there is no function | |
1021 * called that I see that could have done it. I guess | |
1022 * it is just really sending single \'s. That's yahoo | |
1023 * for you. | |
1024 */ | |
1025 *n = *p; | |
1026 } | |
7747 | 1027 } |
1028 else | |
1029 *n = *p; | |
1030 } | |
1031 | |
1032 *n = '\0'; | |
8125 | 1033 |
9221 | 1034 if (strstr(text, "\033$B")) |
1035 converted = g_convert(new, n - new, OUT_CHARSET, "iso-2022-jp", NULL, NULL, NULL); | |
1036 if (!converted) | |
1037 converted = g_convert(new, n - new, OUT_CHARSET, "iso-8859-1", NULL, NULL, NULL); | |
7747 | 1038 g_free(new); |
1039 | |
1040 return converted; | |
1041 } | |
1042 | |
5583 | 1043 static void yahoo_process_mail(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 1044 { |
5583 | 1045 GaimAccount *account = gaim_connection_get_account(gc); |
9221 | 1046 struct yahoo_data *yd = gc->proto_data; |
2681 | 1047 char *who = NULL; |
1048 char *email = NULL; | |
1049 char *subj = NULL; | |
9221 | 1050 char *yahoo_mail_url = (yd->jp? YAHOOJP_MAIL_URL: YAHOO_MAIL_URL); |
2681 | 1051 int count = 0; |
1052 GSList *l = pkt->hash; | |
1053 | |
5583 | 1054 if (!gaim_account_get_check_mail(account)) |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1055 return; |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1056 |
2681 | 1057 while (l) { |
1058 struct yahoo_pair *pair = l->data; | |
1059 if (pair->key == 9) | |
1060 count = strtol(pair->value, NULL, 10); | |
1061 else if (pair->key == 43) | |
1062 who = pair->value; | |
1063 else if (pair->key == 42) | |
1064 email = pair->value; | |
1065 else if (pair->key == 18) | |
1066 subj = pair->value; | |
1067 l = l->next; | |
1068 } | |
1069 | |
4001 | 1070 if (who && subj && email && *email) { |
7747 | 1071 char *dec_who = yahoo_decode(who); |
1072 char *dec_subj = yahoo_decode(subj); | |
1073 char *from = g_strdup_printf("%s (%s)", dec_who, email); | |
1074 | |
1075 gaim_notify_email(gc, dec_subj, from, gaim_account_get_username(account), | |
9221 | 1076 yahoo_mail_url, NULL, NULL); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1077 |
7747 | 1078 g_free(dec_who); |
1079 g_free(dec_subj); | |
2850
cbe6a1e63a72
[gaim-migrate @ 2863]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2813
diff
changeset
|
1080 g_free(from); |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1081 } else if (count > 0) { |
5583 | 1082 const char *to = gaim_account_get_username(account); |
9221 | 1083 const char *url = yahoo_mail_url; |
5521
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1084 |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1085 gaim_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url, |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1086 NULL, NULL); |
76ec14ba51d7
[gaim-migrate @ 5921]
Christian Hammond <chipx86@chipx86.com>
parents:
5498
diff
changeset
|
1087 } |
2681 | 1088 } |
3147 | 1089 /* This is the y64 alphabet... it's like base64, but has a . and a _ */ |
1090 char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; | |
1091 | |
1092 /* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function | |
1093 * in util.c, but it has a bug I don't feel like finding right now ;) */ | |
11897 | 1094 static void to_y64(char *out, const unsigned char *in, gsize inlen) |
3147 | 1095 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ |
1096 { | |
1097 for (; inlen >= 3; inlen -= 3) | |
1098 { | |
1099 *out++ = base64digits[in[0] >> 2]; | |
1100 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; | |
1101 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; | |
1102 *out++ = base64digits[in[2] & 0x3f]; | |
1103 in += 3; | |
1104 } | |
1105 if (inlen > 0) | |
1106 { | |
1107 unsigned char fragment; | |
1108 | |
1109 *out++ = base64digits[in[0] >> 2]; | |
1110 fragment = (in[0] << 4) & 0x30; | |
1111 if (inlen > 1) | |
1112 fragment |= in[1] >> 4; | |
1113 *out++ = base64digits[fragment]; | |
1114 *out++ = (inlen < 2) ? '-' : base64digits[(in[1] << 2) & 0x3c]; | |
1115 *out++ = '-'; | |
1116 } | |
1117 *out = '\0'; | |
1118 } | |
1119 | |
6986 | 1120 static void yahoo_process_auth_old(GaimConnection *gc, const char *seed) |
1121 { | |
1122 struct yahoo_packet *pack; | |
1123 GaimAccount *account = gaim_connection_get_account(gc); | |
7261 | 1124 const char *name = gaim_normalize(account, gaim_account_get_username(account)); |
10740 | 1125 const char *pass = gaim_connection_get_password(gc); |
6986 | 1126 struct yahoo_data *yd = gc->proto_data; |
1127 | |
1128 /* So, Yahoo has stopped supporting its older clients in India, and undoubtedly | |
1129 * will soon do so in the rest of the world. | |
1130 * | |
1131 * The new clients use this authentication method. I warn you in advance, it's | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8713
diff
changeset
|
1132 * bizarre, convoluted, inordinately complicated. It's also no more secure than |
6986 | 1133 * crypt() was. The only purpose this scheme could serve is to prevent third |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1134 * party clients from connecting to their servers. |
6986 | 1135 * |
1136 * Sorry, Yahoo. | |
1137 */ | |
9277 | 1138 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1139 GaimCipher *cipher; |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1140 GaimCipherContext *context; |
11137 | 1141 guchar digest[16]; |
9277 | 1142 |
6986 | 1143 char *crypt_result; |
1144 char password_hash[25]; | |
1145 char crypt_hash[25]; | |
1146 char *hash_string_p = g_malloc(50 + strlen(name)); | |
1147 char *hash_string_c = g_malloc(50 + strlen(name)); | |
9277 | 1148 |
6986 | 1149 char checksum; |
9277 | 1150 |
6986 | 1151 int sv; |
9277 | 1152 |
6986 | 1153 char result6[25]; |
1154 char result96[25]; | |
1155 | |
1156 sv = seed[15]; | |
1157 sv = sv % 8; | |
1158 | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1159 cipher = gaim_ciphers_find_cipher("md5"); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1160 context = gaim_cipher_context_new(cipher, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1161 |
11183 | 1162 gaim_cipher_context_append(context, (const guchar *)pass, strlen(pass)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1163 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1164 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1165 to_y64(password_hash, digest, 16); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1166 |
9277 | 1167 crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1168 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1169 gaim_cipher_context_reset(context, NULL); |
11183 | 1170 gaim_cipher_context_append(context, (const guchar *)crypt_result, strlen(crypt_result)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1171 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1172 to_y64(crypt_hash, digest, 16); |
6986 | 1173 |
1174 switch (sv) { | |
1175 case 1: | |
1176 case 6: | |
1177 checksum = seed[seed[9] % 16]; | |
1178 g_snprintf(hash_string_p, strlen(name) + 50, | |
1179 "%c%s%s%s", checksum, name, seed, password_hash); | |
1180 g_snprintf(hash_string_c, strlen(name) + 50, | |
1181 "%c%s%s%s", checksum, name, seed, crypt_hash); | |
1182 break; | |
1183 case 2: | |
1184 case 7: | |
1185 checksum = seed[seed[15] % 16]; | |
1186 g_snprintf(hash_string_p, strlen(name) + 50, | |
1187 "%c%s%s%s", checksum, seed, password_hash, name); | |
1188 g_snprintf(hash_string_c, strlen(name) + 50, | |
1189 "%c%s%s%s", checksum, seed, crypt_hash, name); | |
1190 break; | |
1191 case 3: | |
1192 checksum = seed[seed[1] % 16]; | |
1193 g_snprintf(hash_string_p, strlen(name) + 50, | |
1194 "%c%s%s%s", checksum, name, password_hash, seed); | |
1195 g_snprintf(hash_string_c, strlen(name) + 50, | |
1196 "%c%s%s%s", checksum, name, crypt_hash, seed); | |
1197 break; | |
1198 case 4: | |
1199 checksum = seed[seed[3] % 16]; | |
1200 g_snprintf(hash_string_p, strlen(name) + 50, | |
1201 "%c%s%s%s", checksum, password_hash, seed, name); | |
1202 g_snprintf(hash_string_c, strlen(name) + 50, | |
1203 "%c%s%s%s", checksum, crypt_hash, seed, name); | |
1204 break; | |
1205 case 0: | |
1206 case 5: | |
1207 checksum = seed[seed[7] % 16]; | |
1208 g_snprintf(hash_string_p, strlen(name) + 50, | |
1209 "%c%s%s%s", checksum, password_hash, name, seed); | |
1210 g_snprintf(hash_string_c, strlen(name) + 50, | |
1211 "%c%s%s%s", checksum, crypt_hash, name, seed); | |
1212 break; | |
1213 } | |
9277 | 1214 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1215 gaim_cipher_context_reset(context, NULL); |
11183 | 1216 gaim_cipher_context_append(context, (const guchar *)hash_string_p, strlen(hash_string_p)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1217 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1218 to_y64(result6, digest, 16); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1219 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1220 gaim_cipher_context_reset(context, NULL); |
11183 | 1221 gaim_cipher_context_append(context, (const guchar *)hash_string_c, strlen(hash_string_c)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1222 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1223 gaim_cipher_context_destroy(context); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1224 to_y64(result96, digest, 16); |
6986 | 1225 |
1226 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 1227 yahoo_packet_hash(pack, "ssss", 0, name, 6, result6, 96, result96, 1, name); |
10392 | 1228 yahoo_packet_send_and_free(pack, yd); |
9277 | 1229 |
6986 | 1230 g_free(hash_string_p); |
1231 g_free(hash_string_c); | |
1232 } | |
1233 | |
6998 | 1234 /* I'm dishing out some uber-mad props to Cerulean Studios for cracking this |
1235 * and sending the fix! Thanks guys. */ | |
1236 | |
6986 | 1237 static void yahoo_process_auth_new(GaimConnection *gc, const char *seed) |
1238 { | |
1239 struct yahoo_packet *pack = NULL; | |
1240 GaimAccount *account = gaim_connection_get_account(gc); | |
7261 | 1241 const char *name = gaim_normalize(account, gaim_account_get_username(account)); |
10740 | 1242 const char *pass = gaim_connection_get_password(gc); |
6986 | 1243 struct yahoo_data *yd = gc->proto_data; |
9277 | 1244 |
11077 | 1245 GaimCipher *md5_cipher; |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1246 GaimCipherContext *md5_ctx; |
11137 | 1247 guchar md5_digest[16]; |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1248 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1249 GaimCipher *sha1_cipher; |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1250 GaimCipherContext *sha1_ctx1; |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1251 GaimCipherContext *sha1_ctx2; |
9277 | 1252 |
8349 | 1253 char *alphabet1 = "FBZDWAGHrJTLMNOPpRSKUVEXYChImkwQ"; |
1254 char *alphabet2 = "F0E1D2C3B4A59687abcdefghijklmnop"; | |
1255 | |
1256 char *challenge_lookup = "qzec2tb3um1olpar8whx4dfgijknsvy5"; | |
1257 char *operand_lookup = "+|&%/*^-"; | |
1258 char *delimit_lookup = ",;"; | |
1259 | |
1260 char *password_hash = (char *)g_malloc(25); | |
1261 char *crypt_hash = (char *)g_malloc(25); | |
1262 char *crypt_result = NULL; | |
1263 | |
11144 | 1264 unsigned char pass_hash_xor1[64]; |
1265 unsigned char pass_hash_xor2[64]; | |
1266 unsigned char crypt_hash_xor1[64]; | |
1267 unsigned char crypt_hash_xor2[64]; | |
8349 | 1268 char resp_6[100]; |
1269 char resp_96[100]; | |
1270 | |
1271 unsigned char digest1[20]; | |
1272 unsigned char digest2[20]; | |
11077 | 1273 unsigned char comparison_src[20]; |
8349 | 1274 unsigned char magic_key_char[4]; |
11144 | 1275 const char *magic_ptr; |
8349 | 1276 |
1277 unsigned int magic[64]; | |
1278 unsigned int magic_work = 0; | |
1279 unsigned int magic_4 = 0; | |
1280 | |
1281 int x; | |
1282 int y; | |
1283 int cnt = 0; | |
1284 int magic_cnt = 0; | |
1285 int magic_len; | |
1286 | |
1287 memset(password_hash, 0, 25); | |
1288 memset(crypt_hash, 0, 25); | |
6986 | 1289 memset(&pass_hash_xor1, 0, 64); |
1290 memset(&pass_hash_xor2, 0, 64); | |
1291 memset(&crypt_hash_xor1, 0, 64); | |
1292 memset(&crypt_hash_xor2, 0, 64); | |
1293 memset(&digest1, 0, 20); | |
1294 memset(&digest2, 0, 20); | |
1295 memset(&magic, 0, 64); | |
1296 memset(&resp_6, 0, 100); | |
1297 memset(&resp_96, 0, 100); | |
1298 memset(&magic_key_char, 0, 4); | |
8349 | 1299 memset(&comparison_src, 0, 20); |
6986 | 1300 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1301 md5_cipher = gaim_ciphers_find_cipher("md5"); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1302 md5_ctx = gaim_cipher_context_new(md5_cipher, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1303 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1304 sha1_cipher = gaim_ciphers_find_cipher("sha1"); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1305 sha1_ctx1 = gaim_cipher_context_new(sha1_cipher, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1306 sha1_ctx2 = gaim_cipher_context_new(sha1_cipher, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1307 |
11077 | 1308 /* |
8349 | 1309 * Magic: Phase 1. Generate what seems to be a 30 byte value (could change if base64 |
1310 * ends up differently? I don't remember and I'm tired, so use a 64 byte buffer. | |
6986 | 1311 */ |
9277 | 1312 |
6986 | 1313 magic_ptr = seed; |
8375 | 1314 |
6986 | 1315 while (*magic_ptr != (int)NULL) { |
8349 | 1316 char *loc; |
11077 | 1317 |
11644 | 1318 /* Ignore parentheses. */ |
11077 | 1319 |
6986 | 1320 if (*magic_ptr == '(' || *magic_ptr == ')') { |
1321 magic_ptr++; | |
1322 continue; | |
1323 } | |
11077 | 1324 |
11644 | 1325 /* Characters and digits verify against the challenge lookup. */ |
11077 | 1326 |
6986 | 1327 if (isalpha(*magic_ptr) || isdigit(*magic_ptr)) { |
1328 loc = strchr(challenge_lookup, *magic_ptr); | |
1329 if (!loc) { | |
8349 | 1330 /* SME XXX Error - disconnect here */ |
6986 | 1331 } |
11077 | 1332 |
11644 | 1333 /* Get offset into lookup table and shl 3. */ |
11077 | 1334 |
6986 | 1335 magic_work = loc - challenge_lookup; |
1336 magic_work <<= 3; | |
11077 | 1337 |
6986 | 1338 magic_ptr++; |
1339 continue; | |
1340 } else { | |
8349 | 1341 unsigned int local_store; |
11077 | 1342 |
6986 | 1343 loc = strchr(operand_lookup, *magic_ptr); |
1344 if (!loc) { | |
8349 | 1345 /* SME XXX Disconnect */ |
6986 | 1346 } |
11077 | 1347 |
6986 | 1348 local_store = loc - operand_lookup; |
11077 | 1349 |
11644 | 1350 /* Oops; how did this happen? */ |
11077 | 1351 |
1352 if (magic_cnt >= 64) | |
6986 | 1353 break; |
11077 | 1354 |
6986 | 1355 magic[magic_cnt++] = magic_work | local_store; |
1356 magic_ptr++; | |
1357 continue; | |
1358 } | |
8349 | 1359 } |
11077 | 1360 |
6986 | 1361 magic_len = magic_cnt; |
1362 magic_cnt = 0; | |
11077 | 1363 |
11644 | 1364 /* Magic: Phase 2. Take generated magic value and sprinkle fairy |
1365 * dust on the values. | |
8349 | 1366 */ |
1367 | |
6986 | 1368 for (magic_cnt = magic_len-2; magic_cnt >= 0; magic_cnt--) { |
8349 | 1369 unsigned char byte1; |
1370 unsigned char byte2; | |
11077 | 1371 |
11644 | 1372 /* Bad. Abort. */ |
11077 | 1373 |
8349 | 1374 if ((magic_cnt + 1 > magic_len) || (magic_cnt > magic_len)) |
6986 | 1375 break; |
11077 | 1376 |
6986 | 1377 byte1 = magic[magic_cnt]; |
1378 byte2 = magic[magic_cnt+1]; | |
11077 | 1379 |
6986 | 1380 byte1 *= 0xcd; |
1381 byte1 ^= byte2; | |
11077 | 1382 |
6986 | 1383 magic[magic_cnt+1] = byte1; |
8349 | 1384 } |
11077 | 1385 |
1386 /* | |
8349 | 1387 * Magic: Phase 3. This computes 20 bytes. The first 4 bytes are used as our magic |
1388 * key (and may be changed later); the next 16 bytes are an MD5 sum of the magic key | |
1389 * plus 3 bytes. The 3 bytes are found by looping, and they represent the offsets | |
1390 * into particular functions we'll later call to potentially alter the magic key. | |
1391 * | |
1392 * %-) | |
1393 */ | |
11077 | 1394 |
8349 | 1395 magic_cnt = 1; |
1396 x = 0; | |
11077 | 1397 |
8349 | 1398 do { |
11077 | 1399 unsigned int bl = 0; |
8349 | 1400 unsigned int cl = magic[magic_cnt++]; |
11077 | 1401 |
8349 | 1402 if (magic_cnt >= magic_len) |
1403 break; | |
11077 | 1404 |
8349 | 1405 if (cl > 0x7F) { |
11077 | 1406 if (cl < 0xe0) |
1407 bl = cl = (cl & 0x1f) << 6; | |
8349 | 1408 else { |
11077 | 1409 bl = magic[magic_cnt++]; |
1410 cl = (cl & 0x0f) << 6; | |
1411 bl = ((bl & 0x3f) + cl) << 6; | |
1412 } | |
1413 | |
1414 cl = magic[magic_cnt++]; | |
1415 bl = (cl & 0x3f) + bl; | |
8349 | 1416 } else |
11077 | 1417 bl = cl; |
1418 | |
1419 comparison_src[x++] = (bl & 0xff00) >> 8; | |
1420 comparison_src[x++] = bl & 0xff; | |
8349 | 1421 } while (x < 20); |
11077 | 1422 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1423 /* First four bytes are magic key. */ |
8349 | 1424 memcpy(&magic_key_char[0], comparison_src, 4); |
8482 | 1425 magic_4 = magic_key_char[0] | (magic_key_char[1]<<8) | (magic_key_char[2]<<16) | (magic_key_char[3]<<24); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1426 |
11077 | 1427 /* |
8349 | 1428 * Magic: Phase 4. Determine what function to use later by getting outside/inside |
1429 * loop values until we match our previous buffer. | |
1430 */ | |
1431 for (x = 0; x < 65535; x++) { | |
1432 int leave = 0; | |
1433 | |
1434 for (y = 0; y < 5; y++) { | |
1435 unsigned char test[3]; | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1436 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1437 /* Calculate buffer. */ |
8349 | 1438 test[0] = x; |
1439 test[1] = x >> 8; | |
1440 test[2] = y; | |
11077 | 1441 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1442 gaim_cipher_context_reset(md5_ctx, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1443 gaim_cipher_context_append(md5_ctx, magic_key_char, 4); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1444 gaim_cipher_context_append(md5_ctx, test, 3); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1445 gaim_cipher_context_digest(md5_ctx, sizeof(md5_digest), |
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1446 md5_digest, NULL); |
11077 | 1447 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1448 if (!memcmp(md5_digest, comparison_src+4, 16)) { |
8349 | 1449 leave = 1; |
1450 break; | |
1451 } | |
1452 } | |
11077 | 1453 |
8349 | 1454 if (leave == 1) |
1455 break; | |
6986 | 1456 } |
11077 | 1457 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1458 /* If y != 0, we need some help. */ |
8349 | 1459 if (y != 0) { |
1460 unsigned int updated_key; | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1461 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1462 /* Update magic stuff. |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1463 * Call it twice because Yahoo's encryption is super bad ass. |
8349 | 1464 */ |
1465 updated_key = yahoo_auth_finalCountdown(magic_4, 0x60, y, x); | |
1466 updated_key = yahoo_auth_finalCountdown(updated_key, 0x60, y, x); | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1467 |
8482 | 1468 magic_key_char[0] = updated_key & 0xff; |
1469 magic_key_char[1] = (updated_key >> 8) & 0xff; | |
1470 magic_key_char[2] = (updated_key >> 16) & 0xff; | |
1471 magic_key_char[3] = (updated_key >> 24) & 0xff; | |
11077 | 1472 } |
1473 | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1474 /* Get password and crypt hashes as per usual. */ |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1475 gaim_cipher_context_reset(md5_ctx, NULL); |
11183 | 1476 gaim_cipher_context_append(md5_ctx, (const guchar *)pass, strlen(pass)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1477 gaim_cipher_context_digest(md5_ctx, sizeof(md5_digest), |
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1478 md5_digest, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1479 to_y64(password_hash, md5_digest, 16); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1480 |
11077 | 1481 crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1482 gaim_cipher_context_reset(md5_ctx, NULL); |
11183 | 1483 gaim_cipher_context_append(md5_ctx, (const guchar *)crypt_result, strlen(crypt_result)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1484 gaim_cipher_context_digest(md5_ctx, sizeof(md5_digest), |
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1485 md5_digest, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1486 to_y64(crypt_hash, md5_digest, 16); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1487 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1488 /* Our first authentication response is based off of the password hash. */ |
11077 | 1489 for (x = 0; x < (int)strlen(password_hash); x++) |
6986 | 1490 pass_hash_xor1[cnt++] = password_hash[x] ^ 0x36; |
11077 | 1491 |
1492 if (cnt < 64) | |
6986 | 1493 memset(&(pass_hash_xor1[cnt]), 0x36, 64-cnt); |
8349 | 1494 |
6986 | 1495 cnt = 0; |
11077 | 1496 |
1497 for (x = 0; x < (int)strlen(password_hash); x++) | |
6986 | 1498 pass_hash_xor2[cnt++] = password_hash[x] ^ 0x5c; |
11077 | 1499 |
1500 if (cnt < 64) | |
6986 | 1501 memset(&(pass_hash_xor2[cnt]), 0x5c, 64-cnt); |
11077 | 1502 |
1503 /* | |
8349 | 1504 * The first context gets the password hash XORed with 0x36 plus a magic value |
1505 * which we previously extrapolated from our challenge. | |
1506 */ | |
11077 | 1507 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1508 gaim_cipher_context_append(sha1_ctx1, pass_hash_xor1, 64); |
9382 | 1509 if (y >= 3) |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1510 gaim_cipher_context_set_option(sha1_ctx1, "sizeLo", GINT_TO_POINTER(0x1ff)); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1511 gaim_cipher_context_append(sha1_ctx1, magic_key_char, 4); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1512 gaim_cipher_context_digest(sha1_ctx1, sizeof(digest1), digest1, NULL); |
11077 | 1513 |
1514 /* | |
8349 | 1515 * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest |
1516 * of the first context. | |
1517 */ | |
11077 | 1518 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1519 gaim_cipher_context_append(sha1_ctx2, pass_hash_xor2, 64); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1520 gaim_cipher_context_append(sha1_ctx2, digest1, 20); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1521 gaim_cipher_context_digest(sha1_ctx2, sizeof(digest2), digest2, NULL); |
11077 | 1522 |
1523 /* | |
8349 | 1524 * Now that we have digest2, use it to fetch characters from an alphabet to construct |
1525 * our first authentication response. | |
1526 */ | |
1527 | |
6986 | 1528 for (x = 0; x < 20; x += 2) { |
8349 | 1529 unsigned int val = 0; |
1530 unsigned int lookup = 0; | |
11077 | 1531 |
8349 | 1532 char byte[6]; |
11077 | 1533 |
6986 | 1534 memset(&byte, 0, 6); |
8349 | 1535 |
11644 | 1536 /* First two bytes of digest stuffed together. */ |
9277 | 1537 |
6986 | 1538 val = digest2[x]; |
1539 val <<= 8; | |
1540 val += digest2[x+1]; | |
11077 | 1541 |
6986 | 1542 lookup = (val >> 0x0b); |
1543 lookup &= 0x1f; | |
1544 if (lookup >= strlen(alphabet1)) | |
1545 break; | |
1546 sprintf(byte, "%c", alphabet1[lookup]); | |
1547 strcat(resp_6, byte); | |
1548 strcat(resp_6, "="); | |
8349 | 1549 |
6986 | 1550 lookup = (val >> 0x06); |
1551 lookup &= 0x1f; | |
1552 if (lookup >= strlen(alphabet2)) | |
1553 break; | |
1554 sprintf(byte, "%c", alphabet2[lookup]); | |
1555 strcat(resp_6, byte); | |
11077 | 1556 |
6986 | 1557 lookup = (val >> 0x01); |
1558 lookup &= 0x1f; | |
1559 if (lookup >= strlen(alphabet2)) | |
1560 break; | |
1561 sprintf(byte, "%c", alphabet2[lookup]); | |
1562 strcat(resp_6, byte); | |
8349 | 1563 |
6986 | 1564 lookup = (val & 0x01); |
1565 if (lookup >= strlen(delimit_lookup)) | |
1566 break; | |
1567 sprintf(byte, "%c", delimit_lookup[lookup]); | |
1568 strcat(resp_6, byte); | |
1569 } | |
11077 | 1570 |
11644 | 1571 /* Our second authentication response is based off of the crypto hash. */ |
11077 | 1572 |
6986 | 1573 cnt = 0; |
1574 memset(&digest1, 0, 20); | |
1575 memset(&digest2, 0, 20); | |
11077 | 1576 |
1577 for (x = 0; x < (int)strlen(crypt_hash); x++) | |
6986 | 1578 crypt_hash_xor1[cnt++] = crypt_hash[x] ^ 0x36; |
11077 | 1579 |
1580 if (cnt < 64) | |
6986 | 1581 memset(&(crypt_hash_xor1[cnt]), 0x36, 64-cnt); |
8349 | 1582 |
6986 | 1583 cnt = 0; |
11077 | 1584 |
1585 for (x = 0; x < (int)strlen(crypt_hash); x++) | |
6986 | 1586 crypt_hash_xor2[cnt++] = crypt_hash[x] ^ 0x5c; |
11077 | 1587 |
1588 if (cnt < 64) | |
6986 | 1589 memset(&(crypt_hash_xor2[cnt]), 0x5c, 64-cnt); |
11077 | 1590 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1591 gaim_cipher_context_reset(sha1_ctx1, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1592 gaim_cipher_context_reset(sha1_ctx2, NULL); |
11077 | 1593 |
1594 /* | |
8349 | 1595 * The first context gets the password hash XORed with 0x36 plus a magic value |
1596 * which we previously extrapolated from our challenge. | |
1597 */ | |
11077 | 1598 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1599 gaim_cipher_context_append(sha1_ctx1, crypt_hash_xor1, 64); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1600 if (y >= 3) { |
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1601 gaim_cipher_context_set_option(sha1_ctx1, "sizeLo", |
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1602 GINT_TO_POINTER(0x1ff)); |
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1603 } |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1604 gaim_cipher_context_append(sha1_ctx1, magic_key_char, 4); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1605 gaim_cipher_context_digest(sha1_ctx1, sizeof(digest1), digest1, NULL); |
11077 | 1606 |
1607 /* | |
8349 | 1608 * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest |
1609 * of the first context. | |
1610 */ | |
11077 | 1611 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1612 gaim_cipher_context_append(sha1_ctx2, crypt_hash_xor2, 64); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1613 gaim_cipher_context_append(sha1_ctx2, digest1, 20); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1614 gaim_cipher_context_digest(sha1_ctx2, sizeof(digest2), digest2, NULL); |
11077 | 1615 |
1616 /* | |
8349 | 1617 * Now that we have digest2, use it to fetch characters from an alphabet to construct |
1618 * our first authentication response. | |
1619 */ | |
11077 | 1620 |
6986 | 1621 for (x = 0; x < 20; x += 2) { |
8349 | 1622 unsigned int val = 0; |
1623 unsigned int lookup = 0; | |
11077 | 1624 |
8349 | 1625 char byte[6]; |
11077 | 1626 |
6986 | 1627 memset(&byte, 0, 6); |
11077 | 1628 |
11644 | 1629 /* First two bytes of digest stuffed together. */ |
11077 | 1630 |
6986 | 1631 val = digest2[x]; |
1632 val <<= 8; | |
1633 val += digest2[x+1]; | |
8349 | 1634 |
6986 | 1635 lookup = (val >> 0x0b); |
1636 lookup &= 0x1f; | |
1637 if (lookup >= strlen(alphabet1)) | |
1638 break; | |
1639 sprintf(byte, "%c", alphabet1[lookup]); | |
1640 strcat(resp_96, byte); | |
1641 strcat(resp_96, "="); | |
11077 | 1642 |
6986 | 1643 lookup = (val >> 0x06); |
1644 lookup &= 0x1f; | |
1645 if (lookup >= strlen(alphabet2)) | |
1646 break; | |
1647 sprintf(byte, "%c", alphabet2[lookup]); | |
1648 strcat(resp_96, byte); | |
11077 | 1649 |
6986 | 1650 lookup = (val >> 0x01); |
1651 lookup &= 0x1f; | |
1652 if (lookup >= strlen(alphabet2)) | |
1653 break; | |
1654 sprintf(byte, "%c", alphabet2[lookup]); | |
1655 strcat(resp_96, byte); | |
11077 | 1656 |
6986 | 1657 lookup = (val & 0x01); |
1658 if (lookup >= strlen(delimit_lookup)) | |
1659 break; | |
1660 sprintf(byte, "%c", delimit_lookup[lookup]); | |
1661 strcat(resp_96, byte); | |
1662 } | |
10784 | 1663 gaim_debug_info("yahoo", "yahoo status: %d\n", yd->current_status); |
10400 | 1664 pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, yd->current_status, 0); |
10394 | 1665 yahoo_packet_hash(pack, "sssss", 0, name, 6, resp_6, 96, resp_96, 1, |
1666 name, 135, "6,0,0,1710"); | |
11077 | 1667 if (yd->picture_checksum) |
10394 | 1668 yahoo_packet_hash_int(pack, 192, yd->picture_checksum); |
11077 | 1669 |
10392 | 1670 yahoo_packet_send_and_free(pack, yd); |
6986 | 1671 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1672 gaim_cipher_context_destroy(md5_ctx); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1673 gaim_cipher_context_destroy(sha1_ctx1); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1674 gaim_cipher_context_destroy(sha1_ctx2); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
1675 |
7424 | 1676 g_free(password_hash); |
1677 g_free(crypt_hash); | |
6986 | 1678 } |
1679 | |
5583 | 1680 static void yahoo_process_auth(GaimConnection *gc, struct yahoo_packet *pkt) |
3147 | 1681 { |
1682 char *seed = NULL; | |
1683 char *sn = NULL; | |
1684 GSList *l = pkt->hash; | |
7010 | 1685 int m = 0; |
9277 | 1686 gchar *buf; |
1687 | |
3147 | 1688 while (l) { |
1689 struct yahoo_pair *pair = l->data; | |
1690 if (pair->key == 94) | |
1691 seed = pair->value; | |
1692 if (pair->key == 1) | |
1693 sn = pair->value; | |
6986 | 1694 if (pair->key == 13) |
1695 m = atoi(pair->value); | |
3147 | 1696 l = l->next; |
1697 } | |
9277 | 1698 |
3147 | 1699 if (seed) { |
6986 | 1700 switch (m) { |
1701 case 0: | |
1702 yahoo_process_auth_old(gc, seed); | |
1703 break; | |
3147 | 1704 case 1: |
6986 | 1705 yahoo_process_auth_new(gc, seed); |
3147 | 1706 break; |
6986 | 1707 default: |
7043 | 1708 buf = g_strdup_printf(_("The Yahoo server has requested the use of an unrecognized " |
7129 | 1709 "authentication method. This version of Gaim will likely not be able " |
7043 | 1710 "to successfully sign on to Yahoo. Check %s for updates."), GAIM_WEBSITE); |
6986 | 1711 gaim_notify_error(gc, "", _("Failed Yahoo! Authentication"), |
7043 | 1712 buf); |
1713 g_free(buf); | |
6986 | 1714 yahoo_process_auth_new(gc, seed); /* Can't hurt to try it anyway. */ |
3147 | 1715 } |
1716 } | |
1717 } | |
2681 | 1718 |
9285 | 1719 static void ignore_buddy(GaimBuddy *buddy) { |
1720 GaimGroup *group; | |
6760 | 1721 GaimAccount *account; |
1722 gchar *name; | |
1723 | |
9285 | 1724 if (!buddy) |
6792 | 1725 return; |
6760 | 1726 |
12088 | 1727 group = gaim_buddy_get_group(buddy); |
9285 | 1728 name = g_strdup(buddy->name); |
1729 account = buddy->account; | |
6760 | 1730 |
6792 | 1731 gaim_debug(GAIM_DEBUG_INFO, "blist", |
9285 | 1732 "Removing '%s' from buddy list.\n", buddy->name); |
11643 | 1733 gaim_account_remove_buddy(account, buddy, group); |
9285 | 1734 gaim_blist_remove_buddy(buddy); |
6760 | 1735 |
6792 | 1736 serv_add_deny(account->gc, name); |
9285 | 1737 |
6760 | 1738 g_free(name); |
1739 } | |
1740 | |
1741 static void keep_buddy(GaimBuddy *b) { | |
1742 gaim_privacy_deny_remove(b->account, b->name, 1); | |
1743 } | |
1744 | |
1745 static void yahoo_process_ignore(GaimConnection *gc, struct yahoo_packet *pkt) { | |
1746 GaimBuddy *b; | |
1747 GSList *l; | |
1748 gchar *who = NULL; | |
1749 gchar *sn = NULL; | |
1750 gchar buf[BUF_LONG]; | |
1751 gint ignore = 0; | |
1752 gint status = 0; | |
1753 | |
1754 for (l = pkt->hash; l; l = l->next) { | |
1755 struct yahoo_pair *pair = l->data; | |
1756 switch (pair->key) { | |
1757 case 0: | |
1758 who = pair->value; | |
1759 break; | |
1760 case 1: | |
1761 sn = pair->value; | |
1762 break; | |
1763 case 13: | |
1764 ignore = strtol(pair->value, NULL, 10); | |
1765 break; | |
1766 case 66: | |
1767 status = strtol(pair->value, NULL, 10); | |
1768 break; | |
1769 default: | |
1770 break; | |
1771 } | |
1772 } | |
1773 | |
1774 switch (status) { | |
1775 case 12: | |
1776 b = gaim_find_buddy(gc->account, who); | |
1777 g_snprintf(buf, sizeof(buf), _("You have tried to ignore %s, but the " | |
1778 "user is on your buddy list. Clicking \"Yes\" " | |
1779 "will remove and ignore the buddy."), who); | |
1780 gaim_request_yes_no(gc, NULL, _("Ignore buddy?"), buf, 0, b, | |
1781 G_CALLBACK(ignore_buddy), | |
1782 G_CALLBACK(keep_buddy)); | |
1783 break; | |
1784 case 2: | |
1785 case 3: | |
1786 case 0: | |
1787 default: | |
1788 break; | |
1789 } | |
1790 } | |
1791 | |
6761 | 1792 static void yahoo_process_authresp(GaimConnection *gc, struct yahoo_packet *pkt) |
1793 { | |
9410 | 1794 struct yahoo_data *yd = gc->proto_data; |
6761 | 1795 GSList *l = pkt->hash; |
1796 int err = 0; | |
1797 char *msg; | |
7865 | 1798 char *url = NULL; |
1799 char *fullmsg; | |
6761 | 1800 |
1801 while (l) { | |
1802 struct yahoo_pair *pair = l->data; | |
1803 | |
1804 if (pair->key == 66) | |
1805 err = strtol(pair->value, NULL, 10); | |
7865 | 1806 if (pair->key == 20) |
1807 url = pair->value; | |
6761 | 1808 |
1809 l = l->next; | |
1810 } | |
1811 | |
1812 switch (err) { | |
1813 case 3: | |
7865 | 1814 msg = g_strdup(_("Invalid username.")); |
6761 | 1815 break; |
1816 case 13: | |
9410 | 1817 if (!yd->wm) { |
1818 yd->wm = TRUE; | |
1819 if (yd->fd >= 0) | |
1820 close(yd->fd); | |
1821 if (gc->inpa) | |
1822 gaim_input_remove(gc->inpa); | |
1823 gaim_url_fetch(WEBMESSENGER_URL, TRUE, "Gaim/" VERSION, FALSE, | |
1824 yahoo_login_page_cb, gc); | |
9835 | 1825 gaim_notify_warning(gc, NULL, _("Normal authentication failed!"), |
1826 _("The normal authentication method has failed. " | |
9410 | 1827 "This means either your password is incorrect, " |
9835 | 1828 "or Yahoo!'s authentication scheme has changed. " |
9410 | 1829 "Gaim will now attempt to log in using Web " |
9835 | 1830 "Messenger authentication, which will result " |
9410 | 1831 "in reduced functionality and features.")); |
1832 return; | |
1833 } | |
7865 | 1834 msg = g_strdup(_("Incorrect password.")); |
1835 break; | |
1836 case 14: | |
9280 | 1837 msg = g_strdup(_("Your account is locked, please log in to the Yahoo! website.")); |
6761 | 1838 break; |
1839 default: | |
9280 | 1840 msg = g_strdup_printf(_("Unknown error number %d. Logging into the Yahoo! website may fix this."), err); |
6761 | 1841 } |
7865 | 1842 |
1843 if (url) | |
1844 fullmsg = g_strdup_printf("%s\n%s", msg, url); | |
1845 else | |
1846 fullmsg = g_strdup(msg); | |
1847 | |
9280 | 1848 gc->wants_to_die = TRUE; |
7865 | 1849 gaim_connection_error(gc, fullmsg); |
1850 g_free(msg); | |
1851 g_free(fullmsg); | |
6761 | 1852 } |
1853 | |
6840 | 1854 static void yahoo_process_addbuddy(GaimConnection *gc, struct yahoo_packet *pkt) |
1855 { | |
1856 int err = 0; | |
1857 char *who = NULL; | |
1858 char *group = NULL; | |
7827 | 1859 char *decoded_group; |
6840 | 1860 char *buf; |
9278 | 1861 YahooFriend *f; |
6840 | 1862 GSList *l = pkt->hash; |
1863 | |
1864 while (l) { | |
1865 struct yahoo_pair *pair = l->data; | |
1866 | |
1867 switch (pair->key) { | |
1868 case 66: | |
1869 err = strtol(pair->value, NULL, 10); | |
1870 break; | |
1871 case 7: | |
1872 who = pair->value; | |
1873 break; | |
1874 case 65: | |
1875 group = pair->value; | |
1876 break; | |
1877 } | |
1878 | |
1879 l = l->next; | |
1880 } | |
1881 | |
1882 if (!who) | |
1883 return; | |
1884 if (!group) | |
1885 group = ""; | |
1886 | |
1887 if (!err || (err == 2)) { /* 0 = ok, 2 = already on serv list */ | |
9279 | 1888 f = yahoo_friend_find_or_new(gc, who); |
1889 yahoo_update_status(gc, who, f); | |
6840 | 1890 return; |
1891 } | |
1892 | |
7827 | 1893 decoded_group = yahoo_string_decode(gc, group, FALSE); |
6840 | 1894 buf = g_strdup_printf(_("Could not add buddy %s to group %s to the server list on account %s."), |
7827 | 1895 who, decoded_group, gaim_connection_get_display_name(gc)); |
9637 | 1896 if (!gaim_conv_present_error(who, gaim_connection_get_account(gc), buf)) |
1897 gaim_notify_error(gc, NULL, _("Could not add buddy to server list"), buf); | |
6840 | 1898 g_free(buf); |
7827 | 1899 g_free(decoded_group); |
6840 | 1900 } |
1901 | |
9062 | 1902 static void yahoo_process_p2p(GaimConnection *gc, struct yahoo_packet *pkt) |
1903 { | |
1904 GSList *l = pkt->hash; | |
1905 char *who = NULL; | |
1906 char *base64 = NULL; | |
11137 | 1907 guchar *decoded; |
11127 | 1908 gsize len; |
9062 | 1909 |
1910 while (l) { | |
1911 struct yahoo_pair *pair = l->data; | |
1912 | |
1913 switch (pair->key) { | |
1914 case 5: | |
1915 /* our identity */ | |
1916 break; | |
1917 case 4: | |
1918 who = pair->value; | |
1919 break; | |
1920 case 1: | |
1921 /* who again, the master identity this time? */ | |
1922 break; | |
1923 case 12: | |
1924 base64 = pair->value; | |
1925 /* so, this is an ip address. in base64. decoded it's in ascii. | |
1926 after strtol, it's in reversed byte order. Who thought this up?*/ | |
1927 break; | |
1928 /* | |
1929 TODO: figure these out | |
1930 yahoo: Key: 61 Value: 0 | |
1931 yahoo: Key: 2 Value: | |
1932 yahoo: Key: 13 Value: 0 | |
1933 yahoo: Key: 49 Value: PEERTOPEER | |
1934 yahoo: Key: 140 Value: 1 | |
1935 yahoo: Key: 11 Value: -1786225828 | |
1936 */ | |
1937 | |
1938 } | |
1939 | |
1940 l = l->next; | |
1941 } | |
1942 | |
9277 | 1943 if (base64) { |
9281 | 1944 guint32 ip; |
1945 char *tmp2; | |
1946 YahooFriend *f; | |
1947 | |
11127 | 1948 decoded = gaim_base64_decode(base64, &len); |
9277 | 1949 if (len) { |
1950 char *tmp = gaim_str_binary_to_ascii(decoded, len); | |
1951 gaim_debug_info("yahoo", "Got P2P service packet (from server): who = %s, ip = %s\n", who, tmp); | |
1952 g_free(tmp); | |
1953 } | |
9281 | 1954 |
11144 | 1955 tmp2 = g_strndup((const gchar *)decoded, len); /* so its \0 terminated...*/ |
9281 | 1956 ip = strtol(tmp2, NULL, 10); |
1957 g_free(tmp2); | |
9062 | 1958 g_free(decoded); |
9281 | 1959 tmp2 = g_strdup_printf("%u.%u.%u.%u", ip & 0xff, (ip >> 8) & 0xff, (ip >> 16) & 0xff, |
1960 (ip >> 24) & 0xff); | |
1961 f = yahoo_friend_find(gc, who); | |
1962 if (f) | |
1963 yahoo_friend_set_ip(f, tmp2); | |
1964 g_free(tmp2); | |
9062 | 1965 } |
1966 } | |
1967 | |
9604 | 1968 static void yahoo_process_audible(GaimConnection *gc, struct yahoo_packet *pkt) |
1969 { | |
12798
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1970 char *who = NULL, *msg = NULL, *id = NULL; |
9604 | 1971 GSList *l = pkt->hash; |
1972 | |
1973 while (l) { | |
1974 struct yahoo_pair *pair = l->data; | |
1975 | |
1976 switch (pair->key) { | |
1977 case 4: | |
1978 who = pair->value; | |
1979 break; | |
1980 case 5: | |
1981 /* us */ | |
1982 break; | |
1983 case 230: | |
12798
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1984 /* the audible, in foo.locale.bar.baz format |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1985 eg: base.tw.smiley.smiley43 */ |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
1986 id = pair->value; |
9604 | 1987 break; |
1988 case 231: | |
1989 /* the text of the audible */ | |
1990 msg = pair->value; | |
1991 break; | |
1992 case 232: | |
1993 /* weird number (md5 hash?), like 8ebab9094156135f5dcbaccbeee662a5c5fd1420 */ | |
1994 break; | |
1995 } | |
1996 | |
1997 l = l->next; | |
1998 } | |
1999 | |
12798
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2000 if (!msg) |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2001 msg = id; |
9604 | 2002 if (!who || !msg) |
2003 return; | |
2004 if (!g_utf8_validate(msg, -1, NULL)) { | |
2005 gaim_debug_misc("yahoo", "Warning, nonutf8 audible, ignoring!\n"); | |
2006 return; | |
2007 } | |
10937 | 2008 if (!yahoo_privacy_check(gc, who)) { |
2009 gaim_debug_misc("yahoo", "Audible message from %s for %s dropped!\n", | |
2010 gc->account->username, who); | |
2011 return; | |
2012 } | |
12798
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2013 if (id) { |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2014 /* "http://us.dl1.yimg.com/download.yahoo.com/dl/aud/"+locale+"/"+id+".swf" */ |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2015 char **audible_locale = g_strsplit(id, ".", 0); |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2016 char *buf = g_strdup_printf(_("[ Audible %s/%s/%s.swf ] %s"), YAHOO_AUDIBLE_URL, audible_locale[1], id, msg); |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2017 g_strfreev(audible_locale); |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2018 |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2019 serv_got_im(gc, who, buf, 0, time(NULL)); |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2020 g_free(buf); |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2021 } else |
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2022 serv_got_im(gc, who, msg, 0, time(NULL)); |
9604 | 2023 } |
2024 | |
5583 | 2025 static void yahoo_packet_process(GaimConnection *gc, struct yahoo_packet *pkt) |
2681 | 2026 { |
6760 | 2027 switch (pkt->service) { |
2681 | 2028 case YAHOO_SERVICE_LOGON: |
2771
450f4f9d2f23
[gaim-migrate @ 2784]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2741
diff
changeset
|
2029 case YAHOO_SERVICE_LOGOFF: |
2681 | 2030 case YAHOO_SERVICE_ISAWAY: |
2737
f61c1f3a6afa
[gaim-migrate @ 2750]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2724
diff
changeset
|
2031 case YAHOO_SERVICE_ISBACK: |
3019 | 2032 case YAHOO_SERVICE_GAMELOGON: |
2033 case YAHOO_SERVICE_GAMELOGOFF: | |
6686 | 2034 case YAHOO_SERVICE_CHATLOGON: |
2035 case YAHOO_SERVICE_CHATLOGOFF: | |
10373 | 2036 case YAHOO_SERVICE_Y6_STATUS_UPDATE: |
2681 | 2037 yahoo_process_status(gc, pkt); |
2038 break; | |
3019 | 2039 case YAHOO_SERVICE_NOTIFY: |
2040 yahoo_process_notify(gc, pkt); | |
2993 | 2041 break; |
2681 | 2042 case YAHOO_SERVICE_MESSAGE: |
2786
318f846120e2
[gaim-migrate @ 2799]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2772
diff
changeset
|
2043 case YAHOO_SERVICE_GAMEMSG: |
5939 | 2044 case YAHOO_SERVICE_CHATMSG: |
2681 | 2045 yahoo_process_message(gc, pkt); |
2046 break; | |
7865 | 2047 case YAHOO_SERVICE_SYSMESSAGE: |
2048 yahoo_process_sysmessage(gc, pkt); | |
2049 break; | |
2681 | 2050 case YAHOO_SERVICE_NEWMAIL: |
2051 yahoo_process_mail(gc, pkt); | |
2052 break; | |
2053 case YAHOO_SERVICE_NEWCONTACT: | |
2054 yahoo_process_contact(gc, pkt); | |
2055 break; | |
6784 | 2056 case YAHOO_SERVICE_AUTHRESP: |
2057 yahoo_process_authresp(gc, pkt); | |
2058 break; | |
2681 | 2059 case YAHOO_SERVICE_LIST: |
2060 yahoo_process_list(gc, pkt); | |
2061 break; | |
3147 | 2062 case YAHOO_SERVICE_AUTH: |
2063 yahoo_process_auth(gc, pkt); | |
2064 break; | |
6840 | 2065 case YAHOO_SERVICE_ADDBUDDY: |
2066 yahoo_process_addbuddy(gc, pkt); | |
2067 break; | |
6760 | 2068 case YAHOO_SERVICE_IGNORECONTACT: |
2069 yahoo_process_ignore(gc, pkt); | |
2070 break; | |
6729 | 2071 case YAHOO_SERVICE_CONFINVITE: |
2072 case YAHOO_SERVICE_CONFADDINVITE: | |
2073 yahoo_process_conference_invite(gc, pkt); | |
2074 break; | |
2075 case YAHOO_SERVICE_CONFDECLINE: | |
2076 yahoo_process_conference_decline(gc, pkt); | |
2077 break; | |
2078 case YAHOO_SERVICE_CONFLOGON: | |
2079 yahoo_process_conference_logon(gc, pkt); | |
2080 break; | |
2081 case YAHOO_SERVICE_CONFLOGOFF: | |
2082 yahoo_process_conference_logoff(gc, pkt); | |
2083 break; | |
2084 case YAHOO_SERVICE_CONFMSG: | |
2085 yahoo_process_conference_message(gc, pkt); | |
2086 break; | |
2087 case YAHOO_SERVICE_CHATONLINE: | |
2088 yahoo_process_chat_online(gc, pkt); | |
2089 break; | |
2090 case YAHOO_SERVICE_CHATLOGOUT: | |
2091 yahoo_process_chat_logout(gc, pkt); | |
2092 break; | |
2093 case YAHOO_SERVICE_CHATGOTO: | |
2094 yahoo_process_chat_goto(gc, pkt); | |
2095 break; | |
2096 case YAHOO_SERVICE_CHATJOIN: | |
2097 yahoo_process_chat_join(gc, pkt); | |
2098 break; | |
2099 case YAHOO_SERVICE_CHATLEAVE: /* XXX is this right? */ | |
2100 case YAHOO_SERVICE_CHATEXIT: | |
2101 yahoo_process_chat_exit(gc, pkt); | |
2102 break; | |
2103 case YAHOO_SERVICE_CHATINVITE: /* XXX never seen this one, might not do it right */ | |
2104 case YAHOO_SERVICE_CHATADDINVITE: | |
2105 yahoo_process_chat_addinvite(gc, pkt); | |
2106 break; | |
2107 case YAHOO_SERVICE_COMMENT: | |
2108 yahoo_process_chat_message(gc, pkt); | |
2109 break; | |
12010 | 2110 case YAHOO_SERVICE_PRESENCE_PERM: |
2111 case YAHOO_SERVICE_PRESENCE_SESSION: | |
2112 yahoo_process_presence(gc, pkt); | |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2113 break; |
7651 | 2114 case YAHOO_SERVICE_P2PFILEXFER: |
11644 | 2115 /* This case had no break and continued; thus keeping it this way.*/ |
11914
2219f4bf4a57
[gaim-migrate @ 14205]
Richard Laager <rlaager@wiktel.com>
parents:
11897
diff
changeset
|
2116 yahoo_process_p2pfilexfer(gc, pkt); |
7651 | 2117 case YAHOO_SERVICE_FILETRANSFER: |
2118 yahoo_process_filetransfer(gc, pkt); | |
2119 break; | |
11180
5d103f550f6a
[gaim-migrate @ 13291]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11153
diff
changeset
|
2120 case YAHOO_SERVICE_PEERTOPEER: |
9062 | 2121 yahoo_process_p2p(gc, pkt); |
2122 break; | |
9284 | 2123 case YAHOO_SERVICE_PICTURE: |
2124 yahoo_process_picture(gc, pkt); | |
2125 break; | |
9292 | 2126 case YAHOO_SERVICE_PICTURE_UPDATE: |
2127 yahoo_process_picture_update(gc, pkt); | |
2128 break; | |
2129 case YAHOO_SERVICE_PICTURE_CHECKSUM: | |
2130 yahoo_process_picture_checksum(gc, pkt); | |
2131 break; | |
9306 | 2132 case YAHOO_SERVICE_PICTURE_UPLOAD: |
2133 yahoo_process_picture_upload(gc, pkt); | |
2134 break; | |
9604 | 2135 case YAHOO_SERVICE_AUDIBLE: |
2136 yahoo_process_audible(gc, pkt); | |
12798
09d4ea834370
[gaim-migrate @ 15145]
Richard Laager <rlaager@wiktel.com>
parents:
12797
diff
changeset
|
2137 break; |
2681 | 2138 default: |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
2139 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2140 "Unhandled service 0x%02x\n", pkt->service); |
2681 | 2141 break; |
2142 } | |
2143 } | |
2144 | |
2145 static void yahoo_pending(gpointer data, gint source, GaimInputCondition cond) | |
2146 { | |
5583 | 2147 GaimConnection *gc = data; |
2681 | 2148 struct yahoo_data *yd = gc->proto_data; |
2149 char buf[1024]; | |
2150 int len; | |
2151 | |
2152 len = read(yd->fd, buf, sizeof(buf)); | |
2153 | |
2154 if (len <= 0) { | |
6321 | 2155 gaim_connection_error(gc, _("Unable to read")); |
2681 | 2156 return; |
2157 } | |
2158 | |
2159 yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen); | |
2160 memcpy(yd->rxqueue + yd->rxlen, buf, len); | |
2161 yd->rxlen += len; | |
2162 | |
2163 while (1) { | |
2164 struct yahoo_packet *pkt; | |
2165 int pos = 0; | |
2166 int pktlen; | |
2167 | |
2168 if (yd->rxlen < YAHOO_PACKET_HDRLEN) | |
2169 return; | |
2170 | |
11318 | 2171 if (strncmp((char *)yd->rxqueue, "YMSG", MIN(4, yd->rxlen)) != 0) { |
10610 | 2172 /* HEY! This isn't even a YMSG packet. What |
2173 * are you trying to pull? */ | |
2174 guchar *start; | |
2175 | |
2176 gaim_debug_warning("yahoo", "Error in YMSG stream, got something not a YMSG packet!"); | |
10611 | 2177 |
10635 | 2178 start = memchr(yd->rxqueue + 1, 'Y', yd->rxlen - 1); |
10610 | 2179 if (start) { |
2180 g_memmove(yd->rxqueue, start, yd->rxlen - (start - yd->rxqueue)); | |
2181 yd->rxlen -= start - yd->rxqueue; | |
2182 continue; | |
2183 } else { | |
2184 g_free(yd->rxqueue); | |
2185 yd->rxqueue = NULL; | |
2186 yd->rxlen = 0; | |
2187 return; | |
2188 } | |
2189 } | |
2190 | |
2681 | 2191 pos += 4; /* YMSG */ |
2192 pos += 2; | |
2193 pos += 2; | |
2194 | |
2195 pktlen = yahoo_get16(yd->rxqueue + pos); pos += 2; | |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
2196 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2197 "%d bytes to read, rxlen is %d\n", pktlen, yd->rxlen); |
2681 | 2198 |
2199 if (yd->rxlen < (YAHOO_PACKET_HDRLEN + pktlen)) | |
2200 return; | |
2201 | |
2202 yahoo_packet_dump(yd->rxqueue, YAHOO_PACKET_HDRLEN + pktlen); | |
2203 | |
2204 pkt = yahoo_packet_new(0, 0, 0); | |
2205 | |
2206 pkt->service = yahoo_get16(yd->rxqueue + pos); pos += 2; | |
3021 | 2207 pkt->status = yahoo_get32(yd->rxqueue + pos); pos += 4; |
5220
7b9d78fa051e
[gaim-migrate @ 5590]
Christian Hammond <chipx86@chipx86.com>
parents:
5216
diff
changeset
|
2208 gaim_debug(GAIM_DEBUG_MISC, "yahoo", |
5216
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2209 "Yahoo Service: 0x%02x Status: %d\n", |
00bd3019749e
[gaim-migrate @ 5586]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2210 pkt->service, pkt->status); |
2681 | 2211 pkt->id = yahoo_get32(yd->rxqueue + pos); pos += 4; |
2212 | |
2213 yahoo_packet_read(pkt, yd->rxqueue + pos, pktlen); | |
2214 | |
2215 yd->rxlen -= YAHOO_PACKET_HDRLEN + pktlen; | |
2216 if (yd->rxlen) { | |
11318 | 2217 guchar *tmp = g_memdup(yd->rxqueue + YAHOO_PACKET_HDRLEN + pktlen, yd->rxlen); |
2681 | 2218 g_free(yd->rxqueue); |
2219 yd->rxqueue = tmp; | |
2220 } else { | |
2221 g_free(yd->rxqueue); | |
2222 yd->rxqueue = NULL; | |
2223 } | |
2224 | |
2225 yahoo_packet_process(gc, pkt); | |
2226 | |
2227 yahoo_packet_free(pkt); | |
2228 } | |
2229 } | |
2230 | |
2231 static void yahoo_got_connected(gpointer data, gint source, GaimInputCondition cond) | |
2232 { | |
5583 | 2233 GaimConnection *gc = data; |
2681 | 2234 struct yahoo_data *yd; |
2235 struct yahoo_packet *pkt; | |
11076 | 2236 |
5590
011a0a975060
[gaim-migrate @ 5994]
Christian Hammond <chipx86@chipx86.com>
parents:
5583
diff
changeset
|
2237 if (!g_list_find(gaim_connections_get_all(), gc)) { |
2681 | 2238 close(source); |
2239 return; | |
2240 } | |
2241 | |
2242 if (source < 0) { | |
8057 | 2243 gaim_connection_error(gc, _("Unable to connect.")); |
2681 | 2244 return; |
2245 } | |
2246 | |
2247 yd = gc->proto_data; | |
2248 yd->fd = source; | |
11076 | 2249 |
11078 | 2250 pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, yd->current_status, 0); |
2681 | 2251 |
10394 | 2252 yahoo_packet_hash_str(pkt, 1, gaim_normalize(gc->account, gaim_account_get_username(gaim_connection_get_account(gc)))); |
10392 | 2253 yahoo_packet_send_and_free(pkt, yd); |
2681 | 2254 |
2255 gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); | |
2256 } | |
9370 | 2257 |
7134 | 2258 static void yahoo_got_web_connected(gpointer data, gint source, GaimInputCondition cond) |
2259 { | |
2260 GaimConnection *gc = data; | |
2261 struct yahoo_data *yd; | |
2262 struct yahoo_packet *pkt; | |
2263 | |
2264 if (!g_list_find(gaim_connections_get_all(), gc)) { | |
2265 close(source); | |
2266 return; | |
2267 } | |
2268 | |
2269 if (source < 0) { | |
8057 | 2270 gaim_connection_error(gc, _("Unable to connect.")); |
7134 | 2271 return; |
2272 } | |
2273 | |
2274 yd = gc->proto_data; | |
2275 yd->fd = source; | |
2276 | |
2277 pkt = yahoo_packet_new(YAHOO_SERVICE_WEBLOGIN, YAHOO_STATUS_WEBLOGIN, 0); | |
2278 | |
10394 | 2279 yahoo_packet_hash(pkt, "sss", 0, |
2280 gaim_normalize(gc->account, gaim_account_get_username(gaim_connection_get_account(gc))), | |
2281 1, gaim_normalize(gc->account, gaim_account_get_username(gaim_connection_get_account(gc))), | |
2282 6, yd->auth); | |
10392 | 2283 yahoo_packet_send_and_free(pkt, yd); |
2284 | |
7134 | 2285 g_free(yd->auth); |
2286 gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); | |
2287 } | |
2288 | |
2289 static void yahoo_web_pending(gpointer data, gint source, GaimInputCondition cond) | |
2290 { | |
2291 GaimConnection *gc = data; | |
2292 GaimAccount *account = gaim_connection_get_account(gc); | |
2293 struct yahoo_data *yd = gc->proto_data; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2294 char bufread[2048], *i = bufread, *buf = bufread; |
8161 | 2295 int len; |
2296 GString *s; | |
7134 | 2297 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2298 len = read(source, bufread, sizeof(bufread) - 1); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2299 if (len < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2300 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2301 else if (len <= 0) { |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2302 gaim_connection_error(gc, _("Unable to read")); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2303 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2304 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2305 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2306 if (yd->rxlen > 0 || !g_strstr_len(buf, len, "\r\n\r\n")) { |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2307 yd->rxqueue = g_realloc(yd->rxqueue, yd->rxlen + len + 1); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2308 memcpy(yd->rxqueue + yd->rxlen, buf, len); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2309 yd->rxlen += len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2310 i = buf = yd->rxqueue; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2311 len = yd->rxlen; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2312 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2313 buf[len] = '\0'; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2314 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2315 if ((strncmp(buf, "HTTP/1.0 302", strlen("HTTP/1.0 302")) && |
8216
dcace041cfb8
[gaim-migrate @ 8939]
Christian Hammond <chipx86@chipx86.com>
parents:
8212
diff
changeset
|
2316 strncmp(buf, "HTTP/1.1 302", strlen("HTTP/1.1 302")))) { |
7134 | 2317 gaim_connection_error(gc, _("Unable to read")); |
2318 return; | |
2319 } | |
8161 | 2320 |
2321 s = g_string_sized_new(len); | |
2322 | |
2323 while ((i = strstr(i, "Set-Cookie: "))) { | |
2324 i += strlen("Set-Cookie: "); | |
8243 | 2325 for (;*i != ';' && *i != '\0'; i++) |
8161 | 2326 g_string_append_c(s, *i); |
2327 | |
2328 g_string_append(s, "; "); | |
7134 | 2329 } |
8161 | 2330 |
2331 yd->auth = g_string_free(s, FALSE); | |
7134 | 2332 gaim_input_remove(gc->inpa); |
2333 close(source); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2334 g_free(yd->rxqueue); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2335 yd->rxqueue = NULL; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2336 yd->rxlen = 0; |
7134 | 2337 /* Now we have our cookies to login with. I'll go get the milk. */ |
8045 | 2338 if (gaim_proxy_connect(account, "wcs2.msg.dcn.yahoo.com", |
7134 | 2339 gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), |
2340 yahoo_got_web_connected, gc) != 0) { | |
2341 gaim_connection_error(gc, _("Connection problem")); | |
2342 return; | |
11077 | 2343 } |
7134 | 2344 } |
2345 | |
2346 static void yahoo_got_cookies(gpointer data, gint source, GaimInputCondition cond) | |
2347 { | |
2348 GaimConnection *gc = data; | |
2349 struct yahoo_data *yd = gc->proto_data; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2350 int written, total_len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2351 |
7134 | 2352 if (source < 0) { |
8057 | 2353 gaim_connection_error(gc, _("Unable to connect.")); |
7134 | 2354 return; |
2355 } | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2356 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2357 total_len = strlen(yd->auth) - yd->auth_written; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2358 written = write(source, yd->auth + yd->auth_written, total_len); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2359 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2360 if (written < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2361 written = 0; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2362 else if (written <= 0) { |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2363 g_free(yd->auth); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2364 yd->auth = NULL; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2365 if (gc->inpa) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2366 gaim_input_remove(gc->inpa); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2367 gc->inpa = 0; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2368 gaim_connection_error(gc, _("Unable to connect.")); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2369 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2370 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2371 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2372 if (written < total_len) { |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2373 yd->auth_written += written; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2374 if (!gc->inpa) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2375 gc->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2376 yahoo_got_cookies, gc); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2377 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2378 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2379 |
7134 | 2380 g_free(yd->auth); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2381 yd->auth = NULL; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2382 yd->auth_written = 0; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2383 if (gc->inpa) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2384 gaim_input_remove(gc->inpa); |
7134 | 2385 gc->inpa = gaim_input_add(source, GAIM_INPUT_READ, yahoo_web_pending, gc); |
2386 } | |
2387 | |
2388 static void yahoo_login_page_hash_iter(const char *key, const char *val, GString *url) | |
2389 { | |
2390 if (!strcmp(key, "passwd")) | |
2391 return; | |
13711
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
2392 g_string_append_c(url, '&'); |
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
2393 g_string_append(url, key); |
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
2394 g_string_append_c(url, '='); |
7134 | 2395 if (!strcmp(key, ".save") || !strcmp(key, ".js")) |
13711
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
2396 g_string_append_c(url, '1'); |
7134 | 2397 else if (!strcmp(key, ".challenge")) |
13711
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
2398 g_string_append(url, val); |
7134 | 2399 else |
13711
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
2400 g_string_append(url, gaim_url_encode(val)); |
7134 | 2401 } |
2402 | |
2403 static GHashTable *yahoo_login_page_hash(const char *buf, size_t len) | |
2404 { | |
2405 GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
7138
f189f8ccaa98
[gaim-migrate @ 7705]
Christian Hammond <chipx86@chipx86.com>
parents:
7134
diff
changeset
|
2406 const char *c = buf; |
f189f8ccaa98
[gaim-migrate @ 7705]
Christian Hammond <chipx86@chipx86.com>
parents:
7134
diff
changeset
|
2407 char *d; |
7134 | 2408 char name[64], value[64]; |
11188
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2409 int count; |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2410 int input_len = strlen("<input "); |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2411 int name_len = strlen("name=\""); |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2412 int value_len = strlen("value=\""); |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2413 while ((len > ((c - buf) + input_len)) |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2414 && (c = strstr(c, "<input "))) { |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2415 if (!(c = g_strstr_len(c, len - (c - buf), "name=\""))) |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2416 continue; |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2417 c += name_len; |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2418 count = sizeof(name)-1; |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2419 for (d = name; (len > ((c - buf) + 1)) && *c!='"' |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2420 && count; c++, d++, count--) |
7134 | 2421 *d = *c; |
2422 *d = '\0'; | |
8118 | 2423 count = sizeof(value)-1; |
11188
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2424 if (!(d = g_strstr_len(c, len - (c - buf), "value=\""))) |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2425 continue; |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2426 d += value_len; |
7134 | 2427 if (strchr(c, '>') < d) |
2428 break; | |
11188
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2429 for (c = d, d = value; (len > ((c - buf) + 1)) |
12fc7a3fbc88
[gaim-migrate @ 13305]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11183
diff
changeset
|
2430 && *c!='"' && count; c++, d++, count--) |
7134 | 2431 *d = *c; |
2432 *d = '\0'; | |
2433 g_hash_table_insert(hash, g_strdup(name), g_strdup(value)); | |
2434 } | |
2435 return hash; | |
2436 } | |
2437 | |
7138
f189f8ccaa98
[gaim-migrate @ 7705]
Christian Hammond <chipx86@chipx86.com>
parents:
7134
diff
changeset
|
2438 static void yahoo_login_page_cb(void *user_data, const char *buf, size_t len) |
7134 | 2439 { |
7138
f189f8ccaa98
[gaim-migrate @ 7705]
Christian Hammond <chipx86@chipx86.com>
parents:
7134
diff
changeset
|
2440 GaimConnection *gc = (GaimConnection *)user_data; |
7134 | 2441 GaimAccount *account = gaim_connection_get_account(gc); |
2442 struct yahoo_data *yd = gc->proto_data; | |
2443 const char *sn = gaim_account_get_username(account); | |
10740 | 2444 const char *pass = gaim_connection_get_password(gc); |
7134 | 2445 GHashTable *hash = yahoo_login_page_hash(buf, len); |
10575 | 2446 GString *url = g_string_new("GET http://login.yahoo.com/config/login?login="); |
7134 | 2447 char md5[33], *hashp = md5, *chal; |
2448 int i; | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2449 GaimCipher *cipher; |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2450 GaimCipherContext *context; |
11183 | 2451 guchar digest[16]; |
7191
4bd3892cded3
[gaim-migrate @ 7760]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7161
diff
changeset
|
2452 |
4bd3892cded3
[gaim-migrate @ 7760]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7161
diff
changeset
|
2453 url = g_string_append(url, sn); |
4bd3892cded3
[gaim-migrate @ 7760]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7161
diff
changeset
|
2454 url = g_string_append(url, "&passwd="); |
4bd3892cded3
[gaim-migrate @ 7760]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
7161
diff
changeset
|
2455 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2456 cipher = gaim_ciphers_find_cipher("md5"); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2457 context = gaim_cipher_context_new(cipher, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2458 |
11183 | 2459 gaim_cipher_context_append(context, (const guchar *)pass, strlen(pass)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
2460 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
7134 | 2461 for (i = 0; i < 16; ++i) { |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2462 g_snprintf(hashp, 3, "%02x", digest[i]); |
7134 | 2463 hashp += 2; |
2464 } | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2465 |
7134 | 2466 chal = g_strconcat(md5, g_hash_table_lookup(hash, ".challenge"), NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2467 gaim_cipher_context_reset(context, NULL); |
11183 | 2468 gaim_cipher_context_append(context, (const guchar *)chal, strlen(chal)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
2469 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
7134 | 2470 hashp = md5; |
2471 for (i = 0; i < 16; ++i) { | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2472 g_snprintf(hashp, 3, "%02x", digest[i]); |
7134 | 2473 hashp += 2; |
2474 } | |
2475 /* | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2476 * I dunno why this is here and commented out.. but in case it's needed |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2477 * I updated it.. |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2478 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2479 gaim_cipher_context_reset(context, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2480 gaim_cipher_context_append(context, md5, strlen(md5)); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
2481 gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); |
7134 | 2482 hashp = md5; |
2483 for (i = 0; i < 16; ++i) { | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2484 g_snprintf(hashp, 3, "%02x", digest[i]); |
7134 | 2485 hashp += 2; |
2486 } | |
2487 */ | |
2488 g_free(chal); | |
11077 | 2489 |
7134 | 2490 url = g_string_append(url, md5); |
7138
f189f8ccaa98
[gaim-migrate @ 7705]
Christian Hammond <chipx86@chipx86.com>
parents:
7134
diff
changeset
|
2491 g_hash_table_foreach(hash, (GHFunc)yahoo_login_page_hash_iter, url); |
11077 | 2492 |
7134 | 2493 url = g_string_append(url, "&.hash=1&.md5=1 HTTP/1.1\r\n" |
2494 "Host: login.yahoo.com\r\n\r\n"); | |
2495 g_hash_table_destroy(hash); | |
2496 yd->auth = g_string_free(url, FALSE); | |
2497 if (gaim_proxy_connect(account, "login.yahoo.com", 80, yahoo_got_cookies, gc) != 0) { | |
2498 gaim_connection_error(gc, _("Connection problem")); | |
2499 return; | |
2500 } | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2501 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10662
diff
changeset
|
2502 gaim_cipher_context_destroy(context); |
7134 | 2503 } |
2504 | |
7883 | 2505 static void yahoo_server_check(GaimAccount *account) |
2506 { | |
2507 const char *server; | |
2508 | |
2509 server = gaim_account_get_string(account, "server", YAHOO_PAGER_HOST); | |
2510 | |
2511 if (strcmp(server, "scs.yahoo.com") == 0) | |
2512 gaim_account_set_string(account, "server", YAHOO_PAGER_HOST); | |
2513 } | |
9306 | 2514 |
2515 static void yahoo_picture_check(GaimAccount *account) | |
2516 { | |
2517 GaimConnection *gc = gaim_account_get_connection(account); | |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
2518 char *buddyicon; |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
2519 |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
2520 buddyicon = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(account)); |
9306 | 2521 yahoo_set_buddy_icon(gc, buddyicon); |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
2522 g_free(buddyicon); |
9306 | 2523 } |
2524 | |
11972 | 2525 static int get_yahoo_status_from_gaim_status(GaimStatus *status) |
2526 { | |
2527 GaimPresence *presence; | |
2528 const char *status_id; | |
2529 const char *msg; | |
2530 | |
2531 presence = gaim_status_get_presence(status); | |
2532 status_id = gaim_status_get_id(status); | |
2533 msg = gaim_status_get_attr_string(status, "message"); | |
2534 | |
2535 if (!strcmp(status_id, YAHOO_STATUS_TYPE_AVAILABLE)) { | |
2536 if ((msg != NULL) && (*msg != '\0')) | |
2537 return YAHOO_STATUS_CUSTOM; | |
2538 else | |
2539 return YAHOO_STATUS_AVAILABLE; | |
2540 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_BRB)) { | |
2541 return YAHOO_STATUS_BRB; | |
2542 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_BUSY)) { | |
2543 return YAHOO_STATUS_BUSY; | |
2544 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_NOTATHOME)) { | |
2545 return YAHOO_STATUS_NOTATHOME; | |
2546 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_NOTATDESK)) { | |
2547 return YAHOO_STATUS_NOTATDESK; | |
2548 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_NOTINOFFICE)) { | |
2549 return YAHOO_STATUS_NOTINOFFICE; | |
2550 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_ONPHONE)) { | |
2551 return YAHOO_STATUS_ONPHONE; | |
2552 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_ONVACATION)) { | |
2553 return YAHOO_STATUS_ONVACATION; | |
2554 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_OUTTOLUNCH)) { | |
2555 return YAHOO_STATUS_OUTTOLUNCH; | |
2556 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_STEPPEDOUT)) { | |
2557 return YAHOO_STATUS_STEPPEDOUT; | |
2558 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_INVISIBLE)) { | |
2559 return YAHOO_STATUS_INVISIBLE; | |
2560 } else if (!strcmp(status_id, YAHOO_STATUS_TYPE_AWAY)) { | |
2561 return YAHOO_STATUS_CUSTOM; | |
2562 } else if (gaim_presence_is_idle(presence)) { | |
2563 return YAHOO_STATUS_IDLE; | |
2564 } else { | |
2565 gaim_debug_error("yahoo", "Unexpected GaimStatus!\n"); | |
2566 return YAHOO_STATUS_AVAILABLE; | |
2567 } | |
2568 } | |
7883 | 2569 |
11837 | 2570 static void yahoo_login(GaimAccount *account) { |
5583 | 2571 GaimConnection *gc = gaim_account_get_connection(account); |
2681 | 2572 struct yahoo_data *yd = gc->proto_data = g_new0(struct yahoo_data, 1); |
11837 | 2573 GaimStatus *status = gaim_account_get_active_status(account); |
9041 | 2574 gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_NO_BGCOLOR | GAIM_CONNECTION_NO_URLDESC; |
6629 | 2575 |
5583 | 2576 gaim_connection_update_progress(gc, _("Connecting"), 1, 2); |
2681 | 2577 |
8235 | 2578 gaim_connection_set_display_name(gc, gaim_account_get_username(account)); |
2579 | |
2681 | 2580 yd->fd = -1; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2581 yd->txhandler = -1; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2582 /* TODO: Is there a good grow size for the buffer? */ |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2583 yd->txbuf = gaim_circ_buffer_new(0); |
6784 | 2584 yd->friends = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, yahoo_friend_free); |
13849 | 2585 yd->imvironments = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
6729 | 2586 yd->confs = NULL; |
2587 yd->conf_id = 2; | |
11076 | 2588 |
11972 | 2589 yd->current_status = get_yahoo_status_from_gaim_status(status); |
2590 | |
7883 | 2591 yahoo_server_check(account); |
9306 | 2592 yahoo_picture_check(account); |
7883 | 2593 |
9164 | 2594 if (gaim_account_get_bool(account, "yahoojp", FALSE)) { |
2595 yd->jp = TRUE; | |
2596 if (gaim_proxy_connect(account, | |
2597 gaim_account_get_string(account, "serverjp", YAHOOJP_PAGER_HOST), | |
2598 gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), | |
2599 yahoo_got_connected, gc) != 0) | |
2600 { | |
2601 gaim_connection_error(gc, _("Connection problem")); | |
2602 return; | |
2603 } | |
2604 } else { | |
2605 yd->jp = FALSE; | |
2606 if (gaim_proxy_connect(account, | |
2607 gaim_account_get_string(account, "server", YAHOO_PAGER_HOST), | |
2608 gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), | |
2609 yahoo_got_connected, gc) != 0) | |
2610 { | |
2611 gaim_connection_error(gc, _("Connection problem")); | |
2612 return; | |
2613 } | |
2681 | 2614 } |
2615 } | |
2616 | |
5583 | 2617 static void yahoo_close(GaimConnection *gc) { |
2681 | 2618 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
9782 | 2619 GSList *l; |
2620 | |
11608 | 2621 if (gc->inpa) |
2622 gaim_input_remove(gc->inpa); | |
2623 | |
9782 | 2624 for (l = yd->confs; l; l = l->next) { |
2625 GaimConversation *conv = l->data; | |
2626 | |
2627 yahoo_conf_leave(yd, gaim_conversation_get_name(conv), | |
2628 gaim_connection_get_display_name(gc), | |
2629 gaim_conv_chat_get_users(GAIM_CONV_CHAT(conv))); | |
2630 } | |
2631 g_slist_free(yd->confs); | |
6729 | 2632 |
12841
ab37a4cc477e
[gaim-migrate @ 15189]
Richard Laager <rlaager@wiktel.com>
parents:
12798
diff
changeset
|
2633 yd->chat_online = 0; |
ab37a4cc477e
[gaim-migrate @ 15189]
Richard Laager <rlaager@wiktel.com>
parents:
12798
diff
changeset
|
2634 if (yd->in_chat) |
ab37a4cc477e
[gaim-migrate @ 15189]
Richard Laager <rlaager@wiktel.com>
parents:
12798
diff
changeset
|
2635 yahoo_c_leave(gc, 1); /* 1 = YAHOO_CHAT_ID */ |
ab37a4cc477e
[gaim-migrate @ 15189]
Richard Laager <rlaager@wiktel.com>
parents:
12798
diff
changeset
|
2636 |
6784 | 2637 g_hash_table_destroy(yd->friends); |
13849 | 2638 g_hash_table_destroy(yd->imvironments); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2639 g_free(yd->chat_name); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2640 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2641 g_free(yd->cookie_y); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2642 g_free(yd->cookie_t); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2643 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2644 if (yd->txhandler) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2645 gaim_input_remove(yd->txhandler); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2646 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2647 gaim_circ_buffer_destroy(yd->txbuf); |
7651 | 2648 |
2681 | 2649 if (yd->fd >= 0) |
2650 close(yd->fd); | |
3720
34c95669952f
[gaim-migrate @ 3853]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3642
diff
changeset
|
2651 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2652 g_free(yd->rxqueue); |
2687
2d544f48146d
[gaim-migrate @ 2700]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2686
diff
changeset
|
2653 yd->rxlen = 0; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2654 g_free(yd->picture_url); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13106
diff
changeset
|
2655 |
9306 | 2656 if (yd->picture_upload_todo) |
2657 yahoo_buddy_icon_upload_data_free(yd->picture_upload_todo); | |
9376 | 2658 if (yd->ycht) |
2659 ycht_connection_close(yd->ycht); | |
11608 | 2660 |
2681 | 2661 g_free(yd); |
13343
3e87f0c5287d
[gaim-migrate @ 15713]
Richard Laager <rlaager@wiktel.com>
parents:
13296
diff
changeset
|
2662 gc->proto_data = NULL; |
2681 | 2663 } |
2664 | |
6695 | 2665 static const char *yahoo_list_icon(GaimAccount *a, GaimBuddy *b) |
2681 | 2666 { |
4687 | 2667 return "yahoo"; |
2681 | 2668 } |
4916 | 2669 |
9972 | 2670 static void yahoo_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) |
4916 | 2671 { |
2672 int i = 0; | |
2673 char *emblems[4] = {NULL,NULL,NULL,NULL}; | |
6784 | 2674 GaimAccount *account; |
2675 GaimConnection *gc; | |
2676 struct yahoo_data *yd; | |
9278 | 2677 YahooFriend *f; |
10126 | 2678 GaimPresence *presence; |
2679 GaimStatus *status; | |
6784 | 2680 |
2681 if (!b || !(account = b->account) || !(gc = gaim_account_get_connection(account)) || | |
11077 | 2682 !(yd = gc->proto_data)) |
6784 | 2683 return; |
2684 | |
9279 | 2685 f = yahoo_friend_find(gc, b->name); |
6784 | 2686 if (!f) { |
2687 *se = "notauthorized"; | |
2688 return; | |
2689 } | |
2690 | |
10126 | 2691 presence = gaim_buddy_get_presence(b); |
2692 status = gaim_presence_get_active_status(presence); | |
2693 | |
2694 if (gaim_presence_is_online(presence) == FALSE) { | |
4916 | 2695 *se = "offline"; |
2696 return; | |
2697 } else { | |
6784 | 2698 if (f->away) |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
2699 emblems[i++] = "away"; |
6784 | 2700 if (f->sms) |
2701 emblems[i++] = "wireless"; | |
9283 | 2702 if (yahoo_friend_get_game(f)) |
4916 | 2703 emblems[i++] = "game"; |
2704 } | |
2705 *se = emblems[0]; | |
2706 *sw = emblems[1]; | |
2707 *nw = emblems[2]; | |
2708 *ne = emblems[3]; | |
2709 } | |
2681 | 2710 |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13041
diff
changeset
|
2711 static const char *yahoo_get_status_string(enum yahoo_status a) |
2681 | 2712 { |
2713 switch (a) { | |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2714 case YAHOO_STATUS_BRB: |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2715 return _("Be Right Back"); |
12203
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
2716 case YAHOO_STATUS_BUSY: |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
2717 return _("Busy"); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2718 case YAHOO_STATUS_NOTATHOME: |
12467
1b57012eec7b
[gaim-migrate @ 14777]
Richard Laager <rlaager@wiktel.com>
parents:
12417
diff
changeset
|
2719 return _("Not at Home"); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2720 case YAHOO_STATUS_NOTATDESK: |
12467
1b57012eec7b
[gaim-migrate @ 14777]
Richard Laager <rlaager@wiktel.com>
parents:
12417
diff
changeset
|
2721 return _("Not at Desk"); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2722 case YAHOO_STATUS_NOTINOFFICE: |
12467
1b57012eec7b
[gaim-migrate @ 14777]
Richard Laager <rlaager@wiktel.com>
parents:
12417
diff
changeset
|
2723 return _("Not in Office"); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2724 case YAHOO_STATUS_ONPHONE: |
12467
1b57012eec7b
[gaim-migrate @ 14777]
Richard Laager <rlaager@wiktel.com>
parents:
12417
diff
changeset
|
2725 return _("On the Phone"); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2726 case YAHOO_STATUS_ONVACATION: |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2727 return _("On Vacation"); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
2728 case YAHOO_STATUS_OUTTOLUNCH: |
12467
1b57012eec7b
[gaim-migrate @ 14777]
Richard Laager <rlaager@wiktel.com>
parents:
12417
diff
changeset
|
2729 return _("Out to Lunch"); |
12203
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
2730 case YAHOO_STATUS_STEPPEDOUT: |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
2731 return _("Stepped Out"); |
2873
26be84883f91
[gaim-migrate @ 2886]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2856
diff
changeset
|
2732 case YAHOO_STATUS_INVISIBLE: |
4596 | 2733 return _("Invisible"); |
4730 | 2734 case YAHOO_STATUS_IDLE: |
2735 return _("Idle"); | |
6784 | 2736 case YAHOO_STATUS_OFFLINE: |
2737 return _("Offline"); | |
2879
5fc5123b7098
[gaim-migrate @ 2892]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2878
diff
changeset
|
2738 default: |
12467
1b57012eec7b
[gaim-migrate @ 14777]
Richard Laager <rlaager@wiktel.com>
parents:
12417
diff
changeset
|
2739 return _("Available"); |
2681 | 2740 } |
2741 } | |
2742 | |
9030 | 2743 static void yahoo_initiate_conference(GaimBlistNode *node, gpointer data) { |
2744 | |
2745 GaimBuddy *buddy; | |
2746 GaimConnection *gc; | |
2747 | |
6729 | 2748 GHashTable *components; |
2749 struct yahoo_data *yd; | |
2750 int id; | |
2751 | |
9030 | 2752 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
2753 | |
2754 buddy = (GaimBuddy *) node; | |
2755 gc = gaim_account_get_connection(buddy->account); | |
6729 | 2756 yd = gc->proto_data; |
2757 id = yd->conf_id; | |
2758 | |
2759 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
2760 g_hash_table_replace(components, g_strdup("room"), | |
2761 g_strdup_printf("%s-%d", gaim_connection_get_display_name(gc), id)); | |
2762 g_hash_table_replace(components, g_strdup("topic"), g_strdup("Join my conference...")); | |
2763 g_hash_table_replace(components, g_strdup("type"), g_strdup("Conference")); | |
2764 yahoo_c_join(gc, components); | |
2765 g_hash_table_destroy(components); | |
2766 | |
9030 | 2767 yahoo_c_invite(gc, id, "Join my conference...", buddy->name); |
6729 | 2768 } |
2769 | |
12010 | 2770 static void yahoo_presence_settings(GaimBlistNode *node, gpointer data) { |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2771 GaimBuddy *buddy; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2772 GaimConnection *gc; |
12010 | 2773 int presence_val = GPOINTER_TO_INT(data); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2774 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2775 buddy = (GaimBuddy *) node; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2776 gc = gaim_account_get_connection(buddy->account); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2777 |
12010 | 2778 yahoo_friend_update_presence(gc, buddy->name, presence_val); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2779 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2780 |
9030 | 2781 static void yahoo_game(GaimBlistNode *node, gpointer data) { |
2782 | |
2783 GaimBuddy *buddy; | |
2784 GaimConnection *gc; | |
2785 | |
2786 struct yahoo_data *yd; | |
9283 | 2787 const char *game; |
2788 char *game2; | |
3019 | 2789 char *t; |
2790 char url[256]; | |
9278 | 2791 YahooFriend *f; |
3019 | 2792 |
9030 | 2793 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
2794 | |
2795 buddy = (GaimBuddy *) node; | |
2796 gc = gaim_account_get_connection(buddy->account); | |
2797 yd = (struct yahoo_data *) gc->proto_data; | |
2798 | |
9279 | 2799 f = yahoo_friend_find(gc, buddy->name); |
6784 | 2800 if (!f) |
2801 return; | |
2802 | |
9283 | 2803 game = yahoo_friend_get_game(f); |
3019 | 2804 if (!game) |
2805 return; | |
6784 | 2806 |
9283 | 2807 t = game2 = g_strdup(strstr(game, "ante?room=")); |
2808 while (*t && *t != '\t') | |
3019 | 2809 t++; |
2810 *t = 0; | |
9283 | 2811 g_snprintf(url, sizeof url, "http://games.yahoo.com/games/%s", game2); |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10209
diff
changeset
|
2812 gaim_notify_uri(gc, url); |
9283 | 2813 g_free(game2); |
3019 | 2814 } |
4722 | 2815 |
6695 | 2816 static char *yahoo_status_text(GaimBuddy *b) |
4722 | 2817 { |
9278 | 2818 YahooFriend *f = NULL; |
9283 | 2819 const char *msg; |
11920 | 2820 char *msg2; |
6691
306790891ce7
[gaim-migrate @ 7217]
Christian Hammond <chipx86@chipx86.com>
parents:
6687
diff
changeset
|
2821 |
9279 | 2822 f = yahoo_friend_find(b->account->gc, b->name); |
6784 | 2823 if (!f) |
2824 return g_strdup(_("Not on server list")); | |
2825 | |
2826 switch (f->status) { | |
2827 case YAHOO_STATUS_AVAILABLE: | |
2828 return NULL; | |
2829 case YAHOO_STATUS_IDLE: | |
2830 if (f->idle == -1) | |
2831 return g_strdup(yahoo_get_status_string(f->status)); | |
2832 return NULL; | |
2833 case YAHOO_STATUS_CUSTOM: | |
9283 | 2834 if (!(msg = yahoo_friend_get_status_message(f))) |
6784 | 2835 return NULL; |
11920 | 2836 msg2 = g_markup_escape_text(msg, strlen(msg)); |
2837 gaim_util_chrreplace(msg2, '\n', ' '); | |
2838 return msg2; | |
9224 | 2839 |
6784 | 2840 default: |
2841 return g_strdup(yahoo_get_status_string(f->status)); | |
11077 | 2842 } |
4722 | 2843 } |
2844 | |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12945
diff
changeset
|
2845 void yahoo_tooltip_text(GaimBuddy *b, GString *str, gboolean full) |
4724 | 2846 { |
9278 | 2847 YahooFriend *f; |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13041
diff
changeset
|
2848 char *escaped; |
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13041
diff
changeset
|
2849 char *status = NULL; |
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13041
diff
changeset
|
2850 const char *presence = NULL; |
6784 | 2851 |
9279 | 2852 f = yahoo_friend_find(b->account->gc, b->name); |
6784 | 2853 if (!f) |
8591 | 2854 status = g_strdup_printf("\n%s", _("Not on server list")); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2855 else { |
6784 | 2856 switch (f->status) { |
2857 case YAHOO_STATUS_CUSTOM: | |
9283 | 2858 if (!yahoo_friend_get_status_message(f)) |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12945
diff
changeset
|
2859 return; |
9283 | 2860 status = g_strdup(yahoo_friend_get_status_message(f)); |
6784 | 2861 break; |
10992
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2862 case YAHOO_STATUS_OFFLINE: |
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2863 break; |
6784 | 2864 default: |
2865 status = g_strdup(yahoo_get_status_string(f->status)); | |
2866 break; | |
4745 | 2867 } |
6784 | 2868 |
12010 | 2869 switch (f->presence) { |
2870 case YAHOO_PRESENCE_ONLINE: | |
2871 presence = _("Appear Online"); | |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2872 break; |
12010 | 2873 case YAHOO_PRESENCE_PERM_OFFLINE: |
2874 presence = _("Appear Permanently Offline"); | |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2875 break; |
12010 | 2876 case YAHOO_PRESENCE_DEFAULT: |
12945
6af3ac33eeea
[gaim-migrate @ 15298]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2877 break; |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2878 default: |
12945
6af3ac33eeea
[gaim-migrate @ 15298]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2879 gaim_debug_error("yahoo", "Unknown presence in yahoo_tooltip_text\n"); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2880 break; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2881 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2882 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2883 |
10992
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2884 if (status != NULL) { |
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2885 escaped = g_markup_escape_text(status, strlen(status)); |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12945
diff
changeset
|
2886 g_string_append_printf(str, _("\n<b>%s:</b> %s"), _("Status"), escaped); |
10992
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2887 g_free(status); |
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2888 g_free(escaped); |
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10989
diff
changeset
|
2889 } |
6784 | 2890 |
12945
6af3ac33eeea
[gaim-migrate @ 15298]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2891 if (presence != NULL) |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12945
diff
changeset
|
2892 g_string_append_printf(str, _("\n<b>%s:</b> %s"), |
12010 | 2893 _("Presence"), presence); |
4729 | 2894 } |
2895 | |
9030 | 2896 static void yahoo_addbuddyfrommenu_cb(GaimBlistNode *node, gpointer data) |
2897 { | |
2898 GaimBuddy *buddy; | |
2899 GaimConnection *gc; | |
2900 | |
2901 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
2902 | |
2903 buddy = (GaimBuddy *) node; | |
2904 gc = gaim_account_get_connection(buddy->account); | |
2905 | |
9285 | 2906 yahoo_add_buddy(gc, buddy, NULL); |
9030 | 2907 } |
2908 | |
2909 | |
2910 static void yahoo_chat_goto_menu(GaimBlistNode *node, gpointer data) | |
6796 | 2911 { |
9030 | 2912 GaimBuddy *buddy; |
2913 GaimConnection *gc; | |
2914 | |
2915 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
2916 | |
2917 buddy = (GaimBuddy *) node; | |
2918 gc = gaim_account_get_connection(buddy->account); | |
2919 | |
2920 yahoo_chat_goto(gc, buddy->name); | |
6796 | 2921 } |
2922 | |
12010 | 2923 static GList *build_presence_submenu(YahooFriend *f, GaimConnection *gc) { |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2924 GList *m = NULL; |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2925 GaimMenuAction *act; |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2926 struct yahoo_data *yd = (struct yahoo_data *) gc->proto_data; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2927 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2928 if (yd->current_status == YAHOO_STATUS_INVISIBLE) { |
12010 | 2929 if (f->presence != YAHOO_PRESENCE_ONLINE) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2930 act = gaim_menu_action_new(_("Appear Online"), |
13021
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2931 GAIM_CALLBACK(yahoo_presence_settings), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2932 GINT_TO_POINTER(YAHOO_PRESENCE_ONLINE), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2933 NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2934 m = g_list_append(m, act); |
12010 | 2935 } else if (f->presence != YAHOO_PRESENCE_DEFAULT) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2936 act = gaim_menu_action_new(_("Appear Offline"), |
13021
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2937 GAIM_CALLBACK(yahoo_presence_settings), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2938 GINT_TO_POINTER(YAHOO_PRESENCE_DEFAULT), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2939 NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2940 m = g_list_append(m, act); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2941 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2942 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2943 |
12010 | 2944 if (f->presence == YAHOO_PRESENCE_PERM_OFFLINE) { |
13021
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2945 act = gaim_menu_action_new(_("Don't Appear Permanently Offline"), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2946 GAIM_CALLBACK(yahoo_presence_settings), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2947 GINT_TO_POINTER(YAHOO_PRESENCE_DEFAULT), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2948 NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2949 m = g_list_append(m, act); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2950 } else { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2951 act = gaim_menu_action_new(_("Appear Permanently Offline"), |
13021
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2952 GAIM_CALLBACK(yahoo_presence_settings), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2953 GINT_TO_POINTER(YAHOO_PRESENCE_PERM_OFFLINE), |
eb64b2b26e56
[gaim-migrate @ 15374]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12999
diff
changeset
|
2954 NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2955 m = g_list_append(m, act); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2956 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2957 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2958 return m; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2959 } |
9030 | 2960 |
11800
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2961 static void yahoo_doodle_blist_node(GaimBlistNode *node, gpointer data) |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2962 { |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2963 GaimBuddy *b = (GaimBuddy *)node; |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2964 GaimConnection *gc = b->account->gc; |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2965 |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2966 yahoo_doodle_initiate(gc, b->name); |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2967 } |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
2968 |
9030 | 2969 static GList *yahoo_buddy_menu(GaimBuddy *buddy) |
2681 | 2970 { |
2971 GList *m = NULL; | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2972 GaimMenuAction *act; |
9030 | 2973 |
2974 GaimConnection *gc = gaim_account_get_connection(buddy->account); | |
9370 | 2975 struct yahoo_data *yd = gc->proto_data; |
3019 | 2976 static char buf2[1024]; |
9278 | 2977 YahooFriend *f; |
6784 | 2978 |
9279 | 2979 f = yahoo_friend_find(gc, buddy->name); |
6784 | 2980 |
9370 | 2981 if (!f && !yd->wm) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2982 act = gaim_menu_action_new(_("Add Buddy"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2983 GAIM_CALLBACK(yahoo_addbuddyfrommenu_cb), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2984 NULL, NULL); |
9030 | 2985 m = g_list_append(m, act); |
6784 | 2986 |
2987 return m; | |
9030 | 2988 |
2989 } | |
2990 | |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2991 if (f && f->status != YAHOO_STATUS_OFFLINE) { |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2992 if (!yd->wm) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2993 act = gaim_menu_action_new(_("Join in Chat"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2994 GAIM_CALLBACK(yahoo_chat_goto_menu), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2995 NULL, NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2996 m = g_list_append(m, act); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2997 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
2998 |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
2999 act = gaim_menu_action_new(_("Initiate Conference"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3000 GAIM_CALLBACK(yahoo_initiate_conference), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3001 NULL, NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3002 m = g_list_append(m, act); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3003 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3004 if (yahoo_friend_get_game(f)) { |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3005 const char *game = yahoo_friend_get_game(f); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3006 char *room; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3007 char *t; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3008 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3009 if ((room = strstr(game, "&follow="))) {/* skip ahead to the url */ |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3010 while (*room && *room != '\t') /* skip to the tab */ |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3011 room++; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3012 t = room++; /* room as now at the name */ |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3013 while (*t != '\n') |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3014 t++; /* replace the \n with a space */ |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3015 *t = ' '; |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3016 g_snprintf(buf2, sizeof buf2, "%s", room); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3017 |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3018 act = gaim_menu_action_new(buf2, |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3019 GAIM_CALLBACK(yahoo_game), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3020 NULL, NULL); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3021 m = g_list_append(m, act); |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3022 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3023 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3024 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3025 |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3026 if (f) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3027 act = gaim_menu_action_new(_("Presence Settings"), NULL, NULL, |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3028 build_presence_submenu(f, gc)); |
9030 | 3029 m = g_list_append(m, act); |
3019 | 3030 } |
6729 | 3031 |
11800
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
3032 if (f) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3033 act = gaim_menu_action_new(_("Start Doodling"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3034 GAIM_CALLBACK(yahoo_doodle_blist_node), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12878
diff
changeset
|
3035 NULL, NULL); |
11800
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
3036 m = g_list_append(m, act); |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
3037 } |
32bac0647037
[gaim-migrate @ 14091]
Gary Kramlich <grim@reaperworld.com>
parents:
11718
diff
changeset
|
3038 |
2681 | 3039 return m; |
3040 } | |
3041 | |
9030 | 3042 static GList *yahoo_blist_node_menu(GaimBlistNode *node) |
3043 { | |
3044 if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
3045 return yahoo_buddy_menu((GaimBuddy *) node); | |
3046 } else { | |
3047 return NULL; | |
3048 } | |
3049 } | |
3050 | |
5583 | 3051 static void yahoo_act_id(GaimConnection *gc, const char *entry) |
2681 | 3052 { |
3053 struct yahoo_data *yd = gc->proto_data; | |
3054 | |
3055 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_IDACT, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3056 yahoo_packet_hash_str(pkt, 3, entry); |
10392 | 3057 yahoo_packet_send_and_free(pkt, yd); |
2681 | 3058 |
5583 | 3059 gaim_connection_set_display_name(gc, entry); |
2681 | 3060 } |
3061 | |
9015 | 3062 static void yahoo_show_act_id(GaimPluginAction *action) |
2681 | 3063 { |
9015 | 3064 GaimConnection *gc = (GaimConnection *) action->context; |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3065 gaim_request_input(gc, NULL, _("Active which ID?"), NULL, |
8697 | 3066 gaim_connection_get_display_name(gc), FALSE, FALSE, NULL, |
5493
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3067 _("OK"), G_CALLBACK(yahoo_act_id), |
3e8487580024
[gaim-migrate @ 5889]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
3068 _("Cancel"), NULL, gc); |
2681 | 3069 } |
3070 | |
9015 | 3071 static void yahoo_show_chat_goto(GaimPluginAction *action) |
7878 | 3072 { |
9015 | 3073 GaimConnection *gc = (GaimConnection *) action->context; |
7878 | 3074 gaim_request_input(gc, NULL, _("Join who in chat?"), NULL, |
8697 | 3075 "", FALSE, FALSE, NULL, |
7878 | 3076 _("OK"), G_CALLBACK(yahoo_chat_goto), |
3077 _("Cancel"), NULL, gc); | |
3078 } | |
3079 | |
9015 | 3080 static GList *yahoo_actions(GaimPlugin *plugin, gpointer context) { |
2681 | 3081 GList *m = NULL; |
9015 | 3082 GaimPluginAction *act; |
3083 | |
3084 act = gaim_plugin_action_new(_("Activate ID..."), | |
3085 yahoo_show_act_id); | |
3086 m = g_list_append(m, act); | |
3087 | |
12243
d3cb077caf3e
[gaim-migrate @ 14545]
Richard Laager <rlaager@wiktel.com>
parents:
12216
diff
changeset
|
3088 act = gaim_plugin_action_new(_("Join User in Chat..."), |
9015 | 3089 yahoo_show_chat_goto); |
3090 m = g_list_append(m, act); | |
7878 | 3091 |
2681 | 3092 return m; |
3093 } | |
3094 | |
12216 | 3095 static int yahoo_send_im(GaimConnection *gc, const char *who, const char *what, GaimMessageFlags flags) |
2681 | 3096 { |
3097 struct yahoo_data *yd = gc->proto_data; | |
3098 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); | |
6629 | 3099 char *msg = yahoo_html_to_codes(what); |
7827 | 3100 char *msg2; |
3101 gboolean utf8 = TRUE; | |
11506
88d504770c60
[gaim-migrate @ 13751]
Richard Laager <rlaager@wiktel.com>
parents:
11475
diff
changeset
|
3102 GaimWhiteboard *wb; |
9828 | 3103 int ret = 1; |
7827 | 3104 |
3105 msg2 = yahoo_string_encode(gc, msg, &utf8); | |
2681 | 3106 |
10394 | 3107 yahoo_packet_hash(pkt, "ss", 1, gaim_connection_get_display_name(gc), 5, who); |
7827 | 3108 if (utf8) |
10394 | 3109 yahoo_packet_hash_str(pkt, 97, "1"); |
3110 yahoo_packet_hash_str(pkt, 14, msg2); | |
3111 | |
13849 | 3112 /* |
3113 * IMVironment. | |
3114 * | |
3115 * If this message is to a user who is also Doodling with the local user, | |
11644 | 3116 * format the chat packet with the correct IMV information (thanks Yahoo!) |
13849 | 3117 * |
3118 * Otherwise attempt to use the same IMVironment as the remote user, | |
3119 * just so that we don't inadvertantly reset their IMVironment back | |
3120 * to nothing. | |
3121 * | |
3122 * If they have no set an IMVironment, then use the default. | |
3123 */ | |
3124 wb = gaim_whiteboard_get_session(gc->account, who); | |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3125 if (wb) |
13849 | 3126 yahoo_packet_hash_str(pkt, 63, "doodle;11"); |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3127 else |
13849 | 3128 { |
3129 const char *imv; | |
3130 imv = g_hash_table_lookup(yd->imvironments, who); | |
3131 if (imv != NULL) | |
3132 yahoo_packet_hash_str(pkt, 63, imv); | |
3133 else | |
3134 yahoo_packet_hash_str(pkt, 63, ";0"); | |
3135 } | |
11608 | 3136 |
10394 | 3137 yahoo_packet_hash_str(pkt, 64, "0"); /* no idea */ |
3138 yahoo_packet_hash_str(pkt, 1002, "1"); /* no idea, Yahoo 6 or later only it seems */ | |
9306 | 3139 if (!yd->picture_url) |
10394 | 3140 yahoo_packet_hash_str(pkt, 206, "0"); /* 0 = no picture, 2 = picture, maybe 1 = avatar? */ |
9306 | 3141 else |
10394 | 3142 yahoo_packet_hash_str(pkt, 206, "2"); |
2681 | 3143 |
9828 | 3144 /* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */ |
3145 if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) | |
10392 | 3146 yahoo_packet_send(pkt, yd); |
9828 | 3147 else |
3148 ret = -E2BIG; | |
2681 | 3149 |
3150 yahoo_packet_free(pkt); | |
6629 | 3151 |
3152 g_free(msg); | |
7827 | 3153 g_free(msg2); |
6629 | 3154 |
9828 | 3155 return ret; |
2681 | 3156 } |
3157 | |
13842 | 3158 static unsigned int yahoo_send_typing(GaimConnection *gc, const char *who, GaimTypingState state) |
2993 | 3159 { |
3160 struct yahoo_data *yd = gc->proto_data; | |
3019 | 3161 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); |
10394 | 3162 yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, gaim_connection_get_display_name(gc), |
13842 | 3163 14, " ", 13, state == GAIM_TYPING ? "1" : "0", |
10394 | 3164 5, who, 1002, "1"); |
2993 | 3165 |
10392 | 3166 yahoo_packet_send_and_free(pkt, yd); |
2993 | 3167 |
3001 | 3168 return 0; |
2993 | 3169 } |
3170 | |
12010 | 3171 static void yahoo_session_presence_remove(gpointer key, gpointer value, gpointer data) |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3172 { |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3173 YahooFriend *f = value; |
12010 | 3174 if (f && f->presence == YAHOO_PRESENCE_ONLINE) |
3175 f->presence = YAHOO_PRESENCE_DEFAULT; | |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3176 } |
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3177 |
9984 | 3178 static void yahoo_set_status(GaimAccount *account, GaimStatus *status) |
2681 | 3179 { |
11972 | 3180 GaimConnection *gc; |
3181 GaimPresence *presence; | |
10400 | 3182 struct yahoo_data *yd; |
2681 | 3183 struct yahoo_packet *pkt; |
10400 | 3184 int old_status; |
11970 | 3185 const char *msg = NULL; |
3186 char *tmp = NULL; | |
7827 | 3187 char *conv_msg = NULL; |
9984 | 3188 |
10400 | 3189 if (!gaim_status_is_active(status)) |
3190 return; | |
3191 | |
11972 | 3192 gc = gaim_account_get_connection(account); |
3193 presence = gaim_status_get_presence(status); | |
10400 | 3194 yd = (struct yahoo_data *)gc->proto_data; |
3195 old_status = yd->current_status; | |
9984 | 3196 |
11972 | 3197 yd->current_status = get_yahoo_status_from_gaim_status(status); |
3198 | |
3199 if (yd->current_status == YAHOO_STATUS_CUSTOM) | |
3200 { | |
11970 | 3201 msg = gaim_status_get_attr_string(status, "message"); |
11972 | 3202 |
3203 if (gaim_status_is_available(status)) { | |
3204 tmp = yahoo_string_encode(gc, msg, NULL); | |
3205 conv_msg = gaim_markup_strip_html(tmp); | |
3206 g_free(tmp); | |
11970 | 3207 } else { |
11972 | 3208 if ((msg == NULL) || (*msg == '\0')) |
3209 msg = _("Away"); | |
11970 | 3210 tmp = yahoo_string_encode(gc, msg, NULL); |
3211 conv_msg = gaim_markup_strip_html(tmp); | |
3212 g_free(tmp); | |
3213 } | |
2681 | 3214 } |
3215 | |
10373 | 3216 if (yd->current_status == YAHOO_STATUS_INVISIBLE) { |
3217 pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3218 yahoo_packet_hash_str(pkt, 13, "2"); |
10392 | 3219 yahoo_packet_send_and_free(pkt, yd); |
10373 | 3220 |
3221 return; | |
3222 } | |
3223 | |
3224 pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3225 yahoo_packet_hash_int(pkt, 10, yd->current_status); |
6847 | 3226 |
9984 | 3227 if (yd->current_status == YAHOO_STATUS_CUSTOM) { |
11970 | 3228 yahoo_packet_hash_str(pkt, 19, conv_msg); |
10373 | 3229 } else { |
10394 | 3230 yahoo_packet_hash_str(pkt, 19, ""); |
10373 | 3231 } |
3232 | |
11970 | 3233 g_free(conv_msg); |
3234 | |
11972 | 3235 if (gaim_presence_is_idle(presence)) |
10394 | 3236 yahoo_packet_hash_str(pkt, 47, "2"); |
11972 | 3237 else if (!gaim_status_is_available(status)) |
10394 | 3238 yahoo_packet_hash_str(pkt, 47, "1"); |
2681 | 3239 |
10392 | 3240 yahoo_packet_send_and_free(pkt, yd); |
9984 | 3241 |
10373 | 3242 if (old_status == YAHOO_STATUS_INVISIBLE) { |
3243 pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3244 yahoo_packet_hash_str(pkt, 13, "1"); |
10392 | 3245 yahoo_packet_send_and_free(pkt, yd); |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3246 |
12010 | 3247 /* Any per-session presence settings are removed */ |
3248 g_hash_table_foreach(yd->friends, yahoo_session_presence_remove, NULL); | |
10989
b4919e8c634c
[gaim-migrate @ 12827]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10963
diff
changeset
|
3249 |
10373 | 3250 } |
2681 | 3251 } |
3252 | |
5583 | 3253 static void yahoo_set_idle(GaimConnection *gc, int idle) |
2681 | 3254 { |
3255 struct yahoo_data *yd = gc->proto_data; | |
3256 struct yahoo_packet *pkt = NULL; | |
8503 | 3257 char *msg = NULL, *msg2 = NULL; |
13558
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3258 GaimStatus *status = NULL; |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3259 |
13686
2d31d61f572c
[gaim-migrate @ 16089]
Richard Laager <rlaager@wiktel.com>
parents:
13558
diff
changeset
|
3260 if (idle && yd->current_status != YAHOO_STATUS_CUSTOM) |
2681 | 3261 yd->current_status = YAHOO_STATUS_IDLE; |
13558
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3262 else if (!idle && yd->current_status == YAHOO_STATUS_IDLE) { |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3263 status = gaim_presence_get_active_status(gaim_account_get_presence(gaim_connection_get_account(gc))); |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3264 yd->current_status = get_yahoo_status_from_gaim_status(status); |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3265 } |
10373 | 3266 |
3267 pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, YAHOO_STATUS_AVAILABLE, 0); | |
3268 | |
10394 | 3269 yahoo_packet_hash_int(pkt, 10, yd->current_status); |
10373 | 3270 if (yd->current_status == YAHOO_STATUS_CUSTOM) { |
10504 | 3271 const char *tmp; |
13558
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3272 if (status == NULL) |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3273 status = gaim_presence_get_active_status(gaim_account_get_presence(gaim_connection_get_account(gc))); |
10504 | 3274 tmp = gaim_status_get_attr_string(status, "message"); |
3275 if (tmp != NULL) { | |
3276 msg = yahoo_string_encode(gc, tmp, NULL); | |
11640 | 3277 msg2 = gaim_markup_strip_html(msg); |
10504 | 3278 yahoo_packet_hash_str(pkt, 19, msg2); |
3279 } else { | |
13558
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3280 /* get_yahoo_status_from_gaim_status() returns YAHOO_STATUS_CUSTOM for |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3281 * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message */ |
a0969be53e17
[gaim-migrate @ 15937]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13461
diff
changeset
|
3282 yahoo_packet_hash_str(pkt, 19, _("Away")); |
10504 | 3283 } |
6847 | 3284 } else { |
10394 | 3285 yahoo_packet_hash_str(pkt, 19, ""); |
2681 | 3286 } |
3287 | |
10373 | 3288 if (idle) |
10394 | 3289 yahoo_packet_hash_str(pkt, 47, "2"); |
10373 | 3290 else if (!gaim_presence_is_available(gaim_account_get_presence(gaim_connection_get_account(gc)))) |
10394 | 3291 yahoo_packet_hash_str(pkt, 47, "1"); |
10373 | 3292 |
10392 | 3293 yahoo_packet_send_and_free(pkt, yd); |
10373 | 3294 |
3295 g_free(msg); | |
3296 g_free(msg2); | |
2681 | 3297 } |
3298 | |
9979 | 3299 static GList *yahoo_status_types(GaimAccount *account) |
2681 | 3300 { |
9979 | 3301 GaimStatusType *type; |
3302 GList *types = NULL; | |
3303 | |
11970 | 3304 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AVAILABLE, YAHOO_STATUS_TYPE_AVAILABLE, |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12489
diff
changeset
|
3305 NULL, TRUE, TRUE, FALSE, |
11970 | 3306 "message", _("Message"), |
3307 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
3308 types = g_list_append(types, type); | |
3309 | |
3310 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_AWAY, | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12489
diff
changeset
|
3311 NULL, TRUE, TRUE, FALSE, |
11970 | 3312 "message", _("Message"), |
3313 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
3314 types = g_list_append(types, type); | |
3315 | |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3316 type = gaim_status_type_new(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_BRB, _("Be Right Back"), TRUE); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3317 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3318 |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12489
diff
changeset
|
3319 type = gaim_status_type_new(GAIM_STATUS_UNAVAILABLE, YAHOO_STATUS_TYPE_BUSY, _("Busy"), TRUE); |
11970 | 3320 types = g_list_append(types, type); |
3321 | |
12489 | 3322 type = gaim_status_type_new(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_NOTATHOME, _("Not at Home"), TRUE); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3323 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3324 |
12489 | 3325 type = gaim_status_type_new(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_NOTATDESK, _("Not at Desk"), TRUE); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3326 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3327 |
12489 | 3328 type = gaim_status_type_new(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_NOTINOFFICE, _("Not in Office"), TRUE); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3329 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3330 |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12489
diff
changeset
|
3331 type = gaim_status_type_new(GAIM_STATUS_UNAVAILABLE, YAHOO_STATUS_TYPE_ONPHONE, _("On the Phone"), TRUE); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3332 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3333 |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12489
diff
changeset
|
3334 type = gaim_status_type_new(GAIM_STATUS_EXTENDED_AWAY, YAHOO_STATUS_TYPE_ONVACATION, _("On Vacation"), TRUE); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3335 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3336 |
12489 | 3337 type = gaim_status_type_new(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_OUTTOLUNCH, _("Out to Lunch"), TRUE); |
12206
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3338 types = g_list_append(types, type); |
d345299ff3bc
[gaim-migrate @ 14508]
Luke Schierer <lschiere@pidgin.im>
parents:
12203
diff
changeset
|
3339 |
12203
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
3340 type = gaim_status_type_new(GAIM_STATUS_AWAY, YAHOO_STATUS_TYPE_STEPPEDOUT, _("Stepped Out"), TRUE); |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
3341 types = g_list_append(types, type); |
0aeda1869b32
[gaim-migrate @ 14505]
Luke Schierer <lschiere@pidgin.im>
parents:
12152
diff
changeset
|
3342 |
11970 | 3343 |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12489
diff
changeset
|
3344 type = gaim_status_type_new(GAIM_STATUS_INVISIBLE, YAHOO_STATUS_TYPE_INVISIBLE, NULL, TRUE); |
9979 | 3345 types = g_list_append(types, type); |
3346 | |
12658 | 3347 type = gaim_status_type_new(GAIM_STATUS_OFFLINE, YAHOO_STATUS_TYPE_OFFLINE, NULL, TRUE); |
3348 types = g_list_append(types, type); | |
3349 | |
9979 | 3350 return types; |
2681 | 3351 } |
3352 | |
5583 | 3353 static void yahoo_keepalive(GaimConnection *gc) |
2681 | 3354 { |
3355 struct yahoo_data *yd = gc->proto_data; | |
3356 struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_PING, YAHOO_STATUS_AVAILABLE, 0); | |
10392 | 3357 yahoo_packet_send_and_free(pkt, yd); |
6729 | 3358 |
3359 if (!yd->chat_online) | |
3360 return; | |
3361 | |
9376 | 3362 if (yd->wm) { |
3363 ycht_chat_send_keepalive(yd->ycht); | |
3364 return; | |
3365 } | |
3366 | |
6729 | 3367 pkt = yahoo_packet_new(YAHOO_SERVICE_CHATPING, YAHOO_STATUS_AVAILABLE, 0); |
10394 | 3368 yahoo_packet_hash_str(pkt, 109, gaim_connection_get_display_name(gc)); |
3369 yahoo_packet_send_and_free(pkt, yd); | |
2681 | 3370 } |
3371 | |
9285 | 3372 /* XXX - What's the deal with GaimGroup *foo? */ |
3373 static void yahoo_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *foo) | |
2681 | 3374 { |
3375 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
3376 struct yahoo_packet *pkt; | |
6695 | 3377 GaimGroup *g; |
2681 | 3378 char *group = NULL; |
7829 | 3379 char *group2 = NULL; |
2681 | 3380 |
3381 if (!yd->logged_in) | |
3382 return; | |
3383 | |
10963 | 3384 if (!yahoo_privacy_check(gc, gaim_buddy_get_name(buddy))) |
3385 return; | |
3386 | |
6840 | 3387 if (foo) |
3388 group = foo->name; | |
3389 if (!group) { | |
12088 | 3390 g = gaim_buddy_get_group(gaim_find_buddy(gc->account, buddy->name)); |
6840 | 3391 if (g) |
3392 group = g->name; | |
3393 else | |
3394 group = "Buddies"; | |
3395 } | |
2681 | 3396 |
7829 | 3397 group2 = yahoo_string_encode(gc, group, NULL); |
2681 | 3398 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
10394 | 3399 yahoo_packet_hash(pkt, "ssss", 1, gaim_connection_get_display_name(gc), |
3400 7, buddy->name, 65, group2, 14, ""); | |
10392 | 3401 yahoo_packet_send_and_free(pkt, yd); |
7829 | 3402 g_free(group2); |
2681 | 3403 } |
3404 | |
9285 | 3405 static void yahoo_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
2681 | 3406 { |
3407 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
6795
40ba19133882
[gaim-migrate @ 7334]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
6793
diff
changeset
|
3408 struct yahoo_packet *pkt; |
6840 | 3409 GSList *buddies, *l; |
3410 GaimGroup *g; | |
3411 gboolean remove = TRUE; | |
7827 | 3412 char *cg; |
6784 | 3413 |
13711
967ef719cb62
[gaim-migrate @ 16115]
Richard Laager <rlaager@wiktel.com>
parents:
13705
diff
changeset
|
3414 if (!(yahoo_friend_find(gc, buddy->name))) |
6784 | 3415 return; |
3416 | |
9285 | 3417 buddies = gaim_find_buddies(gaim_connection_get_account(gc), buddy->name); |
6840 | 3418 for (l = buddies; l; l = l->next) { |
12088 | 3419 g = gaim_buddy_get_group(l->data); |
9285 | 3420 if (gaim_utf8_strcasecmp(group->name, g->name)) { |
6840 | 3421 remove = FALSE; |
3422 break; | |
3423 } | |
3424 } | |
3425 | |
3426 g_slist_free(buddies); | |
3427 | |
3428 if (remove) | |
9285 | 3429 g_hash_table_remove(yd->friends, buddy->name); |
3430 | |
3431 cg = yahoo_string_encode(gc, group->name, NULL); | |
6795
40ba19133882
[gaim-migrate @ 7334]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
6793
diff
changeset
|
3432 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
10394 | 3433 yahoo_packet_hash(pkt, "sss", 1, gaim_connection_get_display_name(gc), |
3434 7, buddy->name, 65, cg); | |
10392 | 3435 yahoo_packet_send_and_free(pkt, yd); |
7827 | 3436 g_free(cg); |
2681 | 3437 } |
3438 | |
6760 | 3439 static void yahoo_add_deny(GaimConnection *gc, const char *who) { |
3440 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
3441 struct yahoo_packet *pkt; | |
3442 | |
3443 if (!yd->logged_in) | |
3444 return; | |
8057 | 3445 /* It seems to work better without this */ |
3446 | |
8113 | 3447 /* if (gc->account->perm_deny != 4) |
3448 return; */ | |
3449 | |
3450 if (!who || who[0] == '\0') | |
3451 return; | |
3452 | |
6760 | 3453 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, 0); |
10394 | 3454 yahoo_packet_hash(pkt, "sss", 1, gaim_connection_get_display_name(gc), |
3455 7, who, 13, "1"); | |
10392 | 3456 yahoo_packet_send_and_free(pkt, yd); |
6760 | 3457 } |
3458 | |
3459 static void yahoo_rem_deny(GaimConnection *gc, const char *who) { | |
3460 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | |
3461 struct yahoo_packet *pkt; | |
3462 | |
3463 if (!yd->logged_in) | |
3464 return; | |
3465 | |
3466 if (!who || who[0] == '\0') | |
3467 return; | |
3468 | |
3469 pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3470 yahoo_packet_hash(pkt, "sss", 1, gaim_connection_get_display_name(gc), 7, who, 13, "2"); |
10392 | 3471 yahoo_packet_send_and_free(pkt, yd); |
6760 | 3472 } |
3473 | |
3474 static void yahoo_set_permit_deny(GaimConnection *gc) { | |
3475 GaimAccount *acct; | |
3476 GSList *deny; | |
3477 | |
3478 acct = gc->account; | |
3479 | |
3480 switch (acct->perm_deny) { | |
10105 | 3481 /* privacy 1 */ |
3482 case GAIM_PRIVACY_ALLOW_ALL: | |
10143 | 3483 for (deny = acct->deny;deny;deny = deny->next) |
3484 yahoo_rem_deny(gc, deny->data); | |
3485 break; | |
10105 | 3486 /* privacy 3 */ |
3487 case GAIM_PRIVACY_ALLOW_USERS: | |
6760 | 3488 for (deny = acct->deny;deny;deny = deny->next) |
3489 yahoo_rem_deny(gc, deny->data); | |
3490 break; | |
10105 | 3491 /* privacy 5 */ |
3492 case GAIM_PRIVACY_ALLOW_BUDDYLIST: | |
3493 /* privacy 4 */ | |
3494 case GAIM_PRIVACY_DENY_USERS: | |
6760 | 3495 for (deny = acct->deny;deny;deny = deny->next) |
3496 yahoo_add_deny(gc, deny->data); | |
3497 break; | |
10105 | 3498 /* privacy 2 */ |
3499 case GAIM_PRIVACY_DENY_ALL: | |
6760 | 3500 default: |
3501 break; | |
3502 } | |
3503 } | |
3504 | |
6513 | 3505 static gboolean yahoo_unload_plugin(GaimPlugin *plugin) |
3506 { | |
3507 yahoo_dest_colorht(); | |
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10992
diff
changeset
|
3508 |
6513 | 3509 return TRUE; |
3510 } | |
3511 | |
6793 | 3512 static void yahoo_change_buddys_group(GaimConnection *gc, const char *who, |
3513 const char *old_group, const char *new_group) | |
3514 { | |
3515 struct yahoo_data *yd = gc->proto_data; | |
3516 struct yahoo_packet *pkt; | |
7827 | 3517 char *gpn, *gpo; |
6793 | 3518 |
3519 /* Step 0: If they aren't on the server list anyway, | |
3520 * don't bother letting the server know. | |
3521 */ | |
9279 | 3522 if (!yahoo_friend_find(gc, who)) |
6793 | 3523 return; |
3524 | |
7827 | 3525 /* If old and new are the same, we would probably |
3526 * end up deleting the buddy, which would be bad. | |
3527 * This might happen because of the charset conversation. | |
3528 */ | |
3529 gpn = yahoo_string_encode(gc, new_group, NULL); | |
3530 gpo = yahoo_string_encode(gc, old_group, NULL); | |
3531 if (!strcmp(gpn, gpo)) { | |
3532 g_free(gpn); | |
3533 g_free(gpo); | |
3534 return; | |
3535 } | |
3536 | |
6793 | 3537 /* Step 1: Add buddy to new group. */ |
3538 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3539 yahoo_packet_hash(pkt, "ssss", 1, gaim_connection_get_display_name(gc), |
3540 7, who, 65, gpn, 14, ""); | |
10392 | 3541 yahoo_packet_send_and_free(pkt, yd); |
6793 | 3542 |
3543 /* Step 2: Remove buddy from old group */ | |
3544 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3545 yahoo_packet_hash(pkt, "sss", 1, gaim_connection_get_display_name(gc), 7, who, 65, gpo); |
10392 | 3546 yahoo_packet_send_and_free(pkt, yd); |
7827 | 3547 g_free(gpn); |
3548 g_free(gpo); | |
6793 | 3549 } |
3550 | |
9285 | 3551 static void yahoo_rename_group(GaimConnection *gc, const char *old_name, |
3552 GaimGroup *group, GList *moved_buddies) | |
6793 | 3553 { |
3554 struct yahoo_data *yd = gc->proto_data; | |
3555 struct yahoo_packet *pkt; | |
7827 | 3556 char *gpn, *gpo; |
3557 | |
9285 | 3558 gpn = yahoo_string_encode(gc, group->name, NULL); |
3559 gpo = yahoo_string_encode(gc, old_name, NULL); | |
7827 | 3560 if (!strcmp(gpn, gpo)) { |
3561 g_free(gpn); | |
3562 g_free(gpo); | |
3563 return; | |
3564 } | |
6793 | 3565 |
3566 pkt = yahoo_packet_new(YAHOO_SERVICE_GROUPRENAME, YAHOO_STATUS_AVAILABLE, 0); | |
10394 | 3567 yahoo_packet_hash(pkt, "sss", 1, gaim_connection_get_display_name(gc), |
3568 65, gpo, 67, gpn); | |
10392 | 3569 yahoo_packet_send_and_free(pkt, yd); |
7827 | 3570 g_free(gpn); |
3571 g_free(gpo); | |
6793 | 3572 } |
3573 | |
10937 | 3574 /********************************* Commands **********************************/ |
3575 | |
10119 | 3576 static GaimCmdRet |
3577 yahoogaim_cmd_buzz(GaimConversation *c, const gchar *cmd, gchar **args, gchar **error, void *data) { | |
3578 | |
3579 GaimAccount *account = gaim_conversation_get_account(c); | |
3580 const char *username = gaim_account_get_username(account); | |
3581 | |
3582 if (*args && args[0]) | |
3583 return GAIM_CMD_RET_FAILED; | |
3584 | |
3585 gaim_debug(GAIM_DEBUG_INFO, "yahoo", | |
3586 "Sending <ding> on account %s to buddy %s.\n", username, c->name); | |
3587 gaim_conv_im_send(GAIM_CONV_IM(c), "<ding>"); | |
11615 | 3588 gaim_conv_im_write(GAIM_CONV_IM(c), "", _("Buzz!!"), GAIM_MESSAGE_NICK|GAIM_MESSAGE_SEND, time(NULL)); |
10119 | 3589 return GAIM_CMD_RET_OK; |
3590 } | |
3591 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3592 static GaimPlugin *my_protocol = NULL; |
2681 | 3593 |
10119 | 3594 static GaimCmdRet |
3595 yahoogaim_cmd_chat_join(GaimConversation *conv, const char *cmd, | |
3596 char **args, char **error, void *data) | |
3597 { | |
3598 GHashTable *comp; | |
3599 GaimConnection *gc; | |
3600 struct yahoo_data *yd; | |
3601 int id; | |
3602 | |
3603 if (!args || !args[0]) | |
3604 return GAIM_CMD_RET_FAILED; | |
3605 | |
3606 gc = gaim_conversation_get_gc(conv); | |
3607 yd = gc->proto_data; | |
3608 id = yd->conf_id; | |
3609 gaim_debug(GAIM_DEBUG_INFO, "yahoo", | |
3610 "Trying to join %s \n", args[0]); | |
3611 | |
3612 comp = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
3613 g_hash_table_replace(comp, g_strdup("room"), | |
3614 g_strdup_printf("%s", g_ascii_strdown(args[0], strlen(args[0])))); | |
11077 | 3615 g_hash_table_replace(comp, g_strdup("type"), g_strdup("Chat")); |
10119 | 3616 |
3617 yahoo_c_join(gc, comp); | |
3618 | |
3619 g_hash_table_destroy(comp); | |
3620 return GAIM_CMD_RET_OK; | |
3621 } | |
12645
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3622 |
13041
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3623 static GaimCmdRet |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3624 yahoogaim_cmd_chat_list(GaimConversation *conv, const char *cmd, |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3625 char **args, char **error, void *data) |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3626 { |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3627 GaimAccount *account = gaim_conversation_get_account(conv); |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3628 if (*args && args[0]) |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3629 return GAIM_CMD_RET_FAILED; |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3630 gaim_roomlist_show_with_account(account); |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3631 return GAIM_CMD_RET_OK; |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3632 } |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3633 |
12645
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3634 static gboolean yahoo_offline_message(const GaimBuddy *buddy) |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3635 { |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3636 return TRUE; |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3637 } |
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3638 |
10119 | 3639 /************************** Plugin Initialization ****************************/ |
3640 static void | |
3641 yahoogaim_register_commands(void) | |
3642 { | |
3643 gaim_cmd_register("join", "s", GAIM_CMD_P_PRPL, | |
3644 GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | | |
3645 GAIM_CMD_FLAG_PRPL_ONLY, | |
3646 "prpl-yahoo", yahoogaim_cmd_chat_join, | |
3647 _("join <room>: Join a chat room on the Yahoo network"), NULL); | |
13041
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3648 gaim_cmd_register("list", "", GAIM_CMD_P_PRPL, |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3649 GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_CHAT | |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3650 GAIM_CMD_FLAG_PRPL_ONLY, |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3651 "prpl-yahoo", yahoogaim_cmd_chat_list, |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3652 _("list: List rooms on the Yahoo network"), NULL); |
10121 | 3653 gaim_cmd_register("buzz", "", GAIM_CMD_P_PRPL, |
10119 | 3654 GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_PRPL_ONLY, |
3655 "prpl-yahoo", yahoogaim_cmd_buzz, | |
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
12243
diff
changeset
|
3656 _("buzz: Buzz a user to get their attention"), NULL); |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3657 gaim_cmd_register("doodle", "", GAIM_CMD_P_PRPL, |
13041
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3658 GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_PRPL_ONLY, |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3659 "prpl-yahoo", yahoo_doodle_gaim_cmd_start, |
465c7e1dfc7b
[gaim-migrate @ 15400]
Richard Laager <rlaager@wiktel.com>
parents:
13021
diff
changeset
|
3660 _("doodle: Request user to start a Doodle session"), NULL); |
10119 | 3661 } |
3662 | |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3663 static GaimWhiteboardPrplOps yahoo_whiteboard_prpl_ops = |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3664 { |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3665 yahoo_doodle_start, |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3666 yahoo_doodle_end, |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3667 yahoo_doodle_get_dimensions, |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3668 NULL, |
11914
2219f4bf4a57
[gaim-migrate @ 14205]
Richard Laager <rlaager@wiktel.com>
parents:
11897
diff
changeset
|
3669 yahoo_doodle_get_brush, |
2219f4bf4a57
[gaim-migrate @ 14205]
Richard Laager <rlaager@wiktel.com>
parents:
11897
diff
changeset
|
3670 yahoo_doodle_set_brush, |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3671 yahoo_doodle_send_draw_list, |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3672 yahoo_doodle_clear |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3673 }; |
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3674 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3675 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3676 { |
9308 | 3677 OPT_PROTO_MAIL_CHECK | OPT_PROTO_CHAT_TOPIC, |
6729 | 3678 NULL, /* user_splits */ |
3679 NULL, /* protocol_options */ | |
9318 | 3680 {"png", 96, 96, 96, 96, GAIM_ICON_SCALE_SEND}, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3681 yahoo_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3682 yahoo_list_emblems, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3683 yahoo_status_text, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3684 yahoo_tooltip_text, |
9979 | 3685 yahoo_status_types, |
9030 | 3686 yahoo_blist_node_menu, |
6729 | 3687 yahoo_c_info, |
9768 | 3688 yahoo_c_info_defaults, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3689 yahoo_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3690 yahoo_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3691 yahoo_send_im, |
6729 | 3692 NULL, /* set info */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3693 yahoo_send_typing, |
6514 | 3694 yahoo_get_info, |
9984 | 3695 yahoo_set_status, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3696 yahoo_set_idle, |
6729 | 3697 NULL, /* change_passwd*/ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3698 yahoo_add_buddy, |
6729 | 3699 NULL, /* add_buddies */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3700 yahoo_remove_buddy, |
6729 | 3701 NULL, /*remove_buddies */ |
10937 | 3702 yahoo_add_permit, |
6760 | 3703 yahoo_add_deny, |
10937 | 3704 yahoo_rem_permit, |
6760 | 3705 yahoo_rem_deny, |
3706 yahoo_set_permit_deny, | |
6729 | 3707 yahoo_c_join, |
8562 | 3708 NULL, /* reject chat invite */ |
9917 | 3709 yahoo_get_chat_name, |
6729 | 3710 yahoo_c_invite, |
3711 yahoo_c_leave, | |
3712 NULL, /* chat whisper */ | |
3713 yahoo_c_send, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3714 yahoo_keepalive, |
6729 | 3715 NULL, /* register_user */ |
3716 NULL, /* get_cb_info */ | |
3717 NULL, /* get_cb_away */ | |
3718 NULL, /* alias_buddy */ | |
6793 | 3719 yahoo_change_buddys_group, |
3720 yahoo_rename_group, | |
6729 | 3721 NULL, /* buddy_free */ |
3722 NULL, /* convo_closed */ | |
11153 | 3723 gaim_normalize_nocase, /* normalize */ |
9306 | 3724 yahoo_set_buddy_icon, |
7651 | 3725 NULL, /* void (*remove_group)(GaimConnection *gc, const char *group);*/ |
3726 NULL, /* char *(*get_cb_real_name)(GaimConnection *gc, int id, const char *who); */ | |
9475 | 3727 NULL, /* set_chat_topic */ |
3728 NULL, /* find_blist_chat */ | |
8113 | 3729 yahoo_roomlist_get_list, |
3730 yahoo_roomlist_cancel, | |
9466 | 3731 yahoo_roomlist_expand_category, |
9475 | 3732 NULL, /* can_receive_file */ |
11475
7fab28c991f3
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11338
diff
changeset
|
3733 yahoo_send_file, |
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12138
diff
changeset
|
3734 yahoo_new_xfer, |
12645
fc28451f5d96
[gaim-migrate @ 14983]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
3735 yahoo_offline_message, /* offline_message */ |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12595
diff
changeset
|
3736 &yahoo_whiteboard_prpl_ops, |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3737 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3738 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3739 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3740 { |
9943 | 3741 GAIM_PLUGIN_MAGIC, |
3742 GAIM_MAJOR_VERSION, | |
3743 GAIM_MINOR_VERSION, | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3744 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3745 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3746 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3747 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3748 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3749 "prpl-yahoo", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3750 "Yahoo", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3751 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3752 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3753 N_("Yahoo Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3754 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3755 N_("Yahoo Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3756 NULL, /**< author */ |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
3757 GAIM_WEBSITE, /**< homepage */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3758 NULL, /**< load */ |
6513 | 3759 yahoo_unload_plugin, /**< unload */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3760 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3761 NULL, /**< ui_info */ |
8993 | 3762 &prpl_info, /**< extra_info */ |
3763 NULL, | |
9015 | 3764 yahoo_actions |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3765 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3766 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3767 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
3768 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3769 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5590
diff
changeset
|
3770 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3771 |
9164 | 3772 option = gaim_account_option_bool_new(_("Yahoo Japan"), "yahoojp", FALSE); |
3773 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
3774 | |
13705
2f7b356812bc
[gaim-migrate @ 16108]
Richard Laager <rlaager@wiktel.com>
parents:
13686
diff
changeset
|
3775 option = gaim_account_option_string_new(_("Pager server"), "server", YAHOO_PAGER_HOST); |
7827 | 3776 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
3777 | |
13705
2f7b356812bc
[gaim-migrate @ 16108]
Richard Laager <rlaager@wiktel.com>
parents:
13686
diff
changeset
|
3778 option = gaim_account_option_string_new(_("Japan Pager server"), "serverjp", YAHOOJP_PAGER_HOST); |
9164 | 3779 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
3780 | |
7827 | 3781 option = gaim_account_option_int_new(_("Pager port"), "port", YAHOO_PAGER_PORT); |
3782 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
7651 | 3783 |
13705
2f7b356812bc
[gaim-migrate @ 16108]
Richard Laager <rlaager@wiktel.com>
parents:
13686
diff
changeset
|
3784 option = gaim_account_option_string_new(_("File transfer server"), "xfer_host", YAHOO_XFER_HOST); |
7651 | 3785 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
3786 | |
13705
2f7b356812bc
[gaim-migrate @ 16108]
Richard Laager <rlaager@wiktel.com>
parents:
13686
diff
changeset
|
3787 option = gaim_account_option_string_new(_("Japan file transfer server"), "xferjp_host", YAHOOJP_XFER_HOST); |
9164 | 3788 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
3789 | |
7651 | 3790 option = gaim_account_option_int_new(_("File transfer port"), "xfer_port", YAHOO_XFER_PORT); |
3791 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
3792 | |
12152
cda86ce5b026
[gaim-migrate @ 14453]
Richard Laager <rlaager@wiktel.com>
parents:
12143
diff
changeset
|
3793 option = gaim_account_option_string_new(_("Chat room locale"), "room_list_locale", YAHOO_ROOMLIST_LOCALE); |
11043
629cbfd1ed6d
[gaim-migrate @ 12957]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
3794 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
12999
68db2c40efb2
[gaim-migrate @ 15352]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12994
diff
changeset
|
3795 |
68db2c40efb2
[gaim-migrate @ 15352]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12994
diff
changeset
|
3796 option = gaim_account_option_bool_new(_("Ignore conference and chatroom invitations"), "ignore_invites", FALSE); |
68db2c40efb2
[gaim-migrate @ 15352]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12994
diff
changeset
|
3797 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
68db2c40efb2
[gaim-migrate @ 15352]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12994
diff
changeset
|
3798 |
11043
629cbfd1ed6d
[gaim-migrate @ 12957]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
3799 #if 0 |
12152
cda86ce5b026
[gaim-migrate @ 14453]
Richard Laager <rlaager@wiktel.com>
parents:
12143
diff
changeset
|
3800 option = gaim_account_option_string_new(_("Chat room list URL"), "room_list", YAHOO_ROOMLIST_URL); |
8113 | 3801 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
11043
629cbfd1ed6d
[gaim-migrate @ 12957]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
3802 |
13705
2f7b356812bc
[gaim-migrate @ 16108]
Richard Laager <rlaager@wiktel.com>
parents:
13686
diff
changeset
|
3803 option = gaim_account_option_string_new(_("Yahoo Chat server"), "ycht-server", YAHOO_YCHT_HOST); |
9376 | 3804 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
3805 | |
13705
2f7b356812bc
[gaim-migrate @ 16108]
Richard Laager <rlaager@wiktel.com>
parents:
13686
diff
changeset
|
3806 option = gaim_account_option_int_new(_("Yahoo Chat port"), "ycht-port", YAHOO_YCHT_PORT); |
9376 | 3807 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
3808 #endif | |
3809 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3810 my_protocol = plugin; |
10119 | 3811 yahoogaim_register_commands(); |
6513 | 3812 yahoo_init_colorht(); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3813 } |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
3814 |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
3815 GAIM_INIT_PLUGIN(yahoo, init_plugin, info); |