trabajo-afectivo/lib/ldap/guid.rb

112 lines
3 KiB
Ruby

# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
class Ldap
# Class for handling LDAP GUIDs.
# strongly inspired by
# https://gist.github.com/astockwell/359c950fbc650c339eea
# Big thanks to @astockwell
class Guid
# Checks if the given string is a valid GUID.
#
# @param string [String] The string that should be checked for valid GUID format.
#
# @example
# Ldap::Guid.valid?('f742b361-32c6-4a92-baaa-eaae7df657ee')
# #=> true
#
# @return [Boolean]
def self.valid?(string)
string.match?(%r{\w{8}-\w{4}-\w{4}-\w{4}-\w+})
end
# Convers a given GUID string into the HEX equivalent.
#
# @param string [String] The GUID string that should converted into HEX.
#
# @example
# Ldap::Guid.hex('f742b361-32c6-4a92-baaa-eaae7df657ee')
# #=> "a\xB3B\xF7\xC62\x92J\xBA\xAA\xEA\xAE}\xF6W\xEE".b
#
# @return [String] The HEX equivalent of the given GUID string.
def self.hex(string)
new(string).hex
end
# Convers a given HEX string into the GUID equivalent.
#
# @param string [String] The HEX string that should converted into a GUID.
#
# @example
# Ldap::Guid.string("a\xB3B\xF7\xC62\x92J\xBA\xAA\xEA\xAE}\xF6W\xEE".b)
# #=> 'f742b361-32c6-4a92-baaa-eaae7df657ee'
#
# @return [String] The GUID equivalent of the given HEX string.
def self.string(hex)
new(hex).string
end
# Initializes an instance for the LDAP::Guid class to convert from/to HEX and GUID strings.
#
# @param string [String] The HEX or GUID string that should converted.
#
# @example
# guid = Ldap::Guid.new('f742b361-32c6-4a92-baaa-eaae7df657ee')
#
# @return [nil]
def initialize(guid)
@guid = guid
end
# Convers the GUID string into the HEX equivalent.
#
# @example
# guid.hex
# #=> "a\xB3B\xF7\xC62\x92J\xBA\xAA\xEA\xAE}\xF6W\xEE".b
#
# @return [String] The HEX equivalent of the GUID string.
def hex
[oracle_raw16(guid)].pack('H*')
end
# Convers the HEX string into the GUID equivalent.
#
# @example
# guid.string
# #=> 'f742b361-32c6-4a92-baaa-eaae7df657ee'
#
# @return [String] The GUID equivalent of the HEX string.
def string
oracle_raw16(guid.unpack1('H*'), dashify: true)
end
private
attr_reader :guid
def oracle_raw16(string, dashify: false)
# remove dashes
string.delete!('-')
# split every two chars
parts = string.scan(%r{.{1,2}})
# re-order according to oracle format index and join
oracle_format_indices = [3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15]
result = oracle_format_indices.map { |index| parts[index] }.join
# add dashes if requested
return result if !dashify
[
result[0..7],
result[8..11],
result[12..15],
result[16..19],
result[20..result.size]
].join('-')
end
end
end