ENV['RAILS_ENV'] = 'production' require '../config/environment.rb' require 'net/ldap' require 'test/unit/assertions' require 'set' class AuthSourceLdap < AuthSource # monkey patch because redmine authors didn't think this is needed. def attrs_for_user(ldap_con, login) search_filter = base_filter & Net::LDAP::Filter.eq(self.attr_login, login) ldap_con.search( :base => self.base_dn, :filter => search_filter, :attributes=> search_attributes) do |entry| return get_user_attributes_from_ldap_entry(entry).except(:dn) # nice method name, btw end end end def ldap_get_logins(ldap, search_base, filter) Net::LDAP.new.search(:base => search_base, :filter => filter, :attributes => ["uid"]).collect { |entry| entry.uid.first } end search_base = "ou=People,dc=hackerspace,dc=pl" group_base = "ou=Group,dc=hackerspace,dc=pl" filter = "(|(memberOf=cn=fatty,#{group_base})(memberOf=cn=starving,#{group_base}))" ldap = Net::LDAP.new unregistered = ldap_get_logins(ldap, search_base, filter) - User.pluck(:login) puts "Missing users:" puts unregistered sources = AuthSource.all # sigh unless sources.size == 1 then raise RuntimeError.new "More than one AuthSource, bailing" end auth_source = sources.first unregistered.each { |login| attrs = auth_source.attrs_for_user(ldap, login) user = User.new(attrs) user.login = login user.language = Setting.default_language if user.save user.reload Rails.logger.info("User '#{user.login}' added by sync_users") end }