[tor-commits] [tor-messenger-build/master] Remove old Yahoo! Messenger support
arlo at torproject.org
arlo at torproject.org
Wed Nov 9 17:10:05 UTC 2016
commit 690e6e65acebe80384883c7065c7b6fbcc5b65a9
Author: Arlo Breault <arlolra at gmail.com>
Date: Wed Nov 9 09:07:00 2016 -0800
Remove old Yahoo! Messenger support
* Bugzilla 1316000
* https://web.archive.org/web/20160730080614/https://help.yahoo.com/kb/yahoo-messenger-for-web/SLN26860.html
---
ChangeLog | 1 +
.../0001-Set-Tor-Messenger-preferences.patch | 2 +-
...0002-Trac-16489-Prevent-account-autologin.patch | 2 +-
...Support-Special-Characters-input-prompt-o.patch | 2 +-
...Better-error-reporting-for-failed-outgoin.patch | 2 +-
.../0005-Trac-13312-OTR-over-Twitter-DMs.patch | 2 +-
...-Fix-tab-strip-background-colour-on-OS-X..patch | 2 +-
...-XMPP-createConversation-should-handle-in.patch | 2 +-
...-Set-_userVCard-own-property-when-downloa.patch | 2 +-
.../0009-XMPP-in-band-registration.patch | 2 +-
.../instantbird/0010-Remove-search-from-UI.patch | 2 +-
.../0011-Add-Tor-Messenger-branding.patch | 2 +-
projects/instantbird/0012-Account-picture.patch | 2 +-
.../0013-Modify-protocol-defaults.patch | 2 +-
.../instantbird/0014-Modify-IRC-defaults.patch | 2 +-
projects/instantbird/0015-Modify-themes.patch | 2 +-
.../instantbird/0016-Modify-XMPP-defaults.patch | 2 +-
projects/instantbird/0017-Remove-logging-UI.patch | 2 +-
projects/instantbird/0018-Cert-override.patch | 2 +-
.../0019-Display-all-traffic-over-Tor.patch | 2 +-
.../instantbird/0020-Trac-17480-Content-sink.patch | 2 +-
.../0021-SASL-ECDSA-NIST256P-CHALLENGE.patch | 2 +-
...-msg-is-not-defined-error-in-irc.js-chang.patch | 2 +-
...Contact-list-entries-should-adapt-their-h.patch | 2 +-
...1187281-Only-show-close-button-on-Windows.patch | 2 +-
...-Remove-old-Yahoo-Messenger-support.-r-al.patch | 2398 ++++++++++++++++++++
projects/instantbird/config | 1 +
27 files changed, 2424 insertions(+), 24 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 765e033..67f2523 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,7 @@ Tor Messenger 0.3.0b1 --
* Trac 20608: Use Instantbird app version
* Bugzilla 1246431: Properly handle incoming xmpp server messages
* Bugzilla 1313137: Fix irc "msg is not defined" error
+ * Bugzilla 1316000: Remove old Yahoo! Messenger support
* Mac
* Trac 20204: Windows don't drag on macOS Sierra
* Trac 20206: Avoid prompting to download font "Osaka" on macOS Sierra
diff --git a/projects/instantbird/0001-Set-Tor-Messenger-preferences.patch b/projects/instantbird/0001-Set-Tor-Messenger-preferences.patch
index 44e2669..a79e25e 100644
--- a/projects/instantbird/0001-Set-Tor-Messenger-preferences.patch
+++ b/projects/instantbird/0001-Set-Tor-Messenger-preferences.patch
@@ -1,7 +1,7 @@
From 1d67d081f0a1c5c354152c5c54387403a7334946 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:48:41 -0700
-Subject: [PATCH 01/24] Set Tor Messenger preferences
+Subject: [PATCH 01/25] Set Tor Messenger preferences
---
im/app/profile/all-instantbird.js | 399 ++++++++++++++++++++++++++++++++++++--
diff --git a/projects/instantbird/0002-Trac-16489-Prevent-account-autologin.patch b/projects/instantbird/0002-Trac-16489-Prevent-account-autologin.patch
index 3b908e3..034cc47 100644
--- a/projects/instantbird/0002-Trac-16489-Prevent-account-autologin.patch
+++ b/projects/instantbird/0002-Trac-16489-Prevent-account-autologin.patch
@@ -1,7 +1,7 @@
From f1e661a5b83c86b1f2d04a434f59c938d3ae1eef Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Mon, 16 Nov 2015 20:37:53 -0800
-Subject: [PATCH 02/24] Trac 16489: Prevent account autologin
+Subject: [PATCH 02/25] Trac 16489: Prevent account autologin
---
chat/components/src/imAccounts.js | 2 +-
diff --git a/projects/instantbird/0003-Trac-17896-Support-Special-Characters-input-prompt-o.patch b/projects/instantbird/0003-Trac-17896-Support-Special-Characters-input-prompt-o.patch
index 454ce61..90fd28b 100644
--- a/projects/instantbird/0003-Trac-17896-Support-Special-Characters-input-prompt-o.patch
+++ b/projects/instantbird/0003-Trac-17896-Support-Special-Characters-input-prompt-o.patch
@@ -1,7 +1,7 @@
From ffc41b64d3a203ada0549a57044329afb31e88dd Mon Sep 17 00:00:00 2001
From: aleth <aleth at instantbird.org>
Date: Sat, 30 Jan 2016 20:56:38 +0100
-Subject: [PATCH 03/24] Trac 17896: Support "Special Characters" input prompt
+Subject: [PATCH 03/25] Trac 17896: Support "Special Characters" input prompt
on OS X
* Bug 1151784 - Add Edit menu to the conversation window on OS X. r=nhnt11,florian
diff --git a/projects/instantbird/0004-Trac-17494-Better-error-reporting-for-failed-outgoin.patch b/projects/instantbird/0004-Trac-17494-Better-error-reporting-for-failed-outgoin.patch
index d7bcf52..a03c275 100644
--- a/projects/instantbird/0004-Trac-17494-Better-error-reporting-for-failed-outgoin.patch
+++ b/projects/instantbird/0004-Trac-17494-Better-error-reporting-for-failed-outgoin.patch
@@ -1,7 +1,7 @@
From 4f8444932609dcf396adf0ee8a44668015d0ab8a Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Tue, 2 Feb 2016 16:04:51 -0800
-Subject: [PATCH 04/24] Trac 17494: Better error reporting for failed outgoing
+Subject: [PATCH 04/25] Trac 17494: Better error reporting for failed outgoing
messages
* Bug 1245325 - Better error reporting for failed outgoing messages. r=clokep
diff --git a/projects/instantbird/0005-Trac-13312-OTR-over-Twitter-DMs.patch b/projects/instantbird/0005-Trac-13312-OTR-over-Twitter-DMs.patch
index 5b2b93b..63df479 100644
--- a/projects/instantbird/0005-Trac-13312-OTR-over-Twitter-DMs.patch
+++ b/projects/instantbird/0005-Trac-13312-OTR-over-Twitter-DMs.patch
@@ -1,7 +1,7 @@
From 5a0596c8ea7d084e1f9f1851c85fcc1999df6422 Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Tue, 15 Mar 2016 17:40:42 -0700
-Subject: [PATCH 05/24] Trac 13312: OTR over Twitter DMs
+Subject: [PATCH 05/25] Trac 13312: OTR over Twitter DMs
---
chat/components/src/imConversations.js | 4 +-
diff --git a/projects/instantbird/0006-Bug-1218193-Fix-tab-strip-background-colour-on-OS-X..patch b/projects/instantbird/0006-Bug-1218193-Fix-tab-strip-background-colour-on-OS-X..patch
index 39efb0d..f0fb0c9 100644
--- a/projects/instantbird/0006-Bug-1218193-Fix-tab-strip-background-colour-on-OS-X..patch
+++ b/projects/instantbird/0006-Bug-1218193-Fix-tab-strip-background-colour-on-OS-X..patch
@@ -1,7 +1,7 @@
From 41cedec3b05aefe585f32f4ebde2d6b39e2f01b3 Mon Sep 17 00:00:00 2001
From: Nihanth Subramanya <nhnt11 at gmail.com>
Date: Sun, 9 Oct 2016 21:53:04 -0700
-Subject: [PATCH 06/24] Bug 1218193 - Fix tab strip background colour on OS X.
+Subject: [PATCH 06/25] Bug 1218193 - Fix tab strip background colour on OS X.
r=aleth
---
diff --git a/projects/instantbird/0007-Bug-1246431-XMPP-createConversation-should-handle-in.patch b/projects/instantbird/0007-Bug-1246431-XMPP-createConversation-should-handle-in.patch
index ce7bf88..ce1a34e 100644
--- a/projects/instantbird/0007-Bug-1246431-XMPP-createConversation-should-handle-in.patch
+++ b/projects/instantbird/0007-Bug-1246431-XMPP-createConversation-should-handle-in.patch
@@ -1,7 +1,7 @@
From bbb740af1dc8fd62723494efa3593b6d82bc4ffc Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Sun, 9 Oct 2016 21:57:07 -0700
-Subject: [PATCH 07/24] Bug 1246431 - XMPP createConversation should handle
+Subject: [PATCH 07/25] Bug 1246431 - XMPP createConversation should handle
incoming messages from the server properly. r=aleth
---
diff --git a/projects/instantbird/0008-Bug-1298574-Set-_userVCard-own-property-when-downloa.patch b/projects/instantbird/0008-Bug-1298574-Set-_userVCard-own-property-when-downloa.patch
index 76faa87..2f8c67e 100644
--- a/projects/instantbird/0008-Bug-1298574-Set-_userVCard-own-property-when-downloa.patch
+++ b/projects/instantbird/0008-Bug-1298574-Set-_userVCard-own-property-when-downloa.patch
@@ -1,7 +1,7 @@
From 1f0fdd5fa6e4ad05edb9ee6424d773c3d1d3f503 Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Sun, 28 Aug 2016 08:57:41 -0700
-Subject: [PATCH 08/24] Bug 1298574 - Set _userVCard own property when
+Subject: [PATCH 08/25] Bug 1298574 - Set _userVCard own property when
downloading vCard fails. r=aleth
* This prevents an infinite req / res cycle.
diff --git a/projects/instantbird/0009-XMPP-in-band-registration.patch b/projects/instantbird/0009-XMPP-in-band-registration.patch
index 0e96930..53f99c0 100644
--- a/projects/instantbird/0009-XMPP-in-band-registration.patch
+++ b/projects/instantbird/0009-XMPP-in-band-registration.patch
@@ -1,7 +1,7 @@
From 30f8a460dc5b471bb303874a25534bc4ec79a78c Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 18:42:25 -0700
-Subject: [PATCH 09/24] XMPP in-band registration
+Subject: [PATCH 09/25] XMPP in-band registration
---
chat/locales/en-US/xmpp.properties | 5 +
diff --git a/projects/instantbird/0010-Remove-search-from-UI.patch b/projects/instantbird/0010-Remove-search-from-UI.patch
index a33bf1c..57c3a1a 100644
--- a/projects/instantbird/0010-Remove-search-from-UI.patch
+++ b/projects/instantbird/0010-Remove-search-from-UI.patch
@@ -1,7 +1,7 @@
From adee8bb3ecf5d6c2358ac5795653420cd4cd906b Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 18:47:48 -0700
-Subject: [PATCH 10/24] Remove search from UI
+Subject: [PATCH 10/25] Remove search from UI
---
im/content/nsContextMenu.js | 18 +-----------------
diff --git a/projects/instantbird/0011-Add-Tor-Messenger-branding.patch b/projects/instantbird/0011-Add-Tor-Messenger-branding.patch
index 8ca2358..7f8df6e 100644
--- a/projects/instantbird/0011-Add-Tor-Messenger-branding.patch
+++ b/projects/instantbird/0011-Add-Tor-Messenger-branding.patch
@@ -1,7 +1,7 @@
From e86eb410dfe15ffe4a5128baf41d4aa30f290070 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 18:56:27 -0700
-Subject: [PATCH 11/24] Add Tor Messenger branding
+Subject: [PATCH 11/25] Add Tor Messenger branding
---
im/app/macbuild/Contents/Info.plist.in | 2 +-
diff --git a/projects/instantbird/0012-Account-picture.patch b/projects/instantbird/0012-Account-picture.patch
index 67c7d6e..6e53968 100644
--- a/projects/instantbird/0012-Account-picture.patch
+++ b/projects/instantbird/0012-Account-picture.patch
@@ -1,7 +1,7 @@
From f7ea3deb695f7cd076735264fa2f9a0f1dcc715f Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:24:09 -0700
-Subject: [PATCH 12/24] Account picture
+Subject: [PATCH 12/25] Account picture
---
im/content/blist.xul | 3 +--
diff --git a/projects/instantbird/0013-Modify-protocol-defaults.patch b/projects/instantbird/0013-Modify-protocol-defaults.patch
index 1e1b075..f78740a 100644
--- a/projects/instantbird/0013-Modify-protocol-defaults.patch
+++ b/projects/instantbird/0013-Modify-protocol-defaults.patch
@@ -1,7 +1,7 @@
From 90636b77ec46308386df5acefb43a55ad86548cf Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:25:34 -0700
-Subject: [PATCH 13/24] Modify protocol defaults
+Subject: [PATCH 13/25] Modify protocol defaults
* Top protocols
diff --git a/projects/instantbird/0014-Modify-IRC-defaults.patch b/projects/instantbird/0014-Modify-IRC-defaults.patch
index ee86b1e..e7d535b 100644
--- a/projects/instantbird/0014-Modify-IRC-defaults.patch
+++ b/projects/instantbird/0014-Modify-IRC-defaults.patch
@@ -1,7 +1,7 @@
From 9f2fe7b31af96af64ec93dd5b9c3d199705e5114 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:31:58 -0700
-Subject: [PATCH 14/24] Modify IRC defaults
+Subject: [PATCH 14/25] Modify IRC defaults
* ctcp ping
diff --git a/projects/instantbird/0015-Modify-themes.patch b/projects/instantbird/0015-Modify-themes.patch
index 318cffc..6084fc6 100644
--- a/projects/instantbird/0015-Modify-themes.patch
+++ b/projects/instantbird/0015-Modify-themes.patch
@@ -1,7 +1,7 @@
From 92aa4ae0d3bde10c502bac0721a2ff5057891840 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:36:38 -0700
-Subject: [PATCH 15/24] Modify themes
+Subject: [PATCH 15/25] Modify themes
* theme extension updateh
diff --git a/projects/instantbird/0016-Modify-XMPP-defaults.patch b/projects/instantbird/0016-Modify-XMPP-defaults.patch
index afce7ea..1054c51 100644
--- a/projects/instantbird/0016-Modify-XMPP-defaults.patch
+++ b/projects/instantbird/0016-Modify-XMPP-defaults.patch
@@ -1,7 +1,7 @@
From 50c6ab1b9ddded85679dd91b3e0dd71918511d38 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:38:49 -0700
-Subject: [PATCH 16/24] Modify XMPP defaults
+Subject: [PATCH 16/25] Modify XMPP defaults
* xmpp-default-domain
diff --git a/projects/instantbird/0017-Remove-logging-UI.patch b/projects/instantbird/0017-Remove-logging-UI.patch
index b820b03..d22341d 100644
--- a/projects/instantbird/0017-Remove-logging-UI.patch
+++ b/projects/instantbird/0017-Remove-logging-UI.patch
@@ -1,7 +1,7 @@
From ae5671b3b7ebff4470d091cdb50ee1efd94f60d2 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:50:48 -0700
-Subject: [PATCH 17/24] Remove logging UI
+Subject: [PATCH 17/25] Remove logging UI
---
im/content/preferences/privacy.xul | 20 --------------------
diff --git a/projects/instantbird/0018-Cert-override.patch b/projects/instantbird/0018-Cert-override.patch
index a10f32a..6fd5592 100644
--- a/projects/instantbird/0018-Cert-override.patch
+++ b/projects/instantbird/0018-Cert-override.patch
@@ -1,7 +1,7 @@
From c9c8d083f1176e60299af2abe9db3bcad3b87e67 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:56:46 -0700
-Subject: [PATCH 18/24] Cert override
+Subject: [PATCH 18/25] Cert override
---
im/app/profile/cert_override.txt | 3 +++
diff --git a/projects/instantbird/0019-Display-all-traffic-over-Tor.patch b/projects/instantbird/0019-Display-all-traffic-over-Tor.patch
index f481e7a..307045c 100644
--- a/projects/instantbird/0019-Display-all-traffic-over-Tor.patch
+++ b/projects/instantbird/0019-Display-all-traffic-over-Tor.patch
@@ -1,7 +1,7 @@
From 6fb6121d1bf2942358ead4424e8f368debcc0631 Mon Sep 17 00:00:00 2001
From: Sukhbir Singh <sukhbir at torproject.org>
Date: Mon, 10 Oct 2016 19:58:31 -0700
-Subject: [PATCH 19/24] Display all traffic over Tor
+Subject: [PATCH 19/25] Display all traffic over Tor
---
im/content/accountWizard.xul | 2 ++
diff --git a/projects/instantbird/0020-Trac-17480-Content-sink.patch b/projects/instantbird/0020-Trac-17480-Content-sink.patch
index 9f4d67b..087e1d5 100644
--- a/projects/instantbird/0020-Trac-17480-Content-sink.patch
+++ b/projects/instantbird/0020-Trac-17480-Content-sink.patch
@@ -1,7 +1,7 @@
From 837b27c523d1eaba88d14758adb8653caa3f202d Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Wed, 5 Oct 2016 11:09:25 -0700
-Subject: [PATCH 20/24] Trac 17480: Content sink
+Subject: [PATCH 20/25] Trac 17480: Content sink
---
chat/modules/imContentSink.jsm | 32 ++++++--------------------------
diff --git a/projects/instantbird/0021-SASL-ECDSA-NIST256P-CHALLENGE.patch b/projects/instantbird/0021-SASL-ECDSA-NIST256P-CHALLENGE.patch
index e87f26c..00c47dc 100644
--- a/projects/instantbird/0021-SASL-ECDSA-NIST256P-CHALLENGE.patch
+++ b/projects/instantbird/0021-SASL-ECDSA-NIST256P-CHALLENGE.patch
@@ -1,7 +1,7 @@
From b7169c4c36ea9e7f582259b8b93516c319539c9f Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Sun, 2 Oct 2016 08:46:55 -0700
-Subject: [PATCH 21/24] SASL ECDSA-NIST256P-CHALLENGE
+Subject: [PATCH 21/25] SASL ECDSA-NIST256P-CHALLENGE
---
chat/components/src/imAccounts.js | 1 +
diff --git a/projects/instantbird/0022-Bug-1313137-msg-is-not-defined-error-in-irc.js-chang.patch b/projects/instantbird/0022-Bug-1313137-msg-is-not-defined-error-in-irc.js-chang.patch
index d562407..e0b2c6a 100644
--- a/projects/instantbird/0022-Bug-1313137-msg-is-not-defined-error-in-irc.js-chang.patch
+++ b/projects/instantbird/0022-Bug-1313137-msg-is-not-defined-error-in-irc.js-chang.patch
@@ -1,7 +1,7 @@
From df14c41303be11e2b684359f504b80954c7a6de6 Mon Sep 17 00:00:00 2001
From: aleth <aleth at instantbird.org>
Date: Wed, 26 Oct 2016 20:16:58 +0200
-Subject: [PATCH 22/24] Bug 1313137 - "msg is not defined" error in
+Subject: [PATCH 22/25] Bug 1313137 - "msg is not defined" error in
irc.js:changeBuddyNick. r=clokep
--HG--
diff --git a/projects/instantbird/0023-Bug-954368-Contact-list-entries-should-adapt-their-h.patch b/projects/instantbird/0023-Bug-954368-Contact-list-entries-should-adapt-their-h.patch
index b8e2b2a..15cfbae 100644
--- a/projects/instantbird/0023-Bug-954368-Contact-list-entries-should-adapt-their-h.patch
+++ b/projects/instantbird/0023-Bug-954368-Contact-list-entries-should-adapt-their-h.patch
@@ -1,7 +1,7 @@
From 9ec3b2210152f48feda6d1f7fa12db4455cc7f01 Mon Sep 17 00:00:00 2001
From: aleth <aleth at instantbird.org>
Date: Thu, 12 May 2016 15:10:43 +0200
-Subject: [PATCH 23/24] Bug 954368 - Contact list entries should adapt their
+Subject: [PATCH 23/25] Bug 954368 - Contact list entries should adapt their
height to the actual font size. r=florian
--HG--
diff --git a/projects/instantbird/0024-Bug-1187281-Only-show-close-button-on-Windows.patch b/projects/instantbird/0024-Bug-1187281-Only-show-close-button-on-Windows.patch
index 500615c..3d2efda 100644
--- a/projects/instantbird/0024-Bug-1187281-Only-show-close-button-on-Windows.patch
+++ b/projects/instantbird/0024-Bug-1187281-Only-show-close-button-on-Windows.patch
@@ -1,7 +1,7 @@
From 52731dd57da7b04b18c6835b77d284e0f70536a5 Mon Sep 17 00:00:00 2001
From: Arlo Breault <arlolra at gmail.com>
Date: Sat, 5 Nov 2016 14:55:20 -0700
-Subject: [PATCH 24/24] Bug 1187281 - Only show "close" button on Windows
+Subject: [PATCH 24/25] Bug 1187281 - Only show "close" button on Windows
---
im/content/accounts.xul | 2 ++
diff --git a/projects/instantbird/0025-Bug-1316000-Remove-old-Yahoo-Messenger-support.-r-al.patch b/projects/instantbird/0025-Bug-1316000-Remove-old-Yahoo-Messenger-support.-r-al.patch
new file mode 100644
index 0000000..97d5e86
--- /dev/null
+++ b/projects/instantbird/0025-Bug-1316000-Remove-old-Yahoo-Messenger-support.-r-al.patch
@@ -0,0 +1,2398 @@
+From 4adccc038eea1619377e91bd3f9ce3b4922466c7 Mon Sep 17 00:00:00 2001
+From: Patrick Cloke <clokep at gmail.com>
+Date: Wed, 9 Nov 2016 09:03:49 -0800
+Subject: [PATCH 25/25] Bug 1316000 - Remove old Yahoo! Messenger support.
+ r=aleth
+
+---
+ chat/chat-prefs.js | 2 +
+ chat/locales/en-US/facebook.properties | 3 +-
+ chat/locales/en-US/yahoo.properties | 34 +-
+ chat/protocols/facebook/facebook.js | 13 +-
+ chat/protocols/yahoo/moz.build | 6 -
+ chat/protocols/yahoo/test/test_yahooAccount.js | 98 --
+ chat/protocols/yahoo/test/test_yahooLoginHelper.js | 89 --
+ chat/protocols/yahoo/test/test_yahoopacket.js | 217 ----
+ chat/protocols/yahoo/test/xpcshell.ini | 7 -
+ chat/protocols/yahoo/yahoo-session.jsm | 1156 --------------------
+ chat/protocols/yahoo/yahoo.js | 552 +---------
+ im/content/conversation.xml | 3 +-
+ .../chrome/instantbird/accountWizard.properties | 3 +-
+ im/test/xpcshell.ini | 1 -
+ mail/components/im/content/imconversation.xml | 3 +-
+ 15 files changed, 18 insertions(+), 2169 deletions(-)
+ delete mode 100644 chat/protocols/yahoo/test/test_yahooAccount.js
+ delete mode 100644 chat/protocols/yahoo/test/test_yahooLoginHelper.js
+ delete mode 100644 chat/protocols/yahoo/test/test_yahoopacket.js
+ delete mode 100644 chat/protocols/yahoo/test/xpcshell.ini
+ delete mode 100644 chat/protocols/yahoo/yahoo-session.jsm
+
+diff --git a/chat/chat-prefs.js b/chat/chat-prefs.js
+index fb76916..60b9c1e 100644
+--- a/chat/chat-prefs.js
++++ b/chat/chat-prefs.js
+@@ -84,6 +84,8 @@ pref("chat.irc.automaticList", true);
+ pref("chat.prpls.prpl-skype.disable", true);
+ // Disable Facebook as the XMPP gateway no longer exists.
+ pref("chat.prpls.prpl-facebook.disable", true);
++// Disable Yahoo Messenger as legacy Yahoo was shut down.
++pref("chat.prpls.prpl-yahoo.disable", true);
+
+ // loglevel is the minimum severity level that a libpurple message
+ // must have to be reported in the Error Console.
+diff --git a/chat/locales/en-US/facebook.properties b/chat/locales/en-US/facebook.properties
+index aaf7cdc..2e00cbc 100644
+--- a/chat/locales/en-US/facebook.properties
++++ b/chat/locales/en-US/facebook.properties
+@@ -2,6 +2,5 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+-connection.error.useUsernameNotEmailAddress=Please use your Facebook username, not an email address
+-
+ facebook.chat.name=Facebook Chat
++facebook.disabled=Facebook Chat is no longer supported due to Facebook disabling their XMPP gateway.
+diff --git a/chat/locales/en-US/yahoo.properties b/chat/locales/en-US/yahoo.properties
+index 727faa6..89ee009 100644
+--- a/chat/locales/en-US/yahoo.properties
++++ b/chat/locales/en-US/yahoo.properties
+@@ -2,36 +2,4 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+-login.error.badCredentials=Username or password is incorrect.
+-login.error.accountLockedFailed=Account locked due to too many failed login attempts.
+-login.error.accountLockedGeneral=Account locked due to too many login attempts.
+-login.error.accountDeactivated=Account has been deactivated.
+-login.error.usernameNotExist=The username does not exist.
+-# The %S will be an error code returned by the server.
+-login.error.unknown=Unknown error: %S
+-network.error.http=HTTP connection error.
+-
+-conference.invite.message=Join my conference.
+-
+-# Some options are commented out because they aren't used. We do the same thing
+-# to their description strings.
+-options.pagerPort=Port
+-options.transferHost=File transfer server
+-options.transferPort=File transfer port
+-options.chatEncoding=Encoding
+-options.ignoreInvites=Ignore conference invitations
+-
+-# In this message, %S is replaced with the username of the user who left.
+-system.message.conferenceLogoff=%S has left the conference.
+-system.message.conferenceLogon=%S has joined the conference.
+-
+-# LOCALZIATION NOTE (command.*):
+-# These are the help messages for each command, the %S is the command name
+-# Each command first gives the parameter it accepts and then a description of
+-# the command.
+-command.help.invite2=%S <user1>[,<user2>,...] [<invite message>]: invite one or more users into this conference chat.
+-command.help.conference=%S: Create a new conference room in which you can later invite other users.
+-
+-# LOCALIZATION NOTE (command.feedback.invite):
+-# %S is the user, or comma separated list of users, invited to the conference.
+-command.feedback.invite=You have invited %S to the conference.
++yahoo.disabled=Yahoo Messenger is no longer supported due to Yahoo disabling their legacy protocol.
+diff --git a/chat/protocols/facebook/facebook.js b/chat/protocols/facebook/facebook.js
+index 7b5b3b8..9d90eac 100644
+--- a/chat/protocols/facebook/facebook.js
++++ b/chat/protocols/facebook/facebook.js
+@@ -6,33 +6,26 @@ var {interfaces: Ci, utils: Cu} = Components;
+
+ Cu.import("resource:///modules/imXPCOMUtils.jsm");
+ Cu.import("resource:///modules/jsProtoHelper.jsm");
+-Cu.import("resource:///modules/xmpp.jsm");
+-Cu.import("resource:///modules/xmpp-session.jsm");
+
+ XPCOMUtils.defineLazyGetter(this, "_", () =>
+ l10nHelper("chrome://chat/locale/facebook.properties")
+ );
+-XPCOMUtils.defineLazyGetter(this, "_irc", () =>
+- l10nHelper("chrome://chat/locale/irc.properties")
+-);
+
+ function FacebookAccount(aProtoInstance, aImAccount) {
+ this._init(aProtoInstance, aImAccount);
+ }
+ FacebookAccount.prototype = {
+- __proto__: XMPPAccountPrototype,
+- get canJoinChat() { return false; },
++ __proto__: GenericAccountPrototype,
+ connect: function() {
+ this.WARN("As Facebook deprecated its XMPP gateway, it is currently not " +
+ "possible to connect to Facebook Chat. See bug 1141674.");
+ this.reportDisconnecting(Ci.prplIAccount.ERROR_OTHER_ERROR,
+- _irc("error.unavailable", _("facebook.chat.name")));
++ _("facebook.disabled"));
+ this.reportDisconnected();
+ }
+ };
+
+-function FacebookProtocol() {
+-}
++function FacebookProtocol() {}
+ FacebookProtocol.prototype = {
+ __proto__: GenericProtocolPrototype,
+ get normalizedName() { return "facebook"; },
+diff --git a/chat/protocols/yahoo/moz.build b/chat/protocols/yahoo/moz.build
+index f144347..ea37853 100644
+--- a/chat/protocols/yahoo/moz.build
++++ b/chat/protocols/yahoo/moz.build
+@@ -3,15 +3,9 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+-XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini']
+-
+ EXTRA_COMPONENTS += [
+ 'yahoo.js',
+ 'yahoo.manifest',
+ ]
+
+-EXTRA_JS_MODULES += [
+- 'yahoo-session.jsm',
+-]
+-
+ JAR_MANIFESTS += ['jar.mn']
+diff --git a/chat/protocols/yahoo/test/test_yahooAccount.js b/chat/protocols/yahoo/test/test_yahooAccount.js
+deleted file mode 100644
+index 51df00b..0000000
+--- a/chat/protocols/yahoo/test/test_yahooAccount.js
++++ /dev/null
+@@ -1,98 +0,0 @@
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-Components.utils.import("resource://gre/modules/Services.jsm");
+-var yahoo = {};
+-Services.scriptloader.loadSubScript("resource:///components/yahoo.js", yahoo);
+-
+-function run_test()
+-{
+- add_test(test_cleanUsername);
+- add_test(test_fixFontSize);
+- run_next_test();
+-}
+-
+-// Test the stripping of @yahoo.* domains from usernames.
+-function test_cleanUsername()
+-{
+- // These are just a few of the many possible domains.
+- let domains = ["yahoo.com.ar", "yahoo.com.au", "yahoo.com", "yahoo.co.jp",
+- "yahoo.it", "yahoo.cn", "yahoo.co.in"];
+- let userId = "user";
+-
+- // We must provide a mimimal fake implementation of a protocol object, to keep
+- // the YahooAccount constructor happy.
+- let fakeProtocol = {
+- id: "fake-proto",
+- options: {
+- local_charset: "UTF-8"
+- },
+- _getOptionDefault: function(aOption) { return this.options[aOption]; }
+- };
+- let fakeImAccount = {};
+-
+- for each(let domain in domains) {
+- fakeImAccount.name = userId + "@" + domain;
+- let yahooAccount = new yahoo.YahooAccount(fakeProtocol, fakeImAccount);
+- do_check_eq(userId, yahooAccount.cleanUsername);
+- }
+- run_next_test();
+-}
+-
+-// Test the _fixFontSize() method and ensure that it correctly fixes font sizes
+-// in <font> tags while keeping any mention of size= in conversation untouched.
+-function test_fixFontSize()
+-{
+- // This is an array of two-element arrays. Each inner two-element array
+- // contains a message with a badly formed font size as the first element,
+- // and a message with a well-formed font size as the second element. We test
+- // to ensure that the badly formed message is converted to the well-formed
+- // one.
+- let testMessages = [
+- // Single font tag.
+- ["<font face=\"Arial\" size=\"12\">Test message 1",
+- "<font face=\"Arial\" size=\"3\">Test message 1"],
+- // Single font tag with size="<digit>" in innner message.
+- ["<font face=\"Arial\" size=\"9\">size=\"30\" is a big size.</font>",
+- "<font face=\"Arial\" size=\"2\">size=\"30\" is a big size.</font>"],
+- // Single font tag with no face attribute.
+- ["<font size=\"12\">This message has no font face attribute.",
+- "<font size=\"3\">This message has no font face attribute."],
+- // Single font tag with no size attribute.
+- ["<font face=\"Arial\">This message has no font size attribute.",
+- "<font face=\"Arial\">This message has no font size attribute."],
+- // Single font tag with rearranged attribute order.
+- ["<font size=\"9\" face=\"Arial\">size=\"30\" is a big size.</font>",
+- "<font size=\"2\" face=\"Arial\">size=\"30\" is a big size.</font>"],
+- // Multiple font tags.
+- ["<font face=\"Arial\" size=\"12\">Hello. <font face=\"Consolas\" size=\"40\">World",
+- "<font face=\"Arial\" size=\"3\">Hello. <font face=\"Consolas\" size=\"7\">World"]
+- ];
+-
+- let fakeProtocol = {
+- id: "fake-proto",
+- options: {
+- local_charset: "UTF-8"
+- },
+- _getOptionDefault: function(aOption) { return this.options[aOption]; }
+- };
+- let fakeImAccount = {name: "test-user"};
+- // We create a fake conversation object so we can obtain the cleaned up
+- // message from the conv.writeMessage() call.
+- let messagePair;
+- let fakeConversation = {
+- writeMessage: function(aName, aMessage, aProperties) {
+- do_check_eq(aMessage, messagePair[1]); // Compare to the good message.
+- },
+- updateTyping: function(aStatus, aName) { }
+- };
+-
+- let yahooAccount = new yahoo.YahooAccount(fakeProtocol, fakeImAccount);
+- yahooAccount._conversations.set("test-user", fakeConversation);
+- for each(let pair in testMessages) {
+- messagePair = pair;
+- // Send in the badly formed message.
+- yahooAccount.receiveMessage("test-user", messagePair[0]);
+- }
+- run_next_test();
+-}
+diff --git a/chat/protocols/yahoo/test/test_yahooLoginHelper.js b/chat/protocols/yahoo/test/test_yahooLoginHelper.js
+deleted file mode 100644
+index e4d8bc1..0000000
+--- a/chat/protocols/yahoo/test/test_yahooLoginHelper.js
++++ /dev/null
+@@ -1,89 +0,0 @@
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-Components.utils.import("resource:///modules/ArrayBufferUtils.jsm");
+-Components.utils.import("resource://gre/modules/Services.jsm");
+-Components.utils.import("resource:///modules/yahoo-session.jsm");
+-var yahoo = {};
+-Services.scriptloader.loadSubScript("resource:///modules/yahoo-session.jsm", yahoo);
+-
+-// Preset test values.
+-var kUsername = "testUser";
+-var kPassword = "instantbird";
+-var kPagerIp = "123.456.78.9";
+-var kCrumb = "MG-Z/jNG+Q==";
+-var kChallengeString = "AEF08DBAC33F9EEDABCFEA==";
+-var kYCookie = "OTJmMTQyOTU1ZGQ4MDA3Y2I2ODljMTU5";
+-var kTCookie = "NTdlZmIzY2Q4ODI3ZTc3NTIxYTk1MDhm";
+-var kToken = "MThmMzg3OWM3ODcxMW";
+-
+-var kPagerAddressResponse = "COLO_CAPACITY=1\r\nCS_IP_ADDRESS=" + kPagerIp;
+-var kTokenResponse = "0\r\n" + kToken + "\r\npartnerid=dummyValue";
+-var kCookieResponse = "0\r\ncrumb=" + kCrumb + "\r\nY=" + kYCookie +
+- "\r\nT=" + kTCookie + "\r\ncookievalidfor=86400";
+-
+-/* In each test, we override the function that would normally be called next in
+- * the login process. We do this so that we can intercept the login process,
+- * preventing calls to real Yahoo! servers, and do equality testing. */
+-function run_test()
+-{
+- add_test(test_pagerAddress);
+- add_test(test_challengeString);
+- add_test(test_loginToken);
+- add_test(test_cookies);
+- run_next_test();
+-}
+-
+-function test_pagerAddress()
+-{
+- let helper = new yahoo.YahooLoginHelper({}, {});
+-
+- helper._getChallengeString = function() {
+- do_check_eq(kPagerIp, helper._session.pagerAddress);
+- run_next_test();
+- };
+-
+- helper._onPagerAddressResponse(kPagerAddressResponse, null);
+-}
+-
+-function test_challengeString()
+-{
+- let helper = new yahoo.YahooLoginHelper({}, {});
+-
+- helper._getLoginToken = function() {
+- do_check_eq(kChallengeString, helper._challengeString);
+- run_next_test();
+- };
+-
+- let response = new yahoo.YahooPacket(yahoo.kPacketType.AuthResponse, 0, 0);
+- response.addValue(1, helper._username);
+- response.addValue(94, kChallengeString);
+- response.addValue(13, 0);
+- helper._onChallengeStringResponse(response.toArrayBuffer());
+-}
+-
+-function test_loginToken()
+-{
+- let helper = new yahoo.YahooLoginHelper({}, {});
+-
+- helper._getCookies = function() {
+- do_check_eq(kToken, helper._loginToken);
+- run_next_test();
+- };
+-
+- helper._onLoginTokenResponse(kTokenResponse, null);
+-}
+-
+-function test_cookies()
+-{
+- let helper = new yahoo.YahooLoginHelper({}, {});
+-
+- helper._sendPagerAuthResponse = function() {
+- do_check_eq(kCrumb, helper._crumb);
+- do_check_eq(kYCookie, helper._session.yCookie);
+- do_check_eq(kTCookie, helper._session.tCookie);
+- run_next_test();
+- };
+-
+- helper._onLoginCookiesResponse(kCookieResponse, null);
+-}
+diff --git a/chat/protocols/yahoo/test/test_yahoopacket.js b/chat/protocols/yahoo/test/test_yahoopacket.js
+deleted file mode 100644
+index 7908c44..0000000
+--- a/chat/protocols/yahoo/test/test_yahoopacket.js
++++ /dev/null
+@@ -1,217 +0,0 @@
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-Components.utils.import("resource:///modules/ArrayBufferUtils.jsm");
+-Components.utils.import("resource://gre/modules/Services.jsm");
+-Components.utils.import("resource:///modules/yahoo-session.jsm");
+-var yahoo = {};
+-Services.scriptloader.loadSubScript("resource:///modules/yahoo-session.jsm", yahoo);
+-
+-var kPacketIdBytes = StringToBytes(yahoo.kPacketIdentfier);
+-var kHelloKey = 1;
+-var kHelloValue = "Hello";
+-var kWorldKey = 20;
+-var kWorldValue = "World";
+-var kNumberKey = 4;
+-var kNumberValue = 32;
+-var kParamsKey = 60;
+-var kParam1Value = "param1";
+-var kParam2Value = "param2";
+-var kPacketDataString = "1\xC0\x80Hello\xC0\x8020\xC0\x80World\xC0\x80" +
+- "4\xC0\x8032\xC0\x8060\xC0\x80param1\xC0\x80" +
+- "60\xC0\x80param2\xC0\x80";
+-
+-function run_test()
+-{
+- add_test(test_headerCreation);
+- add_test(test_fullPacketCreation);
+- add_test(test_packetDecoding);
+- add_test(test_extractPackets);
+- add_test(test_malformedPacketExtraction);
+-
+- run_next_test();
+-}
+-
+-function test_headerCreation()
+-{
+- let packetLength = 0;
+- // Random numbers.
+- let serviceNumber = 0x57;
+- let status = 0x04;
+- let sessionId = 0x57842390;
+-
+- let packet = new yahoo.YahooPacket(serviceNumber, status, sessionId);
+- let buf = packet.toArrayBuffer();
+- let view = new DataView(buf);
+-
+- // Ensure that the first 4 bytes contain the YMSG identifier.
+- for (let i = 0; i < kPacketIdBytes.length; ++i)
+- do_check_eq(kPacketIdBytes[i], view.getUint8(i));
+-
+- do_check_eq(yahoo.kProtocolVersion, view.getUint16(4));
+- do_check_eq(yahoo.kVendorId, view.getUint16(6));
+- do_check_eq(packetLength, view.getUint16(8));
+- do_check_eq(serviceNumber, view.getUint16(10));
+- do_check_eq(status, view.getUint32(12));
+- do_check_eq(sessionId, view.getUint32(16));
+-
+- run_next_test();
+-}
+-
+-function test_fullPacketCreation()
+-{
+- packetLength = kPacketDataString.length;
+- // Random numbers.
+- let serviceNumber = 0x55;
+- let status = 0x02;
+- let sessionId = 0x12567800;
+-
+- let packet = new yahoo.YahooPacket(serviceNumber, status, sessionId);
+- packet.addValue(kHelloKey, kHelloValue);
+- packet.addValue(kWorldKey, kWorldValue);
+- packet.addValue(kNumberKey, kNumberValue);
+- packet.addValues(kParamsKey, [kParam1Value, kParam2Value]);
+- let buf = packet.toArrayBuffer();
+- let view = new DataView(buf);
+-
+- // Header check.
+-
+- // Ensure that the first 4 bytes contain the YMSG identifier.
+- for (let i = 0; i < kPacketIdBytes.length; ++i)
+- do_check_eq(kPacketIdBytes[i], view.getUint8(i));
+-
+- do_check_eq(yahoo.kProtocolVersion, view.getUint16(4));
+- do_check_eq(yahoo.kVendorId, view.getUint16(6));
+- do_check_eq(packetLength, view.getUint16(8));
+- do_check_eq(serviceNumber, view.getUint16(10));
+- do_check_eq(status, view.getUint32(12));
+- do_check_eq(sessionId, view.getUint32(16));
+-
+- // Packet data check.
+- let dataBytes = StringToBytes(kPacketDataString);
+- for (let i = 0; i < dataBytes.length; ++i)
+- do_check_eq(dataBytes[i], view.getUint8(yahoo.kPacketHeaderSize + i));
+- run_next_test()
+-}
+-
+-function test_packetDecoding()
+-{
+- let packetLength = kPacketDataString.length;
+- // Random numbers.
+- let serviceNumber = 0x20;
+- let status = 0x06;
+- let sessionId = 0x13319AB2;
+-
+- let buf = new ArrayBuffer(yahoo.kPacketHeaderSize + packetLength);
+- let view = new DataView(buf);
+-
+- for (let i = 0; i < kPacketIdBytes.length; ++i)
+- view.setUint8(i, kPacketIdBytes[i]);
+-
+- view.setUint16(4, yahoo.kProtocolVersion);
+- view.setUint16(6, yahoo.kVendorId);
+- view.setUint16(8, packetLength);
+- view.setUint16(10, serviceNumber);
+- view.setUint32(12, status);
+- view.setUint32(16, sessionId);
+-
+- let dataBuf = BytesToArrayBuffer(StringToBytes(kPacketDataString));
+- copyBytes(buf, dataBuf, 20);
+-
+- // Now we decode and test.
+- let packet = new yahoo.YahooPacket();
+- packet.fromArrayBuffer(buf);
+-
+- // Test header information.
+- do_check_eq(serviceNumber, packet.service);
+- do_check_eq(status, packet.status);
+- do_check_eq(sessionId, packet.sessionId);
+-
+- // Test the getting of single packet data values.
+- do_check_eq(kHelloValue, packet.getValue(kHelloKey));
+- do_check_eq(kWorldValue, packet.getValue(kWorldKey));
+- do_check_eq(kNumberValue, packet.getValue(kNumberKey));
+-
+- // Test the getting of multiple values with a single key.
+- let multiValue = packet.getValues(kParamsKey);
+- do_check_eq(2, multiValue.length);
+- do_check_eq(kParam1Value, multiValue[0]);
+- do_check_eq(kParam2Value, multiValue[1]);
+-
+- // Test if certain keys are non-existant.
+- do_check_true(packet.hasKey(kHelloKey));
+- do_check_false(packet.hasKey(500)); // There is no key 500.
+-
+- run_next_test();
+-}
+-
+-function test_extractPackets()
+-{
+- // Some constants for each packet.
+- const kP1Service = 0x47;
+- const kP1Status = 0;
+- const kP1SessionId = 0x12345678;
+- // Used for testing packet verification.
+- const kP1FuzzerKey = 42;
+- const kP1FuzzerValue = "I am using the YMSG protocol!";
+-
+- const kP2Service = 0x57;
+- const kP2Status = 5;
+- const kP2SessionId = 0x87654321;
+-
+- // First, create two packets and obtain their buffers.
+- let packet1 = new yahoo.YahooPacket(kP1Service, kP1Status, kP1SessionId);
+- packet1.addValue(kHelloKey, kHelloValue);
+- packet1.addValue(kP1FuzzerKey, kP1FuzzerValue);
+- let packet1Buffer = packet1.toArrayBuffer();
+-
+- let packet2 = new yahoo.YahooPacket(kP2Service, kP2Status, kP2SessionId);
+- packet2.addValue(kWorldKey, kWorldValue);
+- let packet2Buffer = packet2.toArrayBuffer();
+-
+- // Create one full buffer with both packets inside.
+- let fullBuffer = new ArrayBuffer(packet1Buffer.byteLength +
+- packet2Buffer.byteLength);
+- copyBytes(fullBuffer, packet1Buffer);
+- copyBytes(fullBuffer, packet2Buffer, packet1Buffer.byteLength);
+-
+- // Now, run the packets through the extractPackets() method.
+- let [extractedPackets, bytesHandled] =
+- yahoo.YahooPacket.extractPackets(fullBuffer);
+- do_check_eq(2, extractedPackets.length);
+-
+- // Packet 1 checks.
+- let p1 = extractedPackets[0];
+- do_check_eq(kP1Service, p1.service);
+- do_check_eq(kP1Status, p1.status);
+- do_check_eq(kP1SessionId, p1.sessionId);
+- do_check_true(p1.hasKey(kHelloKey));
+- do_check_eq(kHelloValue, p1.getValue(kHelloKey));
+-
+- // Packet 2 checks.
+- let p2 = extractedPackets[1];
+- do_check_eq(kP2Service, p2.service);
+- do_check_eq(kP2Status, p2.status);
+- do_check_eq(kP2SessionId, p2.sessionId);
+- do_check_true(p2.hasKey(kWorldKey));
+- do_check_eq(kWorldValue, p2.getValue(kWorldKey));
+-
+- // Check if all the bytes were handled.
+- do_check_eq(fullBuffer.byteLength, bytesHandled);
+-
+- run_next_test();
+-}
+-
+-function test_malformedPacketExtraction()
+-{
+- const kInvalidPacketData = "MSYG1\xC0\x80Hello\xC0\x8020\xC0\x80World\xC0\x80";
+- let buffer = BytesToArrayBuffer(StringToBytes(kInvalidPacketData));
+- let malformed = false;
+- try {
+- yahoo.YahooPacket.extractPackets(buffer);
+- } catch(e) {
+- malformed = true;
+- }
+- do_check_true(malformed);
+- run_next_test();
+-}
+diff --git a/chat/protocols/yahoo/test/xpcshell.ini b/chat/protocols/yahoo/test/xpcshell.ini
+deleted file mode 100644
+index f4b464e..0000000
+--- a/chat/protocols/yahoo/test/xpcshell.ini
++++ /dev/null
+@@ -1,7 +0,0 @@
+-[DEFAULT]
+-head =
+-tail =
+-
+-[test_yahooAccount.js]
+-[test_yahooLoginHelper.js]
+-[test_yahoopacket.js]
+diff --git a/chat/protocols/yahoo/yahoo-session.jsm b/chat/protocols/yahoo/yahoo-session.jsm
+deleted file mode 100644
+index cc96120..0000000
+--- a/chat/protocols/yahoo/yahoo-session.jsm
++++ /dev/null
+@@ -1,1156 +0,0 @@
+-/* This Source Code Form is subject to the terms of the Mozilla Public
+- * License, v. 2.0. If a copy of the MPL was not distributed with this
+- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+-
+-this.EXPORTED_SYMBOLS = ["YahooSession"];
+-
+-var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+-
+-Cu.import("resource://gre/modules/FileUtils.jsm");
+-Cu.import("resource://gre/modules/Http.jsm");
+-Cu.import("resource://gre/modules/NetUtil.jsm");
+-Cu.import("resource:///modules/ArrayBufferUtils.jsm");
+-Cu.import("resource:///modules/imServices.jsm");
+-Cu.import("resource:///modules/imXPCOMUtils.jsm");
+-Cu.import("resource:///modules/socket.jsm");
+-
+-XPCOMUtils.defineLazyGetter(this, "_", () =>
+- l10nHelper("chrome://chat/locale/yahoo.properties")
+-);
+-
+-XPCOMUtils.defineLazyServiceGetter(this, "imgTools",
+- "@mozilla.org/image/tools;1", "imgITools");
+-
+-var kProtocolVersion = 16;
+-var kVendorId = 0;
+-
+-var kPacketDataDelimiter = "\xC0\x80";
+-var kPacketIdentifier = "YMSG";
+-var kPacketHeaderSize = 20;
+-var kProfileIconWidth = 96;
+-
+-// These constants are used by the icon uploading code since the Yahoo! file
+-// transfer server is used for user icon uploads.
+-var kFileTransferHost = "filetransfer.msg.yahoo.com";
+-var kFileTransferPort = 80;
+-
+-var kPacketType = {
+- // Sent by a client when logging off of the Yahoo! network.
+- Logoff: 0x02,
+- // Sent by a client when a message is sent to a buddy.
+- Message: 0x06,
+- // Sent to the pager server once per hour.
+- Ping: 0x12,
+- // Used for inviting others to a conference.
+- ConfInvite: 0x18,
+- // Used as a notification when you or someone else joins a conference room.
+- ConfLogon: 0x19,
+- // Used as a notification when you or someone else leaves a conference room.
+- ConfLogoff: 0x1b,
+- // This is sent by the client when additional users are invited to the
+- // conference, but it can be sent as the first invite as well.
+- ConfAddInvite: 0x1c,
+- // Broadcast to all users in a conference room when someone posts a message.
+- ConfMessage: 0x1d,
+- // Used for typing notifications.
+- Notify: 0x4b,
+- // These two are used during initial authentication with the pager server.
+- AuthResponse: 0x54,
+- Auth: 0x57,
+- // Buddy list controls.
+- AddBuddy: 0x83,
+- RemoveBuddy: 0x84,
+- // This is sent when you reject a Yahoo! user's buddy request.
+- BuddyReqReject: 0x86,
+- // Sent to the server once every minute, telling it here are still alive.
+- KeepAlive: 0x8A,
+- // This is sent when we request a buddy icon.
+- Picture: 0xbe,
+- // This is sent after a profile picture has been successfully uploaded.
+- PictureUpload: 0xc2,
+- // This is sent whenever a buddy changes their status.
+- StatusUpdate: 0xc6,
+- // This is sent when we update our icon.
+- AvatarUpdate: 0xc7,
+- // This is sent when someone wishes to become your buddy.
+- BuddyAuth: 0xd6,
+- // Holds the initial status of all buddies when a user first logs in.
+- StatusInitial: 0xf0,
+- // Contains the buddy list sent from the server.
+- List: 0xf1,
+- // Sent back to the pager server after each received message. Sending this
+- // prevents echoed messages when chatting with the official Yahoo! client.
+- MessageAck: 0xfb
+-};
+-
+-var kPacketStatuses = {
+- ServerAck: 0x1,
+- Typing: 0x16
+-};
+-
+-// Each Yahoo! error code is mapped to a two-element array. The first element
+-// contains the last part of the name of its localized string. This is appended
+-// to "login.error." to obtain the string. The second element is the
+-// Instantbird error that is given to the error handler.
+-var kLoginStatusErrors = {
+- "1212" : ["badCredentials",
+- Ci.prplIAccount.ERROR_AUTHENTICATION_FAILED],
+- "1213" : ["accountLockedFailed",
+- Ci.prplIAccount.ERROR_AUTHENTICATION_FAILED],
+- "1218" : ["accountDeactivated",
+- Ci.prplIAccount.ERROR_AUTHENTICATION_FAILED],
+- "1235" : ["usernameNotExist",
+- Ci.prplIAccount.ERROR_INVALID_USERNAME],
+- "1236" : ["accountLockedGeneral",
+- Ci.prplIAccount.ERROR_AUTHENTICATION_FAILED]
+-};
+-
+-// These are the status codes that buddies can send us.
+-var kBuddyStatuses = {
+- // Available.
+- "0" : Ci.imIStatusInfo.STATUS_AVAILABLE,
+- // Be right back.
+- "1" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Busy.
+- "2" : Ci.imIStatusInfo.STATUS_UNAVAILABLE,
+- // Not at home.
+- "3" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Not at desk.
+- "4" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Not in office.
+- "5" : Ci.imIStatusInfo.STATUS_AWAY,
+- // On phone.
+- "6" : Ci.imIStatusInfo.STATUS_AWAY,
+- // On vacation.
+- "7" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Out to lunch.
+- "8" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Stepped out.
+- "9" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Invisible.
+- "12" : Ci.imIStatusInfo.STATUS_INVISIBLE,
+- // Custom status.
+- "99" : Ci.imIStatusInfo.STATUS_AWAY,
+- // Idle.
+- "999" : Ci.imIStatusInfo.STATUS_IDLE
+-};
+-
+-/* The purpose of the YahooSession object is to serve as a gateway between the
+- * protocol plug-in and the Yahoo! Messenger servers. Anytime an object outside
+- * of this file wishes to communicate with the servers, it should do it through
+- * one of the methods provided by YahooSession. By centralizing such network
+- * access, we can easily catch errors, and ensure that communication is handled
+- * correctly. */
+-function YahooSession(aAccount)
+-{
+- this._account = aAccount;
+- this.binaryMode = true;
+-}
+-YahooSession.prototype = {
+- __proto__: Socket,
+- _account: null,
+- _socket: null,
+- _username: null,
+- // This is the IPv4 address to the pager server which is the gateway into the
+- // Yahoo! Messenger network.
+- pagerAddress: null,
+- // The session ID is obtained during the login process and is maintained
+- // throughout the session. This helps the pager server identify the client.
+- sessionId: null,
+- // The T and Y cookies obtained by the YahooLoginHelper during login.
+- tCookie: null,
+- yCookie: null,
+-
+- // Public methods.
+- login: function() {
+- this._account.reportConnecting();
+- new YahooLoginHelper(this).login(this._account);
+- },
+-
+- sendPacket: function(aPacket) {
+- this.sendBinaryData(aPacket.toArrayBuffer(), aPacket.toString());
+- },
+-
+- addBuddyToServer: function(aBuddy) {
+- let packet = new YahooPacket(kPacketType.AddBuddy, 0, this.sessionId);
+- // We leave this invite message empty. Any message placed here will
+- // annoyingly be sent to the invitee when they accept the invite.
+- packet.addValue(14, "");
+- packet.addValue(65, aBuddy.tag.name);
+- packet.addValue(97, "1"); // UTF-8 encoding.
+- packet.addValue(1, this._account.cleanUsername);
+- // The purpose of these two values are unknown.
+- packet.addValue(302, "319");
+- packet.addValue(300, "319");
+- packet.addValue(7, aBuddy.userName);
+- // The purpose of these three values are also unknown.
+- packet.addValue(334, "0");
+- packet.addValue(301, "319");
+- packet.addValue(303, "319");
+- this.sendPacket(packet);
+- },
+-
+- removeBuddyFromServer: function(aBuddy) {
+- let packet = new YahooPacket(kPacketType.RemoveBuddy, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(7, aBuddy.userName);
+- packet.addValue(65, aBuddy.tag.name);
+- this.sendPacket(packet);
+- },
+-
+- setStatus: function(aStatus, aMessage) {
+- let packet = new YahooPacket(kPacketType.StatusUpdate, 0, this.sessionId);
+-
+- // When a custom status message is used, key 10 is set to 99, and key 97
+- // is set to 1. Otherwise, key 10 is set to our current status code.
+- if (aMessage && aMessage.length > 0) {
+- packet.addValue(10, "99");
+- packet.addValue(97, "1");
+- } else {
+- let statusCode;
+- switch(aStatus) {
+- // Available
+- case Ci.imIStatusInfo.STATUS_AVAILABLE:
+- case Ci.imIStatusInfo.STATUS_MOBILE:
+- statusCode = "0";
+- break;
+- // Away
+- case Ci.imIStatusInfo.STATUS_AWAY:
+- statusCode = "1";
+- break;
+- // Busy
+- case Ci.imIStatusInfo.STATUS_UNAVAILABLE:
+- statusCode = "2";
+- break;
+- // Invisible
+- case Ci.imIStatusInfo.STATUS_INVISIBLE:
+- statusCode = "12";
+- break;
+- // Idle
+- case Ci.imIStatusInfo.STATUS_IDLE:
+- statusCode = "999";
+- break;
+- }
+- packet.addValue(10, statusCode);
+- }
+-
+- // Key 19 is always set as the status messgae, even when the message is
+- // empty. If key 10 is set to 99, the message is used.
+- packet.addValue(19, aMessage);
+-
+- // Key 47 is always set to either 0, if we are available, or 1, if we are
+- // not available. The value is used by the server if key 10 is set to 99.
+- // Otherwise, the value of key 10 is used to determine our status.
+- packet.addValue(47, (aStatus == Ci.imIStatusInfo.STATUS_AVAILABLE) ?
+- "0" : "1");
+- this.sendPacket(packet);
+- },
+-
+- sendChatMessage: function(aName, aMessage) {
+- let packet = new YahooPacket(kPacketType.Message, 0, this.sessionId);
+- // XXX Key 0 is the user ID, and key 1 is the active ID. We need to find
+- // the difference between these two. Alias maybe?
+- packet.addValue(0, this._account.cleanUsername);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(5, aName);
+- packet.addValue(14, aMessage);
+- this.sendPacket(packet);
+- },
+-
+- sendConferenceMessage: function(aRecipients, aRoom, aMessage) {
+- let packet = new YahooPacket(kPacketType.ConfMessage, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValues(53, aRecipients);
+- packet.addValue(57, aRoom);
+- packet.addValue(14, aMessage);
+- packet.addValue(97, "1"); // Use UTF-8 encoding.
+- this.sendPacket(packet);
+- },
+-
+- sendTypingStatus: function(aBuddyName, aIsTyping) {
+- let packet = new YahooPacket(kPacketType.Notify, kPacketStatuses.Typing,
+- this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(5, aBuddyName);
+- packet.addValue(13, aIsTyping ? "1" : "0");
+- packet.addValue(14, " "); // Key 14 contains a single space.
+- packet.addValue(49, "TYPING");
+- this.sendPacket(packet);
+- },
+-
+- acceptConferenceInvite: function(aOwner, aRoom, aParticipants) {
+- let packet = new YahooPacket(kPacketType.ConfLogon, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(57, aRoom);
+- packet.addValues(3, aParticipants);
+- this.sendPacket(packet);
+- },
+-
+- createConference: function(aRoom) {
+- let packet = new YahooPacket(kPacketType.ConfLogon, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(3, this._account.cleanUsername);
+- packet.addValue(57, aRoom);
+- this.sendPacket(packet);
+- },
+-
+- inviteToConference: function(aInvitees, aRoom, aParticipants, aMessage) {
+- let packet = new YahooPacket(kPacketType.ConfAddInvite, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValues(51, aInvitees);
+- packet.addValues(53, aParticipants);
+- packet.addValue(57, aRoom);
+- packet.addValue(58, aMessage);
+- packet.addValue(13, "0");
+- this.sendPacket(packet);
+- },
+-
+- sendConferenceLogoff: function(aName, aParticipants, aRoom) {
+- let packet = new YahooPacket(kPacketType.ConfLogoff, 0, this.sessionId);
+- packet.addValue(1, aName);
+- packet.addValues(3, aParticipants);
+- packet.addValue(57, aRoom);
+- this.sendPacket(packet);
+- },
+-
+- setProfileIcon: function(aFileName) {
+- // If we have an empty filename, remove the icon from the server.
+- if (!aFileName) {
+- let packet = new YahooPacket(kPacketType.AvatarUpdate, 0, this.sessionId);
+- packet.addValue(3, this._account.cleanUsername);
+- packet.addValue(213, 0);
+- this.sendPacket(packet);
+- return;
+- }
+- // Try to get a handle to the icon file.
+- let file = FileUtils.getFile("ProfD", [aFileName]);
+- let type = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService)
+- .getTypeFromFile(file);
+- NetUtil.asyncFetch({
+- uri: NetUtil.newURI(file),
+- contentPolicyType: Ci.nsIContentPolicy.TYPE_IMAGE,
+- securityFlags: Ci.nsILoadInfo.SEC_NORMAL,
+- loadUsingSystemPrincipal: true
+- }, (aStream, aStatus) => {
+- if (!Components.isSuccessCode(aStatus)) {
+- throw "Could not access icon file.";
+- return;
+- }
+- let image = imgTools.decodeImage(aStream, type);
+- let uploader = new YahooProfileIconUploader(this._account, this,
+- aFileName, image);
+- uploader.uploadIcon();
+- });
+- },
+-
+- requestBuddyIcon: function(aName) {
+- let packet = new YahooPacket(kPacketType.Picture, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(5, aName); // The name of the buddy.
+- packet.addValue(13, "1"); // "1" means we wish to request an icon.
+- this.sendPacket(packet);
+- },
+-
+- acceptBuddyRequest: function(aRequest) {
+- let packet = new YahooPacket(kPacketType.BuddyAuth, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(5, aRequest.userName);
+- // Misc. Unknown flags.
+- packet.addValue(13, 1);
+- packet.addValue(334, 0);
+- this.sendPacket(packet);
+-
+- // If someone wants to add us as a buddy, place them under the default
+- // tag. Also, we make sure that the buddy doesn't already exist in the
+- // list in case of a server acknowledgement.
+- if (!this._account.hasBuddy(aRequest.userName))
+- this._account.addBuddy(Services.tags.defaultTag, aRequest.userName);
+- },
+-
+- denyBuddyRequest: function(aRequest) {
+- let packet = new YahooPacket(kPacketType.BuddyReqReject, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(7, aRequest.userName);
+- packet.addValue(14, "");
+- this.sendPacket(packet);
+- },
+-
+- sendKeepAlive: function() {
+- let packet = new YahooPacket(kPacketType.KeepAlive, 0, this.sessionId);
+- packet.addValue(0, this._account.cleanUsername);
+- this.sendBinaryData(packet.toArrayBuffer());
+- },
+-
+- sendPing: function() {
+- let packet = new YahooPacket(kPacketType.Ping, 0, this.sessionId);
+- this.sendBinaryData(packet.toArrayBuffer());
+- },
+-
+- // Callbacks.
+- onLoginComplete: function() {
+- this._account.reportConnected();
+- this._account.onLoginComplete();
+- },
+-
+- onSessionError: function(aError, aMessage) {
+- this._account.reportDisconnecting(aError, aMessage);
+- if (!this.disconnected)
+- this.disconnect();
+- this._account.reportDisconnected();
+- },
+-
+- // Private methods.
+-
+- // Socket Event Callbacks.
+- LOG: function(aString) { return this._account.LOG(aString); },
+-
+- DEBUG: function(aString) { return this._account.DEBUG(aString); },
+-
+- onConnection: function() {
+- // We send an authentication request packet as soon as we connect to the
+- // pager server.
+- let packet = new YahooPacket(kPacketType.Auth, 0, 0);
+- packet.addValue(1, this._account.cleanUsername);
+- this.sendPacket(packet);
+- },
+-
+- onConnectionTimedOut: function() {
+- this.onSessionError(Ci.prplIAccount.NETWORK_ERROR, "");
+- },
+-
+- onConnectionReset: function() {
+- this.onSessionError(Ci.prplIAccount.NETWORK_ERROR, "");
+- },
+-
+- // Called when the other end has closed the connection.
+- onConnectionClosed: function() {
+- if (!this._account.connected)
+- return;
+- this._account.reportDisconnecting(Ci.prplIAccount.NO_ERROR, "");
+- this._account.reportDisconnected();
+- },
+-
+- onBinaryDataReceived: function(aData) {
+- let packets;
+- let bytesHandled;
+- try {
+- [packets, bytesHandled] = YahooPacket.extractPackets(aData);
+- } catch(e) {
+- this._account.ERROR(e);
+- this.onSessionError(Ci.prplIAccount.NETWORK_ERROR, "");
+- return 0;
+- }
+-
+- for each (let packet in packets) {
+- this._account.LOG("Received Packet:\n" + packet.toString());
+- if (YahooPacketHandler.hasOwnProperty(packet.service)) {
+- try {
+- YahooPacketHandler[packet.service].call(this._account, packet);
+- } catch(e) {
+- this._account.ERROR(e);
+- }
+- } else {
+- this._account.WARN("No handler for Yahoo! packet " +
+- packet.service.toString(16) + ".");
+- }
+- }
+- return bytesHandled;
+- }
+-};
+-
+-/* The purpose of YahooLoginHelper is to separate the complicated login logic
+- * from the YahooSession object. Logging in on Yahoo!'s network is the most
+- * complicated stage of a session due to the authentication system that is
+- * employed. The login steps are listed below.
+- *
+- * 1) Get the address of a "pager" server. This pager will be our gateway to
+- * the network.
+- *
+- * 2) Obtain the challenge string from the pager. This string is used to help
+- * create the base64 response string needed for the final step.
+- *
+- * 3) Obtain a token from the login server via HTTP.
+- *
+- * 4) Obtain the login crumb, Y-Cookie, and T-Cookie from the login server via
+- * HTTP. These will also be used in the final response packet to the pager.
+- *
+- * 5) Create the base64 response string from the MD5 hash of the crumb and
+- * challenge string, and build a packet containing the username, password,
+- * response string, version numbers, crumb, and cookies, sending it to the
+- * pager for a final authenticatcation.
+- *
+- * If all goes well after the 5th step, the user is considered logged in. */
+-function YahooLoginHelper(aSession)
+-{
+- this._session = aSession;
+-}
+-YahooLoginHelper.prototype = {
+- // YahooSession object passed in constructor.
+- _session: null,
+- // YahooAccount object passed to login().
+- _account: null,
+- // The username, stripped of any @yahoo.com or @yahoo.co.jp suffix.
+- _username: null,
+- // The authentication challenge string sent from the Yahoo!'s login server.
+- _challengeString: null,
+- // The authentication token sent from Yahoo!'s login server.
+- _loginToken: null,
+- // Crumb sent from Yahoo!'s login server, and used in the final authentication
+- // request to the pager server.
+- _crumb: null,
+-
+- // Public methods.
+- login: function(aAccount) {
+- this._account = aAccount;
+- this._getPagerAddress();
+- },
+-
+- // Private methods.
+- _getPagerAddress: function() {
+- let options = {
+- onLoad: this._onPagerAddressResponse.bind(this),
+- onError: this._onHttpError.bind(this)
+- }
+- httpRequest(this._account._protocol.pagerRequestUrl, options);
+- },
+-
+- _getChallengeString: function() {
+- let port = this._account.getInt("port");
+- this._session.connect(this._session.pagerAddress, port);
+- // We want to handle a challenge string when the server responds.
+- this._session.onBinaryDataReceived =
+- this._onChallengeStringResponse.bind(this);
+- },
+-
+- _getLoginToken: function() {
+- // TODO - Simplify this using map and join.
+- let url = this._account._protocol.loginTokenGetUrl;
+- url += "?src=ymsgr&";
+- url += "login=" + percentEncode(this._account.cleanUsername) + "&";
+- url += "passwd=" + percentEncode(this._account.imAccount.password) + "&";
+- url += "chal=" + percentEncode(this._challengeString);
+-
+- let options = {
+- onLoad: this._onLoginTokenResponse.bind(this),
+- onError: this._onHttpError.bind(this)
+- }
+- httpRequest(url, options);
+- },
+-
+- _getCookies: function() {
+- // TODO - Simplify this using map and join.
+- let url = this._account._protocol.loginTokenLoginUrl;
+- url += "?src=ymsgr&";
+- url += "token=" + this._loginToken;
+-
+- let options = {
+- onLoad: this._onLoginCookiesResponse.bind(this),
+- onError: this._onHttpError.bind(this)
+- }
+- httpRequest(url, options);
+- },
+-
+- _sendPagerAuthResponse: function() {
+- let response = this._calculatePagerResponse();
+- let packet = new YahooPacket(kPacketType.AuthResponse, 0,
+- this._session.sessionId);
+- // Build the key/value pairs.
+- packet.addValue(1, this._account.cleanUsername);
+- packet.addValue(0, this._account.cleanUsername);
+- packet.addValue(277, this._session.yCookie);
+- packet.addValue(278, this._session.tCookie);
+- packet.addValue(307, response);
+- packet.addValue(244, this._account.protocol.buildId);
+- packet.addValue(2, this._account.cleanUsername);
+- packet.addValue(2, "1");
+- packet.addValue(98, "us");
+- this._session.sendPacket(packet);
+- // We want to handle a final login confirmation packet when the server
+- // responds.
+- this._session.onBinaryDataReceived = this._onFinalLoginResponse.bind(this);
+- },
+-
+- _calculatePagerResponse: function() {
+- let hasher = Cc["@mozilla.org/security/hash;1"]
+- .createInstance(Ci.nsICryptoHash);
+- hasher.init(hasher.MD5);
+-
+- let crypt = this._crumb + this._challengeString;
+- let cryptData = StringToBytes(crypt);
+- hasher.update(cryptData, cryptData.length);
+-
+- // The protocol requires replacing + with ., / with _, and = with - within
+- // the base64 response string.
+- return btoa(hasher.finish(false)).replace(/\+/g, ".").replace(/\//g, "_")
+- .replace(/=/g, "-");
+- },
+-
+- _handleLoginError: function(aErrorCode) {
+- let errorInfo = kLoginStatusErrors[aErrorCode];
+- let errorMessage;
+- let error;
+-
+- // If we find information on the error code we received, we will use that
+- // information. If the error wasn't found in our error table, just throw a
+- // generic error with the code included.
+- if (errorInfo) {
+- errorMessage = _("login.error." + errorInfo[0]);
+- error = errorInfo[1];
+- } else {
+- errorMessage = _("login.error.unknown", aErrorCode);
+- error = Ci.prplIAccount.ERROR_OTHER_ERROR;
+- // We also throw a console error because we didn't expect
+- // this error code.
+- this._account.ERROR("Received unknown error from pager server. Code: " +
+- aErrorCode);
+- }
+- this._session.onSessionError(error, errorMessage);
+- },
+-
+- _onHttpError: function(aError, aStatusText, aXHR) {
+- this._session.onSessionError(Ci.prplIAccount.NETWORK_ERROR,
+- _("network.error.http"));
+- },
+-
+- // HTTP Response Callbacks.
+- _onPagerAddressResponse: function(aResponse, aXHR) {
+- this._session.pagerAddress =
+- aResponse.substring(aResponse.lastIndexOf("=") + 1);
+- this._getChallengeString();
+- },
+-
+- _onLoginTokenResponse: function(aResponse, aXHR) {
+- let responseParams = aResponse.split("\r\n");
+- // Status code "0" means success.
+- let statusCode = responseParams[0];
+- if (statusCode != "0") {
+- this._handleLoginError(statusCode);
+- return;
+- }
+-
+- this._loginToken = responseParams[1].replace("ymsgr=", "");
+- this._getCookies();
+- },
+-
+- _onLoginCookiesResponse: function(aResponse, aXHR) {
+- let responseParams = aResponse.split("\r\n");
+- // Status code "0" means success.
+- let statusCode = responseParams[0];
+- if (statusCode != "0") {
+- this._handleLoginError(statusCode);
+- return;
+- }
+-
+- this._crumb = responseParams[1].replace("crumb=", "");
+- // Remove the "Y=" bit.
+- this._session.yCookie = responseParams[2].substring(2);
+- // Remove the "T=" bit.
+- this._session.tCookie = responseParams[3].substring(2);
+- this._sendPagerAuthResponse();
+- },
+-
+- // TCP Response Callbacks.
+- _onChallengeStringResponse: function(aData) {
+- let packet = new YahooPacket();
+- packet.fromArrayBuffer(aData);
+- // The value of the challenge string is associated with key 94.
+- this._challengeString = packet.getValue(94);
+- this._session.sessionId = packet.sessionId;
+- this._getLoginToken();
+- },
+-
+- _onFinalLoginResponse: function(aData) {
+- this._session.onLoginComplete();
+- // We need to restore data handling to the YahooSession object since our
+- // login steps are complete.
+- this._session.onBinaryDataReceived =
+- YahooSession.prototype.onBinaryDataReceived.bind(this._session);
+- }
+-};
+-
+-/* The YahooPacket class represents a single Yahoo! Messenger data packet.
+- * Using this class allows you to easily create packets, stuff them with
+- * required data, and convert them to/from ArrayBuffer objects. */
+-function YahooPacket(aService, aStatus, aSessionId)
+-{
+- this.service = aService;
+- this.status = aStatus;
+- this.sessionId = aSessionId;
+- this.keyValuePairs = [];
+-}
+-YahooPacket.prototype = {
+- service: null,
+- status: null,
+- sessionId: null,
+- keyValuePairs: null,
+-
+- // Public methods.
+-
+- // Add a single key/value pair.
+- addValue: function(aKey, aValue) {
+- let pair = {
+- key: aKey.toString(), // The server handles keys as ASCII number values.
+- value: aValue
+- };
+-
+- this.keyValuePairs.push(pair);
+- },
+-
+- // Add multiple key/value pairs with the same key but different values
+- // stored in an array.
+- addValues: function(aKey, aValues) {
+- for each (let value in aValues)
+- this.addValue(aKey, value);
+- },
+-
+- // This method returns the first value found with the given key.
+- getValue: function(aKey) {
+- for (let i = 0; i < this.keyValuePairs.length; ++i) {
+- let pair = this.keyValuePairs[i];
+- // The server handles keys as ASCII number values.
+- if (pair.key == aKey.toString())
+- return pair.value;
+- }
+-
+- // Throw an error if the key wasn't found.
+- throw "Required key " + aKey + " wasn't found. Packet Service: " +
+- this.service.toString(16);
+- },
+-
+- // This method returns all of the values found with the given key. In some
+- // packets, one key is associated with multiple values. If that is the case,
+- // use this method to retrieve all of them instead of just the first one.
+- getValues: function(aKey) {
+- let values = [];
+- for (let i = 0; i < this.keyValuePairs.length; ++i) {
+- let pair = this.keyValuePairs[i];
+- // The server handles keys as ASCII number values.
+- if (pair.key == aKey.toString())
+- values.push(pair.value);
+- }
+-
+- // Throw an error if no keys were found.
+- if (values.length == 0) {
+- throw "Required key " + aKey + " wasn't found. Packet Service: " +
+- this.service.toString(16);
+- }
+- return values;
+- },
+-
+- hasKey: function(aKey) {
+- for (let i = 0; i < this.keyValuePairs.length; ++i) {
+- // The server handles keys as ASCII number values.
+- if (this.keyValuePairs[i].key == aKey.toString())
+- return true;
+- }
+- return false;
+- },
+-
+- toArrayBuffer: function() {
+- let dataString = "";
+- for (let i = 0; i < this.keyValuePairs.length; ++i) {
+- let pair = this.keyValuePairs[i];
+- dataString += pair.key + kPacketDataDelimiter;
+- dataString += pair.value + kPacketDataDelimiter;
+- }
+-
+- let packetLength = dataString.length;
+- let buffer = new ArrayBuffer(kPacketHeaderSize + packetLength);
+-
+- // Build header.
+- let view = new DataView(buffer);
+- let idBytes = StringToBytes(kPacketIdentifier);
+- view.setUint8(0, idBytes[0]);
+- view.setUint8(1, idBytes[1]);
+- view.setUint8(2, idBytes[2]);
+- view.setUint8(3, idBytes[3]);
+- view.setUint16(4, kProtocolVersion);
+- view.setUint16(6, 0); // Vendor ID
+- view.setUint16(8, packetLength);
+- view.setUint16(10, this.service);
+- view.setUint32(12, this.status);
+- view.setUint32(16, this.sessionId);
+-
+- // Copy in data.
+- copyBytes(buffer, BytesToArrayBuffer(StringToBytes(dataString)), kPacketHeaderSize);
+-
+- return buffer;
+- },
+-
+- fromArrayBuffer: function(aBuffer) {
+- let view = new DataView(aBuffer);
+- this.length = view.getUint16(8) + kPacketHeaderSize;
+- this.service = view.getUint16(10);
+- this.status = view.getUint32(12);
+- this.sessionId = view.getUint32(16);
+-
+- let dataString = ArrayBufferToString(aBuffer).substring(kPacketHeaderSize);
+- let delimitedData = dataString.split(kPacketDataDelimiter);
+- // Since the data should also end with a trailing delmiter, split() will
+- // add an empty element at the end. We need to pop this element off.
+- delimitedData.pop();
+-
+- // If we don't have an even number of delimitedData elements, that means
+- // we are either missing a key or a value.
+- if (delimitedData.length % 2 != 0) {
+- throw "Odd number of data elements. Either a key or value is missing. "
+- "Num of elements: " + delimitedData.length;
+- }
+-
+- for (let i = 0; i < delimitedData.length; i += 2) {
+- let key = delimitedData[i];
+- let value = delimitedData[i + 1];
+- if (key && value) {
+- let pair = {
+- key: key,
+- value: value
+- };
+- this.keyValuePairs.push(pair);
+- }
+- }
+- },
+-
+- toString: function() {
+- // First, add packet header information.
+- let s = "Service: 0x" + this.service.toString(16) + "\n";
+- s += "Status: 0x" + this.status.toString(16) + "\n";
+- s += "Session ID: 0x" + this.sessionId.toString(16);
+- // Now we add the packet data, if there is some.
+- if (this.keyValuePairs.length) {
+- // Add two preceding newlines for space to make reading easier.
+- s += "\n\nPacket Key-Value Data:\n";
+- for each (let pair in this.keyValuePairs)
+- s += pair.key + ":\t" + pair.value + "\n";
+- }
+- return s;
+- }
+-};
+-YahooPacket.extractPackets = function(aData, aOnNetworkError) {
+- let packets = [];
+- let bytesHandled = 0;
+-
+- while (aData.byteLength >= kPacketHeaderSize) {
+- if (ArrayBufferToString(aData.slice(0, kPacketIdentifier.length)) !=
+- kPacketIdentifier) {
+- throw "Malformed packet received. Packet content: " +
+- ArrayBufferToHexString(aData);
+- }
+-
+- let packetView = new DataView(aData);
+- let packetLength = packetView.getUint16(8) + kPacketHeaderSize;
+- // Don't process half packets.
+- if (packetLength > aData.byteLength)
+- break;
+- let packet = new YahooPacket();
+- packet.fromArrayBuffer(aData.slice(0, packetLength));
+- packets.push(packet);
+- bytesHandled += packetLength;
+- aData = aData.slice(packetLength);
+- }
+- return [packets, bytesHandled];
+-}
+-
+-/* In YahooPacketHandler, each handler function is assosiated with a packet
+- * service number. You can use the kPacketType enumeration to understand
+- * what kind of packet each number is linked to.
+- *
+- * Keep in mind too that "this" in each function will be bound to a
+- * YahooAccount object, since they are all invoked using call(). */
+-var YahooPacketHandler = {
+- // Buddy logoff.
+- 0x02: function(aPacket) {
+- let name = aPacket.getValue(7);
+- this.setBuddyStatus(name, Ci.imIStatusInfo.STATUS_OFFLINE, "");
+- },
+-
+- // Incoming chat message.
+- 0x06: function(aPacket) {
+- let from = aPacket.getValue(4);
+- let to = aPacket.getValue(5);
+- let message = aPacket.getValue(14);
+- this.receiveMessage(from, message);
+-
+- // The official Yahoo! Messenger desktop client requires message ACKs to be
+- // sent back to the server. The web client doesn't require this. A good
+- // indication of when an ACK is required is when key 429 is sent, which
+- // contains the ID of the message. When a message is sent from the official
+- // desktop client, and no ACK is sent back, the message is resent seconds
+- // later.
+- if (aPacket.hasKey(429)) {
+- let messageId = aPacket.getValue(429);
+- let packet = new YahooPacket(kPacketType.MessageAck, 0, aPacket.sessionId);
+- // Some keys have an unknown purpose, so we set a constant value.
+- packet.addValue(1, to);
+- packet.addValue(5, from);
+- packet.addValue(302, "430");
+- packet.addValue(430, messageId);
+- packet.addValue(303, 430);
+- packet.addValue(450, 0);
+- this._session.sendPacket(packet);
+- }
+- },
+-
+- // New mail notification.
+- // TODO: Implement this handler when mail notifications are handled in the
+- // base code.
+- 0x0b: function(aPacket) {},
+-
+- // Server ping.
+- // TODO: Add support for ping replies.
+- 0x12: function(aPacket) {},
+-
+- // Conference invitation.
+- 0x18: function(aPacket) {
+- let owner = aPacket.getValue(50);
+- let roomName = aPacket.getValue(57);
+- let participants = aPacket.getValues(53);
+- // The owner is also a participant.
+- participants.push(owner);
+- let message = aPacket.getValue(58);
+- this.receiveConferenceInvite(owner, roomName, participants, message);
+- },
+-
+- // Conference logon.
+- 0x19: function(aPacket) {
+- let userName = aPacket.getValue(53);
+- let room = aPacket.getValue(57);
+- this.receiveConferenceLogon(room, userName);
+- },
+-
+- // Conference logoff
+- 0x1b: function(aPacket) {
+- let userName = aPacket.getValue(56);
+- let roomName = aPacket.getValue(57);
+- this.receiveConferenceLogoff(roomName, userName);
+- },
+-
+- // Conference additional invitation. NOTE: Since this packet has the same
+- // structure as the normal conference invite (packet 0x18), we simply
+- // reuse that handler.
+- 0x1c: function(aPacket) { return YahooPacketHandler[0x18].call(this, aPacket); },
+-
+- // Conference message.
+- 0x1d: function(aPacket) {
+- let from = aPacket.getValue(3);
+- let room = aPacket.getValue(57);
+- let message = aPacket.getValue(14);
+- this.receiveConferenceMessage(from, room, message);
+- },
+-
+- // Typing notification.
+- 0x4b: function(aPacket) {
+- let name = aPacket.getValue(4);
+- let isTyping = (aPacket.getValue(13) == "1");
+- this.receiveTypingNotification(name, isTyping);
+- },
+-
+- // Legacy Yahoo! buddy list. Packet 0xf1 has replaced this.
+- 0x55: function(aPacket) {},
+-
+- // Authentication acknowledgement. We can ignore this since we are known
+- // to be authenticated if we are receiving other packets anyway.
+- 0x57: function(aPacket) {},
+-
+- // AddBuddy ack packets can be ignored. They do not depend on whether or not
+- // the buddy accepted the invite.
+- 0x83: function(aPacket) {},
+-
+- // RemoveBuddy ack packets let us know when we should actually remove the
+- // buddy from the list, keeping us in sync with the server.
+- 0x84: function(aPacket) {
+- let buddy = this.getBuddy(aPacket.getValue(7));
+- // The buddy is off the server, so remove it locally.
+- this.removeBuddy(buddy, false);
+- },
+-
+- // Picture upload.
+- 0xc2: function(aPacket) {
+- let onlineBuddies = this.getOnlineBuddies();
+- // Send a notification to each online buddy that your icon has changed.
+- // Those offline will automatically pick up the change when they log in.
+- for each (let buddy in onlineBuddies) {
+- let packet = new YahooPacket(kPacketType.AvatarUpdate, 0,
+- this._session.sessionId);
+- packet.addValue(3, buddy.userName);
+- packet.addValue(213, 2); // A value of 2 means we are using an icon.
+- this._session.sendPacket(packet);
+- }
+- },
+-
+- // Buddy icon checksum.
+- // TODO - Make use of the icon checksum to allow icon caching.
+- 0xbd: function(aPacket) {
+- // Extract the checksum from the URL parameter chksum.
+- let buddyName = aPacket.getValue(4);
+- let url = aPacket.getValue(20);
+- let parameter = "chksum=";
+- // The "chksum" parameter is the only parameter in the URL.
+- let checksum = url.substring(url.indexOf(parameter) + parameter.length);
+-
+- let buddy = this.getBuddy(buddyName);
+- // We only download the new icon if no older checksum exists, or if the
+- // older checksum differs, indicating an updated icon.
+- if (buddy && buddy.iconChecksum !== checksum) {
+- buddy.buddyIconFilename = url;
+- buddy.iconChecksum = checksum;
+- }
+- },
+-
+- // Buddy icon request reply. This can be handled in the same way as a buddy
+- // icon checksum packet, so we simply reuse the handler.
+- 0xbe: function (aPacket) { return YahooPacketHandler[0xbd].call(this, aPacket); },
+-
+- // Buddy status update.
+- 0xc6: function (aPacket) {
+- let name = aPacket.getValue(7);
+- // If the user is mobile, use the mobile status.
+- let status = aPacket.hasKey(60) ? Ci.imIStatusInfo.STATUS_MOBILE :
+- kBuddyStatuses[aPacket.getValue(10)];
+-
+- let message = aPacket.hasKey(19) ? aPacket.getValue(19) : "";
+- this.setBuddyStatus(name, status, message);
+- },
+-
+- // Buddy avatar (icon) update.
+- 0xc7: function(aPacket) {
+- // Strangely, in some non-official clients, when someone updates their
+- // profile icon we are sent two avatar update packets: one with a default
+- // status containing little information, and another with a Server Ack
+- // status containing the info we need. So we only accept packets with a
+- // Server Ack status to prevent errors.
+- if (aPacket.status != kPacketStatuses.ServerAck)
+- return;
+- // Key 4 contains the name of the buddy who updated their icon.
+- this._session.requestBuddyIcon(aPacket.getValue(4));
+- },
+-
+- // Buddy authorization request.
+- 0xd6: function(aPacket) {
+- // Whenever we authorize someone to be our buddy, the server will send an
+- // acknowledgement packet. We ignore the ack to prevent the auth request
+- // from showing again.
+- if (aPacket.status == kPacketStatuses.ServerAck)
+- return;
+-
+- let session = this._session;
+- let userName = aPacket.getValue(4);
+- this.addBuddyRequest(userName, session.acceptBuddyRequest.bind(session),
+- session.denyBuddyRequest.bind(session));
+- },
+-
+- // XXX: What does this packet do?
+- 0xef: function(aPacket) {},
+-
+- // Initial user status.
+- 0xf0: function (aPacket) {
+- // Return early if we find no buddy names.
+- if (!aPacket.hasKey(7))
+- return;
+-
+- // The key/value pairs are in order as sent by the server. So we must
+- // iterate though them to find out information about each buddy. Each
+- // buddy section starts with key 7.
+- let currentBuddy;
+- for (let i = 0; i < aPacket.keyValuePairs.length; ++i) {
+- let {key: key, value: value} = aPacket.keyValuePairs[i];
+-
+- if (key == 7) { // Buddy name.
+- currentBuddyName = value;
+- this._session.requestBuddyIcon(currentBuddyName);
+- } else if (key == 10) // Buddy status.
+- this.setBuddyStatus(currentBuddyName, kBuddyStatuses[value]);
+- else if (key == 19) // Buddy status message.
+- this.setBuddyStatus(currentBuddyName, undefined, value);
+- else if (key == 60) // Mobile status.
+- this.setBuddyStatus(currentBuddyName, Ci.imIStatus.STATUS_MOBILE);
+- }
+- },
+-
+- // Friends and groups list.
+- 0xf1: function(aPacket) {
+- let tagName = "";
+- for each (let pair in aPacket.keyValuePairs) {
+- if (pair.key == "65")
+- tagName = pair.value;
+- else if (pair.key == "7") {
+- let buddyName = pair.value;
+- this.addBuddyFromServer(Services.tags.createTag(tagName), buddyName);
+- }
+- }
+- }
+-};
+-
+-/* The YahooProfileIconUploader class is specifically designed to set a profile
+- * image on a Yahoo! Messenger account. The reason this functionality is split
+- * into a separate class is because of the complexity of the operation. Because
+- * of special protocol requirements, it is easier to use raw TCP communication
+- * instead of the httpRequest() method. */
+-function YahooProfileIconUploader(aAccount, aSession, aFileName, aImage)
+-{
+- this._account = aAccount;
+- this._session = aSession;
+- this._fileName = aFileName;
+- this._image = aImage;
+-}
+-YahooProfileIconUploader.prototype = {
+- __proto__: Socket,
+- _account: null,
+- _session: null,
+- _fileName: null,
+- _image: null,
+- _host: null,
+- _port: null,
+-
+- uploadIcon: function() {
+- // Connect to the file transfer server, and the onConnection callback
+- // will do the rest.
+- this.connect(kFileTransferHost, kFileTransferPort);
+- },
+-
+- // Socket callbacks.
+- onConnection: function() {
+- // Scale the image down, and make it a PNG. Icon widths are constant, but
+- // their height varies depending on the aspect ratio of the original image.
+- let aspectRatio = this._image.width / this._image.height;
+- let scaledHeight = kProfileIconWidth / aspectRatio;
+- let scaledImage = imgTools.encodeScaledImage(this._image, "image/png",
+- kProfileIconWidth,
+- scaledHeight);
+- let imageData = NetUtil.readInputStreamToString(scaledImage,
+- scaledImage.available());
+-
+- // Build the Yahoo packet.
+- let packet = new YahooPacket(kPacketType.Picture, 0, this.sessionId);
+- packet.addValue(1, this._account.cleanUsername);
+- // TODO - Look into how expiration time works for profile icons, and its
+- // purpose. We aren't sure if this refers to seconds, days, years, etc.
+- packet.addValue(38, "604800"); // Expiration time.
+- packet.addValue(0, this._account.cleanUsername);
+- packet.addValue(28, imageData.length); // Picture size in bytes.
+- packet.addValue(27, this._fileName); // Picture filename.
+- packet.addValue(14, ""); // Null string.
+- let packetBuffer = packet.toArrayBuffer();
+-
+- // Build the request header.
+- let headers = [
+- ["User-Agent", "Mozilla/5.0"],
+- ["Cookie", "T=" + this._session.tCookie + "; Y=" + this._session.yCookie],
+- ["Host", kFileTransferHost + ":" + kFileTransferPort],
+- ["Content-Length", packetBuffer.byteLength + 4 + imageData.length],
+- ["Cache-Control", "no-cache"],
+- ];
+- let headerString = "POST /notifyft HTTP/1.1\r\n";
+- headers.forEach(function(header) {
+- headerString += header[0] + ": " + header[1] + "\r\n";
+- });
+-
+- // The POST request uses a special delimeter between the end of the included
+- // Yahoo binary packet, and the image data.
+- let requestPacketEnd = "29" + kPacketDataDelimiter;
+- // Build the complete POST request data.
+- let requestData = headerString + "\r\n" +
+- ArrayBufferToString(packetBuffer) + requestPacketEnd +
+- imageData;
+- this.sendData(requestData);
+- }
+-};
+diff --git a/chat/protocols/yahoo/yahoo.js b/chat/protocols/yahoo/yahoo.js
+index 8beadb5..86a2589 100644
+--- a/chat/protocols/yahoo/yahoo.js
++++ b/chat/protocols/yahoo/yahoo.js
+@@ -2,575 +2,39 @@
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+-var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
++var {interfaces: Ci, utils: Cu} = Components;
+
+-Cu.import("resource:///modules/imServices.jsm");
+ Cu.import("resource:///modules/imXPCOMUtils.jsm");
+ Cu.import("resource:///modules/jsProtoHelper.jsm");
+-Cu.import("resource:///modules/yahoo-session.jsm");
+
+ XPCOMUtils.defineLazyGetter(this, "_", () =>
+ l10nHelper("chrome://chat/locale/yahoo.properties")
+ );
+
+-// These timeouts are in milliseconds.
+-var kKeepAliveTimeout = 60 * 1000; // One minute.
+-var kPingTimeout = 3600 * 1000; // One hour.
+-
+-function YahooConversation(aAccount, aName)
+-{
+- this._buddyUserName = aName;
+- this._account = aAccount;
+- this.buddy = aAccount.getBuddy(aName);
+- this._init(aAccount);
+-}
+-YahooConversation.prototype = {
+- __proto__: GenericConvIMPrototype,
+- _account: null,
+- _buddyUserName: null,
+- _typingTimer: null,
+-
+- close: function() {
+- this._account.deleteConversation(this._buddyUserName);
+- GenericConvChatPrototype.close.call(this);
+- },
+-
+- sendMsg: function (aMsg) {
+- // Deliver the message, then write it to the window.
+- this._account._session.sendChatMessage(this._buddyUserName,
+- this._account.encodeMessage(aMsg));
+- this.finishedComposing();
+- this.writeMessage(this._account.cleanUsername, aMsg,
+- {outgoing: true, _alias: this._account.imAccount.alias});
+- },
+-
+- sendTyping: function(aString) {
+- if (aString.length) {
+- if (!this._typingTimer)
+- this._account._session.sendTypingStatus(this._buddyUserName, true);
+- this._refreshTypingTimer();
+- }
+- return Ci.prplIConversation.NO_TYPING_LIMIT;
+- },
+-
+- finishedComposing: function() {
+- this._account._session.sendTypingStatus(this._buddyUserName, false);
+- this._cancelTypingTimer();
+- },
+-
+- _refreshTypingTimer: function() {
+- this._cancelTypingTimer();
+- this._typingTimer = setTimeout(this.finishedComposing.bind(this), 10000);
+- },
+-
+- _cancelTypingTimer: function() {
+- if (!this._typingTimer)
+- return;
+- clearTimeout(this._typingTimer);
+- delete this._typingTimer
+- this._typingTimer = null;
+- },
+-
+- get name() { return this._buddyUserName; }
+-};
+-
+-function YahooConference(aAccount, aRoom, aOwner)
+-{
+- this._account = aAccount;
+- this._roomName = aRoom;
+- this._owner = aOwner;
+- this._init(aAccount, aRoom, aAccount.cleanUsername);
+-}
+-YahooConference.prototype = {
+- __proto__: GenericConvChatPrototype,
+- _account: null,
+- _roomName: null,
+- _owner: null,
+-
+- close: function() {
+- this.reportLogoff();
+- this._account.deleteConference(this._roomName);
+- GenericConvChatPrototype.close.call(this);
+- },
+-
+- reportLogoff: function() {
+- if (this.left)
+- return;
+- this._account._session.sendConferenceLogoff(this._account.cleanUsername,
+- this.getParticipantNames(),
+- this._roomName);
+- this.left = true;
+- },
+-
+- sendMsg: function(aMsg) {
+- this._account._session.sendConferenceMessage(this.getParticipantNames(),
+- this._roomName,
+- this._account.encodeMessage(aMsg));
+- },
+-
+- addParticipant: function(aName) {
+- // In case we receive multiple conference logon packets, prevent adding
+- // duplicate buddies.
+- if (this._participants.get(aName))
+- return;
+- let buddy = new YahooConferenceBuddy(aName, this);
+- this._participants.set(aName, buddy);
+- this.notifyObservers(new nsSimpleEnumerator([buddy]), "chat-buddy-add");
+- this.writeMessage(this._roomName,
+- _("system.message.conferenceLogon", aName),
+- {system: true});
+- },
+-
+- getParticipantNames: function() { return [for (p of this._participants.values()) p.name]; }
+-};
+-
+-function YahooConferenceBuddy(aName, aConference)
+-{
+- this._name = aName;
+- this._conference = aConference;
+-}
+-YahooConferenceBuddy.prototype = {
+- __proto__: GenericConvChatBuddyPrototype,
+- _conference: null,
+-
+- get founder() { return this._conference._owner == this._name; }
+-};
+-
+-function YahooAccountBuddy(aAccount, aBuddy, aTag, aUserName)
+-{
+- this._init(aAccount, aBuddy, aTag, aUserName);
+-}
+-YahooAccountBuddy.prototype = {
+- __proto__: GenericAccountBuddyPrototype,
+- iconChecksum: null,
+-
+- // This removes the buddy locally, and from the Yahoo! servers.
+- remove: function() { return this._account.removeBuddy(this, true); },
+- // This removes the buddy locally, but keeps him on the servers.
+- removeLocal: function() { return this._account.removeBuddy(this, false); },
+- createConversation: function() { return this._account.createConversation(this.userName); }
+-}
+-
+ function YahooAccount(aProtoInstance, aImAccount)
+ {
+ this._init(aProtoInstance, aImAccount);
+- this._buddies = new Map();
+- this._conversations = new Map();
+- this._conferences = new Map();
+- this._protocol = aProtoInstance;
+- this._converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
+- .createInstance(Ci.nsIScriptableUnicodeConverter);
+- this._converter.charset = this.getString("local_charset") || "UTF-8";
+-
+- // The username stripped of any @yahoo.* domain.
+- this.cleanUsername = this.name.replace(/@yahoo\..+$/, "");
+ }
+ YahooAccount.prototype = {
+ __proto__: GenericAccountPrototype,
+- // YahooSession object passed in constructor.
+- _session: null,
+- // A Map holding the list of buddies associated with their usernames.
+- _buddies: null,
+- // A Map holding the list of open buddy conversations associated with the
+- // username of the buddy.
+- _conversations: null,
+- // A Map holding the list of open conference rooms associated with the room
+- // name.
+- _conferences: null,
+- // YahooProtocol object passed in the constructor.
+- _protocol: null,
+- // An nsIScriptableUnicodeConverter used to convert incoming/outgoing chat
+- // messages to the correct charset.
+- _converter: null,
+- // This is simply incremented by one everytime a new conference room is
+- // created. It is appened to the end of the room name when a new room is
+- // created, ensuring name uniqueness.
+- _roomsCreated: 0,
+- // The username stripped of any @yahoo.* domain.
+- cleanUsername: null,
+- // The timers used to send keepalive and ping packets to the server to ensrue
+- // the server that the user is still connected.
+- _keepAliveTimer: null,
+- _pingTimer: null,
+
+ connect: function() {
+- this._session = new YahooSession(this);
+- this._session.login(this.imAccount.name, this.imAccount.password);
+- },
+-
+- disconnect: function(aSilent) {
+- // Log out of all of the conferences the user is in.
+- for (let conf of this._conferences)
+- conf[1].reportLogoff();
+-
+- if (this.connected) {
+- this.reportDisconnecting(Ci.prplIAccount.NO_ERROR, "");
+- if (this._session.isConnected)
+- this._session.disconnect();
+- this.reportDisconnected();
+- }
+- // buddy[1] is the actual object.
+- for (let buddy of this._buddies)
+- buddy[1].setStatus(Ci.imIStatusInfo.STATUS_UNKNOWN, "");
+-
+- // Clear and delete the timers to avoid memory leaks.
+- if (this._keepAliveTimer) {
+- this._keepAliveTimer.cancel();
+- delete this._keepAliveTimer;
+- }
+-
+- if (this._pingTimer) {
+- this._pingTimer.cancel();
+- delete this._pingTimer;
+- }
+- },
+-
+- observe: function(aSubject, aTopic, aData) {
+- if (aTopic == "status-changed")
+- this._session.setStatus(aSubject.statusType, aData);
+- else if (aTopic == "user-icon-changed")
+- this._session.setProfileIcon(aData);
+- },
+-
+- remove: function() {
+- for each(let conv in this._conversations)
+- conv.close();
+- delete this._conversations;
+- for (let buddy of this._buddies)
+- buddy[1].removeLocal(); // buddy[1] is the actual object.
+- },
+-
+- unInit: function() {
+- this.disconnect(true);
+- delete this.imAccount;
+- },
+-
+- createConversation: function(aName) {
+- let conv = new YahooConversation(this, aName);
+- this._conversations.set(aName, conv);
+- return conv;
+- },
+-
+- deleteConversation: function(aName) {
+- if (this._conversations.has(aName))
+- this._conversations.delete(aName);
+- },
+-
+- receiveConferenceInvite: function(aOwner, aRoom, aParticipants, aMessage) {
+- // Do nothing if we wish to ignore invites.
+- if (!Services.prefs.getIntPref("messenger.conversations.autoAcceptChatInvitations") ||
+- this.getBool("ignore_invites"))
+- return;
+-
+- let conf = new YahooConference(this, aRoom, aOwner);
+- this._conferences.set(aRoom, conf);
+-
+- for each (let participant in aParticipants)
+- conf.addParticipant(participant);
+-
+- // Add ourselves to the conference room as well.
+- conf.addParticipant(this.imAccount.name);
+-
+- this._session.acceptConferenceInvite(aOwner, aRoom,
+- conf.getParticipantNames());
+- },
+-
+- receiveConferenceLogon: function(aRoom, aUsername) {
+- if (!this._conferences.has(aRoom))
+- return;
+- let conf = this._conferences.get(aRoom);
+- conf.addParticipant(aUsername);
+- },
+-
+- receiveConferenceLogoff: function(aRoom, aUsername) {
+- if (!this._conferences.has(aRoom))
+- return;
+- let conf = this._conferences.get(aRoom);
+- conf.removeParticipant(aUsername);
+- conf.writeMessage(this._roomName,
+- _("system.message.conferenceLogoff", aName),
+- {system: true});
+- },
+-
+- deleteConference: function(aName) {
+- if (this._conferences.has(aName))
+- this._conferences.delete(aName);
+- },
+-
+- // Called when the user adds or authorizes a new contact.
+- addBuddy: function(aTag, aName) {
+- let buddy = new YahooAccountBuddy(this, null, aTag, aName);
+- this._buddies.set(buddy.userName, buddy);
+- this._session.addBuddyToServer(buddy);
+- Services.contacts.accountBuddyAdded(buddy);
+- },
+-
+- hasBuddy: function(aName) {
+- return this._buddies.has(aName);
+- },
+-
+- // Called for each buddy that is sent in a list packet from Yahoo! on login.
+- addBuddyFromServer: function(aTag, aName) {
+- let buddy;
+- if (this._buddies.has(aName))
+- buddy = this._buddies.get(aName);
+- else {
+- buddy = new YahooAccountBuddy(this, null, aTag, aName);
+- Services.contacts.accountBuddyAdded(buddy);
+- this._buddies.set(aName, buddy);
+- }
+-
+- // Set all new buddies as offline because a following status packet will
+- // tell their status if they are online.
+- buddy.setStatus(Ci.imIStatusInfo.STATUS_OFFLINE, "");
+-
+- // Request the buddy's picture.
+- this._session.requestBuddyIcon(aName);
+- },
+-
+- // Called when a user removes a contact from within Instantbird.
+- removeBuddy: function(aBuddy, aRemoveFromServer) {
+- if (aRemoveFromServer) {
+- // We will remove the buddy locally when we get a server ack packet.
+- this._session.removeBuddyFromServer(aBuddy);
+- return;
+- }
+-
+- this._buddies.delete(aBuddy.userName);
+- Services.contacts.accountBuddyRemoved(aBuddy);
+- },
+-
+- loadBuddy: function(aBuddy, aTag) {
+- let buddy = new YahooAccountBuddy(this, aBuddy, aTag);
+- this._buddies.set(buddy.userName, buddy);
+-
+- return buddy;
+- },
+-
+- // Both the status and message can be defined, or only one can be defined.
+- // When defining just the message, set aStatus to undefined.
+- setBuddyStatus: function(aName, aStatus, aMessage) {
+- if (!this._buddies.has(aName))
+- return;
+- let buddy = this._buddies.get(aName);
+- // If the message is set as undefined, use the existing message.
+- if (aMessage === undefined)
+- aMessage = buddy.statusText;
+- // If the status is undefined, use the existing status.
+- if (aStatus === undefined)
+- aStatus = buddy.statusType;
+- buddy.setStatus(aStatus, aMessage);
+- },
+-
+- getBuddy: function(aName) {
+- if (this._buddies.has(aName))
+- return this._buddies.get(aName);
+- return null;
+- },
+-
+- getOnlineBuddies: function() {
+- let onlineBuddies = [];
+- for (let buddy of this._buddies) {
+- if (buddy[1].statusType != Ci.imIStatusInfo.STATUS_OFFLINE)
+- onlineBuddies.push(buddy[1]);
+- }
+- return onlineBuddies;
+- },
+-
+- receiveMessage: function(aName, aMessage) {
+- let conv;
+- // Check if we have an existing converstaion open with this user. If not,
+- // create one and add it to the list.
+- if (!this._conversations.has(aName))
+- conv = this.createConversation(aName);
+- else
+- conv = this._conversations.get(aName);
+-
+- // Certain Yahoo clients, such as the official web client, sends formatted
+- // messages, but the size value is the actual pt size, not the 1 - 7 size
+- // expected from the HTML <font> tag. We replace it with the correct size.
+- let message = this.decodeMessage(aMessage)
+- .replace(/(<font[^>]+)size=\"(\d+)\"/g, this._fixFontSize);
+-
+- conv.writeMessage(aName, message, {incoming: true});
+- conv.updateTyping(Ci.prplIConvIM.NOT_TYPING, conv.name);
+- },
+-
+- receiveConferenceMessage: function(aName, aRoom, aMessage) {
+- if (!this._conferences.has(aRoom))
+- return;
+-
+- this._conferences.get(aRoom).writeMessage(aName,
+- this.decodeMessage(aMessage),
+- {incoming: true});
+- },
+-
+- receiveTypingNotification: function(aName, aIsTyping) {
+- if (!this._conversations.has(aName))
+- return;
+-
+- let conv = this._conversations.get(aName);
+- if (aIsTyping)
+- conv.updateTyping(Ci.prplIConvIM.TYPING, conv.name);
+- else
+- conv.updateTyping(Ci.prplIConvIM.NOT_TYPING, conv.name);
+- },
+-
+- encodeMessage: function(aMessage) {
+- // Try to perform a convertion from JavaScript UTF-16 into the charset
+- // specified in the options. If the conversion fails, just leave
+- // the message as it is.
+- let encodedMsg;
+- try {
+- encodedMsg = this._converter.ConvertFromUnicode(aMessage);
+- } catch (e) {
+- encodedMsg = aMessage;
+- this.WARN("Could not encode UTF-16 message into " +
+- this._converter.charset + ". Message: " + aMessage);
+- }
+- return encodedMsg;
+- },
+-
+- decodeMessage: function(aMessage) {
+- // Try to perform a convertion from the charset specified in the options
+- // to JavaScript UTF-16. If the conversion fails, just leave the message
+- // as it is.
+- let decodedMsg;
+- try {
+- decodedMsg = this._converter.ConvertToUnicode(aMessage);
+- } catch (e) {
+- decodedMsg = aMessage;
+- this.WARN("Could not decode " + this._converter.charset +
+- " message into UTF-16. Message: " + aMessage);
+- }
+- return decodedMsg;
+- },
+-
+- get canJoinChat() { return true; },
+- chatRoomFields: {},
+- joinChat: function(aComponents) {
+- // Use _roomsCreated to append a unique number to the room name.
+- let roomName = this.cleanUsername + "-" + ++this._roomsCreated;
+- let conf = new YahooConference(this, roomName, this.cleanUsername);
+- this._conferences.set(roomName, conf);
+- this._session.createConference(roomName);
+- },
+-
+- // Callbacks.
+- onLoginComplete: function() {
+- // Now that we are connected, get ready to start to sending pings and
+- // keepalive packets.
+- this._keepAliveTimer = Cc["@mozilla.org/timer;1"]
+- .createInstance(Ci.nsITimer);
+- this._pingTimer = Cc["@mozilla.org/timer;1"]
+- .createInstance(Ci.nsITimer);
+-
+- // We use slack timers since we don't need millisecond precision when
+- // sending the keepalive and ping packets.
+- let s = this._session;
+- this._keepAliveTimer
+- .initWithCallback(s.sendKeepAlive.bind(s), kKeepAliveTimeout,
+- this._keepAliveTimer.TYPE_REPEATING_SLACK);
+-
+- this._pingTimer
+- .initWithCallback(s.sendPing.bind(s), kPingTimeout,
+- this._pingTimer.TYPE_REPEATING_SLACK);
+-
+- },
+-
+- // Private methods.
+-
+- // This method is used to fix font sizes given by formatted messages. This
+- // method is designed to be used as a method for a string replace() call.
+- _fixFontSize: function(aMatch, aTagAttributes, aFontSize, aOffset, aString) {
+- // Approximate the font size.
+- let newSize;
+- if (aFontSize <= 8)
+- newSize = "1";
+- else if (aFontSize <= 10)
+- newSize = "2";
+- else if (aFontSize <= 12)
+- newSize = "3";
+- else if (aFontSize <= 14)
+- newSize = "4";
+- else if (aFontSize <= 20)
+- newSize = "5";
+- else if (aFontSize <= 30)
+- newSize = "6";
+- else if (aFontSize <= 40)
+- newSize = "7";
+- else // If we get some gigantic size, just default to the standard 3 size.
+- newSize = "3";
+-
+- let sizeAttribute = "size=\"" + newSize + "\"";
+- // We keep any preceding attributes, but replace the size attribute.
+- return aTagAttributes + sizeAttribute;
++ this.WARN("The legacy versions of Yahoo Messenger was disabled on August " +
++ "5, 2016. It is currently not possible to connect to Yahoo " +
++ "Messenger. See bug 1316000");
++ this.reportDisconnecting(Ci.prplIAccount.ERROR_OTHER_ERROR,
++ _("yahoo.disabled"));
++ this.reportDisconnected();
+ }
+ };
+
+-function YahooProtocol() {
+- this.registerCommands();
+-}
++function YahooProtocol() {}
+ YahooProtocol.prototype = {
+ __proto__: GenericProtocolPrototype,
+- // Protocol specific connection parameters.
+- pagerRequestUrl: "http://scsa.msg.yahoo.com/capacity",
+- loginTokenGetUrl: "https://login.yahoo.com/config/pwtoken_get",
+- loginTokenLoginUrl: "https://login.yahoo.com/config/pwtoken_login",
+- buildId: "4194239",
+
+ get id() { return "prpl-yahoo"; },
+ get name() { return "Yahoo"; },
+ get iconBaseURI() { return "chrome://prpl-yahoo/skin/"; },
+- options: {
+- port: {get label() { return _("options.pagerPort"); }, default: 5050},
+- local_charset: {get label() { return _("options.chatEncoding"); }, default: "UTF-8"},
+- ignore_invites: {get label() { return _("options.ignoreInvites"); }, default: false}
+- },
+- commands: [
+- {
+- name: "invite",
+- get helpString() { return _("command.help.invite2", "invite"); },
+- usageContext: Ci.imICommand.CMD_CONTEXT_ALL,
+- run: function(aMsg, aConv) {
+- if (aMsg.trim().length == 0)
+- return false;
+-
+- let splitPosition = aMsg.indexOf(" "); // Split at first space.
+- let invitees;
+- let message;
+-
+- // If we have an invite message.
+- if (splitPosition > 0) {
+- invitees = aMsg.substring(0, splitPosition).split(",");
+- message = aMsg.substring(splitPosition);
+- } else {
+- invitees = aMsg.split(",");
+- message = _("conference.invite.message"); // Use default message.
+- }
+-
+- let conf = aConv.wrappedJSObject;
+- conf._account._session.inviteToConference(invitees, conf._roomName,
+- conf.getParticipantNames(),
+- message);
+- conf.writeMessage(conf._roomName,
+- _("command.feedback.invite", invitees.join(", ")),
+- {system: true, noLog: true});
+- conf._account.LOG("Sending conference invite to " + invitees);
+- return true;
+- },
+- },
+-
+- {
+- name: "conference",
+- get helpString() { return _("command.help.conference", "conference"); },
+- usageContext: Ci.imICommand.CMD_CONTEXT_CHAT,
+- run: function(aMsg, aConv) {
+- aConv.account.joinChat(null);
+- return true;
+- }
+- }
+- ],
+ getAccount: function(aImAccount) { return new YahooAccount(this, aImAccount); },
+ classID: Components.ID("{50ea817e-5d79-4657-91ae-aa0a52bdb98c}")
+ };
+diff --git a/im/content/conversation.xml b/im/content/conversation.xml
+index 6f00c8d..c93dab0 100644
+--- a/im/content/conversation.xml
++++ b/im/content/conversation.xml
+@@ -342,8 +342,7 @@
+ msg = "<font face=\"" + style.fontFamily + "\">" + msg + "</font>";
+ // MSN doesn't support font size info in messages...
+ }
+- else if (proto == "prpl-aim" || proto == "prpl-icq" ||
+- proto == "prpl-yahoo" || proto == "prpl-yahoojp") {
++ else if (proto == "prpl-aim" || proto == "prpl-icq") {
+ let styleAttributes = ""
+ if ("color" in style)
+ styleAttributes += " color=\"" + style.color + "\"";
+diff --git a/im/locales/en-US/chrome/instantbird/accountWizard.properties b/im/locales/en-US/chrome/instantbird/accountWizard.properties
+index 7d371bd..1d6fd48 100644
+--- a/im/locales/en-US/chrome/instantbird/accountWizard.properties
++++ b/im/locales/en-US/chrome/instantbird/accountWizard.properties
+@@ -14,9 +14,8 @@ topProtocol.list=prpl-irc,prpl-jabber,prpl-twitter,prpl-gtalk
+ # These are the descriptions of the top protocols specified above.
+ # A description should be provided for each protocol ID listed above.
+ topProtocol.prpl-irc.description=Connect to your favourite IRC network
+-topProtocol.prpl-jabber.description=Chat with friends using XMPP
+ topProtocol.prpl-gtalk.description=Talk to your Gmail contacts
+ topProtocol.prpl-twitter.description=Stay up to date with your Twitter timeline
+ topProtocol.prpl-aim.description=Chat with your buddies on AOL Instant Messenger
+-topProtocol.prpl-yahoo.description=Chat with friends using Yahoo! Messenger
+ topProtocol.prpl-irc.description=Join IRC channels
++topProtocol.prpl-jabber.description=Chat using the open Jabber/XMPP protocol
+diff --git a/im/test/xpcshell.ini b/im/test/xpcshell.ini
+index 5f7dd70..578122a 100644
+--- a/im/test/xpcshell.ini
++++ b/im/test/xpcshell.ini
+@@ -6,5 +6,4 @@
+ [include:chat/components/src/test/xpcshell.ini]
+ [include:chat/protocols/irc/test/xpcshell.ini]
+ [include:chat/protocols/skype/test/xpcshell.ini]
+-[include:chat/protocols/yahoo/test/xpcshell.ini]
+ #[include:extensions/purple/purplexpcom/src/test/xpcshell.ini]
+diff --git a/mail/components/im/content/imconversation.xml b/mail/components/im/content/imconversation.xml
+index 16c665a..a4b9fc6 100644
+--- a/mail/components/im/content/imconversation.xml
++++ b/mail/components/im/content/imconversation.xml
+@@ -285,8 +285,7 @@
+ msg = "<font face=\"" + style.fontFamily + "\">" + msg + "</font>";
+ // MSN doesn't support font size info in messages...
+ }
+- else if (proto == "prpl-aim" || proto == "prpl-icq" ||
+- proto == "prpl-yahoo" || proto == "prpl-yahoojp") {
++ else if (proto == "prpl-aim" || proto == "prpl-icq") {
+ let styleAttributes = ""
+ if ("color" in style)
+ styleAttributes += " color=\"" + style.color + "\"";
+--
+2.10.2
+
diff --git a/projects/instantbird/config b/projects/instantbird/config
index eedc112..c4f64cd 100644
--- a/projects/instantbird/config
+++ b/projects/instantbird/config
@@ -86,6 +86,7 @@ input_files:
- filename: 0022-Bug-1313137-msg-is-not-defined-error-in-irc.js-chang.patch
- filename: 0023-Bug-954368-Contact-list-entries-should-adapt-their-h.patch
- filename: 0024-Bug-1187281-Only-show-close-button-on-Windows.patch
+ - filename: 0025-Bug-1316000-Remove-old-Yahoo-Messenger-support.-r-al.patch
- filename: mozconfig-common
- filename: 'mozconfig-[% c("var/osname") %]'
name: mozconfig
More information about the tor-commits
mailing list