GithubHelp home page GithubHelp logo

purple-matrix's Introduction

purple-matrix #purple on matrix.org

This project is a plugin for libpurple which adds the ability to communicate with matrix.org homeservers to any libpurple-based clients (such as Pidgin).

If you want to bridge the other way, using a matrix client to communicate with any backend supported by libpurple, see matrix-bifröst.

Update 2022/04/11

This project is essentially unmaintained. It may still work for you, in which case good luck to you; however, it lacks many important features that are critical to a modern Matrix client (not least of which is end-to-end encryption support).

Status

This project is somewhat alpha, and only basic functionality has been implemented. Sending and receiving simple text messages is supported, as is joining rooms you are invited to by other users.

The following are not yet supported:

  • Creating new rooms (and one-to-one chats)
  • Presence indication
  • Typing indication
  • Videos/rich text in messages
  • Account registration
  • Room topics
  • Voice/video calling

The following are in progress:

The plugin requires a matrix homeserver supporting client-server API r0.0.0 Synapse v0.12.0-rc1 or later is sufficient.

Installation

Pre-built binaries are available for Ubuntu since version 17.04 (Zesty Zapus). You should be able to install them giving the following commands in a terminal window:

sudo apt update
sudo apt install purple-matrix

For other GNU/Linux systems the plugin needs to be built from source.

You will need development headers/libraries for the following:

  • libpurple 2.x [libpurple-dev]
  • libjson-glib [libjson-glib-dev]
  • libglib [libglib-dev (or libglib2.0-dev on Ubuntu 16.04 xenial)]
  • libhttp_parser [libhttp-parser-dev].
  • sqlite3 [libsqlite3-dev]
  • libolm [libolm-dev] (if not available, compile with make MATRIX_NO_E2E=1)
  • libgcrypt [libgcrypt20-dev] (if not available, compile with make MATRIX_NO_E2E=1)

You should then be able to:

make
sudo make install

If you do not have root access, you can simply copy libmatrix.so into ~/.purple/plugins.

You will then need to restart Pidgin, after which you should be able to add a 'Matrix' account.

Building on Windows

Set up a build environment using the Pidgin BuildingWinPidgin docs

You should then be able to:

make -f Makefile.mingw
make -f Makefile.mingw install

You will then need to restart Pidgin, after which you should be able to add a 'Matrix' account.

Usage

  • Open the 'Manage accounts' dialog (under the 'Accounts' menu) and click 'Add'.
  • If the plugin was loaded successfully, you will be able to select 'Matrix' from the 'Protocol' dropdown.
  • Enter your matrix ID on the homeserver (e.g. '@bob:matrix.org' or 'bob') as the 'username', and the password in the 'password' field.
    • If you don't enter your password, you'll be prompted for it when you try to connect; this won't get saved unless you click 'save password' but an access token is stored instead.
  • On the 'Advanced' tab, enter the URL of your homeserver.

The Advanced account option 'On reconnect, skip messages which were received in a previous session' is disabled by default. This means that pidgin will show the last few messages for each room each time it starts. If this option is enabled, only new messages will be shown.

purple-matrix's People

Contributors

aaronraimist avatar adabru avatar ara4n avatar aveao avatar brycied00d avatar eionrobb avatar gojun077 avatar iv4nhoe avatar jannisteunissen avatar penguin42 avatar radiocane avatar richvdh avatar steils avatar teleshoes avatar vmiklos avatar vn971 avatar zamaudio avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

purple-matrix's Issues

glib json empty string bug: 'invalid response from homeserver'

(This is a placeholder for anyone else unfortunate enough to hit it)
We're suffering from json-glib bug https://bugzilla.gnome.org/show_bug.cgi?id=747279
Where it doesn't like empty keys in objects, but that's valid json and on a really bad day Matrix can generate it.
The case I've seen is a bogus read receipt for an empty event name - matrix doesn't bother sanity checking the event name (nothing in the spec says it should).

If you're stuck then you can try the following gratuitously horrible unsafe hack that seems to work:

Author: Dr. David Alan Gilbert <[email protected]>
Date:   Sun Feb 19 17:46:19 2017 +0000

    Hack to work around json-glib parser bug

diff --git a/matrix-api.c b/matrix-api.c
index d7b772c..4b39086 100644
--- a/matrix-api.c
+++ b/matrix-api.c
@@ -215,6 +215,27 @@ static int _handle_body(http_parser *http_parser, const char *at,
                 (int)length, at);
 
     if(strcmp(response_data->content_type, "application/json") == 0) {
+        char *empty_string_key = strstr(at,"\"\":");
+        if (empty_string_key) {
+            /* Work around json glib bug 747279 - it doesn't like empty constant strings - rather unsafe hack - and not freeing and only coping with one
+            */
+            char *at2 = g_malloc(strlen(at)+2);
+            char *atptr;
+            size_t len = empty_string_key - at;
+            //fprintf(stderr, "Bad string: %s\n", at);
+            //fprintf(stderr, "Bad key: %s\n", empty_string_key);
+            memcpy(at2, at, len);
+            atptr = at2+len;
+            *(atptr++) = '"';
+            *(atptr++) = '!';
+            *(atptr++) = '"';
+            *(atptr++) = ':';
+            strcpy(atptr, empty_string_key+3);
+            //fprintf(stderr, "fixed string : %s\n", at2);
+            at=at2;
+            length++;
+        }
+        //fprintf(stderr, "%s: about to parse %s\n", __func__, at);
         if(!json_parser_load_from_data(response_data -> json_parser, at, length,
                 &err)) {
             purple_debug_info("matrixprpl", "unable to parse JSON: %s\n",

[FR] build for pidgin version 3

xgrimx mentioned pidgin version three is coming (though not too fast). I'd be nice if someone would PR support of version 3.

Doesn't play nice with empathy

[viccuad]
mmh, trying purple-matrix, can't join or see rooms (yet I'm correctly connected, or so it says)

[Matthew (@matthew:matrix.org)]
hmmm
with what client?
viccuad: purple-matrix is pretty basic but works well enough for me with pidgin on OSX
(although hasn't been tested in a month or two)

[viccuad]
@matthew:matrix.org: empathy, on Debian Testing

[Matthew (@matthew:matrix.org)]
interesting. so that's going via the telepathy-to-libpurple bridge thingy?
we've only tested it against pidgin, so wouldn't be surprised if we've buggered something up

[viccuad]
uuh, I have no idea. I suppose

[Matthew (@matthew:matrix.org)]
bug reports / logs / patches welcome

[viccuad]
FWIW, a libpurple plugin for telegram works fine with empathy

[Matthew (@matthew:matrix.org)]
Matthew (@matthew:matrix.org)
we'll take a look

Unable to connect to ru-matrix.org with pidgin: timeout

I have Pidgin 2.13.0 (libpurple 2.13.0) and purple-matrix commit 33802dc on Arch Linux. Since yesterday, it no longer connects to my account on ru-matrix.org. It just never finishes connecting. No error message, just endless waiting for it to connect. This is not a censorship issue, because VPN does not help, and Riot does connect. Also, pidgin does connect to my other Matrix account (on lor.sh) with or without VPN.

Incompatible with Pidgin <2.11

Hello,

I proceeded as follows:

  1. installed the packages: libpurple-dev libjson-glib-dev libglib2.0-dev libhttp-parser-dev gcc
  2. the compilation was failing and I removed -Werror from Makefile.common
  3. make && sudo make install
  4. started Pidgin but the Matrix protocol is not listed

I checked and libmatrix.so was created and correctly placed in /usr/lib/purple-2

Bitlbee keeps posting connected messages

Every minute or less in bitlbee, the command channel '&bitlbee' keeps posting the following message:

root matrix - Connected

However the plugin doesn't seem to be disconnecting at all, nor is my internet connection unstable or impacting on the connection.
These messages are filling up the command channel and I think it must be some sort of bug

Handling "m.video" messages

Video messages are handled like "text": the filename is shown in the chat window, but the user has no way to get the file.
While trying to implement this functionality, I noted that asking matrix.org for a certain video thumbnail with "GET thumbnail videoID (width height scale)" consistently fails with 404, asking with "GET thumbnail videoID (width height crop)" or without parameters "GET thumbnail videoID" consistentily fails with 500, while asking with "GET download video_thumbnailID" works.
I'd like, in my _handle_incoming_video (shamelessly copied from _handle_incoming_image) to deal with this situation: after "fetch_data = matrix_api_download_thumb(...)" returns, I'd like to check the http response code or anything inside fetch_data which could tell me if everything went fine or not.
I've checked how the http response code is extracted in matrix_api_complete, it looks complicated so I suppose that's not the best way to do my check.
Do you have any suggestion on where to look inside fetch_data to know if the request went well?

Messages sent while offline not automatically retrieved

My ISP had an outage today, and when service was restored, messages I'd sent and received on Matrix did not appear automatically; I had to manually disable and re-enable the account to make Pidgin fetch recent messages. I'm using Pidgin 2.10.12, and purple-matrix built from commit ca2f214 (latest at time of writing).

SIGABRT in matrix_e2e_handle_sync_key_counts

Could be a duplicate of #95.

Thread 1 (Thread 0x7ff7ebee1c80 (LWP 4896)):
#0  0x00007ff7ed3aaeb5 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
        set = {__val = {1024, 140737052832848, 140702815290368, 140702813887336, 32, 356482285568, 1, 206158430216, 140737052832784, 140737052832576, 18446744073709551615, 206158430216, 140737052832784, 140737052832592, 140701652429648, 140698833649749}}
        pid = <optimized out>
        tid = <optimized out>
#1  0x00007ff7ed395895 in __GI_abort () at abort.c:79
        save_stage = 1
        act = {__sigaction_handler = {sa_handler = 0x7fffe60a6ec4, sa_sigaction = 0x7fffe60a6ec4}, sa_mask = {__val = {502, 140702815307424, 94769428710544, 140702815290176, 502, 502, 140702813980190, 94769469947840, 140702815307424, 94769428710544, 502, 140702815290176, 94769454520512, 7598263483120643695, 140702813932099, 368}}, sa_flags = 0, sa_restorer = 0x56313b476030}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x0000563138d95d40 in sighandler (sig=<optimized out>) at gtkmain.c:179
        written = <optimized out>
#3  0x0000563138d95d40 in sighandler (sig=<optimized out>) at gtkmain.c:162
        written = <optimized out>
#4  0x00007ff7ed54de70 in <signal handler called> () at /lib64/libpthread.so.0
#5  0x00007ff7e4e57675 in matrix_e2e_handle_sync_key_counts (pc=<optimized out>, count_object=0x7ff7a8032b50, force_send=0) at matrix-e2e.c:937
        need_to_send = 0
        valid_counts = 0
        conn = 0x697274616d3a6e6f
        max_keys = <optimized out>
        to_create = <optimized out>
        __func__ = "matrix_e2e_handle_sync_key_counts"
#6  0x00007ff7e4e5577f in matrix_api_complete (url_data=<optimized out>, user_data=0x56313b476030, ret_data=<optimized out>, ret_len=<optimized out>, error_message=0x0) at matrix-api.c:330
        data = 0x56313b476030
        response_data = 0x56313b97d180
        response_code = 200
        root = 0x56313bac18c0
#7  0x00007ff7eda77ca5 in url_fetch_recv_cb (url_data=0x56313cb62600, source=<optimized out>, cond=<optimized out>) at util.c:3996
        gfud = 0x56313cb62600
        len = <optimized out>
        buf = "\nCache-Control: no-store, must-revalidate, no-cache\r\nPragma: no-cache\r\nContent-Length: 553\r\nContent-Type: application/json; charset=utf-8\r\nContent-Encoding: gzip\r\nX-Content-Type-Options: nosniff\r\n\000\000\000\000"...
        data_cursor = <optimized out>
        got_eof = <optimized out>
        __func__ = "url_fetch_recv_cb"
#8  0x0000563138d7cb86 in pidgin_io_invoke (source=<optimized out>, condition=<optimized out>, data=0x56313b9438d0) at gtkeventloop.c:73
        closure = 0x56313b9438d0
        purple_cond = PURPLE_INPUT_READ
#9  0x00007ff7ed6f1edd in g_main_dispatch (context=0x56313a2266e0) at ../glib/gmain.c:3189
        dispatch = <optimized out>
        prev_source = 0x0
        was_in_call = <optimized out>
        user_data = 0x56313b9438d0
        callback = 0x563138d7cb50 <pidgin_io_invoke>
        cb_funcs = 0x7ff7ed7c4280 <g_source_callback_funcs>
        cb_data = 0x56313bc5a220
        need_destroy = <optimized out>
        source = 0x56313be242e0
        current = 0x56313a4507b0
        i = 0
        __FUNCTION__ = "g_main_dispatch"
#10 0x00007ff7ed6f1edd in g_main_context_dispatch (context=context@entry=0x56313a2266e0) at ../glib/gmain.c:3854
#11 0x00007ff7ed6f2270 in g_main_context_iterate (context=0x56313a2266e0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:3927
        max_priority = 2147483647
        timeout = 2134
        some_ready = 1
        nfds = <optimized out>
        allocated_nfds = <optimized out>
        fds = 0x56313bafcea0
#12 0x00007ff7ed6f25a3 in g_main_loop_run (loop=0x56313b55f4e0) at ../glib/gmain.c:4123
        __FUNCTION__ = "g_main_loop_run"
#13 0x00007ff7edeee042 in IA__gtk_main () at gtkmain.c:1270
        tmp_list = 0x0
        functions = 0x0
        init = <optimized out>
        loop = 0x56313b55f4e0
#14 0x0000563138d41b50 in main (argc=<optimized out>, argv=<optimized out>) at gtkmain.c:939
        opt_force_online = 0
        opt_help = <optimized out>
        opt_login = 0
        opt_nologin = 0
        opt_version = <optimized out>
        opt_si = <optimized out>
        opt_config_dir_arg = 0x0
        opt_login_arg = 0x0
        opt_session_arg = 0x0
        search_path = <optimized out>
        accounts = <optimized out>
        sig_indx = 1
        sigset = {__val = {91142, 0 <repeats 15 times>}}
        errmsg = '\000' <repeats 1320 times>...
        signal_channel = <optimized out>
        signal_status = <optimized out>
        signal_channel_watcher = 1
        segfault_message_tmp = <optimized out>
        error = 0x0
        opt = <optimized out>
        gui_check = <optimized out>
        debug_enabled = <optimized out>
        migration_failed = 0
        active_accounts = <optimized out>
        long_options = {{name = 0x563138de1cb1 "config", has_arg = 1, flag = 0x0, val = 99}, {name = 0x563138dcff79 "debug", has_arg = 0, flag = 0x0, val = 100}, {name = 0x563138dddcbb "force-online", has_arg = 0, flag = 0x0, val = 102}, {name = 0x563138dd1ac3 "help", has_arg = 0, flag = 0x0, val = 104}, {name = 0x563138dddb65 "login", has_arg = 2, flag = 0x0, val = 108}, {name = 0x563138dddcc8 "multiple", has_arg = 0, flag = 0x0, val = 109}, {name = 0x563138dddcd1 "nologin", has_arg = 0, flag = 0x0, val = 110}, {name = 0x563138de1ca7 "session", has_arg = 1, flag = 0x0, val = 115}, {name = 0x563138dd421d "version", has_arg = 0, flag = 0x0, val = 118}, {name = 0x563138de1cba "display", has_arg = 1, flag = 0x0, val = 68}, {name = 0x563138dde7aa "sync", has_arg = 0, flag = 0x0, val = 83}, {name = 0x0, has_arg = 0, flag = 0x0, val = 0}}

Thread 2 (Thread 0x7ff7da210700 (LWP 4934)):
#0  0x00007ff7ed4633f7 in __GI___poll (fds=0x56313ab6a620, nfds=2, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
        resultvar = 18446744073709551100
        sc_cancel_oldtype = 0
#1  0x00007ff7ed6f21de in g_main_context_poll (priority=<optimized out>, n_fds=2, fds=0x56313ab6a620, timeout=<optimized out>, context=0x56313ad41200) at ../glib/gmain.c:4228
        ret = <optimized out>
        errsv = <optimized out>
        poll_func = 0x7ff7ed701d50 <g_poll>
        max_priority = 2147483647
        timeout = -1
        some_ready = <optimized out>
        nfds = 2
        allocated_nfds = <optimized out>
        fds = 0x56313ab6a620
#2  0x00007ff7ed6f21de in g_main_context_iterate (context=context@entry=0x56313ad41200, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:3922
        max_priority = 2147483647
        timeout = -1
        some_ready = <optimized out>
        nfds = 2
        allocated_nfds = <optimized out>
        fds = 0x56313ab6a620
#3  0x00007ff7ed6f2313 in g_main_context_iteration (context=0x56313ad41200, may_block=may_block@entry=1) at ../glib/gmain.c:3988
        retval = <optimized out>
#4  0x00007ff7ed6f2361 in glib_worker_main (data=<optimized out>) at ../glib/gmain.c:5868
#5  0x00007ff7ed71b4e2 in g_thread_proxy (data=0x56313a76d0f0) at ../glib/gthread.c:805
        thread = 0x56313a76d0f0
        __FUNCTION__ = "g_thread_proxy"
#6  0x00007ff7ed5435a2 in start_thread (arg=<optimized out>) at pthread_create.c:486
        ret = <optimized out>
        pd = <optimized out>
        now = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140702493247232, -8371785846084154035, 140737052834974, 140737052834975, 140737052835120, 140702493244032, 8376349377878478157, 8376320959807802701}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
        not_first_call = <optimized out>
#7  0x00007ff7ed46e163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Thread 3 (Thread 0x7ff7d9a0f700 (LWP 4935)):
#0  0x00007ff7ed4633f7 in __GI___poll (fds=0x56313ab602b0, nfds=3, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
        resultvar = 18446744073709551100
        sc_cancel_oldtype = 0
#1  0x00007ff7ed6f21de in g_main_context_poll (priority=<optimized out>, n_fds=3, fds=0x56313ab602b0, timeout=<optimized out>, context=0x56313a450520) at ../glib/gmain.c:4228
        ret = <optimized out>
        errsv = <optimized out>
        poll_func = 0x7ff7ed701d50 <g_poll>
        max_priority = 2147483647
        timeout = -1
        some_ready = <optimized out>
        nfds = 3
        allocated_nfds = <optimized out>
        fds = 0x56313ab602b0
#2  0x00007ff7ed6f21de in g_main_context_iterate (context=0x56313a450520, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:3922
        max_priority = 2147483647
        timeout = -1
        some_ready = <optimized out>
        nfds = 3
        allocated_nfds = <optimized out>
        fds = 0x56313ab602b0
#3  0x00007ff7ed6f25a3 in g_main_loop_run (loop=0x56313a450610) at ../glib/gmain.c:4123
        __FUNCTION__ = "g_main_loop_run"
#4  0x00007ff7ed252d8a in gdbus_shared_thread_func (user_data=0x56313ad40930) at ../gio/gdbusprivate.c:275
        data = 0x56313ad40930
#5  0x00007ff7ed71b4e2 in g_thread_proxy (data=0x56313a76d190) at ../glib/gthread.c:805
        thread = 0x56313a76d190
        __FUNCTION__ = "g_thread_proxy"
#6  0x00007ff7ed5435a2 in start_thread (arg=<optimized out>) at pthread_create.c:486
        ret = <optimized out>
        pd = <optimized out>
        now = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140702484854528, -8371785846084154035, 140737052835390, 140737052835391, 140737052835536, 140702484851328, 8376346079880465741, 8376320959807802701}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
        not_first_call = <optimized out>
#7  0x00007ff7ed46e163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Thread 4 (Thread 0x7ff7d880d700 (LWP 4948)):
#0  0x00007ff7ed4633f7 in __GI___poll (fds=fds@entry=0x7ff7c80027e0, nfds=nfds@entry=3, timeout=timeout@entry=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
        resultvar = 18446744073709551100
        sc_cancel_oldtype = 0
#1  0x00007ff7d3c36cc6 in poll (__timeout=-1, __nfds=3, __fds=0x7ff7c80027e0) at /usr/include/bits/poll2.h:46
        mutex = 0x56313b58d8a0
        r = <optimized out>
        __func__ = "poll_func"
        __PRETTY_FUNCTION__ = "poll_func"
#2  0x00007ff7d3c36cc6 in poll_func (ufds=0x7ff7c80027e0, nfds=3, timeout=-1, userdata=0x56313b58d8a0) at pulse/thread-mainloop.c:69
        mutex = 0x56313b58d8a0
        r = <optimized out>
        __func__ = "poll_func"
        __PRETTY_FUNCTION__ = "poll_func"
#3  0x00007ff7d3c281f8 in pa_mainloop_poll (m=m@entry=0x56313b589410) at pulse/mainloop.c:824
        __func__ = "pa_mainloop_poll"
        __PRETTY_FUNCTION__ = "pa_mainloop_poll"
#4  0x00007ff7d3c28863 in pa_mainloop_iterate (m=0x56313b589410, block=<optimized out>, retval=0x0) at pulse/mainloop.c:926
        r = 0
        __func__ = "pa_mainloop_iterate"
        __PRETTY_FUNCTION__ = "pa_mainloop_iterate"
#5  0x00007ff7d3c28910 in pa_mainloop_run (m=0x56313b589410, retval=retval@entry=0x0) at pulse/mainloop.c:945
        r = <optimized out>
#6  0x00007ff7d3c36c0d in thread (userdata=0x56313b58d860) at pulse/thread-mainloop.c:100
        m = 0x56313b58d860
        mask = {__val = {18446744067267100671, 18446744073709551615 <repeats 15 times>}}
        prev_mask = {__val = {0, 110448, 140702189092896, 2032, 140702815323920, 140702189117584, 0, 39, 140702189095712, 94769428551280, 140702815449960, 140702817442016, 39, 140702817993792, 140702189095712, 140702813999011}}
        sa = {__sigaction_handler = {sa_handler = 0x0, sa_sigaction = 0x0}, sa_mask = {__val = {0, 94769430707008, 140702390475440, 4097, 0, 0, 0, 0, 140702813999011, 140702189097904, 140702189092992, 140702390473056, 32, 140702189092896, 128, 2032}}, sa_flags = 0, sa_restorer = 0x0}
#7  0x00007ff7d3bd1d0c in internal_thread_func (userdata=0x56313b58da90) at pulsecore/thread-posix.c:81
        t = 0x56313b58da90
        __func__ = "internal_thread_func"
        __PRETTY_FUNCTION__ = "internal_thread_func"
#8  0x00007ff7ed5435a2 in start_thread (arg=<optimized out>) at pthread_create.c:486
        ret = <optimized out>
        pd = <optimized out>
        now = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140702465971968, -8371785846084154035, 140737052836638, 140737052836639, 140737052836640, 140702465968768, 8376343607053045069, 8376320959807802701}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
        not_first_call = <optimized out>
