0a628f7201
Did some work on image thumbnailing, but our dependencies are acting up delaying this from being released. Fixed the positions of the topic list bits for Nox on mobile. Removed APNG as an accepted image format, as we don't currently have a good way of optimising these images. Added a comment regarding the constant time compare for sessions. Added a warning about putting Gosora in www folders. Noavatars can now take a width parameters. Added a bit of missing validation for the avatar uploader. Refactored the multiple file detector for the avatar uploader. Added a Run method to accDeleteBuilder. Added an EachInt method to AccSelectBuilder. Added a Run method to accInsertBuilder. Added the users_avatar_queue table, you will need to run the patcher / update script. You might also want to update the Noavatar field in your config.json file with the new one.
539 lines
15 KiB
Go
539 lines
15 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"strconv"
|
|
|
|
"../query_gen/lib"
|
|
)
|
|
|
|
func init() {
|
|
addPatch(0, patch0)
|
|
addPatch(1, patch1)
|
|
addPatch(2, patch2)
|
|
addPatch(3, patch3)
|
|
addPatch(4, patch4)
|
|
addPatch(5, patch5)
|
|
addPatch(6, patch6)
|
|
addPatch(7, patch7)
|
|
}
|
|
|
|
func patch0(scanner *bufio.Scanner) (err error) {
|
|
err = execStmt(qgen.Builder.DropTable("menus"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.DropTable("menu_items"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.CreateTable("menus", "", "",
|
|
[]qgen.DBTableColumn{
|
|
qgen.DBTableColumn{"mid", "int", 0, false, true, ""},
|
|
},
|
|
[]qgen.DBTableKey{
|
|
qgen.DBTableKey{"mid", "primary"},
|
|
},
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.CreateTable("menu_items", "", "",
|
|
[]qgen.DBTableColumn{
|
|
qgen.DBTableColumn{"miid", "int", 0, false, true, ""},
|
|
qgen.DBTableColumn{"mid", "int", 0, false, false, ""},
|
|
qgen.DBTableColumn{"name", "varchar", 200, false, false, ""},
|
|
qgen.DBTableColumn{"htmlID", "varchar", 200, false, false, "''"},
|
|
qgen.DBTableColumn{"cssClass", "varchar", 200, false, false, "''"},
|
|
qgen.DBTableColumn{"position", "varchar", 100, false, false, ""},
|
|
qgen.DBTableColumn{"path", "varchar", 200, false, false, "''"},
|
|
qgen.DBTableColumn{"aria", "varchar", 200, false, false, "''"},
|
|
qgen.DBTableColumn{"tooltip", "varchar", 200, false, false, "''"},
|
|
qgen.DBTableColumn{"tmplName", "varchar", 200, false, false, "''"},
|
|
qgen.DBTableColumn{"order", "int", 0, false, false, "0"},
|
|
|
|
qgen.DBTableColumn{"guestOnly", "boolean", 0, false, false, "0"},
|
|
qgen.DBTableColumn{"memberOnly", "boolean", 0, false, false, "0"},
|
|
qgen.DBTableColumn{"staffOnly", "boolean", 0, false, false, "0"},
|
|
qgen.DBTableColumn{"adminOnly", "boolean", 0, false, false, "0"},
|
|
},
|
|
[]qgen.DBTableKey{
|
|
qgen.DBTableKey{"miid", "primary"},
|
|
},
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.SimpleInsert("menus", "", ""))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var order int
|
|
var mOrder = "mid, name, htmlID, cssClass, position, path, aria, tooltip, guestOnly, memberOnly, staffOnly, adminOnly"
|
|
var addMenuItem = func(data map[string]interface{}) error {
|
|
cols, values := qgen.InterfaceMapToInsertStrings(data, mOrder)
|
|
err := execStmt(qgen.Builder.SimpleInsert("menu_items", cols+", order", values+","+strconv.Itoa(order)))
|
|
order++
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_forums}", "htmlID": "menu_forums", "position": "left", "path": "/forums/", "aria": "{lang.menu_forums_aria}", "tooltip": "{lang.menu_forums_tooltip}"})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_topics}", "htmlID": "menu_topics", "cssClass": "menu_topics", "position": "left", "path": "/topics/", "aria": "{lang.menu_topics_aria}", "tooltip": "{lang.menu_topics_tooltip}"})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "htmlID": "general_alerts", "cssClass": "menu_alerts", "position": "right", "tmplName": "menu_alerts"})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_account}", "cssClass": "menu_account", "position": "left", "path": "/user/edit/critical/", "aria": "{lang.menu_account_aria}", "tooltip": "{lang.menu_account_tooltip}", "memberOnly": true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_profile}", "cssClass": "menu_profile", "position": "left", "path": "{me.Link}", "aria": "{lang.menu_profile_aria}", "tooltip": "{lang.menu_profile_tooltip}", "memberOnly": true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_panel}", "cssClass": "menu_panel menu_account", "position": "left", "path": "/panel/", "aria": "{lang.menu_panel_aria}", "tooltip": "{lang.menu_panel_tooltip}", "memberOnly": true, "staffOnly": true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_logout}", "cssClass": "menu_logout", "position": "left", "path": "/accounts/logout/?session={me.Session}", "aria": "{lang.menu_logout_aria}", "tooltip": "{lang.menu_logout_tooltip}", "memberOnly": true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_register}", "cssClass": "menu_register", "position": "left", "path": "/accounts/create/", "aria": "{lang.menu_register_aria}", "tooltip": "{lang.menu_register_tooltip}", "guestOnly": true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = addMenuItem(map[string]interface{}{"mid": 1, "name": "{lang.menu_login}", "cssClass": "menu_login", "position": "left", "path": "/accounts/login/", "aria": "{lang.menu_login_aria}", "tooltip": "{lang.menu_login_tooltip}", "guestOnly": true})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch1(scanner *bufio.Scanner) error {
|
|
// ! Don't reuse this function blindly, it doesn't escape apostrophes
|
|
var replaceTextWhere = func(replaceThis string, withThis string) error {
|
|
return execStmt(qgen.Builder.SimpleUpdate("viewchunks", "route = '"+withThis+"'", "route = '"+replaceThis+"'"))
|
|
}
|
|
|
|
err := replaceTextWhere("routeAccountEditCriticalSubmit", "routes.AccountEditCriticalSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeAccountEditAvatar", "routes.AccountEditAvatar")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeAccountEditAvatarSubmit", "routes.AccountEditAvatarSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeAccountEditUsername", "routes.AccountEditUsername")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeAccountEditUsernameSubmit", "routes.AccountEditUsernameSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch2(scanner *bufio.Scanner) error {
|
|
// ! Don't reuse this function blindly, it doesn't escape apostrophes
|
|
var replaceTextWhere = func(replaceThis string, withThis string) error {
|
|
return execStmt(qgen.Builder.SimpleUpdate("viewchunks", "route = '"+withThis+"'", "route = '"+replaceThis+"'"))
|
|
}
|
|
|
|
err := replaceTextWhere("routeLogout", "routes.AccountLogout")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeShowAttachment", "routes.ShowAttachment")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeChangeTheme", "routes.ChangeTheme")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeProfileReplyCreateSubmit", "routes.ProfileReplyCreateSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeLikeTopicSubmit", "routes.LikeTopicSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeReplyLikeSubmit", "routes.ReplyLikeSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeDynamic", "routes.DynamicRoute")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeUploads", "routes.UploadedFile")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("BadRoute", "routes.BadRoute")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch3(scanner *bufio.Scanner) error {
|
|
err := execStmt(qgen.Builder.CreateTable("registration_logs", "", "",
|
|
[]qgen.DBTableColumn{
|
|
qgen.DBTableColumn{"rlid", "int", 0, false, true, ""},
|
|
qgen.DBTableColumn{"username", "varchar", 100, false, false, ""},
|
|
qgen.DBTableColumn{"email", "varchar", 100, false, false, ""},
|
|
qgen.DBTableColumn{"failureReason", "varchar", 100, false, false, ""},
|
|
qgen.DBTableColumn{"success", "bool", 0, false, false, "0"}, // Did this attempt succeed?
|
|
qgen.DBTableColumn{"ipaddress", "varchar", 200, false, false, ""},
|
|
qgen.DBTableColumn{"doneAt", "createdAt", 0, false, false, ""},
|
|
},
|
|
[]qgen.DBTableKey{
|
|
qgen.DBTableKey{"rlid", "primary"},
|
|
},
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch4(scanner *bufio.Scanner) error {
|
|
// ! Don't reuse this function blindly, it doesn't escape apostrophes
|
|
var replaceTextWhere = func(replaceThis string, withThis string) error {
|
|
return execStmt(qgen.Builder.SimpleUpdate("viewchunks", "route = '"+withThis+"'", "route = '"+replaceThis+"'"))
|
|
}
|
|
|
|
err := replaceTextWhere("routeReportSubmit", "routes.ReportSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeAccountEditEmail", "routes.AccountEditEmail")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routeAccountEditEmailTokenSubmit", "routes.AccountEditEmailTokenSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelLogsRegs", "panel.LogsRegs")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelLogsMod", "panel.LogsMod")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelLogsAdmin", "panel.LogsAdmin")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelDebug", "panel.Debug")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsViews", "panel.AnalyticsViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsRouteViews", "panel.AnalyticsRouteViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsRouteViews", "panel.AnalyticsRouteViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsAgentViews", "panel.AnalyticsAgentViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsForumViews", "panel.AnalyticsForumViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsSystemViews", "panel.AnalyticsSystemViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsLanguageViews", "panel.AnalyticsLanguageViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsReferrerViews", "panel.AnalyticsReferrerViews")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsTopics", "panel.AnalyticsTopics")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsPosts", "panel.AnalyticsPosts")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsForums", "panel.AnalyticsForums")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsRoutes", "panel.AnalyticsRoutes")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsAgents", "panel.AnalyticsAgents")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsSystems", "panel.AnalyticsSystems")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsLanguages", "panel.AnalyticsLanguages")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelAnalyticsReferrers", "panel.AnalyticsReferrers")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelSettings", "panel.Settings")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelSettingEdit", "panel.SettingEdit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelSettingEditSubmit", "panel.SettingEditSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForums", "panel.Forums")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsCreateSubmit", "panel.ForumsCreateSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsDelete", "panel.ForumsDelete")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsDeleteSubmit", "panel.ForumsDeleteSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsEdit", "panel.ForumsEdit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsEditSubmit", "panel.ForumsEditSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsEditPermsSubmit", "panel.ForumsEditPermsSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsEditPermsAdvance", "panel.ForumsEditPermsAdvance")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelForumsEditPermsAdvanceSubmit", "panel.ForumsEditPermsAdvanceSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelBackups", "panel.Backups")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.SimpleDelete("settings", "name='url_tags'"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.CreateTable("pages", "utf8mb4", "utf8mb4_general_ci",
|
|
[]qgen.DBTableColumn{
|
|
qgen.DBTableColumn{"pid", "int", 0, false, true, ""},
|
|
qgen.DBTableColumn{"name", "varchar", 200, false, false, ""},
|
|
qgen.DBTableColumn{"title", "varchar", 200, false, false, ""},
|
|
qgen.DBTableColumn{"body", "text", 0, false, false, ""},
|
|
qgen.DBTableColumn{"allowedGroups", "text", 0, false, false, ""},
|
|
qgen.DBTableColumn{"menuID", "int", 0, false, false, "-1"},
|
|
},
|
|
[]qgen.DBTableKey{
|
|
qgen.DBTableKey{"pid", "primary"},
|
|
},
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch5(scanner *bufio.Scanner) error {
|
|
// ! Don't reuse this function blindly, it doesn't escape apostrophes
|
|
var replaceTextWhere = func(replaceThis string, withThis string) error {
|
|
return execStmt(qgen.Builder.SimpleUpdate("viewchunks", "route = '"+withThis+"'", "route = '"+replaceThis+"'"))
|
|
}
|
|
|
|
err := replaceTextWhere("routePanelUsers", "panel.Users")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelUsersEdit", "panel.UsersEdit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routePanelUsersEditSubmit", "panel.UsersEditSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routes.AccountEditCritical", "routes.AccountEditPassword")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = replaceTextWhere("routes.AccountEditCriticalSubmit", "routes.AccountEditPasswordSubmit")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.SimpleUpdate("menu_items", "path = '/user/edit/'", "path = '/user/edit/critical/'"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = execStmt(qgen.Builder.CreateTable("users_2fa_keys", "utf8mb4", "utf8mb4_general_ci",
|
|
[]qgen.DBTableColumn{
|
|
qgen.DBTableColumn{"uid", "int", 0, false, false, ""},
|
|
qgen.DBTableColumn{"secret", "varchar", 100, false, false, ""},
|
|
qgen.DBTableColumn{"scratch1", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch2", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch3", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch4", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch5", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch6", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch7", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"scratch8", "varchar", 50, false, false, ""},
|
|
qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""},
|
|
},
|
|
[]qgen.DBTableKey{
|
|
qgen.DBTableKey{"uid", "primary"},
|
|
},
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch6(scanner *bufio.Scanner) error {
|
|
err := execStmt(qgen.Builder.SimpleInsert("settings", "name, content, type", "'rapid_loading','1','bool'"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func patch7(scanner *bufio.Scanner) error {
|
|
err := execStmt(qgen.Builder.CreateTable("users_avatar_queue", "", "",
|
|
[]qgen.DBTableColumn{
|
|
qgen.DBTableColumn{"uid", "int", 0, false, false, ""}, // TODO: Make this a foreign key
|
|
},
|
|
[]qgen.DBTableKey{
|
|
qgen.DBTableKey{"uid", "primary"},
|
|
},
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|