Skip to content

Commit ef5a4c7

Browse files
author
Ivan Zuev
committed
Merge branch 'master' of github.com:42wim/matterbridge into socker-mode
� Conflicts: � bridge/slack/handlers.go � bridge/slack/slack.go
2 parents 3ca2c84 + 5bc18fb commit ef5a4c7

File tree

132 files changed

+21933
-377
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+21933
-377
lines changed

.github/dependabot.yml

-22
This file was deleted.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ See <https://github.com/42wim/matterbridge/wiki>
164164

165165
### Binaries
166166

167-
- Latest stable release [v1.23.2](https://github.com/42wim/matterbridge/releases/latest)
167+
- Latest stable release [v1.24.0](https://github.com/42wim/matterbridge/releases/latest)
168168
- Development releases (follows master) can be downloaded [here](https://github.com/42wim/matterbridge/actions) selecting the latest green build and then artifacts.
169169

170170
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest). On \*nix platforms you may need to make the binary executable - you can do this by running `chmod a+x` on the binary (example: `chmod a+x matterbridge-1.20.0-linux-64bit`). After downloading (and making the binary executable, if necessary), follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.

bridge/config/config.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const (
2323
EventRejoinChannels = "rejoin_channels"
2424
EventUserAction = "user_action"
2525
EventMsgDelete = "msg_delete"
26+
EventFileDelete = "file_delete"
2627
EventAPIConnected = "api_connected"
2728
EventUserTyping = "user_typing"
2829
EventGetChannelMembers = "get_channel_members"
@@ -56,13 +57,14 @@ func (m Message) ParentValid() bool {
5657
}
5758

5859
type FileInfo struct {
59-
Name string
60-
Data *[]byte
61-
Comment string
62-
URL string
63-
Size int64
64-
Avatar bool
65-
SHA string
60+
Name string
61+
Data *[]byte
62+
Comment string
63+
URL string
64+
Size int64
65+
Avatar bool
66+
SHA string
67+
NativeID string
6668
}
6769

6870
type ChannelInfo struct {
@@ -168,7 +170,7 @@ type Protocol struct {
168170
UseTLS bool // IRC
169171
UseDiscriminator bool // discord
170172
UseFirstName bool // telegram
171-
UseUserName bool // discord, matrix
173+
UseUserName bool // discord, matrix, mattermost
172174
UseInsecureURL bool // telegram
173175
UserName string // IRC
174176
VerboseJoinPart bool // IRC

bridge/discord/discord.go

+41-5
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import (
1010
"github.com/42wim/matterbridge/bridge/config"
1111
"github.com/42wim/matterbridge/bridge/discord/transmitter"
1212
"github.com/42wim/matterbridge/bridge/helper"
13+
lru "github.com/hashicorp/golang-lru"
1314
"github.com/matterbridge/discordgo"
1415
)
1516

16-
const MessageLength = 1950
17+
const (
18+
MessageLength = 1950
19+
cFileUpload = "file_upload"
20+
)
1721

1822
type Bdiscord struct {
1923
*bridge.Config
@@ -35,10 +39,20 @@ type Bdiscord struct {
3539
// Webhook specific logic
3640
useAutoWebhooks bool
3741
transmitter *transmitter.Transmitter
42+
cache *lru.Cache
3843
}
3944

4045
func New(cfg *bridge.Config) bridge.Bridger {
41-
b := &Bdiscord{Config: cfg}
46+
newCache, err := lru.New(5000)
47+
if err != nil {
48+
cfg.Log.Fatalf("Could not create LRU cache: %v", err)
49+
}
50+
51+
b := &Bdiscord{
52+
Config: cfg,
53+
cache: newCache,
54+
}
55+
4256
b.userMemberMap = make(map[string]*discordgo.Member)
4357
b.nickMemberMap = make(map[string]*discordgo.Member)
4458
b.channelInfoMap = make(map[string]*config.ChannelInfo)
@@ -75,6 +89,9 @@ func (b *Bdiscord) Connect() error {
7589
b.c.AddHandler(b.messageDeleteBulk)
7690
b.c.AddHandler(b.memberAdd)
7791
b.c.AddHandler(b.memberRemove)
92+
if b.GetInt("debuglevel") == 1 {
93+
b.c.AddHandler(b.messageEvent)
94+
}
7895
// Add privileged intent for guild member tracking. This is needed to track nicks
7996
// for display names and @mention translation
8097
b.c.Identify.Intents = discordgo.MakeIntent(discordgo.IntentsAllWithoutPrivileged |
@@ -153,7 +170,7 @@ func (b *Bdiscord) Connect() error {
153170
return fmt.Errorf("use of removed WebhookURL setting")
154171
}
155172

156-
if b.GetInt("debuglevel") > 0 {
173+
if b.GetInt("debuglevel") == 2 {
157174
b.Log.Debug("enabling even more discord debug")
158175
b.c.Debug = true
159176
}
@@ -280,6 +297,21 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
280297
return "", err
281298
}
282299

300+
// Delete a file
301+
if msg.Event == config.EventFileDelete {
302+
if msg.ID == "" {
303+
return "", nil
304+
}
305+
306+
if fi, ok := b.cache.Get(cFileUpload + msg.ID); ok {
307+
err := b.c.ChannelMessageDelete(channelID, fi.(string)) // nolint:forcetypeassert
308+
b.cache.Remove(cFileUpload + msg.ID)
309+
return "", err
310+
}
311+
312+
return "", fmt.Errorf("file %s not found", msg.ID)
313+
}
314+
283315
// Upload a file if it exists
284316
if msg.Extra != nil {
285317
for _, rmsg := range helper.HandleExtra(msg, b.General) {
@@ -327,7 +359,6 @@ func (b *Bdiscord) handleEventBotUser(msg *config.Message, channelID string) (st
327359

328360
// handleUploadFile handles native upload of files
329361
func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (string, error) {
330-
var err error
331362
for _, f := range msg.Extra["file"] {
332363
fi := f.(config.FileInfo)
333364
file := discordgo.File{
@@ -340,10 +371,15 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
340371
Files: []*discordgo.File{&file},
341372
AllowedMentions: b.getAllowedMentions(),
342373
}
343-
_, err = b.c.ChannelMessageSendComplex(channelID, &m)
374+
res, err := b.c.ChannelMessageSendComplex(channelID, &m)
344375
if err != nil {
345376
return "", fmt.Errorf("file upload failed: %s", err)
346377
}
378+
379+
// link file_upload_nativeID (file ID from the original bridge) to our upload id
380+
// so that we can remove this later when it eg needs to be deleted
381+
b.cache.Add(cFileUpload+fi.NativeID, res.ID)
347382
}
383+
348384
return "", nil
349385
}

bridge/discord/handlers.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package bdiscord
22

33
import (
44
"github.com/42wim/matterbridge/bridge/config"
5+
"github.com/davecgh/go-spew/spew"
56
"github.com/matterbridge/discordgo"
67
)
78

@@ -31,6 +32,10 @@ func (b *Bdiscord) messageDeleteBulk(s *discordgo.Session, m *discordgo.MessageD
3132
}
3233
}
3334

35+
func (b *Bdiscord) messageEvent(s *discordgo.Session, m *discordgo.Event) {
36+
b.Log.Debug(spew.Sdump(m.Struct))
37+
}
38+
3439
func (b *Bdiscord) messageTyping(s *discordgo.Session, m *discordgo.TypingStart) {
3540
if !b.GetBool("ShowUserTyping") {
3641
return
@@ -82,8 +87,9 @@ func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
8287

8388
rmsg := config.Message{Account: b.Account, Avatar: "https://cdn.discordapp.com/avatars/" + m.Author.ID + "/" + m.Author.Avatar + ".jpg", UserID: m.Author.ID, ID: m.ID}
8489

90+
b.Log.Debugf("== Receiving event %#v", m.Message)
91+
8592
if m.Content != "" {
86-
b.Log.Debugf("== Receiving event %#v", m.Message)
8793
m.Message.Content = b.replaceChannelMentions(m.Message.Content)
8894
rmsg.Text, err = m.ContentWithMoreMentionsReplaced(b.c)
8995
if err != nil {

bridge/helper/helper.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -168,17 +168,23 @@ func HandleDownloadSize(logger *logrus.Entry, msg *config.Message, name string,
168168

169169
// HandleDownloadData adds the data for a remote file into a Matterbridge gateway message.
170170
func HandleDownloadData(logger *logrus.Entry, msg *config.Message, name, comment, url string, data *[]byte, general *config.Protocol) {
171+
HandleDownloadData2(logger, msg, name, "", comment, url, data, general)
172+
}
173+
174+
// HandleDownloadData adds the data for a remote file into a Matterbridge gateway message.
175+
func HandleDownloadData2(logger *logrus.Entry, msg *config.Message, name, id, comment, url string, data *[]byte, general *config.Protocol) {
171176
var avatar bool
172177
logger.Debugf("Download OK %#v %#v", name, len(*data))
173178
if msg.Event == config.EventAvatarDownload {
174179
avatar = true
175180
}
176181
msg.Extra["file"] = append(msg.Extra["file"], config.FileInfo{
177-
Name: name,
178-
Data: data,
179-
URL: url,
180-
Comment: comment,
181-
Avatar: avatar,
182+
Name: name,
183+
Data: data,
184+
URL: url,
185+
Comment: comment,
186+
Avatar: avatar,
187+
NativeID: id,
182188
})
183189
}
184190

bridge/irc/irc.go

+31-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package birc
22

33
import (
44
"crypto/tls"
5+
"errors"
56
"fmt"
67
"hash/crc32"
78
"io/ioutil"
@@ -72,6 +73,10 @@ func (b *Birc) Command(msg *config.Message) string {
7273
}
7374

7475
func (b *Birc) Connect() error {
76+
if b.GetBool("UseSASL") && b.GetString("TLSClientCertificate") != "" {
77+
return errors.New("you can't enable SASL and TLSClientCertificate at the same time")
78+
}
79+
7580
b.Local = make(chan config.Message, b.MessageQueue+10)
7681
b.Log.Infof("Connecting %s", b.GetString("Server"))
7782

@@ -300,6 +305,11 @@ func (b *Birc) getClient() (*girc.Client, error) {
300305

301306
b.Log.Debugf("setting pingdelay to %s", pingDelay)
302307

308+
tlsConfig, err := b.getTLSConfig()
309+
if err != nil {
310+
return nil, err
311+
}
312+
303313
i := girc.New(girc.Config{
304314
Server: server,
305315
ServerPass: b.GetString("Password"),
@@ -309,7 +319,7 @@ func (b *Birc) getClient() (*girc.Client, error) {
309319
Name: realName,
310320
SSL: b.GetBool("UseTLS"),
311321
Bind: b.GetString("Bind"),
312-
TLSConfig: &tls.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"), ServerName: server}, //nolint:gosec
322+
TLSConfig: tlsConfig,
313323
PingDelay: pingDelay,
314324
// skip gIRC internal rate limiting, since we have our own throttling
315325
AllowFlood: true,
@@ -381,3 +391,23 @@ func (b *Birc) storeNames(client *girc.Client, event girc.Event) {
381391
func (b *Birc) formatnicks(nicks []string) string {
382392
return strings.Join(nicks, ", ") + " currently on IRC"
383393
}
394+
395+
func (b *Birc) getTLSConfig() (*tls.Config, error) {
396+
server, _, _ := net.SplitHostPort(b.GetString("server"))
397+
398+
tlsConfig := &tls.Config{
399+
InsecureSkipVerify: b.GetBool("skiptlsverify"), //nolint:gosec
400+
ServerName: server,
401+
}
402+
403+
if filename := b.GetString("TLSClientCertificate"); filename != "" {
404+
cert, err := tls.LoadX509KeyPair(filename, filename)
405+
if err != nil {
406+
return nil, err
407+
}
408+
409+
tlsConfig.Certificates = []tls.Certificate{cert}
410+
}
411+
412+
return tlsConfig, nil
413+
}

0 commit comments

Comments
 (0)