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