96 lines
2.1 KiB
Ruby
96 lines
2.1 KiB
Ruby
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||
|
require 'ldap'
|
||
|
require 'ldap/user'
|
||
|
require 'ldap/group'
|
||
|
|
||
|
class Integration::LdapController < ApplicationController
|
||
|
prepend_before_action { authentication_check(permission: 'admin.integration.ldap') }
|
||
|
|
||
|
def discover
|
||
|
ldap = ::Ldap.new(params)
|
||
|
|
||
|
render json: {
|
||
|
result: 'ok',
|
||
|
attributes: ldap.preferences,
|
||
|
}
|
||
|
rescue => e
|
||
|
logger.error e
|
||
|
|
||
|
render json: {
|
||
|
result: 'failed',
|
||
|
message: e.message,
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def bind
|
||
|
# create single instance so
|
||
|
# User and Group don't have to
|
||
|
# open new connections
|
||
|
ldap = ::Ldap.new(params)
|
||
|
user = ::Ldap::User.new(params, ldap: ldap)
|
||
|
group = ::Ldap::Group.new(params, ldap: ldap)
|
||
|
|
||
|
render json: {
|
||
|
result: 'ok',
|
||
|
|
||
|
# the order of these calls is relevant!
|
||
|
user_filter: user.filter,
|
||
|
user_attributes: user.attributes,
|
||
|
user_uid: user.uid_attribute,
|
||
|
|
||
|
# the order of these calls is relevant!
|
||
|
group_filter: group.filter,
|
||
|
groups: group.list,
|
||
|
group_uid: group.uid_attribute,
|
||
|
}
|
||
|
rescue => e
|
||
|
logger.error e
|
||
|
|
||
|
render json: {
|
||
|
result: 'failed',
|
||
|
message: e.message,
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def job_try_index
|
||
|
job_index(
|
||
|
dry_run: true,
|
||
|
take_finished: params[:finished] == 'true'
|
||
|
)
|
||
|
end
|
||
|
|
||
|
def job_try_create
|
||
|
ImportJob.dry_run(name: 'Import::Ldap', payload: params)
|
||
|
render json: {
|
||
|
result: 'ok',
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def job_start_index
|
||
|
job_index(dry_run: false)
|
||
|
end
|
||
|
|
||
|
def job_start_create
|
||
|
job = ImportJob.create(name: 'Import::Ldap', payload: Setting.get('ldap_config'))
|
||
|
job.delay.start
|
||
|
render json: {
|
||
|
result: 'ok',
|
||
|
}
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def job_index(dry_run:, take_finished: true)
|
||
|
job = ImportJob.find_by(name: 'Import::Ldap', dry_run: dry_run, finished_at: nil)
|
||
|
if !job && take_finished
|
||
|
job = ImportJob.where(name: 'Import::Ldap', dry_run: dry_run).order(created_at: :desc).limit(1).first
|
||
|
end
|
||
|
|
||
|
if job
|
||
|
model_show_render_item(job)
|
||
|
else
|
||
|
render json: {}
|
||
|
end
|
||
|
end
|
||
|
end
|