diff --git a/db.go b/db.go index a06eb20..47c9878 100644 --- a/db.go +++ b/db.go @@ -4,8 +4,6 @@ import ( "encoding/json" "fmt" "log" - "path" - "runtime" "time" "github.com/boltdb/bolt" @@ -15,12 +13,10 @@ var db *bolt.DB var open bool // Open to create the database and open -func Open() error { +func Open(filename string) error { var err error - _, filename, _, _ := runtime.Caller(0) // get full path of this file - dbfile := path.Join(path.Dir(filename), "data.db") config := &bolt.Options{Timeout: 30 * time.Second} - db, err = bolt.Open(dbfile, 0600, config) + db, err = bolt.Open(filename, 0600, config) if err != nil { fmt.Println("Opening BoltDB timed out") log.Fatal(err) diff --git a/main.go b/main.go index 916530f..2d37ebe 100644 --- a/main.go +++ b/main.go @@ -1,26 +1,57 @@ package main import ( + "flag" "fmt" "log" - "os" + "path" + "runtime" "github.com/gin-gonic/gin" ) -var ExternalIP string -var AllowedIPs string +// AllowedIPs is a white/black list of +// IP addresses allowed to access cowyo +var AllowedIPs = map[string]bool{ + "192.168.1.13": true, + "192.168.1.12": true, + "192.168.1.2": true, +} -func init() { - AllowedIPs = "192.168.1.13,192.168.1.12,192.168.1.2" +// RuntimeArgs contains all runtime +// arguments available +var RuntimeArgs struct { + ExternalIP string + Port string + DatabaseLocation string + ServerCRT string + ServerKey string } func main() { - if len(os.Args) == 1 { + _, executableFile, _, _ := runtime.Caller(0) // get full path of this file + databaseFile := path.Join(path.Dir(executableFile), "data.db") + flag.StringVar(&RuntimeArgs.Port, "p", ":12312", "port to bind") + flag.StringVar(&RuntimeArgs.DatabaseLocation, "db", databaseFile, "location of database file") + flag.StringVar(&RuntimeArgs.ServerCRT, "crt", "", "location of ssl crt") + flag.StringVar(&RuntimeArgs.ServerKey, "key", "", "location of ssl key") + flag.CommandLine.Usage = func() { + fmt.Println(`cowyo: a websocket notepad +run this to start the server and then visit localhost at the port you specify +(see parameters). +Example: 'cowyo localhost' +Example: 'cowyo -p :8080 localhost' +Example: 'cowyo -db /var/lib/cowyo/db.bolt localhost' +Example: 'cowyo -p :8080 -crt ssl/server.crt -key ssl/server.key localhost' +Options:`) + flag.CommandLine.PrintDefaults() + } + flag.Parse() + RuntimeArgs.ExternalIP = flag.Arg(0) + if RuntimeArgs.ExternalIP == "" { log.Fatal("You need to specify the external IP address") } - ExternalIP = os.Args[1] - Open() + Open(RuntimeArgs.DatabaseLocation) defer Close() // Default page @@ -34,5 +65,10 @@ func main() { r.GET("/:title", editNote) r.GET("/:title/*option", everythingElse) r.DELETE("/listitem", deleteListItem) - r.Run(":12312") + if RuntimeArgs.ServerCRT != "" && RuntimeArgs.ServerKey != "" { + r.RunTLS(RuntimeArgs.Port, RuntimeArgs.ServerCRT, RuntimeArgs.ServerKey) + } else { + log.Println("No crt/key found, running non-https") + r.Run(RuntimeArgs.Port) + } } diff --git a/routes.go b/routes.go index 4524634..a752bac 100644 --- a/routes.go +++ b/routes.go @@ -27,7 +27,7 @@ func editNote(c *gin.Context) { } else { c.HTML(http.StatusOK, "index.tmpl", gin.H{ "Title": title, - "ExternalIP": ExternalIP, + "ExternalIP": RuntimeArgs.ExternalIP, }) } } diff --git a/ssl/README.md b/ssl/README.md new file mode 100644 index 0000000..3f92770 --- /dev/null +++ b/ssl/README.md @@ -0,0 +1,10 @@ +# To create sample keys: + +``` +openssl genrsa -out server.key 2048 +openssl req -new -x509 -key server.key -days 3650 -nodes -out server.crt -keyout server.crt +``` + +## TODO + +* check if ed25519 keys work