all repos — felt @ 882e7b14c3da5ab47c77c8011d8148cb88521f59

virtual tabletop for dungeons and dragons (and similar) using Go, MongoDB, and websockets

add admin router to gametable
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmOkiEsACgkQO3+8IhRO
Y5inARAAh9M+DxveWAbgv6iMNH+chcK4mOlQDbA1tpfkgxTm/ziflryJiNhrdnEE
Mt1rXmMwpbl4sXgiPnaMrk7qBFWqfb+zWH3DMwCJJqSUVxNWCuLz4I9RYLqOEmHE
294avPUiU+2qcIY/a8CQiY6zbiMAWtXtUiEpZ9K4JrbVOl3WmELow9sn5DRLM5+4
cuwo42/Gi1k8NF8buZNWgnPhBqzGrUPBeuKMIrNkcad60NAcHLzVsHUl2v4cf1XU
nx85HRy+zOx4IWf72bzrbWMpYKtxY819Gj6Coiv9b5v6ONvRSFv8q9KKA9/Vd/Uj
EaLD4wM7mrwFbFKk3+DAMCdo09axdp1aql6nErXkfoYMJ5gaShzGzujEWZr2HDcY
X5K9sp+kDndzwWZgWZI0xzjwn0TSoRti3BG2AwoPDIEf8lsYG6iAsatZjyjO1XzR
Xy/Dxl/gEpVkpSsQK/VprOyRQ6Ds8bGCwJsVM1c2jmz4e74Gp4sO8c8ifmbrp8j8
3vP4KmcQl+B84wh7Cgef2UgT2Ava6Kkj0We02hx/QtOhcNr7cDP+BNYKeoxCiJp4
k4AHW7cykSrBKEEUX/H4YgH8eK+C42vLxsxbsNkXNO2OLSwHD5yB25sQrO0m7ekP
GmrIwK+MRTWQBdpolqqmnK5FyxOfHnyS3WaYPjPjzXFusPGEI1U=
=G7Cw
-----END PGP SIGNATURE-----
commit

882e7b14c3da5ab47c77c8011d8148cb88521f59

parent

464a159354a2ab4d0008584af1f18e37b453d8be

4 files changed, 58 insertions(+), 31 deletions(-)

jump to
M admin/admin.goadmin/admin.go

@@ -1,37 +1,23 @@

package admin import ( - "json" + "context" "net/http" "nilfm.cc/git/felt/models" + "nilfm.cc/git/felt/mongodb" + "nilfm.cc/git/felt/admin/util" "nilfm.cc/git/quartzgun/auth" - "nilfm.cc/git/quartzgun/cookie" - "nilfm.cc/git/quartzgun/indentalUserDB" . "nilfm.cc/git/quartzgun/middleware" "nilfm.cc/git/quartzgun/renderer" "nilfm.cc/git/quartzgun/router" "strings" ) -func getUserFromToken(req *http.Request) string { - authHeader := req.Header.Get("Authorization") - if strings.HasPrefix(authHeader, "Bearer ") { - authToken := strings.Split(authHeader, "Bearer ")[1] - data, err := base64.StdEncoding.DecodeString(token) - if err == nil { - parts := strings.Split(string(data), "\n") - if len(parts) == 2 { - return parts[0] - } - } - } - return nil -} - -func apiGetTableData(next http.Handler, udb auth.UserStore) http.Handler { +func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler { handlerFunc := func(w http.ResponseWriter, req *http.Request) { // get username from + user := util.GetUserFromToken(req) rawTableData, err := udb.GetData(user, "tables") if err != nil {

@@ -39,8 +25,8 @@ // handle error - return 404 or 500?

} // split rawTableData - tableName,passCode;tableName,passCode; - tables := strings.Split(rawTableData, ";") - self := make([]models.TableKey) + tables := strings.Split(rawTableData.(string), ";") + self := []models.TableKey{} for _, t := range tables { parts := strings.Split(t, ",") if len(parts) == 2 {

@@ -51,21 +37,33 @@ })

} } - *req = *req.WithContext(context.WithValue(req.Context(), "tableData", self)) - next.serveHTTP(w, req) + *req = *req.WithContext(context.WithValue(req.Context(), "tableList", self)) + next.ServeHTTP(w, req) } - return handlerFunc + return http.HandlerFunc(handlerFunc) } -func CreateAdminInterface(udb auth.UserStore) http.Handler { +func apiGetTableData(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + + // tableName := req.Context().Value("Slug") + // get table entities from mongodb and store the data object in the context + next.ServeHTTP(w, req) + } + + return http.HandlerFunc(handlerFunc) +} + +func CreateAdminInterface(udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { // create quartzgun router rtr := &router.Router{} + + scopes := map[string]string{} rtr.Post("api/auth", Provision(udb, 84)) + rtr.Get(`api/table/`, Validate(apiGetTableList(renderer.JSON("tableList"), udb), udb, scopes)) + rtr.Get(`api/table/(?P<Slug>\S+)`, Validate(apiGetTableData(renderer.JSON("tableData"), udb, dbAdapter), udb, scopes)) - // initialize routes with admin interface - rtr.Get(`api/table/?P<Slug>\S+)`, Validate(apiGetTableData(renderer.JSON("tableData"), udb))) - - return router.ServeHTTP + return http.HandlerFunc(rtr.ServeHTTP) }
A admin/util/util.go

@@ -0,0 +1,22 @@

+package util + +import ( + "encoding/base64" + "net/http" + "strings" +) + +func GetUserFromToken(req *http.Request) string { + authHeader := req.Header.Get("Authorization") + if strings.HasPrefix(authHeader, "Bearer ") { + authToken := strings.Split(authHeader, "Bearer ")[1] + data, err := base64.StdEncoding.DecodeString(authToken) + if err == nil { + parts := strings.Split(string(data), "\n") + if len(parts) == 2 { + return parts[0] + } + } + } + return "" +}
M gametable/server.gogametable/server.go

@@ -8,9 +8,11 @@ "io/ioutil"

"log" "net/http" "nhooyr.io/websocket" + "nilfm.cc/git/felt/admin" "nilfm.cc/git/felt/models" "nilfm.cc/git/felt/mongodb" "nilfm.cc/git/quartzgun/cookie" + "nilfm.cc/git/quartzgun/auth" "sync" "time" )

@@ -30,7 +32,7 @@ subscribers map[*Subscriber]models.TableKey

dbAdapter mongodb.DbAdapter } -func New(adapter mongodb.DbAdapter) *GameTableServer { +func New(adapter mongodb.DbAdapter, udb auth.UserStore) *GameTableServer { srvr := &GameTableServer{ subscribeMessageBuffer: 16, logf: log.Printf,

@@ -39,6 +41,7 @@ publishLimiter: rate.NewLimiter(rate.Every(time.Millisecond*100), 8),

dbAdapter: adapter, } srvr.serveMux.Handle("/table/", http.FileServer(http.Dir("./static"))) + srvr.serveMux.Handle("/admin/", admin.CreateAdminInterface(udb, adapter)) srvr.serveMux.HandleFunc("/subscribe", srvr.subscribeHandler) srvr.serveMux.HandleFunc("/publish", srvr.publishHandler)
M main.gomain.go

@@ -7,6 +7,7 @@ "net"

"net/http" "nilfm.cc/git/felt/gametable" "nilfm.cc/git/felt/mongodb" + "nilfm.cc/git/quartzgun/indentalUserDB" "os" "os/signal" "time"

@@ -31,7 +32,10 @@ if err != nil {

return err } - gt := gametable.New(dbEngine) + udb := indentalUserDB.CreateIndentalUserDB( + "./user.db") + + gt := gametable.New(dbEngine, udb) s := &http.Server{ Handler: gt, ReadTimeout: time.Second * 10,