mirror of
https://github.com/h44z/wg-portal.git
synced 2025-08-25 14:31:14 +00:00
V2 alpha - initial version (#172)
Initial alpha codebase for version 2 of WireGuard Portal. This version is considered unstable and incomplete (for example, no public REST API)! Use with care! Fixes/Implements the following issues: - OAuth support #154, #1 - New Web UI with internationalisation support #98, #107, #89, #62 - Postgres Support #49 - Improved Email handling #47, #119 - DNS Search Domain support #46 - Bugfixes #94, #48 --------- Co-authored-by: Fabian Wechselberger <wechselbergerf@hotmail.com>
This commit is contained in:
101
internal/app/api/v0/handlers/endpoint_config.go
Normal file
101
internal/app/api/v0/handlers/endpoint_config.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"embed"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/h44z/wg-portal/internal/app"
|
||||
"github.com/h44z/wg-portal/internal/app/api/v0/model"
|
||||
"html/template"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
//go:embed frontend_config.js.gotpl
|
||||
var frontendJs embed.FS
|
||||
|
||||
type configEndpoint struct {
|
||||
app *app.App
|
||||
authenticator *authenticationHandler
|
||||
|
||||
tpl *template.Template
|
||||
}
|
||||
|
||||
func newConfigEndpoint(app *app.App, authenticator *authenticationHandler) configEndpoint {
|
||||
ep := configEndpoint{
|
||||
app: app,
|
||||
authenticator: authenticator,
|
||||
tpl: template.Must(template.ParseFS(frontendJs, "frontend_config.js.gotpl")),
|
||||
}
|
||||
|
||||
return ep
|
||||
}
|
||||
|
||||
func (e configEndpoint) GetName() string {
|
||||
return "ConfigEndpoint"
|
||||
}
|
||||
|
||||
func (e configEndpoint) RegisterRoutes(g *gin.RouterGroup, authenticator *authenticationHandler) {
|
||||
apiGroup := g.Group("/config")
|
||||
|
||||
apiGroup.GET("/frontend.js", e.handleConfigJsGet())
|
||||
apiGroup.GET("/settings", e.authenticator.LoggedIn(), e.handleSettingsGet())
|
||||
}
|
||||
|
||||
// handleConfigJsGet returns a gorm handler function.
|
||||
//
|
||||
// @ID config_handleConfigJsGet
|
||||
// @Tags Configuration
|
||||
// @Summary Get the dynamic frontend configuration javascript.
|
||||
// @Produce text/javascript
|
||||
// @Success 200 string javascript "The JavaScript contents"
|
||||
// @Router /config/frontend.js [get]
|
||||
func (e configEndpoint) handleConfigJsGet() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
backendUrl := fmt.Sprintf("%s/api/v0", e.app.Config.Web.ExternalUrl)
|
||||
if c.GetHeader("x-wg-dev") != "" {
|
||||
referer := c.Request.Header.Get("Referer")
|
||||
host := "localhost"
|
||||
port := "5000"
|
||||
parsedReferer, err := url.Parse(referer)
|
||||
if err == nil {
|
||||
host, port, _ = net.SplitHostPort(parsedReferer.Host)
|
||||
}
|
||||
backendUrl = fmt.Sprintf("http://%s:%s/api/v0", host, port) // override if request comes from frontend started with npm run dev
|
||||
}
|
||||
buf := &bytes.Buffer{}
|
||||
err := e.tpl.ExecuteTemplate(buf, "frontend_config.js.gotpl", gin.H{
|
||||
"BackendUrl": backendUrl,
|
||||
"Version": "unknown",
|
||||
"SiteTitle": e.app.Config.Web.SiteTitle,
|
||||
"SiteCompanyName": e.app.Config.Web.SiteCompanyName,
|
||||
})
|
||||
if err != nil {
|
||||
c.Status(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
c.Data(http.StatusOK, "application/javascript", buf.Bytes())
|
||||
}
|
||||
}
|
||||
|
||||
// handleSettingsGet returns a gorm handler function.
|
||||
//
|
||||
// @ID config_handleSettingsGet
|
||||
// @Tags Configuration
|
||||
// @Summary Get the frontend settings object.
|
||||
// @Produce json
|
||||
// @Success 200 {object} model.Settings
|
||||
// @Success 200 string javascript "The JavaScript contents"
|
||||
// @Router /config/settings [get]
|
||||
func (e configEndpoint) handleSettingsGet() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, model.Settings{
|
||||
MailLinkOnly: e.app.Config.Mail.LinkOnly,
|
||||
PersistentConfigSupported: e.app.Config.Advanced.ConfigStoragePath != "",
|
||||
SelfProvisioning: e.app.Config.Core.SelfProvisioningAllowed,
|
||||
})
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user