use middlewares for notfoundhandler routes

This commit is contained in:
sentriz
2020-01-18 17:44:27 +00:00
parent fa12cb4150
commit 7de773d4c5
4 changed files with 32 additions and 10 deletions

View File

@@ -177,6 +177,9 @@ func (c *Controller) H(h adminHandler) http.Handler {
return return
} }
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
if resp.code != 0 {
w.WriteHeader(resp.code)
}
if _, err := buff.WriteTo(w); err != nil { if _, err := buff.WriteTo(w); err != nil {
log.Printf("error writing to response buffer: %v\n", err) log.Printf("error writing to response buffer: %v\n", err)
} }

View File

@@ -13,7 +13,7 @@ import (
) )
func (c *Controller) ServeNotFound(r *http.Request) *Response { func (c *Controller) ServeNotFound(r *http.Request) *Response {
return &Response{template: "not_found.tmpl"} return &Response{template: "not_found.tmpl", code: 404}
} }
func (c *Controller) ServeLogin(r *http.Request) *Response { func (c *Controller) ServeLogin(r *http.Request) *Response {

View File

@@ -34,7 +34,7 @@ func (c *Controller) WithParams(next http.Handler) http.Handler {
}) })
} }
func (c *Controller) WithUser(next http.Handler) http.Handler { func (c *Controller) WithRequiredParams(next http.Handler) http.Handler {
requiredParameters := []string{ requiredParameters := []string{
"u", "v", "c", "u", "v", "c",
} }
@@ -45,10 +45,17 @@ func (c *Controller) WithUser(next http.Handler) http.Handler {
if param != "" { if param != "" {
continue continue
} }
writeResp(w, r, spec.NewError(10, "please provide a `%s` parameter", req)) _ = writeResp(w, r, spec.NewError(10,
"please provide a `%s` parameter", req))
return return
} }
// next.ServeHTTP(w, r)
})
}
func (c *Controller) WithUser(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
params := r.Context().Value(CtxParams).(params.Params)
username := params.Get("u") username := params.Get("u")
password := params.Get("p") password := params.Get("p")
token := params.Get("t") token := params.Get("t")
@@ -57,12 +64,14 @@ func (c *Controller) WithUser(next http.Handler) http.Handler {
passwordAuth := token == "" && salt == "" passwordAuth := token == "" && salt == ""
tokenAuth := password == "" tokenAuth := password == ""
if tokenAuth == passwordAuth { if tokenAuth == passwordAuth {
writeResp(w, r, spec.NewError(10, "please provide `t` and `s`, or just `p`")) _ = writeResp(w, r, spec.NewError(10,
"please provide `t` and `s`, or just `p`"))
return return
} }
user := c.DB.GetUserFromName(username) user := c.DB.GetUserFromName(username)
if user == nil { if user == nil {
writeResp(w, r, spec.NewError(40, "invalid username `%s`", username)) _ = writeResp(w, r, spec.NewError(40,
"invalid username `%s`", username))
return return
} }
var credsOk bool var credsOk bool
@@ -72,7 +81,7 @@ func (c *Controller) WithUser(next http.Handler) http.Handler {
credsOk = checkCredsBasic(user.Password, password) credsOk = checkCredsBasic(user.Password, password)
} }
if !credsOk { if !credsOk {
writeResp(w, r, spec.NewError(40, "invalid password")) _ = writeResp(w, r, spec.NewError(40, "invalid password"))
return return
} }
withUser := context.WithValue(r.Context(), CtxUser, user) withUser := context.WithValue(r.Context(), CtxUser, user)

View File

@@ -76,7 +76,6 @@ func (s *Server) SetupAdmin() error {
// begin public routes (creates session) // begin public routes (creates session)
routPublic := s.router.PathPrefix("/admin").Subrouter() routPublic := s.router.PathPrefix("/admin").Subrouter()
routPublic.Use(ctrl.WithSession) routPublic.Use(ctrl.WithSession)
routPublic.NotFoundHandler = ctrl.H(ctrl.ServeNotFound)
routPublic.Handle("/login", ctrl.H(ctrl.ServeLogin)) routPublic.Handle("/login", ctrl.H(ctrl.ServeLogin))
routPublic.HandleFunc("/login_do", ctrl.ServeLoginDo) // "raw" handler, updates session routPublic.HandleFunc("/login_do", ctrl.ServeLoginDo) // "raw" handler, updates session
assets.PrefixDo("static", func(path string, asset *assets.EmbeddedAsset) { assets.PrefixDo("static", func(path string, asset *assets.EmbeddedAsset) {
@@ -111,14 +110,20 @@ func (s *Server) SetupAdmin() error {
routAdmin.Handle("/update_lastfm_api_key", ctrl.H(ctrl.ServeUpdateLastFMAPIKey)) routAdmin.Handle("/update_lastfm_api_key", ctrl.H(ctrl.ServeUpdateLastFMAPIKey))
routAdmin.Handle("/update_lastfm_api_key_do", ctrl.H(ctrl.ServeUpdateLastFMAPIKeyDo)) routAdmin.Handle("/update_lastfm_api_key_do", ctrl.H(ctrl.ServeUpdateLastFMAPIKeyDo))
routAdmin.Handle("/start_scan_do", ctrl.H(ctrl.ServeStartScanDo)) routAdmin.Handle("/start_scan_do", ctrl.H(ctrl.ServeStartScanDo))
// middlewares should be run for not found handler
// https://github.com/gorilla/mux/issues/416
notFoundHandler := ctrl.H(ctrl.ServeNotFound)
notFoundRoute := routPublic.NewRoute().Handler(notFoundHandler)
routPublic.NotFoundHandler = notFoundRoute.GetHandler()
return nil return nil
} }
func (s *Server) SetupSubsonic() error { func (s *Server) SetupSubsonic() error {
ctrl := ctrlsubsonic.New(s.ctrlBase) ctrl := ctrlsubsonic.New(s.ctrlBase)
rout := s.router.PathPrefix("/rest").Subrouter() rout := s.router.PathPrefix("/rest").Subrouter()
rout.Use(ctrl.WithValidSubsonicArgs) rout.Use(ctrl.WithParams)
rout.NotFoundHandler = ctrl.H(ctrl.ServeNotFound) rout.Use(ctrl.WithRequiredParams)
rout.Use(ctrl.WithUser)
// //
// begin common // begin common
rout.Handle("/getLicense{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetLicence)) rout.Handle("/getLicense{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetLicence))
@@ -151,6 +156,11 @@ func (s *Server) SetupSubsonic() error {
rout.Handle("/getMusicDirectory{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetMusicDirectory)) rout.Handle("/getMusicDirectory{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetMusicDirectory))
rout.Handle("/getAlbumList{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbumList)) rout.Handle("/getAlbumList{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbumList))
rout.Handle("/search2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSearchTwo)) rout.Handle("/search2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSearchTwo))
// middlewares should be run for not found handler
// https://github.com/gorilla/mux/issues/416
notFoundHandler := ctrl.H(ctrl.ServeNotFound)
notFoundRoute := rout.NewRoute().Handler(notFoundHandler)
rout.NotFoundHandler = notFoundRoute.GetHandler()
return nil return nil
} }