Fixed the permission system.

Added more debug logging.
Renamed the label in the Forum Manager and Editor from Hidden to Active.
Fixed a bug in compileTemplates() where it only loads visible forums from the forum store possibly causing trouble.
Fixed a bug in the /topics/ route where super admin status wasn't being taken into consideration.
Dropped down a hotfix for the /topics/ route.
This commit is contained in:
Azareal 2017-09-24 01:49:41 +01:00
parent 2ef7726080
commit b955f677a7
8 changed files with 91 additions and 38 deletions

View File

@ -78,14 +78,16 @@ func routeTopicCreate(w http.ResponseWriter, r *http.Request, user User, sfid st
// Do a bulk forum fetch, just in case it's the SqlForumStore? // Do a bulk forum fetch, just in case it's the SqlForumStore?
forum := fstore.DirtyGet(ffid) forum := fstore.DirtyGet(ffid)
fcopy := *forum if forum.Name != "" && forum.Active {
if hooks["topic_create_frow_assign"] != nil { fcopy := *forum
// TODO: Add the skip feature to all the other row based hooks? if hooks["topic_create_frow_assign"] != nil {
if runHook("topic_create_frow_assign", &fcopy).(bool) { // TODO: Add the skip feature to all the other row based hooks?
continue if runHook("topic_create_frow_assign", &fcopy).(bool) {
continue
}
} }
forumList = append(forumList, fcopy)
} }
forumList = append(forumList, fcopy)
} }
ctpage := CreateTopicPage{"Create Topic", user, headerVars, forumList, fid} ctpage := CreateTopicPage{"Create Topic", user, headerVars, forumList, fid}

View File

@ -234,12 +234,21 @@ INSERT INTO users_groups(`name`,`permissions`,`plugin_perms`,`tag`) VALUES ('Not
INSERT INTO forums(`name`,`active`) VALUES ('Reports',0); INSERT INTO forums(`name`,`active`) VALUES ('Reports',0);
INSERT INTO forums(`name`,`lastTopicTime`,`lastTopicID`,`lastReplyer`,`lastReplyerID`,`lastTopic`) VALUES ('General',UTC_TIMESTAMP(),1,"Admin",1,'Test Topic'); INSERT INTO forums(`name`,`lastTopicTime`,`lastTopicID`,`lastReplyer`,`lastReplyerID`,`lastTopic`) VALUES ('General',UTC_TIMESTAMP(),1,"Admin",1,'Test Topic');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (1,1,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"PinTopic":true,"CloseTopic":true}'); INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (1,1,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"PinTopic":true,"CloseTopic":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (2,1,'{"ViewTopic":true,"CreateReply":true,"CloseTopic":true}'); INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (2,1,'{"ViewTopic":true,"CreateReply":true,"CloseTopic":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (3,1,'{}'); INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (3,1,'{}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (4,1,'{}'); INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (4,1,'{}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (5,1,'{}'); INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (5,1,'{}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (6,1,'{}'); INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (6,1,'{}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (1,2,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"LikeItem":true,"EditTopic":true,"DeleteTopic":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (2,2,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"LikeItem":true,"EditTopic":true,"DeleteTopic":true,"EditReply":true,"DeleteReply":true,"PinTopic":true,"CloseTopic":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (3,2,'{"ViewTopic":true,"CreateReply":true,"CreateTopic":true,"LikeItem":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (4,2,'{"ViewTopic":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (5,2,'{"ViewTopic":true}');
INSERT INTO forums_permissions(`gid`,`fid`,`permissions`) VALUES (6,2,'{"ViewTopic":true}');
INSERT INTO topics(`title`,`content`,`createdAt`,`lastReplyAt`,`lastReplyBy`,`createdBy`,`parentID`) INSERT INTO topics(`title`,`content`,`createdAt`,`lastReplyAt`,`lastReplyBy`,`createdBy`,`parentID`)
VALUES ('Test Topic','A topic automatically generated by the software.',UTC_TIMESTAMP(),UTC_TIMESTAMP(),1,1,2); VALUES ('Test Topic','A topic automatically generated by the software.',UTC_TIMESTAMP(),UTC_TIMESTAMP(),1,1,2);

View File

@ -303,7 +303,7 @@ func rebuildForumPermissions(fid int) error {
if dev.DebugMode { if dev.DebugMode {
log.Print("Loading the forum permissions") log.Print("Loading the forum permissions")
} }
forums, err := fstore.GetAll() fids, err := fstore.GetAllIDs()
if err != nil { if err != nil {
return err return err
} }
@ -350,28 +350,29 @@ func rebuildForumPermissions(fid int) error {
group.Forums = []ForumPerms{BlankForumPerms} group.Forums = []ForumPerms{BlankForumPerms}
group.CanSee = []int{} group.CanSee = []int{}
for ffid := range forums { for _, ffid := range fids {
forumPerm, ok := forumPerms[group.ID][ffid] forumPerm, ok := forumPerms[group.ID][ffid]
if ok { if ok {
//log.Print("Overriding permissions for forum #" + strconv.Itoa(fid)) //log.Print("Overriding permissions for forum #" + strconv.Itoa(fid))
group.Forums = append(group.Forums, forumPerm) group.Forums = append(group.Forums, forumPerm)
if forumPerm.Overrides {
if forumPerm.ViewTopic {
group.CanSee = append(group.CanSee, ffid)
}
} else if group.Perms.ViewTopic {
group.CanSee = append(group.CanSee, ffid)
}
} else { } else {
//log.Print("Inheriting from default for forum #" + strconv.Itoa(fid)) //log.Print("Inheriting from default for forum #" + strconv.Itoa(fid))
forumPerm = BlankForumPerms forumPerm = BlankForumPerms
group.Forums = append(group.Forums, forumPerm) group.Forums = append(group.Forums, forumPerm)
} }
if forumPerm.Overrides {
if forumPerm.ViewTopic {
group.CanSee = append(group.CanSee, ffid)
}
} else if group.Perms.ViewTopic {
group.CanSee = append(group.CanSee, ffid)
}
} }
if dev.SuperDebug { if dev.SuperDebug {
log.Printf("group.CanSee %+v\n", group.CanSee) log.Printf("group.CanSee %+v\n", group.CanSee)
log.Printf("group.Forums %+v\n", group.Forums) log.Printf("group.Forums %+v\n", group.Forums)
log.Print("len(group.Forums)", len(group.Forums)) log.Print("len(group.CanSee)", len(group.CanSee))
log.Print("len(group.Forums)", len(group.Forums)) // This counts blank aka 0
} }
} }
return nil return nil
@ -379,10 +380,13 @@ func rebuildForumPermissions(fid int) error {
// ? - We could have buildForumPermissions and rebuildForumPermissions call a third function containing common logic? // ? - We could have buildForumPermissions and rebuildForumPermissions call a third function containing common logic?
func buildForumPermissions() error { func buildForumPermissions() error {
forums, err := fstore.GetAll() fids, err := fstore.GetAllIDs()
if err != nil { if err != nil {
return err return err
} }
if dev.SuperDebug {
log.Print("fids: ", fids)
}
rows, err := getForumsPermissionsStmt.Query() rows, err := getForumsPermissionsStmt.Query()
if err != nil { if err != nil {
@ -392,6 +396,9 @@ func buildForumPermissions() error {
if dev.DebugMode { if dev.DebugMode {
log.Print("Adding the forum permissions") log.Print("Adding the forum permissions")
if dev.SuperDebug {
log.Print("forumPerms[gid][fid]")
}
} }
// Temporarily store the forum perms in a map before transferring it to a much faster and thread-safe slice // Temporarily store the forum perms in a map before transferring it to a much faster and thread-safe slice
forumPerms = make(map[int]map[int]ForumPerms) forumPerms = make(map[int]map[int]ForumPerms)
@ -403,6 +410,10 @@ func buildForumPermissions() error {
if err != nil { if err != nil {
return err return err
} }
if dev.SuperDebug {
log.Print("perms: ", string(perms))
}
err = json.Unmarshal(perms, &pperms) err = json.Unmarshal(perms, &pperms)
if err != nil { if err != nil {
return err return err
@ -413,11 +424,14 @@ func buildForumPermissions() error {
if !ok { if !ok {
forumPerms[gid] = make(map[int]ForumPerms) forumPerms[gid] = make(map[int]ForumPerms)
} }
if dev.SuperDebug {
log.Print("gid: ", gid)
log.Print("fid: ", fid)
log.Printf("perms: %+v;", pperms)
}
forumPerms[gid][fid] = pperms forumPerms[gid][fid] = pperms
} }
if dev.SuperDebug {
log.Print("forumPerms ", forumPerms)
}
groups, err := gstore.GetAll() groups, err := gstore.GetAll()
if err != nil { if err != nil {
@ -430,32 +444,40 @@ func buildForumPermissions() error {
} }
group.Forums = []ForumPerms{BlankForumPerms} group.Forums = []ForumPerms{BlankForumPerms}
group.CanSee = []int{} group.CanSee = []int{}
for fid := range forums { for _, fid := range fids {
if dev.SuperDebug {
log.Printf("Forum #%+v\n", fid)
}
forumPerm, ok := forumPerms[group.ID][fid] forumPerm, ok := forumPerms[group.ID][fid]
if ok { if ok {
// Override group perms // Override group perms
//log.Print("Overriding permissions for forum #" + strconv.Itoa(fid)) //log.Print("Overriding permissions for forum #" + strconv.Itoa(fid))
group.Forums = append(group.Forums, forumPerm) group.Forums = append(group.Forums, forumPerm)
if forumPerm.Overrides {
if forumPerm.ViewTopic {
group.CanSee = append(group.CanSee, fid)
}
} else if group.Perms.ViewTopic {
group.CanSee = append(group.CanSee, fid)
}
} else { } else {
// Inherit from Group // Inherit from Group
// ? - Is this really inheriting from the Group? At-least for CanSee?
//log.Print("Inheriting from default for forum #" + strconv.Itoa(fid)) //log.Print("Inheriting from default for forum #" + strconv.Itoa(fid))
forumPerm = BlankForumPerms forumPerm = BlankForumPerms
group.Forums = append(group.Forums, forumPerm) group.Forums = append(group.Forums, forumPerm)
} }
if forumPerm.Overrides {
if forumPerm.ViewTopic {
group.CanSee = append(group.CanSee, fid)
}
} else if group.Perms.ViewTopic {
group.CanSee = append(group.CanSee, fid)
}
if dev.SuperDebug {
log.Print("group.ID: ", group.ID)
log.Printf("forumPerm: %+v\n", forumPerm)
log.Print("group.CanSee: ", group.CanSee)
}
} }
if dev.SuperDebug { if dev.SuperDebug {
log.Printf("group.CanSee %+v\n", group.CanSee) log.Printf("group.CanSee %+v\n", group.CanSee)
log.Printf("group.Forums %+v\n", group.Forums) log.Printf("group.Forums %+v\n", group.Forums)
log.Print("len(group.CanSee)", len(group.CanSee)) log.Print("len(group.CanSee)", len(group.CanSee))
log.Print("len(group.Forums)", len(group.Forums)) log.Print("len(group.Forums)", len(group.Forums)) // This counts blank aka 0
} }
} }
return nil return nil

View File

@ -149,6 +149,7 @@ func routeTopics(w http.ResponseWriter, r *http.Request, user User) {
} }
BuildWidgets("topics", nil, headerVars, r) BuildWidgets("topics", nil, headerVars, r)
// TODO: Add a function for the qlist stuff
var qlist string var qlist string
var fidList []interface{} var fidList []interface{}
group, err := gstore.Get(user.Group) group, err := gstore.Get(user.Group)
@ -158,12 +159,30 @@ func routeTopics(w http.ResponseWriter, r *http.Request, user User) {
return return
} }
for _, fid := range group.CanSee { var canSee []int
if fstore.DirtyGet(fid).Name != "" { if user.IsSuperAdmin {
canSee, err = fstore.GetAllVisibleIDs()
if err != nil {
InternalError(err, w)
return
}
} else {
canSee = group.CanSee
}
for _, fid := range canSee {
forum := fstore.DirtyGet(fid)
if forum.Name != "" && forum.Active {
fidList = append(fidList, strconv.Itoa(fid)) fidList = append(fidList, strconv.Itoa(fid))
qlist += "?," qlist += "?,"
} }
} }
// ! Need an inline error not a page level error
if qlist == "" {
NotFound(w, r)
return
}
qlist = qlist[0 : len(qlist)-1] qlist = qlist[0 : len(qlist)-1]
var topicList []*TopicsRow var topicList []*TopicsRow
@ -400,7 +419,7 @@ func routeForums(w http.ResponseWriter, r *http.Request, user User) {
for _, fid := range canSee { for _, fid := range canSee {
//log.Print(forums[fid]) //log.Print(forums[fid])
var forum = *fstore.DirtyGet(fid) var forum = *fstore.DirtyGet(fid)
if forum.ParentID == 0 { if forum.ParentID == 0 && forum.Name != "" && forum.Active {
if forum.LastTopicID != 0 { if forum.LastTopicID != 0 {
forum.LastTopicTime, err = relativeTime(forum.LastTopicTime) forum.LastTopicTime, err = relativeTime(forum.LastTopicTime)
if err != nil { if err != nil {

View File

@ -129,7 +129,7 @@ func compileTemplates() error {
} }
var forumList []Forum var forumList []Forum
forums, err := fstore.GetAllVisible() forums, err := fstore.GetAll()
if err != nil { if err != nil {
return err return err
} }

View File

@ -19,7 +19,7 @@ var form_vars = {'perm_preset': ['can_moderate','can_post','read_only','no_acces
<div class="formitem"><input name="forum_desc" type="text" value="{{.Desc}}" placeholder="Where the general stuff happens" /></div> <div class="formitem"><input name="forum_desc" type="text" value="{{.Desc}}" placeholder="Where the general stuff happens" /></div>
</div> </div>
<div class="formrow"> <div class="formrow">
<div class="formitem formlabel"><a>Hidden?</a></div> <div class="formitem formlabel"><a>Active</a></div>
<div class="formitem"><select name="forum_active"> <div class="formitem"><select name="forum_active">
<option{{if not .Active}} selected{{end}} value="1">Yes</option> <option{{if not .Active}} selected{{end}} value="1">Yes</option>
<option{{if .Active}} selected{{end}} value="0">No</option> <option{{if .Active}} selected{{end}} value="0">No</option>

View File

@ -47,10 +47,10 @@
<div class="formitem"><input name="forum-desc" type="text" placeholder="Where all the super secret stuff happens" /></div> <div class="formitem"><input name="forum-desc" type="text" placeholder="Where all the super secret stuff happens" /></div>
</div> </div>
<div class="formrow"> <div class="formrow">
<div class="formitem formlabel"><a>Hidden?</a></div> <div class="formitem formlabel"><a>Active</a></div>
<div class="formitem"><select name="forum-active"> <div class="formitem"><select name="forum-active">
<option value="0">Yes</option> <option value="1">Yes</option>
<option value="1">No</option> <option value="0">No</option>
</select></div> </select></div>
</div> </div>
<div class="formrow"> <div class="formrow">

View File

@ -176,6 +176,7 @@ func (mus *MemoryUserStore) BulkGetMap(ids []int) (list map[int]*User, err error
return list, nil return list, nil
} }
// TODO: Add a function for the qlist stuff
var qlist string var qlist string
var uidList []interface{} var uidList []interface{}
for _, id := range ids { for _, id := range ids {