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