self::ZBX_TYPE_SAMA | self::ZBX_TYPE_UPN]; $this->options = [ 'strict' => array_key_exists('strict', $options) && (bool) $options['strict'], 'type_sama' => array_key_exists('nametype', $options) && ($options['nametype'] & self::ZBX_TYPE_SAMA), 'type_upn' => array_key_exists('nametype', $options) && ($options['nametype'] & self::ZBX_TYPE_UPN) ]; } /** * Parse given name attribute value. * * @param string $source Source string that needs to be parsed. * @param int $pos Position offset. * * @return int */ public function parse($source, $pos = 0) { $this->length = 0; $this->user_name = ''; $this->domain_name = ''; $this->match = ''; $this->name_type = self::ZBX_TYPE_UNKNOWN; if (($this->options['type_upn']) && $this->parseUserPrincipalName($source, $pos) == self::PARSE_SUCCESS) { $this->name_type = self::ZBX_TYPE_UPN; } elseif ($this->options['type_sama'] && $this->parseSamAccountName($source, $pos) == self::PARSE_SUCCESS) { $this->name_type = self::ZBX_TYPE_SAMA; } else { return self::PARSE_FAIL; } return isset($source[$pos]) ? self::PARSE_SUCCESS_CONT : self::PARSE_SUCCESS; } /** * Get parsed name attribute type. * * @return int */ public function getNameType() { return $this->name_type; } /** * Get parsed user name value. * * @return string|null */ public function getUserName() { return ($this->name_type == self::ZBX_TYPE_UNKNOWN) ? null : $this->user_name; } /** * Get parsed user domain name value. * * @return string|null */ public function getDomainName() { return ($this->name_type == self::ZBX_TYPE_UNKNOWN) ? null : $this->domain_name; } /** * Parse string searching for samAccountName. * https://docs.microsoft.com/en-us/windows/desktop/ADSchema/a-samaccountname * https://social.technet.microsoft.com/wiki/contents/articles/11216.active-directory-requirements-for-creating-objects.aspx * * @param string $source Source string that needs to be parsed. * @param int $pos Position offset. * * @return int */ private function parseSamAccountName($source, &$pos) { $strict = $this->options['strict']; $regex = '/^(?[^\\\\\/\:\*\?\"\<\>]'. ($strict ? '{1,15}' : '+'). ')\\\(?[^\\\\\/\:\*\?\"\<\>@]'. ($strict ? '{1,20}' : '+'). ')/i'; if (preg_match($regex, substr($source, $pos), $matches)) { $this->length = strlen($matches[0]); } else { return self::PARSE_FAIL; } $this->match = $matches[0]; $this->domain_name = $matches['domain']; $this->user_name = $matches['user']; $pos += $this->length; return self::PARSE_SUCCESS; } /** * Parse string searching for UserPrincipalName. * https://docs.microsoft.com/en-us/windows/desktop/ADSchema/a-userprincipalname * * @param string $source Source string that needs to be parsed. * @param int $pos Position offset. * * @return int */ private function parseUserPrincipalName($source, &$pos) { $regex = '/^(?[_a-z0-9-@]+(\.[_a-z0-9-]+)*)@(?[a-z0-9-]+(\.[a-z0-9-]+)*)/i'; if (preg_match($regex, substr($source, $pos), $matches)) { $this->length = strlen($matches[0]); } else { return self::PARSE_FAIL; } $this->match = $matches[0]; $this->domain_name = $matches['domain']; $this->user_name = $matches['user']; $pos += $this->length; return self::PARSE_SUCCESS; } }