diff --git a/cmd/server/server.go b/cmd/server/server.go index e014accfc..74ea3240d 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -266,6 +266,7 @@ func setupEvilGlobals(c *cli.Context, v store.Store, r remote.Remote) { server.Config.Server.Pass = c.String("agent-secret") server.Config.Server.Host = c.String("server-host") server.Config.Server.Port = c.String("server-addr") + server.Config.Server.Docs = c.String("docs") server.Config.Server.SessionExpires = c.Duration("session-expires") server.Config.Pipeline.Networks = c.StringSlice("network") server.Config.Pipeline.Volumes = c.StringSlice("volume") diff --git a/server/config.go b/server/config.go index 0fb793fa4..e0cc5f63e 100644 --- a/server/config.go +++ b/server/config.go @@ -53,6 +53,7 @@ var Config = struct { Host string Port string Pass string + Docs string SessionExpires time.Duration // Open bool // Orgs map[string]struct{} diff --git a/server/router/router.go b/server/router/router.go index c9737599d..20b6943c9 100644 --- a/server/router/router.go +++ b/server/router/router.go @@ -57,6 +57,8 @@ func Load(serveHTTP func(w http.ResponseWriter, r *http.Request), middleware ... serveHTTP(c.Writer, req) }) + e.GET("/web-config.js", web.WebConfig) + e.GET("/logout", api.GetLogout) e.GET("/login", api.HandleLogin) diff --git a/server/web/config.go b/server/web/config.go new file mode 100644 index 000000000..c4e60c1eb --- /dev/null +++ b/server/web/config.go @@ -0,0 +1,81 @@ +// Copyright 2021 Woodpecker Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package web + +import ( + "encoding/json" + "fmt" + "net/http" + "text/template" + "time" + + "github.com/gin-gonic/gin" + "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/router/middleware/session" + "github.com/woodpecker-ci/woodpecker/shared/token" + "github.com/woodpecker-ci/woodpecker/version" +) + +func WebConfig(c *gin.Context) { + var err error + + user := session.User(c) + + var csrf string + if user != nil { + csrf, _ = token.New( + token.CsrfToken, + user.Login, + ).Sign(user.Hash) + } + + var syncing bool + if user != nil { + syncing = time.Unix(user.Synced, 0).Add(time.Hour * 72).Before(time.Now()) + } + + configData := map[string]interface{}{ + "user": user, + "csrf": csrf, + "syncing": syncing, + "docs": server.Config.Server.Docs, + "version": version.String(), + } + + // default func map with json parser. + var funcMap = template.FuncMap{ + "json": func(v interface{}) string { + a, _ := json.Marshal(v) + return string(a) + }, + } + + c.Header("Content-Type", "text/javascript; charset=utf-8") + tmpl := template.Must(template.New("").Funcs(funcMap).Parse(configTemplate)) + + err = tmpl.Execute(c.Writer, configData) + if err != nil { + fmt.Println(err) + c.AbortWithError(http.StatusInternalServerError, nil) + } +} + +const configTemplate = ` +window.WOODPECKER_USER = {{ json .user }}; +window.WOODPECKER_SYNC = {{ .syncing }}; +window.WOODPECKER_CSRF = "{{ .csrf }}"; +window.WOODPECKER_VERSION = "{{ .version }}"; +window.WOODPECKER_DOCS = "{{ .docs }}"; +`