You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by ru...@apache.org on 2016/05/21 02:33:48 UTC

[whimsy] branch master updated: add/remove committees&groups + refactor

This is an automated email from the ASF dual-hosted git repository.

rubys pushed a commit to branch master
in repository https://git-dual.apache.org/repos/asf/whimsy.git

The following commit(s) were added to refs/heads/master by this push:
       new  011e004   add/remove committees&groups + refactor
011e004 is described below

commit 011e00421494a95ec6d452dc659ca19eff41f913
Author: Sam Ruby <ru...@intertwingly.net>
AuthorDate: Fri May 20 22:32:32 2016 -0400

    add/remove committees&groups + refactor
---
 lib/whimsy/asf/ldap.rb | 88 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 65 insertions(+), 23 deletions(-)

diff --git a/lib/whimsy/asf/ldap.rb b/lib/whimsy/asf/ldap.rb
index 267dbcc..c9df7ad 100644
--- a/lib/whimsy/asf/ldap.rb
+++ b/lib/whimsy/asf/ldap.rb
@@ -377,6 +377,19 @@ module ASF
         @name
       end
     end
+
+    def self.mod_add(attr, vals)
+      ::LDAP::Mod.new(::LDAP::LDAP_MOD_ADD, attr.to_s, Array(vals))
+    end
+
+    def self.mod_replace(attr, vals)
+      vals = Array(vals) unless Hash === vals
+      ::LDAP::Mod.new(::LDAP::LDAP_MOD_REPLACE, attr.to_s, vals)
+    end
+
+    def self.mod_delete(attr, vals)
+      ::LDAP::Mod.new(::LDAP::LDAP_MOD_DELETE, attr.to_s, Array(vals))
+    end
   end
 
   class LazyHash < Hash
@@ -536,9 +549,7 @@ module ASF
     end
 
     def modify(attr, value)
-      value = Array(value) unless Hash === value
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_REPLACE, attr.to_s, value)
-      ASF.ldap.modify(self.dn, [mod])
+      ASF.ldap.modify(self.dn, [mod_replace(attr.to_s, value)])
       attrs[attr.to_s] = value
     end
   end
@@ -589,25 +600,46 @@ module ASF
       @dn ||= ASF.search_one(base, "cn=#{name}", 'dn').first.first
     end
 
+    # remove people from an existing group
     def remove(people)
       @members = nil
       people = (Array(people) & members).map(&:id)
       return if people.empty?
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_DELETE, 'memberUid', people)
-      ASF.ldap.modify(self.dn, [mod])
+      ASF.ldap.modify(self.dn, [mod_delete('memberUid', people)])
     ensure
       @members = nil
     end
 
+    # add people to an existing group
     def add(people)
       @members = nil
       people = (Array(people) - members).map(&:id)
       return if people.empty?
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_ADD, 'memberUid', people)
-      ASF.ldap.modify(self.dn, [mod])
+      ASF.ldap.modify(self.dn, [mod_add('memberUid', people)])
     ensure
       @members = nil
     end
+
+    # add a new group
+    def self.add(name, people)
+      nextgid = ASF::search_one(ASF::Group.base, 'cn=*', 'gidNumber').
+        flatten.map(&:to_i).max + 1
+
+      entry = [
+        mod_add('objectClass', ['posixGroup', 'top']),
+        mod_add('cn', name),
+        mod_add('userPassword', '{crypt}*'),
+        mod_add('gidNumber', nextgid.to_s),
+        mod_add('memberUid', people.map(&:id))
+      ]
+
+      ASF.ldap.add("cn=#{name},#{base}", entry)
+    end
+
+    # remove a group
+    def self.remove(name)
+      ASF.ldap.delete("cn=#{name},#{base}")
+    end
   end
 
   class Committee < Base
@@ -647,25 +679,39 @@ module ASF
       @dn ||= ASF.search_one(base, "cn=#{name}", 'dn').first.first
     end
 
+    # remove people from a committee
     def remove(people)
       @members = nil
-      people = Array(people & members).map(&:dn)
-      return if people.empty?
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_DELETE, 'member', people)
-      ASF.ldap.modify(self.dn, [mod])
+      people = (Array(people) & members).map(&:dn)
+      ASF.ldap.modify(self.dn, [mod_delete('member', people)])
     ensure
       @members = nil
     end
 
+    # add people to a committee
     def add(people)
       @members = nil
-      people = Array(people - members).map(&:dn)
-      return if people.empty?
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_ADD, 'member', people)
-      ASF.ldap.modify(self.dn, [mod])
+      people = (Array(people) - members).map(&:dn)
+      ASF.ldap.modify(self.dn, [mod_add('member', people)])
     ensure
       @members = nil
     end
+
+    # add a new committee
+    def self.add(name, people)
+      entry = [
+        mod_add('objectClass', ['groupOfNames', 'top']),
+        mod_add('cn', name),
+        mod_add('member', Array(people).map(&:dn))
+      ]
+
+      ASF.ldap.add("cn=#{name},#{base}", entry)
+    end
+
+    # remove a committee
+    def self.remove(name)
+      ASF.ldap.delete("cn=#{name},#{base}")
+    end
   end
 
   class Service < Base
@@ -707,20 +753,16 @@ module ASF
 
     def remove(people)
       @members = nil
-      people = Array(people & members).map(&:dn)
-      return if people.empty?
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_DELETE, 'member', people)
-      ASF.ldap.modify(self.dn, [mod])
+      people = Array(people - members).map(&:dn)
+      ASF.ldap.modify(self.dn, [mod_delete('member', people)])
     ensure
       @members = nil
     end
 
     def add(people)
       @members = nil
-      people = Array(people - members).map(&:dn)
-      return if people.empty?
-      mod = ::LDAP::Mod.new(::LDAP::LDAP_MOD_ADD, 'member', people)
-      ASF.ldap.modify(self.dn, [mod])
+      people = (Array(people) & members).map(&:dn)
+      ASF.ldap.modify(self.dn, [mod_add('member', people)])
     ensure
       @members = nil
     end

-- 
To stop receiving notification emails like this one, please contact
['"commits@whimsical.apache.org" <co...@whimsical.apache.org>'].