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
>

Reply via email to