From 45a3065db1673e962c0ce2ca510584b217c03e2f Mon Sep 17 00:00:00 2001 From: Azareal Date: Sun, 6 Oct 2019 15:32:08 +1000 Subject: [PATCH] Use json marshal for the group permissions in querygen. Add an omitempty json tag to the Perms struct. Take the opportunity to shorten some things. --- cmd/query_gen/main.go | 42 ++++++++++++++---- common/permissions.go | 78 ++++++++++++++++---------------- common/templates/templates.go | 65 +++++++++++++-------------- common/theme.go | 84 +++++++++++++++++------------------ common/word_filters.go | 16 +++---- schema/mssql/inserts.sql | 12 ++--- schema/mysql/inserts.sql | 12 ++--- schema/pgsql/inserts.sql | 12 ++--- templates/topic.html | 4 +- 9 files changed, 174 insertions(+), 151 deletions(-) diff --git a/cmd/query_gen/main.go b/cmd/query_gen/main.go index 3af9723d..d36fbc7b 100644 --- a/cmd/query_gen/main.go +++ b/cmd/query_gen/main.go @@ -2,12 +2,14 @@ package main // import "github.com/Azareal/Gosora/query_gen" import ( + "encoding/json" "fmt" "log" "os" "runtime/debug" "strconv" + c "github.com/Azareal/Gosora/common" qgen "github.com/Azareal/Gosora/query_gen" ) @@ -175,18 +177,42 @@ func seedTables(adapter qgen.Adapter) error { MoveTopic */ - // TODO: Set the permissions on a struct and then serialize the struct and insert that instead of writing raw JSON - qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms, is_mod, is_admin, tag", `'Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,"Admin"`) + p := func(perms c.Perms) string { + jBytes, err := json.Marshal(perms) + if err != nil { + panic(err) + } + return string(jBytes) + } + addGroup := func(name string, perms c.Perms, mod bool, admin bool, banned bool, tag string) { + mi, ai, bi := "0", "0", "0" + if mod { + mi = "1" + } + if admin { + ai = "1" + } + if banned { + bi = "1" + } + qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", `'`+name+`','`+p(perms)+`','{}',`+mi+`,`+ai+`,`+bi+`,"`+tag+`"`) + } - qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms, is_mod, tag", `'Moderator','{"BanUsers":true,"ActivateUsers":false,"EditUser":true,"EditUserEmail":false,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,"Mod"`) + perms := c.AllPerms + perms.EditUserGroupAdmin = false + perms.EditGroupAdmin = false + addGroup("Administrator", perms, true, true, false, "Admin") - qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms", `'Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}'`) + perms = c.Perms{BanUsers: true, ActivateUsers: true, EditUser: true, EditUserEmail: false, EditUserGroup: true, ViewIPs: true, UploadFiles: true, UploadAvatars: true, UseConvos: true, ViewTopic: true, LikeItem: true, CreateTopic: true, EditTopic: true, DeleteTopic: true, CreateReply: true, EditReply: true, DeleteReply: true, PinTopic: true, CloseTopic: true, MoveTopic: true} + addGroup("Moderator", perms, true, false, false, "Mod") - qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms, is_banned", `'Banned','{"ViewTopic":true}','{}',1`) + perms = c.Perms{UploadFiles: true, UploadAvatars: true, UseConvos: true, ViewTopic: true, LikeItem: true, CreateTopic: true, CreateReply: true} + addGroup("Member", perms, false, false, false, "") - qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms", `'Awaiting Activation','{"ViewTopic":true}','{}'`) - - qgen.Install.SimpleInsert("users_groups", "name, permissions, plugin_perms, tag", `'Not Loggedin','{"ViewTopic":true}','{}','Guest'`) + perms = c.Perms{ViewTopic: true} + addGroup("Banned", perms, false, false, true, "") + addGroup("Awaiting Activation", perms, false, false, false, "") + addGroup("Not Loggedin", perms, false, false, false, "Guest") // // TODO: Stop processFields() from stripping the spaces in the descriptions in the next commit diff --git a/common/permissions.go b/common/permissions.go index e4b454ba..90223ada 100644 --- a/common/permissions.go +++ b/common/permissions.go @@ -45,50 +45,50 @@ var GlobalPermList = []string{ // Permission Structure: ActionComponent[Subcomponent]Flag type Perms struct { // Global Permissions - BanUsers bool - ActivateUsers bool - EditUser bool - EditUserEmail bool - EditUserPassword bool - EditUserGroup bool - EditUserGroupSuperMod bool - EditUserGroupAdmin bool - EditGroup bool - EditGroupLocalPerms bool - EditGroupGlobalPerms bool - EditGroupSuperMod bool - EditGroupAdmin bool - ManageForums bool // This could be local, albeit limited for per-forum managers? - EditSettings bool - ManageThemes bool - ManagePlugins bool - ViewAdminLogs bool - ViewIPs bool + BanUsers bool `json:",omitempty"` + ActivateUsers bool `json:",omitempty"` + EditUser bool `json:",omitempty"` + EditUserEmail bool `json:",omitempty"` + EditUserPassword bool `json:",omitempty"` + EditUserGroup bool `json:",omitempty"` + EditUserGroupSuperMod bool `json:",omitempty"` + EditUserGroupAdmin bool `json:",omitempty"` + EditGroup bool `json:",omitempty"` + EditGroupLocalPerms bool `json:",omitempty"` + EditGroupGlobalPerms bool `json:",omitempty"` + EditGroupSuperMod bool `json:",omitempty"` + EditGroupAdmin bool `json:",omitempty"` + ManageForums bool `json:",omitempty"` // This could be local, albeit limited for per-forum managers? + EditSettings bool `json:",omitempty"` + ManageThemes bool `json:",omitempty"` + ManagePlugins bool `json:",omitempty"` + ViewAdminLogs bool `json:",omitempty"` + ViewIPs bool `json:",omitempty"` // Global non-staff permissions - UploadFiles bool - UploadAvatars bool - UseConvos bool + UploadFiles bool `json:",omitempty"` + UploadAvatars bool `json:",omitempty"` + UseConvos bool `json:",omitempty"` // Forum permissions - ViewTopic bool - //ViewOwnTopic bool - LikeItem bool - CreateTopic bool - EditTopic bool - DeleteTopic bool - CreateReply bool - //CreateReplyToOwn bool - EditReply bool - //EditOwnReply bool - DeleteReply bool - //DeleteOwnReply bool - PinTopic bool - CloseTopic bool - //CloseOwnTopic bool - MoveTopic bool + ViewTopic bool `json:",omitempty"` + //ViewOwnTopic bool `json:",omitempty"` + LikeItem bool `json:",omitempty"` + CreateTopic bool `json:",omitempty"` + EditTopic bool `json:",omitempty"` + DeleteTopic bool `json:",omitempty"` + CreateReply bool `json:",omitempty"` + //CreateReplyToOwn bool `json:",omitempty"` + EditReply bool `json:",omitempty"` + //EditOwnReply bool `json:",omitempty"` + DeleteReply bool `json:",omitempty"` + //DeleteOwnReply bool `json:",omitempty"` + PinTopic bool `json:",omitempty"` + CloseTopic bool `json:",omitempty"` + //CloseOwnTopic bool `json:",omitempty"` + MoveTopic bool `json:",omitempty"` - //ExtData map[string]bool + //ExtData map[string]bool `json:",omitempty"` } func init() { diff --git a/common/templates/templates.go b/common/templates/templates.go index 7afc7467..d0120f30 100644 --- a/common/templates/templates.go +++ b/common/templates/templates.go @@ -11,9 +11,9 @@ import ( "runtime/debug" "strconv" "strings" - "unicode" "text/template/parse" "time" + "unicode" ) // TODO: Turn this file into a library @@ -107,15 +107,15 @@ func NewCTemplateSet(in string) *CTemplateSet { "hasWidgets": true, "elapsed": true, "lang": true, - "langf":true, - "level": true, - "bunit": true, - "abstime": true, - "reltime": true, - "scope": true, - "dyntmpl": true, - "index": true, - "flush": true, + "langf": true, + "level": true, + "bunit": true, + "abstime": true, + "reltime": true, + "scope": true, + "dyntmpl": true, + "index": true, + "flush": true, }, logger: log.New(f, "", log.LstdFlags), loggerf: f, @@ -193,9 +193,9 @@ func (c *CTemplateSet) CompileByLoggedin(name string, fileDir string, expects st } var importList string for _, item := range c.importMap { - ispl := strings.Split(item," ") + ispl := strings.Split(item, " ") if len(ispl) > 1 { - importList += "import "+ispl[0]+" \"" + ispl[1] + "\"\n" + importList += "import " + ispl[0] + " \"" + ispl[1] + "\"\n" } else { importList += "import \"" + item + "\"\n" } @@ -284,8 +284,7 @@ func (c *CTemplateSet) Compile(name string, fileDir string, expects string, expe func (c *CTemplateSet) compile(name string, content string, expects string, expectsInt interface{}, varList map[string]VarItem, imports ...string) (out string, err error) { defer func() { - r := recover() - if r != nil { + if r := recover(); r != nil { fmt.Println(r) debug.PrintStack() err := c.loggerf.Sync() @@ -313,7 +312,7 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe c.stats = make(map[string]int) tree := parse.New(name, c.funcMap) - var treeSet = make(map[string]*parse.Tree) + treeSet := make(map[string]*parse.Tree) tree, err = tree.Parse(content, "{{", "}}", treeSet, c.funcMap) if err != nil { return "", err @@ -413,9 +412,9 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe } var importList string for _, item := range c.importMap { - ispl := strings.Split(item," ") + ispl := strings.Split(item, " ") if len(ispl) > 1 { - importList += "import "+ispl[0]+" \"" + ispl[1] + "\"\n" + importList += "import " + ispl[0] + " \"" + ispl[1] + "\"\n" } else { importList += "import \"" + item + "\"\n" } @@ -481,9 +480,9 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe } fout += varString - var skipped = make(map[string]*SkipBlock) // map[templateName]*SkipBlock{map[atIndexAndAfter]skipThisMuch,lastCount} + skipped := make(map[string]*SkipBlock) // map[templateName]*SkipBlock{map[atIndexAndAfter]skipThisMuch,lastCount} - var writeTextFrame = func(tmplName string, index int) { + writeTextFrame := func(tmplName string, index int) { out := "w.Write(" + tmplName + "_frags[" + strconv.Itoa(index) + "]" + ")\n" c.detail("writing ", out) fout += out @@ -531,7 +530,7 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe } fout += "return nil\n}\n" - var writeFrag = func(tmplName string, index int, body string) { + writeFrag := func(tmplName string, index int, body string) { //c.detail("writing ", fragmentPrefix) c.FragOut = append(c.FragOut, OutFrag{tmplName, index, body}) } @@ -704,7 +703,7 @@ func (c *CTemplateSet) compileRangeNode(con CContext, node *parse.RangeNode) { c.detail("Expr:", expr) c.detail("Range Kind Switch!") - var startIf = func(item reflect.Value, useCopy bool) { + startIf := func(item reflect.Value, useCopy bool) { con.Push("startif", "if len("+expr+") != 0 {\n") startIndex := con.StartLoop("for _, item := range " + expr + " {\n") ccon := con @@ -812,7 +811,7 @@ func (c *CTemplateSet) compileSubSwitch(con CContext, node *parse.CommandNode) { } var assLines string - var multiline = false + multiline := false for _, id := range n.Ident { c.detail("Data Kind:", cur.Kind().String()) c.detail("Field Bit:", id) @@ -1023,7 +1022,7 @@ func (c *CTemplateSet) compareJoin(con CContext, pos int, node *parse.CommandNod func (c *CTemplateSet) compileIdentSwitch(con CContext, node *parse.CommandNode) (out string, val reflect.Value, literal bool, notident bool) { c.dumpCall("compileIdentSwitch", con, node) - var litString = func(inner string, bytes bool) { + litString := func(inner string, bytes bool) { if !bytes { inner = "StringToBytes(" + inner + ")" } @@ -1129,9 +1128,9 @@ ArgLoop: if leftOperand[0] != '"' { panic("Phrase names cannot be dynamic") } - + var olist []string - for i := pos+2; i < len(node.Args); i++ { + for i := pos + 2; i < len(node.Args); i++ { op := node.Args[i].String() if op != "" { if op[0] == '.' || op[0] == '$' { @@ -1140,14 +1139,14 @@ ArgLoop: if op[0] != '"' && !unicode.IsDigit(rune(op[0])) { break } - olist = append(olist,op) + olist = append(olist, op) } } if len(olist) == 0 { panic("You must provide parameters for langf") } - var ob = "," + ob := "," for _, op := range olist { allNum := true for _, o := range op { @@ -1156,7 +1155,7 @@ ArgLoop: } } if allNum { - ob += strings.Replace(op,"\"","\\\"",-1) + "," + ob += strings.Replace(op, "\"", "\\\"", -1) + "," } else { ob += ob + "," } @@ -1316,8 +1315,8 @@ func (c *CTemplateSet) compileIfVarSub(con CContext, varname string) (out string return varname, cur } - var stepInterface = func() { - var nobreak = (cur.Type().Name() == "nobreak") + stepInterface := func() { + nobreak := (cur.Type().Name() == "nobreak") c.detailf("cur.Type().Name(): %+v\n", cur.Type().Name()) if cur.Kind() == reflect.Interface && !nobreak { cur = cur.Elem() @@ -1345,7 +1344,7 @@ func (c *CTemplateSet) compileIfVarSub(con CContext, varname string) (out string } bits[0] = strings.TrimPrefix(bits[0], "$") - var dumpKind = func(pre string) { + dumpKind := func(pre string) { c.detail(pre+" Kind:", cur.Kind()) c.detail(pre+" Type:", cur.Type().Name()) } @@ -1484,12 +1483,12 @@ func (c *CTemplateSet) retCall(name string, params ...interface{}) { } func buildUserExprs(holder string) ([]string, []string) { - var userExprs = []string{ + userExprs := []string{ holder + ".CurrentUser.Loggedin", holder + ".CurrentUser.IsSuperMod", holder + ".CurrentUser.IsAdmin", } - var negUserExprs = []string{ + negUserExprs := []string{ "!" + holder + ".CurrentUser.Loggedin", "!" + holder + ".CurrentUser.IsSuperMod", "!" + holder + ".CurrentUser.IsAdmin", diff --git a/common/theme.go b/common/theme.go index ccc0a4a0..78a34201 100644 --- a/common/theme.go +++ b/common/theme.go @@ -20,7 +20,7 @@ import ( "strconv" "text/template" - "github.com/Azareal/Gosora/common/phrases" + p "github.com/Azareal/Gosora/common/phrases" ) var ErrNoDefaultTheme = errors.New("The default theme isn't registered in the system") @@ -88,8 +88,8 @@ type ThemeMapTmplToDock struct { } // TODO: It might be unsafe to call the template parsing functions with fsnotify, do something more concurrent -func (theme *Theme) LoadStaticFiles() error { - theme.ResourceTemplates = template.New("") +func (t *Theme) LoadStaticFiles() error { + t.ResourceTemplates = template.New("") fmap := make(map[string]interface{}) fmap["lang"] = func(phraseNameInt interface{}, tmplInt interface{}) interface{} { phraseName, ok := phraseNameInt.(string) @@ -117,18 +117,18 @@ func (theme *Theme) LoadStaticFiles() error { } return out } - theme.ResourceTemplates.Funcs(fmap) - template.Must(theme.ResourceTemplates.ParseGlob("./themes/" + theme.Name + "/public/*.css")) + t.ResourceTemplates.Funcs(fmap) + template.Must(t.ResourceTemplates.ParseGlob("./themes/" + t.Name + "/public/*.css")) // It should be safe for us to load the files for all the themes in memory, as-long as the admin hasn't setup a ridiculous number of themes - return theme.AddThemeStaticFiles() + return t.AddThemeStaticFiles() } -func (theme *Theme) AddThemeStaticFiles() error { - phraseMap := phrases.GetTmplPhrases() +func (t *Theme) AddThemeStaticFiles() error { + phraseMap := p.GetTmplPhrases() // TODO: Use a function instead of a closure to make this more testable? What about a function call inside the closure to take the theme variable into account? - return filepath.Walk("./themes/"+theme.Name+"/public", func(path string, f os.FileInfo, err error) error { - DebugLog("Attempting to add static file '" + path + "' for default theme '" + theme.Name + "'") + return filepath.Walk("./themes/"+t.Name+"/public", func(path string, f os.FileInfo, err error) error { + DebugLog("Attempting to add static file '" + path + "' for default theme '" + t.Name + "'") if err != nil { return err } @@ -142,21 +142,21 @@ func (theme *Theme) AddThemeStaticFiles() error { return err } - var ext = filepath.Ext(path) + ext := filepath.Ext(path) if ext == ".css" && len(data) != 0 { var b bytes.Buffer pieces := strings.Split(path, "/") filename := pieces[len(pieces)-1] // TODO: Prepare resource templates for each loaded langpack? - err = theme.ResourceTemplates.ExecuteTemplate(&b, filename, CSSData{Phrases: phraseMap}) + err = t.ResourceTemplates.ExecuteTemplate(&b, filename, CSSData{Phrases: phraseMap}) if err != nil { - log.Print("Failed in adding static file '" + path + "' for default theme '" + theme.Name + "'") + log.Print("Failed in adding static file '" + path + "' for default theme '" + t.Name + "'") return err } data = b.Bytes() } - path = strings.TrimPrefix(path, "themes/"+theme.Name+"/public") + path = strings.TrimPrefix(path, "themes/"+t.Name+"/public") gzipData, err := CompressBytesGzip(data) if err != nil { return err @@ -167,16 +167,16 @@ func (theme *Theme) AddThemeStaticFiles() error { hasher.Write(data) checksum := hex.EncodeToString(hasher.Sum(nil)) - StaticFiles.Set("/s/"+theme.Name+path, SFile{data, gzipData, checksum,theme.Name+path + "?h=" + checksum, 0, int64(len(data)), int64(len(gzipData)),strconv.Itoa(len(gzipData)), mime.TypeByExtension(ext), f, f.ModTime().UTC().Format(http.TimeFormat)}) + StaticFiles.Set("/s/"+t.Name+path, SFile{data, gzipData, checksum,t.Name+path + "?h=" + checksum, 0, int64(len(data)), int64(len(gzipData)),strconv.Itoa(len(gzipData)), mime.TypeByExtension(ext), f, f.ModTime().UTC().Format(http.TimeFormat)}) - DebugLog("Added the '/" + theme.Name + path + "' static file for theme " + theme.Name + ".") + DebugLog("Added the '/" + t.Name + path + "' static file for theme " + t.Name + ".") return nil }) } -func (theme *Theme) MapTemplates() { - if theme.Templates != nil { - for _, themeTmpl := range theme.Templates { +func (t *Theme) MapTemplates() { + if t.Templates != nil { + for _, themeTmpl := range t.Templates { if themeTmpl.Name == "" { LogError(errors.New("Invalid destination template name")) } @@ -215,34 +215,34 @@ func (theme *Theme) MapTemplates() { } } -func (theme *Theme) setActive(active bool) error { +func (t *Theme) setActive(active bool) error { var sink bool - err := themeStmts.isDefault.QueryRow(theme.Name).Scan(&sink) + err := themeStmts.isDefault.QueryRow(t.Name).Scan(&sink) if err != nil && err != sql.ErrNoRows { return err } hasTheme := err != sql.ErrNoRows if hasTheme { - _, err = themeStmts.update.Exec(active, theme.Name) + _, err = themeStmts.update.Exec(active, t.Name) } else { - _, err = themeStmts.add.Exec(theme.Name, active) + _, err = themeStmts.add.Exec(t.Name, active) } if err != nil { return err } // TODO: Think about what we want to do for multi-server configurations - log.Printf("Setting theme '%s' as the default theme", theme.Name) - theme.Active = active + log.Printf("Setting theme '%s' as the default theme", t.Name) + t.Active = active return nil } -func UpdateDefaultTheme(theme *Theme) error { +func UpdateDefaultTheme(t *Theme) error { ChangeDefaultThemeMutex.Lock() defer ChangeDefaultThemeMutex.Unlock() - err := theme.setActive(true) + err := t.setActive(true) if err != nil { return err } @@ -258,15 +258,15 @@ func UpdateDefaultTheme(theme *Theme) error { return err } - DefaultThemeBox.Store(theme.Name) + DefaultThemeBox.Store(t.Name) ResetTemplateOverrides() - theme.MapTemplates() + t.MapTemplates() return nil } -func (theme Theme) HasDock(name string) bool { - for _, dock := range theme.Docks { +func (t Theme) HasDock(name string) bool { + for _, dock := range t.Docks { if dock == name { return true } @@ -274,8 +274,8 @@ func (theme Theme) HasDock(name string) bool { return false } -func (theme Theme) BuildDock(dock string) (sbody string) { - runOnDock := theme.RunOnDock +func (t Theme) BuildDock(dock string) (sbody string) { + runOnDock := t.RunOnDock if runOnDock != nil { return runOnDock(dock) } @@ -294,14 +294,14 @@ func (w GzipResponseWriter) Write(b []byte) (int, error) { // NEW method of doing theme templates to allow one user to have a different theme to another. Under construction. // TODO: Generate the type switch instead of writing it by hand // TODO: Cut the number of types in half -func (theme *Theme) RunTmpl(template string, pi interface{}, w io.Writer) error { +func (t *Theme) RunTmpl(template string, pi interface{}, w io.Writer) error { // Unpack this to avoid an indirect call gzw, ok := w.(GzipResponseWriter) if ok { w = gzw.Writer } - var getTmpl = theme.GetTmpl(template) + getTmpl := t.GetTmpl(template) switch tmplO := getTmpl.(type) { case *func(interface{}, io.Writer) error: var tmpl = *tmplO @@ -310,16 +310,16 @@ func (theme *Theme) RunTmpl(template string, pi interface{}, w io.Writer) error return tmplO(pi, w) case nil, string: //fmt.Println("falling back to interpreted for " + template) - mapping, ok := theme.TemplatesMap[template] + mapping, ok := t.TemplatesMap[template] if !ok { mapping = template } - if theme.IntTmplHandle.Lookup(mapping+".html") == nil { + if t.IntTmplHandle.Lookup(mapping+".html") == nil { return ErrBadDefaultTemplate } - return theme.IntTmplHandle.ExecuteTemplate(w, mapping+".html", pi) + return t.IntTmplHandle.ExecuteTemplate(w, mapping+".html", pi) default: - log.Print("theme ", theme) + log.Print("theme ", t) log.Print("template ", template) log.Print("pi ", pi) log.Print("tmplO ", tmplO) @@ -339,14 +339,14 @@ func (theme *Theme) RunTmpl(template string, pi interface{}, w io.Writer) error } // GetTmpl attempts to get the template for a specific theme, otherwise it falls back on the default template pointer, which if absent will fallback onto the template interpreter -func (theme *Theme) GetTmpl(template string) interface{} { +func (t *Theme) GetTmpl(template string) interface{} { // TODO: Figure out why we're getting a nil pointer here when transpiled templates are disabled, I would have assumed that we would just fall back to !ok on this // Might have something to do with it being the theme's TmplPtr map, investigate. - tmpl, ok := theme.TmplPtr[template] + tmpl, ok := t.TmplPtr[template] if ok { return tmpl } - tmpl, ok = TmplPtrMap[template+"_"+theme.Name] + tmpl, ok = TmplPtrMap[template+"_"+t.Name] if ok { return tmpl } diff --git a/common/word_filters.go b/common/word_filters.go index cb68ee7d..5f766364 100644 --- a/common/word_filters.go +++ b/common/word_filters.go @@ -54,7 +54,7 @@ func NewDefaultWordFilterStore(acc *qgen.Accumulator) (*DefaultWordFilterStore, // ReloadAll drops all the items in the memory cache and replaces them with fresh copies from the database func (s *DefaultWordFilterStore) ReloadAll() error { - var wordFilters = make(map[int]*WordFilter) + wordFilters := make(map[int]*WordFilter) filters, err := s.bypassGetAll() if err != nil { return err @@ -77,12 +77,12 @@ func (s *DefaultWordFilterStore) bypassGetAll() (filters []*WordFilter, err erro defer rows.Close() for rows.Next() { - filter := &WordFilter{ID: 0} - err := rows.Scan(&filter.ID, &filter.Find, &filter.Replacement) + f := &WordFilter{ID: 0} + err := rows.Scan(&f.ID, &f.Find, &f.Replacement) if err != nil { return filters, err } - filters = append(filters, filter) + filters = append(filters, f) } return filters, rows.Err() } @@ -93,8 +93,8 @@ func (s *DefaultWordFilterStore) GetAll() (filters map[int]*WordFilter, err erro } // Create adds a new word filter to the database and refreshes the memory cache -func (s *DefaultWordFilterStore) Create(find string, replacement string) error { - _, err := s.create.Exec(find, replacement) +func (s *DefaultWordFilterStore) Create(find string, replace string) error { + _, err := s.create.Exec(find, replace) if err != nil { return err } @@ -110,8 +110,8 @@ func (s *DefaultWordFilterStore) Delete(id int) error { return s.ReloadAll() } -func (s *DefaultWordFilterStore) Update(id int, find string, replacement string) error { - _, err := s.update.Exec(find, replacement, id) +func (s *DefaultWordFilterStore) Update(id int, find string, replace string) error { + _, err := s.update.Exec(find, replace, id) if err != nil { return err } diff --git a/schema/mssql/inserts.sql b/schema/mssql/inserts.sql index ef7bc8b2..795e463d 100644 --- a/schema/mssql/inserts.sql +++ b/schema/mssql/inserts.sql @@ -7,12 +7,12 @@ INSERT INTO [settings] ([name],[content],[type]) VALUES ('rapid_loading','1','bo INSERT INTO [settings] ([name],[content],[type]) VALUES ('google_site_verify','','html-attribute'); INSERT INTO [themes] ([uname],[default]) VALUES ('cosora',1); INSERT INTO [emails] ([email],[uid],[validated]) VALUES ('admin@localhost',1,1); -INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[tag]) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin'); -INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[tag]) VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":false,"EditUser":true,"EditUserEmail":false,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,'Mod'); -INSERT INTO [users_groups] ([name],[permissions],[plugin_perms]) VALUES ('Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}'); -INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_banned]) VALUES ('Banned','{"ViewTopic":true}','{}',1); -INSERT INTO [users_groups] ([name],[permissions],[plugin_perms]) VALUES ('Awaiting Activation','{"ViewTopic":true}','{}'); -INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[tag]) VALUES ('Not Loggedin','{"ViewTopic":true}','{}','Guest'); +INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[is_banned],[tag]) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,0,'Admin'); +INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[is_banned],[tag]) VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,0,0,'Mod'); +INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[is_banned],[tag]) VALUES ('Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}',0,0,0,""); +INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[is_banned],[tag]) VALUES ('Banned','{"ViewTopic":true}','{}',0,0,1,""); +INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[is_banned],[tag]) VALUES ('Awaiting Activation','{"ViewTopic":true}','{}',0,0,0,""); +INSERT INTO [users_groups] ([name],[permissions],[plugin_perms],[is_mod],[is_admin],[is_banned],[tag]) VALUES ('Not Loggedin','{"ViewTopic":true}','{}',0,0,0,'Guest'); INSERT INTO [forums] ([name],[active],[desc],[tmpl]) VALUES ('Reports',0,'All the reports go here',''); INSERT INTO [forums] ([name],[lastTopicID],[lastReplyerID],[desc],[tmpl]) VALUES ('General',1,1,'A place for general discussions which don''t fit elsewhere',''); INSERT INTO [forums_permissions] ([gid],[fid],[permissions]) VALUES (1,1,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"PinTopic":true,"CloseTopic":true}'); diff --git a/schema/mysql/inserts.sql b/schema/mysql/inserts.sql index 913b315c..11bdac1b 100644 --- a/schema/mysql/inserts.sql +++ b/schema/mysql/inserts.sql @@ -15,12 +15,12 @@ INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('rapid_loading','1','boo INSERT INTO `settings`(`name`,`content`,`type`) VALUES ('google_site_verify','','html-attribute'); INSERT INTO `themes`(`uname`,`default`) VALUES ('cosora',1); INSERT INTO `emails`(`email`,`uid`,`validated`) VALUES ('admin@localhost',1,1); -INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`tag`) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin'); -INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`tag`) VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":false,"EditUser":true,"EditUserEmail":false,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,'Mod'); -INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`) VALUES ('Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}'); -INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_banned`) VALUES ('Banned','{"ViewTopic":true}','{}',1); -INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`) VALUES ('Awaiting Activation','{"ViewTopic":true}','{}'); -INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`tag`) VALUES ('Not Loggedin','{"ViewTopic":true}','{}','Guest'); +INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`is_banned`,`tag`) VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,0,'Admin'); +INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`is_banned`,`tag`) VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,0,0,'Mod'); +INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`is_banned`,`tag`) VALUES ('Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}',0,0,0,""); +INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`is_banned`,`tag`) VALUES ('Banned','{"ViewTopic":true}','{}',0,0,1,""); +INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`is_banned`,`tag`) VALUES ('Awaiting Activation','{"ViewTopic":true}','{}',0,0,0,""); +INSERT INTO `users_groups`(`name`,`permissions`,`plugin_perms`,`is_mod`,`is_admin`,`is_banned`,`tag`) VALUES ('Not Loggedin','{"ViewTopic":true}','{}',0,0,0,'Guest'); INSERT INTO `forums`(`name`,`active`,`desc`,`tmpl`) VALUES ('Reports',0,'All the reports go here',''); INSERT INTO `forums`(`name`,`lastTopicID`,`lastReplyerID`,`desc`,`tmpl`) VALUES ('General',1,1,'A place for general discussions which don''t fit elsewhere',''); INSERT INTO `forums_permissions`(`gid`,`fid`,`permissions`) VALUES (1,1,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"PinTopic":true,"CloseTopic":true}'); diff --git a/schema/pgsql/inserts.sql b/schema/pgsql/inserts.sql index ed218269..75e8f633 100644 --- a/schema/pgsql/inserts.sql +++ b/schema/pgsql/inserts.sql @@ -7,12 +7,12 @@ INSERT INTO "settings"("name","content","type") VALUES ('rapid_loading','1','boo INSERT INTO "settings"("name","content","type") VALUES ('google_site_verify','','html-attribute'); INSERT INTO "themes"("uname","default") VALUES ('cosora',1); INSERT INTO "emails"("email","uid","validated") VALUES ('admin@localhost',1,1); -INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","tag") VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditUserGroupAdmin":false,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"EditGroupAdmin":false,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,'Admin'); -INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","tag") VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":false,"EditUser":true,"EditUserEmail":false,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,'Mod'); -INSERT INTO "users_groups"("name","permissions","plugin_perms") VALUES ('Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}'); -INSERT INTO "users_groups"("name","permissions","plugin_perms","is_banned") VALUES ('Banned','{"ViewTopic":true}','{}',1); -INSERT INTO "users_groups"("name","permissions","plugin_perms") VALUES ('Awaiting Activation','{"ViewTopic":true}','{}'); -INSERT INTO "users_groups"("name","permissions","plugin_perms","tag") VALUES ('Not Loggedin','{"ViewTopic":true}','{}','Guest'); +INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","is_banned","tag") VALUES ('Administrator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserEmail":true,"EditUserPassword":true,"EditUserGroup":true,"EditUserGroupSuperMod":true,"EditGroup":true,"EditGroupLocalPerms":true,"EditGroupGlobalPerms":true,"EditGroupSuperMod":true,"ManageForums":true,"EditSettings":true,"ManageThemes":true,"ManagePlugins":true,"ViewAdminLogs":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,1,0,'Admin'); +INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","is_banned","tag") VALUES ('Moderator','{"BanUsers":true,"ActivateUsers":true,"EditUser":true,"EditUserGroup":true,"ViewIPs":true,"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"EditTopic":true,"DeleteTopic":true,"CreateReply":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true,"MoveTopic":true}','{}',1,0,0,'Mod'); +INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","is_banned","tag") VALUES ('Member','{"UploadFiles":true,"UploadAvatars":true,"UseConvos":true,"ViewTopic":true,"LikeItem":true,"CreateTopic":true,"CreateReply":true}','{}',0,0,0,""); +INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","is_banned","tag") VALUES ('Banned','{"ViewTopic":true}','{}',0,0,1,""); +INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","is_banned","tag") VALUES ('Awaiting Activation','{"ViewTopic":true}','{}',0,0,0,""); +INSERT INTO "users_groups"("name","permissions","plugin_perms","is_mod","is_admin","is_banned","tag") VALUES ('Not Loggedin','{"ViewTopic":true}','{}',0,0,0,'Guest'); INSERT INTO "forums"("name","active","desc","tmpl") VALUES ('Reports',0,'All the reports go here',''); INSERT INTO "forums"("name","lastTopicID","lastReplyerID","desc","tmpl") VALUES ('General',1,1,'A place for general discussions which don''t fit elsewhere',''); INSERT INTO "forums_permissions"("gid","fid","permissions") VALUES (1,1,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"PinTopic":true,"CloseTopic":true}'); diff --git a/templates/topic.html b/templates/topic.html index fd5cdefd..5296cbc0 100644 --- a/templates/topic.html +++ b/templates/topic.html @@ -26,9 +26,7 @@ {{end}} -{{if .Poll.ID}} -{{template "topic_poll.html" . }} -{{end}} +{{if .Poll.ID}}{{template "topic_poll.html" . }}{{end}}