module ROM::LDAP::Client::Operations

Adds entry creation capability to the connection.

@api private

Public Instance Methods

add(dn:, attrs:) click to toggle source

@option :dn [String] distinguished name @option :attrs [Hash]

@api private

# File lib/rom/ldap/client/operations.rb, line 101
def add(dn:, attrs:)
  request_type = pdu_lookup(:add_request)

  ber_attrs = attrs.each_with_object([]) do |(k, v), attributes|
    ber_values = values_to_ber_set(v)
    attributes << [k.to_s.to_ber, ber_values].to_ber_sequence
  end

  request = [
    dn.to_ber,
    ber_attrs.to_ber_sequence
  ].to_ber_appsequence(request_type)

  submit(:add_response, request)
end
delete(dn:, controls: nil) click to toggle source

@option :dn [String] distinguished name

@option :controls [Array<String>] e.g. DELETE_TREE

@api private

# File lib/rom/ldap/client/operations.rb, line 122
def delete(dn:, controls: nil)
  request_type = pdu_lookup(:delete_request)
  request = dn.to_ber_application_string(request_type)

  if controls
    submit(:delete_response, request, controls.to_ber_control)
  else
    submit(:delete_response, request)
  end
end
password_modify(dn:, old_pwd: nil, new_pwd:) click to toggle source

Password should have a minimum of 5 characters.

@see tools.ietf.org/html/rfc3062

@option :dn [String] distinguished name

@option :old_pwd [String] current password (optional for admin reset)

@option :new_pwd [String] replacement password

@return [PDU] result object

@api public

# File lib/rom/ldap/client/operations.rb, line 190
def password_modify(dn:, old_pwd: nil, new_pwd:)
  request_type = pdu_lookup(:extended_request)
  context = OID[:password_modify].to_ber_contextspecific(0)

  payload = [dn.to_ber(0x80)]
  payload << old_pwd.to_ber(0x81) if old_pwd
  payload << new_pwd.to_ber(0x82)
  payload = payload.to_ber_sequence.to_ber(0x81)

  request = [context, payload].to_ber_appsequence(request_type)

  submit(:extended_response, request)
end
rename(dn:, rdn:, replace: false, superior: nil) click to toggle source

TODO: spec rename and use by relations

@option :dn [String] current distinguished name

@option :rdn [String] new relative distinguished name

@option :replace [TrueClass] replace existing rdn

@option :superior [String] new parent dn

@return [PDU] result object

@api public

# File lib/rom/ldap/client/operations.rb, line 165
def rename(dn:, rdn:, replace: false, superior: nil)
  request_type = pdu_lookup(:modify_rdn_request)

  request = [dn, rdn, replace].map { |a| a.to_ber } # &:to_ber

  request << superior.to_ber_contextspecific(0) if superior

  request = request.to_ber_appsequence(request_type)

  submit(:modify_rdn_response, request)
end
update(dn:, ops:) click to toggle source

@option :dn [String] distinguished name

@option :ops [Array<Mixed>] operation ast

@return [PDU] result object

@api private

# File lib/rom/ldap/client/operations.rb, line 140
def update(dn:, ops:)
  request_type = pdu_lookup(:modify_request)
  operations = modify_ops(ops)

  request = [
    dn.to_ber,
    operations.to_ber_sequence
  ].to_ber_appsequence(request_type)

  submit(:modify_response, request)
end

Private Instance Methods

modify_ops(operations = EMPTY_ARRAY) click to toggle source

Encode (replace) operation AST to BER. Operation tokens are add=0, delete=1 and replace=2.

@param operations [Array]

@return [Array] BER encoded operations

# File lib/rom/ldap/client/operations.rb, line 212
def modify_ops(operations = EMPTY_ARRAY)
  operations.each_with_object([]) do |(attribute, values), ops|
    payload = [
      attribute.to_s.to_ber,
      values_to_ber_set(values)
    ].to_ber_sequence

    ops << [2.to_ber_enumerated, payload].to_ber
  end
end
values_to_ber_set(values) click to toggle source

@param values [String, Array<String>]

@return [String] Encoding:ASCII-8BIT

# File lib/rom/ldap/client/operations.rb, line 227
def values_to_ber_set(values)
  Array(values).map { |v| v&.to_ber }.to_ber_set
end