use external config.json file

This commit is contained in:
Wouter Groeneveld 2021-04-11 11:08:27 +02:00
parent a8a2ee3aac
commit e194293a46
3 changed files with 86 additions and 25 deletions

2
.gitignore vendored
View File

@ -1,4 +1,6 @@
config.json
data/* data/*
testdata testdata

View File

@ -19,6 +19,42 @@ Inspect how it's used on https://brainbaking.com/ - usually, a `<link/>` in your
If you want to support the older pingback protocol, you can leverage webmenton.io's forward capabilities. Although I developed this primarily because webmention.io is _not_ reliable - you've been warned. If you want to support the older pingback protocol, you can leverage webmenton.io's forward capabilities. Although I developed this primarily because webmention.io is _not_ reliable - you've been warned.
## Building and running
Well, that's easy!
1. Build: `go build`
2. Run: `./go-jamming`
3. ???
4. Profit!
## Configuration
Place a `config.json` file in the same directory that looks like this:
```json
{
"port": 1337,
"host": "localhost",
"token": "sometoken",
"dataPath": "data",
"utcOffset": 60,
"allowedWebmentionSources": [
"blah.com"
],
"disallowedWebmentionDomains": [
"youtube.com"
]
}
```
- port, host: http server params
- token, allowedWebmentionSources: see below, used for authentication
- utcOffset: offset in minutes for date processing, starting from UTC time.
- dataPath: path to store all mentions as md5-encoded JSON filenames.
If a config file is missing, or required keys are missing, a warning will be generated and default values will be used instead. See `common/config.go`.
## What's in it? ## What's in it?
### 1. Webmentions ### 1. Webmentions
@ -38,11 +74,11 @@ Accepted form format:
target=https://aaronpk.example/post-by-aaron target=https://aaronpk.example/post-by-aaron
``` ```
Will result in a `202 Accepted` - it handles things async. Stores in `.json` files in `data/domain`. Will result in a `202 Accepted` - it handles things async. Stores in `.json` files in `[dataPath]/domain`.
#### 1.2 `GET /webmention/:domain/:token` #### 1.2 `GET /webmention/:domain/:token`
Retrieves a JSON array with relevant webmentions stored for that domain. The token should match. See `config.js` to fiddle with it yourself. Environment variables are supported, although I haven't used them yet. Retrieves a JSON array with relevant webmentions stored for that domain. The token should match. See configuration to fiddle with it yourself. Environment variables are supported, although I haven't used them yet.
#### 1.3 `PUT /webmention/:domain/:token` #### 1.3 `PUT /webmention/:domain/:token`
@ -95,8 +131,3 @@ Will result in a `200 OK` - that returns XML according to [The W3 pingback XML-R
Happens automatically through `PUT /webmention/:domain/:token`! Links that are discovered as `rel="pingback"` that **do not** already have a webmention link will be processed as XML-RPC requests to be send. Happens automatically through `PUT /webmention/:domain/:token`! Links that are discovered as `rel="pingback"` that **do not** already have a webmention link will be processed as XML-RPC requests to be send.
## TODOs
- `published` date is not well-formatted and blindly taken over from feed
- Implement a Brid.gy-like system that converts links from domains in the config found on [public Mastodon timelines](https://docs.joinmastodon.org/methods/timelines/) into webmentions. (And check if it's ok to only use the public line)

View File

@ -1,21 +1,39 @@
package common package common
import ( import (
"encoding/json"
"errors" "errors"
"io/ioutil"
"os" "os"
"strconv"
"strings" "strings"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )
type Config struct { type Config struct {
Port int Port int `json:"port"`
Token string Token string `json:"token"`
UtcOffset int UtcOffset int `json:"utcOffset"`
DataPath string DataPath string `json:"dataPath"`
AllowedWebmentionSources []string AllowedWebmentionSources []string `json:"allowedWebmentionSources"`
DisallowedWebmentionDomains []string DisallowedWebmentionDomains []string `json:"disallowedWebmentionDomains"`
}
func (c *Config) missingKeys() []string {
keys := []string{}
if c.Port == 0 {
keys = append(keys, "port")
}
if c.Token == "" {
keys = append(keys, "token")
}
if c.DataPath == "" {
keys = append(keys, "dataPath")
}
if len(c.AllowedWebmentionSources) == 0 {
keys = append(keys, "allowedWebmentionSources")
}
return keys
} }
func (c *Config) ContainsDisallowedDomain(url string) bool { func (c *Config) ContainsDisallowedDomain(url string) bool {
@ -53,23 +71,33 @@ func (c *Config) SetupDataDirs() {
} }
func Configure() (c *Config) { func Configure() (c *Config) {
portstr := os.Getenv("PORT") confData, err := ioutil.ReadFile("config.json")
port, err := strconv.Atoi(portstr)
if err != nil { if err != nil {
port = 1337 log.Warn().Msg("No config.json file found, reverting to defaults...")
} return defaultConfig()
token := os.Getenv("TOKEN")
if token == "" {
token = "miauwkes"
} }
c = &Config{ conf := &Config{}
Port: port, err = json.Unmarshal(confData, conf)
Token: token, if err != nil {
log.Warn().Msg("config.json malformed JSON, reverting to defaults...")
return defaultConfig()
}
someMissingKeys := conf.missingKeys()
if len(someMissingKeys) > 0 {
log.Warn().Str("keys", strings.Join(someMissingKeys, ", ")).Msg("config.json is missing required keys, reverting to defaults...")
return defaultConfig()
}
return conf
}
func defaultConfig() *Config {
return &Config{
Port: 1337,
Token: "miauwkes",
UtcOffset: 60, UtcOffset: 60,
DataPath: "data", DataPath: "data",
AllowedWebmentionSources: []string{"brainbaking.com", "jefklakscodex.com"}, AllowedWebmentionSources: []string{"brainbaking.com", "jefklakscodex.com"},
DisallowedWebmentionDomains: []string{"youtube.com"}, DisallowedWebmentionDomains: []string{"youtube.com"},
} }
return
} }