Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package skype4pidgin for openSUSE:Factory 
checked in at 2022-11-28 11:07:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/skype4pidgin (Old)
 and      /work/SRC/openSUSE:Factory/.skype4pidgin.new.1597 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "skype4pidgin"

Mon Nov 28 11:07:03 2022 rev:12 rq:1038537 version:1.7

Changes:
--------
--- /work/SRC/openSUSE:Factory/skype4pidgin/skype4pidgin.changes        
2018-06-02 12:14:06.911661259 +0200
+++ /work/SRC/openSUSE:Factory/.skype4pidgin.new.1597/skype4pidgin.changes      
2022-11-28 11:07:10.499785839 +0100
@@ -1,0 +2,15 @@
+Sat Nov 26 21:20:02 UTC 2022 - Alexei Sorokin <sor.ale...@meowr.ru>
+
+- Update to version 1.7 (changes since 1.5):
+  * Fix "alt login" giving a 40499 error.
+  * Fix file transfers.
+  * Fix losing admin rights when joining a room.
+  * Fix the Aug 2020 issues with "Failed to get Magic T" errors.
+    Use the "Use alternate auth method" setting in the Advanced tab
+    is always preferred as it's less prone to web-scraping issues.
+  * Fix some issues that some users were experiencing with buddies
+    not appearing as online.
+  * Fix some static analysis warnings
+    (memory leaks, security issues).
+
+-------------------------------------------------------------------

Old:
----
  skype4pidgin-1.5.tar.gz

New:
----
  skype4pidgin-1.7.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ skype4pidgin.spec ++++++
--- /var/tmp/diff_new_pack.3Loivk/_old  2022-11-28 11:07:11.027788207 +0100
+++ /var/tmp/diff_new_pack.3Loivk/_new  2022-11-28 11:07:11.031788226 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package skype4pidgin
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,12 +12,12 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 Name:           skype4pidgin
-Version:        1.5
+Version:        1.7
 Release:        0
 Summary:        Libpurple plugin for SkypeWeb API
 License:        GPL-3.0-or-later
@@ -69,17 +69,13 @@
 %setup -q
 
 %build
-make %{?_smp_mflags} V=1 -C skypeweb
+%make_build -C skypeweb
 
 %install
 %make_install -C skypeweb
 
 %files -n libpurple-plugin-skypeweb
-%if 0%{?suse_version} >= 1500
 %license skypeweb/gpl3.txt
-%else
-%doc skypeweb/gpl3.txt
-%endif
 %doc skypeweb/README.md
 %{_libdir}/purple-2/libskypeweb.so
 

++++++ skype4pidgin-1.5.tar.gz -> skype4pidgin-1.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/.gitignore 
new/skype4pidgin-1.7/skypeweb/.gitignore
--- old/skype4pidgin-1.5/skypeweb/.gitignore    2018-05-25 10:46:05.000000000 
+0200
+++ new/skype4pidgin-1.7/skypeweb/.gitignore    2020-08-25 10:20:25.000000000 
+0200
@@ -1 +1,2 @@
 libskypeweb.so
+build/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/CMakeLists.txt 
new/skype4pidgin-1.7/skypeweb/CMakeLists.txt
--- old/skype4pidgin-1.5/skypeweb/CMakeLists.txt        2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/CMakeLists.txt        2020-08-25 
10:20:25.000000000 +0200
@@ -2,7 +2,7 @@
 
 set(PROJECT_NAME "skypeweb" C)
 set(VERSION_MAJOR "1")
-set(VERSION_MINOR "5")
+set(VERSION_MINOR "7")
 set(VERSION_PATCH "0")
 
 project(${PROJECT_NAME})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/Makefile 
new/skype4pidgin-1.7/skypeweb/Makefile
--- old/skype4pidgin-1.5/skypeweb/Makefile      2018-05-25 10:46:05.000000000 
+0200
+++ new/skype4pidgin-1.7/skypeweb/Makefile      2020-08-25 10:20:25.000000000 
+0200
@@ -17,11 +17,16 @@
 
 # Do some nasty OS and purple version detection
 ifeq ($(OS),Windows_NT)
+  #only defined on 64-bit windows
+  PROGFILES32 = ${ProgramFiles(x86)}
+  ifndef PROGFILES32
+    PROGFILES32 = $(PROGRAMFILES)
+  endif
   SKYPEWEB_TARGET = libskypeweb.dll
-  SKYPEWEB_DEST = "$(PROGRAMFILES)/Pidgin/plugins"
-  SKYPEWEB_ICONS_DEST = "$(PROGRAMFILES)/Pidgin/pixmaps/pidgin/protocols"
-  SKYPEWEB_THEME_DEST = "$(PROGRAMFILES)/Pidgin/pixmaps/pidgin/emotes/skype"
-  MAKENSIS = "$(PROGRAMFILES)/NSIS/makensis.exe"
+  SKYPEWEB_DEST = "$(PROGFILES32)/Pidgin/plugins"
+  SKYPEWEB_ICONS_DEST = "$(PROGFILES32)/Pidgin/pixmaps/pidgin/protocols"
+  SKYPEWEB_THEME_DEST = "$(PROGFILES32)/Pidgin/pixmaps/pidgin/emotes/skype"
+  MAKENSIS = "$(PROGFILES32)/NSIS/makensis.exe"
 else
 
   UNAME_S := $(shell uname -s)
@@ -81,7 +86,7 @@
 
 
 
-.PHONY:        all install FAILNOPURPLE clean
+.PHONY:        all install FAILNOPURPLE clean translations
 
 all: $(SKYPEWEB_TARGET)
 
@@ -119,6 +124,21 @@
        mkdir -m $(DIR_PERM) -p $(SKYPEWEB_THEME_DEST)
        install -m $(FILE_PERM) -p theme $(SKYPEWEB_THEME_DEST)/theme
 
+translations: po/skypeweb.pot
+
+po/skypeweb.pot: 
+       xgettext $^ -k_ --no-location -o $@
+
+po/%.po: po/skypeweb.pot
+       msgmerge $@ po/skypeweb.pot > tmp-$*
+       mv -f tmp-$* $@
+
+po/%.mo: po/%.po
+       msgfmt -o $@ $^
+
+%-locale-install: po/%.mo
+       install -D -m $(FILE_PERM) -p po/$(*F).mo 
$(LOCALEDIR)/$(*F)/LC_MESSAGES/purple-discord.mo
+       
 FAILNOPURPLE:
        echo "You need libpurple development headers installed to be able to 
compile this plugin"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/README.md 
new/skype4pidgin-1.7/skypeweb/README.md
--- old/skype4pidgin-1.5/skypeweb/README.md     2018-05-25 10:46:05.000000000 
+0200
+++ new/skype4pidgin-1.7/skypeweb/README.md     2020-08-25 10:20:25.000000000 
+0200
@@ -7,6 +7,8 @@
 
 Change Log
 ----------
+  * 1.7 - Fixes 'non-alt login' (failed to get Magic T), improves online 
presences
+  * 1.6 - Fixes 'alt login', fixes file transfers, fixes losing admin rights 
when joining a room
   * 1.5 - Adds 'alternative auth' support, adds support for suggested 
contacts, fixes 'deny' friend requests
   * 1.4 - libpurple3.0 support, newer HTTP library which uses less CPU, fix 
for adding/removing/blocking contacts
   * 1.3 - S4B and Bot support, receive contacts, updated status icons, fixed 
auth requests, auto reconnects, call improvements, tooltips, can remove self 
from the buddy list, fixes tiny-text pasting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/libskypeweb.c 
new/skype4pidgin-1.7/skypeweb/libskypeweb.c
--- old/skype4pidgin-1.5/skypeweb/libskypeweb.c 2018-05-25 10:46:05.000000000 
+0200
+++ new/skype4pidgin-1.7/skypeweb/libskypeweb.c 2020-08-25 10:20:25.000000000 
+0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,9 +35,9 @@
                skypeweb_get_self_details(sa);
                
                if (sa->authcheck_timeout) 
-                       purple_timeout_remove(sa->authcheck_timeout);
+                       g_source_remove(sa->authcheck_timeout);
                skypeweb_check_authrequests(sa);
-               sa->authcheck_timeout = purple_timeout_add_seconds(120, 
(GSourceFunc)skypeweb_check_authrequests, sa);
+               sa->authcheck_timeout = g_timeout_add_seconds(120, 
(GSourceFunc)skypeweb_check_authrequests, sa);
                purple_connection_set_state(sa->pc, 
PURPLE_CONNECTION_CONNECTED);
 
                skypeweb_get_friend_list(sa);
@@ -120,8 +120,8 @@
                        g_free(escaped);
                }
                if (sbuddy->fullname && *sbuddy->fullname) {
-                       gchar *escaped = g_markup_printf_escaped("%s", 
sbuddy->display_name);
-                       purple_notify_user_info_add_pair_html(user_info, "Full 
Name", sbuddy->fullname);
+                       gchar *escaped = g_markup_printf_escaped("%s", 
sbuddy->fullname);
+                       purple_notify_user_info_add_pair_html(user_info, "Full 
Name", escaped);
                        g_free(escaped);
                }
        }
@@ -243,7 +243,10 @@
        g_string_append(url, "/members/");
        g_string_append_printf(url, "8:%s", purple_url_encode(sa->username));
        
-       post = "{\"role\":\"User\"}";
+       /* Specifying the role does not seem to be required and often result in 
a users role being
+        * downgraded from admin to user
+        * post = "{\"role\":\"User\"}"; */
+       post = "{}";
        
        skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, 
sa->messages_host, url->str, post, NULL, NULL, TRUE);
        
