From 30198fab878b8aed1e8ac87ea6be55ce980544fa Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Tue, 13 Jul 2021 14:53:33 +0100 Subject: [PATCH 1/9] matrix: switch to mautrix-go hopefully this can be used to support end-to-end encryption. --- api.go | 2 +- go.mod | 3 +-- go.sum | 51 ++++++++++++++++++++++++++++++----- matrix.go | 81 ++++++++++++++++++++++++++++--------------------------- 4 files changed, 88 insertions(+), 49 deletions(-) diff --git a/api.go b/api.go index f204a64..ffaf2d9 100644 --- a/api.go +++ b/api.go @@ -2579,7 +2579,7 @@ func (app *appContext) MatrixConnect(gc *gin.Context) { } app.storage.matrix[req.JellyfinID] = MatrixUser{ UserID: req.UserID, - RoomID: roomID, + RoomID: string(roomID), Lang: "en-us", Contact: true, } diff --git a/go.mod b/go.mod index cecafc7..1f6ad2c 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,6 @@ require ( github.com/lithammer/shortuuid/v3 v3.0.4 github.com/mailgun/mailgun-go/v4 v4.5.1 github.com/mailru/easyjson v0.7.7 // indirect - github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16 github.com/pkg/browser v0.0.0-20210606212950-a7b7a6107d32 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/smartystreets/goconvey v1.6.4 // indirect @@ -51,10 +50,10 @@ require ( github.com/technoweenie/multipartstreamer v1.0.1 // indirect github.com/ugorji/go v1.2.0 // indirect github.com/writeas/go-strip-markdown v2.0.1+incompatible - golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9 // indirect golang.org/x/net v0.0.0-20210610132358-84b48f89b13b // indirect golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 // indirect golang.org/x/tools v0.1.3 // indirect google.golang.org/protobuf v1.25.0 // indirect gopkg.in/ini.v1 v1.62.0 + maunium.net/go/mautrix v0.9.14 ) diff --git a/go.sum b/go.sum index e2657e7..ca96962 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,19 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bwmarrin/discordgo v0.23.2 h1:BzrtTktixGHIu9Tt7dEE6diysEF9HWnXeHuoJEt2fH4= github.com/bwmarrin/discordgo v0.23.2/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -16,6 +27,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -34,6 +46,7 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQD github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= @@ -138,16 +151,20 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hrfee/mediabrowser v0.3.5 h1:bOJlI2HLvw7v0c7mcRw5XDRMUHReQzk5z0EJYRyYjpo= github.com/hrfee/mediabrowser v0.3.5/go.mod h1:PnHZbdxmbv1wCVdAQyM7nwPwpVj9fdKx2EcET7sAk+U= github.com/itchyny/timefmt-go v0.1.2 h1:q0Xa4P5it6K6D7ISsbLAMwx1PnWlixDcJL6/sFs93Hs= github.com/itchyny/timefmt-go v0.1.2/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA= github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -156,6 +173,7 @@ github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -165,6 +183,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lithammer/shortuuid/v3 v3.0.4 h1:uj4xhotfY92Y1Oa6n6HUiFn87CdoEHYUlTy0+IgbLrs= github.com/lithammer/shortuuid/v3 v3.0.4/go.mod h1:RviRjexKqIzx/7r1peoAITm6m7gnif/h+0zmolKJjzw= github.com/mailgun/mailgun-go/v4 v4.5.1 h1:XrQQ/ZgqFvINRKy+eBqowLl7k3pQO6OCLpKphliMOFs= @@ -175,8 +194,6 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16 h1:ZtO5uywdd5dLDCud4r0r55eP4j9FuUNpl60Gmntcop4= -github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16/go.mod h1:/gBX06Kw0exX1HrwmoBibFA98yBk/jxKpGVeyQbff+s= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -185,6 +202,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -193,6 +211,9 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= github.com/pkg/browser v0.0.0-20210606212950-a7b7a6107d32 h1:K3WnH8Ka32vWygzmjKEhz1zAVqckNoWDqX3azMxuiSA= @@ -202,10 +223,10 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= @@ -231,6 +252,10 @@ github.com/swaggo/swag v1.7.0 h1:5bCA/MTLQoIqDXXyHfOpMeDvL9j68OY/udlK4pQoo4E= github.com/swaggo/swag v1.7.0/go.mod h1:BdPIL73gvS9NBsdi7M1JOxLvlbfvNRaBP8m6WT6Aajo= github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= +github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -253,13 +278,15 @@ github.com/writeas/go-strip-markdown v2.0.1+incompatible/go.mod h1:Rsyu10ZhbEK9p github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9 h1:umElSU9WZirRdgu2yFHY0ayQkEnKiOC1TtM3fWXFnoU= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -269,6 +296,7 @@ golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -282,6 +310,7 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b h1:k+E048sYJHyVnsr1GDrRZWQ32D2C7lWs9JRc0bel53A= @@ -294,6 +323,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -302,6 +332,7 @@ golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -314,6 +345,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 h1:faDu4veV+8pcThn4fewv6TVlNCezafGoC1gM/mxQLbQ= golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -362,11 +394,13 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -379,3 +413,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclp gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +maunium.net/go/maulogger/v2 v2.2.4/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A= +maunium.net/go/mautrix v0.9.14 h1:2MMJ630VM+xfa4Q5AooMAhPG1+wQnQybSr/z8PlRZ8A= +maunium.net/go/mautrix v0.9.14/go.mod h1:7IzKfWvpQtN+W2Lzxc0rLvIxFM3ryKX6Ys3S/ZoWbg8= diff --git a/matrix.go b/matrix.go index 58cf55b..a69755e 100644 --- a/matrix.go +++ b/matrix.go @@ -1,21 +1,22 @@ package main import ( - "encoding/json" "fmt" "strings" "github.com/gomarkdown/markdown" - "github.com/matrix-org/gomatrix" + gomatrix "maunium.net/go/mautrix" + "maunium.net/go/mautrix/event" + "maunium.net/go/mautrix/id" ) type MatrixDaemon struct { Stopped bool ShutdownChannel chan string bot *gomatrix.Client - userID string + userID id.UserID tokens map[string]UnverifiedUser // Map of tokens to users - languages map[string]string // Map of roomIDs to language codes + languages map[id.RoomID]string // Map of roomIDs to language codes app *appContext } @@ -41,9 +42,9 @@ func (m MatrixIdentifier) Type() string { return m.IdentType } var matrixFilter = gomatrix.Filter{ Room: gomatrix.RoomFilter{ Timeline: gomatrix.FilterPart{ - Types: []string{ - "m.room.message", - "m.room.member", + Types: []event.Type{ + event.NewEventType("m.room.message"), + event.NewEventType("m.room.member"), }, }, }, @@ -64,24 +65,20 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { token := matrix.Key("token").String() d = &MatrixDaemon{ ShutdownChannel: make(chan string), - userID: matrix.Key("user_id").String(), + userID: id.UserID(matrix.Key("user_id").String()), tokens: map[string]UnverifiedUser{}, - languages: map[string]string{}, + languages: map[id.RoomID]string{}, app: app, } d.bot, err = gomatrix.NewClient(homeserver, d.userID, token) if err != nil { return } - filter, err := json.Marshal(matrixFilter) - if err != nil { - return - } - resp, err := d.bot.CreateFilter(filter) + resp, err := d.bot.CreateFilter(&matrixFilter) d.bot.Store.SaveFilterID(d.userID, resp.FilterID) for _, user := range app.storage.matrix { if user.Lang != "" { - d.languages[user.RoomID] = user.Lang + d.languages[id.RoomID(user.RoomID)] = user.Lang } } return @@ -90,14 +87,14 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string) (string, error) { req := &gomatrix.ReqLogin{ Type: "m.login.password", - Identifier: MatrixIdentifier{ - User: username, - IdentType: "m.id.user", + Identifier: gomatrix.UserIdentifier{ + User: username, + Type: "m.id.user", }, Password: password, - DeviceID: "jfa-go-" + commit, + DeviceID: id.DeviceID("jfa-go-" + commit), } - bot, err := gomatrix.NewClient(homeserver, username, "") + bot, err := gomatrix.NewClient(homeserver, id.UserID(username), "") if err != nil { return "", err } @@ -111,7 +108,7 @@ func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string func (d *MatrixDaemon) run() { d.app.info.Println("Starting Matrix bot daemon") syncer := d.bot.Syncer.(*gomatrix.DefaultSyncer) - syncer.OnEventType("m.room.message", d.handleMessage) + syncer.OnEventType(event.NewEventType("m.room.message"), d.handleMessage) // syncer.OnEventType("m.room.member", d.handleMembership) if err := d.bot.Sync(); err != nil { d.app.err.Printf("Matrix sync failed: %v", err) @@ -124,59 +121,59 @@ func (d *MatrixDaemon) Shutdown() { close(d.ShutdownChannel) } -func (d *MatrixDaemon) handleMessage(event *gomatrix.Event) { - if event.Sender == d.userID { +func (d *MatrixDaemon) handleMessage(source gomatrix.EventSource, evt *event.Event) { + if evt.Sender == d.userID { return } lang := "en-us" - if l, ok := d.languages[event.RoomID]; ok { + if l, ok := d.languages[evt.RoomID]; ok { if _, ok := d.app.storage.lang.Telegram[l]; ok { lang = l } } - sects := strings.Split(event.Content["body"].(string), " ") + sects := strings.Split(evt.Content.Raw["body"].(string), " ") switch sects[0] { case "!lang": if len(sects) == 2 { - d.commandLang(event, sects[1], lang) + d.commandLang(evt, sects[1], lang) } else { - d.commandLang(event, "", lang) + d.commandLang(evt, "", lang) } } } -func (d *MatrixDaemon) commandLang(event *gomatrix.Event, code, lang string) { +func (d *MatrixDaemon) commandLang(evt *event.Event, code, lang string) { if code == "" { list := "!lang \n" for c := range d.app.storage.lang.Telegram { list += fmt.Sprintf("%s: %s\n", c, d.app.storage.lang.Telegram[c].Meta.Name) } _, err := d.bot.SendText( - event.RoomID, + evt.RoomID, list, ) if err != nil { - d.app.err.Printf("Matrix: Failed to send message to \"%s\": %v", event.Sender, err) + d.app.err.Printf("Matrix: Failed to send message to \"%s\": %v", evt.Sender, err) } return } if _, ok := d.app.storage.lang.Telegram[code]; !ok { return } - d.languages[event.RoomID] = code - if u, ok := d.app.storage.matrix[event.RoomID]; ok { + d.languages[evt.RoomID] = code + if u, ok := d.app.storage.matrix[string(evt.RoomID)]; ok { u.Lang = code - d.app.storage.matrix[event.RoomID] = u + d.app.storage.matrix[string(evt.RoomID)] = u if err := d.app.storage.storeMatrixUsers(); err != nil { d.app.err.Printf("Matrix: Failed to store Matrix users: %v", err) } } } -func (d *MatrixDaemon) CreateRoom(userID string) (string, error) { +func (d *MatrixDaemon) CreateRoom(userID string) (id.RoomID, error) { room, err := d.bot.CreateRoom(&gomatrix.ReqCreateRoom{ Visibility: "private", - Invite: []string{userID}, + Invite: []id.UserID{id.UserID(userID)}, Topic: d.app.config.Section("matrix").Key("topic").String(), }) if err != nil { @@ -196,7 +193,7 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { d.tokens[pin] = UnverifiedUser{ false, &MatrixUser{ - RoomID: roomID, + RoomID: string(roomID), UserID: userID, Lang: lang, }, @@ -220,11 +217,17 @@ func (d *MatrixDaemon) Send(message *Message, roomID ...string) (err error) { // Convert images to links md = string(markdown.ToHTML([]byte(strings.ReplaceAll(message.Markdown, "![", "[")), nil, renderer)) } - for _, id := range roomID { + for _, ident := range roomID { + if md != "" { - _, err = d.bot.SendFormattedText(id, message.Text, md) + _, err = d.bot.SendMessageEvent(id.RoomID(ident), event.NewEventType("m.room.message"), map[string]interface{}{ + "msgtype": "m.text", + "body": message.Text, + "formatted_body": md, + "format": "org.matrix.custom.html", + }, gomatrix.ReqSendEvent{}) } else { - _, err = d.bot.SendText(id, message.Text) + _, err = d.bot.SendText(id.RoomID(ident), message.Text) } if err != nil { return From 833d02b032fb8d4063d16660cb8952fb34a2013d Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Tue, 13 Jul 2021 19:02:16 +0100 Subject: [PATCH 2/9] matrix: end-to-end encryption by default Existing chats will remain unencrypted but new ones will be. --- LICENSE | 3 + api.go | 12 +-- config.go | 3 + config/config-base.json | 8 ++ email.go | 2 +- go.mod | 1 + go.sum | 48 +++++++++++- main.go | 3 +- matrix.go | 160 +++++++++++++++++++++++++++++++++------- storage.go | 34 ++++----- 10 files changed, 221 insertions(+), 53 deletions(-) diff --git a/LICENSE b/LICENSE index f3247cf..3d8b6da 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,5 @@ +---jfa-go--- + MIT License Copyright (c) 2021 Harvey Tindall @@ -19,3 +21,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/api.go b/api.go index ffaf2d9..f0afce1 100644 --- a/api.go +++ b/api.go @@ -2571,18 +2571,20 @@ func (app *appContext) MatrixConnect(gc *gin.Context) { if app.storage.matrix == nil { app.storage.matrix = map[string]MatrixUser{} } - roomID, err := app.matrix.CreateRoom(req.UserID) + roomID, encrypted, err := app.matrix.CreateRoom(req.UserID) if err != nil { app.err.Printf("Matrix: Failed to create room: %v", err) respondBool(500, false, gc) return } app.storage.matrix[req.JellyfinID] = MatrixUser{ - UserID: req.UserID, - RoomID: string(roomID), - Lang: "en-us", - Contact: true, + UserID: req.UserID, + RoomID: string(roomID), + Lang: "en-us", + Contact: true, + Encrypted: encrypted, } + app.matrix.isEncrypted[roomID] = encrypted if err := app.storage.storeMatrixUsers(); err != nil { app.err.Printf("Failed to store Matrix users: %v", err) respondBool(500, false, gc) diff --git a/config.go b/config.go index f1af63f..e3a8032 100644 --- a/config.go +++ b/config.go @@ -47,6 +47,9 @@ func (app *appContext) loadConfig() error { for _, key := range []string{"user_configuration", "user_displayprefs", "user_profiles", "ombi_template", "invites", "emails", "user_template", "custom_emails", "users", "telegram_users", "discord_users", "matrix_users", "announcements"} { app.config.Section("files").Key(key).SetValue(app.config.Section("files").Key(key).MustString(filepath.Join(app.dataPath, (key + ".json")))) } + for _, key := range []string{"matrix_sql"} { + app.config.Section("files").Key(key).SetValue(app.config.Section("files").Key(key).MustString(filepath.Join(app.dataPath, (key + ".db")))) + } app.URLBase = strings.TrimSuffix(app.config.Section("ui").Key("url_base").MustString(""), "/") app.config.Section("email").Key("no_username").SetValue(strconv.FormatBool(app.config.Section("email").Key("no_username").MustBool(false))) diff --git a/config/config-base.json b/config/config-base.json index 58a2558..3c4fb5b 100644 --- a/config/config-base.json +++ b/config/config-base.json @@ -1324,6 +1324,14 @@ "value": "", "description": "Stores matrix user IDs and language preferences." }, + "matrix_sql": { + "name": "Matrix encryption DB", + "required": false, + "requires_restart": false, + "type": "text", + "value": "", + "description": "Stores cryptographic material for Matrix end-to-end encryption." + }, "discord_users": { "name": "Discord users", "required": false, diff --git a/email.go b/email.go index d5b4492..76b9d92 100644 --- a/email.go +++ b/email.go @@ -819,7 +819,7 @@ func (app *appContext) sendByID(email *Message, ID ...string) error { } } if mxChat, ok := app.storage.matrix[id]; ok && mxChat.Contact && matrixEnabled { - err = app.matrix.Send(email, mxChat.RoomID) + err = app.matrix.Send(email, mxChat) if err != nil { return err } diff --git a/go.mod b/go.mod index 1f6ad2c..d4091d5 100644 --- a/go.mod +++ b/go.mod @@ -56,4 +56,5 @@ require ( google.golang.org/protobuf v1.25.0 // indirect gopkg.in/ini.v1 v1.62.0 maunium.net/go/mautrix v0.9.14 + modernc.org/sqlite v1.11.2 ) diff --git a/go.sum b/go.sum index ca96962..05a5030 100644 --- a/go.sum +++ b/go.sum @@ -33,6 +33,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/emersion/go-autostart v0.0.0-20210130080809-00ed301c8e9a h1:M88ob4TyDnEqNuL3PgsE/p3bDujfspnulR+0dQWNYZs= github.com/emersion/go-autostart v0.0.0-20210130080809-00ed301c8e9a/go.mod h1:buzQsO8HHkZX2Q45fdfGH1xejPjuDQaXH8btcYMFzPM= @@ -141,8 +143,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= @@ -173,6 +176,8 @@ github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -183,6 +188,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lithammer/shortuuid/v3 v3.0.4 h1:uj4xhotfY92Y1Oa6n6HUiFn87CdoEHYUlTy0+IgbLrs= github.com/lithammer/shortuuid/v3 v3.0.4/go.mod h1:RviRjexKqIzx/7r1peoAITm6m7gnif/h+0zmolKJjzw= @@ -202,6 +208,7 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -223,6 +230,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -252,9 +261,13 @@ github.com/swaggo/swag v1.7.0 h1:5bCA/MTLQoIqDXXyHfOpMeDvL9j68OY/udlK4pQoo4E= github.com/swaggo/swag v1.7.0/go.mod h1:BdPIL73gvS9NBsdi7M1JOxLvlbfvNRaBP8m6WT6Aajo= github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= +github.com/tidwall/gjson v1.6.8 h1:CTmXMClGYPAmln7652e69B7OLXfTi5ABcPPwjIWUv7w= github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= +github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.1.5 h1:wsUceI/XDyZk3J1FUvuuYlK62zJv2HO2Pzb8A5EWdUE= github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= @@ -338,6 +351,8 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -365,6 +380,7 @@ golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201120155355-20be4ac4bd6e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -413,6 +429,36 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclp gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= maunium.net/go/maulogger/v2 v2.2.4/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A= maunium.net/go/mautrix v0.9.14 h1:2MMJ630VM+xfa4Q5AooMAhPG1+wQnQybSr/z8PlRZ8A= maunium.net/go/mautrix v0.9.14/go.mod h1:7IzKfWvpQtN+W2Lzxc0rLvIxFM3ryKX6Ys3S/ZoWbg8= +modernc.org/cc/v3 v3.33.6 h1:r63dgSzVzRxUpAJFPQWHy1QeZeY1ydNENUDaBx1GqYc= +modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/ccgo/v3 v3.9.5 h1:dEuUSf8WN51rDkprFuAqjfchKEzN0WttP/Py3enBwjk= +modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.11 h1:QUxZMs48Ahg2F7SN41aERvMfGLY2HU/ADnB9DC4Yts8= +modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q= +modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.0 h1:GCjoRaBew8ECCKINQA2nYjzvufFW9YiEuuB+rQ9bn2E= +modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.0.4 h1:utMBrFcpnQDdNsmM6asmyH/FM9TqLPS7XF7otpJmrwM= +modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= +modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.11.2 h1:ShWQpeD3ag/bmx6TqidBlIWonWmQaSQKls3aenCbt+w= +modernc.org/sqlite v1.11.2/go.mod h1:+mhs/P1ONd+6G7hcAs6irwDi/bjTQ7nLW6LHRBsEa3A= +modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/tcl v1.5.5 h1:N03RwthgTR/l/eQvz3UjfYnvVVj1G2sZqzFGfoD4HE4= +modernc.org/tcl v1.5.5/go.mod h1:ADkaTUuwukkrlhqwERyq0SM8OvyXo7+TjFz7yAF56EI= +modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.0.1 h1:WyIDpEpAIx4Hel6q/Pcgj/VhaQV5XPJ2I6ryIYbjnpc= +modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= diff --git a/main.go b/main.go index 736a660..2c47deb 100644 --- a/main.go +++ b/main.go @@ -652,7 +652,8 @@ func main() { Exit(r) } }() - defer logOutput()() + f := logOutput() + defer f() printVersion() SOCK = filepath.Join(temp, SOCK) fmt.Println("Socket:", SOCK) diff --git a/matrix.go b/matrix.go index a69755e..ce543bf 100644 --- a/matrix.go +++ b/matrix.go @@ -4,10 +4,15 @@ import ( "fmt" "strings" + "database/sql" + "github.com/gomarkdown/markdown" gomatrix "maunium.net/go/mautrix" + "maunium.net/go/mautrix/crypto" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" + + _ "modernc.org/sqlite" ) type MatrixDaemon struct { @@ -17,6 +22,10 @@ type MatrixDaemon struct { userID id.UserID tokens map[string]UnverifiedUser // Map of tokens to users languages map[id.RoomID]string // Map of roomIDs to language codes + isEncrypted map[id.RoomID]bool + cryptoStore *crypto.SQLCryptoStore + olm *crypto.OlmMachine + db *sql.DB app *appContext } @@ -26,18 +35,47 @@ type UnverifiedUser struct { } type MatrixUser struct { - RoomID string - UserID string - Lang string - Contact bool + RoomID string + Encrypted bool + UserID string + Lang string + Contact bool } -type MatrixIdentifier struct { - User string `json:"user"` - IdentType string `json:"type"` +func (m *MatrixDaemon) IsEncrypted(roomID id.RoomID) bool { + return m.isEncrypted[roomID] } -func (m MatrixIdentifier) Type() string { return m.IdentType } +func (m *MatrixDaemon) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEventContent { + return &event.EncryptionEventContent{ + Algorithm: id.AlgorithmMegolmV1, + RotationPeriodMillis: 7 * 24 * 60 * 60 * 1000, + RotationPeriodMessages: 100, + } +} + +// Users are assumed to only have one common channel with the bot, so we can stub this out. +func (m *MatrixDaemon) FindSharedRooms(userID id.UserID) []id.RoomID { return []id.RoomID{} } + +type olmLogger struct { + app *appContext +} + +func (o olmLogger) Error(message string, args ...interface{}) { + o.app.err.Printf("OLM: "+message+"\n", args) +} + +func (o olmLogger) Warn(message string, args ...interface{}) { + o.app.info.Printf("OLM: "+message+"\n", args) +} + +func (o olmLogger) Debug(message string, args ...interface{}) { + o.app.debug.Printf("OLM: "+message+"\n", args) +} + +func (o olmLogger) Trace(message string, args ...interface{}) { + o.app.debug.Printf("OLM [TRACE]: "+message+"\n", args) +} var matrixFilter = gomatrix.Filter{ Room: gomatrix.RoomFilter{ @@ -68,6 +106,7 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { userID: id.UserID(matrix.Key("user_id").String()), tokens: map[string]UnverifiedUser{}, languages: map[id.RoomID]string{}, + isEncrypted: map[id.RoomID]bool{}, app: app, } d.bot, err = gomatrix.NewClient(homeserver, d.userID, token) @@ -80,6 +119,19 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { if user.Lang != "" { d.languages[id.RoomID(user.RoomID)] = user.Lang } + d.isEncrypted[id.RoomID(user.RoomID)] = user.Encrypted + } + d.db, err = sql.Open("sqlite", app.config.Section("files").Key("matrix_sql").String()) + olmLog := &olmLogger{app} + d.cryptoStore = crypto.NewSQLCryptoStore(d.db, "sqlite3", "jfa-go", "jfa-go", []byte("jfa-go"), olmLog) + err = d.cryptoStore.CreateTables() + if err != nil { + return + } + d.olm = crypto.NewOlmMachine(d.bot, olmLog, d.cryptoStore, crypto.StateStore(d)) + err = d.olm.Load() + if err != nil { + return } return } @@ -108,7 +160,20 @@ func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string func (d *MatrixDaemon) run() { d.app.info.Println("Starting Matrix bot daemon") syncer := d.bot.Syncer.(*gomatrix.DefaultSyncer) - syncer.OnEventType(event.NewEventType("m.room.message"), d.handleMessage) + syncer.OnEventType(event.EventMessage, d.handleMessage) + syncer.OnEventType(event.EventEncrypted, func(source gomatrix.EventSource, evt *event.Event) { + decrypted, err := d.olm.DecryptMegolmEvent(evt) + if err != nil { + d.app.err.Printf("Failed to decrypt Matrix message: %v", err) + return + } + d.handleMessage(source, decrypted) + }) + syncer.OnSync(d.olm.ProcessSyncResponse) + syncer.OnEventType(event.StateMember, func(source gomatrix.EventSource, evt *event.Event) { + d.olm.HandleMemberEvent(evt) + }) + // syncer.OnEventType("m.room.member", d.handleMembership) if err := d.bot.Sync(); err != nil { d.app.err.Printf("Matrix sync failed: %v", err) @@ -117,6 +182,7 @@ func (d *MatrixDaemon) run() { func (d *MatrixDaemon) Shutdown() { d.bot.StopSync() + d.db.Close() d.Stopped = true close(d.ShutdownChannel) } @@ -170,20 +236,32 @@ func (d *MatrixDaemon) commandLang(evt *event.Event, code, lang string) { } } -func (d *MatrixDaemon) CreateRoom(userID string) (id.RoomID, error) { - room, err := d.bot.CreateRoom(&gomatrix.ReqCreateRoom{ +func (d *MatrixDaemon) CreateRoom(userID string) (roomID id.RoomID, encrypted bool, err error) { + var room *gomatrix.RespCreateRoom + room, err = d.bot.CreateRoom(&gomatrix.ReqCreateRoom{ Visibility: "private", Invite: []id.UserID{id.UserID(userID)}, Topic: d.app.config.Section("matrix").Key("topic").String(), }) if err != nil { - return "", err + return } - return room.RoomID, nil + _, err = d.bot.SendStateEvent(room.RoomID, event.StateEncryption, "", &event.EncryptionEventContent{ + Algorithm: id.AlgorithmMegolmV1, + RotationPeriodMillis: 7 * 24 * 60 * 60 * 1000, + RotationPeriodMessages: 100, + }) + if err == nil { + encrypted = true + } else { + d.app.debug.Printf("Matrix: Failed to enable encryption in room: %v", err) + } + roomID = room.RoomID + return } func (d *MatrixDaemon) SendStart(userID string) (ok bool) { - roomID, err := d.CreateRoom(userID) + roomID, encrypted, err := d.CreateRoom(userID) if err != nil { d.app.err.Printf("Failed to create room for user \"%s\": %v", userID, err) return @@ -193,11 +271,13 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { d.tokens[pin] = UnverifiedUser{ false, &MatrixUser{ - RoomID: string(roomID), - UserID: userID, - Lang: lang, + RoomID: string(roomID), + UserID: userID, + Lang: lang, + Encrypted: encrypted, }, } + d.isEncrypted[roomID] = encrypted _, err = d.bot.SendText( roomID, d.app.storage.lang.Telegram[lang].Strings.get("matrixStartMessage")+"\n\n"+pin+"\n\n"+ @@ -211,23 +291,25 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { return } -func (d *MatrixDaemon) Send(message *Message, roomID ...string) (err error) { +func (d *MatrixDaemon) Send(message *Message, users ...MatrixUser) (err error) { md := "" if message.Markdown != "" { // Convert images to links md = string(markdown.ToHTML([]byte(strings.ReplaceAll(message.Markdown, "![", "[")), nil, renderer)) } - for _, ident := range roomID { - - if md != "" { - _, err = d.bot.SendMessageEvent(id.RoomID(ident), event.NewEventType("m.room.message"), map[string]interface{}{ - "msgtype": "m.text", - "body": message.Text, - "formatted_body": md, - "format": "org.matrix.custom.html", - }, gomatrix.ReqSendEvent{}) + content := event.MessageEventContent{ + MsgType: "m.text", + Body: message.Text, + } + if md != "" { + content.FormattedBody = md + content.Format = "org.matrix.custom.html" + } + for _, user := range users { + if user.Encrypted { + err = d.SendEncrypted(&content, user) } else { - _, err = d.bot.SendText(id.RoomID(ident), message.Text) + _, err = d.bot.SendMessageEvent(id.RoomID(user.RoomID), event.NewEventType("m.room.message"), content, gomatrix.ReqSendEvent{}) } if err != nil { return @@ -236,6 +318,28 @@ func (d *MatrixDaemon) Send(message *Message, roomID ...string) (err error) { return } +func (d *MatrixDaemon) SendEncrypted(content *event.MessageEventContent, users ...MatrixUser) (err error) { + for _, user := range users { + var encrypted *event.EncryptedEventContent + encrypted, err = d.olm.EncryptMegolmEvent(id.RoomID(user.RoomID), event.EventMessage, content) + if err == crypto.SessionExpired || err == crypto.SessionNotShared || err == crypto.NoGroupSession { + err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID)}) + if err != nil { + return + } + encrypted, err = d.olm.EncryptMegolmEvent(id.RoomID(user.RoomID), event.EventMessage, content) + } + if err != nil { + return + } + _, err = d.bot.SendMessageEvent(id.RoomID(user.RoomID), event.EventEncrypted, encrypted) + if err != nil { + return + } + } + return +} + // User enters ID on sign-up, a PIN is sent to them. They enter it on sign-up. // Message the user first, to avoid E2EE by default diff --git a/storage.go b/storage.go index 9c3b777..3296f5c 100644 --- a/storage.go +++ b/storage.go @@ -15,23 +15,23 @@ import ( ) type Storage struct { - timePattern string - invite_path, emails_path, policy_path, configuration_path, displayprefs_path, ombi_path, profiles_path, customEmails_path, users_path, telegram_path, discord_path, matrix_path, announcements_path string - users map[string]time.Time - invites Invites - profiles map[string]Profile - defaultProfile string - displayprefs, ombi_template map[string]interface{} - emails map[string]EmailAddress - telegram map[string]TelegramUser // Map of Jellyfin User IDs to telegram users. - discord map[string]DiscordUser // Map of Jellyfin user IDs to discord users. - matrix map[string]MatrixUser // Map of Jellyfin user IDs to Matrix users. - customEmails customEmails - policy mediabrowser.Policy - configuration mediabrowser.Configuration - lang Lang - announcements map[string]announcementTemplate - invitesLock, usersLock sync.Mutex + timePattern string + invite_path, emails_path, policy_path, configuration_path, displayprefs_path, ombi_path, profiles_path, customEmails_path, users_path, telegram_path, discord_path, matrix_path, announcements_path, matrix_sql_path string + users map[string]time.Time + invites Invites + profiles map[string]Profile + defaultProfile string + displayprefs, ombi_template map[string]interface{} + emails map[string]EmailAddress + telegram map[string]TelegramUser // Map of Jellyfin User IDs to telegram users. + discord map[string]DiscordUser // Map of Jellyfin user IDs to discord users. + matrix map[string]MatrixUser // Map of Jellyfin user IDs to Matrix users. + customEmails customEmails + policy mediabrowser.Policy + configuration mediabrowser.Configuration + lang Lang + announcements map[string]announcementTemplate + invitesLock, usersLock sync.Mutex } type TelegramUser struct { From 4c10996c09ac4fd34a1c00d743fab9ca4c972d15 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Wed, 14 Jul 2021 17:53:03 +0100 Subject: [PATCH 3/9] matrix: ugly hack to fix encryption after restarts with a persistent crypto.Store, element reports "** Unable to decrypt: The secure channel with the sender was corrupted. **", and others clients just fail. Deleting it before reinitialising the OlmMachine stops this, although the first message to a user takes a while as i guess it has re-establish a session (idk, this is above me). --- go.mod | 1 + go.sum | 2 ++ matrix.go | 54 ++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index d4091d5..810ddf0 100644 --- a/go.mod +++ b/go.mod @@ -41,6 +41,7 @@ require ( github.com/lithammer/shortuuid/v3 v3.0.4 github.com/mailgun/mailgun-go/v4 v4.5.1 github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-sqlite3 v1.14.7 // indirect github.com/pkg/browser v0.0.0-20210606212950-a7b7a6107d32 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/smartystreets/goconvey v1.6.4 // indirect diff --git a/go.sum b/go.sum index 05a5030..12b7561 100644 --- a/go.sum +++ b/go.sum @@ -210,6 +210,8 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= diff --git a/matrix.go b/matrix.go index ce543bf..cf89068 100644 --- a/matrix.go +++ b/matrix.go @@ -2,17 +2,18 @@ package main import ( "fmt" + "os" "strings" + "time" "database/sql" "github.com/gomarkdown/markdown" + _ "github.com/mattn/go-sqlite3" gomatrix "maunium.net/go/mautrix" "maunium.net/go/mautrix/crypto" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" - - _ "modernc.org/sqlite" ) type MatrixDaemon struct { @@ -23,10 +24,11 @@ type MatrixDaemon struct { tokens map[string]UnverifiedUser // Map of tokens to users languages map[id.RoomID]string // Map of roomIDs to language codes isEncrypted map[id.RoomID]bool - cryptoStore *crypto.SQLCryptoStore + cryptoStore *crypto.GobStore olm *crypto.OlmMachine db *sql.DB app *appContext + start int64 } type UnverifiedUser struct { @@ -43,7 +45,8 @@ type MatrixUser struct { } func (m *MatrixDaemon) IsEncrypted(roomID id.RoomID) bool { - return m.isEncrypted[roomID] + encrypted, ok := m.isEncrypted[roomID] + return ok && encrypted } func (m *MatrixDaemon) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEventContent { @@ -55,7 +58,14 @@ func (m *MatrixDaemon) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEve } // Users are assumed to only have one common channel with the bot, so we can stub this out. -func (m *MatrixDaemon) FindSharedRooms(userID id.UserID) []id.RoomID { return []id.RoomID{} } +func (m *MatrixDaemon) FindSharedRooms(userID id.UserID) []id.RoomID { + for _, user := range m.app.storage.matrix { + if id.UserID(user.UserID) == userID { + return []id.RoomID{id.RoomID(user.RoomID)} + } + } + return []id.RoomID{} +} type olmLogger struct { app *appContext @@ -121,18 +131,30 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { } d.isEncrypted[id.RoomID(user.RoomID)] = user.Encrypted } - d.db, err = sql.Open("sqlite", app.config.Section("files").Key("matrix_sql").String()) - olmLog := &olmLogger{app} - d.cryptoStore = crypto.NewSQLCryptoStore(d.db, "sqlite3", "jfa-go", "jfa-go", []byte("jfa-go"), olmLog) - err = d.cryptoStore.CreateTables() + dbPath := app.config.Section("files").Key("matrix_sql").String() + // If the db is maintained after restart, element reports "The secure channel with the sender was corrupted" when sending a message from the bot. + // This obviously isn't right, but it seems to work. + // Since its not really used anyway, just use the deprecated GobStore. This reduces cgo usage anyway. + os.Remove(dbPath) + cryptoStore, err := crypto.NewGobStore(dbPath) + // d.db, err = sql.Open("sqlite3", dbPath) if err != nil { return } - d.olm = crypto.NewOlmMachine(d.bot, olmLog, d.cryptoStore, crypto.StateStore(d)) + olmLog := &olmLogger{app} + // deviceID := "jfa-go" + commit + // cryptoStore := crypto.NewSQLCryptoStore(d.db, "sqlite3", string(d.userID)+deviceID, id.DeviceID(deviceID), []byte("jfa-go"), olmLog) + // err = cryptoStore.CreateTables() + // if err != nil { + // return + // } + d.olm = crypto.NewOlmMachine(d.bot, olmLog, cryptoStore, crypto.StateStore(d)) + // d.olm.AllowUnverifiedDevices = true err = d.olm.Load() if err != nil { return } + d.cryptoStore = cryptoStore return } @@ -158,10 +180,14 @@ func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string } func (d *MatrixDaemon) run() { + d.start = time.Now().UnixNano() / 1000000 d.app.info.Println("Starting Matrix bot daemon") syncer := d.bot.Syncer.(*gomatrix.DefaultSyncer) syncer.OnEventType(event.EventMessage, d.handleMessage) syncer.OnEventType(event.EventEncrypted, func(source gomatrix.EventSource, evt *event.Event) { + if evt.Timestamp < d.start { + return + } decrypted, err := d.olm.DecryptMegolmEvent(evt) if err != nil { d.app.err.Printf("Failed to decrypt Matrix message: %v", err) @@ -181,6 +207,7 @@ func (d *MatrixDaemon) run() { } func (d *MatrixDaemon) Shutdown() { + d.olm.FlushStore() d.bot.StopSync() d.db.Close() d.Stopped = true @@ -188,6 +215,9 @@ func (d *MatrixDaemon) Shutdown() { } func (d *MatrixDaemon) handleMessage(source gomatrix.EventSource, evt *event.Event) { + if evt.Timestamp < d.start { + return + } if evt.Sender == d.userID { return } @@ -323,7 +353,7 @@ func (d *MatrixDaemon) SendEncrypted(content *event.MessageEventContent, users . var encrypted *event.EncryptedEventContent encrypted, err = d.olm.EncryptMegolmEvent(id.RoomID(user.RoomID), event.EventMessage, content) if err == crypto.SessionExpired || err == crypto.SessionNotShared || err == crypto.NoGroupSession { - err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID)}) + err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID), d.userID}) if err != nil { return } @@ -332,7 +362,7 @@ func (d *MatrixDaemon) SendEncrypted(content *event.MessageEventContent, users . if err != nil { return } - _, err = d.bot.SendMessageEvent(id.RoomID(user.RoomID), event.EventEncrypted, encrypted) + _, err = d.bot.SendMessageEvent(id.RoomID(user.RoomID), event.EventEncrypted, &event.Content{Parsed: encrypted}) if err != nil { return } From 8ec4031ba378f2ac76214aee32f458e20fa2835c Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 16 Jul 2021 14:33:51 +0100 Subject: [PATCH 4/9] matrix: refactor crypto sections --- .gitignore | 2 + matrix.go | 182 ++++++++++----------------------------- matrix_crypto.go | 217 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 263 insertions(+), 138 deletions(-) create mode 100644 matrix_crypto.go diff --git a/.gitignore b/.gitignore index 4a94787..f923b57 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,5 @@ server.crt instructions-debian.txt cl.md ./telegram/ +mautrix/ +matacc.txt diff --git a/matrix.go b/matrix.go index cf89068..613d74f 100644 --- a/matrix.go +++ b/matrix.go @@ -2,14 +2,10 @@ package main import ( "fmt" - "os" "strings" "time" - "database/sql" - "github.com/gomarkdown/markdown" - _ "github.com/mattn/go-sqlite3" gomatrix "maunium.net/go/mautrix" "maunium.net/go/mautrix/crypto" "maunium.net/go/mautrix/event" @@ -23,10 +19,10 @@ type MatrixDaemon struct { userID id.UserID tokens map[string]UnverifiedUser // Map of tokens to users languages map[id.RoomID]string // Map of roomIDs to language codes + Encryption bool isEncrypted map[id.RoomID]bool cryptoStore *crypto.GobStore olm *crypto.OlmMachine - db *sql.DB app *appContext start int64 } @@ -44,55 +40,13 @@ type MatrixUser struct { Contact bool } -func (m *MatrixDaemon) IsEncrypted(roomID id.RoomID) bool { - encrypted, ok := m.isEncrypted[roomID] - return ok && encrypted -} - -func (m *MatrixDaemon) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEventContent { - return &event.EncryptionEventContent{ - Algorithm: id.AlgorithmMegolmV1, - RotationPeriodMillis: 7 * 24 * 60 * 60 * 1000, - RotationPeriodMessages: 100, - } -} - -// Users are assumed to only have one common channel with the bot, so we can stub this out. -func (m *MatrixDaemon) FindSharedRooms(userID id.UserID) []id.RoomID { - for _, user := range m.app.storage.matrix { - if id.UserID(user.UserID) == userID { - return []id.RoomID{id.RoomID(user.RoomID)} - } - } - return []id.RoomID{} -} - -type olmLogger struct { - app *appContext -} - -func (o olmLogger) Error(message string, args ...interface{}) { - o.app.err.Printf("OLM: "+message+"\n", args) -} - -func (o olmLogger) Warn(message string, args ...interface{}) { - o.app.info.Printf("OLM: "+message+"\n", args) -} - -func (o olmLogger) Debug(message string, args ...interface{}) { - o.app.debug.Printf("OLM: "+message+"\n", args) -} - -func (o olmLogger) Trace(message string, args ...interface{}) { - o.app.debug.Printf("OLM [TRACE]: "+message+"\n", args) -} - var matrixFilter = gomatrix.Filter{ Room: gomatrix.RoomFilter{ Timeline: gomatrix.FilterPart{ Types: []event.Type{ - event.NewEventType("m.room.message"), - event.NewEventType("m.room.member"), + event.EventMessage, + event.EventEncrypted, + event.StateMember, }, }, }, @@ -102,8 +56,10 @@ var matrixFilter = gomatrix.Filter{ "room_id", "state_key", "sender", - "content.body", - "content.membership", + "content", + "timestamp", + // "content.body", + // "content.membership", }, } @@ -118,52 +74,33 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { languages: map[id.RoomID]string{}, isEncrypted: map[id.RoomID]bool{}, app: app, + start: time.Now().UnixNano() / 1e6, } d.bot, err = gomatrix.NewClient(homeserver, d.userID, token) if err != nil { return } - resp, err := d.bot.CreateFilter(&matrixFilter) - d.bot.Store.SaveFilterID(d.userID, resp.FilterID) + // resp, err := d.bot.CreateFilter(&matrixFilter) + // if err != nil { + // return + // } + // d.bot.Store.SaveFilterID(d.userID, resp.FilterID) for _, user := range app.storage.matrix { if user.Lang != "" { d.languages[id.RoomID(user.RoomID)] = user.Lang } d.isEncrypted[id.RoomID(user.RoomID)] = user.Encrypted } - dbPath := app.config.Section("files").Key("matrix_sql").String() - // If the db is maintained after restart, element reports "The secure channel with the sender was corrupted" when sending a message from the bot. - // This obviously isn't right, but it seems to work. - // Since its not really used anyway, just use the deprecated GobStore. This reduces cgo usage anyway. - os.Remove(dbPath) - cryptoStore, err := crypto.NewGobStore(dbPath) - // d.db, err = sql.Open("sqlite3", dbPath) - if err != nil { - return - } - olmLog := &olmLogger{app} - // deviceID := "jfa-go" + commit - // cryptoStore := crypto.NewSQLCryptoStore(d.db, "sqlite3", string(d.userID)+deviceID, id.DeviceID(deviceID), []byte("jfa-go"), olmLog) - // err = cryptoStore.CreateTables() - // if err != nil { - // return - // } - d.olm = crypto.NewOlmMachine(d.bot, olmLog, cryptoStore, crypto.StateStore(d)) - // d.olm.AllowUnverifiedDevices = true - err = d.olm.Load() - if err != nil { - return - } - d.cryptoStore = cryptoStore + err = InitMatrixCrypto(d) return } func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string) (string, error) { req := &gomatrix.ReqLogin{ - Type: "m.login.password", + Type: gomatrix.AuthTypePassword, Identifier: gomatrix.UserIdentifier{ + Type: gomatrix.IdentifierTypeUser, User: username, - Type: "m.id.user", }, Password: password, DeviceID: id.DeviceID("jfa-go-" + commit), @@ -180,36 +117,20 @@ func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string } func (d *MatrixDaemon) run() { - d.start = time.Now().UnixNano() / 1000000 + startTime := d.start d.app.info.Println("Starting Matrix bot daemon") syncer := d.bot.Syncer.(*gomatrix.DefaultSyncer) + HandleSyncerCrypto(startTime, d, syncer) syncer.OnEventType(event.EventMessage, d.handleMessage) - syncer.OnEventType(event.EventEncrypted, func(source gomatrix.EventSource, evt *event.Event) { - if evt.Timestamp < d.start { - return - } - decrypted, err := d.olm.DecryptMegolmEvent(evt) - if err != nil { - d.app.err.Printf("Failed to decrypt Matrix message: %v", err) - return - } - d.handleMessage(source, decrypted) - }) - syncer.OnSync(d.olm.ProcessSyncResponse) - syncer.OnEventType(event.StateMember, func(source gomatrix.EventSource, evt *event.Event) { - d.olm.HandleMemberEvent(evt) - }) - // syncer.OnEventType("m.room.member", d.handleMembership) if err := d.bot.Sync(); err != nil { d.app.err.Printf("Matrix sync failed: %v", err) } } func (d *MatrixDaemon) Shutdown() { - d.olm.FlushStore() + CryptoShutdown(d) d.bot.StopSync() - d.db.Close() d.Stopped = true close(d.ShutdownChannel) } @@ -221,6 +142,7 @@ func (d *MatrixDaemon) handleMessage(source gomatrix.EventSource, evt *event.Eve if evt.Sender == d.userID { return } + fmt.Printf("RECV %+v\n", evt.Content) lang := "en-us" if l, ok := d.languages[evt.RoomID]; ok { if _, ok := d.app.storage.lang.Telegram[l]; ok { @@ -272,20 +194,12 @@ func (d *MatrixDaemon) CreateRoom(userID string) (roomID id.RoomID, encrypted bo Visibility: "private", Invite: []id.UserID{id.UserID(userID)}, Topic: d.app.config.Section("matrix").Key("topic").String(), + IsDirect: true, }) if err != nil { return } - _, err = d.bot.SendStateEvent(room.RoomID, event.StateEncryption, "", &event.EncryptionEventContent{ - Algorithm: id.AlgorithmMegolmV1, - RotationPeriodMillis: 7 * 24 * 60 * 60 * 1000, - RotationPeriodMessages: 100, - }) - if err == nil { - encrypted = true - } else { - d.app.debug.Printf("Matrix: Failed to enable encryption in room: %v", err) - } + encrypted = EncryptRoom(d, room, id.UserID(userID)) roomID = room.RoomID return } @@ -307,11 +221,13 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { Encrypted: encrypted, }, } - d.isEncrypted[roomID] = encrypted - _, err = d.bot.SendText( + err = d.send( + &event.MessageEventContent{ + MsgType: event.MsgText, + Body: d.app.storage.lang.Telegram[lang].Strings.get("matrixStartMessage") + "\n\n" + pin + "\n\n" + + d.app.storage.lang.Telegram[lang].Strings.template("languageMessage", tmpl{"command": "!lang"}), + }, roomID, - d.app.storage.lang.Telegram[lang].Strings.get("matrixStartMessage")+"\n\n"+pin+"\n\n"+ - d.app.storage.lang.Telegram[lang].Strings.template("languageMessage", tmpl{"command": "!lang"}), ) if err != nil { d.app.err.Printf("Matrix: Failed to send welcome message to \"%s\": %v", userID, err) @@ -321,13 +237,25 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { return } +func (d *MatrixDaemon) send(content *event.MessageEventContent, roomID id.RoomID) (err error) { + if encrypted, ok := d.isEncrypted[roomID]; ok && encrypted { + err = SendEncrypted(d, content, roomID) + } else { + _, err = d.bot.SendMessageEvent(roomID, event.NewEventType("m.room.message"), content, gomatrix.ReqSendEvent{}) + } + if err != nil { + return + } + return +} + func (d *MatrixDaemon) Send(message *Message, users ...MatrixUser) (err error) { md := "" if message.Markdown != "" { // Convert images to links md = string(markdown.ToHTML([]byte(strings.ReplaceAll(message.Markdown, "![", "[")), nil, renderer)) } - content := event.MessageEventContent{ + content := &event.MessageEventContent{ MsgType: "m.text", Body: message.Text, } @@ -337,9 +265,9 @@ func (d *MatrixDaemon) Send(message *Message, users ...MatrixUser) (err error) { } for _, user := range users { if user.Encrypted { - err = d.SendEncrypted(&content, user) + err = SendEncrypted(d, content, id.RoomID(user.RoomID)) } else { - _, err = d.bot.SendMessageEvent(id.RoomID(user.RoomID), event.NewEventType("m.room.message"), content, gomatrix.ReqSendEvent{}) + err = d.send(content, id.RoomID(user.RoomID)) } if err != nil { return @@ -348,28 +276,6 @@ func (d *MatrixDaemon) Send(message *Message, users ...MatrixUser) (err error) { return } -func (d *MatrixDaemon) SendEncrypted(content *event.MessageEventContent, users ...MatrixUser) (err error) { - for _, user := range users { - var encrypted *event.EncryptedEventContent - encrypted, err = d.olm.EncryptMegolmEvent(id.RoomID(user.RoomID), event.EventMessage, content) - if err == crypto.SessionExpired || err == crypto.SessionNotShared || err == crypto.NoGroupSession { - err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID), d.userID}) - if err != nil { - return - } - encrypted, err = d.olm.EncryptMegolmEvent(id.RoomID(user.RoomID), event.EventMessage, content) - } - if err != nil { - return - } - _, err = d.bot.SendMessageEvent(id.RoomID(user.RoomID), event.EventEncrypted, &event.Content{Parsed: encrypted}) - if err != nil { - return - } - } - return -} - // User enters ID on sign-up, a PIN is sent to them. They enter it on sign-up. // Message the user first, to avoid E2EE by default diff --git a/matrix_crypto.go b/matrix_crypto.go new file mode 100644 index 0000000..da8c618 --- /dev/null +++ b/matrix_crypto.go @@ -0,0 +1,217 @@ +package main + +import ( + "fmt" + "strings" + + "maunium.net/go/mautrix" + gomatrix "maunium.net/go/mautrix" + "maunium.net/go/mautrix/crypto" + "maunium.net/go/mautrix/event" + "maunium.net/go/mautrix/id" +) + +type stateStore struct { + isEncrypted *map[id.RoomID]bool +} + +func (m *stateStore) IsEncrypted(roomID id.RoomID) bool { + // encrypted, ok := (*m.isEncrypted)[roomID] + // fmt.Println("ISENCRYPTED", roomID, ok && encrypted) + // return ok && encrypted + return true +} + +func (m *stateStore) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEventContent { + return &event.EncryptionEventContent{ + Algorithm: id.AlgorithmMegolmV1, + RotationPeriodMillis: 7 * 24 * 60 * 60 * 1000, + RotationPeriodMessages: 100, + } +} + +// Users are assumed to only have one common channel with the bot, so we can stub this out. +func (m *stateStore) FindSharedRooms(userID id.UserID) []id.RoomID { + // for _, user := range m.app.storage.matrix { + // if id.UserID(user.UserID) == userID { + // return []id.RoomID{id.RoomID(user.RoomID)} + // } + // } + return []id.RoomID{} +} + +func (d *MatrixDaemon) getUserIDs(roomID id.RoomID) (list []id.UserID, err error) { + members, err := d.bot.JoinedMembers(roomID) + if err != nil { + return + } + list = make([]id.UserID, len(members.Joined)) + i := 0 + for id := range members.Joined { + list[i] = id + i++ + } + return +} + +type olmLogger struct { + app *appContext +} + +func (o olmLogger) Error(message string, args ...interface{}) { + o.app.err.Printf("OLM: "+message+"\n", args) +} + +func (o olmLogger) Warn(message string, args ...interface{}) { + o.app.info.Printf("OLM: "+message+"\n", args) +} + +func (o olmLogger) Debug(message string, args ...interface{}) { + o.app.debug.Printf("OLM: "+message+"\n", args) +} + +func (o olmLogger) Trace(message string, args ...interface{}) { + if strings.HasPrefix(message, "Got membership state event") { + return + } + o.app.debug.Printf("OLM [TRACE]: "+message+"\n", args) +} + +func InitMatrixCrypto(d *MatrixDaemon) (err error) { + d.Encryption = d.app.config.Section("matrix").Key("encryption").MustBool(false) + if !d.Encryption { + return + } + for _, user := range d.app.storage.matrix { + d.isEncrypted[id.RoomID(user.RoomID)] = user.Encrypted + } + dbPath := d.app.config.Section("files").Key("matrix_sql").String() + // If the db is maintained after restart, element reports "The secure channel with the sender was corrupted" when sending a message from the bot. + // This obviously isn't right, but it seems to work. + // Since its not really used anyway, just use the deprecated GobStore. This reduces cgo usage anyway. + // os.Remove(dbPath) + var cryptoStore *crypto.GobStore + cryptoStore, err = crypto.NewGobStore(dbPath) + // d.db, err = sql.Open("sqlite3", dbPath) + if err != nil { + return + } + olmLog := &olmLogger{d.app} + // deviceID := "jfa-go" + commit + // cryptoStore := crypto.NewSQLCryptoStore(d.db, "sqlite3", string(d.userID)+deviceID, id.DeviceID(deviceID), []byte("jfa-go"), olmLog) + // err = cryptoStore.CreateTables() + // if err != nil { + // return + // } + d.olm = crypto.NewOlmMachine(d.bot, olmLog, cryptoStore, &stateStore{&d.isEncrypted}) + d.olm.AllowUnverifiedDevices = true + err = d.olm.Load() + if err != nil { + return + } + d.cryptoStore = cryptoStore + return +} + +func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.DefaultSyncer) { + if !d.Encryption { + return + } + syncer.OnSync(func(resp *gomatrix.RespSync, since string) bool { + d.olm.ProcessSyncResponse(resp, since) + return true + }) + syncer.OnEventType(event.StateMember, func(source gomatrix.EventSource, evt *event.Event) { + d.olm.HandleMemberEvent(evt) + // if evt.Content.AsMember().Membership != event.MembershipJoin { + // return + // } + // userIDs, err := d.getUserIDs(evt.RoomID) + // if err != nil || len(userIDs) < 2 { + // fmt.Println("FS", err) + // return + // } + // err = d.olm.ShareGroupSession(evt.RoomID, userIDs) + // if err != nil { + // fmt.Println("FS", err) + // return + // } + }) + syncer.OnEventType(event.EventEncrypted, func(source gomatrix.EventSource, evt *event.Event) { + if evt.Timestamp < startTime { + return + } + fmt.Printf("%+v\n", d.cryptoStore.GroupSessions) + decrypted, err := d.olm.DecryptMegolmEvent(evt) + if err != nil { + d.app.err.Printf("Failed to decrypt Matrix message: %v", err) + return + } + fmt.Println("RECV", decrypted.Content.Raw["body"]) + d.handleMessage(source, decrypted) + }) +} + +func CryptoShutdown(d *MatrixDaemon) { + if d.Encryption { + d.olm.FlushStore() + } +} + +func EncryptRoom(d *MatrixDaemon, room *mautrix.RespCreateRoom, userID id.UserID) (encrypted bool) { + if !d.Encryption { + return + } + _, err := d.bot.SendStateEvent(room.RoomID, event.StateEncryption, "", &event.EncryptionEventContent{ + Algorithm: id.AlgorithmMegolmV1, + RotationPeriodMillis: 7 * 24 * 60 * 60 * 1000, + RotationPeriodMessages: 100, + }) + if err == nil { + encrypted = true + } else { + d.app.debug.Printf("Matrix: Failed to enable encryption in room: %v", err) + return + } + d.isEncrypted[room.RoomID] = encrypted + var userIDs []id.UserID + userIDs, err = d.getUserIDs(room.RoomID) + if err != nil { + return + } + userIDs = append(userIDs, userID) + err = d.olm.ShareGroupSession(room.RoomID, userIDs) + return +} + +func SendEncrypted(d *MatrixDaemon, content *event.MessageEventContent, roomID id.RoomID) (err error) { + if !d.Encryption { + err = d.send(content, roomID) + return + } + var encrypted *event.EncryptedEventContent + encrypted, err = d.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) + if err == crypto.SessionExpired || err == crypto.SessionNotShared || err == crypto.NoGroupSession { + fmt.Println("SGS") + // err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID), d.userID}) + var userIDs []id.UserID + userIDs, err = d.getUserIDs(roomID) + if err != nil { + return + } + fmt.Println("SHARETO", userIDs) + err = d.olm.ShareGroupSession(roomID, userIDs) + if err != nil { + return + } + encrypted, err = d.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) + } + if err != nil { + return + } + _, err = d.bot.SendMessageEvent(roomID, event.EventEncrypted, &event.Content{Parsed: encrypted}) + if err != nil { + return + } + return +} From 7f376334235f1f15eaaf4dd62b05759d856734ae Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 16 Jul 2021 15:39:22 +0100 Subject: [PATCH 5/9] fix external fs --- external.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/external.go b/external.go index a34d5d2..f769125 100644 --- a/external.go +++ b/external.go @@ -12,8 +12,8 @@ import ( const binaryType = "external" -var localFS fs.FS -var langFS fs.FS +var localFS dirFS +var langFS dirFS // When using os.DirFS, even on Windows the separator seems to be '/'. // func FSJoin(elem ...string) string { return filepath.Join(elem...) } @@ -29,9 +29,23 @@ func FSJoin(elem ...string) string { return strings.TrimSuffix(path, sep) } +type dirFS string + +func (dir dirFS) Open(name string) (fs.File, error) { + return os.Open(string(dir) + "/" + name) +} + +func (dir dirFS) ReadFile(name string) ([]byte, error) { + return os.ReadFile(string(dir) + "/" + name) +} + +func (dir dirFS) ReadDir(name string) ([]fs.DirEntry, error) { + return os.ReadDir(string(dir) + "/" + name) +} + func loadFilesystems() { log.Println("Using external storage") executable, _ := os.Executable() - localFS = os.DirFS(filepath.Join(filepath.Dir(executable), "data")) - langFS = os.DirFS(filepath.Join(filepath.Dir(executable), "data", "lang")) + localFS = dirFS(filepath.Join(filepath.Dir(executable), "data")) + langFS = dirFS(filepath.Join(filepath.Dir(executable), "data", "lang")) } From 762d5325fb28ee395fcfc45f8d286740dd436128 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 16 Jul 2021 15:41:08 +0100 Subject: [PATCH 6/9] matrix: E2EE as build option since this is so broken and requires CGO deps, E2EE support is now only included with "make E2EE=on ...". The option to enable will then appear in settings. --- Makefile | 20 ++++++++++++----- api.go | 10 +++++++++ config/config-base.json | 10 +++++++++ matrix.go | 50 ++++++++++++++++++++--------------------- matrix_crypto.go | 15 ++++++------- matrix_nocrypto.go | 33 +++++++++++++++++++++++++++ 6 files changed, 98 insertions(+), 40 deletions(-) create mode 100644 matrix_nocrypto.go diff --git a/Makefile b/Makefile index e159a60..8be3882 100644 --- a/Makefile +++ b/Makefile @@ -18,22 +18,30 @@ else ifneq ($(UPDATER), off) LDFLAGS := $(LDFLAGS) -X main.updater=$(UPDATER) endif + + INTERNAL ?= on +TRAY ?= off +E2EE ?= off +TAGS := -tags " + ifeq ($(INTERNAL), on) - TAGS := DATA := data else DATA := build/data - TAGS := -tags external + TAGS := $(TAGS) external endif -TRAY ?= off -ifeq ($(INTERNAL)$(TRAY), offon) +ifeq ($(TRAY), on) TAGS := $(TAGS) tray -else ifeq ($(INTERNAL)$(TRAY), onon) - TAGS := -tags tray endif +ifeq ($(E2EE), on) + TAGS := $(TAGS) e2ee +endif + +TAGS := $(TAGS)" + OS := $(shell go env GOOS) ifeq ($(TRAY)$(OS), onwindows) LDFLAGS := $(LDFLAGS) -H=windowsgui diff --git a/api.go b/api.go index f0afce1..fa41da0 100644 --- a/api.go +++ b/api.go @@ -1667,6 +1667,16 @@ func (app *appContext) GetConfig(gc *gin.Context) { } } } + if !MatrixE2EE() { + delete(resp.Sections["matrix"].Settings, "encryption") + for i, v := range resp.Sections["matrix"].Order { + if v == "encryption" { + sect := resp.Sections["matrix"] + sect.Order = append(sect.Order[:i], sect.Order[i+1:]...) + resp.Sections["matrix"] = sect + } + } + } for sectName, section := range resp.Sections { for settingName, setting := range section.Settings { val := app.config.Section(sectName).Key(settingName) diff --git a/config/config-base.json b/config/config-base.json index 3c4fb5b..9e573e7 100644 --- a/config/config-base.json +++ b/config/config-base.json @@ -747,6 +747,16 @@ ], "value": "en-us", "description": "Default Matrix message language. Visit weblate if you'd like to translate." + }, + "encryption": { + "name": "End-to-end encryption (experimental)", + "required": false, + "requires_restart": true, + "depends_true": "enabled", + "advanced": true, + "type": "bool", + "value": false, + "description": "Enable end-to-end encryption for messages. Very experimental, currently does not support receiving commands (e.g !lang)." } } }, diff --git a/matrix.go b/matrix.go index 613d74f..ccc4f72 100644 --- a/matrix.go +++ b/matrix.go @@ -6,7 +6,7 @@ import ( "time" "github.com/gomarkdown/markdown" - gomatrix "maunium.net/go/mautrix" + "maunium.net/go/mautrix" "maunium.net/go/mautrix/crypto" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" @@ -15,7 +15,7 @@ import ( type MatrixDaemon struct { Stopped bool ShutdownChannel chan string - bot *gomatrix.Client + bot *mautrix.Client userID id.UserID tokens map[string]UnverifiedUser // Map of tokens to users languages map[id.RoomID]string // Map of roomIDs to language codes @@ -40,9 +40,9 @@ type MatrixUser struct { Contact bool } -var matrixFilter = gomatrix.Filter{ - Room: gomatrix.RoomFilter{ - Timeline: gomatrix.FilterPart{ +var matrixFilter = mautrix.Filter{ + Room: mautrix.RoomFilter{ + Timeline: mautrix.FilterPart{ Types: []event.Type{ event.EventMessage, event.EventEncrypted, @@ -76,7 +76,7 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { app: app, start: time.Now().UnixNano() / 1e6, } - d.bot, err = gomatrix.NewClient(homeserver, d.userID, token) + d.bot, err = mautrix.NewClient(homeserver, d.userID, token) if err != nil { return } @@ -96,16 +96,16 @@ func newMatrixDaemon(app *appContext) (d *MatrixDaemon, err error) { } func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string) (string, error) { - req := &gomatrix.ReqLogin{ - Type: gomatrix.AuthTypePassword, - Identifier: gomatrix.UserIdentifier{ - Type: gomatrix.IdentifierTypeUser, + req := &mautrix.ReqLogin{ + Type: mautrix.AuthTypePassword, + Identifier: mautrix.UserIdentifier{ + Type: mautrix.IdentifierTypeUser, User: username, }, Password: password, DeviceID: id.DeviceID("jfa-go-" + commit), } - bot, err := gomatrix.NewClient(homeserver, id.UserID(username), "") + bot, err := mautrix.NewClient(homeserver, id.UserID(username), "") if err != nil { return "", err } @@ -119,7 +119,7 @@ func (d *MatrixDaemon) generateAccessToken(homeserver, username, password string func (d *MatrixDaemon) run() { startTime := d.start d.app.info.Println("Starting Matrix bot daemon") - syncer := d.bot.Syncer.(*gomatrix.DefaultSyncer) + syncer := d.bot.Syncer.(*mautrix.DefaultSyncer) HandleSyncerCrypto(startTime, d, syncer) syncer.OnEventType(event.EventMessage, d.handleMessage) @@ -135,7 +135,7 @@ func (d *MatrixDaemon) Shutdown() { close(d.ShutdownChannel) } -func (d *MatrixDaemon) handleMessage(source gomatrix.EventSource, evt *event.Event) { +func (d *MatrixDaemon) handleMessage(source mautrix.EventSource, evt *event.Event) { if evt.Timestamp < d.start { return } @@ -189,8 +189,8 @@ func (d *MatrixDaemon) commandLang(evt *event.Event, code, lang string) { } func (d *MatrixDaemon) CreateRoom(userID string) (roomID id.RoomID, encrypted bool, err error) { - var room *gomatrix.RespCreateRoom - room, err = d.bot.CreateRoom(&gomatrix.ReqCreateRoom{ + var room *mautrix.RespCreateRoom + room, err = d.bot.CreateRoom(&mautrix.ReqCreateRoom{ Visibility: "private", Invite: []id.UserID{id.UserID(userID)}, Topic: d.app.config.Section("matrix").Key("topic").String(), @@ -221,7 +221,7 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { Encrypted: encrypted, }, } - err = d.send( + err = d.sendToRoom( &event.MessageEventContent{ MsgType: event.MsgText, Body: d.app.storage.lang.Telegram[lang].Strings.get("matrixStartMessage") + "\n\n" + pin + "\n\n" + @@ -237,18 +237,20 @@ func (d *MatrixDaemon) SendStart(userID string) (ok bool) { return } -func (d *MatrixDaemon) send(content *event.MessageEventContent, roomID id.RoomID) (err error) { +func (d *MatrixDaemon) sendToRoom(content *event.MessageEventContent, roomID id.RoomID) (err error) { if encrypted, ok := d.isEncrypted[roomID]; ok && encrypted { err = SendEncrypted(d, content, roomID) } else { - _, err = d.bot.SendMessageEvent(roomID, event.NewEventType("m.room.message"), content, gomatrix.ReqSendEvent{}) - } - if err != nil { - return + _, err = d.bot.SendMessageEvent(roomID, event.EventMessage, content, mautrix.ReqSendEvent{}) } return } +func (d *MatrixDaemon) send(content *event.MessageEventContent, roomID id.RoomID) (err error) { + _, err = d.bot.SendMessageEvent(roomID, event.EventMessage, content, mautrix.ReqSendEvent{}) + return +} + func (d *MatrixDaemon) Send(message *Message, users ...MatrixUser) (err error) { md := "" if message.Markdown != "" { @@ -264,11 +266,7 @@ func (d *MatrixDaemon) Send(message *Message, users ...MatrixUser) (err error) { content.Format = "org.matrix.custom.html" } for _, user := range users { - if user.Encrypted { - err = SendEncrypted(d, content, id.RoomID(user.RoomID)) - } else { - err = d.send(content, id.RoomID(user.RoomID)) - } + err = d.sendToRoom(content, id.RoomID(user.RoomID)) if err != nil { return } diff --git a/matrix_crypto.go b/matrix_crypto.go index da8c618..a64e50f 100644 --- a/matrix_crypto.go +++ b/matrix_crypto.go @@ -1,3 +1,5 @@ +// +build e2ee + package main import ( @@ -5,19 +7,19 @@ import ( "strings" "maunium.net/go/mautrix" - gomatrix "maunium.net/go/mautrix" "maunium.net/go/mautrix/crypto" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" ) +func MatrixE2EE() bool { return true } + type stateStore struct { isEncrypted *map[id.RoomID]bool } func (m *stateStore) IsEncrypted(roomID id.RoomID) bool { // encrypted, ok := (*m.isEncrypted)[roomID] - // fmt.Println("ISENCRYPTED", roomID, ok && encrypted) // return ok && encrypted return true } @@ -117,11 +119,11 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul if !d.Encryption { return } - syncer.OnSync(func(resp *gomatrix.RespSync, since string) bool { + syncer.OnSync(func(resp *mautrix.RespSync, since string) bool { d.olm.ProcessSyncResponse(resp, since) return true }) - syncer.OnEventType(event.StateMember, func(source gomatrix.EventSource, evt *event.Event) { + syncer.OnEventType(event.StateMember, func(source mautrix.EventSource, evt *event.Event) { d.olm.HandleMemberEvent(evt) // if evt.Content.AsMember().Membership != event.MembershipJoin { // return @@ -137,7 +139,7 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul // return // } }) - syncer.OnEventType(event.EventEncrypted, func(source gomatrix.EventSource, evt *event.Event) { + syncer.OnEventType(event.EventEncrypted, func(source mautrix.EventSource, evt *event.Event) { if evt.Timestamp < startTime { return } @@ -147,7 +149,6 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul d.app.err.Printf("Failed to decrypt Matrix message: %v", err) return } - fmt.Println("RECV", decrypted.Content.Raw["body"]) d.handleMessage(source, decrypted) }) } @@ -192,14 +193,12 @@ func SendEncrypted(d *MatrixDaemon, content *event.MessageEventContent, roomID i var encrypted *event.EncryptedEventContent encrypted, err = d.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) if err == crypto.SessionExpired || err == crypto.SessionNotShared || err == crypto.NoGroupSession { - fmt.Println("SGS") // err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID), d.userID}) var userIDs []id.UserID userIDs, err = d.getUserIDs(roomID) if err != nil { return } - fmt.Println("SHARETO", userIDs) err = d.olm.ShareGroupSession(roomID, userIDs) if err != nil { return diff --git a/matrix_nocrypto.go b/matrix_nocrypto.go new file mode 100644 index 0000000..b49f720 --- /dev/null +++ b/matrix_nocrypto.go @@ -0,0 +1,33 @@ +// +build !e2ee + +package main + +import ( + "maunium.net/go/mautrix" + "maunium.net/go/mautrix/event" + "maunium.net/go/mautrix/id" +) + +func MatrixE2EE() bool { return false } + +func InitMatrixCrypto(d *MatrixDaemon) (err error) { + d.Encryption = false + return +} + +func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.DefaultSyncer) { + return +} + +func CryptoShutdown(d *MatrixDaemon) { + return +} + +func EncryptRoom(d *MatrixDaemon, room *mautrix.RespCreateRoom, userID id.UserID) (encrypted bool) { + return +} + +func SendEncrypted(d *MatrixDaemon, content *event.MessageEventContent, roomID id.RoomID) (err error) { + err = d.send(content, roomID) + return +} From 872c366384e6328588625e08415cc201eb91b669 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 16 Jul 2021 15:51:27 +0100 Subject: [PATCH 7/9] go mod tidy --- go.mod | 2 +- go.sum | 45 --------------------------------------------- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/go.mod b/go.mod index 810ddf0..8b4859e 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible github.com/golang/protobuf v1.4.3 // indirect github.com/gomarkdown/markdown v0.0.0-20210408062403-ad838ccf8cdd + github.com/google/go-cmp v0.5.3 // indirect github.com/google/uuid v1.1.2 // indirect github.com/hrfee/jfa-go/common v0.0.0-20210105184019-fdc97b4e86cc github.com/hrfee/jfa-go/docs v0.0.0-20201112212552-b6f3cd7c1f71 @@ -57,5 +58,4 @@ require ( google.golang.org/protobuf v1.25.0 // indirect gopkg.in/ini.v1 v1.62.0 maunium.net/go/mautrix v0.9.14 - modernc.org/sqlite v1.11.2 ) diff --git a/go.sum b/go.sum index 12b7561..7318009 100644 --- a/go.sum +++ b/go.sum @@ -24,7 +24,6 @@ github.com/bwmarrin/discordgo v0.23.2 h1:BzrtTktixGHIu9Tt7dEE6diysEF9HWnXeHuoJEt github.com/bwmarrin/discordgo v0.23.2/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -33,8 +32,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/emersion/go-autostart v0.0.0-20210130080809-00ed301c8e9a h1:M88ob4TyDnEqNuL3PgsE/p3bDujfspnulR+0dQWNYZs= github.com/emersion/go-autostart v0.0.0-20210130080809-00ed301c8e9a/go.mod h1:buzQsO8HHkZX2Q45fdfGH1xejPjuDQaXH8btcYMFzPM= @@ -65,7 +62,6 @@ github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSl github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= github.com/getlantern/systray v1.1.0 h1:U0wCEqseLi2ok1fE6b88gJklzriavPJixZysZPkZd/Y= github.com/getlantern/systray v1.1.0/go.mod h1:AecygODWIsBquJCJFop8MEQcJbWFfw/1yWbVabNgpCM= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= @@ -176,8 +172,6 @@ github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -208,7 +202,6 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -232,10 +225,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -283,10 +273,8 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= github.com/ugorji/go/codec v1.2.0 h1:As6RccOIlbm9wHuWYMlB30dErcI+4WiKWsYsmPkyrUw= github.com/ugorji/go/codec v1.2.0/go.mod h1:dXvG35r7zTX6QImXOSFhGMmKtX+wJ7VTWzGvYQGIjBs= -github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/writeas/go-strip-markdown v2.0.1+incompatible h1:IIqxTM5Jr7RzhigcL6FkrCNfXkvbR+Nbu1ls48pXYcw= github.com/writeas/go-strip-markdown v2.0.1+incompatible/go.mod h1:Rsyu10ZhbEK9pXdk8V6MVnZmTzRG0alMNLMwa0J01fE= @@ -353,8 +341,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -382,7 +368,6 @@ golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201120155355-20be4ac4bd6e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -431,36 +416,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclp gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= maunium.net/go/maulogger/v2 v2.2.4/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A= maunium.net/go/mautrix v0.9.14 h1:2MMJ630VM+xfa4Q5AooMAhPG1+wQnQybSr/z8PlRZ8A= maunium.net/go/mautrix v0.9.14/go.mod h1:7IzKfWvpQtN+W2Lzxc0rLvIxFM3ryKX6Ys3S/ZoWbg8= -modernc.org/cc/v3 v3.33.6 h1:r63dgSzVzRxUpAJFPQWHy1QeZeY1ydNENUDaBx1GqYc= -modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= -modernc.org/ccgo/v3 v3.9.5 h1:dEuUSf8WN51rDkprFuAqjfchKEzN0WttP/Py3enBwjk= -modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/libc v1.9.11 h1:QUxZMs48Ahg2F7SN41aERvMfGLY2HU/ADnB9DC4Yts8= -modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q= -modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.0 h1:GCjoRaBew8ECCKINQA2nYjzvufFW9YiEuuB+rQ9bn2E= -modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.0.4 h1:utMBrFcpnQDdNsmM6asmyH/FM9TqLPS7XF7otpJmrwM= -modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= -modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.11.2 h1:ShWQpeD3ag/bmx6TqidBlIWonWmQaSQKls3aenCbt+w= -modernc.org/sqlite v1.11.2/go.mod h1:+mhs/P1ONd+6G7hcAs6irwDi/bjTQ7nLW6LHRBsEa3A= -modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/tcl v1.5.5 h1:N03RwthgTR/l/eQvz3UjfYnvVVj1G2sZqzFGfoD4HE4= -modernc.org/tcl v1.5.5/go.mod h1:ADkaTUuwukkrlhqwERyq0SM8OvyXo7+TjFz7yAF56EI= -modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.0.1 h1:WyIDpEpAIx4Hel6q/Pcgj/VhaQV5XPJ2I6ryIYbjnpc= -modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= From 1336a87ae25e775b99747b46e3f22ddaeea1c67d Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 16 Jul 2021 16:50:31 +0100 Subject: [PATCH 8/9] drone: use custom container for pr builds --- .drone.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.drone.yml b/.drone.yml index 728506c..bb60bac 100644 --- a/.drone.yml +++ b/.drone.yml @@ -153,12 +153,8 @@ type: docker steps: - name: build - image: golang:latest + image: hrfee/jfa-go-build-docker:latest commands: - - apt-get update -y - - apt-get install build-essential python3-pip curl software-properties-common sed upx gcc libgtk-3-dev libappindicator3-dev gcc-mingw-w64-x86-64 -y - - (curl -sL https://deb.nodesource.com/setup_14.x | bash -) - - apt-get install nodejs - curl -sL https://git.io/goreleaser > goreleaser - chmod +x goreleaser - ./scripts/version.sh ./goreleaser --snapshot --skip-publish --rm-dist From f04411e13700aa7539ec8ab6fc22975ab6c03b42 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 16 Jul 2021 17:11:17 +0100 Subject: [PATCH 9/9] matrix: remove crypto dep in main file --- matrix.go | 4 +--- matrix_crypto.go | 38 +++++++++++++++++++++++--------------- matrix_nocrypto.go | 2 ++ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/matrix.go b/matrix.go index ccc4f72..576603d 100644 --- a/matrix.go +++ b/matrix.go @@ -7,7 +7,6 @@ import ( "github.com/gomarkdown/markdown" "maunium.net/go/mautrix" - "maunium.net/go/mautrix/crypto" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" ) @@ -21,8 +20,7 @@ type MatrixDaemon struct { languages map[id.RoomID]string // Map of roomIDs to language codes Encryption bool isEncrypted map[id.RoomID]bool - cryptoStore *crypto.GobStore - olm *crypto.OlmMachine + crypto Crypto app *appContext start int64 } diff --git a/matrix_crypto.go b/matrix_crypto.go index a64e50f..26ff7e3 100644 --- a/matrix_crypto.go +++ b/matrix_crypto.go @@ -12,6 +12,11 @@ import ( "maunium.net/go/mautrix/id" ) +type Crypto struct { + cryptoStore *crypto.GobStore + olm *crypto.OlmMachine +} + func MatrixE2EE() bool { return true } type stateStore struct { @@ -105,13 +110,16 @@ func InitMatrixCrypto(d *MatrixDaemon) (err error) { // if err != nil { // return // } - d.olm = crypto.NewOlmMachine(d.bot, olmLog, cryptoStore, &stateStore{&d.isEncrypted}) - d.olm.AllowUnverifiedDevices = true - err = d.olm.Load() + olm := crypto.NewOlmMachine(d.bot, olmLog, cryptoStore, &stateStore{&d.isEncrypted}) + olm.AllowUnverifiedDevices = true + err = d.crypto.olm.Load() if err != nil { return } - d.cryptoStore = cryptoStore + d.crypto = Crypto{ + cryptoStore: cryptoStore, + olm: olm, + } return } @@ -120,11 +128,11 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul return } syncer.OnSync(func(resp *mautrix.RespSync, since string) bool { - d.olm.ProcessSyncResponse(resp, since) + d.crypto.olm.ProcessSyncResponse(resp, since) return true }) syncer.OnEventType(event.StateMember, func(source mautrix.EventSource, evt *event.Event) { - d.olm.HandleMemberEvent(evt) + d.crypto.olm.HandleMemberEvent(evt) // if evt.Content.AsMember().Membership != event.MembershipJoin { // return // } @@ -133,7 +141,7 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul // fmt.Println("FS", err) // return // } - // err = d.olm.ShareGroupSession(evt.RoomID, userIDs) + // err = d.crypto.olm.ShareGroupSession(evt.RoomID, userIDs) // if err != nil { // fmt.Println("FS", err) // return @@ -143,8 +151,8 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul if evt.Timestamp < startTime { return } - fmt.Printf("%+v\n", d.cryptoStore.GroupSessions) - decrypted, err := d.olm.DecryptMegolmEvent(evt) + fmt.Printf("%+v\n", d.crypto.cryptoStore.GroupSessions) + decrypted, err := d.crypto.olm.DecryptMegolmEvent(evt) if err != nil { d.app.err.Printf("Failed to decrypt Matrix message: %v", err) return @@ -155,7 +163,7 @@ func HandleSyncerCrypto(startTime int64, d *MatrixDaemon, syncer *mautrix.Defaul func CryptoShutdown(d *MatrixDaemon) { if d.Encryption { - d.olm.FlushStore() + d.crypto.olm.FlushStore() } } @@ -181,7 +189,7 @@ func EncryptRoom(d *MatrixDaemon, room *mautrix.RespCreateRoom, userID id.UserID return } userIDs = append(userIDs, userID) - err = d.olm.ShareGroupSession(room.RoomID, userIDs) + err = d.crypto.olm.ShareGroupSession(room.RoomID, userIDs) return } @@ -191,19 +199,19 @@ func SendEncrypted(d *MatrixDaemon, content *event.MessageEventContent, roomID i return } var encrypted *event.EncryptedEventContent - encrypted, err = d.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) + encrypted, err = d.crypto.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) if err == crypto.SessionExpired || err == crypto.SessionNotShared || err == crypto.NoGroupSession { - // err = d.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID), d.userID}) + // err = d.crypto.olm.ShareGroupSession(id.RoomID(user.RoomID), []id.UserID{id.UserID(user.UserID), d.userID}) var userIDs []id.UserID userIDs, err = d.getUserIDs(roomID) if err != nil { return } - err = d.olm.ShareGroupSession(roomID, userIDs) + err = d.crypto.olm.ShareGroupSession(roomID, userIDs) if err != nil { return } - encrypted, err = d.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) + encrypted, err = d.crypto.olm.EncryptMegolmEvent(roomID, event.EventMessage, content) } if err != nil { return diff --git a/matrix_nocrypto.go b/matrix_nocrypto.go index b49f720..93b58e7 100644 --- a/matrix_nocrypto.go +++ b/matrix_nocrypto.go @@ -8,6 +8,8 @@ import ( "maunium.net/go/mautrix/id" ) +type Crypto struct{} + func MatrixE2EE() bool { return false } func InitMatrixCrypto(d *MatrixDaemon) (err error) {