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("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) {

View File

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

View File

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

View File

@ -29,16 +29,16 @@ func init() {
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)
ext := filepath.Ext("./attachs/" + filename)
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"))
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")
@ -52,22 +52,22 @@ func ShowAttachment(w http.ResponseWriter, r *http.Request, user *c.User, filena
}
if sectionTable == "forums" {
_, ferr := c.SimpleForumUserCheck(w, r, user, sid)
_, ferr := c.SimpleForumUserCheck(w, r, u, sid)
if ferr != nil {
return ferr
}
if !user.Perms.ViewTopic {
return c.NoPermissions(w, r, user)
if !u.Perms.ViewTopic {
return c.NoPermissions(w, r, u)
}
} else {
return c.LocalError("Unknown section", w, r, user)
return c.LocalError("Unknown section", w, r, u)
}
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)
} else {
guest := c.GuestUser

View File

@ -10,8 +10,8 @@ import (
c "github.com/Azareal/Gosora/common"
)
func Backups(w http.ResponseWriter, r *http.Request, user *c.User, backupURL string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "backups", "backups")
func Backups(w http.ResponseWriter, r *http.Request, u *c.User, backupURL string) c.RouteError {
basePage, ferr := buildBasePage(w, r, u, "backups", "backups")
if ferr != nil {
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
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 {
return c.InternalError(err, w, r)
}

View File

@ -10,13 +10,13 @@ import (
p "github.com/Azareal/Gosora/common/phrases"
)
func Settings(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "settings", "settings")
func Settings(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, u, "settings", "settings")
if ferr != nil {
return ferr
}
if !user.Perms.EditSettings {
return c.NoPermissions(w, r, user)
if !u.Perms.EditSettings {
return c.NoPermissions(w, r, u)
}
// 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, ",")
conv, err := strconv.Atoi(s.Content)
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]
// TODO: Localise this

View File

@ -23,7 +23,7 @@ import (
"golang.org/x/image/tiff"
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"
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"))
_, tid, err := ParseSEOURL(urlBit)
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...
@ -59,16 +59,16 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
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 {
return ferr
}
if !user.Perms.ViewTopic {
return c.NoPermissions(w, r, user)
}
header.Title = topic.Title
header.Path = topic.Link
//header.Path = c.BuildTopicURL(c.NameToSlug(topic.Title), topic.ID)
h.Title = topic.Title
h.Path = topic.Link
//h.Path = c.BuildTopicURL(c.NameToSlug(topic.Title), topic.ID)
postGroup, err := c.Groups.Get(topic.Group)
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")
if !user.Loggedin && user.LastAgent != c.SimpleBots[0] && user.LastAgent != c.SimpleBots[1] {
if len(topic.Content) > 200 {
header.OGDesc = topic.Content[:197] + "..."
h.OGDesc = topic.Content[:197] + "..."
} 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
@ -143,7 +144,7 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
// Calculate the offset
offset, page, lastPage := c.PageOffset(topic.PostCount, page, c.Config.ItemsPerPage)
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...
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
}
header.Zone = "view_topic"
header.ZoneID = topic.ID
header.ZoneData = topic
h.Zone = "view_topic"
h.ZoneID = topic.ID
h.ZoneData = topic
var rerr c.RouteError
tmpl := forum.Tmpl
if r.FormValue("i") == "1" {
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 == "" {
rerr = renderTemplate("topic_mini", w, r, header, tpage)
rerr = renderTemplate("topic_mini", w, r, h, tpage)
} else {
tmpl = "topic_mini" + tmpl
err = renderTemplate3(tmpl, tmpl, w, r, header, tpage)
err = renderTemplate3(tmpl, tmpl, w, r, h, tpage)
if err != nil {
rerr = renderTemplate("topic_mini", w, r, header, tpage)
rerr = renderTemplate("topic_mini", w, r, h, tpage)
}
}
} else {
if tpage.Poll != nil {
header.AddSheet("chartist/chartist.min.css")
header.AddScript("chartist/chartist.min.js")
h.AddSheet("chartist/chartist.min.css")
h.AddScript("chartist/chartist.min.js")
}
if tmpl == "" {
rerr = renderTemplate("topic", w, r, header, tpage)
rerr = renderTemplate("topic", w, r, h, tpage)
} else {
tmpl = "topic_" + tmpl
err = renderTemplate3(tmpl, tmpl, w, r, header, tpage)
err = renderTemplate3(tmpl, tmpl, w, r, h, tpage)
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?
counters.ForumViewCounter.Bump(topic.ParentID)
co.TopicViewCounter.Bump(topic.ID) // TODO: Move this into the router?
co.ForumViewCounter.Bump(topic.ParentID)
return rerr
}
@ -394,7 +395,6 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
maxPollOptions := 10
pollInputItems := make(map[int]string)
for key, values := range r.Form {
for _, value := range values {
if !strings.HasPrefix(key, "pollinputitem[") {
continue
}
@ -408,7 +408,7 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
if err != nil {
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
_, exists := pollInputItems[index]
// 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 {
return c.InternalError(err, w, r)
}
err = u.IncreasePostStats(c.WordCount(content), true)
if err != nil {
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()
counters.TopicCounter.Bump()
co.PostCounter.Bump()
co.TopicCounter.Bump()
// TODO: Pass more data to this hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_topic", tid, u)
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 {
// TODO: Move this to some sort of middleware
var tids []int
js := false
if c.ReqIsJson(r) {
js := c.ReqIsJson(r)
if js {
if r.Body == nil {
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 {
return c.PreErrorJS("We weren't able to parse your data", w, r)
}
js = true
} else {
tid, err := strconv.Atoi(r.URL.Path[len("/topic/delete/submit/"):])
if err != nil {
@ -679,7 +677,6 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
err = c.ModLogs.Create("delete", tid, "topic", user.GetIP(), user.ID)
if err != nil {
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)
}
//
//
// mark
//
//
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)
if err != nil {
return nil, nil, c.PreError(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
}
t, err := c.Topics.Get(tid)
if err == sql.ErrNoRows {
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 {
// TODO: Move this to some sort of middleware
var tids []int
js := false
if c.ReqIsJson(r) {
js := c.ReqIsJson(r)
if js {
if r.Body == nil {
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 {
return c.PreErrorJS("We weren't able to parse your data", w, r)
}
js = true
} else {
tid, err := strconv.Atoi(r.URL.Path[len("/topic/lock/submit/"):])
if err != nil {
@ -885,7 +885,6 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid
if err != nil {
return c.InternalErrorJS(err, w, r)
}
// ? - Is there a better way of doing this?
err = addTopicAction("move-"+strconv.Itoa(fid), topic, user)
if err != nil {
@ -920,7 +919,6 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
if err != nil {
return c.PreErrorJSQ(phrases.GetErrorPhrase("id_must_be_integer"), w, r, js)
}
topic, err := c.Topics.Get(tid)
if err == sql.ErrNoRows {
return c.PreErrorJSQ("The requested topic doesn't exist.", w, r, js)