@@ -347,11 +350,7 @@
        sa->conns = purple_http_connection_set_new();
 
        if (purple_account_get_bool(account, "alt-login", FALSE)) {
-               if 
(!SKYPEWEB_BUDDY_IS_MSN(purple_account_get_username(account))) {
-                       skypeweb_begin_skyper_login(sa);
-               } else {
-                       skypeweb_begin_soapy_login(sa);
-               }
+               skypeweb_begin_soapy_login(sa);
        } else {
                if (purple_account_get_string(account, "refresh-token", NULL) 
&& purple_account_get_remember_password(account)) {
                        skypeweb_refresh_token_login(sa);
@@ -382,9 +381,9 @@
        sa = purple_connection_get_protocol_data(pc);
        g_return_if_fail(sa != NULL);
        
-       purple_timeout_remove(sa->authcheck_timeout);
-       purple_timeout_remove(sa->poll_timeout);
-       purple_timeout_remove(sa->watchdog_timeout);
+       g_source_remove(sa->authcheck_timeout);
+       g_source_remove(sa->poll_timeout);
+       g_source_remove(sa->watchdog_timeout);
 
        skypeweb_logout(sa);
        
@@ -521,7 +520,7 @@
                return PURPLE_CMD_RET_OK;
        }
        
-       skypeweb_chat_set_topic(pc, id, args ? args[0] : NULL);
+       skypeweb_chat_set_topic(pc, id, args[0]);
        
        return PURPLE_CMD_RET_OK;
 }
@@ -764,7 +763,7 @@
        prpl_info->options = OPT_PROTO_CHAT_TOPIC | OPT_PROTO_INVITE_MESSAGE 
/*| OPT_PROTO_IM_IMAGE*/;
        typing_type1 = purple_account_option_bool_new(N_("Show 'Typing' status 
as system message in chat window."), "show-typing-as-text", FALSE);
        typing_type2 = purple_account_option_bool_new(N_("Show 'Typing' status 
with 'Voice' icon near buddy name."), "show-typing-as-icon", FALSE);
-       alt_login = purple_account_option_bool_new(N_("Use alternative login 
method"), "alt-login", FALSE);
+       alt_login = purple_account_option_bool_new(N_("Use alternative login 
method"), "alt-login", TRUE);
 
 #if !PURPLE_VERSION_CHECK(3, 0, 0)
        prpl_info->protocol_options = 
g_list_append(prpl_info->protocol_options, typing_type1);
@@ -891,17 +890,16 @@
 }
 
 static void 
-skypeweb_protocol_xfer_iface_init(PurpleProtocolXferIface *prpl_info) 
+skypeweb_protocol_xfer_iface_init(PurpleProtocolXferInterface *prpl_info) 
 {
 #endif
        
-       //PurpleProtocolXferIface
+       //PurpleProtocolXferInterface
        prpl_info->new_xfer = skypeweb_new_xfer;
-#if !PURPLE_VERSION_CHECK(3, 0, 0)
        prpl_info->send_file = skypeweb_send_file;
+#if !PURPLE_VERSION_CHECK(3, 0, 0)
        prpl_info->can_receive_file = skypeweb_can_receive_file;
 #else
-       prpl_info->send = skypeweb_send_file;
        prpl_info->can_receive = skypeweb_can_receive_file;
 #endif
        
@@ -973,7 +971,7 @@
        PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST_IFACE,
                                          skypeweb_protocol_roomlist_iface_init)
 
-       PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER_IFACE,
+       PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
                                          skypeweb_protocol_xfer_iface_init)
 );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/libskypeweb.h 
new/skype4pidgin-1.7/skypeweb/libskypeweb.h
--- old/skype4pidgin-1.5/skypeweb/libskypeweb.h 2018-05-25 10:46:05.000000000 
+0200
+++ new/skype4pidgin-1.7/skypeweb/libskypeweb.h 2020-08-25 10:20:25.000000000 
+0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,6 +28,7 @@
 
 #include <glib.h>
 
+#include <inttypes.h>
 #include <errno.h>
 #include <string.h>
 #include <glib/gi18n.h>
@@ -45,6 +46,17 @@
 #      endif /* __GNUC__ >= 4 */
 #endif /* G_GNUC_NULL_TERMINATED */
 
+// workaround for MinGW32 which doesn't support "%zu"; see also 
https://stackoverflow.com/a/44383330
+#ifdef _WIN32
+#  ifdef _WIN64
+#    define PRI_SIZET PRIu64
+#  else
+#    define PRI_SIZET PRIu32
+#  endif
+#else
+#  define PRI_SIZET "zu"
+#endif
+
 #include "purplecompat.h"
 
 #ifdef _WIN32
@@ -62,19 +74,19 @@
 #include <json-glib/json-glib.h>
 
 #define json_object_get_int_member(JSON_OBJECT, MEMBER) \
-       (JSON_OBJECT && json_object_has_member(JSON_OBJECT, MEMBER) ? 
json_object_get_int_member(JSON_OBJECT, MEMBER) : 0)
+       ((JSON_OBJECT) && json_object_has_member((JSON_OBJECT), (MEMBER)) ? 
json_object_get_int_member((JSON_OBJECT), (MEMBER)) : 0)
 #define json_object_get_string_member(JSON_OBJECT, MEMBER) \
-       (JSON_OBJECT && json_object_has_member(JSON_OBJECT, MEMBER) ? 
json_object_get_string_member(JSON_OBJECT, MEMBER) : NULL)
+       ((JSON_OBJECT) && json_object_has_member((JSON_OBJECT), (MEMBER)) ? 
json_object_get_string_member((JSON_OBJECT), (MEMBER)) : NULL)
 #define json_object_get_array_member(JSON_OBJECT, MEMBER) \
-       (JSON_OBJECT && json_object_has_member(JSON_OBJECT, MEMBER) ? 
json_object_get_array_member(JSON_OBJECT, MEMBER) : NULL)
+       ((JSON_OBJECT) && json_object_has_member((JSON_OBJECT), (MEMBER)) ? 
json_object_get_array_member((JSON_OBJECT), (MEMBER)) : NULL)
 #define json_object_get_object_member(JSON_OBJECT, MEMBER) \
-       (JSON_OBJECT && json_object_has_member(JSON_OBJECT, MEMBER) ? 
json_object_get_object_member(JSON_OBJECT, MEMBER) : NULL)
+       ((JSON_OBJECT) && json_object_has_member((JSON_OBJECT), (MEMBER)) ? 
json_object_get_object_member((JSON_OBJECT), (MEMBER)) : NULL)
 #define json_object_get_boolean_member(JSON_OBJECT, MEMBER) \
-       (JSON_OBJECT && json_object_has_member(JSON_OBJECT, MEMBER) ? 
json_object_get_boolean_member(JSON_OBJECT, MEMBER) : FALSE)
+       ((JSON_OBJECT) && json_object_has_member((JSON_OBJECT), (MEMBER)) ? 
json_object_get_boolean_member((JSON_OBJECT), (MEMBER)) : FALSE)
 #define json_array_get_length(JSON_ARRAY) \
-       (JSON_ARRAY ? json_array_get_length(JSON_ARRAY) : 0)
+       ((JSON_ARRAY) ? json_array_get_length(JSON_ARRAY) : 0)
 #define json_node_get_array(JSON_NODE) \
-       (JSON_NODE && JSON_NODE_TYPE(JSON_NODE) == JSON_NODE_ARRAY ? 
json_node_get_array(JSON_NODE) : NULL)
+       ((JSON_NODE) && JSON_NODE_TYPE(JSON_NODE) == (JSON_NODE_ARRAY) ? 
json_node_get_array(JSON_NODE) : NULL)
 
 #include "accountopt.h"
 #include "core.h"
@@ -100,7 +112,7 @@
 #define SKYPEWEB_MAX_MSG_RETRY 2
 
 #define SKYPEWEB_PLUGIN_ID "prpl-skypeweb"
-#define SKYPEWEB_PLUGIN_VERSION "1.5"
+#define SKYPEWEB_PLUGIN_VERSION "1.7"
 
 #define SKYPEWEB_LOCKANDKEY_APPID "msm...@msnmsgr.com"
 #define SKYPEWEB_LOCKANDKEY_SECRET "Q1P7W2E4J9R8U3S5"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/pidgin-skypeweb.nsi 
new/skype4pidgin-1.7/skypeweb/pidgin-skypeweb.nsi
--- old/skype4pidgin-1.5/skypeweb/pidgin-skypeweb.nsi   2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/pidgin-skypeweb.nsi   2020-08-25 
10:20:25.000000000 +0200
@@ -9,7 +9,7 @@
 !define PRODUCT_NAME "pidgin-skypeweb"
 !endif
 !ifndef PRODUCT_VERSION
-!define PRODUCT_VERSION "v1.5"
+!define PRODUCT_VERSION "v1.7"
 !endif
 !define PRODUCT_PUBLISHER "Eion Robb"
 !define PRODUCT_WEB_SITE "https://eion.robbmob.com/";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/skype4pidgin-1.5/skypeweb/purple2compat/ciphers/sha256hash.h 
new/skype4pidgin-1.7/skypeweb/purple2compat/ciphers/sha256hash.h
--- old/skype4pidgin-1.5/skypeweb/purple2compat/ciphers/sha256hash.h    
2018-05-25 10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/purple2compat/ciphers/sha256hash.h    
1970-01-01 01:00:00.000000000 +0100
@@ -1,18 +0,0 @@
-#ifndef _CIPHERS_SHA256HASH_H_
-#define _CIPHERS_SHA256HASH_H_
-
-#include "cipher.h"
-
-#define purple_sha256_hash_new()       
purple_cipher_context_new(purple_ciphers_find_cipher("sha256"), NULL)
-
-#ifndef PurpleHash
-#      define PurpleHash               PurpleCipherContext
-#      define purple_hash_append       purple_cipher_context_append
-#      define purple_hash_digest_to_str(ctx, data, size) \
-                               purple_cipher_context_digest_to_str(ctx, size, 
data, NULL)
-#      define purple_hash_digest(ctx, data, size) \
-                               purple_cipher_context_digest(ctx, size, data, 
NULL)
-#      define purple_hash_destroy      purple_cipher_context_destroy
-#endif /*PurpleHash*/
-
-#endif /*_CIPHERS_SHA256HASH_H_*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/purple2compat/http.c 
new/skype4pidgin-1.7/skypeweb/purple2compat/http.c
--- old/skype4pidgin-1.5/skypeweb/purple2compat/http.c  2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/purple2compat/http.c  2020-08-25 
10:20:25.000000000 +0200
@@ -48,7 +48,7 @@
 #define PURPLE_HTTP_REQUEST_DEFAULT_MAX_REDIRECTS 20
 #define PURPLE_HTTP_REQUEST_DEFAULT_TIMEOUT 30
 #define PURPLE_HTTP_REQUEST_DEFAULT_MAX_LENGTH 1048576
-#define PURPLE_HTTP_REQUEST_HARD_MAX_LENGTH G_MAXINT32-1
+#define PURPLE_HTTP_REQUEST_HARD_MAX_LENGTH (G_MAXINT32-1)
 
 #define PURPLE_HTTP_PROGRESS_WATCHER_DEFAULT_INTERVAL 250000
 
@@ -334,7 +334,7 @@
        g_free(d_time);
 
        if (month > 12) {
-               purple_debug_warning("http", "Invalid month: %s\n", d_month);
+               purple_debug_warning("http", "Invalid month: %d\n", month);
                g_free(iso_date);
                return 0;
        }
@@ -405,7 +405,6 @@
                gsize decompressed_len;
 
                zs->next_out = (Bytef*)decompressed_buff;
-               zs->avail_out = sizeof(decompressed_buff);
                decompressed_len = zs->avail_out = sizeof(decompressed_buff);
                gzres = inflate(zs, Z_FULL_FLUSH);
                decompressed_len -= zs->avail_out;
@@ -431,7 +430,8 @@
                        purple_debug_error("http",
                                "Decompression failed (%d): %s\n", gzres,
                                zs->msg);
-                       gzs->failed = TRUE;
+                       gzs->failed = TRUE;
+                       g_string_free(ret, TRUE);
                        return NULL;
                }
        }
@@ -777,7 +777,7 @@
                purple_http_request_is_method(req, "post")))
        {
                g_string_append_printf(h, "Content-Length: %u\r\n",
-                       req->contents_length);
+                       (unsigned int) req->contents_length);
        }
 
        if (proxy_http)
