--- /dev/null
+GO ?= go
+
+all: mmfileget
+
+mmfileget: main.go mattermost-server vendor
+ $(GO) build -mod=vendor
+
+mattermost-server:
+ git clone --depth 1 --branch v5.11.1 https://github.com/mattermost/mattermost-server.git
+
+vendor: mattermost-server
+ ln -s mattermost-server/vendor
+ ln -s $(PWD)/mattermost-server vendor/github.com/mattermost/mattermost-server
--- /dev/null
+Utility for downloading files from Mattermost.
+
+Mattermost (MM) gives URLs for file downloading like
+https://MACHINE/api/v4/files/FILE
+and you can not download it with simple fetch/curl/wget.
+That utility uses MM's API to download it.
+
+ $ mmfileget https://MACHINE/api/v4/files/FILE
+ Name: Some filename.jpg
+ Type: image/jpeg
+ Size: 43713
+ Download? Ctrl-D/C
+
+Press Ctrl-D to allow file download under provided name.
+Press Ctrl-C to quit program.
+
+ $ mmfileget https://MACHINE/api/v4/files/FILE TARGET-NAME
+
+will download file and save it in TARGET-NAME file.
+
+It uses ~/.netrc file (single line per machine format) for finding
+authentication credentials for MACHINE. You can override it with NETRC
+environment variable.
--- /dev/null
+package main
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/mattermost/mattermost-server/model"
+)
+
+func main() {
+ url := os.Args[1] // https://MACHINE/api/v4/files/FILE
+ s := strings.Split(url, "/")
+ machine, fileId := s[2], s[6]
+
+ netrcPath, ok := os.LookupEnv("NETRC")
+ if !ok {
+ netrcPath = filepath.Join(os.Getenv("HOME"), ".netrc")
+ }
+ data, err := ioutil.ReadFile(netrcPath)
+ if err != nil {
+ panic(err)
+ }
+ var login string
+ var password string
+ for _, line := range strings.Split(string(data), "\n") {
+ if i := strings.Index(line, "#"); i >= 0 {
+ line = line[:i]
+ }
+ f := strings.Fields(line)
+ if len(f) >= 6 &&
+ f[0] == "machine" && f[1] == machine &&
+ f[2] == "login" && f[4] == "password" {
+ login, password = f[3], f[5]
+ break
+ }
+ }
+ if login == "" || password == "" {
+ fmt.Fprintln(os.Stderr, "No credentials found for:", machine)
+ os.Exit(1)
+ }
+
+ Client := model.NewAPIv4Client("https://" + machine)
+ Client.Login(login, password)
+ info, _ := Client.GetFileInfo(fileId)
+ if info == nil {
+ os.Exit(1)
+ }
+ filename := info.Name
+ if len(os.Args) > 2 {
+ filename = os.Args[2]
+ } else {
+ fmt.Fprintln(os.Stderr, "Name:", info.Name)
+ fmt.Fprintln(os.Stderr, "Type:", info.MimeType)
+ fmt.Fprintln(os.Stderr, "Size:", info.Size)
+ fmt.Fprintln(os.Stderr, "Download? Ctrl-D/C")
+ os.Stdin.Read(make([]byte, 1))
+ }
+ data, _ = Client.GetFile(fileId)
+ if err = ioutil.WriteFile(filename, data, os.FileMode(0666)); err != nil {
+ panic(err)
+ }
+}