2021-02-25 14:01:43 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/rsa"
|
|
|
|
"crypto/x509"
|
|
|
|
"encoding/pem"
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
func mustGetEnv(env string) (val string) {
|
|
|
|
val, ok := os.LookupEnv(env)
|
|
|
|
if !ok {
|
|
|
|
log.Fatalf("required env var %s not found", env)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var host string
|
2021-02-25 14:14:54 +00:00
|
|
|
var fullhost string
|
|
|
|
var prefix *string
|
2021-02-25 14:01:43 +00:00
|
|
|
|
|
|
|
func main() {
|
2021-02-25 14:14:54 +00:00
|
|
|
prefix = flag.String("prefix", "AW_", "Environment var prefix")
|
2021-02-25 14:01:43 +00:00
|
|
|
proto := flag.String("proto", "https", "Protocol under which this server is going to be exposed")
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
bind, ok := os.LookupEnv(*prefix + "BIND")
|
|
|
|
if !ok {
|
|
|
|
bind = ":8080" // Default to *:8080
|
|
|
|
}
|
|
|
|
|
|
|
|
host = strings.ToLower(mustGetEnv(*prefix + "HOST"))
|
2021-02-25 14:14:54 +00:00
|
|
|
fullhost = fmt.Sprintf("%s://%s", *proto, host)
|
|
|
|
|
|
|
|
discoverApps()
|
|
|
|
|
|
|
|
http.HandleFunc("/.well-known/host-meta", hostMetaHandler)
|
|
|
|
http.HandleFunc("/.well-known/webfinger", handlerWebFinger)
|
|
|
|
http.HandleFunc("/u/", handlerUserPage)
|
|
|
|
http.HandleFunc("/inbox", func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
byt, _ := ioutil.ReadAll(r.Body)
|
|
|
|
fmt.Println(string(byt))
|
|
|
|
})
|
|
|
|
|
|
|
|
if err := http.ListenAndServe(bind, nil); err != nil {
|
|
|
|
log.Fatalf("error while listening: %f", err)
|
|
|
|
}
|
|
|
|
}
|
2021-02-25 14:01:43 +00:00
|
|
|
|
2021-02-25 14:14:54 +00:00
|
|
|
func discoverApps() {
|
2021-02-25 14:01:43 +00:00
|
|
|
// Find app definitions
|
|
|
|
envs := os.Environ()
|
|
|
|
envAppPrefix := *prefix + "APP_"
|
|
|
|
envAppPrefixLen := len(envAppPrefix)
|
|
|
|
apps = make(map[string]appDef)
|
|
|
|
for _, envName := range envs {
|
|
|
|
// Filter for APP_* vars
|
|
|
|
if !strings.HasPrefix(envName, envAppPrefix) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
// Retrieve app name
|
|
|
|
nextSep := strings.Index(envName[envAppPrefixLen:], "_")
|
|
|
|
if nextSep < 0 {
|
|
|
|
nextSep = 0
|
|
|
|
}
|
|
|
|
name := envName[envAppPrefixLen : envAppPrefixLen+nextSep]
|
|
|
|
appName := strings.ToLower(name)
|
|
|
|
// Skip if we processed this app already
|
|
|
|
if _, ok := apps[appName]; ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
// Retrieve info for app
|
|
|
|
var pubkey *rsa.PublicKey = nil
|
|
|
|
if key, ok := os.LookupEnv(envAppPrefix + name + "_PEM"); ok {
|
|
|
|
key, _ := pem.Decode([]byte(key))
|
|
|
|
pub, err := x509.ParsePKCS1PublicKey(key.Bytes)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("Error while parsing PEM/PKCS1 block for %s: %s", envAppPrefix+name+"_PEM", err.Error())
|
|
|
|
}
|
|
|
|
pubkey = pub
|
|
|
|
}
|
|
|
|
|
|
|
|
apps[appName] = appDef{
|
|
|
|
Name: mustGetEnv(envAppPrefix + name + "_NAME"),
|
|
|
|
WebhookURL: mustGetEnv(envAppPrefix + name + "_URL"),
|
|
|
|
PublicKey: pubkey,
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Printf("app registered: %s", appName)
|
|
|
|
}
|
|
|
|
}
|