Revert "will a pointer make this faster...?"

This reverts commit 8e414486b8.
This commit is contained in:
Azareal 2020-03-15 21:34:57 +10:00
parent 8e414486b8
commit 501bcc2425
46 changed files with 667 additions and 664 deletions

View File

@ -192,7 +192,7 @@ func buildAlertSb(sb *strings.Builder, msg string, sub []string, path, avatar st
sb.WriteRune('}')
}
func BuildAlertSb(sb *strings.Builder, a *Alert, u *User /* The current user */) (err error) {
func BuildAlertSb(sb *strings.Builder, a *Alert, user User /* The current user */) (err error) {
var targetUser *User
if a.Actor == nil {
a.Actor, err = Users.Get(a.ActorID)
@ -248,7 +248,7 @@ func BuildAlertSb(sb *strings.Builder, a *Alert, u *User /* The current user */)
}
url = topic.Link
area = topic.Title
own = a.TargetUserID == u.ID
own = a.TargetUserID == user.ID
case "user":
targetUser, err = Users.Get(a.ElementID)
if err != nil {
@ -257,16 +257,16 @@ func BuildAlertSb(sb *strings.Builder, a *Alert, u *User /* The current user */)
}
area = targetUser.Name
url = targetUser.Link
own = a.TargetUserID == u.ID
own = a.TargetUserID == user.ID
case "post":
t, err := TopicByReplyID(a.ElementID)
topic, err := TopicByReplyID(a.ElementID)
if err != nil {
DebugLogf("Unable to find linked topic by reply ID %d", a.ElementID)
return errors.New(phrases.GetErrorPhrase("alerts_no_linked_topic_by_reply"))
}
url = t.Link
area = t.Title
own = a.TargetUserID == u.ID
url = topic.Link
area = topic.Title
own = a.TargetUserID == user.ID
default:
return errors.New(phrases.GetErrorPhrase("alerts_invalid_elementtype"))
}

View File

@ -125,7 +125,7 @@ func LogWarning(err error, extra ...string) {
errorBuffer = append(errorBuffer, ErrorItem{err, stack})
}
func errorHeader(w http.ResponseWriter, user *User, title string) *Header {
func errorHeader(w http.ResponseWriter, user User, title string) *Header {
h := DefaultHeader(w, user)
h.Title = title
h.Zone = "error"
@ -138,7 +138,7 @@ func errorHeader(w http.ResponseWriter, user *User, title string) *Header {
// ! Do not call CustomError here or we might get an error loop
func InternalError(err error, w http.ResponseWriter, r *http.Request) RouteError {
w.WriteHeader(500)
pi := ErrorPage{errorHeader(w, &GuestUser, phrases.GetErrorPhrase("internal_error_title")), phrases.GetErrorPhrase("internal_error_body")}
pi := ErrorPage{errorHeader(w, GuestUser, phrases.GetErrorPhrase("internal_error_title")), phrases.GetErrorPhrase("internal_error_body")}
handleErrorTemplate(w, r, pi)
LogError(err)
return HandledRouteError()
@ -165,7 +165,7 @@ func InternalErrorJS(err error, w http.ResponseWriter, r *http.Request) RouteErr
// When the task system detects if the database is down, some database errors might slip by this
func DatabaseError(w http.ResponseWriter, r *http.Request) RouteError {
w.WriteHeader(500)
pi := ErrorPage{errorHeader(w, &GuestUser, phrases.GetErrorPhrase("internal_error_title")), phrases.GetErrorPhrase("internal_error_body")}
pi := ErrorPage{errorHeader(w, GuestUser, phrases.GetErrorPhrase("internal_error_title")), phrases.GetErrorPhrase("internal_error_body")}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -173,7 +173,7 @@ func DatabaseError(w http.ResponseWriter, r *http.Request) RouteError {
func InternalErrorXML(err error, w http.ResponseWriter, r *http.Request) RouteError {
w.Header().Set("Content-Type", "application/xml")
w.WriteHeader(500)
w.Write([]byte(`<?xml version="1.0"encoding="UTF-8"?>
w.Write([]byte(`<?xml version="1.0" encoding="UTF-8"?>
<error>` + phrases.GetErrorPhrase("internal_error_body") + `</error>`))
LogError(err)
return HandledRouteError()
@ -192,7 +192,7 @@ func SilentInternalErrorXML(err error, w http.ResponseWriter, r *http.Request) R
// ! Do not call CustomError here otherwise we might get an error loop
func PreError(errmsg string, w http.ResponseWriter, r *http.Request) RouteError {
w.WriteHeader(500)
pi := ErrorPage{errorHeader(w, &GuestUser, phrases.GetErrorPhrase("error_title")), errmsg}
pi := ErrorPage{errorHeader(w, GuestUser, phrases.GetErrorPhrase("error_title")), errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
@ -212,30 +212,30 @@ func PreErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, js bool)
// LocalError is an error shown to the end-user when something goes wrong and it's not the software's fault
// TODO: Pass header in for this and similar errors instead of having to pass in both user and w? Would also allow for more stateful things, although this could be a problem
/*func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user *User) RouteError {
/*func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(500)
pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("local_error_title")), errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}*/
func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user *User) RouteError {
func LocalError(errmsg string, w http.ResponseWriter, r *http.Request, user User) RouteError {
return SimpleError(errmsg, w, r, errorHeader(w, user, ""))
}
func SimpleError(errmsg string, w http.ResponseWriter, r *http.Request, h *Header) RouteError {
if h == nil {
h = errorHeader(w, &GuestUser, phrases.GetErrorPhrase("local_error_title"))
func SimpleError(errmsg string, w http.ResponseWriter, r *http.Request, header *Header) RouteError {
if header == nil {
header = errorHeader(w, GuestUser, phrases.GetErrorPhrase("local_error_title"))
} else {
h.Title = phrases.GetErrorPhrase("local_error_title")
header.Title = phrases.GetErrorPhrase("local_error_title")
}
w.WriteHeader(500)
pi := ErrorPage{h, errmsg}
pi := ErrorPage{header, errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
func LocalErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, user *User, js bool) RouteError {
func LocalErrorJSQ(errmsg string, w http.ResponseWriter, r *http.Request, user User, js bool) RouteError {
if !js {
return SimpleError(errmsg, w, r, errorHeader(w, user, ""))
}
@ -250,28 +250,28 @@ func LocalErrorJS(errmsg string, w http.ResponseWriter, r *http.Request) RouteEr
// TODO: We might want to centralise the error logic in the future and just return what the error handler needs to construct the response rather than handling it here
// NoPermissions is an error shown to the end-user when they try to access an area which they aren't authorised to access
func NoPermissions(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func NoPermissions(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("no_permissions_title")), phrases.GetErrorPhrase("no_permissions_body")}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
func NoPermissionsJSQ(w http.ResponseWriter, r *http.Request, user *User, js bool) RouteError {
func NoPermissionsJSQ(w http.ResponseWriter, r *http.Request, user User, js bool) RouteError {
if !js {
return NoPermissions(w, r, user)
}
return NoPermissionsJS(w, r, user)
}
func NoPermissionsJS(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func NoPermissionsJS(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
writeJsonError(phrases.GetErrorPhrase("no_permissions_body"), w)
return HandledRouteError()
}
// ? - Is this actually used? Should it be used? A ban in Gosora should be more of a permission revocation to stop them posting rather than something which spits up an error page, right?
func Banned(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func Banned(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("banned_title")), phrases.GetErrorPhrase("banned_body")}
handleErrorTemplate(w, r, pi)
@ -280,21 +280,21 @@ func Banned(w http.ResponseWriter, r *http.Request, user *User) RouteError {
// nolint
// BannedJSQ is the version of the banned error page which handles both JavaScript requests and normal page loads
func BannedJSQ(w http.ResponseWriter, r *http.Request, user *User, js bool) RouteError {
func BannedJSQ(w http.ResponseWriter, r *http.Request, user User, js bool) RouteError {
if !js {
return Banned(w, r, user)
}
return BannedJS(w, r, user)
}
func BannedJS(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func BannedJS(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
writeJsonError(phrases.GetErrorPhrase("banned_body"), w)
return HandledRouteError()
}
// nolint
func LoginRequiredJSQ(w http.ResponseWriter, r *http.Request, user *User, js bool) RouteError {
func LoginRequiredJSQ(w http.ResponseWriter, r *http.Request, user User, js bool) RouteError {
if !js {
return LoginRequired(w, r, user)
}
@ -303,12 +303,12 @@ func LoginRequiredJSQ(w http.ResponseWriter, r *http.Request, user *User, js boo
// ? - Where is this used? Should we use it more?
// LoginRequired is an error shown to the end-user when they try to access an area which requires them to login
func LoginRequired(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func LoginRequired(w http.ResponseWriter, r *http.Request, user User) RouteError {
return CustomError(phrases.GetErrorPhrase("login_required_body"), 401, phrases.GetErrorPhrase("no_permissions_title"), w, r, nil, user)
}
// nolint
func LoginRequiredJS(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func LoginRequiredJS(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(401)
writeJsonError(phrases.GetErrorPhrase("login_required_body"), w)
return HandledRouteError()
@ -316,7 +316,7 @@ func LoginRequiredJS(w http.ResponseWriter, r *http.Request, user *User) RouteEr
// SecurityError is used whenever a session mismatch is found
// ? - Should we add JS and JSQ versions of this?
func SecurityError(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func SecurityError(w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(403)
pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("security_error_title")), phrases.GetErrorPhrase("security_error_body")}
err := RenderTemplateAlias("error", "security_error", w, r, pi.Header, pi)
@ -335,8 +335,8 @@ func MicroNotFound(w http.ResponseWriter, r *http.Request) RouteError {
// NotFound is used when the requested page doesn't exist
// ? - Add a JSQ version of this?
// ? - Add a user parameter?
func NotFound(w http.ResponseWriter, r *http.Request, h *Header) RouteError {
return CustomError(phrases.GetErrorPhrase("not_found_body"), 404, phrases.GetErrorPhrase("not_found_title"), w, r, h, &GuestUser)
func NotFound(w http.ResponseWriter, r *http.Request, header *Header) RouteError {
return CustomError(phrases.GetErrorPhrase("not_found_body"), 404, phrases.GetErrorPhrase("not_found_title"), w, r, header, GuestUser)
}
// ? - Add a user parameter?
@ -346,42 +346,42 @@ func NotFoundJS(w http.ResponseWriter, r *http.Request) RouteError {
return HandledRouteError()
}
func NotFoundJSQ(w http.ResponseWriter, r *http.Request, h *Header, js bool) RouteError {
func NotFoundJSQ(w http.ResponseWriter, r *http.Request, header *Header, js bool) RouteError {
if js {
return NotFoundJS(w, r)
}
if h == nil {
h = DefaultHeader(w, &GuestUser)
if header == nil {
header = DefaultHeader(w, GuestUser)
}
return NotFound(w, r, h)
return NotFound(w, r, header)
}
// CustomError lets us make custom error types which aren't covered by the generic functions above
func CustomError(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, h *Header, user *User) (rerr RouteError) {
if h == nil {
h, rerr = UserCheck(w, r, user)
func CustomError(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, header *Header, user User) (rerr RouteError) {
if header == nil {
header, rerr = UserCheck(w, r, &user)
if rerr != nil {
h = errorHeader(w, user, errtitle)
header = errorHeader(w, user, errtitle)
}
}
h.Title = errtitle
h.Zone = "error"
header.Title = errtitle
header.Zone = "error"
w.WriteHeader(errcode)
pi := ErrorPage{h, errmsg}
pi := ErrorPage{header, errmsg}
handleErrorTemplate(w, r, pi)
return HandledRouteError()
}
// CustomErrorJSQ is a version of CustomError which lets us handle both JSON and regular pages depending on how it's being accessed
func CustomErrorJSQ(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, h *Header, user *User, js bool) RouteError {
func CustomErrorJSQ(errmsg string, errcode int, errtitle string, w http.ResponseWriter, r *http.Request, header *Header, user User, js bool) RouteError {
if !js {
return CustomError(errmsg, errcode, errtitle, w, r, h, user)
return CustomError(errmsg, errcode, errtitle, w, r, header, user)
}
return CustomErrorJS(errmsg, errcode, w, r, user)
}
// CustomErrorJS is the pure JSON version of CustomError
func CustomErrorJS(errmsg string, errcode int, w http.ResponseWriter, r *http.Request, user *User) RouteError {
func CustomErrorJS(errmsg string, errcode int, w http.ResponseWriter, r *http.Request, user User) RouteError {
w.WriteHeader(errcode)
writeJsonError(errmsg, w)
return HandledRouteError()
@ -400,4 +400,4 @@ func handleErrorTemplate(w http.ResponseWriter, r *http.Request, pi ErrorPage) {
}
// Alias of routes.renderTemplate
var RenderTemplateAlias func(tmplName, hookName string, w http.ResponseWriter, r *http.Request, h *Header, pi interface{}) error
var RenderTemplateAlias func(tmplName, hookName string, w http.ResponseWriter, r *http.Request, header *Header, pi interface{}) error

View File

@ -32,7 +32,7 @@ type Header struct {
Themes map[string]*Theme // TODO: Use a slice containing every theme instead of the main map for speed?
Theme *Theme
//TemplateName string // TODO: Use this to move template calls to the router rather than duplicating them over and over and over?
CurrentUser *User // TODO: Deprecate CurrentUser on the page structs and use a pointer here
CurrentUser User // TODO: Deprecate CurrentUser on the page structs and use a pointer here
Hooks *HookTable
Zone string
ZoneID int
@ -780,9 +780,9 @@ type AreYouSure struct {
}
// TODO: Write a test for this
func DefaultHeader(w http.ResponseWriter, user *User) *Header {
func DefaultHeader(w http.ResponseWriter, user User) *Header {
return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: user, Writer: w}
}
func SimpleDefaultHeader(w http.ResponseWriter) *Header {
return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: &GuestUser, Writer: w}
return &Header{Site: Site, Theme: Themes[fallbackTheme], CurrentUser: GuestUser, Writer: w}
}

View File

@ -71,7 +71,7 @@ func forumUserCheck(header *Header, w http.ResponseWriter, r *http.Request, user
return InternalError(err, w, r)
}
cascadeForumPerms(fperms, user)
header.CurrentUser = user // TODO: Use a pointer instead for CurrentUser, so we don't have to do this
header.CurrentUser = *user // TODO: Use a pointer instead for CurrentUser, so we don't have to do this
return rerr
}
@ -107,7 +107,7 @@ func panelUserCheck(w http.ResponseWriter, r *http.Request, user *User) (h *Head
Settings: SettingBox.Load().(SettingMap),
Themes: Themes,
Theme: theme,
CurrentUser: user,
CurrentUser: *user,
Hooks: GetHookTable(),
Zone: "panel",
Writer: w,
@ -202,7 +202,7 @@ func GetThemeByReq(r *http.Request) *Theme {
}
func userCheck(w http.ResponseWriter, r *http.Request, user *User) (header *Header, rerr RouteError) {
return userCheck2(w, r, user, uutils.Nanotime())
return userCheck2(w,r,user,uutils.Nanotime())
}
// TODO: Add the ability for admins to restrict certain themes to certain groups?
@ -214,12 +214,12 @@ func userCheck2(w http.ResponseWriter, r *http.Request, user *User, nano int64)
Settings: SettingBox.Load().(SettingMap),
Themes: Themes,
Theme: theme,
CurrentUser: user, // ! Some things rely on this being a pointer downstream from this function
CurrentUser: *user, // ! Some things rely on this being a pointer downstream from this function
Hooks: GetHookTable(),
Zone: "frontend",
Writer: w,
IsoCode: phrases.GetLangPack().IsoCode,
StartedAt: nano,
StartedAt: nano,
}
// TODO: Optimise this by avoiding accessing a map string index
header.GoogSiteVerify = header.Settings["google_site_verify"].(string)
@ -338,7 +338,7 @@ func preRoute(w http.ResponseWriter, r *http.Request) (User, bool) {
return *usercpy, true
}
func UploadAvatar(w http.ResponseWriter, r *http.Request, user *User, tuid int) (ext string, ferr RouteError) {
func UploadAvatar(w http.ResponseWriter, r *http.Request, user User, tuid int) (ext string, ferr RouteError) {
// We don't want multiple files
// TODO: Are we doing this correctly?
filenameMap := make(map[string]bool)
@ -404,7 +404,7 @@ func UploadAvatar(w http.ResponseWriter, r *http.Request, user *User, tuid int)
return ext, nil
}
func ChangeAvatar(path string, w http.ResponseWriter, r *http.Request, user *User) RouteError {
func ChangeAvatar(path string, w http.ResponseWriter, r *http.Request, user User) RouteError {
err := user.ChangeAvatar(path)
if err != nil {
return InternalError(err, w, r)
@ -430,7 +430,7 @@ func ChangeAvatar(path string, w http.ResponseWriter, r *http.Request, user *Use
}
// SuperAdminOnly makes sure that only super admin can access certain critical panel routes
func SuperAdminOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func SuperAdminOnly(w http.ResponseWriter, r *http.Request, user User) RouteError {
if !user.IsSuperAdmin {
return NoPermissions(w, r, user)
}
@ -438,7 +438,7 @@ func SuperAdminOnly(w http.ResponseWriter, r *http.Request, user *User) RouteErr
}
// AdminOnly makes sure that only admins can access certain panel routes
func AdminOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func AdminOnly(w http.ResponseWriter, r *http.Request, user User) RouteError {
if !user.IsAdmin {
return NoPermissions(w, r, user)
}
@ -446,7 +446,7 @@ func AdminOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError {
}
// SuperModeOnly makes sure that only super mods or higher can access the panel routes
func SuperModOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func SuperModOnly(w http.ResponseWriter, r *http.Request, user User) RouteError {
if !user.IsSuperMod {
return NoPermissions(w, r, user)
}
@ -454,7 +454,7 @@ func SuperModOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError
}
// MemberOnly makes sure that only logged in users can access this route
func MemberOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func MemberOnly(w http.ResponseWriter, r *http.Request, user User) RouteError {
if !user.Loggedin {
return LoginRequired(w, r, user)
}
@ -462,21 +462,21 @@ func MemberOnly(w http.ResponseWriter, r *http.Request, user *User) RouteError {
}
// NoBanned stops any banned users from accessing this route
func NoBanned(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func NoBanned(w http.ResponseWriter, r *http.Request, user User) RouteError {
if user.IsBanned {
return Banned(w, r, user)
}
return nil
}
func ParseForm(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func ParseForm(w http.ResponseWriter, r *http.Request, user User) RouteError {
if err := r.ParseForm(); err != nil {
return LocalError("Bad Form", w, r, user)
}
return nil
}
func NoSessionMismatch(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func NoSessionMismatch(w http.ResponseWriter, r *http.Request, user User) RouteError {
if err := r.ParseForm(); err != nil {
return LocalError("Bad Form", w, r, user)
}
@ -495,7 +495,7 @@ func ReqIsJson(r *http.Request) bool {
return r.Header.Get("Content-type") == "application/json"
}
func HandleUploadRoute(w http.ResponseWriter, r *http.Request, user *User, maxFileSize int) RouteError {
func HandleUploadRoute(w http.ResponseWriter, r *http.Request, user User, maxFileSize int) RouteError {
// TODO: Reuse this code more
if r.ContentLength > int64(maxFileSize) {
size, unit := ConvertByteUnit(float64(maxFileSize))
@ -510,7 +510,7 @@ func HandleUploadRoute(w http.ResponseWriter, r *http.Request, user *User, maxFi
return nil
}
func NoUploadSessionMismatch(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func NoUploadSessionMismatch(w http.ResponseWriter, r *http.Request, user User) RouteError {
// TODO: Try to eliminate some of these allocations
sess := []byte(user.Session)
if len(sess) == 0 {

View File

@ -91,20 +91,20 @@ var Template_error_handle = genIntTmpl("error")
var Template_ip_search_handle = genIntTmpl("ip_search")
var Template_account_handle = genIntTmpl("account")
func tmplInitUsers() (*User, *User, *User) {
func tmplInitUsers() (User, User, User) {
avatar, microAvatar := BuildAvatar(62, "")
u := User{62, BuildProfileURL("fake-user", 62), "Fake User", "compiler@localhost", 0, false, false, false, false, false, false, GuestPerms, make(map[string]bool), "", false, "", avatar, microAvatar, "", "", 0, 0, 0, 0, StartTime, "0.0.0.0.0", 0, 0, nil}
user := User{62, BuildProfileURL("fake-user", 62), "Fake User", "compiler@localhost", 0, false, false, false, false, false, false, GuestPerms, make(map[string]bool), "", false, "", avatar, microAvatar, "", "", 0, 0, 0, 0, StartTime, "0.0.0.0.0", 0, 0, nil}
// TODO: Do a more accurate level calculation for this?
avatar, microAvatar = BuildAvatar(1, "")
u2 := User{1, BuildProfileURL("admin-alice", 1), "Admin Alice", "alice@localhost", 1, true, true, true, true, false, false, AllPerms, make(map[string]bool), "", true, "", avatar, microAvatar, "", "", 58, 1000, 0, 1000, StartTime, "127.0.0.1", 0, 0, nil}
user2 := User{1, BuildProfileURL("admin-alice", 1), "Admin Alice", "alice@localhost", 1, true, true, true, true, false, false, AllPerms, make(map[string]bool), "", true, "", avatar, microAvatar, "", "", 58, 1000, 0, 1000, StartTime, "127.0.0.1", 0, 0, nil}
avatar, microAvatar = BuildAvatar(2, "")
u3 := User{2, BuildProfileURL("admin-fred", 62), "Admin Fred", "fred@localhost", 1, true, true, true, true, false, false, AllPerms, make(map[string]bool), "", true, "", avatar, microAvatar, "", "", 42, 900, 0, 900, StartTime, "::1", 0, 0, nil}
return &u, &u2, &u3
user3 := User{2, BuildProfileURL("admin-fred", 62), "Admin Fred", "fred@localhost", 1, true, true, true, true, false, false, AllPerms, make(map[string]bool), "", true, "", avatar, microAvatar, "", "", 42, 900, 0, 900, StartTime, "::1", 0, 0, nil}
return user, user2, user3
}
func tmplInitHeaders(user, user2, user3 *User) (*Header, *Header, *Header) {
func tmplInitHeaders(user, user2, user3 User) (*Header, *Header, *Header) {
header := &Header{
Site: Site,
Settings: SettingBox.Load().(SettingMap),
@ -121,7 +121,7 @@ func tmplInitHeaders(user, user2, user3 *User) (*Header, *Header, *Header) {
},
}
buildHeader := func(user *User) *Header {
buildHeader := func(user User) *Header {
head := &Header{Site: Site}
*head = *header
head.CurrentUser = user
@ -224,7 +224,7 @@ func compileCommons(c *tmpl.CTemplateSet, head, head2 *Header, forumList []Forum
}*/
var topicsList []*TopicsRow
topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 1, 0, "classname", 0, "", user2, "", 0, user3, "General", "/forum/general.2", nil})
topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 1, 0, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil})
topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, Paginator{[]int{1}, 1, 1}}
o.Add("topics", "c.TopicListPage", topicListPage)
@ -298,11 +298,11 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
return err
}
ppage := ProfilePage{htitle("User 526"), replyList, *user, 0, 0, false, false, false} // TODO: Use the score from user to generate the currentScore and nextScore
ppage := ProfilePage{htitle("User 526"), replyList, user, 0, 0, false, false, false} // TODO: Use the score from user to generate the currentScore and nextScore
t.Add("profile", "c.ProfilePage", ppage)
var topicsList []*TopicsRow
topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 1, 0, "classname", 0, "", user2, "", 0, user3, "General", "/forum/general.2", nil})
topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 1, 0, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil})
topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, Paginator{[]int{1}, 1, 1}}
forumItem := BlankForum(1, "general-forum.1", "General Forum", "Where the general stuff happens", true, "all", 0, "", 0)
@ -344,20 +344,20 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
t.AddStd("register", "c.Page", Page{htitle("Registration Page"), tList, false})
t.AddStd("error", "c.ErrorPage", ErrorPage{htitle("Error"), "A problem has occurred in the system."})
ipSearchPage := IPSearchPage{htitle("IP Search"), map[int]*User{1: user2}, "::1"}
ipSearchPage := IPSearchPage{htitle("IP Search"), map[int]*User{1: &user2}, "::1"}
t.AddStd("ip_search", "c.IPSearchPage", ipSearchPage)
var inter nobreak
accountPage := Account{header, "dashboard", "account_own_edit", inter}
t.AddStd("account", "c.Account", accountPage)
parti := []*User{user}
parti := []*User{&user}
convo := &Conversation{1, BuildConvoURL(1), user.ID, time.Now(), 0, time.Now()}
convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1, 1, "hey", "", user.ID}, user, "", 4, true}}
convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1, 1, "hey", "", user.ID}, &user, "", 4, true}}
convoPage := ConvoViewPage{header, convo, convoItems, parti, true, Paginator{[]int{1}, 1, 1}}
t.AddStd("convo", "c.ConvoViewPage", convoPage)
convos := []*ConversationExtra{&ConversationExtra{&Conversation{}, []*User{user}}}
convos := []*ConversationExtra{&ConversationExtra{&Conversation{}, []*User{&user}}}
var cRows []ConvoListRow
for _, convo := range convos {
cRows = append(cRows, ConvoListRow{convo, convo.Users, false})
@ -417,7 +417,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
config.SkipHandles = true
c.SetConfig(config)
for _, tmplfunc := range PrebuildTmplList {
tmplItem := tmplfunc(*user, header)
tmplItem := tmplfunc(user, header)
varList := make(map[string]tmpl.VarItem)
compiledTmpl, err := c.Compile(tmplItem.Filename, tmplItem.Path, tmplItem.StructName, tmplItem.Data, varList, tmplItem.Imports...)
if err != nil {
@ -529,7 +529,7 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri
t := TItemHold(make(map[string]TItem))
topicsRow := &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 0, 1, "classname", 0, "", user2, "", 0, user3, "General", "/forum/general.2", nil}
topicsRow := &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "::1", 1, 0, 1, 0, 1, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil}
t.AddStd("topics_topic", "c.TopicsRow", topicsRow)
poll := Poll{ID: 1, Type: 0, Options: map[int]string{0: "Nothing", 1: "Something"}, Results: map[int]int{0: 5, 1: 2}, QuickOptions: []PollOption{
@ -563,9 +563,9 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri
t.AddStd("topic_c_attach_item", "c.TopicCAttachItem", TopicCAttachItem{ID: 1, ImgSrc: "", Path: "", FullPath: ""})
t.AddStd("topic_c_poll_input", "c.TopicCPollInput", TopicCPollInput{Index: 0})
parti := []*User{user}
parti := []*User{&user}
convo := &Conversation{1, BuildConvoURL(1), user.ID, time.Now(), 0, time.Now()}
convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1, 1, "hey", "", user.ID}, user, "", 4, true}}
convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1, 1, "hey", "", user.ID}, &user, "", 4, true}}
convoPage := ConvoViewPage{header, convo, convoItems, parti, true, Paginator{[]int{1}, 1, 1}}
t.AddStd("convo", "c.ConvoViewPage", convoPage)

View File

@ -46,7 +46,7 @@ type WsTopicList struct {
// TODO: How should we handle errors for this?
// TODO: Move this out of common?
func RouteWebsockets(w http.ResponseWriter, r *http.Request, user *User) RouteError {
func RouteWebsockets(w http.ResponseWriter, r *http.Request, user User) RouteError {
// TODO: Spit out a 500 instead of nil?
conn, err := wsUpgrader.Upgrade(w, r, nil)
if err != nil {

View File

@ -194,7 +194,7 @@ func BuildWidget(dock string, h *Header) (sbody string) {
// 1 = id for the default menu
mhold, err := Menus.Get(1)
if err == nil {
err := mhold.Build(h.Writer, h.CurrentUser, h.Path)
err := mhold.Build(h.Writer, &h.CurrentUser, h.Path)
if err != nil {
LogError(err)
}

View File

@ -329,11 +329,11 @@ func (h *WsHubImpl) removeUser(uid int) {
}
}
func (h *WsHubImpl) AddConn(user *User, conn *websocket.Conn) (*WSUser, error) {
func (h *WsHubImpl) AddConn(user User, conn *websocket.Conn) (*WSUser, error) {
if user.ID == 0 {
wsUser := new(WSUser)
wsUser.User = new(User)
*wsUser.User = *user
*wsUser.User = user
wsUser.AddSocket(conn, "")
WsHub.GuestLock.Lock()
WsHub.OnlineGuests[wsUser] = true

View File

@ -161,7 +161,7 @@ func GuildWidgets(header *c.Header, guildItem *Guild) (success bool) {
Custom Pages
*/
func RouteGuildList(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func RouteGuildList(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
h, ferr := c.UserCheck(w, r, &user)
if ferr != nil {
return ferr
@ -192,7 +192,7 @@ func RouteGuildList(w http.ResponseWriter, r *http.Request, user *c.User) c.Rout
return routes.RenderTemplate("guilds_guild_list", w, r, h, pi)
}
func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, guildID, err := routes.ParseSEOURL(r.URL.Path[len("/guild/"):])
if err != nil {
return c.PreError("Not a valid guild ID", w, r)
@ -215,7 +215,7 @@ func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
//return routeForum(w, r.WithContext(ctx), user, strconv.Itoa(guildItem.MainForumID))
}
func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
h, ferr := c.UserCheck(w, r, &user)
if ferr != nil {
return ferr
@ -230,7 +230,7 @@ func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user *c.User) c.Ro
return routes.RenderTemplate("guilds_create_guild", w, r, h, c.Page{h, tList, nil})
}
func RouteCreateGuildSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func RouteCreateGuildSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
// TODO: Add an approval queue mode for group creation
if !user.Loggedin || !user.PluginPerms["CreateGuild"] {
return c.NoPermissions(w, r, user)
@ -279,7 +279,7 @@ func RouteCreateGuildSubmit(w http.ResponseWriter, r *http.Request, user *c.User
return nil
}
func RouteMemberList(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func RouteMemberList(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
header, ferr := c.UserCheck(w, r, &user)
if ferr != nil {
return ferr

View File

@ -822,7 +822,7 @@ func (red *HTTPSRedirect) ServeHTTP(w http.ResponseWriter, req *http.Request) {
type GenRouter struct {
UploadHandler func(http.ResponseWriter, *http.Request)
extraRoutes map[string]func(http.ResponseWriter, *http.Request, *c.User) c.RouteError
extraRoutes map[string]func(http.ResponseWriter, *http.Request, c.User) c.RouteError
requestLogger *log.Logger
sync.RWMutex
@ -839,12 +839,12 @@ func NewGenRouter(uploads http.Handler) (*GenRouter, error) {
writ := NewWriterIntercept(w)
http.StripPrefix("/uploads/",uploads).ServeHTTP(writ,req)
},
extraRoutes: make(map[string]func(http.ResponseWriter, *http.Request, *c.User) c.RouteError),
extraRoutes: make(map[string]func(http.ResponseWriter, *http.Request, c.User) c.RouteError),
requestLogger: log.New(f, "", log.LstdFlags),
}, nil
}
func (r *GenRouter) handleError(err c.RouteError, w http.ResponseWriter, req *http.Request, user *c.User) {
func (r *GenRouter) handleError(err c.RouteError, w http.ResponseWriter, req *http.Request, user c.User) {
if err.Handled() {
return
}
@ -858,7 +858,7 @@ func (r *GenRouter) handleError(err c.RouteError, w http.ResponseWriter, req *ht
func (r *GenRouter) Handle(_ string, _ http.Handler) {
}
func (r *GenRouter) HandleFunc(pattern string, h func(http.ResponseWriter, *http.Request, *c.User) c.RouteError) {
func (r *GenRouter) HandleFunc(pattern string, h func(http.ResponseWriter, *http.Request, c.User) c.RouteError) {
r.Lock()
defer r.Unlock()
r.extraRoutes[pattern] = h
@ -1200,11 +1200,10 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
}
// Deal with the session stuff, etc.
ucpy, ok := c.PreRoute(w, req)
user, ok := c.PreRoute(w, req)
if !ok {
return
}
user := &ucpy
user.LastAgent = agent
if c.Dev.SuperDebug {
r.requestLogger.Print(
@ -1241,33 +1240,33 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
//c.StoppedServer("Profile end")
}
func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *c.User, prefix, extraData string) /*(id int, orerr */c.RouteError/*)*/ {
func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c.User, prefix, extraData string) /*(id int, orerr */c.RouteError/*)*/ {
var err c.RouteError
cn := uutils.Nanotime()
switch(prefix) {
case "/overview":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
err = routes.Overview(w,req,user,h)
co.RouteViewCounter.Bump3(1, cn)
case "/pages":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
err = routes.CustomPage(w,req,user,h,extraData)
co.RouteViewCounter.Bump3(2, cn)
case "/forums":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
err = routes.ForumList(w,req,user,h)
co.RouteViewCounter.Bump3(3, cn)
case "/forum":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -1336,7 +1335,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
case "/topics":
switch(req.URL.Path) {
case "/topics/most-viewed/":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -1348,14 +1347,14 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
err = routes.CreateTopic(w,req,user,h,extraData)
co.RouteViewCounter.Bump3(14, cn)
default:
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -1889,7 +1888,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -1901,7 +1900,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -1969,7 +1968,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -1994,7 +1993,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2006,7 +2005,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2044,7 +2043,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2059,7 +2058,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2071,7 +2070,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2083,7 +2082,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2095,7 +2094,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2107,7 +2106,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2119,7 +2118,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2183,7 +2182,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2208,7 +2207,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2229,7 +2228,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
co.RouteViewCounter.Bump3(122, cn)
default:
req.URL.Path += extraData
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2283,7 +2282,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
return err
}
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2472,7 +2471,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
err = routes.RemoveAttachFromTopicSubmit(w,req,user,extraData)
co.RouteViewCounter.Bump3(140, cn)
default:
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2645,14 +2644,14 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
case "/accounts":
switch(req.URL.Path) {
case "/accounts/login/":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
err = routes.AccountLogin(w,req,user,h)
co.RouteViewCounter.Bump3(154, cn)
case "/accounts/create/":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2680,7 +2679,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
err = routes.AccountLoginSubmit(w,req,user)
co.RouteViewCounter.Bump3(157, cn)
case "/accounts/mfa_verify/":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2703,7 +2702,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
err = routes.AccountRegisterSubmit(w,req,user)
co.RouteViewCounter.Bump3(160, cn)
case "/accounts/password-reset/":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}
@ -2718,7 +2717,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *
err = routes.AccountPasswordResetSubmit(w,req,user)
co.RouteViewCounter.Bump3(162, cn)
case "/accounts/password-reset/token/":
h, err := c.UserCheckNano(w,req,user,cn)
h, err := c.UserCheckNano(w,req,&user,cn)
if err != nil {
return err
}

View File

@ -17,7 +17,7 @@ import (
c "github.com/Azareal/Gosora/common"
e "github.com/Azareal/Gosora/extend"
"github.com/Azareal/Gosora/install"
qgen "github.com/Azareal/Gosora/query_gen"
"github.com/Azareal/Gosora/query_gen"
"github.com/Azareal/Gosora/routes"
)
@ -151,7 +151,7 @@ func BenchmarkTopicAdminRouteParallel(b *testing.B) {
b.Fatal(err)
}
//w.Body.Reset()
routes.ViewTopic(w, reqAdmin, &user, head, "1")
routes.ViewTopic(w, reqAdmin, user, head, "1")
if w.Code != 200 {
b.Log(w.Body)
b.Fatal("HTTP Error!")
@ -287,7 +287,7 @@ func BenchmarkTopicGuestRouteParallel(b *testing.B) {
b.Fatal(err)
}
//w.Body.Reset()
routes.ViewTopic(w, req, &user, head, "1")
routes.ViewTopic(w, req, user, head, "1")
if w.Code != 200 {
b.Log(w.Body)
b.Fatal("HTTP Error!")
@ -314,7 +314,7 @@ func BenchmarkTopicGuestRouteParallelDebugMode(b *testing.B) {
b.Fatal(err)
}
//w.Body.Reset()
routes.ViewTopic(w, req, &user, head, "1")
routes.ViewTopic(w, req, user, head, "1")
if w.Code != 200 {
b.Log(w.Body)
b.Fatal("HTTP Error!")
@ -940,12 +940,12 @@ func BenchmarkParserSerial(b *testing.B) {
}
}
}
f("empty_post", "")
f("short_post", "Hey everyone, how's it going?")
f("one_smily", "Hey everyone, how's it going? :)")
f("five_smilies", "Hey everyone, how's it going? :):):):):)")
f("ten_smilies", "Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies", "Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("empty_post","")
f("short_post","Hey everyone, how's it going?")
f("one_smily","Hey everyone, how's it going? :)")
f("five_smilies","Hey everyone, how's it going? :):):):):)")
f("ten_smilies","Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies","Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
}
func BenchmarkBBCodePluginWithRegexpSerial(b *testing.B) {
@ -957,15 +957,15 @@ func BenchmarkBBCodePluginWithRegexpSerial(b *testing.B) {
}
})
}
f("empty_post", "")
f("short_post", "Hey everyone, how's it going?")
f("one_smily", "Hey everyone, how's it going? :)")
f("five_smilies", "Hey everyone, how's it going? :):):):):)")
f("ten_smilies", "Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies", "Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("one_bold", "[b]H[/b]ey everyone, how's it going?")
f("five_bold", "[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
f("ten_bold", "[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
f("empty_post","")
f("short_post","Hey everyone, how's it going?")
f("one_smily","Hey everyone, how's it going? :)")
f("five_smilies","Hey everyone, how's it going? :):):):):)")
f("ten_smilies","Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies","Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("one_bold","[b]H[/b]ey everyone, how's it going?")
f("five_bold","[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
f("ten_bold","[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
}
func BenchmarkBBCodePluginWithoutCodeTagSerial(b *testing.B) {
@ -977,15 +977,15 @@ func BenchmarkBBCodePluginWithoutCodeTagSerial(b *testing.B) {
}
})
}
f("empty_post", "")
f("short_post", "Hey everyone, how's it going?")
f("one_smily", "Hey everyone, how's it going? :)")
f("five_smilies", "Hey everyone, how's it going? :):):):):)")
f("ten_smilies", "Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies", "Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("one_bold", "[b]H[/b]ey everyone, how's it going?")
f("five_bold", "[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
f("ten_bold", "[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
f("empty_post","")
f("short_post","Hey everyone, how's it going?")
f("one_smily","Hey everyone, how's it going? :)")
f("five_smilies","Hey everyone, how's it going? :):):):):)")
f("ten_smilies","Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies","Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("one_bold","[b]H[/b]ey everyone, how's it going?")
f("five_bold","[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
f("ten_bold","[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
}
func BenchmarkBBCodePluginWithFullParserSerial(b *testing.B) {
@ -997,15 +997,15 @@ func BenchmarkBBCodePluginWithFullParserSerial(b *testing.B) {
}
})
}
f("empty_post", "")
f("short_post", "Hey everyone, how's it going?")
f("one_smily", "Hey everyone, how's it going? :)")
f("five_smilies", "Hey everyone, how's it going? :):):):):)")
f("ten_smilies", "Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies", "Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("one_bold", "[b]H[/b]ey everyone, how's it going?")
f("five_bold", "[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
f("ten_bold", "[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
f("empty_post","")
f("short_post","Hey everyone, how's it going?")
f("one_smily","Hey everyone, how's it going? :)")
f("five_smilies","Hey everyone, how's it going? :):):):):)")
f("ten_smilies","Hey everyone, how's it going? :):):):):):):):):):)")
f("twenty_smilies","Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)")
f("one_bold","[b]H[/b]ey everyone, how's it going?")
f("five_bold","[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b]eryone, how's it going?")
f("ten_bold","[b]H[/b][b]e[/b][b]y[/b] [b]e[/b][b]v[/b][b]e[/b][b]r[/b][b]y[/b][b]o[/b][b]n[/b]e, how's it going?")
}
func TestLevels(t *testing.T) {

View File

@ -391,30 +391,30 @@ func TestPermsMiddleware(t *testing.T) {
dummyRequest := httptest.NewRequest("", "/forum/1", bytesBuffer)
user := c.BlankUser()
ferr := c.SuperModOnly(dummyResponseRecorder, dummyRequest, user)
ferr := c.SuperModOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Blank users shouldn't be supermods")
user.IsSuperMod = false
ferr = c.SuperModOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.SuperModOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Non-supermods shouldn't be allowed through supermod gates")
user.IsSuperMod = true
ferr = c.SuperModOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.SuperModOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr == nil, "Supermods should be allowed through supermod gates")
// TODO: Loop over the Control Panel routes and make sure only supermods can get in
user = c.BlankUser()
ferr = c.MemberOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.MemberOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Blank users shouldn't be considered loggedin")
user.Loggedin = false
ferr = c.MemberOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.MemberOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Guests shouldn't be able to access member areas")
user.Loggedin = true
ferr = c.MemberOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.MemberOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr == nil, "Logged in users should be able to access member areas")
// TODO: Loop over the /user/ routes and make sure only members can access the ones other than /user/username
@ -423,15 +423,15 @@ func TestPermsMiddleware(t *testing.T) {
user = c.BlankUser()
ferr = c.SuperAdminOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.SuperAdminOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Blank users shouldn't be considered super admins")
user.IsSuperAdmin = false
ferr = c.SuperAdminOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.SuperAdminOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Non-super admins shouldn't be allowed through the super admin gate")
user.IsSuperAdmin = true
ferr = c.SuperAdminOnly(dummyResponseRecorder, dummyRequest, user)
ferr = c.SuperAdminOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr == nil, "Super admins should be allowed through super admin gates")
// TODO: Make sure only super admins can access the backups route

View File

@ -79,8 +79,8 @@ func main() {
//out += "\n\t\t\tid = " + strconv.Itoa(allRouteMap[route.Name])
out += runBefore(route.RunBefore, 4)
if !route.Action && !route.NoHead {
//out += "\n\t\t\th, err := c.UserCheck(w,req,user)"
out += "\n\t\t\th, err := c.UserCheckNano(w,req,user,cn)"
//out += "\n\t\t\th, err := c.UserCheck(w,req,&user)"
out += "\n\t\t\th, err := c.UserCheckNano(w,req,&user,cn)"
out += "\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}"
vcpy := route.Vars
route.Vars = []string{"h"}
@ -151,8 +151,8 @@ func main() {
}
}
if !route.Action && !route.NoHead && !group.NoHead {
//out += "\n\t\t\t\th, err := c.UserCheck(w,req,user)"
out += "\n\t\t\t\th, err := c.UserCheckNano(w,req,user,cn)"
//out += "\n\t\t\t\th, err := c.UserCheck(w,req,&user)"
out += "\n\t\t\t\th, err := c.UserCheckNano(w,req,&user,cn)"
out += "\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}"
vcpy := route.Vars
route.Vars = []string{"h"}
@ -179,8 +179,8 @@ func main() {
//out += "\n\t\t\t\t\tid = " + strconv.Itoa(allRouteMap[defaultRoute.Name])
out += runBefore(defaultRoute.RunBefore, 4)
if !defaultRoute.Action && !defaultRoute.NoHead && !group.NoHead {
//out += "\n\t\t\t\t\th, err := c.UserCheck(w,req,user)"
out += "\n\t\t\t\t\th, err := c.UserCheckNano(w,req,user,cn)"
//out += "\n\t\t\t\t\th, err := c.UserCheck(w,req,&user)"
out += "\n\t\t\t\t\th, err := c.UserCheckNano(w,req,&user,cn)"
out += "\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}"
vcpy := defaultRoute.Vars
defaultRoute.Vars = []string{"h"}
@ -503,7 +503,7 @@ func (red *HTTPSRedirect) ServeHTTP(w http.ResponseWriter, req *http.Request) {
type GenRouter struct {
UploadHandler func(http.ResponseWriter, *http.Request)
extraRoutes map[string]func(http.ResponseWriter, *http.Request, *c.User) c.RouteError
extraRoutes map[string]func(http.ResponseWriter, *http.Request, c.User) c.RouteError
requestLogger *log.Logger
sync.RWMutex
@ -520,12 +520,12 @@ func NewGenRouter(uploads http.Handler) (*GenRouter, error) {
writ := NewWriterIntercept(w)
http.StripPrefix("/uploads/",uploads).ServeHTTP(writ,req)
},
extraRoutes: make(map[string]func(http.ResponseWriter, *http.Request, *c.User) c.RouteError),
extraRoutes: make(map[string]func(http.ResponseWriter, *http.Request, c.User) c.RouteError),
requestLogger: log.New(f, "", log.LstdFlags),
}, nil
}
func (r *GenRouter) handleError(err c.RouteError, w http.ResponseWriter, req *http.Request, user *c.User) {
func (r *GenRouter) handleError(err c.RouteError, w http.ResponseWriter, req *http.Request, user c.User) {
if err.Handled() {
return
}
@ -539,7 +539,7 @@ func (r *GenRouter) handleError(err c.RouteError, w http.ResponseWriter, req *ht
func (r *GenRouter) Handle(_ string, _ http.Handler) {
}
func (r *GenRouter) HandleFunc(pattern string, h func(http.ResponseWriter, *http.Request, *c.User) c.RouteError) {
func (r *GenRouter) HandleFunc(pattern string, h func(http.ResponseWriter, *http.Request, c.User) c.RouteError) {
r.Lock()
defer r.Unlock()
r.extraRoutes[pattern] = h
@ -881,11 +881,10 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
}
// Deal with the session stuff, etc.
ucpy, ok := c.PreRoute(w, req)
user, ok := c.PreRoute(w, req)
if !ok {
return
}
user := &ucpy
user.LastAgent = agent
if c.Dev.SuperDebug {
r.requestLogger.Print(
@ -922,7 +921,7 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
//c.StoppedServer("Profile end")
}
func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user *c.User, prefix, extraData string) /*(id int, orerr */c.RouteError/*)*/ {
func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c.User, prefix, extraData string) /*(id int, orerr */c.RouteError/*)*/ {
var err c.RouteError
cn := uutils.Nanotime()
switch(prefix) {` + out + `

View File

@ -33,7 +33,7 @@ var phraseLoginAlerts = []byte(`{"msgs":[{"msg":"Login to see your alerts","path
// TODO: Refactor this endpoint
// TODO: Move this into the routes package
func routeAPI(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func routeAPI(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
// TODO: Don't make this too JSON dependent so that we can swap in newer more efficient formats
w.Header().Set("Content-Type", "application/json")
err := r.ParseForm()
@ -210,7 +210,7 @@ var phraseWhitelist = []string{
"panel", // We're going to handle this specially below as this is a security boundary
}
func routeAPIPhrases(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func routeAPIPhrases(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
// TODO: Don't make this too JSON dependent so that we can swap in newer more efficient formats
h := w.Header()
h.Set("Content-Type", "application/json")
@ -343,14 +343,16 @@ func routeAPIPhrases(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
// A dedicated function so we can shake things up every now and then to make the token harder to parse
// TODO: Are we sure we want to do this by ID, just in case we reuse this and have multiple antispams on the page?
func routeJSAntispam(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func routeJSAntispam(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
h := sha256.New()
h.Write([]byte(c.JSTokenBox.Load().(string)))
h.Write([]byte(user.GetIP()))
jsToken := hex.EncodeToString(h.Sum(nil))
innerCode := "`document.getElementByld('golden-watch').value='" + jsToken + "';`"
io.WriteString(w, `let hihi=`+innerCode+`;hihi=hihi.replace('ld','Id');eval(hihi);`)
innerCode := "`document.getElementByld('golden-watch').value = '" + jsToken + "';`"
io.WriteString(w, `let hihi = `+innerCode+`;
hihi = hihi.replace('ld','Id');
eval(hihi);`)
return nil
}

View File

@ -20,7 +20,7 @@ import (
// A blank list to fill out that parameter in Page for routes which don't use it
var tList []interface{}
func AccountLogin(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
func AccountLogin(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
@ -31,7 +31,7 @@ func AccountLogin(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Hea
// TODO: Log failed attempted logins?
// TODO: Lock IPS out if they have too many failed attempts?
// TODO: Log unusual countries in comparison to the country a user usually logs in from? Alert the user about this?
func AccountLoginSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func AccountLoginSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
@ -67,13 +67,13 @@ func AccountLoginSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.
return nil
}
return loginSuccess(uid, w, r, user)
return loginSuccess(uid, w, r, &user)
}
func loginSuccess(uid int, w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
userPtr, err := c.Users.Get(uid)
if err != nil {
return c.LocalError("Bad account", w, r, user)
return c.LocalError("Bad account", w, r, *user)
}
*user = *userPtr
@ -105,7 +105,7 @@ func extractCookie(name string, r *http.Request) (string, error) {
return cookie.Value, nil
}
func mfaGetCookies(r *http.Request) (uid int, provSession, signedSession string, err error) {
func mfaGetCookies(r *http.Request) (uid int, provSession string, signedSession string, err error) {
suid, err := extractCookie("uid", r)
if err != nil {
return 0, "", "", err
@ -122,7 +122,7 @@ func mfaGetCookies(r *http.Request) (uid int, provSession, signedSession string,
return uid, provSession, signedSession, err
}
func mfaVerifySession(provSession, signedSession string, uid int) bool {
func mfaVerifySession(provSession string, signedSession string, uid int) bool {
h := sha256.New()
h.Write([]byte(c.SessionSigningKeyBox.Load().(string)))
h.Write([]byte(provSession))
@ -140,50 +140,50 @@ func mfaVerifySession(provSession, signedSession string, uid int) bool {
return subtle.ConstantTimeCompare([]byte(signedSession), []byte(expected)) == 1
}
func AccountLoginMFAVerify(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
if u.Loggedin {
return c.LocalError("You're already logged in.", w, r, u)
func AccountLoginMFAVerify(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
h.Title = p.GetTitlePhrase("login_mfa_verify")
uid, provSession, signedSession, err := mfaGetCookies(r)
if err != nil {
return c.LocalError("Invalid cookie", w, r, u)
return c.LocalError("Invalid cookie", w, r, user)
}
if !mfaVerifySession(provSession, signedSession, uid) {
return c.LocalError("Invalid session", w, r, u)
return c.LocalError("Invalid session", w, r, user)
}
return renderTemplate("login_mfa_verify", w, r, h, c.Page{h, tList, nil})
}
func AccountLoginMFAVerifySubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
func AccountLoginMFAVerifySubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
uid, provSession, signedSession, err := mfaGetCookies(r)
if err != nil {
return c.LocalError("Invalid cookie", w, r, u)
return c.LocalError("Invalid cookie", w, r, user)
}
if !mfaVerifySession(provSession, signedSession, uid) {
return c.LocalError("Invalid session", w, r, u)
return c.LocalError("Invalid session", w, r, user)
}
token := r.PostFormValue("mfa_token")
err = c.Auth.ValidateMFAToken(token, uid)
if err != nil {
return c.LocalError(err.Error(), w, r, u)
return c.LocalError(err.Error(), w, r, user)
}
return loginSuccess(uid, w, r, u)
return loginSuccess(uid, w, r, &user)
}
func AccountLogout(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
c.Auth.Logout(w, u.ID)
func AccountLogout(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
c.Auth.Logout(w, user.ID)
http.Redirect(w, r, "/", http.StatusSeeOther)
return nil
}
func AccountRegister(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
if u.Loggedin {
return c.LocalError("You're already logged in.", w, r, u)
func AccountRegister(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
h.Title = p.GetTitlePhrase("register")
h.AddScriptAsync("register.js")
@ -199,8 +199,8 @@ func isNumeric(data string) (numeric bool) {
return true
}
func AccountRegisterSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
headerLite, _ := c.SimpleUserCheck(w, r, user)
func AccountRegisterSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
headerLite, _ := c.SimpleUserCheck(w, r, &user)
// TODO: Should we push multiple validation errors to the user instead of just one?
regSuccess := true
@ -361,8 +361,8 @@ func accountEditHead(titlePhrase string, w http.ResponseWriter, r *http.Request,
h.AddScriptAsync("account.js")
}
func AccountEdit(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header) c.RouteError {
accountEditHead("account", w, r, user, header)
func AccountEdit(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError {
accountEditHead("account", w, r, &user, header)
if r.FormValue("avatar_updated") == "1" {
header.AddNotice("account_avatar_updated")
} else if r.FormValue("username_updated") == "1" {
@ -391,14 +391,14 @@ func AccountEdit(w http.ResponseWriter, r *http.Request, user *c.User, header *c
}
//edit_password
func AccountEditPassword(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
accountEditHead("account_password", w, r, u, h)
func AccountEditPassword(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_password", w, r, &user, h)
return renderTemplate("account_own_edit_password", w, r, h, c.Page{h, tList, nil})
}
// TODO: Require re-authentication if the user hasn't logged in in a while
func AccountEditPasswordSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func AccountEditPasswordSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -433,8 +433,8 @@ func AccountEditPasswordSubmit(w http.ResponseWriter, r *http.Request, user *c.U
return nil
}
func AccountEditAvatarSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func AccountEditAvatarSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -460,8 +460,8 @@ func AccountEditAvatarSubmit(w http.ResponseWriter, r *http.Request, user *c.Use
return nil
}
func AccountEditRevokeAvatarSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func AccountEditRevokeAvatarSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -475,33 +475,33 @@ func AccountEditRevokeAvatarSubmit(w http.ResponseWriter, r *http.Request, user
return nil
}
func AccountEditUsernameSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, u)
func AccountEditUsernameSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
newUsername := c.SanitiseSingleLine(r.PostFormValue("account-new-username"))
if newUsername == "" {
return c.LocalError("You can't leave your username blank", w, r, u)
return c.LocalError("You can't leave your username blank", w, r, user)
}
err := u.ChangeName(newUsername)
err := user.ChangeName(newUsername)
if err != nil {
return c.LocalError("Unable to change the username. Does someone else already have this name?", w, r, u)
return c.LocalError("Unable to change the username. Does someone else already have this name?", w, r, user)
}
http.Redirect(w, r, "/user/edit/?username_updated=1", http.StatusSeeOther)
return nil
}
func AccountEditMFA(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
accountEditHead("account_mfa", w, r, u, h)
func AccountEditMFA(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_mfa", w, r, &user, h)
mfaItem, err := c.MFAstore.Get(u.ID)
mfaItem, err := c.MFAstore.Get(user.ID)
if err != sql.ErrNoRows && err != nil {
return c.InternalError(err, w, r)
} else if err == sql.ErrNoRows {
return c.LocalError("Two-factor authentication hasn't been setup on your account", w, r, u)
return c.LocalError("Two-factor authentication hasn't been setup on your account", w, r, user)
}
pi := c.Page{h, tList, mfaItem.Scratch}
@ -509,15 +509,15 @@ func AccountEditMFA(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Head
}
// If not setup, generate a string, otherwise give an option to disable mfa given the right code
func AccountEditMFASetup(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
accountEditHead("account_mfa_setup", w, r, u, h)
func AccountEditMFASetup(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_mfa_setup", w, r, &user, h)
// Flash an error if mfa is already setup
_, err := c.MFAstore.Get(u.ID)
_, err := c.MFAstore.Get(user.ID)
if err != sql.ErrNoRows && err != nil {
return c.InternalError(err, w, r)
} else if err != sql.ErrNoRows {
return c.LocalError("You have already setup two-factor authentication", w, r, u)
return c.LocalError("You have already setup two-factor authentication", w, r, user)
}
// TODO: Entitise this?
@ -531,8 +531,8 @@ func AccountEditMFASetup(w http.ResponseWriter, r *http.Request, u *c.User, h *c
}
// Form should bounce the random mfa secret back and the otp to be verified server-side to reduce the chances of a bug arising on the JS side which makes every code mismatch
func AccountEditMFASetupSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func AccountEditMFASetupSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -568,8 +568,8 @@ func AccountEditMFASetupSubmit(w http.ResponseWriter, r *http.Request, user *c.U
}
// TODO: Implement this
func AccountEditMFADisableSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func AccountEditMFADisableSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -591,20 +591,20 @@ func AccountEditMFADisableSubmit(w http.ResponseWriter, r *http.Request, user *c
return nil
}
func AccountEditPrivacy(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
accountEditHead("account_privacy", w, r, u, h)
func AccountEditPrivacy(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_privacy", w, r, &user, h)
profileComments := false
receiveConvos := false
enableEmbeds := !c.DefaultParseSettings.NoEmbed
if u.ParseSettings != nil {
enableEmbeds = !u.ParseSettings.NoEmbed
if user.ParseSettings != nil {
enableEmbeds = !user.ParseSettings.NoEmbed
}
pi := c.Account{h, "privacy", "account_own_edit_privacy", c.AccountPrivacyPage{h, profileComments, receiveConvos, enableEmbeds}}
return renderTemplate("account", w, r, h, pi)
}
func AccountEditPrivacySubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
//headerLite, _ := c.SimpleUserCheck(w, r, user)
func AccountEditPrivacySubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
//headerLite, _ := c.SimpleUserCheck(w, r, &user)
sEnableEmbeds := r.FormValue("enable_embeds")
enableEmbeds, err := strconv.Atoi(sEnableEmbeds)
@ -612,7 +612,7 @@ func AccountEditPrivacySubmit(w http.ResponseWriter, r *http.Request, user *c.Us
return c.LocalError("enable_embeds must be 0 or 1", w, r, user)
}
if sEnableEmbeds != r.FormValue("o_enable_embeds") {
err = user.UpdatePrivacy(enableEmbeds)
err = (&user).UpdatePrivacy(enableEmbeds)
if err != nil {
return c.InternalError(err, w, r)
}
@ -622,9 +622,9 @@ func AccountEditPrivacySubmit(w http.ResponseWriter, r *http.Request, user *c.Us
return nil
}
func AccountEditEmail(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
accountEditHead("account_email", w, r, user, h)
emails, err := c.Emails.GetEmailsByUser(user)
func AccountEditEmail(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_email", w, r, &user, h)
emails, err := c.Emails.GetEmailsByUser(&user)
if err != nil {
return c.InternalError(err, w, r)
}
@ -646,9 +646,9 @@ func AccountEditEmail(w http.ResponseWriter, r *http.Request, user *c.User, h *c
return renderTemplate("account", w, r, h, pi)
}
func AccountEditEmailAddSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func AccountEditEmailAddSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
email := r.PostFormValue("email")
_, err := c.Emails.Get(user, email)
_, err := c.Emails.Get(&user, email)
if err == nil {
return c.LocalError("You have already added this email.", w, r, user)
} else if err != sql.ErrNoRows && err != nil {
@ -677,12 +677,12 @@ func AccountEditEmailAddSubmit(w http.ResponseWriter, r *http.Request, user *c.U
return nil
}
func AccountEditEmailRemoveSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
headerLite, _ := c.SimpleUserCheck(w, r, user)
func AccountEditEmailRemoveSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
headerLite, _ := c.SimpleUserCheck(w, r, &user)
email := r.PostFormValue("email")
// Quick and dirty check
_, err := c.Emails.Get(user, email)
_, err := c.Emails.Get(&user, email)
if err == sql.ErrNoRows {
return c.LocalError("This email isn't set on this user.", w, r, user)
} else if err != nil {
@ -702,8 +702,8 @@ func AccountEditEmailRemoveSubmit(w http.ResponseWriter, r *http.Request, user *
}
// TODO: Should we make this an AnonAction so someone can do this without being logged in?
func AccountEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request, user *c.User, token string) c.RouteError {
header, ferr := c.UserCheck(w, r, user)
func AccountEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request, user c.User, token string) c.RouteError {
header, ferr := c.UserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -713,7 +713,7 @@ func AccountEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request, user *c
}
targetEmail := c.Email{UserID: user.ID}
emails, err := c.Emails.GetEmailsByUser(user)
emails, err := c.Emails.GetEmailsByUser(&user)
if err == sql.ErrNoRows {
return c.LocalError("A verification email was never sent for you!", w, r, user)
} else if err != nil {
@ -760,13 +760,13 @@ func AccountEditEmailTokenSubmit(w http.ResponseWriter, r *http.Request, user *c
return nil
}
func AccountLogins(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
accountEditHead("account_logins", w, r, u, h)
func AccountLogins(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_logins", w, r, &user, h)
page, _ := strconv.Atoi(r.FormValue("page"))
perPage := 12
offset, page, lastPage := c.PageOffset(c.LoginLogs.CountUser(u.ID), page, perPage)
offset, page, lastPage := c.PageOffset(c.LoginLogs.CountUser(user.ID), page, perPage)
logs, err := c.LoginLogs.GetOffset(u.ID, offset, perPage)
logs, err := c.LoginLogs.GetOffset(user.ID, offset, perPage)
if err != nil {
return c.InternalError(err, w, r)
}
@ -776,8 +776,8 @@ func AccountLogins(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Heade
return renderTemplate("account", w, r, h, pi)
}
func AccountBlocked(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
accountEditHead("account_blocked", w, r, user, h)
func AccountBlocked(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("account_blocked", w, r, &user, h)
page, _ := strconv.Atoi(r.FormValue("page"))
perPage := 12
offset, page, lastPage := c.PageOffset(c.UserBlocks.BlockedByCount(user.ID), page, perPage)
@ -800,7 +800,7 @@ func AccountBlocked(w http.ResponseWriter, r *http.Request, user *c.User, h *c.H
return renderTemplate("account", w, r, h, pi)
}
func LevelList(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
func LevelList(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
h.Title = p.GetTitlePhrase("account_level_list")
fScores := c.GetLevels(20)
@ -822,16 +822,16 @@ func LevelList(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header
return renderTemplate("level_list", w, r, h, c.LevelListPage{h, levels[1:]})
}
func Alerts(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
func Alerts(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
return nil
}
func AccountPasswordReset(w http.ResponseWriter, r *http.Request, u *c.User, h *c.Header) c.RouteError {
if u.Loggedin {
return c.LocalError("You're already logged in.", w, r, u)
func AccountPasswordReset(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
if !c.Site.EnableEmails {
return c.LocalError(p.GetNoticePhrase("account_mail_disabled"), w, r, u)
return c.LocalError(p.GetNoticePhrase("account_mail_disabled"), w, r, user)
}
if r.FormValue("email_sent") == "1" {
h.AddNotice("password_reset_email_sent")
@ -841,7 +841,7 @@ func AccountPasswordReset(w http.ResponseWriter, r *http.Request, u *c.User, h *
}
// TODO: Ratelimit this
func AccountPasswordResetSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func AccountPasswordResetSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
@ -909,7 +909,7 @@ func AccountPasswordResetSubmit(w http.ResponseWriter, r *http.Request, user *c.
return nil
}
func AccountPasswordResetToken(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header) c.RouteError {
func AccountPasswordResetToken(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}
@ -940,7 +940,7 @@ func AccountPasswordResetToken(w http.ResponseWriter, r *http.Request, user *c.U
return renderTemplate("password_reset_token", w, r, header, c.ResetPage{header, uid, html.EscapeString(token), mfa})
}
func AccountPasswordResetTokenSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func AccountPasswordResetTokenSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
if user.Loggedin {
return c.LocalError("You're already logged in.", w, r, user)
}

View File

@ -235,7 +235,7 @@ type MeSite struct {
// APIMe returns information about the current logged-in user
// TODO: Find some way to stop intermediaries from doing compression to avoid the BREACH attack
// TODO: Decouple site settings into a different API? I'd like to avoid having too many requests, if possible, maybe we can use a different name for this?
func APIMe(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
func APIMe(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
// TODO: Don't make this too JSON dependent so that we can swap in newer more efficient formats
h := w.Header()
h.Set("Content-Type", "application/json")
@ -243,7 +243,7 @@ func APIMe(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
// TODO: Use this header anywhere with a user check?
h.Set("Cache-Control", "private")
me := JsonMe{u.Me(), MeSite{c.Site.MaxRequestSize}}
me := JsonMe{(&user).Me(), MeSite{c.Site.MaxRequestSize}}
jsonBytes, err := json.Marshal(me)
if err != nil {
return c.InternalErrorJS(err, w, r)

View File

@ -29,7 +29,7 @@ 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, user c.User, filename string) c.RouteError {
filename = c.Stripslashes(filename)
ext := filepath.Ext("./attachs/" + filename)
if !c.AllowedFileExts.Contains(strings.TrimPrefix(ext, ".")) {
@ -52,7 +52,7 @@ 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, &user, sid)
if ferr != nil {
return ferr
}
@ -88,7 +88,7 @@ func ShowAttachment(w http.ResponseWriter, r *http.Request, user *c.User, filena
return nil
}
func deleteAttachment(w http.ResponseWriter, r *http.Request, user *c.User, aid int, js bool) c.RouteError {
func deleteAttachment(w http.ResponseWriter, r *http.Request, user c.User, aid int, js bool) c.RouteError {
err := c.DeleteAttachment(aid)
if err == sql.ErrNoRows {
return c.NotFoundJSQ(w, r, nil, js)
@ -101,7 +101,7 @@ func deleteAttachment(w http.ResponseWriter, r *http.Request, user *c.User, aid
// TODO: Stop duplicating this code
// TODO: Use a transaction here
// TODO: Move this function to neutral ground
func uploadAttachment(w http.ResponseWriter, r *http.Request, user *c.User, sid int, stable string, oid int, otable, extra string) (pathMap map[string]string, rerr c.RouteError) {
func uploadAttachment(w http.ResponseWriter, r *http.Request, user c.User, sid int, stable string, oid int, otable, extra string) (pathMap map[string]string, rerr c.RouteError) {
pathMap = make(map[string]string)
files, rerr := uploadFilesWithHash(w, r, user, "./attachs/")
if rerr != nil {

View File

@ -120,7 +120,7 @@ func renderTemplate3(tmplName, hookName string, w http.ResponseWriter, r *http.R
s := h.Stylesheets
h.Stylesheets = nil
if r.FormValue("i") != "1" && h.CurrentUser.LastAgent != c.Semrush {
c.PrepResources(h.CurrentUser, h, h.Theme)
c.PrepResources(&h.CurrentUser, h, h.Theme)
for _, ss := range s {
h.Stylesheets = append(h.Stylesheets, ss)
}
@ -146,7 +146,7 @@ func renderTemplate3(tmplName, hookName string, w http.ResponseWriter, r *http.R
}
co.PerfCounter.Push(since /*, false*/)
}
if c.RunPreRenderHook("pre_render_"+hookName, w, r, h.CurrentUser, pi) {
if c.RunPreRenderHook("pre_render_"+hookName, w, r, &h.CurrentUser, pi) {
return nil
}
err := h.Theme.RunTmpl(tmplName, pi, w)

View File

@ -14,8 +14,8 @@ import (
p "github.com/Azareal/Gosora/common/phrases"
)
func Convos(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
accountEditHead("convos", w, r, user, h)
func Convos(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("convos", w, r, &user, h)
h.AddScript("convo.js")
h.AddSheet(h.Theme.Name + "/convo.css")
h.AddNotice("convo_dev")
@ -51,8 +51,8 @@ func Convos(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c
return renderTemplate("account", w, r, h, pi)
}
func Convo(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header, scid string) c.RouteError {
accountEditHead("convo", w, r, user, header)
func Convo(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header, scid string) c.RouteError {
accountEditHead("convo", w, r, &user, header)
header.AddSheet(header.Theme.Name + "/convo.css")
header.AddNotice("convo_dev")
cid, err := strconv.Atoi(scid)
@ -127,8 +127,8 @@ func Convo(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Heade
return renderTemplate("account", w, r, header, pi)
}
func ConvosCreate(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
accountEditHead("create_convo", w, r, user, h)
func ConvosCreate(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
accountEditHead("create_convo", w, r, &user, h)
if !user.Perms.UseConvos && !user.Perms.UseConvosOnlyWithMod {
return c.NoPermissions(w, r, user)
}
@ -146,8 +146,8 @@ func ConvosCreate(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Hea
return renderTemplate("account", w, r, h, pi)
}
func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -225,7 +225,7 @@ func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.
return c.InternalError(err, w, r)
}
err = c.AddActivityAndNotifyAll(c.Alert{ActorID: user.ID, Event: "create", ElementType: "convo", ElementID: cid, Actor: user})
err = c.AddActivityAndNotifyAll(c.Alert{ActorID: user.ID, Event: "create", ElementType: "convo", ElementID: cid, Actor: &user})
if err != nil {
return c.InternalError(err, w, r)
}
@ -234,8 +234,8 @@ func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.
return nil
}
/*func ConvosDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, scid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
/*func ConvosDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, scid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -250,8 +250,8 @@ func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.
return nil
}*/
func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User, scid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user c.User, scid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -293,7 +293,7 @@ func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.Use
if err != nil {
return c.InternalError(err, w, r)
}
err = c.AddActivityAndNotifyAll(c.Alert{ActorID: user.ID, Event: "reply", ElementType: "convo", ElementID: cid, Actor: user, Extra: strconv.Itoa(pid)})
err = c.AddActivityAndNotifyAll(c.Alert{ActorID: user.ID, Event: "reply", ElementType: "convo", ElementID: cid, Actor: &user, Extra: strconv.Itoa(pid)})
if err != nil {
return c.InternalError(err, w, r)
}
@ -302,8 +302,8 @@ func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.Use
return nil
}
func ConvosDeleteReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User, scpid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func ConvosDeleteReplySubmit(w http.ResponseWriter, r *http.Request, user c.User, scpid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -355,8 +355,8 @@ func ConvosDeleteReplySubmit(w http.ResponseWriter, r *http.Request, user *c.Use
return nil
}
func ConvosEditReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User, scpid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, user)
func ConvosEditReplySubmit(w http.ResponseWriter, r *http.Request, user c.User, scpid string) c.RouteError {
_, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -408,7 +408,7 @@ func ConvosEditReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User,
return nil
}
func RelationsBlockCreate(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header, spid string) c.RouteError {
func RelationsBlockCreate(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, spid string) c.RouteError {
h.Title = p.GetTitlePhrase("create_block")
pid, err := strconv.Atoi(spid)
if err != nil {
@ -425,7 +425,7 @@ func RelationsBlockCreate(w http.ResponseWriter, r *http.Request, user *c.User,
return renderTemplate("are_you_sure", w, r, h, pi)
}
func RelationsBlockCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User, spid string) c.RouteError {
func RelationsBlockCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
pid, err := strconv.Atoi(spid)
if err != nil {
return c.LocalError(p.GetErrorPhrase("id_must_be_integer"), w, r, user)
@ -449,7 +449,7 @@ func RelationsBlockCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.
return nil
}
func RelationsBlockRemove(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header, spid string) c.RouteError {
func RelationsBlockRemove(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, spid string) c.RouteError {
h.Title = p.GetTitlePhrase("remove_block")
pid, err := strconv.Atoi(spid)
if err != nil {
@ -466,7 +466,7 @@ func RelationsBlockRemove(w http.ResponseWriter, r *http.Request, user *c.User,
return renderTemplate("are_you_sure", w, r, h, pi)
}
func RelationsBlockRemoveSubmit(w http.ResponseWriter, r *http.Request, user *c.User, spid string) c.RouteError {
func RelationsBlockRemoveSubmit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
pid, err := strconv.Atoi(spid)
if err != nil {
return c.LocalError(p.GetErrorPhrase("id_must_be_integer"), w, r, user)

View File

@ -11,14 +11,14 @@ import (
)
// TODO: Retire this in favour of an alias for /topics/?
func ViewForum(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header, sfid string) c.RouteError {
func ViewForum(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header, sfid string) c.RouteError {
page, _ := strconv.Atoi(r.FormValue("page"))
_, fid, err := ParseSEOURL(sfid)
if err != nil {
return c.SimpleError(p.GetErrorPhrase("url_id_must_be_integer"), w, r, header)
}
ferr := c.ForumUserCheck(header, w, r, user, fid)
ferr := c.ForumUserCheck(header, w, r, &user, fid)
if ferr != nil {
return ferr
}

View File

@ -8,8 +8,8 @@ import (
"github.com/Azareal/Gosora/common/phrases"
)
func ForumList(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
skip, rerr := h.Hooks.VhookSkippable("route_forum_list_start", w, r, user, h)
func ForumList(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
skip, rerr := h.Hooks.VhookSkippable("route_forum_list_start", w, r, &user, h)
if skip || rerr != nil {
return rerr
}

View File

@ -79,13 +79,13 @@ func StaticFile(w http.ResponseWriter, r *http.Request) {
// Other options instead of io.Copy: io.CopyN(), w.Write(), http.ServeContent()
}
func Overview(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
func Overview(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
h.Title = phrases.GetTitlePhrase("overview")
h.Zone = "overview"
return renderTemplate("overview", w, r, h, c.Page{h, tList, nil})
}
func CustomPage(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header, name string) c.RouteError {
func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, name string) c.RouteError {
h.Zone = "custom_page"
name = c.SanitiseSingleLine(name)
page, err := c.Pages.GetByName(name)
@ -108,8 +108,8 @@ func CustomPage(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Heade
}
// TODO: Set the cookie domain
func ChangeTheme(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
//headerLite, _ := SimpleUserCheck(w, r, u)
func ChangeTheme(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
//headerLite, _ := SimpleUserCheck(w, r, &user)
// TODO: Rename js to something else, just in case we rewrite the JS side in WebAssembly?
js := r.PostFormValue("js") == "1"
newTheme := c.SanitiseSingleLine(r.PostFormValue("theme"))
@ -117,7 +117,7 @@ func ChangeTheme(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError
theme, ok := c.Themes[newTheme]
if !ok || theme.HideFromThemes {
return c.LocalErrorJSQ("That theme doesn't exist", w, r, u, js)
return c.LocalErrorJSQ("That theme doesn't exist", w, r, user, js)
}
cookie := http.Cookie{Name: "current_theme", Value: newTheme, Path: "/", MaxAge: int(c.Year)}

View File

@ -7,7 +7,7 @@ import (
"github.com/Azareal/Gosora/common/phrases"
)
func IPSearch(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
func IPSearch(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
h.Title = phrases.GetTitlePhrase("ip_search")
// TODO: How should we handle the permissions if we extend this into an alt detector of sorts?
if !user.Perms.ViewIPs {

View File

@ -255,8 +255,8 @@ func PreAnalyticsDetail(w http.ResponseWriter, r *http.Request, user *c.User) (*
return bp, nil
}
func AnalyticsViews(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsViews(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -295,8 +295,8 @@ func AnalyticsViews(w http.ResponseWriter, r *http.Request, user *c.User) c.Rout
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_views", pi})
}
func AnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user *c.User, route string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user c.User, route string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -330,8 +330,8 @@ func AnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user *c.User, r
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_route_views", pi})
}
func AnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user *c.User, agent string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user c.User, agent string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -370,8 +370,8 @@ func AnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user *c.User, a
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_agent_views", pi})
}
func AnalyticsForumViews(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsForumViews(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -413,8 +413,8 @@ func AnalyticsForumViews(w http.ResponseWriter, r *http.Request, user *c.User, s
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_forum_views", pi})
}
func AnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user *c.User, system string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user c.User, system string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -452,8 +452,8 @@ func AnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user *c.User,
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_system_views", pi})
}
func AnalyticsLanguageViews(w http.ResponseWriter, r *http.Request, user *c.User, lang string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsLanguageViews(w http.ResponseWriter, r *http.Request, user c.User, lang string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -492,8 +492,8 @@ func AnalyticsLanguageViews(w http.ResponseWriter, r *http.Request, user *c.User
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_lang_views", pi})
}
func AnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, user *c.User, domain string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, user c.User, domain string) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -524,8 +524,8 @@ func AnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, user *c.User
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_referrer_views", pi})
}
func AnalyticsTopics(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsTopics(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -557,8 +557,8 @@ func AnalyticsTopics(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_topics", pi})
}
func AnalyticsPosts(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsPosts(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -590,8 +590,8 @@ func AnalyticsPosts(w http.ResponseWriter, r *http.Request, user *c.User) c.Rout
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_posts", pi})
}
func AnalyticsMemory(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsMemory(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -626,8 +626,8 @@ func AnalyticsMemory(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
}
// TODO: Show stack and heap memory separately on the chart
func AnalyticsActiveMemory(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsActiveMemory(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -671,8 +671,8 @@ func AnalyticsActiveMemory(w http.ResponseWriter, r *http.Request, user *c.User)
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_active_memory", pi})
}
func AnalyticsPerf(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsPerf(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -789,8 +789,8 @@ func analyticsAMapToOVList(aMap map[string]map[int64]int64) (ovList []OVItem) {
return sortOVList(ovList)
}
func AnalyticsRoutesPerf(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsRoutesPerf(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -950,8 +950,8 @@ func analyticsVMapToOVList(vMap map[string]map[int64]int64) (ovList []OVItem) {
return sortOVList(ovList)
}
func AnalyticsForums(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsForums(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -1034,8 +1034,8 @@ func AnalyticsForums(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_forums", pi})
}
func AnalyticsRoutes(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsRoutes(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -1110,8 +1110,8 @@ func AnalyticsRoutes(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
}
// Trialling multi-series charts
func AnalyticsAgents(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsAgents(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -1196,8 +1196,8 @@ func AnalyticsAgents(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_agents", pi})
}
func AnalyticsSystems(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsSystems(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -1260,8 +1260,8 @@ func AnalyticsSystems(w http.ResponseWriter, r *http.Request, user *c.User) c.Ro
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_systems", pi})
}
func AnalyticsLanguages(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, user)
func AnalyticsLanguages(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := PreAnalyticsDetail(w, r, &user)
if ferr != nil {
return ferr
}
@ -1347,8 +1347,8 @@ func AnalyticsLanguages(w http.ResponseWriter, r *http.Request, user *c.User) c.
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_analytics_right", "analytics", "panel_analytics_langs", pi})
}
func AnalyticsReferrers(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "analytics", "analytics")
func AnalyticsReferrers(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "analytics", "analytics")
if ferr != nil {
return ferr
}

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, user c.User, backupURL string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "backups", "backups")
if ferr != nil {
return ferr
}

View File

@ -22,8 +22,8 @@ func successRedirect(dest string, w http.ResponseWriter, r *http.Request, js boo
}
// TODO: Prerender needs to handle dyntmpl templates better...
func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, h *c.Header, pi interface{}) c.RouteError {
if !h.LooseCSP {
func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) c.RouteError {
if !header.LooseCSP {
if c.Config.SslSchema {
w.Header().Set("Content-Security-Policy", "default-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src * data: 'unsafe-eval' 'unsafe-inline'; connect-src * 'unsafe-eval' 'unsafe-inline'; frame-src 'self';upgrade-insecure-requests")
} else {
@ -31,12 +31,12 @@ func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, h *
}
}
h.AddScript("global.js")
if c.RunPreRenderHook("pre_render_"+tmplName, w, r, h.CurrentUser, pi) {
header.AddScript("global.js")
if c.RunPreRenderHook("pre_render_"+tmplName, w, r, &header.CurrentUser, pi) {
return nil
}
// TODO: Prepend this with panel_?
err := h.Theme.RunTmpl(tmplName, pi, w)
err := header.Theme.RunTmpl(tmplName, pi, w)
if err != nil {
return c.InternalError(err, w, r)
}

View File

@ -2,18 +2,18 @@ package panel
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
"runtime"
"strconv"
"runtime"
"encoding/json"
"time"
"sync"
"sync/atomic"
"time"
c "github.com/Azareal/Gosora/common"
p "github.com/Azareal/Gosora/common/phrases"
qgen "github.com/Azareal/Gosora/query_gen"
"github.com/Azareal/Gosora/query_gen"
"github.com/Azareal/gopsutil/mem"
"github.com/pkg/errors"
)
@ -33,16 +33,16 @@ func dashMySQLStmts() (stmts dashStmts, err error) {
if err != nil {
return nil
}
stmt, ierr := db.Prepare("select count(*) from " + table + " where createdAt BETWEEN (utc_timestamp() - interval 1 " + dur + ") and utc_timestamp() " + ext)
stmt, ierr := db.Prepare("select count(*) from " + table + " where createdAt BETWEEN (utc_timestamp() - interval 1 "+dur+") and utc_timestamp() " + ext)
err = errors.WithStack(ierr)
return stmt
}
stmts.todaysPostCount = prepareStmt("replies", "", "day")
stmts.todaysTopicCount = prepareStmt("topics", "", "day")
stmts.todaysNewUserCount = prepareStmt("users", "", "day")
stmts.todaysTopicCountByForum = prepareStmt("topics", " and parentID = ?", "day")
stmts.weeklyTopicCountByForum = prepareStmt("topics", " and parentID = ?", "week")
stmts.todaysPostCount = prepareStmt("replies", "","day")
stmts.todaysTopicCount = prepareStmt("topics", "","day")
stmts.todaysNewUserCount = prepareStmt("users", "","day")
stmts.todaysTopicCountByForum = prepareStmt("topics", " and parentID = ?","day")
stmts.weeklyTopicCountByForum = prepareStmt("topics", " and parentID = ?","week")
return stmts, err
}
@ -54,24 +54,24 @@ func dashMSSQLStmts() (stmts dashStmts, err error) {
if err != nil {
return nil
}
stmt, ierr := db.Prepare("select count(*) from " + table + " where createdAt >= DATEADD(" + dur + ", -1, GETUTCDATE())" + ext)
stmt, ierr := db.Prepare("select count(*) from " + table + " where createdAt >= DATEADD("+dur+", -1, GETUTCDATE())" + ext)
err = errors.WithStack(ierr)
return stmt
}
stmts.todaysPostCount = prepareStmt("replies", "", "DAY")
stmts.todaysTopicCount = prepareStmt("topics", "", "DAY")
stmts.todaysNewUserCount = prepareStmt("users", "", "DAY")
stmts.todaysTopicCountByForum = prepareStmt("topics", " and parentID = ?", "DAY")
stmts.weeklyTopicCountByForum = prepareStmt("topics", " and parentID = ?", "WEEK")
stmts.todaysPostCount = prepareStmt("replies", "","DAY")
stmts.todaysTopicCount = prepareStmt("topics", "","DAY")
stmts.todaysNewUserCount = prepareStmt("users", "","DAY")
stmts.todaysTopicCountByForum = prepareStmt("topics", " and parentID = ?","DAY")
stmts.weeklyTopicCountByForum = prepareStmt("topics", " and parentID = ?","WEEK")
return stmts, err
}
type GE = c.GridElement
func Dashboard(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "dashboard", "dashboard")
func Dashboard(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "dashboard", "dashboard")
if ferr != nil {
return ferr
}
@ -175,21 +175,21 @@ func Dashboard(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteErro
grid1 := []GE{}
addElem1 := func(id string, href string, body string, order int, class string, back string, textColour string, tooltip string) {
grid1 = append(grid1, GE{id, href, body, order, class, back, textColour, tooltip})
grid1 = append(grid1, GE{id,href,body,order,class,back,textColour,tooltip})
}
gridElements := []GE{}
addElem := func(id string, href string, body string, order int, class string, back string, textColour string, tooltip string) {
gridElements = append(gridElements, GE{id, href, body, order, class, back, textColour, tooltip})
gridElements = append(gridElements, GE{id,href,body,order,class,back,textColour,tooltip})
}
// TODO: Implement a check for new versions of Gosora
// TODO: Localise this
//addElem1("dash-version", "", "v" + version.String(), 0, "grid_istat stat_green", "", "", "Gosora is up-to-date :)")
addElem1("dash-version", "", "v"+c.SoftwareVersion.String(), 0, "grid_istat", "", "", "")
addElem1("dash-version", "","v" + c.SoftwareVersion.String(), 0, "grid_istat", "", "", "")
addElem1("dash-cpu", "", p.GetTmplPhrasef("panel_dashboard_cpu", cpustr), 1, "grid_istat "+cpuColour, "", "", p.GetTmplPhrase("panel_dashboard_cpu_desc"))
addElem1("dash-ram", "", p.GetTmplPhrasef("panel_dashboard_ram", ramstr), 2, "grid_istat "+ramColour, "", "", p.GetTmplPhrase("panel_dashboard_ram_desc"))
addElem1("dash-memused", "/panel/analytics/memory/", p.GetTmplPhrasef("panel_dashboard_memused", memCount, memUnit), 2, "grid_istat", "", "", p.GetTmplPhrase("panel_dashboard_memused_desc"))
addElem1("dash-cpu","", p.GetTmplPhrasef("panel_dashboard_cpu",cpustr), 1, "grid_istat " + cpuColour, "", "", p.GetTmplPhrase("panel_dashboard_cpu_desc"))
addElem1("dash-ram","", p.GetTmplPhrasef("panel_dashboard_ram",ramstr), 2, "grid_istat " + ramColour, "", "", p.GetTmplPhrase("panel_dashboard_ram_desc"))
addElem1("dash-memused","/panel/analytics/memory/", p.GetTmplPhrasef("panel_dashboard_memused",memCount, memUnit), 2, "grid_istat", "", "", p.GetTmplPhrase("panel_dashboard_memused_desc"))
/*dirSize := getDirSize()
if dirSize.Size != 0 {
@ -218,27 +218,27 @@ func Dashboard(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteErro
uonline, uunit := c.ConvertFriendlyUnit(uonline)
gonline, gunit := c.ConvertFriendlyUnit(gonline)
addElem("dash-totonline", "", p.GetTmplPhrasef("panel_dashboard_online", totonline, totunit), 3, "grid_stat "+onlineColour, "", "", p.GetTmplPhrase("panel_dashboard_online_desc"))
addElem("dash-gonline", "", p.GetTmplPhrasef("panel_dashboard_guests_online", gonline, gunit), 4, "grid_stat "+onlineGuestsColour, "", "", p.GetTmplPhrase("panel_dashboard_guests_online_desc"))
addElem("dash-uonline", "", p.GetTmplPhrasef("panel_dashboard_users_online", uonline, uunit), 5, "grid_stat "+onlineUsersColour, "", "", p.GetTmplPhrase("panel_dashboard_users_online_desc"))
addElem("dash-totonline", "",p.GetTmplPhrasef("panel_dashboard_online", totonline, totunit), 3, "grid_stat " + onlineColour, "", "", p.GetTmplPhrase("panel_dashboard_online_desc"))
addElem("dash-gonline","", p.GetTmplPhrasef("panel_dashboard_guests_online", gonline, gunit), 4, "grid_stat " + onlineGuestsColour, "", "", p.GetTmplPhrase("panel_dashboard_guests_online_desc"))
addElem("dash-uonline","", p.GetTmplPhrasef("panel_dashboard_users_online", uonline, uunit), 5, "grid_stat " + onlineUsersColour, "", "", p.GetTmplPhrase("panel_dashboard_users_online_desc"))
//addElem("dash-reqs","", strconv.Itoa(reqCount) + " reqs / second", 7, "grid_stat grid_end_group " + topicColour, "", "", "The number of requests over the last 24 hours")
}
addElem("dash-postsperday", "", p.GetTmplPhrasef("panel_dashboard_posts", postCount, postInterval), 6, "grid_stat "+postColour, "", "", p.GetTmplPhrase("panel_dashboard_posts_desc"))
addElem("dash-topicsperday", "", p.GetTmplPhrasef("panel_dashboard_topics", topicCount, topicInterval), 7, "grid_stat "+topicColour, "", "", p.GetTmplPhrase("panel_dashboard_topics_desc"))
addElem("dash-totonlineperday", "", p.GetTmplPhrasef("panel_dashboard_online_day"), 8, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*, "The people online over the last 24 hours"*/)
addElem("dash-postsperday", "",p.GetTmplPhrasef("panel_dashboard_posts", postCount, postInterval), 6, "grid_stat " + postColour, "", "", p.GetTmplPhrase("panel_dashboard_posts_desc"))
addElem("dash-topicsperday", "",p.GetTmplPhrasef("panel_dashboard_topics", topicCount, topicInterval), 7, "grid_stat " + topicColour, "", "", p.GetTmplPhrase("panel_dashboard_topics_desc"))
addElem("dash-totonlineperday","", p.GetTmplPhrasef("panel_dashboard_online_day"), 8, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*, "The people online over the last 24 hours"*/)
addElem("dash-searches", "", p.GetTmplPhrasef("panel_dashboard_searches_day"), 9, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The number of searches over the last 7 days"*/)
addElem("dash-newusers", "", p.GetTmplPhrasef("panel_dashboard_new_users", newUserCount, newUserInterval), 10, "grid_stat", "", "", p.GetTmplPhrasef("panel_dashboard_new_users_desc"))
addElem("dash-reports", "", p.GetTmplPhrasef("panel_dashboard_reports", reportCount, reportInterval), 11, "grid_stat", "", "", p.GetTmplPhrasef("panel_dashboard_reports_desc"))
addElem("dash-searches","", p.GetTmplPhrasef("panel_dashboard_searches_day"), 9, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The number of searches over the last 7 days"*/)
addElem("dash-newusers","", p.GetTmplPhrasef("panel_dashboard_new_users", newUserCount, newUserInterval), 10, "grid_stat", "", "", p.GetTmplPhrasef("panel_dashboard_new_users_desc"))
addElem("dash-reports","", p.GetTmplPhrasef("panel_dashboard_reports", reportCount, reportInterval), 11, "grid_stat", "", "", p.GetTmplPhrasef("panel_dashboard_reports_desc"))
if false {
addElem("dash-minperuser", "", "?? minutes / user / week", 12, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of number of minutes spent by each active user over the last 7 days"*/)
addElem("dash-visitorsperweek", "", "?? visitors / week", 13, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The number of unique visitors we've had over the last 7 days"*/)
addElem("dash-postsperuser", "", "?? posts / user / week", 14, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of posts made by each active user over the past week"*/)
addElem("dash-minperuser","", "?? minutes / user / week", 12, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of number of minutes spent by each active user over the last 7 days"*/)
addElem("dash-visitorsperweek","", "?? visitors / week", 13, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The number of unique visitors we've had over the last 7 days"*/)
addElem("dash-postsperuser","", "?? posts / user / week", 14, "grid_stat stat_disabled", "", "", p.GetTmplPhrase("panel_dashboard_coming_soon") /*"The average number of posts made by each active user over the past week"*/)
}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_dashboard_right", "", "panel_dashboard", c.DashGrids{grid1, gridElements}})
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_dashboard_right","","panel_dashboard", c.DashGrids{grid1,gridElements}})
}
type dirSize struct {
@ -247,21 +247,19 @@ type dirSize struct {
}
func init() {
cachedDirSize.Store(dirSize{0, time.Now()})
cachedDirSize.Store(dirSize{0,time.Now()})
}
var cachedDirSize atomic.Value
var dstMu sync.Mutex
var dstMuGuess = 0
func startDirSizeTask() {
if dstMuGuess == 1 {
if dstMuGuess==1 {
return
}
dstMu.Lock()
dstMuGuess = 1
go func() {
defer func() {
defer func () {
dstMuGuess = 0
dstMu.Unlock()
}()
@ -269,7 +267,7 @@ func startDirSizeTask() {
if err != nil {
c.LogWarning(err)
}
cachedDirSize.Store(dirSize{dDirSize, time.Now()})
cachedDirSize.Store(dirSize{dDirSize,time.Now()})
}()
}
@ -281,13 +279,13 @@ type StatsDiskJson struct {
Total string `json:"total"`
}
func StatsDisk(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func StatsDisk(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
dirSize := getDirSize()
dirFloat, unit := c.ConvertByteUnit(float64(dirSize.Size))
u := p.GetTmplPhrasef("unit", dirFloat, unit)
oBytes, err := json.Marshal(StatsDiskJson{u})
if err != nil {
return c.InternalErrorJS(err, w, r)
return c.InternalErrorJS(err,w,r)
}
w.Write(oBytes)
return nil

View File

@ -7,11 +7,11 @@ import (
"time"
c "github.com/Azareal/Gosora/common"
qgen "github.com/Azareal/Gosora/query_gen"
"github.com/Azareal/Gosora/query_gen"
)
func Debug(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "debug", "debug")
func Debug(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "debug", "debug")
if ferr != nil {
return ferr
}
@ -45,7 +45,7 @@ func Debug(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
goroutines := runtime.NumGoroutine()
cpus := runtime.NumCPU()
debugTasks := c.DebugPageTasks{c.ScheduledHalfSecondTaskCount(), c.ScheduledSecondTaskCount(), c.ScheduledFifteenMinuteTaskCount(), c.ScheduledHourTaskCount(), c.ShutdownTaskCount()}
debugTasks := c.DebugPageTasks{c.ScheduledHalfSecondTaskCount(),c.ScheduledSecondTaskCount(),c.ScheduledFifteenMinuteTaskCount(),c.ScheduledHourTaskCount(),c.ShutdownTaskCount()}
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
@ -99,10 +99,10 @@ func Debug(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
postChunks := count("postchunks")
topicChunks := count("topicchunks")
if fErr != nil {
return c.InternalError(fErr, w, r)
return c.InternalError(fErr,w,r)
}
debugDatabase := c.DebugPageDatabase{c.Topics.Count(), c.Users.Count(), c.Rstore.Count(), c.Prstore.Count(), c.Activity.Count(), c.Likes.Count(), attachs, polls, loginLogs, regLogs, modLogs, adminLogs, views, viewsAgents, viewsForums, viewsLangs, viewsReferrers, viewsSystems, postChunks, topicChunks}
debugDatabase := c.DebugPageDatabase{c.Topics.Count(),c.Users.Count(),c.Rstore.Count(),c.Prstore.Count(),c.Activity.Count(),c.Likes.Count(),attachs,polls,loginLogs,regLogs,modLogs,adminLogs,views,viewsAgents,viewsForums,viewsLangs,viewsReferrers,viewsSystems,postChunks,topicChunks}
dirSize := func(path string) int {
if fErr != nil {
@ -119,13 +119,13 @@ func Debug(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
logsSize := dirSize("./logs/")
backupsSize := dirSize("./backups/")
if fErr != nil {
return c.InternalError(fErr, w, r)
return c.InternalError(fErr,w,r)
}
//gitSize, _ := c.DirSize("./.git")
gitSize := 0
debugDisk := c.DebugPageDisk{staticSize, attachSize, uploadsSize, logsSize, backupsSize, gitSize}
debugDisk := c.DebugPageDisk{staticSize,attachSize,uploadsSize,logsSize,backupsSize,gitSize}
pi := c.PanelDebugPage{basePage, goVersion, dbVersion, uptime, openConnCount, qgen.Builder.GetAdapter().GetName(), goroutines, cpus, debugTasks, memStats, debugCache, debugDatabase, debugDisk}
pi := c.PanelDebugPage{basePage, goVersion, dbVersion, uptime, openConnCount, qgen.Builder.GetAdapter().GetName(), goroutines, cpus,debugTasks, memStats, debugCache, debugDatabase, debugDisk}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_dashboard_right", "debug_page", "panel_debug", pi})
}

View File

@ -11,8 +11,8 @@ import (
p "github.com/Azareal/Gosora/common/phrases"
)
func Forums(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "forums", "forums")
func Forums(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "forums", "forums")
if ferr != nil {
return ferr
}
@ -52,8 +52,8 @@ func Forums(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_forums", &pi})
}
func ForumsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ForumsCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -81,8 +81,8 @@ func ForumsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.
}
// TODO: Revamp this
func ForumsDelete(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "delete_forum", "forums")
func ForumsDelete(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "delete_forum", "forums")
if ferr != nil {
return ferr
}
@ -102,17 +102,17 @@ func ForumsDelete(w http.ResponseWriter, r *http.Request, user *c.User, sfid str
}
confirmMsg := p.GetTmplPhrasef("panel_forum_delete_are_you_sure", forum.Name)
youSure := c.AreYouSure{"/panel/forums/delete/submit/" + strconv.Itoa(fid), confirmMsg}
yousure := c.AreYouSure{"/panel/forums/delete/submit/" + strconv.Itoa(fid), confirmMsg}
pi := c.PanelPage{basePage, tList, youSure}
if c.RunPreRenderHook("pre_render_panel_delete_forum", w, r, user, &pi) {
pi := c.PanelPage{basePage, tList, yousure}
if c.RunPreRenderHook("pre_render_panel_delete_forum", w, r, &user, &pi) {
return nil
}
return renderTemplate("panel_are_you_sure", w, r, basePage.Header, &pi)
}
func ForumsDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ForumsDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -139,8 +139,8 @@ func ForumsDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sf
return nil
}
func ForumsOrderSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ForumsOrderSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -169,8 +169,8 @@ func ForumsOrderSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
return successRedirect("/panel/forums/", w, r, js)
}
func ForumsEdit(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_forum", "forums")
func ForumsEdit(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_forum", "forums")
if ferr != nil {
return ferr
}
@ -222,8 +222,8 @@ func ForumsEdit(w http.ResponseWriter, r *http.Request, user *c.User, sfid strin
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_forum_edit", &pi})
}
func ForumsEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ForumsEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -268,8 +268,8 @@ func ForumsEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid
return successRedirect("/panel/forums/", w, r, js)
}
func ForumsEditPermsSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ForumsEditPermsSubmit(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -328,8 +328,8 @@ func forumPermsExtractDash(paramList string) (fid int, gid int, err error) {
return fid, gid, err
}
func ForumsEditPermsAdvance(w http.ResponseWriter, r *http.Request, user *c.User, paramList string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_forum", "forums")
func ForumsEditPermsAdvance(w http.ResponseWriter, r *http.Request, user c.User, paramList string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_forum", "forums")
if ferr != nil {
return ferr
}
@ -342,14 +342,14 @@ func ForumsEditPermsAdvance(w http.ResponseWriter, r *http.Request, user *c.User
return c.LocalError(err.Error(), w, r, user)
}
f, err := c.Forums.Get(fid)
forum, err := c.Forums.Get(fid)
if err == sql.ErrNoRows {
return c.LocalError("The forum you're trying to edit doesn't exist.", w, r, user)
} else if err != nil {
return c.InternalError(err, w, r)
}
if f.Preset == "" {
f.Preset = "custom"
if forum.Preset == "" {
forum.Preset = "custom"
}
fp, err := c.FPStore.Get(fid, gid)
@ -382,12 +382,12 @@ func ForumsEditPermsAdvance(w http.ResponseWriter, r *http.Request, user *c.User
basePage.AddNotice("panel_forum_perms_updated")
}
pi := c.PanelEditForumGroupPage{basePage, f.ID, gid, f.Name, f.Desc, f.Active, f.Preset, formattedPermList}
pi := c.PanelEditForumGroupPage{basePage, forum.ID, gid, forum.Name, forum.Desc, forum.Active, forum.Preset, formattedPermList}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_forum_edit_perms", &pi})
}
func ForumsEditPermsAdvanceSubmit(w http.ResponseWriter, r *http.Request, user *c.User, paramList string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ForumsEditPermsAdvanceSubmit(w http.ResponseWriter, r *http.Request, user c.User, paramList string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -416,7 +416,7 @@ func ForumsEditPermsAdvanceSubmit(w http.ResponseWriter, r *http.Request, user *
}
extractPerm := func(name string) bool {
pvalue := r.PostFormValue("perm-" + name)
pvalue := r.PostFormValue("forum-perm-" + name)
return (pvalue == "1")
}

View File

@ -10,8 +10,8 @@ import (
p "github.com/Azareal/Gosora/common/phrases"
)
func Groups(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
bPage, ferr := buildBasePage(w, r, u, "groups", "groups")
func Groups(w http.ResponseWriter, r *http.Request, u c.User) c.RouteError {
bPage, ferr := buildBasePage(w, r, &u, "groups", "groups")
if ferr != nil {
return ferr
}
@ -61,8 +61,8 @@ func Groups(w http.ResponseWriter, r *http.Request, u *c.User) c.RouteError {
return renderTemplate("panel", w, r, bPage.Header, c.Panel{bPage, "", "", "panel_groups", &pi})
}
func GroupsEdit(w http.ResponseWriter, r *http.Request, user *c.User, sgid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_group", "groups")
func GroupsEdit(w http.ResponseWriter, r *http.Request, user c.User, sgid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_group", "groups")
if ferr != nil {
return ferr
}
@ -103,8 +103,8 @@ func GroupsEdit(w http.ResponseWriter, r *http.Request, user *c.User, sgid strin
return renderTemplate("panel_group_edit", w, r, basePage.Header, pi)
}
func GroupsEditPromotions(w http.ResponseWriter, r *http.Request, user *c.User, sgid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_group", "groups")
func GroupsEditPromotions(w http.ResponseWriter, r *http.Request, user c.User, sgid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_group", "groups")
if ferr != nil {
return ferr
}
@ -168,22 +168,22 @@ func GroupsEditPromotions(w http.ResponseWriter, r *http.Request, user *c.User,
return renderTemplate("panel_group_edit_promotions", w, r, basePage.Header, pi)
}
func groupCheck(w http.ResponseWriter, r *http.Request, u *c.User, g *c.Group, err error) c.RouteError {
func groupCheck(w http.ResponseWriter, r *http.Request, user c.User, g *c.Group, err error) c.RouteError {
if err == sql.ErrNoRows {
return c.LocalError("No such group.", w, r, u)
return c.LocalError("No such group.", w, r, user)
} else if err != nil {
return c.InternalError(err, w, r)
}
if g.IsAdmin && !u.Perms.EditGroupAdmin {
return c.LocalError(p.GetErrorPhrase("panel_groups_cannot_edit_admin"), w, r, u)
if g.IsAdmin && !user.Perms.EditGroupAdmin {
return c.LocalError(p.GetErrorPhrase("panel_groups_cannot_edit_admin"), w, r, user)
}
if g.IsMod && !u.Perms.EditGroupSuperMod {
return c.LocalError(p.GetErrorPhrase("panel_groups_cannot_edit_supermod"), w, r, u)
if g.IsMod && !user.Perms.EditGroupSuperMod {
return c.LocalError(p.GetErrorPhrase("panel_groups_cannot_edit_supermod"), w, r, user)
}
return nil
}
func GroupsPromotionsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sgid string) c.RouteError {
func GroupsPromotionsCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User, sgid string) c.RouteError {
if !user.Perms.EditGroup {
return c.NoPermissions(w, r, user)
}
@ -251,7 +251,7 @@ func GroupsPromotionsCreateSubmit(w http.ResponseWriter, r *http.Request, user *
return nil
}
func GroupsPromotionsDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sspl string) c.RouteError {
func GroupsPromotionsDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, sspl string) c.RouteError {
if !user.Perms.EditGroup {
return c.NoPermissions(w, r, user)
}
@ -298,8 +298,8 @@ func GroupsPromotionsDeleteSubmit(w http.ResponseWriter, r *http.Request, user *
return nil
}
func GroupsEditPerms(w http.ResponseWriter, r *http.Request, user *c.User, sgid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_group", "groups")
func GroupsEditPerms(w http.ResponseWriter, r *http.Request, user c.User, sgid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_group", "groups")
if ferr != nil {
return ferr
}
@ -385,8 +385,8 @@ func GroupsEditPerms(w http.ResponseWriter, r *http.Request, user *c.User, sgid
return renderTemplate("panel_group_edit_perms", w, r, basePage.Header, pi)
}
func GroupsEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sgid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func GroupsEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, sgid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -471,8 +471,8 @@ func GroupsEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sgid
return nil
}
func GroupsEditPermsSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sgid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func GroupsEditPermsSubmit(w http.ResponseWriter, r *http.Request, user c.User, sgid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -520,8 +520,8 @@ func GroupsEditPermsSubmit(w http.ResponseWriter, r *http.Request, user *c.User,
return nil
}
func GroupsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func GroupsCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -529,32 +529,32 @@ func GroupsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.
return c.NoPermissions(w, r, user)
}
name := r.PostFormValue("name")
if name == "" {
groupName := r.PostFormValue("name")
if groupName == "" {
return c.LocalError(p.GetErrorPhrase("panel_groups_need_name"), w, r, user)
}
tag := r.PostFormValue("tag")
groupTag := r.PostFormValue("tag")
var admin, mod, banned bool
var isAdmin, isMod, isBanned bool
if user.Perms.EditGroupGlobalPerms {
switch r.PostFormValue("type") {
case "Admin":
if !user.Perms.EditGroupAdmin {
return c.LocalError(p.GetErrorPhrase("panel_groups_create_cannot_designate_admin"), w, r, user)
}
admin = true
mod = true
isAdmin = true
isMod = true
case "Mod":
if !user.Perms.EditGroupSuperMod {
return c.LocalError(p.GetErrorPhrase("panel_groups_create_cannot_designate_supermod"), w, r, user)
}
mod = true
isMod = true
case "Banned":
banned = true
isBanned = true
}
}
gid, err := c.Groups.Create(name, tag, admin, mod, banned)
gid, err := c.Groups.Create(groupName, groupTag, isAdmin, isMod, isBanned)
if err != nil {
return c.InternalError(err, w, r)
}

View File

@ -12,8 +12,8 @@ import (
)
// TODO: Link the usernames for successful registrations to the profiles
func LogsRegs(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "registration_logs", "logs")
func LogsRegs(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "registration_logs", "logs")
if ferr != nil {
return ferr
}
@ -168,8 +168,8 @@ func adminlogsElementType(action, elementType string, elementID int, actor *c.Us
return out
}
func LogsMod(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "mod_logs", "logs")
func LogsMod(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "mod_logs", "logs")
if ferr != nil {
return ferr
}
@ -193,8 +193,8 @@ func LogsMod(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_modlogs", pi})
}
func LogsAdmin(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "admin_logs", "logs")
func LogsAdmin(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "admin_logs", "logs")
if ferr != nil {
return ferr
}

View File

@ -8,11 +8,12 @@ import (
c "github.com/Azareal/Gosora/common"
)
func Pages(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "pages", "pages")
func Pages(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "pages", "pages")
if ferr != nil {
return ferr
}
if r.FormValue("created") == "1" {
basePage.AddNotice("panel_page_created")
} else if r.FormValue("deleted") == "1" {
@ -35,8 +36,8 @@ func Pages(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_page_list", "", "panel_pages", &pi})
}
func PagesCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func PagesCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -71,8 +72,8 @@ func PagesCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
return nil
}
func PagesEdit(w http.ResponseWriter, r *http.Request, user *c.User, spid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "pages_edit", "pages")
func PagesEdit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "pages_edit", "pages")
if ferr != nil {
return ferr
}
@ -95,8 +96,8 @@ func PagesEdit(w http.ResponseWriter, r *http.Request, user *c.User, spid string
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_page_edit", "", "panel_pages_edit", &pi})
}
func PagesEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, spid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func PagesEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -138,8 +139,8 @@ func PagesEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, spid
return nil
}
func PagesDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, spid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func PagesDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}

View File

@ -8,8 +8,8 @@ import (
c "github.com/Azareal/Gosora/common"
)
func Plugins(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "plugins", "plugins")
func Plugins(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "plugins", "plugins")
if ferr != nil {
return ferr
}
@ -26,8 +26,8 @@ func Plugins(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError
}
// TODO: Abstract more of the plugin activation / installation / deactivation logic, so we can test all that more reliably and easily
func PluginsActivate(w http.ResponseWriter, r *http.Request, user *c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func PluginsActivate(w http.ResponseWriter, r *http.Request, user c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -82,8 +82,8 @@ func PluginsActivate(w http.ResponseWriter, r *http.Request, user *c.User, uname
return nil
}
func PluginsDeactivate(w http.ResponseWriter, r *http.Request, user *c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func PluginsDeactivate(w http.ResponseWriter, r *http.Request, user c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -120,8 +120,8 @@ func PluginsDeactivate(w http.ResponseWriter, r *http.Request, user *c.User, una
return nil
}
func PluginsInstall(w http.ResponseWriter, r *http.Request, user *c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func PluginsInstall(w http.ResponseWriter, r *http.Request, user c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}

View File

@ -10,8 +10,8 @@ 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, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "settings", "settings")
if ferr != nil {
return ferr
}
@ -54,8 +54,8 @@ func Settings(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_settings", &pi})
}
func SettingEdit(w http.ResponseWriter, r *http.Request, user *c.User, sname string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_setting", "settings")
func SettingEdit(w http.ResponseWriter, r *http.Request, user c.User, sname string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_setting", "settings")
if ferr != nil {
return ferr
}
@ -93,8 +93,8 @@ func SettingEdit(w http.ResponseWriter, r *http.Request, user *c.User, sname str
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_setting", &pi})
}
func SettingEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, name string) c.RouteError {
headerLite, ferr := c.SimplePanelUserCheck(w, r, user)
func SettingEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, name string) c.RouteError {
headerLite, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}

View File

@ -12,8 +12,8 @@ import (
p "github.com/Azareal/Gosora/common/phrases"
)
func Themes(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "themes", "themes")
func Themes(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "themes", "themes")
if ferr != nil {
return ferr
}
@ -37,8 +37,8 @@ func Themes(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_themes", "", "panel_themes", &pi})
}
func ThemesSetDefault(w http.ResponseWriter, r *http.Request, user *c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ThemesSetDefault(w http.ResponseWriter, r *http.Request, user c.User, uname string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -67,8 +67,8 @@ func ThemesSetDefault(w http.ResponseWriter, r *http.Request, user *c.User, unam
return nil
}
func ThemesMenus(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "themes_menus", "themes")
func ThemesMenus(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "themes_menus", "themes")
if ferr != nil {
return ferr
}
@ -92,9 +92,9 @@ func ThemesMenus(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteEr
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_themes_menus", &c.PanelMenuListPage{basePage, menuList}})
}
func ThemesMenusEdit(w http.ResponseWriter, r *http.Request, user *c.User, smid string) c.RouteError {
func ThemesMenusEdit(w http.ResponseWriter, r *http.Request, user c.User, smid string) c.RouteError {
// TODO: Something like Menu #1 for the title?
basePage, ferr := buildBasePage(w, r, user, "themes_menus_edit", "themes")
basePage, ferr := buildBasePage(w, r, &user, "themes_menus_edit", "themes")
if ferr != nil {
return ferr
}
@ -138,9 +138,9 @@ func ThemesMenusEdit(w http.ResponseWriter, r *http.Request, user *c.User, smid
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_themes_menus_items", &c.PanelMenuPage{basePage, mid, menuList}})
}
func ThemesMenuItemEdit(w http.ResponseWriter, r *http.Request, user *c.User, sitemID string) c.RouteError {
func ThemesMenuItemEdit(w http.ResponseWriter, r *http.Request, user c.User, sitemID string) c.RouteError {
// TODO: Something like Menu #1 for the title?
basePage, ferr := buildBasePage(w, r, user, "themes_menus_edit", "themes")
basePage, ferr := buildBasePage(w, r, &user, "themes_menus_edit", "themes")
if ferr != nil {
return ferr
}
@ -205,8 +205,8 @@ func themesMenuItemSetters(r *http.Request, i c.MenuItem) c.MenuItem {
return i
}
func ThemesMenuItemEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sitemID string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ThemesMenuItemEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, sitemID string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -219,6 +219,7 @@ func ThemesMenuItemEditSubmit(w http.ResponseWriter, r *http.Request, user *c.Us
if err != nil {
return c.LocalErrorJSQ(p.GetErrorPhrase("id_must_be_integer"), w, r, user, js)
}
menuItem, err := c.Menus.ItemStore().Get(itemID)
if err == sql.ErrNoRows {
return c.LocalErrorJSQ("This item doesn't exist.", w, r, user, js)
@ -240,8 +241,8 @@ func ThemesMenuItemEditSubmit(w http.ResponseWriter, r *http.Request, user *c.Us
return successRedirect("/panel/themes/menus/item/edit/"+strconv.Itoa(itemID), w, r, js)
}
func ThemesMenuItemCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ThemesMenuItemCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -273,8 +274,8 @@ func ThemesMenuItemCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.
return successRedirect("/panel/themes/menus/item/edit/"+strconv.Itoa(itemID), w, r, js)
}
func ThemesMenuItemDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sitemID string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ThemesMenuItemDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, sitemID string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -307,8 +308,8 @@ func ThemesMenuItemDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.
return successRedirect("/panel/themes/menus/", w, r, js)
}
func ThemesMenuItemOrderSubmit(w http.ResponseWriter, r *http.Request, user *c.User, smid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ThemesMenuItemOrderSubmit(w http.ResponseWriter, r *http.Request, user c.User, smid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -349,8 +350,8 @@ func ThemesMenuItemOrderSubmit(w http.ResponseWriter, r *http.Request, user *c.U
return successRedirect("/panel/themes/menus/edit/"+strconv.Itoa(mid), w, r, js)
}
func ThemesWidgets(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "themes_widgets", "themes")
func ThemesWidgets(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "themes_widgets", "themes")
if ferr != nil {
return ferr
}
@ -414,9 +415,9 @@ func widgetsParseInputs(r *http.Request, widget *c.Widget) (*c.WidgetEdit, error
}
// ThemesWidgetsEditSubmit is an action which is triggered when someone sends an update request for a widget
func ThemesWidgetsEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, swid string) c.RouteError {
func ThemesWidgetsEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, swid string) c.RouteError {
//fmt.Println("in ThemesWidgetsEditSubmit")
_, ferr := c.SimplePanelUserCheck(w, r, user)
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -454,9 +455,9 @@ func ThemesWidgetsEditSubmit(w http.ResponseWriter, r *http.Request, user *c.Use
}
// ThemesWidgetsCreateSubmit is an action which is triggered when someone sends a create request for a widget
func ThemesWidgetsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func ThemesWidgetsCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
js := r.PostFormValue("js") == "1"
_, ferr := c.SimplePanelUserCheck(w, r, user)
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -468,6 +469,7 @@ func ThemesWidgetsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.U
if err != nil {
return c.LocalErrorJSQ(err.Error(), w, r, user, js)
}
wid, err := ewidget.Create()
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
@ -480,8 +482,8 @@ func ThemesWidgetsCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.U
return successRedirect("/panel/themes/widgets/", w, r, js)
}
func ThemesWidgetsDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, swid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func ThemesWidgetsDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, swid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -500,6 +502,7 @@ func ThemesWidgetsDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.U
} else if err != nil {
return c.InternalError(err, w, r)
}
err = widget.Delete()
if err != nil {
return c.InternalError(err, w, r)

View File

@ -8,8 +8,8 @@ import (
c "github.com/Azareal/Gosora/common"
)
func Users(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "users", "users")
func Users(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "users", "users")
if ferr != nil {
return ferr
}
@ -27,8 +27,8 @@ func Users(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_users", &pi})
}
func UsersEdit(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_user", "users")
func UsersEdit(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_user", "users")
if ferr != nil {
return ferr
}
@ -76,8 +76,8 @@ func UsersEdit(w http.ResponseWriter, r *http.Request, user *c.User, suid string
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_user_edit", &pi})
}
func UsersEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func UsersEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -183,8 +183,8 @@ func UsersEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid
return nil
}
func UsersAvatarSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func UsersAvatarSubmit(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -211,7 +211,7 @@ func UsersAvatarSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sui
if ferr != nil {
return ferr
}
ferr = c.ChangeAvatar("."+ext, w, r, targetUser)
ferr = c.ChangeAvatar("."+ext, w, r, *targetUser)
if ferr != nil {
return ferr
}
@ -234,8 +234,8 @@ func UsersAvatarSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sui
return nil
}
func UsersAvatarRemoveSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func UsersAvatarRemoveSubmit(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -256,7 +256,7 @@ func UsersAvatarRemoveSubmit(w http.ResponseWriter, r *http.Request, user *c.Use
if targetUser.IsAdmin && !user.IsAdmin {
return c.LocalError("Only administrators can edit the account of other administrators.", w, r, user)
}
ferr = c.ChangeAvatar("", w, r, targetUser)
ferr = c.ChangeAvatar("", w, r, *targetUser)
if ferr != nil {
return ferr
}

View File

@ -10,8 +10,8 @@ import (
c "github.com/Azareal/Gosora/common"
)
func WordFilters(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "word_filters", "word-filters")
func WordFilters(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "word_filters", "word-filters")
if ferr != nil {
return ferr
}
@ -29,8 +29,8 @@ func WordFilters(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteEr
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_word_filters", &pi})
}
func WordFiltersCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func WordFiltersCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -61,8 +61,8 @@ func WordFiltersCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.Use
}
// TODO: Implement this as a non-JS fallback
func WordFiltersEdit(w http.ResponseWriter, r *http.Request, user *c.User, wfid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, user, "edit_word_filter", "word-filters")
func WordFiltersEdit(w http.ResponseWriter, r *http.Request, user c.User, wfid string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_word_filter", "word-filters")
if ferr != nil {
return ferr
}
@ -75,8 +75,8 @@ func WordFiltersEdit(w http.ResponseWriter, r *http.Request, user *c.User, wfid
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "", "", "panel_word_filters_edit", &pi})
}
func WordFiltersEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, swfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func WordFiltersEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, swfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -120,8 +120,8 @@ func WordFiltersEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User,
return nil
}
func WordFiltersDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, swfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, user)
func WordFiltersDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, swfid string) c.RouteError {
_, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}

View File

@ -10,7 +10,7 @@ import (
qgen "github.com/Azareal/Gosora/query_gen"
)
func PollVote(w http.ResponseWriter, r *http.Request, user *c.User, sPollID string) c.RouteError {
func PollVote(w http.ResponseWriter, r *http.Request, user c.User, sPollID string) c.RouteError {
pollID, err := strconv.Atoi(sPollID)
if err != nil {
return c.PreError("The provided PollID is not a valid number.", w, r)
@ -44,7 +44,7 @@ func PollVote(w http.ResponseWriter, r *http.Request, user *c.User, sPollID stri
}
// TODO: Add hooks to make use of headerLite
_, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
_, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -65,7 +65,7 @@ func PollVote(w http.ResponseWriter, r *http.Request, user *c.User, sPollID stri
return nil
}
func PollResults(w http.ResponseWriter, r *http.Request, user *c.User, sPollID string) c.RouteError {
func PollResults(w http.ResponseWriter, r *http.Request, user c.User, sPollID string) c.RouteError {
//log.Print("in PollResults")
pollID, err := strconv.Atoi(sPollID)
if err != nil {

View File

@ -27,7 +27,7 @@ func init() {
}
// TODO: Remove the View part of the name?
func ViewProfile(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header) c.RouteError {
func ViewProfile(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError {
var reCreatedAt time.Time
var reContent, reCreatedByName, reAvatar string
var rid, reCreatedBy, reLastEdit, reLastEditBy, reGroup int
@ -48,7 +48,7 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user *c.User, header *c
var puser *c.User
if pid == user.ID {
user.IsMod = true
puser = user
puser = &user
} else {
// Fetch the user data
// TODO: Add a shared function for checking for ErrNoRows and internal erroring if it's not that case?
@ -77,7 +77,7 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user *c.User, header *c
reLiked := false
reLikeCount := 0
ru := &c.ReplyUser{Reply: c.Reply{rid, puser.ID, reContent, reCreatedBy, reGroup, reCreatedAt, reLastEdit, reLastEditBy, 0, "", reLiked, reLikeCount, 0, ""}, ContentHtml: c.ParseMessage(reContent, 0, "", user.ParseSettings, user), CreatedByName: reCreatedByName, Avatar: reAvatar, Level: 0}
ru := &c.ReplyUser{Reply: c.Reply{rid, puser.ID, reContent, reCreatedBy, reGroup, reCreatedAt, reLastEdit, reLastEditBy, 0, "", reLiked, reLikeCount, 0, ""}, ContentHtml: c.ParseMessage(reContent, 0, "", user.ParseSettings, &user), CreatedByName: reCreatedByName, Avatar: reAvatar, Level: 0}
_, err = ru.Init()
if err != nil {
return c.InternalError(err, w, r)

View File

@ -9,7 +9,7 @@ import (
"github.com/Azareal/Gosora/common/counters"
)
func ProfileReplyCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func ProfileReplyCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
if !user.Perms.CreateProfileReply {
return c.NoPermissions(w, r, user)
}
@ -44,8 +44,8 @@ func ProfileReplyCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.Us
return c.InternalError(err, w, r)
}
// ! Be careful about leaking per-route permission state with user ptr
alert := c.Alert{ActorID: user.ID, TargetUserID: profileOwner.ID, Event: "reply", ElementType: "user", ElementID: profileOwner.ID, Actor: user, Extra: strconv.Itoa(prid)}
// ! Be careful about leaking per-route permission state with &user
alert := c.Alert{ActorID: user.ID, TargetUserID: profileOwner.ID, Event: "reply", ElementType: "user", ElementID: profileOwner.ID, Actor: &user, Extra: strconv.Itoa(prid)}
err = c.AddActivityAndNotifyTarget(alert)
if err != nil {
return c.InternalError(err, w, r)
@ -56,7 +56,7 @@ func ProfileReplyCreateSubmit(w http.ResponseWriter, r *http.Request, user *c.Us
return nil
}
func ProfileReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid string) c.RouteError {
func ProfileReplyEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
js := r.PostFormValue("js") == "1"
rid, err := strconv.Atoi(srid)
if err != nil {
@ -97,7 +97,7 @@ func ProfileReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User
return nil
}
func ProfileReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid string) c.RouteError {
func ProfileReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
js := r.PostFormValue("js") == "1"
rid, err := strconv.Atoi(srid)
if err != nil {

View File

@ -34,7 +34,7 @@ type JsonReply struct {
Content string
}
func CreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func CreateReplySubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
// TODO: Use this
js := r.FormValue("js") == "1"
tid, err := strconv.Atoi(r.PostFormValue("tid"))
@ -50,7 +50,7 @@ func CreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -185,14 +185,14 @@ func CreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
}
counters.PostCounter.Bump()
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_reply", reply.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
prid, _ := strconv.Atoi(r.FormValue("prid"))
if js && (prid == 0 || rids[0] == prid) {
outBytes, err := json.Marshal(JsonReply{c.ParseMessage(reply.Content, topic.ParentID, "forums", user.ParseSettings, user)})
outBytes, err := json.Marshal(JsonReply{c.ParseMessage(reply.Content, topic.ParentID, "forums", user.ParseSettings, &user)})
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
@ -209,7 +209,7 @@ func CreateReplySubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
// TODO: Disable stat updates in posts handled by plugin_guilds
// TODO: Update the stats after edits so that we don't under or over decrement stats during deletes
func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid string) c.RouteError {
func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
js := r.PostFormValue("js") == "1"
rid, err := strconv.Atoi(srid)
if err != nil {
@ -231,7 +231,7 @@ func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -257,7 +257,7 @@ func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_reply", reply.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -265,7 +265,7 @@ func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
if !js {
http.Redirect(w, r, "/topic/"+strconv.Itoa(topic.ID)+"#reply-"+strconv.Itoa(rid), http.StatusSeeOther)
} else {
outBytes, err := json.Marshal(JsonReply{c.ParseMessage(reply.Content, topic.ParentID, "forums", user.ParseSettings, user)})
outBytes, err := json.Marshal(JsonReply{c.ParseMessage(reply.Content, topic.ParentID, "forums", user.ParseSettings, &user)})
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
@ -277,7 +277,7 @@ func ReplyEditSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
// TODO: Refactor this
// TODO: Disable stat updates in posts handled by plugin_guilds
func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid string) c.RouteError {
func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
js := r.PostFormValue("js") == "1"
rid, err := strconv.Atoi(srid)
if err != nil {
@ -290,6 +290,7 @@ func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sri
} else if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
topic, err := c.Topics.Get(reply.ParentID)
if err == sql.ErrNoRows {
return c.PreErrorJSQ("The parent topic doesn't exist.", w, r, js)
@ -298,7 +299,7 @@ func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sri
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -311,7 +312,7 @@ func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sri
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_reply", reply.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -344,7 +345,7 @@ func ReplyDeleteSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sri
// TODO: Avoid uploading this again if the attachment already exists? They'll resolve to the same hash either way, but we could save on some IO / bandwidth here
// TODO: Enforce the max request limit on all of this topic's attachments
// TODO: Test this route
func AddAttachToReplySubmit(w http.ResponseWriter, r *http.Request, u *c.User, srid string) c.RouteError {
func AddAttachToReplySubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
rid, err := strconv.Atoi(srid)
if err != nil {
return c.LocalErrorJS(p.GetErrorPhrase("id_must_be_integer"), w, r)
@ -362,19 +363,19 @@ func AddAttachToReplySubmit(w http.ResponseWriter, r *http.Request, u *c.User, s
return c.NotFoundJS(w, r)
}
lite, ferr := c.SimpleForumUserCheck(w, r, u, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
if !u.Perms.ViewTopic || !u.Perms.EditReply || !u.Perms.UploadFiles {
return c.NoPermissionsJS(w, r, u)
if !user.Perms.ViewTopic || !user.Perms.EditReply || !user.Perms.UploadFiles {
return c.NoPermissionsJS(w, r, user)
}
if topic.IsClosed && !u.Perms.CloseTopic {
return c.NoPermissionsJS(w, r, u)
if topic.IsClosed && !user.Perms.CloseTopic {
return c.NoPermissionsJS(w, r, user)
}
// Handle the file attachments
pathMap, rerr := uploadAttachment(w, r, u, topic.ParentID, "forums", rid, "replies", strconv.Itoa(topic.ID))
pathMap, rerr := uploadAttachment(w, r, user, topic.ParentID, "forums", rid, "replies", strconv.Itoa(topic.ID))
if rerr != nil {
// TODO: This needs to be a JS error...
return rerr
@ -383,7 +384,7 @@ func AddAttachToReplySubmit(w http.ResponseWriter, r *http.Request, u *c.User, s
return c.InternalErrorJS(errors.New("no paths for attachment add"), w, r)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_add_attach_to_reply", reply.ID, u)
skip, rerr := lite.Hooks.VhookSkippable("action_end_add_attach_to_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -401,7 +402,7 @@ func AddAttachToReplySubmit(w http.ResponseWriter, r *http.Request, u *c.User, s
}
// TODO: Reduce the amount of duplication between this and RemoveAttachFromTopicSubmit
func RemoveAttachFromReplySubmit(w http.ResponseWriter, r *http.Request, u *c.User, srid string) c.RouteError {
func RemoveAttachFromReplySubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
rid, err := strconv.Atoi(srid)
if err != nil {
return c.LocalErrorJS(p.GetErrorPhrase("id_must_be_integer"), w, r)
@ -419,15 +420,15 @@ func RemoveAttachFromReplySubmit(w http.ResponseWriter, r *http.Request, u *c.Us
return c.NotFoundJS(w, r)
}
lite, ferr := c.SimpleForumUserCheck(w, r, u, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
if !u.Perms.ViewTopic || !u.Perms.EditReply {
return c.NoPermissionsJS(w, r, u)
if !user.Perms.ViewTopic || !user.Perms.EditReply {
return c.NoPermissionsJS(w, r, user)
}
if topic.IsClosed && !u.Perms.CloseTopic {
return c.NoPermissionsJS(w, r, u)
if topic.IsClosed && !user.Perms.CloseTopic {
return c.NoPermissionsJS(w, r, user)
}
saids := strings.Split(r.PostFormValue("aids"), ",")
@ -439,14 +440,14 @@ func RemoveAttachFromReplySubmit(w http.ResponseWriter, r *http.Request, u *c.Us
if err != nil {
return c.LocalErrorJS(p.GetErrorPhrase("id_must_be_integer"), w, r)
}
rerr := deleteAttachment(w, r, u, aid, true)
rerr := deleteAttachment(w, r, user, aid, true)
if rerr != nil {
// TODO: This needs to be a JS error...
return rerr
}
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_remove_attach_from_reply", reply.ID, u)
skip, rerr := lite.Hooks.VhookSkippable("action_end_remove_attach_from_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -455,7 +456,7 @@ func RemoveAttachFromReplySubmit(w http.ResponseWriter, r *http.Request, u *c.Us
return nil
}
func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid string) c.RouteError {
func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
js := r.PostFormValue("js") == "1"
rid, err := strconv.Atoi(srid)
if err != nil {
@ -477,7 +478,7 @@ func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -502,14 +503,14 @@ func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
return c.InternalErrorJSQ(err, w, r, js)
}
// ! Be careful about leaking per-route permission state with user ptr
alert := c.Alert{ActorID: user.ID, TargetUserID: reply.CreatedBy, Event: "like", ElementType: "post", ElementID: rid, Actor: user}
// ! Be careful about leaking per-route permission state with &user
alert := c.Alert{ActorID: user.ID, TargetUserID: reply.CreatedBy, Event: "like", ElementType: "post", ElementID: rid, Actor: &user}
err = c.AddActivityAndNotifyTarget(alert)
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_like_reply", reply.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_like_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -522,7 +523,7 @@ func ReplyLikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid
return nil
}
func ReplyUnlikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, srid string) c.RouteError {
func ReplyUnlikeSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid string) c.RouteError {
js := r.PostFormValue("js") == "1"
rid, err := strconv.Atoi(srid)
if err != nil {
@ -544,7 +545,7 @@ func ReplyUnlikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sri
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -577,7 +578,7 @@ func ReplyUnlikeSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sri
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_unlike_reply", reply.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_unlike_reply", reply.ID, &user)
if skip || rerr != nil {
return rerr
}

View File

@ -9,8 +9,8 @@ import (
"github.com/Azareal/Gosora/common/counters"
)
func ReportSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sItemID string) c.RouteError {
headerLite, ferr := c.SimpleUserCheck(w, r, user)
func ReportSubmit(w http.ResponseWriter, r *http.Request, user c.User, sItemID string) c.RouteError {
headerLite, ferr := c.SimpleUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
@ -85,7 +85,7 @@ func ReportSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sItemID
return c.InternalError(err, w, r)
}
title = "Convo: " + user.Name
title = "Convo Post: " + user.Name
content = post.Body + "\n\nOriginal Post: #cpid-" + strconv.Itoa(itemID)
default:
_, hasHook := headerLite.Hooks.VhookNeedHook("report_preassign", &itemID, &itemType)
@ -98,7 +98,7 @@ func ReportSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sItemID
}
// TODO: Repost attachments in the reports forum, so that the mods can see them
_, err = c.Reports.Create(title, content, user, itemType, itemID)
_, err = c.Reports.Create(title, content, &user, itemType, itemID)
if err == c.ErrAlreadyReported {
return c.LocalError("Someone has already reported this!", w, r, user)
}

View File

@ -44,7 +44,7 @@ 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, header *c.Header, urlBit string) c.RouteError {
page, _ := strconv.Atoi(r.FormValue("page"))
_, tid, err := ParseSEOURL(urlBit)
if err != nil {
@ -52,14 +52,14 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
}
// Get the topic...
topic, err := c.GetTopicUser(user, tid)
topic, err := c.GetTopicUser(&user, tid)
if err == sql.ErrNoRows {
return c.NotFound(w, r, nil) // TODO: Can we add a simplified invocation of header here? This is likely to be an extremely common NotFound
} else if err != nil {
return c.InternalError(err, w, r)
}
ferr := c.ForumUserCheck(header, w, r, user, topic.ParentID)
ferr := c.ForumUserCheck(header, w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -92,7 +92,7 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
}
// TODO: Cache ContentHTML when possible?
topic.ContentHTML = c.ParseMessage(topic.Content, topic.ParentID, "forums", parseSettings, user)
topic.ContentHTML = c.ParseMessage(topic.Content, topic.ParentID, "forums", parseSettings, &user)
// TODO: Do this more efficiently by avoiding the allocations entirely in ParseMessage, if there's nothing to do.
if topic.ContentHTML == topic.Content {
topic.ContentHTML = topic.Content
@ -149,7 +149,7 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
if strings.HasPrefix(r.URL.Fragment, "post-") {
pFrag, _ = strconv.Atoi(strings.TrimPrefix(r.URL.Fragment, "post-"))
}
rlist, ogdesc, err := topic.Replies(offset, pFrag, user)
rlist, ogdesc, err := topic.Replies(offset, pFrag, &user)
if err == sql.ErrNoRows {
return c.LocalError("Bad Page. Some of the posts may have been deleted or you got here by directly typing in the page number.", w, r, user)
} else if err != nil {
@ -201,7 +201,7 @@ func ViewTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.H
// TODO: Avoid uploading this again if the attachment already exists? They'll resolve to the same hash either way, but we could save on some IO / bandwidth here
// TODO: Enforce the max request limit on all of this topic's attachments
// TODO: Test this route
func AddAttachToTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid string) c.RouteError {
func AddAttachToTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid string) c.RouteError {
tid, err := strconv.Atoi(stid)
if err != nil {
return c.LocalErrorJS(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
@ -211,7 +211,7 @@ func AddAttachToTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User
return c.NotFoundJS(w, r)
}
_, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
_, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -244,7 +244,7 @@ func AddAttachToTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User
return nil
}
func RemoveAttachFromTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid string) c.RouteError {
func RemoveAttachFromTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid string) c.RouteError {
tid, err := strconv.Atoi(stid)
if err != nil {
return c.LocalErrorJS(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
@ -254,7 +254,7 @@ func RemoveAttachFromTopicSubmit(w http.ResponseWriter, r *http.Request, user *c
return c.NotFoundJS(w, r)
}
_, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
_, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -287,7 +287,7 @@ func RemoveAttachFromTopicSubmit(w http.ResponseWriter, r *http.Request, user *c
// ? - Log username changes and put restrictions on this?
// TODO: Test this
// TODO: Revamp this route
func CreateTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c.Header, sfid string) c.RouteError {
func CreateTopic(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header, sfid string) c.RouteError {
var fid int
var err error
if sfid != "" {
@ -300,7 +300,7 @@ func CreateTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c
fid = c.Config.DefaultForum
}
ferr := c.ForumUserCheck(header, w, r, user, fid)
ferr := c.ForumUserCheck(header, w, r, &user, fid)
if ferr != nil {
return ferr
}
@ -314,7 +314,7 @@ func CreateTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c
// Lock this to the forum being linked?
// Should we always put it in strictmode when it's linked from another forum? Well, the user might end up changing their mind on what forum they want to post in and it would be a hassle, if they had to switch pages, even if it is a single click for many (exc. mobile)
var strict bool
header.Hooks.VhookNoRet("topic_create_pre_loop", w, r, fid, &header, user, &strict)
header.Hooks.VhookNoRet("topic_create_pre_loop", w, r, fid, &header, &user, &strict)
// TODO: Re-add support for plugin_guilds
var forumList []c.Forum
@ -357,13 +357,13 @@ func CreateTopic(w http.ResponseWriter, r *http.Request, user *c.User, header *c
return renderTemplate("create_topic", w, r, header, c.CreateTopicPage{header, forumList, fid})
}
func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.RouteError {
func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
fid, err := strconv.Atoi(r.PostFormValue("board"))
if err != nil {
return c.LocalError(phrases.GetErrorPhrase("id_must_be_integer"), w, r, user)
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, fid)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, fid)
if ferr != nil {
return ferr
}
@ -460,7 +460,7 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
counters.PostCounter.Bump()
counters.TopicCounter.Bump()
// TODO: Pass more data to this hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_topic", tid, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_create_topic", tid, &user)
if skip || rerr != nil {
return rerr
}
@ -469,7 +469,7 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
}
// TODO: Move this function
func uploadFilesWithHash(w http.ResponseWriter, r *http.Request, user *c.User, dir string) (filenames []string, rerr c.RouteError) {
func uploadFilesWithHash(w http.ResponseWriter, r *http.Request, user c.User, dir string) (filenames []string, rerr c.RouteError) {
files, ok := r.MultipartForm.File["upload_files"]
if !ok {
return nil, nil
@ -569,7 +569,7 @@ func uploadFilesWithHash(w http.ResponseWriter, r *http.Request, user *c.User, d
// TODO: Update the stats after edits so that we don't under or over decrement stats during deletes
// TODO: Disable stat updates in posts handled by plugin_guilds
func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid string) c.RouteError {
func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid string) c.RouteError {
js := (r.PostFormValue("js") == "1")
tid, err := strconv.Atoi(stid)
if err != nil {
@ -584,7 +584,7 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -622,7 +622,7 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_topic", topic.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_edit_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -630,7 +630,7 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
if !js {
http.Redirect(w, r, "/topic/"+strconv.Itoa(tid), http.StatusSeeOther)
} else {
outBytes, err := json.Marshal(JsonReply{c.ParseMessage(topic.Content, topic.ParentID, "forums", user.ParseSettings, user)})
outBytes, err := json.Marshal(JsonReply{c.ParseMessage(topic.Content, topic.ParentID, "forums", user.ParseSettings, &user)})
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
@ -641,7 +641,7 @@ func EditTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
// TODO: Add support for soft-deletion and add a permission for hard delete in addition to the usual
// TODO: Disable stat updates in posts handled by plugin_guilds
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
var tids []int
js := false
@ -674,7 +674,7 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -702,7 +702,7 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
}*/
// TODO: Do a bulk delete action hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_topic", topic.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_delete_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -713,7 +713,7 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.R
return nil
}
func StickTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid string) c.RouteError {
func StickTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid string) c.RouteError {
topic, lite, rerr := topicActionPre(stid, "pin", w, r, user)
if rerr != nil {
return rerr
@ -724,7 +724,7 @@ func StickTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
return topicActionPost(topic.Stick(), "stick", w, r, lite, topic, user)
}
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, user 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)
@ -738,22 +738,22 @@ func topicActionPre(stid, action string, w http.ResponseWriter, r *http.Request,
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, u, t.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, t.ParentID)
if ferr != nil {
return nil, nil, ferr
}
return t, lite, nil
}
func topicActionPost(err error, action string, w http.ResponseWriter, r *http.Request, lite *c.HeaderLite, topic *c.Topic, u *c.User) c.RouteError {
func topicActionPost(err error, action string, w http.ResponseWriter, r *http.Request, lite *c.HeaderLite, topic *c.Topic, user c.User) c.RouteError {
if err != nil {
return c.InternalError(err, w, r)
}
err = addTopicAction(action, topic, u)
err = addTopicAction(action, topic, user)
if err != nil {
return c.InternalError(err, w, r)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_"+action+"_topic", topic.ID, u)
skip, rerr := lite.Hooks.VhookSkippable("action_end_"+action+"_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -761,7 +761,7 @@ func topicActionPost(err error, action string, w http.ResponseWriter, r *http.Re
return nil
}
func UnstickTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User, stid string) c.RouteError {
func UnstickTopicSubmit(w http.ResponseWriter, r *http.Request, u c.User, stid string) c.RouteError {
t, lite, rerr := topicActionPre(stid, "unpin", w, r, u)
if rerr != nil {
return rerr
@ -772,7 +772,7 @@ func UnstickTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User, stid
return topicActionPost(t.Unstick(), "unstick", w, r, lite, t, u)
}
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
var tids []int
js := false
@ -805,7 +805,7 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -824,7 +824,7 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
}
// TODO: Do a bulk lock action hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_lock_topic", topic.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_lock_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -836,7 +836,7 @@ func LockTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User) c.Rou
return nil
}
func UnlockTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User, stid string) c.RouteError {
func UnlockTopicSubmit(w http.ResponseWriter, r *http.Request, u c.User, stid string) c.RouteError {
t, lite, rerr := topicActionPre(stid, "unlock", w, r, u)
if rerr != nil {
return rerr
@ -849,7 +849,7 @@ func UnlockTopicSubmit(w http.ResponseWriter, r *http.Request, u *c.User, stid s
// ! JS only route
// TODO: Figure a way to get this route to work without JS
func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid string) c.RouteError {
func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, sfid string) c.RouteError {
fid, err := strconv.Atoi(sfid)
if err != nil {
return c.PreErrorJS(phrases.GetErrorPhrase("id_must_be_integer"), w, r)
@ -877,14 +877,14 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid
}
// TODO: Add hooks to make use of headerLite
_, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
_, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
if !user.Perms.ViewTopic || !user.Perms.MoveTopic {
return c.NoPermissionsJS(w, r, user)
}
lite, ferr := c.SimpleForumUserCheck(w, r, user, fid)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, fid)
if ferr != nil {
return ferr
}
@ -904,7 +904,7 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid
}
// TODO: Do a bulk move action hook?
skip, rerr := lite.Hooks.VhookSkippable("action_end_move_topic", topic.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_move_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -916,7 +916,7 @@ func MoveTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sfid
return nil
}
func addTopicAction(action string, t *c.Topic, u *c.User) error {
func addTopicAction(action string, t *c.Topic, u c.User) error {
err := c.ModLogs.Create(action, t.ID, "topic", u.GetIP(), u.ID)
if err != nil {
return err
@ -925,7 +925,7 @@ func addTopicAction(action string, t *c.Topic, u *c.User) error {
}
// TODO: Refactor this
func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid string) c.RouteError {
func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid string) c.RouteError {
js := r.PostFormValue("js") == "1"
tid, err := strconv.Atoi(stid)
if err != nil {
@ -940,7 +940,7 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -966,14 +966,14 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
return c.InternalErrorJSQ(err, w, r, js)
}
// ! Be careful about leaking per-route permission state with user ptr
alert := c.Alert{ActorID: user.ID, TargetUserID: topic.CreatedBy, Event: "like", ElementType: "topic", ElementID: tid, Actor: user}
// ! Be careful about leaking per-route permission state with &user
alert := c.Alert{ActorID: user.ID, TargetUserID: topic.CreatedBy, Event: "like", ElementType: "topic", ElementID: tid, Actor: &user}
err = c.AddActivityAndNotifyTarget(alert)
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_like_topic", topic.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_like_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -985,7 +985,7 @@ func LikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid
}
return nil
}
func UnlikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, stid string) c.RouteError {
func UnlikeTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid string) c.RouteError {
js := r.PostFormValue("js") == "1"
tid, err := strconv.Atoi(stid)
if err != nil {
@ -1000,7 +1000,7 @@ func UnlikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sti
}
// TODO: Add hooks to make use of headerLite
lite, ferr := c.SimpleForumUserCheck(w, r, user, topic.ParentID)
lite, ferr := c.SimpleForumUserCheck(w, r, &user, topic.ParentID)
if ferr != nil {
return ferr
}
@ -1033,7 +1033,7 @@ func UnlikeTopicSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sti
return c.InternalErrorJSQ(err, w, r, js)
}
skip, rerr := lite.Hooks.VhookSkippable("action_end_unlike_topic", topic.ID, user)
skip, rerr := lite.Hooks.VhookSkippable("action_end_unlike_topic", topic.ID, &user)
if skip || rerr != nil {
return rerr
}

View File

@ -19,20 +19,20 @@ func wsTopicList(topicList []*c.TopicsRow, lastPage int) *c.WsTopicList {
return &c.WsTopicList{wsTopicList, lastPage, 0}
}
func TopicList(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
skip, rerr := h.Hooks.VhookSkippable("route_topic_list_start", w, r, user, h)
func TopicList(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
skip, rerr := h.Hooks.VhookSkippable("route_topic_list_start", w, r, &user, h)
if skip || rerr != nil {
return rerr
}
return TopicListCommon(w, r, user, h, "lastupdated", 0)
}
func TopicListMostViewed(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header) c.RouteError {
func TopicListMostViewed(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header) c.RouteError {
return TopicListCommon(w, r, user, h, "mostviewed", c.TopicListMostViewed)
}
// TODO: Implement search
func TopicListCommon(w http.ResponseWriter, r *http.Request, user *c.User, h *c.Header, torder string, tsorder int) c.RouteError {
func TopicListCommon(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, torder string, tsorder int) c.RouteError {
h.Title = phrases.GetTitlePhrase("topics")
h.Zone = "topics"
h.Path = "/topics/"

View File

@ -9,7 +9,7 @@ import (
c "github.com/Azareal/Gosora/common"
)
func BanUserSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
func BanUserSubmit(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
if !user.Perms.BanUsers {
return c.NoPermissions(w, r, user)
}
@ -93,7 +93,7 @@ func BanUserSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid st
// TODO: Trickle the hookTable down from the router
hTbl := c.GetHookTable()
skip, rerr := hTbl.VhookSkippable("action_end_ban_user", targetUser.ID, user)
skip, rerr := hTbl.VhookSkippable("action_end_ban_user", targetUser.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -102,7 +102,7 @@ func BanUserSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid st
return nil
}
func UnbanUser(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
func UnbanUser(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
if !user.Perms.BanUsers {
return c.NoPermissions(w, r, user)
}
@ -137,7 +137,7 @@ func UnbanUser(w http.ResponseWriter, r *http.Request, user *c.User, suid string
// TODO: Trickle the hookTable down from the router
hTbl := c.GetHookTable()
skip, rerr := hTbl.VhookSkippable("action_end_unban_user", targetUser.ID, user)
skip, rerr := hTbl.VhookSkippable("action_end_unban_user", targetUser.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -146,7 +146,7 @@ func UnbanUser(w http.ResponseWriter, r *http.Request, user *c.User, suid string
return nil
}
func ActivateUser(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
func ActivateUser(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
if !user.Perms.ActivateUsers {
return c.NoPermissions(w, r, user)
}
@ -188,7 +188,7 @@ func ActivateUser(w http.ResponseWriter, r *http.Request, user *c.User, suid str
// TODO: Trickle the hookTable down from the router
hTbl := c.GetHookTable()
skip, rerr := hTbl.VhookSkippable("action_end_activate_user", targetUser.ID, user)
skip, rerr := hTbl.VhookSkippable("action_end_activate_user", targetUser.ID, &user)
if skip || rerr != nil {
return rerr
}
@ -197,7 +197,7 @@ func ActivateUser(w http.ResponseWriter, r *http.Request, user *c.User, suid str
return nil
}
func DeletePostsSubmit(w http.ResponseWriter, r *http.Request, user *c.User, suid string) c.RouteError {
func DeletePostsSubmit(w http.ResponseWriter, r *http.Request, user c.User, suid string) c.RouteError {
if !user.Perms.BanUsers {
return c.NoPermissions(w, r, user)
}
@ -230,7 +230,7 @@ func DeletePostsSubmit(w http.ResponseWriter, r *http.Request, user *c.User, sui
// TODO: Trickle the hookTable down from the router
hTbl := c.GetHookTable()
skip, rerr := hTbl.VhookSkippable("action_end_delete_posts", targetUser.ID, user)
skip, rerr := hTbl.VhookSkippable("action_end_delete_posts", targetUser.ID, &user)
if skip || rerr != nil {
return rerr
}

View File

@ -8,7 +8,7 @@
<div class="formitem">
<a>{{.LangStr}}</a>
<div class="to_right">
<select name="perm-{{.Name}}">
<select name="forum-perm-{{.Name}}">
<option{{if .Toggle}} selected{{end}} value=1>{{lang "option_yes"}}</option>
<option{{if not .Toggle}} selected{{end}} value=0>{{lang "option_no"}}</option>
</select>