1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-03 03:36:22 -07:00

Clean up /manage handler, refer to manage functions as actions

This commit is contained in:
Eggbertx 2020-10-10 16:17:36 -07:00
parent 556a0e92f7
commit cba60dc06b
5 changed files with 103 additions and 143 deletions

5
go.mod
View file

@ -9,9 +9,10 @@ require (
github.com/go-sql-driver/mysql v1.5.0
github.com/lib/pq v1.8.0
github.com/mojocn/base64Captcha v1.3.1
github.com/nranchev/go-libGeoIP v0.0.0-20170629073846-d6d4a9a4c7e8 // indirect
// github.com/nranchev/go-libGeoIP v0.0.0-20170629073846-d6d4a9a4c7e8 // indirect
github.com/tdewolff/minify v2.3.6+incompatible
github.com/tdewolff/parse v2.3.4+incompatible // indirect
github.com/tdewolff/test v1.0.6 // indirect
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
golang.org/x/net v0.0.0-20201008222804-59f7323070c5
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89
)

42
go.sum
View file

@ -8,66 +8,34 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/lib/pq v1.4.0 h1:TmtCFbH+Aw0AixwyttznSMQDgbR5Yed/Gg6S8Funrhc=
github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.5.2 h1:yTSXVswvWUOQ3k1sd7vJfDrbSl8lKuscqFJRqjC0ifw=
github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg=
github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mojocn/base64Captcha v1.2.2 h1:NTFnThPVrb3tR66JO/N8/ZHsyFrNc7ho+xRpxBUEIlo=
github.com/mojocn/base64Captcha v1.2.2/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY=
github.com/mojocn/base64Captcha v1.3.1 h1:2Wbkt8Oc8qjmNJ5GyOfSo4tgVQPsbKMftqASnq8GlT0=
github.com/mojocn/base64Captcha v1.3.1/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY=
github.com/nranchev/go-libGeoIP v0.0.0-20170629073846-d6d4a9a4c7e8 h1:IeI4GVfCGrGx4tZROZ/ju+nO9rKpgKJ7o4XmQgAM/2g=
github.com/nranchev/go-libGeoIP v0.0.0-20170629073846-d6d4a9a4c7e8/go.mod h1:CSS25pAr1pT+qxFdpFZIJFHraF4zZfZYeFirlVvLXb4=
github.com/tdewolff/minify v2.3.6+incompatible h1:2hw5/9ZvxhWLvBUnHE06gElGYz+Jv9R4Eys0XUzItYo=
github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs=
github.com/tdewolff/parse v2.3.4+incompatible h1:x05/cnGwIMf4ceLuDMBOdQ1qGniMoxpP46ghf0Qzh38=
github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ=
github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4=
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs=
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc h1:ZGI/fILM2+ueot/UixBSoj9188jCAxVHEZEGhqq67I4=
golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88=
golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200707235045-ab33eee955e0 h1:eIYIE7EC5/Wv5Kbz8bJPaq+TN3kq3W8S+LSm62vM0DY=
golang.org/x/crypto v0.0.0-20200707235045-ab33eee955e0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg=
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201001193750-eb9a90e9f9cb h1:+i8XQ/zMhKyWrZ8ZrEx4+Eli5lXoBdSdFzKDjxPAC2I=
golang.org/x/crypto v0.0.0-20201001193750-eb9a90e9f9cb/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 h1:YfxMZzv3PjGonQYNUaeU2+DhAdqOxerQ30JFB6WgAXo=
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201008222804-59f7323070c5 h1:QlAbOwB6fYmEOgMjWW+WGWk9wX5FGoKw15QBvlor/n4=
golang.org/x/net v0.0.0-20201008222804-59f7323070c5/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89 h1:1GKfLldebiSdhTlt3nalwrb7L40Tixr/0IH+kSbRgmk=
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View file

