[asl-commit] ActiveSambaLdap r48:

null at cozmixng.org null at cozmixng.org
Fri Aug 3 22:33:17 EDT 2007


retro	2007-08-04 11:33:16 +0900 (Sat, 04 Aug 2007)

  New Revision: 48

  Added files:
    trunk/lib/active_samba_ldap/entry.rb
  Modified files:
    trunk/bin/asl-useradd
    trunk/lib/active_samba_ldap/account.rb
    trunk/lib/active_samba_ldap/computer.rb
    trunk/lib/active_samba_ldap/computer_account.rb
    trunk/lib/active_samba_ldap/group.rb
    trunk/lib/active_samba_ldap/samba_account.rb
    trunk/lib/active_samba_ldap/samba_computer.rb
    trunk/lib/active_samba_ldap/samba_group.rb
    trunk/lib/active_samba_ldap/samba_user.rb
    trunk/lib/active_samba_ldap/unix_id_pool.rb
    trunk/lib/active_samba_ldap/user.rb
    trunk/lib/active_samba_ldap/user_account.rb
    trunk/test/asl-test-utils.rb
    trunk/test/test_asl_groupadd.rb

  Log:


  Modified: trunk/lib/active_samba_ldap/user.rb (+3 -0)
===================================================================
--- trunk/lib/active_samba_ldap/user.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/user.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -1,3 +1,4 @@
+require 'active_samba_ldap/entry'
 require 'active_samba_ldap/account'
 require 'active_samba_ldap/user_account'
 
@@ -5,6 +6,8 @@
   class User < Base
     include Reloadable::Subclasses
 
+    include Entry
+
     include Account
     include UserAccount
   end

  Modified: trunk/test/test_asl_groupadd.rb (+1 -1)
===================================================================
--- trunk/test/test_asl_groupadd.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/test/test_asl_groupadd.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -42,7 +42,7 @@
       pool_class = Class.new(ActiveSambaLdap::UnixIdPool)
       pool_class.ldap_mapping
       pool = pool_class.new(pool_class.configuration[:samba_domain])
-      next_gid = @group_class.find_available_gid_number(pool)
+      next_gid = pool.find_available_gid_number(@group_class)
       assert_asl_groupadd_successfully(cn, "#{next_gid}\n",
                                        "--print-gid-number")
     end

  Modified: trunk/test/asl-test-utils.rb (+2 -2)
===================================================================
--- trunk/test/asl-test-utils.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/test/asl-test-utils.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -227,11 +227,11 @@
     end
 
     def next_uid_number
-      pool.uidNumber || @user_class.start_uid
+      pool.uid_number || @user_class.configuration[:start_uid]
     end
 
     def next_gid_number
-      pool.gidNumber || @group_class.start_gid
+      pool.gid_number || @group_class.configuration[:start_gid]
     end
   end
 

  Modified: trunk/lib/active_samba_ldap/unix_id_pool.rb (+24 -0)
===================================================================
--- trunk/lib/active_samba_ldap/unix_id_pool.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/unix_id_pool.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -13,5 +13,29 @@
         super options
       end
     end
+
+    def find_available_uid_number(account_class)
+      find_available_number(account_class, "uidNumber", uid_number) do
+        account_class.configuration[:start_uid]
+      end
+    end
+
+    def find_available_gid_number(group_class)
+      find_available_number(group_class, "gidNumber", gid_number) do
+        group_class.configuration[:start_gid]
+      end
+    end
+
+    private
+    def find_available_number(klass, key, start_value)
+      number = Integer(start_value || yield)
+
+      100.times do |i|
+        return number if klass.search(:filter => "(#{key}=#{number})").empty?
+        number += 1
+      end
+
+      nil
+    end
   end
 end

  Added: trunk/lib/active_samba_ldap/entry.rb (+62 -0)
===================================================================
--- trunk/lib/active_samba_ldap/entry.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/entry.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -0,0 +1,62 @@
+module ActiveSambaLdap
+  module Entry
+    def self.included(base)
+      super
+      base.extend(ClassMethods)
+    end
+
+    module ClassMethods
+      def create(attributes=nil)
+        pool = nil
+        number_key = nil
+        entry = super do |entry|
+          options = attributes || {}
+          options, pool, number_key = prepare_create_options(entry, options)
+          entry.fill_default_values(options)
+          yield entry if block_given?
+        end
+        if entry.errors.empty? and pool
+          pool[number_key] = Integer(entry[number_key]).succ
+          unless pool.save
+            pool.each do |key, value|
+              entry.add("pool: #{key}", value)
+            end
+          end
+        end
+        entry
+      end
+
+      private
+      def prepare_create_options_for_number(key, entry, options)
+        options = {key => entry[key]}.merge(options)
+        number, pool = ensure_number(key, options)
+        [options.merge(key => number), pool, key]
+      end
+
+      def ensure_number(key, options)
+        number = options[key]
+        pool = nil
+        unless number
+          pool = ensure_pool(options)
+          number = pool.send("find_available_#{key}", self)
+        end
+        [number, pool]
+      end
+
+      def ensure_pool(options)
+        pool = options[:pool]
+        unless pool
+          pool_class = options[:pool_class]
+          unless pool_class
+            pool_class = Class.new(UnixIdPool)
+            pool_class.ldap_mapping
+          end
+          samba_domain = options[:samba_domain]
+          samba_domain ||= pool_class.configuration[:samba_domain]
+          pool = options[:pool] = pool_class.find(samba_domain)
+        end
+        pool
+      end
+    end
+  end
+end

  Modified: trunk/lib/active_samba_ldap/computer_account.rb (+8 -0)
===================================================================
--- trunk/lib/active_samba_ldap/computer_account.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/computer_account.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -19,5 +19,13 @@
     def remove_from_group(group)
       group.computers.delete(self)
     end
+
+    def default_gid_number
+      self.class.configuration[:default_computer_gid]
+    end
+
+    def created_group_name
+      super.sub(/\$$/, '')
+    end
   end
 end

  Modified: trunk/lib/active_samba_ldap/account.rb (+54 -23)
===================================================================
--- trunk/lib/active_samba_ldap/account.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/account.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -30,23 +30,6 @@
         find(:first, :filter => "(#{attribute}=#{value})")
       end
 
-      def start_uid
-        Integer(configuration[:start_uid])
-      end
-
-      def find_available_uid_number(pool)
-        uid_number = (pool.uid_number || start_uid).to_s
-
-        100.times do |i|
-          if find(:first, :attribute => "uidNumber", :value => uid_number).nil?
-            return uid_number
-          end
-          uid_number = uid_number.succ
-        end
-
-        nil
-      end
-
       private
       def default_options
         {
@@ -84,21 +67,48 @@
           :many => options[:groups_many],
         }
       end
+
+      def prepare_create_options(account, options)
+        prepare_create_options_for_number(:uid_number, account, options)
+      end
     end
 
     def fill_default_values(options={})
-      self.cn = uid
-      self.sn = uid
-      self.gecos = substituted_value(:user_gecos) {uid}
-      self.home_directory = substituted_value(:user_home)
-      self.login_shell = substituted_value(:user_login_shell)
+      self.cn ||= uid
+      self.sn ||= uid
+      self.given_name ||= uid
+      self.display_name ||= cn
+      self.gecos ||= substituted_value(:user_gecos) {cn}
+      self.home_directory ||= substituted_value(:user_home)
+      self.login_shell ||= self.class.configuration[:user_login_shell]
 
-      self.user_password = "{crypt}x"
+      self.user_password ||= "{crypt}x"
 
       uid_number = options[:uid_number]
       self.change_uid_number(uid_number) if uid_number
 
       group = options[:group]
+      unless group
+        gid_number = options[:gid_number]
+        group_class = options[:group_class]
+        unless gid_number
+          if options[:create_group]
+            group_name = created_group_name
+            if group_class.exists?(group_name)
+              group = group_class.find(group_name)
+            else
+              group = group_class.create(:cn => group_name,
+                                         :pool => options[:pool],
+                                         :pool_class => options[:pool_class])
+            end
+          else
+            gid_number = default_gid_number
+          end
+        end
+        if gid_number
+          group = group_class.find_by_gid_number(gid_number)
+        end
+      end
       self.primary_group = group if group
 
       self
@@ -135,6 +145,23 @@
       self.user_password = hashed_password
     end
 
+    def setup_home_directory(options={})
+      dest = home_directory
+      return unless dest
+
+      FileUtils.mkdir_p(dest)
+      mode = options[:mode]
+      mode ||= self.class.configuration[:user_home_directory_mode]
+      FileUtils.chmod(Integer(mode), dest)
+      skel = options[:skeleton_directory]
+      skel ||= self.class.configuration[:skeleton_directory]
+      FileUtils.cp_r(Dir.glob(File.join(skel, ".*")) +
+                     Dir.glob(File.join(skel, "*")) -
+                     [File.join(skel, "."), File.join(skel, "..")],
+                     dest)
+      FileUtils.chown_R(uid_number, gid_number, dest)
+    end
+
     private
     def check_unique_uid_number(uid_number)
       ActiveSambaLdap::Base.restart_nscd do
@@ -161,5 +188,9 @@
         substitute_template(config[key.to_sym])
       end
     end
+
+    def created_group_name
+      uid
+    end
   end
 end

  Modified: trunk/bin/asl-useradd (+60 -185)
===================================================================
--- trunk/bin/asl-useradd	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/bin/asl-useradd	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -146,27 +146,25 @@
   exit 1
 end
 
-def get_value(options, key, default_key=nil)
-  value = options.__send__(key)
-  value ||= ActiveSambaLdap::Base.configuration[(default_key || key).to_sym]
-  value
-end
-
-def substitute_member(value, member)
-  value.gsub(/%U/, member.uid)
-end
-
 ActiveSambaLdap::Base.establish_connection("update")
 
 
+class User < ActiveSambaLdap::SambaUser
+  ldap_mapping
+end
+
 class Computer < ActiveSambaLdap::SambaComputer
   ldap_mapping
 end
 
-class User < ActiveSambaLdap::SambaUser
+class Group < ActiveSambaLdap::SambaGroup
   ldap_mapping
 end
 
+class UnixIdPool < ActiveSambaLdap::UnixIdPool
+  ldap_mapping
+end
+
 member_class = options.computer_account ? Computer : User
 
 member_type = member_class.name.downcase
@@ -187,6 +185,11 @@
   exit 1
 end
 
+if member_class.exists?(name)
+  $stderr.puts "#{member_type} '#{name}' already exists."
+  exit 1
+end
+
 if options.ou
   prefixes = [member_prefix]
   options.ou.split(/\s*,\s*/).reverse_each do |entry|
@@ -200,66 +203,48 @@
   end
 end
 
-if member_class.exists?(name)
-  $stderr.puts "#{member_type} '#{name}' already exists."
-  exit 1
-end
-member = member_class.new(name)
+create_options = {
+  :uid => name,
+  :uid_number => options.uid,
+  :gid_number => options.gid,
+  :create_group => options.create_group,
+  :group_class => Group,
+  :home_directory => options.home_directory,
+  :login_shell => options.shell,
+  :given_name => options.given_name,
+  :cn => options.canonical_name,
+  :sn => options.surname,
+  :gecos => options.comment,
+  :samba_acct_flags => options.samba_account_flags,
+}
 
-class UnixIdPool < ActiveSambaLdap::UnixIdPool
-  ldap_mapping
+if !create_options[:cn] and options.given_name and options.surname
+  create_options[:cn] = "#{options.given_name} #{options.surname}"
 end
-def make_pool
-  UnixIdPool.find(UnixIdPool.configuration[:samba_domain])
-end
-pool = nil
 
-if options.uid
-  uid_number = options.uid
+if options.computer_account
+  create_options[:description] = "Computer"
+  create_options[:gecos] ||= "Computer"
 else
-  pool = make_pool
-  uid_number = member_class.find_available_uid_number(pool)
+  create_options.merge!(:can_change_password => options.can_change_password,
+                        :must_change_password => options.must_change_password,
+                        :user_script => options.samba_logon_script,
+                        :user_samba_home => options.samba_home_path,
+                        :user_home_drive => options.samba_home_drive,
+                        :user_profile => options.samba_profile_path)
+  if options.expire_date
+    create_options[:samba_kickoff_time] = options.expire_date.to_i.to_s
+  end
 end
-member.change_uid_number(uid_number)
 
-uid_number = Integer(member.uidNumber)
-unless member_class.find(:first,
-                         :attribute => "uidNumber",
-                         :value => uid_number.to_s).nil?
-  $stderr.puts "UID '#{uid_number}' already exists"
-  exit 1
-end
 
-class Group < ActiveSambaLdap::SambaGroup
-  ldap_mapping
-end
 
-group = nil
-if options.gid
-  gid_number = options.gid
-else
-  if options.create_group
-    pool ||= make_pool
-    gid_number = Group.find_available_gid_number(pool)
-    name = member.uid.sub(/\$\z/, '')
-    unless Group.exists?(name)
-      group = Group.new(name)
-      group.change_gid_number(gid_number)
-      group.change_type("domain")
-      group.display_name = group.cn
-      group.save!
-    end
-  else
-    if options.computer_account
-      gid_number = member_class.configuration[:default_computer_gid]
-    else
-      gid_number = member_class.configuration[:default_user_gid]
-    end
-  end
-end
-
+member = nil
 begin
-  member.primary_group = Group.find_by_gid_number(gid_number)
+  member = member_class.create(create_options)
+rescue ActiveSambaLdap::UidNumberAlreadyExists
+  $stderr.puts "UID '#{uid_number}' already exists"
+  exit 1
 rescue ActiveSambaLdap::GidNumberDoesNotExist,
   ActiveSambaLdap::GroupDoesNotExist,
   ActiveSambaLdap::GroupDoesNotHaveSambaSID
@@ -267,133 +252,23 @@
   exit 1
 end
 
-home_directory = options.home_directory
-if home_directory.nil?
-  if options.computer_account
-    home_directory = "/nonexistent"
-  else
-    home_directory = member_class.configuration[:user_home]
+unless member.errors.empty?
+  member.errors.each_full do |message|
+    $stderr.puts(message)
   end
+  exit 1
 end
-home_directory = substitute_member(home_directory, member)
-home_directory = home_directory.gsub(/\/{2,}/, "/")
-member.home_directory = home_directory
 
-
-login_shell = options.shell
-if options.computer_account
-  login_shell ||= "/bin/false"
-else
-  login_shell ||= member_class.configuration[:user_login_shell]
-end
-member.login_shell = login_shell
-
-if options.computer_account
-  member.description = "Computer"
-end
-
-member.given_name = options.given_name || member.uid
-member.sn = options.surname || member.uid
-if options.canonical_name
-  member.cn = options.canonical_name
-elsif options.given_name and options.surname
-  member.cn = "#{options.given_name} #{options.surname}"
-else
-  member.cn = member.uid
-end
-
-gecos = options.comment
-if options.computer_account
-  gecos ||= "Computer"
-else
-  gecos ||= member_class.configuration[:user_gecos]
-end
-
-if gecos
-  member.gecos = substitute_member(gecos, member)
-else
-  member.gecos = member.cn
-end
-
-member.display_name = member.cn
-
-flags = options.samba_account_flags
-if flags.nil?
-  if options.computer_account
-    flags = "[W]"
-  else
-    flags = "[U]"
-  end
-end
-member.samba_acct_flags = flags
-
-unless options.computer_account
-  member.user_password = "{crypt}x"
-
-  if options.can_change_password
-    member.enable_password_change
-  else
-    member.disable_password_change
-  end
-
-  if options.must_change_password
-    member.enable_forcing_password_change
-  else
-    member.disable_forcing_password_change
-  end
-
-  member.samba_logon_time = '0'
-  member.samba_logoff_time = member_class::FAR_FUTURE_TIME
-  if options.expire_date
-    member.samba_kickoff_time = options.expire_date.to_i.to_s
-  else
-    member.samba_kickoff_time = member_class::FAR_FUTURE_TIME
-  end
-
-  logon_script = get_value(options, :samba_logon_script, :user_script)
-  member.samba_logon_script = substitute_member(logon_script, member)
-
-  home_path = get_value(options, :samba_home_path, :user_samba_home)
-  member.samba_home_path = substitute_member(home_path, member)
-
-  home_drive = get_value(options, :samba_home_drive, :user_home_drive)
-  home_drive = substitute_member(home_drive, member)
-  member.samba_home_drive = home_drive.sub(/([^:])$/, "\\1:")
-
-  profile_path = get_value(options, :samba_profile_path, :user_profile)
-  member.samba_profile_path = substitute_member(profile_path, member)
-
-  member.samba_lm_password = "XXX"
-  member.samba_nt_password = "XXX"
-  member.samba_pwd_last_set = Time.now.to_i.to_s
-end
-
-member.save!
-
-if pool
-  pool.uid_number = Integer(member.uid_number).succ unless options.uid
-  pool.gid_number = Integer(group.gid_number).succ if group
-  pool.save!
-end
-
 if options.setup_home_directory
-  dest = member.home_directory
-  if dest
-    begin
-      FileUtils.mkdir_p(dest)
-      mode = options.home_directory_mode
-      mode ||= member_class.configuration[:user_home_directory_mode]
-      FileUtils.chmod(Integer(mode), dest)
-      skel = get_value(options, :skeleton_directory)
-      FileUtils.cp_r(Dir.glob(File.join(skel, ".*")) +
-                     Dir.glob(File.join(skel, "*")) -
-                     [File.join(skel, "."), File.join(skel, "..")],
-                     dest)
-      FileUtils.chown_R(member.uid_number, member.gid_number, dest)
-    rescue SystemCallError
-      $stderr.puts $!
-      exit 1
-    end
+  begin
+    setup_options = {
+      :mode => options.home_directory_mode,
+      :skeleton_directory => options.skeleton_directory,
+    }
+    member.setup_home_directory(setup_options)
+  rescue SystemCallError
+    $stderr.puts $!
+    exit 1
   end
 end
 

  Modified: trunk/lib/active_samba_ldap/computer.rb (+2 -0)
===================================================================
--- trunk/lib/active_samba_ldap/computer.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/computer.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -5,6 +5,8 @@
   class Computer < Base
     include Reloadable::Subclasses
 
+    include Entry
+
     include Account
     include ComputerAccount
   end

  Modified: trunk/lib/active_samba_ldap/user_account.rb (+4 -0)
===================================================================
--- trunk/lib/active_samba_ldap/user_account.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/user_account.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -15,5 +15,9 @@
     def remove_from_group(group)
       group.users.delete(self)
     end
+
+    def default_gid_number
+      self.class.configuration[:default_user_gid]
+    end
   end
 end

  Modified: trunk/lib/active_samba_ldap/group.rb (+5 -48)
===================================================================
--- trunk/lib/active_samba_ldap/group.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/group.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -1,9 +1,12 @@
 require 'English'
 
+require 'active_samba_ldap/entry'
+
 module ActiveSambaLdap
   class Group < Base
     include Reloadable::Subclasses
 
+    include Entry
 
     class << self
       def ldap_mapping(options={})
@@ -12,26 +15,6 @@
         init_associations(options)
       end
 
-      def create(attributes=nil)
-        pool = nil
-        group = super do |group|
-          options = attributes || {}
-          options = {:gid_number => group.gid_number}.merge(options)
-          gid_number, pool = ensure_gid_number(options)
-          group.fill_default_values(options.merge(:gid_number => gid_number))
-          yield group if block_given?
-        end
-        if group.errors.empty? and pool
-          pool.gid_number = Integer(group.gid_number).succ
-          unless pool.save
-            pool.each do |key, value|
-              group.add("pool: #{key}", value)
-            end
-          end
-        end
-        group
-      end
-
       def find_by_name_or_gid_number(key)
         group = nil
         begin
@@ -51,23 +34,6 @@
         find(:first, :filter => "(#{attribute}=#{value})")
       end
 
