From 8ecc637ab968f58bf5e8d9cd02a4b853e9f28cfb Mon Sep 17 00:00:00 2001 From: Azareal Date: Mon, 26 Feb 2018 09:07:00 +0000 Subject: [PATCH] Moved routeProfile to routes.ViewProfile. Requests are now logged as one big chunk to help prevent them getting torn apart and improve log throughput. Newlines are now stripped from dumped requests. Prepared statement logging now only happens in debug mode for speedier server startups. More suspicious request tracking is done outside of debug mode now. Only log the initial message in plugin_markdown in debug mode. Moved the CreateTopicSubmit attachment logging to super debug mode. Removed a couple of unneccesary menu items from the Account Manager menu. Hid the add friend option on the profiles for now. Moved the remaining analytics results loops into a common function. Only log the graph for the analytics routes in debug mode. Every Theme: Added CSS for the Don't have an Account link on the Login Page. Cosora: Fixed the header CSS on mobile. The header CSS now covers optheads on mobile. Revamped the profile comment UI. Shadow: Added CSS for sticky topics. Tempra Simple: Button CSS now applies to type=submit inputs. Fixed the IP Search CSS. Tempra Conflux: Button CSS now applies to type=submit inputs. Fixed the IP Search CSS. Tempra Cursive (Deprecated): Button CSS now applies to type=submit inputs. --- common/counters/topics_views.go | 2 + gen_mssql.go | 128 +++++---- gen_mysql.go | 127 +++++---- gen_pgsql.go | 36 ++- gen_router.go | 40 +-- panel_routes.go | 387 ++++++-------------------- plugin_markdown.go | 3 +- query_gen/lib/mssql.go | 3 +- query_gen/lib/mysql.go | 6 +- query_gen/lib/pgsql.go | 3 +- query_gen/main.go | 2 - router_gen/main.go | 32 +-- router_gen/routes.go | 2 +- routes.go | 101 ------- routes/profile.go | 126 +++++++++ routes/topic.go | 8 +- template_list.go | 56 ++-- template_profile.go | 62 +++-- templates/account_menu.html | 2 - templates/login.html | 8 +- templates/profile.html | 8 +- templates/profile_comments_row.html | 1 + themes/cosora/public/main.css | 32 ++- themes/shadow/public/main.css | 15 + themes/tempra-conflux/public/main.css | 26 +- themes/tempra-cursive/public/main.css | 9 +- themes/tempra-simple/public/main.css | 24 +- 27 files changed, 611 insertions(+), 638 deletions(-) create mode 100644 routes/profile.go diff --git a/common/counters/topics_views.go b/common/counters/topics_views.go index 31555a4d..5a227dfe 100644 --- a/common/counters/topics_views.go +++ b/common/counters/topics_views.go @@ -34,6 +34,8 @@ func NewDefaultTopicViewCounter() (*DefaultTopicViewCounter, error) { } func (counter *DefaultTopicViewCounter) Tick() error { + // TODO: Fold multiple 1 view topics into one query + counter.oddLock.RLock() oddTopics := counter.oddTopics counter.oddLock.RUnlock() diff --git a/gen_mssql.go b/gen_mssql.go index 59b35a61..23e8dc53 100644 --- a/gen_mssql.go +++ b/gen_mssql.go @@ -25,7 +25,6 @@ type Stmts struct { groupEntryExists *sql.Stmt getAttachment *sql.Stmt getForumTopics *sql.Stmt - getProfileReplies *sql.Stmt getWatchers *sql.Stmt createReport *sql.Stmt addActivity *sql.Stmt @@ -65,289 +64,322 @@ type Stmts struct { func _gen_mssql() (err error) { common.DebugLog("Building the generated statements") - log.Print("Preparing getPassword statement.") + common.DebugLog("Preparing getPassword statement.") stmts.getPassword, err = db.Prepare("SELECT [password],[salt] FROM [users] WHERE [uid] = ?1") if err != nil { + log.Print("Error in getPassword statement.") log.Print("Bad Query: ","SELECT [password],[salt] FROM [users] WHERE [uid] = ?1") return err } - log.Print("Preparing isPluginActive statement.") + common.DebugLog("Preparing isPluginActive statement.") stmts.isPluginActive, err = db.Prepare("SELECT [active] FROM [plugins] WHERE [uname] = ?1") if err != nil { + log.Print("Error in isPluginActive statement.") log.Print("Bad Query: ","SELECT [active] FROM [plugins] WHERE [uname] = ?1") return err } - log.Print("Preparing getUsersOffset statement.") + common.DebugLog("Preparing getUsersOffset statement.") stmts.getUsersOffset, err = db.Prepare("SELECT [uid],[name],[group],[active],[is_super_admin],[avatar] FROM [users] ORDER BY uid ASC OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY") if err != nil { + log.Print("Error in getUsersOffset statement.") log.Print("Bad Query: ","SELECT [uid],[name],[group],[active],[is_super_admin],[avatar] FROM [users] ORDER BY uid ASC OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY") return err } - log.Print("Preparing isThemeDefault statement.") + common.DebugLog("Preparing isThemeDefault statement.") stmts.isThemeDefault, err = db.Prepare("SELECT [default] FROM [themes] WHERE [uname] = ?1") if err != nil { + log.Print("Error in isThemeDefault statement.") log.Print("Bad Query: ","SELECT [default] FROM [themes] WHERE [uname] = ?1") return err } - log.Print("Preparing getModlogs statement.") + common.DebugLog("Preparing getModlogs statement.") stmts.getModlogs, err = db.Prepare("SELECT [action],[elementID],[elementType],[ipaddress],[actorID],[doneAt] FROM [moderation_logs]") if err != nil { + log.Print("Error in getModlogs statement.") log.Print("Bad Query: ","SELECT [action],[elementID],[elementType],[ipaddress],[actorID],[doneAt] FROM [moderation_logs]") return err } - log.Print("Preparing getModlogsOffset statement.") + common.DebugLog("Preparing getModlogsOffset statement.") stmts.getModlogsOffset, err = db.Prepare("SELECT [action],[elementID],[elementType],[ipaddress],[actorID],[doneAt] FROM [moderation_logs] ORDER BY doneAt DESC OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY") if err != nil { + log.Print("Error in getModlogsOffset statement.") log.Print("Bad Query: ","SELECT [action],[elementID],[elementType],[ipaddress],[actorID],[doneAt] FROM [moderation_logs] ORDER BY doneAt DESC OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY") return err } - log.Print("Preparing getAdminlogsOffset statement.") + common.DebugLog("Preparing getAdminlogsOffset statement.") stmts.getAdminlogsOffset, err = db.Prepare("SELECT [action],[elementID],[elementType],[ipaddress],[actorID],[doneAt] FROM [administration_logs] ORDER BY doneAt DESC OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY") if err != nil { + log.Print("Error in getAdminlogsOffset statement.") log.Print("Bad Query: ","SELECT [action],[elementID],[elementType],[ipaddress],[actorID],[doneAt] FROM [administration_logs] ORDER BY doneAt DESC OFFSET ?1 ROWS FETCH NEXT ?2 ROWS ONLY") return err } - log.Print("Preparing getTopicFID statement.") + common.DebugLog("Preparing getTopicFID statement.") stmts.getTopicFID, err = db.Prepare("SELECT [parentID] FROM [topics] WHERE [tid] = ?1") if err != nil { + log.Print("Error in getTopicFID statement.") log.Print("Bad Query: ","SELECT [parentID] FROM [topics] WHERE [tid] = ?1") return err } - log.Print("Preparing getUserName statement.") + common.DebugLog("Preparing getUserName statement.") stmts.getUserName, err = db.Prepare("SELECT [name] FROM [users] WHERE [uid] = ?1") if err != nil { + log.Print("Error in getUserName statement.") log.Print("Bad Query: ","SELECT [name] FROM [users] WHERE [uid] = ?1") return err } - log.Print("Preparing getEmailsByUser statement.") + common.DebugLog("Preparing getEmailsByUser statement.") stmts.getEmailsByUser, err = db.Prepare("SELECT [email],[validated],[token] FROM [emails] WHERE [uid] = ?1") if err != nil { + log.Print("Error in getEmailsByUser statement.") log.Print("Bad Query: ","SELECT [email],[validated],[token] FROM [emails] WHERE [uid] = ?1") return err } - log.Print("Preparing getTopicBasic statement.") + common.DebugLog("Preparing getTopicBasic statement.") stmts.getTopicBasic, err = db.Prepare("SELECT [title],[content] FROM [topics] WHERE [tid] = ?1") if err != nil { + log.Print("Error in getTopicBasic statement.") log.Print("Bad Query: ","SELECT [title],[content] FROM [topics] WHERE [tid] = ?1") return err } - log.Print("Preparing getActivityEntry statement.") + common.DebugLog("Preparing getActivityEntry statement.") stmts.getActivityEntry, err = db.Prepare("SELECT [actor],[targetUser],[event],[elementType],[elementID] FROM [activity_stream] WHERE [asid] = ?1") if err != nil { + log.Print("Error in getActivityEntry statement.") log.Print("Bad Query: ","SELECT [actor],[targetUser],[event],[elementType],[elementID] FROM [activity_stream] WHERE [asid] = ?1") return err } - log.Print("Preparing forumEntryExists statement.") + common.DebugLog("Preparing forumEntryExists statement.") stmts.forumEntryExists, err = db.Prepare("SELECT [fid] FROM [forums] WHERE [name] = '' ORDER BY fid ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY") if err != nil { + log.Print("Error in forumEntryExists statement.") log.Print("Bad Query: ","SELECT [fid] FROM [forums] WHERE [name] = '' ORDER BY fid ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY") return err } - log.Print("Preparing groupEntryExists statement.") + common.DebugLog("Preparing groupEntryExists statement.") stmts.groupEntryExists, err = db.Prepare("SELECT [gid] FROM [users_groups] WHERE [name] = '' ORDER BY gid ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY") if err != nil { + log.Print("Error in groupEntryExists statement.") log.Print("Bad Query: ","SELECT [gid] FROM [users_groups] WHERE [name] = '' ORDER BY gid ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY") return err } - log.Print("Preparing getAttachment statement.") + common.DebugLog("Preparing getAttachment statement.") stmts.getAttachment, err = db.Prepare("SELECT [sectionID],[sectionTable],[originID],[originTable],[uploadedBy],[path] FROM [attachments] WHERE [path] = ?1 AND [sectionID] = ?2 AND [sectionTable] = ?3") if err != nil { + log.Print("Error in getAttachment statement.") log.Print("Bad Query: ","SELECT [sectionID],[sectionTable],[originID],[originTable],[uploadedBy],[path] FROM [attachments] WHERE [path] = ?1 AND [sectionID] = ?2 AND [sectionTable] = ?3") return err } - log.Print("Preparing getForumTopics statement.") + common.DebugLog("Preparing getForumTopics statement.") stmts.getForumTopics, err = db.Prepare("SELECT [topics].[tid],[topics].[title],[topics].[content],[topics].[createdBy],[topics].[is_closed],[topics].[sticky],[topics].[createdAt],[topics].[lastReplyAt],[topics].[parentID],[users].[name],[users].[avatar] FROM [topics] LEFT JOIN [users] ON [topics].[createdBy] = [users].[uid] WHERE [topics].[parentID] = ?1 ORDER BY topics.sticky DESC,topics.lastReplyAt DESC,topics.createdBy DESC") if err != nil { + log.Print("Error in getForumTopics statement.") log.Print("Bad Query: ","SELECT [topics].[tid],[topics].[title],[topics].[content],[topics].[createdBy],[topics].[is_closed],[topics].[sticky],[topics].[createdAt],[topics].[lastReplyAt],[topics].[parentID],[users].[name],[users].[avatar] FROM [topics] LEFT JOIN [users] ON [topics].[createdBy] = [users].[uid] WHERE [topics].[parentID] = ?1 ORDER BY topics.sticky DESC,topics.lastReplyAt DESC,topics.createdBy DESC") return err } - log.Print("Preparing getProfileReplies statement.") - stmts.getProfileReplies, err = db.Prepare("SELECT [users_replies].[rid],[users_replies].[content],[users_replies].[createdBy],[users_replies].[createdAt],[users_replies].[lastEdit],[users_replies].[lastEditBy],[users].[avatar],[users].[name],[users].[group] FROM [users_replies] LEFT JOIN [users] ON [users_replies].[createdBy] = [users].[uid] WHERE [users_replies].[uid] = ?1") - if err != nil { - log.Print("Bad Query: ","SELECT [users_replies].[rid],[users_replies].[content],[users_replies].[createdBy],[users_replies].[createdAt],[users_replies].[lastEdit],[users_replies].[lastEditBy],[users].[avatar],[users].[name],[users].[group] FROM [users_replies] LEFT JOIN [users] ON [users_replies].[createdBy] = [users].[uid] WHERE [users_replies].[uid] = ?1") - return err - } - - log.Print("Preparing getWatchers statement.") + common.DebugLog("Preparing getWatchers statement.") stmts.getWatchers, err = db.Prepare("SELECT [activity_subscriptions].[user] FROM [activity_stream] INNER JOIN [activity_subscriptions] ON [activity_subscriptions].[targetType] = [activity_stream].[elementType] AND [activity_subscriptions].[targetID] = [activity_stream].[elementID] AND [activity_subscriptions].[user] != [activity_stream].[actor] WHERE [asid] = ?1") if err != nil { + log.Print("Error in getWatchers statement.") log.Print("Bad Query: ","SELECT [activity_subscriptions].[user] FROM [activity_stream] INNER JOIN [activity_subscriptions] ON [activity_subscriptions].[targetType] = [activity_stream].[elementType] AND [activity_subscriptions].[targetID] = [activity_stream].[elementID] AND [activity_subscriptions].[user] != [activity_stream].[actor] WHERE [asid] = ?1") return err } - log.Print("Preparing createReport statement.") + common.DebugLog("Preparing createReport statement.") stmts.createReport, err = db.Prepare("INSERT INTO [topics] ([title],[content],[parsed_content],[createdAt],[lastReplyAt],[createdBy],[lastReplyBy],[data],[parentID],[css_class]) VALUES (?,?,?,GETUTCDATE(),GETUTCDATE(),?,?,?,1,'report')") if err != nil { + log.Print("Error in createReport statement.") log.Print("Bad Query: ","INSERT INTO [topics] ([title],[content],[parsed_content],[createdAt],[lastReplyAt],[createdBy],[lastReplyBy],[data],[parentID],[css_class]) VALUES (?,?,?,GETUTCDATE(),GETUTCDATE(),?,?,?,1,'report')") return err } - log.Print("Preparing addActivity statement.") + common.DebugLog("Preparing addActivity statement.") stmts.addActivity, err = db.Prepare("INSERT INTO [activity_stream] ([actor],[targetUser],[event],[elementType],[elementID]) VALUES (?,?,?,?,?)") if err != nil { + log.Print("Error in addActivity statement.") log.Print("Bad Query: ","INSERT INTO [activity_stream] ([actor],[targetUser],[event],[elementType],[elementID]) VALUES (?,?,?,?,?)") return err } - log.Print("Preparing notifyOne statement.") + common.DebugLog("Preparing notifyOne statement.") stmts.notifyOne, err = db.Prepare("INSERT INTO [activity_stream_matches] ([watcher],[asid]) VALUES (?,?)") if err != nil { + log.Print("Error in notifyOne statement.") log.Print("Bad Query: ","INSERT INTO [activity_stream_matches] ([watcher],[asid]) VALUES (?,?)") return err } - log.Print("Preparing addForumPermsToForum statement.") + common.DebugLog("Preparing addForumPermsToForum statement.") stmts.addForumPermsToForum, err = db.Prepare("INSERT INTO [forums_permissions] ([gid],[fid],[preset],[permissions]) VALUES (?,?,?,?)") if err != nil { + log.Print("Error in addForumPermsToForum statement.") log.Print("Bad Query: ","INSERT INTO [forums_permissions] ([gid],[fid],[preset],[permissions]) VALUES (?,?,?,?)") return err } - log.Print("Preparing addPlugin statement.") + common.DebugLog("Preparing addPlugin statement.") stmts.addPlugin, err = db.Prepare("INSERT INTO [plugins] ([uname],[active],[installed]) VALUES (?,?,?)") if err != nil { + log.Print("Error in addPlugin statement.") log.Print("Bad Query: ","INSERT INTO [plugins] ([uname],[active],[installed]) VALUES (?,?,?)") return err } - log.Print("Preparing addTheme statement.") + common.DebugLog("Preparing addTheme statement.") stmts.addTheme, err = db.Prepare("INSERT INTO [themes] ([uname],[default]) VALUES (?,?)") if err != nil { + log.Print("Error in addTheme statement.") log.Print("Bad Query: ","INSERT INTO [themes] ([uname],[default]) VALUES (?,?)") return err } - log.Print("Preparing createWordFilter statement.") + common.DebugLog("Preparing createWordFilter statement.") stmts.createWordFilter, err = db.Prepare("INSERT INTO [word_filters] ([find],[replacement]) VALUES (?,?)") if err != nil { + log.Print("Error in createWordFilter statement.") log.Print("Bad Query: ","INSERT INTO [word_filters] ([find],[replacement]) VALUES (?,?)") return err } - log.Print("Preparing editReply statement.") + common.DebugLog("Preparing editReply statement.") stmts.editReply, err = db.Prepare("UPDATE [replies] SET [content] = ?,[parsed_content] = ? WHERE [rid] = ?") if err != nil { + log.Print("Error in editReply statement.") log.Print("Bad Query: ","UPDATE [replies] SET [content] = ?,[parsed_content] = ? WHERE [rid] = ?") return err } - log.Print("Preparing updatePlugin statement.") + common.DebugLog("Preparing updatePlugin statement.") stmts.updatePlugin, err = db.Prepare("UPDATE [plugins] SET [active] = ? WHERE [uname] = ?") if err != nil { + log.Print("Error in updatePlugin statement.") log.Print("Bad Query: ","UPDATE [plugins] SET [active] = ? WHERE [uname] = ?") return err } - log.Print("Preparing updatePluginInstall statement.") + common.DebugLog("Preparing updatePluginInstall statement.") stmts.updatePluginInstall, err = db.Prepare("UPDATE [plugins] SET [installed] = ? WHERE [uname] = ?") if err != nil { + log.Print("Error in updatePluginInstall statement.") log.Print("Bad Query: ","UPDATE [plugins] SET [installed] = ? WHERE [uname] = ?") return err } - log.Print("Preparing updateTheme statement.") + common.DebugLog("Preparing updateTheme statement.") stmts.updateTheme, err = db.Prepare("UPDATE [themes] SET [default] = ? WHERE [uname] = ?") if err != nil { + log.Print("Error in updateTheme statement.") log.Print("Bad Query: ","UPDATE [themes] SET [default] = ? WHERE [uname] = ?") return err } - log.Print("Preparing updateUser statement.") + common.DebugLog("Preparing updateUser statement.") stmts.updateUser, err = db.Prepare("UPDATE [users] SET [name] = ?,[email] = ?,[group] = ? WHERE [uid] = ?") if err != nil { + log.Print("Error in updateUser statement.") log.Print("Bad Query: ","UPDATE [users] SET [name] = ?,[email] = ?,[group] = ? WHERE [uid] = ?") return err } - log.Print("Preparing updateGroupPerms statement.") + common.DebugLog("Preparing updateGroupPerms statement.") stmts.updateGroupPerms, err = db.Prepare("UPDATE [users_groups] SET [permissions] = ? WHERE [gid] = ?") if err != nil { + log.Print("Error in updateGroupPerms statement.") log.Print("Bad Query: ","UPDATE [users_groups] SET [permissions] = ? WHERE [gid] = ?") return err } - log.Print("Preparing updateGroup statement.") + common.DebugLog("Preparing updateGroup statement.") stmts.updateGroup, err = db.Prepare("UPDATE [users_groups] SET [name] = ?,[tag] = ? WHERE [gid] = ?") if err != nil { + log.Print("Error in updateGroup statement.") log.Print("Bad Query: ","UPDATE [users_groups] SET [name] = ?,[tag] = ? WHERE [gid] = ?") return err } - log.Print("Preparing updateEmail statement.") + common.DebugLog("Preparing updateEmail statement.") stmts.updateEmail, err = db.Prepare("UPDATE [emails] SET [email] = ?,[uid] = ?,[validated] = ?,[token] = ? WHERE [email] = ?") if err != nil { + log.Print("Error in updateEmail statement.") log.Print("Bad Query: ","UPDATE [emails] SET [email] = ?,[uid] = ?,[validated] = ?,[token] = ? WHERE [email] = ?") return err } - log.Print("Preparing verifyEmail statement.") + common.DebugLog("Preparing verifyEmail statement.") stmts.verifyEmail, err = db.Prepare("UPDATE [emails] SET [validated] = 1,[token] = '' WHERE [email] = ?") if err != nil { + log.Print("Error in verifyEmail statement.") log.Print("Bad Query: ","UPDATE [emails] SET [validated] = 1,[token] = '' WHERE [email] = ?") return err } - log.Print("Preparing setTempGroup statement.") + common.DebugLog("Preparing setTempGroup statement.") stmts.setTempGroup, err = db.Prepare("UPDATE [users] SET [temp_group] = ? WHERE [uid] = ?") if err != nil { + log.Print("Error in setTempGroup statement.") log.Print("Bad Query: ","UPDATE [users] SET [temp_group] = ? WHERE [uid] = ?") return err } - log.Print("Preparing updateWordFilter statement.") + common.DebugLog("Preparing updateWordFilter statement.") stmts.updateWordFilter, err = db.Prepare("UPDATE [word_filters] SET [find] = ?,[replacement] = ? WHERE [wfid] = ?") if err != nil { + log.Print("Error in updateWordFilter statement.") log.Print("Bad Query: ","UPDATE [word_filters] SET [find] = ?,[replacement] = ? WHERE [wfid] = ?") return err } - log.Print("Preparing bumpSync statement.") + common.DebugLog("Preparing bumpSync statement.") stmts.bumpSync, err = db.Prepare("UPDATE [sync] SET [last_update] = GETUTCDATE()") if err != nil { + log.Print("Error in bumpSync statement.") log.Print("Bad Query: ","UPDATE [sync] SET [last_update] = GETUTCDATE()") return err } - log.Print("Preparing deleteActivityStreamMatch statement.") + common.DebugLog("Preparing deleteActivityStreamMatch statement.") stmts.deleteActivityStreamMatch, err = db.Prepare("DELETE FROM [activity_stream_matches] WHERE [watcher] = ? AND [asid] = ?") if err != nil { + log.Print("Error in deleteActivityStreamMatch statement.") log.Print("Bad Query: ","DELETE FROM [activity_stream_matches] WHERE [watcher] = ? AND [asid] = ?") return err } - log.Print("Preparing deleteWordFilter statement.") + common.DebugLog("Preparing deleteWordFilter statement.") stmts.deleteWordFilter, err = db.Prepare("DELETE FROM [word_filters] WHERE [wfid] = ?") if err != nil { + log.Print("Error in deleteWordFilter statement.") log.Print("Bad Query: ","DELETE FROM [word_filters] WHERE [wfid] = ?") return err } - log.Print("Preparing reportExists statement.") + common.DebugLog("Preparing reportExists statement.") stmts.reportExists, err = db.Prepare("SELECT COUNT(*) AS [count] FROM [topics] WHERE [data] = ? AND [data] != '' AND [parentID] = 1") if err != nil { + log.Print("Error in reportExists statement.") log.Print("Bad Query: ","SELECT COUNT(*) AS [count] FROM [topics] WHERE [data] = ? AND [data] != '' AND [parentID] = 1") return err } - log.Print("Preparing notifyWatchers statement.") + common.DebugLog("Preparing notifyWatchers statement.") stmts.notifyWatchers, err = db.Prepare("INSERT INTO [activity_stream_matches] ([watcher],[asid]) SELECT [activity_subscriptions].[user],[activity_stream].[asid] FROM [activity_stream] INNER JOIN [activity_subscriptions] ON [activity_subscriptions].[targetType] = [activity_stream].[elementType] AND [activity_subscriptions].[targetID] = [activity_stream].[elementID] AND [activity_subscriptions].[user] != [activity_stream].[actor] WHERE [asid] = ?1") if err != nil { + log.Print("Error in notifyWatchers statement.") log.Print("Bad Query: ","INSERT INTO [activity_stream_matches] ([watcher],[asid]) SELECT [activity_subscriptions].[user],[activity_stream].[asid] FROM [activity_stream] INNER JOIN [activity_subscriptions] ON [activity_subscriptions].[targetType] = [activity_stream].[elementType] AND [activity_subscriptions].[targetID] = [activity_stream].[elementID] AND [activity_subscriptions].[user] != [activity_stream].[actor] WHERE [asid] = ?1") return err } diff --git a/gen_mysql.go b/gen_mysql.go index 73296d55..8d572db0 100644 --- a/gen_mysql.go +++ b/gen_mysql.go @@ -27,7 +27,6 @@ type Stmts struct { groupEntryExists *sql.Stmt getAttachment *sql.Stmt getForumTopics *sql.Stmt - getProfileReplies *sql.Stmt getWatchers *sql.Stmt createReport *sql.Stmt addActivity *sql.Stmt @@ -67,249 +66,283 @@ type Stmts struct { func _gen_mysql() (err error) { common.DebugLog("Building the generated statements") - log.Print("Preparing getPassword statement.") + common.DebugLog("Preparing getPassword statement.") stmts.getPassword, err = db.Prepare("SELECT `password`,`salt` FROM `users` WHERE `uid` = ?") if err != nil { + log.Print("Error in getPassword statement.") return err } - log.Print("Preparing isPluginActive statement.") + common.DebugLog("Preparing isPluginActive statement.") stmts.isPluginActive, err = db.Prepare("SELECT `active` FROM `plugins` WHERE `uname` = ?") if err != nil { + log.Print("Error in isPluginActive statement.") return err } - log.Print("Preparing getUsersOffset statement.") + common.DebugLog("Preparing getUsersOffset statement.") stmts.getUsersOffset, err = db.Prepare("SELECT `uid`,`name`,`group`,`active`,`is_super_admin`,`avatar` FROM `users` ORDER BY uid ASC LIMIT ?,?") if err != nil { + log.Print("Error in getUsersOffset statement.") return err } - log.Print("Preparing isThemeDefault statement.") + common.DebugLog("Preparing isThemeDefault statement.") stmts.isThemeDefault, err = db.Prepare("SELECT `default` FROM `themes` WHERE `uname` = ?") if err != nil { + log.Print("Error in isThemeDefault statement.") return err } - log.Print("Preparing getModlogs statement.") + common.DebugLog("Preparing getModlogs statement.") stmts.getModlogs, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `moderation_logs`") if err != nil { + log.Print("Error in getModlogs statement.") return err } - log.Print("Preparing getModlogsOffset statement.") + common.DebugLog("Preparing getModlogsOffset statement.") stmts.getModlogsOffset, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `moderation_logs` ORDER BY doneAt DESC LIMIT ?,?") if err != nil { + log.Print("Error in getModlogsOffset statement.") return err } - log.Print("Preparing getAdminlogsOffset statement.") + common.DebugLog("Preparing getAdminlogsOffset statement.") stmts.getAdminlogsOffset, err = db.Prepare("SELECT `action`,`elementID`,`elementType`,`ipaddress`,`actorID`,`doneAt` FROM `administration_logs` ORDER BY doneAt DESC LIMIT ?,?") if err != nil { + log.Print("Error in getAdminlogsOffset statement.") return err } - log.Print("Preparing getTopicFID statement.") + common.DebugLog("Preparing getTopicFID statement.") stmts.getTopicFID, err = db.Prepare("SELECT `parentID` FROM `topics` WHERE `tid` = ?") if err != nil { + log.Print("Error in getTopicFID statement.") return err } - log.Print("Preparing getUserName statement.") + common.DebugLog("Preparing getUserName statement.") stmts.getUserName, err = db.Prepare("SELECT `name` FROM `users` WHERE `uid` = ?") if err != nil { + log.Print("Error in getUserName statement.") return err } - log.Print("Preparing getEmailsByUser statement.") + common.DebugLog("Preparing getEmailsByUser statement.") stmts.getEmailsByUser, err = db.Prepare("SELECT `email`,`validated`,`token` FROM `emails` WHERE `uid` = ?") if err != nil { + log.Print("Error in getEmailsByUser statement.") return err } - log.Print("Preparing getTopicBasic statement.") + common.DebugLog("Preparing getTopicBasic statement.") stmts.getTopicBasic, err = db.Prepare("SELECT `title`,`content` FROM `topics` WHERE `tid` = ?") if err != nil { + log.Print("Error in getTopicBasic statement.") return err } - log.Print("Preparing getActivityEntry statement.") + common.DebugLog("Preparing getActivityEntry statement.") stmts.getActivityEntry, err = db.Prepare("SELECT `actor`,`targetUser`,`event`,`elementType`,`elementID` FROM `activity_stream` WHERE `asid` = ?") if err != nil { + log.Print("Error in getActivityEntry statement.") return err } - log.Print("Preparing forumEntryExists statement.") + common.DebugLog("Preparing forumEntryExists statement.") stmts.forumEntryExists, err = db.Prepare("SELECT `fid` FROM `forums` WHERE `name` = '' ORDER BY fid ASC LIMIT 0,1") if err != nil { + log.Print("Error in forumEntryExists statement.") return err } - log.Print("Preparing groupEntryExists statement.") + common.DebugLog("Preparing groupEntryExists statement.") stmts.groupEntryExists, err = db.Prepare("SELECT `gid` FROM `users_groups` WHERE `name` = '' ORDER BY gid ASC LIMIT 0,1") if err != nil { + log.Print("Error in groupEntryExists statement.") return err } - log.Print("Preparing getAttachment statement.") + common.DebugLog("Preparing getAttachment statement.") stmts.getAttachment, err = db.Prepare("SELECT `sectionID`,`sectionTable`,`originID`,`originTable`,`uploadedBy`,`path` FROM `attachments` WHERE `path` = ? AND `sectionID` = ? AND `sectionTable` = ?") if err != nil { + log.Print("Error in getAttachment statement.") return err } - log.Print("Preparing getForumTopics statement.") + common.DebugLog("Preparing getForumTopics statement.") stmts.getForumTopics, err = db.Prepare("SELECT `topics`.`tid`, `topics`.`title`, `topics`.`content`, `topics`.`createdBy`, `topics`.`is_closed`, `topics`.`sticky`, `topics`.`createdAt`, `topics`.`lastReplyAt`, `topics`.`parentID`, `users`.`name`, `users`.`avatar` FROM `topics` LEFT JOIN `users` ON `topics`.`createdBy` = `users`.`uid` WHERE `topics`.`parentID` = ? ORDER BY topics.sticky DESC,topics.lastReplyAt DESC,topics.createdBy DESC") if err != nil { + log.Print("Error in getForumTopics statement.") return err } - log.Print("Preparing getProfileReplies statement.") - stmts.getProfileReplies, err = db.Prepare("SELECT `users_replies`.`rid`, `users_replies`.`content`, `users_replies`.`createdBy`, `users_replies`.`createdAt`, `users_replies`.`lastEdit`, `users_replies`.`lastEditBy`, `users`.`avatar`, `users`.`name`, `users`.`group` FROM `users_replies` LEFT JOIN `users` ON `users_replies`.`createdBy` = `users`.`uid` WHERE `users_replies`.`uid` = ?") - if err != nil { - return err - } - - log.Print("Preparing getWatchers statement.") + common.DebugLog("Preparing getWatchers statement.") stmts.getWatchers, err = db.Prepare("SELECT `activity_subscriptions`.`user` FROM `activity_stream` INNER JOIN `activity_subscriptions` ON `activity_subscriptions`.`targetType` = `activity_stream`.`elementType` AND `activity_subscriptions`.`targetID` = `activity_stream`.`elementID` AND `activity_subscriptions`.`user` != `activity_stream`.`actor` WHERE `asid` = ?") if err != nil { + log.Print("Error in getWatchers statement.") return err } - log.Print("Preparing createReport statement.") + common.DebugLog("Preparing createReport statement.") stmts.createReport, err = db.Prepare("INSERT INTO `topics`(`title`,`content`,`parsed_content`,`createdAt`,`lastReplyAt`,`createdBy`,`lastReplyBy`,`data`,`parentID`,`css_class`) VALUES (?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,1,'report')") if err != nil { + log.Print("Error in createReport statement.") return err } - log.Print("Preparing addActivity statement.") + common.DebugLog("Preparing addActivity statement.") stmts.addActivity, err = db.Prepare("INSERT INTO `activity_stream`(`actor`,`targetUser`,`event`,`elementType`,`elementID`) VALUES (?,?,?,?,?)") if err != nil { + log.Print("Error in addActivity statement.") return err } - log.Print("Preparing notifyOne statement.") + common.DebugLog("Preparing notifyOne statement.") stmts.notifyOne, err = db.Prepare("INSERT INTO `activity_stream_matches`(`watcher`,`asid`) VALUES (?,?)") if err != nil { + log.Print("Error in notifyOne statement.") return err } - log.Print("Preparing addForumPermsToForum statement.") + common.DebugLog("Preparing addForumPermsToForum statement.") stmts.addForumPermsToForum, err = db.Prepare("INSERT INTO `forums_permissions`(`gid`,`fid`,`preset`,`permissions`) VALUES (?,?,?,?)") if err != nil { + log.Print("Error in addForumPermsToForum statement.") return err } - log.Print("Preparing addPlugin statement.") + common.DebugLog("Preparing addPlugin statement.") stmts.addPlugin, err = db.Prepare("INSERT INTO `plugins`(`uname`,`active`,`installed`) VALUES (?,?,?)") if err != nil { + log.Print("Error in addPlugin statement.") return err } - log.Print("Preparing addTheme statement.") + common.DebugLog("Preparing addTheme statement.") stmts.addTheme, err = db.Prepare("INSERT INTO `themes`(`uname`,`default`) VALUES (?,?)") if err != nil { + log.Print("Error in addTheme statement.") return err } - log.Print("Preparing createWordFilter statement.") + common.DebugLog("Preparing createWordFilter statement.") stmts.createWordFilter, err = db.Prepare("INSERT INTO `word_filters`(`find`,`replacement`) VALUES (?,?)") if err != nil { + log.Print("Error in createWordFilter statement.") return err } - log.Print("Preparing editReply statement.") + common.DebugLog("Preparing editReply statement.") stmts.editReply, err = db.Prepare("UPDATE `replies` SET `content` = ?,`parsed_content` = ? WHERE `rid` = ?") if err != nil { + log.Print("Error in editReply statement.") return err } - log.Print("Preparing updatePlugin statement.") + common.DebugLog("Preparing updatePlugin statement.") stmts.updatePlugin, err = db.Prepare("UPDATE `plugins` SET `active` = ? WHERE `uname` = ?") if err != nil { + log.Print("Error in updatePlugin statement.") return err } - log.Print("Preparing updatePluginInstall statement.") + common.DebugLog("Preparing updatePluginInstall statement.") stmts.updatePluginInstall, err = db.Prepare("UPDATE `plugins` SET `installed` = ? WHERE `uname` = ?") if err != nil { + log.Print("Error in updatePluginInstall statement.") return err } - log.Print("Preparing updateTheme statement.") + common.DebugLog("Preparing updateTheme statement.") stmts.updateTheme, err = db.Prepare("UPDATE `themes` SET `default` = ? WHERE `uname` = ?") if err != nil { + log.Print("Error in updateTheme statement.") return err } - log.Print("Preparing updateUser statement.") + common.DebugLog("Preparing updateUser statement.") stmts.updateUser, err = db.Prepare("UPDATE `users` SET `name` = ?,`email` = ?,`group` = ? WHERE `uid` = ?") if err != nil { + log.Print("Error in updateUser statement.") return err } - log.Print("Preparing updateGroupPerms statement.") + common.DebugLog("Preparing updateGroupPerms statement.") stmts.updateGroupPerms, err = db.Prepare("UPDATE `users_groups` SET `permissions` = ? WHERE `gid` = ?") if err != nil { + log.Print("Error in updateGroupPerms statement.") return err } - log.Print("Preparing updateGroup statement.") + common.DebugLog("Preparing updateGroup statement.") stmts.updateGroup, err = db.Prepare("UPDATE `users_groups` SET `name` = ?,`tag` = ? WHERE `gid` = ?") if err != nil { + log.Print("Error in updateGroup statement.") return err } - log.Print("Preparing updateEmail statement.") + common.DebugLog("Preparing updateEmail statement.") stmts.updateEmail, err = db.Prepare("UPDATE `emails` SET `email` = ?,`uid` = ?,`validated` = ?,`token` = ? WHERE `email` = ?") if err != nil { + log.Print("Error in updateEmail statement.") return err } - log.Print("Preparing verifyEmail statement.") + common.DebugLog("Preparing verifyEmail statement.") stmts.verifyEmail, err = db.Prepare("UPDATE `emails` SET `validated` = 1,`token` = '' WHERE `email` = ?") if err != nil { + log.Print("Error in verifyEmail statement.") return err } - log.Print("Preparing setTempGroup statement.") + common.DebugLog("Preparing setTempGroup statement.") stmts.setTempGroup, err = db.Prepare("UPDATE `users` SET `temp_group` = ? WHERE `uid` = ?") if err != nil { + log.Print("Error in setTempGroup statement.") return err } - log.Print("Preparing updateWordFilter statement.") + common.DebugLog("Preparing updateWordFilter statement.") stmts.updateWordFilter, err = db.Prepare("UPDATE `word_filters` SET `find` = ?,`replacement` = ? WHERE `wfid` = ?") if err != nil { + log.Print("Error in updateWordFilter statement.") return err } - log.Print("Preparing bumpSync statement.") + common.DebugLog("Preparing bumpSync statement.") stmts.bumpSync, err = db.Prepare("UPDATE `sync` SET `last_update` = UTC_TIMESTAMP()") if err != nil { + log.Print("Error in bumpSync statement.") return err } - log.Print("Preparing deleteActivityStreamMatch statement.") + common.DebugLog("Preparing deleteActivityStreamMatch statement.") stmts.deleteActivityStreamMatch, err = db.Prepare("DELETE FROM `activity_stream_matches` WHERE `watcher` = ? AND `asid` = ?") if err != nil { + log.Print("Error in deleteActivityStreamMatch statement.") return err } - log.Print("Preparing deleteWordFilter statement.") + common.DebugLog("Preparing deleteWordFilter statement.") stmts.deleteWordFilter, err = db.Prepare("DELETE FROM `word_filters` WHERE `wfid` = ?") if err != nil { + log.Print("Error in deleteWordFilter statement.") return err } - log.Print("Preparing reportExists statement.") + common.DebugLog("Preparing reportExists statement.") stmts.reportExists, err = db.Prepare("SELECT COUNT(*) AS `count` FROM `topics` WHERE `data` = ? AND `data` != '' AND `parentID` = 1") if err != nil { + log.Print("Error in reportExists statement.") return err } - log.Print("Preparing notifyWatchers statement.") + common.DebugLog("Preparing notifyWatchers statement.") stmts.notifyWatchers, err = db.Prepare("INSERT INTO `activity_stream_matches`(`watcher`,`asid`) SELECT `activity_subscriptions`.`user`, `activity_stream`.`asid` FROM `activity_stream` INNER JOIN `activity_subscriptions` ON `activity_subscriptions`.`targetType` = `activity_stream`.`elementType` AND `activity_subscriptions`.`targetID` = `activity_stream`.`elementID` AND `activity_subscriptions`.`user` != `activity_stream`.`actor` WHERE `asid` = ?") if err != nil { + log.Print("Error in notifyWatchers statement.") return err } diff --git a/gen_pgsql.go b/gen_pgsql.go index 8f19d5e7..2d228b47 100644 --- a/gen_pgsql.go +++ b/gen_pgsql.go @@ -36,75 +36,87 @@ type Stmts struct { func _gen_pgsql() (err error) { common.DebugLog("Building the generated statements") - log.Print("Preparing editReply statement.") + common.DebugLog("Preparing editReply statement.") stmts.editReply, err = db.Prepare("UPDATE `replies` SET `content` = ?,`parsed_content` = ? WHERE `rid` = ?") if err != nil { + log.Print("Error in editReply statement.") return err } - log.Print("Preparing updatePlugin statement.") + common.DebugLog("Preparing updatePlugin statement.") stmts.updatePlugin, err = db.Prepare("UPDATE `plugins` SET `active` = ? WHERE `uname` = ?") if err != nil { + log.Print("Error in updatePlugin statement.") return err } - log.Print("Preparing updatePluginInstall statement.") + common.DebugLog("Preparing updatePluginInstall statement.") stmts.updatePluginInstall, err = db.Prepare("UPDATE `plugins` SET `installed` = ? WHERE `uname` = ?") if err != nil { + log.Print("Error in updatePluginInstall statement.") return err } - log.Print("Preparing updateTheme statement.") + common.DebugLog("Preparing updateTheme statement.") stmts.updateTheme, err = db.Prepare("UPDATE `themes` SET `default` = ? WHERE `uname` = ?") if err != nil { + log.Print("Error in updateTheme statement.") return err } - log.Print("Preparing updateUser statement.") + common.DebugLog("Preparing updateUser statement.") stmts.updateUser, err = db.Prepare("UPDATE `users` SET `name` = ?,`email` = ?,`group` = ? WHERE `uid` = ?") if err != nil { + log.Print("Error in updateUser statement.") return err } - log.Print("Preparing updateGroupPerms statement.") + common.DebugLog("Preparing updateGroupPerms statement.") stmts.updateGroupPerms, err = db.Prepare("UPDATE `users_groups` SET `permissions` = ? WHERE `gid` = ?") if err != nil { + log.Print("Error in updateGroupPerms statement.") return err } - log.Print("Preparing updateGroup statement.") + common.DebugLog("Preparing updateGroup statement.") stmts.updateGroup, err = db.Prepare("UPDATE `users_groups` SET `name` = ?,`tag` = ? WHERE `gid` = ?") if err != nil { + log.Print("Error in updateGroup statement.") return err } - log.Print("Preparing updateEmail statement.") + common.DebugLog("Preparing updateEmail statement.") stmts.updateEmail, err = db.Prepare("UPDATE `emails` SET `email` = ?,`uid` = ?,`validated` = ?,`token` = ? WHERE `email` = ?") if err != nil { + log.Print("Error in updateEmail statement.") return err } - log.Print("Preparing verifyEmail statement.") + common.DebugLog("Preparing verifyEmail statement.") stmts.verifyEmail, err = db.Prepare("UPDATE `emails` SET `validated` = 1,`token` = '' WHERE `email` = ?") if err != nil { + log.Print("Error in verifyEmail statement.") return err } - log.Print("Preparing setTempGroup statement.") + common.DebugLog("Preparing setTempGroup statement.") stmts.setTempGroup, err = db.Prepare("UPDATE `users` SET `temp_group` = ? WHERE `uid` = ?") if err != nil { + log.Print("Error in setTempGroup statement.") return err } - log.Print("Preparing updateWordFilter statement.") + common.DebugLog("Preparing updateWordFilter statement.") stmts.updateWordFilter, err = db.Prepare("UPDATE `word_filters` SET `find` = ?,`replacement` = ? WHERE `wfid` = ?") if err != nil { + log.Print("Error in updateWordFilter statement.") return err } - log.Print("Preparing bumpSync statement.") + common.DebugLog("Preparing bumpSync statement.") stmts.bumpSync, err = db.Prepare("UPDATE `sync` SET `last_update` = LOCALTIMESTAMP()") if err != nil { + log.Print("Error in bumpSync statement.") return err } diff --git a/gen_router.go b/gen_router.go index a4445f22..c6c16c8c 100644 --- a/gen_router.go +++ b/gen_router.go @@ -85,7 +85,7 @@ var RouteMap = map[string]interface{}{ "routeAccountEditUsernameSubmit": routeAccountEditUsernameSubmit, "routeAccountEditEmail": routeAccountEditEmail, "routeAccountEditEmailTokenSubmit": routeAccountEditEmailTokenSubmit, - "routeProfile": routeProfile, + "routes.ViewProfile": routes.ViewProfile, "routes.BanUserSubmit": routes.BanUserSubmit, "routes.UnbanUser": routes.UnbanUser, "routes.ActivateUser": routes.ActivateUser, @@ -190,7 +190,7 @@ var routeMapEnum = map[string]int{ "routeAccountEditUsernameSubmit": 65, "routeAccountEditEmail": 66, "routeAccountEditEmailTokenSubmit": 67, - "routeProfile": 68, + "routes.ViewProfile": 68, "routes.BanUserSubmit": 69, "routes.UnbanUser": 70, "routes.ActivateUser": 71, @@ -293,7 +293,7 @@ var reverseRouteMapEnum = map[int]string{ 65: "routeAccountEditUsernameSubmit", 66: "routeAccountEditEmail", 67: "routeAccountEditEmailTokenSubmit", - 68: "routeProfile", + 68: "routes.ViewProfile", 69: "routes.BanUserSubmit", 70: "routes.UnbanUser", 71: "routes.ActivateUser", @@ -492,19 +492,26 @@ func (router *GenRouter) RemoveFunc(pattern string) error { return nil } +func (router *GenRouter) StripNewlines(data string) string { + // TODO: Strip out all sub-32s? + return strings.Replace(strings.Replace(data,"\n","",-1),"\r","",-1) +} + func (router *GenRouter) DumpRequest(req *http.Request) { - log.Print("UA: ", req.UserAgent()) - log.Print("Method: ", req.Method) + var heads string for key, value := range req.Header { for _, vvalue := range value { - log.Print("Header '" + key + "': " + vvalue + "!!") + heads += "Header '" + router.StripNewlines(key) + "': " + router.StripNewlines(vvalue) + "!!\n" } } - log.Print("req.Host: ", req.Host) - log.Print("req.URL.Path: ", req.URL.Path) - log.Print("req.URL.RawQuery: ", req.URL.RawQuery) - log.Print("req.Referer(): ", req.Referer()) - log.Print("req.RemoteAddr: ", req.RemoteAddr) + + log.Print("\nUA: " + router.StripNewlines(req.UserAgent()) + "\n" + + "Method: " + router.StripNewlines(req.Method) + "\n" + heads + + "req.Host: " + router.StripNewlines(req.Host) + "\n" + + "req.URL.Path: " + router.StripNewlines(req.URL.Path) + "\n" + + "req.URL.RawQuery: " + router.StripNewlines(req.URL.RawQuery) + "\n" + + "req.Referer(): " + router.StripNewlines(req.Referer()) + "\n" + + "req.RemoteAddr: " + req.RemoteAddr + "\n") } func (router *GenRouter) SuspiciousRequest(req *http.Request) { @@ -534,11 +541,6 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { // Deflect malformed requests if len(req.URL.Path) == 0 || req.URL.Path[0] != '/' || req.Host != common.Site.Host { - //log.Print("len(req.URL.Path): ",len(req.URL.Path)) - //log.Print("req.URL.Path[0]: ",req.URL.Path[0]) - //log.Print("req.Host: ",req.Host) - //log.Print("common.Site.Host: ",common.Site.Host) - w.WriteHeader(200) // 400 w.Write([]byte("")) log.Print("Malformed Request") @@ -547,8 +549,7 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { return } - if common.Dev.DebugMode { - // TODO: Cover more suspicious strings and at a lower layer than this + // TODO: Cover more suspicious strings and at a lower layer than this for _, char := range req.URL.Path { if char != '&' && !(char > 44 && char < 58) && char != '=' && char != '?' && !(char > 64 && char < 91) && char != '\\' && char != '_' && !(char > 96 && char < 123) { router.SuspiciousRequest(req) @@ -560,7 +561,6 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { if strings.Contains(req.URL.Path,"..") || strings.Contains(req.URL.Path,"--") || strings.Contains(lowerPath,".php") || strings.Contains(lowerPath,".asp") || strings.Contains(lowerPath,".cgi") || strings.Contains(lowerPath,".py") || strings.Contains(lowerPath,".sql") { router.SuspiciousRequest(req) } - } var prefix, extraData string prefix = req.URL.Path[0:strings.IndexByte(req.URL.Path[1:],'/') + 1] @@ -1264,7 +1264,7 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { default: req.URL.Path += extraData counters.RouteViewCounter.Bump(68) - err = routeProfile(w,req,user) + err = routes.ViewProfile(w,req,user) } if err != nil { router.handleError(err,w,req,user) diff --git a/panel_routes.go b/panel_routes.go index ef13cfa1..916db63c 100644 --- a/panel_routes.go +++ b/panel_routes.go @@ -619,6 +619,34 @@ func panelAnalyticsTimeRangeToLabelList(timeRange AnalyticsTimeRange) (revLabelL return revLabelList, labelList, viewMap } +func panelAnalyticsRowsToViewMap(rows *sql.Rows, labelList []int64, viewMap map[int64]int64) (map[int64]int64, error) { + defer rows.Close() + for rows.Next() { + var count int64 + var createdAt time.Time + err := rows.Scan(&count, &createdAt) + if err != nil { + return viewMap, err + } + + var unixCreatedAt = createdAt.Unix() + // TODO: Bulk log this + if common.Dev.SuperDebug { + log.Print("count: ", count) + log.Print("createdAt: ", createdAt) + log.Print("unixCreatedAt: ", unixCreatedAt) + } + + for _, value := range labelList { + if unixCreatedAt > value { + viewMap[value] += count + break + } + } + } + return viewMap, rows.Err() +} + func routePanelAnalyticsViews(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError { headerVars, stats, ferr := common.PanelUserCheck(w, r, &user) if ferr != nil { @@ -634,47 +662,26 @@ func routePanelAnalyticsViews(w http.ResponseWriter, r *http.Request, user commo } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsViews") - acc := qgen.Builder.Accumulator() rows, err := acc.Select("viewchunks").Columns("count, createdAt").Where("route = ''").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query() if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - - var unixCreatedAt = createdAt.Unix() - log.Print("unixCreatedAt: ", unixCreatedAt) - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 var viewItems []common.PanelAnalyticsItem for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) viewItems = append(viewItems, common.PanelAnalyticsItem{Time: value, Count: viewMap[value]}) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) pi := common.PanelAnalyticsPage{common.GetTitlePhrase("panel_analytics"), user, headerVars, stats, "analytics", graph, viewItems, timeRange.Range} return panelRenderTemplate("panel_analytics_views", w, r, user, &pi) @@ -695,48 +702,27 @@ func routePanelAnalyticsRouteViews(w http.ResponseWriter, r *http.Request, user } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsRouteViews") - acc := qgen.Builder.Accumulator() // TODO: Validate the route is valid rows, err := acc.Select("viewchunks").Columns("count, createdAt").Where("route = ?").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query(route) if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - - var unixCreatedAt = createdAt.Unix() - log.Print("unixCreatedAt: ", unixCreatedAt) - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 var viewItems []common.PanelAnalyticsItem for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) viewItems = append(viewItems, common.PanelAnalyticsItem{Time: value, Count: viewMap[value]}) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) pi := common.PanelAnalyticsRoutePage{common.GetTitlePhrase("panel_analytics"), user, headerVars, stats, "analytics", html.EscapeString(route), graph, viewItems, timeRange.Range} return panelRenderTemplate("panel_analytics_route_views", w, r, user, &pi) @@ -757,50 +743,25 @@ func routePanelAnalyticsAgentViews(w http.ResponseWriter, r *http.Request, user } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsAgentViews") - acc := qgen.Builder.Accumulator() // TODO: Verify the agent is valid rows, err := acc.Select("viewchunks_agents").Columns("count, createdAt").Where("browser = ?").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query(agent) if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - - var unixCreatedAt = createdAt.Unix() - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - log.Print("unixCreatedAt: ", unixCreatedAt) - } - - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) // ? Only allow valid agents? The problem with this is that agents wind up getting renamed and it would take a migration to get them all up to snuff agent = html.EscapeString(agent) @@ -828,50 +789,25 @@ func routePanelAnalyticsForumViews(w http.ResponseWriter, r *http.Request, user } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsForumViews") - acc := qgen.Builder.Accumulator() // TODO: Verify the agent is valid rows, err := acc.Select("viewchunks_forums").Columns("count, createdAt").Where("forum = ?").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query(sfid) if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - - var unixCreatedAt = createdAt.Unix() - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - log.Print("unixCreatedAt: ", unixCreatedAt) - } - - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) fid, err := strconv.Atoi(sfid) if err != nil { @@ -901,50 +837,25 @@ func routePanelAnalyticsSystemViews(w http.ResponseWriter, r *http.Request, user } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsSystemViews") - acc := qgen.Builder.Accumulator() // TODO: Verify the agent is valid rows, err := acc.Select("viewchunks_systems").Columns("count, createdAt").Where("system = ?").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query(system) if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - - var unixCreatedAt = createdAt.Unix() - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - log.Print("unixCreatedAt: ", unixCreatedAt) - } - - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) system = html.EscapeString(system) friendlySystem, ok := common.GetOSPhrase(system) @@ -971,50 +882,25 @@ func routePanelAnalyticsReferrerViews(w http.ResponseWriter, r *http.Request, us } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsReferrerViews") - acc := qgen.Builder.Accumulator() // TODO: Verify the agent is valid rows, err := acc.Select("viewchunks_referrers").Columns("count, createdAt").Where("domain = ?").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query(domain) if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - - var unixCreatedAt = createdAt.Unix() - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - log.Print("unixCreatedAt: ", unixCreatedAt) - } - - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) pi := common.PanelAnalyticsAgentPage{common.GetTitlePhrase("panel_analytics"), user, headerVars, stats, "analytics", html.EscapeString(domain), "", graph, timeRange.Range} return panelRenderTemplate("panel_analytics_referrer_views", w, r, user, &pi) @@ -1035,51 +921,26 @@ func routePanelAnalyticsTopics(w http.ResponseWriter, r *http.Request, user comm } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsTopics") - acc := qgen.Builder.Accumulator() rows, err := acc.Select("topicchunks").Columns("count, createdAt").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query() if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - - var unixCreatedAt = createdAt.Unix() - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - log.Print("unixCreatedAt: ", unixCreatedAt) - } - - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 var viewItems []common.PanelAnalyticsItem for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) viewItems = append(viewItems, common.PanelAnalyticsItem{Time: value, Count: viewMap[value]}) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) pi := common.PanelAnalyticsPage{common.GetTitlePhrase("panel_analytics"), user, headerVars, stats, "analytics", graph, viewItems, timeRange.Range} return panelRenderTemplate("panel_analytics_topics", w, r, user, &pi) @@ -1100,61 +961,57 @@ func routePanelAnalyticsPosts(w http.ResponseWriter, r *http.Request, user commo } revLabelList, labelList, viewMap := panelAnalyticsTimeRangeToLabelList(timeRange) - var viewList []int64 common.DebugLog("in routePanelAnalyticsPosts") - acc := qgen.Builder.Accumulator() rows, err := acc.Select("postchunks").Columns("count, createdAt").DateCutoff("createdAt", timeRange.Quantity, timeRange.Unit).Query() if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int64 - var createdAt time.Time - err := rows.Scan(&count, &createdAt) - if err != nil { - return common.InternalError(err, w, r) - } - - var unixCreatedAt = createdAt.Unix() - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("createdAt: ", createdAt) - log.Print("unixCreatedAt: ", unixCreatedAt) - } - - for _, value := range labelList { - if unixCreatedAt > value { - viewMap[value] += count - break - } - } - } - err = rows.Err() + viewMap, err = panelAnalyticsRowsToViewMap(rows, labelList, viewMap) if err != nil { return common.InternalError(err, w, r) } + var viewList []int64 var viewItems []common.PanelAnalyticsItem for _, value := range revLabelList { viewList = append(viewList, viewMap[value]) viewItems = append(viewItems, common.PanelAnalyticsItem{Time: value, Count: viewMap[value]}) } graph := common.PanelTimeGraph{Series: viewList, Labels: labelList} - log.Printf("graph: %+v\n", graph) + common.DebugLogf("graph: %+v\n", graph) pi := common.PanelAnalyticsPage{common.GetTitlePhrase("panel_analytics"), user, headerVars, stats, "analytics", graph, viewItems, timeRange.Range} return panelRenderTemplate("panel_analytics_posts", w, r, user, &pi) } +func panelAnalyticsRowsToNameMap(rows *sql.Rows) (map[string]int, error) { + nameMap := make(map[string]int) + defer rows.Close() + for rows.Next() { + var count int + var name string + err := rows.Scan(&count, &name) + if err != nil { + return nameMap, err + } + + // TODO: Bulk log this + if common.Dev.SuperDebug { + log.Print("count: ", count) + log.Print("name: ", name) + } + nameMap[name] += count + } + return nameMap, rows.Err() +} + func routePanelAnalyticsForums(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError { headerVars, stats, ferr := common.PanelUserCheck(w, r, &user) if ferr != nil { return ferr } - var forumMap = make(map[string]int) timeRange, err := panelAnalyticsTimeRange(r.FormValue("timeRange")) if err != nil { @@ -1166,24 +1023,8 @@ func routePanelAnalyticsForums(w http.ResponseWriter, r *http.Request, user comm if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int - var forum string - err := rows.Scan(&count, &forum) - if err != nil { - return common.InternalError(err, w, r) - } - - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("forum: ", forum) - } - forumMap[forum] += count - } - err = rows.Err() + forumMap, err := panelAnalyticsRowsToNameMap(rows) if err != nil { return common.InternalError(err, w, r) } @@ -1215,8 +1056,6 @@ func routePanelAnalyticsRoutes(w http.ResponseWriter, r *http.Request, user comm if ferr != nil { return ferr } - var routeMap = make(map[string]int) - timeRange, err := panelAnalyticsTimeRange(r.FormValue("timeRange")) if err != nil { return common.LocalError(err.Error(), w, r, user) @@ -1227,24 +1066,8 @@ func routePanelAnalyticsRoutes(w http.ResponseWriter, r *http.Request, user comm if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int - var route string - err := rows.Scan(&count, &route) - if err != nil { - return common.InternalError(err, w, r) - } - - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("route: ", route) - } - routeMap[route] += count - } - err = rows.Err() + routeMap, err := panelAnalyticsRowsToNameMap(rows) if err != nil { return common.InternalError(err, w, r) } @@ -1267,8 +1090,6 @@ func routePanelAnalyticsAgents(w http.ResponseWriter, r *http.Request, user comm if ferr != nil { return ferr } - var agentMap = make(map[string]int) - timeRange, err := panelAnalyticsTimeRange(r.FormValue("timeRange")) if err != nil { return common.LocalError(err.Error(), w, r, user) @@ -1279,24 +1100,8 @@ func routePanelAnalyticsAgents(w http.ResponseWriter, r *http.Request, user comm if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int - var agent string - err := rows.Scan(&count, &agent) - if err != nil { - return common.InternalError(err, w, r) - } - - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("agent: ", agent) - } - agentMap[agent] += count - } - err = rows.Err() + agentMap, err := panelAnalyticsRowsToNameMap(rows) if err != nil { return common.InternalError(err, w, r) } @@ -1324,8 +1129,6 @@ func routePanelAnalyticsSystems(w http.ResponseWriter, r *http.Request, user com if ferr != nil { return ferr } - var osMap = make(map[string]int) - timeRange, err := panelAnalyticsTimeRange(r.FormValue("timeRange")) if err != nil { return common.LocalError(err.Error(), w, r, user) @@ -1336,24 +1139,8 @@ func routePanelAnalyticsSystems(w http.ResponseWriter, r *http.Request, user com if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int - var system string - err := rows.Scan(&count, &system) - if err != nil { - return common.InternalError(err, w, r) - } - - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("system: ", system) - } - osMap[system] += count - } - err = rows.Err() + osMap, err := panelAnalyticsRowsToNameMap(rows) if err != nil { return common.InternalError(err, w, r) } @@ -1381,8 +1168,6 @@ func routePanelAnalyticsReferrers(w http.ResponseWriter, r *http.Request, user c if ferr != nil { return ferr } - var refMap = make(map[string]int) - timeRange, err := panelAnalyticsTimeRange(r.FormValue("timeRange")) if err != nil { return common.LocalError(err.Error(), w, r, user) @@ -1393,24 +1178,8 @@ func routePanelAnalyticsReferrers(w http.ResponseWriter, r *http.Request, user c if err != nil && err != ErrNoRows { return common.InternalError(err, w, r) } - defer rows.Close() - for rows.Next() { - var count int - var domain string - err := rows.Scan(&count, &domain) - if err != nil { - return common.InternalError(err, w, r) - } - - // TODO: Bulk log this - if common.Dev.SuperDebug { - log.Print("count: ", count) - log.Print("domain: ", domain) - } - refMap[domain] += count - } - err = rows.Err() + refMap, err := panelAnalyticsRowsToNameMap(rows) if err != nil { return common.InternalError(err, w, r) } diff --git a/plugin_markdown.go b/plugin_markdown.go index 17077d8a..d3e6ba03 100644 --- a/plugin_markdown.go +++ b/plugin_markdown.go @@ -63,7 +63,7 @@ func _markdownParse(msg string, n int) string { var outbytes []byte var lastElement int - log.Printf("Initial Message: %+v\n", strings.Replace(msg, "\r", "\\r", -1)) + common.DebugLogf("Initial Message: %+v\n", strings.Replace(msg, "\r", "\\r", -1)) for index := 0; index < len(msg); index++ { //log.Print("--OUTER MARKDOWN LOOP START--") @@ -229,7 +229,6 @@ func _markdownParse(msg string, n int) string { //log.Print("sIndex: ", sIndex) //log.Print("lIndex: ", lIndex) - if lIndex <= sIndex { //log.Print("unclosed markdown element @ lIndex <= sIndex") outbytes = append(outbytes, msg[lastElement:startIndex]...) diff --git a/query_gen/lib/mssql.go b/query_gen/lib/mssql.go index b9d4fcfe..d9ff2b22 100644 --- a/query_gen/lib/mssql.go +++ b/query_gen/lib/mssql.go @@ -1088,9 +1088,10 @@ func (adapter *MssqlAdapter) Write() error { if stmt.Type != "create-table" { stmts += "\t" + name + " *sql.Stmt\n" body += ` - log.Print("Preparing ` + name + ` statement.") + common.DebugLog("Preparing ` + name + ` statement.") stmts.` + name + `, err = db.Prepare("` + stmt.Contents + `") if err != nil { + log.Print("Error in ` + name + ` statement.") log.Print("Bad Query: ","` + stmt.Contents + `") return err } diff --git a/query_gen/lib/mysql.go b/query_gen/lib/mysql.go index 433f9d6c..e13bae8c 100644 --- a/query_gen/lib/mysql.go +++ b/query_gen/lib/mysql.go @@ -639,18 +639,20 @@ func (adapter *MysqlAdapter) Write() error { if stmt.Type == "upsert" { stmts += "\t" + name + " *qgen.MySQLUpsertCallback\n" body += ` - log.Print("Preparing ` + name + ` statement.") + common.DebugLog("Preparing ` + name + ` statement.") stmts.` + name + `, err = qgen.PrepareMySQLUpsertCallback(db, "` + stmt.Contents + `") if err != nil { + log.Print("Error in ` + name + ` statement.") return err } ` } else if stmt.Type != "create-table" { stmts += "\t" + name + " *sql.Stmt\n" body += ` - log.Print("Preparing ` + name + ` statement.") + common.DebugLog("Preparing ` + name + ` statement.") stmts.` + name + `, err = db.Prepare("` + stmt.Contents + `") if err != nil { + log.Print("Error in ` + name + ` statement.") return err } ` diff --git a/query_gen/lib/pgsql.go b/query_gen/lib/pgsql.go index ae9a3e44..f5822425 100644 --- a/query_gen/lib/pgsql.go +++ b/query_gen/lib/pgsql.go @@ -347,9 +347,10 @@ func (adapter *PgsqlAdapter) Write() error { if stmt.Type != "create-table" { stmts += "\t" + name + " *sql.Stmt\n" body += ` - log.Print("Preparing ` + name + ` statement.") + common.DebugLog("Preparing ` + name + ` statement.") stmts.` + name + `, err = db.Prepare("` + stmt.Contents + `") if err != nil { + log.Print("Error in ` + name + ` statement.") return err } ` diff --git a/query_gen/main.go b/query_gen/main.go index e27ebd36..89d26655 100644 --- a/query_gen/main.go +++ b/query_gen/main.go @@ -255,8 +255,6 @@ func writeSelects(adapter qgen.Adapter) error { func writeLeftJoins(adapter qgen.Adapter) error { adapter.SimpleLeftJoin("getForumTopics", "topics", "users", "topics.tid, topics.title, topics.content, topics.createdBy, topics.is_closed, topics.sticky, topics.createdAt, topics.lastReplyAt, topics.parentID, users.name, users.avatar", "topics.createdBy = users.uid", "topics.parentID = ?", "topics.sticky DESC, topics.lastReplyAt DESC, topics.createdBy desc", "") - adapter.SimpleLeftJoin("getProfileReplies", "users_replies", "users", "users_replies.rid, users_replies.content, users_replies.createdBy, users_replies.createdAt, users_replies.lastEdit, users_replies.lastEditBy, users.avatar, users.name, users.group", "users_replies.createdBy = users.uid", "users_replies.uid = ?", "", "") - return nil } diff --git a/router_gen/main.go b/router_gen/main.go index fee0ee16..fd43948c 100644 --- a/router_gen/main.go +++ b/router_gen/main.go @@ -343,19 +343,26 @@ func (router *GenRouter) RemoveFunc(pattern string) error { return nil } +func (router *GenRouter) StripNewlines(data string) string { + // TODO: Strip out all sub-32s? + return strings.Replace(strings.Replace(data,"\n","",-1),"\r","",-1) +} + func (router *GenRouter) DumpRequest(req *http.Request) { - log.Print("UA: ", req.UserAgent()) - log.Print("Method: ", req.Method) + var heads string for key, value := range req.Header { for _, vvalue := range value { - log.Print("Header '" + key + "': " + vvalue + "!!") + heads += "Header '" + router.StripNewlines(key) + "': " + router.StripNewlines(vvalue) + "!!\n" } } - log.Print("req.Host: ", req.Host) - log.Print("req.URL.Path: ", req.URL.Path) - log.Print("req.URL.RawQuery: ", req.URL.RawQuery) - log.Print("req.Referer(): ", req.Referer()) - log.Print("req.RemoteAddr: ", req.RemoteAddr) + + log.Print("\nUA: " + router.StripNewlines(req.UserAgent()) + "\n" + + "Method: " + router.StripNewlines(req.Method) + "\n" + heads + + "req.Host: " + router.StripNewlines(req.Host) + "\n" + + "req.URL.Path: " + router.StripNewlines(req.URL.Path) + "\n" + + "req.URL.RawQuery: " + router.StripNewlines(req.URL.RawQuery) + "\n" + + "req.Referer(): " + router.StripNewlines(req.Referer()) + "\n" + + "req.RemoteAddr: " + req.RemoteAddr + "\n") } func (router *GenRouter) SuspiciousRequest(req *http.Request) { @@ -385,11 +392,6 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { // Deflect malformed requests if len(req.URL.Path) == 0 || req.URL.Path[0] != '/' || req.Host != common.Site.Host { - //log.Print("len(req.URL.Path): ",len(req.URL.Path)) - //log.Print("req.URL.Path[0]: ",req.URL.Path[0]) - //log.Print("req.Host: ",req.Host) - //log.Print("common.Site.Host: ",common.Site.Host) - w.WriteHeader(200) // 400 w.Write([]byte("")) log.Print("Malformed Request") @@ -398,8 +400,7 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { return } - if common.Dev.DebugMode { - // TODO: Cover more suspicious strings and at a lower layer than this + // TODO: Cover more suspicious strings and at a lower layer than this for _, char := range req.URL.Path { if char != '&' && !(char > 44 && char < 58) && char != '=' && char != '?' && !(char > 64 && char < 91) && char != '\\' && char != '_' && !(char > 96 && char < 123) { router.SuspiciousRequest(req) @@ -411,7 +412,6 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { if strings.Contains(req.URL.Path,"..") || strings.Contains(req.URL.Path,"--") || strings.Contains(lowerPath,".php") || strings.Contains(lowerPath,".asp") || strings.Contains(lowerPath,".cgi") || strings.Contains(lowerPath,".py") || strings.Contains(lowerPath,".sql") { router.SuspiciousRequest(req) } - } var prefix, extraData string prefix = req.URL.Path[0:strings.IndexByte(req.URL.Path[1:],'/') + 1] diff --git a/router_gen/routes.go b/router_gen/routes.go index 7c8cda90..364c2f0d 100644 --- a/router_gen/routes.go +++ b/router_gen/routes.go @@ -39,7 +39,7 @@ func routes() { func buildUserRoutes() { userGroup := newRouteGroup("/user/") userGroup.Routes( - View("routeProfile", "/user/").LitBefore("req.URL.Path += extraData"), + View("routes.ViewProfile", "/user/").LitBefore("req.URL.Path += extraData"), MemberView("routes.AccountEditCritical", "/user/edit/critical/"), Action("routeAccountEditCriticalSubmit", "/user/edit/critical/submit/"), // TODO: Full test this MemberView("routeAccountEditAvatar", "/user/edit/avatar/"), diff --git a/routes.go b/routes.go index d93f60b1..04c81b4e 100644 --- a/routes.go +++ b/routes.go @@ -11,8 +11,6 @@ import ( "log" "net/http" "strconv" - "strings" - "time" "./common" ) @@ -98,105 +96,6 @@ func routeForums(w http.ResponseWriter, r *http.Request, user common.User) commo return nil } -func routeProfile(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError { - headerVars, ferr := common.UserCheck(w, r, &user) - if ferr != nil { - return ferr - } - - var err error - var replyCreatedAt time.Time - var replyContent, replyCreatedByName, replyRelativeCreatedAt, replyAvatar, replyTag, replyClassName string - var rid, replyCreatedBy, replyLastEdit, replyLastEditBy, replyLines, replyGroup int - var replyList []common.ReplyUser - - // SEO URLs... - // TODO: Do a 301 if it's the wrong username? Do a canonical too? - halves := strings.Split(r.URL.Path[len("/user/"):], ".") - if len(halves) < 2 { - halves = append(halves, halves[0]) - } - - pid, err := strconv.Atoi(halves[1]) - if err != nil { - return common.LocalError("The provided UserID is not a valid number.", w, r, user) - } - - var puser *common.User - if pid == user.ID { - user.IsMod = true - 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? - puser, err = common.Users.Get(pid) - if err == ErrNoRows { - return common.NotFound(w, r, headerVars) - } else if err != nil { - return common.InternalError(err, w, r) - } - } - - // Get the replies.. - rows, err := stmts.getProfileReplies.Query(puser.ID) - if err != nil { - return common.InternalError(err, w, r) - } - defer rows.Close() - - for rows.Next() { - err := rows.Scan(&rid, &replyContent, &replyCreatedBy, &replyCreatedAt, &replyLastEdit, &replyLastEditBy, &replyAvatar, &replyCreatedByName, &replyGroup) - if err != nil { - return common.InternalError(err, w, r) - } - - group, err := common.Groups.Get(replyGroup) - if err != nil { - return common.InternalError(err, w, r) - } - - replyLines = strings.Count(replyContent, "\n") - if group.IsMod || group.IsAdmin { - replyClassName = common.Config.StaffCSS - } else { - replyClassName = "" - } - replyAvatar = common.BuildAvatar(replyCreatedBy, replyAvatar) - - if group.Tag != "" { - replyTag = group.Tag - } else if puser.ID == replyCreatedBy { - replyTag = "Profile Owner" - } else { - replyTag = "" - } - - replyLiked := false - replyLikeCount := 0 - replyRelativeCreatedAt = common.RelativeTime(replyCreatedAt) - - // TODO: Add a hook here - - replyList = append(replyList, common.ReplyUser{rid, puser.ID, replyContent, common.ParseMessage(replyContent, 0, ""), replyCreatedBy, common.BuildProfileURL(common.NameToSlug(replyCreatedByName), replyCreatedBy), replyCreatedByName, replyGroup, replyCreatedAt, replyRelativeCreatedAt, replyLastEdit, replyLastEditBy, replyAvatar, replyClassName, replyLines, replyTag, "", "", "", 0, "", replyLiked, replyLikeCount, "", ""}) - } - err = rows.Err() - if err != nil { - return common.InternalError(err, w, r) - } - - // TODO: Add a phrase for this title - ppage := common.ProfilePage{puser.Name + "'s Profile", user, headerVars, replyList, *puser} - if common.RunPreRenderHook("pre_render_profile", w, r, &user, &ppage) { - return nil - } - - err = common.RunThemeTemplate(headerVars.Theme.Name, "profile", ppage, w) - if err != nil { - return common.InternalError(err, w, r) - } - return nil -} - // TODO: Set the cookie domain func routeChangeTheme(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError { //headerLite, _ := SimpleUserCheck(w, r, &user) diff --git a/routes/profile.go b/routes/profile.go new file mode 100644 index 00000000..eaf48975 --- /dev/null +++ b/routes/profile.go @@ -0,0 +1,126 @@ +package routes + +import ( + "database/sql" + "net/http" + "strconv" + "strings" + "time" + + "../common" + "../query_gen/lib" +) + +type ProfileStmts struct { + getReplies *sql.Stmt +} + +var profileStmts ProfileStmts + +// TODO: Move these DbInits into some sort of abstraction +func init() { + common.DbInits.Add(func(acc *qgen.Accumulator) error { + profileStmts = ProfileStmts{ + getReplies: acc.SimpleLeftJoin("users_replies", "users", "users_replies.rid, users_replies.content, users_replies.createdBy, users_replies.createdAt, users_replies.lastEdit, users_replies.lastEditBy, users.avatar, users.name, users.group", "users_replies.createdBy = users.uid", "users_replies.uid = ?", "", ""), + } + return acc.FirstError() + }) +} + +func ViewProfile(w http.ResponseWriter, r *http.Request, user common.User) common.RouteError { + headerVars, ferr := common.UserCheck(w, r, &user) + if ferr != nil { + return ferr + } + + var err error + var replyCreatedAt time.Time + var replyContent, replyCreatedByName, replyRelativeCreatedAt, replyAvatar, replyTag, replyClassName string + var rid, replyCreatedBy, replyLastEdit, replyLastEditBy, replyLines, replyGroup int + var replyList []common.ReplyUser + + // SEO URLs... + // TODO: Do a 301 if it's the wrong username? Do a canonical too? + halves := strings.Split(r.URL.Path[len("/user/"):], ".") + if len(halves) < 2 { + halves = append(halves, halves[0]) + } + pid, err := strconv.Atoi(halves[1]) + if err != nil { + return common.LocalError("The provided UserID is not a valid number.", w, r, user) + } + + var puser *common.User + if pid == user.ID { + user.IsMod = true + 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? + puser, err = common.Users.Get(pid) + if err == sql.ErrNoRows { + return common.NotFound(w, r, headerVars) + } else if err != nil { + return common.InternalError(err, w, r) + } + } + + // Get the replies.. + rows, err := profileStmts.getReplies.Query(puser.ID) + if err != nil { + return common.InternalError(err, w, r) + } + defer rows.Close() + + for rows.Next() { + err := rows.Scan(&rid, &replyContent, &replyCreatedBy, &replyCreatedAt, &replyLastEdit, &replyLastEditBy, &replyAvatar, &replyCreatedByName, &replyGroup) + if err != nil { + return common.InternalError(err, w, r) + } + + group, err := common.Groups.Get(replyGroup) + if err != nil { + return common.InternalError(err, w, r) + } + + replyLines = strings.Count(replyContent, "\n") + if group.IsMod || group.IsAdmin { + replyClassName = common.Config.StaffCSS + } else { + replyClassName = "" + } + replyAvatar = common.BuildAvatar(replyCreatedBy, replyAvatar) + + if group.Tag != "" { + replyTag = group.Tag + } else if puser.ID == replyCreatedBy { + replyTag = "Profile Owner" + } else { + replyTag = "" + } + + replyLiked := false + replyLikeCount := 0 + replyRelativeCreatedAt = common.RelativeTime(replyCreatedAt) + + // TODO: Add a hook here + + replyList = append(replyList, common.ReplyUser{rid, puser.ID, replyContent, common.ParseMessage(replyContent, 0, ""), replyCreatedBy, common.BuildProfileURL(common.NameToSlug(replyCreatedByName), replyCreatedBy), replyCreatedByName, replyGroup, replyCreatedAt, replyRelativeCreatedAt, replyLastEdit, replyLastEditBy, replyAvatar, replyClassName, replyLines, replyTag, "", "", "", 0, "", replyLiked, replyLikeCount, "", ""}) + } + err = rows.Err() + if err != nil { + return common.InternalError(err, w, r) + } + + // TODO: Add a phrase for this title + ppage := common.ProfilePage{puser.Name + "'s Profile", user, headerVars, replyList, *puser} + if common.RunPreRenderHook("pre_render_profile", w, r, &user, &ppage) { + return nil + } + + err = common.RunThemeTemplate(headerVars.Theme.Name, "profile", ppage, w) + if err != nil { + return common.InternalError(err, w, r) + } + return nil +} diff --git a/routes/topic.go b/routes/topic.go index 3cb52680..73ab9701 100644 --- a/routes/topic.go +++ b/routes/topic.go @@ -318,10 +318,8 @@ func CreateTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User) var maxPollOptions = 10 var pollInputItems = make(map[int]string) for key, values := range r.Form { - //if common.Dev.SuperDebug { - log.Print("key: ", key) - log.Printf("values: %+v\n", values) - //} + common.DebugDetail("key: ", key) + common.DebugDetailf("values: %+v\n", values) for _, value := range values { if strings.HasPrefix(key, "pollinputitem[") { halves := strings.Split(key, "[") @@ -548,7 +546,7 @@ func DeleteTopicSubmit(w http.ResponseWriter, r *http.Request, user common.User) return common.InternalErrorJSQ(err,w,r,isJs) }*/ - log.Printf("Topic #%d was deleted by common.User #%d", tid, user.ID) + log.Printf("Topic #%d was deleted by UserID #%d", tid, user.ID) } http.Redirect(w, r, "/", http.StatusSeeOther) return nil diff --git a/template_list.go b/template_list.go index f0336911..d0c1cf48 100644 --- a/template_list.go +++ b/template_list.go @@ -683,41 +683,48 @@ var profile_7 = []byte(`
- `) var profile_8 = []byte(`
- `) -var profile_9 = []byte(`Unban - `) -var profile_12 = []byte(`Ban`) -var profile_13 = []byte(` + Login for options
`) -var profile_14 = []byte(` +var profile_9 = []byte(` + + `) +var profile_10 = []byte(`
+ `) +var profile_11 = []byte(`Unban + `) +var profile_14 = []byte(`Ban`) +var profile_15 = []byte(` +
`) +var profile_16 = []byte(`
+var profile_17 = []byte(`?session=`) +var profile_18 = []byte(`&type=user" class="profile_menu_item report_item" aria-label="Report User" title="Report User">
+ `) +var profile_19 = []byte(`
`) -var profile_17 = []byte(` +var profile_20 = []byte(` +var profile_25 = []byte(`
`) -var profile_23 = []byte(` +var profile_26 = []byte(`
+var profile_27 = []byte(`" method="post"> +var profile_28 = []byte(`' type="hidden" />
@@ -847,13 +855,13 @@ var profile_25 = []byte(`' type="hidden" />
`) -var profile_26 = []byte(` +var profile_29 = []byte(`
`) -var profile_27 = []byte(` +var profile_30 = []byte(`