@@ -1602,7 +1602,7 @@
                        hc, request->url);
        else
                purple_debug_misc("http", "Performing new request %p to %s.\n",
-                       hc, hc->url ? hc->url->host : NULL);
+                       hc, hc->url ? hc->url->host : "");
 
        if (!hc->url || hc->url->host == NULL || hc->url->host[0] == '\0') {
                purple_debug_error("http", "Invalid URL requested.\n");
@@ -2025,7 +2025,7 @@
        gchar *escaped_name = g_strdup(purple_url_encode(name));
        gchar *escaped_value = NULL;
        
-       if (escaped_value) {
+       if (value) {
                escaped_value = g_strdup(purple_url_encode(value));
        }
        
@@ -3077,7 +3077,7 @@
        if (parsed_url->username || parsed_url->password) {
                if (parsed_url->username)
                        g_string_append(url, parsed_url->username);
-               g_string_append_printf(url, ":%s", parsed_url->password);
+               g_string_append_printf(url, ":%s", parsed_url->password ? 
parsed_url->password : "");
                g_string_append(url, "@");
                before_host_printed = TRUE;
        }
@@ -3222,9 +3222,10 @@
        purple_http_re_url_host = NULL;
        g_regex_unref(purple_http_re_rfc1123);
        purple_http_re_rfc1123 = NULL;
-
-       g_list_foreach(purple_http_hc_list, purple_http_foreach_conn_cancel,
-               NULL);
+
+       if (purple_http_hc_list != NULL)
+               g_list_foreach(purple_http_hc_list, 
purple_http_foreach_conn_cancel,
+                       NULL);
 
        if (purple_http_hc_list != NULL ||
                0 != g_hash_table_size(purple_http_hc_by_ptr) ||
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/skype4pidgin-1.5/skypeweb/purple2compat/purple-socket.c 
new/skype4pidgin-1.7/skypeweb/purple2compat/purple-socket.c
--- old/skype4pidgin-1.5/skypeweb/purple2compat/purple-socket.c 2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/purple2compat/purple-socket.c 2020-08-25 
10:20:25.000000000 +0200
@@ -77,9 +77,11 @@
        PurpleConnection *gc = ps->gc;
        GSList *l;
 
-       l = g_hash_table_lookup(handles, gc);
-       l = g_slist_remove(l, ps);
-       g_hash_table_insert(handles, gc, l);
+       l = g_hash_table_lookup(handles, gc);
+       if (l != NULL) {
+               l = g_slist_remove(l, ps);
+               g_hash_table_insert(handles, gc, l);
+       }
 }
 
 void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/purplecompat.h 
new/skype4pidgin-1.7/skypeweb/purplecompat.h
--- old/skype4pidgin-1.5/skypeweb/purplecompat.h        2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/purplecompat.h        2020-08-25 
10:20:25.000000000 +0200
@@ -94,7 +94,7 @@
 #define purple_conversations_find_im_with_account(name, account)  \
                
PURPLE_CONV_IM(purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, 
account))
 #define purple_im_conversation_new(account, from) 
PURPLE_CONV_IM(purple_conversation_new(PURPLE_CONV_TYPE_IM, account, from))
-#define PURPLE_CONVERSATION(chatorim)         (chatorim == NULL ? NULL : 
chatorim->conv)
+#define PURPLE_CONVERSATION(chatorim)         ((chatorim) == NULL ? NULL : 
(chatorim)->conv)
 #define PURPLE_IM_CONVERSATION(conv)          PURPLE_CONV_IM(conv)
 #define PURPLE_CHAT_CONVERSATION(conv)        PURPLE_CONV_CHAT(conv)
 #define PURPLE_IS_IM_CONVERSATION(conv)       
(purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
@@ -122,6 +122,18 @@
        return message;
 }
 static inline PurpleMessage *
+purple_message_new_incoming(const gchar *who, const gchar *contents, 
PurpleMessageFlags flags, guint64 timestamp)
+{
+       PurpleMessage *message = g_new0(PurpleMessage, 1);
+       
+       message->who = g_strdup(who);
+       message->what = g_strdup(contents);
+       message->flags = flags | PURPLE_MESSAGE_RECV;
+       message->when = timestamp;
+       
+       return message;
+}
+static inline PurpleMessage *
 purple_message_new_system(const gchar *contents, PurpleMessageFlags flags)
 {
        PurpleMessage *message = g_new0(PurpleMessage, 1);
@@ -244,10 +256,22 @@
                (ui_ops && ui_ops->ui_write ? ui_ops->ui_write(xfer, buffer, 
size) : fwrite(buffer, 1, size, xfer->dest_fp)));
        return TRUE;
 }
+static inline gssize
+purple_xfer_read_file(PurpleXfer *xfer, guchar *buffer, gsize size) {
+       PurpleXferUiOps *ui_ops = purple_xfer_get_ui_ops(xfer);
+       gssize got_len = (ui_ops && ui_ops->ui_read ? ui_ops->ui_read(xfer, 
&buffer, size) : fread(buffer, 1, size, xfer->dest_fp));
+       purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) + 
got_len);
+       return got_len;
+}
 #endif
 #define PURPLE_XFER_TYPE_RECEIVE  PURPLE_XFER_RECEIVE
 #define PURPLE_XFER_TYPE_SEND     PURPLE_XFER_SEND
 
