summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemi Reuvekamp <github@remi.im>2018-06-08 22:30:35 +0200
committerWim <wim@42.be>2018-06-08 22:30:35 +0200
commit33bd60528be4eaf28ffd1065517ea41fde9ea62b (patch)
tree057ceb94989fd5f88d0195b8bbfdc42dcf4f14f0
parent7e544741117138943b51bffe4317e11d45777389 (diff)
downloadmatterbridge-msglm-33bd60528be4eaf28ffd1065517ea41fde9ea62b.tar.gz
matterbridge-msglm-33bd60528be4eaf28ffd1065517ea41fde9ea62b.tar.bz2
matterbridge-msglm-33bd60528be4eaf28ffd1065517ea41fde9ea62b.zip
Add config option MediaDownloadPath (#443)
* Add config option MediaUploadPath MediaDownloadPath can be used instead of MediaServerUpload, for when your webserver is on the same system as matterbridge and matterbridge has write access to the serve dir. * Limit length of hash in MediaServer urls to 8chars Full SHA256 is unnecessary for uniqueness. Also; if a file has the same first 8 charachters of the SHA256 hash, it's still not a problem, as long as the filename is not the same.
-rw-r--r--bridge/config/config.go10
-rw-r--r--gateway/gateway.go97
-rw-r--r--matterbridge.go5
-rw-r--r--matterbridge.toml.sample13
4 files changed, 87 insertions, 38 deletions
diff --git a/bridge/config/config.go b/bridge/config/config.go
index 1627adc2..351e6cad 100644
--- a/bridge/config/config.go
+++ b/bridge/config/config.go
@@ -2,14 +2,15 @@ package config
import (
"bytes"
- "github.com/fsnotify/fsnotify"
- log "github.com/sirupsen/logrus"
- "github.com/spf13/viper"
- prefixed "github.com/x-cray/logrus-prefixed-formatter"
"os"
"strings"
"sync"
"time"
+
+ "github.com/fsnotify/fsnotify"
+ log "github.com/sirupsen/logrus"
+ "github.com/spf13/viper"
+ prefixed "github.com/x-cray/logrus-prefixed-formatter"
)
const (
@@ -76,6 +77,7 @@ type Protocol struct {
MediaDownloadSize int // all protocols
MediaServerDownload string
MediaServerUpload string
+ MediaDownloadPath string // Basically MediaServerUpload, but instead of uploading it, just write it to a file on the same server.
MessageDelay int // IRC, time in millisecond to wait between messages
MessageFormat string // telegram
MessageLength int // IRC, max length of a message allowed
diff --git a/gateway/gateway.go b/gateway/gateway.go
index eb5bbe92..b926912a 100644
--- a/gateway/gateway.go
+++ b/gateway/gateway.go
@@ -3,6 +3,10 @@ package gateway
import (
"bytes"
"fmt"
+ "io/ioutil"
+ "net/http"
+ "os"
+
"github.com/42wim/matterbridge/bridge"
"github.com/42wim/matterbridge/bridge/api"
"github.com/42wim/matterbridge/bridge/config"
@@ -18,16 +22,16 @@ import (
"github.com/42wim/matterbridge/bridge/telegram"
"github.com/42wim/matterbridge/bridge/xmpp"
"github.com/42wim/matterbridge/bridge/zulip"
+ "github.com/hashicorp/golang-lru"
log "github.com/sirupsen/logrus"
// "github.com/davecgh/go-spew/spew"
"crypto/sha1"
- "github.com/hashicorp/golang-lru"
- "github.com/peterhellberg/emojilib"
- "net/http"
"path/filepath"
"regexp"
"strings"
"time"
+
+ "github.com/peterhellberg/emojilib"
)
type Gateway struct {
@@ -411,46 +415,83 @@ func (gw *Gateway) modifyMessage(msg *config.Message) {
}
}
+// handleFiles uploads or places all files on the given msg to the MediaServer and
+// adds the new URL of the file on the MediaServer onto the given msg.
func (gw *Gateway) handleFiles(msg *config.Message) {
reg := regexp.MustCompile("[^a-zA-Z0-9]+")
- // if we don't have a attachfield or we don't have a mediaserver configured return
- if msg.Extra == nil || gw.Config.General.MediaServerUpload == "" {
+
+ // If we don't have a attachfield or we don't have a mediaserver configured return
+ if msg.Extra == nil || (gw.Config.General.MediaServerUpload == "" && gw.Config.General.MediaDownloadPath == "") {
return
}
- // if we actually have files, start uploading them to the mediaserver
- if len(msg.Extra["file"]) > 0 {
- client := &http.Client{
- Timeout: time.Second * 5,
- }
- for i, f := range msg.Extra["file"] {
- fi := f.(config.FileInfo)
- ext := filepath.Ext(fi.Name)
- fi.Name = fi.Name[0 : len(fi.Name)-len(ext)]
- fi.Name = reg.ReplaceAllString(fi.Name, "_")
- fi.Name = fi.Name + ext
- sha1sum := fmt.Sprintf("%x", sha1.Sum(*fi.Data))
- reader := bytes.NewReader(*fi.Data)
+ // If we don't have files, nothing to upload.
+ if len(msg.Extra["file"]) == 0 {
+ return
+ }
+
+ client := &http.Client{
+ Timeout: time.Second * 5,
+ }
+
+ for i, f := range msg.Extra["file"] {
+ fi := f.(config.FileInfo)
+ ext := filepath.Ext(fi.Name)
+ fi.Name = fi.Name[0 : len(fi.Name)-len(ext)]
+ fi.Name = reg.ReplaceAllString(fi.Name, "_")
+ fi.Name = fi.Name + ext
+
+ sha1sum := fmt.Sprintf("%x", sha1.Sum(*fi.Data))[:8]
+
+ if gw.Config.General.MediaServerUpload != "" {
+ // Use MediaServerUpload. Upload using a PUT HTTP request and basicauth.
+
url := gw.Config.General.MediaServerUpload + "/" + sha1sum + "/" + fi.Name
- durl := gw.Config.General.MediaServerDownload + "/" + sha1sum + "/" + fi.Name
- extra := msg.Extra["file"][i].(config.FileInfo)
- extra.URL = durl
- req, err := http.NewRequest("PUT", url, reader)
+
+ req, err := http.NewRequest("PUT", url, bytes.NewReader(*fi.Data))
if err != nil {
- flog.Errorf("mediaserver upload failed: %#v", err)
+ flog.Errorf("mediaserver upload failed, could not create request: %#v", err)
continue
}
+
+ flog.Debugf("mediaserver upload url: %s", url)
+
req.Header.Set("Content-Type", "binary/octet-stream")
_, err = client.Do(req)
if err != nil {
- flog.Errorf("mediaserver upload failed: %#v", err)
+ flog.Errorf("mediaserver upload failed, could not Do request: %#v", err)
+ continue
+ }
+ } else {
+ // Use MediaServerPath. Place the file on the current filesystem.
+
+ dir := gw.Config.General.MediaDownloadPath + "/" + sha1sum
+ err := os.Mkdir(dir, os.ModePerm)
+ if err != nil && !os.IsExist(err) {
+ flog.Errorf("mediaserver path failed, could not mkdir: %s %#v", err, err)
+ continue
+ }
+
+ path := dir + "/" + fi.Name
+ flog.Debugf("mediaserver path placing file: %s", path)
+
+ err = ioutil.WriteFile(path, *fi.Data, os.ModePerm)
+ if err != nil {
+ flog.Errorf("mediaserver path failed, could not writefile: %s %#v", err, err)
continue
}
- flog.Debugf("mediaserver download URL = %s", durl)
- // we uploaded the file successfully. Add the SHA
- extra.SHA = sha1sum
- msg.Extra["file"][i] = extra
}
+
+ // Download URL.
+ durl := gw.Config.General.MediaServerDownload + "/" + sha1sum + "/" + fi.Name
+
+ flog.Debugf("mediaserver download URL = %s", durl)
+
+ // We uploaded/placed the file successfully. Add the SHA and URL.
+ extra := msg.Extra["file"][i].(config.FileInfo)
+ extra.URL = durl
+ extra.SHA = sha1sum
+ msg.Extra["file"][i] = extra
}
}
diff --git a/matterbridge.go b/matterbridge.go
index f05a745b..df138028 100644
--- a/matterbridge.go
+++ b/matterbridge.go
@@ -3,13 +3,14 @@ package main
import (
"flag"
"fmt"
+ "os"
+ "strings"
+
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/gateway"
"github.com/google/gops/agent"
log "github.com/sirupsen/logrus"
prefixed "github.com/x-cray/logrus-prefixed-formatter"
- "os"
- "strings"
)
var (
diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample
index 6f81baf6..1bc4f3b4 100644
--- a/matterbridge.toml.sample
+++ b/matterbridge.toml.sample
@@ -1306,10 +1306,13 @@ RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
StripNick=false
-#MediaServerUpload and MediaServerDownload are used for uploading images/files/video to
-#a remote "mediaserver" (a webserver like caddy for example).
-#When configured images/files uploaded on bridges like mattermost,slack, telegram will be downloaded
-#and uploaded again to MediaServerUpload URL
+#MediaServerUpload (or MediaDownloadPath) and MediaServerDownload are used for uploading
+#images/files/video to a remote "mediaserver" (a webserver like caddy for example).
+#When configured images/files uploaded on bridges like mattermost, slack, telegram will be
+#downloaded and uploaded again to MediaServerUpload URL
+#MediaDownloadPath is the filesystem path where the media file will be placed, instead of uploaded,
+#for if Matterbridge has write access to the directory your webserver is serving.
+#It is an alternative to MediaServerUpload.
#The MediaServerDownload will be used so that bridges without native uploading support:
#gitter, irc and xmpp will be shown links to the files on MediaServerDownload
#
@@ -1317,6 +1320,8 @@ StripNick=false
#OPTIONAL (default empty)
MediaServerUpload="https://user:pass@yourserver.com/upload"
#OPTIONAL (default empty)
+MediaDownloadPath="/srv/http/yourserver.com/public/download"
+#OPTIONAL (default empty)
MediaServerDownload="https://youserver.com/download"
#MediaDownloadSize is the maximum size of attachments, videos, images