From 376a6bd3190f88d22fefb5fadfc07fe51a0e544a Mon Sep 17 00:00:00 2001 From: Hannaeko Date: Sun, 22 Dec 2024 22:36:26 +0100 Subject: [PATCH] wip: templating --- Cargo.lock | 418 +++++++++- Cargo.toml | 5 +- .../inclusive-sans/InclusiveSans_wght.ttf | Bin 0 -> 88492 bytes .../inclusive-sans/InclusiveSans_wght.woff2 | Bin 0 -> 38344 bytes .../fonts/lexend/Lexend-VariableFont_wght.ttf | Bin 0 -> 176220 bytes .../lexend/Lexend-VariableFont_wght.woff2 | Bin 0 -> 70872 bytes assets/styles/main.css | 201 +++++ dev-scripts/config/named.conf | 58 ++ public/images/plus.svg | 3 - public/scripts/api.js | 44 - public/scripts/records.js | 328 -------- public/scripts/vendor/licenses.txt | 7 - public/scripts/vendor/preact/LICENSE-htm | 202 ----- public/scripts/vendor/preact/LICENSE-preact | 21 - public/scripts/vendor/preact/standalone.js | 1 - public/styles/login.css | 13 - public/styles/main.css | 158 ---- public/styles/zone.css | 183 ----- src/dns/dns_driver.rs | 3 +- src/dns/mod.rs | 5 +- src/dns/rdata.rs | 528 ------------ src/dns/record.rs | 128 --- src/errors.rs | 23 +- src/main.rs | 47 +- src/ressouces/class.rs | 40 - src/ressouces/errors.rs | 176 ---- src/ressouces/mod.rs | 2 + src/ressouces/name.rs | 94 --- src/ressouces/rdata.rs | 768 ++++++++++++------ src/ressouces/record.rs | 200 ++--- src/ressouces/zone.rs | 16 +- src/routes/api/zones.rs | 10 +- src/routes/mod.rs | 2 +- src/routes/ui/mod.rs | 5 +- src/routes/ui/zones.rs | 130 +-- src/template.rs | 72 +- templates/bases/app.html | 36 +- templates/bases/base.html | 2 +- templates/macros.html | 11 - templates/pages/login.html | 25 - templates/pages/records.html | 103 +++ templates/pages/zone/records.html | 43 - templates/pages/zones.html | 3 - templates/pages/zones/new.html | 18 - 44 files changed, 1528 insertions(+), 2604 deletions(-) create mode 100644 assets/fonts/inclusive-sans/InclusiveSans_wght.ttf create mode 100644 assets/fonts/inclusive-sans/InclusiveSans_wght.woff2 create mode 100644 assets/fonts/lexend/Lexend-VariableFont_wght.ttf create mode 100644 assets/fonts/lexend/Lexend-VariableFont_wght.woff2 create mode 100644 assets/styles/main.css create mode 100644 dev-scripts/config/named.conf delete mode 100644 public/images/plus.svg delete mode 100644 public/scripts/api.js delete mode 100644 public/scripts/records.js delete mode 100644 public/scripts/vendor/licenses.txt delete mode 100644 public/scripts/vendor/preact/LICENSE-htm delete mode 100644 public/scripts/vendor/preact/LICENSE-preact delete mode 100644 public/scripts/vendor/preact/standalone.js delete mode 100644 public/styles/login.css delete mode 100644 public/styles/main.css delete mode 100644 public/styles/zone.css delete mode 100644 src/dns/rdata.rs delete mode 100644 src/dns/record.rs delete mode 100644 src/ressouces/class.rs delete mode 100644 src/ressouces/errors.rs delete mode 100644 src/ressouces/name.rs delete mode 100644 templates/macros.html delete mode 100644 templates/pages/login.html create mode 100644 templates/pages/records.html delete mode 100644 templates/pages/zone/records.html delete mode 100644 templates/pages/zones.html delete mode 100644 templates/pages/zones/new.html diff --git a/Cargo.lock b/Cargo.lock index c2138e4..a958475 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "async-lock" version = "3.4.0" @@ -59,9 +68,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.8.0-alpha.1" +version = "0.8.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4132c8995c63b222c56f38b80748c23323d7012d1f783b0f42e92782c2676690" +checksum = "47b212eb691030da38f1eff381777e431eb6f0760a0d02ffcb1702f1da9894e2" dependencies = [ "axum-core", "bytes", @@ -91,9 +100,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.0-alpha.1" +version = "0.5.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3405ae79f3aab93ae35fe2944aff9bf0f5aac918c0229f3528043c5a454d17d" +checksum = "30256e79153b08607dcf9e0a72bd31564bc9228b9f145d1e1a29e3d01ad1fd16" dependencies = [ "bytes", "futures-util", @@ -140,6 +149,25 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786a307d683a5bf92e6fd5fd69a7eb613751668d1d8d67d802846dfe367c62c8" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -182,6 +210,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -191,6 +228,16 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + [[package]] name = "crossbeam-epoch" version = "0.9.18" @@ -206,6 +253,16 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "deranged" version = "0.3.11" @@ -215,6 +272,16 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "domain" version = "0.10.3" @@ -307,6 +374,12 @@ dependencies = [ "syn", ] +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + [[package]] name = "futures-task" version = "0.3.31" @@ -327,6 +400,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -344,6 +427,30 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "globwalk" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" +dependencies = [ + "bitflags", + "ignore", + "walkdir", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -396,6 +503,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + [[package]] name = "httparse" version = "1.9.5" @@ -443,6 +556,22 @@ dependencies = [ "tower-service", ] +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "itoa" version = "1.0.14" @@ -459,6 +588,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.168" @@ -493,9 +628,9 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchit" -version = "0.8.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e8fcd7bd6025a951597d6ba2f8e48a121af7e262f2b52a006a09c8d61f9304" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" @@ -509,6 +644,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.8.0" @@ -548,7 +693,7 @@ dependencies = [ "rustc_version", "smallvec", "tagptr", - "thiserror", + "thiserror 1.0.69", "triomphe", "uuid", ] @@ -564,7 +709,9 @@ dependencies = [ "rusqlite", "serde", "serde_json", + "tera", "tokio", + "tower-http", ] [[package]] @@ -633,6 +780,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.9", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pin-project-lite" version = "0.2.15" @@ -747,6 +939,35 @@ dependencies = [ "bitflags", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "ring" version = "0.17.8" @@ -803,6 +1024,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -869,6 +1099,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -929,13 +1170,38 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" +[[package]] +name = "tera" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee" +dependencies = [ + "globwalk", + "lazy_static", + "pest", + "pest_derive", + "regex", + "serde", + "serde_json", + "unic-segment", +] + [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", ] [[package]] @@ -949,6 +1215,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "time" version = "0.3.37" @@ -996,6 +1273,19 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "tower" version = "0.5.2" @@ -1011,6 +1301,31 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1060,6 +1375,74 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-segment" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" +dependencies = [ + "unic-ucd-segment", +] + +[[package]] +name = "unic-ucd-segment" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicase" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" + [[package]] name = "unicode-ident" version = "1.0.14" @@ -1093,6 +1476,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1179,6 +1572,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 478fedb..c3efee2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,9 +18,10 @@ tokio = {version = "1", default-features = false, features = [ "macros", "rt-mul #clap = { version = "4", features = [ "derive", "cargo" ] } #argon2 = { version = "0.5", default-features = false, features = ["alloc", "password-hash"] } #rand = "0.8" -#tera = { version = "1", default-features = false } +tera = { version = "1", default-features = false } domain = { version = "0.10.3", features = [ "tsig", "unstable-client-transport" ]} -axum = { version = "0.8.0-alpha.1", default-features = false, features = [ "http1", "json", "form", "query", "tokio" ]} +axum = { version = "0.8.0-rc.1", default-features = false, features = [ "http1", "json", "form", "query", "tokio" ]} bb8 = { version = "0.9" } rusqlite = { version = "0.32"} async-trait = { version = "0.1" } +tower-http = { version = "0.6", default-features = false, features = [ "fs" ]} diff --git a/assets/fonts/inclusive-sans/InclusiveSans_wght.ttf b/assets/fonts/inclusive-sans/InclusiveSans_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c5193d083c282c6ef3e36eaa62ff16e8b746e944 GIT binary patch literal 88492 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/lexend/Lexend-VariableFont_wght.ttf b/assets/fonts/lexend/Lexend-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f4eb50d2fb2ea78586d7bc34dd255ce1a0236f27 GIT binary patch literal 176220 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�?q>hEqaib<9><}xOj*=Gj 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

7%Fzy4%BMEyGc<8NTW)cA^}6+^9~+PBE_!*MVZZ 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�zkcz{A?Ny>BUHkUz(SnJttsuT-l+KSFXNNb(2w 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 literal 0 HcmV?d00001 diff --git a/assets/styles/main.css b/assets/styles/main.css new file mode 100644 index 0000000..2ed9d6a --- /dev/null +++ b/assets/styles/main.css @@ -0,0 +1,201 @@ +@font-face { + font-family: 'Lexend'; + font-weight: 100 900; + font-style: normal; + font-display: swap; + src: url("/assets/fonts/lexend/Lexend-VariableFont_wght.woff2") format("woff2"), + url("/assets/fonts/lexend/Lexend-VariableFont_wght.ttf") format("truetype"); +} + +html, body { + margin: 0; + font-family: 'Lexend', 'sans'; + font-size: 18px; + font-weight: 300; +} + +*, *::after, *::before { + box-sizing: border-box; +} + +main { + max-width: 55rem; + margin: auto; +} + +article.domain { + margin-bottom: 2em; +} + +article.domain header { + display: flex; + align-items: center; + height: 3em; +} + +article.domain header h3.folder-tab { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + padding: 0 1em; + border-top-left-radius: .3rem; + background-color: #f2e0fd; + margin: 0; + font-weight: inherit; + font-size: 1.3rem; +} + +article.domain header h3.folder-tab ~ .sep { + content: ''; + width: 3em; + background-color: #f2e0fd; + height: 100%; + clip-path: url("#corner-folder-tab-right"); +} + +article.domain .records > ul { + background: #f2e0fd; + margin: 0; + padding: 0; + list-style: none; + padding: 1rem;; + border-radius: 0 .3rem .3rem .3rem; + display: grid; + grid-template-columns: auto 1fr; + row-gap: 1rem; + column-gap: 0; +} + +article.domain .records .rrset { + display: grid; + align-items: baseline; + grid-template-columns: subgrid; + grid-column: 1 / 3; +} + +article.domain .records .rrset .rtype { + display: flex; + align-items: baseline; + gap: .5em; +} + +article.domain .records .rrset .rtype::after { + content: ''; + display: block; + flex: 1; + border-bottom: .2rem solid #850085; + padding-left: 1em; + position: relative; + bottom: .25rem; +} + +article.domain .records .rrset ul { + padding: 0; + display: flex; + flex-direction: column; + gap: .5rem; +} + + +article.domain .records .rrset li { + align-items: baseline; + position: relative; + display: flex; + gap: .5rem; +} + +article.domain .records .rrset li::before { + content: ''; + height: 1em; + width: 1rem; + border-bottom: .2rem solid #850085; + position: relative; + bottom: .25rem; +} + +article.domain .records .rrset li:not(:first-child)::before { + border-left: .2rem solid #850085; + border-bottom-left-radius: .3rem; +} + +article.domain .records .rrset li:not(:last-child)::after { + content: ''; + height: 100%; + width: 1rem; + position: absolute; + top: 1.1em; + border-left: .2rem solid #850085; +} + +article.domain .records .rrset .rdata-main { + display: flex; + gap: .3rem; +} + +article.domain .records .rrset .rdata-main .pill { + background-color: white; +} + +article.domain .records .rrset .rdata-complementary { + margin-top: .2em; + font-size: .9em; + gap: .2rem; + display: flex; +} + +article.domain .records .rrset .action { + display: flex; + gap: .5rem; + position: relative; + top: .15rem; +} + +.pill { + border: .1rem solid #bd79bd; + border-radius: .3rem; + padding: 0 .2em; +} + +button, +a.button { + border: .2rem solid #850085; + border-radius: 1.4em; + padding: .2em .8em; + color: #850085; + text-decoration: none; + display: flex; + align-items: center; + justify-content: center; + gap: .3em; + background-color: white; + font-size: 1rem; + cursor: pointer; + transition: background-color .2s, color .2s; +} + +button svg, +a.button svg { + height: 1em; + width: 1em; +} + +.records button, +.records a.button { + background-color: #f2e0fd; +} + +button.icon, +a.button.icon { + padding: 0; + width: 2em; + height: 2em; +} + +button:hover, +button:focus-visible, +a.button:hover, +a.button:focus-visible { + color: white; + background-color: #850085; +} diff --git a/dev-scripts/config/named.conf b/dev-scripts/config/named.conf new file mode 100644 index 0000000..038c64c --- /dev/null +++ b/dev-scripts/config/named.conf @@ -0,0 +1,58 @@ +options { + directory "/var/cache/bind"; + listen-on port 5354 { any; }; + listen-on-v6 port 5354 { any; }; + + empty-zones-enable no; + + allow-recursion { + none; + }; + allow-transfer { + none; + }; + allow-update { + none; + }; + +}; + +logging { + channel console { + stderr; + severity debug; + }; + + + category default { console; }; + category general { console; }; + category database { console; }; + category security { console; }; + category config { console; }; + category resolver { console; }; + category xfer-in { console; }; + category xfer-out { console; }; + category notify { console; }; + category client { console; }; + category unmatched { console; }; + category queries { console; }; + category network { console; }; + category update { console; }; + category dispatch { console; }; + category dnssec { console; }; + category lame-servers { console; }; +}; + +key "dev" { + algorithm HMAC-SHA256; + secret "mbmz4J3Efm1BUjqe12M1RHsOnPjYhKQe+2iKO4tL+a4="; +}; + + +zone "example.com." { + type primary; + file "/var/lib/bind/example.com.zone"; + notify explicit; + allow-transfer { key "dev"; }; + allow-update { key "dev"; }; +}; diff --git a/public/images/plus.svg b/public/images/plus.svg deleted file mode 100644 index 5b088c0..0000000 --- a/public/images/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/public/scripts/api.js b/public/scripts/api.js deleted file mode 100644 index a1b560a..0000000 --- a/public/scripts/api.js +++ /dev/null @@ -1,44 +0,0 @@ -const baseUrl = '/api/v1'; - - -function apiGet(url) { - return fetch(`${baseUrl}/${url}`) - .then(res => { - if (!res.ok) { - // do something here - throw new Error('Not ok'); - } - return res.json(); - }); -} - -function apiPost(url, data) { - return fetch(`${baseUrl}/${url}`, { - method: 'POST', - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }) - .then(res => { - if (!res.ok) { - // do something here - throw new Error('Not ok'); - } - return res.json(); - }); -} - - -function getRecords(zone) { - return apiGet(`zones/${zone}/records`); -} - -function createRecords(zone, record) { - return apiPost(`zones/${zone}/records`, record); -} - -export { - getRecords, - createRecords, -}; diff --git a/public/scripts/records.js b/public/scripts/records.js deleted file mode 100644 index 5dd03bd..0000000 --- a/public/scripts/records.js +++ /dev/null @@ -1,328 +0,0 @@ -import { html, render, useState, useEffect } from './vendor/preact/standalone.js'; - -import { getRecords, createRecords } from './api.js'; - - -const rdataInputProperties = { - Address: {label: 'Adresse', type: 'text'}, - Serial: {label: 'Numéro de série', type: 'number'}, - Minimum: {label: 'Minimum', type: 'number'}, - Retry: {label: 'Nouvelle tentative', type: 'number'}, - Refresh: {label: 'Actualisation', type: 'number'}, - MaintainerName: {label: 'Contact', type: 'text'}, - MasterServerName: {label: 'Serveur primaire', type: 'text'}, - Expire: {label: 'Expiration', type: 'number'}, - Target: {label: 'Cible', type: 'text'}, - Service: {label: 'Service', type: 'text'}, - Protocol: {label: 'Protocole', type: 'text'}, - Priority: {label: 'Priorité', type: 'number'}, - Weight: {label: 'Poids', type: 'number'}, - Port: {label: 'Port', type: 'number'}, - Server: {label: 'Serveur', type: 'text'}, -}; - -const realRecordDataConfig = { - 'A': { - friendlyType: 'address', - fields: ['Address'], - }, - 'AAAA': { - friendlyType: 'address', - fields: ['Address'], - }, - 'CNAME': { - friendlyType: 'alias', - fields: ['Target'], - }, - 'SRV': { - friendlyType: 'service', - fields: [ 'Priority', 'Weight', 'Port', 'Server' ], - }, - 'NS': { - friendlyType: 'name_server', - fields: ['Target'], - }, - 'SOA': { - friendlyType: 'soa', - fields: ['MasterServerName', 'MaintainerName', 'Refresh', 'Retry', 'Expire', 'Minimum', 'Serial'], - }, -}; - -function defaultBuildData(realRecordType) { - const defaultFields = Object.fromEntries(realRecordDataConfig[realRecordType].fields.map(field => [field, null])); - return (fields) => { - return {...defaultFields, ...fields, Type: realRecordType}; - } -} - -function defaultRecordToFields(realRecord) { - const type = realRecord.Type; - return realRecordDataConfig[type].fields.map(field => [field, realRecord[field]]); -} - -function defaultGetName(name) { - return name; -} - -function srvRecordToFields({ Name, Type, Class, ...fields }) { - const [ serviceName, protocol] = Name.split('.'); - return { - Service: serviceName.replace(/^_/, ''), - Protocol: protocol.replace(/^_/, ''), - ...fields - } -} - -function srvGetName(originalName) { - const [_serviceName, _protocol, ...name] = originalName.split('.'); - return name.join('.'); -} - -function buildAddressRecord(fields) { - const address = fields.Address || ''; - if (address.indexOf('.') >= 0) { - fields.Type = 'A'; - } else if (address.indexOf(':') >= 0) { - fields.Type = 'AAAA'; - } else { - fields.Type = ''; - } - return fields; -} - -function buildServiceRecord({ Name, Service, Protocol, ...fields}) { - fields.Name = `_${Service}._${Protocol}.${Name}`; - fields.Type = 'SRV'; - return fields; -} - -const friendlyRecordDataConfig = { - 'address': { - realRecordToFields: defaultRecordToFields, - fields: realRecordDataConfig['AAAA'].fields, - buildData: buildAddressRecord, - getName: defaultGetName, - }, - 'alias': { - realRecordToFields: defaultRecordToFields, - fields: realRecordDataConfig['CNAME'].fields, - buildData: defaultBuildData('CNAME'), - getName: defaultGetName, - }, - 'name_server': { - realRecordToFields: defaultRecordToFields, - fields: realRecordDataConfig['NS'].fields, - buildData: defaultBuildData('NS'), - getName: defaultGetName, - }, - 'soa': { - realRecordToFields: defaultRecordToFields, - fields: realRecordDataConfig['SOA'].fields, - buildData: defaultBuildData('SOA'), - getName: defaultGetName, - }, - 'service': { - realRecordToFields: srvRecordToFields, - fields: ['Service', 'Protocol', 'Priority', 'Weight', 'Port', 'Server'], - buildData: buildServiceRecord, - getName: srvGetName, - }, -}; - - -const recordTypeNames = { - 'address': 'Adresse IP', - 'service': 'Service', - 'alias': 'Alias', - 'name_server': 'Serveur de nom', - 'soa': 'SOA', -} - -/* Name to use with spf for example */ -function getFriendlyTypeForRecord(name, type) { - return realRecordDataConfig[type].friendlyType; -} - -function processRecords(records) { - return records.reduce((acc, record) => { - let type = getFriendlyTypeForRecord(record.Name, record.Type); - let name = friendlyRecordDataConfig[type].getName(record.Name); - if (!(name in acc)) { - acc[name] = {}; - } - if (!(type in acc[name])) { - acc[name][type] = []; - } - acc[name][type].push(record); - return acc; - }, {}); -} - -function FriendlyRecord({type, record}) { - let keys = friendlyRecordDataConfig[type].realRecordToFields(record); - if (keys.length == 1) { - return html`${keys[0][1]}`; - } else { - return html` -

- ${keys.map(([name, value]) => {return html`
${rdataInputProperties[name].label}
${value}
`})} -
- `; - } -} - -function RecordsByName({ name, recordSets }) { - return html` -
-

${name}

-
- ${Object.entries(recordSets).map( - ([type, records]) => { - return html` -
-

${recordTypeNames[type]}

-
    - ${records.map(record => html`
  • <${FriendlyRecord} type=${type} record=${record}/>
  • `)} -
-
- `; - } - )} -
-
- `; -} - -function RecordListFriendly({ zone }) { - const [records, setRecords] = useState({}); - const [editable, setEditable] = useState(false); - - useEffect(() => { - getRecords(zone) - .then((res) => setRecords(processRecords(res))); - }, [zone]); - - return html` - ${Object.entries(records).map( - ([name, recordSets]) => { - return html` - <${RecordsByName} name=${name} recordSets=${recordSets}/> - `; - } - )} - `; -} - -function NewRecordFormFriendly({ zone }) { - const defaultVaules = {Name: '', TTL: 3600, Class: 'IN'}; - const [recordType, setRecordType] = useState(Object.keys(recordTypeNames)[0]); - const [recordData, setRecordData] = useState(defaultVaules); - const [realRecordData, setRealRecordData] = useState({}); - const [realType, setRealType] = useState(''); - - const absoluteName = (name) => name ? `${name}.${zone}` : zone; - - const setRecordDataFactory = (field) => { - return (e) => { - const newData = {...recordData}; - newData[field] = e.target.type == 'number' ? Number(e.target.value) : e.target.value; - const newRealRecordData = friendlyRecordDataConfig[recordType].buildData({...newData, Class: 'IN', Name: absoluteName(newData.Name)}) - - setRecordData(newData); - setRealRecordData(newRealRecordData); - setRealType(newRealRecordData.Type); - } - } - - const createNewRecord = (e) => { - e.preventDefault(); - const newRecords = [realRecordData]; - console.log(newRecords) - createRecords(zone, newRecords); - } - - const resetData = (resetName = false) => { - setRealType(''); - const newName = resetName ? defaultVaules.Name : recordData.Name; - setRecordData({ Name: newName, TTL: defaultVaules.TTL }); - setRealRecordData({...defaultVaules, Name: absoluteName(newName)}); - } - - useEffect(() => resetData(true), []); - - // TODO: Reset valeurs champs quand changement de type + "annuler" => bound la valeur de l'input au state - // TODO: Dans le cas où un domain est dans le RDATA mettre le domaine absolue dans la preview - // TODO: Déplacer preview dans son component, faire une vue en "diff" et l'appeler "prévisualisation des changements" - // TODO: Validation des données client et serveur - - return html` -
-
-

Nouvel enregistrement

-
-
-
-
- -
- - .${ zone } -
-
-
- - -
-
- ${friendlyRecordDataConfig[recordType].fields.map(fieldName => html` -
- - -
- `)} -
-
- - -
-
-
-

Prévisualisation des changements

-

- Ajout - - ${realRecordData.Name === zone ? '@' : realRecordData.Name} ${realRecordData.TTL} ${realRecordData.Class} ${realType} ${realType != '' ? realRecordDataConfig[realType].fields.map(field => realRecordData[field]).join(' ') : ''} - -

-
-
- - -
-
-
- `; -} - -function ZoneRecords({ zone }) { - return html` - <${NewRecordFormFriendly} zone=${zone}/> - -
-
-

Contenu de la zone

- -
- -
- <${RecordListFriendly} zone=${zone} /> -
-
- `; -} - -export default function(element, { zone }) { - render(html`<${ZoneRecords} zone=${zone} />`, element); -}; diff --git a/public/scripts/vendor/licenses.txt b/public/scripts/vendor/licenses.txt deleted file mode 100644 index 602b9c6..0000000 --- a/public/scripts/vendor/licenses.txt +++ /dev/null @@ -1,7 +0,0 @@ -htm@3.1.1 - Apache-2.0 - Copyright 2018 Google Inc. - Full license: ./preact/LICENSE-htm - -preact@10.7.1 - MIT - Copyright (c) 2015-present Jason Miller - Full license: ./preact/LICENSE-preact diff --git a/public/scripts/vendor/preact/LICENSE-htm b/public/scripts/vendor/preact/LICENSE-htm deleted file mode 100644 index f107611..0000000 --- a/public/scripts/vendor/preact/LICENSE-htm +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018 Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/public/scripts/vendor/preact/LICENSE-preact b/public/scripts/vendor/preact/LICENSE-preact deleted file mode 100644 index da5389a..0000000 --- a/public/scripts/vendor/preact/LICENSE-preact +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-present Jason Miller - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/public/scripts/vendor/preact/standalone.js b/public/scripts/vendor/preact/standalone.js deleted file mode 100644 index e24f87b..0000000 --- a/public/scripts/vendor/preact/standalone.js +++ /dev/null @@ -1 +0,0 @@ -var e,n,_,t,o,r,u,l={},i=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(e,n){for(var _ in n)e[_]=n[_];return e}function f(e){var n=e.parentNode;n&&n.removeChild(e)}function a(n,_,t){var o,r,u,l={};for(u in _)"key"==u?o=_[u]:"ref"==u?r=_[u]:l[u]=_[u];if(arguments.length>2&&(l.children=arguments.length>3?e.call(arguments,2):t),"function"==typeof n&&null!=n.defaultProps)for(u in n.defaultProps)void 0===l[u]&&(l[u]=n.defaultProps[u]);return p(n,l,o,r,null)}function p(e,t,o,r,u){var l={type:e,props:t,key:o,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==u?++_:u};return null!=n.vnode&&n.vnode(l),l}function h(e){return e.children}function d(e,n){this.props=e,this.context=n}function v(e,n){if(null==n)return e.__?v(e.__,e.__.__k.indexOf(e)+1):null;for(var _;n0?p(m.type,m.props,m.key,null,m.__v):m)){if(m.__=_,m.__b=_.__b+1,null===(y=H[a])||y&&m.key==y.key&&m.type===y.type)H[a]=void 0;else for(d=0;d=t.__.length&&t.__.push({}),t.__[e]}function G(e){return R=1,z(ie,e)}function z(e,n,_){var t=j(L++,2);return t.t=e,t.__c||(t.__=[_?_(n):ie(void 0,n),function(e){var n=t.t(t.__[0],e);t.__[0]!==n&&(t.__=[n,t.__[1]],t.__c.setState({}))}],t.__c=N),t.__}function J(e,_){var t=j(L++,3);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__H.__h.push(t))}function K(e,_){var t=j(L++,4);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__h.push(t))}function Q(e){return R=5,Y(function(){return{current:e}},[])}function X(e,n,_){R=6,K(function(){"function"==typeof e?e(n()):e&&(e.current=n())},null==_?_:_.concat(e))}function Y(e,n){var _=j(L++,7);return le(_.__H,n)&&(_.__=e(),_.__H=n,_.__h=e),_.__}function Z(e,n){return R=8,Y(function(){return e},n)}function ee(e){var n=N.context[e.__c],_=j(L++,9);return _.c=e,n?(null==_.__&&(_.__=!0,n.sub(N)),n.props.value):e.__}function ne(e,_){n.useDebugValue&&n.useDebugValue(_?_(e):e)}function _e(e){var n=j(L++,10),_=G();return n.__=e,N.componentDidCatch||(N.componentDidCatch=function(e){n.__&&n.__(e),_[1](e)}),[_[0],function(){_[1](void 0)}]}function te(){I.forEach(function(e){if(e.__P)try{e.__H.__h.forEach(re),e.__H.__h.forEach(ue),e.__H.__h=[]}catch(_){e.__H.__h=[],n.__e(_,e.__v)}}),I=[]}n.__b=function(e){N=null,O&&O(e)},n.__r=function(e){V&&V(e),L=0;var n=(N=e.__c).__H;n&&(n.__h.forEach(re),n.__h.forEach(ue),n.__h=[])},n.diffed=function(e){q&&q(e);var _=e.__c;_&&_.__H&&_.__H.__h.length&&(1!==I.push(_)&&W===n.requestAnimationFrame||((W=n.requestAnimationFrame)||function(e){var n,_=function(){clearTimeout(t),oe&&cancelAnimationFrame(n),setTimeout(e)},t=setTimeout(_,100);oe&&(n=requestAnimationFrame(_))})(te)),N=void 0},n.__c=function(e,_){_.some(function(e){try{e.__h.forEach(re),e.__h=e.__h.filter(function(e){return!e.__||ue(e)})}catch(t){_.some(function(e){e.__h&&(e.__h=[])}),_=[],n.__e(t,e.__v)}}),B&&B(e,_)},n.unmount=function(e){$&&$(e);var _=e.__c;if(_&&_.__H)try{_.__H.__.forEach(re)}catch(e){n.__e(e,_.__v)}};var oe="function"==typeof requestAnimationFrame;function re(e){var n=N;"function"==typeof e.__c&&e.__c(),N=n}function ue(e){var n=N;e.__c=e.__(),N=n}function le(e,n){return!e||e.length!==n.length||n.some(function(n,_){return n!==e[_]})}function ie(e,n){return"function"==typeof n?n(e):n}var ce=function(e,n,_,t){var o;n[0]=0;for(var r=1;r=5&&((o||!e&&5===t)&&(u.push(t,0,o,_),t=6),e&&(u.push(t,e,0,_),t=6)),o=""},i=0;i"===n?(t=1,o=""):o=n+o[0]:r?n===r?r="":o+=n:'"'===n||"'"===n?r=n:">"===n?(l(),t=1):t&&("="===n?(t=5,_=o,o=""):"/"===n&&(t<5||">"===e[i][c+1])?(l(),3===t&&(u=u[0]),t=u,(u=u[0]).push(2,0,t),t=0):" "===n||"\t"===n||"\n"===n||"\r"===n?(l(),t=2):o+=n),3===t&&"!--"===o&&(t=4,u=u[0])}return l(),u}(e)),n),arguments,[])).length>1?n:n[0]}.bind(a);export{a as h,fe as html,M as render,d as Component,F as createContext,G as useState,z as useReducer,J as useEffect,K as useLayoutEffect,Q as useRef,X as useImperativeHandle,Y as useMemo,Z as useCallback,ee as useContext,ne as useDebugValue,_e as useErrorBoundary}; diff --git a/public/styles/login.css b/public/styles/login.css deleted file mode 100644 index d1c085f..0000000 --- a/public/styles/login.css +++ /dev/null @@ -1,13 +0,0 @@ -form { - flex-grow: 1; - max-width: 40ch; - margin: 25vh auto 0 auto; -} - -main { - flex-direction: row; -} - -h1 { - text-align: center; -} diff --git a/public/styles/main.css b/public/styles/main.css deleted file mode 100644 index 860c1bd..0000000 --- a/public/styles/main.css +++ /dev/null @@ -1,158 +0,0 @@ -body { - display: flex; - min-height: 100vh; - min-width: 100vw; - margin: 0; - font-family: sans-serif; - line-height: 1.5; -} - -:root { - --color-primary: 94, 12, 151; - --color-hightlight-1: 255, 212, 186; - --color-hightlight-2: 208, 44, 167; - --color-contrast: white; -} - -main { - flex-grow: 1; - display: flex; - padding: 1rem; - flex-direction: column; -} - -h1 { - margin-top: 0; - margin-bottom: 1rem; -} - -a { - color: rgb(var(--color-primary)); - text-decoration: none; - position: relative; - padding-bottom: .3em; -} - -a::after { - content: ""; - display: block; - width: 100%; - border-bottom: 2px solid rgb(var(--color-primary)); - position: absolute; - bottom: .1em; - transition: .2s; -} - -a:hover::after { - bottom: .3em; -} - -p.feedback { - padding: .35rem; - margin: 0; -} - -p.feedback.error { - background: #fddede; - color: #710000; -} - -select, -input { - border: 1px solid rgb(var(--color-primary));; - border-radius: 0; - background: var(--color-contrast); -} - -select, -button, -input { - padding: .35rem .35rem; - font-size: 1rem; -} - -button, -input[type="submit"] { - background: rgb(var(--color-primary)); - color: var(--color-contrast); - border-left: 5px solid rgb(var(--color-hightlight-1)); - border-top: 5px solid rgb(var(--color-hightlight-1)); - border-right: 5px solid rgb(var(--color-hightlight-2)); - border-bottom: 5px solid rgb(var(--color-hightlight-2)); -} - -button:hover:not([disabled]), -input[type="submit"]:hover:not([disabled]) { - background: rgba(var(--color-primary), .8); -} - -button:active:not([disabled]) , -input[type="submit"]:active:not([disabled]) { - border-left: 5px solid rgb(var(--color-hightlight-2)); - border-top: 5px solid rgb(var(--color-hightlight-2)); - border-right: 5px solid rgb(var(--color-hightlight-1)); - border-bottom: 5px solid rgb(var(--color-hightlight-1)); -} - -button[disabled], -input[type="submit"][disabled] { - background: rgba(var(--color-primary), .75); - border-left-color: rgba(var(--color-hightlight-1), .75); - border-top-color: rgba(var(--color-hightlight-1), .75); - border-right-color: rgba(var(--color-hightlight-2), .75); - border-bottom-color: rgba(var(--color-hightlight-2), .75); - cursor: not-allowed; -} - -form input[type="submit"] { - margin-top: 2rem; -} - -form label { - margin-top: .75em; -} - -form { - display: flex; - flex-direction: column; - width: fit-content; -} - -nav.main { - background: rgb(var(--color-primary)); - min-width: 25ch; - display: flex; - flex: 0; - padding: 1rem; - border-right: 5px solid rgb(var(--color-hightlight-2)); -} - -nav.main a { - color: var(--color-contrast); -} - -nav.main a::after { - border-bottom: 2px solid var(--color-contrast); -} - - -nav.main a img { - filter: invert(100%); - width: 1.4em; - margin-bottom: -.3em; -} - - -nav.main ul { - list-style: none; - padding: 0; - margin: 0; -} - -nav.main ul li { - margin-top: .35rem; -} - -nav.main ul ul { - margin-left: 1rem; -} diff --git a/public/styles/zone.css b/public/styles/zone.css deleted file mode 100644 index 2fb3023..0000000 --- a/public/styles/zone.css +++ /dev/null @@ -1,183 +0,0 @@ -nav.secondary ul { - display: flex; - margin: 0; - list-style: none; - padding: 0; -} - -nav.secondary li { - margin-right: 1rem; -} - -main > section { - max-width: 120ch; -} - -header { - display: flex; - margin: 1rem 0; -} - -h2 { - margin: 0; - flex-grow: 1; -} - -header > :not(:last-of-type) { - margin-right: 2ch; -} - -.zone-content article.rrsets-per-name { - display: grid; - grid-template-columns: repeat(6, 1fr); - grid-gap: 2ch; - margin: .5rem 0; -} - -.zone-content article.rrsets-per-name:not(:last-of-type) { - border-bottom: 2px solid rgb(var(--color-hightlight-2)); -} - -.zone-content h3.record-name, -.zone-content h4.record-type { - margin: 0; - font-weight: normal; - font-size: 1rem; -} - -.zone-content h3.record-name { - grid-column: 1 / 3; -} - -.zone-content div.rrsets-per-type { - grid-column: 3 / 7; -} - -.zone-content article.rrset-per-type { - grid-template-columns: repeat(4, 1fr); - display: grid; - grid-gap: 2ch; -} - -.zone-content h4.record-type { - grid-column: 1 / 2; -} - -.zone-content ul.rrset-rdata { - padding: 0; - margin: 0; - list-style-type: none; - grid-column: 2 / 5; -} - -.zone-content ul.rrset-rdata dl { - display: grid; - grid-template: auto / max-content 1fr; -} - -.zone-content ul.rrset-rdata dd { - margin: 0; -} - -.zone-content ul.rrset-rdata dt span { - display: inline-block; - background-color: rgb(var(--color-hightlight-1)); - padding: 0.1em 0.5em; - border-radius: 0.5em; - margin-right: 0.1rem; - font-size: .7rem; -} - -.new-record form { - width: auto; -} - -.new-record form > div.form-row > * { - flex-grow: 1; -} - -.new-record form > div.form-row { - display: flex; - flex-wrap: wrap; - gap: 2ch; -} - -.new-record form label { - margin-top: .25rem; -} - -form div.input-group { - display: flex; - flex-direction: column; -} - -form div.combined-input { - display: flex; -} - -form div.combined-input input { - height: min-content; - flex-grow: 1; -} - -form div.combined-input span { - font-size: .8rem; - padding: .35rem; - border: 1px solid rgb(var(--color-primary));; - border-left: none; - background: rgba(var(--color-hightlight-2),.2); -} - -form.disabled { - display: none; -} - -.new-record form button, -.new-record form input[type="submit"] { - margin-right: 1ch; - margin-top: .75rem; -} - -.new-record header { - margin-bottom: 0; -} - -.new-record form .preview { - margin: .5rem 0; - border: 1px solid rgb(var(--color-primary)); -} - -.new-record form .preview p:first-of-type { - margin-top: .5rem; -} - -.new-record form .preview p:last-of-type { - margin-bottom: .5rem; -} - -.new-record form .preview p { - display: flex; -} - -.new-record form .preview code { - padding: 0 .5rem; - flex: 1; -} - -.new-record form .preview img { - padding: 0 .25rem; - border-right: 1px solid #1b841b; -} - -.new-record form .preview .addition { - background: #d9fbd9; -} - -.new-record form .preview h3 { - margin: 0; - padding: .0rem .5rem 0 .5rem;; - font-size: 1rem; - font-weight: normal; - background: rgb(var(--color-primary)); - color: var(--color-contrast) -} diff --git a/src/dns/dns_driver.rs b/src/dns/dns_driver.rs index 5f1181b..1a1da84 100644 --- a/src/dns/dns_driver.rs +++ b/src/dns/dns_driver.rs @@ -11,9 +11,8 @@ use domain::tsig::{Algorithm, Key, KeyName}; use domain::net::client::request::{self, RequestMessage, RequestMessageMulti, SendRequest, SendRequestMulti}; use tokio::net::TcpStream; -use super::{rdata, record}; +use crate::ressouces::{rdata, record}; use super::{RecordDriver, ZoneDriver, DnsDriverError}; -use crate::errors::Error; use async_trait::async_trait; diff --git a/src/dns/mod.rs b/src/dns/mod.rs index f00c618..624cac8 100644 --- a/src/dns/mod.rs +++ b/src/dns/mod.rs @@ -1,12 +1,13 @@ -pub mod rdata; -pub mod record; pub mod dns_driver; use std::sync::Arc; use async_trait::async_trait; +use crate::ressouces::record; + pub type BoxedZoneDriver = Arc; +pub type BoxedRecordDriver = Arc; pub enum DnsDriverError { ConnectionError { reason: Box }, OperationError { reason: Box }, diff --git a/src/dns/rdata.rs b/src/dns/rdata.rs deleted file mode 100644 index 0ad5f67..0000000 --- a/src/dns/rdata.rs +++ /dev/null @@ -1,528 +0,0 @@ -use std::fmt::Write; -use std::net::{Ipv4Addr, Ipv6Addr}; - -use domain::base::rdata::ComposeRecordData; -use domain::base::scan::Symbol; -use domain::base::wire::{Composer, ParseError}; -use domain::base::{Name, ParseRecordData, ParsedName, RecordData, Rtype, ToName, Ttl}; -use domain::rdata; -use domain::dep::octseq::{Parser, Octets}; -use serde::{Deserialize, Serialize}; - -use crate::errors::Error; -use crate::validation; - -use crate::macros::{append_errors, push_error}; -use super::record::RecordParseError; - -/// Type used to serialize / deserialize resource records data to response / request -/// -#[derive(Debug, Deserialize, Serialize)] -#[serde(tag = "type", content = "rdata")] -#[serde(rename_all = "UPPERCASE")] -pub enum RData { - A(A), - Aaaa(Aaaa), - // TODO: CAA - Cname(Cname), - // TODO: DS - Mx(Mx), - Ns(Ns), - Ptr(Ptr), - Soa(Soa), - Srv(Srv), - // TODO: SSHFP - // TODO: SVCB / HTTPS - // TODO: TLSA - Txt(Txt), -} - -pub enum ParsedRData { - A(rdata::A), - Aaaa(rdata::Aaaa), - Cname(rdata::Cname), - Mx(rdata::Mx), - Ns(rdata::Ns), - Ptr(rdata::Ptr), - Soa(rdata::Soa), - Srv(rdata::Srv), - Txt(rdata::Txt), -} - -impl> From> for RData { - fn from(value: ParsedRData) -> Self { - match value { - ParsedRData::A(record_rdata) => RData::A(record_rdata.into()), - ParsedRData::Aaaa(record_rdata) => RData::Aaaa(record_rdata.into()), - ParsedRData::Cname(record_rdata) => RData::Cname(record_rdata.into()), - ParsedRData::Mx(record_rdata) => RData::Mx(record_rdata.into()), - ParsedRData::Ns(record_rdata) => RData::Ns(record_rdata.into()), - ParsedRData::Ptr(record_rdata) => RData::Ptr(record_rdata.into()), - ParsedRData::Soa(record_rdata) => RData::Soa(record_rdata.into()), - ParsedRData::Srv(record_rdata) => RData::Srv(record_rdata.into()), - ParsedRData::Txt(record_rdata) => RData::Txt(record_rdata.into()), - } - } -} - -impl TryFrom for ParsedRData>, Vec> { - type Error = Vec; - - fn try_from(value: RData) -> Result { - let rdata = match value { - RData::A(record_rdata) => ParsedRData::A(record_rdata.parse_record()?), - RData::Aaaa(record_rdata) => ParsedRData::Aaaa(record_rdata.parse_record()?), - RData::Cname(record_rdata) => ParsedRData::Cname(record_rdata.parse_record()?), - RData::Mx(record_rdata) => ParsedRData::Mx(record_rdata.parse_record()?), - RData::Ns(record_rdata) => ParsedRData::Ns(record_rdata.parse_record()?), - RData::Ptr(record_rdata) => ParsedRData::Ptr(record_rdata.parse_record()?), - RData::Soa(record_rdata) => ParsedRData::Soa(record_rdata.parse_record()?), - RData::Srv(record_rdata) => ParsedRData::Srv(record_rdata.parse_record()?), - RData::Txt(record_rdata) => ParsedRData::Txt(record_rdata.parse_record()?), - }; - Ok(rdata) - } -} - - - -macro_rules! parse_name { - ($value:expr, $field:ident, $rtype:literal, $errors:expr) => { - { - let name = push_error!( - validation::normalize_domain(&$value.$field), - $errors, concat!("/", stringify!($field)) - ); - - let name = name.and_then(|name| { - push_error!( - name.parse::>().map_err(|e| { - Error::from(RecordParseError::RDataUnknown { - input: $value.$field, - field: stringify!(field).to_string(), - rtype: $rtype.to_string(), - }).with_cause(&e.to_string()) - }), - $errors, concat!("/", stringify!($field)) - ) - }); - - name - } - }; -} - -/* --------- A --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct A { - pub address: String, -} - -impl From for A { - fn from(record_data: rdata::A) -> Self { - A { address: record_data.addr().to_string() } - } -} - -impl A { - pub fn parse_record(self) -> Result> { - let mut errors = Vec::new(); - - let address = push_error!(self.address.parse::().map_err(|e| { - Error::from(RecordParseError::Ip4Address { input: self.address }) - .with_cause(&e.to_string()) - .with_path("/address") - }), errors); - - if errors.is_empty() { - Ok(rdata::A::new(address.unwrap())) - } else { - Err(errors) - } - } -} - -/* --------- AAAA --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Aaaa { - pub address: String, -} - -impl From for Aaaa { - fn from(record_data: rdata::Aaaa) -> Self { - Aaaa { address: record_data.addr().to_string() } - } -} - -impl Aaaa { - pub fn parse_record(self) -> Result> { - let mut errors = Vec::new(); - - let address = push_error!(self.address.parse::().map_err(|e| { - Error::from(RecordParseError::Ip6Address { input: self.address }) - .with_cause(&e.to_string()) - .with_path("/address") - }), errors); - - if errors.is_empty() { - Ok(rdata::Aaaa::new(address.unwrap())) - } else { - Err(errors) - } - } -} - -/* --------- CNAME --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Cname { - pub target: String, -} - -impl From> for Cname { - fn from(record_data: rdata::Cname) -> Self { - Cname { target: record_data.cname().to_string() } - } -} - -impl Cname { - pub fn parse_record(self) -> Result>>, Vec> { - let mut errors = Vec::new(); - - let cname = parse_name!(self, target, "CNAME", errors); - - if errors.is_empty() { - Ok(rdata::Cname::new(cname.unwrap())) - } else { - Err(errors) - } - - } -} - -/* --------- MX --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Mx { - pub preference: u16, - pub mail_exchanger: String, -} - -impl From> for Mx { - fn from(record_data: rdata::Mx) -> Self { - Mx { - preference: record_data.preference(), - mail_exchanger: record_data.exchange().to_string() - } - } -} - -impl Mx { - fn parse_record(self) -> Result>>, Vec> { - let mut errors = Vec::new(); - - let mail_exchanger = parse_name!(self, mail_exchanger, "MX", errors); - - if errors.is_empty() { - Ok(rdata::Mx::new(self.preference, mail_exchanger.unwrap())) - } else { - Err(errors) - } - } -} - -/* --------- NS --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Ns { - pub target: String, -} - -impl From> for Ns { - fn from(record_rdata: rdata::Ns) -> Self { - Ns { - target: record_rdata.nsdname().to_string(), - } - } -} - -impl Ns { - fn parse_record(self) -> Result>>, Vec> { - let mut errors = Vec::new(); - - let ns_name = parse_name!(self, target, "NS", errors); - - if errors.is_empty() { - Ok(rdata::Ns::new(ns_name.unwrap())) - } else { - Err(errors) - } - } -} - -/* --------- PTR --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Ptr { - pub target: String, -} - -impl From> for Ptr { - fn from(record_rdata: rdata::Ptr) -> Self { - Ptr { - target: record_rdata.ptrdname().to_string(), - } - } -} - -impl Ptr { - fn parse_record(self) -> Result>>, Vec> { - let mut errors = Vec::new(); - - let ptr_name = parse_name!(self, target, "PTR", errors); - - if errors.is_empty() { - Ok(rdata::Ptr::new(ptr_name.unwrap())) - } else { - Err(errors) - } - } -} - -/* --------- SOA --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Soa { - pub primary_server: String, - pub maintainer: String, - pub refresh: u32, - pub retry: u32, - pub expire: u32, - pub minimum: u32, - pub serial: u32, -} - -impl From> for Soa { - fn from(record_rdata: rdata::Soa) -> Self { - Soa { - primary_server: record_rdata.mname().to_string(), - maintainer: record_rdata.rname().to_string(), - refresh: record_rdata.refresh().as_secs(), - retry: record_rdata.retry().as_secs(), - expire: record_rdata.expire().as_secs(), - minimum: record_rdata.minimum().as_secs(), - serial: record_rdata.serial().into(), - } - } -} - -impl Soa { - fn parse_record(self) -> Result>>, Vec> { - let mut errors = Vec::new(); - - let primary_ns = parse_name!(self, primary_server, "SOA", errors); - let maintainer = parse_name!(self, maintainer, "SOA", errors); - - if errors.is_empty() { - Ok(rdata::Soa::new( - primary_ns.unwrap(), - maintainer.unwrap(), - self.refresh.into(), - Ttl::from_secs(self.retry), - Ttl::from_secs(self.expire), - Ttl::from_secs(self.minimum), - Ttl::from_secs(self.serial), - )) - } else { - Err(errors) - } - } -} - -/* --------- SRV --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Srv { - pub server: String, - pub port: u16, - pub priority: u16, - pub weight: u16, -} - -impl From> for Srv { - fn from(record_data: rdata::Srv) -> Self { - Srv { - server: record_data.target().to_string(), - priority: record_data.priority(), - weight: record_data.weight(), - port: record_data.port(), - } - } -} - -impl Srv { - fn parse_record(self) -> Result>>, Vec> { - let mut errors = Vec::new(); - - let server = parse_name!(self, server, "SRV", errors); - - if errors.is_empty() { - Ok(rdata::Srv::new( - self.priority, - self.weight, - self.port, - server.unwrap(), - )) - } else { - Err(errors) - } - } -} - - -/* --------- TXT --------- */ - -#[derive(Debug, Deserialize, Serialize)] -pub struct Txt { - pub text: String, -} - -impl> From> for Txt { - fn from(record_data: rdata::Txt) -> Self { - let mut concatenated_text = String::new(); - for text in record_data.iter() { - for c in text { - // Escapes '\' and non printable chars - let c = Symbol::display_from_octet(*c); - write!(concatenated_text, "{}", c).unwrap(); - } - } - - Txt { - text: concatenated_text - } - } -} - -impl Txt { - fn parse_record(self) -> Result>, Vec> { - let mut errors = Vec::new(); - let data = append_errors!(validation::parse_txt_data(&self.text), errors, "/text"); - let data = data.and_then(|data| { - push_error!(rdata::Txt::build_from_slice(&data).map_err(|e| { - Error::from(RecordParseError::RDataUnknown { - input: self.text, - field: "text".into(), - rtype: "TXT".into(), - }).with_cause(&e.to_string()) - .with_path("/text") - }), errors) - }); - - - - if errors.is_empty() { - Ok(data.unwrap()) - } else { - Err(errors) - } - } -} - -/* --------- ParsedRData: domain traits impl --------- */ - -impl ParsedRData { - pub fn rtype(&self) -> Rtype { - match self { - ParsedRData::A(_) => Rtype::A, - ParsedRData::Aaaa(_) => Rtype::AAAA, - ParsedRData::Cname(_) => Rtype::CNAME, - ParsedRData::Mx(_) => Rtype::MX, - ParsedRData::Ns(_) => Rtype::NS, - ParsedRData::Ptr(_) => Rtype::PTR, - ParsedRData::Soa(_) => Rtype::SOA, - ParsedRData::Srv(_) => Rtype::SRV, - ParsedRData::Txt(_) => Rtype::TXT, - } - } -} - -impl RecordData for ParsedRData { - fn rtype(&self) -> Rtype { - ParsedRData::rtype(self) - } -} - -impl<'a, Octs: Octets + ?Sized> ParseRecordData<'a, Octs> for ParsedRData>, Octs::Range<'a>> { - fn parse_rdata( - rtype: Rtype, - parser: &mut Parser<'a, Octs>, - ) -> Result, ParseError> { - let record = match rtype { - Rtype::A => ParsedRData::A(rdata::A::parse(parser)?), - Rtype::AAAA => ParsedRData::Aaaa(rdata::Aaaa::parse(parser)?), - Rtype::CNAME => ParsedRData::Cname(rdata::Cname::parse(parser)?), - Rtype::MX => ParsedRData::Mx(rdata::Mx::parse(parser)?), - Rtype::NS => ParsedRData::Ns(rdata::Ns::parse(parser)?), - Rtype::PTR => ParsedRData::Ptr(rdata::Ptr::parse(parser)?), - Rtype::SOA => ParsedRData::Soa(rdata::Soa::parse(parser)?), - Rtype::SRV => ParsedRData::Srv(rdata::Srv::parse(parser)?), - Rtype::TXT => ParsedRData::Txt(rdata::Txt::parse(parser)?), - _ => return Ok(None) - }; - - Ok(Some(record)) - } -} - -impl> ComposeRecordData for ParsedRData { - fn rdlen(&self, compress: bool) -> Option { - match self { - ParsedRData::A(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Aaaa(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Cname(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Mx(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Ns(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Ptr(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Soa(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Srv(record_rdata) => record_rdata.rdlen(compress), - ParsedRData::Txt(record_rdata) => record_rdata.rdlen(compress), - } - } - - fn compose_rdata( - &self, - target: &mut Target, - ) -> Result<(), Target::AppendError> { - match self { - ParsedRData::A(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Aaaa(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Cname(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Mx(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Ns(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Ptr(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Soa(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Srv(record_rdata) => record_rdata.compose_rdata(target), - ParsedRData::Txt(record_rdata) => record_rdata.compose_rdata(target), - } - } - - fn compose_canonical_rdata( - &self, - target: &mut Target, - ) -> Result<(), Target::AppendError> { - match self { - ParsedRData::A(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Aaaa(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Cname(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Mx(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Ns(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Ptr(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Soa(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Srv(record_rdata) => record_rdata.compose_canonical_rdata(target), - ParsedRData::Txt(record_rdata) => record_rdata.compose_canonical_rdata(target), - } - } -} diff --git a/src/dns/record.rs b/src/dns/record.rs deleted file mode 100644 index 4de8cbc..0000000 --- a/src/dns/record.rs +++ /dev/null @@ -1,128 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use domain::base::{iana::Class, Name, Record as DnsRecord, Ttl}; - -use crate::{errors::Error, validation}; -use crate::macros::{append_errors, push_error}; -use super::rdata::{ParsedRData, RData}; - -pub enum RecordParseError { - Ip4Address { input: String }, - Ip6Address { input: String }, - RDataUnknown { input: String, field: String, rtype: String }, - NameUnknown { input: String }, - NotInZone { name: String, zone: String }, -} - -pub enum RecordError { - Validation { suberrors: Vec }, -} - -pub(crate) type DnsRecordImpl = DnsRecord< - Name>, - ParsedRData>,Vec> ->; - -#[derive(Debug, Deserialize, Serialize)] -pub struct Record { - pub name: String, - pub ttl: u32, - #[serde(flatten)] - pub rdata: RData -} - -impl> From>> for Record { - fn from(value: DnsRecord>) -> Self { - Record { - name: value.owner().to_string(), - ttl: value.ttl().as_secs(), - rdata: value.into_data().into(), - } - } -} - -impl Record { - fn convert(self, zone_name: &Name>) -> Result> { - let mut errors = Vec::new(); - - let name = push_error!(validation::normalize_domain(&self.name), errors, "/name"); - - let name = name.and_then(|name| push_error!(name.parse::>().map_err(|e| { - Error::from(RecordParseError::NameUnknown { - input: self.name.clone() - }).with_cause(&e.to_string()) - }), errors, "/name")); - - let name = name.and_then(|name| { - if !name.ends_with(zone_name) { - errors.push( - Error::from(RecordParseError::NotInZone { name: self.name, zone: zone_name.to_string() }) - .with_path("/name") - ); - None - } else { - Some(name) - } - }); - - let ttl = Ttl::from_secs(self.ttl); - let rdata = append_errors!(ParsedRData::try_from(self.rdata), errors, "/rdata"); - - if errors.is_empty() { - Ok(DnsRecord::new(name.unwrap(), Class::IN, ttl, rdata.unwrap())) - } else { - Err(errors) - } - } -} - - -#[derive(Debug, Deserialize)] -pub struct RecordList(Vec); - -impl RecordList { - fn convert(self, zone_name: &Name>) -> Result, Vec> { - let mut errors = Vec::new(); - let mut records = Vec::new(); - - for (index, record) in self.0.into_iter().enumerate() { - let record = append_errors!(record.convert(zone_name), errors, &format!("/{index}")); - - if let Some(record) = record { - records.push(record) - } - } - - if errors.is_empty() { - Ok(records) - } else { - Err(errors) - } - } -} - -#[derive(Debug,Deserialize)] -pub struct AddRecordsRequest { - pub new_records: RecordList -} - -pub struct AddRecords { - pub new_records: Vec -} - -impl AddRecordsRequest { - pub fn validate(self, zone_name: &str) -> Result { - let zone_name: Name> = zone_name.parse().expect("zone name is assumed to be valid"); - - let mut errors = Vec::new(); - let records = append_errors!(self.new_records.convert(&zone_name), errors, "/new_records"); - - if errors.is_empty() { - Ok(AddRecords { - new_records: records.unwrap(), - }) - } else { - Err(Error::from(RecordError::Validation { suberrors: errors })) - } - } -} diff --git a/src/errors.rs b/src/errors.rs index 9d456e4..4d6ab4f 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -7,10 +7,11 @@ use axum::Json; use serde::{Serialize, Serializer}; use serde_json::{Value, json}; -use crate::dns::{DnsDriverError, ZoneDriver}; -use crate::dns::record::{RecordError, RecordParseError}; +use crate::dns::DnsDriverError; +use crate::ressouces::record::{RecordError, RecordParseError}; use crate::ressouces::zone::ZoneError; use crate::validation::{DomainValidationError, TxtParseError}; +use crate::template::TemplateError; #[derive(Debug, Serialize)] pub struct Error { @@ -357,6 +358,24 @@ impl From for Error { } } +impl From for Error { + fn from(value: TemplateError) -> Self { + match value { + TemplateError::RenderError { name, reason } => { + Error::new("template:render", "Failed to render the template") + .with_details(json!({ + "name": name + })) + .with_cause(&reason.to_string()) + }, + TemplateError::SerializationError { reason } => { + Error::new("template:serialization", "Failed to serialize context") + .with_cause(&reason.to_string()) + } + } + } +} + impl From for Error { fn from(value: RecordError) -> Self { match value { diff --git a/src/main.rs b/src/main.rs index c07dbca..f6c4982 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,26 +1,3 @@ -//#![feature(proc_macro_hygiene, decl_macro)] - -/* -#[macro_use] extern crate rocket; -#[macro_use] extern crate diesel; -#[macro_use] extern crate diesel_migrations; -*/ - -//mod routes; -//mod cli; -//mod config; -//mod models; -//mod schema; -//mod template; -//mod controllers; - -//use std::process::exit; - -//use clap::Parser; -//use figment::{Figment, Profile, providers::{Format, Toml, Env}}; -//use rocket_sync_db_pools::database; -//use diesel::prelude::*; - mod errors; mod dns; mod routes; @@ -28,29 +5,34 @@ mod ressouces; mod database; mod validation; mod macros; +mod template; use std::sync::Arc; use axum::Router; use axum::routing; +use tower_http::services::ServeDir; + use database::sqlite::SqliteDB; -use database::Db; +use database::BoxedDb; use dns::dns_driver::DnsDriverConfig; use dns::dns_driver::TsigConfig; use dns::{ZoneDriver, RecordDriver}; +use template::TemplateEngine; #[derive(Clone)] pub struct AppState { zone: Arc, records: Arc, - db: Arc, + db: BoxedDb, + template_engine: TemplateEngine } - - #[tokio::main] async fn main() { + let template_engine = TemplateEngine::new(std::path::Path::new("./templates")); + let dns_driver = dns::dns_driver::DnsDriver::from_config(DnsDriverConfig { address: "127.0.0.1:5353".parse().unwrap(), tsig: Some(TsigConfig { @@ -66,12 +48,17 @@ async fn main() { zone: dns_driver.clone(), records: dns_driver.clone(), db: Arc::new(SqliteDB::new("db.sqlite".into()).await), + template_engine }; let app = Router::new() - .route("/admin/zones", routing::post(routes::api::zones::create_zone)) - .route("/zones/{zone_name}/records", routing::get(routes::api::zones::get_zone_records)) - .route("/zones/{zone_name}/records", routing::post(routes::api::zones::create_zone_records)) + /* ----- API ----- */ + .route("/api/admin/zones", routing::post(routes::api::zones::create_zone)) + .route("/api/zones/{zone_name}/records", routing::get(routes::api::zones::get_zone_records)) + .route("/api/zones/{zone_name}/records", routing::post(routes::api::zones::create_zone_records)) + /* ----- UI ----- */ + .route("/zones/{zone_name}/records", routing::get(routes::ui::zones::get_zone_records_page)) + .nest_service("/assets", ServeDir::new("assets")) .with_state(app_state); let listener = tokio::net::TcpListener::bind("127.0.0.1:8000").await.unwrap(); diff --git a/src/ressouces/class.rs b/src/ressouces/class.rs deleted file mode 100644 index 3eea893..0000000 --- a/src/ressouces/class.rs +++ /dev/null @@ -1,40 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::dns; - - -#[derive(Debug, Deserialize, Serialize, Clone)] -pub enum DNSClass { - IN, - CH, - HS, - NONE, - ANY, - OPT(u16), -} - -impl From for DNSClass { - fn from(dns_class: dns::DNSClass) -> DNSClass { - match dns_class { - dns::DNSClass::IN => DNSClass::IN, - dns::DNSClass::CH => DNSClass::CH, - dns::DNSClass::HS => DNSClass::HS, - dns::DNSClass::NONE => DNSClass::NONE, - dns::DNSClass::ANY => DNSClass::ANY, - dns::DNSClass::OPT(v) => DNSClass::OPT(v), - } - } -} - -impl From for dns::DNSClass { - fn from(dns_class: DNSClass) -> dns::DNSClass { - match dns_class { - DNSClass::IN => dns::DNSClass::IN, - DNSClass::CH => dns::DNSClass::CH, - DNSClass::HS => dns::DNSClass::HS, - DNSClass::NONE => dns::DNSClass::NONE, - DNSClass::ANY => dns::DNSClass::ANY, - DNSClass::OPT(v) => dns::DNSClass::OPT(v), - } - } -} diff --git a/src/ressouces/errors.rs b/src/ressouces/errors.rs deleted file mode 100644 index 478ba99..0000000 --- a/src/ressouces/errors.rs +++ /dev/null @@ -1,176 +0,0 @@ -use serde::Serialize; -use serde_json::json; -use rocket::http::Status; -use rocket::request::{Request, Outcome}; -use rocket::response::{self, Response, Responder}; -use rocket::serde::json::Json; -use serde_json::Value; -use diesel::result::Error as DieselError; -use argon2::password_hash::errors::Error as PasswordHashError; - -use crate::dns::ConnectorError; -use crate::models; - -#[derive(Debug)] -pub enum UserError { - ZoneNotFound, - NotFound, - UserConflict, - BadCreds, - MissingToken, - ExpiredSession, - MalformedHeader, - PermissionDenied, - DbError(DieselError), - PasswordError(PasswordHashError), -} - -impl From for UserError { - fn from(e: DieselError) -> Self { - UserError::DbError(e) - } -} - -impl From for UserError { - fn from(e: PasswordHashError) -> Self { - UserError::PasswordError(e) - } -} - - -#[derive(Serialize, Debug)] -pub struct ErrorResponse { - #[serde(with = "StatusDef")] - #[serde(flatten)] - pub status: Status, - pub message: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub details: Option -} - -#[derive(Serialize)] -#[serde(remote = "Status")] -struct StatusDef { - code: u16, - #[serde(rename = "status", getter = "Status::reason")] - reason: Option<&'static str>, -} - -impl ErrorResponse { - pub fn new(status: Status, message: String) -> ErrorResponse { - ErrorResponse { - status, - message, - details: None, - } - } - - pub fn with_details (self, details: T) -> ErrorResponse { - ErrorResponse { - details: serde_json::to_value(details).ok(), - ..self - } - } - - pub fn err(self) -> Result { - Err(self) - } -} - -impl<'r> Responder<'r, 'static> for ErrorResponse { - fn respond_to(self, req: &'r Request<'_>) -> response::Result<'static> { - let status = self.status; - Response::build_from(Json(self).respond_to(req)?).status(status).ok() - } -} - -impl From for ErrorResponse { - fn from(e: UserError) -> Self { - match e { - UserError::BadCreds => ErrorResponse::new(Status::Unauthorized, "Provided credentials or token do not match any existing user".into()), - UserError::UserConflict => ErrorResponse::new(Status::Conflict, "This user already exists".into()), - UserError::NotFound => ErrorResponse::new(Status::NotFound, "User does not exist".into()), - UserError::MissingToken => ErrorResponse::new(Status::Unauthorized, "Missing authorization token".into()), - UserError::ExpiredSession => ErrorResponse::new(Status::Unauthorized, "The provided session token has expired".into()), - UserError::MalformedHeader => ErrorResponse::new(Status::BadRequest, "Malformed authorization header".into()), - UserError::PermissionDenied => ErrorResponse::new(Status::Forbidden, "Bearer is not authorized to access the resource".into()), - UserError::ZoneNotFound => ErrorResponse::new(Status::NotFound, "DNS zone does not exist".into()), - UserError::DbError(e) => make_500(e), - UserError::PasswordError(e) => make_500(e) - } - } -} - -impl From> for ErrorResponse { - fn from(e: Box) -> Self { - if e.is_proto_error() { - error!("{}", e); - return make_500(e); - } else { - warn!("{}", e); - let error = ErrorResponse::new( - Status::NotFound, - "Zone could not be found".into() - ); - if let Some(zone) = e.zone_name() { - return error.with_details(json!({ - "zone_name": zone.to_utf8() - })); - } else { - return error; - } - } - } -} - -impl From for ErrorResponse { - fn from(e: models::RecordListParseError) -> Self { - match e { - models::RecordListParseError::RecordNotInZone { zone, class, mismatched_class, mismatched_zone} => { - ErrorResponse::new( - Status::BadRequest, - "Record list contains records that do not belong to the zone".into() - ).with_details( - json!({ - "zone_name": zone.to_utf8(), - "class": models::DNSClass::from(class), - "mismatched_class": mismatched_class, - "mismatched_zone": mismatched_zone, - }) - ) - }, - models::RecordListParseError::ParseError { zone, bad_records } => { - ErrorResponse::new( - Status::BadRequest, - "Record list contains records that could not be parsed into DNS records".into() - ).with_details( - json!({ - "zone_name": zone.to_utf8(), - "records": bad_records - }) - ) - } - } - } -} - - -impl From for Outcome { - fn from(e: ErrorResponse) -> Self { - Outcome::Failure(e.into()) - } -} - - -impl From for (Status, ErrorResponse) { - fn from(e: ErrorResponse) -> Self { - (e.status, e) - } -} - -// TODO: change for Display trait -pub fn make_500(e: E) -> ErrorResponse { - error!("Making 500 for Error: {:?}", e); - - ErrorResponse::new(Status::InternalServerError, "An unexpected error occured".into()) -} diff --git a/src/ressouces/mod.rs b/src/ressouces/mod.rs index a4c95c3..ae3c9f4 100644 --- a/src/ressouces/mod.rs +++ b/src/ressouces/mod.rs @@ -20,3 +20,5 @@ pub use zone::{Zone, AddZoneMemberRequest, CreateZoneRequest}; */ pub mod zone; +pub mod rdata; +pub mod record; diff --git a/src/ressouces/name.rs b/src/ressouces/name.rs deleted file mode 100644 index c768b28..0000000 --- a/src/ressouces/name.rs +++ /dev/null @@ -1,94 +0,0 @@ -use std::ops::Deref; - - -use rocket::request::FromParam; -use rocket::form::{self, FromFormField, ValueField}; -use serde::{Deserialize, Serialize, Deserializer, Serializer}; -use trust_dns_proto::error::ProtoError; - -use crate::dns::Name; - - -#[derive(Debug, Clone)] -pub struct SerdeName(pub(crate)Name); - -impl Deref for SerdeName { - type Target = Name; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<'de> Deserialize<'de> for SerdeName { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de> - { - use serde::de::Error; - - String::deserialize(deserializer) - .and_then(|string| - Name::from_utf8(&string) - .map_err(|e| Error::custom(e.to_string())) - ).map( SerdeName) - } -} - -impl Serialize for SerdeName { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer - { - self.0.to_utf8().serialize(serializer) - } -} - -impl SerdeName { - pub fn into_inner(self) -> Name { - self.0 - } -} - -fn parse_absolute_name(name: &str) -> Result { - let mut name = Name::from_utf8(name)?; - if !name.is_fqdn() { - name.set_fqdn(true); - } - Ok(AbsoluteName(SerdeName(name))) -} - -#[derive(Debug, Deserialize)] -pub struct AbsoluteName(SerdeName); - -impl<'r> FromParam<'r> for AbsoluteName { - type Error = ProtoError; - - fn from_param(param: &'r str) -> Result { - let name = parse_absolute_name(param)?; - Ok(name) - } -} - -#[async_trait] -impl<'v> FromFormField<'v> for AbsoluteName { - fn from_value(field: ValueField<'v>) -> form::Result<'v, Self> { - let name = parse_absolute_name(field.value) - .map_err(|_| form::Error::validation("Invalid name"))?; - - Ok(name) - } -} - - -impl Deref for AbsoluteName { - type Target = Name; - fn deref(&self) -> &Self::Target { - &self.0.0 - } -} - -impl AbsoluteName { - pub fn into_inner(self) -> Name { - self.0.0 - } -} diff --git a/src/ressouces/rdata.rs b/src/ressouces/rdata.rs index 4ea2d14..afd8b62 100644 --- a/src/ressouces/rdata.rs +++ b/src/ressouces/rdata.rs @@ -1,258 +1,544 @@ -use std::convert::TryFrom; -use std::net::{Ipv6Addr, Ipv4Addr}; +use std::fmt::Write; +use std::net::{Ipv4Addr, Ipv6Addr}; -use base64::{Engine, engine::general_purpose}; +use domain::base::rdata::ComposeRecordData; +use domain::base::scan::Symbol; +use domain::base::wire::{Composer, ParseError}; +use domain::base::{Name, ParseRecordData, ParsedName, RecordData, Rtype, ToName, Ttl}; +use domain::rdata; +use domain::dep::octseq::{Parser, Octets}; use serde::{Deserialize, Serialize}; -use trust_dns_client::serialize::binary::BinEncoder; -use trust_dns_proto::error::ProtoError; +use crate::errors::Error; +use crate::validation; -use crate::dns; -use super::name::SerdeName; +use crate::macros::{append_errors, push_error}; +use super::record::RecordParseError; - -#[derive(Debug, Deserialize, Serialize, Clone)] -#[serde(tag = "Type")] +/// Type used to serialize / deserialize resource records data to response / request +/// +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "type", content = "rdata")] #[serde(rename_all = "UPPERCASE")] pub enum RData { - #[serde(rename_all = "PascalCase")] - A { - address: Ipv4Addr - }, - #[serde(rename_all = "PascalCase")] - AAAA { - address: Ipv6Addr - }, - #[serde(rename_all = "PascalCase")] - CAA { - issuer_critical: bool, - value: String, - property_tag: String, - }, - #[serde(rename_all = "PascalCase")] - CNAME { - target: SerdeName - }, - // HINFO(HINFO), - // HTTPS(SVCB), - #[serde(rename_all = "PascalCase")] - MX { - preference: u16, - mail_exchanger: SerdeName - }, - // NAPTR(NAPTR), - #[serde(rename_all = "PascalCase")] - NULL { - data: String - }, - #[serde(rename_all = "PascalCase")] - NS { - target: SerdeName - }, - // OPENPGPKEY(OPENPGPKEY), - // OPT(OPT), - #[serde(rename_all = "PascalCase")] - PTR { - target: SerdeName - }, - #[serde(rename_all = "PascalCase")] - SOA { - master_server_name: SerdeName, - maintainer_name: SerdeName, - refresh: i32, - retry: i32, - expire: i32, - minimum: u32, - serial: u32 - }, - #[serde(rename_all = "PascalCase")] - SRV { - server: SerdeName, - port: u16, - priority: u16, - weight: u16, - }, - #[serde(rename_all = "PascalCase")] - SSHFP { - algorithm: u8, - digest_type: u8, - fingerprint: String, - }, - // SVCB(SVCB), - // TLSA(TLSA), - #[serde(rename_all = "PascalCase")] - TXT { - text: String - }, - - // TODO: Eventually allow deserialization of DNSSEC records - #[serde(skip)] - DNSSEC(dns::DNSSECRData), - #[serde(rename_all = "PascalCase")] - Unknown { - code: u16, - data: String, - }, - // ZERO, - - // TODO: DS (added in https://github.com/bluejekyll/trust-dns/pull/1635) + A(A), + Aaaa(Aaaa), + // TODO: CAA + Cname(Cname), + // TODO: DS + Mx(Mx), + Ns(Ns), + Ptr(Ptr), + Soa(Soa), + Srv(Srv), + // TODO: SSHFP + // TODO: SVCB / HTTPS // TODO: TLSA + Txt(Txt), } -impl From for RData { - fn from(rdata: dns::RData) -> RData { - match rdata { - dns::RData::A(address) => RData::A { address }, - dns::RData::AAAA(address) => RData::AAAA { address }, - // Still a draft, no iana number yet, I don't to put something that is not currently supported so that's why NULL and not unknown. - // TODO: probably need better error here, I don't know what to do about that as this would require to change the From for something else. - // (empty data because I'm lazy) - dns::RData::ANAME(_) => RData::NULL { - data: String::new() - }, - dns::RData::CNAME(target) => RData::CNAME { - target: SerdeName(target) - }, - dns::RData::CAA(caa) => { - let value_str = caa.value().to_string(); - - RData::CAA { - issuer_critical: caa.issuer_critical(), - // Remove first and last char (byte) because string is quoted (") (should be a safe operation) - value: value_str[1..(value_str.len())].into(), - property_tag: caa.tag().as_str().to_string(), - } - }, - dns::RData::MX(mx) => RData::MX { - preference: mx.preference(), - mail_exchanger: SerdeName(mx.exchange().clone()) - }, - dns::RData::NULL(null) => RData::NULL { - data: general_purpose::STANDARD.encode(null.anything()) - }, - dns::RData::NS(target) => RData::NS { - target: SerdeName(target) - }, - dns::RData::PTR(target) => RData::PTR { - target: SerdeName(target) - }, - dns::RData::SOA(soa) => RData::SOA { - master_server_name: SerdeName(soa.mname().clone()), - maintainer_name: SerdeName(soa.rname().clone()), - refresh: soa.refresh(), - retry: soa.retry(), - expire: soa.expire(), - minimum: soa.minimum(), - serial: soa.serial() - }, - dns::RData::SRV(srv) => RData::SRV { - server: SerdeName(srv.target().clone()), - port: srv.port(), - priority: srv.priority(), - weight: srv.weight(), - }, - dns::RData::SSHFP(sshfp) => RData::SSHFP { - algorithm: sshfp.algorithm().into(), - digest_type: sshfp.fingerprint_type().into(), - fingerprint: dns::sshfp::HEX.encode(sshfp.fingerprint()), - }, - //TODO: This might alter data if not utf8 compatible, probably need to be replaced - //TODO: check whether concatenating txt data is harmful or not - dns::RData::TXT(txt) => RData::TXT { text: format!("{}", txt) }, - dns::RData::DNSSEC(data) => RData::DNSSEC(data), - rdata => { - let code = rdata.to_record_type().into(); - let mut data = Vec::new(); - let mut encoder = BinEncoder::new(&mut data); - // TODO: need better error handling (use TryFrom ?) - rdata.emit(&mut encoder).expect("could not encode data"); - - RData::Unknown { - code, - data: general_purpose::STANDARD.encode(data), - } - } +impl RData { + pub fn rtype(&self) -> Rtype { + match self { + RData::A(_) => Rtype::A, + RData::Aaaa(_) => Rtype::AAAA, + RData::Cname(_) => Rtype::CNAME, + RData::Mx(_) => Rtype::MX, + RData::Ns(_) => Rtype::NS, + RData::Ptr(_) => Rtype::PTR, + RData::Soa(_) => Rtype::SOA, + RData::Srv(_) => Rtype::SRV, + RData::Txt(_) => Rtype::TXT, } } } -impl TryFrom for dns::RData { - type Error = ProtoError; +pub enum ParsedRData { + A(rdata::A), + Aaaa(rdata::Aaaa), + Cname(rdata::Cname), + Mx(rdata::Mx), + Ns(rdata::Ns), + Ptr(rdata::Ptr), + Soa(rdata::Soa), + Srv(rdata::Srv), + Txt(rdata::Txt), +} - fn try_from(rdata: RData) -> Result { - Ok(match rdata { - RData::A { address } => dns::RData::A(address), - RData::AAAA { address } => dns::RData::AAAA(address), - // TODO: Round trip test all types below (currently not tested...) - RData::CAA { issuer_critical, value, property_tag } => { - let property = dns::caa::Property::from(property_tag); - let caa_value = { - // TODO: duplicate of trust_dns_client::serialize::txt::rdata_parser::caa::parse - // because caa::read_value is private - match property { - dns::caa::Property::Issue | dns::caa::Property::IssueWild => { - let value = dns::caa::read_issuer(value.as_bytes())?; - dns::caa::Value::Issuer(value.0, value.1) - } - dns::caa::Property::Iodef => { - let url = dns::caa::read_iodef(value.as_bytes())?; - dns::caa::Value::Url(url) - } - dns::caa::Property::Unknown(_) => dns::caa::Value::Unknown(value.as_bytes().to_vec()), - } - }; - dns::RData::CAA(dns::caa::CAA { - issuer_critical, - tag: property, - value: caa_value, - }) - }, - RData::CNAME { target } => dns::RData::CNAME(target.into_inner()), - RData::MX { preference, mail_exchanger } => dns::RData::MX( - dns::mx::MX::new(preference, mail_exchanger.into_inner()) - ), - RData::NULL { data } => dns::RData::NULL( - dns::null::NULL::with( - general_purpose::STANDARD.decode(data).map_err(|e| ProtoError::from(format!("{}", e)))? - ) - ), - RData::NS { target } => dns::RData::NS(target.into_inner()), - RData::PTR { target } => dns::RData::PTR(target.into_inner()), - RData::SOA { - master_server_name, - maintainer_name, - refresh, - retry, - expire, - minimum, - serial - } => dns::RData::SOA( - dns::soa::SOA::new( - master_server_name.into_inner(), - maintainer_name.into_inner(), - serial, - refresh, - retry, - expire, - minimum, - ) - ), - RData::SRV { server, port, priority, weight } => dns::RData::SRV( - dns::srv::SRV::new(priority, weight, port, server.into_inner()) - ), - RData::SSHFP { algorithm, digest_type, fingerprint } => dns::RData::SSHFP( - dns::sshfp::SSHFP::new( - // NOTE: This allows unassigned algorithms - dns::sshfp::Algorithm::from(algorithm), - dns::sshfp::FingerprintType::from(digest_type), - dns::sshfp::HEX.decode(fingerprint.as_bytes()).map_err(|e| ProtoError::from(format!("{}", e)))? - ) - ), - RData::TXT { text } => dns::RData::TXT(dns::txt::TXT::new(vec![text])), - // TODO: Error out for DNSSEC? Prefer downstream checks? - RData::DNSSEC(_) => todo!(), - // TODO: Disallow unknown? (could be used to bypass unsopported types?) Prefer downstream checks? - RData::Unknown { code: _code, data: _data } => todo!(), - }) +impl> From> for RData { + fn from(value: ParsedRData) -> Self { + match value { + ParsedRData::A(record_rdata) => RData::A(record_rdata.into()), + ParsedRData::Aaaa(record_rdata) => RData::Aaaa(record_rdata.into()), + ParsedRData::Cname(record_rdata) => RData::Cname(record_rdata.into()), + ParsedRData::Mx(record_rdata) => RData::Mx(record_rdata.into()), + ParsedRData::Ns(record_rdata) => RData::Ns(record_rdata.into()), + ParsedRData::Ptr(record_rdata) => RData::Ptr(record_rdata.into()), + ParsedRData::Soa(record_rdata) => RData::Soa(record_rdata.into()), + ParsedRData::Srv(record_rdata) => RData::Srv(record_rdata.into()), + ParsedRData::Txt(record_rdata) => RData::Txt(record_rdata.into()), + } + } +} + +impl TryFrom for ParsedRData>, Vec> { + type Error = Vec; + + fn try_from(value: RData) -> Result { + let rdata = match value { + RData::A(record_rdata) => ParsedRData::A(record_rdata.parse_record()?), + RData::Aaaa(record_rdata) => ParsedRData::Aaaa(record_rdata.parse_record()?), + RData::Cname(record_rdata) => ParsedRData::Cname(record_rdata.parse_record()?), + RData::Mx(record_rdata) => ParsedRData::Mx(record_rdata.parse_record()?), + RData::Ns(record_rdata) => ParsedRData::Ns(record_rdata.parse_record()?), + RData::Ptr(record_rdata) => ParsedRData::Ptr(record_rdata.parse_record()?), + RData::Soa(record_rdata) => ParsedRData::Soa(record_rdata.parse_record()?), + RData::Srv(record_rdata) => ParsedRData::Srv(record_rdata.parse_record()?), + RData::Txt(record_rdata) => ParsedRData::Txt(record_rdata.parse_record()?), + }; + Ok(rdata) + } +} + + + +macro_rules! parse_name { + ($value:expr, $field:ident, $rtype:literal, $errors:expr) => { + { + let name = push_error!( + validation::normalize_domain(&$value.$field), + $errors, concat!("/", stringify!($field)) + ); + + let name = name.and_then(|name| { + push_error!( + name.parse::>().map_err(|e| { + Error::from(RecordParseError::RDataUnknown { + input: $value.$field, + field: stringify!(field).to_string(), + rtype: $rtype.to_string(), + }).with_cause(&e.to_string()) + }), + $errors, concat!("/", stringify!($field)) + ) + }); + + name + } + }; +} + +/* --------- A --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct A { + pub address: String, +} + +impl From for A { + fn from(record_data: rdata::A) -> Self { + A { address: record_data.addr().to_string() } + } +} + +impl A { + pub fn parse_record(self) -> Result> { + let mut errors = Vec::new(); + + let address = push_error!(self.address.parse::().map_err(|e| { + Error::from(RecordParseError::Ip4Address { input: self.address }) + .with_cause(&e.to_string()) + .with_path("/address") + }), errors); + + if errors.is_empty() { + Ok(rdata::A::new(address.unwrap())) + } else { + Err(errors) + } + } +} + +/* --------- AAAA --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Aaaa { + pub address: String, +} + +impl From for Aaaa { + fn from(record_data: rdata::Aaaa) -> Self { + Aaaa { address: record_data.addr().to_string() } + } +} + +impl Aaaa { + pub fn parse_record(self) -> Result> { + let mut errors = Vec::new(); + + let address = push_error!(self.address.parse::().map_err(|e| { + Error::from(RecordParseError::Ip6Address { input: self.address }) + .with_cause(&e.to_string()) + .with_path("/address") + }), errors); + + if errors.is_empty() { + Ok(rdata::Aaaa::new(address.unwrap())) + } else { + Err(errors) + } + } +} + +/* --------- CNAME --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Cname { + pub target: String, +} + +impl From> for Cname { + fn from(record_data: rdata::Cname) -> Self { + Cname { target: record_data.cname().to_string() } + } +} + +impl Cname { + pub fn parse_record(self) -> Result>>, Vec> { + let mut errors = Vec::new(); + + let cname = parse_name!(self, target, "CNAME", errors); + + if errors.is_empty() { + Ok(rdata::Cname::new(cname.unwrap())) + } else { + Err(errors) + } + + } +} + +/* --------- MX --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Mx { + pub preference: u16, + pub mail_exchanger: String, +} + +impl From> for Mx { + fn from(record_data: rdata::Mx) -> Self { + Mx { + preference: record_data.preference(), + mail_exchanger: record_data.exchange().to_string() + } + } +} + +impl Mx { + fn parse_record(self) -> Result>>, Vec> { + let mut errors = Vec::new(); + + let mail_exchanger = parse_name!(self, mail_exchanger, "MX", errors); + + if errors.is_empty() { + Ok(rdata::Mx::new(self.preference, mail_exchanger.unwrap())) + } else { + Err(errors) + } + } +} + +/* --------- NS --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Ns { + pub target: String, +} + +impl From> for Ns { + fn from(record_rdata: rdata::Ns) -> Self { + Ns { + target: record_rdata.nsdname().to_string(), + } + } +} + +impl Ns { + fn parse_record(self) -> Result>>, Vec> { + let mut errors = Vec::new(); + + let ns_name = parse_name!(self, target, "NS", errors); + + if errors.is_empty() { + Ok(rdata::Ns::new(ns_name.unwrap())) + } else { + Err(errors) + } + } +} + +/* --------- PTR --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Ptr { + pub target: String, +} + +impl From> for Ptr { + fn from(record_rdata: rdata::Ptr) -> Self { + Ptr { + target: record_rdata.ptrdname().to_string(), + } + } +} + +impl Ptr { + fn parse_record(self) -> Result>>, Vec> { + let mut errors = Vec::new(); + + let ptr_name = parse_name!(self, target, "PTR", errors); + + if errors.is_empty() { + Ok(rdata::Ptr::new(ptr_name.unwrap())) + } else { + Err(errors) + } + } +} + +/* --------- SOA --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Soa { + pub primary_server: String, + pub maintainer: String, + pub refresh: u32, + pub retry: u32, + pub expire: u32, + pub minimum: u32, + pub serial: u32, +} + +impl From> for Soa { + fn from(record_rdata: rdata::Soa) -> Self { + Soa { + primary_server: record_rdata.mname().to_string(), + maintainer: record_rdata.rname().to_string(), + refresh: record_rdata.refresh().as_secs(), + retry: record_rdata.retry().as_secs(), + expire: record_rdata.expire().as_secs(), + minimum: record_rdata.minimum().as_secs(), + serial: record_rdata.serial().into(), + } + } +} + +impl Soa { + fn parse_record(self) -> Result>>, Vec> { + let mut errors = Vec::new(); + + let primary_ns = parse_name!(self, primary_server, "SOA", errors); + let maintainer = parse_name!(self, maintainer, "SOA", errors); + + if errors.is_empty() { + Ok(rdata::Soa::new( + primary_ns.unwrap(), + maintainer.unwrap(), + self.refresh.into(), + Ttl::from_secs(self.retry), + Ttl::from_secs(self.expire), + Ttl::from_secs(self.minimum), + Ttl::from_secs(self.serial), + )) + } else { + Err(errors) + } + } +} + +/* --------- SRV --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Srv { + pub server: String, + pub port: u16, + pub priority: u16, + pub weight: u16, +} + +impl From> for Srv { + fn from(record_data: rdata::Srv) -> Self { + Srv { + server: record_data.target().to_string(), + priority: record_data.priority(), + weight: record_data.weight(), + port: record_data.port(), + } + } +} + +impl Srv { + fn parse_record(self) -> Result>>, Vec> { + let mut errors = Vec::new(); + + let server = parse_name!(self, server, "SRV", errors); + + if errors.is_empty() { + Ok(rdata::Srv::new( + self.priority, + self.weight, + self.port, + server.unwrap(), + )) + } else { + Err(errors) + } + } +} + + +/* --------- TXT --------- */ + +#[derive(Debug, Deserialize, Serialize)] +pub struct Txt { + pub text: String, +} + +impl> From> for Txt { + fn from(record_data: rdata::Txt) -> Self { + let mut concatenated_text = String::new(); + for text in record_data.iter() { + for c in text { + // Escapes '\' and non printable chars + let c = Symbol::display_from_octet(*c); + write!(concatenated_text, "{}", c).unwrap(); + } + } + + Txt { + text: concatenated_text + } + } +} + +impl Txt { + fn parse_record(self) -> Result>, Vec> { + let mut errors = Vec::new(); + let data = append_errors!(validation::parse_txt_data(&self.text), errors, "/text"); + let data = data.and_then(|data| { + push_error!(rdata::Txt::build_from_slice(&data).map_err(|e| { + Error::from(RecordParseError::RDataUnknown { + input: self.text, + field: "text".into(), + rtype: "TXT".into(), + }).with_cause(&e.to_string()) + .with_path("/text") + }), errors) + }); + + + + if errors.is_empty() { + Ok(data.unwrap()) + } else { + Err(errors) + } + } +} + +/* --------- ParsedRData: domain traits impl --------- */ + +impl ParsedRData { + pub fn rtype(&self) -> Rtype { + match self { + ParsedRData::A(_) => Rtype::A, + ParsedRData::Aaaa(_) => Rtype::AAAA, + ParsedRData::Cname(_) => Rtype::CNAME, + ParsedRData::Mx(_) => Rtype::MX, + ParsedRData::Ns(_) => Rtype::NS, + ParsedRData::Ptr(_) => Rtype::PTR, + ParsedRData::Soa(_) => Rtype::SOA, + ParsedRData::Srv(_) => Rtype::SRV, + ParsedRData::Txt(_) => Rtype::TXT, + } + } +} + +impl RecordData for ParsedRData { + fn rtype(&self) -> Rtype { + ParsedRData::rtype(self) + } +} + +impl<'a, Octs: Octets + ?Sized> ParseRecordData<'a, Octs> for ParsedRData>, Octs::Range<'a>> { + fn parse_rdata( + rtype: Rtype, + parser: &mut Parser<'a, Octs>, + ) -> Result, ParseError> { + let record = match rtype { + Rtype::A => ParsedRData::A(rdata::A::parse(parser)?), + Rtype::AAAA => ParsedRData::Aaaa(rdata::Aaaa::parse(parser)?), + Rtype::CNAME => ParsedRData::Cname(rdata::Cname::parse(parser)?), + Rtype::MX => ParsedRData::Mx(rdata::Mx::parse(parser)?), + Rtype::NS => ParsedRData::Ns(rdata::Ns::parse(parser)?), + Rtype::PTR => ParsedRData::Ptr(rdata::Ptr::parse(parser)?), + Rtype::SOA => ParsedRData::Soa(rdata::Soa::parse(parser)?), + Rtype::SRV => ParsedRData::Srv(rdata::Srv::parse(parser)?), + Rtype::TXT => ParsedRData::Txt(rdata::Txt::parse(parser)?), + _ => return Ok(None) + }; + + Ok(Some(record)) + } +} + +impl> ComposeRecordData for ParsedRData { + fn rdlen(&self, compress: bool) -> Option { + match self { + ParsedRData::A(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Aaaa(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Cname(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Mx(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Ns(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Ptr(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Soa(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Srv(record_rdata) => record_rdata.rdlen(compress), + ParsedRData::Txt(record_rdata) => record_rdata.rdlen(compress), + } + } + + fn compose_rdata( + &self, + target: &mut Target, + ) -> Result<(), Target::AppendError> { + match self { + ParsedRData::A(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Aaaa(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Cname(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Mx(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Ns(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Ptr(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Soa(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Srv(record_rdata) => record_rdata.compose_rdata(target), + ParsedRData::Txt(record_rdata) => record_rdata.compose_rdata(target), + } + } + + fn compose_canonical_rdata( + &self, + target: &mut Target, + ) -> Result<(), Target::AppendError> { + match self { + ParsedRData::A(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Aaaa(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Cname(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Mx(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Ns(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Ptr(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Soa(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Srv(record_rdata) => record_rdata.compose_canonical_rdata(target), + ParsedRData::Txt(record_rdata) => record_rdata.compose_canonical_rdata(target), + } } } diff --git a/src/ressouces/record.rs b/src/ressouces/record.rs index 3fe02a1..aed47b6 100644 --- a/src/ressouces/record.rs +++ b/src/ressouces/record.rs @@ -1,122 +1,128 @@ -use std::convert::{TryFrom, TryInto}; use serde::{Deserialize, Serialize}; -use trust_dns_proto::error::ProtoError; -use crate::dns; -use super::name::SerdeName; -use super::class::DNSClass; -use super::rdata::RData; +use domain::base::{iana::Class, Name, Record as DnsRecord, Ttl}; +use crate::{errors::Error, validation}; +use crate::macros::{append_errors, push_error}; +use super::rdata::{ParsedRData, RData}; -#[derive(Debug, Deserialize, Serialize, Clone)] -pub struct Record { - #[serde(rename = "Name")] - pub name: SerdeName, - // TODO: Make class optional, default to IN - #[serde(rename = "Class")] - pub dns_class: DNSClass, - #[serde(rename = "TTL")] - pub ttl: u32, - #[serde(flatten)] - pub rdata: RData, +pub enum RecordParseError { + Ip4Address { input: String }, + Ip6Address { input: String }, + RDataUnknown { input: String, field: String, rtype: String }, + NameUnknown { input: String }, + NotInZone { name: String, zone: String }, } -impl From for Record { - fn from(record: dns::Record) -> Record { +pub enum RecordError { + Validation { suberrors: Vec }, +} + +pub(crate) type DnsRecordImpl = DnsRecord< + Name>, + ParsedRData>,Vec> +>; + +#[derive(Debug, Deserialize, Serialize)] +pub struct Record { + pub name: String, + pub ttl: u32, + #[serde(flatten)] + pub rdata: RData +} + +impl> From>> for Record { + fn from(value: DnsRecord>) -> Self { Record { - name: SerdeName(record.name().clone()), - dns_class: record.dns_class().into(), - ttl: record.ttl(), - // Assume data exists, record with empty data should be filtered by caller - rdata: record.into_data().unwrap().into(), + name: value.owner().to_string(), + ttl: value.ttl().as_secs(), + rdata: value.into_data().into(), } } } -impl TryFrom for dns::Record { - type Error = ProtoError; +impl Record { + fn convert(self, zone_name: &Name>) -> Result> { + let mut errors = Vec::new(); - fn try_from(record: Record) -> Result { - let mut trust_dns_record = dns::Record::from_rdata(record.name.into_inner(), record.ttl, record.rdata.try_into()?); - trust_dns_record.set_dns_class(record.dns_class.into()); - Ok(trust_dns_record) + let name = push_error!(validation::normalize_domain(&self.name), errors, "/name"); + + let name = name.and_then(|name| push_error!(name.parse::>().map_err(|e| { + Error::from(RecordParseError::NameUnknown { + input: self.name.clone() + }).with_cause(&e.to_string()) + }), errors, "/name")); + + let name = name.and_then(|name| { + if !name.ends_with(zone_name) { + errors.push( + Error::from(RecordParseError::NotInZone { name: self.name, zone: zone_name.to_string() }) + .with_path("/name") + ); + None + } else { + Some(name) + } + }); + + let ttl = Ttl::from_secs(self.ttl); + let rdata = append_errors!(ParsedRData::try_from(self.rdata), errors, "/rdata"); + + if errors.is_empty() { + Ok(DnsRecord::new(name.unwrap(), Class::IN, ttl, rdata.unwrap())) + } else { + Err(errors) + } } } -pub type RecordList = Vec; +#[derive(Debug, Deserialize, Serialize)] +pub struct RecordList(pub Vec); -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct UpdateRecordsRequest { - pub old_records: RecordList, - pub new_records: RecordList, -} +impl RecordList { + fn convert(self, zone_name: &Name>) -> Result, Vec> { + let mut errors = Vec::new(); + let mut records = Vec::new(); -pub enum RecordListParseError { - ParseError { - bad_records: Vec, - zone: dns::Name, - }, - RecordNotInZone { - zone: dns::Name, - class: dns::DNSClass, - mismatched_class: Vec, - mismatched_zone: Vec, - }, -} + for (index, record) in self.0.into_iter().enumerate() { + let record = append_errors!(record.convert(zone_name), errors, &format!("/{index}")); -pub trait ParseRecordList { - fn try_into_dns_type(self, zone: dns::Name, class: dns::DNSClass) -> Result, RecordListParseError>; -} - -impl ParseRecordList for RecordList { - fn try_into_dns_type(self, zone: dns::Name, class: dns::DNSClass) -> Result, RecordListParseError> { - // TODO: What about relative names (also in cnames and stuff) - let mut bad_records = Vec::new(); - let mut records: Vec = Vec::new(); - let mut mismatched_class: Vec = Vec::new(); - let mut mismatched_zone: Vec = Vec::new(); - - for record in self.into_iter() { - let this_record = record.clone(); - if let Ok(record) = dns::Record::try_from(record) { - let mut good_record = true; - - if !zone.zone_of(record.name()) { - mismatched_zone.push(this_record.clone()); - good_record = false; - } - - if record.dns_class() != class { - mismatched_class.push(this_record.clone()); - good_record = false; - } - - if good_record { - records.push(record); - } - } else { - bad_records.push(this_record.clone()); + if let Some(record) = record { + records.push(record) } } - if !bad_records.is_empty() { - return Err(RecordListParseError::ParseError { - zone, - bad_records, - }); + if errors.is_empty() { + Ok(records) + } else { + Err(errors) + } + } +} + +#[derive(Debug,Deserialize)] +pub struct AddRecordsRequest { + pub new_records: RecordList +} + +pub struct AddRecords { + pub new_records: Vec +} + +impl AddRecordsRequest { + pub fn validate(self, zone_name: &str) -> Result { + let zone_name: Name> = zone_name.parse().expect("zone name is assumed to be valid"); + + let mut errors = Vec::new(); + let records = append_errors!(self.new_records.convert(&zone_name), errors, "/new_records"); + + if errors.is_empty() { + Ok(AddRecords { + new_records: records.unwrap(), + }) + } else { + Err(Error::from(RecordError::Validation { suberrors: errors })) } - - if !mismatched_class.is_empty() || !mismatched_zone.is_empty() { - return Err(RecordListParseError::RecordNotInZone { - zone, - class, - mismatched_zone, - mismatched_class - }); - } - - return Ok(records) } } diff --git a/src/ressouces/zone.rs b/src/ressouces/zone.rs index f653635..4be11f5 100644 --- a/src/ressouces/zone.rs +++ b/src/ressouces/zone.rs @@ -4,9 +4,10 @@ use rusqlite::Error as RusqliteError; use crate::database::{BoxedDb, sqlite::SqliteDB}; -use crate::dns::{BoxedZoneDriver, DnsDriverError}; +use crate::dns::{BoxedZoneDriver, BoxedRecordDriver, DnsDriverError}; use crate::errors::Error; use crate::macros::push_error; +use crate::ressouces::record::RecordList; use crate::validation; pub enum ZoneError { @@ -39,6 +40,19 @@ impl Zone { db.create_zone(create_zone).await } + + pub async fn get_records(zone_name: &str, db: BoxedDb, record_driver: BoxedRecordDriver) ->Result { + let zone = db.get_zone_by_name(zone_name).await?; + let mut records = record_driver.get_records(&zone.name).await?; + + records.sort_by(|r1, r2| { + let key1 = (&r1.name, r1.rdata.rtype()); + let key2 = (&r2.name, r2.rdata.rtype()); + key1.cmp(&key2) + }); + + Ok(RecordList(records)) + } } #[derive(Deserialize)] diff --git a/src/routes/api/zones.rs b/src/routes/api/zones.rs index 0741ad7..4f54e4b 100644 --- a/src/routes/api/zones.rs +++ b/src/routes/api/zones.rs @@ -1,10 +1,10 @@ use axum::extract::{Path, State}; use axum::Json; -use crate::dns::record::{AddRecordsRequest, Record}; use crate::AppState; use crate::errors::Error; use crate::ressouces::zone::{CreateZoneRequest, Zone}; +use crate::ressouces::record::{AddRecordsRequest, Record, RecordList}; pub async fn create_zone( @@ -18,13 +18,9 @@ pub async fn create_zone( pub async fn get_zone_records( Path(zone_name): Path, State(app): State, -) -> Result>, Error> +) -> Result, Error> { - - let zone = app.db.get_zone_by_name(&zone_name).await?; - let records = app.records.get_records(&zone.name).await?; - - Ok(Json(records)) + Zone::get_records(&zone_name, app.db, app.records).await.map(Json) } pub async fn create_zone_records( diff --git a/src/routes/mod.rs b/src/routes/mod.rs index b697dec..9f43e82 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,2 +1,2 @@ -//pub mod ui; +pub mod ui; pub mod api; diff --git a/src/routes/ui/mod.rs b/src/routes/ui/mod.rs index f7ee56d..bcc7e39 100644 --- a/src/routes/ui/mod.rs +++ b/src/routes/ui/mod.rs @@ -1,5 +1,2 @@ -pub mod auth; +//pub mod auth; pub mod zones; - -pub use auth::*; -pub use zones::*; diff --git a/src/routes/ui/zones.rs b/src/routes/ui/zones.rs index dc3ae4d..e9d91cc 100644 --- a/src/routes/ui/zones.rs +++ b/src/routes/ui/zones.rs @@ -1,128 +1,26 @@ +use axum::extract::{Path, State}; use serde_json::{Value, json}; -use serde::Serialize; -use rocket::http::{Status}; -use rocket::http::uri::Origin; -use rocket::form::Form; +use crate::AppState; +use crate::errors::Error; +use crate::ressouces::zone::Zone; use crate::template::Template; -use crate::models; -use crate::controllers; -use crate::DbConn; -use crate::dns::ZoneConnector; -#[derive(Serialize)] -pub struct RecordsPage { - zone: String -} - - -// TODO: Check if origin changes if application mounted on different path -#[get("/zone//records")] -pub async fn get_zone_records_page(user_info: models::UserInfo, zone: models::AbsoluteName, conn: DbConn, origin: &Origin<'_>) -> Result, Status> { - let zone_name = zone.to_utf8(); - - let zones = conn.run(move |c| { - if user_info.is_admin() { - models::Zone::get_by_name(c, &zone_name)?; - models::Zone::get_all(c) - } else { - user_info.get_zone(c, &zone_name)?; - user_info.get_zones(c) - - } - }).await.map_err(|e| models::ErrorResponse::from(e).status)?; +pub async fn get_zone_records_page( + Path(zone_name): Path, + State(app): State, +) -> Result, Error> { + let records = Zone::get_records(&zone_name, app.db, app.records).await?; + //records.0.sort_by_key(|record| (&record.name, record.rdata)); Ok(Template::new( - "pages/zone/records.html", + "pages/records.html", + app.template_engine, json!({ - "current_zone": zone.to_utf8(), - "zones": zones, - "nav_page": origin.clone().into_normalized().path().as_str(), - "nav_sections": vec!["zones", zone.to_utf8().as_str()], - }) - )) -} - -#[get("/zones")] -pub async fn get_zones_page(user_info: models::UserInfo, conn: DbConn, origin: &Origin<'_>) -> Result, Status> { - let zones = controllers::get_zones( - &conn, - user_info - ).await.map_err(|e| e.status)?; - - Ok(Template::new( - "pages/zones.html", - json!({ - "zones": zones, - "nav_page": origin.clone().into_normalized().path().as_str(), - "nav_sections": vec!["zones"], - }) - )) -} - - -#[get("/zones/new")] -pub async fn get_create_zone_page( - conn: DbConn, - user_info: models::UserInfo, - origin: &Origin<'_> -) -> Result, Status> { - - user_info - .check_admin() - .map_err(|e| models::ErrorResponse::from(e).status)?; - - let zones = controllers::get_zones( - &conn, - user_info - ).await.map_err(|e| e.status)?; - - Ok(Template::new( - "pages/zones/new.html", - json!({ - "zone": None::, - "zones": zones, - "error": None::, - "nav_page": origin.clone().into_normalized().path().as_str(), - "nav_sections": vec!["zones", "_new-zone"], - }) - )) -} - -#[post("/zones/new", data = "")] -pub async fn post_create_zone_page( - conn: DbConn, - dns_api: Box, - user_info: models::UserInfo, - zone_request: Form, - origin: &Origin<'_> -) -> Result, Status> { - user_info - .check_admin() - .map_err(|e| models::ErrorResponse::from(e).status)?; - - let zone = controllers::create_zone( - &conn, - dns_api, - user_info.clone(), - zone_request.into_inner() - ).await.map_err(|e| e.status)?; - - let zones = controllers::get_zones( - &conn, - user_info - ).await.map_err(|e| e.status)?; - - Ok(Template::new( - "pages/zones/new.html", - json!({ - "zone": Some(zone), - "zones": zones, - "error": None::, - "nav_page": origin.clone().into_normalized().path().as_str(), - "nav_sections": vec!["zones", "_new-zone"], + "current_zone": zone_name, + "records": records, }) )) } diff --git a/src/template.rs b/src/template.rs index bd2886f..1d630e9 100644 --- a/src/template.rs +++ b/src/template.rs @@ -1,63 +1,73 @@ use std::path::Path; use std::process::exit; +use std::sync::Arc; +use axum::response::{Html, IntoResponse}; use serde::Serialize; -use rocket::request::Request; -use rocket::response::{self, Responder}; -use rocket::http::{Status, ContentType}; - use tera::{Tera, Context}; +use crate::errors::Error; -pub struct TemplateState { - tera: Tera, + +#[derive(Clone)] +pub struct TemplateEngine { + tera: Arc, } -impl TemplateState { +pub enum TemplateError { + SerializationError { reason: Box }, + RenderError { name: String, reason: Box }, +} + +impl TemplateEngine { pub fn new(template_directory: &Path) -> Self { let template_glob = template_directory.join("**").join("*"); match Tera::new(template_glob.to_str().expect("valid glob path string")) { - Ok(tera) => TemplateState { tera }, + Ok(tera) => TemplateEngine { tera: Arc::new(tera) }, Err(e) => { println!("Loading templates failed: {}", e); exit(1) } } } + + pub fn render(&self, name: &str, context: S) -> Result { + let context = Context::from_serialize(context).map_err(|e| { + TemplateError::SerializationError { reason: Box::new(e) } + })?; + + let content = self.tera.render(name, &context).map_err(|e| { + TemplateError::RenderError { name: name.into(), reason: Box::new(e) } + })?; + + + Ok(content) + } } -pub struct Template<'t, S: Serialize> { - pub name: &'t str, +pub struct Template<'n, S: Serialize> { + pub name: &'n str, + pub engine: TemplateEngine, pub context: S, } -impl<'r, S: Serialize> Template<'r, S> { - pub fn new(name: &'r str, context: S) -> Self { +impl<'n, S: Serialize> Template<'n, S> { + pub fn new(name: &'n str, engine: TemplateEngine, context: S) -> Self { Template { name, - context + engine, + context, } } - - fn render(self, tera: &Tera) -> Result<(ContentType, String), Status> { - let context = Context::from_serialize(self.context).map_err(|e| { - error!("Failed to serialize context: {}", e); - Status::InternalServerError - })?; - - let content = tera.render(self.name, &context).map_err(|e| { - error!("Failed to render template `{}`: {}", self.name, e); - Status::InternalServerError - })?; - - Ok((ContentType::HTML, content)) - } } -impl<'r, 't, S: Serialize> Responder<'r, 'static> for Template<'t, S> { - fn respond_to(self, request: &'r Request<'_>) -> response::Result<'static> { - let template_state = request.rocket().state::().ok_or(Status::InternalServerError)?; +impl IntoResponse for Template<'_, S> { + fn into_response(self) -> axum::response::Response { + let res = self.engine.render(self.name, self.context); - self.render(&template_state.tera).respond_to(request) + match res { + Ok(content) => Html(content).into_response(), + Err(err) => Error::from(err).into_response(), + } } } diff --git a/templates/bases/app.html b/templates/bases/app.html index 5deb2d4..5650668 100644 --- a/templates/bases/app.html +++ b/templates/bases/app.html @@ -1,41 +1,11 @@ {% extends "bases/base.html" %} -{% import "macros.html" as macros %} {% block content %}
diff --git a/templates/bases/base.html b/templates/bases/base.html index 1f209cb..e543cb6 100644 --- a/templates/bases/base.html +++ b/templates/bases/base.html @@ -4,7 +4,7 @@ {% block title %}{% endblock title %}Nomilo - + {% block styles %}{% endblock styles %} diff --git a/templates/macros.html b/templates/macros.html deleted file mode 100644 index e00c87d..0000000 --- a/templates/macros.html +++ /dev/null @@ -1,11 +0,0 @@ -{% macro nav_link(content, href, current_page, content='', safe_content='', section=False, current_sections=False, props='') %} -{{ content }}{{ safe_content | safe }} -{% endmacro nav_link %} diff --git a/templates/pages/login.html b/templates/pages/login.html deleted file mode 100644 index 24e8fc3..0000000 --- a/templates/pages/login.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "bases/base.html" %} - -{% block title %}Se connecter ⋅ {% endblock title %} -{% block styles %} - -{% endblock styles %} - -{% block content %} -
-
-

Se connecter

- {% if error %} - - {% endif %} - - - - - - -
-
-{% endblock content %} diff --git a/templates/pages/records.html b/templates/pages/records.html new file mode 100644 index 0000000..5bc1407 --- /dev/null +++ b/templates/pages/records.html @@ -0,0 +1,103 @@ +{% extends "bases/app.html" %} +{% block title %}Records - {{ current_zone }} - {% endblock title %} + +{% block main %} +

Zone {{ current_zone }} records

+ +
+

Records

+ + {% set current_domain = '' %} + {% set current_rtype = '' %} + + {% for record in records %} + {% if record.name != current_domain %} + {% if current_domain %} + + + + + + {% endif %} + {% set_global current_domain = record.name %} + {% set_global current_rtype = '' %} +
+
+

{{ record.name }}

+ + + + Add record + +
+
+
    + {% endif %} + {% if record.type != current_rtype %} + {% if current_rtype %} +
+ + {% endif %} + {% set_global current_rtype = record.type %} +
  • + {{ record.type }} +
      +
    • + {% endif %} +
      + {% if record.type == "A" or record.type == "AAAA" %} +
      + + {{ record.rdata.address }} + +
      + {% elif record.type == "MX" %} +
      + + {{ record.rdata.mail_exchanger }} + +
      +
      + + Preference: {{ record.rdata.mail_exchanger }} + +
      + {% elif record.type == "NS" %} +
      + + {{ record.rdata.target }} + +
      + {% endif %} +
      +
      + + + + + + +
      +
    • + {% endfor %} +
    +
  • + +
    +
    +
    +{% endblock main %} diff --git a/templates/pages/zone/records.html b/templates/pages/zone/records.html deleted file mode 100644 index 9ac490e..0000000 --- a/templates/pages/zone/records.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "bases/app.html" %} -{% import "macros.html" as macros %} - -{% block title %}{{ current_zone }} ⋅ Records ⋅ {% endblock title %} -{% block styles %} - -{% endblock styles %} - -{% block main %} -

    Gestion de la zone {{ current_zone }}

    - -
    - - -
    -{% endblock main %} - -{% block scripts %} - -{% endblock scripts %} diff --git a/templates/pages/zones.html b/templates/pages/zones.html deleted file mode 100644 index 016a96f..0000000 --- a/templates/pages/zones.html +++ /dev/null @@ -1,3 +0,0 @@ -{% extends "bases/app.html" %} - -{% block title %}Zones ⋅ {% endblock title %} diff --git a/templates/pages/zones/new.html b/templates/pages/zones/new.html deleted file mode 100644 index 72c0767..0000000 --- a/templates/pages/zones/new.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "bases/app.html" %} - -{% block title %}Ajouter une zone ⋅ {% endblock title %} - -{% block main %} -

    Ajouter une zone

    -
    - {% if error %} - - {% endif %} - - - - -
    -{% endblock main %}