diff --git a/app/controllers/ldap_settings_controller.rb b/app/controllers/ldap_settings_controller.rb old mode 100644 new mode 100755 index cd79f2d..e6d0742 --- a/app/controllers/ldap_settings_controller.rb +++ b/app/controllers/ldap_settings_controller.rb @@ -114,7 +114,7 @@ def js_request? end def update_ldap_setting_from_params - %w(user group).each do |e| + %w(user group person).each do |e| params[:ldap_setting]["#{e}_fields_to_sync"] = params["#{e}_fields_to_sync"] params[:ldap_setting]["#{e}_ldap_attrs"] = params["#{e}_ldap_attrs"] end if params[:ldap_setting] diff --git a/app/helpers/ldap_settings_helper.rb b/app/helpers/ldap_settings_helper.rb old mode 100644 new mode 100755 index 1f836ae..0448d70 --- a/app/helpers/ldap_settings_helper.rb +++ b/app/helpers/ldap_settings_helper.rb @@ -113,6 +113,23 @@ def user_fields end end + def person_fields + return [] unless Redmine::Plugin.installed?(:redmine_people) + + has_person_ldap_attrs = @ldap_setting.has_person_ldap_attrs? + + Person::STANDARD_FIELDS.map do |f| + SyncField.new( + f, + l("label_people_#{f}"), + false, + @ldap_setting.sync_person_fields? && @ldap_setting.person_fields_to_sync.include?(f.to_s), + has_person_ldap_attrs ? @ldap_setting.person_ldap_attrs[f.to_s] : '', + '' + ) + end + end + def options_for_base_settings options = [[l(:option_custom), '']] options += base_settings.collect {|k, h| [h['name'], k] }.sort diff --git a/app/models/ldap_setting.rb b/app/models/ldap_setting.rb old mode 100644 new mode 100755 index 674acc9..022c693 --- a/app/models/ldap_setting.rb +++ b/app/models/ldap_setting.rb @@ -26,11 +26,11 @@ class LdapSetting include ActiveModel::AttributeMethods # LDAP_DESCRIPTORS - LDAP_ATTRIBUTES = %w( groupname member user_memberid user_groups groupid parent_group primary_group group_parentid member_group group_memberid account_flags ) - CLASS_NAMES = %w( class_user class_group ) + LDAP_ATTRIBUTES = %w( groupname member user_memberid user_groups groupid parent_group primary_group group_parentid member_group group_memberid account_flags) + CLASS_NAMES = %w( class_user class_group class_person ) FLAGS = %w( create_groups create_users active ) COMBOS = %w( group_membership nested_groups sync_on_login dyngroups users_search_scope ) - OTHERS = %w( account_disabled_test user_fields_to_sync group_fields_to_sync user_ldap_attrs group_ldap_attrs fixed_group admin_group required_group group_search_filter groupname_pattern groups_base_dn dyngroups_cache_ttl ) + OTHERS = %w( account_disabled_test user_fields_to_sync group_fields_to_sync person_fields_to_sync user_ldap_attrs group_ldap_attrs person_ldap_attrs fixed_group admin_group required_group group_search_filter groupname_pattern groups_base_dn dyngroups_cache_ttl ) validates_presence_of :auth_source_ldap_id validates_presence_of :class_user, :class_group, :groupname @@ -55,6 +55,7 @@ class LdapSetting validate :validate_group_filter validate :validate_user_fields_to_sync, :validate_user_ldap_attrs validate :validate_group_fields_to_sync, :validate_group_ldap_attrs + validate :validate_person_fields_to_sync, :validate_person_ldap_attrs if Redmine::Plugin.installed?(:redmine_people) before_validation :strip_names, :set_ldap_attrs, :set_fields_to_sync @@ -66,7 +67,7 @@ class LdapSetting safe_attributes *(LDAP_ATTRIBUTES + CLASS_NAMES + FLAGS + COMBOS + OTHERS) define_attribute_methods LDAP_ATTRIBUTES + CLASS_NAMES + FLAGS + COMBOS + OTHERS - [:login, *User::STANDARD_FIELDS].each {|f| module_eval("def #{f}; auth_source_ldap.attr_#{f}; end") } + [:login, *User::STANDARD_FIELDS].each {|f| module_eval("def #{f}; auth_source_ldap.attr_#{f}; end")} def id @auth_source_ldap_id @@ -120,6 +121,10 @@ def sync_group_fields? has_group_fields_to_sync? end + def sync_person_fields? + has_person_fields_to_sync? + end + def sync_dyngroups? has_dyngroups? end @@ -157,6 +162,11 @@ def user_ldap_attrs_to_sync(fields = user_fields_to_sync) (fields||[]).map {|f| user_ldap_attrs[f] || (send(f.to_sym) if respond_to?(f.to_sym)) } end + # Returns an array of ldap attributes to used when syncing the person fields + def person_ldap_attrs_to_sync(fields = person_fields_to_sync) + (fields||[]).map {|f| person_ldap_attrs[f] || (send(f.to_sym) if respond_to?(f.to_sym)) } + end + # Returns an array of ldap attributes to used when syncing the group fields def group_ldap_attrs_to_sync (group_fields_to_sync||[]).map {|f| group_ldap_attrs[f] } @@ -177,6 +187,8 @@ def group_field(ldap_attr) # Returns the user field name for the given ldap attribute def user_field(ldap_attr) ldap_attr = ldap_attr.to_s + user_ldap_attrs.reverse_merge!(person_ldap_attrs) if Redmine::Plugin.installed?(:redmine_people) + result = @user_standard_ldap_attrs.find {|(k, v)| v.downcase == ldap_attr }.try(:first) result ||= user_ldap_attrs.find {|(k, v)| v.downcase == ldap_attr }.try(:first) end @@ -226,7 +238,6 @@ def safe_attributes=(attrs, user = User.current) def save return false if invalid? - self.settings = delete_unsafe_attributes(@attributes, User.current) end @@ -308,14 +319,29 @@ def validate_group_fields_to_sync validate_fields group_fields_to_sync, GroupCustomField.all, group_ldap_attrs end + def validate_person_ldap_attrs + validate_ldap_attrs person_ldap_attrs, Person::STANDARD_FIELDS + end + + def validate_person_fields_to_sync + validate_fields person_fields_to_sync, Person::STANDARD_FIELDS, person_ldap_attrs + end + def validate_ldap_attrs(ldap_attrs, fields) - field_ids = fields.map {|f| f.id.to_s } + field_ids = fields.map {|f| f.try(:id) ? f.id.to_s : f.to_s } ldap_attrs.each do |k, v| if !field_ids.include?(k) errors.add :user_group_fields, :invalid unless errors.added? :user_group_fields, :invalid elsif v.present? && v !~ /\A[a-z][a-z0-9-]*\z/i - field_name = fields.find {|f| f.id == k.to_i }.name + field_name = '' + fields.each do |f| + if f.try(:id) + field_name = f.name if f.id.to_i == k.to_i + else + field_name = f if f.to_s == k.to_s + end + end errors.add :base, :invalid_ldap_attribute, :field => field_name end end @@ -339,11 +365,13 @@ def validate_fields(fields_to_sync, fields, attrs) def set_fields_to_sync self.user_fields_to_sync ||= [] self.group_fields_to_sync ||= [] + self.person_fields_to_sync ||= [] end def set_ldap_attrs self.user_ldap_attrs ||= {} self.group_ldap_attrs ||= {} + self.person_ldap_attrs ||= {} end def strip_names diff --git a/app/views/ldap_settings/_synchronization_actions.html.erb b/app/views/ldap_settings/_synchronization_actions.html.erb old mode 100644 new mode 100755 index 2ca022d..285f76d --- a/app/views/ldap_settings/_synchronization_actions.html.erb +++ b/app/views/ldap_settings/_synchronization_actions.html.erb @@ -31,7 +31,7 @@
- <% { :user => user_fields, :group => group_fields }.each do |k, fields| %> + <% { :user => user_fields, :group => group_fields, :person => person_fields }.each do |k, fields| %> <% if fields.any? -%>