Added LDAP sync Sequencer Sequences and Units.
This commit is contained in:
parent
4a8650b132
commit
598d7b2060
24 changed files with 717 additions and 0 deletions
42
lib/sequencer/sequence/import/ldap/user.rb
Normal file
42
lib/sequencer/sequence/import/ldap/user.rb
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
class Sequencer
|
||||||
|
class Sequence
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
class User < Sequencer::Sequence::Base
|
||||||
|
|
||||||
|
def self.expecting
|
||||||
|
[:instance]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.sequence
|
||||||
|
[
|
||||||
|
'Import::Ldap::User::NormalizeEntry',
|
||||||
|
'Import::Ldap::User::RemoteId',
|
||||||
|
'Import::Ldap::User::Mapping',
|
||||||
|
'Import::Ldap::User::Skip::MissingMandatory',
|
||||||
|
'Import::Ldap::User::Skip::Blank',
|
||||||
|
'Import::Common::Model::Lookup::ExternalSync',
|
||||||
|
'Import::Common::User::Attributes::Downcase',
|
||||||
|
'Import::Common::User::Email::CheckValidity',
|
||||||
|
'Import::Ldap::User::Lookup::Attributes',
|
||||||
|
'Import::Ldap::User::Attributes::RoleIds::Dn',
|
||||||
|
'Import::Ldap::User::Attributes::RoleIds::Unassigned',
|
||||||
|
'Import::Common::Model::Associations::Extract',
|
||||||
|
'Import::Ldap::User::Attributes::Static',
|
||||||
|
'Import::Common::Model::Attributes::AddByIds',
|
||||||
|
'Import::Common::Model::Update',
|
||||||
|
'Import::Common::Model::Create',
|
||||||
|
'Import::Common::Model::Associations::Assign',
|
||||||
|
'Import::Ldap::User::Model::Save',
|
||||||
|
'Import::Common::Model::ExternalSync::Integrity',
|
||||||
|
'Import::Ldap::User::HttpLog',
|
||||||
|
'Import::Ldap::User::Statistics::Diff',
|
||||||
|
'Import::Common::ImportJob::Statistics::Update',
|
||||||
|
'Import::Common::ImportJob::Statistics::Store',
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
27
lib/sequencer/sequence/import/ldap/users.rb
Normal file
27
lib/sequencer/sequence/import/ldap/users.rb
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
class Sequencer
|
||||||
|
class Sequence
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
class Users < Sequencer::Sequence::Base
|
||||||
|
|
||||||
|
def self.sequence
|
||||||
|
[
|
||||||
|
'Import::Ldap::Users::StaticAttributes',
|
||||||
|
'Import::Ldap::Users::DryRun::Flag',
|
||||||
|
'Import::Ldap::Users::DryRun::Payload',
|
||||||
|
'Ldap::Connection',
|
||||||
|
'Import::Ldap::Users::UserRoles',
|
||||||
|
'Import::Ldap::Users::Sum',
|
||||||
|
'Import::Common::ImportJob::Statistics::Update',
|
||||||
|
'Import::Common::ImportJob::Statistics::Store',
|
||||||
|
'Import::Ldap::Users::SubSequence',
|
||||||
|
'Import::Ldap::Users::Lost::Ids',
|
||||||
|
'Import::Ldap::Users::Lost::StatisticsDiff',
|
||||||
|
'Import::Ldap::Users::Lost::Deactivate',
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,46 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Attributes
|
||||||
|
module RoleIds
|
||||||
|
class Dn < Sequencer::Unit::Base
|
||||||
|
include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
|
||||||
|
prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::InstanceAction
|
||||||
|
|
||||||
|
skip_any_instance_action
|
||||||
|
|
||||||
|
uses :resource, :remote_id, :dn_roles
|
||||||
|
|
||||||
|
def process
|
||||||
|
dn = resource[:dn]
|
||||||
|
raise "Missing 'dn' attribute for remote id '#{remote_id}'" if dn.blank?
|
||||||
|
|
||||||
|
# use signup/Zammad default roles
|
||||||
|
# if no mapping was provided
|
||||||
|
return if dn_roles.blank?
|
||||||
|
|
||||||
|
# check if roles are mapped for the found dn
|
||||||
|
role_ids = dn_roles[ dn.downcase ]
|
||||||
|
|
||||||
|
# use signup/Zammad default roles
|
||||||
|
# if no mapping entry was found
|
||||||
|
return if role_ids.blank?
|
||||||
|
|
||||||
|
# LDAP is the leading source if
|
||||||
|
# a mapping entry is present
|
||||||
|
provide_mapped do
|
||||||
|
{
|
||||||
|
role_ids: role_ids
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,47 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Attributes
|
||||||
|
module RoleIds
|
||||||
|
class Unassigned < Sequencer::Unit::Base
|
||||||
|
prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::InstanceAction
|
||||||
|
|
||||||
|
skip_any_instance_action
|
||||||
|
|
||||||
|
uses :resource, :dn_roles, :ldap_config, :mapped
|
||||||
|
provides :instance_action
|
||||||
|
|
||||||
|
def process
|
||||||
|
# use signup/Zammad default roles
|
||||||
|
# if no mapping was provided
|
||||||
|
return if dn_roles.blank?
|
||||||
|
|
||||||
|
# return if a mapping entry was found
|
||||||
|
return if mapped[:role_ids].present?
|
||||||
|
|
||||||
|
# use signup/Zammad default roles
|
||||||
|
# if unassigned users should not get skipped
|
||||||
|
return if ldap_config[:unassigned_users] != 'skip_sync'
|
||||||
|
|
||||||
|
instance = state.optional(:instance)
|
||||||
|
|
||||||
|
if instance.present?
|
||||||
|
# deactivate instance if role assignment is lost
|
||||||
|
instance.update!(active: false)
|
||||||
|
state.provide(:instance_action, :deactivated)
|
||||||
|
else
|
||||||
|
# skip instance creation if no existing
|
||||||
|
# instance was found yet
|
||||||
|
state.provide(:instance_action, :skipped)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
29
lib/sequencer/unit/import/ldap/user/attributes/static.rb
Normal file
29
lib/sequencer/unit/import/ldap/user/attributes/static.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Attributes
|
||||||
|
class Static < Sequencer::Unit::Base
|
||||||
|
include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
|
||||||
|
prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::InstanceAction
|
||||||
|
|
||||||
|
skip_any_instance_action
|
||||||
|
|
||||||
|
def process
|
||||||
|
provide_mapped do
|
||||||
|
{
|
||||||
|
# we have to add the active state manually
|
||||||
|
# because otherwise disabled instances won't get
|
||||||
|
# re-activated if they should get synced again
|
||||||
|
active: true,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
17
lib/sequencer/unit/import/ldap/user/http_log.rb
Normal file
17
lib/sequencer/unit/import/ldap/user/http_log.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
class HttpLog < Import::Common::Model::HttpLog
|
||||||
|
private
|
||||||
|
|
||||||
|
def facility
|
||||||
|
'ldap'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
19
lib/sequencer/unit/import/ldap/user/lookup/attributes.rb
Normal file
19
lib/sequencer/unit/import/ldap/user/lookup/attributes.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Lookup
|
||||||
|
class Attributes < Sequencer::Unit::Import::Common::Model::Lookup::Attributes
|
||||||
|
private
|
||||||
|
|
||||||
|
def attributes
|
||||||
|
%i[login email]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
25
lib/sequencer/unit/import/ldap/user/mapping.rb
Normal file
25
lib/sequencer/unit/import/ldap/user/mapping.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
class Mapping < Sequencer::Unit::Import::Common::Mapping::FlatKeys
|
||||||
|
uses :ldap_config
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def mapping
|
||||||
|
ldap_config[:user_attributes].dup.tap do |config|
|
||||||
|
# fallback to uid as login
|
||||||
|
# if no login is given via mapping
|
||||||
|
if !config.values.include?('login')
|
||||||
|
config[ ldap_config[:user_uid] ] = 'login'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
20
lib/sequencer/unit/import/ldap/user/model/save.rb
Normal file
20
lib/sequencer/unit/import/ldap/user/model/save.rb
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
require 'sequencer/unit/import/common/model/mixin/without_callback'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Model
|
||||||
|
class Save < Import::Common::Model::Save
|
||||||
|
prepend ::Sequencer::Unit::Import::Common::Model::Mixin::WithoutCallback
|
||||||
|
|
||||||
|
without_callback :create, :after, :avatar_for_email_check
|
||||||
|
without_callback :update, :after, :avatar_for_email_check
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
24
lib/sequencer/unit/import/ldap/user/normalize_entry.rb
Normal file
24
lib/sequencer/unit/import/ldap/user/normalize_entry.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
class NormalizeEntry < Sequencer::Unit::Base
|
||||||
|
uses :resource
|
||||||
|
provides :resource
|
||||||
|
|
||||||
|
def process
|
||||||
|
|
||||||
|
state.provide(:resource) do
|
||||||
|
empty = ActiveSupport::HashWithIndifferentAccess.new
|
||||||
|
resource.each_with_object(empty) do |(key, values), normalized|
|
||||||
|
normalized[key] = values.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
19
lib/sequencer/unit/import/ldap/user/remote_id.rb
Normal file
19
lib/sequencer/unit/import/ldap/user/remote_id.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
class RemoteId < Sequencer::Unit::Import::Common::Model::Attributes::RemoteId
|
||||||
|
uses :ldap_config
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def attribute
|
||||||
|
ldap_config[:user_uid].to_sym
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
19
lib/sequencer/unit/import/ldap/user/skip/blank.rb
Normal file
19
lib/sequencer/unit/import/ldap/user/skip/blank.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Skip
|
||||||
|
class Blank < Sequencer::Unit::Import::Common::Model::Skip::Blank::Mapped
|
||||||
|
private
|
||||||
|
|
||||||
|
def ignore
|
||||||
|
%i[login]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,19 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Skip
|
||||||
|
class MissingMandatory < Sequencer::Unit::Import::Common::Model::Skip::MissingMandatory::Mapped
|
||||||
|
private
|
||||||
|
|
||||||
|
def mandatory
|
||||||
|
[:login]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
46
lib/sequencer/unit/import/ldap/user/statistics/diff.rb
Normal file
46
lib/sequencer/unit/import/ldap/user/statistics/diff.rb
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
require 'sequencer/unit/import/common/model/statistics/mixin/instance_action_diff'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module User
|
||||||
|
module Statistics
|
||||||
|
class Diff < Sequencer::Unit::Base
|
||||||
|
include ::Sequencer::Unit::Import::Common::Model::Statistics::Mixin::InstanceActionDiff
|
||||||
|
|
||||||
|
uses :instance, :associations, :signup_role_ids
|
||||||
|
|
||||||
|
def process
|
||||||
|
state.provide(:statistics_diff) do
|
||||||
|
# remove :sum since it's already set via
|
||||||
|
# the outer count Unit
|
||||||
|
statistics = diff.except(:sum)
|
||||||
|
|
||||||
|
add_role_ids(statistics)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def add_role_ids(statistics)
|
||||||
|
return statistics if instance.blank?
|
||||||
|
|
||||||
|
# add the parent role_ids hash
|
||||||
|
# so we can fill it
|
||||||
|
statistics[:role_ids] = {}
|
||||||
|
|
||||||
|
associations[:role_ids] ||= signup_role_ids
|
||||||
|
|
||||||
|
# add the diff for each role_id the user is assigned to
|
||||||
|
associations[:role_ids].each_with_object(statistics) do |role_id, result|
|
||||||
|
result[:role_ids][role_id] = diff
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
20
lib/sequencer/unit/import/ldap/users/dry_run/flag.rb
Normal file
20
lib/sequencer/unit/import/ldap/users/dry_run/flag.rb
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
class DryRun
|
||||||
|
class Flag < Sequencer::Unit::Base
|
||||||
|
uses :import_job
|
||||||
|
provides :dry_run
|
||||||
|
|
||||||
|
def process
|
||||||
|
state.provide(:dry_run, import_job.dry_run)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
15
lib/sequencer/unit/import/ldap/users/dry_run/payload.rb
Normal file
15
lib/sequencer/unit/import/ldap/users/dry_run/payload.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
class DryRun
|
||||||
|
class Payload < Sequencer::Unit::Import::Common::ImportJob::Payload::ToAttribute
|
||||||
|
provides :ldap_config
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
31
lib/sequencer/unit/import/ldap/users/lost/deactivate.rb
Normal file
31
lib/sequencer/unit/import/ldap/users/lost/deactivate.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
module Lost
|
||||||
|
class Deactivate < Sequencer::Unit::Base
|
||||||
|
uses :dry_run, :lost_ids
|
||||||
|
|
||||||
|
def process
|
||||||
|
return if dry_run
|
||||||
|
|
||||||
|
# we need to update in slices since some DBs
|
||||||
|
# have a limit for IN length
|
||||||
|
lost_ids.each_slice(5000) do |slice|
|
||||||
|
|
||||||
|
# we need to instanciate every entry and set
|
||||||
|
# the active state this way to send notifications
|
||||||
|
# to the client
|
||||||
|
::User.where(id: slice).each do |user|
|
||||||
|
user.update!(active: false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
32
lib/sequencer/unit/import/ldap/users/lost/ids.rb
Normal file
32
lib/sequencer/unit/import/ldap/users/lost/ids.rb
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
module Lost
|
||||||
|
class Ids < Sequencer::Unit::Base
|
||||||
|
uses :found_ids, :external_sync_source, :model_class
|
||||||
|
provides :lost_ids
|
||||||
|
|
||||||
|
def process
|
||||||
|
state.provide(:lost_ids, active_ids - found_ids)
|
||||||
|
end
|
||||||
|
|
||||||
|
def active_ids
|
||||||
|
ExternalSync.joins('INNER JOIN users ON (users.id = external_syncs.o_id)')
|
||||||
|
.where(
|
||||||
|
source: external_sync_source,
|
||||||
|
object: model_class.name,
|
||||||
|
users: {
|
||||||
|
active: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.pluck(:o_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
44
lib/sequencer/unit/import/ldap/users/lost/statistics_diff.rb
Normal file
44
lib/sequencer/unit/import/ldap/users/lost/statistics_diff.rb
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
require 'sequencer/unit/import/common/model/statistics/mixin/empty_diff'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
module Lost
|
||||||
|
class StatisticsDiff < Sequencer::Unit::Base
|
||||||
|
include ::Sequencer::Unit::Import::Common::Model::Statistics::Mixin::EmptyDiff
|
||||||
|
|
||||||
|
uses :lost_ids
|
||||||
|
|
||||||
|
def process
|
||||||
|
# deactivated count is tracked as a separate number
|
||||||
|
# since they don't have to be in the sum (e.g. deleted in LDAP)
|
||||||
|
state.provide(:statistics_diff) do
|
||||||
|
diff.merge(
|
||||||
|
role_ids: role_ids,
|
||||||
|
deactivated: lost_ids.size
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def role_ids
|
||||||
|
lost_ids.each_with_object({}) do |user_id, result|
|
||||||
|
|
||||||
|
role_ids = ::User.joins(:roles)
|
||||||
|
.where(id: user_id)
|
||||||
|
.pluck(:'roles_users.role_id')
|
||||||
|
|
||||||
|
role_ids.each do |role_id|
|
||||||
|
result[role_id] ||= diff
|
||||||
|
result[role_id][:deactivated] += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
18
lib/sequencer/unit/import/ldap/users/static_attributes.rb
Normal file
18
lib/sequencer/unit/import/ldap/users/static_attributes.rb
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
class StaticAttributes < Sequencer::Unit::Base
|
||||||
|
provides :model_class, :external_sync_source
|
||||||
|
|
||||||
|
def process
|
||||||
|
state.provide(:model_class, ::User)
|
||||||
|
state.provide(:external_sync_source, 'Ldap::User')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
58
lib/sequencer/unit/import/ldap/users/sub_sequence.rb
Normal file
58
lib/sequencer/unit/import/ldap/users/sub_sequence.rb
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
require 'sequencer/unit/import/common/sub_sequence/mixin/import_job'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
class SubSequence < Sequencer::Unit::Base
|
||||||
|
include ::Sequencer::Unit::Import::Common::SubSequence::Mixin::ImportJob
|
||||||
|
|
||||||
|
uses :ldap_config, :ldap_connection, :dn_roles, :model_class, :external_sync_source
|
||||||
|
provides :found_ids
|
||||||
|
|
||||||
|
def process
|
||||||
|
found_ids = []
|
||||||
|
ldap_connection.search(ldap_config[:user_filter], attributes: relevant_attributes) do |entry|
|
||||||
|
|
||||||
|
result = sequence_resource(entry)
|
||||||
|
|
||||||
|
next if result[:instance].blank?
|
||||||
|
found_ids.push(result[:instance].id)
|
||||||
|
end
|
||||||
|
|
||||||
|
state.provide(:found_ids, found_ids)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def default_params
|
||||||
|
super.merge(
|
||||||
|
dn_roles: dn_roles,
|
||||||
|
ldap_config: ldap_config,
|
||||||
|
model_class: model_class,
|
||||||
|
external_sync_source: external_sync_source,
|
||||||
|
signup_role_ids: signup_role_ids
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def signup_role_ids
|
||||||
|
@signup_role_ids ||= Role.signup_role_ids.sort
|
||||||
|
end
|
||||||
|
|
||||||
|
def sequence
|
||||||
|
'Import::Ldap::User'
|
||||||
|
end
|
||||||
|
|
||||||
|
def relevant_attributes
|
||||||
|
# limit the fetched attributes for an entry to only
|
||||||
|
# those which are needed to improve the performance
|
||||||
|
attributes = ldap_config[:user_attributes].keys
|
||||||
|
attributes.push('dn')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
45
lib/sequencer/unit/import/ldap/users/sum.rb
Normal file
45
lib/sequencer/unit/import/ldap/users/sum.rb
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
require 'sequencer/unit/import/common/model/statistics/mixin/empty_diff'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
class Sum < Sequencer::Unit::Base
|
||||||
|
include ::Sequencer::Unit::Import::Common::Model::Statistics::Mixin::EmptyDiff
|
||||||
|
|
||||||
|
uses :ldap_config, :ldap_connection, :dry_run
|
||||||
|
|
||||||
|
def process
|
||||||
|
state.provide(:statistics_diff) do
|
||||||
|
diff.merge(
|
||||||
|
sum: sum
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def sum
|
||||||
|
if !dry_run
|
||||||
|
result = Cache.get(cache_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
result ||= ldap_connection.count(ldap_config[:user_filter])
|
||||||
|
|
||||||
|
if !dry_run
|
||||||
|
Cache.write(cache_key, result, { expires_in: 1.hour })
|
||||||
|
end
|
||||||
|
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def cache_key
|
||||||
|
@cache_key ||= "#{ldap_connection.host}::#{ldap_connection.port}::#{ldap_connection.ssl}::#{ldap_connection.base_dn}::#{ldap_config[:user_filter]}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
31
lib/sequencer/unit/import/ldap/users/user_roles.rb
Normal file
31
lib/sequencer/unit/import/ldap/users/user_roles.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
require 'ldap'
|
||||||
|
require 'ldap/group'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Import
|
||||||
|
module Ldap
|
||||||
|
module Users
|
||||||
|
class UserRoles < Sequencer::Unit::Base
|
||||||
|
uses :ldap_config, :ldap_connection
|
||||||
|
provides :dn_roles
|
||||||
|
|
||||||
|
def process
|
||||||
|
|
||||||
|
state.provide(:dn_roles) do
|
||||||
|
|
||||||
|
group_config = {
|
||||||
|
filter: ldap_config[:group_filter]
|
||||||
|
}
|
||||||
|
|
||||||
|
ldap_group = ::Ldap::Group.new(group_config, ldap: ldap_connection)
|
||||||
|
|
||||||
|
ldap_group.user_roles(ldap_config[:group_role_map])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
24
lib/sequencer/unit/ldap/connection.rb
Normal file
24
lib/sequencer/unit/ldap/connection.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
require 'ldap'
|
||||||
|
require 'import/ldap'
|
||||||
|
|
||||||
|
class Sequencer
|
||||||
|
class Unit
|
||||||
|
module Ldap
|
||||||
|
class Connection < Sequencer::Unit::Base
|
||||||
|
uses :ldap_config
|
||||||
|
provides :ldap_connection
|
||||||
|
|
||||||
|
def process
|
||||||
|
return if state.provided?(:ldap_connection)
|
||||||
|
|
||||||
|
state.provide(:ldap_connection) do
|
||||||
|
config = ldap_config
|
||||||
|
config ||= ::Import::Ldap.config
|
||||||
|
|
||||||
|
::Ldap.new(config)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue