Revert "will a pointer make this faster...?"
This reverts commit 8e414486b8
.
This commit is contained in:
parent
8e414486b8
commit
501bcc2425
|
@ -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"))
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
@ -214,7 +214,7 @@ 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,
|
||||
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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!")
|
||||
|
|
18
misc_test.go
18
misc_test.go
|
@ -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
|
||||
|
|
|
@ -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 + `
|
||||
|
|
10
routes.go
10
routes.go
|
@ -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);`)
|
||||
io.WriteString(w, `let hihi = `+innerCode+`;
|
||||
hihi = hihi.replace('ld','Id');
|
||||
eval(hihi);`)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
@ -70,8 +70,8 @@ func dashMSSQLStmts() (stmts dashStmts, err error) {
|
|||
|
||||
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
|
||||
}
|
||||
|
@ -249,11 +249,9 @@ type dirSize struct {
|
|||
func init() {
|
||||
cachedDirSize.Store(dirSize{0,time.Now()})
|
||||
}
|
||||
|
||||
var cachedDirSize atomic.Value
|
||||
var dstMu sync.Mutex
|
||||
var dstMuGuess = 0
|
||||
|
||||
func startDirSizeTask() {
|
||||
if dstMuGuess==1 {
|
||||
return
|
||||
|
@ -281,7 +279,7 @@ 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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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/"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue