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(`
-
- Add Friend -
`) 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(`