class ASF::Committer

Manage committers: list, add, and remove people not only from the list of people, but from the list of committers.

Public Class Methods

create(attrs) click to toggle source

create a new person and add as a new committer to LDAP. Attrs must include uid, cn, and mail

# File lib/whimsy/asf/ldap.rb, line 585
def self.create(attrs)
  # add person to LDAP
  person = ASF::Person.add(attrs)

  # add person to committers lists
  register(person)

  # return new person
  person
end
deregister(person) click to toggle source

deregister an existing person as a committer updates both committer LDAP groups

# File lib/whimsy/asf/ldap.rb, line 670
def self.deregister(person)
  if person.instance_of? String
    id = person # save for use in error message
    person = ASF::Person[person] or raise ArgumentError.new("Cannot find person: '#{id}'")
  end

  # remove person from 'legacy' committers list
  ASF::Group['committers'].remove(person)

  # remove person from 'new' committers list
  ASF::LDAP.modify("cn=committers,#{@base}",
    [ASF::Base.mod_delete('member', [person.dn])])
end
destroy(person) click to toggle source

completely remove a committer from LDAP ** DO NOT USE ** In almost all cases, use deregister instead

# File lib/whimsy/asf/ldap.rb, line 637
def self.destroy(person)
  # if person is a string, find the person object
  person = ASF::Person.find(person) if person.instance_of? String

  # remove person from 'legacy' committers list, ignoring exceptions
  ASF::Group['committers'].remove(person) rescue nil

  # remove person from 'new' committers list, ignoring exceptions
  ASF::LDAP.modify("cn=committers,#{@base}",
    [ASF::Base.mod_delete('member', [person.dn])]) rescue nil

  # remove person from LDAP (should almost never be done)
  ASF::Person.remove(person.id)
end
list() click to toggle source

get a list of committers

# File lib/whimsy/asf/ldap.rb, line 572
def self.list
  ASF.search_one(base, 'cn=committers', 'member').flatten.
    map {|uid| Person.find uid[/uid=(.*?),/, 1]}
end
listids() click to toggle source

get a list of committers (ids only)

# File lib/whimsy/asf/ldap.rb, line 578
def self.listids
  ASF.search_one(base, 'cn=committers', 'member').flatten.
    map {|uid| uid[/uid=(.*?),/, 1]}
end
register(person) click to toggle source

register an existing person as a committer updates both committer LDAP groups

# File lib/whimsy/asf/ldap.rb, line 654
def self.register(person)
  if person.instance_of? String
    id = person # save for use in error message
    person = ASF::Person[person] or raise ArgumentError.new("Cannot find person: '#{id}'")
  end

  # add person to 'new' committers list
  ASF::LDAP.modify("cn=committers,#{@base}",
    [ASF::Base.mod_add('member', [person.dn])])

  # add person to 'legacy' committers list
  ASF::Group['committers'].add(person)
end

Public Instance Methods

rename(newid, attrs={}) click to toggle source

rename a person/committer

# File lib/whimsy/asf/ldap.rb, line 597
def rename(newid, attrs={})
  # ensure person exists in LDAP
  raise ArgumentError(self.id) unless self.dn

  # create a new person/committer (this should create new uid/gid numbers, if not overridden)
  new_person = ASF::Committer.create(self.attrs.merge(attrs).merge(uid: newid))

  # determine what groups the individual is a member of
  uid_groups = ASF.search_subtree('dc=apache,dc=org',
    "memberUid=#{self.id}", 'dn').flatten
  dn_groups = ASF.search_subtree('dc=apache,dc=org',
    "member=#{self.dn}", 'dn').flatten

  # add new user to all groups
  uid_groups.each do |dn|
    ASF::LDAP.modify(dn, [ASF::Base.mod_add('memberUid', new_person.id)])
  end
  dn_groups.each do |dn|
    ASF::LDAP.modify(dn, [ASF::Base.mod_add('member', new_person.dn)])
  end

  # remove original user from all groups
  uid_groups.each do |dn|
    ASF::LDAP.modify(dn, [ASF::Base.mod_delete('memberUid', self.id)])
  end
  dn_groups.each do |dn|
    ASF::LDAP.modify(dn, [ASF::Base.mod_delete('member', self.dn)])
  end

  # remove original user
  # TODO: the old entry should probably be disabled instead, to avoid reuse of uid/gid
  ASF::Person.remove(person.id)

  # return new user
  new_person
end