Closed Bug 68022 Opened 24 years ago Closed 22 years ago

Need more than 55 groups

Categories

(Bugzilla :: Bugzilla-General, defect, P1)

2.10
defect

Tracking

()

RESOLVED FIXED
Bugzilla 2.18

People

(Reporter: anowak, Assigned: bugreport)

References

(Blocks 1 open bug)

Details

(Whiteboard: [blocker will fix])

Attachments

(5 files, 3 obsolete files)

Currently, bugzilla can handle a maximum of 55 user defined groups, because of the 64 bit limit of perl. If one want's to control the visibility of a large number of products, this limit is too scarce. I suggest using the perl packages "Bit::Vector", "Set::IntRange" & "Math::BigIntFast" by Stefen Beyer, which can handle bit vectors of arbitrary size and provides efficient methods for handling them. (see http://www.perl.com/CPAN-local//modules/by-authors/Steffen_Beyer/).
Schema change ... moving to BZ3.
Assignee: tara → ian
Component: Bugzilla → Bugzilla 3
QA Contact: matty → ian
Target Milestone: --- → Bugzilla 3.0
Taking QA.
QA Contact: ian → matty
Blocks: 49808
I think we may need to rethink the targetting on this one. We have a bug targetted for 2.14 (see the block list) that's going to need this done first before we can check it in. One or the other is going to need to be retargetted.
Discussing this with Hixie in IRC, and checking out his existing source for Bz3 (yes, he's really been working on it), Bz3 does this by having a table that matches groups to bugs, and another that matches users to groups. This has precendence in Bugzilla 2.x because this is exactly the way CCs and keywords are handled.
Hixie's approach is a natural solution to the problem. It is the most normative way to represent one-to-many (bugs->groups, users->groups) and many-to-many (bugs<->users) relationships in a SQL database system. It is much more flexible than the current solution and will not present performance problems if the appropriate indexes are established. I wholeheartedly support Hixie's solution. Now I guess I better go look at it. :-)
Component: Bugzilla 3 → Bugzilla
Target Milestone: Bugzilla 3.0 → Bugzilla 2.14
in light of discussion, retargetting. Myk's recent work on the various confidential viewing holes should keep this easy since there's a function in globals.pl now to tell you if a bug is visible to the user. Can change the group lookups there and just fix everywhere else to call that function.
(Just for the record, and to keep expectations in check: the current bz3 code doesn't actually yet have a table for bugs<->groups, only users<->groups. However, it is indeed my intent for bugs to have a table listing which groups have which rights with respect to viewing or editing the bug, with the default being that if no groups are listed, all groups have access, and if one or more groups are listed, only those groups get any rights. I believe this closely resembles how Bugzilla 2 currently behaves at a UI level.)
Just making notes here so it doesn't get lost... the existing group table can have its indexes renumbered by: UPDATE groups SET bit=(LOG(bit)/LOG(2)) + 1;
The bug this blocks has been retargeted to 2.16, so this one could now drop off the 2.14 bug list if appropriate.
Blocks: 39816
Blocks: 43619
at least one bug this blocks is targetted for 2.14. ian, are you going to be able to look at this any time soon, or should i get someone else to do it.
it's only on Ian because it was targeted for bugzilla 3 originally and I moved it and forgot to reassign. I got the impression either Jake or I were going to tackle it but we never decided which. I'll take it for now, probably get something done on it this week sometime.
Assignee: ian → justdave
I've actually already fixed this bug. In the 3.0 codebase. http://lxr.mozilla.org/mozilla/source/webtools/PLIF/PLIF/Service/User.pm Now if you want it in the 2.x timeframe... :-)
Whiteboard: code
Hmm, something I didn't think about in implementing this... currently we define the bugzilla administrator by the user who has all the bits set in the groupset field. Since the groupset field will be going away, and we'll only have one-to- one mappings for the users->groups and bugs->groups, we need a new way to determine who the administrator is. Anyone have any ideas?
this is my current thinking.... mysql> show columns from bug_groups; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | bug_id | mediumint(9) | | PRI | 0 | | | group_id | mediumint(9) | | PRI | 0 | | +----------+--------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) mysql> show columns from user_groups; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | user_id | mediumint(9) | | PRI | 0 | | | group_id | mediumint(9) | | PRI | 0 | | +----------+--------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> show columns from user_blessgroups; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | user_id | mediumint(9) | | PRI | 0 | | | group_id | mediumint(9) | | PRI | 0 | | +----------+--------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) This would eliminate the "groupset" field in both the bugs and profiles tables, and the blessgroupset field in the profiles table.
I assume user_groups will be the things like CanConfirm, etc. and the bug_groups will be what is currently defined by isbuggroup. For blessgroups, you only have user_blessgroups... isn't it currently possible to allow somebody to have the bless ability on bug groups? Or will this one table cover both? As for the admin, we could probably add another User Group called Administrator.
Actually, user_groups matches users to groups, and bug_groups matches bugs to groups. The groups themselves are still the same ones defined in the groups table, with the isbuggroup flag and all. The keys will be renumbered to be sequential instead of powers of 2 though.
Blocks: 66235
OK, got another thought on this, as I'm trying to get this implemented. Product groups are currently a bit of a hack. As long as I'm redefining the entire group system, now would be the perfect time to redesign product groups as well to make it actually integrate into the system more cleanly. Here's what I'm proposing: 1) product groups get moved into their own table, eliminating the concept of product groups altogether, and simply matching users to which hidden products they're allow to see 2) Bugs get a new field which is a boolean toggle which simply tells if the bug is restricted in viewing to the people who can see the product the bug is in. 3) Since we don't have the existence of groups to compare to anymore to see if a product is restricted, each product should have a flag to tell whether it can be restricted or not also. ---------------- Pros: - It's a lot cleaner. - It will eliminate most of the challenges involved in moving a product- restricted bug from one product to another (currently if you do this, the bug winds up restricted to the old product instead of the new one) - Will get rid of a lot of the bloat on the bug entry and bug change forms for people who are allowed to see a large number of products, since a product can't be restricted to a different product's group anymore Cons: - one more table to change a product name in if you change a product name - an additional place to verify product names in the sanitycheck. Any comments, complaints, suggestions?
IMO, this is a good thing. Between this and bug 68022 bugzilla's usefulness increases by quite a bit. If it is possible to restrict who can see a bug in a product while still allowing the reporter to see the bug (and allowing new bugs to be added to a restricted product) it will probably fix bug 60769, too (I think there's a couple of similar bugs in extance also, but I don't have the numbers handy). I think 5 places to sanity check/change isn't much worse than 4 so the pros outweigh the cons.
s/bug 68022/bug 39816/; In previous comment :)
In case Joe thinks he's getting out of it, I'm kind of waiting for comments from him, since he created the current groupset system. :) Thoughts Joe? (I'm doing the programming here, so don't worry about getting yourself buried :)
OK... At last, a bit of breathing room. Here's my thoughts on everything we've got here: Mapping bugs and users to groups via ids and mapping tables: Good! Administrator: Perhaps another field on the profiles table to flag administrators? Simple to implement, I'd think... Mapping table layout: Those three tables sound good to me. My one nitpick is the names. I've found that naming mapping tables with "map" in the names helps clarify it, so instead of "user_groups", how about "user_group_map"? Jake's misunderstanding is evidence that this could use a little clarification. Product permissions table: I'm not sure I understand why we need a separate table for product groups. If we're going to map users to products, and we're going to restricted viewing and entering bugs on those products based on those mappings, then that sounds like it's still a group to me. (I'm assuming we would also keep the userregexp, because we want to be able to automatically put the appropriate users into the product groups.) If we want to differentiate product groups from non-product groups (a good idea, I think, so that we don't need to have a long list of irrelevant product groups show up on bug detail pages), we could just use a flag. When you move a bug from one product to another, it doesn't seem like it's that complicated to check if it's in a product group and move that as well... I guess I'm just not seeing how separating out product groups from other groups really gains us anything here that we can't have with just a flag on the groups table. And the con I see that wasn't mentioned is that it's also one more permission check you've got to do, that works differently than the other ones. Instead of doing (check all groups that this bug is restricted to against user permissions), you'd have to do ((check all groups that this bug is restricted to aganst user permissions) and (if(the product that this bug belongs to has restricted viewing access) then (check if this user has permissions to see the bugs that are restricted to this product)). I'm not saying it's necessarily a bad idea... I'm just unconvinced at this point. That's enough for now. Aren't you glad you asked? :-)
the main reason the product groups are mapped to users separately is that there is no mapping of bugs to product groups. Simply a designation of whether the bug is restricted to being viewed by people who can see that product. Yeah, it's one more check, but it vastly improves the likelyhood of avoiding data corruption when moving a bug between products. That was my main idea. :) I could still be talked out of it probably if there's a good enough reason for it :)
The thing is, you save on potential trouble in one place (changing the product a bug is assigned against... does this really happen often? I can't imagine that we'd _ever_ do it here...), and make trouble in another place (checking the permissions for a bug, which happens all over the place all the time). I'm not sure of the real gain here. I definitely _do_ think that designating product groups specially is worthwhile, but that could be done with a flag on the groups table, perhaps. However, you're doing the coding here, so I'll leave it at your discretion. If you think we're better off treating product permissions separately from group permissions, and want to do the coding for it, go ahead. :-) One more question to consider on that point, though: If you do decide to do it that way, would you still display product permissions along with other group permissions, or would they be separated out and displayed separately? I think that having two different sections of the bug form that dealt with restricting viewing permissions might be awkward...
yeah, I see your point. Changing a product happens pretty frequently on mozilla.org... people file things against bugzilla all the time that are really either problems with their browser (gets marked invalid unless it's Mozilla, in which case the bug gets moved to the Browser product), or something that's specific to bugzilla.mozilla.org, in which case it gets moved to the mozilla.org product. But I see your point. Compared to security checks, moving between products happens infrequently. On yet another hand, having a group that's named the same as a product seems a clumsy way to tie a group to a product. I guess that's the main thing I was trying to work around. But looking at it, I think it's still better off that way to minimize database queries on security checks.
> On yet another hand, having a group that's named the same as a product seems > a clumsy way to tie a group to a product. The real problem here is that products don't have anything to key on other than the name. Ideally, there would be a product_id we could use as a key. Then you could have a product_id field in the groups table, and if product_id = 0, it's not a product group, otherwise it's a group for the indicated product. I suspect that this would be an extremely non-trivial change, though, and the payoff may not be worth the effort it would take.
This grand patch is going to touch a total of 24 files. I think it's beyond what I have time for. I'm going to try to get checksetup.pl done and post it here today or tomorrow, so we know what we're looking at schema-wise, then list all the files and ask for volunteers to take and convert individual files. Some will be easier than others. buglist.cgi will likely be the worst because of the boolean chart queries. Some of the files probably do security checks manually and can probably be replaced with UserInGroup() calls or ValidateBugID() calls.
Based on a recent post to netscape.public.mozilla.webtools by Tony Tay, I am now convinced that a new group called "administrator" which is automatically special- cased as being a member of all groups and having all privs, is the way to go. What Tony is requesting in his post is the ability to make a management group which can see all bugs but can't edit them. This would probably be best served by creating a "seebugs" group which is special-cased like "administrator" which automatically makes you a member of all *product* groups (but not all privilege groups). Said people would be given "seebugs" but not "editbugs". This is probably worthy of a separate bug report, but just noting it here to show how what we're doing will make this easier to implement later.
No longer blocks: 66235
As noted in the patch discription, that's very incomplete, but that's what I've got so far. I may continue working on this, but it's really slow going because I don't have a lot of time right now. So if anyone wants to pick up the ball in the interest of getting 2.14 out the door, go for it.
Keywords: helpwanted
Since obviously no one has time to work on this, I'm pulling this off 2.14 in order to get 2.14 out. I'm breaking dependencies on the bugs that need to stay on 2.14, we can fix those on the existing schema for now.
No longer blocks: 39816, 43619
Target Milestone: Bugzilla 2.14 → Bugzilla 2.16
Blocks: 90619
No longer blocks: 90619
Blocks: 43619
Blocks: 91761
No longer blocks: 91761
Priority: -- → P1
Blocks: 91761
Component: Bugzilla → Bugzilla-General
Product: Webtools → Bugzilla
Version: other → 2.10
Attachment #41207 - Flags: review-
Blocks: 61343
It would be useful if a new grouping mechanism were able to apply different sets of permissions to different group memberships (i.e. User X can edit bugs in the "foo" group but can only view bugs in the "bar" group).
I would like the table names and stuff to be extendible. In particular, we may want to at some stage, introduce groups of different sorts of things. Hence I suggest something like: user_groups user_group_assignments bug_user_groups
Currently with the work I have done so far I have the following tables configured. groups * Removed the bit column since no longer needed. * Added a group_id column which is auto incrementing and primary key user_group_map * Consists of two columns user_id and group_id which determines which group each member belongs to. bug_group_map * Consists of two columns bug_id and group_id which determines which groups a bug report is private to. If no entries exist for a current bug report then that bug report is public. bless_group_map * Consists of two columns user_id and group_id which determines which group a user can bless another user into if desired. profiles * I added a column to the profiles table called admin which is a boolean type column. If it is 1 then the member is an admin and cannot have their group permissions altered. Current same function as having have their previous groupset set to all ones. The user still needs to have their user_id added to every group to be able to see everything. editgroups.cgi will look for users designated as admins and add those to a new created group. Everything seems to be working as far as providing same functionality as current 2.14 code. I still need to add a section to checksetup.pl to do a conversion of current bitmasked type permissions to new style but I wanted to make sure everything else worked first. I also propose not having products as just another group and have them user their own table such as products * Add a product_id column auto incrementing and primary key product_group_map * Consists of two columns product_id and group_id which determines which group can enter bugs against which product and also determines product list from the query page. All of the above has been in place for well over a year now at Red Hat and has proven very successful for us.
Blocks: 104690
>products > * Add a product_id column auto incrementing and primary key See bug 43600.
As far as I understand the product groups influence both ability to enter and default groupset, if you have usebuggroupsentry on. Is this the time to separate this into two columns, enter_group, default_group?
Which table are you referring to adding the columns enter_group and default group? product_group_map? If that is the case then I understanding you to be saying that if the product_id in product_group_map is flagged as a enter_group it would show up in the enter_bug.cgi product list, and if it is falled also as a default_group then it would show up on the query.cgi page as well as reports.cgi. Am I understanding this properly?
Blocks: 106884
No longer blocks: 106884
This is going to be a blocker for the 2.16 release
Severity: enhancement → blocker
-> patch author
Assignee: justdave → dkl
This now has a branch in cvs, v0.3 was just checked into the branch. To obtain the branch: cvs checkout -d bugzilla-groups -rBugzilla_Groups_Branch Bugzilla or cvs update -rBugzilla_Groups_Branch
Blocks: 107718
I was discussing the selectVisible stuff with dkl last night, trying to find a fast way to map between the three tables (bugs, bug_group_map and user_group_map). However, there are actually two things here: CanSeeBug, and SelectVisible. Currently, the first uses the second, because its easier that way, but theres no need for that to be the case. [lightly code follows] CanSeeBug can be written (w/o the cc stuff) as: SELECT bug_group_map.bug_id FROM bug_group_map LEFT JOIN user_group_map ON group_id AND user_group_map.user_id = $userid WHERE bug_group_map.bug_id = $bugid AND user_group_map.group_id IS NULL LIMIT 1 If this returns any rows, then the user cannot see the bug. Its written that way to make the user-in-one-group, bug-in-two-groups stuff work. We could also write a version of this which takes multiple bugs, for use in the multiple change stuff. With cc/accessible stuff, it becomes: SELECT bugs.bug_id FROM bugs LEFT JOIN cc ON bugs.bug_id = cc.bug_id AND cc.who = $userid LEFT JOIN bug_group_map ON bugs.bug_id=bug_group_map.bug_id LEFT JOIN user_group_map ON bug_group_map.group_id = user_group_map.group_id AND user_group_map.user_id = $userid WHERE bugs.bug_id = $bugid AND user_group_map.group_id IS NULL AND (bugs.reporter_accessible = 0 OR bugs.reporter != $userid) AND (bugs.qacontact_accessible = 0 OR bugs.qa_contact != $userid) AND (bugs.assignee_accessible = 0 OR bugs.assigned_to != $userid) AND (bugs.cclist_accessible = 0 OR cc.who IS NULL) LIMIT 1 ISTR the mysql docs mentioning that ORs weren't optimised well - it may be better to apply De Morgan to change the (a OR b) into NOT (NOT A AND NOT B). We should run EXPLAIN to find out. However, you should add some indexes to the *map* tables, first. Currently, though, I get: EXPLAIN SELECT bugs.bug_id FROM bugs LEFT JOIN cc ON bugs.bug_id = cc.bug_id AND cc.who = 2 LEFT JOIN bug_group_map ON bugs.bug_id=bug_group_map.bug_id LEFT JOIN user_group_map ON bug_group_map.group_id = user_group_map.group_id AND user_group_map.user_id = 2 WHERE bugs.bug_id = 1 AND user_group_map.group_id IS NULL AND (bugs.reporter_accessible = 0 OR bugs.reporter != 2) AND (bugs.qacontact_accessible = 0 OR bugs.qa_contact != 2) AND (bugs.assignee_accessible = 0 OR bugs.assigned_to != 2) AND (bugs.cclist_accessible = 0 OR cc.who IS NULL) LIMIT 1; +-----------------------------------------------------+ | Comment | +-----------------------------------------------------+ | Impossible WHERE noticed after reading const tables | +-----------------------------------------------------+ 1 row in set (0.01 sec) (when the user is teh assignne of a bug they are not in the group for) which does suggest that mysql will optimise this away in most cases. Also, I had to SqlQuote the username is post_bug.cgi to add a comment, plus processmail is complaining about taint errors. As well, teh group stuff isn't an option when entering a new bug. So thats CanSeeBug :) SelectVisible to follow, much later.
OK, try this for select visible. According to EXPLAIN, its done w/o temporary tables (after adding indexes to the _map_ tables) We still need two queries, first this, then one with ... AND (bugs.reporter_accessible = 1 OR .... OR bugs.bug_id IN (list from first query). SELECT bugs.bug_id FROM bugs LEFT JOIN bug_group_map USING (bug_id) LEFT JOIN user_group_map ON bug_group_map.group_id = user_group_map.group_id AND user_group_map.user_id = 2 GROUP BY bugs.bug_id HAVING (COUNT(user_group_map.group_id) = COUNT(bug_group_map.group_id)); Can I avoid the COUNT?
I will give this a try and see what happens? Would the following accomplish the same thing without using the COUNT() function? SELECT bugs.bug_id FROM bugs LEFT JOIN bug_group_map USING (bug_id) LEFT JOIN user_group_map ON bug_group_map.group_id = user_group_map.group_id AND user_group_map.user_id = 2 GROUP BY bugs.bug_id HAVING (user_group_map.group_id IS NOT NULL and bug_group_map.group_id IS NOT NULL); Aren't we just checking to make sure that there is more that 0 in both tables? I am not sure if not using the COUNT() function would yield better performance for really large return sets. May have to benchmark it both ways or use EXPLAIN.
SELECT $selectedCols, bugs.bug_id SV_bugid, bugs.reporter SV_reporter, bugs.reporter_accessible SV_reporter_accessible, bugs.assigned_to SV_assigned_to, bugs.assignee_accessible SV_assignee_accessible, bugs.qa_contact SV_qa_contact, bugs.qacontact_accessible SV_qacontact_accessible, SV_cc.who, bugs.cclist_accessible SV_cclist_accessible FROM bugs LEFT JOIN bug_group_map USING (bug_id) LEFT JOIN user_group_map ON bug_group_map.group_id = user_group_map.group_id AND user_group_map.user_id = $userid LEFT JOIN cc SV_cc ON bugs.bug_id = SV_cc.bug_id AND SV_cc.who = $userid WHERE $wherecond GROUP BY bugs.bug_id HAVING (COUNT(user_group_map.group_id) = COUNT(bug_group_map.group_id)) OR (SV_reporter=$userid AND SV_reporter_accessible=1) OR (SV_assigned_to=$userid AND SV_assignee_accessible=1) OR (SV_qa_contact=$userid AND SV_qacontact_accessible=1) OR (NOT isnull(SV_cc.who) AND SV_cc.who = $userid AND SV_cclist_accessible=1); Will do this in one query. There may be problems with existing HAVING clauses, but the only one which calls selectvisible is in buglist.cgi, and that should probably be DISTINCT instead. I'm not sure how fast this will be, though.
I took a slightly different route that I would like some review on. I am commiting some new changes to the groups branch that handles the way permissions to see a bug are decided for both single bugs and lists of bugs. I modified the CanSeeBug function to no longer calling SelectVisible and instead does its own checking of the permission level of a bug. CanSeeBug can also work with a list of bug numbers and will return a hash containing bug numbers that can be seen by the member. This is useful for buglist.cgi since it need only first do it's normal query to get a list bugs based on the search criteria, feed the list of bug numbers to CanSeeBug and it will return what the user can see. Buglist.cgi then just skips the ones it cannot see. The whole process only adds two more queries to the overall page load. I have not disabled SelectVisible in all places except for CanSeeBug() and buglist.cgi so as to get feedback first. Also the edit multiple bugs feature in buglist.cgi does not work yet for group manipulation. My reason for suggesting to move the permission checking out of SelectVisible was because of performance issues with Oracle and PostgreSQL. According to the Oracle documentation when do 3 or more outer joins in a single query performance starts to degrade substantially. After importing our Oracle database into PostrgreSQL for testing with the PostgreSQL port of the current code base, PostgreSQL would choke on the 50,000 bugs we have currently. When commenting out the SelectVisible() line in buglist.cgi, PostgreSQL return the expected results (minus permission checking) almost instantaneously. And it remained very responsive with the new version of CanSeeBug and seems to perform permission checking properly. I have done a similar change in the groups branch and it also seems to perform nicely with the 50,000 bugs from our Oracle database imported into Mysql. Let me know any feelings on this change.
I discussed something with justdave last night that I would like some other feedback on. Someone mentioned that there really shouldnt be a case where someone would need to be able to bless someone else into a group unless they are are also a member of that group or have 'editusers' privs. If this is the case I can just drop the separate bless_group_map table altogether and add another column to the user_group_map table to track bless information. user_id | group_id | bless ------------------------------- 6 | 10 | 1 The bless column would be a boolean type and if 1 would mean that person can bless others into that group, 0 they cannot. This would only be settable by persons with 'editusers' privs. The only catch would be what was discussed earlier, that a person would need to be a member of a group to also be able to bless others. If everyone thinks this should always be the case I will make the changes.
In bugzilla3, there is a similar map except the "bless" column is a "rank" column and can be one of: non-member (0 or row not there) do not have any rights related to this group member (1) have the rights that all members get. op (2) are allowed to promote non-members or demote members. admin (3) are allowed to change anyone's level within this group. edit-users privs is equivalent to level 2. With this system, however, when a group's administrator leaves the project he does not have to contact the bugzilla administrator to change who can make other people into ops. (This is actually already implemented, although there is no UI for it yet.)
To step back from the technical issues and look at the people activities that this is supposed to support: there are several different team structures that Bugzilla ought to support. One of these is a central Bugzilla administration person and then a designated member of each team who is responsible for administering that team's bugs, users etc. So Bugzilla ought to be able to support this by creating a group for each team and then assigning bugs and users to groups. The motivation may be security (a team is only allowed to see/change its own bugs) or it may be simplification (a team may want to see just its own bugs). In some organisations, a bug may move between teams. For example, one team might be responsible for a set of libraries and another team may be using those libraries to build systems. A bug could start off being assigned to an end system product and then after investigation be reassigned to a library (and so to another team and another group). In other organisations, each team is effectively working in isolation and bugs rarely move across teams. Bugzilla must support both of these structures. As a team may have many (m) members and many products (n), and any member of the team may be called on to work on any of the team's products, it would be advisable to allow the team members and the products to be connected to the group (m+n operations), rather than having to connect each team member to each product (m*n operations).
> Someone mentioned that there really shouldnt be a case where > someone would need to be able to bless someone else into a group unless they > are also a member of that group or have 'editusers' privs That was me, I think. I can't think of a reason, and hixie's solution is sort of similar to what you propose (although his goes further)
>edit-users privs is equivalent to level 2. With this system, however, when a >group's administrator leaves the project he does not have to contact the >bugzilla administrator to change who can make other people into ops. >(This is actually already implemented, although there is no UI for it yet.) This is a good idea. So basically with the current scheme I propose we have the following values for the bless column in the user_group_map table: 0 = Person is a normal member and cannot alter others privs for that group. 1 = Person can place another into the particular group but not alter bless privs for that person. 2 = Person can place another person into the particular group and can also give that person the ability to place others in to that group. Value 2 would allow as you describe for someone to pass on administrator status for a group to someone else.
CCing Asa Dotzler and Mitchell Stoltz, two of the primary users of groups at b.m.o.'s installation of Bugzilla. Asa and Mitchell: read comment 48 and following comments and let us know if these changes meet your needs for the security group and other groups at b.m.o.
I can't think of a case for b.m.o where I would want someone who is not a part of a group to be able to add people to that group. To put it another way, I have no problem with a Bugzilla requirement that a person be a part of a group in order to add other people to that group. If I've misunderstood this please correct me.
Sounds like you understood it fine, at least you understood it the way I also understand it ;) Unless Mitchell Stoltz or anyone else has any objection to implementing it this way for the time being, I will go ahead and make the changes and submit it for review.
Myk, The change mentioned in comment 48 is fine with me as far as the security group in b.m.o is concerned.
Blocks: 97471
Depends on: 120980
Is the latest version of this in CVS? The version in cvs is reasonably broken in lots of ways (people not logged in can see secure bugs if there is no qa contact, the permissoin checkboxes aren't showing up correctly (or at all on enter_bug), Bug.pm gives bogus results if the bug# is invalid, processmail gives taint errors, etc)
OK, I think part of the problem is that the merging between trunk and branch has't worked properly all the time. For example, acording to bonsai the branch was last synced yesterday, but changes form last week like upping the version of TemplateToolkit aren't there. I'm hacking on this now, and will attach a patch later this evening.
Attached patch partial diff -w patch vs branch cvs (obsolete) (deleted) — Splinter Review
OK, I got up to edit*. (I did have to hack on bits of globals.pl, but I haven't looked at that yet in detail.) The diff is -w for ease-of-reading. Most of the stuff is simple to follow. What are you doing with product groups? checksetup has an table in there, but its unused. I hacked the existing stuff in - see the code. Comments on the table schema: groups doesn't need an index on group_id, since its the primary key, which implies an index. user_group_map should have a unique(user_id,group_id) index, instead of the single one for user_id. Similarly for bug_group_map. As I mentioned above, I'm not sure what product_group_map is for.
Attached patch wip diff -w, take 2 (deleted) — Splinter Review
OK, heres v 2. I'm now gone through everything except edit*, which dkl is going to redo anyway in order to add the admin stuff as discussed on IRC, + the product group stuff. Misc comments: - I've tested this very very briefly; some changes havne't been tested at all - Group changes don't appear on the activity log - Can't search for bugs in group x - Note the locks I added to post_bug.cgi - I definately haven't tested the multiple bugs stuff. - The word groupset no longer appears outside of edit* and checksetup.pl - I'm wondering if this should be pushed off beyond 2.16 Anyone else?
Attachment #65992 - Attachment is obsolete: true
Keywords: helpwantedpatch, review
moving this out of 2.16. We're way late already and I wanna get 2.16 out the door. This is major enough of a change that it shouldn't be going in this close to the end of a release cycle anyway. We'll put it in one of the first things during the 2.18 cycle.
Target Milestone: Bugzilla 2.16 → Bugzilla 2.18
No longer blocks: 97471
Blocks: 114696
Blocks: 125492
In the current security implementation, it is possible to add additional "action" (for want of a better word) groups like "canedit" and "canconfirm" and customize Bugzilla to conditionally permit the user to take certain actions based on their membership in those groups. How does this re-implementation take this kind of customization into account? Is it easier to do this, more difficult, or the same?
You mean by chaning the source code? Adding a group is no different to before. You'd just create an admin group "canfoo", and then add UserInGroup checks at the apropriate places. there isn't any ui to create an admin gruop, but ther isn't any ui currently, so... The only front end change is that since we have to remove the blessgroupset stuff, membership in a group is now at four levels - -1. Not a member 0. Member. 1. Can add others to the group and 2. can add anyone to level 1. (-1 isn't a real level, it corresponded to no entry in the table) This means that it will not be possible for someone to be in the blessgroupset without being in the group, which is currently possible, although silly, since they could just add themselves. buggroups (aka porduct groups) have also been changed to be more fine grained via another table - you can now use the same group (or groups) for multiple bugs. That code still needs a bit of work, though. isadmin is still a separate flag on the profiles table, although it could (as part of a separate bug) just become a group whose members are automatically added to level 2 of every new group.
In regardless to the usegroupsentry stuff I was talking about, I'm not sure how to represent this in the current schema. Originally I was thinking we would continue to give products a group rather than a group set. That's fine I suppose, but we need to figure out a way to not regress the usegroupsentry option. I guess the options that come to mind are another table, or another field on product_group_map. We want to be able to leave products open, we want to be able to give products a groupset but allow anyone to report on them, and we want to be able to give products a groupset and prevent certain people from reporting on them (or seeing them). Do we want to be able to prevent them reporting against a product, but still see the bugs? If entry and viewing are totally independent, perhaps a three valued field is the order of the day, or checkboxes where one must be on. The fourth value/all checkboxes off situation is where there would be no record.
Another question is whether the entry groupset will ever differ from the default groupset.
IMHO the important thing is to be able to put more than one product in a group.
The code on the branch has a table which is a map. It should have a flag for requried vs default on vs default off. Using this, the buggroup sentry stuff vanishes, and becomes more flexable. However, I've proposed to dkl that this stuff be removed, and left for a future bug. This is partly because he creates product ids (which is covered by another bug), and partly because its not needed for this, and is just going to make it harder to review, and land.
OK, so is the proposal here to get the groups extension stuff in, and continue to locate product groups by name, and leave the rest for a separate bug? That sounds like an appropriate course of action to me. I definitely want one group against several products for 2.18, but that can wait for another bug. The only qualm is if it makes checksetup.pl more complicated since it is two schema updates and we need to be able to handle the situation where only the first has occurred as well as before both and after both.
Well, thats my plan, but I'm not writing the code... The schema change isn't a problem - they happen sequentially, just like they happen now. The latter one will have to check the values of some paramaters (eg "usebuggroups"), though, to determine what to put into the new column, but thast ok.
Blocks: 147275
OK, what's the status on this? 2.16 is going to be out soon, and I get the feeling this bug is in general blocking a lot more bugs than actually got set as dependencies on it.
Err, 2.16? This isn't going to be in 2.16. Actually, the code as designed would be a lot easier with bug 43600 fixed. That isn't a blocker for this, though, because its just an 'extra' step which fixes bug 147275. I think we need to pull features out of the groups branch, though, and just get the basics working
Not sure where to put bugs against a branch that isn't merged in yet, so I'm putting this here..... (JustDave: should we have a version for this branch??) New account creation in Bugzilla_Groups_Branch ... Software error: INSERT INTO user_group_map VALUES (2, 6): Column count doesn't match value count at row 1 at globals.pl line 271. Seems to be caused by foreach my $groupid (@groups) { SendSQL("INSERT INTO user_group_map VALUES ($userid, $groupid)"); } when the user_group_map has 3 values. I noticed in checksetup.pl also that the INSERT/UPDATE commands all use the implicit knowledge of what the fields are. I suspect that this could make merges more difficult in the future if fields are added. I'd suggest "INSERT INTO user_group_map ( user_id, group_id ) VALUES ($userid, $groupid"
Yeah, the ocde on the branch is partial. I'm considering starting from scratch, pulling only particular bits from the branch.
Brad, Dave, (( I never know if I should have these sidebars in email, newsgroup, IRC, or on a bug -- let me know if you have a preference)) Several of the things I need to do are starting to coalesce around bug 147275 I am going to need to start work on something that essentially means that, in addition to users having groupsets and blessgroupsets, products will have a number of groupsets (default, required, permitted, editors). I am approaching a decision point where I have to decide if I am going to do this with old bit-math groupsets or new ones. My suspicion is that I will have to do this now with the old groupsets but be prepared to migrate to the new ones. There are several aspects of the new groups that could make my life easier. The same way as editusers has to show 2 columns of checkboxes with the blessgroup and the memberofgroup, I will need to have several columns for each product. (default, required, permitted, editors). If you could make the group_map table... tinyint idtype (0 if id is a user, 1 if id is a product) mediumint id (user_id or product_id - depending on idtype) group_id canwhat ( 0 = canbeamember, 1 = canbless, 2 = isdefault, 3= isrequired, 4 = ispermitted, 5 = iseditors ...) This also leaves the door open to another idtype ( 2 => id is a group) permitting groups to be eventually defined in terms of other groups. [ essential if I start adding "roles" where certain reviews can only be done by certain groups of people ] Naturally, this also would imlply that there could be quite a bit of common code between the editproducts and editusers scripts and templates.
The code on the branch goes half way towards adding a product_group_map table. It uses ids for products, but doesn't do it properly - the correct and full fix is in bug 43600.
Attached patch Fix for new account fatal error (obsolete) (deleted) — Splinter Review
In the current tip of CVS, usebuggroups does not result in the creation of new groups when a new product is created. It may not be necessary to fix this if bug 147275 is going to rework the whole product groups issue anyway.
In the tip of Bugzilla_PgSQL_Groups_Branch ( globals.pl 1.170.2.2 ) line 139 uses the variable, "$driver" for the database type. checksetup.pl and pgsetup.pl both define a variable $db_driver in localconfig. This means that the DBI->connect will fail if using a mysql database. This should probably be changed to $db_driver in globals.pl
In the tip of Bugzilla_PgSQL_Groups_Branch, checksetup.pl (1.152.2.1) will fail if the database being converted happens not to have group records in order at EVERY power of 2. This seems to come from the code below which first causes MySQL to assign numbers to the newly added group_id column and then updates them. It looks like this code could simply come out (at least for MySQL). Otherwise, it should either order by group_id then by bit or only do the update if the group_id were not already set. if (&GetFieldDef('groups', 'bit')) { &AddField('groups', 'group_id', 'mediumint primary key auto_increment not nu ll'); &AddField('profiles', 'admin', 'smallint default 0'); my $currentgroupid = 1; my $query = "select bit from groups order by bit"; my $sth = $dbh->prepare($query); $sth->execute(); while (my ($bit) = $sth->fetchrow_array()) { my $query = "update groups set group_id = $currentgroupid where bit = $b it"; my $sth2 = $dbh->prepare($query); $sth2->execute(); $currentgroupid++; }
Patch removing conflicting operation described in comment 79
Depends on: 157040
A new branch implementing this feature is ready for testing on non-production databases and copies of production databases. It is being tracked under bug 157756. Please note test experiences in that bug's comments. There are some hints for copying production databases to test databases in that bug.
Depends on: 157756
I've taken the question of what to do with the 2 main bugs under advisement with dkl and we are leaning towards closing this bug 68022 as a duplicate of bug 157756. If anyone thinks that is the wrong thing to do, please speak up now. Bug 157756 is ready for some serious testing, particularly by people with a large and complex group list and especially by people who move bugs. Naturally, you should not test it on your live database. There are some hints in one of the early comments on how to make a database copy for testing.
No longer depends on: 157040
Comment on attachment 90772 [details] [diff] [review] Fix for new account fatal error Way outdated -- see bug 157756
Attachment #90772 - Attachment is obsolete: true
Comment on attachment 90900 [details] [diff] [review] Patch to Bugzilla_PgSQL_Groups_Branch checksetup.pl This is way-obsolete
Attachment #90900 - Attachment is obsolete: true
Comment on attachment 90900 [details] [diff] [review] Patch to Bugzilla_PgSQL_Groups_Branch checksetup.pl This is way-obsolete
Keywords: review
Finally marking as a dup, per a discussion with joel on IRC. *** This bug has been marked as a duplicate of 157756 ***
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → DUPLICATE
sorry, JayPee, we've discussed that in the past, this bug is advertised to the world all over the place, not to mention has a block list like you wouldn't believe which has just gotten confused by being closed as a duplicate. This stays open until it's checked in, then it gets closed as FIXED.
Status: RESOLVED → REOPENED
Resolution: DUPLICATE → ---
Whiteboard: code → [blocker will fix]
Joel is the one actually working on this at the moment
Assignee: dkl → bugreport
Status: REOPENED → NEW
(Now it's really fixed!!) This has been checked in to HEAD under bug 157756, reoloving this item. There is one known regression that will be tracked under a seperate bug where buglist does not highlight bugs properly. Due to the size of this schema change, I cannot stress enough the importance of making backup snapshots of your database before updating from HEAD.
Status: NEW → RESOLVED
Closed: 22 years ago22 years ago
Resolution: --- → FIXED
No longer depends on: 120980
Could We extend this to include the values inside the fields? Say i want only one group to submit bugs with critical status. Is more that possible with these changes in place?
QA Contact: matty_is_a_geek → default-qa
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: