Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 631e458a2fbb62482ba2cea9451266b1acca0810 Author: Duco van Amstel <duco.vanamstel@gmail.com> Date: Tue Nov 13 19:51:19 2018 +0000 Add new Slack connection and forked legacy Slack bridge (#582) diff --git a/bridge/config/config.go b/bridge/config/config.go index 9d335ca..503a8de 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -1636 +1637 @@ type ConfigValues struct {   Mattermost map[string]Protocol   Matrix map[string]Protocol   Slack map[string]Protocol + SlackLegacy map[string]Protocol   Steam map[string]Protocol   Gitter map[string]Protocol   Xmpp map[string]Protocol diff --git a/bridge/slack/legacy.go b/bridge/slack/legacy.go new file mode 100644 index 0000000..a7e7f01 --- /dev/null +++ b/bridge/slack/legacy.go @@ -00 +174 @@ +package bslack + +import ( + "errors" + + "github.com/42wim/matterbridge/bridge" + "github.com/42wim/matterbridge/matterhook" + "github.com/nlopes/slack" +) + +type BslackLegacy struct { + *Bslack +} + +func NewLegacy(cfg *bridge.Config) bridge.Bridger { + return &BslackLegacy{Bslack: newBridge(cfg)} +} + +func (b *BslackLegacy) Connect() error { + b.RLock() + defer b.RUnlock() + if b.GetString(incomingWebhookConfig) != "" { + switch { + case b.GetString(outgoingWebhookConfig) != "": + b.Log.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)") + b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ + InsecureSkipVerify: b.GetBool(skipTLSConfig), + BindAddress: b.GetString(incomingWebhookConfig), + }) + case b.GetString(tokenConfig) != "": + b.Log.Info("Connecting using token (sending)") + b.sc = slack.New(b.GetString(tokenConfig)) + b.rtm = b.sc.NewRTM() + go b.rtm.ManageConnection() + b.Log.Info("Connecting using webhookbindaddress (receiving)") + b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ + InsecureSkipVerify: b.GetBool(skipTLSConfig), + BindAddress: b.GetString(incomingWebhookConfig), + }) + default: + b.Log.Info("Connecting using webhookbindaddress (receiving)") + b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ + InsecureSkipVerify: b.GetBool(skipTLSConfig), + BindAddress: b.GetString(incomingWebhookConfig), + }) + } + go b.handleSlack() + return nil + } + if b.GetString(outgoingWebhookConfig) != "" { + b.Log.Info("Connecting using webhookurl (sending)") + b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ + InsecureSkipVerify: b.GetBool(skipTLSConfig), + DisableServer: true, + }) + if b.GetString(tokenConfig) != "" { + b.Log.Info("Connecting using token (receiving)") + b.sc = slack.New(b.GetString(tokenConfig)) + b.rtm = b.sc.NewRTM() + go b.rtm.ManageConnection() + go b.handleSlack() + } + } else if b.GetString(tokenConfig) != "" { + b.Log.Info("Connecting using token (sending and receiving)") + b.sc = slack.New(b.GetString(tokenConfig)) + b.rtm = b.sc.NewRTM() + go b.rtm.ManageConnection() + go b.handleSlack() + } + if b.GetString(incomingWebhookConfig) == "" && b.GetString(outgoingWebhookConfig) == "" && b.GetString(tokenConfig) == "" { + return errors.New("no connection method found. See that you have WebhookBindAddress, WebhookURL or Token configured") + } + return nil +} diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index ecf5828..8030eb9 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -736 +7320 @@ const (  )    func New(cfg *bridge.Config) bridge.Bridger { + // Print a deprecation warning for legacy non-bot tokens (#527). + token := cfg.GetString(tokenConfig) + if token != "" && !strings.HasPrefix(token, "xoxb") { + cfg.Log.Error("Non-bot token detected. It is STRONGLY recommended to use a proper bot-token instead.") + cfg.Log.Error("Legacy tokens may be deprecated by Slack at short notice. See the Matterbridge GitHub wiki for a migration guide.") + cfg.Log.Error("To continue using a legacy token please move your configuration to a \"slack-legacy\" bridge instead.") + cfg.Log.Error("Delaying start of bridge by 30 seconds. Future Matterbridge release will fail here unless you use a \"slack-legacy\" bridge.") + time.Sleep(30 * time.Second) + return NewLegacy(cfg) + } + return newBridge(cfg) +} + +func newBridge(cfg *bridge.Config) *Bslack {   newCache, err := lru.New(5000)   if err != nil {   cfg.Log.Fatalf("Could not create LRU cache for Slack bridge: %v", err) @@ -9756 +11138 @@ func (b *Bslack) Command(cmd string) string {  func (b *Bslack) Connect() error {   b.RLock()   defer b.RUnlock() - if b.GetString(incomingWebhookConfig) != "" { - switch { - case b.GetString(outgoingWebhookConfig) != "": - b.Log.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)") - b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ - InsecureSkipVerify: b.GetBool(skipTLSConfig), - BindAddress: b.GetString(incomingWebhookConfig), - }) - case b.GetString(tokenConfig) != "": - b.Log.Info("Connecting using token (sending)") - b.sc = slack.New(b.GetString(tokenConfig)) - b.rtm = b.sc.NewRTM() - go b.rtm.ManageConnection() - b.Log.Info("Connecting using webhookbindaddress (receiving)") - b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ - InsecureSkipVerify: b.GetBool(skipTLSConfig), - BindAddress: b.GetString(incomingWebhookConfig), - }) - default: - b.Log.Info("Connecting using webhookbindaddress (receiving)") - b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ - InsecureSkipVerify: b.GetBool(skipTLSConfig), - BindAddress: b.GetString(incomingWebhookConfig), - }) - } - go b.handleSlack() - return nil + + if b.GetString(incomingWebhookConfig) == "" && b.GetString(outgoingWebhookConfig) == "" && b.GetString(tokenConfig) == "" { + return errors.New("no connection method found: WebhookBindAddress, WebhookURL or Token need to be configured")   } - if b.GetString(outgoingWebhookConfig) != "" { - b.Log.Info("Connecting using webhookurl (sending)") - b.mh = matterhook.New(b.GetString(outgoingWebhookConfig), matterhook.Config{ - InsecureSkipVerify: b.GetBool(skipTLSConfig), - DisableServer: true, - }) - if b.GetString(tokenConfig) != "" { - b.Log.Info("Connecting using token (receiving)") - b.sc = slack.New(b.GetString(tokenConfig)) - b.rtm = b.sc.NewRTM() - go b.rtm.ManageConnection() - go b.handleSlack() - } - } else if b.GetString(tokenConfig) != "" { - b.Log.Info("Connecting using token (sending and receiving)") - b.sc = slack.New(b.GetString(tokenConfig)) + + // If we have a token we use the Slack websocket-based RTM for both sending and receiving. + if token := b.GetString(tokenConfig); token != "" { + b.Log.Info("Connecting using token") + b.sc = slack.New(token)   b.rtm = b.sc.NewRTM()   go b.rtm.ManageConnection()   go b.handleSlack() + return nil   } - if b.GetString(incomingWebhookConfig) == "" && b.GetString(outgoingWebhookConfig) == "" && b.GetString(tokenConfig) == "" { - return errors.New("no connection method found. See that you have WebhookBindAddress, WebhookURL or Token configured") + + // In absence of a token we fall back to incoming and outgoing Webhooks. + b.mh = matterhook.New( + "", + matterhook.Config{ + InsecureSkipVerify: b.GetBool("SkipTLSVerify"), + DisableServer: true, + }, + ) + if b.GetString(outgoingWebhookConfig) != "" { + b.Log.Info("Using specified webhook for outgoing messages.") + b.mh.Url = b.GetString(outgoingWebhookConfig) + } + if b.GetString(incomingWebhookConfig) != "" { + b.Log.Info("Setting up local webhook for incoming messages.") + b.mh.BindAddress = b.GetString(incomingWebhookConfig) + b.mh.DisableServer = false + go b.handleSlack()   }   return nil  } diff --git a/gateway/gateway.go b/gateway/gateway.go index 728ed70..9baeef9 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -210 +215 @@ package gateway    import (   "bytes" + "crypto/sha1"   "fmt"   "io/ioutil"   "net/http"   "os" + "path/filepath" + "regexp" + "strings" + "time"     "github.com/42wim/matterbridge/bridge"   "github.com/42wim/matterbridge/bridge/api" @@ -2315 +288 @@ import (   bxmpp "github.com/42wim/matterbridge/bridge/xmpp"   bzulip "github.com/42wim/matterbridge/bridge/zulip"   "github.com/hashicorp/golang-lru" - log "github.com/sirupsen/logrus" - // "github.com/davecgh/go-spew/spew" - "crypto/sha1" - "path/filepath" - "regexp" - "strings" - "time" -   "github.com/peterhellberg/emojilib" + log "github.com/sirupsen/logrus"  )    type Gateway struct { @@ -5519 +5320 @@ type BrMsgID struct {  var flog *log.Entry    var bridgeMap = map[string]bridge.Factory{ - "api": api.New, - "discord": bdiscord.New, - "gitter": bgitter.New, - "irc": birc.New, - "mattermost": bmattermost.New, - "matrix": bmatrix.New, - "rocketchat": brocketchat.New, - "slack": bslack.New, - "sshchat": bsshchat.New, - "steam": bsteam.New, - "telegram": btelegram.New, - "xmpp": bxmpp.New, - "zulip": bzulip.New, + "api": api.New, + "discord": bdiscord.New, + "gitter": bgitter.New, + "irc": birc.New, + "mattermost": bmattermost.New, + "matrix": bmatrix.New, + "rocketchat": brocketchat.New, + "slack-legacy": bslack.NewLegacy, + "slack": bslack.New, + "sshchat": bsshchat.New, + "steam": bsteam.New, + "telegram": btelegram.New, + "xmpp": bxmpp.New, + "zulip": bzulip.New,  }    const (