-      def start_gid
-        Integer(configuration[:start_gid])
-      end
-
-      def find_available_gid_number(pool)
-        gid_number = pool.gid_number || start_gid
-
-        100.times do |i|
-          if find(:first, :filter => "(gidNumber=#{gid_number})").nil?
-            return gid_number
-          end
-          gid_number = gid_number.succ
-        end
-
-        nil
-      end
-
       private
       def default_options
         {
@@ -125,17 +91,8 @@
                  primary_members_opts.merge(primary_computer_members_opts)
       end
 
-      def ensure_gid_number(options)
-        gid_number = options[:gid_number]
-        pool = nil
-        unless gid_number
-          pool_class = options[:pool_class] || Class.new(UnixIdPool)
-          samba_domain = options[:samba_domain]
-          samba_domain ||= pool_class.configuration[:samba_domain]
-          pool = pool_class.find(samba_domain)
-          gid_number = find_available_gid_number(pool)
-        end
-        [gid_number, pool]
+      def prepare_create_options(group, options)
+        prepare_create_options_for_number(:gid_number, group, options)
       end
     end
 

  Modified: trunk/lib/active_samba_ldap/samba_group.rb (+1 -1)
===================================================================
--- trunk/lib/active_samba_ldap/samba_group.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/samba_group.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -82,7 +82,7 @@
     end
 
     def fill_default_values(options={})
-      change_type(options[:group_type] || "domain")
+      change_type(options[:group_type] || "domain") unless samba_group_type
       super
     end
 

  Modified: trunk/lib/active_samba_ldap/samba_computer.rb (+4 -0)
===================================================================
--- trunk/lib/active_samba_ldap/samba_computer.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/samba_computer.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -4,6 +4,10 @@
 
 module ActiveSambaLdap
   class SambaComputer < Base
+    include Reloadable::Subclasses
+
+    include Entry
+
     include Account
     include ComputerAccount
     include SambaAccount

  Modified: trunk/lib/active_samba_ldap/samba_user.rb (+23 -0)
===================================================================
--- trunk/lib/active_samba_ldap/samba_user.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/samba_user.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -1,3 +1,4 @@
+require 'active_samba_ldap/entry'
 require 'active_samba_ldap/account'
 require 'active_samba_ldap/user_account'
 require 'active_samba_ldap/samba_account'
@@ -4,10 +5,32 @@
 
 module ActiveSambaLdap
   class SambaUser < Base
+    include Reloadable::Subclasses
+
+    include Entry
+
     include Account
     include UserAccount
     include SambaAccount
 
+    def fill_default_values(options={})
+      super
+
+      subst = Proc.new do |key|
+        value = options[key]
+        if value
+          substitute_template(value)
+        else
+          substituted_value(key)
+        end
+      end
+
+      self.samba_home_path ||= subst[:user_samba_home]
+      self.samba_home_drive ||= subst[:user_home_drive].sub(/([^:])$/, "\\1:")
+      self.samba_profile_path ||= subst[:user_profile]
+      self.samba_logon_script ||= subst[:user_script]
+    end
+
     private
     def default_account_flags
       "[UH]"

  Modified: trunk/lib/active_samba_ldap/samba_account.rb (+30 -15)
===================================================================
--- trunk/lib/active_samba_ldap/samba_account.rb	2006-11-16 11:12:02 +09:00 (rev 47)
+++ trunk/lib/active_samba_ldap/samba_account.rb	2007-08-04 11:33:16 +09:00 (rev 48)
@@ -76,24 +76,39 @@
     end
 
     def fill_default_values(options={})
-      self.samba_home_path = substituted_value(:user_samba_home)
-      self.samba_home_drive = substituted_value(:user_home_drive)
-      self.samba_profile_path = substituted_value(:user_profile)
-      self.samba_logon_script = substituted_value(:user_script)
-      self.samba_logon_time = "0"
-      self.samba_logoff_time = FAR_FUTURE_TIME
-      self.samba_kickoff_time = FAR_FUTURE_TIME
-      self.samba_acct_flags = default_account_flags
+      super
 
-      self.samba_lm_password = "XXX"
-      self.samba_nt_password = "XXX"
-      self.samba_pwd_last_set = "0"
-      self.enable_password_change
-      self.disable_forcing_password_change
+      self.samba_logon_time ||= "0"
+      self.samba_logoff_time ||= FAR_FUTURE_TIME
+      self.samba_kickoff_time ||= nil
 
-      self.disable
+      self.samba_lm_password ||= "XXX"
+      self.samba_nt_password ||= "XXX"
+      self.samba_pwd_last_set ||= "0"
 
-      super
+      account_flags_is_not_set = samba_acct_flags.nil?
+      self.samba_acct_flags ||= default_account_flags
+
+      can_change_password = options[:can_change_password]
+      if can_change_password
+        self.enable_password_change
+      elsif account_flags_is_not_set or can_change_password == false
+        self.disable_password_change
+      end
+
+      must_change_password = options[:must_change_password]
+      if must_change_password
+        self.enable_forcing_password_change
+      elsif account_flags_is_not_set or must_change_password == false
+        self.disable_forcing_password_change
+      end
+
+      enable_account = options[:enable]
+      if enable_account
+        self.enable
+      elsif account_flags_is_not_set or enable_account == false
+        self.disable
+      end
     end
 
     def change_uid_number(uid, allow_non_unique=false)



More information about the asl-commit mailing list