+// Kinda gross, since we can technically use the glib mainloop from purple2
+#define g_timeout_add_seconds  purple_timeout_add_seconds
+#define g_timeout_add          purple_timeout_add
+#define g_source_remove        purple_timeout_remove
+
 #endif
 
 #endif /*_PURPLECOMPAT_H_*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_connection.c 
new/skype4pidgin-1.7/skypeweb/skypeweb_connection.c
--- old/skype4pidgin-1.5/skypeweb/skypeweb_connection.c 2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_connection.c 2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_connection.h 
new/skype4pidgin-1.7/skypeweb/skypeweb_connection.h
--- old/skype4pidgin-1.5/skypeweb/skypeweb_connection.h 2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_connection.h 2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_contacts.c 
new/skype4pidgin-1.7/skypeweb/skypeweb_contacts.c
--- old/skype4pidgin-1.5/skypeweb/skypeweb_contacts.c   2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_contacts.c   2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,6 +32,22 @@
        PurpleMessage *pmsg = purple_message_new_system(msg, flags);
        purple_message_set_time(pmsg, ts);
        purple_conversation_write_message(conv, pmsg);
+       purple_message_destroy(pmsg);
+}
+static void purple_conversation_write_img_message(
+               PurpleConversation *conv, const char* who, const gchar *msg,
+               PurpleMessageFlags flags, time_t ts) {
+       PurpleMessage *pmsg;
+
+       if (flags & PURPLE_MESSAGE_SEND) {
+               pmsg = purple_message_new_outgoing(who, msg, flags);
+               purple_message_set_time(pmsg, ts);
+       } else {
+               pmsg = purple_message_new_incoming(who, msg, flags, ts);
+       }
+               
+       purple_conversation_write_message(conv, pmsg);
+       purple_message_destroy(pmsg);
 }
 
 // Check that the conversation hasn't been closed
@@ -51,7 +67,6 @@
        gchar *url;
        gchar *id;
        SkypeWebAccount *sa;
-       PurpleSslConnection *conn;
 } SkypeWebFileTransfer;
 
 static guint active_icon_downloads = 0;
@@ -91,11 +106,16 @@
        purple_debug_info("skypeweb", "getting new buddy icon for %s\n", 
purple_buddy_get_name(buddy));
        
        sbuddy = purple_buddy_get_protocol_data(buddy);
-       if (sbuddy != NULL && sbuddy->avatar_url && sbuddy->avatar_url[0]) {
+       
+       if (!sbuddy || !sbuddy->sa || !sbuddy->sa->pc)
+               return;
+
+       if (sbuddy->avatar_url && sbuddy->avatar_url[0]) {
                url = g_strdup(sbuddy->avatar_url);
        } else {
                url = 
g_strdup_printf("https://avatar.skype.com/v1/avatars/%s/public?returnDefaultImage=false";,
 purple_url_encode(purple_buddy_get_name(buddy)));
        }
+
        sa = sbuddy->sa;
        
        purple_http_get(sa->pc, skypeweb_get_icon_cb, buddy, url);
@@ -122,12 +142,13 @@
 {
        if (!buddy) return;
        
-       purple_timeout_add(100, skypeweb_get_icon_queuepop, (gpointer)buddy);
+       g_timeout_add(100, skypeweb_get_icon_queuepop, (gpointer)buddy);
 }
 
 typedef struct SkypeImgMsgContext_ {
        PurpleConversation *conv;
        time_t composetimestamp;
+       gchar* from;
 } SkypeImgMsgContext;
 
 static void
@@ -142,6 +163,8 @@
        SkypeImgMsgContext *ctx = user_data;
        PurpleConversation *conv = ctx->conv;
        time_t ts = ctx->composetimestamp;
+       gchar* ctx_from = ctx->from;
+       ctx->from = NULL;
        g_free(ctx);
        
        // Conversation could have been closed before we retrieved the image
@@ -160,16 +183,27 @@
        image = purple_image_new_from_data(g_memdup(url_text, len), len);
        icon_id = purple_image_store_add(image);
        msg_tmp = g_strdup_printf("<img id='%d'>", icon_id);
-       purple_conversation_write_system_message_ts(conv, msg_tmp, 
PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_IMAGES, ts);
+       purple_conversation_write_img_message(conv, ctx_from, msg_tmp, 
PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_IMAGES, ts);
        g_free(msg_tmp);
+       g_free(ctx_from);
 }
 
 void
-skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, 
PurpleConversation *conv, time_t ts)
+skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, 
PurpleConversation *conv, time_t ts, const gchar* from)
 {
        gchar *url, *text;
        PurpleHttpRequest *request;
        
+       if (purple_strequal(purple_core_get_ui(), "BitlBee")) {
+               // Bitlbee doesn't support images, so just plop a url to the 
image instead
+               
+               url = purple_strreplace(uri, "imgt1", "imgpsh_fullsize");
+               purple_conversation_write_system_message_ts(conv, url, 
PURPLE_MESSAGE_SYSTEM, ts);
+               g_free(url);
+               
+               return;
+       }
+       
        request = purple_http_request_new(uri);
        purple_http_request_set_keepalive_pool(request, sa->keepalive_pool);
        purple_http_request_header_set_printf(request, "Cookie", 
"skypetoken_asm=%s", sa->skype_token);
@@ -177,16 +211,20 @@
        SkypeImgMsgContext *ctx = g_new(SkypeImgMsgContext, 1);
        ctx->composetimestamp = ts;
        ctx->conv = conv;
+       ctx->from = g_strdup(from);
        purple_http_request(sa->pc, request, skypeweb_got_imagemessage, ctx);
        purple_http_request_unref(request);
 
        url = purple_strreplace(uri, "imgt1", "imgpsh_fullsize");
        text = g_strdup_printf("<a href=\"%s\">Click here to view full 
version</a>", url);
-       purple_conversation_write_system_message_ts(conv, text, 
PURPLE_MESSAGE_SYSTEM, ts);
+       purple_conversation_write_img_message(conv, from, text, 0, ts);
+       
+       g_free(url);
+       g_free(text);
 }
 
 void
-skypeweb_download_moji_to_conv(SkypeWebAccount *sa, const gchar *text, const 
gchar *url_thumbnail, PurpleConversation *conv, time_t ts)
+skypeweb_download_moji_to_conv(SkypeWebAccount *sa, const gchar *text, const 
gchar *url_thumbnail, PurpleConversation *conv, time_t ts, const gchar* from)
 {
        gchar *cdn_url_thumbnail;
        PurpleHttpURL *httpurl;
@@ -203,10 +241,11 @@
        SkypeImgMsgContext *ctx = g_new(SkypeImgMsgContext, 1);
        ctx->composetimestamp = ts;
        ctx->conv = conv;
+       ctx->from = g_strdup(from);
        purple_http_request(sa->pc, request, skypeweb_got_imagemessage, ctx);
        purple_http_request_unref(request);
        
-       purple_conversation_write_system_message_ts(conv, text, 
PURPLE_MESSAGE_SYSTEM, ts);
+       purple_conversation_write_img_message(conv, from, text, 0, ts);
 
        g_free(cdn_url_thumbnail);
        purple_http_url_free(httpurl);
@@ -347,8 +386,6 @@
        
        if (swft->info != NULL)
                json_object_unref(swft->info);
-       if (swft->conn != NULL)
-               purple_ssl_close(swft->conn);
        g_free(swft->url);
        g_free(swft->id);
        g_free(swft->from);
@@ -456,7 +493,7 @@
        } */
        purple_debug_info("skypeweb", "File info: %s\n", data);
        
-       if (!json_object_has_member(obj, "content_state") || 
!g_str_equal(json_object_get_string_member(obj, "content_state"), "ready")) {
+       if (!json_object_has_member(obj, "content_state") || 
!purple_strequal(json_object_get_string_member(obj, "content_state"), "ready")) 
{
                skypeweb_present_uri_as_filetransfer(sa, 
json_object_get_string_member(obj, "status_location"), swft->from);
                g_free(swft->url);
                g_free(swft->from);
@@ -504,59 +541,6 @@
        purple_http_request_unref(request);
 }
 
-static gssize
-skypeweb_xfer_send_write(const guchar *buf, size_t len, PurpleXfer *xfer)
-{
-       SkypeWebFileTransfer *swft = purple_xfer_get_protocol_data(xfer);
-
-       return purple_ssl_write(swft->conn, buf, len);
-}
-
-static void
-skypeweb_read_stuff(gpointer user_data, PurpleSslConnection *ssl_connection, 
PurpleInputCondition cond)
-{
-       gchar buf[1024];
-       
-       //Flush the server buffer
-       purple_ssl_read(ssl_connection, buf, 1024);
-       //purple_debug_info("skypeweb", "Server file send response was %s\n", 
buf);
-}
-
-static void
-skypeweb_xfer_send_connect_cb(gpointer user_data, PurpleSslConnection 
*ssl_connection, PurpleInputCondition cond)
-{
-       SkypeWebFileTransfer *swft = user_data;
-       SkypeWebAccount *sa = swft->sa;
-       PurpleXfer *xfer = swft->xfer;
-       gchar *headers;
-       
-       headers = g_strdup_printf("PUT /v1/objects/%s/content/original 
HTTP/1.0\r\n"
-                       "Connection: close\r\n"
-                       "Authorization: skype_token %s\r\n" //slightly 
different to normal!
-                       "Host: " SKYPEWEB_XFER_HOST "\r\n"
-                       "Content-Length: %" G_GSIZE_FORMAT "\r\n"
-                       "Content-Type: application/json\r\n"
-                       "\r\n",
-                       purple_url_encode(swft->id),
-                       sa->skype_token, 
-                       (gsize) purple_xfer_get_size(xfer));
-       
-       purple_ssl_write(ssl_connection, headers, strlen(headers));
-       
-       swft->conn = ssl_connection;
-       purple_ssl_input_add(swft->conn, skypeweb_read_stuff, swft);
-       
-       purple_xfer_ref(xfer);
-       purple_xfer_start(xfer, ssl_connection->fd, NULL, 0);
-       
-       purple_xfer_protocol_ready(xfer);
-       
-       g_free(headers);
-       
-}
-
-static gboolean poll_file_send_progress(gpointer user_data);
-
 static void
 got_file_send_progress(PurpleHttpConnection *http_conn, PurpleHttpResponse 
*response, gpointer user_data)
 {
@@ -575,13 +559,11 @@
        parser = json_parser_new();
        if (!json_parser_load_from_data(parser, data, len, NULL)) {
                //probably bad
-               poll_file_send_progress(swft);
                return;
        }
        node = json_parser_get_root(parser);
        if (node == NULL || json_node_get_node_type(node) != JSON_NODE_OBJECT) {
                //probably bad
-               poll_file_send_progress(swft);
                return;
        }
        obj = json_node_get_object(node);
@@ -592,7 +574,7 @@
                swft->url = g_strdup(json_object_get_string_member(obj, 
"status_location"));
        }
        
-       if (json_object_has_member(obj, "content_state") && 
g_str_equal(json_object_get_string_member(obj, "content_state"), "ready")) {
+       if (json_object_has_member(obj, "content_state") && 
purple_strequal(json_object_get_string_member(obj, "content_state"), "ready")) {
                PurpleXmlNode *uriobject = purple_xmlnode_new("URIObject");
                PurpleXmlNode *title = purple_xmlnode_new_child(uriobject, 
"Title");
                PurpleXmlNode *description = 
purple_xmlnode_new_child(uriobject, "Description");
@@ -624,7 +606,9 @@
                purple_xmlnode_set_attrib(filesize, "v", temp);
                g_free(temp);
                
-               message = purple_xmlnode_to_str(uriobject, NULL);
+               temp = purple_xmlnode_to_str(uriobject, NULL);
+               message = purple_strreplace(temp, "'", "\"");
+               g_free(temp);
 #if PURPLE_VERSION_CHECK(3, 0, 0)
                PurpleMessage *msg = purple_message_new_outgoing(swft->from, 
message, PURPLE_MESSAGE_SEND);
                skypeweb_send_im(sa->pc, msg);
@@ -646,7 +630,6 @@
        g_object_unref(parser);
        
        // probably good
-       poll_file_send_progress(swft);
 }
 
 static gboolean
@@ -665,29 +648,70 @@
        
        return FALSE;
 }
-
-static void
-skypeweb_xfer_send_end(PurpleXfer *xfer)
-{
-       SkypeWebFileTransfer *swft = purple_xfer_get_protocol_data(xfer);
-       gchar buf[1024];
-       
-       //Flush the server buffer
-       purple_ssl_read(swft->conn, buf, 1024);
-       //purple_debug_info("skypeweb", "Server file send response was %s\n", 
buf);
-       
-       purple_ssl_close(swft->conn);
-       swft->conn = NULL;
-       
-       //poll swft->url for progress
-       purple_timeout_add_seconds(1, poll_file_send_progress, swft);
-}
-
+
+static void
+skypeweb_xfer_send_contents_reader(PurpleHttpConnection *con, gchar *buf, 
size_t offset, size_t len, gpointer user_data, PurpleHttpContentReaderCb cb)
+{
+       SkypeWebFileTransfer *swft = user_data;
+       PurpleXfer *xfer = swft->xfer;
+       gsize read;
+       
+       purple_debug_info("skypeweb", "Asked %" G_GSIZE_FORMAT " bytes from 
offset %" G_GSIZE_FORMAT "\n", len, offset);
+       purple_xfer_set_bytes_sent(xfer, offset);
+       read = purple_xfer_read_file(xfer, (guchar *)buf, len);
+       purple_debug_info("skypeweb", "Read %" G_GSIZE_FORMAT " bytes\n", read);
+       
+       cb(con, TRUE, read != len, read);
+}
+
+static void
+skypeweb_xfer_send_done(PurpleHttpConnection *conn, PurpleHttpResponse *resp, 
gpointer user_data)
+{
+       gsize len;
+       const gchar *data = purple_http_response_get_data(resp, &len);
+       const gchar *error = purple_http_response_get_error(resp);
+       int code = purple_http_response_get_code(resp);
+       purple_debug_info("skypeweb", "Finished [%d]: %s\n", code, error);
+       purple_debug_info("skypeweb", "Server message: %s\n", data);
+       g_timeout_add_seconds(1, poll_file_send_progress, user_data);
+}
+
+static void
+skypeweb_xfer_send_watcher(PurpleHttpConnection *http_conn, gboolean state, 
int processed, int total, gpointer user_data)
+{
+       SkypeWebFileTransfer *swft = user_data;
+       PurpleXfer *xfer = swft->xfer;
+       if (!state) purple_xfer_update_progress(xfer);
+}
+
+static void
+skypeweb_xfer_send_begin(gpointer user_data)
+{
+       SkypeWebFileTransfer *swft = user_data;
+       PurpleXfer *xfer = swft->xfer;
+       SkypeWebAccount *sa = swft->sa;
+       PurpleHttpConnection *http_conn;
+
+       PurpleHttpRequest *request = purple_http_request_new("");
+       purple_http_request_set_url_printf(request, 
"https://%s/v1/objects/%s/content/original";, SKYPEWEB_XFER_HOST, 
purple_url_encode(swft->id));
+       purple_http_request_set_method(request, "PUT");
+       purple_http_request_header_set(request, "Host", SKYPEWEB_XFER_HOST);
+       purple_http_request_header_set(request, "Content-Type", 
"multipart/form-data");
+       purple_http_request_header_set_printf(request, "Content-Length", "%" 
G_GSIZE_FORMAT, (gsize) purple_xfer_get_size(xfer));
+       purple_http_request_header_set_printf(request, "Authorization", 
"skype_token %s", sa->skype_token);
+       purple_http_request_set_contents_reader(request, 
skypeweb_xfer_send_contents_reader, purple_xfer_get_size(xfer), user_data);
+       purple_http_request_set_http11(request, TRUE);
+       purple_xfer_start(xfer, -1, NULL, 0);
+       http_conn = purple_http_request(sa->pc, request, 
skypeweb_xfer_send_done, user_data);
+       purple_http_conn_set_progress_watcher(http_conn, 
skypeweb_xfer_send_watcher, user_data, 1);
+
+       purple_http_request_unref(request);
+}
+
 static void
 skypeweb_got_object_for_file(PurpleHttpConnection *http_conn, 
PurpleHttpResponse *response, gpointer user_data)
 {
        SkypeWebFileTransfer *swft = user_data;
-       SkypeWebAccount *sa = swft->sa;
        PurpleXfer *xfer = swft->xfer;
        JsonParser *parser;
        JsonNode *node;
@@ -731,9 +755,7 @@
        //Send the data
        
        //can't use fetch_url_request because it doesn't handle binary data
-       //TODO make an error handler callback func
-       //TODO switch to purple_http_request_set_contents_reader()
-       purple_ssl_connect(sa->account, SKYPEWEB_XFER_HOST, 443, 
skypeweb_xfer_send_connect_cb, NULL, swft);
+       skypeweb_xfer_send_begin(user_data);
        
 }
 
@@ -770,6 +792,7 @@
        purple_http_request_set_keepalive_pool(request, sa->keepalive_pool);
        purple_http_request_header_set_printf(request, "Authorization", 
"skype_token %s", sa->skype_token); //slightly different to normal!
        purple_http_request_header_set(request, "Content-Type", 
"application/json");
+       purple_http_request_header_set(request, "X-Client-Version", 
SKYPEWEB_CLIENTINFO_VERSION);
        purple_http_request_set_contents(request, post, -1);
        purple_http_request(sa->pc, request, skypeweb_got_object_for_file, 
swft);
        purple_http_request_unref(request);
@@ -781,7 +804,11 @@
 }
 
 PurpleXfer *
