diff --git a/README.md b/README.md index 7fc3207..727c4ff 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](https://github.com/ngoduykhanh/wireguard-ui/workflows/wireguard-ui%20build%20release/badge.svg) +![](https://github.com/alikhanich/wireguard-ui/workflows/wireguard-ui%20build%20release/badge.svg) # wireguard-ui @@ -27,8 +27,9 @@ Download the binary file from the release page and run it directly on the host m ### Using docker compose -The [examples/docker-compose](examples/docker-compose) folder contains example docker-compose files. -Choose the example which fits you the most, adjust the configuration for your needs, then run it like below: +You can take a look at this example +of [docker-compose.yml](https://github.com/alikhanich/wireguard-ui/blob/master/docker-compose.yaml). Please adjust +volume mount points to work with your setup. Then run it like below: ``` docker-compose up @@ -218,7 +219,7 @@ go build -o wireguard-ui ## License -MIT. See [LICENSE](https://github.com/ngoduykhanh/wireguard-ui/blob/master/LICENSE). +MIT. See [LICENSE](https://github.com/alikhanich/wireguard-ui/blob/master/LICENSE). ## Support diff --git a/docker-compose.yaml b/docker-compose.yaml index a7d49c0..6363d13 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -3,21 +3,18 @@ version: "3" services: wg: build: . - #image: ngoduykhanh/wireguard-ui:latest + image: wg-ui:latest container_name: wgui cap_add: - NET_ADMIN network_mode: host environment: - - SENDGRID_API_KEY - - EMAIL_FROM_ADDRESS - - EMAIL_FROM_NAME - - SESSION_SECRET + - SESSION_SECRET=vnsjdvb9134f39hvn9249 - WGUI_USERNAME=alpha - - WGUI_PASSWORD=this-unusual-password - - WG_CONF_TEMPLATE + - WGUI_PASSWORD=Negjqgfhjkm1! - WGUI_MANAGE_START=false - WGUI_MANAGE_RESTART=false + - WGUI_API_KEY=test logging: driver: json-file options: diff --git a/go.mod b/go.mod index 5842acb..5c3fcb0 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/ngoduykhanh/wireguard-ui +module github.com/alikhanich/wireguard-ui go 1.16 diff --git a/handler/routes.go b/handler/routes.go index d43d75f..886efce 100644 --- a/handler/routes.go +++ b/handler/routes.go @@ -20,10 +20,10 @@ import ( "golang.zx2c4.com/wireguard/wgctrl" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" - "github.com/ngoduykhanh/wireguard-ui/emailer" - "github.com/ngoduykhanh/wireguard-ui/model" - "github.com/ngoduykhanh/wireguard-ui/store" - "github.com/ngoduykhanh/wireguard-ui/util" + "github.com/alikhanich/wireguard-ui/emailer" + "github.com/alikhanich/wireguard-ui/model" + "github.com/alikhanich/wireguard-ui/store" + "github.com/alikhanich/wireguard-ui/util" ) // Health check handler diff --git a/handler/routes_wake_on_lan.go b/handler/routes_wake_on_lan.go index 43a6186..c9b5160 100644 --- a/handler/routes_wake_on_lan.go +++ b/handler/routes_wake_on_lan.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/labstack/echo/v4" "github.com/labstack/gommon/log" - "github.com/ngoduykhanh/wireguard-ui/model" - "github.com/ngoduykhanh/wireguard-ui/store" + "github.com/alikhanich/wireguard-ui/model" + "github.com/alikhanich/wireguard-ui/store" "github.com/sabhiram/go-wol/wol" "net" "net/http" diff --git a/handler/session.go b/handler/session.go index 4cede6e..0a483ca 100644 --- a/handler/session.go +++ b/handler/session.go @@ -6,7 +6,7 @@ import ( "github.com/labstack/echo-contrib/session" "github.com/labstack/echo/v4" - "github.com/ngoduykhanh/wireguard-ui/util" + "github.com/alikhanich/wireguard-ui/util" ) func ValidSession(next echo.HandlerFunc) echo.HandlerFunc { @@ -38,6 +38,10 @@ func isValidSession(c echo.Context) bool { } sess, _ := session.Get("session", c) cookie, err := c.Cookie("session_token") + apiKey, ok := sess.Values["api_key"].(string) + if ok && apiKey != util.ApiKey { + return false + } if err != nil || sess.Values["session_token"] != cookie.Value { return false } diff --git a/main.go b/main.go index 2fb2d03..364393a 100644 --- a/main.go +++ b/main.go @@ -11,12 +11,12 @@ import ( "net/http" "os" "time" - - "github.com/ngoduykhanh/wireguard-ui/emailer" - "github.com/ngoduykhanh/wireguard-ui/handler" - "github.com/ngoduykhanh/wireguard-ui/router" - "github.com/ngoduykhanh/wireguard-ui/store/jsondb" - "github.com/ngoduykhanh/wireguard-ui/util" + rice "github.com/GeertJohan/go.rice" + "github.com/alikhanich/wireguard-ui/emailer" + "github.com/alikhanich/wireguard-ui/handler" + "github.com/alikhanich/wireguard-ui/router" + "github.com/alikhanich/wireguard-ui/store/jsondb" + "github.com/alikhanich/wireguard-ui/util" ) var ( @@ -41,6 +41,7 @@ var ( flagSessionSecret string flagWgConfTemplate string flagBasePath string + flagApiKey string ) const ( @@ -80,6 +81,7 @@ func init() { flag.StringVar(&flagSessionSecret, "session-secret", util.LookupEnvOrString("SESSION_SECRET", flagSessionSecret), "The key used to encrypt session cookies.") flag.StringVar(&flagWgConfTemplate, "wg-conf-template", util.LookupEnvOrString("WG_CONF_TEMPLATE", flagWgConfTemplate), "Path to custom wg.conf template.") flag.StringVar(&flagBasePath, "base-path", util.LookupEnvOrString("BASE_PATH", flagBasePath), "The base path of the URL") + flag.StringVar(&flagApiKey, "api-key", util.LookupEnvOrString("WGUI_API_KEY", ""), "Specify API key for auth") flag.Parse() // update runtime config @@ -98,27 +100,25 @@ func init() { util.SessionSecret = []byte(flagSessionSecret) util.WgConfTemplate = flagWgConfTemplate util.BasePath = util.ParseBasePath(flagBasePath) - - // print only if log level is INFO or lower - if lvl, _ := util.ParseLogLevel(util.LookupEnvOrString(util.LogLevel, "INFO")); lvl <= log.INFO { - // print app information - fmt.Println("Wireguard UI") - fmt.Println("App Version\t:", appVersion) - fmt.Println("Git Commit\t:", gitCommit) - fmt.Println("Git Ref\t\t:", gitRef) - fmt.Println("Build Time\t:", buildTime) - fmt.Println("Git Repo\t:", "https://github.com/ngoduykhanh/wireguard-ui") - fmt.Println("Authentication\t:", !util.DisableLogin) - fmt.Println("Bind address\t:", util.BindAddress) - //fmt.Println("Sendgrid key\t:", util.SendgridApiKey) - fmt.Println("Email from\t:", util.EmailFrom) - fmt.Println("Email from name\t:", util.EmailFromName) - //fmt.Println("Session secret\t:", util.SessionSecret) - fmt.Println("Custom wg.conf\t:", util.WgConfTemplate) - fmt.Println("Base path\t:", util.BasePath+"/") - } + util.ApiKey = flagApiKey + // print app information + fmt.Println("Wireguard UI") + fmt.Println("App Version\t:", appVersion) + fmt.Println("Git Commit\t:", gitCommit) + fmt.Println("Git Ref\t\t:", gitRef) + fmt.Println("Build Time\t:", buildTime) + fmt.Println("Git Repo\t:", "https://github.com/alikhanich/wireguard-ui") + fmt.Println("Authentication\t:", !util.DisableLogin) + fmt.Println("Bind address\t:", util.BindAddress) + //fmt.Println("Sendgrid key\t:", util.SendgridApiKey) + fmt.Println("Email from\t:", util.EmailFrom) + fmt.Println("Email from name\t:", util.EmailFromName) + //fmt.Println("Session secret\t:", util.SessionSecret) + fmt.Println("Custom wg.conf\t:", util.WgConfTemplate) + fmt.Println("Base path\t:", util.BasePath+"/") } + func main() { db, err := jsondb.New("./db") if err != nil { diff --git a/router/router.go b/router/router.go index c2d1943..281e00a 100644 --- a/router/router.go +++ b/router/router.go @@ -13,7 +13,7 @@ import ( "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/labstack/gommon/log" - "github.com/ngoduykhanh/wireguard-ui/util" + "github.com/alikhanich/wireguard-ui/util" ) // TemplateRegistry is a custom html/template renderer for Echo framework @@ -47,11 +47,31 @@ func (t *TemplateRegistry) Render(w io.Writer, name string, data interface{}, c return tmpl.ExecuteTemplate(w, "base.html", data) } +func apiKeyMiddleware(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + apiKey := c.Request().Header.Get("X-API-Key") + if apiKey == "" { + apiKey = c.QueryParam("api_key") + } + sess, err := session.Get("session", c) + if err != nil { + return err + } + sess.Values["api_key"] = apiKey + err = sess.Save(c.Request(), c.Response()) + if err != nil { + return err + } + return next(c) + } +} // New function func New(tmplDir fs.FS, extraData map[string]string, secret []byte) *echo.Echo { e := echo.New() - e.Use(session.Middleware(sessions.NewCookieStore(secret))) + store := sessions.NewCookieStore(secret) + e.Use(session.Middleware(store)) + e.Use(apiKeyMiddleware) // read html template file to string tmplBaseString, err := util.StringFromEmbedFile(tmplDir, "base.html") if err != nil { diff --git a/store/jsondb/jsondb.go b/store/jsondb/jsondb.go index f95ff16..cc9e1ec 100644 --- a/store/jsondb/jsondb.go +++ b/store/jsondb/jsondb.go @@ -12,8 +12,8 @@ import ( "github.com/skip2/go-qrcode" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" - "github.com/ngoduykhanh/wireguard-ui/model" - "github.com/ngoduykhanh/wireguard-ui/util" + "github.com/alikhanich/wireguard-ui/model" + "github.com/alikhanich/wireguard-ui/util" ) type JsonDB struct { diff --git a/store/jsondb/jsondb_wake_on_lan.go b/store/jsondb/jsondb_wake_on_lan.go index e492aa8..e10a463 100644 --- a/store/jsondb/jsondb_wake_on_lan.go +++ b/store/jsondb/jsondb_wake_on_lan.go @@ -3,7 +3,7 @@ package jsondb import ( "encoding/json" "fmt" - "github.com/ngoduykhanh/wireguard-ui/model" + "github.com/alikhanich/wireguard-ui/model" ) func (o *JsonDB) GetWakeOnLanHosts() ([]model.WakeOnLanHost, error) { diff --git a/store/store.go b/store/store.go index ef6d723..dec257b 100644 --- a/store/store.go +++ b/store/store.go @@ -1,7 +1,7 @@ package store import ( - "github.com/ngoduykhanh/wireguard-ui/model" + "github.com/alikhanich/wireguard-ui/model" ) type IStore interface { diff --git a/templates/about.html b/templates/about.html index edbeb47..b57b270 100644 --- a/templates/about.html +++ b/templates/about.html @@ -63,7 +63,7 @@ About Copyright © - Wireguard UI. + Wireguard UI. All rights reserved. diff --git a/templates/base.html b/templates/base.html index 181049d..5fd2ce3 100644 --- a/templates/base.html +++ b/templates/base.html @@ -326,7 +326,7 @@
Version {{ .appVersion }}
- Copyright © Wireguard UI. All rights + Copyright © Wireguard UI. All rights reserved. --> diff --git a/templates/login.html b/templates/login.html index bc5ace4..6d74a30 100644 --- a/templates/login.html +++ b/templates/login.html @@ -25,7 +25,7 @@
diff --git a/templates/wake_on_lan_hosts.html b/templates/wake_on_lan_hosts.html index 80ba3f6..e3157ea 100644 --- a/templates/wake_on_lan_hosts.html +++ b/templates/wake_on_lan_hosts.html @@ -79,7 +79,7 @@
{{ range $idx, $host := .hosts }} - {{- /*gotype: github.com/ngoduykhanh/wireguard-ui/model.WakeOnLanHost*/ -}} + {{- /*gotype: github.com/alikhanich/wireguard-ui/model.WakeOnLanHost*/ -}}
diff --git a/templates/wg.conf b/templates/wg.conf index 745a92f..c7c27ea 100644 --- a/templates/wg.conf +++ b/templates/wg.conf @@ -1,4 +1,4 @@ -# This file was generated using wireguard-ui (https://github.com/ngoduykhanh/wireguard-ui) +# This file was generated using wireguard-ui (https://github.com/alikhanich/wireguard-ui) # Please don't modify it manually, otherwise your change might get replaced. # Address updated at: {{ .serverConfig.Interface.UpdatedAt }} diff --git a/util/config.go b/util/config.go index 7a95f97..1000055 100644 --- a/util/config.go +++ b/util/config.go @@ -19,6 +19,7 @@ var ( SessionSecret []byte WgConfTemplate string BasePath string + ApiKey string ) const ( @@ -51,6 +52,7 @@ const ( DefaultClientExtraAllowedIpsEnvVar = "WGUI_DEFAULT_CLIENT_EXTRA_ALLOWED_IPS" DefaultClientUseServerDNSEnvVar = "WGUI_DEFAULT_CLIENT_USE_SERVER_DNS" DefaultClientEnableAfterCreationEnvVar = "WGUI_DEFAULT_CLIENT_ENABLE_AFTER_CREATION" + DefaultApiKeyEnvVar = "WGUI_API_KEY" ) func ParseBasePath(basePath string) string { diff --git a/util/util.go b/util/util.go index 4d4b9b3..81ba6ff 100644 --- a/util/util.go +++ b/util/util.go @@ -20,7 +20,7 @@ import ( externalip "github.com/glendc/go-external-ip" "github.com/labstack/gommon/log" - "github.com/ngoduykhanh/wireguard-ui/model" + "github.com/alikhanich/wireguard-ui/model" "github.com/sdomino/scribble" )