Hello community, here is the log from the commit of package purple-rocketchat for openSUSE:Factory checked in at 2019-02-27 15:06:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/purple-rocketchat (Old) and /work/SRC/openSUSE:Factory/.purple-rocketchat.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "purple-rocketchat" Wed Feb 27 15:06:21 2019 rev:3 rq:679244 version:0.0+hg20181203 Changes: -------- --- /work/SRC/openSUSE:Factory/purple-rocketchat/purple-rocketchat.changes 2018-08-20 16:19:17.960812201 +0200 +++ /work/SRC/openSUSE:Factory/.purple-rocketchat.new.28833/purple-rocketchat.changes 2019-02-27 15:06:23.954442437 +0100 @@ -1,0 +2,11 @@ +Thu Dec 6 19:26:54 UTC 2018 - [email protected] + +- Update to version 0.0+hg20181203 (changes since 0.0+hg20180817): + * Attempt to add support for "Personal Access Token"s. + * Add support for server path. + * Prevent server path from being NULL, fix default path. + * Fix for messages from unknown channels appearing as one-to-one + IM's. + * Further tweaks to the unknown channels. + +------------------------------------------------------------------- Old: ---- purple-rocketchat-0.0+hg20180817.tar.xz New: ---- purple-rocketchat-0.0+hg20181203.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ purple-rocketchat.spec ++++++ --- /var/tmp/diff_new_pack.g7YFCS/_old 2019-02-27 15:06:25.566441946 +0100 +++ /var/tmp/diff_new_pack.g7YFCS/_new 2019-02-27 15:06:25.570441945 +0100 @@ -12,13 +12,13 @@ # 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/ # %define _name rocketchat Name: purple-rocketchat -Version: 0.0+hg20180817 +Version: 0.0+hg20181203 Release: 0 Summary: RocketChat protocol plugin for libpurple License: GPL-2.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.g7YFCS/_old 2019-02-27 15:06:25.950441829 +0100 +++ /var/tmp/diff_new_pack.g7YFCS/_new 2019-02-27 15:06:25.962441826 +0100 @@ -4,7 +4,7 @@ <param name="url">https://bitbucket.org/EionRobb/purple-rocketchat</param> <param name="filename">purple-rocketchat</param> <param name="versionformat">0.0+hg{date|localdate|shortdate}</param> - <param name="revision">5ca8ade56bd7df2656dec556b96a8bf959b2b714</param> + <param name="revision">49c17757de34ddbb564b475150ad070d7b0ba1cc</param> </service> <service mode="disabled" name="recompress"> <param name="file">*.tar</param> ++++++ purple-rocketchat-0.0+hg20180817.tar.xz -> purple-rocketchat-0.0+hg20181203.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/purple-rocketchat-0.0+hg20180817/README.md new/purple-rocketchat-0.0+hg20181203/README.md --- old/purple-rocketchat-0.0+hg20180817/README.md 2018-08-17 22:36:05.000000000 +0200 +++ new/purple-rocketchat-0.0+hg20181203/README.md 2018-12-02 22:24:27.000000000 +0100 @@ -46,4 +46,7 @@ * Click the "Get List" button: +  * Add the chat to your buddy list -+  \ No newline at end of file ++  + +## Like this plugin? ## +Say "Thanks" by [sending $1](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=PZMBF2QVF69GA) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/purple-rocketchat-0.0+hg20180817/librocketchat.c new/purple-rocketchat-0.0+hg20181203/librocketchat.c --- old/purple-rocketchat-0.0+hg20180817/librocketchat.c 2018-08-17 22:36:05.000000000 +0200 +++ new/purple-rocketchat-0.0+hg20181203/librocketchat.c 2018-12-02 22:24:27.000000000 +0100 @@ -250,12 +250,14 @@ gchar *session_token; gchar *channel; gchar *self_user; + gchar *self_user_id; gint64 last_message_timestamp; gint64 last_load_last_message_timestamp; gchar *username; gchar *server; + gchar *path; PurpleSslConnection *websocket; gboolean websocket_header_received; @@ -915,7 +917,7 @@ return; } - if (ya->session_token != NULL && ya->self_user != NULL) { + if (ya->session_token && *ya->session_token && ya->self_user != NULL) { // Resubscribe if we're reestablishing a session rc_account_connected(ya, NULL, NULL, NULL); } @@ -929,6 +931,39 @@ } static void +rc_got_available_channels(RocketChatAccount *ya, JsonNode *node, gpointer user_data, JsonObject *error) +{ + //a["{\"msg\":\"result\",\"id\":\"21\",\"result\":{\"results\":[{\"_id\":\"GENERAL\",\"ts\":{\"$date\":1452986191014},\"name\":\"general\",\"topic\":\"This is a place for discussing open stuff in general. \",\"usersCount\":133},{\"_id\":\"eDKdsqHvNS8daAuht\",\"name\":\"social\",\"ts\":{\"$date\":1481323183876},\"topic\":\"Mastodon is a go! https://mastodon.nzoss.nz\",\"usersCount\":88},{\"_id\":\"MrmrBzkct44AHR2mm\",\"name\":\"random\",\"ts\":{\"$date\":1494728486364},\"usersCount\":83},{\"_id\":\"RBon2Y8FvbM6ekSK4\",\"name\":\"cacophony\",\"ts\":{\"$date\":1504150149829},\"usersCount\":23},{\"_id\":\"EqssvQgYZ9HEFsJ7g\",\"name\":\"technical\",\"ts\":{\"$date\":1455571771183},\"usersCount\":15},{\"_id\":\"GzxgcmSRcCoSg3tmJ\",\"name\":\"meetupchch\",\"ts\":{\"$date\":1459925099523},\"usersCount\":10},{\"_id\":\"eeiXN389SQY9Zfxsr\",\"name\":\"education\",\"ts\":{\"$date\":1481674049811},\"usersCount\":10},{\"_id\":\"DprfYgDrFE3smzgLh\",\"name\":\"constitution\",\"ts\":{\"$date\":1530834056707},\"topic\":\"NZOSS Constitution Reboot\",\"usersCount\":9},{\"_id\":\"4o3kKcoh6JXDvKm2a\",\"name\":\"openhardware\",\"ts\":{\"$date\":1480623613032},\"usersCount\":8},{\"_id\":\"rzBavTjFG4QyGhacE\",\"name\":\"python\",\"ts\":{\"$date\":1494728119751},\"archived\":true,\"usersCount\":8},{\"_id\":\"ALaF23Thjoff3JHSF\",\"name\":\"opengovt\",\"ts\":{\"$date\":1494728230237},\"usersCount\":6},{\"_id\":\"3AXn9yFRELQiuFezB\",\"name\":\"opengis\",\"ts\":{\"$date\":1494728257761},\"usersCount\":5},{\"_id\":\"C4CKsmoxK9dKKqDb3\",\"name\":\"wossat\",\"ts\":{\"$date\":1519946805422},\"usersCount\":5},{\"_id\":\"wdLQs8W84zug82beC\",\"name\":\"javascript\",\"ts\":{\"$date\":1494728110540},\"archived\":true,\"usersCount\":4},{\"_id\":\"s84SH5mL5844qbdrh\",\"name\":\"opendata\",\"ts\":{\"$date\":1494728221034},\"usersCount\":4},{\"_id\":\"PJiokbJ7mymoiu6we\",\"name\":\"openbusiness\",\"ts\":{\"$date\":1494728465740},\"usersCount\":4},{\"_id\":\"EhrKSwyuR4ZjD2xx3\",\"name\":\"jibberjabber\",\"ts\":{\"$date\":1505082070434},\"usersCount\":4},{\"_id\":\"Fu3uA8cMFvaBi67ji\",\"name\":\"infosec\",\"ts\":{\"$date\":1519595381043},\"usersCount\":4},{\"_id\":\"FbbsdW8kdKkF2gTYz\",\"name\":\"r\",\"ts\":{\"$date\":1494728249585},\"usersCount\":3},{\"_id\":\"HWrmJN4CD2sPH42NM\",\"name\":\"meetupakl\",\"ts\":{\"$date\":1494728288813},\"usersCount\":3},{\"_id\":\"ENvJ2XWgorCMrNvxs\",\"name\":\"openphilosophy\",\"ts\":{\"$date\":1494728475274},\"usersCount\":3},{\"_id\":\"Ko5jBjfdFDpY6m4TY\",\"name\":\"support\",\"ts\":{\"$date\":1501634583459},\"usersCount\":3},{\"_id\":\"WuPdbAKoLrxL26efT\",\"name\":\"fab.city\",\"ts\":{\"$date\":1517261907226},\"usersCount\":3}],\"total\":30}}"] + if (node != NULL) { + JsonObject *result = json_node_get_object(node); + JsonArray *results = json_object_get_array_member(result, "results"); + gint i, len = json_array_get_length(results); + + for (i = 0; i < len; i++) { + JsonObject *room_info = json_array_get_object_element(results, i); + + const gchar *room_id = json_object_get_string_member(room_info, "_id"); + const gchar *topic = json_object_get_string_member(room_info, "topic"); + const gchar *room_name = json_object_get_string_member(room_info, "name"); + PurpleChatConversation *chatconv = purple_conversations_find_chat_with_account(room_name, ya->account); + + if (chatconv == NULL) { + chatconv = purple_conversations_find_chat_with_account(room_id, ya->account); + } + + if (chatconv != NULL && topic != NULL) { + gchar *html_topic = rc_markdown_to_html(topic); + purple_chat_conversation_set_topic(chatconv, NULL, html_topic); + g_free(html_topic); + } + + g_hash_table_replace(ya->group_chats, g_strdup(room_id), g_strdup(room_name)); + g_hash_table_replace(ya->group_chats_rev, g_strdup(room_name), g_strdup(room_id)); + } + } +} + +static void rc_got_open_rooms(RocketChatAccount *ya, JsonNode *node, gpointer user_data, JsonObject *error) { //a["{\"msg\":\"result\",\"id\":\"9\",\"result\":{\"update\":[{\"_id\":\"GENERAL\",\"name\":\"general\",\"t\":\"c\",\"topic\":\"Community support in [#support](https://demo.rocket.chat/channel/support). Developers in [#dev](https://demo.rocket.chat/channel/dev)\",\"muted\":[\"daly\",\"kkloggg\",\"staci.holmes.segarra\"],\"jitsiTimeout\":{\"$date\":1476781304981},\"default\":true},{\"_id\":\"YdpayxcMhWFGKRZb3hZKg86uJavE6jYLya\",\"t\":\"d\"},{\"_id\":\"hZKg86uJavE6jYLyavxiySsLD8gLjgnmnN\",\"t\":\"d\"},{\"_id\":\"2urrp3DyDkLxoMAd3hZKg86uJavE6jYLya\",\"t\":\"d\"},{\"_id\":\"QFhAaDzea7cFK6ChB\",\"name\":\"test-private\",\"t\":\"p\",\"u\":{\"_id\":null,\"username\":null},\"ro\":false},{\"_id\":\"b98BYkRbiD5swDfyY\",\"name\":\"dev\",\"t\":\"c\",\"u\":{\"_id\":\"yhHvK7uhhXh9DqKWH\",\"username\":\"diego.sampaio\"},\"topic\":\"Community and core devs hangout. Learn code in [#learn](https://demo.rocket.chat/channel/learn). Get support in [#support](https://demo.rocket.chat/channel/support)\",\"muted\":[\"geektest123\"],\"jitsiTimeout\":{\"$date\":1465876457842}},{\"_id\":\"JoxbibGnXizRb4ef4hZKg86uJavE6jYLya\",\"t\":\"d\"}],\"remove\":[{\"_id\":\"8cXLWPathApTRXHZZ\",\"_deletedAt\":{\"$date\":1477179315230}}]}}"] @@ -944,9 +979,10 @@ if (room_type && *room_type != 'd') { const gchar *topic = json_object_get_string_member(room_info, "topic"); const gchar *room_name = json_object_get_string_member(room_info, "name"); + const gchar *room_id = json_object_get_string_member(room_info, "_id"); PurpleChatConversation *chatconv = purple_conversations_find_chat_with_account(room_name, ya->account); + if (chatconv == NULL) { - const gchar *room_id = json_object_get_string_member(room_info, "_id"); chatconv = purple_conversations_find_chat_with_account(room_id, ya->account); } @@ -955,6 +991,9 @@ purple_chat_conversation_set_topic(chatconv, NULL, html_topic); g_free(html_topic); } + + g_hash_table_replace(ya->group_chats, g_strdup(room_id), g_strdup(room_name)); + g_hash_table_replace(ya->group_chats_rev, g_strdup(room_name), g_strdup(room_id)); } } } @@ -1041,7 +1080,7 @@ rc_socket_write_json(ya, data); - //Fetch all known rooms + //Fetch all known rooms - deprecated since 0.72 //["{\"msg\":\"method\",\"method\":\"rooms/get\",\"params\":[{\"$date\":0}],\"id\":\"6\"}"] data = json_object_new(); params = json_array_new(); @@ -1057,6 +1096,28 @@ rc_socket_write_json(ya, data); + //Fetch all known rooms + //["{\"msg\":\"method\",\"method\":\"browseChannels\",\"params\":[{\"text\":\"\",\"type\":\"channels\",\"sortBy\":\"usersCount\",\"sortDirection\":\"desc\",\"limit\":23,\"page\":0}],\"id\":\"21\"}"] + data = json_object_new(); + params = json_array_new(); + + date = json_object_new(); + json_object_set_string_member(date, "text", ""); + json_object_set_string_member(date, "type", "channels"); + json_object_set_string_member(date, "sortBy", "usersCount"); + json_object_set_string_member(date, "sortDirection", "desc"); + json_object_set_int_member(date, "limit", 500); + json_object_set_int_member(date, "page", 0); + json_array_add_object_element(params, date); + + json_object_set_string_member(data, "msg", "method"); + json_object_set_string_member(data, "method", "browseChannels"); + json_object_set_array_member(data, "params", params); + json_object_set_string_member(data, "id", rc_get_next_id_str_callback(ya, rc_got_available_channels, NULL)); + + rc_socket_write_json(ya, data); + + purple_connection_set_state(ya->pc, PURPLE_CONNECTION_CONNECTED); } @@ -1115,11 +1176,12 @@ const gchar *rid = json_object_get_string_member(message_obj, "rid"); const gchar *t = json_object_get_string_member(message_obj, "t"); const gchar *username = json_object_get_string_member(u, "username"); + const gchar *user_id = json_object_get_string_member(u, "_id"); const gchar *roomType = json_object_get_string_member(roomarg, "roomType"); const gchar *room_name = g_hash_table_lookup(ya->group_chats, rid); gint64 sdate = json_object_get_int_member(ts, "$date"); gint64 timestamp = sdate / 1000; - PurpleMessageFlags msg_flags = (purple_strequal(username, ya->self_user) ? PURPLE_MESSAGE_SEND : PURPLE_MESSAGE_RECV); + PurpleMessageFlags msg_flags = (purple_strequal(username, ya->self_user) || purple_strequal(user_id, ya->self_user_id) ? PURPLE_MESSAGE_SEND : PURPLE_MESSAGE_RECV); if (purple_strequal(t, "uj")) { PurpleChatConversation *chatconv = purple_conversations_find_chat_with_account(room_name, ya->account); @@ -1246,7 +1308,7 @@ const gchar *title_link = json_object_get_string_member(attachment, "title_link"); if (title != NULL && title_link != NULL) { - gchar *temp_message = g_strdup_printf("%s <a href=\"https://%s%s\">%s</a>", (message ? message : ""), ya->server, title_link, title); + gchar *temp_message = g_strdup_printf("%s <a href=\"https://%s%s%s\">%s</a>", (message ? message : ""), ya->server, ya->path, title_link, title); g_free(message); message = temp_message; } @@ -1548,7 +1610,7 @@ JsonObject *password = json_object_new(); gchar *digest; - if (ya->session_token) { + if (ya->session_token && *ya->session_token) { // Continue an existing session json_object_set_string_member(param, "resume", ya->session_token); } else { @@ -1643,7 +1705,7 @@ g_hash_table_replace(ya->usernames_to_ids, g_strdup(username), g_strdup(user_id)); g_hash_table_replace(ya->ids_to_usernames, g_strdup(user_id), g_strdup(username)); - if (!ya->self_user) { + if (!ya->self_user || purple_strequal(user_id, ya->self_user_id)) { // The first user added to the collection is us ya->self_user = g_strdup(username); @@ -1903,21 +1965,45 @@ if (userparts[0] == NULL || userparts[1] == NULL) { purple_connection_error(pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, "No username/server supplied"); + + g_strfreev(userparts); return; } purple_connection_set_display_name(pc, userparts[0]); ya->username = g_strdup(userparts[0]); ya->server = g_strdup(userparts[1]); + ya->path = g_strdup(purple_account_get_string(account, "server_path", "")); g_strfreev(userparts); + + ya->session_token = g_strdup(purple_account_get_string(account, "personal_access_token", NULL)); + if (ya->session_token && *ya->session_token) { + const gchar *user_id = purple_account_get_string(account, "personal_access_token_user_id", NULL); + + if (!user_id || !*user_id) { + purple_connection_error(pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, "Both the 'Personal Access Token' and 'User ID' fields should be filled out but the 'User ID' is missing."); + return; + } + + ya->self_user_id = g_strdup(user_id); + + //Is this valid? - No, usernames on the serverside can be different to usernames on the client side + //g_hash_table_replace(ya->usernames_to_ids, g_strdup(ya->username), g_strdup(user_id)); + //g_hash_table_replace(ya->ids_to_usernames, g_strdup(user_id), g_strdup(ya->username)); + + } else { + g_free(ya->session_token); + ya->session_token = NULL; + } + purple_connection_set_state(pc, PURPLE_CONNECTION_CONNECTING); //Build the initial hash tables from the current buddy list rc_build_groups_from_blist(ya); //TODO do something with this callback to make sure it's actually a rocket.chat server - url = g_strconcat("https://", ya->server, "/api/info", NULL); + url = g_strconcat("https://", ya->server, ya->path, "/api/info", NULL); rc_fetch_url(ya, url, NULL, NULL, NULL); g_free(url); @@ -1977,10 +2063,12 @@ g_hash_table_destroy(ya->cookie_table); ya->cookie_table = NULL; g_free(ya->username); ya->username = NULL; g_free(ya->server); ya->server = NULL; + g_free(ya->path); ya->path = NULL; g_free(ya->frame); ya->frame = NULL; g_free(ya->session_token); ya->session_token = NULL; g_free(ya->channel); ya->channel = NULL; g_free(ya->self_user); ya->self_user = NULL; + g_free(ya->self_user_id); ya->self_user_id = NULL; g_free(ya); } @@ -2300,7 +2388,7 @@ purple_ssl_input_add(ya->websocket, rc_socket_got_data, ya); - g_string_append_printf(url, "/sockjs/%d/pidgin%d/websocket", g_random_int_range(100, 999), g_random_int_range(1, 100)); + g_string_append_printf(url, "%s/sockjs/%d/pidgin%d/websocket", ya->path, g_random_int_range(100, 999), g_random_int_range(1, 100)); cookies = rc_cookies_to_string(ya); websocket_header = g_strdup_printf("GET %s HTTP/1.1\r\n" @@ -3286,7 +3374,7 @@ //avatar at https://{server}/avatar/{username}.jpg?_dc=0 - avatar_url = g_strdup_printf("https://%s/avatar/%s.jpg?_dc=0", ya->server, purple_url_encode(buddy_name)); + avatar_url = g_strdup_printf("https://%s%s/avatar/%s.jpg?_dc=0", ya->server, ya->path, purple_url_encode(buddy_name)); rc_fetch_url(ya, avatar_url, NULL, rc_got_avatar, buddy); g_free(avatar_url); @@ -3341,6 +3429,14 @@ option = purple_account_option_bool_new(N_("Auto-add buddies to the buddy list"), "auto-add-buddy", FALSE); account_options = g_list_append(account_options, option); + option = purple_account_option_string_new(N_("Personal Access Token"), "personal_access_token", ""); + account_options = g_list_append(account_options, option); + + option = purple_account_option_string_new(N_("Personal Access Token - User ID"), "personal_access_token_user_id", ""); + account_options = g_list_append(account_options, option); + + option = purple_account_option_string_new(N_("Server Path"), "server_path", ""); + account_options = g_list_append(account_options, option); return account_options; }
