// mmc -- Mattermost client
-// Copyright (C) 2023 Sergey Matveev <stargrave@stargrave.org>
+// Copyright (C) 2023-2024 Sergey Matveev <stargrave@stargrave.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
package mmc
import (
+ "crypto/sha256"
+ "crypto/x509"
+ "encoding/hex"
+ "errors"
+ "os"
"strings"
"time"
+ "github.com/davecgh/go-spew/spew"
"github.com/mattermost/mattermost-server/v6/model"
"go.cypherpunks.ru/recfile"
)
const (
+ PerPage = 100
OutRec = "out.rec"
OutRecLock = "out.rec.lock"
Last = "last"
}
if post.P.Metadata != nil {
for _, fi := range post.P.Metadata.Files {
- fields = append(fields, recfile.Field{Name: "File", Value: fi.Id})
+ fields = append(
+ fields,
+ recfile.Field{Name: "File", Value: fi.Id},
+ recfile.Field{Name: "FileName", Value: fi.Name},
+ )
}
}
if _, err = w.WriteFields(fields...); err != nil {
_, err = w.WriteFieldMultiline("Text", strings.Split(post.P.Message, "\n"))
return err
}
+
+func GetUsers(c *model.Client4, debugFd *os.File) (map[string]*model.User, error) {
+ users := make(map[string]*model.User)
+ for n := 0; ; n++ {
+ time.Sleep(SleepTime)
+ page, resp, err := c.GetUsers(n, PerPage, "")
+ if err != nil {
+ if debugFd != nil {
+ spew.Fdump(debugFd, resp)
+ }
+ return nil, err
+ }
+ if debugFd != nil {
+ spew.Fdump(debugFd, page)
+ }
+ for _, u := range page {
+ users[u.Id] = u
+ }
+ if len(page) < PerPage {
+ break
+ }
+ }
+ return users, nil
+}
+
+func GetEntrypoint() string {
+ s := os.Getenv("MMC_ENTRYPOINT")
+ if s == "" {
+ return "http://mm.invalid"
+ }
+ return s
+}
+
+func GetSPKIHash() string {
+ s := os.Getenv("MMC_SPKI")
+ if s == "" {
+ return "deadbeef"
+ }
+ return s
+}
+
+func NewVerifyPeerCertificate(hashExpected string) func(
+ rawCerts [][]byte, verifiedChains [][]*x509.Certificate,
+) error {
+ return func(
+ rawCerts [][]byte, verifiedChains [][]*x509.Certificate,
+ ) error {
+ cer, err := x509.ParseCertificate(rawCerts[0])
+ if err != nil {
+ return err
+ }
+ spki := cer.RawSubjectPublicKeyInfo
+ hsh := sha256.Sum256(spki)
+ if hashExpected != hex.EncodeToString(hsh[:]) {
+ return errors.New("server certificate's SPKI hash mismatch")
+ }
+ return nil
+ }
+}