# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
require_dependency 'ldap'
require_dependency 'ldap/user'
require_dependency 'ldap/group'

class Integration::LdapController < ApplicationController
  include Integration::ImportJobBase

  prepend_before_action { authentication_check(permission: 'admin.integration.ldap') }

  def discover
    answer_with do
      begin
        ldap = ::Ldap.new(params)

        {
          attributes: ldap.preferences
        }
      rescue => e
        # workaround for issue #1114
        raise if !e.message.end_with?(', 48, Inappropriate Authentication')

        # return empty result
        {}
      end
    end
  end

  def bind
    answer_with do
      # 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)

      {
        # 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,
      }
    end
  end

  private

  def payload_dry_run
    {
      ldap_config: super
    }
  end
end
