summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuco van Amstel <duco.vanamstel@gmail.com>2018-11-13 19:51:19 +0000
committerWim <wim@42.be>2018-11-13 20:51:19 +0100
commite19ba5a06ad94c389df1b253d30c9ba6e4d14273 (patch)
tree7fdf1a9650d4bfd4e5e71638f92cb7f48c52ecc9
parentf7a5077d5d8dee61e86f5ec8b17b66bf257dd68c (diff)
downloadmatterbridge-msglm-e19ba5a06ad94c389df1b253d30c9ba6e4d14273.tar.gz
matterbridge-msglm-e19ba5a06ad94c389df1b253d30c9ba6e4d14273.tar.bz2
matterbridge-msglm-e19ba5a06ad94c389df1b253d30c9ba6e4d14273.zip
Add new Slack connection and forked legacy Slack bridge (#582)
-rw-r--r--bridge/config/config.go1
-rw-r--r--bridge/slack/legacy.go74
-rw-r--r--bridge/slack/slack.go86
-rw-r--r--gateway/gateway.go41
4 files changed, 136 insertions, 66 deletions
diff --git a/bridge/config/config.go b/bridge/config/config.go
index 9d335cac..503a8dee 100644
--- a/bridge/config/config.go
+++ b/bridge/config/config.go
@@ -163,6 +163,7 @@ 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 00000000..a7e7f01f
--- /dev/null
+++ b/bridge/slack/legacy.go
@@ -0,0 +1,74 @@
+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 ecf58287..8030eb9c 100644
--- a/bridge/slack/slack.go
+++ b/bridge/slack/slack.go
@@ -73,6 +73,20 @@ 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)
@@ -97,56 +111,38 @@ 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 728ed703..9baeef9e 100644
--- a/gateway/gateway.go
+++ b/gateway/gateway.go
@@ -2,10 +2,15 @@ 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"
@@ -23,15 +28,8 @@ 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 {
@@ -55,19 +53,20 @@ 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 (