@ -25,21 +25,34 @@ import (
"github.com/gochan-org/gochan/pkg/serverutil"
)
const (
// NoPerms allows anyone to access this Action
NoPerms = iota
// JanitorPerms allows anyone with at least a janitor-level account to access this Action
JanitorPerms
// ModPerms allows anyone with at least a moderator-level account to access this Action
ModPerms
// AdminPerms allows only the site administrator to view this Action
AdminPerms
)
var (
chopPortNumRegex = regexp.MustCompile(`(.+|\w+):(\d+)$`)
)
// ManageFunction represents the functions accessed by staff members at /manage?action=<functionname>.
type ManageFunction struct {
Title string
Permissions int // 0 -> non-staff, 1 => janitor, 2 => moderator, 3 => administrator
Callback func(writer http.ResponseWriter, request *http.Request) (string, error) `json:"-"` //return string of html output
// Action represents the functions accessed by staff members at /manage?action=<functionname>.
type Action struct {
Title string `json:"title"`
Permissions int `json:"perms"` // 0 = non-staff, 1 => janitor, 2 => moderator, 3 => administrator
isJSON bool `json:"-"` // if it can sometimes return JSON, this should still be false
Callback func(writer http.ResponseWriter, request *http.Request) (string, error) `json:"-"` //return string of html output
}
var manageFunctions = map[string]ManageFunction{
var actions = map[string]Action{
"cleanup": {
Title: "Cleanup",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
htmlOut = `<h2 class="manage-header">Cleanup</h2><br />`
@ -70,7 +83,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"config": {
Title: "Configuration",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
do := request.FormValue("do")
var status string
@ -285,7 +298,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"login": {
Title: "Login",
Permissions: 0,
Permissions: NoPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
if GetStaffRank(request) > 0 {
http.Redirect(writer, request, path.Join(config.Config.SiteWebfolder, "manage"), http.StatusFound)
@ -313,7 +326,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"logout": {
Title: "Logout",
Permissions: 1,
Permissions: JanitorPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
cookie, _ := request.Cookie("sessiondata")
cookie.MaxAge = 0
@ -323,7 +336,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"announcements": {
Title: "Announcements",
Permissions: 1,
Permissions: JanitorPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
htmlOut = `<h1 class="manage-header">Announcements</h1><br />`
@ -346,7 +359,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"bans": {
Title: "Bans",
Permissions: 1,
Permissions: ModPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) { //TODO whatever this does idk man
var post gcsql.Post
if request.FormValue("do") == "add" {
@ -427,8 +440,9 @@ var manageFunctions = map[string]ManageFunction{
htmlOut += manageBansBuffer.String()
return
}},
"getstaffjquery": {
Permissions: 0,
"staffinfo": {
Permissions: NoPerms,
isJSON: true,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
staff, err := getCurrentFullStaff(request)
if err != nil {
@ -439,7 +453,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"boards": {
Title: "Boards",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
do := request.FormValue("do")
var done bool
@ -615,38 +629,11 @@ var manageFunctions = map[string]ManageFunction{
}},
"staffmenu": {
Title: "Staff menu",
Permissions: 1,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
rank := GetStaffRank(request)
htmlOut = `<a href="javascript:void(0)" id="logout" class="staffmenu-item">Log out</a><br />` +
`<a href="javascript:void(0)" id="announcements" class="staffmenu-item">Announcements</a><br />`
if rank == 3 {
htmlOut += `<b>Admin stuff</b><br /><a href="javascript:void(0)" id="staff" class="staffmenu-item">Manage staff</a><br />` +
//`<a href="javascript:void(0)" id="purgeeverything" class="staffmenu-item">Purge everything!</a><br />` +
`<a href="javascript:void(0)" id="executesql" class="staffmenu-item">Execute SQL statement(s)</a><br />` +
`<a href="javascript:void(0)" id="cleanup" class="staffmenu-item">Run cleanup</a><br />` +
`<a href="javascript:void(0)" id="rebuildall" class="staffmenu-item">Rebuild all</a><br />` +
`<a href="javascript:void(0)" id="rebuildfront" class="staffmenu-item">Rebuild front page</a><br />` +
`<a href="javascript:void(0)" id="rebuildboards" class="staffmenu-item">Rebuild board pages</a><br />` +
`<a href="javascript:void(0)" id="reparsehtml" class="staffmenu-item">Reparse all posts</a><br />` +
`<a href="javascript:void(0)" id="boards" class="staffmenu-item">Add/edit/delete boards</a><br />`
}
if rank >= 2 {
htmlOut += `<b>Mod stuff</b><br />` +
`<a href="javascript:void(0)" id="bans" class="staffmenu-item">Ban User(s)</a><br />`
}
if rank >= 1 {
htmlOut += `<a href="javascript:void(0)" id="recentimages" class="staffmenu-item">Recently uploaded images</a><br />` +
`<a href="javascript:void(0)" id="recentposts" class="staffmenu-item">Recent posts</a><br />` +
`<a href="javascript:void(0)" id="searchip" class="staffmenu-item">Search posts by IP</a><br />`
}
return
}},
Permissions: JanitorPerms,
},
"rebuildfront": {
Title: "Rebuild front page",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
if err = gctemplates.InitTemplates(); err != nil {
return "", err
@ -655,7 +642,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"rebuildall": {
Title: "Rebuild everything",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
gctemplates.InitTemplates()
gcsql.ResetBoardSectionArrays()
@ -679,7 +666,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"rebuildboards": {
Title: "Rebuild boards",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
if err = gctemplates.InitTemplates(); err != nil {
return "", err
@ -688,7 +675,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"reparsehtml": {
Title: "Reparse HTML",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
messages, err := gcsql.GetAllNondeletedMessageRaw()
if err != nil {
@ -721,7 +708,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"recentposts": {
Title: "Recent posts",
Permissions: 1,
Permissions: JanitorPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
limit := request.FormValue("limit")
if limit == "" {
@ -753,7 +740,8 @@ var manageFunctions = map[string]ManageFunction{
}},
"postinfo": {
Title: "Post info",
Permissions: 2,
Permissions: ModPerms,
isJSON: true,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
var post gcsql.Post
post, err = gcsql.GetSpecificPost(gcutil.HackyStringToInt(request.FormValue("postid")), false)
@ -766,7 +754,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"staff": {
Title: "Staff",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
var allStaff []gcsql.Staff
do := request.FormValue("do")
@ -828,7 +816,7 @@ var manageFunctions = map[string]ManageFunction{
}},
"tempposts": {
Title: "Temporary posts lists",
Permissions: 3,
Permissions: AdminPerms,
Callback: func(writer http.ResponseWriter, request *http.Request) (htmlOut string, err error) {
htmlOut += `<h1 class="manage-header">Temporary posts</h1>`
if len(gcsql.TempPosts) == 0 {

View file

@ -17,57 +17,64 @@ func CallManageFunction(writer http.ResponseWriter, request *http.Request) {
if err = request.ParseForm(); err != nil {
serverutil.ServeErrorPage(writer, gclog.Print(gclog.LErrorLog,
"Error parsing form data: ", err.Error()))
return
}
action := request.FormValue("action")
staffRank := GetStaffRank(request)
var managePageBuffer bytes.Buffer
if action == "postinfo" || action == "getstaffjquery" {
writer.Header().Add("Content-Type", "application/json")
writer.Header().Add("Cache-Control", "max-age=5, must-revalidate")
} else {
if action == "" {
if staffRank == NoPerms {
action = "login"
} else {
action = "staffmenu"
}
}
handler, ok := actions[action]
var htmlOut string
if !ok {
serverutil.ServeNotFound(writer, request)
return
}
if action == "staffmenu" {
handler.Callback = getStaffMenu
}
if staffRank == NoPerms && handler.Permissions > NoPerms {
handler = actions["login"]
} else if staffRank < handler.Permissions {
writer.WriteHeader(403)
serverutil.ServeErrorPage(writer, "You don't have permission to access this page.")
staffName, _ := getCurrentStaff(request)
gclog.Printf(gclog.LStaffLog,
"Rejected request to manage page %s from %s (insufficient permissions)", action, staffName)
return
}
htmlOut, err = handler.Callback(writer, request)
if err != nil {
staffName, _ := getCurrentStaff(request)
// writer.WriteHeader(500)
serverutil.ServeErrorPage(writer, err.Error())
gclog.Printf(gclog.LStaffLog|gclog.LErrorLog,
"Error accessing manage page %s by %s: %s", action, staffName, err.Error())
return
}
var footer string
if !handler.isJSON {
managePageBuffer.WriteString("<!DOCTYPE html><html><head>")
if err = gctemplates.ManageHeader.Execute(&managePageBuffer, config.Config); err != nil {
serverutil.ServeErrorPage(writer, gclog.Print(gclog.LErrorLog|gclog.LStaffLog,
"Error executing manage page header template: ", err.Error()))
return
}
}
if action == "" {
managePageBuffer.WriteString(actionHTMLLinker(manageFunctions))
footer = "</body></html>"
} else {
handler, ok := manageFunctions[action]
var htmlOut string
if !ok {
serverutil.ServeNotFound(writer, request)
return
}
if staffRank == 0 && handler.Permissions > 0 {
handler = manageFunctions["login"]
} else if staffRank < handler.Permissions {
writer.WriteHeader(403)
serverutil.ServeErrorPage(writer, "You don't have permission to access this page.")
staffName, _ := getCurrentStaff(request)
gclog.Printf(gclog.LStaffLog,
"Rejected request to manage page %s from %s (insufficient permissions)", action, staffName)
return
}
htmlOut, err = handler.Callback(writer, request)
if err != nil {
staffName, _ := getCurrentStaff(request)
// writer.WriteHeader(500)
serverutil.ServeErrorPage(writer, err.Error())
gclog.Printf(gclog.LStaffLog|gclog.LErrorLog,
"Error accessing manage page %s by %s: %s", action, staffName, err.Error())
return
}
managePageBuffer.WriteString(htmlOut)
writer.Header().Add("Content-Type", "application/json")
writer.Header().Add("Cache-Control", "max-age=5, must-revalidate")
}
if action != "getstaffjquery" && action != "postinfo" {
managePageBuffer.WriteString("</body></html>")
}
managePageBuffer.WriteString(htmlOut + footer)
writer.Write(managePageBuffer.Bytes())
}

View file

@ -2,7 +2,6 @@ package manage
import (
"net/http"
"sort"
"time"
"github.com/gochan-org/gochan/pkg/gclog"
@ -81,22 +80,19 @@ func getCurrentFullStaff(request *http.Request) (*gcsql.Staff, error) {
func GetStaffRank(request *http.Request) int {
staff, err := getCurrentFullStaff(request)
if err != nil {
return 0
return NoPerms
}
return staff.Rank
}
func actionHTMLLinker(funcMap map[string]ManageFunction) string {
var links = ""
var keys []string
for key := range funcMap {
if funcMap[key].Title != "" {
keys = append(keys, key)
func getStaffMenu(writer http.ResponseWriter, request *http.Request) (string, error) {
var links string
rank := GetStaffRank(request)
for f, mf := range actions {
if rank < mf.Permissions || mf.Permissions == NoPerms {
continue
}
links += `<a href="manage?action=` + f + `" id="` + f + `">` + mf.Title + `</a></br />`
}
sort.Strings(keys)
for _, key := range keys {
links += `<a href="manage?action=` + key + `">` + funcMap[key].Title + "</a></br>"
}
return links
return links, nil
}