dkforest

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

commit d440eb914b0808a88d1ca09f09897fb51a2cd662
parent a6afd6d787ede0137a1e898bf525b448f4883d99
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Sat, 10 Jun 2023 07:58:16 -0700

api key page

Diffstat:
Mpkg/web/handlers/data.go | 6++++++
Mpkg/web/handlers/handlers.go | 23+++++++++++++++++++++++
Apkg/web/public/views/pages/settings/api.gohtml | 37+++++++++++++++++++++++++++++++++++++
Mpkg/web/public/views/pages/settings/index.gohtml | 1+
Mpkg/web/web.go | 2++
5 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go @@ -727,6 +727,12 @@ type WrapperSession struct { CurrentSession bool } +type settingsAPIData struct { + ActiveTab string + APIKey string + NeedConfirm bool +} + type settingsSecurityData struct { ActiveTab string Logs []database.SecurityLog diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -2835,6 +2835,29 @@ func SettingsInboxSentHandler(c echo.Context) error { return c.Render(http.StatusOK, "settings.inbox-sent", data) } +func SettingsAPIHandler(c echo.Context) error { + authUser := c.Get("authUser").(*database.User) + db := c.Get("database").(*database.DkfDB) + var data settingsAPIData + data.ActiveTab = "api" + data.APIKey = authUser.ApiKey + if c.Request().Method == http.MethodPost { + formName := c.Request().PostFormValue("formName") + btnSubmit := c.Request().PostFormValue("btn_submit") + if btnSubmit == "Cancel" { + return c.Redirect(http.StatusFound, c.Request().Referer()) + } + if formName == "confirm" { + token := utils.GenerateToken32() + authUser.ApiKey = token + authUser.DoSave(db) + return c.Redirect(http.StatusFound, c.Request().Referer()) + } + data.NeedConfirm = true + } + return c.Render(http.StatusOK, "settings.api", data) +} + func SettingsSecurityHandler(c echo.Context) error { authUser := c.Get("authUser").(*database.User) db := c.Get("database").(*database.DkfDB) diff --git a/pkg/web/public/views/pages/settings/api.gohtml b/pkg/web/public/views/pages/settings/api.gohtml @@ -0,0 +1,36 @@ +{{ define "sub-content" }} + {{ if .Data.NeedConfirm }} + <div class="card mb-3"> + <div class="card-header"> + API + </div> + <div class="card-body"> + <form method="post"> + <input type="hidden" name="csrf" value="{{ .CSRF }}" /> + <input type="hidden" name="formName" value="confirm" /> + <input name="btn_submit" type="submit" value="Confirm" class="btn btn-primary" /> + <input name="btn_submit" type="submit" value="Cancel" class="btn btn-danger" /> + </form> + </div> + </div> + {{ else }} + <div class="card mb-3"> + <div class="card-header"> + API + </div> + <div class="card-body"> + <form method="post"> + <input type="hidden" name="csrf" value="{{ .CSRF }}" /> + <input type="hidden" name="formName" value="" /> + <div class="form-group"> + <label>{{ t "API key" . }}</label> + <input name="api_key" placeholder="API key" value="{{ .Data.APIKey }}" class="form-control" type="text" readonly /> + </div> + <div class="form-group"> + <input type="submit" value="Generate new key" class="btn btn-primary" /> + </div> + </form> + </div> + </div> + {{ end }} +{{ end }} +\ No newline at end of file diff --git a/pkg/web/public/views/pages/settings/index.gohtml b/pkg/web/public/views/pages/settings/index.gohtml @@ -18,6 +18,7 @@ <a href="/settings/chat" class="list-group-item list-group-item-action{{ if eq .Data.ActiveTab "chat" }} active{{ end }}">{{ t "Chat settings" . }}</a> <a href="/settings/pgp" class="list-group-item list-group-item-action{{ if eq .Data.ActiveTab "pgp" }} active{{ end }}">{{ t "PGP" . }}</a> <a href="/settings/age" class="list-group-item list-group-item-action{{ if eq .Data.ActiveTab "age" }} active{{ end }}">{{ t "Age" . }}</a> + <a href="/settings/api" class="list-group-item list-group-item-action{{ if eq .Data.ActiveTab "api" }} active{{ end }}">{{ t "API" . }}</a> </div> </div> diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -115,6 +115,8 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te authGroup.POST("/settings/private-notes", handlers.SettingsPrivateNotesHandler) authGroup.GET("/settings/sessions", handlers.SettingsSessionsHandler) authGroup.POST("/settings/sessions", handlers.SettingsSessionsHandler) + authGroup.GET("/settings/api", handlers.SettingsAPIHandler) + authGroup.POST("/settings/api", handlers.SettingsAPIHandler) authGroup.GET("/settings/security", handlers.SettingsSecurityHandler) authGroup.GET("/settings/account", handlers.SettingsAccountHandler) authGroup.POST("/settings/account", handlers.SettingsAccountHandler, middlewares.AuthRateLimitMiddleware(2*time.Second, 1))