-skypeweb_new_xfer(PurpleConnection *pc, const char *who)
+skypeweb_new_xfer(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+PurpleProtocolXfer *prplxfer, 
+#endif
+PurpleConnection *pc, const char *who)
 {
        SkypeWebAccount *sa = purple_connection_get_protocol_data(pc);
        PurpleXfer *xfer;
@@ -796,8 +823,8 @@
        purple_xfer_set_protocol_data(xfer, swft);
        
        purple_xfer_set_init_fnc(xfer, skypeweb_xfer_send_init);
-       purple_xfer_set_write_fnc(xfer, skypeweb_xfer_send_write);
-       purple_xfer_set_end_fnc(xfer, skypeweb_xfer_send_end);
+       //purple_xfer_set_write_fnc(xfer, skypeweb_xfer_send_write);
+       //purple_xfer_set_end_fnc(xfer, skypeweb_xfer_send_end);
        purple_xfer_set_request_denied_fnc(xfer, skypeweb_free_xfer);
        purple_xfer_set_cancel_send_fnc(xfer, skypeweb_free_xfer);
        
@@ -805,9 +832,17 @@
 }
 
 void
-skypeweb_send_file(PurpleConnection *pc, const gchar *who, const gchar 
*filename)
+skypeweb_send_file(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+PurpleProtocolXfer *prplxfer, 
+#endif
+PurpleConnection *pc, const gchar *who, const gchar *filename)
 {
-       PurpleXfer *xfer = skypeweb_new_xfer(pc, who);
+       PurpleXfer *xfer = skypeweb_new_xfer(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+               prplxfer, 
+#endif
+               pc, who);
        
        if (filename && *filename)
                purple_xfer_request_accepted(xfer, filename);
@@ -816,7 +851,11 @@
 }
 
 gboolean
-skypeweb_can_receive_file(PurpleConnection *pc, const gchar *who)
+skypeweb_can_receive_file(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+PurpleProtocolXfer *prplxfer, 
+#endif
+PurpleConnection *pc, const gchar *who)
 {
        if (!who || g_str_equal(who, 
purple_account_get_username(purple_connection_get_account(pc))))
                return FALSE;
@@ -845,7 +884,7 @@
        if (!old_alias || !*old_alias) {
                if (json_object_has_member(userobj, "displayname"))
                        displayname = json_object_get_string_member(userobj, 
"displayname");
-               if (!displayname || g_str_equal(displayname, username))
+               if (!displayname || purple_strequal(displayname, username))
                        displayname = json_object_get_string_member(userobj, 
"firstname");
        
                if (displayname)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_contacts.h 
new/skype4pidgin-1.7/skypeweb/skypeweb_contacts.h
--- old/skype4pidgin-1.5/skypeweb/skypeweb_contacts.h   2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_contacts.h   2020-08-25 
10:20:25.000000000 +0200
@@ -22,14 +22,28 @@
 #include "libskypeweb.h"
 
 void skypeweb_get_icon(PurpleBuddy *buddy);
-void skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, 
PurpleConversation *conv, time_t ts);
+void skypeweb_download_uri_to_conv(SkypeWebAccount *sa, const gchar *uri, 
PurpleConversation *conv, time_t ts, const gchar* from);
 void skypeweb_download_video_message(SkypeWebAccount *sa, const gchar *sid, 
PurpleConversation *conv);
-void skypeweb_download_moji_to_conv(SkypeWebAccount *sa, const gchar *text, 
const gchar *url_thumbnail, PurpleConversation *conv, time_t ts);
+void skypeweb_download_moji_to_conv(SkypeWebAccount *sa, const gchar *text, 
const gchar *url_thumbnail, PurpleConversation *conv, time_t ts, const gchar* 
from);
 void skypeweb_present_uri_as_filetransfer(SkypeWebAccount *sa, const gchar 
*uri, const gchar *from);
 
-PurpleXfer *skypeweb_new_xfer(PurpleConnection *pc, const char *who);
-void skypeweb_send_file(PurpleConnection *pc, const gchar *who, const gchar 
*filename);
-gboolean skypeweb_can_receive_file(PurpleConnection *pc, const gchar *who);
+PurpleXfer *skypeweb_new_xfer(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+PurpleProtocolXfer *prplxfer, 
+#endif
+PurpleConnection *pc, const char *who);
+
+void skypeweb_send_file(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+PurpleProtocolXfer *prplxfer, 
+#endif
+PurpleConnection *pc, const gchar *who, const gchar *filename);
+
+gboolean skypeweb_can_receive_file(
+#if PURPLE_VERSION_CHECK(3, 0, 0)
+PurpleProtocolXfer *prplxfer, 
+#endif
+PurpleConnection *pc, const gchar *who);
 
 void skypeweb_search_users(PurpleProtocolAction *action);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_login.c 
new/skype4pidgin-1.7/skypeweb/skypeweb_login.c
--- old/skype4pidgin-1.5/skypeweb/skypeweb_login.c      2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_login.c      2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,6 +36,7 @@
                purple_connection_error(sa->pc,
                                                                
PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
                                                                _("Failed 
getting Skype Token, please try logging in via browser first"));
+               return;
        }
        
        if (refresh_token == NULL) {
@@ -156,6 +157,8 @@
        PurpleHttpRequest *request;
        GString *postdata;
        gchar *magic_t_value; // T is for tasty
+       gchar *error_code;
+       gchar *error_text;
        int tmplen;
        const gchar *data;
        gsize len;
@@ -163,7 +166,10 @@
        data = purple_http_response_get_data(response, &len);
        
        // <input type="hidden" name="t" id="t" value="...">
+       error_text = skypeweb_string_get_chunk(data, len, ",sErrTxt:'", 
"',Am:'");
+       error_code = skypeweb_string_get_chunk(data, len, ",sErrorCode:'", 
"',Ag:");
        magic_t_value = skypeweb_string_get_chunk(data, len, "=\"t\" value=\"", 
"\"");
+
        if (!magic_t_value) {
                //No Magic T????  Maybe it be the mighty 2fa-beast
                
@@ -188,7 +194,22 @@
                                return;
                        }
                }
+
+               if (error_text) {
+                       GString *new_error;
+                       new_error = g_string_new("");
+                       g_string_append_printf(new_error, "%s: ", error_code);
+                       g_string_append_printf(new_error, "%s", error_text);
+
+                       gchar *error_msg = g_string_free(new_error, FALSE);
+
+                       purple_connection_error(sa->pc, 
PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, error_msg);
+                       g_free (error_msg);
+                       return;
+               }
+
                purple_connection_error(sa->pc, 
PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Failed getting Magic T value, 
please try logging in via browser first"));
+
                return;
        }
        
@@ -223,6 +244,60 @@
 }
 
 static void
+skypeweb_login_got_opid(PurpleHttpConnection *http_conn, PurpleHttpResponse 
*response, gpointer user_data)
+{
+       SkypeWebAccount *sa = user_data;
+       const gchar *live_login_url = "https://login.live.com"; 
"/ppsecure/post.srf?wa=wsignin1.0&wp=MBI_SSL&wreply=https%3A%2F%2Flw.skype.com%2Flogin%2Foauth%2Fproxy%3Fsite_name%3Dlw.skype.com";
+       gchar *ppft;
+       gchar *opid;
+       GString *postdata;
+       PurpleHttpRequest *request;
+       int tmplen;
+       const gchar *data;
+       gsize len;
+
+       data = purple_http_response_get_data(response, &len);
+       
+       ppft = skypeweb_string_get_chunk(data, len, ",sFT:'", "',");
+       if (!ppft) {
+               purple_connection_error(sa->pc, 
PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Failed getting PPFT value, 
please try logging in via browser first"));
+               return;
+       }
+       opid = skypeweb_string_get_chunk(data, len, "&opid=", "'");
+       if (!opid) {
+               purple_connection_error(sa->pc, 
PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Failed getting opid value, 
try using 'Alternate Auth Method' settings"));
+               return;
+       }
+       postdata = g_string_new("");
+       g_string_append_printf(postdata, "opid=%s&", purple_url_encode(opid));
+       g_string_append(postdata, "site_name=lw.skype.com&");
+       g_string_append(postdata, "oauthPartner=999&");
+       g_string_append(postdata, "client_id=578134&");
+       g_string_append(postdata, "redirect_uri=https%3A%2F%2Fweb.skype.com&");
+       g_string_append_printf(postdata, "PPFT=%s&", purple_url_encode(ppft));
+       g_string_append(postdata, "type=28&");
+
+       tmplen = postdata->len;
+       if (postdata->len > INT_MAX) tmplen = INT_MAX;
+       
+       request = purple_http_request_new(live_login_url);
+       purple_http_request_set_method(request, "POST");
+       purple_http_request_set_cookie_jar(request, sa->cookie_jar);
+       purple_http_request_header_set(request, "Content-Type", 
"application/x-www-form-urlencoded; charset=UTF-8");
+       purple_http_request_header_set(request, "Accept", "*/*");
+       purple_http_request_set_contents(request, postdata->str, tmplen);
+       purple_http_request(sa->pc, request, skypeweb_login_got_t, sa);
+       purple_http_request_unref(request);
+       
+       g_string_free(postdata, TRUE);
+       
+       g_free(ppft);
+       g_free(opid);
+       
+       purple_connection_update_progress(sa->pc, _("Authenticating"), 2, 4);
+}
+
+static void
 skypeweb_login_got_ppft(PurpleHttpConnection *http_conn, PurpleHttpResponse 
*response, gpointer user_data)
 {
        SkypeWebAccount *sa = user_data;
@@ -265,7 +340,7 @@
        purple_http_request_header_set(request, "Content-Type", 
"application/x-www-form-urlencoded; charset=UTF-8");
        purple_http_request_header_set(request, "Accept", "*/*");
        purple_http_request_set_contents(request, postdata->str, tmplen);
-       purple_http_request(sa->pc, request, skypeweb_login_got_t, sa);
+       purple_http_request(sa->pc, request, skypeweb_login_got_opid, sa);
        purple_http_request_unref(request);
        
        g_string_free(postdata, TRUE);
@@ -332,6 +407,8 @@
        PurpleConnectionError error_type = 
PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
 
        data = purple_http_response_get_data(response, &len);
+       
+       purple_debug_misc("skypeweb", "Full skypetoken response: %s\n", data);
 
        parser = json_parser_new();
        if (!json_parser_load_from_data(parser, data, len, NULL)) {
@@ -374,24 +451,6 @@
        g_free(error);
 }
 
-/* base64(md5(user + "\nskyper\n" + pass)) */
-static gchar *
-skypeweb_skyper_hash(const gchar *username, const gchar *password)
-{
-       guint8 hashed[16];
-       gsize len = sizeof(hashed);
-       GChecksum *gc;
-
-       gc = g_checksum_new(G_CHECKSUM_MD5);
-       g_checksum_update(gc, (guchar *)username, -1);
-       g_checksum_update(gc, (guchar *)"\nskyper\n", -1);
-       g_checksum_update(gc, (guchar *)password, -1);
-       g_checksum_get_digest(gc, hashed, &len);
-       g_checksum_free(gc);
-
-       return purple_base64_encode(hashed, len);
-}
-
 static void
 skypeweb_login_get_api_skypetoken(SkypeWebAccount *sa, const gchar *url, const 
gchar *username, const gchar *password)
 {
@@ -426,7 +485,7 @@
 static void
 skypeweb_login_soap_got_token(SkypeWebAccount *sa, gchar *token)
 {
-       const gchar *login_url = "https://api.skype.com/rps/skypetoken";;
+       const gchar *login_url = "https://edge.skype.com/rps/v1/rps/skypetoken";;
 
        skypeweb_login_get_api_skypetoken(sa, login_url, NULL, token);
 }
@@ -547,19 +606,3 @@
 
        g_free(postdata);
 }
-
-void
-skypeweb_begin_skyper_login(SkypeWebAccount *sa)
-{
-       gchar *hash;
-       const gchar *login_url = "https://api.skype.com/login/skypetoken";;
-       const gchar *username = purple_account_get_username(sa->account);
-
-       hash = skypeweb_skyper_hash(username, 
purple_connection_get_password(sa->pc));
-
-       skypeweb_login_get_api_skypetoken(sa, login_url, username, hash);
-
-       purple_connection_update_progress(sa->pc, _("Authenticating"), 2, 4);
-
-       g_free(hash);
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_login.h 
new/skype4pidgin-1.7/skypeweb/skypeweb_login.h
--- old/skype4pidgin-1.5/skypeweb/skypeweb_login.h      2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_login.h      2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,5 @@
 void skypeweb_begin_oauth_login(SkypeWebAccount *sa);
 void skypeweb_refresh_token_login(SkypeWebAccount *sa);
 void skypeweb_begin_soapy_login(SkypeWebAccount *sa);
-void skypeweb_begin_skyper_login(SkypeWebAccount *sa);
 
 #endif /* SKYPEWEB_LOGIN_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_messages.c 
new/skype4pidgin-1.7/skypeweb/skypeweb_messages.c
--- old/skype4pidgin-1.5/skypeweb/skypeweb_messages.c   2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_messages.c   2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -131,6 +131,8 @@
        PurpleConversation *conv = NULL;
        gchar *convname = NULL;
        
+       g_return_if_fail(messagetype != NULL);
+       
        messagetype_parts = g_strsplit(messagetype, "/", -1);
        
        if (json_object_has_member(resource, "clientmessageid"))
@@ -178,7 +180,11 @@
                        PurpleChatUser *cb;
 
                        from = skypeweb_contact_url_to_name(from);
-                       g_return_if_fail(from);
+                       if (from == NULL) {
+                               g_strfreev(messagetype_parts);
+                               g_return_if_reached();
+                               return;
+                       }
 
                        // typing notification text, not personalized because 
of multiple "typing" events
                        if (purple_account_get_bool(sa->account, 
"show-typing-as-text", FALSE)) {
@@ -188,7 +194,7 @@
                                // get last message (first in GList)
                                if (conv && 
g_list_length(purple_conversation_get_message_history(conv))) {
                                        PurpleMessage *last = 
g_list_nth_data(g_list_first(purple_conversation_get_message_history(conv)),0);
-                                       last_message = 
g_strdup(purple_message_get_contents(last));
+                                       last_message = 
purple_message_get_contents(last);
                                }
 
                                // add typing notification to chat
@@ -227,7 +233,11 @@
                        }
                        
                        from = skypeweb_contact_url_to_name(from);
-                       g_return_if_fail(from);
+                       if (from == NULL) {
+                               g_free(messagetype_parts);
+                               g_return_if_reached();
+                               return;
+                       }
                        
                        // Remove typing notification icon w/o 
"show-typing-as-icon" option check.
                        // Hard reset cbflags even if user changed settings 
while someone typing message.
@@ -331,7 +341,10 @@
                        PurpleXmlNode *blob = purple_xmlnode_from_str(content, 
-1);
                        const gchar *uri = purple_xmlnode_get_attrib(blob, 
"url_thumbnail");
                        
-                       skypeweb_download_uri_to_conv(sa, uri, conv, 
composetimestamp);
+                       from = skypeweb_contact_url_to_name(from);
+                       g_return_if_fail(from);
+                       
+                       skypeweb_download_uri_to_conv(sa, uri, conv, 
composetimestamp, from);
                        purple_xmlnode_free(blob);
                } else {
                        purple_debug_warning("skypeweb", "Unhandled thread 
message resource messagetype '%s'\n", messagetype);
@@ -345,7 +358,12 @@
                convname = g_strconcat(skypeweb_user_url_prefix(convbuddyname), 
convbuddyname, NULL);
                
                from = skypeweb_contact_url_to_name(from);
-               g_return_if_fail(from);
+               if (from == NULL) {
+                       g_free(convbuddyname);
+                       g_free(convname);
+                       g_return_if_reached();
+                       return;
+               }
                
                if (g_str_equal(messagetype_parts[0], "Control")) {
                        if (g_str_equal(messagetype_parts[1], "ClearTyping")) {
@@ -418,7 +436,7 @@
                                }
                                
                                conv = PURPLE_CONVERSATION(imconv);
-                               skypeweb_download_uri_to_conv(sa, uri, conv, 
composetimestamp);
+                               skypeweb_download_uri_to_conv(sa, uri, conv, 
composetimestamp, from);
                        }
                        purple_xmlnode_free(blob);
                } else if (g_str_equal(messagetype, 
"RichText/Media_GenericFile")) {
@@ -564,7 +582,7 @@
                                
                                conv = PURPLE_CONVERSATION(imconv);
 
-                               skypeweb_download_moji_to_conv(sa, text, 
url_thumbnail, conv, composetimestamp);
+                               skypeweb_download_moji_to_conv(sa, text, 
url_thumbnail, conv, composetimestamp, from);
 
                                const gchar *message = _("The user sent a 
Moji");
 
@@ -593,7 +611,7 @@
                        gchar *post, *url;
                        
                        url = 
g_strdup_printf("/v1/users/ME/conversations/%s/properties?name=consumptionhorizon",
 purple_url_encode(convname));
-                       post = g_strdup_printf("{\"consumptionhorizon\":\"%s;%" 
G_GINT64_FORMAT ";%s\"}", id, skypeweb_get_js_time(), id);
+                       post = g_strdup_printf("{\"consumptionhorizon\":\"%s;%" 
G_GINT64_FORMAT ";%s\"}", id ? id : "", skypeweb_get_js_time(), id ? id : "");
                        
                        skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | 
SKYPEWEB_METHOD_SSL, sa->messages_host, url, post, NULL, NULL, TRUE);
                        
@@ -666,7 +684,7 @@
                                        case 1:  //SkypeWeb
                                                break;
                                        default:
-                                               
purple_debug_warning("skypeweb", "Unknown typ %d: %s\n", typ, skypeNameVersion);
+                                               
purple_debug_warning("skypeweb", "Unknown typ %d: %s\n", typ, skypeNameVersion 
? skypeNameVersion : "");
                                                break;
                                }
                        }
@@ -681,8 +699,8 @@
        skypeweb_poll(sa);
        
        // If no response within 3 minutes, assume connection lost and try again
-       purple_timeout_remove(sa->watchdog_timeout);
-       sa->watchdog_timeout = purple_timeout_add_seconds(3 * 60, 
skypeweb_timeout, sa);
+       g_source_remove(sa->watchdog_timeout);
+       sa->watchdog_timeout = g_timeout_add_seconds(3 * 60, skypeweb_timeout, 
sa);
        
        return FALSE;
 }
@@ -720,19 +738,19 @@
                                const gchar *resourceType = 
json_object_get_string_member(message, "resourceType");
                                JsonObject *resource = 
json_object_get_object_member(message, "resource");
                                
-                               if (g_str_equal(resourceType, "NewMessage"))
+                               if (purple_strequal(resourceType, "NewMessage"))
                                {
                                        process_message_resource(sa, resource);
-                               } else if (g_str_equal(resourceType, 
"UserPresence"))
+                               } else if (purple_strequal(resourceType, 
"UserPresence"))
                                {
                                        process_userpresence_resource(sa, 
resource);
-                               } else if (g_str_equal(resourceType, 
"EndpointPresence"))
+                               } else if (purple_strequal(resourceType, 
"EndpointPresence"))
                                {
                                        process_endpointpresence_resource(sa, 
resource);
-                               } else if (g_str_equal(resourceType, 
"ConversationUpdate"))
+                               } else if (purple_strequal(resourceType, 
"ConversationUpdate"))
                                {
                                        process_conversation_resource(sa, 
resource);
-                               } else if (g_str_equal(resourceType, 
"ThreadUpdate"))
+                               } else if (purple_strequal(resourceType, 
"ThreadUpdate"))
                                {
                                        process_thread_resource(sa, resource);
                                }