#9  0x00007ff7ed46e163 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Mark the last messages chat members have read

Many of Matrix clients display the user's avatar at the message it has read last. It would be useful to have such a feature in purple-matrix too. Because some other IMs (f. e. Hangouts and modern ICQ) have this feature too I think it would be better to implement such an ability in Pidgin and libpurple themselves first to have a framework that protocol plugins can implement.

Segfault in `matrix_e2e_handle_sync_key_counts`

#0  0x00007fffe7c45532 in matrix_e2e_handle_sync_key_counts (pc=0x55555686f110, count_object=0x55555b228e90, force_send=0) at matrix-e2e.c:937
#1  0x00007fffe7c4570d in key_upload_callback
    (conn=0x555556130d00, user_data=0x0, json_root=0x55555b3a1380, body=0x55555b353e10 "{\"one_time_key_counts\": {\"signed_curve25519\": 300}}", body_len=51, content_type=0x55555b62e750 "application/json") at matrix-e2e.c:989
#2  0x00007fffe7c41381 in matrix_api_complete
    (url_data=0x555556007a00, user_data=0x555557682940, ret_data=0x555558b70940 "HTTP/1.1 200 OK\r\nDate: Thu, 09 May 2019 10:00:28 GMT\r\nContent-Type: application/json\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nSet-Cookie: __cfduid=blahblahblah"..., ret_len=733, error_message=0x0)
    at matrix-api.c:330
#3  0x00007ffff6faec4d in url_fetch_recv_cb (url_data=0x555556007a00, source=<optimized out>, cond=<optimized out>) at ././libpurple/util.c:3996
#4  0x00005555555ca98e in pidgin_io_invoke (source=<optimized out>, condition=<optimized out>, data=0x5555591243e0) at ././pidgin/gtkeventloop.c:73
#5  0x00007ffff7091dd8 in g_main_dispatch (context=0x5555556a06f0) at ../../../glib/gmain.c:3182
#6  0x00007ffff7091dd8 in g_main_context_dispatch (context=context@entry=0x5555556a06f0) at ../../../glib/gmain.c:3847
#7  0x00007ffff70921c8 in g_main_context_iterate (context=0x5555556a06f0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
    at ../../../glib/gmain.c:3920
#8  0x00007ffff70924c2 in g_main_loop_run (loop=0x55555605af30) at ../../../glib/gmain.c:4116
#9  0x00007ffff755b8e7 in gtk_main () at /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0
#10 0x000055555559098b in main (argc=<optimized out>, argv=<optimized out>) at ././pidgin/gtkmain.c:939

Supply Windows DLL as Release

If you have a windows compilation toolchain it would be nice to provide a dll for the current release so a user just hast to copy it.

e2e: Decryption fails

