#include "utils.hpp" #include #include #include #include #include #include namespace phosphor { namespace ldap { bool isValidLDAPURI(const std::string& URI, const char* scheme) { // Return false if the user tries to configure port 0 // This check is not done in line 42, because ldap_url_parse // method internally converts port 0 to ldap port 389 and it // will always return true (thus allowing the user to // configure port 0) if (boost::algorithm::ends_with(URI, ":0")) { return false; } LDAPURLDesc* ludpp = nullptr; int res = LDAP_URL_ERR_BADURL; res = ldap_url_parse(URI.c_str(), &ludpp); auto ludppCleanupFunc = [](LDAPURLDesc* ludpp) { ldap_free_urldesc(ludpp); }; std::unique_ptr ludppPtr( ludpp, ludppCleanupFunc); if (res != LDAP_URL_SUCCESS) { return false; } if (std::strcmp(scheme, ludppPtr->lud_scheme) != 0) { return false; } if (ludppPtr->lud_port < 0 || ludppPtr->lud_port > 65536) { return false; } addrinfo hints{}; addrinfo* servinfo = nullptr; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags |= AI_CANONNAME; auto result = getaddrinfo(ludppPtr->lud_host, nullptr, &hints, &servinfo); auto cleanupFunc = [](addrinfo* servinfo) { freeaddrinfo(servinfo); }; std::unique_ptr servinfoPtr(servinfo, cleanupFunc); if (result) { return false; } return true; } } // namespace ldap } // namespace phosphor