From 785a073bce9c95605cc27689fb5135dc01fcafe4 Mon Sep 17 00:00:00 2001 From: Chee Yee Date: Sat, 26 Oct 2024 15:31:01 -0700 Subject: [PATCH] fixed issue parse apache2 httpd directory listing using docker image --- CMakeLists.txt | 2 +- source/clients/apache.cpp | 33 +++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35cbca8..26db6ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,7 +69,7 @@ add_executable(ezremote_client add_self(ezremote_client) -add_pkg(ezremote_client ${CMAKE_SOURCE_DIR}/data "RMTC00001" "ezRemote Client" "01.29" 32 0) +add_pkg(ezremote_client ${CMAKE_SOURCE_DIR}/data "RMTC00001" "ezRemote Client" "01.30" 32 0) target_link_libraries(ezremote_client c diff --git a/source/clients/apache.cpp b/source/clients/apache.cpp index 84ae787..ab6255f 100644 --- a/source/clients/apache.cpp +++ b/source/clients/apache.cpp @@ -128,18 +128,31 @@ std::vector ApacheClient::ListDir(const std::string &path) tmp_string = std::string((const char *)value, value_len); if (tmp_string.compare("td") == 0) { - value = lxb_dom_node_text_content(node, &value_len); + // get the child element + lxb_dom_node_t *a_node = NextChildElement(lxb_dom_interface_element(node)); + if (a_node == nullptr) continue; + + value = lxb_dom_element_local_name(lxb_dom_interface_element(a_node), &value_len); tmp_string = std::string((const char *)value, value_len); - tmp_string = Util::Rtrim(tmp_string, "/"); - sprintf(entry.name, "%s", tmp_string.c_str()); - sprintf(entry.directory, "%s", path.c_str()); - if (path.length() > 0 && path[path.length() - 1] == '/') + if (tmp_string.compare("a") == 0) { - sprintf(entry.path, "%s%s", path.c_str(), entry.name); - } - else - { - sprintf(entry.path, "%s/%s", path.c_str(), entry.name); + value = lxb_dom_element_get_attribute(lxb_dom_interface_element(a_node), (const lxb_char_t *)"href", 4, &value_len); + tmp_string = std::string((const char *)value, value_len); + tmp_string = Util::Rtrim(tmp_string, "/"); + tmp_string = BaseClient::UnEscape(tmp_string); + if (tmp_string.compare("..") != 0) + { + sprintf(entry.directory, "%s", path.c_str()); + sprintf(entry.name, "%s", tmp_string.c_str()); + if (path.length() > 0 && path[path.length() - 1] == '/') + { + sprintf(entry.path, "%s%s", path.c_str(), entry.name); + } + else + { + sprintf(entry.path, "%s/%s", path.c_str(), entry.name); + } + } } } else continue; // not valid record