2016-12-07 09:34:09 +00:00
|
|
|
package main
|
|
|
|
|
2017-05-11 13:04:43 +00:00
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
// "fmt"
|
|
|
|
"strconv"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"html"
|
|
|
|
"database/sql"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
|
|
)
|
2016-12-07 09:34:09 +00:00
|
|
|
|
|
|
|
func route_edit_topic(w http.ResponseWriter, r *http.Request) {
|
|
|
|
err := r.ParseForm()
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("Bad Form",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
is_js := r.PostFormValue("js")
|
|
|
|
if is_js == "" {
|
|
|
|
is_js = "0"
|
|
|
|
}
|
|
|
|
|
2017-05-11 13:04:43 +00:00
|
|
|
var tid, fid int
|
2016-12-07 09:34:09 +00:00
|
|
|
tid, err = strconv.Atoi(r.URL.Path[len("/topic/edit/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreErrorJSQ("The provided TopicID is not a valid number.",w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-04-02 13:00:40 +00:00
|
|
|
var old_is_closed bool
|
|
|
|
err = db.QueryRow("select parentID, is_closed from topics where tid = ?", tid).Scan(&fid,&old_is_closed)
|
2017-01-31 05:13:38 +00:00
|
|
|
if err == sql.ErrNoRows {
|
2017-02-10 13:39:13 +00:00
|
|
|
PreErrorJSQ("The topic you tried to edit doesn't exist.",w,r,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-05 16:36:54 +00:00
|
|
|
user, ok := SimpleForumSessionCheck(w,r,fid)
|
|
|
|
if !ok {
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-05 16:36:54 +00:00
|
|
|
if !user.Perms.ViewTopic || !user.Perms.EditTopic {
|
2017-01-31 05:13:38 +00:00
|
|
|
NoPermissionsJSQ(w,r,user,is_js)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
topic_name := r.PostFormValue("topic_name")
|
|
|
|
topic_status := r.PostFormValue("topic_status")
|
2017-01-12 02:55:08 +00:00
|
|
|
is_closed := (topic_status == "closed")
|
2016-12-07 09:34:09 +00:00
|
|
|
|
|
|
|
topic_content := html.EscapeString(r.PostFormValue("topic_content"))
|
2016-12-08 14:11:18 +00:00
|
|
|
_, err = edit_topic_stmt.Exec(topic_name, preparse_message(topic_content), parse_message(html.EscapeString(preparse_message(topic_content))), is_closed, tid)
|
2016-12-07 09:34:09 +00:00
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-04-02 13:00:40 +00:00
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if old_is_closed != is_closed {
|
|
|
|
var action string
|
|
|
|
if is_closed {
|
|
|
|
action = "lock"
|
|
|
|
} else {
|
|
|
|
action = "unlock"
|
|
|
|
}
|
2017-04-05 14:05:37 +00:00
|
|
|
|
|
|
|
err = addModLog(action,tid,"topic",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
2017-04-02 13:00:40 +00:00
|
|
|
_, err = create_action_reply_stmt.Exec(tid,action,ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = add_replies_to_topic_stmt.Exec(1, tid)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
_, err = update_forum_cache_stmt.Exec(topic_name, tid, user.Name, user.ID, 1)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
err = topics.Load(tid)
|
|
|
|
if err != nil {
|
2017-02-16 06:47:55 +00:00
|
|
|
LocalErrorJSQ("This topic no longer exists!",w,r,user,is_js)
|
2017-02-15 10:49:30 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
if is_js == "0" {
|
2017-01-31 05:13:38 +00:00
|
|
|
http.Redirect(w,r,"/topic/" + strconv.Itoa(tid),http.StatusSeeOther)
|
2016-12-07 09:34:09 +00:00
|
|
|
} else {
|
2017-05-11 13:04:43 +00:00
|
|
|
w.Write(success_json_bytes)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func route_delete_topic(w http.ResponseWriter, r *http.Request) {
|
|
|
|
tid, err := strconv.Atoi(r.URL.Path[len("/topic/delete/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("The provided TopicID is not a valid number.",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-01-12 02:55:08 +00:00
|
|
|
var content string
|
2017-05-11 13:04:43 +00:00
|
|
|
var createdBy, fid int
|
2017-01-31 05:13:38 +00:00
|
|
|
err = db.QueryRow("select content, createdBy, parentID from topics where tid = ?", tid).Scan(&content, &createdBy, &fid)
|
2016-12-07 09:34:09 +00:00
|
|
|
if err == sql.ErrNoRows {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("The topic you tried to delete doesn't exist.",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-05 16:36:54 +00:00
|
|
|
user, ok := SimpleForumSessionCheck(w,r,fid)
|
|
|
|
if !ok {
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-05 16:36:54 +00:00
|
|
|
if !user.Perms.ViewTopic || !user.Perms.DeleteTopic {
|
2017-01-31 05:13:38 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
_, err = delete_topic_stmt.Exec(tid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
2017-04-05 14:05:37 +00:00
|
|
|
|
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("delete",tid,"topic",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
/*_, err = create_action_reply_stmt.Exec(tid,"delete",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}*/
|
|
|
|
|
2016-12-16 10:37:42 +00:00
|
|
|
log.Print("The topic '" + strconv.Itoa(tid) + "' was deleted by User ID #" + strconv.Itoa(user.ID) + ".")
|
2017-01-12 02:55:08 +00:00
|
|
|
http.Redirect(w,r,"/",http.StatusSeeOther)
|
|
|
|
|
|
|
|
wcount := word_count(content)
|
2017-02-05 16:36:54 +00:00
|
|
|
err = decrease_post_user_stats(wcount,createdBy,true,user)
|
2017-01-12 02:55:08 +00:00
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2017-01-12 02:55:08 +00:00
|
|
|
return
|
|
|
|
}
|
2017-01-26 13:37:50 +00:00
|
|
|
|
|
|
|
_, err = remove_topics_from_forum_stmt.Exec(1, fid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2017-01-26 13:37:50 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
forums[fid].TopicCount -= 1
|
2017-02-15 10:49:30 +00:00
|
|
|
topics.Remove(tid)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func route_stick_topic(w http.ResponseWriter, r *http.Request) {
|
|
|
|
tid, err := strconv.Atoi(r.URL.Path[len("/topic/stick/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("The provided TopicID is not a valid number.",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
topic, err := topics.CascadeGet(tid)
|
2017-01-31 05:13:38 +00:00
|
|
|
if err == sql.ErrNoRows {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("The topic you tried to pin doesn't exist.",w,r)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
user, ok := SimpleForumSessionCheck(w,r,topic.ParentID)
|
2017-02-05 16:36:54 +00:00
|
|
|
if !ok {
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-05 16:36:54 +00:00
|
|
|
if !user.Perms.ViewTopic || !user.Perms.PinTopic {
|
2017-01-31 05:13:38 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
_, err = stick_topic_stmt.Exec(tid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-16 06:47:55 +00:00
|
|
|
//topic.Sticky = true
|
2017-04-06 17:37:32 +00:00
|
|
|
|
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("stick",tid,"topic",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
_, err = create_action_reply_stmt.Exec(tid,"stick",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-16 06:47:55 +00:00
|
|
|
err = topics.Load(tid)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("This topic doesn't exist!",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2017-02-04 06:19:55 +00:00
|
|
|
http.Redirect(w,r,"/topic/" + strconv.Itoa(tid),http.StatusSeeOther)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func route_unstick_topic(w http.ResponseWriter, r *http.Request) {
|
|
|
|
tid, err := strconv.Atoi(r.URL.Path[len("/topic/unstick/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("The provided TopicID is not a valid number.",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
topic, err := topics.CascadeGet(tid)
|
2017-01-31 05:13:38 +00:00
|
|
|
if err == sql.ErrNoRows {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("The topic you tried to unpin doesn't exist.",w,r)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
user, ok := SimpleForumSessionCheck(w,r,topic.ParentID)
|
2017-02-05 16:36:54 +00:00
|
|
|
if !ok {
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-05 16:36:54 +00:00
|
|
|
if !user.Perms.ViewTopic || !user.Perms.PinTopic {
|
2017-01-31 05:13:38 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
_, err = unstick_topic_stmt.Exec(tid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-16 06:47:55 +00:00
|
|
|
//topic.Sticky = false
|
2017-04-06 17:37:32 +00:00
|
|
|
|
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("unstick",tid,"topic",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
_, err = create_action_reply_stmt.Exec(tid,"unstick",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-16 06:47:55 +00:00
|
|
|
err = topics.Load(tid)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("This topic doesn't exist!",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2017-02-04 06:19:55 +00:00
|
|
|
http.Redirect(w,r,"/topic/" + strconv.Itoa(tid),http.StatusSeeOther)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func route_reply_edit_submit(w http.ResponseWriter, r *http.Request) {
|
|
|
|
err := r.ParseForm()
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("Bad Form",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
is_js := r.PostFormValue("js")
|
|
|
|
if is_js == "" {
|
|
|
|
is_js = "0"
|
|
|
|
}
|
|
|
|
|
|
|
|
rid, err := strconv.Atoi(r.URL.Path[len("/reply/edit/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
PreErrorJSQ("The provided Reply ID is not a valid number.",w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-08 14:11:18 +00:00
|
|
|
content := html.EscapeString(preparse_message(r.PostFormValue("edit_item")))
|
2016-12-07 09:34:09 +00:00
|
|
|
_, err = edit_reply_stmt.Exec(content, parse_message(content), rid)
|
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the Reply ID..
|
|
|
|
var tid int
|
|
|
|
err = db.QueryRow("select tid from replies where rid = ?", rid).Scan(&tid)
|
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-01-31 05:13:38 +00:00
|
|
|
var fid int
|
|
|
|
err = db.QueryRow("select parentID from topics where tid = ?", tid).Scan(&fid)
|
|
|
|
if err == sql.ErrNoRows {
|
2017-02-10 13:39:13 +00:00
|
|
|
PreErrorJSQ("The parent topic doesn't exist.",w,r,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-05 16:36:54 +00:00
|
|
|
user, ok := SimpleForumSessionCheck(w,r,fid)
|
|
|
|
if !ok {
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-05 16:36:54 +00:00
|
|
|
if !user.Perms.ViewTopic || !user.Perms.EditReply {
|
2017-02-10 13:39:13 +00:00
|
|
|
NoPermissionsJSQ(w,r,user,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
if is_js == "0" {
|
|
|
|
http.Redirect(w,r, "/topic/" + strconv.Itoa(tid) + "#reply-" + strconv.Itoa(rid), http.StatusSeeOther)
|
|
|
|
} else {
|
2017-05-11 13:04:43 +00:00
|
|
|
w.Write(success_json_bytes)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func route_reply_delete_submit(w http.ResponseWriter, r *http.Request) {
|
|
|
|
err := r.ParseForm()
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreError("Bad Form",w,r)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
is_js := r.PostFormValue("is_js")
|
|
|
|
if is_js == "" {
|
|
|
|
is_js = "0"
|
|
|
|
}
|
|
|
|
|
|
|
|
rid, err := strconv.Atoi(r.URL.Path[len("/reply/delete/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreErrorJSQ("The provided Reply ID is not a valid number.",w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-05-11 13:04:43 +00:00
|
|
|
var tid, createdBy int
|
2017-01-12 02:55:08 +00:00
|
|
|
var content string
|
2017-01-31 05:13:38 +00:00
|
|
|
err = db.QueryRow("select tid, content, createdBy from replies where rid = ?", rid).Scan(&tid, &content, &createdBy)
|
2016-12-07 09:34:09 +00:00
|
|
|
if err == sql.ErrNoRows {
|
2017-02-05 16:36:54 +00:00
|
|
|
PreErrorJSQ("The reply you tried to delete doesn't exist.",w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-01-31 05:13:38 +00:00
|
|
|
var fid int
|
|
|
|
err = db.QueryRow("select parentID from topics where tid = ?", tid).Scan(&fid)
|
|
|
|
if err == sql.ErrNoRows {
|
2017-02-10 13:39:13 +00:00
|
|
|
PreErrorJSQ("The parent topic doesn't exist.",w,r,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-05 16:36:54 +00:00
|
|
|
user, ok := SimpleForumSessionCheck(w,r,fid)
|
|
|
|
if !ok {
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-05 16:36:54 +00:00
|
|
|
if !user.Perms.ViewTopic || !user.Perms.DeleteReply {
|
2017-02-10 13:39:13 +00:00
|
|
|
NoPermissionsJSQ(w,r,user,is_js)
|
2017-01-31 05:13:38 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
_, err = delete_reply_stmt.Exec(rid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
log.Print("The reply '" + strconv.Itoa(rid) + "' was deleted by User ID #" + strconv.Itoa(user.ID) + ".")
|
|
|
|
if is_js == "0" {
|
|
|
|
//http.Redirect(w,r, "/topic/" + strconv.Itoa(tid), http.StatusSeeOther)
|
|
|
|
} else {
|
2017-05-11 13:04:43 +00:00
|
|
|
w.Write(success_json_bytes)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
2017-01-12 02:55:08 +00:00
|
|
|
|
|
|
|
wcount := word_count(content)
|
|
|
|
err = decrease_post_user_stats(wcount, createdBy, false, user)
|
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2017-01-12 02:55:08 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-04 06:19:55 +00:00
|
|
|
_, err = remove_replies_from_topic_stmt.Exec(1,tid)
|
2017-01-21 18:16:27 +00:00
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2017-01-21 18:16:27 +00:00
|
|
|
}
|
2017-02-15 10:49:30 +00:00
|
|
|
|
2017-04-06 17:37:32 +00:00
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("delete",tid,"reply",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
err = topics.Load(tid)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("This topic no longer exists!",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func route_profile_reply_edit_submit(w http.ResponseWriter, r *http.Request) {
|
2016-12-16 10:37:42 +00:00
|
|
|
user, ok := SimpleSessionCheck(w,r)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
err := r.ParseForm()
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
LocalError("Bad Form",w,r,user)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
is_js := r.PostFormValue("js")
|
|
|
|
if is_js == "" {
|
|
|
|
is_js = "0"
|
|
|
|
}
|
|
|
|
|
|
|
|
rid, err := strconv.Atoi(r.URL.Path[len("/profile/reply/edit/submit/"):])
|
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
LocalErrorJSQ("The provided Reply ID is not a valid number.",w,r,user,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 13:46:14 +00:00
|
|
|
// Get the Reply ID..
|
|
|
|
var uid int
|
|
|
|
err = db.QueryRow("select uid from users_replies where rid = ?", rid).Scan(&uid)
|
2016-12-07 09:34:09 +00:00
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-21 02:30:32 +00:00
|
|
|
if user.ID != uid && !user.Perms.EditReply {
|
2016-12-07 13:46:14 +00:00
|
|
|
NoPermissionsJSQ(w,r,user,is_js)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-08 14:11:18 +00:00
|
|
|
content := html.EscapeString(preparse_message(r.PostFormValue("edit_item")))
|
2016-12-07 13:46:14 +00:00
|
|
|
_, err = edit_profile_reply_stmt.Exec(content, parse_message(content), rid)
|
2016-12-07 09:34:09 +00:00
|
|
|
if err != nil {
|
2017-02-10 13:39:13 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if is_js == "0" {
|
2017-04-06 17:37:32 +00:00
|
|
|
http.Redirect(w,r,"/user/" + strconv.Itoa(uid) + "#reply-" + strconv.Itoa(rid), http.StatusSeeOther)
|
2016-12-07 09:34:09 +00:00
|
|
|
} else {
|
2017-05-11 13:04:43 +00:00
|
|
|
w.Write(success_json_bytes)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func route_profile_reply_delete_submit(w http.ResponseWriter, r *http.Request) {
|
2016-12-16 10:37:42 +00:00
|
|
|
user, ok := SimpleSessionCheck(w,r)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-07 09:34:09 +00:00
|
|
|
err := r.ParseForm()
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
LocalError("Bad Form",w,r,user)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
is_js := r.PostFormValue("is_js")
|
|
|
|
if is_js == "" {
|
|
|
|
is_js = "0"
|
|
|
|
}
|
|
|
|
|
|
|
|
rid, err := strconv.Atoi(r.URL.Path[len("/profile/reply/delete/submit/"):])
|
|
|
|
if err != nil {
|
|
|
|
LocalErrorJSQ("The provided Reply ID is not a valid number.",w,r,user,is_js)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var uid int
|
2017-02-15 10:49:30 +00:00
|
|
|
err = db.QueryRow("select uid from users_replies where rid = ?", rid).Scan(&uid)
|
2016-12-07 09:34:09 +00:00
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
LocalErrorJSQ("The reply you tried to delete doesn't exist.",w,r,user,is_js)
|
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 13:46:14 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-21 02:30:32 +00:00
|
|
|
if user.ID != uid && !user.Perms.DeleteReply {
|
2016-12-07 13:46:14 +00:00
|
|
|
NoPermissionsJSQ(w,r,user,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = delete_profile_reply_stmt.Exec(rid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalErrorJSQ(err,w,r,is_js)
|
2016-12-07 09:34:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
log.Print("The reply '" + strconv.Itoa(rid) + "' was deleted by User ID #" + strconv.Itoa(user.ID) + ".")
|
|
|
|
|
|
|
|
if is_js == "0" {
|
|
|
|
//http.Redirect(w,r, "/user/" + strconv.Itoa(uid), http.StatusSeeOther)
|
|
|
|
} else {
|
2017-05-11 13:04:43 +00:00
|
|
|
w.Write(success_json_bytes)
|
2016-12-07 09:34:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-08 14:11:18 +00:00
|
|
|
func route_ban(w http.ResponseWriter, r *http.Request) {
|
2016-12-16 10:37:42 +00:00
|
|
|
user, noticeList, ok := SessionCheck(w,r)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
2016-12-21 02:30:32 +00:00
|
|
|
if !user.Perms.BanUsers {
|
2016-12-08 14:11:18 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
uid, err := strconv.Atoi(r.URL.Path[len("/users/ban/"):])
|
|
|
|
if err != nil {
|
|
|
|
LocalError("The provided User ID is not a valid number.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var uname string
|
2017-01-31 05:13:38 +00:00
|
|
|
err = db.QueryRow("select name from users where uid = ?", uid).Scan(&uname)
|
2016-12-08 14:11:18 +00:00
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
LocalError("The user you're trying to ban no longer exists.",w,r,user)
|
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-08 14:11:18 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
confirm_msg := "Are you sure you want to ban '" + uname + "'?"
|
|
|
|
yousure := AreYouSure{"/users/ban/submit/" + strconv.Itoa(uid),confirm_msg}
|
|
|
|
|
2017-01-17 07:55:46 +00:00
|
|
|
pi := Page{"Ban User",user,noticeList,tList,yousure}
|
2017-02-04 06:19:55 +00:00
|
|
|
templates.ExecuteTemplate(w,"areyousure.html",pi)
|
2016-12-08 14:11:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func route_ban_submit(w http.ResponseWriter, r *http.Request) {
|
2016-12-16 10:37:42 +00:00
|
|
|
user, ok := SimpleSessionCheck(w,r)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
2016-12-21 02:30:32 +00:00
|
|
|
if !user.Perms.BanUsers {
|
2016-12-08 14:11:18 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if r.FormValue("session") != user.Session {
|
|
|
|
SecurityError(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
uid, err := strconv.Atoi(r.URL.Path[len("/users/ban/submit/"):])
|
|
|
|
if err != nil {
|
|
|
|
LocalError("The provided User ID is not a valid number.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2017-04-06 17:37:32 +00:00
|
|
|
if uid == -2 {
|
|
|
|
LocalError("Sigh, are you really trying to ban me? Do you despise so much? Despite all of our adventures over at /arcane-tower/...?",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2016-12-08 14:11:18 +00:00
|
|
|
|
|
|
|
var group int
|
|
|
|
var is_super_admin bool
|
2017-02-04 06:19:55 +00:00
|
|
|
err = db.QueryRow("select `group`,`is_super_admin` from `users` where `uid` = ?", uid).Scan(&group, &is_super_admin)
|
2016-12-08 14:11:18 +00:00
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
LocalError("The user you're trying to ban no longer exists.",w,r,user)
|
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-08 14:11:18 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if is_super_admin || groups[group].Is_Admin || groups[group].Is_Mod {
|
|
|
|
LocalError("You may not ban another staff member.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if uid == user.ID {
|
2017-04-06 17:37:32 +00:00
|
|
|
LocalError("Why are you trying to ban yourself? Stop that.",w,r,user)
|
2016-12-08 14:11:18 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if groups[group].Is_Banned {
|
|
|
|
LocalError("The user you're trying to unban is already banned.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = change_group_stmt.Exec(4, uid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-08 14:11:18 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-15 10:49:30 +00:00
|
|
|
|
2017-04-06 17:37:32 +00:00
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("ban",uid,"user",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
err = users.Load(uid)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("This user no longer exists!",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2017-04-06 17:37:32 +00:00
|
|
|
http.Redirect(w,r,"/user/" + strconv.Itoa(uid),http.StatusSeeOther)
|
2016-12-08 14:11:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func route_unban(w http.ResponseWriter, r *http.Request) {
|
2016-12-16 10:37:42 +00:00
|
|
|
user, ok := SimpleSessionCheck(w,r)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
2016-12-21 02:30:32 +00:00
|
|
|
if !user.Perms.BanUsers {
|
2016-12-08 14:11:18 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2016-12-23 12:35:22 +00:00
|
|
|
if r.FormValue("session") != user.Session {
|
|
|
|
SecurityError(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-08 14:11:18 +00:00
|
|
|
uid, err := strconv.Atoi(r.URL.Path[len("/users/unban/"):])
|
|
|
|
if err != nil {
|
|
|
|
LocalError("The provided User ID is not a valid number.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var uname string
|
|
|
|
var group int
|
2017-01-31 05:13:38 +00:00
|
|
|
err = db.QueryRow("select `name`, `group` from users where `uid` = ?", uid).Scan(&uname, &group)
|
2016-12-08 14:11:18 +00:00
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
LocalError("The user you're trying to unban no longer exists.",w,r,user)
|
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-08 14:11:18 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if !groups[group].Is_Banned {
|
|
|
|
LocalError("The user you're trying to unban isn't banned.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = change_group_stmt.Exec(default_group, uid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-08 14:11:18 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-15 10:49:30 +00:00
|
|
|
|
2017-04-06 17:37:32 +00:00
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("unban",uid,"user",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
err = users.Load(uid)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("This user no longer exists!",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2017-04-06 17:37:32 +00:00
|
|
|
http.Redirect(w,r,"/user/" + strconv.Itoa(uid),http.StatusSeeOther)
|
2016-12-08 14:11:18 +00:00
|
|
|
}
|
|
|
|
|
2016-12-18 12:56:06 +00:00
|
|
|
func route_activate(w http.ResponseWriter, r *http.Request) {
|
|
|
|
user, ok := SimpleSessionCheck(w,r)
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
2016-12-21 02:30:32 +00:00
|
|
|
if !user.Perms.ActivateUsers {
|
2016-12-18 12:56:06 +00:00
|
|
|
NoPermissions(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2016-12-23 12:35:22 +00:00
|
|
|
if r.FormValue("session") != user.Session {
|
|
|
|
SecurityError(w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-12-18 12:56:06 +00:00
|
|
|
uid, err := strconv.Atoi(r.URL.Path[len("/users/activate/"):])
|
|
|
|
if err != nil {
|
|
|
|
LocalError("The provided User ID is not a valid number.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var uname string
|
|
|
|
var active bool
|
2017-02-05 16:36:54 +00:00
|
|
|
err = db.QueryRow("select `name`,`active` from users where `uid` = ?", uid).Scan(&uname, &active)
|
2016-12-18 12:56:06 +00:00
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
LocalError("The account you're trying to activate no longer exists.",w,r,user)
|
|
|
|
return
|
|
|
|
} else if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-18 12:56:06 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if active {
|
|
|
|
LocalError("The account you're trying to activate has already been activated.",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
_, err = activate_user_stmt.Exec(uid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-18 12:56:06 +00:00
|
|
|
return
|
|
|
|
}
|
2016-12-21 02:30:32 +00:00
|
|
|
|
|
|
|
_, err = change_group_stmt.Exec(default_group, uid)
|
|
|
|
if err != nil {
|
2017-02-05 16:36:54 +00:00
|
|
|
InternalError(err,w,r)
|
2016-12-21 02:30:32 +00:00
|
|
|
return
|
|
|
|
}
|
2017-02-15 10:49:30 +00:00
|
|
|
|
2017-04-06 17:37:32 +00:00
|
|
|
ipaddress, _, err := net.SplitHostPort(r.RemoteAddr)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("Bad IP",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = addModLog("activate",uid,"user",ipaddress,user.ID)
|
|
|
|
if err != nil {
|
|
|
|
InternalError(err,w,r)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-02-15 10:49:30 +00:00
|
|
|
err = users.Load(uid)
|
|
|
|
if err != nil {
|
|
|
|
LocalError("This user no longer exists!",w,r,user)
|
|
|
|
return
|
|
|
|
}
|
2017-04-06 17:37:32 +00:00
|
|
|
http.Redirect(w,r,"/user/" + strconv.Itoa(uid),http.StatusSeeOther)
|
2016-12-18 12:56:06 +00:00
|
|
|
}
|