parent
d5c2fe47da
commit
26a0990014
32
admin.go
32
admin.go
|
@ -347,33 +347,33 @@ func handleAdminUpdateSite(app *App, u *User, w http.ResponseWriter, r *http.Req
|
||||||
return impart.HTTPError{http.StatusFound, "/admin/page/" + id + m}
|
return impart.HTTPError{http.StatusFound, "/admin/page/" + id + m}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleAdminUpdateConfig(app *App, u *User, w http.ResponseWriter, r *http.Request) error {
|
func handleAdminUpdateConfig(apper Apper, u *User, w http.ResponseWriter, r *http.Request) error {
|
||||||
app.cfg.App.SiteName = r.FormValue("site_name")
|
apper.App().cfg.App.SiteName = r.FormValue("site_name")
|
||||||
app.cfg.App.SiteDesc = r.FormValue("site_desc")
|
apper.App().cfg.App.SiteDesc = r.FormValue("site_desc")
|
||||||
app.cfg.App.OpenRegistration = r.FormValue("open_registration") == "on"
|
apper.App().cfg.App.OpenRegistration = r.FormValue("open_registration") == "on"
|
||||||
mul, err := strconv.Atoi(r.FormValue("min_username_len"))
|
mul, err := strconv.Atoi(r.FormValue("min_username_len"))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
app.cfg.App.MinUsernameLen = mul
|
apper.App().cfg.App.MinUsernameLen = mul
|
||||||
}
|
}
|
||||||
mb, err := strconv.Atoi(r.FormValue("max_blogs"))
|
mb, err := strconv.Atoi(r.FormValue("max_blogs"))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
app.cfg.App.MaxBlogs = mb
|
apper.App().cfg.App.MaxBlogs = mb
|
||||||
}
|
}
|
||||||
app.cfg.App.Federation = r.FormValue("federation") == "on"
|
apper.App().cfg.App.Federation = r.FormValue("federation") == "on"
|
||||||
app.cfg.App.PublicStats = r.FormValue("public_stats") == "on"
|
apper.App().cfg.App.PublicStats = r.FormValue("public_stats") == "on"
|
||||||
app.cfg.App.Private = r.FormValue("private") == "on"
|
apper.App().cfg.App.Private = r.FormValue("private") == "on"
|
||||||
app.cfg.App.LocalTimeline = r.FormValue("local_timeline") == "on"
|
apper.App().cfg.App.LocalTimeline = r.FormValue("local_timeline") == "on"
|
||||||
if app.cfg.App.LocalTimeline && app.timeline == nil {
|
if apper.App().cfg.App.LocalTimeline && apper.App().timeline == nil {
|
||||||
log.Info("Initializing local timeline...")
|
log.Info("Initializing local timeline...")
|
||||||
initLocalTimeline(app)
|
initLocalTimeline(apper.App())
|
||||||
}
|
}
|
||||||
app.cfg.App.UserInvites = r.FormValue("user_invites")
|
apper.App().cfg.App.UserInvites = r.FormValue("user_invites")
|
||||||
if app.cfg.App.UserInvites == "none" {
|
if apper.App().cfg.App.UserInvites == "none" {
|
||||||
app.cfg.App.UserInvites = ""
|
apper.App().cfg.App.UserInvites = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
m := "?cm=Configuration+saved."
|
m := "?cm=Configuration+saved."
|
||||||
err = config.Save(app.cfg, app.cfgFile)
|
err = apper.SaveConfig(apper.App().cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
m = "?cm=" + err.Error()
|
m = "?cm=" + err.Error()
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,7 @@ func main() {
|
||||||
|
|
||||||
// Set app routes
|
// Set app routes
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
app.InitRoutes(r)
|
writefreely.InitRoutes(app, r)
|
||||||
app.InitStaticRoutes(r)
|
app.InitStaticRoutes(r)
|
||||||
|
|
||||||
// Serve the application
|
// Serve the application
|
||||||
|
|
111
handle.go
111
handle.go
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2018 A Bunch Tell LLC.
|
* Copyright © 2018-2019 A Bunch Tell LLC.
|
||||||
*
|
*
|
||||||
* This file is part of WriteFreely.
|
* This file is part of WriteFreely.
|
||||||
*
|
*
|
||||||
|
@ -36,16 +36,17 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
handlerFunc func(app *App, w http.ResponseWriter, r *http.Request) error
|
handlerFunc func(app *App, w http.ResponseWriter, r *http.Request) error
|
||||||
userHandlerFunc func(app *App, u *User, w http.ResponseWriter, r *http.Request) error
|
userHandlerFunc func(app *App, u *User, w http.ResponseWriter, r *http.Request) error
|
||||||
dataHandlerFunc func(app *App, w http.ResponseWriter, r *http.Request) ([]byte, string, error)
|
userApperHandlerFunc func(apper Apper, u *User, w http.ResponseWriter, r *http.Request) error
|
||||||
authFunc func(app *App, r *http.Request) (*User, error)
|
dataHandlerFunc func(app *App, w http.ResponseWriter, r *http.Request) ([]byte, string, error)
|
||||||
|
authFunc func(app *App, r *http.Request) (*User, error)
|
||||||
)
|
)
|
||||||
|
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
errors *ErrorPages
|
errors *ErrorPages
|
||||||
sessionStore *sessions.CookieStore
|
sessionStore *sessions.CookieStore
|
||||||
app *App
|
app Apper
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrorPages hold template HTML error pages for displaying errors to the user.
|
// ErrorPages hold template HTML error pages for displaying errors to the user.
|
||||||
|
@ -59,7 +60,7 @@ type ErrorPages struct {
|
||||||
|
|
||||||
// NewHandler returns a new Handler instance, using the given StaticPage data,
|
// NewHandler returns a new Handler instance, using the given StaticPage data,
|
||||||
// and saving alias to the application's CookieStore.
|
// and saving alias to the application's CookieStore.
|
||||||
func NewHandler(app *App) *Handler {
|
func NewHandler(apper Apper) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
errors: &ErrorPages{
|
errors: &ErrorPages{
|
||||||
NotFound: template.Must(template.New("").Parse("{{define \"base\"}}<html><head><title>404</title></head><body><p>Not found.</p></body></html>{{end}}")),
|
NotFound: template.Must(template.New("").Parse("{{define \"base\"}}<html><head><title>404</title></head><body><p>Not found.</p></body></html>{{end}}")),
|
||||||
|
@ -67,8 +68,8 @@ func NewHandler(app *App) *Handler {
|
||||||
InternalServerError: template.Must(template.New("").Parse("{{define \"base\"}}<html><head><title>500</title></head><body><p>Internal server error.</p></body></html>{{end}}")),
|
InternalServerError: template.Must(template.New("").Parse("{{define \"base\"}}<html><head><title>500</title></head><body><p>Internal server error.</p></body></html>{{end}}")),
|
||||||
Blank: template.Must(template.New("").Parse("{{define \"base\"}}<html><head><title>{{.Title}}</title></head><body><p>{{.Content}}</p></body></html>{{end}}")),
|
Blank: template.Must(template.New("").Parse("{{define \"base\"}}<html><head><title>{{.Title}}</title></head><body><p>{{.Content}}</p></body></html>{{end}}")),
|
||||||
},
|
},
|
||||||
sessionStore: app.sessionStore,
|
sessionStore: apper.App().sessionStore,
|
||||||
app: app,
|
app: apper,
|
||||||
}
|
}
|
||||||
|
|
||||||
return h
|
return h
|
||||||
|
@ -76,8 +77,8 @@ func NewHandler(app *App) *Handler {
|
||||||
|
|
||||||
// NewWFHandler returns a new Handler instance, using WriteFreely template files.
|
// NewWFHandler returns a new Handler instance, using WriteFreely template files.
|
||||||
// You MUST call writefreely.InitTemplates() before this.
|
// You MUST call writefreely.InitTemplates() before this.
|
||||||
func NewWFHandler(app *App) *Handler {
|
func NewWFHandler(apper Apper) *Handler {
|
||||||
h := NewHandler(app)
|
h := NewHandler(apper)
|
||||||
h.SetErrorPages(&ErrorPages{
|
h.SetErrorPages(&ErrorPages{
|
||||||
NotFound: pages["404-general.tmpl"],
|
NotFound: pages["404-general.tmpl"],
|
||||||
Gone: pages["410.tmpl"],
|
Gone: pages["410.tmpl"],
|
||||||
|
@ -104,21 +105,21 @@ func (h *Handler) User(f userHandlerFunc) http.HandlerFunc {
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
log.Error("%s: %s", e, debug.Stack())
|
log.Error("%s: %s", e, debug.Stack())
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = http.StatusInternalServerError
|
status = http.StatusInternalServerError
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent())
|
log.Info("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
u := getUserSession(h.app, r)
|
u := getUserSession(h.app.App(), r)
|
||||||
if u == nil {
|
if u == nil {
|
||||||
err := ErrNotLoggedIn
|
err := ErrNotLoggedIn
|
||||||
status = err.Status
|
status = err.Status
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err := f(h.app, u, w, r)
|
err := f(h.app.App(), u, w, r)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
status = http.StatusOK
|
status = http.StatusOK
|
||||||
} else if err, ok := err.(impart.HTTPError); ok {
|
} else if err, ok := err.(impart.HTTPError); ok {
|
||||||
|
@ -142,14 +143,52 @@ func (h *Handler) Admin(f userHandlerFunc) http.HandlerFunc {
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
log.Error("%s: %s", e, debug.Stack())
|
log.Error("%s: %s", e, debug.Stack())
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = http.StatusInternalServerError
|
status = http.StatusInternalServerError
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info(fmt.Sprintf("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent()))
|
log.Info(fmt.Sprintf("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent()))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
u := getUserSession(h.app, r)
|
u := getUserSession(h.app.App(), r)
|
||||||
|
if u == nil || !u.IsAdmin() {
|
||||||
|
err := impart.HTTPError{http.StatusNotFound, ""}
|
||||||
|
status = err.Status
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err := f(h.app.App(), u, w, r)
|
||||||
|
if err == nil {
|
||||||
|
status = http.StatusOK
|
||||||
|
} else if err, ok := err.(impart.HTTPError); ok {
|
||||||
|
status = err.Status
|
||||||
|
} else {
|
||||||
|
status = http.StatusInternalServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdminApper handles requests on /admin routes that require an Apper.
|
||||||
|
func (h *Handler) AdminApper(f userApperHandlerFunc) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
h.handleHTTPError(w, r, func() error {
|
||||||
|
var status int
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if e := recover(); e != nil {
|
||||||
|
log.Error("%s: %s", e, debug.Stack())
|
||||||
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
|
status = http.StatusInternalServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info(fmt.Sprintf("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent()))
|
||||||
|
}()
|
||||||
|
|
||||||
|
u := getUserSession(h.app.App(), r)
|
||||||
if u == nil || !u.IsAdmin() {
|
if u == nil || !u.IsAdmin() {
|
||||||
err := impart.HTTPError{http.StatusNotFound, ""}
|
err := impart.HTTPError{http.StatusNotFound, ""}
|
||||||
status = err.Status
|
status = err.Status
|
||||||
|
@ -204,7 +243,7 @@ func (h *Handler) UserAll(web bool, f userHandlerFunc, a authFunc) http.HandlerF
|
||||||
log.Info("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent())
|
log.Info("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
u, err := a(h.app, r)
|
u, err := a(h.app.App(), r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err, ok := err.(impart.HTTPError); ok {
|
if err, ok := err.(impart.HTTPError); ok {
|
||||||
status = err.Status
|
status = err.Status
|
||||||
|
@ -214,7 +253,7 @@ func (h *Handler) UserAll(web bool, f userHandlerFunc, a authFunc) http.HandlerF
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = f(h.app, u, w, r)
|
err = f(h.app.App(), u, w, r)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
status = 200
|
status = 200
|
||||||
} else if err, ok := err.(impart.HTTPError); ok {
|
} else if err, ok := err.(impart.HTTPError); ok {
|
||||||
|
@ -277,13 +316,13 @@ func (h *Handler) WebErrors(f handlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
u := getUserSession(h.app, r)
|
u := getUserSession(h.app.App(), r)
|
||||||
username := "None"
|
username := "None"
|
||||||
if u != nil {
|
if u != nil {
|
||||||
username = u.Username
|
username = u.Username
|
||||||
}
|
}
|
||||||
log.Error("User: %s\n\n%s: %s", username, e, debug.Stack())
|
log.Error("User: %s\n\n%s: %s", username, e, debug.Stack())
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = 500
|
status = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,13 +354,13 @@ func (h *Handler) WebErrors(f handlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: pass User object to function
|
// TODO: pass User object to function
|
||||||
err = f(h.app, w, r)
|
err = f(h.app.App(), w, r)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
status = 200
|
status = 200
|
||||||
} else if httpErr, ok := err.(impart.HTTPError); ok {
|
} else if httpErr, ok := err.(impart.HTTPError); ok {
|
||||||
status = httpErr.Status
|
status = httpErr.Status
|
||||||
if status < 300 || status > 399 {
|
if status < 300 || status > 399 {
|
||||||
addSessionFlash(h.app, w, r, httpErr.Message, session)
|
addSessionFlash(h.app.App(), w, r, httpErr.Message, session)
|
||||||
return impart.HTTPError{http.StatusFound, r.Referer()}
|
return impart.HTTPError{http.StatusFound, r.Referer()}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -332,7 +371,7 @@ func (h *Handler) WebErrors(f handlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
log.Error(e)
|
log.Error(e)
|
||||||
}
|
}
|
||||||
log.Info("Web handler internal error render")
|
log.Info("Web handler internal error render")
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = 500
|
status = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,14 +390,14 @@ func (h *Handler) Web(f handlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
u := getUserSession(h.app, r)
|
u := getUserSession(h.app.App(), r)
|
||||||
username := "None"
|
username := "None"
|
||||||
if u != nil {
|
if u != nil {
|
||||||
username = u.Username
|
username = u.Username
|
||||||
}
|
}
|
||||||
log.Error("User: %s\n\n%s: %s", username, e, debug.Stack())
|
log.Error("User: %s\n\n%s: %s", username, e, debug.Stack())
|
||||||
log.Info("Web deferred internal error render")
|
log.Info("Web deferred internal error render")
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = 500
|
status = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,7 +427,7 @@ func (h *Handler) Web(f handlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: pass User object to function
|
// TODO: pass User object to function
|
||||||
err := f(h.app, w, r)
|
err := f(h.app.App(), w, r)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
status = 200
|
status = 200
|
||||||
} else if httpErr, ok := err.(impart.HTTPError); ok {
|
} else if httpErr, ok := err.(impart.HTTPError); ok {
|
||||||
|
@ -397,7 +436,7 @@ func (h *Handler) Web(f handlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
e := fmt.Sprintf("[Web handler] 500: %v", err)
|
e := fmt.Sprintf("[Web handler] 500: %v", err)
|
||||||
log.Error(e)
|
log.Error(e)
|
||||||
log.Info("Web internal error render")
|
log.Info("Web internal error render")
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = 500
|
status = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,7 +464,7 @@ func (h *Handler) All(f handlerFunc) http.HandlerFunc {
|
||||||
|
|
||||||
// TODO: do any needed authentication
|
// TODO: do any needed authentication
|
||||||
|
|
||||||
err := f(h.app, w, r)
|
err := f(h.app.App(), w, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err, ok := err.(impart.HTTPError); ok {
|
if err, ok := err.(impart.HTTPError); ok {
|
||||||
status = err.Status
|
status = err.Status
|
||||||
|
@ -447,14 +486,14 @@ func (h *Handler) Download(f dataHandlerFunc, ul UserLevel) http.HandlerFunc {
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
log.Error("%s: %s", e, debug.Stack())
|
log.Error("%s: %s", e, debug.Stack())
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = 500
|
status = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent())
|
log.Info("\"%s %s\" %d %s \"%s\"", r.Method, r.RequestURI, status, time.Since(start), r.UserAgent())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
data, filename, err := f(h.app, w, r)
|
data, filename, err := f(h.app.App(), w, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err, ok := err.(impart.HTTPError); ok {
|
if err, ok := err.(impart.HTTPError); ok {
|
||||||
status = err.Status
|
status = err.Status
|
||||||
|
@ -543,7 +582,7 @@ func (h *Handler) handleHTTPError(w http.ResponseWriter, r *http.Request, err er
|
||||||
page.StaticPage
|
page.StaticPage
|
||||||
Content *template.HTML
|
Content *template.HTML
|
||||||
}{
|
}{
|
||||||
StaticPage: pageForReq(h.app, r),
|
StaticPage: pageForReq(h.app.App(), r),
|
||||||
}
|
}
|
||||||
if err.Message != "" {
|
if err.Message != "" {
|
||||||
co := template.HTML(err.Message)
|
co := template.HTML(err.Message)
|
||||||
|
@ -553,12 +592,12 @@ func (h *Handler) handleHTTPError(w http.ResponseWriter, r *http.Request, err er
|
||||||
return
|
return
|
||||||
} else if err.Status == http.StatusNotFound {
|
} else if err.Status == http.StatusNotFound {
|
||||||
w.WriteHeader(err.Status)
|
w.WriteHeader(err.Status)
|
||||||
h.errors.NotFound.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.NotFound.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
return
|
return
|
||||||
} else if err.Status == http.StatusInternalServerError {
|
} else if err.Status == http.StatusInternalServerError {
|
||||||
w.WriteHeader(err.Status)
|
w.WriteHeader(err.Status)
|
||||||
log.Info("handleHTTPErorr internal error render")
|
log.Info("handleHTTPErorr internal error render")
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
return
|
return
|
||||||
} else if err.Status == http.StatusAccepted {
|
} else if err.Status == http.StatusAccepted {
|
||||||
impart.WriteSuccess(w, "", err.Status)
|
impart.WriteSuccess(w, "", err.Status)
|
||||||
|
@ -569,7 +608,7 @@ func (h *Handler) handleHTTPError(w http.ResponseWriter, r *http.Request, err er
|
||||||
Title string
|
Title string
|
||||||
Content template.HTML
|
Content template.HTML
|
||||||
}{
|
}{
|
||||||
pageForReq(h.app, r),
|
pageForReq(h.app.App(), r),
|
||||||
fmt.Sprintf("Uh oh (%d)", err.Status),
|
fmt.Sprintf("Uh oh (%d)", err.Status),
|
||||||
template.HTML(fmt.Sprintf("<p style=\"text-align: center\" class=\"introduction\">%s</p>", err.Message)),
|
template.HTML(fmt.Sprintf("<p style=\"text-align: center\" class=\"introduction\">%s</p>", err.Message)),
|
||||||
}
|
}
|
||||||
|
@ -604,7 +643,7 @@ func (h *Handler) handleError(w http.ResponseWriter, r *http.Request, err error)
|
||||||
impart.WriteError(w, impart.HTTPError{http.StatusInternalServerError, "This is an unhelpful error message for a miscellaneous internal error."})
|
impart.WriteError(w, impart.HTTPError{http.StatusInternalServerError, "This is an unhelpful error message for a miscellaneous internal error."})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
}
|
}
|
||||||
|
|
||||||
func correctPageFromLoginAttempt(r *http.Request) string {
|
func correctPageFromLoginAttempt(r *http.Request) string {
|
||||||
|
@ -626,7 +665,7 @@ func (h *Handler) LogHandlerFunc(f http.HandlerFunc) http.HandlerFunc {
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
log.Error("Handler.LogHandlerFunc\n\n%s: %s", e, debug.Stack())
|
log.Error("Handler.LogHandlerFunc\n\n%s: %s", e, debug.Stack())
|
||||||
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app, r))
|
h.errors.InternalServerError.ExecuteTemplate(w, "base", pageForReq(h.app.App(), r))
|
||||||
status = 500
|
status = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
24
routes.go
24
routes.go
|
@ -31,13 +31,13 @@ func (app *App) InitStaticRoutes(r *mux.Router) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitRoutes adds dynamic routes for the given mux.Router.
|
// InitRoutes adds dynamic routes for the given mux.Router.
|
||||||
func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
func InitRoutes(apper Apper, r *mux.Router) *mux.Router {
|
||||||
// Create handler
|
// Create handler
|
||||||
handler := NewWFHandler(app)
|
handler := NewWFHandler(apper)
|
||||||
|
|
||||||
// Set up routes
|
// Set up routes
|
||||||
hostSubroute := app.cfg.App.Host[strings.Index(app.cfg.App.Host, "://")+3:]
|
hostSubroute := apper.App().cfg.App.Host[strings.Index(apper.App().cfg.App.Host, "://")+3:]
|
||||||
if app.cfg.App.SingleUser {
|
if apper.App().cfg.App.SingleUser {
|
||||||
hostSubroute = "{domain}"
|
hostSubroute = "{domain}"
|
||||||
} else {
|
} else {
|
||||||
if strings.HasPrefix(hostSubroute, "localhost") {
|
if strings.HasPrefix(hostSubroute, "localhost") {
|
||||||
|
@ -45,7 +45,7 @@ func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if app.cfg.App.SingleUser {
|
if apper.App().cfg.App.SingleUser {
|
||||||
log.Info("Adding %s routes (single user)...", hostSubroute)
|
log.Info("Adding %s routes (single user)...", hostSubroute)
|
||||||
} else {
|
} else {
|
||||||
log.Info("Adding %s routes (multi-user)...", hostSubroute)
|
log.Info("Adding %s routes (multi-user)...", hostSubroute)
|
||||||
|
@ -55,7 +55,7 @@ func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
||||||
write := r.PathPrefix("/").Subrouter()
|
write := r.PathPrefix("/").Subrouter()
|
||||||
|
|
||||||
// Federation endpoint configurations
|
// Federation endpoint configurations
|
||||||
wf := webfinger.Default(wfResolver{app.db, app.cfg})
|
wf := webfinger.Default(wfResolver{apper.App().db, apper.App().cfg})
|
||||||
wf.NoTLSHandler = nil
|
wf.NoTLSHandler = nil
|
||||||
|
|
||||||
// Federation endpoints
|
// Federation endpoints
|
||||||
|
@ -64,15 +64,15 @@ func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
||||||
// webfinger
|
// webfinger
|
||||||
write.HandleFunc(webfinger.WebFingerPath, handler.LogHandlerFunc(http.HandlerFunc(wf.Webfinger)))
|
write.HandleFunc(webfinger.WebFingerPath, handler.LogHandlerFunc(http.HandlerFunc(wf.Webfinger)))
|
||||||
// nodeinfo
|
// nodeinfo
|
||||||
niCfg := nodeInfoConfig(app.db, app.cfg)
|
niCfg := nodeInfoConfig(apper.App().db, apper.App().cfg)
|
||||||
ni := nodeinfo.NewService(*niCfg, nodeInfoResolver{app.cfg, app.db})
|
ni := nodeinfo.NewService(*niCfg, nodeInfoResolver{apper.App().cfg, apper.App().db})
|
||||||
write.HandleFunc(nodeinfo.NodeInfoPath, handler.LogHandlerFunc(http.HandlerFunc(ni.NodeInfoDiscover)))
|
write.HandleFunc(nodeinfo.NodeInfoPath, handler.LogHandlerFunc(http.HandlerFunc(ni.NodeInfoDiscover)))
|
||||||
write.HandleFunc(niCfg.InfoURL, handler.LogHandlerFunc(http.HandlerFunc(ni.NodeInfo)))
|
write.HandleFunc(niCfg.InfoURL, handler.LogHandlerFunc(http.HandlerFunc(ni.NodeInfo)))
|
||||||
|
|
||||||
// Set up dyamic page handlers
|
// Set up dyamic page handlers
|
||||||
// Handle auth
|
// Handle auth
|
||||||
auth := write.PathPrefix("/api/auth/").Subrouter()
|
auth := write.PathPrefix("/api/auth/").Subrouter()
|
||||||
if app.cfg.App.OpenRegistration {
|
if apper.App().cfg.App.OpenRegistration {
|
||||||
auth.HandleFunc("/signup", handler.All(apiSignup)).Methods("POST")
|
auth.HandleFunc("/signup", handler.All(apiSignup)).Methods("POST")
|
||||||
}
|
}
|
||||||
auth.HandleFunc("/login", handler.All(login)).Methods("POST")
|
auth.HandleFunc("/login", handler.All(login)).Methods("POST")
|
||||||
|
@ -145,7 +145,7 @@ func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
||||||
write.HandleFunc("/admin/user/{username}", handler.Admin(handleViewAdminUser)).Methods("GET")
|
write.HandleFunc("/admin/user/{username}", handler.Admin(handleViewAdminUser)).Methods("GET")
|
||||||
write.HandleFunc("/admin/pages", handler.Admin(handleViewAdminPages)).Methods("GET")
|
write.HandleFunc("/admin/pages", handler.Admin(handleViewAdminPages)).Methods("GET")
|
||||||
write.HandleFunc("/admin/page/{slug}", handler.Admin(handleViewAdminPage)).Methods("GET")
|
write.HandleFunc("/admin/page/{slug}", handler.Admin(handleViewAdminPage)).Methods("GET")
|
||||||
write.HandleFunc("/admin/update/config", handler.Admin(handleAdminUpdateConfig)).Methods("POST")
|
write.HandleFunc("/admin/update/config", handler.AdminApper(handleAdminUpdateConfig)).Methods("POST")
|
||||||
write.HandleFunc("/admin/update/{page}", handler.Admin(handleAdminUpdateSite)).Methods("POST")
|
write.HandleFunc("/admin/update/{page}", handler.Admin(handleAdminUpdateSite)).Methods("POST")
|
||||||
|
|
||||||
// Handle special pages first
|
// Handle special pages first
|
||||||
|
@ -159,7 +159,7 @@ func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
||||||
RouteRead(handler, readPerm, write.PathPrefix("/read").Subrouter())
|
RouteRead(handler, readPerm, write.PathPrefix("/read").Subrouter())
|
||||||
|
|
||||||
draftEditPrefix := ""
|
draftEditPrefix := ""
|
||||||
if app.cfg.App.SingleUser {
|
if apper.App().cfg.App.SingleUser {
|
||||||
draftEditPrefix = "/d"
|
draftEditPrefix = "/d"
|
||||||
write.HandleFunc("/me/new", handler.Web(handleViewPad, UserLevelOptional)).Methods("GET")
|
write.HandleFunc("/me/new", handler.Web(handleViewPad, UserLevelOptional)).Methods("GET")
|
||||||
} else {
|
} else {
|
||||||
|
@ -170,7 +170,7 @@ func (app *App) InitRoutes(r *mux.Router) *mux.Router {
|
||||||
write.HandleFunc(draftEditPrefix+"/{action}/edit", handler.Web(handleViewPad, UserLevelOptional)).Methods("GET")
|
write.HandleFunc(draftEditPrefix+"/{action}/edit", handler.Web(handleViewPad, UserLevelOptional)).Methods("GET")
|
||||||
write.HandleFunc(draftEditPrefix+"/{action}/meta", handler.Web(handleViewMeta, UserLevelOptional)).Methods("GET")
|
write.HandleFunc(draftEditPrefix+"/{action}/meta", handler.Web(handleViewMeta, UserLevelOptional)).Methods("GET")
|
||||||
// Collections
|
// Collections
|
||||||
if app.cfg.App.SingleUser {
|
if apper.App().cfg.App.SingleUser {
|
||||||
RouteCollections(handler, write.PathPrefix("/").Subrouter())
|
RouteCollections(handler, write.PathPrefix("/").Subrouter())
|
||||||
} else {
|
} else {
|
||||||
write.HandleFunc("/{prefix:[@~$!\\-+]}{collection}", handler.Web(handleViewCollection, UserLevelOptional))
|
write.HandleFunc("/{prefix:[@~$!\\-+]}{collection}", handler.Web(handleViewCollection, UserLevelOptional))
|
||||||
|
|
Loading…
Reference in New Issue