from contextlib import suppress from logging import info as log_info, exception as log_exception, error as log_error from pathlib import Path from time import sleep from requests import get from selenium.webdriver.common.by import By from selenium.webdriver.remote.webelement import WebElement from selenium.common.exceptions import TimeoutException from wizard import DRIVER, UI_URL from base import TEST_TYPE from utils import access_page, assert_button_click, safe_get_element, wait_for_service, verify_select_filters exit_code = 0 try: log_info("Navigating to the plugins page to create a new service ...") access_page(DRIVER, "/html/body/aside[1]/div[1]/div[3]/ul/li[6]/a", "plugins") for _ in range(5): get(f"http://www.example.com{UI_URL}/?id=/etc/passwd") sleep(1) sleep(7) log_info("Trying to reload the plugins without adding any ...") reload_button = safe_get_element(DRIVER, By.XPATH, "//div[@data-plugins-upload='']//button[@type='submit']") assert isinstance(reload_button, WebElement), "Reload button is not a WebElement" if reload_button.get_attribute("disabled") is None: log_error("The reload button is not disabled, exiting ...") exit(1) log_info("Trying to filter the plugins ...") # Get total plugins plugins = safe_get_element(DRIVER, "js", 'document.querySelectorAll("[data-plugins-type]")') plugins_total = len(plugins) key_word_filter_input = safe_get_element(DRIVER, "js", 'document.querySelector("input#keyword")') assert isinstance(key_word_filter_input, WebElement), "Key word filter input is not a WebElement" key_word_filter_input.send_keys("Antibot") plugins_hidden = safe_get_element(DRIVER, "js", 'document.querySelectorAll("[data-plugins-type][class*=hidden]")') if len(plugins_hidden) == 0: log_error("The keyword filter is not working, exiting ...") exit(1) # Reset key_word_filter_input.send_keys("") # Test select filters select_filters = [ {"name": "Types", "id": "types", "value": "all", "update_value": "123456"}, ] verify_select_filters(DRIVER, "plugins", select_filters) log_info("The filter is working, trying to add a bad plugin ...") file_input = safe_get_element(DRIVER, By.XPATH, "//input[@type='file' and @name='file']") assert isinstance(file_input, WebElement), "File input is not a WebElement" file_input.send_keys(Path.cwd().joinpath("test.zip").as_posix()) access_page(DRIVER, "//div[@data-plugins-upload='']//button[@type='submit']", "plugins", False) log_info("The bad plugin has been rejected, trying to add a good plugin ...") file_input = safe_get_element(DRIVER, By.XPATH, "//input[@type='file' and @name='file']") assert isinstance(file_input, WebElement), "File input is not a WebElement" file_input.send_keys(Path.cwd().joinpath("discord.zip").as_posix()) access_page(DRIVER, "//div[@data-plugins-upload='']//button[@type='submit']", "plugins", False) if TEST_TYPE == "linux": wait_for_service() external_plugins = safe_get_element(DRIVER, By.XPATH, "//div[@data-plugins-type='external']", multiple=True) assert isinstance(external_plugins, list), "External plugins list is not a list" if len(external_plugins) != 1: log_error("The plugin hasn't been added, exiting ...") exit(1) log_info("The plugin has been added, trying delete it ...") assert_button_click(DRIVER, "//button[@data-plugins-action='delete' and @name='discord']") access_page(DRIVER, "//form[@data-plugins-modal-form-delete='']//button[@type='submit']", "plugins", False) if TEST_TYPE == "linux": wait_for_service() with suppress(TimeoutException): if safe_get_element(DRIVER, By.XPATH, "//button[@data-plugins-action='delete' and @name='discord']", error=True): log_error("The plugin hasn't been deleted, exiting ...") exit(1) log_info("The plugin has been deleted") DEACTIVATED_PLUGINS = ("antibot", "blacklist", "bunkernet", "cors", "country", "greylist", "redis", "reversescan") for plugin in DEACTIVATED_PLUGINS: log_info(f"Trying {plugin} plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/{plugin}") first_card = safe_get_element(DRIVER, By.XPATH, "/html/body/main/div/div/div/div[1]/h5") assert isinstance(first_card, WebElement), "First card is not a WebElement" if first_card.text != "Deactivated": log_error(f"The {plugin} page should show that the plugin is deactivated, exiting ...") exit(1) log_info(f"{plugin} page shows that the plugin is deactivated, as expected") DRIVER.back() log_info("Trying bad behavior plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/badbehavior") sleep(5) badbehavior_list = safe_get_element(DRIVER, By.XPATH, '//li[@data-item=""]', multiple=True) assert isinstance(badbehavior_list, list), "Bad behavior list is not a list" found_403 = False for item in badbehavior_list: if "403" in item.text: found_403 = True break if not found_403: log_error("Bad behavior list doesn't show 403, exiting ...") exit(1) log_info("Bad behavior list shows 403, as expected") DRIVER.back() log_info("Trying dnsbl plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/dnsbl") sleep(5) dnsbl_count = safe_get_element(DRIVER, By.XPATH, '//h5[@data-count=""]') assert isinstance(dnsbl_count, WebElement), "DNSBL count is not a WebElement" if dnsbl_count.text != "0": log_error("DNSBL count is not 0, exiting ...") exit(1) log_info("DNSBL count is 0, as expected") DRIVER.back() log_info("Trying errors plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/errors") sleep(5) errors_list = safe_get_element(DRIVER, By.XPATH, '//li[@data-item=""]', multiple=True) assert isinstance(errors_list, list), "Errors list is not a list" found_403 = False for item in errors_list: if "403" in item.text: found_403 = True break if not found_403: log_error("Errors list doesn't show 403, exiting ...") exit(1) log_info("Errors list shows 403, as expected") DRIVER.back() log_info("Trying limit plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/limit") limit_info_elem = safe_get_element(DRIVER, By.XPATH, "/html/body/main/div/div/div[1]/h5") assert isinstance(limit_info_elem, WebElement), "Limit info element is not a WebElement" if limit_info_elem.text != "INFO": log_error("Limit page doesn't show the limit, exiting ...") exit(1) log_info("Limit page is shown, as expected") DRIVER.back() log_info("Trying miscellaneous plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/misc") sleep(5) misc_disallowed_count = safe_get_element(DRIVER, By.XPATH, '//h5[@data-count-disallowed-methods=""]') assert isinstance(misc_disallowed_count, WebElement), "Miscellaneous disallowed count is not a WebElement" if misc_disallowed_count.text != "0": log_error("Miscellaneous disallowed count is not 0, exiting ...") exit(1) log_info("Miscellaneous disallowed count is 0, as expected") DRIVER.back() log_info("Trying whitelist plugin page ...") DRIVER.get(f"http://www.example.com{UI_URL}/plugins/whitelist") sleep(5) dnsbl_count = safe_get_element(DRIVER, By.XPATH, '//h5[@data-count=""]') assert isinstance(dnsbl_count, WebElement), "Whitelist count is not a WebElement" if dnsbl_count.text != "0": log_error("Whitelist count is not 0, exiting ...") exit(1) log_info("Whitelist count is 0, as expected") log_info("✅ Plugins page tests finished successfully") except SystemExit as e: exit_code = e.code except KeyboardInterrupt: exit_code = 1 except: log_exception("Something went wrong, exiting ...") exit_code = 1 finally: if exit_code: DRIVER.save_screenshot("error.png") DRIVER.quit() exit(exit_code)