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.
This commit is contained in:
parent
0879f56893
commit
8ecc637ab9
|
@ -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()
|
||||
|
|
128
gen_mssql.go
128
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
|
||||
}
|
||||
|
|
127
gen_mysql.go
127
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
|
||||
}
|
||||
|
||||
|
|
36
gen_pgsql.go
36
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
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
387
panel_routes.go
387
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)
|
||||
}
|
||||
|
|
|
@ -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]...)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
`
|
||||
|
|
|
@ -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
|
||||
}
|
||||
`
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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/"),
|
||||
|
|
101
routes.go
101
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)
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -683,41 +683,48 @@ var profile_7 = []byte(`
|
|||
</div>
|
||||
</div>
|
||||
<div class="passiveBlock">
|
||||
<div class="rowitem passive">
|
||||
<a class="profile_menu_item">Add Friend</a>
|
||||
</div>
|
||||
`)
|
||||
var profile_8 = []byte(`<div class="rowitem passive">
|
||||
`)
|
||||
var profile_9 = []byte(`<a href="/users/unban/`)
|
||||
var profile_10 = []byte(`?session=`)
|
||||
var profile_11 = []byte(`" class="profile_menu_item">Unban</a>
|
||||
`)
|
||||
var profile_12 = []byte(`<a href="#ban_user" class="profile_menu_item">Ban</a>`)
|
||||
var profile_13 = []byte(`
|
||||
<a class="profile_menu_item">Login for options</a>
|
||||
</div>`)
|
||||
var profile_14 = []byte(`
|
||||
var profile_9 = []byte(`
|
||||
<!--<div class="rowitem passive">
|
||||
<a class="profile_menu_item">Add Friend</a>
|
||||
</div>-->
|
||||
`)
|
||||
var profile_10 = []byte(`<div class="rowitem passive">
|
||||
`)
|
||||
var profile_11 = []byte(`<a href="/users/unban/`)
|
||||
var profile_12 = []byte(`?session=`)
|
||||
var profile_13 = []byte(`" class="profile_menu_item">Unban</a>
|
||||
`)
|
||||
var profile_14 = []byte(`<a href="#ban_user" class="profile_menu_item">Ban</a>`)
|
||||
var profile_15 = []byte(`
|
||||
</div>`)
|
||||
var profile_16 = []byte(`
|
||||
<div class="rowitem passive">
|
||||
<a href="/report/submit/`)
|
||||
var profile_15 = []byte(`?session=`)
|
||||
var profile_16 = []byte(`&type=user" class="profile_menu_item report_item" aria-label="Report User" title="Report User"></a>
|
||||
var profile_17 = []byte(`?session=`)
|
||||
var profile_18 = []byte(`&type=user" class="profile_menu_item report_item" aria-label="Report User" title="Report User"></a>
|
||||
</div>
|
||||
`)
|
||||
var profile_19 = []byte(`
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="profile_right_lane" class="colstack_right">
|
||||
`)
|
||||
var profile_17 = []byte(`
|
||||
var profile_20 = []byte(`
|
||||
<!-- TODO: Inline the display: none; CSS -->
|
||||
<div id="ban_user_head" class="colstack_item colstack_head hash_hide ban_user_hash" style="display: none;">
|
||||
<div class="rowitem"><h1><a>Ban User</a></h1></div>
|
||||
</div>
|
||||
<form id="ban_user_form" class="hash_hide ban_user_hash" action="/users/ban/submit/`)
|
||||
var profile_18 = []byte(`?session=`)
|
||||
var profile_19 = []byte(`" method="post" style="display: none;">
|
||||
var profile_21 = []byte(`?session=`)
|
||||
var profile_22 = []byte(`" method="post" style="display: none;">
|
||||
`)
|
||||
var profile_20 = []byte(`
|
||||
var profile_23 = []byte(`
|
||||
<div class="colline">If all the fields are left blank, the ban will be permanent.</div>
|
||||
<div class="colstack_item">
|
||||
<div class="formrow real_first_child">
|
||||
|
@ -748,7 +755,7 @@ var profile_20 = []byte(`
|
|||
</div>
|
||||
</form>
|
||||
`)
|
||||
var profile_21 = []byte(`
|
||||
var profile_24 = []byte(`
|
||||
|
||||
<div id="profile_comments_head" class="colstack_item colstack_head hash_hide">
|
||||
<div class="rowitem"><h1><a>Comments</a></h1></div>
|
||||
|
@ -828,15 +835,16 @@ var profile_comments_row_36 = []byte(`&type=user-reply"><button class="username
|
|||
var profile_comments_row_37 = []byte(`</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="after_comment"></div>
|
||||
`)
|
||||
var profile_22 = []byte(`</div>
|
||||
var profile_25 = []byte(`</div>
|
||||
|
||||
`)
|
||||
var profile_23 = []byte(`
|
||||
var profile_26 = []byte(`
|
||||
<form id="profile_comments_form" class="hash_hide" action="/profile/reply/create/?session=`)
|
||||
var profile_24 = []byte(`" method="post">
|
||||
var profile_27 = []byte(`" method="post">
|
||||
<input name="uid" value='`)
|
||||
var profile_25 = []byte(`' type="hidden" />
|
||||
var profile_28 = []byte(`' type="hidden" />
|
||||
<div class="colstack_item topic_reply_form" style="border-top: none;">
|
||||
<div class="formrow">
|
||||
<div class="formitem"><textarea class="input_content" name="reply-content" placeholder="Insert comment here"></textarea></div>
|
||||
|
@ -847,13 +855,13 @@ var profile_25 = []byte(`' type="hidden" />
|
|||
</div>
|
||||
</form>
|
||||
`)
|
||||
var profile_26 = []byte(`
|
||||
var profile_29 = []byte(`
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
`)
|
||||
var profile_27 = []byte(`
|
||||
var profile_30 = []byte(`
|
||||
<script type="text/javascript">
|
||||
function handle_profile_hashbit() {
|
||||
var hash_class = ""
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
// Code generated by Gosora. More below:
|
||||
/* This file was automatically generated by the software. Please don't edit it as your changes may be overwritten at any moment. */
|
||||
package main
|
||||
import "net/http"
|
||||
import "./common"
|
||||
import "strconv"
|
||||
import "net/http"
|
||||
|
||||
// nolint
|
||||
func init() {
|
||||
|
@ -95,33 +95,39 @@ w.Write([]byte(tmpl_profile_vars.ProfileOwner.Tag))
|
|||
w.Write(profile_6)
|
||||
}
|
||||
w.Write(profile_7)
|
||||
if tmpl_profile_vars.CurrentUser.IsSuperMod && !tmpl_profile_vars.ProfileOwner.IsSuperMod {
|
||||
if !tmpl_profile_vars.CurrentUser.Loggedin {
|
||||
w.Write(profile_8)
|
||||
if tmpl_profile_vars.ProfileOwner.IsBanned {
|
||||
w.Write(profile_9)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_10)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_11)
|
||||
} else {
|
||||
w.Write(profile_9)
|
||||
if tmpl_profile_vars.CurrentUser.IsSuperMod && !tmpl_profile_vars.ProfileOwner.IsSuperMod {
|
||||
w.Write(profile_10)
|
||||
if tmpl_profile_vars.ProfileOwner.IsBanned {
|
||||
w.Write(profile_11)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_12)
|
||||
}
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_13)
|
||||
}
|
||||
} else {
|
||||
w.Write(profile_14)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_15)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_16)
|
||||
if tmpl_profile_vars.CurrentUser.Perms.BanUsers {
|
||||
w.Write(profile_17)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_18)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_19)
|
||||
w.Write(profile_20)
|
||||
}
|
||||
w.Write(profile_15)
|
||||
}
|
||||
w.Write(profile_16)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_17)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_18)
|
||||
}
|
||||
w.Write(profile_19)
|
||||
if tmpl_profile_vars.CurrentUser.Perms.BanUsers {
|
||||
w.Write(profile_20)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_21)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_22)
|
||||
w.Write(profile_23)
|
||||
}
|
||||
w.Write(profile_24)
|
||||
if tmpl_profile_vars.Header.Theme.BgAvatars {
|
||||
if len(tmpl_profile_vars.ItemList) != 0 {
|
||||
for _, item := range tmpl_profile_vars.ItemList {
|
||||
|
@ -207,16 +213,16 @@ w.Write(profile_comments_row_37)
|
|||
}
|
||||
}
|
||||
}
|
||||
w.Write(profile_22)
|
||||
if !tmpl_profile_vars.CurrentUser.IsBanned {
|
||||
w.Write(profile_23)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_24)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_25)
|
||||
}
|
||||
if !tmpl_profile_vars.CurrentUser.IsBanned {
|
||||
w.Write(profile_26)
|
||||
w.Write([]byte(tmpl_profile_vars.CurrentUser.Session))
|
||||
w.Write(profile_27)
|
||||
w.Write([]byte(strconv.Itoa(tmpl_profile_vars.ProfileOwner.ID)))
|
||||
w.Write(profile_28)
|
||||
}
|
||||
w.Write(profile_29)
|
||||
w.Write(profile_30)
|
||||
w.Write(footer_0)
|
||||
w.Write([]byte(common.BuildWidget("footer",tmpl_profile_vars.Header)))
|
||||
w.Write(footer_1)
|
||||
|
|
|
@ -11,7 +11,5 @@
|
|||
<div class="rowitem passive"><a href="/user/edit/email/">Email</a></div>
|
||||
<div class="rowitem passive"><a href="/user/edit/notifications">Notifications</a></div>
|
||||
{{/** TODO: Add an alerts page with pagination to go through alerts which either don't fit in the alerts drop-down or which have already been dismissed. Bear in mind though that dismissed alerts older than two weeks might be purged to save space and to speed up the database **/}}
|
||||
<div class="rowitem passive"><a>Coming Soon</a></div>
|
||||
<div class="rowitem passive"><a>Coming Soon</a></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
</div>
|
||||
<div class="rowblock">
|
||||
<form action="/accounts/login/submit/" method="post">
|
||||
<div class="formrow">
|
||||
<div class="formrow login_name_row">
|
||||
<div class="formitem formlabel"><a>Account Name</a></div>
|
||||
<div class="formitem"><input name="username" type="text" placeholder="Account Name" required /></div>
|
||||
</div>
|
||||
<div class="formrow">
|
||||
<div class="formrow login_password_row">
|
||||
<div class="formitem formlabel"><a>Password</a></div>
|
||||
<div class="formitem"><input name="password" type="password" autocomplete="current-password" placeholder="*****" required /></div>
|
||||
</div>
|
||||
<div class="formrow">
|
||||
<div class="formrow login_button_row">
|
||||
<div class="formitem"><button name="login-button" class="formbutton">Login</button></div>
|
||||
<div class="formitem" style="color: #505050; font-size: 12px; font-weight: normal; float: right;">Don't have an account?</div>
|
||||
<div class="formitem dont_have_account">Don't have an account?</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -13,9 +13,12 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="passiveBlock">
|
||||
<div class="rowitem passive">
|
||||
{{if not .CurrentUser.Loggedin}}<div class="rowitem passive">
|
||||
<a class="profile_menu_item">Login for options</a>
|
||||
</div>{{else}}
|
||||
<!--<div class="rowitem passive">
|
||||
<a class="profile_menu_item">Add Friend</a>
|
||||
</div>
|
||||
</div>-->
|
||||
{{if (.CurrentUser.IsSuperMod) and not (.ProfileOwner.IsSuperMod) }}<div class="rowitem passive">
|
||||
{{if .ProfileOwner.IsBanned }}<a href="/users/unban/{{.ProfileOwner.ID}}?session={{.CurrentUser.Session}}" class="profile_menu_item">Unban</a>
|
||||
{{else}}<a href="#ban_user" class="profile_menu_item">Ban</a>{{end}}
|
||||
|
@ -23,6 +26,7 @@
|
|||
<div class="rowitem passive">
|
||||
<a href="/report/submit/{{.ProfileOwner.ID}}?session={{.CurrentUser.Session}}&type=user" class="profile_menu_item report_item" aria-label="Report User" title="Report User"></a>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -39,5 +39,6 @@
|
|||
<span class="editable_block user_content">{{.ContentHtml}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="after_comment"></div>
|
||||
{{end}}
|
||||
{{end}}
|
|
@ -1131,12 +1131,13 @@ textarea {
|
|||
width: 100%;
|
||||
margin-right: 12px;
|
||||
}
|
||||
#profile_right_lane .colstack_item, .colstack_right .colstack_item:not(.rowlist) {
|
||||
.colstack_right .colstack_item:not(.rowlist):not(#profile_comments),
|
||||
#profile_comments .comment {
|
||||
border: 1px solid var(--element-border-color);
|
||||
border-bottom: 2px solid var(--element-border-color);
|
||||
background-color: var(--element-background-color);
|
||||
}
|
||||
#profile_right_lane .colstack_item, .colstack_right .colstack_item, .colstack_right .colstack_grid {
|
||||
.colstack_right .colstack_item, .colstack_right .colstack_grid {
|
||||
margin-left: 16px;
|
||||
}
|
||||
#profile_right_lane .topic_reply_form {
|
||||
|
@ -1162,16 +1163,18 @@ textarea {
|
|||
#profile_comments button:hover {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
#profile_comments button.edit_item:after {
|
||||
#profile_comments button.edit_item:after,
|
||||
#profile_comments button.delete_item:after,
|
||||
#profile_comments button.report_item:after {
|
||||
font: normal normal normal 14px/1 FontAwesome;
|
||||
}
|
||||
#profile_comments button.edit_item:after {
|
||||
content: "\f040";
|
||||
}
|
||||
#profile_comments button.delete_item:after {
|
||||
font: normal normal normal 14px/1 FontAwesome;
|
||||
content: "\f1f8";
|
||||
}
|
||||
#profile_comments button.report_item:after {
|
||||
font: normal normal normal 14px/1 FontAwesome;
|
||||
content: "\f024";
|
||||
}
|
||||
#profile_comments_head {
|
||||
|
@ -1186,6 +1189,9 @@ textarea {
|
|||
#profile_comments .rowitem {
|
||||
background-image: none !important;
|
||||
}
|
||||
#profile_comments .comment:not(:last-child) {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
#profile_comments .comment .userbit {
|
||||
display: flex;
|
||||
margin-left: 14px;
|
||||
|
@ -1278,6 +1284,17 @@ textarea {
|
|||
padding: 16px;
|
||||
}
|
||||
|
||||
/* TODO: Add a generic button_row class and add this to them all? */
|
||||
.login_button_row {
|
||||
display: flex;
|
||||
}
|
||||
.dont_have_account {
|
||||
color: var(--primary-link-color);
|
||||
font-size: 12px;
|
||||
margin-left: auto;
|
||||
margin-top: 23px;
|
||||
}
|
||||
|
||||
/* TODO: Highlight the one we're currently on? */
|
||||
.pageset {
|
||||
display: flex;
|
||||
|
@ -1705,7 +1722,10 @@ textarea {
|
|||
}
|
||||
}
|
||||
@media(max-width: 520px) {
|
||||
main > .rowhead, #main > .rowhead {
|
||||
#main {
|
||||
padding-top: 0px;
|
||||
}
|
||||
main > .rowhead, #main > .rowhead, main > .opthead, #main > .opthead {
|
||||
margin-left: -3px;
|
||||
margin-right: -3px;
|
||||
}
|
||||
|
|
|
@ -366,6 +366,13 @@ a {
|
|||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.dont_have_account {
|
||||
color: #505050;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
float: right;
|
||||
}
|
||||
|
||||
textarea {
|
||||
background-color: var(--input-background-color);
|
||||
border-color: var(--input-border-color);
|
||||
|
@ -694,6 +701,14 @@ input[type=checkbox]:checked + label.poll_option_label .sel {
|
|||
padding: 0px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.topic_left.topic_sticky .topic_inner_left {
|
||||
border-top: 4px solid hsl(51, 100%, 50%);
|
||||
padding-left: 8px;
|
||||
padding-top: 8px;
|
||||
margin-top: 0px;
|
||||
margin-left: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
.topic_list .topic_right {
|
||||
height: 59px;
|
||||
margin-left: 8px;
|
||||
|
|
|
@ -357,7 +357,6 @@ li a {
|
|||
width: 100%;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
/* Clearfix */
|
||||
.formrow:before, .formrow:after {
|
||||
content: " ";
|
||||
|
@ -383,7 +382,6 @@ li a {
|
|||
.formitem.invisible_border {
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Mostly for textareas */
|
||||
.formitem:only-child { width: 100%; }
|
||||
.formitem textarea {
|
||||
|
@ -404,7 +402,14 @@ li a {
|
|||
/*padding-left: 15px;*/
|
||||
}
|
||||
|
||||
.formbutton, button {
|
||||
.dont_have_account {
|
||||
color: #505050;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.formbutton, button, input[type="submit"] {
|
||||
background: white;
|
||||
border: 1px solid #8e8e8e;
|
||||
}
|
||||
|
@ -414,9 +419,24 @@ li a {
|
|||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
font-size: 15px;
|
||||
}
|
||||
.formbutton .ip_search_search {
|
||||
border-color: var(--main-border-color);
|
||||
}
|
||||
|
||||
.ip_search_block {
|
||||
border-bottom: none;
|
||||
}
|
||||
.ip_search_block .rowitem {
|
||||
display: flex;
|
||||
}
|
||||
.ip_search_input {
|
||||
width: 100%;
|
||||
}
|
||||
.ip_search_search {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
/* TODO: Add the avatars to the forum list */
|
||||
.extra_little_row_avatar {
|
||||
display: none;
|
||||
|
|
|
@ -328,7 +328,14 @@ li a {
|
|||
border-color: #ccc;
|
||||
}
|
||||
|
||||
button {
|
||||
.dont_have_account {
|
||||
color: #505050;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
float: right;
|
||||
}
|
||||
|
||||
button, input[type="submit"] {
|
||||
background: white;
|
||||
border: 1px solid #8e8e8e;
|
||||
}
|
||||
|
|
|
@ -398,7 +398,7 @@ input, select {
|
|||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.formbutton, button {
|
||||
.formbutton, button, input[type="submit"] {
|
||||
background: white;
|
||||
border: 1px solid #8e8e8e;
|
||||
}
|
||||
|
@ -408,9 +408,31 @@ input, select {
|
|||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
font-size: 15px;
|
||||
}
|
||||
.formbutton, ip_search_search {
|
||||
border-color: hsl(0, 0%, 80%);
|
||||
}
|
||||
|
||||
.dont_have_account {
|
||||
color: #505050;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.ip_search_block {
|
||||
border-bottom: none;
|
||||
}
|
||||
.ip_search_block .rowitem {
|
||||
display: flex;
|
||||
}
|
||||
.ip_search_input {
|
||||
width: 100%;
|
||||
}
|
||||
.ip_search_search {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
/* TODO: Add the avatars to the forum list */
|
||||
.extra_little_row_avatar {
|
||||
display: none;
|
||||
|
|
Loading…
Reference in New Issue