forked from wgroeneveld/go-jamming
use external config.json file
This commit is contained in:
parent
a8a2ee3aac
commit
e194293a46
|
@ -1,4 +1,6 @@
|
||||||
|
|
||||||
|
config.json
|
||||||
|
|
||||||
data/*
|
data/*
|
||||||
testdata
|
testdata
|
||||||
|
|
||||||
|
|
45
README.md
45
README.md
|
@ -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)
|
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue