353 Commits

Author SHA1 Message Date
9bc3fc5474 chore(deps): update node.js to v25
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-24 00:41:41 +00:00
6baefd65bc fix: remove the notion of ip restriction
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2026-03-23 21:23:44 +01:00
acd27e9a9e feat: can allow multiple networks at once in an api token
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-23 21:21:33 +01:00
ec42dc3d41 chore: upgrade drone to Node v24
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-23 21:04:29 +01:00
2224f24ade fix: restore buildLoading and buildError in AsyncWidget
All checks were successful
continuous-integration/drone/push Build is passing
2026-03-23 21:03:15 +01:00
69e177ecae fix: eslint issues
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-23 20:56:55 +01:00
9d5e35eaa0 fix: eslint issues 2026-03-23 20:43:09 +01:00
4c5b428f1a chore: updated base frontend dependencies 2026-03-23 19:09:17 +01:00
7b25388a60 chore: updated backend dependencies 2026-03-23 19:04:14 +01:00
a173d2cae9 Merge pull request 'Update dependency yaml to ^2.8.3' (#510) from renovate/yaml-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-23 00:39:37 +00:00
dfdfdca205 Update dependency yaml to ^2.8.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-22 00:40:16 +00:00
47dcb9fe68 Merge pull request 'Update Rust crate futures to 0.3.32' (#509) from renovate/futures-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-21 00:33:58 +00:00
996be30782 Update Rust crate futures to 0.3.32
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-20 00:33:41 +00:00
12957c0c07 Merge pull request 'Update Rust crate env_logger to 0.11.9' (#508) from renovate/env_logger-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-18 00:35:10 +00:00
5f8a69d2be Update Rust crate env_logger to 0.11.9
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-17 00:33:34 +00:00
7f247755ca Merge pull request 'Update materialui to ^7.3.9' (#507) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-16 00:36:35 +00:00
13d8f839f8 Update materialui to ^7.3.9
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-15 00:37:47 +00:00
9e11435f20 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.5' (#506) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-14 00:40:55 +00:00
c1e382c4c8 Update dependency @mui/x-data-grid to ^8.27.5
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-13 00:35:01 +00:00
421e12f3f9 Merge pull request 'Update dependency eslint to ^9.39.4' (#505) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-12 00:42:14 +00:00
226004163b Update dependency eslint to ^9.39.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-11 00:26:09 +00:00
1ee6ffad16 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.4' (#504) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-10 00:21:41 +00:00
e8ad408b5c Update dependency @mui/x-data-grid to ^8.27.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-09 00:22:39 +00:00
acf60e64e5 Merge pull request 'Update dependency @eslint/js to ^9.39.4' (#503) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-08 00:21:42 +00:00
b1ef6ecde7 Update dependency @eslint/js to ^9.39.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-07 00:27:31 +00:00
0e0c94bb73 Merge pull request 'Update Rust crate chrono to 0.4.44' (#502) from renovate/chrono-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-06 00:22:26 +00:00
28b757fdb2 Update Rust crate chrono to 0.4.44
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-05 00:22:23 +00:00
8542ebff44 Merge pull request 'Update Rust crate anyhow to 1.0.102' (#501) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-04 00:26:14 +00:00
c01d322675 Update Rust crate anyhow to 1.0.102
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-03 00:25:30 +00:00
dd3ebce19f Merge pull request 'Update dependency eslint to ^9.39.3' (#500) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-03-02 00:26:40 +00:00
203fd18ea7 Update dependency eslint to ^9.39.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-03-01 00:25:54 +00:00
9995dc0607 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.3' (#499) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-28 00:20:57 +00:00
bec3b30221 Update dependency @mui/x-data-grid to ^8.27.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-27 00:19:37 +00:00
aa3cdc5c76 Merge pull request 'Update dependency @fontsource/roboto to ^5.2.10' (#498) from renovate/fontsource-roboto-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-26 00:20:04 +00:00
304cc9f12a Update dependency @fontsource/roboto to ^5.2.10
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-24 00:20:23 +00:00
b63cdcab6a Merge pull request 'Update dependency @eslint/js to ^9.39.3' (#497) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-23 00:20:23 +00:00
11dcc29628 Update dependency @eslint/js to ^9.39.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-22 00:21:30 +00:00
20ed46d917 Merge pull request 'Update materialui to ^7.3.8' (#496) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-21 00:22:34 +00:00
25d918d74e Update materialui to ^7.3.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-20 00:23:45 +00:00
963e9e950e Merge pull request 'Update dependency monaco-yaml to ^5.4.1' (#495) from renovate/monaco-yaml-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-19 00:25:46 +00:00
2aa07be0e2 Update dependency monaco-yaml to ^5.4.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-18 00:34:41 +00:00
f915acaac1 Merge pull request 'Update dependency @types/react to ^19.2.14' (#494) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-17 00:35:24 +00:00
76a88a5884 Update dependency @types/react to ^19.2.14
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-16 00:33:47 +00:00
702e8ba4fb Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.1' (#493) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-15 00:34:34 +00:00
6dd093502e Update dependency @mui/x-data-grid to ^8.27.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-14 00:35:28 +00:00
d5c504de36 Merge pull request 'Update Rust crate anyhow to 1.0.101' (#492) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-13 00:35:44 +00:00
8dffc4db46 Update Rust crate anyhow to 1.0.101
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-10 00:33:20 +00:00
42c8c70609 Merge pull request 'Update Rust crate actix-files to 0.6.10' (#491) from renovate/actix-files-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-09 00:33:44 +00:00
d76a94e8e4 Update Rust crate actix-files to 0.6.10
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-08 00:33:45 +00:00
31972b5f84 Merge pull request 'Update dependency @types/react to ^19.2.13' (#490) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-07 00:32:59 +00:00
8e813f33ec Update dependency @types/react to ^19.2.13
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-06 00:32:47 +00:00
3f9858c4c1 Merge pull request 'Update dependency @mui/x-data-grid to ^8.27.0' (#489) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-04 00:32:42 +00:00
c8aeaaf823 Update dependency @mui/x-data-grid to ^8.27.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-03 00:31:45 +00:00
ff5a1c7509 Merge pull request 'Update dependency @mui/x-data-grid to ^8.26.0' (#488) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-02-02 00:32:46 +00:00
82cf328217 Update dependency @mui/x-data-grid to ^8.26.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-02-01 00:31:48 +00:00
6e120262bb Merge pull request 'Update Rust crate clap to 4.5.56' (#487) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-31 00:33:22 +00:00
077f35d340 Update Rust crate clap to 4.5.56
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-30 00:34:37 +00:00
e4da5f77c6 Merge pull request 'Update react' (#486) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-29 00:33:51 +00:00
b10eb4ce30 Update react
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-28 00:34:07 +00:00
958e3c6964 Merge pull request 'Update Rust crate tokio to 1.49.0' (#485) from renovate/tokio-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-26 00:32:39 +00:00
4dee0d6f46 Update Rust crate tokio to 1.49.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-25 00:33:45 +00:00
1942248a09 Merge pull request 'Update Rust crate thiserror to 2.0.18' (#484) from renovate/thiserror-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-24 00:32:19 +00:00
19ab088892 Update Rust crate thiserror to 2.0.18
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-23 00:32:56 +00:00
1825373013 Merge pull request 'Update dependency @types/react to ^19.2.9' (#483) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-22 00:33:35 +00:00
1166cc29dd Update dependency @types/react to ^19.2.9
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-21 00:26:55 +00:00
d1405a9674 Merge pull request 'Update Rust crate chrono to 0.4.43' (#482) from renovate/chrono-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-20 00:18:47 +00:00
9c8fe8c685 Update Rust crate chrono to 0.4.43
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-19 00:18:00 +00:00
49384e3a19 Merge pull request 'Update Rust crate actix-web to 4.12.1' (#481) from renovate/actix-web-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-18 00:18:54 +00:00
17fdea7d84 Update Rust crate actix-web to 4.12.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-17 00:17:40 +00:00
3e91596048 Merge pull request 'Update Rust crate actix-ws to 0.3.1' (#480) from renovate/actix-ws-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-16 00:36:37 +00:00
b4161bad75 Update Rust crate actix-ws to 0.3.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-15 00:44:14 +00:00
1e6fc3f143 Merge pull request 'Update Rust crate url to 2.5.8' (#479) from renovate/url-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-14 00:42:35 +00:00
3442a4c8a8 Update Rust crate url to 2.5.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-13 00:32:52 +00:00
853ed1e681 Merge pull request 'Update dependency @types/react to ^19.2.8' (#478) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-12 00:32:51 +00:00
19ad6631f6 Update dependency @types/react to ^19.2.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-11 00:31:55 +00:00
ba59eee1c2 Merge pull request 'Update materialui to ^7.3.7' (#477) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-10 00:32:41 +00:00
19bc0bdf8d Update materialui to ^7.3.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-09 00:28:38 +00:00
ba4e584f7f Merge pull request 'Update Rust crate serde_json to 1.0.149' (#476) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-08 00:29:11 +00:00
d4eed4a687 Update Rust crate serde_json to 1.0.149
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-07 00:29:12 +00:00
ccd81d1de3 Merge pull request 'Update Rust crate clap to 4.5.54' (#475) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-06 00:29:58 +00:00
35e4c35099 Update Rust crate clap to 4.5.54
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-05 00:30:24 +00:00
3fac1b465c Merge pull request 'Update dependency @mui/x-data-grid to ^8.23.0' (#474) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-31 00:40:00 +00:00
a532874ac1 Update dependency @mui/x-data-grid to ^8.23.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-30 00:41:00 +00:00
45cea25e08 Merge pull request 'Update Rust crate serde_json to 1.0.148' (#473) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-29 00:39:01 +00:00
0370665a93 Update Rust crate serde_json to 1.0.148
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-28 00:37:15 +00:00
1321684c4a Merge pull request 'Update Rust crate reqwest to 0.12.28' (#472) from renovate/reqwest-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-25 00:39:10 +00:00
1b7da8a834 Update Rust crate reqwest to 0.12.28
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-24 00:40:03 +00:00
f58571abbb Merge pull request 'Update Rust crate quick-xml to 0.38.4' (#471) from renovate/quick-xml-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-23 00:36:52 +00:00
53757e625a Update Rust crate quick-xml to 0.38.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-22 00:37:43 +00:00
2d5ef6ef6b Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.26' (#470) from renovate/eslint-plugin-react-refresh-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-21 00:37:05 +00:00
a2fbee6225 Update dependency eslint-plugin-react-refresh to ^0.4.26
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-20 00:34:47 +00:00
90ab157ed0 Merge pull request 'Update dependency eslint to ^9.39.2' (#469) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-19 00:37:58 +00:00
ef436a1f8d Update dependency eslint to ^9.39.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-18 00:38:04 +00:00
1ee35daf75 Merge pull request 'Update dependency @eslint/js to ^9.39.2' (#468) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-17 00:36:29 +00:00
321bbcca24 Update dependency @eslint/js to ^9.39.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-16 00:37:04 +00:00
2326db3515 Merge pull request 'Update react to ^19.2.3' (#467) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-13 00:36:27 +00:00
2579a91dab Update react to ^19.2.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-12 00:38:32 +00:00
e2a9e55ce5 Merge pull request 'Update dependency humanize-duration to ^3.33.2' (#466) from renovate/humanize-duration-3.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-10 00:38:01 +00:00
e0c11e55c0 Update dependency humanize-duration to ^3.33.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-09 00:37:13 +00:00
abd2f5e81b Merge pull request 'Update react to ^19.2.1' (#465) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-08 00:36:14 +00:00
b2d85e8794 Update react to ^19.2.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-07 00:36:53 +00:00
d07b6a12e6 Merge pull request 'Update materialui to ^7.3.6' (#464) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-06 00:36:33 +00:00
2159fd54ce Update materialui to ^7.3.6
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-05 00:23:47 +00:00
dc65fadb2b Merge pull request 'Update Rust crate log to 0.4.29' (#463) from renovate/log-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-04 00:22:47 +00:00
875d0609dd Update Rust crate log to 0.4.29
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-03 00:21:33 +00:00
0de5e7e817 Merge pull request 'Update dependency yaml to ^2.8.2' (#462) from renovate/yaml-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-12-02 00:19:43 +00:00
ae1f4e1b0a Update dependency yaml to ^2.8.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-01 00:20:08 +00:00
70a0f000c8 Merge pull request 'Update Rust crate actix-files to 0.6.9' (#461) from renovate/actix-files-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-30 00:19:55 +00:00
2743eb8ea4 Update Rust crate actix-files to 0.6.9
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-29 00:21:14 +00:00
42303a7703 Merge pull request 'Update dependency @types/react to ^19.2.7' (#460) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-28 00:19:58 +00:00
d835abb644 Update dependency @types/react to ^19.2.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-27 00:22:15 +00:00
0ecab34713 Merge pull request 'Update dependency @fontsource/roboto to ^5.2.9' (#459) from renovate/fontsource-roboto-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-26 00:15:12 +00:00
89e906ce13 Update dependency @fontsource/roboto to ^5.2.9
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-25 00:14:51 +00:00
f3e7191995 Merge pull request 'Update Rust crate image to 0.25.9' (#458) from renovate/image-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-24 00:15:32 +00:00
87b6ecedb6 Update Rust crate image to 0.25.9
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-23 00:18:20 +00:00
97b158bb46 Merge pull request 'Update Rust crate clap to 4.5.53' (#457) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-22 00:15:17 +00:00
0c3bac4acf Update Rust crate clap to 4.5.53
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-21 00:20:46 +00:00
f02b6456b6 Merge pull request 'Update dependency @types/react to ^19.2.6' (#456) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-20 00:16:54 +00:00
623346a79d Update dependency @types/react to ^19.2.6
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-19 00:14:53 +00:00
264e40ea71 Merge pull request 'Update dependency react-router-dom to ^7.9.6' (#455) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-18 00:17:13 +00:00
5e0125656e Update dependency react-router-dom to ^7.9.6
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-17 00:15:10 +00:00
88e1f79bb5 Merge pull request 'Update react' (#454) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-16 00:16:06 +00:00
396a47f032 Update react
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-15 00:15:36 +00:00
87f4f27c95 Merge pull request 'Update dependency eslint to ^9.39.1' (#453) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-12 00:17:25 +00:00
8eee7356df Update dependency eslint to ^9.39.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-11 00:20:48 +00:00
a42a686be8 Merge pull request 'Update dependency @mui/x-data-grid to ^8.17.0' (#452) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-10 00:17:24 +00:00
5aa51bb984 Update dependency @mui/x-data-grid to ^8.17.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-09 00:19:22 +00:00
9b92df795d Merge pull request 'Update dependency @eslint/js to ^9.39.1' (#451) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-08 00:15:06 +00:00
66ba6ff2a6 Update dependency @eslint/js to ^9.39.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-07 00:17:13 +00:00
f7f903334d Merge pull request 'Update materialui to ^7.3.5' (#450) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-06 00:17:53 +00:00
42d659a381 Update materialui to ^7.3.5
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-05 00:17:24 +00:00
6241567a04 Merge pull request 'Update Rust crate lazy-regex to 3.4.2' (#449) from renovate/lazy-regex-3.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-04 00:20:25 +00:00
6036603c79 Update Rust crate lazy-regex to 3.4.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-03 00:15:56 +00:00
0b3f6131cc Merge pull request 'Update Rust crate clap to 4.5.51' (#448) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-11-02 00:15:52 +00:00
3c3e15085a Update Rust crate clap to 4.5.51
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-11-01 00:16:24 +00:00
9f60154705 Merge pull request 'Update dependency react-router-dom to ^7.9.5' (#447) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-31 00:43:19 +00:00
19cbb45eba Update dependency react-router-dom to ^7.9.5
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-30 00:43:29 +00:00
aad1030058 Merge pull request 'Update Rust crate thiserror to 2.0.17' (#446) from renovate/thiserror-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-29 00:42:40 +00:00
ee4b983a50 Update Rust crate thiserror to 2.0.17
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-28 00:53:46 +00:00
5a2df5af96 Merge pull request 'Update Rust crate reqwest to 0.12.24' (#445) from renovate/reqwest-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-27 00:43:47 +00:00
7ad8b6699b Update Rust crate reqwest to 0.12.24
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-26 00:44:29 +00:00
30ab971071 Merge pull request 'Update Rust crate clap to 4.5.50' (#444) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-25 00:43:08 +00:00
2012b56319 Update Rust crate clap to 4.5.50
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-24 00:43:54 +00:00
c2b479aee4 Merge pull request 'Update Rust crate anyhow to 1.0.100' (#443) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-23 00:42:51 +00:00
188297ab1b Update Rust crate anyhow to 1.0.100
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-22 00:43:44 +00:00
869e343631 Merge pull request 'Update Rust crate actix-http to 3.11.2' (#442) from renovate/actix-http-3.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-21 00:44:08 +00:00
c326115b5f Update Rust crate actix-http to 3.11.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-20 00:41:59 +00:00
ef4cd6e03a Merge pull request 'Update Rust crate actix-files to 0.6.8' (#441) from renovate/actix-files-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-19 00:43:02 +00:00
8ac39a06c2 Update Rust crate actix-files to 0.6.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-18 00:43:03 +00:00
823b8a1a15 Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.24' (#440) from renovate/eslint-plugin-react-refresh-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-17 00:42:39 +00:00
468d8b9a29 Update dependency eslint-plugin-react-refresh to ^0.4.24
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-16 00:43:39 +00:00
ae216753f5 Merge pull request 'Update react to ^19.2.2' (#439) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-15 01:13:22 +00:00
4cd7fc7059 Update react to ^19.2.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-14 00:44:27 +00:00
c70b47638c Merge pull request 'Update materialui to ^7.3.4' (#438) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-13 00:43:53 +00:00
a96af60852 Update materialui to ^7.3.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-12 00:42:04 +00:00
b03ac3daa7 Merge pull request 'Update dependency react-router-dom to ^7.9.4' (#437) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-11 00:41:54 +00:00
a7b13d74c2 Update dependency react-router-dom to ^7.9.4
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-10 00:41:02 +00:00
e7e16e3758 Merge pull request 'Update dependency typescript to ^5.9.3' (#436) from renovate/typescript-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-09 00:18:11 +00:00
73f88a4816 Update dependency typescript to ^5.9.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-08 00:17:41 +00:00
2dadbac31d Merge pull request 'Update dependency react-router-dom to ^7.9.3' (#435) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-07 00:18:07 +00:00
ad0552b421 Update dependency react-router-dom to ^7.9.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-06 00:19:32 +00:00
c1addcea20 Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.23' (#434) from renovate/eslint-plugin-react-refresh-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-05 00:20:06 +00:00
247e017334 Update dependency eslint-plugin-react-refresh to ^0.4.23
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-04 00:42:25 +00:00
8355baf861 Merge pull request 'Update react to ^19.2.0' (#433) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-03 00:43:08 +00:00
d3d6957b0a Update react to ^19.2.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-02 00:42:20 +00:00
d483b1ccc5 Merge pull request 'Update dependency @types/react to ^19.1.15' (#432) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-30 00:40:37 +00:00
0dc4778c15 Update dependency @types/react to ^19.1.15
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-29 00:41:20 +00:00
a22f1b850a Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.22' (#430) from renovate/eslint-plugin-react-refresh-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-27 00:42:38 +00:00
0564209def Update dependency eslint-plugin-react-refresh to ^0.4.22
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-26 00:41:01 +00:00
bea031ad2d Merge pull request 'Update dependency react-router-dom to ^7.9.1' (#428) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-24 00:47:13 +00:00
042540a82e Update dependency react-router-dom to ^7.9.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-22 00:46:41 +00:00
b15230ab1f Merge pull request 'Update dependency humanize-duration to ^3.33.1' (#427) from renovate/humanize-duration-3.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-21 00:47:01 +00:00
916652ed8c Merge pull request 'Update dependency eslint-plugin-react-x to ^1.53.1' (#426) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-21 00:46:56 +00:00
063286f038 Update dependency humanize-duration to ^3.33.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-20 00:43:12 +00:00
78e2326a37 Update dependency eslint-plugin-react-x to ^1.53.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-20 00:43:10 +00:00
23f21b3a40 Merge pull request 'Update dependency @mui/x-data-grid to ^8.11.3' (#425) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-19 00:41:00 +00:00
9433695222 Merge pull request 'Update dependency @fontsource/roboto to ^5.2.8' (#424) from renovate/fontsource-roboto-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-19 00:40:53 +00:00
c957de60db Update dependency @mui/x-data-grid to ^8.11.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-18 00:42:10 +00:00
d105cb7255 Update dependency @fontsource/roboto to ^5.2.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-18 00:42:08 +00:00
1af7e5ec55 Merge pull request 'Update Rust crate serde_json to 1.0.145' (#423) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-17 00:41:38 +00:00
7e539f0e4a Merge pull request 'Update dependency @fontsource/roboto to ^5.2.7' (#422) from renovate/fontsource-roboto-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-17 00:41:33 +00:00
c47ebc0504 Update Rust crate serde_json to 1.0.145
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-16 00:41:42 +00:00
29118fb7cd Update dependency @fontsource/roboto to ^5.2.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-16 00:41:35 +00:00
0ec546fa63 Merge pull request 'Update dependency typescript-eslint to ^8.43.0' (#421) from renovate/typescript-eslint-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-15 00:41:43 +00:00
4861b97bf8 Update dependency typescript-eslint to ^8.43.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-14 00:42:24 +00:00
bc8093faf1 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.53.1' (#420) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-13 00:42:40 +00:00
97933d72f9 Update dependency eslint-plugin-react-dom to ^1.53.1
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-13 00:42:36 +00:00
554edbf84c Merge pull request 'Update dependency @types/react to ^19.1.13' (#419) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-13 00:42:23 +00:00
650a97c836 Update dependency @types/react to ^19.1.13
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-13 00:42:20 +00:00
ff24b10507 Merge pull request 'Update dependency eslint to ^9.35.0' (#418) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-12 00:41:38 +00:00
7cbd5a5bbf Update dependency eslint to ^9.35.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-12 00:41:37 +00:00
f55cff054c Merge pull request 'Update dependency @mui/x-data-grid to ^8.11.2' (#417) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-12 00:41:35 +00:00
a6dd100eb6 Update dependency @mui/x-data-grid to ^8.11.2
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-12 00:41:32 +00:00
8b4b17083d Merge pull request 'Update Rust crate virt to 0.4.3' (#416) from renovate/virt-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-11 00:40:05 +00:00
7dafca91d4 Merge pull request 'Update Rust crate chrono to 0.4.42' (#415) from renovate/chrono-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-11 00:40:04 +00:00
8dfc166033 Update Rust crate virt to 0.4.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-10 00:40:23 +00:00
6f70ddef8c Update Rust crate chrono to 0.4.42
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-10 00:40:20 +00:00
809e3c9d4e Merge pull request 'Update dependency vite to ^6.3.6' (#414) from renovate/vite-6.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-09 00:40:41 +00:00
e6a86b0097 Update dependency vite to ^6.3.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-09 00:40:30 +00:00
c12f916a94 Merge pull request 'Update dependency @eslint/js to ^9.35.0' (#413) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-08 00:41:31 +00:00
2c9a2e1ac0 Update dependency @eslint/js to ^9.35.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-08 00:41:28 +00:00
99b25fb97e Merge pull request 'Update Rust crate log to 0.4.28' (#412) from renovate/log-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-07 00:41:37 +00:00
ab5f9e1105 Merge pull request 'Update Rust crate image to 0.25.8' (#411) from renovate/image-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-07 00:41:37 +00:00
a867fa311d Update Rust crate log to 0.4.28
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-06 00:41:33 +00:00
5461968282 Update Rust crate image to 0.25.8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-06 00:41:31 +00:00
a5af85057f Merge pull request 'Update Rust crate clap to 4.5.47' (#410) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-05 00:27:14 +00:00
79c349ff66 Merge pull request 'Update Rust crate actix-http to 3.11.1' (#409) from renovate/actix-http-3.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-05 00:27:13 +00:00
ced0e4517d Update Rust crate clap to 4.5.47
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-04 00:34:38 +00:00
d0c9c01d63 Update Rust crate actix-http to 3.11.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-04 00:34:36 +00:00
04400ec31e Merge pull request 'Update Rust crate quick-xml to 0.38.3' (#408) from renovate/quick-xml-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-03 00:33:16 +00:00
85785d3568 Merge pull request 'Update Rust crate actix-files to 0.6.7' (#407) from renovate/actix-files-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-03 00:33:13 +00:00
8c5814307b Update Rust crate quick-xml to 0.38.3
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-02 00:33:20 +00:00
e2d4b1e3b1 Update Rust crate actix-files to 0.6.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-02 00:33:17 +00:00
550e094efe Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.9' (#406) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-09-01 00:32:07 +00:00
94533e7e71 Update dependency eslint-plugin-react-x to ^1.52.9
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-09-01 00:32:02 +00:00
5cb9bbbc89 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.9' (#405) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-31 00:32:45 +00:00
f7da80f4c0 Update dependency eslint-plugin-react-dom to ^1.52.9
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-31 00:32:42 +00:00
64d095ec5e Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.8' (#404) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-30 00:31:47 +00:00
5c6caf150e Update dependency eslint-plugin-react-dom to ^1.52.8
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-30 00:31:43 +00:00
43c09bb0ff Merge pull request 'Update dependency @types/react-dom to ^19.1.9' (#403) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-29 00:33:21 +00:00
93dbad2f41 Update dependency @types/react-dom to ^19.1.9
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-29 00:33:20 +00:00
a1e23efd99 Fix cargo clippy issues
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-28 08:05:22 +02:00
cd4b8af445 Merge pull request 'Update dependency @types/react to ^19.1.12' (#402) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-28 00:33:29 +00:00
3c2470e942 Update dependency @types/react to ^19.1.12
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-28 00:33:26 +00:00
de3a1aab1b Merge pull request 'Update dependency @types/react-dom to ^19.1.8' (#401) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-27 00:33:15 +00:00
0149f93721 Update dependency @types/react-dom to ^19.1.8
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-27 00:33:12 +00:00
8daba3e92f Merge pull request 'Update dependency react-syntax-highlighter to ^15.6.6' (#400) from renovate/react-syntax-highlighter-15.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-26 00:31:59 +00:00
8127bfbdbf Update dependency react-syntax-highlighter to ^15.6.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-26 00:31:55 +00:00
7cb9a97025 Merge pull request 'Update Rust crate url to 2.5.7' (#399) from renovate/url-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-25 00:31:48 +00:00
a2fa115e38 Merge pull request 'Update Rust crate thiserror to 2.0.16' (#398) from renovate/thiserror-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-25 00:31:45 +00:00
b8be645121 Update Rust crate url to 2.5.7
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-24 00:31:39 +00:00
456ffbe062 Update Rust crate thiserror to 2.0.16
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-24 00:31:37 +00:00
5cdd8ba0c5 Merge pull request 'Update dependency @types/react to ^19.1.11' (#397) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-23 00:32:42 +00:00
1e2d499794 Update dependency @types/react to ^19.1.11
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-23 00:32:39 +00:00
144c9af8c7 Merge pull request 'Update dependency react-syntax-highlighter to ^15.6.3' (#396) from renovate/react-syntax-highlighter-15.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-22 00:32:09 +00:00
b7d56880ff Update dependency react-syntax-highlighter to ^15.6.3
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-22 00:32:05 +00:00
20d55be54f Merge pull request 'Update Rust crate serde_json to 1.0.143' (#395) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-21 00:32:49 +00:00
920ee5d636 Merge pull request 'Update Rust crate quick-xml to 0.38.2' (#394) from renovate/quick-xml-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-21 00:32:46 +00:00
1cb4700ac1 Update Rust crate serde_json to 1.0.143
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-20 00:32:16 +00:00
46de03bcc4 Update Rust crate quick-xml to 0.38.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-20 00:32:13 +00:00
8b96d4f0ab Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.6' (#393) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-19 00:32:29 +00:00
48042e2b59 Update dependency eslint-plugin-react-x to ^1.52.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-19 00:32:26 +00:00
b2d6f92d47 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.6' (#392) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-19 00:32:23 +00:00
063a7fc830 Update dependency eslint-plugin-react-dom to ^1.52.6
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-19 00:32:21 +00:00
0c12822567 Merge pull request 'Update Rust crate thiserror to 2.0.15' (#391) from renovate/thiserror-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-18 00:31:11 +00:00
38f0ac840b Merge pull request 'Update Rust crate reqwest to 0.12.23' (#390) from renovate/reqwest-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-18 00:31:11 +00:00
8db4fd740d Update Rust crate thiserror to 2.0.15
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-17 00:32:46 +00:00
456ab796b3 Update Rust crate reqwest to 0.12.23
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-17 00:32:43 +00:00
2fbc5b04a3 Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.5' (#389) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-16 00:31:14 +00:00
5c2aa39196 Update dependency eslint-plugin-react-x to ^1.52.5
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-16 00:31:13 +00:00
513bda8fe7 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.5' (#388) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-16 00:31:11 +00:00
48b4e4bb2f Update dependency eslint-plugin-react-dom to ^1.52.5
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-16 00:31:06 +00:00
e7cb217e5f Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.4' (#387) from renovate/eslint-plugin-react-x-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-15 00:32:50 +00:00
a672645225 Update dependency eslint-plugin-react-x to ^1.52.4
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-15 00:32:47 +00:00
3428b5b457 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.4' (#386) from renovate/eslint-plugin-react-dom-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-15 00:32:45 +00:00
15eabf7c66 Update dependency eslint-plugin-react-dom to ^1.52.4
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-15 00:32:43 +00:00
8df6b549ac Merge pull request 'Update Rust crate clap to 4.5.45' (#385) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-14 00:32:20 +00:00
39a896ea20 Merge pull request 'Update Rust crate anyhow to 1.0.99' (#384) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-14 00:32:19 +00:00
acc6c680d4 Update Rust crate clap to 4.5.45
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-13 00:32:59 +00:00
3fd9f7cff8 Update Rust crate anyhow to 1.0.99
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-13 00:32:57 +00:00
a672329501 Merge pull request 'Update dependency @types/react to ^19.1.10' (#383) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-12 00:32:02 +00:00
5f119688a3 Update dependency @types/react to ^19.1.10
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-12 00:31:58 +00:00
dbf7cc7cac Merge pull request 'Update materialui to ^7.3.1' (#382) from renovate/materialui into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-11 00:32:19 +00:00
6198a8284e Update materialui to ^7.3.1
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-11 00:32:16 +00:00
f0547dd9cc Merge pull request 'Update dependency eslint to ^9.33.0' (#381) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-10 00:31:14 +00:00
fbc2b6fe2a Update dependency eslint to ^9.33.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-10 00:31:11 +00:00
2e3059dad6 Merge pull request 'Update dependency @mui/x-data-grid to ^8.10.0' (#380) from renovate/mui-x-data-grid-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-09 00:31:50 +00:00
c00668f174 Update dependency @mui/x-data-grid to ^8.10.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-09 00:31:48 +00:00
55b74becdc Merge pull request 'Update dependency @eslint/js to ^9.33.0' (#379) from renovate/eslint-js-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-09 00:31:41 +00:00
d2ca41c59d Update dependency @eslint/js to ^9.33.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-09 00:31:38 +00:00
4df1f413a4 Merge pull request 'Update dependency @types/jest to v30' (#378) from renovate/major-jest-monorepo into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-08 00:19:57 +00:00
3937d6d5de Merge pull request 'Update dependency react-router-dom to ^7.8.0' (#377) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-08 00:19:54 +00:00
9d2667bba3 Update dependency react-router-dom to ^7.8.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-08 00:19:52 +00:00
803f063d64 Update dependency @types/jest to v30
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-07 00:20:40 +00:00
f323d54c18 Merge pull request 'Update Rust crate zip to 4.3.0' (#376) from renovate/zip-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-07 00:20:30 +00:00
ad3fad44e5 Merge pull request 'Update dependency yaml to ^2.8.1' (#375) from renovate/yaml-2.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-07 00:20:26 +00:00
fc975a5156 Update Rust crate zip to 4.3.0
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-08-06 00:19:43 +00:00
064e5dfef5 Update dependency yaml to ^2.8.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-06 00:19:32 +00:00
6a3a24f724 Merge pull request 'Update Rust crate quick-xml to 0.38.1' (#374) from renovate/quick-xml-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-06 00:19:25 +00:00
8bdc7a11ef Update Rust crate quick-xml to 0.38.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-05 00:19:29 +00:00
2d2602f0f8 Merge pull request 'Update Rust crate tokio to 1.47.1' (#324) from renovate/tokio-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-05 00:19:22 +00:00
095d6d827f Update Rust crate tokio to 1.47.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-04 00:20:18 +00:00
c810c612de Merge pull request 'Update dependency typescript to ^5.9.2' (#373) from renovate/typescript-5.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-03 00:22:45 +00:00
dbcfd527b8 Update dependency typescript to ^5.9.2
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-08-03 00:22:39 +00:00
117c79c855 Merge pull request 'Update Rust crate serde_json to 1.0.142' (#372) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-03 00:22:29 +00:00
8b083e8e26 Update Rust crate serde_json to 1.0.142
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-02 00:21:27 +00:00
32f805aa3f Merge pull request 'Update dependency @mui/x-data-grid to ^8.9.2' (#371) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-02 00:21:19 +00:00
50ec6ecd9f Update dependency @mui/x-data-grid to ^8.9.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-01 00:24:12 +00:00
d3834ff7f7 Merge pull request 'Update Rust crate clap to 4.5.42' (#370) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-01 00:24:05 +00:00
64d8420cee Update Rust crate clap to 4.5.42
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-31 00:19:24 +00:00
796cf757d4 Merge pull request 'Update react' (#369) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-31 00:19:17 +00:00
4bb4f65d48 Update react
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-30 00:18:34 +00:00
5b916ec5a9 Merge pull request 'Update dependency @eslint/js to ^9.32.0' (#335) from renovate/eslint-js-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-30 00:18:28 +00:00
c5e43c7fbf Update dependency @eslint/js to ^9.32.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-29 00:22:19 +00:00
807dfc6635 Merge pull request 'Update Rust crate uuid to 1.17.0' (#368) from renovate/uuid-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-28 00:20:51 +00:00
4e1a2dcdba Update Rust crate uuid to 1.17.0
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-28 00:20:50 +00:00
843e53e83a Merge pull request 'Update Rust crate sysinfo to 0.36.1' (#367) from renovate/sysinfo-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-27 00:20:20 +00:00
5f911e6fb4 Update Rust crate sysinfo to 0.36.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-27 00:20:16 +00:00
6c42cd62df Merge pull request 'Update dependency eslint to ^9.32.0' (#366) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-26 00:20:00 +00:00
a4a4954344 Update dependency eslint to ^9.32.0
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-26 00:19:58 +00:00
5d20081fca Merge pull request 'Update dependency react-router-dom to ^7.7.1' (#365) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-25 00:20:51 +00:00
f46abedd1a Update dependency react-router-dom to ^7.7.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-25 00:20:48 +00:00
0548e480b4 Merge pull request 'Update Rust crate quick-xml to 0.38.0' (#364) from renovate/quick-xml-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 00:21:06 +00:00
6b9455f6ea Update Rust crate quick-xml to 0.38.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-24 00:21:04 +00:00
17108a52a3 Merge pull request 'Update dependency typescript-eslint to ^8.38.0' (#363) from renovate/typescript-eslint-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 00:20:29 +00:00
47ebc77458 Update dependency typescript-eslint to ^8.38.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-23 00:20:28 +00:00
87e57dea56 Merge pull request 'Update dependency @mui/x-data-grid to ^8.9.1' (#362) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-22 00:25:56 +00:00
24b4c02d9f Update dependency @mui/x-data-grid to ^8.9.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-22 00:25:42 +00:00
f2a3e16a1c Merge pull request 'Update Rust crate rand to 0.9.2' (#361) from renovate/rand-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-21 00:21:31 +00:00
6530a6d8e9 Update Rust crate rand to 0.9.2
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-21 00:21:29 +00:00
b741d79ba7 Merge pull request 'Update dependency @vitejs/plugin-react to ^4.7.0' (#360) from renovate/vitejs-plugin-react-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-20 00:18:51 +00:00
eeda3ca4ec Update dependency @vitejs/plugin-react to ^4.7.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-20 00:18:48 +00:00
992f91bb8a Merge pull request 'Update Rust crate serde_json to 1.0.141' (#359) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-19 00:22:33 +00:00
2f3ad231c7 Update Rust crate serde_json to 1.0.141
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-07-19 00:22:23 +00:00
6e41d3c6df Merge pull request 'Update materialui to ^7.2.0' (#358) from renovate/materialui into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-18 02:21:31 +00:00
f57f3f3c9a Update materialui to ^7.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-18 00:19:40 +00:00
34fda42766 Merge pull request 'Update dependency react-router-dom to ^7.7.0' (#357) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 02:41:12 +00:00
a9536f4091 Update dependency react-router-dom to ^7.7.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-17 00:19:55 +00:00
7770ad3ca7 Merge pull request 'Update dependency typescript-eslint to ^8.37.0' (#356) from renovate/typescript-eslint-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-16 02:28:11 +00:00
02b3373f51 Update dependency typescript-eslint to ^8.37.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-16 00:19:50 +00:00
5153af0618 Merge pull request 'Update dependency eslint to ^9.31.0' (#355) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-15 02:15:03 +00:00
d50c3a00a5 Update dependency eslint to ^9.31.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-15 00:19:02 +00:00
4618c2c081 Merge pull request 'Update dependency eslint-plugin-react-x to ^1.52.3' (#354) from renovate/eslint-plugin-react-x-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-14 02:12:21 +00:00
34d78085c8 Update dependency eslint-plugin-react-x to ^1.52.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-14 00:18:46 +00:00
0381b73635 Merge pull request 'Update dependency eslint-plugin-react-dom to ^1.52.3' (#353) from renovate/eslint-plugin-react-dom-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-13 02:20:28 +00:00
2e88529e3d Update dependency eslint-plugin-react-dom to ^1.52.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-13 00:18:37 +00:00
84e3f61902 Merge pull request 'Update dependency @mui/x-data-grid to ^8.8.0' (#352) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-12 02:35:41 +00:00
9623493aee Update dependency @mui/x-data-grid to ^8.8.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-12 00:18:58 +00:00
e5ad7d2fe4 Merge pull request 'Update dependency humanize-duration to ^3.33.0' (#351) from renovate/humanize-duration-3.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-11 02:28:44 +00:00
940179ffe5 Update dependency humanize-duration to ^3.33.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-11 00:19:12 +00:00
f7b27a527b Merge pull request 'Update Rust crate clap to 4.5.41' (#350) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-10 02:45:14 +00:00
caac7dc1bf Update Rust crate clap to 4.5.41
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-10 00:20:01 +00:00
a0f815534b Merge pull request 'Update dependency globals to ^16.3.0' (#349) from renovate/globals-16.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-09 02:31:14 +00:00
928c2c5cb4 Update dependency globals to ^16.3.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-09 00:19:18 +00:00
ddc8b65f8a Merge pull request 'Update dependency eslint to ^9.30.1' (#348) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-08 02:47:12 +00:00
0b67659efa Update dependency eslint to ^9.30.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-08 00:19:22 +00:00
0601d9cad9 Merge pull request 'Update dependency @mui/x-data-grid to ^8.7.0' (#347) from renovate/mui-x-data-grid-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-07 02:12:52 +00:00
a1b6ebd9f5 Update dependency @mui/x-data-grid to ^8.7.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-07 00:18:43 +00:00
b8eedaab51 Merge pull request 'Update Rust crate reqwest to 0.12.22' (#346) from renovate/reqwest-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-06 02:00:23 +00:00
0afc3252c6 Update Rust crate reqwest to 0.12.22
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-06 00:18:48 +00:00
685f1bc502 Merge pull request 'Update dependency react-router-dom to ^7.6.3' (#345) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-05 02:15:49 +00:00
3e642dd638 Update dependency react-router-dom to ^7.6.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-05 00:12:33 +00:00
22ad68e43e Update dependency @emotion/styled to ^11.14.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-04 00:12:22 +00:00
1dd86807fd Fix cargo clippy issues
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-03 08:01:36 +02:00
96747bda89 Update dependency eslint-plugin-react-x to ^1.52.2
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-06-26 00:12:11 +00:00
e15514dd4f Update dependency eslint-plugin-react-dom to ^1.52.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-25 00:12:04 +00:00
7556ee2c06 Update dependency @vitejs/plugin-react to ^4.6.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-24 00:14:13 +00:00
992a902590 Update dependency eslint to ^9.29.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-23 00:24:41 +00:00
100f12e7c1 Update dependency @vitejs/plugin-react to ^4.5.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-22 00:23:00 +00:00
3de66a5873 Fix a bug in sysinfo route with docker containers
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-21 19:06:43 +02:00
49360188f5 Update dependency @mui/x-data-grid to ^8.5.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-21 00:23:42 +00:00
35c48ba846 Update materialui to ^7.1.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-20 00:25:00 +00:00
1ad4262086 Update Rust crate sysinfo to 0.35.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-19 00:23:07 +00:00
51 changed files with 3841 additions and 2745 deletions

View File

@@ -5,13 +5,13 @@ name: default
steps: steps:
- name: web_build - name: web_build
image: node:23 image: node:25
volumes: volumes:
- name: web_app - name: web_app
path: /tmp/web_build path: /tmp/web_build
commands: commands:
- cd virtweb_frontend - cd virtweb_frontend
- npm install - npm install --legacy-peer-deps # TODO remove --legacy-peer-deps ASAP
- npm run lint - npm run lint
- npm run build - npm run build
- mv dist /tmp/web_build - mv dist /tmp/web_build

File diff suppressed because it is too large Load Diff

View File

@@ -6,44 +6,44 @@ edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
log = "0.4.27" log = "0.4.29"
env_logger = "0.11.8" env_logger = "0.11.10"
clap = { version = "4.5.40", features = ["derive", "env"] } clap = { version = "4.6.0", features = ["derive", "env"] }
light-openid = { version = "1.0.4", features = ["crypto-wrapper"] } light-openid = { version = "1.1.0", features = ["crypto-wrapper"] }
lazy_static = "1.5.0" lazy_static = "1.5.0"
actix = "0.13.5" actix = "0.13.5"
actix-web = "4.11.0" actix-web = "4.13.0"
actix-remote-ip = "0.1.0" actix-remote-ip = "1.0.0"
actix-session = { version = "0.10.1", features = ["cookie-session"] } actix-session = { version = "0.11.0", features = ["cookie-session"] }
actix-identity = "0.8.0" actix-identity = "0.9.0"
actix-cors = "0.7.1" actix-cors = "0.7.1"
actix-files = "0.6.6" actix-files = "0.6.10"
actix-ws = "0.3.0" actix-ws = "0.4.0"
actix-http = "3.11.0" actix-http = "3.12.0"
serde = { version = "1.0.219", features = ["derive"] } serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.140" serde_json = "1.0.149"
serde_yml = "0.0.12" serde_yml = "0.0.12"
quick-xml = { version = "0.37.5", features = ["serialize", "overlapped-lists"] } quick-xml = { version = "0.39.2", features = ["serialize", "overlapped-lists"] }
futures-util = "0.3.31" futures-util = "0.3.32"
anyhow = "1.0.98" anyhow = "1.0.102"
actix-multipart = "0.7.2" actix-multipart = "0.7.2"
tempfile = "3.20.0" tempfile = "3.27.0"
reqwest = { version = "0.12.20", features = ["stream"] } reqwest = { version = "0.13.2", features = ["stream"] }
url = "2.5.4" url = "2.5.8"
virt = "0.4.2" virt = "0.4.3"
sysinfo = { version = "0.35.1", features = ["serde"] } sysinfo = { version = "0.38.4", features = ["serde"] }
uuid = { version = "1.16.0", features = ["v4", "serde"] } uuid = { version = "1.22.0", features = ["v4", "serde"] }
lazy-regex = "3.4.1" lazy-regex = "3.6.0"
thiserror = "2.0.12" thiserror = "2.0.18"
image = "0.25.6" image = "0.25.10"
rand = "0.9.1" rand = "0.10.0"
tokio = { version = "1.45.0", features = ["rt", "time", "macros"] } tokio = { version = "1.50.0", features = ["rt", "time", "macros"] }
futures = "0.3.31" futures = "0.3.32"
ipnetwork = { version = "0.21.1", features = ["serde"] } ipnetwork = { version = "0.21.1", features = ["serde"] }
num = "0.4.3" num = "0.4.3"
rust-embed = { version = "8.7.2", features = ["mime-guess"] } rust-embed = { version = "8.11.0", features = ["mime-guess"] }
dotenvy = "0.15.7" dotenvy = "0.15.7"
nix = { version = "0.30.1", features = ["net"] } nix = { version = "0.31.2", features = ["net"] }
basic-jwt = "0.3.0" basic-jwt = "0.4.0"
zip = "4.1.0" zip = "8.4.0"
chrono = "0.4.41" chrono = "0.4.44"

View File

@@ -27,10 +27,7 @@ impl LibVirtActor {
/// Connect to hypervisor /// Connect to hypervisor
pub async fn connect() -> anyhow::Result<Self> { pub async fn connect() -> anyhow::Result<Self> {
let hypervisor_uri = AppConfig::get().hypervisor_uri.as_deref().unwrap_or(""); let hypervisor_uri = AppConfig::get().hypervisor_uri.as_deref().unwrap_or("");
log::info!( log::info!("Will connect to hypvervisor at address '{hypervisor_uri}'",);
"Will connect to hypvervisor at address '{}'",
hypervisor_uri
);
let conn = Connect::open(Some(hypervisor_uri))?; let conn = Connect::open(Some(hypervisor_uri))?;
Ok(Self { m: conn }) Ok(Self { m: conn })
@@ -102,7 +99,7 @@ impl Handler<GetDomainXMLReq> for LibVirtActor {
log::debug!("Get domain XML:\n{}", msg.0.as_string()); log::debug!("Get domain XML:\n{}", msg.0.as_string());
let domain = Domain::lookup_by_uuid_string(&self.m, &msg.0.as_string())?; let domain = Domain::lookup_by_uuid_string(&self.m, &msg.0.as_string())?;
let xml = domain.get_xml_desc(VIR_DOMAIN_XML_SECURE)?; let xml = domain.get_xml_desc(VIR_DOMAIN_XML_SECURE)?;
log::debug!("XML = {}", xml); log::debug!("XML = {xml}");
DomainXML::parse_xml(&xml) DomainXML::parse_xml(&xml)
} }
} }
@@ -131,7 +128,7 @@ impl Handler<DefineDomainReq> for LibVirtActor {
fn handle(&mut self, mut msg: DefineDomainReq, _ctx: &mut Self::Context) -> Self::Result { fn handle(&mut self, mut msg: DefineDomainReq, _ctx: &mut Self::Context) -> Self::Result {
let xml = msg.1.as_xml()?; let xml = msg.1.as_xml()?;
log::debug!("Define domain:\n{}", xml); log::debug!("Define domain:\n{xml}");
let domain = Domain::define_xml(&self.m, &xml)?; let domain = Domain::define_xml(&self.m, &xml)?;
let uuid = XMLUuid::parse_from_str(&domain.get_uuid_string()?)?; let uuid = XMLUuid::parse_from_str(&domain.get_uuid_string()?)?;
@@ -446,7 +443,7 @@ impl Handler<GetNetworkXMLReq> for LibVirtActor {
log::debug!("Get network XML:\n{}", msg.0.as_string()); log::debug!("Get network XML:\n{}", msg.0.as_string());
let network = Network::lookup_by_uuid_string(&self.m, &msg.0.as_string())?; let network = Network::lookup_by_uuid_string(&self.m, &msg.0.as_string())?;
let xml = network.get_xml_desc(0)?; let xml = network.get_xml_desc(0)?;
log::debug!("XML = {}", xml); log::debug!("XML = {xml}");
NetworkXML::parse_xml(&xml) NetworkXML::parse_xml(&xml)
} }
} }
@@ -602,7 +599,7 @@ impl Handler<GetNWFilterXMLReq> for LibVirtActor {
log::debug!("Get network filter XML:\n{}", msg.0.as_string()); log::debug!("Get network filter XML:\n{}", msg.0.as_string());
let filter = NWFilter::lookup_by_uuid_string(&self.m, &msg.0.as_string())?; let filter = NWFilter::lookup_by_uuid_string(&self.m, &msg.0.as_string())?;
let xml = filter.get_xml_desc(0)?; let xml = filter.get_xml_desc(0)?;
log::debug!("XML = {}", xml); log::debug!("XML = {xml}");
NetworkFilterXML::parse_xml(xml) NetworkFilterXML::parse_xml(xml)
} }
} }
@@ -617,7 +614,7 @@ impl Handler<DefineNWFilterReq> for LibVirtActor {
fn handle(&mut self, mut msg: DefineNWFilterReq, _ctx: &mut Self::Context) -> Self::Result { fn handle(&mut self, mut msg: DefineNWFilterReq, _ctx: &mut Self::Context) -> Self::Result {
let xml = msg.1.into_xml()?; let xml = msg.1.into_xml()?;
log::debug!("Define network filter:\n{}", xml); log::debug!("Define network filter:\n{xml}");
let filter = NWFilter::define_xml(&self.m, &xml)?; let filter = NWFilter::define_xml(&self.m, &xml)?;
let uuid = XMLUuid::parse_from_str(&filter.get_uuid_string()?)?; let uuid = XMLUuid::parse_from_str(&filter.get_uuid_string()?)?;

View File

@@ -83,7 +83,8 @@ pub struct Token {
pub pub_key: Option<JWTPublicKey>, pub pub_key: Option<JWTPublicKey>,
pub rights: TokenRights, pub rights: TokenRights,
pub last_used: u64, pub last_used: u64,
pub ip_restriction: Option<ipnetwork::IpNetwork>, #[serde(default, skip_serializing_if = "Vec::is_empty")]
pub allowed_ip_networks: Vec<ipnetwork::IpNetwork>,
pub max_inactivity: Option<u64>, pub max_inactivity: Option<u64>,
} }
@@ -104,10 +105,10 @@ impl Token {
/// Check whether a token is expired or not /// Check whether a token is expired or not
pub fn is_expired(&self) -> bool { pub fn is_expired(&self) -> bool {
if let Some(max_inactivity) = self.max_inactivity { if let Some(max_inactivity) = self.max_inactivity
if max_inactivity + self.last_used < time() { && max_inactivity + self.last_used < time()
return true; {
} return true;
} }
false false
@@ -161,7 +162,8 @@ pub struct NewToken {
pub name: String, pub name: String,
pub description: String, pub description: String,
pub rights: TokenRights, pub rights: TokenRights,
pub ip_restriction: Option<ipnetwork::IpNetwork>, #[serde(default, skip_serializing_if = "Vec::is_empty")]
pub allowed_ip_networks: Vec<ipnetwork::IpNetwork>,
pub max_inactivity: Option<u64>, pub max_inactivity: Option<u64>,
} }
@@ -188,10 +190,10 @@ impl NewToken {
return Some(err); return Some(err);
} }
if let Some(t) = self.max_inactivity { if let Some(t) = self.max_inactivity
if t < 3600 { && t < 3600
return Some("API tokens shall be valid for at least 1 hour!"); {
} return Some("API tokens shall be valid for at least 1 hour!");
} }
None None
@@ -212,7 +214,7 @@ pub async fn create(t: &NewToken) -> anyhow::Result<(Token, JWTPrivateKey)> {
pub_key: Some(pub_key), pub_key: Some(pub_key),
rights: t.rights.clone(), rights: t.rights.clone(),
last_used: time(), last_used: time(),
ip_restriction: t.ip_restriction, allowed_ip_networks: t.allowed_ip_networks.clone(),
max_inactivity: t.max_inactivity, max_inactivity: t.max_inactivity,
}; };

View File

@@ -280,7 +280,7 @@ impl AppConfig {
/// Get VM vnc sockets path for domain /// Get VM vnc sockets path for domain
pub fn vnc_socket_for_domain(&self, name: &str) -> PathBuf { pub fn vnc_socket_for_domain(&self, name: &str) -> PathBuf {
self.vnc_sockets_path().join(format!("vnc-{}", name)) self.vnc_sockets_path().join(format!("vnc-{name}"))
} }
/// Get VM root disks storage directory /// Get VM root disks storage directory

View File

@@ -31,13 +31,12 @@ pub async fn upload(MultipartForm(mut form): MultipartForm<UploadDiskImageForm>)
} }
// Check file mime type // Check file mime type
if let Some(mime_type) = file.content_type { if let Some(mime_type) = file.content_type
if !constants::ALLOWED_DISK_IMAGES_MIME_TYPES.contains(&mime_type.as_ref()) { && !constants::ALLOWED_DISK_IMAGES_MIME_TYPES.contains(&mime_type.as_ref())
return Ok(HttpResponse::BadRequest().json(format!( {
"Unsupported file type for disk upload: {}", return Ok(HttpResponse::BadRequest().json(format!(
mime_type "Unsupported file type for disk upload: {mime_type}"
))); )));
}
} }
// Extract and check file name // Extract and check file name

View File

@@ -31,11 +31,11 @@ pub async fn upload_file(MultipartForm(mut form): MultipartForm<UploadIsoForm>)
return Ok(HttpResponse::BadRequest().json("File is too large!")); return Ok(HttpResponse::BadRequest().json("File is too large!"));
} }
if let Some(m) = &file.content_type { if let Some(m) = &file.content_type
if !constants::ALLOWED_ISO_MIME_TYPES.contains(&m.to_string().as_str()) { && !constants::ALLOWED_ISO_MIME_TYPES.contains(&m.to_string().as_str())
log::error!("Uploaded ISO file has an invalid mimetype!"); {
return Ok(HttpResponse::BadRequest().json("Invalid mimetype!")); log::error!("Uploaded ISO file has an invalid mimetype!");
} return Ok(HttpResponse::BadRequest().json("Invalid mimetype!"));
} }
let file_name = match &file.file_name { let file_name = match &file.file_name {
@@ -52,7 +52,7 @@ pub async fn upload_file(MultipartForm(mut form): MultipartForm<UploadIsoForm>)
} }
let dest_file = AppConfig::get().iso_storage_path().join(file_name); let dest_file = AppConfig::get().iso_storage_path().join(file_name);
log::info!("Will save ISO file {:?}", dest_file); log::info!("Will save ISO file {dest_file:?}");
if dest_file.exists() { if dest_file.exists() {
log::error!("Conflict with uploaded iso file name!"); log::error!("Conflict with uploaded iso file name!");
@@ -87,16 +87,16 @@ pub async fn upload_from_url(req: web::Json<DownloadFromURLReq>) -> HttpResult {
let response = reqwest::get(&req.url).await?; let response = reqwest::get(&req.url).await?;
if let Some(len) = response.content_length() { if let Some(len) = response.content_length()
if len > constants::ISO_MAX_SIZE.as_bytes() as u64 { && len > constants::ISO_MAX_SIZE.as_bytes() as u64
return Ok(HttpResponse::BadRequest().json("File is too large!")); {
} return Ok(HttpResponse::BadRequest().json("File is too large!"));
} }
if let Some(ct) = response.headers().get("content-type") { if let Some(ct) = response.headers().get("content-type")
if !constants::ALLOWED_ISO_MIME_TYPES.contains(&ct.to_str()?) { && !constants::ALLOWED_ISO_MIME_TYPES.contains(&ct.to_str()?)
return Ok(HttpResponse::BadRequest().json("Invalid file mimetype!")); {
} return Ok(HttpResponse::BadRequest().json("Invalid file mimetype!"));
} }
let mut stream = response.bytes_stream(); let mut stream = response.bytes_stream();

View File

@@ -2,6 +2,7 @@ use crate::libvirt_client::LibVirtClient;
use actix_http::StatusCode; use actix_http::StatusCode;
use actix_web::body::BoxBody; use actix_web::body::BoxBody;
use actix_web::{HttpResponse, web}; use actix_web::{HttpResponse, web};
use light_openid::errors::OpenIdError;
use std::error::Error; use std::error::Error;
use std::fmt::{Display, Formatter}; use std::fmt::{Display, Formatter};
use zip::result::ZipError; use zip::result::ZipError;
@@ -43,7 +44,7 @@ impl actix_web::error::ResponseError for HttpErr {
} }
} }
fn error_response(&self) -> HttpResponse<BoxBody> { fn error_response(&self) -> HttpResponse<BoxBody> {
log::error!("Error while processing request! {}", self); log::error!("Error while processing request! {self}");
HttpResponse::InternalServerError().body("Failed to execute request!") HttpResponse::InternalServerError().body("Failed to execute request!")
} }
@@ -109,11 +110,18 @@ impl From<ZipError> for HttpErr {
} }
} }
impl From<OpenIdError> for HttpErr {
fn from(err: OpenIdError) -> HttpErr {
HttpErr::Err(std::io::Error::other(err.to_string()).into())
}
}
impl From<HttpResponse> for HttpErr { impl From<HttpResponse> for HttpErr {
fn from(value: HttpResponse) -> Self { fn from(value: HttpResponse) -> Self {
HttpErr::HTTPResponse(value) HttpErr::HTTPResponse(value)
} }
} }
pub type HttpResult = Result<HttpResponse, HttpErr>; pub type HttpResult = Result<HttpResponse, HttpErr>;
pub type LibVirtReq = web::Data<LibVirtClient>; pub type LibVirtReq = web::Data<LibVirtClient>;

View File

@@ -9,7 +9,7 @@ use actix_web::{Error, FromRequest, HttpRequest};
use std::future::Future; use std::future::Future;
use std::pin::Pin; use std::pin::Pin;
#[derive(serde::Serialize, serde::Deserialize, Debug)] #[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
pub struct TokenClaims { pub struct TokenClaims {
pub sub: String, pub sub: String,
pub iat: usize, pub iat: usize,
@@ -128,21 +128,24 @@ impl FromRequest for ApiAuthExtractor {
)); ));
} }
if let Some(ip) = token.ip_restriction { if !token.allowed_ip_networks.is_empty()
if !ip.contains(remote_ip.0) { && !token
log::error!( .allowed_ip_networks
"Attempt to use a token for an unauthorized IP! {remote_ip:?} token_id={}", .iter()
token.id.0 .any(|n| n.contains(remote_ip.0))
); {
return Err(ErrorUnauthorized("Token cannot be used from this IP!")); log::error!(
} "Attempt to use a token for an unauthorized IP! {remote_ip:?} token_id={}",
token.id.0
);
return Err(ErrorUnauthorized("Token cannot be used from this IP!"));
} }
if token.should_update_last_activity() { if token.should_update_last_activity()
if let Err(e) = api_tokens::refresh_last_used(token.id).await { && let Err(e) = api_tokens::refresh_last_used(token.id).await
log::error!("Could not update token last activity! {e}"); {
return Err(ErrorBadRequest("Couldn't refresh token last activity!")); log::error!("Could not update token last activity! {e}");
} return Err(ErrorBadRequest("Couldn't refresh token last activity!"));
} }
Ok(ApiAuthExtractor { token, claims }) Ok(ApiAuthExtractor { token, claims })

View File

@@ -96,28 +96,28 @@ impl NetworkInfo {
return Err(StructureExtraction("network name is invalid!").into()); return Err(StructureExtraction("network name is invalid!").into());
} }
if let Some(n) = &self.title { if let Some(n) = &self.title
if n.contains('\n') { && n.contains('\n')
return Err(StructureExtraction("Network title contain newline char!").into()); {
} return Err(StructureExtraction("Network title contain newline char!").into());
} }
if let Some(dev) = &self.device { if let Some(dev) = &self.device
if !regex!("^[a-zA-Z0-9]+$").is_match(dev) { && !regex!("^[a-zA-Z0-9]+$").is_match(dev)
return Err(StructureExtraction("Network device name is invalid!").into()); {
} return Err(StructureExtraction("Network device name is invalid!").into());
} }
if let Some(bridge) = &self.bridge_name { if let Some(bridge) = &self.bridge_name
if !regex!("^[a-zA-Z0-9]+$").is_match(bridge) { && !regex!("^[a-zA-Z0-9]+$").is_match(bridge)
return Err(StructureExtraction("Network bridge name is invalid!").into()); {
} return Err(StructureExtraction("Network bridge name is invalid!").into());
} }
if let Some(domain) = &self.domain { if let Some(domain) = &self.domain
if !regex!("^[a-zA-Z0-9.]+$").is_match(domain) { && !regex!("^[a-zA-Z0-9.]+$").is_match(domain)
return Err(StructureExtraction("Domain name is invalid!").into()); {
} return Err(StructureExtraction("Domain name is invalid!").into());
} }
let mut ips = Vec::with_capacity(2); let mut ips = Vec::with_capacity(2);
@@ -303,16 +303,16 @@ impl NetworkInfo {
/// Check if at least one NAT definition was specified on this interface /// Check if at least one NAT definition was specified on this interface
pub fn has_nat_def(&self) -> bool { pub fn has_nat_def(&self) -> bool {
if let Some(ipv4) = &self.ip_v4 { if let Some(ipv4) = &self.ip_v4
if ipv4.nat.is_some() { && ipv4.nat.is_some()
return true; {
} return true;
} }
if let Some(ipv6) = &self.ip_v6 { if let Some(ipv6) = &self.ip_v6
if ipv6.nat.is_some() { && ipv6.nat.is_some()
return true; {
} return true;
} }
false false

View File

@@ -43,14 +43,12 @@ impl From<&String> for NetworkFilterMacAddressOrVar {
fn extract_mac_address_or_var( fn extract_mac_address_or_var(
n: &Option<NetworkFilterMacAddressOrVar>, n: &Option<NetworkFilterMacAddressOrVar>,
) -> anyhow::Result<Option<String>> { ) -> anyhow::Result<Option<String>> {
if let Some(mac) = n { if let Some(mac) = n
if !mac.is_valid() { && !mac.is_valid()
return Err(NetworkFilterExtraction(format!( {
"Invalid mac address or variable! {}", return Err(
mac.0 NetworkFilterExtraction(format!("Invalid mac address or variable! {}", mac.0)).into(),
)) );
.into());
}
} }
Ok(n.as_ref().map(|n| n.0.to_string())) Ok(n.as_ref().map(|n| n.0.to_string()))
@@ -83,34 +81,34 @@ impl<const V: usize> From<&String> for NetworkFilterIPOrVar<V> {
fn extract_ip_or_var<const V: usize>( fn extract_ip_or_var<const V: usize>(
n: &Option<NetworkFilterIPOrVar<V>>, n: &Option<NetworkFilterIPOrVar<V>>,
) -> anyhow::Result<Option<String>> { ) -> anyhow::Result<Option<String>> {
if let Some(ip) = n { if let Some(ip) = n
if !ip.is_valid() { && !ip.is_valid()
return Err(NetworkFilterExtraction(format!( {
"Invalid IPv{V} address or variable! {}", return Err(NetworkFilterExtraction(format!(
ip.0 "Invalid IPv{V} address or variable! {}",
)) ip.0
.into()); ))
} .into());
} }
Ok(n.as_ref().map(|n| n.0.to_string())) Ok(n.as_ref().map(|n| n.0.to_string()))
} }
fn extract_ip_mask<const V: usize>(n: Option<u8>) -> anyhow::Result<Option<u8>> { fn extract_ip_mask<const V: usize>(n: Option<u8>) -> anyhow::Result<Option<u8>> {
if let Some(mask) = n { if let Some(mask) = n
if !net_utils::is_mask_valid(V, mask) { && !net_utils::is_mask_valid(V, mask)
return Err(NetworkFilterExtraction(format!("Invalid IPv{V} mask! {mask}")).into()); {
} return Err(NetworkFilterExtraction(format!("Invalid IPv{V} mask! {mask}")).into());
} }
Ok(n) Ok(n)
} }
fn extract_nw_filter_comment(n: &Option<String>) -> anyhow::Result<Option<String>> { fn extract_nw_filter_comment(n: &Option<String>) -> anyhow::Result<Option<String>> {
if let Some(comment) = n { if let Some(comment) = n
if comment.len() > 256 || comment.contains('\"') || comment.contains('\n') { && (comment.len() > 256 || comment.contains('\"') || comment.contains('\n'))
return Err(NetworkFilterExtraction(format!("Invalid comment! {}", comment)).into()); {
} return Err(NetworkFilterExtraction(format!("Invalid comment! {comment}")).into());
} }
Ok(n.clone()) Ok(n.clone())
@@ -869,12 +867,10 @@ impl NetworkFilter {
); );
} }
if let Some(priority) = self.priority { if let Some(priority) = self.priority
if !(-1000..=1000).contains(&priority) { && !(-1000..=1000).contains(&priority)
return Err( {
NetworkFilterExtraction("Network priority is invalid!".to_string()).into(), return Err(NetworkFilterExtraction("Network priority is invalid!".to_string()).into());
);
}
} }
for fref in &self.join_filters { for fref in &self.join_filters {

View File

@@ -118,22 +118,22 @@ impl VMInfo {
XMLUuid::new_random() XMLUuid::new_random()
}; };
if let Some(n) = &self.genid { if let Some(n) = &self.genid
if !n.is_valid() { && !n.is_valid()
return Err(StructureExtraction("VM genid is invalid!").into()); {
} return Err(StructureExtraction("VM genid is invalid!").into());
} }
if let Some(n) = &self.title { if let Some(n) = &self.title
if n.contains('\n') { && n.contains('\n')
return Err(StructureExtraction("VM title contain newline char!").into()); {
} return Err(StructureExtraction("VM title contain newline char!").into());
} }
if let Some(group) = &self.group { if let Some(group) = &self.group
if !regex!("^[a-zA-Z0-9]+$").is_match(&group.0) { && !regex!("^[a-zA-Z0-9]+$").is_match(&group.0)
return Err(StructureExtraction("VM group name is invalid!").into()); {
} return Err(StructureExtraction("VM group name is invalid!").into());
} }
if self.memory < constants::MIN_VM_MEMORY || self.memory > constants::MAX_VM_MEMORY { if self.memory < constants::MIN_VM_MEMORY || self.memory > constants::MAX_VM_MEMORY {

View File

@@ -1,7 +1,7 @@
use actix::Actor; use actix::Actor;
use actix_cors::Cors; use actix_cors::Cors;
use actix_identity::IdentityMiddleware; use actix_identity::IdentityMiddleware;
use actix_identity::config::LogoutBehaviour; use actix_identity::config::LogoutBehavior;
use actix_multipart::form::MultipartFormConfig; use actix_multipart::form::MultipartFormConfig;
use actix_multipart::form::tempfile::TempFileConfig; use actix_multipart::form::tempfile::TempFileConfig;
use actix_remote_ip::RemoteIPConfig; use actix_remote_ip::RemoteIPConfig;
@@ -98,7 +98,7 @@ async fn main() -> std::io::Result<()> {
.build(); .build();
let identity_middleware = IdentityMiddleware::builder() let identity_middleware = IdentityMiddleware::builder()
.logout_behaviour(LogoutBehaviour::PurgeSession) .logout_behavior(LogoutBehavior::PurgeSession)
.visit_deadline(Some(Duration::from_secs(MAX_INACTIVITY_DURATION))) .visit_deadline(Some(Duration::from_secs(MAX_INACTIVITY_DURATION)))
.login_deadline(Some(Duration::from_secs(MAX_SESSION_DURATION))) .login_deadline(Some(Duration::from_secs(MAX_SESSION_DURATION)))
.build(); .build();
@@ -123,9 +123,9 @@ async fn main() -> std::io::Result<()> {
.wrap(cors) .wrap(cors)
.app_data(state_manager.clone()) .app_data(state_manager.clone())
.app_data(vnc_tokens.clone()) .app_data(vnc_tokens.clone())
.app_data(Data::new(RemoteIPConfig { .app_data(Data::new(RemoteIPConfig::parse_opt(
proxy: AppConfig::get().proxy_ip.clone(), AppConfig::get().proxy_ip.clone(),
})) )))
.app_data(conn.clone()) .app_data(conn.clone())
// Uploaded files // Uploaded files
.app_data(MultipartFormConfig::default().total_limit( .app_data(MultipartFormConfig::default().total_limit(

View File

@@ -69,8 +69,7 @@ where
if !AppConfig::get().is_allowed_ip(remote_ip.0) { if !AppConfig::get().is_allowed_ip(remote_ip.0) {
log::error!( log::error!(
"An attempt to access VirtWeb from an unauthorized network has been intercepted! {:?}", "An attempt to access VirtWeb from an unauthorized network has been intercepted! {remote_ip:?}"
remote_ip
); );
return Ok(req return Ok(req
.into_response( .into_response(

View File

@@ -60,10 +60,10 @@ pub struct Nat<IPv> {
impl<IPv> Nat<IPv> { impl<IPv> Nat<IPv> {
pub fn check(&self) -> anyhow::Result<()> { pub fn check(&self) -> anyhow::Result<()> {
if let NatSourceIP::Interface { name } = &self.host_ip { if let NatSourceIP::Interface { name } = &self.host_ip
if !net_utils::is_net_interface_name_valid(name) { && !net_utils::is_net_interface_name_valid(name)
return Err(NatDefError::InvalidNatDef("Invalid nat interface name!").into()); {
} return Err(NatDefError::InvalidNatDef("Invalid nat interface name!").into());
} }
if let NatHostPort::Range { start, end } = &self.host_port { if let NatHostPort::Range { start, end } = &self.host_port {
@@ -84,10 +84,10 @@ impl<IPv> Nat<IPv> {
return Err(NatDefError::InvalidNatDef("Invalid guest port!").into()); return Err(NatDefError::InvalidNatDef("Invalid guest port!").into());
} }
if let Some(comment) = &self.comment { if let Some(comment) = &self.comment
if comment.len() > constants::NET_NAT_COMMENT_MAX_SIZE { && comment.len() > constants::NET_NAT_COMMENT_MAX_SIZE
return Err(NatDefError::InvalidNatDef("Comment is too large!").into()); {
} return Err(NatDefError::InvalidNatDef("Comment is too large!").into());
} }
Ok(()) Ok(())

View File

@@ -81,10 +81,10 @@ impl CloudInitConfig {
// Process metadata // Process metadata
let mut metadatas = vec![]; let mut metadatas = vec![];
if let Some(inst_id) = &self.instance_id { if let Some(inst_id) = &self.instance_id {
metadatas.push(format!("instance-id: {}", inst_id)); metadatas.push(format!("instance-id: {inst_id}"));
} }
if let Some(local_hostname) = &self.local_hostname { if let Some(local_hostname) = &self.local_hostname {
metadatas.push(format!("local-hostname: {}", local_hostname)); metadatas.push(format!("local-hostname: {local_hostname}"));
} }
if let Some(dsmode) = &self.dsmode { if let Some(dsmode) = &self.dsmode {
metadatas.push(format!( metadatas.push(format!(

View File

@@ -49,6 +49,7 @@ export default tseslint.config(
"@typescript-eslint/no-unsafe-member-access": "off", "@typescript-eslint/no-unsafe-member-access": "off",
"@typescript-eslint/no-unsafe-argument": "off", "@typescript-eslint/no-unsafe-argument": "off",
"react-refresh/only-export-components": "off", "react-refresh/only-export-components": "off",
"react-hooks/immutability": "off",
}, },
} }
); );

File diff suppressed because it is too large Load Diff

View File

@@ -11,46 +11,48 @@
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0", "@emotion/styled": "^11.14.1",
"@fontsource/roboto": "^5.2.6", "@fontsource/roboto": "^5.2.10",
"@mdi/js": "^7.4.47", "@mdi/js": "^7.4.47",
"@mdi/react": "^1.6.1", "@mdi/react": "^1.6.1",
"@monaco-editor/react": "^4.7.0", "@monaco-editor/react": "^4.7.0",
"@mui/icons-material": "^7.1.1", "@mui/icons-material": "^7.3.9",
"@mui/material": "^7.1.1", "@mui/material": "^7.3.9",
"@mui/x-charts": "^8.3.1", "@mui/x-charts": "^8.28.0",
"@mui/x-data-grid": "^8.3.1", "@mui/x-data-grid": "^8.28.0",
"date-and-time": "^3.6.0", "date-and-time": "^4.3.1",
"filesize": "^10.1.6", "filesize": "^11.0.13",
"humanize-duration": "^3.32.2", "humanize-duration": "^3.33.2",
"monaco-editor": "^0.52.2", "is-cidr": "^6.0.3",
"monaco-yaml": "^5.4.0", "monaco-editor": "^0.55.1",
"react": "^19.1.0", "monaco-yaml": "^5.4.1",
"react-dom": "^19.1.0", "react": "^19.2.4",
"react-router-dom": "^7.6.2", "react-dom": "^19.2.4",
"react-syntax-highlighter": "^15.6.1", "react-router-dom": "^7.13.2",
"react-vnc": "^3.1.0", "react-syntax-highlighter": "^16.1.1",
"uuid": "^11.1.0", "react-vnc": "^3.2.0",
"xml-formatter": "^3.6.6", "uuid": "^13.0.0",
"yaml": "^2.8.0" "xml-formatter": "^3.7.0",
"yaml": "^2.8.3"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.27.0", "@eslint/js": "^10.0.1",
"@types/humanize-duration": "^3.27.4", "@types/humanize-duration": "^3.27.4",
"@types/jest": "^29.5.14", "@types/jest": "^30.0.0",
"@types/react": "^19.1.8", "@types/node": "^25.5.0",
"@types/react-dom": "^19.1.6", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@types/react-syntax-highlighter": "^15.5.13", "@types/react-syntax-highlighter": "^15.5.13",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"@vitejs/plugin-react": "^4.4.1", "@vitejs/plugin-react": "^6.0.1",
"eslint": "^9.27.0", "eslint": "^10.1.0",
"eslint-plugin-react-dom": "^1.49.0", "eslint-plugin-react-dom": "^3.0.0",
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.4.20", "eslint-plugin-react-refresh": "^0.5.2",
"eslint-plugin-react-x": "^1.49.0", "eslint-plugin-react-x": "^3.0.0",
"globals": "^16.1.0", "globals": "^17.4.0",
"typescript": "^5.8.3", "typescript": "^6.0.2",
"typescript-eslint": "^8.32.1", "typescript-eslint": "^8.57.2",
"vite": "^6.3.5" "vite": "^8.0.2"
} }
} }

View File

@@ -16,7 +16,7 @@ export interface APIToken {
updated: number; updated: number;
rights: TokenRight[]; rights: TokenRight[];
last_used: number; last_used: number;
ip_restriction?: string; allowed_ip_networks?: string[];
max_inactivity?: number; max_inactivity?: number;
} }

View File

@@ -61,6 +61,7 @@ export function DiskImagesRoute(): React.ReactElement {
} }
> >
<AsyncWidget <AsyncWidget
// eslint-disable-next-line react-hooks/refs
loadKey={loadKey.current} loadKey={loadKey.current}
errMsg="Failed to load disk images list!" errMsg="Failed to load disk images list!"
load={load} load={load}
@@ -84,7 +85,7 @@ function UploadDiskImageCard(p: {
const [value, setValue] = React.useState<File | null>(null); const [value, setValue] = React.useState<File | null>(null);
const [uploadProgress, setUploadProgress] = React.useState<number | null>( const [uploadProgress, setUploadProgress] = React.useState<number | null>(
null null,
); );
const handleChange = (newValue: File | null) => { const handleChange = (newValue: File | null) => {
@@ -94,8 +95,8 @@ function UploadDiskImageCard(p: {
) { ) {
alert( alert(
`The file is too big (max size allowed: ${filesize( `The file is too big (max size allowed: ${filesize(
ServerApi.Config.constraints.disk_image_max_size ServerApi.Config.constraints.disk_image_max_size,
)}` )}`,
); );
return; return;
} }
@@ -200,7 +201,7 @@ function DiskImageList(p: {
const deleteDiskImage = async (entry: DiskImage) => { const deleteDiskImage = async (entry: DiskImage) => {
if ( if (
!(await confirm( !(await confirm(
`Do you really want to delete this disk image (${entry.file_name}) ?` `Do you really want to delete this disk image (${entry.file_name}) ?`,
)) ))
) )
return; return;

View File

@@ -28,14 +28,16 @@ export function CreateApiTokenRoute(): React.ReactElement {
CreatedAPIToken | undefined CreatedAPIToken | undefined
>(); >();
const [token] = React.useState<APIToken>({ const [token] = React.useState<APIToken>(() => {
id: "", return {
name: "", id: "",
description: "", name: "",
created: time(), description: "",
updated: time(), created: time(),
last_used: time(), updated: time(),
rights: [], last_used: time(),
rights: [],
};
}); });
const createApiToken = async (n: APIToken) => { const createApiToken = async (n: APIToken) => {
@@ -115,8 +117,11 @@ function EditApiTokenRouteInner(p: {
const [changed, setChanged] = React.useState(false); const [changed, setChanged] = React.useState(false);
// eslint-disable-next-line react-x/use-state
const [, updateState] = React.useState<any>(); const [, updateState] = React.useState<any>();
const forceUpdate = React.useCallback(() => { updateState({}); }, []); const forceUpdate = React.useCallback(() => {
updateState({});
}, []);
const valueChanged = () => { const valueChanged = () => {
setChanged(true); setChanged(true);

View File

@@ -15,7 +15,7 @@ export function CreateNWFilterRoute(): React.ReactElement {
const snackbar = useSnackbar(); const snackbar = useSnackbar();
const navigate = useNavigate(); const navigate = useNavigate();
const [nwfilter, setNWFilter] = React.useState<NWFilter>({ const [nwFilter, setNWFilter] = React.useState<NWFilter>({
name: "my-filter", name: "my-filter",
chain: { protocol: "root" }, chain: { protocol: "root" },
join_filters: [], join_filters: [],
@@ -35,7 +35,7 @@ export function CreateNWFilterRoute(): React.ReactElement {
return ( return (
<EditNetworkFilterRouteInner <EditNetworkFilterRouteInner
nwfilter={nwfilter} nwfilter={nwFilter}
creating={true} creating={true}
onCancel={() => navigate("/nwfilter")} onCancel={() => navigate("/nwfilter")}
onSave={createNWFilter} onSave={createNWFilter}
@@ -51,7 +51,7 @@ export function EditNWFilterRoute(): React.ReactElement {
const { uuid } = useParams(); const { uuid } = useParams();
const navigate = useNavigate(); const navigate = useNavigate();
const [nwfilter, setNWFilter] = React.useState<NWFilter | undefined>(); const [nwFilter, setNWFilter] = React.useState<NWFilter | undefined>();
const load = async () => { const load = async () => {
setNWFilter(await NWFilterApi.GetSingle(uuid!)); setNWFilter(await NWFilterApi.GetSingle(uuid!));
@@ -61,7 +61,7 @@ export function EditNWFilterRoute(): React.ReactElement {
try { try {
await NWFilterApi.Update(n); await NWFilterApi.Update(n);
snackbar("The network filter was successfully updated!"); snackbar("The network filter was successfully updated!");
navigate(NWFilterURL(nwfilter!)); navigate(NWFilterURL(nwFilter!));
} catch (e) { } catch (e) {
console.error(e); console.error(e);
alert(`Failed to update network filter!\n${e}`); alert(`Failed to update network filter!\n${e}`);
@@ -71,12 +71,12 @@ export function EditNWFilterRoute(): React.ReactElement {
return ( return (
<AsyncWidget <AsyncWidget
loadKey={uuid} loadKey={uuid}
ready={nwfilter !== undefined} ready={nwFilter !== undefined}
errMsg="Failed to fetch network filter information!" errMsg="Failed to fetch network filter information!"
load={load} load={load}
build={() => ( build={() => (
<EditNetworkFilterRouteInner <EditNetworkFilterRouteInner
nwfilter={nwfilter!} nwfilter={nwFilter!}
creating={false} creating={false}
onCancel={() => navigate(`/nwfilter/${uuid}`)} onCancel={() => navigate(`/nwfilter/${uuid}`)}
onSave={updateNetworkFilter} onSave={updateNetworkFilter}
@@ -98,8 +98,11 @@ function EditNetworkFilterRouteInner(p: {
const [changed, setChanged] = React.useState(false); const [changed, setChanged] = React.useState(false);
// eslint-disable-next-line react-x/use-state
const [, updateState] = React.useState<any>(); const [, updateState] = React.useState<any>();
const forceUpdate = React.useCallback(() => { updateState({}); }, []); const forceUpdate = React.useCallback(() => {
updateState({});
}, []);
const valueChanged = () => { const valueChanged = () => {
setChanged(true); setChanged(true);

View File

@@ -96,8 +96,11 @@ function EditNetworkRouteInner(p: {
const [changed, setChanged] = React.useState(false); const [changed, setChanged] = React.useState(false);
// eslint-disable-next-line react-x/use-state
const [, updateState] = React.useState<any>(); const [, updateState] = React.useState<any>();
const forceUpdate = React.useCallback(() => { updateState({}); }, []); const forceUpdate = React.useCallback(() => {
updateState({});
}, []);
const valueChanged = () => { const valueChanged = () => {
setChanged(true); setChanged(true);

View File

@@ -102,6 +102,7 @@ function EditVMInner(p: {
const [changed, setChanged] = React.useState(false); const [changed, setChanged] = React.useState(false);
// eslint-disable-next-line react-x/use-state
const [, updateState] = React.useState<any>(); const [, updateState] = React.useState<any>();
const forceUpdate = React.useCallback(() => { const forceUpdate = React.useCallback(() => {
updateState({}); updateState({});

View File

@@ -46,6 +46,7 @@ export function IsoFilesRoute(): React.ReactElement {
return ( return (
<> <>
<AsyncWidget <AsyncWidget
// eslint-disable-next-line react-hooks/refs
loadKey={loadKey.current} loadKey={loadKey.current}
errMsg="Failed to load ISO files list!" errMsg="Failed to load ISO files list!"
load={load} load={load}
@@ -56,7 +57,11 @@ export function IsoFilesRoute(): React.ReactElement {
actions={ actions={
<span> <span>
<Tooltip title="Open the ISO catalog"> <Tooltip title="Open the ISO catalog">
<IconButton onClick={() => { setIsoCatalog(true); }}> <IconButton
onClick={() => {
setIsoCatalog(true);
}}
>
<MenuBookIcon /> <MenuBookIcon />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@@ -76,7 +81,9 @@ export function IsoFilesRoute(): React.ReactElement {
/> />
<IsoCatalogDialog <IsoCatalogDialog
open={isoCatalog} open={isoCatalog}
onClose={() => { setIsoCatalog(false); }} onClose={() => {
setIsoCatalog(false);
}}
/> />
</> </>
); );
@@ -90,15 +97,15 @@ function UploadIsoFileCard(p: {
const [value, setValue] = React.useState<File | null>(null); const [value, setValue] = React.useState<File | null>(null);
const [uploadProgress, setUploadProgress] = React.useState<number | null>( const [uploadProgress, setUploadProgress] = React.useState<number | null>(
null null,
); );
const handleChange = (newValue: File | null) => { const handleChange = (newValue: File | null) => {
if (newValue && newValue.size > ServerApi.Config.constraints.iso_max_size) { if (newValue && newValue.size > ServerApi.Config.constraints.iso_max_size) {
alert( alert(
`The file is too big (max size allowed: ${filesize( `The file is too big (max size allowed: ${filesize(
ServerApi.Config.constraints.iso_max_size ServerApi.Config.constraints.iso_max_size,
)}` )}`,
); );
return; return;
} }
@@ -244,7 +251,7 @@ function IsoFilesList(p: {
const deleteIso = async (entry: IsoFile) => { const deleteIso = async (entry: IsoFile) => {
if ( if (
!(await confirm( !(await confirm(
`Do you really want to delete this file (${entry.filename}) ?` `Do you really want to delete this file (${entry.filename}) ?`,
)) ))
) )
return; return;

View File

@@ -6,7 +6,7 @@ import {
mdiNetwork, mdiNetwork,
mdiPackageVariantClosed, mdiPackageVariantClosed,
} from "@mdi/js"; } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import { import {
Box, Box,
IconButton, IconButton,
@@ -81,7 +81,7 @@ export function SysInfoRouteInner(p: {
free: prev.free + disk.available_space, free: prev.free + disk.available_space,
}; };
}, },
{ used: 0, free: 0 } { used: 0, free: 0 },
); );
return ( return (
@@ -199,6 +199,7 @@ export function SysInfoRouteInner(p: {
}, },
{ {
label: "Bootime", label: "Bootime",
// eslint-disable-next-line react-x/purity
value: new Date(p.info.system.boot_time * 1000).toString(), value: new Date(p.info.system.boot_time * 1000).toString(),
}, },
{ {

View File

@@ -69,7 +69,7 @@ export function TokensListRouteInner(p: {
<TableCell>Created</TableCell> <TableCell>Created</TableCell>
<TableCell>Updated</TableCell> <TableCell>Updated</TableCell>
<TableCell>Last used</TableCell> <TableCell>Last used</TableCell>
<TableCell>IP restriction</TableCell> <TableCell>Allowed networks</TableCell>
<TableCell>Max inactivity</TableCell> <TableCell>Max inactivity</TableCell>
<TableCell>Rights</TableCell> <TableCell>Rights</TableCell>
<TableCell>Actions</TableCell> <TableCell>Actions</TableCell>
@@ -97,7 +97,7 @@ export function TokensListRouteInner(p: {
<TableCell> <TableCell>
<TimeWidget time={t.last_used} /> <TimeWidget time={t.last_used} />
</TableCell> </TableCell>
<TableCell>{t.ip_restriction}</TableCell> <TableCell>{t.allowed_ip_networks?.join(", ")}</TableCell>
<TableCell> <TableCell>
{t.max_inactivity && timeDiff(0, t.max_inactivity)} {t.max_inactivity && timeDiff(0, t.max_inactivity)}
</TableCell> </TableCell>

View File

@@ -47,6 +47,7 @@ export function VMListRoute(): React.ReactElement {
return ( return (
<AsyncWidget <AsyncWidget
// eslint-disable-next-line react-hooks/refs
loadKey={loadKey.current} loadKey={loadKey.current}
errMsg="Failed to load Virtual Machines list!" errMsg="Failed to load Virtual Machines list!"
load={load} load={load}
@@ -76,11 +77,11 @@ function VMListWidget(p: {
}): React.ReactElement { }): React.ReactElement {
const navigate = useNavigate(); const navigate = useNavigate();
const [hiddenGroups, setHiddenGroups] = React.useState< const [hiddenGroups, setHiddenGroups] = React.useState(() => new Set());
Set<string | undefined>
>(new Set());
const [runningVMs, setRunningVMs] = React.useState<Set<string>>(new Set()); const [runningVMs, setRunningVMs] = React.useState<Set<string>>(
() => new Set(),
);
const toggleHiddenGroup = (g: string | undefined) => { const toggleHiddenGroup = (g: string | undefined) => {
if (hiddenGroups.has(g)) hiddenGroups.delete(g); if (hiddenGroups.has(g)) hiddenGroups.delete(g);
@@ -186,7 +187,7 @@ function VMListWidget(p: {
{filesize( {filesize(
p.list p.list
.filter((v) => runningVMs.has(v.name)) .filter((v) => runningVMs.has(v.name))
.reduce((s, v) => s + v.memory, 0) .reduce((s, v) => s + v.memory, 0),
)} )}
{" / "} {" / "}
{filesize(p.list.reduce((s, v) => s + v.memory, 0))} {filesize(p.list.reduce((s, v) => s + v.memory, 0))}

View File

@@ -88,6 +88,7 @@ function VNCInner(p: { vm: VMInfo }): React.ReactElement {
}; };
useEffect(() => { useEffect(() => {
// eslint-disable-next-line react-hooks/set-state-in-effect
connect(false); connect(false);
if (vncRef.current) { if (vncRef.current) {

View File

@@ -15,7 +15,7 @@ import { NWFilterDetails } from "../widgets/nwfilter/NWFilterDetails";
export function ViewNWFilterRoute() { export function ViewNWFilterRoute() {
const { uuid } = useParams(); const { uuid } = useParams();
const [nwfilter, setNWFilter] = React.useState<NWFilter | undefined>(); const [nwFilter, setNWFilter] = React.useState<NWFilter | undefined>();
const load = async () => { const load = async () => {
setNWFilter(await NWFilterApi.GetSingle(uuid!)); setNWFilter(await NWFilterApi.GetSingle(uuid!));
@@ -24,10 +24,10 @@ export function ViewNWFilterRoute() {
return ( return (
<AsyncWidget <AsyncWidget
loadKey={uuid} loadKey={uuid}
ready={nwfilter !== undefined} ready={nwFilter !== undefined}
errMsg="Failed to fetch network filter information!" errMsg="Failed to fetch network filter information!"
load={load} load={load}
build={() => <ViewNetworkFilterRouteInner nwfilter={nwfilter!} />} build={() => <ViewNetworkFilterRouteInner nwfilter={nwFilter!} />}
/> />
); );
} }

View File

@@ -41,12 +41,14 @@ export function LoginRoute(): React.ReactElement {
}; };
const handleMouseDownPassword = ( const handleMouseDownPassword = (
event: React.MouseEvent<HTMLButtonElement> event: React.MouseEvent<HTMLButtonElement>,
) => { ) => {
event.preventDefault(); event.preventDefault();
}; };
const handleLoginSubmit = async (event: React.FormEvent<HTMLFormElement>) => { const handleLoginSubmit = async (
event: React.SubmitEvent<HTMLFormElement>,
) => {
event.preventDefault(); event.preventDefault();
if (!canSubmit) return; if (!canSubmit) return;

View File

@@ -0,0 +1,11 @@
import isCidr from "is-cidr";
/**
* Check whether a given IP network address is valid or not
*
* @param ip The IP network to check
* @returns true if the address is valid, false otherwise
*/
export function isIPNetworkValid(ip: string): boolean {
return isCidr(ip) !== 0;
}

View File

@@ -1,26 +1,25 @@
import { Alert, Box, Button, CircularProgress } from "@mui/material"; import { Alert, Box, Button, CircularProgress } from "@mui/material";
import React, { useEffect, useRef, useState } from "react"; import React from "react";
enum State { const State = {
Loading, Loading: 0,
Ready, Ready: 1,
Error, Error: 2,
} } as const;
type State = keyof typeof State;
export function AsyncWidget(p: { export function AsyncWidget(p: {
loadKey: any; loadKey: unknown;
load: () => Promise<void>; load: () => Promise<void>;
errMsg: string; errMsg: string;
build: () => React.ReactElement; build: () => React.ReactElement;
ready?: boolean;
buildLoading?: () => React.ReactElement; buildLoading?: () => React.ReactElement;
buildError?: (e: string) => React.ReactElement; buildError?: (e: string) => React.ReactElement;
ready?: boolean;
errAdditionalElement?: () => React.ReactElement; errAdditionalElement?: () => React.ReactElement;
}): React.ReactElement { }): React.ReactElement {
const [state, setState] = useState(State.Loading); const [state, setState] = React.useState(State.Loading as number);
const counter = useRef<any>(null);
const load = async () => { const load = async () => {
try { try {
setState(State.Loading); setState(State.Loading);
@@ -32,12 +31,10 @@ export function AsyncWidget(p: {
} }
}; };
useEffect(() => { React.useEffect(() => {
if (counter.current === p.loadKey) return;
counter.current = p.loadKey;
load(); load();
}); // eslint-disable-next-line react-hooks/exhaustive-deps, react-x/exhaustive-deps
}, [p.loadKey]);
if (state === State.Error) if (state === State.Error)
return ( return (
@@ -51,10 +48,6 @@ export function AsyncWidget(p: {
height: "100%", height: "100%",
flex: "1", flex: "1",
flexDirection: "column", flexDirection: "column",
backgroundColor: (theme) =>
theme.palette.mode === "light"
? theme.palette.grey[100]
: theme.palette.grey[900],
}} }}
> >
<Alert <Alert
@@ -83,10 +76,6 @@ export function AsyncWidget(p: {
alignItems: "center", alignItems: "center",
height: "100%", height: "100%",
flex: "1", flex: "1",
backgroundColor: (theme) =>
theme.palette.mode === "light"
? theme.palette.grey[100]
: theme.palette.grey[900],
}} }}
> >
<CircularProgress /> <CircularProgress />

View File

@@ -8,7 +8,7 @@ import {
mdiLan, mdiLan,
mdiSecurityNetwork, mdiSecurityNetwork,
} from "@mdi/js"; } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import { import {
Box, Box,
List, List,

View File

@@ -1,5 +1,6 @@
/* eslint-disable react-x/purity */
import { mdiServer } from "@mdi/js"; import { mdiServer } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import Avatar from "@mui/material/Avatar"; import Avatar from "@mui/material/Avatar";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import CssBaseline from "@mui/material/CssBaseline"; import CssBaseline from "@mui/material/CssBaseline";

View File

@@ -1,5 +1,7 @@
import React from "react";
export function DateWidget(p: { time: number }): React.ReactElement { export function DateWidget(p: { time: number }): React.ReactElement {
const date = new Date(p.time * 1000); const date = React.useMemo(() => new Date(p.time * 1000), [p.time]);
return ( return (
<> <>

View File

@@ -2,7 +2,7 @@ import { Avatar, ListItem, ListItemAvatar, ListItemText } from "@mui/material";
import { DiskImage } from "../api/DiskImageApi"; import { DiskImage } from "../api/DiskImageApi";
import { mdiHarddisk } from "@mdi/js"; import { mdiHarddisk } from "@mdi/js";
import { filesize } from "filesize"; import { filesize } from "filesize";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
export function FileDiskImageWidget(p: { export function FileDiskImageWidget(p: {
image: DiskImage; image: DiskImage;

View File

@@ -1,11 +1,11 @@
import { Tooltip } from "@mui/material"; import { Tooltip } from "@mui/material";
import date from "date-and-time"; import { format } from "date-and-time";
import { time } from "../utils/DateUtils"; import { time } from "../utils/DateUtils";
export function formatDate(time: number): string { export function formatDate(time: number): string {
const t = new Date(); const t = new Date();
t.setTime(1000 * time); t.setTime(1000 * time);
return date.format(t, "DD/MM/YYYY HH:mm:ss"); return format(t, "DD/MM/YYYY HH:mm:ss");
} }
export function timeDiff(a: number, b: number): string { export function timeDiff(a: number, b: number): string {

View File

@@ -1,5 +1,5 @@
import { mdiLogout, mdiServer } from "@mdi/js"; import { mdiLogout, mdiServer } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import { AppBar, IconButton, Toolbar, Typography } from "@mui/material"; import { AppBar, IconButton, Toolbar, Typography } from "@mui/material";
import { RouterLink } from "./RouterLink"; import { RouterLink } from "./RouterLink";
import { AsyncWidget } from "./AsyncWidget"; import { AsyncWidget } from "./AsyncWidget";

View File

@@ -33,6 +33,7 @@ export function IPInputWithMask(p: {
const currValue = const currValue =
p.ipAndMask ?? p.ipAndMask ??
// eslint-disable-next-line react-hooks/refs
`${p.ip ?? ""}${p.mask || showSlash.current ? "/" : ""}${p.mask ?? ""}`; `${p.ip ?? ""}${p.mask || showSlash.current ? "/" : ""}${p.mask ?? ""}`;
const { onValueChange, ...props } = p; const { onValueChange, ...props } = p;
@@ -58,7 +59,7 @@ export function IPInputWithMask(p: {
onValueChange?.( onValueChange?.(
ip, ip,
mask, mask,
mask || showSlash.current ? `${ip}/${mask ?? ""}` : ip mask || showSlash.current ? `${ip}/${mask ?? ""}` : ip,
); );
}} }}
value={currValue} value={currValue}

View File

@@ -20,12 +20,13 @@ export function NWFSelectReferencedFilters(p: {
p.excludedFilters p.excludedFilters
? p.nwFiltersList.filter((f) => !p.excludedFilters!.includes(f.name)) ? p.nwFiltersList.filter((f) => !p.excludedFilters!.includes(f.name))
: p.nwFiltersList, : p.nwFiltersList,
[p.excludedFilters] [p.excludedFilters, p.nwFiltersList],
); );
const selectedFilters = React.useMemo( const selectedFilters = React.useMemo(
() => p.selected.map((f) => p.nwFiltersList.find((s) => s.name === f)), () => p.selected.map((f) => p.nwFiltersList.find((s) => s.name === f)),
[p.selected.length] // eslint-disable-next-line react-x/exhaustive-deps
[p.selected.length, p.nwFiltersList],
); );
return ( return (

View File

@@ -1,6 +1,6 @@
/* eslint-disable react-x/no-array-index-key */ /* eslint-disable react-x/no-array-index-key */
import { mdiIp } from "@mdi/js"; import { mdiIp } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import { import {
Avatar, Avatar,

View File

@@ -0,0 +1,28 @@
import { isIPNetworkValid } from "../../utils/NetworkUtils";
import { TextInput } from "./TextInput";
function rebuildNetworksList(val?: string): string[] | undefined {
if (!val || val.trim() === "") return undefined;
return val.split(",").map((v) => v.trim());
}
export function NetworksInput(p: {
editable: boolean;
label: string;
value?: string[];
onChange: (n: string[] | undefined) => void;
}): React.ReactElement {
const textValue = (p.value ?? []).join(", ").trim();
return (
<TextInput
{...p}
type="string"
value={textValue}
onValueChange={(i) => {
p.onChange(rebuildNetworksList(i));
}}
checkValue={(v) => (rebuildNetworksList(v) ?? []).every(isIPNetworkValid)}
/>
);
}

View File

@@ -1,5 +1,5 @@
import { mdiHarddiskPlus } from "@mdi/js"; import { mdiHarddiskPlus } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import CheckCircleIcon from "@mui/icons-material/CheckCircle"; import CheckCircleIcon from "@mui/icons-material/CheckCircle";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import ExpandIcon from "@mui/icons-material/Expand"; import ExpandIcon from "@mui/icons-material/Expand";
@@ -125,7 +125,7 @@ function DiskInfo(p: {
`You asked to delete the disk ${p.disk.name}. Do you want to keep the block file or not ? `, `You asked to delete the disk ${p.disk.name}. Do you want to keep the block file or not ? `,
"Delete disk", "Delete disk",
"Keep the file", "Keep the file",
"Delete the file" "Delete the file",
); );
if (!(await confirm("Do you really want to delete this disk?"))) return; if (!(await confirm("Do you really want to delete this disk?"))) return;

View File

@@ -1,6 +1,6 @@
/* eslint-disable react-x/no-array-index-key */ /* eslint-disable react-x/no-array-index-key */
import { mdiNetworkOutline } from "@mdi/js"; import { mdiNetworkOutline } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import { import {
Avatar, Avatar,
@@ -191,7 +191,7 @@ function NetworkInfoWidget(p: {
editable={p.editable} editable={p.editable}
label="Defined network" label="Defined network"
options={p.networksList.map((n) => { options={p.networksList.map((n) => {
const chars = [n.forward_mode.toString()]; const chars = [n.forward_mode as string];
if (n.ip_v4) chars.push("IPv4"); if (n.ip_v4) chars.push("IPv4");
if (n.ip_v6) chars.push("IPv6"); if (n.ip_v6) chars.push("IPv6");
if (n.description) chars.push(n.description); if (n.description) chars.push(n.description);

View File

@@ -11,7 +11,7 @@ import {
} from "@mui/material"; } from "@mui/material";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import { mdiDisc } from "@mdi/js"; import { mdiDisc } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
export function VMSelectIsoInput(p: { export function VMSelectIsoInput(p: {
editable: boolean; editable: boolean;

View File

@@ -1,5 +1,5 @@
import { mdiSecurityNetwork } from "@mdi/js"; import { mdiSecurityNetwork } from "@mdi/js";
import Icon from "@mdi/react"; import { Icon } from "@mdi/react";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import { import {

View File

@@ -14,8 +14,7 @@ import { useSnackbar } from "../../hooks/providers/SnackbarProvider";
import { AsyncWidget } from "../AsyncWidget"; import { AsyncWidget } from "../AsyncWidget";
import { TabsWidget } from "../TabsWidget"; import { TabsWidget } from "../TabsWidget";
import { EditSection } from "../forms/EditSection"; import { EditSection } from "../forms/EditSection";
import { IPInputWithMask } from "../forms/IPInput"; import { NetworksInput } from "../forms/NetworksInput";
import { RadioGroupInput } from "../forms/RadioGroupInput";
import { TextInput } from "../forms/TextInput"; import { TextInput } from "../forms/TextInput";
import { TokenRawRightsEditor } from "./TokenRawRightsEditor"; import { TokenRawRightsEditor } from "./TokenRawRightsEditor";
import { TokenRightsEditor } from "./TokenRightsEditor"; import { TokenRightsEditor } from "./TokenRightsEditor";
@@ -35,17 +34,17 @@ interface DetailsProps {
} }
export function APITokenDetails(p: DetailsProps): React.ReactElement { export function APITokenDetails(p: DetailsProps): React.ReactElement {
const [vms, setVMs] = React.useState<VMInfo[]>(); const [vms, setVms] = React.useState<VMInfo[]>();
const [groups, setGroups] = React.useState<string[]>(); const [groups, setGroups] = React.useState<string[]>();
const [networks, setNetworks] = React.useState<NetworkInfo[]>(); const [networks, setNetworks] = React.useState<NetworkInfo[]>();
const [nwFilters, setNetworkFilters] = React.useState<NWFilter[]>(); const [nwFilters, setNwFilters] = React.useState<NWFilter[]>();
const [tokens, setTokens] = React.useState<APIToken[]>(); const [tokens, setTokens] = React.useState<APIToken[]>();
const load = async () => { const load = async () => {
setVMs(await VMApi.GetList()); setVms(await VMApi.GetList());
setGroups(await GroupApi.GetList()); setGroups(await GroupApi.GetList());
setNetworks(await NetworkApi.GetList()); setNetworks(await NetworkApi.GetList());
setNetworkFilters(await NWFilterApi.GetList()); setNwFilters(await NWFilterApi.GetList());
setTokens(await TokensApi.GetList()); setTokens(await TokensApi.GetList());
}; };
@@ -121,10 +120,6 @@ function APITokenDetailsInner(p: DetailsInnerProps): React.ReactElement {
} }
function APITokenTabGeneral(p: DetailsInnerProps): React.ReactElement { function APITokenTabGeneral(p: DetailsInnerProps): React.ReactElement {
const [ipVersion, setIpVersion] = React.useState<4 | 6>(
(p.token.ip_restriction ?? "").includes(":") ? 6 : 4
);
return ( return (
<Grid container spacing={2}> <Grid container spacing={2}>
{/* Metadata section */} {/* Metadata section */}
@@ -158,29 +153,13 @@ function APITokenTabGeneral(p: DetailsInnerProps): React.ReactElement {
</EditSection> </EditSection>
<EditSection title="General settings"> <EditSection title="General settings">
{p.status === TokenWidgetStatus.Create && ( <NetworksInput
<RadioGroupInput
{...p}
editable={true}
options={[
{ label: "IPv4", value: "4" },
{ label: "IPv6", value: "6" },
]}
value={ipVersion.toString()}
onValueChange={(v) => {
setIpVersion(Number(v) as 4 | 6);
}}
label="Token IP restriction version"
/>
)}
<IPInputWithMask
{...p} {...p}
label="Token IP network restriction" label="Allowd IP networks (comma-separated list, leave empty to allow from anywhere)"
ipAndMask={p.token.ip_restriction}
editable={p.status === TokenWidgetStatus.Create} editable={p.status === TokenWidgetStatus.Create}
version={ipVersion} value={p.token.allowed_ip_networks}
onValueChange={(_ip, _mask, ipAndMask) => { onChange={(v) => {
p.token.ip_restriction = ipAndMask; p.token.allowed_ip_networks = v;
p.onChange?.(); p.onChange?.();
}} }}
/> />
@@ -239,7 +218,7 @@ function APITokenTabDanger(p: DetailsInnerProps): React.ReactElement {
!(await confirm( !(await confirm(
"Do you really want to delete this API token?", "Do you really want to delete this API token?",
`Delete API token ${p.token.name}`, `Delete API token ${p.token.name}`,
"Delete" "Delete",
)) ))
) )
return; return;

View File

@@ -6,6 +6,7 @@
"lib": ["ES2020", "DOM", "DOM.Iterable"], "lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext", "module": "ESNext",
"skipLibCheck": true, "skipLibCheck": true,
"types": ["node"],
/* Bundler mode */ /* Bundler mode */
"moduleResolution": "bundler", "moduleResolution": "bundler",