strip bbcode tags from ogdesc meta blocks for topics

add topic_ogdesc_assign hook
initialise hooks after filling slices in bbcode init
hoist poll input checks out of inner loops in CreateTopicSubmit
shorten variable names and reduce boilerplate
This commit is contained in:
Azareal 2020-06-08 12:18:17 +10:00
parent 75d1d6fcbe
commit 8ef9dc8353
7 changed files with 83 additions and 70 deletions

View File

@ -53,6 +53,10 @@ func AddHooks(add func(name, params, ret, htype string, multiHook, skip bool, de
} }
//hookskip("forums_frow_assign","f *Forum") //hookskip("forums_frow_assign","f *Forum")
hookskip("topic_create_frow_assign","f *Forum") hookskip("topic_create_frow_assign","f *Forum")
hookss := func(name string) {
add(name,"d string","string","Sshooks",true,false,"","d")
}
hookss("topic_ogdesc_assign")
} }
func Write(hookVars HookVars) { func Write(hookVars HookVars) {

View File

@ -128,6 +128,7 @@ var hookTable = &HookTable{
map[string][]func(string) string{ map[string][]func(string) string{
"preparse_preassign": nil, "preparse_preassign": nil,
"parse_assign": nil, "parse_assign": nil,
"topic_ogdesc_assign": nil,
}, },
nil, nil,
//nil, //nil,

View File

@ -31,8 +31,6 @@ func init() {
} }
func InitBbcode(pl *c.Plugin) error { func InitBbcode(pl *c.Plugin) error {
pl.AddHook("parse_assign", BbcodeFullParse)
bbcodeInvalidNumber = []byte("<red>[Invalid Number]</red>") bbcodeInvalidNumber = []byte("<red>[Invalid Number]</red>")
bbcodeNoNegative = []byte("<red>[No Negative Numbers]</red>") bbcodeNoNegative = []byte("<red>[No Negative Numbers]</red>")
bbcodeMissingTag = []byte("<red>[Missing Tag]</red>") bbcodeMissingTag = []byte("<red>[Missing Tag]</red>")
@ -50,11 +48,23 @@ func InitBbcode(pl *c.Plugin) error {
bbcodeSpoiler = regexp.MustCompile(`\[spoiler\](.*)\[/spoiler\]`) bbcodeSpoiler = regexp.MustCompile(`\[spoiler\](.*)\[/spoiler\]`)
bbcodeRandom = rand.New(rand.NewSource(time.Now().UnixNano())) bbcodeRandom = rand.New(rand.NewSource(time.Now().UnixNano()))
pl.AddHook("parse_assign", BbcodeFullParse)
pl.AddHook("topic_ogdesc_assign", BbcodeStripTags)
return nil return nil
} }
func deactivateBbcode(pl *c.Plugin) { func deactivateBbcode(pl *c.Plugin) {
pl.RemoveHook("parse_assign", BbcodeFullParse) pl.RemoveHook("parse_assign", BbcodeFullParse)
pl.RemoveHook("topic_ogdesc_assign", BbcodeStripTags)
}
func BbcodeStripTags(msg string) string {
msg = bbcodeBold.ReplaceAllString(msg, "$1")
msg = bbcodeItalic.ReplaceAllString(msg, "$1")
msg = bbcodeUnderline.ReplaceAllString(msg, "$1")
msg = bbcodeStrike.ReplaceAllString(msg, "$1")
return msg
} }
func BbcodeRegexParse(msg string) string { func BbcodeRegexParse(msg string) string {

View File

@ -29,16 +29,16 @@ func init() {
var maxAgeYear = "max-age=" + strconv.Itoa(int(c.Year)) var maxAgeYear = "max-age=" + strconv.Itoa(int(c.Year))
func ShowAttachment(w http.ResponseWriter, r *http.Request, user *c.User, filename string) c.RouteError { func ShowAttachment(w http.ResponseWriter, r *http.Request, u *c.User, filename string) c.RouteError {
filename = c.Stripslashes(filename) filename = c.Stripslashes(filename)
ext := filepath.Ext("./attachs/" + filename) ext := filepath.Ext("./attachs/" + filename)
if !c.AllowedFileExts.Contains(strings.TrimPrefix(ext, ".")) { if !c.AllowedFileExts.Contains(strings.TrimPrefix(ext, ".")) {
return c.LocalError("Bad extension", w, r, user) return c.LocalError("Bad extension", w, r, u)
} }
sid, err := strconv.Atoi(r.FormValue("sid")) sid, err := strconv.Atoi(r.FormValue("sid"))
if err != nil { if err != nil {
return c.LocalError("The sid is not an integer", w, r, user) return c.LocalError("The sid is not an integer", w, r, u)
} }
sectionTable := r.FormValue("stype") sectionTable := r.FormValue("stype")
@ -52,22 +52,22 @@ func ShowAttachment(w http.ResponseWriter, r *http.Request, user *c.User, filena
} }
if sectionTable == "forums" { if sectionTable == "forums" {
_, ferr := c.SimpleForumUserCheck(w, r, user, sid) _, ferr := c.SimpleForumUserCheck(w, r, u, sid)
if ferr != nil { if ferr != nil {
return ferr return ferr
} }
if !user.Perms.ViewTopic { if !u.Perms.ViewTopic {
return c.NoPermissions(w, r, user) return c.NoPermissions(w, r, u)
} }
} else { } else {
return c.LocalError("Unknown section", w, r, user) return c.LocalError("Unknown section", w, r, u)
} }
if originTable != "topics" && originTable != "replies" { if originTable != "topics" && originTable != "replies" {
return c.LocalError("Unknown origin", w, r, user) return c.LocalError("Unknown origin", w, r, u)
} }
if !user.Loggedin { if !u.Loggedin {
w.Header().Set("Cache-Control", maxAgeYear) w.Header().Set("Cache-Control", maxAgeYear)
} else { } else {
guest := c.GuestUser guest := c.GuestUser

View File

@ -10,8 +10,8 @@ import (
c "github.com/Azareal/Gosora/common" c "github.com/Azareal/Gosora/common"
) )
func Backups(w http.ResponseWriter, r *http.Request, user *c.User, backupURL string) c.RouteError { func Backups(w http.ResponseWriter, r *http.Request, u *c.User, backupURL string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "backups", "backups") basePage, ferr := buildBasePage(w, r, u, "backups", "backups")
if ferr != nil { if ferr != nil {
return ferr return ferr
} }
@ -42,7 +42,7 @@ func Backups(w http.ResponseWriter, r *http.Request, user *c.User, backupURL str
} }
// TODO: Fix the problem where non-existent files aren't greeted with custom 404s on ServeFile()'s side // TODO: Fix the problem where non-existent files aren't greeted with custom 404s on ServeFile()'s side
http.ServeFile(w, r, "./backups/"+backupURL) http.ServeFile(w, r, "./backups/"+backupURL)
err = c.AdminLogs.Create("download", 0, "backup", user.GetIP(), user.ID) err = c.AdminLogs.Create("download", 0, "backup", u.GetIP(), u.ID)
if err != nil { if err != nil {
return c.InternalError(err, w, r) return c.InternalError(err, w, r)
} }

View File

@ -10,13 +10,13 @@ import (
p "github.com/Azareal/Gosora/common/phrases" p "github.com/Azareal/Gosora/common/phrases"
) )
func Settings(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError { func Settings(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "settings", "settings") basePage, ferr := buildBasePage(w, r, u, "settings", "settings")
if ferr != nil { if ferr != nil {
return ferr return ferr
} }
if !user.Perms.EditSettings { if !u.Perms.EditSettings {
return c.NoPermissions(w, r, user) return c.NoPermissions(w, r, u)
} }
// TODO: What if the list gets too long? How should we structure this? // TODO: What if the list gets too long? How should we structure this?
@ -35,7 +35,7 @@ func Settings(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError
labels := strings.Split(llist, ",") labels := strings.Split(llist, ",")
conv, err := strconv.Atoi(s.Content) conv, err := strconv.Atoi(s.Content)
if err != nil { if err != nil {
return c.LocalError("The setting '"+s.Name+"' can't be converted to an integer", w, r, user) return c.LocalError("The setting '"+s.Name+"' can't be converted to an integer", w, r, u)
} }
s.Content = labels[conv-1] s.Content = labels[conv-1]
// TODO: Localise this // TODO: Localise this

View File

@ -23,7 +23,7 @@ import (
"golang.org/x/image/tiff" "golang.org/x/image/tiff"
c "github.com/Azareal/Gosora/common" c "github.com/Azareal/Gosora/common"
"github.com/Azareal/Gosora/common/counters" co "github.com/Azareal/Gosora/common/counters"
"github.com/Azareal/Gosora/common/phrases" "github.com/Azareal/Gosora/common/phrases"
qgen "github.com/Azareal/Gosora/query_gen" qgen "github.com/Azareal/Gosora/query_gen"
) )
@ -44,11 +44,11 @@ func init() {
}) })
} }
func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header, urlBit string) c.RouteError { func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header, urlBit string) c.RouteError {
page, _ := strconv.Atoi(r.FormValue("page")) page, _ := strconv.Atoi(r.FormValue("page"))
_, tid, err := ParseSEOURL(urlBit) _, tid, err := ParseSEOURL(urlBit)
if err != nil { if err != nil {
return c.SimpleError(phrases.GetErrorPhrase("url_id_must_be_integer"), w, r, header) return c.SimpleError(phrases.GetErrorPhrase("url_id_must_be_integer"), w, r, h)
} }
// Get the topic... // Get the topic...
@ -59,16 +59,16 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
return c.InternalError(err, w, r) return c.InternalError(err, w, r)
} }
ferr := c.ForumUserCheck(header, w, r, user, topic.ParentID) ferr := c.ForumUserCheck(h, w, r, user, topic.ParentID)
if ferr != nil { if ferr != nil {
return ferr return ferr
} }
if !user.Perms.ViewTopic { if !user.Perms.ViewTopic {
return c.NoPermissions(w, r, user) return c.NoPermissions(w, r, user)
} }
header.Title = topic.Title h.Title = topic.Title
header.Path = topic.Link h.Path = topic.Link
//header.Path = c.BuildTopicURL(c.NameToSlug(topic.Title), topic.ID) //h.Path = c.BuildTopicURL(c.NameToSlug(topic.Title), topic.ID)
postGroup, err := c.Groups.Get(topic.Group) postGroup, err := c.Groups.Get(topic.Group)
if err != nil { if err != nil {
@ -78,10 +78,11 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
topic.ContentLines = strings.Count(topic.Content, "\n") topic.ContentLines = strings.Count(topic.Content, "\n")
if !user.Loggedin && user.LastAgent != c.SimpleBots[0] && user.LastAgent != c.SimpleBots[1] { if !user.Loggedin && user.LastAgent != c.SimpleBots[0] && user.LastAgent != c.SimpleBots[1] {
if len(topic.Content) > 200 { if len(topic.Content) > 200 {
header.OGDesc = topic.Content[:197] + "..." h.OGDesc = topic.Content[:197] + "..."
} else { } else {
header.OGDesc = topic.Content h.OGDesc = topic.Content
} }
h.OGDesc = c.H_topic_ogdesc_assign_hook(h.Hooks, h.OGDesc)
} }
var parseSettings *c.ParseSettings var parseSettings *c.ParseSettings
@ -143,7 +144,7 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
// Calculate the offset // Calculate the offset
offset, page, lastPage := c.PageOffset(topic.PostCount, page, c.Config.ItemsPerPage) offset, page, lastPage := c.PageOffset(topic.PostCount, page, c.Config.ItemsPerPage)
pageList := c.Paginate(page, lastPage, 5) pageList := c.Paginate(page, lastPage, 5)
tpage := c.TopicPage{header, nil, topic, forum, poll, c.Paginator{pageList, page, lastPage}} tpage := c.TopicPage{h, nil, topic, forum, poll, c.Paginator{pageList, page, lastPage}}
// Get the replies if we have any... // Get the replies if we have any...
if topic.PostCount > 0 { if topic.PostCount > 0 {
@ -160,42 +161,42 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
tpage.ItemList = rlist tpage.ItemList = rlist
} }
header.Zone = "view_topic" h.Zone = "view_topic"
header.ZoneID = topic.ID h.ZoneID = topic.ID
header.ZoneData = topic h.ZoneData = topic
var rerr c.RouteError var rerr c.RouteError
tmpl := forum.Tmpl tmpl := forum.Tmpl
if r.FormValue("i") == "1" { if r.FormValue("i") == "1" {
if tpage.Poll != nil { if tpage.Poll != nil {
header.AddXRes("chartist/chartist.min.css", "chartist/chartist.min.js") h.AddXRes("chartist/chartist.min.css", "chartist/chartist.min.js")
} }
if tmpl == "" { if tmpl == "" {
rerr = renderTemplate("topic_mini", w, r, header, tpage) rerr = renderTemplate("topic_mini", w, r, h, tpage)
} else { } else {
tmpl = "topic_mini" + tmpl tmpl = "topic_mini" + tmpl
err = renderTemplate3(tmpl, tmpl, w, r, header, tpage) err = renderTemplate3(tmpl, tmpl, w, r, h, tpage)
if err != nil { if err != nil {
rerr = renderTemplate("topic_mini", w, r, header, tpage) rerr = renderTemplate("topic_mini", w, r, h, tpage)
} }
} }
} else { } else {
if tpage.Poll != nil { if tpage.Poll != nil {
header.AddSheet("chartist/chartist.min.css") h.AddSheet("chartist/chartist.min.css")
header.AddScript("chartist/chartist.min.js") h.AddScript("chartist/chartist.min.js")
} }
if tmpl == "" { if tmpl == "" {
rerr = renderTemplate("topic", w, r, header, tpage) rerr = renderTemplate("topic", w, r, h, tpage)
} else { } else {
tmpl = "topic_" + tmpl tmpl = "topic_" + tmpl
err = renderTemplate3(tmpl, tmpl, w, r, header, tpage) err = renderTemplate3(tmpl, tmpl, w, r, h, tpage)
if err != nil { if err != nil {
rerr = renderTemplate("topic", w, r, header, tpage) rerr = renderTemplate("topic", w, r, h, tpage)
} }
} }
} }
counters.TopicViewCounter.Bump(topic.ID) // TODO: Move this into the router? co.TopicViewCounter.Bump(topic.ID) // TODO: Move this into the router?
counters.ForumViewCounter.Bump(topic.ParentID) co.ForumViewCounter.Bump(topic.ParentID)
return rerr return rerr
} }
@ -394,7 +395,6 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
maxPollOptions := 10 maxPollOptions := 10
pollInputItems := make(map[int]string) pollInputItems := make(map[int]string)
for key, values := range r.Form { for key, values := range r.Form {
for _, value := range values {
if !strings.HasPrefix(key, "pollinputitem[") { if !strings.HasPrefix(key, "pollinputitem[") {
continue continue
} }
@ -408,7 +408,7 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
if err != nil { if err != nil {
return c.LocalError("Malformed pollinputitem", w, r, u) return c.LocalError("Malformed pollinputitem", w, r, u)
} }
for _, value := range values {
// If there are duplicates, then something has gone horribly wrong, so let's ignore them, this'll likely happen during an attack // If there are duplicates, then something has gone horribly wrong, so let's ignore them, this'll likely happen during an attack
_, exists := pollInputItems[index] _, exists := pollInputItems[index]
// TODO: Should we use SanitiseBody instead to keep the newlines? // TODO: Should we use SanitiseBody instead to keep the newlines?
@ -440,7 +440,6 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
if err != nil { if err != nil {
return c.InternalError(err, w, r) return c.InternalError(err, w, r)
} }
err = u.IncreasePostStats(c.WordCount(content), true) err = u.IncreasePostStats(c.WordCount(content), true)
if err != nil { if err != nil {
return c.InternalError(err, w, r) return c.InternalError(err, w, r)
@ -454,8 +453,8 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
} }
} }
counters.PostCounter.Bump() co.PostCounter.Bump()
counters.TopicCounter.Bump() co.TopicCounter.Bump()
// TODO: Pass more data to this hook? // TODO: Pass more data to this hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_topic", tid, u) skip, rerr := lite.Hooks.VhookSkippable("action_end_create_topic", tid, u)
if skip || rerr != nil { if skip || rerr != nil {
@ -634,8 +633,8 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError { func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
// TODO: Move this to some sort of middleware // TODO: Move this to some sort of middleware
var tids []int var tids []int
js := false js := c.ReqIsJson(r)
if c.ReqIsJson(r) { if js {
if r.Body == nil { if r.Body == nil {
return c.PreErrorJS("No request body", w, r) return c.PreErrorJS("No request body", w, r)
} }
@ -643,7 +642,6 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
if err != nil { if err != nil {
return c.PreErrorJS("We weren't able to parse your data", w, r) return c.PreErrorJS("We weren't able to parse your data", w, r)
} }
js = true
} else { } else {
tid, err := strconv.Atoi(r.URL.Path[len("/topic/delete/submit/"):]) tid, err := strconv.Atoi(r.URL.Path[len("/topic/delete/submit/"):])
if err != nil { if err != nil {
@ -679,7 +677,6 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)
} }
err = c.ModLogs.Create("delete", tid, "topic", user.GetIP(), user.ID) err = c.ModLogs.Create("delete", tid, "topic", user.GetIP(), user.ID)
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)
@ -714,12 +711,16 @@ func StickTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User, stid st
return topicActionPost(topic.Stick(), "stick", w, r, lite, topic, u) return topicActionPost(topic.Stick(), "stick", w, r, lite, topic, u)
} }
//
//
// mark
//
//
func topicActionPre(stid, action string, w http.ResponseWriter, r *http.Request, u *c.User) (*c.Topic, *c.HeaderLite, c.RouteError) { func topicActionPre(stid, action string, w http.ResponseWriter, r *http.Request, u *c.User) (*c.Topic, *c.HeaderLite, c.RouteError) {
tid, err := strconv.Atoi(stid) tid, err := strconv.Atoi(stid)
if err != nil { if err != nil {
return nil, nil, c.PreError(phrases.GetErrorPhrase("id_must_be_integer"), w, r) return nil, nil, c.PreError(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
} }
t, err := c.Topics.Get(tid) t, err := c.Topics.Get(tid)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, nil, c.PreError("The topic you tried to "+action+" doesn't exist.", w, r) return nil, nil, c.PreError("The topic you tried to "+action+" doesn't exist.", w, r)
@ -765,8 +766,8 @@ func UnstickTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User, stid
func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError { func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
// TODO: Move this to some sort of middleware // TODO: Move this to some sort of middleware
var tids []int var tids []int
js := false js := c.ReqIsJson(r)
if c.ReqIsJson(r) { if js {
if r.Body == nil { if r.Body == nil {
return c.PreErrorJS("No request body", w, r) return c.PreErrorJS("No request body", w, r)
} }
@ -774,7 +775,6 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
if err != nil { if err != nil {
return c.PreErrorJS("We weren't able to parse your data", w, r) return c.PreErrorJS("We weren't able to parse your data", w, r)
} }
js = true
} else { } else {
tid, err := strconv.Atoi(r.URL.Path[len("/topic/lock/submit/"):]) tid, err := strconv.Atoi(r.URL.Path[len("/topic/lock/submit/"):])
if err != nil { if err != nil {
@ -885,7 +885,6 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid
if err != nil { if err != nil {
return c.InternalErrorJS(err, w, r) return c.InternalErrorJS(err, w, r)
} }
// ? - Is there a better way of doing this? // ? - Is there a better way of doing this?
err = addTopicAction("move-"+strconv.Itoa(fid), topic, user) err = addTopicAction("move-"+strconv.Itoa(fid), topic, user)
if err != nil { if err != nil {
@ -920,7 +919,6 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
if err != nil { if err != nil {
return c.PreErrorJSQ(phrases.GetErrorPhrase("id_must_be_integer"), w, r, js) return c.PreErrorJSQ(phrases.GetErrorPhrase("id_must_be_integer"), w, r, js)
} }
topic, err := c.Topics.Get(tid) topic, err := c.Topics.Get(tid)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return c.PreErrorJSQ("The requested topic doesn't exist.", w, r, js) return c.PreErrorJSQ("The requested topic doesn't exist.", w, r, js)