Tulir Asokan
6 months ago
6 changed files with 176 additions and 0 deletions
-
10.gitlab-ci.yml
-
16giphyproxy/Dockerfile
-
17giphyproxy/example-config.yaml
-
24giphyproxy/go.mod
-
47giphyproxy/go.sum
-
62giphyproxy/main.go
@ -0,0 +1,10 @@ |
|||||
|
build giphy proxy docker: |
||||
|
image: docker:stable |
||||
|
stage: build |
||||
|
before_script: |
||||
|
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY |
||||
|
script: |
||||
|
- docker build -t $CI_REGISTRY_IMAGE/giphyproxy:latest giphyproxy |
||||
|
- docker push $CI_REGISTRY_IMAGE/giphyproxy:latest |
||||
|
only: |
||||
|
- master |
@ -0,0 +1,16 @@ |
|||||
|
FROM golang:1-alpine AS builder |
||||
|
|
||||
|
RUN apk add --no-cache ca-certificates |
||||
|
WORKDIR /build/giphyproxy |
||||
|
COPY . /build/giphyproxy |
||||
|
ENV CGO_ENABLED=0 |
||||
|
RUN go build -o /usr/bin/giphyproxy |
||||
|
|
||||
|
FROM scratch |
||||
|
|
||||
|
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ |
||||
|
COPY --from=builder /usr/bin/giphyproxy /usr/bin/giphyproxy |
||||
|
|
||||
|
VOLUME /data |
||||
|
WORKDIR /data |
||||
|
CMD ["/usr/bin/giphyproxy"] |
@ -0,0 +1,17 @@ |
|||||
|
# The server name to use for the custom mxc:// URIs. |
||||
|
# This server name will effectively be a real Matrix server, it just won't implement anything other than media. |
||||
|
# You must either set up .well-known delegation from this domain to this program, or proxy the domain directly to this program. |
||||
|
server_name: giphy.example.com |
||||
|
# Optionally a custom .well-known response. This defaults to `server_name:443` if empty. |
||||
|
well_known_response: |
||||
|
# The proxy will use MSC3860/MSC3916 media download redirects if the requester supports it. |
||||
|
# Optionally, you can force redirects and not allow proxying at all by setting this to false. |
||||
|
allow_proxy: false |
||||
|
# Matrix server signing key to make the federation tester pass, same format as synapse's .signing.key file. |
||||
|
# You can generate one using `giphyproxy -generate-key`. |
||||
|
server_key: CHANGE ME |
||||
|
|
||||
|
# Hostname where the proxy should listen on |
||||
|
hostname: 0.0.0.0 |
||||
|
# Port where the proxy should listen on |
||||
|
port: 8008 |
@ -0,0 +1,24 @@ |
|||||
|
module go.mau.fi/stickerpicker/giphyproxy |
||||
|
|
||||
|
go 1.22.3 |
||||
|
|
||||
|
require ( |
||||
|
go.mau.fi/util v0.5.0 |
||||
|
gopkg.in/yaml.v3 v3.0.1 |
||||
|
maunium.net/go/mautrix v0.19.0-beta.1.0.20240619084603-3e302fb46fdb |
||||
|
) |
||||
|
|
||||
|
require ( |
||||
|
github.com/gorilla/mux v1.8.0 // indirect |
||||
|
github.com/mattn/go-colorable v0.1.13 // indirect |
||||
|
github.com/mattn/go-isatty v0.0.19 // indirect |
||||
|
github.com/rs/zerolog v1.33.0 // indirect |
||||
|
github.com/tidwall/gjson v1.17.1 // indirect |
||||
|
github.com/tidwall/match v1.1.1 // indirect |
||||
|
github.com/tidwall/pretty v1.2.0 // indirect |
||||
|
github.com/tidwall/sjson v1.2.5 // indirect |
||||
|
golang.org/x/crypto v0.24.0 // indirect |
||||
|
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect |
||||
|
golang.org/x/net v0.26.0 // indirect |
||||
|
golang.org/x/sys v0.21.0 // indirect |
||||
|
) |
@ -0,0 +1,47 @@ |
|||||
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= |
||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= |
||||
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= |
||||
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= |
||||
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= |
||||
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= |
||||
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= |
||||
|
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= |
||||
|
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= |
||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= |
||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
|
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= |
||||
|
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= |
||||
|
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= |
||||
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= |
||||
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= |
||||
|
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= |
||||
|
github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= |
||||
|
github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= |
||||
|
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= |
||||
|
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= |
||||
|
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= |
||||
|
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= |
||||
|
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= |
||||
|
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= |
||||
|
go.mau.fi/util v0.5.0 h1:8yELAl+1CDRrwGe9NUmREgVclSs26Z68pTWePHVxuDo= |
||||
|
go.mau.fi/util v0.5.0/go.mod h1:DsJzUrJAG53lCZnnYvq9/mOyLuPScWwYhvETiTrpdP4= |
||||
|
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= |
||||
|
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= |
||||
|
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= |
||||
|
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= |
||||
|
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= |
||||
|
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= |
||||
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |
||||
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |
||||
|
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |
||||
|
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= |
||||
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= |
||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= |
||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
||||
|
maunium.net/go/mautrix v0.19.0-beta.1.0.20240619084603-3e302fb46fdb h1:xOe8J6rG2ADTVl56+SFDBDJkwmfCzNpVHLDxHZS+c0w= |
||||
|
maunium.net/go/mautrix v0.19.0-beta.1.0.20240619084603-3e302fb46fdb/go.mod h1:cxv1w6+syudmEpOewHYIQT9yO7TM5UOWmf6xEBVI4H4= |
@ -0,0 +1,62 @@ |
|||||
|
// maunium-stickerpicker - A fast and simple Matrix sticker picker widget.
|
||||
|
// Copyright (C) 2024 Tulir Asokan
|
||||
|
//
|
||||
|
// This program is free software: you can redistribute it and/or modify
|
||||
|
// it under the terms of the GNU Affero General Public License as published by
|
||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||
|
// (at your option) any later version.
|
||||
|
//
|
||||
|
// This program is distributed in the hope that it will be useful,
|
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
|
// GNU Affero General Public License for more details.
|
||||
|
//
|
||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
|
||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"os" |
||||
|
"regexp" |
||||
|
|
||||
|
"go.mau.fi/util/exerrors" |
||||
|
"gopkg.in/yaml.v3" |
||||
|
"maunium.net/go/mautrix/federation" |
||||
|
"maunium.net/go/mautrix/mediaproxy" |
||||
|
) |
||||
|
|
||||
|
type Config struct { |
||||
|
mediaproxy.BasicConfig `yaml:",inline"` |
||||
|
mediaproxy.ServerConfig `yaml:",inline"` |
||||
|
} |
||||
|
|
||||
|
var configPath = flag.String("config", "config.yaml", "config file path") |
||||
|
var generateServerKey = flag.Bool("generate-key", false, "generate a new server key and exit") |
||||
|
|
||||
|
var giphyIDRegex = regexp.MustCompile(`^[a-zA-Z0-9-_]+$`) |
||||
|
|
||||
|
func main() { |
||||
|
flag.Parse() |
||||
|
if *generateServerKey { |
||||
|
fmt.Println(federation.GenerateSigningKey().SynapseString()) |
||||
|
} else { |
||||
|
cfgFile := exerrors.Must(os.ReadFile(*configPath)) |
||||
|
var cfg Config |
||||
|
exerrors.PanicIfNotNil(yaml.Unmarshal(cfgFile, &cfg)) |
||||
|
mp := exerrors.Must(mediaproxy.NewFromConfig(cfg.BasicConfig, getMedia)) |
||||
|
exerrors.PanicIfNotNil(mp.Listen(cfg.ServerConfig)) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func getMedia(_ context.Context, id string) (response mediaproxy.GetMediaResponse, err error) { |
||||
|
if !giphyIDRegex.MatchString(id) { |
||||
|
return nil, mediaproxy.ErrInvalidMediaIDSyntax |
||||
|
} |
||||
|
return &mediaproxy.GetMediaResponseURL{ |
||||
|
URL: fmt.Sprintf("https://i.giphy.com/%s.webp", id), |
||||
|
}, nil |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue