d4ad7f1a4c
Admins and mods can now see the IP Addresses of users. The last IP Address of a user is now tracked. The IP Addresses a user used to create replies and topics are now tracked. Dramatically improved the speed of templates with the new Fragment System. More optimisations to come! Decreased the memory usage of compiled templates with the new Fragment System. build.bat now provides more information on what it's doing. Added the `go generate` command to the .bat files in preparation for the future. We're currently in the process of overhauling the benchmark system to run tests in parallel rather than serially. More news on that later. We're also looking into the best way of integrating pprof with the benchmarks for detailed profiling. The internal and notfound errors are now static pages. Internal Error pages are now served properly. Optimised most of the errors. Added an internal flag for checking if the plugins have been initialised yet. Mainly for tests. Decoupled the global initialisation code from the tests. Removed URL Tags from Tempra Simple. We're pondering over how to re-introduce this in a less intrusive way. Template file writing is now multi-threaded. The number of maximum open connections is now explicitly set. Removed the Name field from the page struct. Turned some of the most frequently hit queries into prepared statements. Added the [rand] BBCode. Converted the NoticeList map into a slice. Added the missing_tag error type to the [url] tag. error_notfound is now used for when the router can't find a route. Fixed a bug in the custom page route where both the page AND the error is served when the page doesn't exist. Removed some deferrals. Reduced the number of allocations on the topic page. run.bat now provides more information on what it's doing.
157 lines
4.7 KiB
Go
157 lines
4.7 KiB
Go
package main
|
|
import "fmt"
|
|
import "log"
|
|
import "bytes"
|
|
import "net/http"
|
|
|
|
var error_internal []byte
|
|
var error_notfound []byte
|
|
func init_errors() error {
|
|
var b bytes.Buffer
|
|
user := User{0,"Guest","",0,false,false,false,false,false,false,GuestPerms,"",false,"","","","","",0,0,"0.0.0.0.0"}
|
|
pi := Page{"Internal Server Error",user,nList,tList,"A problem has occurred in the system."}
|
|
err := templates.ExecuteTemplate(&b,"error.html", pi)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
error_internal = b.Bytes()
|
|
|
|
b.Reset()
|
|
pi = Page{"Not Found",user,nList,tList,"The requested page doesn't exist."}
|
|
err = templates.ExecuteTemplate(&b,"error.html", pi)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
error_notfound = b.Bytes()
|
|
return nil
|
|
}
|
|
|
|
func InternalError(err error, w http.ResponseWriter, r *http.Request, user User) {
|
|
w.Write(error_internal)
|
|
log.Fatal(err)
|
|
}
|
|
|
|
func InternalErrorJSQ(err error, w http.ResponseWriter, r *http.Request, user User, is_js string) {
|
|
w.WriteHeader(500)
|
|
if is_js == "0" {
|
|
w.Write(error_internal)
|
|
} else {
|
|
w.Write([]byte(`{'errmsg': 'A problem has occured in the system.'}`))
|
|
}
|
|
log.Fatal(err)
|
|
}
|
|
|
|
func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(500)
|
|
pi := Page{"Local Error",user,nList,tList,errmsg}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
}
|
|
|
|
func LoginRequired(w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(401)
|
|
pi := Page{"Local Error",user,nList,tList,"You need to login to do that."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
}
|
|
|
|
func LocalErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, user User, is_js string) {
|
|
w.WriteHeader(500)
|
|
if is_js == "0" {
|
|
pi := Page{"Local Error",user,nList,tList,errmsg}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
} else {
|
|
w.Write([]byte(`{'errmsg': '` + errmsg + `'}`))
|
|
}
|
|
}
|
|
|
|
func NoPermissions(w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(403)
|
|
pi := Page{"Local Error",user,nList,tList,"You don't have permission to do that."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
errpage := b.String()
|
|
fmt.Fprintln(w,errpage)
|
|
}
|
|
|
|
func NoPermissionsJSQ(w http.ResponseWriter, r *http.Request, user User, is_js string) {
|
|
w.WriteHeader(403)
|
|
if is_js == "0" {
|
|
pi := Page{"Local Error",user,nList,tList,"You don't have permission to do that."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
} else {
|
|
w.Write([]byte("{'errmsg': 'You don't have permission to do that.'}"))
|
|
}
|
|
}
|
|
|
|
func Banned(w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(403)
|
|
pi := Page{"Banned",user,nList,tList,"You have been banned from this site."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
}
|
|
|
|
func BannedJSQ(w http.ResponseWriter, r *http.Request, user User, is_js string) {
|
|
w.WriteHeader(403)
|
|
if is_js == "0" {
|
|
pi := Page{"Banned",user,nList,tList,"You have been banned from this site."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
} else {
|
|
w.Write([]byte("{'errmsg': 'You have been banned from this site.'}"))
|
|
}
|
|
}
|
|
|
|
func LoginRequiredJSQ(w http.ResponseWriter, r *http.Request, user User, is_js string) {
|
|
w.WriteHeader(401)
|
|
if is_js == "0" {
|
|
pi := Page{"Local Error",user,nList,tList,"You need to login to do that."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
} else {
|
|
w.Write([]byte("{'errmsg': 'You need to login to do that.'}"))
|
|
}
|
|
}
|
|
|
|
func SecurityError(w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(403)
|
|
pi := Page{"Security Error",user,nList,tList,"There was a security issue with your request."}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
}
|
|
|
|
func NotFound(w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(404)
|
|
w.Write(error_notfound)
|
|
}
|
|
|
|
func CustomError(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, user User) {
|
|
w.WriteHeader(errcode)
|
|
pi := Page{errtitle,user,nList,tList,errmsg}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
}
|
|
|
|
func CustomErrorJSQ(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, user User, is_js string) {
|
|
w.WriteHeader(errcode)
|
|
if is_js == "0" {
|
|
pi := Page{errtitle,user,nList,tList,errmsg}
|
|
var b bytes.Buffer
|
|
templates.ExecuteTemplate(&b,"error.html", pi)
|
|
fmt.Fprintln(w,b.String())
|
|
} else {
|
|
w.Write([]byte(`{'errmsg': '` + errmsg + `'}`))
|
|
}
|
|
}
|