diff --git a/app/assets/javascripts/app/controllers/_integration/exchange.coffee b/app/assets/javascripts/app/controllers/_integration/exchange.coffee index 13ea97709..e69976c98 100644 --- a/app/assets/javascripts/app/controllers/_integration/exchange.coffee +++ b/app/assets/javascripts/app/controllers/_integration/exchange.coffee @@ -454,9 +454,9 @@ class ConnectionWizard extends App.WizardModal for key in ['source', 'dest'] if !_.isArray(attributes[key]) attributes[key] = [attributes[key]] - attributes_local = - item_id: 'login' - length = attributes.source.length-1 + + attributes_local = {} + length = attributes.source.length-1 for count in [0..length] if attributes.source[count] && attributes.dest[count] attributes_local[attributes.source[count]] = attributes.dest[count] @@ -465,18 +465,8 @@ class ConnectionWizard extends App.WizardModal @tryShow() buildRowsUserMap: (user_attribute_map) => - - # show static login row - userUidDisplayValue = @wizardConfig.wizardData.backend_attributes['item_id'] - el = [ - $(App.view('integration/ldap_user_attribute_row_read_only')( - key: userUidDisplayValue, - value: 'Login' - )) - ] - + el = [] for source, dest of user_attribute_map - continue if source == 'item_id' continue if !(source of @wizardConfig.wizardData.backend_attributes) el.push @buildRowUserAttribute(source, dest) el diff --git a/app/assets/javascripts/app/views/integration/ldap_user_attribute_row_read_only.jst.eco b/app/assets/javascripts/app/views/integration/ldap_user_attribute_row_read_only.jst.eco deleted file mode 100644 index 96c5bb33e..000000000 --- a/app/assets/javascripts/app/views/integration/ldap_user_attribute_row_read_only.jst.eco +++ /dev/null @@ -1,6 +0,0 @@ - - -
<%= @key %>
- - <%= @value %> - diff --git a/db/migrate/20180327170847_issue_1905_exchange_login_from_remote_id.rb b/db/migrate/20180327170847_issue_1905_exchange_login_from_remote_id.rb new file mode 100644 index 000000000..2d78fb5cf --- /dev/null +++ b/db/migrate/20180327170847_issue_1905_exchange_login_from_remote_id.rb @@ -0,0 +1,17 @@ +class Issue1905ExchangeLoginFromRemoteId < ActiveRecord::Migration[5.1] + def change + + # return if it's a new setup + return if !Setting.find_by(name: 'system_init_done') + + config = Import::Exchange.config + return if config.blank? + return if config[:attributes].blank? + return if config[:attributes][:item_id].blank? + return if config[:attributes][:item_id] != 'login' + + config[:attributes].delete(:item_id) + + Import::Exchange.config = config + end +end diff --git a/lib/sequencer/sequence/import/exchange/folder_contact.rb b/lib/sequencer/sequence/import/exchange/folder_contact.rb index d14f53ec6..4342c7a76 100644 --- a/lib/sequencer/sequence/import/exchange/folder_contact.rb +++ b/lib/sequencer/sequence/import/exchange/folder_contact.rb @@ -8,7 +8,8 @@ class Sequencer [ 'Import::Exchange::FolderContact::RemoteId', 'Import::Common::RemoteId::CaseSensitive', - 'Import::Exchange::FolderContact::Mapping', + 'Import::Exchange::FolderContact::Mapping::FromConfig', + 'Import::Exchange::FolderContact::Mapping::Login', 'Import::Common::Model::Skip::Blank::Mapped', 'Common::ModelClass::User', 'Import::Exchange::FolderContact::ExternalSyncSource', diff --git a/lib/sequencer/unit/import/exchange/folder_contact/mapping.rb b/lib/sequencer/unit/import/exchange/folder_contact/mapping.rb deleted file mode 100644 index 076492699..000000000 --- a/lib/sequencer/unit/import/exchange/folder_contact/mapping.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Sequencer - class Unit - module Import - module Exchange - module FolderContact - class Mapping < Sequencer::Unit::Import::Common::Mapping::FlatKeys - - uses :import_job - - private - - def mapping - from_import_job || ::Import::Exchange.config[:attributes] - end - - def from_import_job - return if !state.provided?(:import_job) - payload = import_job.payload - return if payload.blank? - payload[:ews_attributes] - end - end - end - end - end - end -end diff --git a/lib/sequencer/unit/import/exchange/folder_contact/mapping/from_config.rb b/lib/sequencer/unit/import/exchange/folder_contact/mapping/from_config.rb new file mode 100644 index 000000000..7cdc37de9 --- /dev/null +++ b/lib/sequencer/unit/import/exchange/folder_contact/mapping/from_config.rb @@ -0,0 +1,29 @@ +class Sequencer + class Unit + module Import + module Exchange + module FolderContact + module Mapping + class FromConfig < Sequencer::Unit::Import::Common::Mapping::FlatKeys + + uses :import_job + + private + + def mapping + from_import_job || ::Import::Exchange.config[:attributes] + end + + def from_import_job + return if !state.provided?(:import_job) + payload = import_job.payload + return if payload.blank? + payload[:ews_attributes] + end + end + end + end + end + end + end +end diff --git a/lib/sequencer/unit/import/exchange/folder_contact/mapping/login.rb b/lib/sequencer/unit/import/exchange/folder_contact/mapping/login.rb new file mode 100644 index 000000000..47cd531f0 --- /dev/null +++ b/lib/sequencer/unit/import/exchange/folder_contact/mapping/login.rb @@ -0,0 +1,25 @@ +class Sequencer + class Unit + module Import + module Exchange + module FolderContact + module Mapping + class Login < Sequencer::Unit::Import::Common::Mapping::FlatKeys + include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped + + uses :remote_id + + def process + provide_mapped do + { + login: remote_id + } + end + end + end + end + end + end + end + end +end diff --git a/spec/db/migrate/issue_1905_exchange_login_from_remote_id_spec.rb b/spec/db/migrate/issue_1905_exchange_login_from_remote_id_spec.rb new file mode 100644 index 000000000..b687e2bea --- /dev/null +++ b/spec/db/migrate/issue_1905_exchange_login_from_remote_id_spec.rb @@ -0,0 +1,82 @@ +require 'rails_helper' + +RSpec.describe Issue1905ExchangeLoginFromRemoteId, type: :db_migration do + + let(:backend) { ::Import::Exchange } + + it 'removes :item_id from attributes' do + + invalid_config = { + attributes: { + item_id: 'login', + some: 'other', + } + } + + valid_config = ActiveSupport::HashWithIndifferentAccess.new( + attributes: { + some: 'other', + } + ) + + expect(backend).to receive(:config).and_return(invalid_config) + allow(backend).to receive(:config).and_call_original + + migrate + + expect(backend.config).to eq(valid_config) + end + + context 'no changes' do + + it 'performs no action for new systems', system_init_done: false do + expect(backend).not_to receive(:config) + migrate + end + + shared_examples 'irrelevant config' do + it 'does not change the config' do + expect(backend).to receive(:config).and_return(config) + expect(backend).not_to receive(:config=) + migrate + end + end + + context 'blank config' do + let(:config) { nil } + it_behaves_like 'irrelevant config' + end + + context 'blank attributes' do + let(:config) do + { + some: 'config' + } + end + it_behaves_like 'irrelevant config' + end + + context 'blank attribute :item_id' do + let(:config) do + { + attributes: { + some: 'mapping' + } + } + end + it_behaves_like 'irrelevant config' + end + + context 'attribute :item_id not mapping to login' do + + let(:config) do + { + attributes: { + item_id: 'other_local_attribute' + } + } + end + it_behaves_like 'irrelevant config' + end + end +end