I have a room with myself only. I use two devices: riot.im and purple-matrix built with OLM support. I have verified the purple-matrix device from riot.im. Then I write a message to the room from riot.im and get no message in purple-matrix.

Here are the logs:

(07:04:15) matrixprpl: Syncing room (1)!(...):matrix.org
(07:04:15) matrixprpl: matrix_e2e_handle_sync_key_counts: signed_curve25519: 197
(07:04:15) matrixprpl: Syncing room (2) !(...):matrix.org
(07:04:15) matrixprpl: Got an m.room.encrypted!
(07:04:15) matrixprpl: get_inbound_megolm_session: (riot.im ID)/@steils:matrix.org/(...)/(...): (nil)
(07:04:15) matrixprpl: matrix_e2e_decrypt_room: No Megolm session for (riot.im ID)/@steils:matrix.org/(...)/(...)
(07:04:15) matrixprpl: Failed to decrypt m.room.encrypted(07:04:15) matrixprpl: syncing steils since (...) (full_state=0)
(07:04:15) util: requesting to fetch a URL
(07:04:15) dnsquery: Performing DNS lookup for matrix.org
(07:04:15) dns: Successfully sent DNS request to child 21335
(07:04:16) dns: Got response for 'matrix.org'
(07:04:16) dnsquery: IP resolved for matrix.org
(07:04:16) proxy: Attempting connection to 104.24.207.27
(07:04:16) proxy: Connecting to matrix.org:443 with no proxy
(07:04:16) proxy: Connection in progress
(07:04:16) proxy: Connecting to matrix.org:443.
(07:04:16) proxy: Connected to matrix.org:443.
(07:04:16) nss: SSL version 3.3 using 128-bit AES-GCM with 128-bit AEAD MAC
Server Auth: 2048-bit RSA, Key Exchange: 255-bit ECDHE, Compression: NULL
Cipher Suite Name: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
(07:04:16) nss: subject=CN=dl.matrix.org issuer=CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
(07:04:16) nss: partial certificate chain
(07:04:16) certificate/x509/tls_cached: Starting verify for matrix.org
(07:04:16) certificate/x509/tls_cached: Checking for cached cert...
(07:04:16) certificate/x509/tls_cached: ...Found cached cert
(07:04:16) nss/x509: Loading certificate from /home/stefan/.purple/certificates/x509/tls_peers/matrix.org
(07:04:16) certificate/x509/tls_cached: Peer cert matched cached
(07:04:16) nss/x509: Exporting certificate to /home/stefan/.purple/certificates/x509/tls_peers/matrix.org
(07:04:16) util: Writing file /home/stefan/.purple/certificates/x509/tls_peers/matrix.org
(07:04:16) nss: Trusting CN=dl.matrix.org
(07:04:16) certificate: Successfully verified certificate for matrix.org
(07:04:16) util: request constructed
(07:04:16) util: Response headers: 'HTTP/1.1 200 OK
Date: Sat, 08 Sep 2018 04:02:16 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: close
...