@@ -755,7 +773,7 @@
        }
        
        if (!purple_connection_is_disconnecting(sa->pc)) {
-               sa->poll_timeout = purple_timeout_add_seconds(1, 
skypeweb_timeout, sa);
+               sa->poll_timeout = g_timeout_add_seconds(1, skypeweb_timeout, 
sa);
        }
 }
 
@@ -772,7 +790,7 @@
        if (!PURPLE_CONNECTION_IS_CONNECTED(pc))
                return;
        
-       if 
(g_strcmp0(purple_protocol_get_id(purple_connection_get_protocol(pc)), 
SKYPEWEB_PLUGIN_ID))
+       if 
(!purple_strequal(purple_protocol_get_id(purple_connection_get_protocol(pc)), 
SKYPEWEB_PLUGIN_ID))
                return;
        
        if (type == PURPLE_CONVERSATION_UPDATE_UNSEEN) {
@@ -1028,6 +1046,38 @@
        g_free(url);
 }
 
+static void
+skypeweb_got_contact_status(SkypeWebAccount *sa, JsonNode *node, gpointer 
user_data)
+{
+       JsonObject *obj = json_node_get_object(node);
+       JsonArray *responses = json_object_get_array_member(obj, "Responses");
+       
+       if (responses != NULL) {
+               guint length = json_array_get_length(responses);
+               gint index;
+               for(index = length - 1; index >= 0; index--)
+               {
+                       JsonObject *response = 
json_array_get_object_element(responses, index);
+                       JsonObject *payload = 
json_object_get_object_member(response, "Payload");
+                       process_userpresence_resource(sa, payload);
+               }
+       }
+}
+
+static void
+skypeweb_lookup_contact_status(SkypeWebAccount *sa, const gchar *contact)
+{
+       if (contact == NULL) {
+               return;
+       }
+       
+       // Allowed to be up to 10 at once
+       gchar *url = 
g_strdup_printf("/v1/users/ME/contacts/ALL/presenceDocs/messagingService?cMri=%s%s",
 skypeweb_user_url_prefix(contact), purple_url_encode(contact));
+       skypeweb_post_or_get(sa, SKYPEWEB_METHOD_GET | SKYPEWEB_METHOD_SSL, 
sa->messages_host, url, NULL, skypeweb_got_contact_status, NULL, TRUE);
+       
+       g_free(url);
+}
+
 void
 skypeweb_subscribe_to_contact_status(SkypeWebAccount *sa, GSList *contacts)
 {
@@ -1044,6 +1094,12 @@
        obj = json_object_new();
        contacts_array = json_array_new();
        
+       JsonArray *interested = json_array_new();
+       json_array_add_string_element(interested, 
"/v1/users/ME/conversations/ALL/properties");
+       json_array_add_string_element(interested, 
"/v1/users/ME/conversations/ALL/messages");
+       json_array_add_string_element(interested, "/v1/users/ME/contacts/ALL");
+       json_array_add_string_element(interested, "/v1/threads/ALL");
+       
        do {
                JsonObject *contact;
                gchar *id;
@@ -1059,6 +1115,12 @@
                json_object_set_string_member(contact, "id", id);
                json_array_add_object_element(contacts_array, contact);
                
+               if (id && id[0] == '8') {
+                       gchar *contact_url = 
g_strconcat("/v1/users/ME/contacts/", id, NULL);
+                       json_array_add_string_element(interested, contact_url);
+                       g_free(contact_url);
+               }
+               
                g_free(id);
                
                if (count++ >= 100) {
@@ -1084,6 +1146,21 @@
        
        g_free(post);
        json_object_unref(obj);
+       
+       
+       gchar *url = 
g_strdup_printf("/v1/users/ME/endpoints/%s/subscriptions/0?name=interestedResources",
 purple_url_encode(sa->endpoint));
+       
+       obj = json_object_new();
+       json_object_set_array_member(obj, "interestedResources", interested);
+       
+       skypeweb_lookup_contact_status(sa, NULL);
+       post = skypeweb_jsonobj_to_string(obj);
+
+       skypeweb_post_or_get(sa, SKYPEWEB_METHOD_PUT | SKYPEWEB_METHOD_SSL, 
sa->messages_host, url, post, NULL, NULL, TRUE);
+       
+       g_free(url);
+       g_free(post);
+       json_object_unref(obj);
 }
 
 
@@ -1282,7 +1359,7 @@
        if (!PURPLE_CONNECTION_IS_CONNECTED(pc))
                return 0;
        
-       if 
(g_strcmp0(purple_protocol_get_id(purple_connection_get_protocol(pc)), 
SKYPEWEB_PLUGIN_ID))
+       if 
(!purple_strequal(purple_protocol_get_id(purple_connection_get_protocol(pc)), 
SKYPEWEB_PLUGIN_ID))
                return 0;
        
        url = g_strdup_printf("/v1/users/ME/conversations/%s/messages", 
purple_url_encode(purple_conversation_get_name(conv)));
@@ -1480,7 +1557,7 @@
                chatname = 
purple_conversation_get_name(PURPLE_CONVERSATION(chatconv));
                if (!chatname)
                        return -1;
-        }
+               }
 
        skypeweb_send_message(sa, chatname, message);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_messages.h 
new/skype4pidgin-1.7/skypeweb/skypeweb_messages.h
--- old/skype4pidgin-1.5/skypeweb/skypeweb_messages.h   2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_messages.h   2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_util.c 
new/skype4pidgin-1.7/skypeweb/skypeweb_util.c
--- old/skype4pidgin-1.5/skypeweb/skypeweb_util.c       2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_util.c       2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,8 +18,6 @@
  
 #include "skypeweb_util.h"
 
-#include "ciphers/sha256hash.h"
-
 gchar *
 skypeweb_string_get_chunk(const gchar *haystack, gsize len, const gchar 
*start, const gchar *end)
 {
@@ -126,12 +124,13 @@
 char *
 skypeweb_hmac_sha256(char *input)
 {
-       PurpleHash *hash;
+       GChecksum *hash;
        const guchar productKey[] = SKYPEWEB_LOCKANDKEY_SECRET;
        const guchar productID[]  = SKYPEWEB_LOCKANDKEY_APPID;
        const char hexChars[]     = "0123456789abcdef";
        char buf[BUFSIZE];
        unsigned char sha256Hash[32];
+       gsize sha256HashLen = sizeof(sha256Hash);
        unsigned char *newHash;
        unsigned int *sha256Parts;
        unsigned int *chlStringParts;
@@ -143,11 +142,11 @@
        int len;
        int i;
        
-       hash = purple_sha256_hash_new();
-       purple_hash_append(hash, (guchar *)input, strlen(input));
-       purple_hash_append(hash, productKey, sizeof(productKey) - 1);
-       purple_hash_digest(hash, (guchar *)sha256Hash, sizeof(sha256Hash));
-       purple_hash_destroy(hash);
+       hash = g_checksum_new(G_CHECKSUM_SHA256);
+       g_checksum_update(hash, (guchar *)input, strlen(input));
+       g_checksum_update(hash, productKey, sizeof(productKey) - 1);
+       g_checksum_get_digest(hash, (guchar *)sha256Hash, &sha256HashLen);
+       g_checksum_free(hash);
        
        /* Split it into four integers */
        sha256Parts = (unsigned int *)sha256Hash;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/skype4pidgin-1.5/skypeweb/skypeweb_util.h 
new/skype4pidgin-1.7/skypeweb/skypeweb_util.h
--- old/skype4pidgin-1.5/skypeweb/skypeweb_util.h       2018-05-25 
10:46:05.000000000 +0200
+++ new/skype4pidgin-1.7/skypeweb/skypeweb_util.h       2020-08-25 
10:20:25.000000000 +0200
@@ -1,6 +1,6 @@
 /*
  * SkypeWeb Plugin for libpurple/Pidgin
- * Copyright (c) 2014-2015 Eion Robb    
+ * Copyright (c) 2014-2020 Eion Robb
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by

Reply via email to