dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit f7ca88fd4ebfecedb1afc02a680e1935b9f82af9
parent 1b8f67b8d093a02ea15d06f9c2bf97a8b03afcc0
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 22 Jun 2023 08:51:22 -0700

keep track of which client frontend was used for a request (tor / i2p) & dynamic git url accordingly

Diffstat:
Mpkg/config/config.go | 1+
Mpkg/template/templates.go | 9++++++++-
Apkg/web/clientFrontends/clientFrontends.go | 8++++++++
Mpkg/web/middlewares/middlewares.go | 10++++++++++
Mpkg/web/web.go | 16+++++++++-------
5 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/pkg/config/config.go b/pkg/config/config.go @@ -34,6 +34,7 @@ var RoomPasswordSalt = "room_pa$$word_$alt_OYvUwmNPVTdsw" const ( DkfOnion = "http://dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion" DkfGitOnion = "http://git.dkforestseeaaq2dqz2uflmlsybvnq2irzn4ygyvu53oazyorednviid.onion" + I2pGitOnion = "http://git.dkforest4gwaceahf4te3vs7ycddtbpf2lucocxdzhphezikdgnq.b32.i2p" DkfGit1Onion = "http://yylovpz7taca7jfrub3wltxabzzjp34fngj5lpwl6eo47ekt5cxs6mid.onion" ChattorOnion = "http://chattorwozgwecrzzbchyhvxiyomny6jn4ac2njc22ozgwg42bhtupad.onion" DreadOnion = "http://dreadytofatroptsdj6io7l3xptbet6onoyno2yv7jicoxknyazubrad.onion" diff --git a/pkg/template/templates.go b/pkg/template/templates.go @@ -2,6 +2,7 @@ package template import ( "dkforest/pkg/global" + "dkforest/pkg/web/clientFrontends" hutils "dkforest/pkg/web/handlers/utils" "fmt" "html/template" @@ -67,6 +68,7 @@ func (t *Templates) Render(w io.Writer, name string, data any, c echo.Context) e tmpl := t.Templates[name] db := c.Get("database").(*database.DkfDB) + clientFE := c.Get("clientFE").(clientFrontends.ClientFrontend) d := templateDataStruct{} d.TmplName = name @@ -87,7 +89,12 @@ func (t *Templates) Render(w io.Writer, name string, data any, c echo.Context) e d.BaseKeywords = strings.Join(getBaseKeywords(), ", ") d.Development = config.Development.Load() d.AuthUser = c.Get("authUser").(*database.User) - d.GitURL = config.DkfGitOnion + switch clientFE { + case clientFrontends.TorClientFE: + d.GitURL = config.DkfGitOnion + case clientFrontends.I2PClientFE: + d.GitURL = config.I2pGitOnion + } d.WallpaperImg = "/public/img/login_bg.jpg" year, month, day := time.Now().UTC().Date() diff --git a/pkg/web/clientFrontends/clientFrontends.go b/pkg/web/clientFrontends/clientFrontends.go @@ -0,0 +1,8 @@ +package clientFrontends + +type ClientFrontend int + +const ( + TorClientFE = iota + 1 + I2PClientFE +) diff --git a/pkg/web/middlewares/middlewares.go b/pkg/web/middlewares/middlewares.go @@ -2,6 +2,7 @@ package middlewares import ( "dkforest/bindata" + "dkforest/pkg/web/clientFrontends" hutils "dkforest/pkg/web/handlers/utils" "net" "net/http" @@ -223,6 +224,15 @@ func SetDatabaseMiddleware(db *database.DkfDB) echo.MiddlewareFunc { } } +func SetClientFEMiddleware(clientFE clientFrontends.ClientFrontend) echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(ctx echo.Context) error { + ctx.Set("clientFE", clientFE) + return next(ctx) + } + } +} + // SetUserMiddleware Get user and put it into echo context. // - Get auth-token from cookie // - If exists, get user from database diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -8,6 +8,7 @@ import ( "dkforest/pkg/staticbin" tmp "dkforest/pkg/template" "dkforest/pkg/utils" + "dkforest/pkg/web/clientFrontends" "dkforest/pkg/web/handlers" v1 "dkforest/pkg/web/handlers/api/v1" "dkforest/pkg/web/middlewares" @@ -31,7 +32,7 @@ import ( "time" ) -func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Templates) echo.HandlerFunc { +func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Templates, clientFE clientFrontends.ClientFrontend) echo.HandlerFunc { e := newEcho() e.Server.ReadHeaderTimeout = 10 * time.Second @@ -41,6 +42,7 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te e.Use(staticbin.Static(bindata.Asset, staticbin.Options{Dir: "/public", SkipLogging: true})) e.Renderer = renderer e.Use(middlewares.SetDatabaseMiddleware(db)) + e.Use(middlewares.SetClientFEMiddleware(clientFE)) e.Use(middlewares.FirstUseMiddleware) e.Use(middlewares.DdosMiddleware) e.Use(middlewares.MaintenanceMiddleware) @@ -317,7 +319,7 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te } } -func getBaseServer(db *database.DkfDB) *echo.Echo { +func getBaseServer(db *database.DkfDB, clientFE clientFrontends.ClientFrontend) *echo.Echo { e := newEcho() renderer := tmp.GetRenderer(e) i18nBundle := getI18nBundle() @@ -329,13 +331,13 @@ func getBaseServer(db *database.DkfDB) *echo.Echo { e.POST("/api/v1/file-drop/:uuid/dkfdownload", handlers.FileDropDkfDownloadHandler, middlewares.SetDatabaseMiddleware(db), middlewares.I18nMiddleware(i18nBundle, "en"), middlewares.SetUserMiddleware, middlewares.IsAuthMiddleware) e.GET("/downloads/:fileName", handlers.FileDropDownloadHandler, middlewares.SetDatabaseMiddleware(db), middlewares.I18nMiddleware(i18nBundle, "en"), middlewares.SetUserMiddleware) e.POST("/downloads/:fileName", handlers.FileDropDownloadHandler, middlewares.SetDatabaseMiddleware(db), middlewares.I18nMiddleware(i18nBundle, "en"), middlewares.SetUserMiddleware) - e.Any("*", getMainServer(db, i18nBundle, renderer)) + e.Any("*", getMainServer(db, i18nBundle, renderer, clientFE)) return e } -func getSubdomainServer(db *database.DkfDB) *echo.Echo { +func getSubdomainServer(db *database.DkfDB, clientFE clientFrontends.ClientFrontend) *echo.Echo { rp := getReverseProxy(config.GogsURL) - be := getBaseServer(db) + be := getBaseServer(db, clientFE) e := newEcho() e.Any("*", func(c echo.Context) error { res := c.Response() @@ -356,11 +358,11 @@ func getI2pServer(db *database.DkfDB) *echo.Echo { if config.Development.IsTrue() { return nil } - return getSubdomainServer(db) + return getSubdomainServer(db, clientFrontends.I2PClientFE) } func getTorServer(db *database.DkfDB) *echo.Echo { - e := getSubdomainServer(db) + e := getSubdomainServer(db, clientFrontends.TorClientFE) configTorProdServer(e) return e }