2017-06-30 18:39:25 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/drone/drone-ui/dist"
|
|
|
|
"github.com/drone/drone/model"
|
|
|
|
"github.com/drone/drone/server/template"
|
|
|
|
"github.com/drone/drone/shared/token"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Website defines an interface to serve the user interface.
|
|
|
|
type Website interface {
|
|
|
|
Page(rw http.ResponseWriter, r *http.Request, u *model.User)
|
|
|
|
File(rw http.ResponseWriter, r *http.Request)
|
|
|
|
Routes() []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type website struct {
|
|
|
|
fs http.Handler
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewWebsite returns a new website loader.
|
|
|
|
func NewWebsite() Website {
|
2017-07-16 16:27:01 +00:00
|
|
|
// TODO change to DRONE_WEB_PATH and add DRONE_WEB_PROXY
|
2017-06-30 18:39:25 +00:00
|
|
|
path := os.Getenv("DRONE_WWW")
|
|
|
|
if path != "" {
|
|
|
|
return NewLocalWebsite(path)
|
|
|
|
}
|
|
|
|
return &website{
|
2017-07-16 16:27:01 +00:00
|
|
|
fs: http.FileServer(dist.New()),
|
2017-06-30 18:39:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Page serves a page in the user interface.
|
|
|
|
func (w *website) Page(rw http.ResponseWriter, r *http.Request, u *model.User) {
|
|
|
|
rw.WriteHeader(200)
|
|
|
|
|
|
|
|
path := r.URL.Path
|
|
|
|
switch path {
|
|
|
|
case "/login":
|
|
|
|
if err := r.FormValue("error"); err != "" {
|
2017-07-16 16:27:01 +00:00
|
|
|
// TODO login error
|
2017-06-30 18:39:25 +00:00
|
|
|
} else {
|
|
|
|
http.Redirect(rw, r, "/authorize", 303)
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
var csrf string
|
|
|
|
if u != nil {
|
|
|
|
csrf, _ = token.New(
|
|
|
|
token.CsrfToken,
|
|
|
|
u.Login,
|
|
|
|
).Sign(u.Hash)
|
|
|
|
}
|
|
|
|
params := map[string]interface{}{
|
|
|
|
"user": u,
|
|
|
|
"csrf": csrf,
|
|
|
|
}
|
2017-07-16 16:27:01 +00:00
|
|
|
|
|
|
|
template.T.ExecuteTemplate(rw, "index_polymer.html", params)
|
2017-06-30 18:39:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// File serves a static file for the user interface.
|
|
|
|
func (w *website) File(rw http.ResponseWriter, r *http.Request) {
|
|
|
|
w.fs.ServeHTTP(rw, r)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w *website) Routes() []string {
|
|
|
|
return []string{
|
2017-07-16 16:27:01 +00:00
|
|
|
"/favicon-32x32.png",
|
|
|
|
"/favicon-16x16.png",
|
|
|
|
"/src/*filepath",
|
|
|
|
"/bower_components/*filepath",
|
2017-06-30 18:39:25 +00:00
|
|
|
}
|
|
|
|
}
|