113 lines
2.1 KiB
Go
113 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"strconv"
|
|
|
|
"git.xeserv.us/xena/apig/internal/confyg"
|
|
storm "github.com/asdine/storm"
|
|
"github.com/burl/ejson/crypto"
|
|
)
|
|
|
|
type server struct {
|
|
port string
|
|
keys *crypto.Keypair
|
|
db *storm.DB
|
|
}
|
|
|
|
func (s *server) Allow(verb string, block bool) bool {
|
|
switch verb {
|
|
case "port":
|
|
return !block
|
|
case "dbfile":
|
|
return !block
|
|
case "keys":
|
|
return !block
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func (s *server) Read(errs *bytes.Buffer, fs *confyg.FileSyntax, line *confyg.Line, verb string, args []string) {
|
|
switch verb {
|
|
case "port":
|
|
_, err := strconv.Atoi(args[0])
|
|
if err != nil {
|
|
fmt.Fprintf(errs, "%s:%d value is not a number: %s: %v\n", fs.Name, line.Start.Line, args[0], err)
|
|
return
|
|
}
|
|
|
|
s.port = args[0]
|
|
|
|
case "dbfile":
|
|
dbFile := args[0][1 : len(args[0])-1] // shuck off quotes
|
|
|
|
db, err := storm.Open(dbFile)
|
|
if err != nil {
|
|
fmt.Fprintf(errs, "%s:%d failed to open storm database: %s: %v\n", fs.Name, line.Start.Line, args[0], err)
|
|
return
|
|
}
|
|
|
|
s.db = db
|
|
|
|
case "keys":
|
|
kp := &crypto.Keypair{}
|
|
|
|
pubk, err := hex.DecodeString(args[0])
|
|
if err != nil {
|
|
fmt.Fprintf(errs, "%s:%d invalid public key: %v\n", fs.Name, line.Start.Line, err)
|
|
return
|
|
}
|
|
|
|
privk, err := hex.DecodeString(args[1])
|
|
if err != nil {
|
|
fmt.Fprintf(errs, "%s:%d invalid private key: %v\n", fs.Name, line.Start.Line, err)
|
|
return
|
|
}
|
|
|
|
copy(kp.Public[:], pubk[0:32])
|
|
copy(kp.Private[:], privk[0:32])
|
|
|
|
s.keys = kp
|
|
}
|
|
}
|
|
|
|
var (
|
|
configFile = flag.String("cfg", "./apig.cfg", "apig config file location")
|
|
keygen = flag.Bool("keygen", false, "if true, generate a new root keypair")
|
|
)
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
if *keygen {
|
|
k := &crypto.Keypair{}
|
|
err := k.Generate()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
log.Printf("public: %s", k.PublicString())
|
|
log.Printf("private: %s", k.PrivateString())
|
|
return
|
|
}
|
|
|
|
data, err := ioutil.ReadFile(*configFile)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
s := &server{}
|
|
_, err = confyg.Parse(*configFile, data, s, s)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
_ = s
|
|
}
|