Added the ability to assign users as moderators without also giving them the administrative tools.
Profile owners can now moderate their own profiles. Fixed an issue with database entries being set as null. A message now appears when there aren't any topics in a forum or in the global topics list. Added the link to the current user's profile to the main menu. Database Changes. not nulled some columns. Added is_mod column to users_groups. Added the Moderator usergroup.
This commit is contained in:
parent
72d7beefe9
commit
6a320edbb4
12
data.sql
12
data.sql
|
@ -4,14 +4,14 @@ CREATE TABLE `users`(
|
||||||
`uid` int not null AUTO_INCREMENT,
|
`uid` int not null AUTO_INCREMENT,
|
||||||
`name` varchar(100) not null,
|
`name` varchar(100) not null,
|
||||||
`password` varchar(100) not null,
|
`password` varchar(100) not null,
|
||||||
`salt` varchar(80) DEFAULT '',
|
`salt` varchar(80) DEFAULT '' not null,
|
||||||
`group` int not null,
|
`group` int not null,
|
||||||
`is_super_admin` tinyint(1) not null,
|
`is_super_admin` tinyint(1) not null,
|
||||||
`createdAt` datetime not null,
|
`createdAt` datetime not null,
|
||||||
`lastActiveAt` datetime not null,
|
`lastActiveAt` datetime not null,
|
||||||
`session` varchar(200) DEFAULT '',
|
`session` varchar(200) DEFAULT '' not null,
|
||||||
`email` varchar(200) DEFAULT '',
|
`email` varchar(200) DEFAULT '' not null,
|
||||||
`avatar` varchar(20) DEFAULT '',
|
`avatar` varchar(20) DEFAULT '' not null,
|
||||||
primary key(`uid`)
|
primary key(`uid`)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ CREATE TABLE `users_groups`(
|
||||||
`gid` int not null AUTO_INCREMENT,
|
`gid` int not null AUTO_INCREMENT,
|
||||||
`name` varchar(100) not null,
|
`name` varchar(100) not null,
|
||||||
`permissions` text not null,
|
`permissions` text not null,
|
||||||
|
`is_mod` tinyint DEFAULT 0 not null,
|
||||||
`is_admin` tinyint DEFAULT 0 not null,
|
`is_admin` tinyint DEFAULT 0 not null,
|
||||||
`is_banned` tinyint DEFAULT 0 not null,
|
`is_banned` tinyint DEFAULT 0 not null,
|
||||||
`tag` varchar(50) DEFAULT '' not null,
|
`tag` varchar(50) DEFAULT '' not null,
|
||||||
|
@ -85,8 +86,9 @@ CREATE TABLE `users_replies`(
|
||||||
|
|
||||||
INSERT INTO users(`name`,`group`,`is_super_admin`,`createdAt`,`lastActiveAt`)
|
INSERT INTO users(`name`,`group`,`is_super_admin`,`createdAt`,`lastActiveAt`)
|
||||||
VALUES ('Admin',1,1,NOW(),NOW());
|
VALUES ('Admin',1,1,NOW(),NOW());
|
||||||
INSERT INTO users_groups(`name`,`permissions`,`is_admin`,`tag`) VALUES ('Admin','{}',1,"Admin");
|
INSERT INTO users_groups(`name`,`permissions`,`is_mod`,`is_admin`,`tag`) VALUES ('Administrator','{}',1,1,"Admin");
|
||||||
INSERT INTO users_groups(`name`,`permissions`) VALUES ('Member','{}');
|
INSERT INTO users_groups(`name`,`permissions`) VALUES ('Member','{}');
|
||||||
|
INSERT INTO users_groups(`name`,`permissions`,`is_mod`,`tag`) VALUES ('Moderator','{}',1,"Mod");
|
||||||
INSERT INTO forums(`name`,`lastTopicTime`) VALUES ('General',NOW());
|
INSERT INTO forums(`name`,`lastTopicTime`) VALUES ('General',NOW());
|
||||||
INSERT INTO topics(`title`,`content`,`createdAt`,`lastReplyAt`,`createdBy`,`parentID`)
|
INSERT INTO topics(`title`,`content`,`createdAt`,`lastReplyAt`,`createdBy`,`parentID`)
|
||||||
VALUES ('Test Topic','A topic automatically generated by the software.',NOW(),NOW(),1,1);
|
VALUES ('Test Topic','A topic automatically generated by the software.',NOW(),NOW(),1,1);
|
||||||
|
|
BIN
grosolo.exe
BIN
grosolo.exe
Binary file not shown.
BIN
grosolo.exe~
BIN
grosolo.exe~
Binary file not shown.
1
group.go
1
group.go
|
@ -5,6 +5,7 @@ type Group struct
|
||||||
ID int
|
ID int
|
||||||
Name string
|
Name string
|
||||||
Permissions string
|
Permissions string
|
||||||
|
Is_Mod bool
|
||||||
Is_Admin bool
|
Is_Admin bool
|
||||||
Is_Banned bool
|
Is_Banned bool
|
||||||
Tag string
|
Tag string
|
||||||
|
|
6
main.go
6
main.go
|
@ -225,15 +225,15 @@ func init_database(err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Print("Loading the usergroups.")
|
log.Print("Loading the usergroups.")
|
||||||
rows, err := db.Query("SELECT gid,name,permissions,is_admin,is_banned,tag FROM users_groups")
|
rows, err := db.Query("SELECT gid,name,permissions,is_mod,is_admin,is_banned,tag FROM users_groups")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
group := Group{0,"","",false,false,""}
|
group := Group{0,"","",false,false,false,""}
|
||||||
err := rows.Scan(&group.ID, &group.Name, &group.Permissions, &group.Is_Admin, &group.Is_Banned, &group.Tag)
|
err := rows.Scan(&group.ID, &group.Name, &group.Permissions, &group.Is_Mod, &group.Is_Admin, &group.Is_Banned, &group.Tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ func route_edit_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
is_js = "0"
|
is_js = "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
if !user.Is_Admin {
|
if !user.Is_Mod && !user.Is_Admin {
|
||||||
NoPermissionsJSQ(w,r,user,is_js)
|
NoPermissionsJSQ(w,r,user,is_js)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ func route_edit_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func route_delete_topic(w http.ResponseWriter, r *http.Request) {
|
func route_delete_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
user := SessionCheck(w,r)
|
user := SessionCheck(w,r)
|
||||||
if !user.Is_Admin {
|
if !user.Is_Mod && !user.Is_Admin {
|
||||||
NoPermissions(w,r,user)
|
NoPermissions(w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ func route_delete_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func route_stick_topic(w http.ResponseWriter, r *http.Request) {
|
func route_stick_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
user := SessionCheck(w,r)
|
user := SessionCheck(w,r)
|
||||||
if !user.Is_Admin {
|
if !user.Is_Mod && !user.Is_Admin {
|
||||||
NoPermissions(w,r,user)
|
NoPermissions(w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ func route_stick_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func route_unstick_topic(w http.ResponseWriter, r *http.Request) {
|
func route_unstick_topic(w http.ResponseWriter, r *http.Request) {
|
||||||
user := SessionCheck(w,r)
|
user := SessionCheck(w,r)
|
||||||
if !user.Is_Admin {
|
if !user.Is_Mod && !user.Is_Admin {
|
||||||
NoPermissions(w,r,user)
|
NoPermissions(w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ func route_reply_edit_submit(w http.ResponseWriter, r *http.Request) {
|
||||||
is_js = "0"
|
is_js = "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
if !user.Is_Admin {
|
if !user.Is_Mod && !user.Is_Admin {
|
||||||
NoPermissionsJSQ(w,r,user,is_js)
|
NoPermissionsJSQ(w,r,user,is_js)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ func route_reply_delete_submit(w http.ResponseWriter, r *http.Request) {
|
||||||
is_js = "0"
|
is_js = "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
if !user.Is_Admin {
|
if !user.Is_Mod && !user.Is_Admin {
|
||||||
NoPermissionsJSQ(w,r,user,is_js)
|
NoPermissionsJSQ(w,r,user,is_js)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -243,27 +243,27 @@ func route_profile_reply_edit_submit(w http.ResponseWriter, r *http.Request) {
|
||||||
is_js = "0"
|
is_js = "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
if !user.Is_Admin {
|
|
||||||
NoPermissionsJSQ(w,r,user,is_js)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rid, err := strconv.Atoi(r.URL.Path[len("/profile/reply/edit/submit/"):])
|
rid, err := strconv.Atoi(r.URL.Path[len("/profile/reply/edit/submit/"):])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LocalError("The provided Reply ID is not a valid number.",w,r,user)
|
LocalError("The provided Reply ID is not a valid number.",w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
content := html.EscapeString(r.PostFormValue("edit_item"))
|
// Get the Reply ID..
|
||||||
_, err = edit_profile_reply_stmt.Exec(content, parse_message(content), rid)
|
var uid int
|
||||||
|
err = db.QueryRow("select uid from users_replies where rid = ?", rid).Scan(&uid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InternalError(err,w,r,user)
|
InternalError(err,w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the Reply ID..
|
if user.ID != uid && !user.Is_Mod && !user.Is_Admin {
|
||||||
var uid int
|
NoPermissionsJSQ(w,r,user,is_js)
|
||||||
err = db.QueryRow("select tid from users_replies where rid = ?", rid).Scan(&uid)
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
content := html.EscapeString(r.PostFormValue("edit_item"))
|
||||||
|
_, err = edit_profile_reply_stmt.Exec(content, parse_message(content), rid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InternalError(err,w,r,user)
|
InternalError(err,w,r,user)
|
||||||
return
|
return
|
||||||
|
@ -289,11 +289,6 @@ func route_profile_reply_delete_submit(w http.ResponseWriter, r *http.Request) {
|
||||||
is_js = "0"
|
is_js = "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
if !user.Is_Admin {
|
|
||||||
NoPermissionsJSQ(w,r,user,is_js)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rid, err := strconv.Atoi(r.URL.Path[len("/profile/reply/delete/submit/"):])
|
rid, err := strconv.Atoi(r.URL.Path[len("/profile/reply/delete/submit/"):])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LocalErrorJSQ("The provided Reply ID is not a valid number.",w,r,user,is_js)
|
LocalErrorJSQ("The provided Reply ID is not a valid number.",w,r,user,is_js)
|
||||||
|
@ -310,6 +305,11 @@ func route_profile_reply_delete_submit(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if user.ID != uid && !user.Is_Mod && !user.Is_Admin {
|
||||||
|
NoPermissionsJSQ(w,r,user,is_js)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
_, err = delete_profile_reply_stmt.Exec(rid)
|
_, err = delete_profile_reply_stmt.Exec(rid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InternalErrorJSQ(err,w,r,user,is_js)
|
InternalErrorJSQ(err,w,r,user,is_js)
|
||||||
|
|
54
routes.go
54
routes.go
|
@ -119,7 +119,15 @@ func route_topics(w http.ResponseWriter, r *http.Request){
|
||||||
InternalError(err,w,r,user)
|
InternalError(err,w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pi := Page{"Topic List","topics",user,topicList,0}
|
|
||||||
|
var msg string
|
||||||
|
if len(topicList) == 0 {
|
||||||
|
msg = "There aren't any topics yet."
|
||||||
|
} else {
|
||||||
|
msg = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
pi := Page{"Topic List","topics",user,topicList,msg}
|
||||||
err = templates.ExecuteTemplate(w,"topics.html", pi)
|
err = templates.ExecuteTemplate(w,"topics.html", pi)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InternalError(err, w, r, user)
|
InternalError(err, w, r, user)
|
||||||
|
@ -194,7 +202,15 @@ func route_forum(w http.ResponseWriter, r *http.Request){
|
||||||
InternalError(err,w,r,user)
|
InternalError(err,w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pi := Page{forums[fid].Name,"forum",user,topicList,0}
|
|
||||||
|
var msg string
|
||||||
|
if len(topicList) == 0 {
|
||||||
|
msg = "There aren't any topics in this forum yet."
|
||||||
|
} else {
|
||||||
|
msg = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
pi := Page{forums[fid].Name,"forum",user,topicList,msg}
|
||||||
err = templates.ExecuteTemplate(w,"forum.html", pi)
|
err = templates.ExecuteTemplate(w,"forum.html", pi)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
InternalError(err, w, r, user)
|
InternalError(err, w, r, user)
|
||||||
|
@ -283,7 +299,7 @@ func route_topic_id(w http.ResponseWriter, r *http.Request){
|
||||||
} else {
|
} else {
|
||||||
topic.Avatar = strings.Replace(noavatar,"{id}",strconv.Itoa(topic.CreatedBy),1)
|
topic.Avatar = strings.Replace(noavatar,"{id}",strconv.Itoa(topic.CreatedBy),1)
|
||||||
}
|
}
|
||||||
if is_super_admin || groups[group].Is_Admin {
|
if is_super_admin || groups[group].Is_Mod || groups[group].Is_Admin {
|
||||||
topic.Css = staff_css_tmpl
|
topic.Css = staff_css_tmpl
|
||||||
}
|
}
|
||||||
if groups[group].Tag != "" {
|
if groups[group].Tag != "" {
|
||||||
|
@ -309,7 +325,7 @@ func route_topic_id(w http.ResponseWriter, r *http.Request){
|
||||||
}
|
}
|
||||||
|
|
||||||
replyLines = strings.Count(replyContent,"\n")
|
replyLines = strings.Count(replyContent,"\n")
|
||||||
if is_super_admin || groups[group].Is_Admin {
|
if is_super_admin || groups[group].Is_Mod || groups[group].Is_Admin {
|
||||||
replyCss = staff_css_tmpl
|
replyCss = staff_css_tmpl
|
||||||
} else {
|
} else {
|
||||||
replyCss = no_css_tmpl
|
replyCss = no_css_tmpl
|
||||||
|
@ -367,24 +383,32 @@ func route_profile(w http.ResponseWriter, r *http.Request){
|
||||||
replyList = make(map[int]interface{})
|
replyList = make(map[int]interface{})
|
||||||
currentID = 0
|
currentID = 0
|
||||||
|
|
||||||
puser := User{0,"",0,false,false,false,"",false,""}
|
puser := User{0,"",0,false,false,false,false,false,"",false,""}
|
||||||
puser.ID, err = strconv.Atoi(r.URL.Path[len("/user/"):])
|
puser.ID, err = strconv.Atoi(r.URL.Path[len("/user/"):])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LocalError("The provided TopicID is not a valid number.",w,r,user)
|
LocalError("The provided TopicID is not a valid number.",w,r,user)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch the user data
|
if puser.ID == user.ID {
|
||||||
err = db.QueryRow("SELECT `name`, `group`, `is_super_admin`, `avatar` FROM `users` WHERE `uid` = ?", puser.ID).Scan(&puser.Name, &puser.Group, &puser.Is_Super_Admin, &puser.Avatar)
|
user.Is_Mod = true
|
||||||
if err == sql.ErrNoRows {
|
puser = user
|
||||||
NotFound(w,r,user)
|
} else {
|
||||||
return
|
// Fetch the user data
|
||||||
} else if err != nil {
|
err = db.QueryRow("SELECT `name`, `group`, `is_super_admin`, `avatar` FROM `users` WHERE `uid` = ?", puser.ID).Scan(&puser.Name, &puser.Group, &puser.Is_Super_Admin, &puser.Avatar)
|
||||||
InternalError(err,w,r,user)
|
if err == sql.ErrNoRows {
|
||||||
return
|
NotFound(w,r,user)
|
||||||
|
return
|
||||||
|
} else if err != nil {
|
||||||
|
InternalError(err,w,r,user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
puser.Is_Admin = puser.Is_Super_Admin || groups[puser.Group].Is_Admin
|
||||||
|
puser.Is_Super_Mod = puser.Is_Admin || groups[puser.Group].Is_Mod
|
||||||
|
puser.Is_Mod = puser.Is_Super_Mod
|
||||||
}
|
}
|
||||||
|
|
||||||
puser.Is_Admin = puser.Is_Super_Admin
|
|
||||||
if puser.Avatar != "" {
|
if puser.Avatar != "" {
|
||||||
if puser.Avatar[0] == '.' {
|
if puser.Avatar[0] == '.' {
|
||||||
puser.Avatar = "/uploads/avatar_" + strconv.Itoa(puser.ID) + puser.Avatar
|
puser.Avatar = "/uploads/avatar_" + strconv.Itoa(puser.ID) + puser.Avatar
|
||||||
|
@ -409,7 +433,7 @@ func route_profile(w http.ResponseWriter, r *http.Request){
|
||||||
}
|
}
|
||||||
|
|
||||||
replyLines = strings.Count(replyContent,"\n")
|
replyLines = strings.Count(replyContent,"\n")
|
||||||
if is_super_admin || groups[group].Is_Admin {
|
if is_super_admin || groups[group].Is_Mod || groups[group].Is_Admin {
|
||||||
replyCss = staff_css_tmpl
|
replyCss = staff_css_tmpl
|
||||||
} else {
|
} else {
|
||||||
replyCss = no_css_tmpl
|
replyCss = no_css_tmpl
|
||||||
|
|
|
@ -7,4 +7,9 @@
|
||||||
<a href="/topic/{{.ID}}">{{.Title}}</a> {{if .Is_Closed}}<span class="topic_status topic_status_closed">closed</span>{{else}}<span class="topic_status topic_status_open">open</span>{{end}}
|
<a href="/topic/{{.ID}}">{{.Title}}</a> {{if .Is_Closed}}<span class="topic_status topic_status_closed">closed</span>{{else}}<span class="topic_status topic_status_open">open</span>{{end}}
|
||||||
</div>{{end}}
|
</div>{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
{{if .Something}}
|
||||||
|
<div class="rowblock">
|
||||||
|
<div class="rowitem passive">{{.Something}}</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
{{template "footer.html" . }}
|
{{template "footer.html" . }}
|
|
@ -5,7 +5,8 @@
|
||||||
<li class="menu_topics"><a href="/">Topics</a></li>
|
<li class="menu_topics"><a href="/">Topics</a></li>
|
||||||
<li class="menu_create_topic"><a href="/topics/create/">Create Topic</a></li>
|
<li class="menu_create_topic"><a href="/topics/create/">Create Topic</a></li>
|
||||||
{{ if .CurrentUser.Loggedin }}
|
{{ if .CurrentUser.Loggedin }}
|
||||||
<li class="menu_account"><a href="/user/edit/critical/">My Account</a></li>
|
<li class="menu_account"><a href="/user/edit/critical/">Account</a></li>
|
||||||
|
<li class="menu_account"><a href="/user/{{.CurrentUser.ID}}">Profile</a></li>
|
||||||
{{ if .CurrentUser.Is_Admin}}<li class="menu_account"><a href="/panel/forums/">Panel</a></li>{{end}}
|
{{ if .CurrentUser.Is_Admin}}<li class="menu_account"><a href="/panel/forums/">Panel</a></li>{{end}}
|
||||||
<li class="menu_logout"><a href="/accounts/logout?session={{.CurrentUser.Session}}">Logout</a></li>
|
<li class="menu_logout"><a href="/accounts/logout?session={{.CurrentUser.Session}}">Logout</a></li>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="rowitem">{{.Something.Name}}</div>
|
<div class="rowitem">{{.Something.Name}}</div>
|
||||||
<div class="rowitem passive">
|
<div class="rowitem passive">
|
||||||
<a class="username">Add Friend</a>
|
<a class="username">Add Friend</a>
|
||||||
{{if .CurrentUser.Is_Admin}}<a class="username">Ban</a>{{end}}
|
{{if (.CurrentUser.Is_Super_Mod) and not (.Something.Is_Super_Mod) }}<a class="username">Ban</a>{{end}}
|
||||||
<a class="username">Report</a>
|
<a class="username">Report</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -13,11 +13,11 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="colblock_right" style="overflow: hidden;">
|
<div class="colblock_right" style="overflow: hidden;">
|
||||||
{{range $index, $element := .ItemList}}
|
{{range $index, $element := .ItemList}}
|
||||||
<div class="rowitem passive deletable_block editable_parent" style="{{ if $element.Avatar }}background-image: url({{$element.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le $element.ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;background-attachment: scroll;padding-left: 136px;{{$element.Css}}{{end}}">
|
<div class="rowitem passive deletable_block editable_parent" style="{{ if $element.Avatar }}background-image: url({{$element.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le $element.ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;padding-left: 136px;{{$element.Css}}{{end}}">
|
||||||
<span class="editable_block">{{$element.ContentHtml}}</span>
|
<span class="editable_block">{{$element.ContentHtml}}</span>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<a href="/user/{{$element.CreatedBy}}" class="username">{{$element.CreatedByName}}</a>
|
<a href="/user/{{$element.CreatedBy}}" class="username">{{$element.CreatedByName}}</a>
|
||||||
{{if $.CurrentUser.Is_Admin}}<a href="/reply/edit/submit/{{$element.ID}}"><button class="username edit_item">Edit</button></a>
|
{{if $.CurrentUser.Is_Mod}}<a href="/profile/reply/edit/submit/{{$element.ID}}"><button class="username edit_item">Edit</button></a>
|
||||||
<a href="/profile/reply/delete/submit/{{$element.ID}}"><button class="username delete_item">Delete</button></a>{{end}}
|
<a href="/profile/reply/delete/submit/{{$element.ID}}"><button class="username delete_item">Delete</button></a>{{end}}
|
||||||
<a href="/profile/reply/report/submit/{{$element.ID}}"><button class="username report_item">Report</button></a>
|
<a href="/profile/reply/report/submit/{{$element.ID}}"><button class="username report_item">Report</button></a>
|
||||||
{{ if $element.Tag }}<a class="username" style="float: right;">{{$element.Tag}}</a>{{end}}
|
{{ if $element.Tag }}<a class="username" style="float: right;">{{$element.Tag}}</a>{{end}}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="rowitem"{{ if .Something.Sticky }}style="background-color: #FFFFEA;"{{end}}>
|
<div class="rowitem"{{ if .Something.Sticky }}style="background-color: #FFFFEA;"{{end}}>
|
||||||
<a class='topic_name hide_on_edit'>{{.Something.Title}}</a>
|
<a class='topic_name hide_on_edit'>{{.Something.Title}}</a>
|
||||||
<span class='topic_status topic_status_e topic_status_{{.Something.Status}} hide_on_edit'>{{.Something.Status}}</span>
|
<span class='topic_status topic_status_e topic_status_{{.Something.Status}} hide_on_edit'>{{.Something.Status}}</span>
|
||||||
{{if .CurrentUser.Is_Admin}}
|
{{if .CurrentUser.Is_Mod}}
|
||||||
<a href='/topic/edit/{{.Something.ID}}' class="username hide_on_edit open_edit" style="font-weight: normal;">Edit</a>
|
<a href='/topic/edit/{{.Something.ID}}' class="username hide_on_edit open_edit" style="font-weight: normal;">Edit</a>
|
||||||
<a href='/topic/delete/submit/{{.Something.ID}}' class="username" style="font-weight: normal;">Delete</a>
|
<a href='/topic/delete/submit/{{.Something.ID}}' class="username" style="font-weight: normal;">Delete</a>
|
||||||
{{ if .Something.Sticky }}<a href='/topic/unstick/submit/{{.Something.ID}}' class="username" style="font-weight: normal;">Unpin</a>{{else}}<a href='/topic/stick/submit/{{.Something.ID}}' class="username" style="font-weight: normal;">Pin</a>{{end}}
|
{{ if .Something.Sticky }}<a href='/topic/unstick/submit/{{.Something.ID}}' class="username" style="font-weight: normal;">Unpin</a>{{else}}<a href='/topic/stick/submit/{{.Something.ID}}' class="username" style="font-weight: normal;">Pin</a>{{end}}
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="rowblock">
|
<div class="rowblock">
|
||||||
<div class="rowitem passive editable_parent" style="border-bottom: none;{{ if .Something.Avatar }}background-image: url({{ .Something.Avatar }}), url(/static/white-dot.jpg);background-position: 0px {{if le .Something.ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;background-attachment: scroll;padding-left: 136px;{{.Something.Css}}{{end}}">
|
<div class="rowitem passive editable_parent" style="border-bottom: none;{{ if .Something.Avatar }}background-image: url({{ .Something.Avatar }}), url(/static/white-dot.jpg);background-position: 0px {{if le .Something.ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;padding-left: 136px;{{.Something.Css}}{{end}}">
|
||||||
<span class="hide_on_edit topic_content">{{.Something.Content}}</span>
|
<span class="hide_on_edit topic_content">{{.Something.Content}}</span>
|
||||||
<textarea name="topic_content" class="show_on_edit topic_content_input">{{.Something.Content}}</textarea>
|
<textarea name="topic_content" class="show_on_edit topic_content_input">{{.Something.Content}}</textarea>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
|
@ -31,11 +31,11 @@
|
||||||
</div><br />
|
</div><br />
|
||||||
<div class="rowblock" style="overflow: hidden;">
|
<div class="rowblock" style="overflow: hidden;">
|
||||||
{{range $index, $element := .ItemList}}
|
{{range $index, $element := .ItemList}}
|
||||||
<div class="rowitem passive deletable_block editable_parent" style="{{ if $element.Avatar }}background-image: url({{$element.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le $element.ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;background-attachment: scroll;padding-left: 136px;{{$element.Css}}{{end}}">
|
<div class="rowitem passive deletable_block editable_parent" style="{{ if $element.Avatar }}background-image: url({{$element.Avatar}}), url(/static/white-dot.jpg);background-position: 0px {{if le $element.ContentLines 5}}-1{{end}}0px;background-repeat: no-repeat, repeat-y;background-size: 128px;padding-left: 136px;{{$element.Css}}{{end}}">
|
||||||
<span class="editable_block">{{$element.ContentHtml}}</span>
|
<span class="editable_block">{{$element.ContentHtml}}</span>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<a href="/user/{{$element.CreatedBy}}" class="username">{{$element.CreatedByName}}</a>
|
<a href="/user/{{$element.CreatedBy}}" class="username">{{$element.CreatedByName}}</a>
|
||||||
{{if $.CurrentUser.Is_Admin}}<a href="/reply/edit/submit/{{$element.ID}}"><button class="username edit_item">Edit</button></a>
|
{{if $.CurrentUser.Is_Mod}}<a href="/reply/edit/submit/{{$element.ID}}"><button class="username edit_item">Edit</button></a>
|
||||||
<a href="/reply/delete/submit/{{$element.ID}}"><button class="username delete_item">Delete</button></a>{{end}}
|
<a href="/reply/delete/submit/{{$element.ID}}"><button class="username delete_item">Delete</button></a>{{end}}
|
||||||
<a href="/reply/report/submit/{{$element.ID}}"><button class="username report_item">Report</button></a>
|
<a href="/reply/report/submit/{{$element.ID}}"><button class="username report_item">Report</button></a>
|
||||||
{{if $element.Tag}}<a class="username" style="float: right;">{{$element.Tag}}</a>{{end}}
|
{{if $element.Tag}}<a class="username" style="float: right;">{{$element.Tag}}</a>{{end}}
|
||||||
|
|
|
@ -7,4 +7,9 @@
|
||||||
<a href="/topic/{{.ID}}">{{.Title}}</a> {{if .Is_Closed}}<span class="topic_status topic_status_closed">closed</span>{{else}}<span class="topic_status topic_status_open">open</span>{{end}}
|
<a href="/topic/{{.ID}}">{{.Title}}</a> {{if .Is_Closed}}<span class="topic_status topic_status_closed">closed</span>{{else}}<span class="topic_status topic_status_open">open</span>{{end}}
|
||||||
</div>{{end}}
|
</div>{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
{{if .Something}}
|
||||||
|
<div class="rowblock">
|
||||||
|
<div class="rowitem passive">{{.Something}}</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
{{template "footer.html" . }}
|
{{template "footer.html" . }}
|
24
user.go
24
user.go
|
@ -12,6 +12,8 @@ type User struct
|
||||||
ID int
|
ID int
|
||||||
Name string
|
Name string
|
||||||
Group int
|
Group int
|
||||||
|
Is_Mod bool
|
||||||
|
Is_Super_Mod bool
|
||||||
Is_Admin bool
|
Is_Admin bool
|
||||||
Is_Super_Admin bool
|
Is_Super_Admin bool
|
||||||
Is_Banned bool
|
Is_Banned bool
|
||||||
|
@ -40,7 +42,7 @@ func SetPassword(uid int, password string) (error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func SessionCheck(w http.ResponseWriter, r *http.Request) (User) {
|
func SessionCheck(w http.ResponseWriter, r *http.Request) (User) {
|
||||||
user := User{0,"",0,false,false,false,"",false,""}
|
user := User{0,"",0,false,false,false,false,false,"",false,""}
|
||||||
var err error
|
var err error
|
||||||
var cookie *http.Cookie
|
var cookie *http.Cookie
|
||||||
|
|
||||||
|
@ -60,8 +62,6 @@ func SessionCheck(w http.ResponseWriter, r *http.Request) (User) {
|
||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
user.Session = cookie.Value
|
user.Session = cookie.Value
|
||||||
//log.Print("ID: " + user.Name)
|
|
||||||
//log.Print("Session: " + user.Session)
|
|
||||||
|
|
||||||
// Is this session valid..?
|
// Is this session valid..?
|
||||||
err = get_session_stmt.QueryRow(user.ID,user.Session).Scan(&user.ID, &user.Name, &user.Group, &user.Is_Super_Admin, &user.Session, &user.Avatar)
|
err = get_session_stmt.QueryRow(user.ID,user.Session).Scan(&user.ID, &user.Name, &user.Group, &user.Is_Super_Admin, &user.Session, &user.Avatar)
|
||||||
|
@ -71,7 +71,9 @@ func SessionCheck(w http.ResponseWriter, r *http.Request) (User) {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
user.Is_Admin = (user.Is_Super_Admin || groups[user.Group].Is_Admin)
|
user.Is_Admin = user.Is_Super_Admin || groups[user.Group].Is_Admin
|
||||||
|
user.Is_Super_Mod = groups[user.Group].Is_Mod || user.Is_Admin
|
||||||
|
user.Is_Mod = user.Is_Super_Mod
|
||||||
user.Is_Banned = groups[user.Group].Is_Banned
|
user.Is_Banned = groups[user.Group].Is_Banned
|
||||||
if user.Avatar != "" {
|
if user.Avatar != "" {
|
||||||
if user.Avatar[0] == '.' {
|
if user.Avatar[0] == '.' {
|
||||||
|
@ -81,19 +83,5 @@ func SessionCheck(w http.ResponseWriter, r *http.Request) (User) {
|
||||||
user.Avatar = strings.Replace(noavatar,"{id}",strconv.Itoa(user.ID),1)
|
user.Avatar = strings.Replace(noavatar,"{id}",strconv.Itoa(user.ID),1)
|
||||||
}
|
}
|
||||||
user.Loggedin = true
|
user.Loggedin = true
|
||||||
/*log.Print("Logged in")
|
|
||||||
log.Print("ID: " + strconv.Itoa(user.ID))
|
|
||||||
log.Print("Group: " + strconv.Itoa(user.Group))
|
|
||||||
log.Print("Name: " + user.Name)
|
|
||||||
if user.Loggedin {
|
|
||||||
log.Print("Loggedin: true")
|
|
||||||
} else {
|
|
||||||
log.Print("Loggedin: false")
|
|
||||||
}
|
|
||||||
if user.Is_Admin {
|
|
||||||
log.Print("Is_Admin: true")
|
|
||||||
} else {
|
|
||||||
log.Print("Is_Admin: false")
|
|
||||||
}*/
|
|
||||||
return user
|
return user
|
||||||
}
|
}
|
Loading…
Reference in New Issue