111 lines
3 KiB
Ruby
111 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
|