> On Jan 10, 2018, at 4:07 PM, sebb <seb...@gmail.com> wrote: > > On 10 January 2018 at 16:27, Craig Russell <apache....@gmail.com> wrote: >> Thanks for the explanation. I now know what these two lines are supposed to >> do, but apparently they don't work. >> >> I removed the (redundant) check from modify_pmcchairs for testing and: >> >> [MacBook-Pro-9:/srv/whimsy/tools] clr% ./modify_pmcchairs.rb --add clr >> Password for clr: >> [MacBook-Pro-9:/srv/whimsy/tools] clr% ./modify_pmcchairs.rb --add clr >> Password for clr: >> _WARN [#<LDAP::Mod:0x7f966a1238a8 LDAP_MOD_ADD >> {"member"=>[]}>] >> >> IIUC this means that the >> _WARN cn=pmc-chairs,ou=groups,ou=services,dc=apache,dc=org >> /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:260:in `modify': >> Protocol error (LDAP::ResultError) >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:260:in >> `modify' >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:1377:in `add' >> from ./modify_pmcchairs.rb:36:in `block in <main>' >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:145:in `bind' >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:145:in `bind' >> from ./modify_pmcchairs.rb:36:in `<main>' >> [MacBook-Pro-9:/srv/whimsy/tools] clr% ./modify_pmcchairs.rb --rm clr >> Password for clr: >> [MacBook-Pro-9:/srv/whimsy/tools] clr% ./modify_pmcchairs.rb --rm clr >> Password for clr: >> _WARN [#<LDAP::Mod:0x7fc03380b6f0 LDAP_MOD_DELETE >> {"member"=>[]}>] >> _WARN cn=pmc-chairs,ou=groups,ou=services,dc=apache,dc=org >> /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:260:in `modify': Object >> class violation (LDAP::ResultError) >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:260:in >> `modify' >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:1368:in >> `remove' >> from ./modify_pmcchairs.rb:38:in `block in <main>' >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:145:in `bind' >> from /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:145:in `bind' >> from ./modify_pmcchairs.rb:38:in `<main>' >> >> Here's the fix: >> >> diff --git a/lib/whimsy/asf/ldap.rb b/lib/whimsy/asf/ldap.rb >> index 6f2065b..9d1c9f7 100644 >> --- a/lib/whimsy/asf/ldap.rb >> +++ b/lib/whimsy/asf/ldap.rb >> @@ -1365,6 +1365,7 @@ module ASF >> def remove(people) >> @members = nil >> people = (Array(people) & members).map(&:dn) >> + return if people.empty? >> ASF::LDAP.modify(self.dn, [ASF::Base.mod_delete('member', people)]) >> ensure >> @members = nil >> @@ -1374,6 +1375,7 @@ module ASF >> def add(people) >> @members = nil >> people = (Array(people) - members).map(&:dn) >> + if people.empty? > > Is that supposed to be 'return if empty?'
I'm so happy that you are following this thread. Ruby compiler caught this also. ;-) Craig > >> ASF::LDAP.modify(self.dn, [ASF::Base.mod_add('member', people)]) >> ensure >> @members = nil >> >> I think for human experience it's bad to return without doing anything and >> without giving the user information that it's expected that nothing was done. >> >> Now that I know how this is supposed to work, the issue is where the >> checking should be done and how to report the issue to the user. >> >> The code in ldap.rb is used everywhere so it is probably not good to puts >> messages but perhaps better to raise a meaningful error instead of Object >> class exception. >> >> Craig >> >>> On Jan 9, 2018, at 8:13 PM, Sam Ruby <ru...@intertwingly.net> wrote: >>> >>> On Tue, Jan 9, 2018 at 6:11 PM, Craig Russell <apache....@gmail.com> wrote: >>>> >>>>> On Jan 8, 2018, at 11:55 PM, Sam Ruby <ru...@intertwingly.net> wrote: >>>>> >>>>> On Mon, Jan 8, 2018 at 11:34 PM, Craig Russell <apache....@gmail.com> >>>>> wrote: >>>>>> >>>>>>> On Jan 8, 2018, at 7:32 PM, Sam Ruby <ru...@intertwingly.net> wrote: >>>>>>> >>>>>>> On Mon, Jan 8, 2018 at 7:07 PM, Craig Russell <apache....@gmail.com> >>>>>>> wrote: >>>>>>>> /Users/clr/apache/git/whimsy/lib/whimsy/asf/ldap.rb:260:in `modify': >>>>>>>> Object class violation (LDAP::ResultError) >>>>>>>> >>>>>>>> And error reporting is not great. I guess more checking is needed but >>>>>>>> Object class violation is not very informative. >>>>>>> >>>>>>> Oh, and AGREED! >>>>>>> >>>>>>> LDAP sucks. You want to add zero members: Object class violation. >>>>>>> You want to add somebody who is already a member: Object class >>>>>>> violation. You want to remove somebody who is not a member: Object >>>>>>> class violation. >>>>>>> >>>>>>> That's why the action that caused the error is logged. In this case: >>>>>>> >>>>>>> LDAP_MOD_DELETE >>>>>>> {"member"=>[]}> >>>>>>> cn=pmc-chairs,ou=groups,ou=services,dc=apache,dc=org >>>>>>> >>>>>>> Here you are deleting nobody. That apparently is not allowed. >>>>>> >>>>>> Seems like there is some error checking that could be done in the >>>>>> ldap.rb code. >>>>>> >>>>>> Here is the remove code from lib/whimsy/asf/ldap.rb : >>>>>> >>>>>> # remove people from this service in LDAP >>>>>> def remove(people) >>>>>> @members = nil >>>>>> people = (Array(people) & members).map(&:dn) >>>>>> ASF::LDAP.modify(self.dn, [ASF::Base.mod_delete('member', people)]) >>>>>> ensure >>>>>> @members = nil >>>>>> end >>>>>> >>>>>> Who wrote this code? >>>>> >>>>> That would be me. >>>>> >>>>>> Would it be possible for this code to check before calling >>>>>> ASF::LDAP.modify that the member actually exists already? >>>>> >>>>> The line above it takes the intersection between the list of people >>>>> passed to remove and the current set of members. So if a person who >>>>> is not a member of the service is passed in, they will be silently >>>>> removed from the set. >>>> >>>> Evidence suggests that the line and the corresponding line in Service.add >>>> are not working as intended. >>>> >>>> Where does the variable members come from? Is it different from @members >>>> that is set to nil just before trying to remove existing members? >>> >>> members is a method call. Essentially, self.members(). >>> >>> https://whimsy.apache.org/docs/api/ASF/Service.html >>> >>> @members is the cached value for this function. Setting it to nil >>> will force the members method to fetch new data from LDAP. >>> >>> - Sam Ruby >>> >>>>> I'm not sure how to refactor it, but there are add and remove methods >>>>> for a number of LDAP objects: Committee, Project, etc. >>>> >>>> I'm not sure that a refactoring is needed, just testing to make it work as >>>> intended. >>>> >>>> Craig >>>>> >>>>> - Sam Ruby >>>>> >>>>>> Craig >>>>>> >>>>>>> - Sam Ruby >>>>>>> >>>>>>> - Sam Ruby >>>>>> >>>>>> Craig L Russell >>>>>> Secretary, Apache Software Foundation >>>>>> c...@apache.org http://db.apache.org/jdo >>>> >>>> Craig L Russell >>>> Secretary, Apache Software Foundation >>>> c...@apache.org http://db.apache.org/jdo >>>> >> >> Craig L Russell >> Secretary, Apache Software Foundation >> c...@apache.org http://db.apache.org/jdo >> Craig L Russell Secretary, Apache Software Foundation c...@apache.org http://db.apache.org/jdo