Images give a 404

I'm sometimes getting an image link in the room show with a 404 error message. The same image was shown with riot. I think I've at least seen it work. I also think that the image is really where it's supposed to be. I'm wondering if it's some timing issue.

install : "olm/olm.h: No such file or directory"

On debian 9 with all the dependencies, when i run "make" the command return :

matrix-e2e.c:35:21: fatal error: olm/olm.h: No such file or directory
#include "olm/olm.h"
^
compilation terminated.
Makefile.common:40: recipe for target 'matrix-e2e.o' failed
make: *** [matrix-e2e.o] Error 1

Windows plugin broken due to Cloudflare change

The .dll supplied by @EionRobb isn't working any more because of the change, and all attempts by me to try and build the plugin for Windows have failed since it's a finiky toolchain.

Getting a proper Windows build of this off the ground would be great for the project and lower the barrier of entry to people like me who can't get this to build for Windows.

Group name is not carried over to Bitlbee rooms

Room names in Bitlbee only refer to the Matrix ID of the room and don't carry across the actual name of the room.

As an example, I'm using the Tensor room on matrix.org.
On Riot and in Pidgin, the room is named 'Tensor', but in Bitlbee the room is labelled '#!XHnROiemypymtqlOcQ:matrix.org'.

Full sync response too long?

Hi

It seems like the full_state=1 response on sync can somewhat be too big for libjson to handle. I couldn't connect to my home server for some time. I was always getting the error:

DEBUG connection: Connection error on 0x5572707d2fd0 (reason: 0 description: Invalid response from homeserver)

After debugging the issue, I saw, that the response body was getting cut by libjson-gllib-dev after exactly 32768 bytes:

DEBUG matrixprpl: unable to parse JSON: <data>:1:32769: Parse error: scanner: unterminated string constant
DEBUG matrixprpl: Error (the on_body callback failed) parsing HTTP response HTTP/1.1 200 OK

In the outputted JSON I see the cut:

... Time: 1.153992877","msgtype":"m.text"},"type":"m.room.message"},{"origin_server_ts":1510138341018,"sender":"@username:mys
662b
erver.net","event_id":"$15101383412865wLIkp:myserver.net...

After leaving some rooms, closing some private chats, I could get the full_state=1 sync response under 32kb. I retried to login using purple-matrix and it worked successfully with Pidgin and Bitlbee.

Can the json response of a full_state=1 sync be to big for purple-matrix to handle?

Tested with:

json-glib 1.4.2-1 on Archlinux
libjson-glib-dev 1.2.8-1 on Ubuntu Artful

new cloudflare setup breaks purple plugin

purple doesn't like the new matrix.org setup with cloudflare in front of it.
(Invalid response from homeserver is the error I see).
I'm not sure, but I think it's the chunked transfer encoding that's upsetting it

Outdated room titles: rainbows instead of foxs

Both my pidgin installs are showing rainbows as the magic character around #offtopic when we're currently on foxs.
Others are reporting the same problem
(And some also saying the topic is outdated on rapidly changing rooms).

Make errors on Debian 9

I attempted to build from source on Debian 9. I was able to get the build to happen, but it required a lot of modifications to the Makefile.common and packages not listed in the readme.md

Some of this is due to libraries not being available in debian 9, but most of these are libraries just not being found that are installed. Also let me know if there's a better way, or if perhaps there's a debian 9 package that contains olm.h

I received various file not found errors prompting me to locate those library files and include them directly. And installing libsqlite3-dev, libolm-dev & libgcrypt20-dev

In the end I used these steps to complete the build:

sudo apt install -y libpurple-dev libjson-glib-dev libhttp-parser-dev libglib2.0-dev sqlite3 libsqlite3-dev libgcrypt20-dev

Download and Install libolm2 and libolm2dev, not available in Debian 9, these are from the unstable (sid) repo.

wget http://ftp.us.debian.org/debian/pool/main/o/olm/libolm-dev_2.2.2+git20170526.0fd768e+dfsg-1_amd64.deb
wget http://ftp.us.debian.org/debian/pool/main/o/olm/libolm2_2.2.2+git20170526.0fd768e+dfsg-1_amd64.deb
sudo dpkg -i libolm2_2.2.2+git20170526.0fd768e+dfsg-1_amd64.deb
sudo dpkg -i libolm-dev_2.2.2+git20170526.0fd768e+dfsg-1_amd64.deb

Modify line 9 of Makefile.common to be:
CPPFLAGS += -MMD -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/libpurple -I/usr/include/json-glib-1.0

Clone purple-matrix, make, sudo make install

git clone https://github.com/matrix-org/purple-matrix
cd purple-matrix/
make
sudo make install

messages sent as black text

Having no formatting intended but the messages sent as:

"formatted_body": "<font color="#000000"><body bgcolor="#ffffff">yes, sorry again"

That makes people angry as black is unseen on a black background.

returns to a room left before on connect

Once I leave a room in another client, purple-matrix opens it back on connect.
Then the room appears in Riot (web) with message:

@appservice-irc:matrix.org выгнал вас из IRC Matrix Bridges.
Причина: issued !quit command
Войти повторно
Забыть комнату

IM's create persistant tabs

I am not really sure what proper behaviour is, but this bugs me:

When I IM someone, restart pidgin, it restores the connection into a new tab.

I can't figure out how to get rid of them.

Can't connect with pidgin

When I try and connect, I get some SSL error:

captura de 2018-10-09 15-49-42

Translation: "It has not been possible to connect to matrix.org. SSL connection negotiation has failed."

Here are my settings:

captura de 2018-10-09 15-48-46
captura de 2018-10-09 15-49-04
captura de 2018-10-09 15-49-18

Is there something wrong with them ? Any ideas ?

[Feature Request] End-to-end encryption support

I'm adding this feature request because I don't see end-to-end encryption mentioned among the not-yet-supported features.

Given the distributed nature of Matrix, with messages landing on N possible unknown servers it would be nice to have it.

Pidgin fails to load libmatrix.so if it is built with Olm support

(18:58:15) plugins: probing /usr/lib64/purple-2/libmatrix.so
(18:58:15) plugins: /usr/lib64/purple-2/libmatrix.so is not loadable: undefined symbol: gcry_cipher_close
(18:58:15) matrixprpl: starting up

Adding -lgcrypt to LDLIBS fixed this.

Pidgin 2.12.0, olm 2.3.0, libgcrypt 1.8.3.

Help building

Hey I've been sinking a few hours into trying to build purple-matrix, but I'm having a really difficult time with dependencies (gplugin, libpurple, etc). I'm doing this on macOS which I guess makes things more difficult, but I was hoping to start this thread to get better build docs... Any help would be appreciated.

Crash in matrixprpl_join_chat() when room is NULL

How to reproduce this:

  • Join some Matrix room ("foobar") and open Pidgin
  • Pidgin opens foobar automatically, and it appears on the buddy list.
  • Right click on the room name from the buddy list and select remove.
  • Disconnect the Matrix account (Accounts -> Matrix -> disable)
  • Enable the Matrix account again (Accounts -> Enable account -> Matrix)

At this point pidgin crashes in matrixprpl_join_chat() because g_hash_table_lookup() returns NULL.

Response too long

Error reading from matrix.org: response too long (10485760 bytes limit) in pidgin

[Feature Request] Show Direct Chat as Contact instead of Chat

In pidgin, all matrix chats show up as chat room. I understand there is no difference in matrix between one-to-one chat and group chat, but it will be nice to have one-to-one chat appear as contact, instead of chat room.

One reason for this, chat rooms can't be merged in a meta contact.

Error generating nickname when using Bitlbee

When connected, this warning will pop up occasionally:

Warning: Something went wrong while trying to generate a nickname for contact @[USER HANDLE]:matrix.org on matrix.
This might be a bug in BitlBee, or the result of a faulty nick_format setting. Will use xx467745f7 instead.

Any idea what might be causing this issue?

User ping by username not working

To receive a ping in a matrix room, the other person needs to write your full matrix id (@username:server), unlike in other protocols where the conversation is highlighted when somebody writes your username in the chat room.

Other matrix clients (Riot in particular) allow pinging by username, they actually encourage that by auto-completing it with tab.

purple-matrix randomly disconnects from home server with bitlbee

At times, for no discernible reason, I get the following error in the &bitlbee status channel:

matrix - Error: Error from home server: 500
matrix - Signing off..

There appears to be no internet connection issue or memory issue, but it occurs nonetheless.
Home server is matrix.org

Crash on tab completion

I can (currently) reproducible make it crash when I try to tab complete Matthew. I assume it's because the same name is on the channel 3 times, plus a "matthew".

Build failure: 'old_user_ids' may be used uninitialized

gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o libmatrix.o libmatrix.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-api.o matrix-api.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-connection.o matrix-connection.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-e2e.o matrix-e2e.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-event.o matrix-event.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-json.o matrix-json.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-room.o matrix-room.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-roommembers.o matrix-roommembers.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-statetable.o matrix-statetable.c
gcc -Os -fomit-frame-pointer -I/usr/include/libpurple -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/json-glib-1.0 -pthread  -fPIC -DPIC -Wall -g -O0 -Werror -DPURPLE_PLUGINS  -Os -fomit-frame-pointer -MMD  -c -o matrix-sync.o matrix-sync.c
matrix-room.c: In function '_on_state_update':
matrix-room.c:220:32: error: 'old_user_ids' may be used uninitialized in this function [-Werror=maybe-uninitialized]
         const gchar *user_id = json_array_get_string_element(old_user_ids, i);
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
matrix-room.c:201:16: note: 'old_user_ids' was declared here
     JsonArray *old_user_ids, *new_user_ids;
                ^~~~~~~~~~~~
