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