1import ./make-test-python.nix (
2 { pkgs, lib, ... }:
3 {
4 name = "filesender";
5 meta = {
6 maintainers = with lib.maintainers; [ nhnn ];
7 broken = pkgs.stdenv.hostPlatform.isAarch64; # selenium.common.exceptions.WebDriverException: Message: Unsupported platform/architecture combination: linux/aarch64
8 };
9
10 nodes.filesender =
11 { ... }:
12 let
13 format = pkgs.formats.php { };
14 in
15 {
16 networking.firewall.allowedTCPPorts = [ 80 ];
17
18 services.filesender.enable = true;
19 services.filesender.localDomain = "filesender";
20 services.filesender.settings = {
21 auth_sp_saml_authentication_source = "default";
22 auth_sp_saml_uid_attribute = "uid";
23 storage_filesystem_path = "/tmp";
24 site_url = "http://filesender";
25 force_ssl = false;
26 admin = "";
27 admin_email = "admin@localhost";
28 email_reply_to = "noreply@localhost";
29 };
30 services.simplesamlphp.filesender = {
31 settings = {
32 baseurlpath = "http://filesender/saml";
33 "module.enable".exampleauth = true;
34 };
35 authSources = {
36 admin = [ "core:AdminPassword" ];
37 default = format.lib.mkMixedArray [ "exampleauth:UserPass" ] {
38 "user:password" = {
39 uid = [ "user" ];
40 cn = [ "user" ];
41 mail = [ "user@nixos.org" ];
42 };
43 };
44 };
45 };
46 };
47
48 nodes.client =
49 {
50 pkgs,
51 nodes,
52 ...
53 }:
54 let
55 filesenderIP = (builtins.head (nodes.filesender.networking.interfaces.eth1.ipv4.addresses)).address;
56 in
57 {
58 networking.hosts.${filesenderIP} = [ "filesender" ];
59
60 environment.systemPackages =
61 let
62 username = "user";
63 password = "password";
64 browser-test =
65 pkgs.writers.writePython3Bin "browser-test"
66 {
67 libraries = [ pkgs.python3Packages.selenium ];
68 flakeIgnore = [
69 "E124"
70 "E501"
71 ];
72 }
73 ''
74 from selenium.webdriver.common.by import By
75 from selenium.webdriver import Firefox
76 from selenium.webdriver.firefox.options import Options
77 from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
78 from selenium.webdriver.firefox.service import Service
79 from selenium.webdriver.support.ui import WebDriverWait
80 from selenium.webdriver.support import expected_conditions as EC
81 from subprocess import STDOUT
82 import string
83 import random
84 import logging
85 import time
86 selenium_logger = logging.getLogger("selenium")
87 selenium_logger.setLevel(logging.DEBUG)
88 selenium_logger.addHandler(logging.StreamHandler())
89 profile = FirefoxProfile()
90 profile.set_preference("browser.download.folderList", 2)
91 profile.set_preference("browser.download.manager.showWhenStarting", False)
92 profile.set_preference("browser.download.dir", "/tmp/firefox")
93 profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain;text/txt")
94 options = Options()
95 options.profile = profile
96 options.add_argument('--headless')
97 service = Service(log_output=STDOUT)
98 driver = Firefox(options=options)
99 driver.set_window_size(1024, 768)
100 driver.implicitly_wait(30)
101 driver.get('http://filesender/')
102 wait = WebDriverWait(driver, 20)
103 wait.until(EC.title_contains("FileSender"))
104 driver.find_element(By.ID, "btn_logon").click()
105 wait.until(EC.title_contains("Enter your username and password"))
106 driver.find_element(By.ID, 'username').send_keys(
107 '${username}'
108 )
109 driver.find_element(By.ID, 'password').send_keys(
110 '${password}'
111 )
112 driver.find_element(By.ID, "submit_button").click()
113 wait.until(EC.title_contains("FileSender"))
114 wait.until(EC.presence_of_element_located((By.ID, "topmenu_logoff")))
115 test_string = "".join(random.choices(string.ascii_uppercase + string.digits, k=20))
116 with open("/tmp/test_file.txt", "w") as file:
117 file.write(test_string)
118 driver.find_element(By.ID, "files").send_keys("/tmp/test_file.txt")
119 time.sleep(2)
120 driver.find_element(By.CSS_SELECTOR, '.start').click()
121 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".download_link")))
122 download_link = driver.find_element(By.CSS_SELECTOR, '.download_link > textarea').get_attribute('value').strip()
123 driver.get(download_link)
124 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".download")))
125 driver.find_element(By.CSS_SELECTOR, '.download').click()
126 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".ui-dialog-buttonset > button:nth-child(2)")))
127 driver.find_element(By.CSS_SELECTOR, ".ui-dialog-buttonset > button:nth-child(2)").click()
128 driver.close()
129 driver.quit()
130 '';
131 in
132 [
133 pkgs.firefox-unwrapped
134 pkgs.geckodriver
135 browser-test
136 ];
137 };
138
139 testScript = ''
140 start_all()
141 filesender.wait_for_file("/run/phpfpm/filesender.sock")
142 filesender.wait_for_open_port(80)
143 if "If you have received an invitation to access this site as a guest" not in client.wait_until_succeeds("curl -sS -f http://filesender"):
144 raise Exception("filesender returned invalid html")
145 client.succeed("browser-test")
146 '';
147 }
148)