2018-06-17 16:15:58 +02:00
|
|
|
package webcontroller
|
|
|
|
|
|
|
|
import (
|
2018-06-23 21:17:53 +02:00
|
|
|
"errors"
|
2018-06-17 16:15:58 +02:00
|
|
|
"net/http"
|
|
|
|
|
2018-06-23 21:17:53 +02:00
|
|
|
"github.com/google/uuid"
|
|
|
|
|
2018-06-17 16:15:58 +02:00
|
|
|
"fornaxian.com/pixeldrain-web/init/conf"
|
|
|
|
"github.com/Fornaxian/log"
|
|
|
|
"github.com/julienschmidt/httprouter"
|
|
|
|
)
|
|
|
|
|
2018-07-09 23:19:16 +02:00
|
|
|
// WebController controls how requests are handled and makes sure they have
|
|
|
|
// proper context when running
|
2018-06-17 16:15:58 +02:00
|
|
|
type WebController struct {
|
|
|
|
conf *conf.PixelWebConfig
|
2018-09-19 22:26:52 +02:00
|
|
|
templates *TemplateManager
|
2018-06-17 16:15:58 +02:00
|
|
|
staticResourceDir string
|
2018-09-19 22:26:52 +02:00
|
|
|
|
|
|
|
// page-specific variables
|
|
|
|
captchaSiteKey string
|
2018-06-17 16:15:58 +02:00
|
|
|
}
|
|
|
|
|
2018-07-09 23:19:16 +02:00
|
|
|
// New initializes a new WebController by registering all the request handlers
|
|
|
|
// and parsing all templates in the resource directory
|
2018-06-17 16:15:58 +02:00
|
|
|
func New(r *httprouter.Router, prefix string, conf *conf.PixelWebConfig) *WebController {
|
|
|
|
var wc = &WebController{
|
|
|
|
conf: conf,
|
|
|
|
staticResourceDir: conf.StaticResourceDir,
|
|
|
|
}
|
2018-09-19 22:26:52 +02:00
|
|
|
wc.templates = NewTemplateManager(
|
2018-06-17 16:15:58 +02:00
|
|
|
conf.TemplateDir,
|
|
|
|
conf.APIURLExternal,
|
|
|
|
conf.DebugMode,
|
|
|
|
)
|
2018-06-20 23:47:47 +02:00
|
|
|
wc.templates.ParseTemplates(false)
|
2018-06-17 16:15:58 +02:00
|
|
|
|
2018-10-04 23:36:34 +02:00
|
|
|
var p = prefix
|
|
|
|
|
2018-06-17 16:15:58 +02:00
|
|
|
// Serve static files
|
2019-02-18 14:17:31 +01:00
|
|
|
var fs = http.FileServer(http.Dir(wc.staticResourceDir))
|
|
|
|
r.GET(p+"/res/*filepath", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
|
|
|
w.Header().Set("Cache-Control", "public, max-age=86400") // Cache for one day
|
|
|
|
r.URL.Path = p.ByName("filepath")
|
|
|
|
fs.ServeHTTP(w, r)
|
|
|
|
})
|
2018-06-17 16:15:58 +02:00
|
|
|
|
2018-07-09 23:19:16 +02:00
|
|
|
// General navigation
|
2018-10-04 23:36:34 +02:00
|
|
|
r.GET(p+"/" /* */, wc.serveTemplate("home", false))
|
|
|
|
r.GET(p+"/favicon.ico" /* */, wc.serveFile("/favicon.ico"))
|
|
|
|
r.GET(p+"/api" /* */, wc.serveTemplate("apidoc", false))
|
|
|
|
r.GET(p+"/history" /* */, wc.serveTemplate("history_cookies", false))
|
|
|
|
r.GET(p+"/u/:id" /* */, wc.serveFileViewer)
|
|
|
|
r.GET(p+"/u/:id/preview" /* */, wc.serveFilePreview)
|
|
|
|
r.GET(p+"/l/:id" /* */, wc.serveListViewer)
|
|
|
|
r.GET(p+"/t" /* */, wc.serveTemplate("paste", false))
|
2019-02-18 21:11:42 +01:00
|
|
|
r.GET(p+"/donation" /* */, wc.serveTemplate("donation", false))
|
2019-02-18 22:42:20 +01:00
|
|
|
r.GET(p+"/widgets" /* */, wc.serveTemplate("widgets", false))
|
2018-06-17 16:15:58 +02:00
|
|
|
|
2018-07-09 23:19:16 +02:00
|
|
|
// User account pages
|
2018-10-04 23:36:34 +02:00
|
|
|
r.GET(p+"/register" /* */, wc.serveRegister)
|
|
|
|
r.GET(p+"/login" /* */, wc.serveTemplate("login", false))
|
|
|
|
r.GET(p+"/logout" /* */, wc.serveTemplate("logout", true))
|
|
|
|
r.POST(p+"/logout" /* */, wc.serveLogout)
|
|
|
|
r.GET(p+"/user" /* */, wc.serveTemplate("user_home", true))
|
|
|
|
r.GET(p+"/user/files" /* */, wc.serveTemplate("user_files", true))
|
2019-02-07 23:09:54 +01:00
|
|
|
r.GET(p+"/user/lists" /* */, wc.serveTemplate("user_lists", true))
|
2018-10-04 23:36:34 +02:00
|
|
|
r.GET(p+"/user/filemanager" /**/, wc.serveTemplate("file_manager", true))
|
2018-06-20 23:47:47 +02:00
|
|
|
|
2018-06-17 16:15:58 +02:00
|
|
|
r.NotFound = http.HandlerFunc(wc.serveNotFound)
|
|
|
|
|
|
|
|
return wc
|
|
|
|
}
|
|
|
|
|
2018-07-09 21:41:17 +02:00
|
|
|
func (wc *WebController) serveTemplate(
|
|
|
|
tpl string,
|
|
|
|
requireAuth bool,
|
|
|
|
) httprouter.Handle {
|
2018-06-17 16:15:58 +02:00
|
|
|
return func(
|
|
|
|
w http.ResponseWriter,
|
|
|
|
r *http.Request,
|
|
|
|
p httprouter.Params,
|
|
|
|
) {
|
2018-07-09 21:41:17 +02:00
|
|
|
var tpld = wc.newTemplateData(w, r)
|
|
|
|
if requireAuth && !tpld.Authenticated {
|
|
|
|
http.Redirect(w, r, "/login", http.StatusSeeOther)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err := wc.templates.Get().ExecuteTemplate(w, tpl, tpld)
|
2018-06-17 16:15:58 +02:00
|
|
|
if err != nil {
|
|
|
|
log.Error("Error executing template '%s': %s", tpl, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (wc *WebController) serveFile(path string) httprouter.Handle {
|
|
|
|
return func(
|
|
|
|
w http.ResponseWriter,
|
|
|
|
r *http.Request,
|
|
|
|
p httprouter.Params,
|
|
|
|
) {
|
|
|
|
http.ServeFile(w, r, wc.staticResourceDir+"/favicon.ico")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (wc *WebController) serveNotFound(w http.ResponseWriter, r *http.Request) {
|
|
|
|
log.Debug("Not Found: %s", r.URL)
|
2018-10-04 23:36:34 +02:00
|
|
|
w.WriteHeader(http.StatusNotFound)
|
2018-07-09 21:41:17 +02:00
|
|
|
wc.templates.Get().ExecuteTemplate(w, "404", wc.newTemplateData(w, r))
|
2018-06-23 21:17:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (wc *WebController) getAPIKey(r *http.Request) (key string, err error) {
|
|
|
|
if cookie, err := r.Cookie("pd_auth_key"); err == nil {
|
|
|
|
if _, err := uuid.Parse(cookie.Value); err == nil {
|
|
|
|
return cookie.Value, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "", errors.New("not a valid pixeldrain authentication cookie")
|
2018-06-17 16:15:58 +02:00
|
|
|
}
|