test_idn.bats 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. #!/usr/bin/env bats
  2. # Extension for tests.bats to check for issues with IDN domains
  3. load 'test_helper/bats-support/load'
  4. load 'test_helper/bats-assert/load'
  5. load 'test_helper/bats-file/load'
  6. function random() {
  7. head /dev/urandom | tr -dc 0-9 | head -c$1
  8. }
  9. function setup() {
  10. # echo "# Setup_file" > &3
  11. if [ $BATS_TEST_NUMBER = 1 ]; then
  12. echo 'user=testidn-5285' > /tmp/hestia-test-env.sh
  13. echo 'userbk=testbk-5285' >> /tmp/hestia-test-env.sh
  14. echo 'userpass1=testidn-5285' >> /tmp/hestia-test-env.sh
  15. echo 'userpass2=t3st-p4ssw0rd' >> /tmp/hestia-test-env.sh
  16. echo 'HESTIA=/usr/local/hestia' >> /tmp/hestia-test-env.sh
  17. echo 'domain=смместро.рф' >> /tmp/hestia-test-env.sh
  18. echo 'domain2=xn--e1anajjcdi.xn--p1ai' >> /tmp/hestia-test-env.sh
  19. echo 'ip=198.18.0.125' >> /tmp/hestia-test-env.sh
  20. echo 'ip2=198.18.0.126' >> /tmp/hestia-test-env.sh
  21. fi
  22. source /tmp/hestia-test-env.sh
  23. source $HESTIA/func/main.sh
  24. source $HESTIA/conf/hestia.conf
  25. source $HESTIA/func/ip.sh
  26. }
  27. function validate_web_domain() {
  28. local user=$1
  29. local domain=$2
  30. local webproof=$3
  31. local webpath=${4}
  32. refute [ -z "$user" ]
  33. refute [ -z "$domain" ]
  34. refute [ -z "$webproof" ]
  35. source $HESTIA/func/ip.sh
  36. run v-list-web-domain $user $domain
  37. assert_success
  38. USER_DATA=$HESTIA/data/users/$user
  39. local domain_ip=$(get_object_value 'WEB' 'DOMAIN' "$domain" '$IP')
  40. SSL=$(get_object_value 'WEB' 'DOMAIN' "$domain" '$SSL')
  41. domain_ip=$(get_real_ip "$domain_ip")
  42. if [ ! -z $webpath ]; then
  43. domain_docroot=$(get_object_value 'WEB' 'DOMAIN' "$domain" '$CUSTOM_DOCROOT')
  44. if [ -n "$domain_docroot" ] && [ -d "$domain_docroot" ]; then
  45. assert_file_exist "${domain_docroot}/${webpath}"
  46. else
  47. assert_file_exist "${HOMEDIR}/${user}/WEB/${domain}/public_html/${webpath}"
  48. fi
  49. fi
  50. # Test HTTP
  51. run curl --location --silent --show-error --insecure --resolve "${domain}:80:${domain_ip}" "http://${domain}/${webpath}"
  52. assert_success
  53. assert_output --partial "$webproof"
  54. # Test HTTPS
  55. if [ "$SSL" = "yes" ]; then
  56. run v-list-web-domain-ssl $user $domain
  57. assert_success
  58. run curl --location --silent --show-error --insecure --resolve "${domain}:443:${domain_ip}" "https://${domain}/${webpath}"
  59. assert_success
  60. assert_output --partial "$webproof"
  61. fi
  62. }
  63. function validate_mail_domain() {
  64. local user=$1
  65. local domain=$(idn -t --quiet -a "$2" )
  66. refute [ -z "$user" ]
  67. refute [ -z "$domain" ]
  68. run v-list-mail-domain $user $domain
  69. assert_success
  70. assert_dir_exist $HOMEDIR/$user/mail/$domain
  71. assert_dir_exist $HOMEDIR/$user/conf/mail/$domain
  72. assert_file_exist $HOMEDIR/$user/conf/mail/$domain/aliases
  73. assert_file_exist $HOMEDIR/$user/conf/mail/$domain/antispam
  74. assert_file_exist $HOMEDIR/$user/conf/mail/$domain/antivirus
  75. assert_file_exist $HOMEDIR/$user/conf/mail/$domain/fwd_only
  76. assert_file_exist $HOMEDIR/$user/conf/mail/$domain/ip
  77. assert_file_exist $HOMEDIR/$user/conf/mail/$domain/passwd
  78. }
  79. function validate_webmail_domain() {
  80. local user=$1
  81. local domain=$2
  82. local webproof=$3
  83. local webpath=${4}
  84. refute [ -z "$user" ]
  85. refute [ -z "$domain" ]
  86. refute [ -z "$webproof" ]
  87. domain_idn=$(idn -t --quiet -a "$domain" )
  88. source $HESTIA/func/ip.sh
  89. USER_DATA=$HESTIA/data/users/$user
  90. local domain_ip=$(get_object_value 'web' 'DOMAIN' "$domain_idn" '$IP')
  91. SSL=$(get_object_value 'mail' 'DOMAIN' "$domain_idn" '$SSL')
  92. domain_ip=$(get_real_ip "$domain_ip")
  93. if [ ! -z "$webpath" ]; then
  94. assert_file_exist /var/lib/roundcube/$webpath
  95. fi
  96. # Test HTTP
  97. run curl --location --silent --show-error --insecure --resolve "webmail.${domain_idn}:80:${domain_ip}" "http://webmail.${domain_idn}/${webpath}"
  98. assert_success
  99. assert_output --partial "$webproof"
  100. # Test HTTP
  101. run curl --location --silent --show-error --insecure --resolve "mail.${domain_idn}:80:${domain_ip}" "http://mail.${domain_idn}/${webpath}"
  102. assert_success
  103. assert_output --partial "$webproof"
  104. # Test HTTPS
  105. if [ "$SSL" = "yes" ]; then
  106. run v-list-mail-domain-ssl $user $domain
  107. assert_success
  108. run curl --location --silent --show-error --insecure --resolve "webmail.${domain_idn}:443:${domain_ip}" "https://webmail.${domain_idn}/${webpath}"
  109. assert_success
  110. assert_output --partial "$webproof"
  111. run curl --location --silent --show-error --insecure --resolve "mail.${domain_idn}:443:${domain_ip}" "https://mail.${domain_idn}/${webpath}"
  112. assert_success
  113. assert_output --partial "$webproof"
  114. fi
  115. }
  116. #----------------------------------------------------------#
  117. # MAIN #
  118. #----------------------------------------------------------#
  119. # Add Test IP
  120. @test "IP: Add Test IP" {
  121. interface=$(v-list-sys-interfaces plain | head -n 1)
  122. run v-add-sys-ip $ip 255.255.255.255 $interface
  123. assert_success
  124. refute_output
  125. }
  126. @test "IP: Add 2nd Test IP" {
  127. interface=$(v-list-sys-interfaces plain | head -n 1)
  128. run v-add-sys-ip $ip2 255.255.255.255 $interface
  129. assert_success
  130. refute_output
  131. }
  132. # create test user
  133. @test "User: Add test user" {
  134. run v-add-user $user $user "test@idn.nu" default $ip
  135. assert_success
  136. refute_output
  137. }
  138. #----------------------------------------------------------#
  139. # WEB (смместро.рф) #
  140. #----------------------------------------------------------#
  141. @test "WEB: Add WEB domain IDN" {
  142. run v-add-web-domain $user $domain $ip
  143. assert_success
  144. refute_output
  145. }
  146. @test "WEB: List WEB domain IDN" {
  147. run v-list-web-domain $user $domain2
  148. assert_success
  149. assert_output --partial $domain2
  150. }
  151. @test "WEB: Delete WEB domain IDN" {
  152. run v-delete-web-domain $user $domain
  153. assert_success
  154. refute_output
  155. }
  156. @test "WEB: List WEB domain IDN (Fail)" {
  157. run v-list-web-domain $user $domain
  158. assert_failure $E_NOTEXIST
  159. }
  160. @test "WEB: Add WEB domain + Alias IDN" {
  161. run v-add-web-domain $user $domain $ip yes "test.${domain},test2.${domain},www.${domain}"
  162. assert_success
  163. refute_output
  164. }
  165. @test "WEB: List WEB domain (Alias) IDN" {
  166. run v-list-web-domain $user $domain2
  167. assert_success
  168. assert_output --partial "test2.${domain2}"
  169. }
  170. @test "WEB: Delete Alias IDN" {
  171. run v-delete-web-domain-alias $user $domain "test.${domain}"
  172. assert_success
  173. refute_output
  174. }
  175. @test "WEB: Add Alias IDN" {
  176. run v-add-web-domain-alias $user $domain "test.${domain}"
  177. assert_success
  178. refute_output
  179. }
  180. @test "WEB: Add Alias (Wildcard) IDN" {
  181. run v-add-web-domain-alias $user $domain "*.${domain}"
  182. assert_success
  183. refute_output
  184. }
  185. @test "WEB: Delete Alias (Wildcard) IDN" {
  186. run v-delete-web-domain-alias $user $domain "*.${domain}"
  187. assert_success
  188. refute_output
  189. }
  190. @test "WEB: Add FTP user" {
  191. run v-add-web-domain-ftp $user $domain "test" "test_${domain}"
  192. assert_success
  193. refute_output
  194. }
  195. @test "WEB: Delete FTP user" {
  196. run v-delete-web-domain-ftp $user $domain "${user}_test"
  197. assert_success
  198. refute_output
  199. }
  200. @test "WEB: Add ssl" {
  201. cp -f $HESTIA/ssl/certificate.crt /tmp/$domain2.crt
  202. cp -f $HESTIA/ssl/certificate.key /tmp/$domain2.key
  203. run v-add-web-domain-ssl $user $domain /tmp
  204. assert_success
  205. refute_output
  206. }
  207. @test "WEB: Add force ssl" {
  208. run v-add-web-domain-ssl-force $user $domain
  209. assert_success
  210. refute_output
  211. }
  212. @test "WEB: Change Web IP" {
  213. run v-change-web-domain-ip $user $domain $ip2
  214. assert_success
  215. refute_output
  216. }
  217. @test "WEB: Change Web IP (back to first)" {
  218. run v-change-web-domain-ip $user $domain $ip
  219. assert_success
  220. refute_output
  221. }
  222. #----------------------------------------------------------#
  223. # MAIL (смместро.рф) #
  224. #----------------------------------------------------------#
  225. @test "MAIL: Add mail domain" {
  226. run v-add-mail-domain $user $domain
  227. assert_success
  228. refute_output
  229. # We convert IDN always to punicode to verify it
  230. validate_mail_domain $user "$domain"
  231. # echo -e "<?php\necho 'Server: ' . \$_SERVER['SERVER_SOFTWARE'];" > /var/lib/roundcube/check_server.php
  232. validate_webmail_domain $user $domain 'Welcome to Roundcube Webmail'
  233. # rm /var/lib/roundcube/check_server.php
  234. }
  235. @test "MAIL: Add domain (duplicate)" {
  236. run v-add-mail-domain $user $domain
  237. assert_failure $E_EXISTS
  238. }
  239. @test "MAIL: Add account" {
  240. run v-add-mail-account $user $domain test t3st-p4ssw0rd
  241. assert_success
  242. refute_output
  243. }
  244. @test "MAIL: Add account (duplicate)" {
  245. run v-add-mail-account $user $domain test t3st-p4ssw0rd
  246. assert_failure $E_EXISTS
  247. }
  248. @test "MAIL: Delete account" {
  249. run v-delete-mail-account $user $domain test
  250. assert_success
  251. refute_output
  252. }
  253. @test "MAIL: Delete missing account" {
  254. run v-delete-mail-account $user $domain test
  255. assert_failure $E_NOTEXIST
  256. }
  257. #----------------------------------------------------------#
  258. # DNS #
  259. #----------------------------------------------------------#
  260. @test "DNS: Add domain" {
  261. run v-add-dns-domain $user $domain $ip
  262. assert_success
  263. refute_output
  264. }
  265. @test "DNS: Add domain (duplicate)" {
  266. run v-add-dns-domain $user $domain $ip
  267. assert_failure $E_EXISTS
  268. }
  269. @test "DNS: Add domain record" {
  270. run v-add-dns-record $user $domain test A $ip
  271. assert_success
  272. refute_output
  273. }
  274. @test "DNS: Delete domain record" {
  275. run v-delete-dns-record $user $domain 20
  276. assert_success
  277. refute_output
  278. }
  279. @test "DNS: Delete missing domain record" {
  280. run v-delete-dns-record $user $domain 20
  281. assert_failure $E_NOTEXIST
  282. }
  283. @test "DNS: Change domain expire date" {
  284. run v-change-dns-domain-exp $user $domain "2021-04-04"
  285. assert_success
  286. refute_output
  287. }
  288. @test "DNS: Change domain ip" {
  289. run v-change-dns-domain-ip $user $domain 127.0.0.1
  290. assert_success
  291. refute_output
  292. }
  293. @test "DNS: Suspend domain" {
  294. run v-suspend-dns-domain $user $domain
  295. assert_success
  296. refute_output
  297. }
  298. @test "DNS: Unsuspend domain" {
  299. run v-unsuspend-dns-domain $user $domain
  300. assert_success
  301. refute_output
  302. }
  303. @test "DNS: Rebuild" {
  304. run v-rebuild-dns-domains $user
  305. assert_success
  306. refute_output
  307. }
  308. #----------------------------------------------------------#
  309. # RESET USER #
  310. #----------------------------------------------------------#
  311. @test "User: Delete test user IDN" {
  312. run v-delete-user $user
  313. assert_success
  314. refute_output
  315. }
  316. # create test user
  317. @test "User: Add test user IDN" {
  318. run v-add-user $user $user "test@idn.nu" default $ip
  319. assert_success
  320. refute_output
  321. }
  322. #----------------------------------------------------------#
  323. # WEB (xn--e1aaujjcdi.xn--p1ai) #
  324. #----------------------------------------------------------#
  325. @test "2WEB: Add WEB domain IDN" {
  326. run v-add-web-domain $user $domain2 $ip
  327. assert_success
  328. refute_output
  329. }
  330. @test "2WEB: List WEB domain IDN" {
  331. run v-list-web-domain $user $domain2
  332. assert_success
  333. assert_output --partial $domain2
  334. }
  335. @test "2WEB: Delete WEB domain IDN" {
  336. run v-delete-web-domain $user $domain2
  337. assert_success
  338. refute_output
  339. }
  340. @test "2WEB: List WEB domain IDN (Fail)" {
  341. run v-list-web-domain $user $domain2
  342. assert_failure $E_NOTEXIST
  343. }
  344. @test "2WEB: Add WEB domain + Alias IDN" {
  345. run v-add-web-domain $user $domain2 $ip yes "test.${domain},test2.${domain},www.${domain}"
  346. assert_success
  347. refute_output
  348. }
  349. @test "2WEB: List WEB domain (Alias) IDN" {
  350. run v-list-web-domain $user $domain2
  351. assert_success
  352. assert_output --partial "test2.${domain2}"
  353. }
  354. @test "2WEB: Delete Alias IDN" {
  355. run v-delete-web-domain-alias $user $domain2 "test.${domain}"
  356. assert_success
  357. refute_output
  358. }
  359. @test "2WEB: Add Alias IDN" {
  360. run v-add-web-domain-alias $user $domain2 "test.${domain}"
  361. assert_success
  362. refute_output
  363. }
  364. @test "2WEB: Add Alias (Wildcard) IDN" {
  365. run v-add-web-domain-alias $user $domain2 "*.${domain}"
  366. assert_success
  367. refute_output
  368. }
  369. @test "2WEB: Delete Alias (Wildcard) IDN" {
  370. run v-delete-web-domain-alias $user $domain2 "*.${domain}"
  371. assert_success
  372. refute_output
  373. }
  374. @test "2WEB: Add FTP user" {
  375. run v-add-web-domain-ftp $user $domain2 "test" "test_${domain}"
  376. assert_success
  377. refute_output
  378. }
  379. @test "2WEB: Delete FTP user" {
  380. run v-delete-web-domain-ftp $user $domain2 "${user}_test"
  381. assert_success
  382. refute_output
  383. }
  384. @test "2WEB: Add ssl" {
  385. cp -f $HESTIA/ssl/certificate.crt /tmp/$domain2.crt
  386. cp -f $HESTIA/ssl/certificate.key /tmp/$domain2.key
  387. run v-add-web-domain-ssl $user $domain2 /tmp
  388. assert_success
  389. refute_output
  390. }
  391. @test "2WEB: Add force ssl" {
  392. run v-add-web-domain-ssl-force $user $domain2
  393. assert_success
  394. refute_output
  395. }
  396. @test "2WEB: Change Web IP" {
  397. run v-change-web-domain-ip $user $domain2 $ip2
  398. assert_success
  399. refute_output
  400. }
  401. @test "2WEB: Change Web IP (back to first)" {
  402. run v-change-web-domain-ip $user $domain2 $ip
  403. assert_success
  404. refute_output
  405. }
  406. #----------------------------------------------------------#
  407. # MAIL (смместро.рф) #
  408. #----------------------------------------------------------#
  409. @test "2MAIL: Add mail domain" {
  410. run v-add-mail-domain $user $domain2
  411. assert_success
  412. refute_output
  413. # We convert IDN always to punicode to verify it
  414. validate_mail_domain $user "$domain2"
  415. # echo -e "<?php\necho 'Server: ' . \$_SERVER['SERVER_SOFTWARE'];" > /var/lib/roundcube/check_server.php
  416. validate_webmail_domain $user $domain2 'Welcome to Roundcube Webmail'
  417. # rm /var/lib/roundcube/check_server.php
  418. }
  419. @test "2MAIL: Add domain (duplicate)" {
  420. run v-add-mail-domain $user $domain2
  421. assert_failure $E_EXISTS
  422. }
  423. @test "2MAIL: Add account" {
  424. run v-add-mail-account $user $domain2 test t3st-p4ssw0rd
  425. assert_success
  426. refute_output
  427. }
  428. @test "2MAIL: Add account (duplicate)" {
  429. run v-add-mail-account $user $domain2 test t3st-p4ssw0rd
  430. assert_failure $E_EXISTS
  431. }
  432. @test "2MAIL: Delete account" {
  433. run v-delete-mail-account $user $domain2 test
  434. assert_success
  435. refute_output
  436. }
  437. @test "2MAIL: Delete missing account" {
  438. run v-delete-mail-account $user $domain2 test
  439. assert_failure $E_NOTEXIST
  440. }
  441. #----------------------------------------------------------#
  442. # DNS #
  443. #----------------------------------------------------------#
  444. @test "2DNS: Add domain" {
  445. run v-add-dns-domain $user $domain2 $ip
  446. assert_success
  447. refute_output
  448. }
  449. @test "2DNS: Add domain (duplicate)" {
  450. run v-add-dns-domain $user $domain2 $ip
  451. assert_failure $E_EXISTS
  452. }
  453. @test "2DNS: Add domain record" {
  454. run v-add-dns-record $user $domain2 test A $ip
  455. assert_success
  456. refute_output
  457. }
  458. @test "2DNS: Delete domain record" {
  459. run v-delete-dns-record $user $domain2 20
  460. assert_success
  461. refute_output
  462. }
  463. @test "2DNS: Delete missing domain record" {
  464. run v-delete-dns-record $user $domain2 20
  465. assert_failure $E_NOTEXIST
  466. }
  467. @test "2DNS: Change domain expire date" {
  468. run v-change-dns-domain-exp $user $domain2 "2021-04-04"
  469. assert_success
  470. refute_output
  471. }
  472. @test "2DNS: Change domain ip" {
  473. run v-change-dns-domain-ip $user $domain2 127.0.0.1
  474. assert_success
  475. refute_output
  476. }
  477. @test "2DNS: Suspend domain" {
  478. run v-suspend-dns-domain $user $domain2
  479. assert_success
  480. refute_output
  481. }
  482. @test "2DNS: Unsuspend domain" {
  483. run v-unsuspend-dns-domain $user $domain2
  484. assert_success
  485. refute_output
  486. }
  487. @test "2DNS: Rebuild" {
  488. run v-rebuild-dns-domains $user
  489. assert_success
  490. refute_output
  491. }
  492. #----------------------------------------------------------#
  493. # CLEANUP #
  494. #----------------------------------------------------------#
  495. @test "User: Delete test user" {
  496. run v-delete-user $user
  497. assert_success
  498. refute_output
  499. }
  500. @test "Ip: Delete the test IP" {
  501. run v-delete-sys-ip $ip
  502. assert_success
  503. refute_output
  504. }
  505. @test "Ip: Delete 2nd test IP" {
  506. run v-delete-sys-ip $ip2
  507. assert_success
  508. refute_output
  509. }
  510. @test 'assert()' {
  511. touch '/var/log/test.log'
  512. assert [ -e '/var/log/test.log' ]
  513. }