From cac3ffe98296530dc320bbb170f703cc54619436 Mon Sep 17 00:00:00 2001 From: Azareal Date: Tue, 2 May 2017 18:24:33 +0100 Subject: [PATCH] Moved the API and Report routes to the router generator route list. Tweaked the code to make it more flexible. --- gen_router.go | 9 +++++++++ main.go | 14 ++++++------- mysql.go | 9 +++++++-- router.go | 5 ++--- router_gen/routes.go | 7 ++++++- routes.go | 16 +++++++-------- user.go | 24 +++++++++++----------- utils.go | 48 +++++++++++++++++++++----------------------- 8 files changed, 73 insertions(+), 59 deletions(-) diff --git a/gen_router.go b/gen_router.go index 59421e10..b4a3c09d 100644 --- a/gen_router.go +++ b/gen_router.go @@ -50,6 +50,9 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { //fmt.Println("req.URL.Path:",req.URL.Path) //fmt.Println("extra_data:",extra_data) switch(prefix) { + case "/api": + route_api(w,req) + return case "/static": req.URL.Path += extra_data route_static(w,req) @@ -63,6 +66,12 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { case "/forum": route_forum(w,req,extra_data) return + case "/report": + switch(req.URL.Path) { + case "/report/submit/": + route_report_submit(w,req,extra_data) + return + } case "/topics": switch(req.URL.Path) { case "/topics/create/": diff --git a/main.go b/main.go index b7ae8463..87441339 100644 --- a/main.go +++ b/main.go @@ -96,7 +96,10 @@ func compile_templates() { } func write_template(name string, content string) { - write_file("./template_" + name + ".go", content) + err := write_file("./template_" + name + ".go", content) + if err != nil { + log.Fatal(err) + } } func init_templates() { @@ -164,8 +167,6 @@ func main(){ } init_templates() - db.SetMaxOpenConns(64) - err = init_errors() if err != nil { log.Fatal(err) @@ -183,7 +184,6 @@ func main(){ external_sites["YT"] = "https://www.youtube.com/" hooks["trow_assign"] = nil hooks["rrow_assign"] = nil - init_plugins() router := NewGenRouter(http.FileServer(http.Dir("./uploads"))) @@ -201,7 +201,7 @@ func main(){ router.HandleFunc("/reply/edit/submit/", route_reply_edit_submit) router.HandleFunc("/reply/delete/submit/", route_reply_delete_submit) router.HandleFunc("/reply/like/submit/", route_reply_like_submit) - router.HandleFunc("/report/submit/", route_report_submit) + ///router.HandleFunc("/report/submit/", route_report_submit) router.HandleFunc("/topic/edit/submit/", route_edit_topic) router.HandleFunc("/topic/delete/submit/", route_delete_topic) router.HandleFunc("/topic/stick/submit/", route_stick_topic) @@ -265,9 +265,9 @@ func main(){ ///router.HandleFunc("/panel/groups/edit/perms/submit/", route_panel_groups_edit_perms_submit) ///router.HandleFunc("/panel/groups/create/", route_panel_groups_create_submit) ///router.HandleFunc("/panel/logs/mod/", route_panel_logs_mod) - router.HandleFunc("/api/", route_api) - //router.HandleFunc("/exit/", route_exit) + ///router.HandleFunc("/api/", route_api) + //router.HandleFunc("/exit/", route_exit) ///router.HandleFunc("/", default_route) defer db.Close() diff --git a/mysql.go b/mysql.go index 64355599..5b637c5c 100644 --- a/mysql.go +++ b/mysql.go @@ -99,20 +99,25 @@ func init_database() (err error) { if(dbpassword != ""){ dbpassword = ":" + dbpassword } + + // Open the database connection db, err = sql.Open("mysql",dbuser + dbpassword + "@tcp(" + dbhost + ":" + dbport + ")/" + dbname + "?collation=" + db_collation) if err != nil { return err } - // Make sure that the connection is alive.. + // Make sure that the connection is alive err = db.Ping() if err != nil { return err } - // Getting the database version.. + // Fetch the database version db.QueryRow("SELECT VERSION()").Scan(&db_version) + // Set the number of max open connections + db.SetMaxOpenConns(64) + /*log.Print("Preparing get_session statement.") get_session_stmt, err = db.Prepare("select `uid`,`name`,`group`,`is_super_admin`,`session`,`email`,`avatar`,`message`,`url_prefix`,`url_name`,`level`,`score`,`last_ip` from `users` where `uid` = ? and `session` = ? AND `session` <> ''") if err != nil { diff --git a/router.go b/router.go index 4853ff66..d10e8b00 100644 --- a/router.go +++ b/router.go @@ -44,13 +44,12 @@ func (router *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { router.RLock() handle, ok := router.routes[prefix] + router.RUnlock() + if ok { - router.RUnlock() handle(w,req) return } //fmt.Println(req.URL.Path[:strings.LastIndexByte(req.URL.Path,'/')]) - - router.RUnlock() NotFound(w,req) } diff --git a/router_gen/routes.go b/router_gen/routes.go index f146d131..f311d9b9 100644 --- a/router_gen/routes.go +++ b/router_gen/routes.go @@ -22,14 +22,19 @@ func addRouteGroup(path string, routes ...Route) { func routes() { //addRoute("default_route","","") + addRoute("route_api","/api/","") addRoute("route_static","/static/","req.URL.Path += extra_data") addRoute("route_overview","/overview/","") //addRoute("route_custom_page","/pages/",""/*,"&extra_data"*/) addRoute("route_forums","/forums/",""/*,"&forums"*/) addRoute("route_forum","/forum/","","extra_data") - //addRoute("route_topic_create","/topics/create/","","extra_data") //addRoute("route_topics","/topics/",""/*,"&groups","&forums"*/) + + addRouteGroup("/report/", + Route{"route_report_submit","/report/submit/","",[]string{"extra_data"}}, + ) + addRouteGroup("/topics/", Route{"route_topics","/topics/","",[]string{}}, Route{"route_topic_create","/topics/create/","",[]string{"extra_data"}}, diff --git a/routes.go b/routes.go index b25ce42e..17166957 100644 --- a/routes.go +++ b/routes.go @@ -984,7 +984,7 @@ func route_profile_reply_create(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/user/" + strconv.Itoa(uid), http.StatusSeeOther) } -func route_report_submit(w http.ResponseWriter, r *http.Request) { +func route_report_submit(w http.ResponseWriter, r *http.Request, sitem_id string) { user, ok := SimpleSessionCheck(w,r) if !ok { return @@ -1008,19 +1008,17 @@ func route_report_submit(w http.ResponseWriter, r *http.Request) { return } - item_id, err := strconv.Atoi(r.URL.Path[len("/report/submit/"):]) + item_id, err := strconv.Atoi(sitem_id) if err != nil { - LocalError("Bad ID", w, r, user) + LocalError("Bad ID",w,r,user) return } item_type := r.FormValue("type") - fid := 1 + var fid int = 1 var tid int - var title string - var content string - var data string + var title, content, data string if item_type == "reply" { err = db.QueryRow("select tid, content from replies where rid = ?", item_id).Scan(&tid, &content) if err == sql.ErrNoRows { @@ -1094,7 +1092,7 @@ func route_report_submit(w http.ResponseWriter, r *http.Request) { } } if count != 0 { - LocalError("Someone has already reported this!", w, r, user) + LocalError("Someone has already reported this!",w,r,user) return } @@ -1122,7 +1120,7 @@ func route_report_submit(w http.ResponseWriter, r *http.Request) { return } - http.Redirect(w, r, "/topic/" + strconv.FormatInt(lastId, 10), http.StatusSeeOther) + http.Redirect(w,r,"/topic/" + strconv.FormatInt(lastId, 10), http.StatusSeeOther) } func route_account_own_edit_critical(w http.ResponseWriter, r *http.Request) { diff --git a/user.go b/user.go index f3155ab4..54b6e717 100644 --- a/user.go +++ b/user.go @@ -63,7 +63,7 @@ type StaticUserStore struct { items map[int]*User length int capacity int - mu sync.RWMutex + sync.RWMutex } func NewStaticUserStore(capacity int) *StaticUserStore { @@ -71,9 +71,9 @@ func NewStaticUserStore(capacity int) *StaticUserStore { } func (sts *StaticUserStore) Get(id int) (*User, error) { - sts.mu.RLock() + sts.RLock() item, ok := sts.items[id] - sts.mu.RUnlock() + sts.RUnlock() if ok { return item, nil } @@ -89,9 +89,9 @@ func (sts *StaticUserStore) GetUnsafe(id int) (*User, error) { } func (sts *StaticUserStore) CascadeGet(id int) (*User, error) { - sts.mu.RLock() + sts.RLock() user, ok := sts.items[id] - sts.mu.RUnlock() + sts.RUnlock() if ok { return user, nil } @@ -136,18 +136,18 @@ func (sts *StaticUserStore) Load(id int) error { } func (sts *StaticUserStore) Set(item *User) error { - sts.mu.Lock() + sts.Lock() _, ok := sts.items[item.ID] if ok { sts.items[item.ID] = item } else if sts.length >= sts.capacity { - sts.mu.Unlock() + sts.Unlock() return ErrStoreCapacityOverflow } else { sts.items[item.ID] = item sts.length++ } - sts.mu.Unlock() + sts.Unlock() return nil } @@ -155,9 +155,9 @@ func (sts *StaticUserStore) Add(item *User) error { if sts.length >= sts.capacity { return ErrStoreCapacityOverflow } - sts.mu.Lock() + sts.Lock() sts.items[item.ID] = item - sts.mu.Unlock() + sts.Unlock() sts.length++ return nil } @@ -172,9 +172,9 @@ func (sts *StaticUserStore) AddUnsafe(item *User) error { } func (sts *StaticUserStore) Remove(id int) error { - sts.mu.Lock() + sts.Lock() delete(sts.items,id) - sts.mu.Unlock() + sts.Unlock() sts.length-- return nil } diff --git a/utils.go b/utils.go index 4ed1aa78..163750a1 100644 --- a/utils.go +++ b/utils.go @@ -1,5 +1,5 @@ package main -import "log" + import "fmt" import "time" import "os" @@ -66,7 +66,7 @@ func relative_time(in string) (string, error) { } } -func SendEmail(email string, subject string, msg string) bool { +func SendEmail(email string, subject string, msg string) (res bool) { // This hook is useful for plugin_sendmail or for testing tools. Possibly to hook it into some sort of mail server? if vhooks["email_send_intercept"] != nil { return vhooks["email_send_intercept"](email, subject, msg).(bool) @@ -75,57 +75,58 @@ func SendEmail(email string, subject string, msg string) bool { con, err := smtp.Dial(smtp_server + ":" + smtp_port) if err != nil { - return false + return } if smtp_username != "" { auth := smtp.PlainAuth("",smtp_username,smtp_password,smtp_server) err = con.Auth(auth) if err != nil { - return false + return } } err = con.Mail(site_email) if err != nil { - return false + return } err = con.Rcpt(email) if err != nil { - return false + return } email_data, err := con.Data() if err != nil { - return false + return } _, err = fmt.Fprintf(email_data, body) if err != nil { - return false + return } err = email_data.Close() if err != nil { - return false + return } err = con.Quit() if err != nil { - return false + return } return true } -func write_file(name string, content string) { +func write_file(name string, content string) (err error) { f, err := os.Create(name) if err != nil { - log.Fatal(err) + return err } _, err = f.WriteString(content) if err != nil { - log.Fatal(err) + return err } f.Sync() f.Close() + return } func word_count(input string) (count int) { @@ -149,8 +150,7 @@ func word_count(input string) (count int) { func getLevel(score int) (level int) { var base float64 = 25 - var current float64 - var prev float64 + var current, prev float64 exp_factor := 2.8 for i := 1;;i++ { @@ -170,8 +170,7 @@ func getLevel(score int) (level int) { func getLevelScore(getLevel int) (score int) { var base float64 = 25 - var current float64 - var prev float64 + var current, prev float64 var level int exp_factor := 2.8 @@ -192,8 +191,7 @@ func getLevelScore(getLevel int) (score int) { func getLevels(maxLevel int) []float64 { var base float64 = 25 - var current float64 = 0 - var prev float64 = 0 + var current, prev float64 // = 0 exp_factor := 2.8 var out []float64 out = append(out, 0) @@ -212,28 +210,28 @@ func getLevels(maxLevel int) []float64 { func fill_forum_id_gap(biggerID int, smallerID int) { dummy := Forum{ID:0,Name:"",Active:false,Preset:"all"} - for i := smallerID; i > biggerID;i++ { + for i := smallerID; i > biggerID; i++ { forums = append(forums, dummy) } } func fill_group_id_gap(biggerID int, smallerID int) { dummy := Group{ID:0, Name:""} - for i := smallerID; i > biggerID;i++ { + for i := smallerID; i > biggerID; i++ { groups = append(groups, dummy) } } -func addModLog(action string, elementID int, elementType string, ipaddress string, actorID int) error { - _, err := add_modlog_entry_stmt.Exec(action,elementID,elementType,ipaddress,actorID) +func addModLog(action string, elementID int, elementType string, ipaddress string, actorID int) (err error) { + _, err = add_modlog_entry_stmt.Exec(action,elementID,elementType,ipaddress,actorID) if err != nil { return err } return nil } -func addAdminLog(action string, elementID string, elementType int, ipaddress string, actorID int) error { - _, err := add_adminlog_entry_stmt.Exec(action,elementID,elementType,ipaddress,actorID) +func addAdminLog(action string, elementID string, elementType int, ipaddress string, actorID int) (err error) { + _, err = add_adminlog_entry_stmt.Exec(action,elementID,elementType,ipaddress,actorID) if err != nil { return err }