cc1: all warnings being treated as errors

Don't think it matters, but this is being built on a Musl system.

Invalid response from homeserver

I can not successfully connect to matrix.org
the error is Invalid response from homeserver

The debug log from Debug Window is the following, I see that I get some messages from the server that I have seen before but after that the error occurs.

(10:44:57) util: Response headers: 'HTTP/1.1 200 OK
Date: Thu, 09 Aug 2018 08:44:57 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: close
Set-Cookie: __cfduid=d6064ae6c91e17c94924bfdc3eb269de31533804293; expires=Fri, 09-Aug-19 08:44:53 GMT; path=/; domain=.matrix.org; HttpOnly
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
Cache-Control: no-cache, no-store, must-revalidate
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4478f180595697aa-FRA

'
(10:44:57) matrixprpl: unable to parse JSON: <data>:1:9014: Parse error: scanner: unterminated string constant
(10:44:57) matrixprpl: Error (the on_body callback failed) parsing HTTP response HTTP/1.1 200 OK
Date: Thu, 09 Aug 2018 08:44:57 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: close
Set-Cookie: __cfduid=d6064ae6c91e17c94924bfdc3eb269de31533804293; expires=Fri, 09-Aug-19 08:44:53 GMT; path=/; domain=.matrix.org; HttpOnly
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
Cache-Control: no-cache, no-store, must-revalidate
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4478f180595697aa-FRA

2335
{"next_batch":

here some very long response from the server including old messages that I recognize from other matrix clients.

"type": "m.fully_read"}]}}}, "invite": {}}}
0

(10:44:57) matrixprpl: Handling error: Invalid response from homeserver
(10:44:57) connection: Connection error on 0x557822572850 (reason: 0 description: Invalid response from homeserver)
(10:44:57) account: Disconnecting account johschmitz (0x5578222b0920)
(10:44:57) connection: Disconnecting connection 0x557822572850
(10:44:57) connection: Destroying connection 0x557822572850

Can't join to room

Hello.
When I'm trying to join the room from pidgin (for example #linux-org-ru:matrix.org) And I'm getting error:
Expected RoomID string to start with '!'
screenshot

There is some debug info (pidgin -d)

(15:48:28) dnsquery: Performing DNS lookup for 127.0.0.1
(15:48:28) dnsquery: IP resolved for 127.0.0.1
(15:48:28) proxy: Attempting connection to 127.0.0.1
(15:48:28) proxy: Connecting to matrix.org:443 via 127.0.0.1:555 using SOCKS5
(15:48:28) socks5 proxy: Connection in progress
(15:48:28) socks5 proxy: Connected.
(15:48:28) socks5 proxy: Able to read.
(15:48:28) s5: reallocing from 5 to 8
(15:48:28) s5: reallocing from 8 to 10
(15:48:28) proxy: Connected to matrix.org:443.
(15:48:29) nss: SSL version 3.3 using 128-bit AES-GCM with 128-bit AEAD MAC
Server Auth: 2048-bit RSA, Key Exchange: 256-bit ECDHE, Compression: NULL
Cipher Suite Name: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
(15:48:29) nss: subject=CN=*.matrix.org,OU=Domain Control Validated - RapidSSL(R),OU=See www.rapidssl.com/resources/cps (c)15,OU=GT03516958 issuer=CN=RapidSSL SHA256 CA - G3,O=GeoTrust Inc.,C=US
(15:48:29) nss: partial certificate chain
(15:48:29) certificate/x509/tls_cached: Starting verify for matrix.org
(15:48:29) certificate/x509/tls_cached: Checking for cached cert...
(15:48:29) certificate/x509/tls_cached: ...Found cached cert
(15:48:29) nss/x509: Loading certificate from /home/pussysmasher/.purple/certificates/x509/tls_peers/matrix.org
(15:48:29) certificate/x509/tls_cached: Peer cert matched cached
(15:48:29) nss/x509: Exporting certificate to /home/pussysmasher/.purple/certificates/x509/tls_peers/matrix.org
(15:48:29) util: Writing file /home/pussysmasher/.purple/certificates/x509/tls_peers/matrix.org
(15:48:29) nss: Trusting CN=*.matrix.org,OU=Domain Control Validated - RapidSSL(R),OU=See www.rapidssl.com/resources/cps (c)15,OU=GT03516958
(15:48:29) certificate: Successfully verified certificate for matrix.org
(15:48:29) util: request constructed
(15:48:29) util: Response headers: 'HTTP/1.1 400 Bad Request
Date: Wed, 27 Jan 2016 10:48:21 GMT
Server: Synapse/0.12.0 (b=develop,27b9775)
Content-Length: 74
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Content-Type: application/json
Vary: Accept-Encoding
Connection: close
pidgin -v
Pidgin 2.10.11 (libpurple 2.10.11)

Debian 8 Jessie

Self-messages not appearing in Bitlbee

Meaning: if I send a message on matrix using another device, it's not mirrored over to the corresponding chat in Bitlbee. According to Bitlbee, this should work with a libpurple plugin for a protocol that supports it:

https://wiki.bitlbee.org/SelfMessages

And it does work for several libpurple plugins. But it may require that the libpurple plugin does a little extra work to flag the self-message. Here's a link to some discussion of the implementation of this feature for telegram that might conceivably be helpful:

majn/telegram-purple#382

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.