1 #include "utils.hpp" 2 #include <cstring> 3 #include <netdb.h> 4 #include <arpa/inet.h> 5 #include <ldap.h> 6 #include <memory> 7 8 namespace phosphor 9 { 10 namespace ldap 11 { 12 13 bool isValidLDAPURI(const std::string& URI, const char* scheme) 14 { 15 LDAPURLDesc* ludpp = nullptr; 16 int res = LDAP_URL_ERR_BADURL; 17 res = ldap_url_parse(URI.c_str(), &ludpp); 18 19 auto ludppCleanupFunc = [](LDAPURLDesc* ludpp) { 20 ldap_free_urldesc(ludpp); 21 }; 22 std::unique_ptr<LDAPURLDesc, decltype(ludppCleanupFunc)> ludppPtr( 23 ludpp, ludppCleanupFunc); 24 25 if (res != LDAP_URL_SUCCESS) 26 { 27 return false; 28 } 29 if (std::strcmp(scheme, ludppPtr->lud_scheme) != 0) 30 { 31 return false; 32 } 33 addrinfo hints{}; 34 addrinfo* servinfo = nullptr; 35 hints.ai_family = AF_UNSPEC; 36 hints.ai_socktype = SOCK_STREAM; 37 hints.ai_flags |= AI_CANONNAME; 38 39 auto result = getaddrinfo(ludppPtr->lud_host, nullptr, &hints, &servinfo); 40 auto cleanupFunc = [](addrinfo* servinfo) { freeaddrinfo(servinfo); }; 41 std::unique_ptr<addrinfo, decltype(cleanupFunc)> servinfoPtr(servinfo, 42 cleanupFunc); 43 44 if (result) 45 { 46 return false; 47 } 48 return true; 49 } 50 51 } // namespace ldap 52 } // namespace phosphor 53