From 19dfc5136065bf41c82a0dfc82c1899d44e0b511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 5 Nov 2026 12:52:32 +0100 Subject: [PATCH] first commit --- .env.example | 13 + .gitignore | 7 + CHANGELOG.md | 28 + Cargo.lock | 3132 ++++++++++++++++++++++++++ Cargo.toml | 67 + LICENSE | 696 ++++++ README.md | 80 + build-release.sh | 49 + deploy/active-push-autodiscover.conf | 6 + deploy/active-push.service | 58 + deploy/environment.example | 12 + deploy/nginx-active-push.conf | 47 + dev.sh | 115 + docs/API.md | 46 + docs/CONFIGURATION.md | 73 + docs/DEVELOPMENT.md | 78 + docs/INSTALL.md | 132 ++ docs/LOGS.md | 79 + docs/MIGRATION.md | 58 + docs/PANEL.md | 109 + docs/SECURITY.md | 61 + docs/TROUBLESHOOTING.md | 52 + docs/images/activesync.png | Bin 0 -> 132678 bytes docs/images/backends.png | Bin 0 -> 127913 bytes docs/images/device.png | Bin 0 -> 159646 bytes docs/images/devices.png | Bin 0 -> 115930 bytes docs/images/live.png | Bin 0 -> 200430 bytes docs/images/logs.png | Bin 0 -> 144787 bytes docs/images/mailboxes.png | Bin 0 -> 124151 bytes docs/images/mobile.png | Bin 0 -> 128450 bytes docs/images/overview-light.png | Bin 0 -> 122558 bytes docs/images/overview.png | Bin 0 -> 174431 bytes docs/images/policies.png | Bin 0 -> 147026 bytes docs/images/security.png | Bin 0 -> 108452 bytes docs/images/setup.png | Bin 0 -> 62244 bytes migrations/0001_init.sql | 140 ++ rust-toolchain.toml | 4 + scripts/build-deb.sh | 168 ++ scripts/check-wbxml-names.py | 31 + src/admin.rs | 1254 +++++++++++ src/app.rs | 149 ++ src/autodiscover.rs | 215 ++ src/backend/dav.rs | 580 +++++ src/backend/ical.rs | 412 ++++ src/backend/imap.rs | 1072 +++++++++ src/backend/mime.rs | 247 ++ src/backend/mod.rs | 1174 ++++++++++ src/backend/smtp.rs | 145 ++ src/backend/tz.rs | 501 ++++ src/config.rs | 764 +++++++ src/db.rs | 735 ++++++ src/eas/convert/calendar.rs | 1159 ++++++++++ src/eas/convert/contact.rs | 650 ++++++ src/eas/convert/email.rs | 580 +++++ src/eas/convert/mod.rs | 169 ++ src/eas/convert/task.rs | 299 +++ src/eas/folders.rs | 340 +++ src/eas/itemops.rs | 279 +++ src/eas/mailcmd.rs | 481 ++++ src/eas/misc.rs | 445 ++++ src/eas/mod.rs | 836 +++++++ src/eas/ping.rs | 238 ++ src/eas/provision.rs | 346 +++ src/eas/state.rs | 128 ++ src/eas/sync.rs | 1081 +++++++++ src/lib.rs | 68 + src/logging.rs | 134 ++ src/main.rs | 486 ++++ src/metrics.rs | 479 ++++ src/probe.rs | 266 +++ src/server.rs | 97 + src/tls.rs | 112 + src/util.rs | 276 +++ src/wbxml/codepages.rs | 763 +++++++ src/wbxml/mod.rs | 556 +++++ src/xmltree.rs | 166 ++ tests/e2e.rs | 634 ++++++ tools/dev/screenshots.js | 73 + tools/dev/test-backends.sh | 149 ++ tools/dev/test-settings.json | 10 + tools/zpush-import.py | 246 ++ web/app.js | 931 ++++++++ web/favicon.svg | 1 + web/index.html | 74 + web/style.css | 363 +++ 85 files changed, 25504 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100755 build-release.sh create mode 100644 deploy/active-push-autodiscover.conf create mode 100644 deploy/active-push.service create mode 100644 deploy/environment.example create mode 100644 deploy/nginx-active-push.conf create mode 100755 dev.sh create mode 100644 docs/API.md create mode 100644 docs/CONFIGURATION.md create mode 100644 docs/DEVELOPMENT.md create mode 100644 docs/INSTALL.md create mode 100644 docs/LOGS.md create mode 100644 docs/MIGRATION.md create mode 100644 docs/PANEL.md create mode 100644 docs/SECURITY.md create mode 100644 docs/TROUBLESHOOTING.md create mode 100644 docs/images/activesync.png create mode 100644 docs/images/backends.png create mode 100644 docs/images/device.png create mode 100644 docs/images/devices.png create mode 100644 docs/images/live.png create mode 100644 docs/images/logs.png create mode 100644 docs/images/mailboxes.png create mode 100644 docs/images/mobile.png create mode 100644 docs/images/overview-light.png create mode 100644 docs/images/overview.png create mode 100644 docs/images/policies.png create mode 100644 docs/images/security.png create mode 100644 docs/images/setup.png create mode 100644 migrations/0001_init.sql create mode 100644 rust-toolchain.toml create mode 100755 scripts/build-deb.sh create mode 100755 scripts/check-wbxml-names.py create mode 100644 src/admin.rs create mode 100644 src/app.rs create mode 100644 src/autodiscover.rs create mode 100644 src/backend/dav.rs create mode 100644 src/backend/ical.rs create mode 100644 src/backend/imap.rs create mode 100644 src/backend/mime.rs create mode 100644 src/backend/mod.rs create mode 100644 src/backend/smtp.rs create mode 100644 src/backend/tz.rs create mode 100644 src/config.rs create mode 100644 src/db.rs create mode 100644 src/eas/convert/calendar.rs create mode 100644 src/eas/convert/contact.rs create mode 100644 src/eas/convert/email.rs create mode 100644 src/eas/convert/mod.rs create mode 100644 src/eas/convert/task.rs create mode 100644 src/eas/folders.rs create mode 100644 src/eas/itemops.rs create mode 100644 src/eas/mailcmd.rs create mode 100644 src/eas/misc.rs create mode 100644 src/eas/mod.rs create mode 100644 src/eas/ping.rs create mode 100644 src/eas/provision.rs create mode 100644 src/eas/state.rs create mode 100644 src/eas/sync.rs create mode 100644 src/lib.rs create mode 100644 src/logging.rs create mode 100644 src/main.rs create mode 100644 src/metrics.rs create mode 100644 src/probe.rs create mode 100644 src/server.rs create mode 100644 src/tls.rs create mode 100644 src/util.rs create mode 100644 src/wbxml/codepages.rs create mode 100644 src/wbxml/mod.rs create mode 100644 src/xmltree.rs create mode 100644 tests/e2e.rs create mode 100644 tools/dev/screenshots.js create mode 100755 tools/dev/test-backends.sh create mode 100644 tools/dev/test-settings.json create mode 100755 tools/zpush-import.py create mode 100644 web/app.js create mode 100644 web/favicon.svg create mode 100644 web/index.html create mode 100644 web/style.css diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..fd3be34 --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +# Optional. Copy to .env - dev.sh sources it as a shell file; use trusted content only. +ACTIVE_PUSH_DATA_DIR=./data +# Device facing listener (nginx / RustProxy proxies /Microsoft-Server-ActiveSync and autodiscover here) +ACTIVE_PUSH_EAS_LISTEN=127.0.0.1:8081 +# Administration panel (keep on loopback; use SSH tunnel or a reverse proxy with auth) +ACTIVE_PUSH_ADMIN_LISTEN=127.0.0.1:9091 +# ACTIVE_PUSH_ALLOW_REMOTE_ADMIN=true +# ACTIVE_PUSH_ADMIN_TLS_CERT=/etc/active-push/tls/fullchain.pem +# ACTIVE_PUSH_ADMIN_TLS_KEY=/etc/active-push/tls/privkey.pem +# ACTIVE_PUSH_LOG_JSON=true +RUST_LOG=active_push=info,warn +# Lines shown in the panel log viewer (tracing filter) +# ACTIVE_PUSH_PANEL_LOG=active_push=info,warn diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ae292e --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +target/ +data/ +dist/ +.env +*.db +*.db-wal +*.db-shm diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..51a2f48 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,28 @@ +# Changelog + +## 0.1.1 - 2026-11-05 + +- Fix: devices migrated from Z-Push looping on unknown collection ids (`collection ... not found`) - such ids are + now removed from the device with a FolderHierarchy Delete on the next FolderSync. +- Counting: devices are physical phones (DeviceId); mailboxes are counted separately; partnerships shown too. + Devices page groups all mailboxes of one phone in one row; Users page renamed to Mailboxes with + "same device as" column. +- Panel: English by default, spacing between cards, styled select dropdowns, non-overlapping live stream + columns, chart axis labels no longer clipped, database size on Overview. +- Port 8081: plain text on `/`, plain 404 elsewhere, `/healthz` also checks the database. +- Retention: hourly WAL checkpoint/truncate, incremental auto-vacuum, pruning of id maps and very old states, + inactive devices removed after 180 days by default, bounded in-memory caches, unknown command names + normalised. +- `probe`: `--device-id`, `--device-type`, `--model`. +- Documentation in English with screenshots (`docs/PANEL.md`), new `LOGS.md` and `TROUBLESHOOTING.md`. + +## 0.1.0 - 2026-11-05 + +First release: complete rewrite of Z-Push (combined backend: IMAP/SMTP + CalDAV + CardDAV) in Rust. + +- ActiveSync 2.5-14.1, every command used by iOS, Android and Outlook. +- Push (Ping, hanging Sync) with cheap change detection. +- Administration panel: overview, live traffic, devices (remote wipe, blocks, approval), mailboxes, backends with + connection tests, ActiveSync settings, policies, security, logs and audit. +- Login lockouts, access lists, audit, Prometheus. +- .deb package, sandboxed systemd unit, Z-Push config importer, `admin/config/device/probe` CLI. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..23ba78e --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3132 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "active-push" +version = "0.1.1" +dependencies = [ + "anyhow", + "arc-swap", + "argon2", + "axum", + "base64 0.22.1", + "bytes", + "chrono", + "chrono-tz", + "clap", + "futures-util", + "hex", + "hmac", + "http", + "http-body-util", + "hyper", + "hyper-util", + "lettre", + "mail-parser", + "md-5", + "percent-encoding", + "quick-xml", + "rand 0.8.8", + "regex", + "reqwest", + "rpassword", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "sqlx", + "subtle", + "tempfile", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tracing", + "tracing-subscriber", + "url", + "uuid", + "webpki-roots 0.26.11", + "zeroize", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arc-swap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380962b3d93b99642e50b9febf72c071e97e8b32d86eae9cf4ef582bb960ae6e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures 0.2.17", + "password-hash", +] + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +dependencies = [ + "serde_core", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[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 = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375989decec1a0fa424442bed520fa12ede43a48475ce8c7417d2c69b32b5f6b" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crossbeam-queue" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" +dependencies = [ + "serde", +] + +[[package]] +name = "email-encoding" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420b9da095f052ea597503e39073b5b3c522f7db933fbac202d91d24492693fd" +dependencies = [ + "base64 0.23.1", + "memchr", +] + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "h2" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d29020232d6aa3fb1daca64c1127cf662cf97f254ae16c18c05b8ab635fc118" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashify" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1246c0e5493286aeb2dde35b1f4eb9c4ce00e628641210a5e553fc001a1f26" +dependencies = [ + "indexmap", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" + +[[package]] +name = "icu_properties" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" + +[[package]] +name = "icu_provider" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" +dependencies = [ + "spin", +] + +[[package]] +name = "lettre" +version = "0.11.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c646bd5cc763b1087b15493e29a64be6147ba8f19342004fa52048ee596eae" +dependencies = [ + "async-trait", + "base64 0.23.1", + "email-encoding", + "email_address", + "fastrand", + "futures-io", + "futures-util", + "httpdate", + "idna", + "mime", + "nom", + "percent-encoding", + "quoted_printable", + "rustls", + "rustls-native-certs", + "socket2", + "tokio", + "tokio-rustls", + "url", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "bitflags", + "libc", + "plain", + "redox_syscall 0.9.5", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" + +[[package]] +name = "lru-slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" + +[[package]] +name = "mail-parser" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec00bda90c6e645a54506c630c2820cd6b1890cfd2b0a169b50f74b2b8c7c86" +dependencies = [ + "hashify", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.8", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "openssl-probe" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e036b411754132fd6b74e94b74e9a13c5cf606fa93d1885c35860d3060820b1" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.3", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rpassword" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da316a15f47e3d053de9cb2c439650bd8fa4aaeb9365f2e5f27f492ff73c196" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.61.2", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rtoolbox" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1efe12a1469752d0e6ff5ebec0b6ef4924cc5c4c71046b0ec730040535819d" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a073f5dc7469f984c52ad2752b63b0807745133b6de880b7b64c1ac4c48aec4" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "schannel" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cb23c424d8ee841bb4d813677ca237e2a610067d594fec130f87d6093495ab5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64 0.22.1", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.119", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-sqlite", + "syn 2.0.119", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.8", + "rsa", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.8", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tinystr" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokio" +version = "1.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "unicode-normalization" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75cd3fb03d5288b3ba9a1ee103ac7e9cbb59f0b03d64f8ddfcc04dd42758a85d" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993ad287eb20e8ba755312801cfe1413e0f25d604075863acaddca10b04c1833" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0" +dependencies = [ + "utf_types", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "utf_types" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6" + +[[package]] +name = "uuid" +version = "1.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" +dependencies = [ + "cfg-if", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e14e0327cb5368ad60ccb22d04a9827a693c95a926d8d125e9fa39e0baec501" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d179596ff5ec0f6de4db64d54011bde6289cc49603d3a6e4ce3f329207ab88" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.11", +] + +[[package]] +name = "webpki-roots" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "yoke" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..24ffd81 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,67 @@ +[package] +name = "active-push" +version = "0.1.1" +edition = "2021" +rust-version = "1.85" +description = "ActivePush - Exchange ActiveSync server (Z-Push rewrite) with built-in administration panel" +license = "AGPL-3.0-only" +publish = false + +[[bin]] +name = "active-push" +path = "src/main.rs" + +[dependencies] +anyhow = "1.0" +thiserror = "2" +argon2 = "0.5" +arc-swap = "1.7" +axum = { version = "0.8", default-features = false, features = ["http1", "http2", "json", "query", "tokio", "form"] } +base64 = "0.22" +bytes = "1" +chrono = { version = "0.4", default-features = false, features = ["clock", "std", "serde"] } +chrono-tz = "0.10" +clap = { version = "4.5", features = ["derive", "env"] } +futures-util = "0.3" +hex = "0.4" +hmac = "0.12" +http = "1" +http-body-util = "0.1" +hyper = { version = "1", features = ["server", "http1", "http2"] } +hyper-util = { version = "0.1", features = ["server-auto", "tokio", "http1", "http2"] } +lettre = { version = "0.11", default-features = false, features = ["builder", "smtp-transport", "tokio1", "tokio1-rustls", "rustls-native-certs", "ring"] } +mail-parser = "0.11" +md-5 = "0.10" +percent-encoding = "2" +quick-xml = "0.37" +rand = "0.8" +regex = "1" +reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-native-roots", "http2"] } +rpassword = "7" +rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12", "logging"] } +rustls-native-certs = "0.8" +rustls-pemfile = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" +sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "sqlite", "migrate", "macros"] } +subtle = "2.6" +tokio = { version = "1", features = ["macros", "rt-multi-thread", "net", "signal", "time", "sync", "fs", "io-util", "process"] } +tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "tls12", "logging"] } +tokio-util = { version = "0.7", features = ["rt"] } +tower = { version = "0.5", features = ["util", "limit"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json"] } +url = "2.5" +uuid = { version = "1", features = ["v4"] } +webpki-roots = "0.26" +zeroize = "1.8" + +[dev-dependencies] +tempfile = "3" + +[profile.release] +lto = "thin" +codegen-units = 1 +strip = "debuginfo" +panic = "unwind" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2cd4e92 --- /dev/null +++ b/LICENSE @@ -0,0 +1,696 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + + +--- + +Copyright 2007 - 2016 Zarafa Deutschland GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License, version 3, +as published by the Free Software Foundation with the following additional +term according to sec. 7: + +According to sec. 7 of the GNU Affero General Public License, version 3, +the terms of the AGPL are supplemented with the following terms: + +"Zarafa" is a registered trademark of Zarafa B.V. +"Z-Push" is a registered trademark of Zarafa Deutschland GmbH +The licensing of the Program under the AGPL does not imply a trademark license. +Therefore any rights, title and interest in our trademarks remain entirely with us. + +Our trademark policy (see TRADEMARKS) allows you to use our trademarks +in connection with Propagation and certain other acts regarding the Program. +In any case, if you propagate an unmodified version of the Program you are +allowed to use the term "Z-Push" to indicate that you distribute the Program. +Furthermore you may use our trademarks where it is necessary to indicate the +intended purpose of a product or service provided you use it in accordance +with honest business practices. For questions please contact Zarafa at +trademark@zarafa.com. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ee2d6c9 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# ActivePush + +**Exchange ActiveSync server written in Rust** - a from-scratch successor of **Z-Push** (PHP) for classic mail +stacks: **IMAP + SMTP** (e.g. Dovecot + Postfix), **CalDAV** and **CardDAV** (Radicale, SOGo, Baikal, +Nextcloud, DAViCal). One binary, no PHP-FPM, with a built-in administration panel in the RustProxy style: +configuration, devices, remote wipe, policies, statistics, charts and live traffic. + +![Overview](docs/images/overview.png) + +``` +phone / Outlook --HTTPS--> nginx | RustProxy --> ActivePush :8081 --> IMAP / SMTP / CalDAV / CardDAV +administrator --(SSH tunnel / VPN)-------------> panel :9091 +``` + +## Features + +| Area | What you get | +|---|---| +| Protocol | ActiveSync 2.5, 12.0, 12.1, 14.0, 14.1; WBXML; plain and base64 query strings; multipart responses | +| Commands | Sync (incl. empty/partial and hanging Sync), FolderSync, FolderCreate/Update/Delete, GetHierarchy, Ping (push), Provision, SendMail, SmartReply, SmartForward, GetAttachment, ItemOperations (Fetch, byte ranges, EmptyFolderContents), GetItemEstimate, MoveItems, MeetingResponse, Search (GAL and mailbox), ResolveRecipients, Settings, ValidateCert | +| Mail | IMAP folder hierarchy and SPECIAL-USE, read/flag/answered/forwarded, move, trash, attachments, text/HTML/MIME bodies with truncation and preview, S/MIME passthrough, iMIP invitations as MeetingRequest | +| Calendar | VEVENT <-> EAS: time zones (TIME_ZONE_INFORMATION <-> IANA), all-day events, RRULE recurrences, exceptions (EXDATE + RECURRENCE-ID), attendees and responses, reminders, busy status, categories | +| Tasks | VTODO <-> EAS Tasks (due, start, completion, priority, reminder, recurrence) | +| Contacts | vCard 2.1/3.0/4.0 <-> EAS Contacts with **lossless merging** of fields ActiveSync cannot represent | +| Push | Ping with cheap change detection (IMAP STATUS / DAV CTag every N seconds, full diff only when a signature changes) | +| Security | per-account and per-IP lockout, fail2ban friendly log line, user/domain/network/device-type allow and block lists, device approval, provisioning policies, remote wipe, sender enforcement, DAV SSRF guard, XML without DTD, size limits, panel with argon2id + CSRF + strict CSP | +| Panel | overview charts, live traffic (SSE), devices grouped per phone, mailboxes, backends with connection tests, ActiveSync settings, policies, security, logs and audit; English/Polish, dark/light theme | +| Operations | hardened systemd unit, portable `.deb`, Prometheus `/metrics`, `/healthz`, Z-Push config importer, CLI equivalent of `z-push-admin`, automatic database retention and compaction | + +## Quick start (development) + +```bash +cp .env.example .env +./dev.sh backends # terminal 1: Dovecot + Radicale + SMTP sink (needs dovecot-imapd, radicale, aiosmtpd) +./dev.sh seed # settings matching those backends +./dev.sh # terminal 2: server (ActiveSync :8081, panel :9091) +./dev.sh admin setup-token # one-time token for creating the administrator at http://127.0.0.1:9091 +./dev.sh probe jan@test.local # ActiveSync smoke test (password: Test-Password-123) +./dev.sh e2e # end-to-end test of every command +``` + +`./dev.sh help` lists all commands (`lint`, `test`, `release`, `deb`, `dist`, `import-zpush` ...). + +## Production (Debian/Ubuntu) + +```bash +./dev.sh deb # -> dist/active-push_-1_amd64.deb (glibc >= 2.30) +sudo apt install ./dist/active-push_*.deb # creates the user and directories, enables the service +sudo -u active-push active-push admin setup-token +ssh -L 9091:127.0.0.1:9091 server # panel: http://127.0.0.1:9091 +``` + +Then replace the Z-Push fastcgi locations in nginx with `proxy_pass` - ready snippet: +[`deploy/nginx-active-push.conf`](deploy/nginx-active-push.conf). Details: [docs/INSTALL.md](docs/INSTALL.md). + +## Migrating from Z-Push + +```bash +python3 /usr/share/active-push/zpush-import.py /usr/share/z-push > zpush.json # or /etc/z-push +sudo -u active-push active-push config apply zpush.json +``` + +Devices resynchronise on their own (unknown sync key -> status 9/3, unknown policy key -> provisioning, +unknown Z-Push collection ids are removed from the device). See [docs/MIGRATION.md](docs/MIGRATION.md). + +## Documentation + +- [docs/PANEL.md](docs/PANEL.md) - tour of the administration panel with screenshots +- [docs/INSTALL.md](docs/INSTALL.md) - installation, nginx/RustProxy, systemd, upgrades, backups +- [docs/CONFIGURATION.md](docs/CONFIGURATION.md) - every setting and its Z-Push equivalent +- [docs/LOGS.md](docs/LOGS.md) - logging, retention, rotation and database maintenance +- [docs/SECURITY.md](docs/SECURITY.md) - security model and recommendations +- [docs/MIGRATION.md](docs/MIGRATION.md) - moving from Z-Push +- [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) - common problems +- [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) - architecture, tests, development environment +- [docs/API.md](docs/API.md) - panel API and Prometheus metrics + +## License + +AGPL-3.0-only (like Z-Push, from which the WBXML code pages and protocol behaviour originate). diff --git a/build-release.sh b/build-release.sh new file mode 100755 index 0000000..58a72b1 --- /dev/null +++ b/build-release.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Full release pipeline: lint, tests, optimised binary, Debian package, source archive, checksums. +set -euo pipefail +ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +cd "$ROOT" +fail() { printf 'error: %s\n' "$*" >&2; exit 1; } +need() { command -v "$1" >/dev/null 2>&1 || fail "$1 is required"; } +need cargo; need rustc; need python3; need sha256sum; need tar + +VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)" +HOST="$(rustc -vV | sed -n 's/^host: //p')" +[[ -f Cargo.lock ]] || fail "Cargo.lock is required for a reproducible release" +printf 'ActivePush %s release build for %s\n' "$VERSION" "$HOST" + +cargo fmt --all -- --check +cargo clippy --locked --all-targets -- -D warnings +python3 scripts/check-wbxml-names.py +if command -v node >/dev/null; then node --check web/app.js; fi +cargo test --locked --lib --bins +if command -v cargo-zigbuild >/dev/null 2>&1 && [[ "${GLIBC_TARGET:-2.31}" != "0" ]]; then + # portable binary (old glibc baseline) + cargo zigbuild --locked --release --target "$(uname -m)-unknown-linux-gnu.${GLIBC_TARGET:-2.31}" + BIN="target/$(uname -m)-unknown-linux-gnu/release/active-push" +else + cargo build --locked --release + BIN="target/release/active-push" +fi +[[ -x "$BIN" ]] || fail "release binary missing" +"$BIN" --version + +rm -rf dist && mkdir -p dist +ART="active-push-${VERSION}-${HOST}" +cp "$BIN" "dist/$ART" +chmod 0755 "dist/$ART" +(cd dist && sha256sum "$ART" > "$ART.sha256") + +if command -v dpkg-deb >/dev/null; then + BIN="$BIN" scripts/build-deb.sh --no-build +else + printf 'dpkg-deb not found: skipping .deb\n' +fi + +SRC="dist/active-push-${VERSION}-source.tar.gz" +tar --exclude=./target --exclude=./data --exclude=./dist --exclude=./.git --exclude=./.env \ + -czf "$SRC" --transform "s,^\.,active-push-${VERSION}," . +(cd dist && sha256sum "$(basename "$SRC")" > "$(basename "$SRC").sha256") + +printf '\nRelease artifacts:\n' +ls -1 dist diff --git a/deploy/active-push-autodiscover.conf b/deploy/active-push-autodiscover.conf new file mode 100644 index 0000000..6740076 --- /dev/null +++ b/deploy/active-push-autodiscover.conf @@ -0,0 +1,6 @@ +proxy_pass http://127.0.0.1:8081; +proxy_set_header Host $host; +proxy_set_header X-Forwarded-For $remote_addr; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_read_timeout 300s; +client_max_body_size 64k; diff --git a/deploy/active-push.service b/deploy/active-push.service new file mode 100644 index 0000000..4972634 --- /dev/null +++ b/deploy/active-push.service @@ -0,0 +1,58 @@ +[Unit] +Description=ActivePush Exchange ActiveSync server +Documentation=file:///usr/share/doc/active-push/README.md +Wants=network-online.target +After=network-online.target dovecot.service postfix.service + +[Service] +Type=simple +User=active-push +Group=active-push +WorkingDirectory=/var/lib/active-push +UMask=0077 +Environment=RUST_LOG=active_push=info,warn +Environment=MALLOC_ARENA_MAX=2 +EnvironmentFile=-/etc/active-push/environment +ExecStart=/usr/bin/active-push serve +Restart=on-failure +RestartSec=3 +# hanging Ping requests are released on SIGTERM +KillSignal=SIGTERM +TimeoutStopSec=30 +LimitNOFILE=65536 + +StateDirectory=active-push +StateDirectoryMode=0700 +ConfigurationDirectory=active-push +ConfigurationDirectoryMode=0750 +NoNewPrivileges=true +PrivateTmp=true +PrivateDevices=true +ProtectSystem=strict +ProtectHome=true +ProtectClock=true +ProtectHostname=true +ProtectKernelTunables=true +ProtectKernelModules=true +ProtectKernelLogs=true +ProtectControlGroups=true +ProtectProc=invisible +ProcSubset=pid +RestrictSUIDSGID=true +RestrictNamespaces=true +RestrictRealtime=true +# AF_UNIX is needed only for the optional sendmail method +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +SystemCallArchitectures=native +SystemCallFilter=@system-service +SystemCallFilter=~@privileged @resources +LockPersonality=true +MemoryDenyWriteExecute=true +CapabilityBoundingSet= +AmbientCapabilities= +ReadWritePaths=/var/lib/active-push +# sendmail method: postfix needs its queue directory +# ReadWritePaths=/var/spool/postfix/maildrop + +[Install] +WantedBy=multi-user.target diff --git a/deploy/environment.example b/deploy/environment.example new file mode 100644 index 0000000..fb65968 --- /dev/null +++ b/deploy/environment.example @@ -0,0 +1,12 @@ +# /etc/active-push/environment - read by the systemd unit (KEY=value, no shell syntax). +# All runtime settings (IMAP, SMTP, CalDAV, policies, security…) are managed in the panel. +ACTIVE_PUSH_DATA_DIR=/var/lib/active-push +ACTIVE_PUSH_EAS_LISTEN=127.0.0.1:8081 +ACTIVE_PUSH_ADMIN_LISTEN=127.0.0.1:9091 +# Expose the panel on the network (only with TLS and allowed_networks set in the panel): +# ACTIVE_PUSH_ALLOW_REMOTE_ADMIN=true +# ACTIVE_PUSH_ADMIN_LISTEN=0.0.0.0:9091 +# ACTIVE_PUSH_ADMIN_TLS_CERT=/etc/active-push/tls/fullchain.pem +# ACTIVE_PUSH_ADMIN_TLS_KEY=/etc/active-push/tls/privkey.pem +# ACTIVE_PUSH_LOG_JSON=true +RUST_LOG=active_push=info,warn diff --git a/deploy/nginx-active-push.conf b/deploy/nginx-active-push.conf new file mode 100644 index 0000000..3a1d640 --- /dev/null +++ b/deploy/nginx-active-push.conf @@ -0,0 +1,47 @@ +# ActivePush - drop-in replacement for the Z-Push PHP-FPM locations. +# Put these inside the existing `server { listen 443 ssl; ... }` block of the mail host. + +location = /Microsoft-Server-ActiveSync { + proxy_pass http://127.0.0.1:8081; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + # Ping/hanging Sync keep the request open up to ~59 minutes + proxy_read_timeout 3660s; + proxy_send_timeout 3660s; + proxy_buffering off; + proxy_request_buffering on; + client_max_body_size 64m; +} + +# Health check for monitoring / load balancers (no authentication, no data). +location = /activesync-healthz { + proxy_pass http://127.0.0.1:8081/healthz; + access_log off; +} + +# The same three case variants previously routed to autodiscover.php +location = /AutoDiscover/AutoDiscover.xml { include /etc/nginx/snippets/active-push-autodiscover.conf; } +location = /Autodiscover/Autodiscover.xml { include /etc/nginx/snippets/active-push-autodiscover.conf; } +location = /autodiscover/autodiscover.xml { include /etc/nginx/snippets/active-push-autodiscover.conf; } + +# --- /etc/nginx/snippets/active-push-autodiscover.conf ------------------------- +# proxy_pass http://127.0.0.1:8081; +# proxy_set_header Host $host; +# proxy_set_header X-Forwarded-For $remote_addr; +# proxy_set_header X-Forwarded-Proto $scheme; +# proxy_read_timeout 300s; +# client_max_body_size 64k; + +# --- Optional: panel behind nginx with an extra auth layer ---------------------- +# location /active-push-admin/ { +# allow 10.0.0.0/8; deny all; +# proxy_pass http://127.0.0.1:9091/; +# proxy_set_header X-Forwarded-For $remote_addr; +# proxy_set_header X-Forwarded-Proto $scheme; +# proxy_buffering off; # live event stream (SSE) +# } +# The panel uses absolute paths (/api, /app.js); a dedicated (sub)domain is simpler: +# server { server_name push-admin.example.com; location / { proxy_pass http://127.0.0.1:9091; ... } } diff --git a/dev.sh b/dev.sh new file mode 100755 index 0000000..799f7fd --- /dev/null +++ b/dev.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +cd "$ROOT" +umask 077 +if [[ -f .env ]]; then + # Local shell configuration. Do not source untrusted .env files. + set -a + # shellcheck disable=SC1091 + source .env + set +a +fi +if ! command -v cargo >/dev/null 2>&1 && [[ -x "$HOME/.cargo/bin/cargo" ]]; then + export PATH="$HOME/.cargo/bin:$PATH" +fi +VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)" +mode="${1:-run}" +if [[ $# -gt 0 ]]; then shift; fi + +case "$mode" in + help|-h|--help) + cat <&2; exit 2 ;; +esac + +case "$mode" in + doctor) + for tool in cargo rustc cc python3 node dpkg-deb dovecot radicale; do + printf '%-10s ' "$tool"; command -v "$tool" || printf 'NOT FOUND\n' + done + exit 0 ;; + backends) exec tools/dev/test-backends.sh "$@" ;; + import-zpush) exec python3 tools/zpush-import.py "$@" ;; + deb) exec scripts/build-deb.sh "$@" ;; + dist) exec ./build-release.sh "$@" ;; +esac + +if ! command -v cargo >/dev/null 2>&1; then + cat >&2 <<'MISSING' +Rust/Cargo is not installed or not in PATH. +Install the stable toolchain from https://rustup.rs and a C linker (build-essential). +This script never installs system software or runs sudo. +MISSING + exit 127 +fi + +export ACTIVE_PUSH_DATA_DIR="${ACTIVE_PUSH_DATA_DIR:-$ROOT/data}" +export ACTIVE_PUSH_EAS_LISTEN="${ACTIVE_PUSH_EAS_LISTEN:-127.0.0.1:8081}" +export ACTIVE_PUSH_ADMIN_LISTEN="${ACTIVE_PUSH_ADMIN_LISTEN:-127.0.0.1:9091}" +export RUST_LOG="${RUST_LOG:-active_push=info,warn}" +export CARGO_TARGET_DIR="${CARGO_TARGET_DIR:-$ROOT/target}" +mkdir -p "$ACTIVE_PUSH_DATA_DIR" + +case "$mode" in + fmt) exec cargo fmt --all "$@" ;; + check) exec cargo check --all-targets "$@" ;; + test) exec cargo test --lib --bins "$@" ;; + lint) + cargo fmt --all -- --check + cargo clippy --all-targets -- -D warnings + if command -v node >/dev/null; then node --check web/app.js; fi + python3 scripts/check-wbxml-names.py + printf 'Lint: OK\n' + exit 0 ;; + release) exec cargo build --release "$@" ;; + e2e) + export AP_E2E_URL="${AP_E2E_URL:-http://${ACTIVE_PUSH_EAS_LISTEN}}" + exec cargo test --test e2e -- --nocapture --test-threads=1 "$@" ;; +esac + +printf 'Building ActivePush %s...\n' "$VERSION" >&2 +cargo build +BIN="$CARGO_TARGET_DIR/debug/active-push" +case "$mode" in + build) printf 'Binary: %s\n' "$BIN" ;; + seed) exec "$BIN" config apply tools/dev/test-settings.json ;; + probe) + user="${1:?usage: ./dev.sh probe USER}" + exec "$BIN" probe --url "http://${ACTIVE_PUSH_EAS_LISTEN}/Microsoft-Server-ActiveSync" --user "$user" ;; + admin) exec "$BIN" admin "$@" ;; + config) exec "$BIN" config "$@" ;; + device) exec "$BIN" device "$@" ;; + run) + printf 'ActiveSync: http://%s/Microsoft-Server-ActiveSync\nPanel: http://%s/\n' "$ACTIVE_PUSH_EAS_LISTEN" "$ACTIVE_PUSH_ADMIN_LISTEN" >&2 + exec "$BIN" serve "$@" ;; +esac diff --git a/docs/API.md b/docs/API.md new file mode 100644 index 0000000..6b2836a --- /dev/null +++ b/docs/API.md @@ -0,0 +1,46 @@ +# Panel API + +Every endpoint except `/api/session`, `/api/login`, `/api/setup`, `/metrics` and `/healthz` requires a session +(cookie `ap_session`); methods other than GET additionally need the `X-CSRF-Token` header (value from +`/api/session`). + +| Method | Path | Description | +|---|---|---| +| GET | `/api/session` | session state, CSRF token, whether setup is required | +| POST | `/api/setup` | `{token, username, password}` - first administrator | +| POST | `/api/login` / `/api/logout` | sign in / out | +| POST | `/api/password` | `{current, new}` - change password (revokes other sessions) | +| POST | `/api/sessions/revoke-others` | sign out other sessions | +| GET | `/api/overview` | counters (`devices_*` = physical devices, `users_*` = mailboxes, `partnerships_total`), commands, runtime, database size | +| GET | `/api/timeseries?minutes=60` | minute buckets (up to 24 h) | +| GET | `/api/stats/hourly?hours=168` | hourly statistics from the database | +| GET | `/api/live` | requests in flight, push connections, recent events | +| GET | `/api/events` | Server-Sent Events: `request` event after every request | +| GET | `/api/devices`, `/api/devices/{id}` | partnerships (device x mailbox), details (folders, history) | +| POST | `/api/devices/{id}/{action}` | `wipe`, `cancel-wipe`, `resync`, `reprovision`, `block`, `unblock`, `approve`, `remove`, `notes`, `recovery-password` | +| GET | `/api/users` | mailboxes with device names and other mailboxes on the same device | +| GET/PUT | `/api/settings` | settings (secrets as `__SET__`; PUT accepts a full or partial document) | +| POST | `/api/test/{imap,smtp,caldav,carddav}` | `{login, password, settings?}` - connection test | +| GET | `/api/logs?level=WARN&q=text&n=500` | log buffer | +| GET | `/api/audit` | audit log | +| GET/POST | `/api/lockouts`, `/api/lockouts/unlock` | login lockouts | + +## Health check + +`GET /healthz` on both listeners returns `ok` (HTTP 200) when the process and the database respond, otherwise +HTTP 503. + +## Prometheus + +Set `panel.prometheus_token`, then: + +```yaml +- job_name: active-push + metrics_path: /metrics + authorization: { type: Bearer, credentials: "" } + static_configs: [{ targets: ["127.0.0.1:9091"] }] +``` + +Metrics: `activepush_requests_total`, `errors_total`, `auth_failures_total`, `bytes_in/out_total`, +`items_in/out_total`, `mails_sent_total`, `pings_active`, `imap_pool_connections`, `uptime_seconds`, +`resident_memory_bytes`, `command_total{command=...}`. diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md new file mode 100644 index 0000000..77dfd16 --- /dev/null +++ b/docs/CONFIGURATION.md @@ -0,0 +1,73 @@ +# Configuration + +Runtime settings live in SQLite (`settings` table, JSON with a revision number) and are edited in the panel. +Saving in the panel applies them **immediately** (no restart): the IMAP pool and login cache are cleared and DAV +HTTP clients are rebuilt. + +From the command line: + +```bash +active-push config get # secrets masked as "__SET__" +active-push config get --with-secrets +active-push config validate file.json +active-push config apply file.json # partial JSON - only the given keys change (deep merge) +``` + +Startup parameters (listen addresses, data directory, panel TLS) come from `/etc/active-push/environment` or +flags (`active-push --help`). + +| Variable | Default | Meaning | +|---|---|---| +| `ACTIVE_PUSH_DATA_DIR` | `/var/lib/active-push` | database directory | +| `ACTIVE_PUSH_EAS_LISTEN` | `127.0.0.1:8081` | ActiveSync + Autodiscover + `/healthz` | +| `ACTIVE_PUSH_ADMIN_LISTEN` | `127.0.0.1:9091` | panel | +| `ACTIVE_PUSH_ALLOW_REMOTE_ADMIN` | `false` | allow the panel on a non-loopback address | +| `ACTIVE_PUSH_ADMIN_TLS_CERT/KEY` | - | panel TLS | +| `ACTIVE_PUSH_EAS_TLS_CERT/KEY` | - | ActiveSync TLS (without a reverse proxy) | +| `ACTIVE_PUSH_LOG_JSON` | `false` | JSON logs | +| `RUST_LOG` | `active_push=info,warn` | log filter | +| `ACTIVE_PUSH_PANEL_LOG` | `active_push=info,warn` | filter for the panel log viewer | + +## Z-Push equivalents + +| Z-Push | ActivePush (`section.key`) | +|---|---| +| `TIMEZONE` | `general.default_timezone` | +| `USE_FULLEMAIL_FOR_LOGIN` | `general.login_format` (`as_given` / `local_part` / `full_email`) + `general.default_domain` | +| `IMAP_DEFAULTFROM` | `general.email_template` (`{login}`, `{local}@{domain}`, `{local}@example.com`) | +| `IMAP_SERVER`, `IMAP_PORT`, `IMAP_OPTIONS` | `imap.host`, `imap.port`, `imap.security` (`none`/`start_tls`/`tls`), `imap.verify_tls` | +| `IMAP_FOLDER_*`, `IMAP_FOLDER_PREFIX` | `imap.folder_*`, `imap.folder_prefix`, `imap.use_special_use` | +| `IMAP_EXCLUDED_FOLDERS` | `imap.excluded_folders` (list, `prefix*` allowed) | +| `IMAP_AUTOSEEN_ON_DELETE`, `IMAP_INLINE_FORWARD` | `imap.autoseen_on_delete`, `imap.inline_forward` | +| `IMAP_SMTP_METHOD`, `IMAP_SMTP_PARAMS` | `smtp.method`, `smtp.host`, `smtp.port`, `smtp.security`, `smtp.auth` | +| `CALDAV_*` | `caldav.enabled`, `caldav.base_url`, `caldav.path`, `caldav.include_regex`, `caldav.exclude_regex` | +| `CARDDAV_*`, `CARDDAV_GAL_PATH`, `CARDDAV_GAL_MIN_LENGTH` | `carddav.*`, `carddav.gal_path`, `carddav.gal_min_length` | +| `SYNC_MAX_ITEMS`, `SYNC_FILTERTIME_MAX`, `SYNC_CONFLICT_DEFAULT` | `sync.max_items`, `sync.filter_time_max`, `sync.server_wins` | +| `SYNC_CONTACTS_MAXPICTURESIZE` | `carddav.max_picture_kb` | +| `PING_INTERVAL`, `PING_*_BOUND_LIFETIME` | `ping.check_interval_secs`, `ping.lifetime_min/max` | +| `RETRY_AFTER_DELAY`, `SEARCH_WAIT`, `SEARCH_MAXRESULTS` | `sync.retry_after_secs`, `sync.search_wait_secs`, `sync.search_max_results` | +| `PROVISIONING`, `LOOSE_PROVISIONING`, `policies.ini` | `provisioning.enabled`, `provisioning.loose`, `provisioning.policies[]`, `provisioning.user_policies[]` | +| `LOGAUTHFAIL`, `LOGUSERLEVEL` | `security.log_auth_failures`, `logging.debug_users` | +| `ZPUSH_HOST` (autodiscover) | `autodiscover.server_url` | +| `STATE_MACHINE`, `IPC_PROVIDER` | not needed - states in SQLite, IPC in process | + +DAV paths accept `%u` (login), `%l` (local part) and `%d` (domain). + +## Settings without a Z-Push counterpart + +- `security.auth_fail_max / auth_fail_window_secs / lockout_secs` - password guessing protection. +- `security.trusted_proxies`, `security.real_ip_header` - real client IP behind a proxy. +- `security.eas_allowed_networks`, `panel.allowed_networks` - network allow lists. +- `security.allowed_users`, `blocked_users`, `blocked_device_types`, `require_device_approval`. +- `security.auth_cache_secs` - successful login cache (HMAC with a random per-process key, never the password). +- `smtp.enforce_from` - sender always equals the account address. +- `sync.loop_detection` - detects devices replaying an old SyncKey (shrinks the window, reported in the panel). +- `imap.pool_*` - pool of authenticated IMAP connections reused between requests. +- `panel.prometheus_token`, `panel.device_inactive_days`, `logging.*` - see [LOGS.md](LOGS.md). + +## Time zones + +Devices send the zone as a 172-byte Windows `TIME_ZONE_INFORMATION` structure. ActivePush maps it to an IANA +zone, preferring `general.default_timezone` (comparing this year's DST rules). Recurring events are stored in +CalDAV with `TZID` and a generated `VTIMEZONE`; single events in UTC (unless the original used `TZID`, in which +case the format is kept). diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md new file mode 100644 index 0000000..9d574a8 --- /dev/null +++ b/docs/DEVELOPMENT.md @@ -0,0 +1,78 @@ +# Development + +## Architecture + +``` +src/ + main.rs CLI (serve, admin, config, device, probe) + lib.rs public router (ActiveSync, Autodiscover, /, /healthz) + app.rs application state: settings (ArcSwap), IMAP pool, metrics, lockouts + config.rs settings model (serde, validation, merging, secrets) + db.rs SQLite (sqlx, WAL), migrations in migrations/, housekeeping + server.rs HTTP/1.1 + HTTP/2 listener, optional TLS, graceful shutdown + wbxml/ WBXML encoder/decoder + MS-ASWBXML code pages + eas/ ActiveSync protocol + mod.rs request parsing (plain/base64 query), auth, provisioning, dispatcher + state.rs SyncKey {uuid}N and states (item fingerprints) + folders.rs FolderSync / Create / Update / Delete + sync.rs Sync, GetItemEstimate, MoveItems + ping.rs Ping and the shared wait-for-changes loop (hanging Sync) + provision.rs policies, remote wipe + mailcmd.rs SendMail / SmartReply / SmartForward / MeetingResponse + itemops.rs ItemOperations, GetAttachment + misc.rs Settings, Search, ResolveRecipients + convert/ RFC 5322 / iCalendar / vCard <-> ApplicationData + backend/ + imap.rs own async IMAP client (literals, UIDPLUS, MOVE, SPECIAL-USE) + dav.rs CalDAV/CardDAV client + smtp.rs SMTP (lettre) / sendmail + ical.rs iCalendar/vCard parser and serializer + tz.rs EAS <-> IANA time zones, dates + mime.rs MIME building (SmartReply/Forward) + mod.rs session: folder hierarchy, fingerprint listings, operations + autodiscover.rs + admin.rs panel API, sessions, CSRF, SSE, Prometheus +web/ panel (dependency-free HTML/CSS/JS, embedded in the binary) +``` + +### Synchronisation + +The device state of a folder is a map `item id -> fingerprint` (IMAP: flags; DAV: ETag) stored under the key +`{uuid}N`. Sync compares the backend listing with the state and sends the differences (deletes -> changes -> +adds, newest mail first) within `WindowSize`. The new state is stored as `N+1`; the previous one is kept to +handle lost responses (the device replays the old key). Client adds are idempotent thanks to the `ClientId` map. + +Ping keeps a folder signature (IMAP `STATUS UIDNEXT/MESSAGES/UNSEEN/HIGHESTMODSEQ`, DAV CTag); a full listing +comparison only happens when the signature changes. + +Collection ids that a device uses but that do not exist (Z-Push leftovers) are remembered per device and sent +as FolderHierarchy Delete on the next FolderSync. + +## Development environment + +```bash +sudo apt install dovecot-imapd # any dovecot >= 2.3 +pip install radicale aiosmtpd +./dev.sh backends # Dovecot :11143, Radicale :15232, SMTP sink :12525 +./dev.sh seed && ./dev.sh # ActivePush :8081 / panel :9091 +./dev.sh e2e # test of every command against live backends +``` + +Test accounts: `jan`, `anna`, `biuro`, `kasia` `@test.local`, password `Test-Password-123`. + +`./dev.sh lint` - rustfmt, clippy `-D warnings`, JS syntax check and WBXML tag name check +(`scripts/check-wbxml-names.py`). `./dev.sh test` - unit tests (WBXML, IMAP tokenizer, UTF-7, calendar/contact/ +task conversions, time zones, query parser, CIDR, MIME). + +Protocol debugging: add the login to **ActiveSync -> Logging -> Debug users**; decoded WBXML of requests and +responses goes to the log. + +Simulating devices: `active-push probe --device-id F2LX8KQ1N72J --device-type iPhone --model "iPhone 15 Pro" ...`. + +## Documentation screenshots + +`tools/dev/screenshots.js` (Playwright) regenerates `docs/images/` from a running dev instance: + +```bash +node tools/dev/screenshots.js http://127.0.0.1:9091 admin 'password' +``` diff --git a/docs/INSTALL.md b/docs/INSTALL.md new file mode 100644 index 0000000..f491512 --- /dev/null +++ b/docs/INSTALL.md @@ -0,0 +1,132 @@ +# Installation + +## Requirements + +- Linux x86_64 (the `.deb` needs glibc >= 2.30: Debian 11+, Ubuntu 20.04+). No OpenSSL or PHP - TLS is + rustls and SQLite is built in. +- IMAP server (Dovecot recommended: `UIDPLUS`, `MOVE`, `SPECIAL-USE`, `CONDSTORE`, `UNSELECT`). +- SMTP submission (Postfix on 587 with SASL) or a local `sendmail`. +- Optional CalDAV/CardDAV. +- A TLS reverse proxy (nginx, RustProxy, Apache). ActivePush listens on `127.0.0.1` only by default. + +## Debian package + +```bash +./dev.sh deb # on the build machine (Rust stable; cargo-zigbuild makes it portable) +sudo apt install ./dist/active-push_*_amd64.deb +``` + +| Path | Content | +|---|---| +| `/usr/bin/active-push` | binary (server + CLI) | +| `/lib/systemd/system/active-push.service` | service with systemd sandboxing | +| `/etc/active-push/environment` | listen addresses, panel TLS, log level (conffile) | +| `/var/lib/active-push/active-push.db` | SQLite: settings, devices, states, statistics, audit (0600) | +| `/usr/share/doc/active-push/` | documentation and nginx examples | +| `/usr/share/active-push/zpush-import.py` | Z-Push configuration importer | + +`postinst` creates the `active-push` system user and enables and starts the service. Upgrading the package +restarts the service (push connections are released and devices reconnect). `apt purge` also removes data. + +### Portable builds + +`scripts/build-deb.sh` uses `cargo zigbuild` with a glibc 2.31 baseline when it is installed +(`pip install ziglang && cargo install cargo-zigbuild`), otherwise a normal `cargo build`. The `libc6` +dependency is computed from the binary's symbols. `GLIBC_TARGET=0` forces a native build. + +### First administrator + +```bash +sudo -u active-push active-push admin setup-token # one-time token, valid 60 minutes +ssh -L 9091:127.0.0.1:9091 admin@server # from your workstation +# browser: http://127.0.0.1:9091 -> paste the token, choose login and password (min. 12 characters) +``` + +Without a browser: `sudo -u active-push active-push admin init --username admin`. +Lost password: `sudo -u active-push active-push admin reset-password` (revokes all sessions). +Always run CLI commands as `active-push`; the binary refuses to touch a data directory owned by another user. + +## nginx + +Replace the Z-Push fastcgi locations with the snippet from `deploy/nginx-active-push.conf`: + +```nginx +location = /Microsoft-Server-ActiveSync { + proxy_pass http://127.0.0.1:8081; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 3660s; # Ping holds the request for up to ~59 minutes + proxy_send_timeout 3660s; + proxy_buffering off; + client_max_body_size 64m; +} +location = /AutoDiscover/AutoDiscover.xml { include snippets/active-push-autodiscover.conf; } +location = /Autodiscover/Autodiscover.xml { include snippets/active-push-autodiscover.conf; } +location = /autodiscover/autodiscover.xml { include snippets/active-push-autodiscover.conf; } + +# health check for monitoring / load balancers (no authentication, no data) +location = /activesync-healthz { + proxy_pass http://127.0.0.1:8081/healthz; + access_log off; +} +``` + +`snippets/active-push-autodiscover.conf` is `deploy/active-push-autodiscover.conf`. +**Important:** `X-Forwarded-For $remote_addr` (overwrite, not append) together with the default trusted proxy +`127.0.0.1/32` gives the real client IP for lockouts and logs. + +Port 8081 answers `/` with a short text, `/healthz` with `ok` (also checks the database) and anything else +with a plain 404. + +## RustProxy + +Create a vhost for the mail domain that routes `/Microsoft-Server-ActiveSync` and the three autodiscover paths +to `http://127.0.0.1:8081` with a response timeout of at least 3660 s and response buffering disabled; point a +health check at `/healthz`. RustProxy sets `X-Forwarded-For`, so its address must be in **Security -> Trusted +proxies** (loopback by default). + +## Postfix (submission) + +Recommended: SMTP on 587 authenticated with the device user's credentials (`auth: user_credentials`). With +`smtpd_sender_login_maps` + `reject_sender_login_mismatch` the mail server enforces the sender as well. +The `sendmail` method needs `NoNewPrivileges=false` and `ReadWritePaths=/var/spool/postfix/maildrop` in the unit +(setgid `postdrop`), which is why it is not recommended. + +## Panel outside localhost + +The panel refuses to start on a non-loopback address unless allowed: + +```ini +# /etc/active-push/environment +ACTIVE_PUSH_ALLOW_REMOTE_ADMIN=true +ACTIVE_PUSH_ADMIN_LISTEN=0.0.0.0:9091 +ACTIVE_PUSH_ADMIN_TLS_CERT=/etc/active-push/tls/fullchain.pem +ACTIVE_PUSH_ADMIN_TLS_KEY=/etc/active-push/tls/privkey.pem +``` + +and set **Security -> Networks allowed to use the panel**. Certificates must be readable by the +`active-push` group (e.g. copied by a certbot deploy hook). + +## Upgrades + +Install the new package; the schema is migrated automatically on start. Settings, devices and states are kept. + +## Backups + +See [LOGS.md](LOGS.md#backups). Losing the database never loses mail - devices resynchronise. + +## Building from source without a package + +```bash +cargo build --release +sudo install -m 0755 target/release/active-push /usr/bin/active-push +sudo adduser --system --group --home /var/lib/active-push active-push +sudo install -d -o active-push -g active-push -m 0700 /var/lib/active-push +sudo install -m 0644 deploy/active-push.service /etc/systemd/system/ +sudo install -d -m 0750 -g active-push /etc/active-push +sudo install -m 0640 -g active-push deploy/environment.example /etc/active-push/environment +sudo systemctl daemon-reload && sudo systemctl enable --now active-push +``` diff --git a/docs/LOGS.md b/docs/LOGS.md new file mode 100644 index 0000000..f6ff85e --- /dev/null +++ b/docs/LOGS.md @@ -0,0 +1,79 @@ +# Logging, retention and database maintenance + +ActivePush is designed so that nothing grows without bounds. This page lists every place where data +accumulates and how it is limited. + +## Server log + +- Written to **stdout/stderr**, collected by **journald** under the systemd unit. ActivePush does not write + log files itself, so there is nothing to rotate with logrotate. +- Level: `RUST_LOG` in `/etc/active-push/environment` (default `active_push=info,warn`). + `ACTIVE_PUSH_LOG_JSON=true` switches to JSON lines (ELK, Loki, Vector). +- Size is controlled by journald. Recommended drop-in: + + ```ini + # /etc/systemd/journald.conf.d/size.conf + [Journal] + SystemMaxUse=500M + SystemKeepFree=1G + MaxRetentionSec=30day + ``` + + then `systemctl restart systemd-journald`. Read the log with `journalctl -u active-push -f`. +- Volume at `info` is roughly one line per notable event (new device, provisioning, failed login, sent + mail, errors) - routine Sync/Ping requests are not logged individually. +- **Debug WBXML** (`logging.log_wbxml` or `logging.debug_users`) logs full requests and responses including + message bodies. Enable it only for a short diagnosis and for chosen mailboxes. + +If you redirect output to a file yourself (e.g. a container without journald), rotate it with +`copytruncate`: + +``` +/var/log/active-push/active-push.log { + daily + rotate 14 + compress + missingok + notifempty + copytruncate +} +``` + +## In-memory buffers (panel) + +| Buffer | Limit | +|---|---| +| Log viewer | `logging.ring_size` lines (default 2000, 100..100000) | +| Live request stream | last 500 requests | +| Minute statistics | 24 hours (1440 buckets) | +| Active mailbox tracking | entries older than 24 h are pruned every minute | +| Failed login counters / lockouts / login cache | expire automatically, pruned every minute | +| Loop detection, stale collections, time zone cache | bounded and expiring | + +All of these are lost on restart by design; persistent history is in the database. + +## Database + +`/var/lib/active-push/active-push.db` (SQLite, WAL). Hourly housekeeping: + +| Data | Retention | +|---|---| +| Hourly statistics | `logging.stats_retention_days` (default 90) | +| Audit log | `logging.audit_retention_days` (default 365) | +| Panel sessions, setup tokens | removed when expired | +| Devices not seen for `panel.device_inactive_days` (default 180, `0` = never) | removed with their sync states and folder statistics; a device that returns later simply resynchronises | +| Sync states | at most two per folder and device (current + previous for retries); removed with the device, on folder deletion and on FolderSync reset; states untouched for more than 400 days are dropped | +| Folder/item id maps | removed for mailboxes that no longer have any device | +| WAL file | checkpointed and truncated every hour | +| Free pages | incremental auto-vacuum (databases from 0.1.0 are converted once automatically) | + +Typical size: a few hundred kilobytes per device, mostly sync states of large mail folders. The panel shows +the database and WAL size on the Overview page (**Server** card). + +## Backups + +```bash +sqlite3 /var/lib/active-push/active-push.db ".backup '/root/active-push-$(date +%F).db'" +``` + +Losing the database never loses mail data: devices perform a full resynchronisation. diff --git a/docs/MIGRATION.md b/docs/MIGRATION.md new file mode 100644 index 0000000..b04196b --- /dev/null +++ b/docs/MIGRATION.md @@ -0,0 +1,58 @@ +# Migrating from Z-Push + +## 1. Import the configuration + +```bash +python3 /usr/share/active-push/zpush-import.py /usr/share/z-push > zpush.json # source installation +python3 /usr/share/active-push/zpush-import.py /etc/z-push > zpush.json # Debian packages (*.conf.php) +less zpush.json # review and complete +sudo -u active-push active-push config apply zpush.json +``` + +The importer reads `config.php`, `backend/{imap,caldav,carddav,combined}/config.php`, `autodiscover/config.php` +and `policies.ini`. Comments on stderr point out what needs attention (e.g. `IMAP_SMTP_METHOD = 'mail'` -> +sendmail; switching to SMTP submission on 587 is recommended). + +## 2. Switch the traffic + +1. Install ActivePush, create the administrator, verify the backends with **Test connection** in the panel. +2. Check the protocol with a real account: + `active-push probe --url https://mail.example.com/Microsoft-Server-ActiveSync --user jan@example.com` + (through nginx after the switch) or directly against `http://127.0.0.1:8081/...` before it. +3. In nginx replace the `fastcgi_pass ... z-push/index.php` and `autodiscover.php` blocks with `proxy_pass` + (see INSTALL.md), then `nginx -t && systemctl reload nginx`. +4. Disable the Z-Push PHP-FPM pool and the `z-push-admin` cron jobs. + +## 3. What happens to devices + +Z-Push states are not transferred (their format depends on the PHP backends). On the first connection: + +- the device sends its old `X-MS-PolicyKey` -> new provisioning (HTTP 449, or status 142/144 for AS >= 14), +- the old hierarchy `SyncKey` -> `FolderSync` status 9 -> the device downloads the folder list again, +- old folder keys -> `Sync` status 3 -> full folder synchronisation, +- folder ids that only existed in Z-Push (e.g. `a6271970`) -> `Sync` status 12, and the next FolderSync sends a + **Delete** for them so the device stops using them. + +iOS, Android (Gmail, Samsung, Nine), Outlook and Windows Mail handle this automatically. Large mailboxes may +take a few minutes - limit `sync.filter_time_max` or the policy `maxemailagefilter` if needed. + +## 4. `z-push-admin` equivalents + +| z-push-admin | ActivePush | +|---|---| +| `-a list` | `active-push device list` / panel **Devices** | +| `-a wipe -d ID` | `active-push device wipe ` / **Remote wipe** button | +| `-a remove -d ID` | `active-push device remove ` | +| `-a resync -d ID` | `active-push device resync ` / **Full resync** | +| `-a clearloop` | automatic - loop counter in the device details | +| `-a fixstates` | `panel.device_inactive_days` + hourly housekeeping | +| `z-push-top` | panel **Live** | + +## 5. Functional differences + +- **Kopano/Zarafa (MAPI)** is not supported - only IMAP/SMTP + CalDAV/CardDAV (`combined`). +- **LDAP/SQL as sender source** (`IMAP_FROM_SQL_*`, `IMAP_FROM_LDAP_*`) is replaced by `general.email_template`. +- **searchldap** -> GAL through CardDAV (`carddav.gal_path`); SOGo/Nextcloud expose the directory as a book. +- **Out of office** - reading returns "disabled", setting returns an error; configure vacation in Sieve. +- **AS 16.x** is not announced (like Z-Push with IMAP by default) - devices use 14.1. +- Notes and SMS are not synchronised (Z-Push IMAP did not do this either). diff --git a/docs/PANEL.md b/docs/PANEL.md new file mode 100644 index 0000000..7fdf60b --- /dev/null +++ b/docs/PANEL.md @@ -0,0 +1,109 @@ +# Administration panel + +The panel is a separate listener (default `127.0.0.1:9091`) embedded in the binary. Reach it through an SSH +tunnel (`ssh -L 9091:127.0.0.1:9091 server`) or a VPN. It is in English by default; switch to Polish with the +language selector (remembered per browser). Settings pages apply changes immediately, without a restart. + +## First login + +![First run](images/setup.png) + +On the first start there is no administrator. Generate a one-time token on the server and paste it together +with the new login and password (at least 12 characters): + +```bash +sudo -u active-push active-push admin setup-token # valid 60 minutes, single use +``` + +Without a browser: `sudo -u active-push active-push admin init --username admin`. + +## 01 Overview + +![Overview](images/overview.png) + +- **Tiles** - requests per minute, active push connections, **devices** (physical phones, counted by DeviceId), + **mailboxes** (logins), mails sent, errors, failed logins and transfer. One person with several mailboxes on + one phone counts as one device and several mailboxes; the devices tile also shows the number of + partnerships (device x mailbox pairs). +- **Charts** - traffic, synchronised items and data per minute (60 min / 6 h / 24 h), requests per hour for the + last 7 days. Hover a chart to read exact values. +- **Commands**, **device types** and **server** (version, uptime, memory, IMAP pool, database and WAL size, + configured backends). + +## 02 Live + +![Live](images/live.png) + +Push connections (Ping or hanging Sync) with their heartbeat progress, requests in flight and a live stream of +finished requests (Server-Sent Events). Filter the stream by mailbox, device or command; pause it while reading. + +## 03 Devices + +![Devices](images/devices.png) + +One row per **physical device**. Every mailbox configured on it is a chip; a green dot means that mailbox +currently holds a push connection. Filters: push, pending approval, blocked, inactive for 30 days. + +Click a mailbox chip (or the row) to open the partnership: + +![Device](images/device.png) + +- details reported by the device (model, OS, IMEI, user agent, protocol, policy), +- per-folder statistics (items, sent/received, last sync, window size, loop detection hits), +- recent requests and free-form notes, +- actions: **approve**, **full resync**, **force re-provision**, **block/unblock**, **remote wipe** (confirmed by + typing the device id), **cancel wipe**, **show recovery password**, **remove partnership**. + +All actions are written to the audit log. + +## 04 Mailboxes + +![Mailboxes](images/mailboxes.png) + +Every login that synchronises through ActiveSync, with its devices, the **other mailboxes on the same device** +(useful to see one person's accounts together), push connections, requests, last activity and effective policy. +Blocking a mailbox applies immediately on every device. Active login lockouts can be cleared here. + +## 05 Backends + +![Backends](images/backends.png) + +IMAP, SMTP, CalDAV and CardDAV. Each section has a **Test connection** button that uses the values currently in +the form (also unsaved ones) and an optional test login; the password is never stored. + +## 06 ActiveSync + +![ActiveSync](images/activesync.png) + +Login format and default domain, e-mail address template, protocol version, synchronisation limits, push +intervals, Autodiscover, logging and retention. + +## 07 Policies + +![Policies](images/policies.png) + +Provisioning switch, loose provisioning, named policies with every `policies.ini` option and per-mailbox +assignments (`login=policy`, one per line). Changing a policy makes devices accept it again. + +## 08 Security + +![Security](images/security.png) + +Login lockout thresholds, trusted proxies and client IP header, network allow lists for ActiveSync and the +panel, allowed/blocked mailboxes and device types, device approval, panel session lifetime, Prometheus token, +administrator password change and signing out other sessions. + +## 09 Logs and audit + +![Logs](images/logs.png) + +Recent server log lines (level filter, search, auto refresh) and the audit trail of administrative actions. +The log view is an in-memory ring buffer; the full log goes to journald. See [LOGS.md](LOGS.md). + +## Themes and small screens + +![Light theme](images/overview-light.png) + +The theme button switches between dark and light. On narrow screens the navigation collapses into a menu. + +Mobile diff --git a/docs/SECURITY.md b/docs/SECURITY.md new file mode 100644 index 0000000..8470806 --- /dev/null +++ b/docs/SECURITY.md @@ -0,0 +1,61 @@ +# Security + +## Model + +- **Devices** authenticate with Basic Auth (required by the protocol) - always behind TLS (reverse proxy). + The password is verified by logging in to IMAP and is passed to SMTP/DAV only within the same request. It is + never stored. The successful login cache keeps only HMAC-SHA256(login, password) with a random key generated + at process start. +- **The IMAP pool** keeps authenticated connections keyed by the same HMAC - a connection is only reused for a + request with identical credentials. +- **The panel** is a separate listener (loopback by default; another address requires explicit consent). + Administrator passwords: argon2id. Session: random 256-bit token in an `HttpOnly; SameSite=Strict` cookie + (`Secure` over HTTPS); only its SHA-256 is stored. Every modifying request needs the CSRF header. The first + administrator can only be created with a one-time token from the CLI (valid 60 minutes). +- **Panel headers:** strict CSP (`script-src 'self'`, no inline code), `X-Frame-Options: DENY`, `nosniff`, + `Referrer-Policy: no-referrer`, COOP. + +## Abuse protection + +- Lockout after `auth_fail_max` failures per account and `3x` per IP within the window; HTTP 429 with + `Retry-After`. Other accounts from the same IP keep working until the IP limit is reached. +- fail2ban friendly log line: + `authentication failed user=jan@example.com ip=203.0.113.7 service=activesync` + ```ini + # /etc/fail2ban/filter.d/active-push.conf + [Definition] + failregex = authentication failed user=\S+ ip= service= + journalmatch = _SYSTEMD_UNIT=active-push.service + ``` +- Panel: 5 failed logins in 10 minutes lock the IP for 15 minutes; constant verification cost even for unknown + accounts. +- Limits: request size (`sync.max_request_mb`), attachments, messages, WBXML depth and element count, IMAP + response size, timeouts on every backend operation, HTTP header read timeout. +- Unknown ActiveSync command names are counted as `Unknown` (no unbounded metric labels). +- XML (Autodiscover, WebDAV) is parsed without DTD/entities (XXE, billion laughs). +- The DAV client never follows `href`s to another host (SSRF). +- Logins, device ids and device types are validated; SQL parameters are always bound. +- `smtp.enforce_from` rewrites `From` to the account address; `Bcc` is stripped from the transmitted copy. + +## Device control + +- Provisioning policies (password, encryption, camera, maximum mail age ...). Changing a policy invalidates + keys - devices must accept the policy again. +- Remote wipe (confirmed by typing the device id), device block, approval of new devices, mailbox block, + blocked device types/User-Agents. +- Every administrative action is written to the audit log (who, what, when, from where). + +## systemd + +The service runs as `active-push` without privileges or capabilities, with `ProtectSystem=strict`, +`ProtectHome`, `PrivateTmp`, `PrivateDevices`, `MemoryDenyWriteExecute`, a system call filter and write access +only to `/var/lib/active-push`. The database is `0600`, the directory `0700`, `UMask=0077`. + +## Recommendations + +1. TLS only at the reverse proxy, with HSTS; ActivePush on `127.0.0.1`. +2. Panel through an SSH tunnel or VPN. If exposed - TLS + `panel.allowed_networks`. +3. SMTP submission with `reject_sender_login_mismatch`. +4. Enable `security.require_device_approval` in company environments. +5. Set a Prometheus token only if you scrape metrics; the endpoint then lives on the panel port. +6. `logging.log_wbxml` contains message content - only for short diagnosis. diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md new file mode 100644 index 0000000..0be2beb --- /dev/null +++ b/docs/TROUBLESHOOTING.md @@ -0,0 +1,52 @@ +# Troubleshooting + +## Health and diagnostics + +```bash +curl -s http://127.0.0.1:8081/healthz # "ok" when the process and database respond +journalctl -u active-push -f # server log +sudo -u active-push active-push device list +active-push probe --url https://mail.example.com/Microsoft-Server-ActiveSync --user jan@example.com +``` + +`probe` performs OPTIONS, Provision, FolderSync and an Inbox Sync like a phone would. Use `--device-id`, +`--device-type` and `--model` to imitate a specific device. For protocol-level detail add the mailbox to +**ActiveSync -> Logging -> Debug users**; decoded WBXML of every request/response then appears in the log. + +## After migrating from Z-Push: "collection ... not found" in the live stream + +Phones may keep folder ids created by Z-Push (e.g. `a6271970`). ActivePush answers such a Sync with status 12 +(hierarchy changed), remembers the id and sends a FolderHierarchy **Delete** for it on the device's next +FolderSync, so the phone drops the phantom folder and continues with the real ones. If a device still loops +after a few minutes, use **Full resync** in the device dialog or remove and re-add the account on the phone. + +## Device keeps asking for the password / HTTP 401 + +- Wrong password, or the login format does not match IMAP (`general.login_format`, `default_domain`). +- The account or IP may be locked out: **Mailboxes -> Active login lockouts** shows and clears lockouts. +- Check `authentication failed user=... ip=...` lines in the log. + +## HTTP 449 or status 142/144 + +The device has not accepted the current policy. It normally re-provisions automatically. If a device cannot +apply the policy (e.g. it does not support encryption), relax the policy or enable loose provisioning. + +## Push is late + +Push latency is at most `ping.check_interval_secs` (default 30 s). The reverse proxy must allow long requests +(`proxy_read_timeout 3660s`, buffering off). The **Live** page shows every held Ping and its heartbeat. + +## HTTP 503 with Retry-After + +The IMAP server was unreachable during the request. Check the **Backends** page test buttons. + +## Panel is not reachable + +The panel listens on loopback by default; use `ssh -L 9091:127.0.0.1:9091 server`. Starting it on another +address requires `ACTIVE_PUSH_ALLOW_REMOTE_ADMIN=true` (preferably with TLS). Lost password: +`sudo -u active-push active-push admin reset-password`. + +## "belongs to uid ..." when running a command + +CLI commands must run as the service user so database files keep the right owner: +`sudo -u active-push active-push ...`. diff --git a/docs/images/activesync.png b/docs/images/activesync.png new file mode 100644 index 0000000000000000000000000000000000000000..afa227c6b03f64cab451343b8b7cbf3e1000f1ef GIT binary patch literal 132678 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 literal 0 HcmV?d00001 diff --git a/docs/images/backends.png b/docs/images/backends.png new file mode 100644 index 0000000000000000000000000000000000000000..1b027e2ad33fb7edc306a4be219dd901568e4cb3 GIT binary patch literal 127913 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

gkha={2mi!br6wP6GrTqmQ44YPF2 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 So&4ZCXbLi_(#4X`U;Q7_o@1Q= literal 0 HcmV?d00001 diff --git a/docs/images/device.png b/docs/images/device.png new file mode 100644 index 0000000000000000000000000000000000000000..d61d5bb5ec9c0f7dae4c49565a2b43fe6f0263f4 GIT binary patch literal 159646 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

3YS`8>lR$QFhWByg`~QW&Bq4Cz2?nV} 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

hm4!kNX4cAJ726{sp64i)F5@$2ktHc1~J1 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 literal 0 HcmV?d00001 diff --git a/docs/images/logs.png b/docs/images/logs.png new file mode 100644 index 0000000000000000000000000000000000000000..999d5a86b0834d85e65635fa49a45002db94f058 GIT binary patch literal 144787 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

p-b&dbCkcY4)v(rOP& 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≶q;^8fo{Mq!^!JMzbj#)g;v#9xQWzvD`W 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 literal 0 HcmV?d00001 diff --git a/docs/images/mobile.png b/docs/images/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..7211cc3c4326c998c3333ab922b847f17f9aa83e GIT binary patch literal 128450 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

$)zfpn{z~cfx*zM*q!}}NC_>156*J=Di1Lz@k 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

)7G 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 literal 0 HcmV?d00001 diff --git a/docs/images/overview.png b/docs/images/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..774701e19dba4ddca95c0c804f5329cb051ee3db GIT binary patch literal 174431 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%0A=oi-?coAcGEh@fuOiR=3t^&x8z$z7 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 literal 0 HcmV?d00001 diff --git a/docs/images/policies.png b/docs/images/policies.png new file mode 100644 index 0000000000000000000000000000000000000000..49dc649f2c5910f8adc0085b491a670216f0e4a9 GIT binary patch literal 147026 zcmZsD1yojB*EJwWNq2XbAl=g4ogyXOAT1?Gcc*lBr_wDAK6FZV*MHD^U-f=J;|vDl ziF0m22swDVObV{kL@ zj6;sY>&=m*SEeJ6i@IFZE{AY^1A{_>nJmaJS*#e#b6~*1k-`4HsF5J1`18Ps9-twJ z!Tx(a@`8gE>_93k7wniKU;BZ!>(f%gU{K-X-#Rt^ z7`jg|*@vWmZkCA*L2Zi;0j>Lc{0ea}#OnWi{3-z$-!W5$X9>YSkAGl*&|vuYVS;Rw zA0Wip_!~8F|9J^L0<7itP&0R)hPRW>V}$r~bri-RUlRTM<)`820@D-EQri{Fap1hXG``TJ)={>(8Cp&paUpMX1rCaw^bUj5G~Y#-29RQEloAn#F&N1vm8jto@ znSNSZ)|Y&2x(X5!`E`U)^rr7%kp9mTkFa1QB&2e3^X>yaJ+e|5t3JO}zB7xL0x{`X z19yMZZ|rU(%?yVh%`!gD!lK{Vo|l*7CI6V7mZs~wX9k0ivtmYLrf8rzUd0kUeyuXn zhw%TIl`8DfG3*TTND=F$wXI=J2{niHpg`^nbv>S{)CXoVGQSg=FC89%FzXf@Y*JFv zQj*e?T@**oaXrz&6YfD{0O)5y1es_-R81*e$ ztV%2w?!$ka02ug3Fs-MPNKNTOiot2LZWOZ`6O7Y{eelT+Hq|s7(-2bUucs_8QGS^E z9LZ4v2`3Yc)P3o zCSXPdB&5+vQJP*l)D1x}aQGY0SNfqPS-E323QJ!)_njP_8fKOXrF+NF#Izg_I&ja; zcav+Z`|<1Q-}O?n&VR3irz7A_dUb(GIov;+Tdca^<^%-=g+o?rzEdPD_C2Pcpzs?B znUST+`a(mllWDM}!Q5+M{GR4qqTimLYn<=vW&r)u z6;l&}zyGzADxMH!0n~_~TO2kJf;4z+U;{qk>YNBGgE63gRJzU*-vMgJE1FWYYJAb0K89^D-YO2Sdxu>`L z*6o&pf&yofgP5X&=|d%l)uMl>54aBk9tZX-Ggd=%6cikOlSGjFrTjsLcqm~HKct4J zZ0+l8x6n}{P~E20yU*oOW9-iC@zZHIk0aLAx$b=b%fY$D!xs zPM+$5WN@2iosbi9mAt7l)1s86fd$m0r5Y78R_#z%~VPoNq%E%tVyVxv7 zz=Slo-=j|+F!cUHv$D3h#nQvVh2NvC z#q-9oc2$e%vi0=Nwwl^q=c^;Hx?+RQj|)w6p#(A7>Tma0yDQNG&vz&J z?N<9TGald3(9r2}dTZ(Gmg;Bdg~p>6?L|7D#Z43$GzJEGqGHasl~k@*?&m{cL$lHoQiBpHPVb6=Q=Cl9 zswO2Rr73DQdeI7fNl;g_O;1ZJ)#JQrVrORuVz=~uf5?3LnqHQQoc#UuT^wf5u#4s5 zR99c*yaeJNm*ZMd4DF2WdW~dMLc&s|@eG1E)xqs_|Fu3cI_E<`_1$QxVqKn$kdCz? z83_sVt5=usYAjVOBwtAU$*74NOk_2cB<$_&A)fh8PEB@Ecr~wmXgZ0D&toXHYJP#o zw%*^FAL?f*J9l&hBZhl z+Y03De7G3qf?mI|ISjIxF4-EqF2y&TDczl-n?WStZn9nwJ4oR{#OK{xwvBV=++MJ< zif7XIJn1SV0J$hq8j&c*CXDuvAR@wPwwl}zs9N+xfcvxygH=DJfIqKT-;Ol*%iZaz z!|_~)%D24lk6yB}sz@uZ9YsBZgF7M5`DXA&;b@Jj(YphSj<~!!JpIDg_>{hs2l@s| ziS4zJlJ87@P<&Tcmo~>i4V%qGQJAEOSYA#JIYLQp(cZ@>{9g1@*s@7` zG*!T}r)7Jg$;FsnhK_-O&Ggu^^?TEhL3hoD#_~H*)^^eGS{H=~oe4!E6r={k(nLG_ zOu-kzD!92qIKjZlyxhDfAtCNsc|rlJrK|;;Tg$3VsxxOAYU;$qSjWR@&pd%O_vdK- z4t=8u>G30q!Pi7nnjWq9tgMq6{9YH`gMm0{HeUl|E+6&-OZG}!$_|rOL~Ue2NxbeS zML!-w^J8OkD(ym^Bj64tvyI+w&B%9kcV~ZYixyTD~?~aLyp@Hb{42&pb z5P8?+<>}6#@p5LeW-2>S9(zW23(GKvscpLpcDBi`X#`el!pR=(fUqI|_RS5}w)f5oOHa6TmvSX){k?zsQ zL*~BHW%0ffg4t)ff*P=IFVCd50ab%4{d((d=27s`=d+QvoD%^*d2{0i;s7F?HC=93 zBSu;bWkzDdYym78Q(Ei#ZTI2j-oRx6J=RcKVPr+-y=^hr<5BGTycM~NjhUmXYolBm zcQoreh4uzJV9CPqxf&ejR#y?py_3T!jk|_QN~5b#ail53@Hp}~wX~8c@WK_n$(Og* z@^gztjbTn|cFnZw^>mdaeEs~+cYj0)If-nlA&%p?9^PchwQ{E()-(4))sy&;gd@(V zs;cgA40*PFZ1?^UFLy9(ru9Af!AsOL6zYI6j29#@7d)?p29xi!i3XA<1F012*wqIzf^@H%k zCY!KdG`fBmnq3l*&=ybm_)UAgWNt!|Mx+4saWCmrZl(KW8y1s;1#2=cF3FcK)h5FP zT=qIki;emU^yCs7`$8taE0Lpe)aASFzEPLk3j&wR2#2i^TFj4qeFah3Js)pdF z!?aQ%1qFj>`~b0A?Rg7ddzVK@mJy-AdnHgNJB{0oTY0K(;`k67bnnqO+Z*?Gu`pai zsxa649a$)K4(bdg49@j#Q8(6c!o{jGUw@eHRZP6*>FDuQEO`N9Lq201GzL*NoMRM9 zC(E4#XLTEaci-APnK3-_1>JA^TXhc!WUssuMQ1C5-F< zjH+a+KJP-kOGJ&M)4=ijufh}=$8>^2YZ_fM{S>2W-i ztC0<7$M3N|+XcIZNuS7La#qk87;f+0s;u-8v6hOAh-hi0Q(QcZP;SC%sZH~) zR~@rIJt?jB?Nn8F$fkaaiM&>PQCH9pI;o~ChhFlAcZvM;#L;jr1<9N+g^ zFIe^MUn_5^S;^dhF89ZWgX`Gu?(h+fM#>!_2bBs%;{)ifScrUN-0x23GOqM5EzF z@~0WMnWPUV4C88w>L|^FCO|FOt|&wh9fE&gN`?70PX$(__B`1bARwl=S9 zF>fzg%ZT)aKqR7~tS{HwvK$=s5BJdL+sY?shnt&T>wUnXI`DpcXjL{1=?=lN-+JD9 zg52P;`*4GShq%w6HXkqwVJEX05g)W7_SxrD;(jy>^9f9vPSY5q2X6 zX~-6%u^UZT=WWDGw>DU1^|lEsP(@l3cK=k8pOAJ@T{^G*f&0y+Q0vLIqq7&=I|Y7K zye%xI+Y7uJlVLY={l=C}Lf4Jp>^S3@MbGC=-ghDwIbG!AlDO=wpPe7>=CzAgS6AQd z6;17mg<`v}ZXuQMdftS3G--fpE$8B64SVI3Afso>b=@y_smnVHKj@_8##0?L%X7c+;A{z+-ls4Pwqgcd=Y~K*TEZaJ=oZyaICe zLT=>-Z<5vw0XO>O>h*!#VvaKIv3MWf9iLqkK=nRI^GPJCy8H)WvQ82aQeDJqqzPfP=Q3_FNbLY!ODwH0EM)>Lb3 z#HEjAzEqhOQO_iLaeQJmR>kFT*b-n2t;Y&C$J`+EXYhJedKO+y3rd9+L#OA`HBPXvXoy1dI&5k|fo!BVB6 z1(414eI00aIaDjvdgZ+5FAAR!UFqrm%G`7~`L&_@`Hm!af0eQHj|zt^xg2RJDY?X# z2j8+DFAhL_UUwQ?TwFjR>b&;@$OKAtn}bgb!W3x3!Au~2CD#A`E`Wr57r1wEn(&rr zerx{Am$b>oYAjMxvPK5cNnzp60)8ctt`2popL*nO?BbHEy&9-nUVSoERH9d*3Fhrpyy;c$33 zYkKa~Da56(NW$}}^O_FA1A^UoI!8S*wxt6FJ0-R=p?Yq_s4y2LmyRL+Rz^H2IhvjC zJ7=nU;?_2v{5>g4Rn@{*!yFL{YU#~*jCXG;b8aJujNjj0EDRFq*VWgoqoX9k;IWtJ zHrhAF#Tgf?QL1p-Iyz=@i{9TnfBQDI@$CE@zyd@>MG+7X057|INJLDhUF~{mLcpW- zvh()hP*^veFg*;Ht!34=Qoo%aa2~_SIQvWOF0&ORp-3*b-MxW`xjCHrL7z_`!%ELj zsglpn&wnVqeyt}W;%`p<%2aM{;|L7vKw#1S@U?5 zQ&SUE0mDshiaJt0rRPMN`!#1BD!g<-b}waS@pNxuh%Oa$I~RKUqDn$aqS21+(uGme z9pUwe&gZYbMv{YlTOr&=kJ&HJgSJM~4(A)C_f%9>wUd&+6?{a%d&!|tqE(ycb>G8b z&Dr1IKj*w_ZZiF)H^E_Rs6f$BJQQ0ty=1<@&d-sOSe4tHhAuELP{8f%{moe+Dk>_d zZvV$zwaww;JsKKnzHAEV@hwu&xZ^~={L0$e>E&fUF_h#4rR<9rI{-B4bTFT5rR^}V zGew707fC`%IbCB0uMHwpiC0!uf5mRCsDMBF7asKsuwE`l>+A3T^l-x!5fe}77=LYVe7zSzpmlt zc2hKEAu9_~it@#WiyllUSD>!0vjV�|QSCsFVnaZ1VB=88VQRhF~&abJ@Qa67r3W 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

%#%FyL<(EH@$%gWxOHv?q<+vDACxt$Rt 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

6pb#@7#`};>H98Q^h1@Ap6Siz+;s5HDq*wM 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%0DA|5*iUW- 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

SM^pq6*~?f1MzN^g}^RP>LG zjQHkqnGJsjs%^L?;XS-}NJt)9ex*)GS~{0Ox{k+$LYton8dR~e;V`vd z9T1HoI)rVGIlRbq93mO!8pa|X((0Qnf+OfQI%ka6d!x#yQj%S3(<54RtwUlakAq|f zr^@U~)X2*LiF~>4>ew)M|HXlY z5LTm8ok?x83mqyrGCIjYwksNrs9ASe>#T%fEziO170;Qm;yrc!rSw0&$ zWJ*oXcYECDfQFg{!;kNBxhK#=@6gM0W$AVNyo!f^l%0rHAQE@bEBB2jz)xl-?zQMu3 z$dM|(TAqdcTaJeKH6o6mSW9YSB^3jrqkGFEcE^!6>_N?JSnBL%RlwB!wLccAuvviw z$PmvyuM4(x+gWGDI@~^FGwpq8D_b}zBLxj#9cb7FFP5BpsfV_Q*wio6@H`jLRU`pq z2?1{%FkO6w;BH+-uI&XoJ3CW%PHLG2;C|oS@`R$FT3Aq9@){Xga6Xpt(wWg!Ytzb8 zm1PI%SaJWGM8YnK?ar<)5L$(AMY<~kU%Es?UPU50RYY-7bdtLD*q7B@%?^~)^0jMT zJ@2AKuTdcPLZo%`_N+ySFHf8DIvyMt%4tDV35sepn|wSTRh!drn}6&_fS(SN-8)&( z_^H{dv7S4T3K;S{e0-e&%PMK%BZVZ@)DfOO!HU>rQ|k?N9aS6NLYDj$E*`7q#f=YC z4M4T1Xvq4dVchG9+cmqiS+r~XmAEflGKVacr9Jf7q5dfz6f5E7Ww^HG24wI+dF@S5 z>Wlx$0BqcxHRw}-%i`JkHe&cF3ic}zT;!JXOaF zrb>2WMz@2>g!TqDDFH=Tm&*$4`t@UvsrNvF8c#MUy&&;VzJBo@!ib;uK z&>u7YAt$iG`n7RKY!{bMsPYTrXO$*j#*%cMWcySZa!GREO*Fb3wWp<*4VGJn0E9s| z$aT$OPPIx&g{yp;m=NG&bnU%qXG{!KlcD`ZvqRO;@4(uQ!*rO7{O1}G8(cK;ADxV-1z^S^dut=g*(F**%* z-`n8@5&|7LPe*^@1DUJ=9fD+pSe_LT*D_a5LU>}m^UsvG^DLTqTtK!H=RL1*uYM!2 z%Dn8_C0+*$DANX-)hW6{Q!&NExmvos)HEbFl|o#Edt$CG1J~?)wUqFI1&|X~tuLvR zYrwR9A1PzhYi5r&LI)YZ{i zs{au)-Ir3+pEtQpnBZ1ZCP%;uUpnG_5cYMAziPbPu2{K?X>DR@dwJzWe-0w5OUp># z7N2IKt48jpEIuSto|jse->nXW-krW)NrFuZAV6dTgJYu? zi;)0}mu02wx6Y3E3f36^?Ht+x+ol_t8+@{yJ^nNer7_G&cLIproLJOxf*L zXhCw8fm*d_(m1yVkW)ZX-Z{7dZ&}Uglc`dY#$uJ_C=l3`316C-h}+&xfeS#^YAY2} zc&Oe&ypDY5>WUj<(rp)axuqXkOo+7Byxe>0hhbpLQZwSYe^)|MN)|dbdDMx2`7-Jk zJt?(GH6o+7;iLg+e5p55N;4^)6*Lh)QK>#r;o#uTJ%28flgJvB+9oQuWaDm z%vqO*47?p9ZCU|yZ)4<^QyOzm8kaqK%3n!mcH&!4fADBq2-dn<48<2LHmISc%esqL zARpDhpg*BbKH=x2?rzCX^f%=-_WCjqRad=MRZ&JNY+Qgx7MWqurA04n0aT7tAIC{O zrtRD7ToBDD_m$VLNyKB$(U7IN~dphaxNFwX4|P0ZIRFIXaU=Jr5}< zx6)2pkfobaY{v;W(Zk1@0Ik_Qj!n)nJc}o@?@v11S=h$&x0+}P>EIWZq zbQH?3uI#N%S(}@#Y_9SXgKb@D1~)uB+-kC(>{Qsn!G%i^0@3scrUE|f2$9C8QGvk2 z`Gd`x$y{EP_-pYwSye@OMOjVHVNry@bmtiRk0*~GWkjm_?~x(gdSJ~h*W%*ifbs>9 z#2ai|=$+C(S_e9`n!^f1(}nL=1gDRn?-+-$(CE-K3>s`k_N^kaf~cRFSZStfIxI1- znQIjd6={v{2NzdtOx6Kx=$iRRk=#+QrJ=Mb8iQbaE!aPT-US)s*Vgjkr+C~>2h}2m zG8yh&8CizRlLC{lpML6sEiElff=8_Kg=4vX=p7@uT5Y34OUH5BB*PZ=`}9miaUn^s zlk^_ZQb;4su!=;XIN(G9CNE70PHRNsRUBPzi$dM(;928O4kX{c4$2i$R9KBbWN32Z z!z-dfH9(TZX?4JWm5!(ebICd-QZc^L8DWkWm9H5X{9kl34p{t!8r9Kn^X*K8@fg!- zXy_RBzYPq$*J?_(jdqogk{A;@T2&&zRNp9`a&%%d-&vKD?a}3ms0|^7C@QkwcSi6t zch-(My>MFZ-v0I0zFjerL3jR_pPX1ycp`Ig=?$gQs?y*<*Wl16XyMnNmt0c&LlhqX z$!-~@PmNrd)U>oky720#p6w0n0)x`pXCuM5*^17_-~PiiW&2P5M~est$DmEblzMV? zW|0bGrnu9Hstu2Wz%H67MDQr&7^U%V)TQ&1*vI$tXP{4200DX&`(OD70bY|n4$Tt*%6e={ zRppIG9YA@i15nlbj+c)>u%wafdvjHgXQ8boJSOywfGR}%7ud`UP5OYWM-a8KNC$wE zxereFk!Kt4gZd*dWQl0)wXE|@s8c2eb=Q+EuX66f@%rOFd>flwe`n{NHnj*TwQMBbzB-16|S&{tjWLYgA|9nHEl z$HK#^KKB;Zc^)_p1J$OHBAD(WYirL+btC-gd?$WB4MR)>o#|3mAgFY@pX`RHVsvbR z7>>JW`uNbFcff84`q0p8uW&Z=*5=x~IM4_Xv)-HI<}vaGdM1b@{WEUZD6??!Fc1x9zF*Qe7>)b?$9$(>mp((c0kjk-7$_tk)6h z@nsVLUKrC@Az(XDn z*QFYT1n%7v3&b|-RcInPxUbBBp2>^1!_$8B3%|v*DUi|MwpN5lt%y~Zms>LEg5U$0%pzt42@G-T8-rqi(t7*4E2;bQ zlQ6$+g1JpwvpRBqTLB>?GkVu{m?%9!cAC1>imDrw3&tO#eyR z4S0WO-Kr{XDO9noGRoqj$ZXDk>>GQ^25M^ER^=e~wi8 z$F%pUX_=_dJ-h7^B}K(rj~PVVv#CENcQA^8F&2IW!;%Fm6O|ZF9ijyd)u0ZE0SSOp z%9VFikdB1*H}R%6n^Il`ztF?yMDl+&6=c@Omgb}EAy zujgQ%3a;duVifk!@n8hSWB#4d6sKw{V4nk3S5W_$>ApDd?b_bV$oC6W2SKHmQ0kiK zB{7@-?9Oum=er|4Jxc3YDW8HLgtBGn5`R*5A{Vp{PvtJph2;Q@poHsucfAH4J@zt2 z=h*{-lKa(*!?_6(m5f82UPQYq!!fy#JBuV4aX>VMMPFZUka`q63hVY`;X>&J#j0Pc>IWIh z*W~7Ss75o$y=t)rG+{Mdh!mE9^6OJ;Q?_TdJT*DNwA8d$u3Q5(qFnX?APikvRuTTj z*Ofm3Hxy{>CmCV0k2B)ux9cFU<=uMohF|mF`!qL^H;4Axs?TedKT?RRui$vwU!ojW z$Sl$D+ONj1Ji<=fIo8!jTr-JKe0R&t{9n(7)OKVl{E+1_Dlv<4rR|W^E{UX+lxwZq z-tw?qocZLK!+3=SRS3)#=GsuV8~xsUHdDU8#={i%Sp*>G23zuvX^+dWw`?*mjFuRP z&xL~ISPZs4AWRuodrrclm^6a}g3Pp=((+!<4*L7oNw39MM%91QiFDkfqoAuYA1YFK z%O%?(>*(lM#v1pAI@9-SmBu*O;q2_Ti^%GhS61Xy#auf-$3L{9{eqYIow8%qKhrNW z(juPg#qu(2LrWd{JQkjBE~Aw77ZL-O*HvVCHr0=)=?*5C1?_eRQ@%z>bu-QK5B%ox@yLKyZXPN9;T`Fd+leza`I^cvRLthKI@RGJI0iL|G2+U&M! zpjO8_R`Y* zckFi)$&zSvniSz23w;wG9A;Jz%T>Or;CE_;X83;7>--QkT4LN1Fh~coCvvpXKNmLW zG=JXyxop~T6P*_7Crn3#CupMZ%ai0xSrd6Q8i$9@g=FcSbWZNWR? z2R3iu{S9T)MT(D(ns}jhJ})CR1LvTxq;FhotjzdWXRX1SYbTCHfu)gFI1YO$f1^`I zSW_5b%W)EV`h|Vr;=0lhxuQC$%*H80Dc(sGr_TiJky?95be*iCzJrmNPC)b)WX~2) ze=q>k7`#42@)$${yshC1r2H=O^K7LiaAGq#)qrfJ6viOb$<8Zf*4n8YPhMW!r|BJ0`%+#8PS(f048F3M z$nW!C`+uK5OGu+h^ETKo4R8%}g}k~e%inU{9Z$PTel#)?kCzc^?lLiu{aK%CGB+|( zFLzZ);TN(+U!r=wva;m=#;^0bL9&7BMra13DkM{eNUW0NgmdaM&n^eyfKE~7tQ{u` z@0TIoUBU+$Lib`kp|b%-sN`t1F*Y%8B*2KTt*vH;y$#jL?c+M4nzctCC67x!-vq~U8bZ6RGB zqQcBLtq1fRH;yJ_Ude^93XWA;?Nd`%a#409DvC&JWvkUGPVzbNdo8)E+b>TK*e-W7 zFvPTLz;+gAo^Jqwea4pgd&hSVI!f4sUpKr4wQWvn(pAzI8pSk0#2V&CTqcS!p`$#r z7m?p0m`F48elf!6ci#7I-MX{6Ki{O3Bv|>R>rFznHDiYd+P;313*6=uyFX6>SzR>**bubwPmn-rX7o`-I$02Eugw zIS)hoLpg~?d%j*VQn6Lxl@m1j{^5XUSDv!kuEJL=nIz`Vo$^+{Bg$}bGxGR3n7{w< z3Wog0qj;y|!2?v1WS_s|T%qCZK&5OC{w%OJnF;x?n0mG^ZE8R0Ye_yv{r)=<^Q+oO zmAY6^20~3YetdD!wC7%egFo|`KmxW3NiP zPEfD&mzpA=J^iAx`_(g*wbO`BL?x=4&py@af-U1AhR7S>#D|IquV zqcx!Si3v8qiU6MH{P>LepAhWd}j!dVQnhEzWA*iXd20K_{B?tX!%MSjqY z-@p0*^+Kq7+96QVM3wH{xMTWnl^A^H{RSNmMAt2v?e_myKngm*X)Xg84-UeySpWVc zAQ(I*^FxlPa!t*@BoFV8!l=h2KF3JS>Xi6*=c9c#u(K(br~sZ28?<%y(%Yi5|2%6H z&|m0AMw|!0-Mg)cpyEPv=ygy}xf=aQ9gRo!Q8vcm+(DQ;<2Ya6qzkAL(xo*T^5+FrP9<-m-$#gd7I=mIk^Id9XHTRLK>e$YL62m7_+9BSKKra) z#`~`in+O6KYm!S#otAciR-)9ODFbwibU|~`7mP zT5#h$Iz@)r6+nC2Uvt8QAV6dumGp1X__P%M3e1`CmxMavq8RrtDinYoi#$NamN%@z zO_ah$FCLDkJNpi335yG$=_r0GQXwOh&?jdzr#>-xA80(zPKMt8J43*zNuHLkjc6%` zf)2MAOdTs;LP4L~;`0AYc^X4+{L?>rp6#tV>3oz_{nqgiEc@Y<{ND}nCO|JyKU<}c zWTYO(m1tCd3IGx~U16!WQRUC~+Q67IJq&)AGjXG{t*zbXlK!8~u;=zgL5w7l|3^WL zP;%6Ff5S*+o_`cEFif${io|@Vu&&oVqPs0O>OxDFPhxN9H{ND`q}+c6fYJ;vfnpqA-KboeNL62gH@d|gLq7lnSm5ZB~2r@v(7#JLkX=8F}?;KZq z#M(EHOIqVQQxQ&0VcnGaadUj+xS?;V(V6W@px%|Js`5ynr z@)Fp1GN>s34*A*MIdL_%X%B3={f%zDf&cqJdK=`%Ij%?fG}CCw%9h0KX-1Z;jJG!z%(a{nPIJi@%=*UeY}qWhl}k zv(c9Q&&C>Ri2BDfnHLE*#$|#1hHLz$rkxFq2-xROjp5oG+c`NMfKyyqH?-p&@YbZZ*jFzHb8Q7x676oB_%28=kKpophsD57J4B9NTo)PTm&LbwJHUf6j$x-9d54j_FF4Ya}qMB z4O{MfR{?g1M4(Ou2z5;6`M}g%mTb22K{2?xDxLhI0z^1o+vVL=O{aa!BDq~uDItS3?pJ!3)LId^#p`xww&f>84 zng1`i41Tn_i@1zP;UO=;!kM9M7|qamHX230Vz3tkRHcCjLAICmsK(8>sO01+k{QDo zzwD+^SEZpgRgj&?VDUe*2w*dJH(x%0XfVpQc28I=Zc>7qFD{W1n^H%P7+fs80*JZ4 zvtK#s^N_XU&j?}ktp*kaWmj}!E&-K{cFHBTI`-|3LE7k}1=bsP#tdmgd!88Iq5%Mb zS*HzA;F!1CS+ZP=(a}CMH{9O!xYI3yn9GU+HyWF*iLV<7LIh(-4n`{gA4yrOr)#D| z4|HMz)#nS^W%>Xj0$Bwj9=#DK8-F!Rcnf3=@tL&bQ|K-%3y}^S8GWp)!Rl8LUu{u< zkE0r$BBt2?J4l6ui+zC}%Wm4_Xh%ouuvBljK45_Ha_-DEx7{Q^+0AwtuU;dCLMdG0 zqtb!zH1Ku?dK@toa+yL5z+~zdFsB9z{p#$3M|s77QDISX%6CRBLtj^rWZ1 zUpT(6mG#8TlA*6+fLB4L`5qsmNpFE6Li@lpVXrVLk*wI+a5qoepjM+ub!lqSEh<^? z7i4}p%3Kwtw4@}Ke`Vy*jzGOoMdL8&4T|{D+H|?so|ABjphxdivw@=em$ENRppKYP zjs)1KPqJG8^Gu`(n6d){olob= zhPLMsCg#>!Tcf781}3nV(g7`^ll33R1#I3ro?_if0~1!KLXGhSzsrP#3qwr9Mqb)P z(x1Kz9RjUAGZ`ZuETCuu1jc)g4!LVWo*s;|VWv~1uM8Jc!PTf}=Gv@H;gz$+y_5VM zSQ>^)hjt4q--=m0W+hcKU86X%dm*~`plxBOL5z`s0n5+dV5*a85CbGcQle^?ZYS&S zO&YlwSmO5wI;j2V4;=5lSAHv0^)+ynu-C4GZD?BRj-4YR&MXlAe?mg!-4x>X_|!s0 zoi1Tyl!0d$54eegB~?{bm6aOM<#F4)>zzER7&W#_fyV(Jpy227I66+o?D0ksoc)2> z%E}7b0h)8<{(btw>7r-jRb*o_yUpeG{-6d4X>@@{zjHa6^4QInlM);-lz~5oIevWY z57>R69GFm;v^Iwslll7H<7cK+=4J!+rQa0T3r2vMIiN5w>G`1el)Z>E8m^u>bB^Fu zq3;wvvS?q5FqQ9-2X#%YViiGi5++{iu)!yDc<5B(EsL>t%(P9RdCpL3iC|F3{@mIs zxN|eq@#V{s%EC%cYM`GUwifZ@7U17^X&v+}XtE|YXs5l3QD>cvng{C|6fbwwzbr*$ z?<4UIAfq=#X=e06q$6Ki!r3>#Y-3_US%8fF4SZjy%~v=^J6W+?FY{6yP@u z1SSK?t5bDuw&8e!kWAnvO+yFRtc<1ZTeh--D+lg&Lr3wZS3`ie$5f-uQE(qwF^0h$ zldD04t%9Qa)XZp;k(RWyLzroR7NID$1i%V=D-8qcx$y+GQ%}C`lt$(YY7P%WOkY68 zfHrBA1FzdB4<}*xgqlLqqqha`m`C4!22iLn_VRc>-J|l-Qk5ku)C%>EQg~ZhS#6b{ zRH3Hv=r_c!b;{Q6ZWOVaUU$$&@8V(w1bYr2-?6G{pwWz&Ju5n&O!UzAr6PC`-{)Je#6#s5l;+XwxQ-mooU%)&1| zf@mW}kM_IhynfEE8d*Mr|7fve)rX8W*eOA5JH0=m)HYuRq)0UmoL{(^wP|}AD=;AD zoNMOvj+{;qxZU2SYB4UUm|<;|3<`!Q$VNH3x=MY^$@%cX*({qn8+MSJxkGV;fq`D; z^fFXm`%&H-J@|vrkEtRIW$pLj{V!MwiiepW>C12fuQ>a~p%g!W6V0`s;(~DrdrfoD z^%WRaQqof^^U;vARmL#0ptldfYOgJQ^RuGV4=JL|VYmkx3Po~i76Zgw{+n9CwC|a{FYZeB5hMJ{~oo@kZ zRMJ7K8ykdfl$vjd?!K|;AL*<9kkh`&OZ2yz;q840?!ot`O-%>l63lF|u&~TEiyWE| zGdGxG3KQ9%b;@}iw-kGA?~JOM8msY+@*<(K^~dC$UJ)_1Z~TVeiy@9YUHmlj6=a^n z{`0+Y^s^2>B1`_bPq>k1rCCRqS%-2Evd|}H{3LCl)!;vV4`}y9Ho0|}lWz$K^Hd_P2pS^)xzs7ZI?8$gE87RoJH6c=(ynZ^V zriW3_iP;X&+*ER!QzNmBbW{~9+mWjg#bEV1F4i*in89~)s_x#AUz+$}H8`V$06vL^ zwN3+qT1A{}ZPZ`rI+jsHQ3_e9tC>pO+LG&l(0pZ6Jv&9e;Sxi8Uy6Xkz}w>b`}=Wp z!-Z26N#oV)JDP4MTYbfi2*YAy6C*}p^?Pv0B7v%60-3H5HXKDKrrgkZPS|L^pYpZi z+JOqI<#hdwu%XLVh?mPl`VYBP_XG>2js_X4GcvQ#{PYq&hi-N1*QO`T=Uw*}l2%f~zUadW}YN(kC#UhcpVVFU-vs z;M?#%Ay_q(wHEkiDG49T!)P)}_uD)MLfd;g5$=dr_;Q-E+4A&)(%5$=KR8BkMmjGP zI_2k^XEcDyJe$xFgc!_|qs@jxk`aqXu(h)I_$;{r1{DpR-6gaXOYQQl4X>kY>U8S8 z-V@Hr`j`B`cN4{S;(3}5`8P> zpaU(XvmIYft6_V%ZXhMj=5Vrl0W{>v*H^_+8$UvcJhjV?^Zg7lm%g^N8NKsdBp6u0 z;pUBc0@j-S^82zfXp7SVn_=x!M3Ychc*KsJ!{cUCL+0b1uHq)`*h7*byiH=eB5vL!ou0 z2$0b~ur?Q8IFLZrZUgtR^z|JgaPjq+S1JD|$?}{*VfPlt7K~#{ok{zx=n5`+M!z9`IGEPt-CV23o$6GHLpx5Y@y@vY;8sdKhjTl z_4}Fe4dktn_IWPg?APZ3Yp>-vg_0lSbBYKadtMmnTlZa1USp76_J4zO-CpYB?1>mf zb1(W!?%&NiOZfB;qF%%2QN;;Izrsh=KiJgg=ISwg;XaSdtS&x9{*Hd)<-vUyluLi6 z#_vZhCW5WB_t2qlvS7gfs-C_ci0&93JpF!s(Dc8%_$;}Q@7m*>U5=j)&=GKWf`je9 zDoJg=14knm3B z)9|q4;*YeSEiFk&iBZX#AqMbzU^ZbNW5i`#ubIEQ2aV=EI@%l2FSO2S3b)IA|6Xi_ z3QJmA+KJoAOlGkfOI~Chy1NxcNIC2%XQ;f$0+nF)l=ElDR z*nWCDAD~dEkLYFc*h6o2PxWs(0l2iC`HfMPL$5i=Bj0=P$i+P#n>7o@4kivV>GV(& z5ERHPAG&i#;N|LKX(vq-5-nf z<@A;c42>5MDJhi0XG!a?LlMfB)pQ+s<8dd z$s@V_Mu_3NA2T>(2OI}XBOnYsLg;UzY{OsDZWX437Cy)JZa~E=#I+k+MZP?6oO^UK5 zYw^0Rzi_W6qnHSi^nUpRx6v%`)y}t_Daj`6%M`hJ1?zxL*^V6kAQK0P3JSHFZ%y}W z_WR;>K{6Fk3NS8Uej2Md8jxvt_Dt_%s!(uL7=v=MLGqr1I7Tc-PrTn5R^hRR8HtO2 z52Z!x2?Be{)oXft3lkF`X{{Jgg-IxB$S=-MFq->T96W?b^z`>LC0`^U2pq2&k5Z{7 z8bA?z za7Q@{cE@~9@k4gDG~8}Z?kf98uH-#ko8Ri8LwzhSI*=GiayuU_FnAU4Doxv4KU@TVNE7l^GUtAoBA6OA;BOV^a z!C6`u_S{}S+ z6;{Mxw~3dh3_SrERmS4A_4C+JsA3|8asW-%~; zZCbyv8tD_o%%0LvD~B(E0f2p$TJe!FX^T!BNBnEPYyCsm76m_Vj})7(WP6DcWCKYl z*fbhTPsi^QjN`R6SwqwrOdCj~URU5TAGVv?30^8Mnw_3K%-!?x61~hAF%=mbQt7g_ z&cau8i`Pj^dSQN^HomsuGNA0p+zNZ1tnirBn?5Kyyv+G{`L^J4r>mv$^QT*7PZ#vR zn)4Me4OAvQ>ZY^>LLQ|Sg=owq%!*`Ce zmkh{J*cQ?mWAW6Ms)L^XU1fNcI7m!VQqpz2_35+)cq-M(#(fs^g6HKuL^c~X$%w8# z55q&@I^i~_sRAL~#uRD*K<%$j)pl zyCk@k;qHJK3gkyZ(3Q_f0nnQ3s3Sa~Km{;Zb|Z9~v#WreCkJq8*FQ*RU+CCPouB8F zE`Y?>z;(o9p(Iy;S$6pIK)=3Yr&^PMA^NTHb@6w{1m3#G>h}YyqhxKFMgS@|)y1Ok+3sy4g(PDUEB>O;XzGD1y-Zw#EKGAr@ zisM1=+vE9GrZM9s$s^CQ|*A#y9TI;z;M6Rxw-*jtjHMzovr^)qW< zqab68l?c2=Mn=|KHBY50B=JUaTG1D4gQ$_%*MAc~*=Mp1v*fgLZ3YJMy) zlk+f}wGMEkGo&w3hDC(KhE<)nH_VKrU=bg`TaQicM`ve5Uv7@?HhlVitLD>oCS$Xh zS0Mhc;!~72^b4&*^ZZWNnOD=bcX@PVw0=au&}v}ZV2sri@;I|sBGqQ3+;n9sJ!HBd zDL6Rp3L&x8i(}nGGPXO~64FxPoh$zx&jFyT*y~7xVluEE&BE&HL+>oZA3*qacXt^u zx1yb}v9aNxC^aIS>rmELA~{c1?PJQvj9wG40;N4&kv}^e=iqaD4tMJ4>l*6lzuiGP zAkN9s$wMb(VnvQsVB#}crA-lle3L4(cHTjgQG7vxS()iddnH@d_JnPRVE@2CWNcVg z^^zC%Wv9)J&J}oH9H(nDO|=WH*^2?moa&xM`TXv&>P=@7nk)P~WrKI5&;0k3rE!w= zNWQ|(;F%&{_w-ts)$-Tq8>afI7ShWV?yVty-UTwZ_&8QpHg2+L6c~S@hJ=BHhW6?j z20Vt(b(t;aK$x@)6*AkI!xu-2HY%&DfA-%$;&uP-0tp+a)N?SC`ou*WD*kcp=(y^* z%bB8y*f)e;T7uwjP&D!lnj@&tcDM-S3)%is_0RY_)ZXpAMjJ-$ra$Q0QTsYl>Kw_# zg99t_$7?y9g$OEs?h*&V`NJR^{>VY3fC!7)QjK3b`2FMQ4{=o zG8O4NLrwOdPk`1S2hTY=*?JOlEMRP&_l!N{z)gu?1&f0&4Vjpce{sMG*`I(2i%P=( z5%3in{~~b!=oegvgVFUKYv7Mxae_2^K(z_k6ES>1{w4oSH%rn!!K$faPDp-Iaj{B^ zn~)Q4R3MdP(!O0?a;&VZ-j>77&GP}}^(35H$?|QE z#@@=A=8zZ2T&lbR)~SMN;<+e@QFLKpA=hRtY>8igN9U0IpW!l>AyPqFGpm8uiRPNg z|0Q;yW0on@}?aKFQi zTmp7{cXwcTSUgbMT{}IJww_KLMr1ykOqRek)Fev6Ztt>*p#bakX;x(q@yVT!)NhBN*NtLH_eO-=$h*nI5hmF z%dOeJ3BktUIOHm=;$ASdmP&q!{Q6ykSEBJR#P+7|XlIZGv1+Y$Ndd0=GAUgS{RL<#FcavCZO>^8!O|vS7sjK$DS3ekM}D$S>4W zeea3?Ee`8-%yi$@NPdH!$h6=j>M4;^s>yFrO^CqBeH(Z4ME}n5=uX7`l#V96b@e*Y z`%V+kM4(;x)ty;sZPik{EPS921l^aPxmg@}R{C_rzYUHnnrO!@1}I%sVq#(zdfVPV zUKor_jDh65ZU?I}VPQ)DU>q8F^nIn)mtB4RS{Ibag)0Dpa7P@UgWjm}$~#?_$&}qE z0e-IopZZr5vl-x(YTB23FHjRc5!~W-!==Re0NH|tv04i*MH~WW#OKb zu$KnVKc|r-#T@N9^#vX8!zw{_5HVJ%>BR8i6qm3ufy3dOC34{4b8{E|d|LT4v0(<( zq^2`713#{Q^a?+`xiV02%NR^3S%2jH;VX6Fkn{4r>d38eI|FY+(ZaxDP_}3zFOh$= zEwf>>0giEsR6N)7`l%0JC%*nmJ-QP+Y(M7KuL@2wy5~{eGU$m41nMIIWM11ZBStO6 z1cK#$_z>KZlxYhJ68Y9>MIpGA(CG;#UOXsSX`vYom+h(K(KeC+ig*d7$kQ zEKwc}NCm5bDGV5eZd)@U4Kk9>U~#t>2a4_Myp!KVL}(nA`h%XeE8k03d{&gRRLevz zh=oR|xUB8omn6y=sBn89Q-sgJdslm)Yh6A+js`nW9Lak>dz8A+|2E8hqzImh*qxpo zGbZKQdcO7M=+InF*V<4d{L_Bh*E{hpxlq#Cc8wrimX&wXhwQZRIYe%$p_Wr3@J9G@ zSOrD+r*{gzD^*%4E+0NdbtE2&>a{n-?alc=(U7W$Y1TPAw+Z{0swY#n5>!y{gzUvI zyZp!b8P7mNafE<@YDGwR`zV4Uavv0C+v67MpOvV0w0XENV!{T6<)hvcS?aw}ZSnKYg4GY;x z>y=BQt`DdV56j!zDX+f-#>czAar4%*pfE5pO4SJSj$vGaJpg!_Wwb6|w{#T8;Fqqd z_qG=F@m0>gvH$h!pVU0bAbXbwG!r;_Mnp!q@J92hDuK!Rz~C}(pVa*lzJ{HhG!S;p z<0Umb5f=h%1IO_MLXxorc;tSo-ck>pz7?OYp6SNGwLlFC35fM#&tW$mzy+IhBqb%& z88$b{)*Ro0_6k}LDd;0YWtG{OnJ?bvL;`c7lCCIG?dDA$M@~cS&2WeaQb-={O7bMx z+udz!ogln^)!4vwX@m6pcdfiDa}mh)7=uz6?(*NoE}cXoCA}%V_$@g@aQM6IP5g_OnwlG%t77iGKvE{Brj&`)#|vHyA&wt$hk{twcOTRYHLKr@<}fnR zv8pjo5-D@$Q8NFSI&2eO_;+_?l!&T98A-uFN<}wLVffg(qDX01Cx&QCUAF#gnRAKb zi?Z37DFzi9QQ>b5boJW)fy9u zuPzYa+gRC^48e)6-x?ntGpdbl13n0%+eB=aM!&P8ib2R-6*Ni)NiVm+u&~}w*r}o- zudpv*r7>GnVZr#y_saH^?^Rf_(or*NJSM$qeykgc55k;$R_!j9iT<(TvJ4SOR@x^; z(lWhS+rFp5Nv@vnK3tT^F^x}vyVI)t{pd8fk%wIE7VThEoBfBeZRD)FyarY5D8>Dp z%LO6buWX6fVk*<{aRP6VQ^ZHcg)>~Ch#+>`5*3v2lK|DkF2-ZQ6(cSNs+kQa#arkq zlNs@G!^SY&9qKOGlA=g2T}A(Z)>y|_Oip*LY83k(;+}yAYr)N%jJ<^`L%AhKKIJ~c zxvPmJ@Te?9Vp~>wSz|FPu>`K{v99Kv`exbV5K>^|E=xZ(pd5@I?x=p*dlyoicd1PM zS`hGI--nE$Svm_ebVU=mo^wPtU!s{t$9q)BH@yjaUv4X&h)eW9QKfo=dcEk%RonPo z;mp>*4cMx(&*$<& z4&dP0Fak)i?U$*Iu@?v+7g+19Cd$z)T|*{La>A_Tnuy}vZNU~!ib}H{P3%W*dG6O@n9UXp?RsS|W zuC?!8CiA|%@Il=U7#q`U57M}0kdwEB9j&)?Fgy)t@q>gt{spR_!lliN=tq^nWR}68 zTIm;UB&N4AQnlDGFVDO{x_0)K&kQg$3^E)#lqb~j=n z56CZrD+LU06hAxS4>=uxWz4^PDs~oNa8tG(o(8IzPH)ime+Ofp7GRoeSJnvgsX^?= z+PQIR(AiT!NULYU`J3ope@%z(&r^9`29*Lxw3|XFM@vfF<9zXN303Db)@6DlQA^7l zGCagd`7DwSJ^Y-0Pawc0Rv#xOCgs#?@0rU_#m7PBtfskEQoPVld715Yh2J6+wAQpy zasXrj0uljL2hb4(q(vv~QcnWjxNABFf1U+AFOnaHSA7h(9y|PbYsh^QY<5WM=r;M6z@X_BSJ&1=7O~aboBH9u}mbepwQGr42D~MRHdH9!@(mCDJ&?sbp^tF7r;Wa zoeeTscFkR*wNGb4QC-4QXrZj<4jb?(22r7FZhm1_PG-L`DInVrx$n9H;p)u&Qupf4 z+GpR-9BavU41~TuhK+u{{(zd=CotY>iG~dH4wfIava`p(czJaV&S<3ygB{NgHqazd ze-#aQu~%BE+^3w?E<}$(#{iZ8>nFieQ0vHg(%hqAVpw~pNKO7izYqAGO{0Uo5WyTM z>DAKG-E50&gfU5~OdP)ht4P1Lwzm7xNZrB60Z{Ytg2O#46rI%{Dkf^a3t|5x&(6%* z_*uQZ!Bz${j?9M!PG@%+GqYUUs~pv1$OCoDXF^8VIg2$__q02KtjrmcE=UkH;(rlqPDn|=&;*aTy_W@mn&!nvzzQG-fhO1ERb#59CBtKjzZ z_Nfi4I`l5Ko_TdADFhvSbVuvV%*=cBQcrEc!V*8Y`{3CW4vChgrY+W)2w+J7y;;}Y z(bm?|)Kd8_Rexhuk3cN-3340|0gn)o51&8Nk@esLRa8`Zeiz^Lm{>w$LAU_{{3^yq zwip3ZKPflZW+PY~5ZoX?LZ2%YUT=@lh~b406#wn1rBHS<*#@cbFktj3_7a;q07=&W z%+CjU8dVv!t#1M9kdgq@W^q*putS26rK_A91V|{?>So7Wij4;mbxgEiiWld-ypL<= zU44$}=^LC<()V-5=u$!Fm*s&X$5g2*y_P^52}+&oo*(|D&Qe}joMEmOX4w_EoD|84 zf|P$HbbzQaLbVKODcOwIqh}^&KA4*^v)<)-HUs=ybxrw<8}u?UZf46gLOz$^&(UIW zHWQ$7ZgK{W$(2c!sl};*)#vkW(D)lVlQ@w99u)~qrs~3u!ohNxWb4a==@>pE?lV)R z6jiV&!ic+|fv&=}wCqpqE$!to_7HwZ?74JN0t-6uJ`#p8r?8%Cbx#?zAy)!pS*(cp zsp!rJxZnv55-iz*(D1=n6m$yUOF)%27}l{tcb8N-Q)CLr{HP`-y_0iN*u^6F2v-z6+6g zKr<`2@lJVrKyZVY&g~rd2`>yy*f_Dn&s??(+RA-sXcwr&pFC1jsXS^os&-yD)E*Pi zEy?TXsB%|>9~>28*ZUJF3=s%&{8*c%tK6v@T@d>{(9I9w2YbIiWb zwdPH4Hz7Nst+g|e!@1QVL*3vYn)l4DCJajl$z98YpG(_5Ga{M}tklx6r-)&=e z-E#XNo_;vftH6mbHiZUCce*RT5q_MJJda0M0cwFGYr_$SSeG^n9da+>$RF<=OS>a| z%lQgEY6B|Ft7-F5c_k&7g67YOc#0}_<<0N6jh@#oM{}*KbjXl!TfELrHK3vGxqtL{ zZ?U0%cKSLtW+v=1lAGV`zinpGF^8_Qr`2#6v_~5L1eLZ$YBI1?y%o~!jt(~_tk>?x zrmig<>RHOXg>Q$B9S?_-_SrIA`H%LsWrhcbf#xt&w`h&(VT!;@9+l>Ls;jFDPcP$D z?#!Ie><&og#Zc4^+60z8_tlnd|wKn$>;HXX0q#72BArt(yHzA+NBjS3Ow4 zdS|E7>oXDJH0-MUOJ6>x2GB7dny5U|f*+%6AsB+)7-n02KQgKHTZG1i2S?l8;c9j7 zZl;OTvXCc)Lp;b&N5S zRS3yxd`kj%tfldyaJN9LXvLYs;ZecSOtBa0>ulk@O5D|s@V?MNJ!O_bqj63Avy$5r zSwSXYn3YFdR3**JsT}U$BD0^6)yR)imI89*=M$Q&A#wiHRT!W=~1OU0js1Y$I|s(<`d%KBiUo(cs3kwUZKa$CKd4Q< zkBS`VjL-YuXr6tTNYuOf)2tq&qoExiqbJqap#f`wG8X@!eW)oQp*3F_0sn(0E-d{d J`?1cy{{t6T*`NRb literal 0 HcmV?d00001 diff --git a/docs/images/setup.png b/docs/images/setup.png new file mode 100644 index 0000000000000000000000000000000000000000..abb426d61884bc968250dc31e5c7079b579fa460 GIT binary patch literal 62244 zcmZTwcRbbK|3`d6$`+ALHicy0kUcW8_s$+6`>KSpviHc|Wrnz-?7g?jCS-4Z=h}UL z{n6vP=bm$3^Lbvc*Ll6)eotk^Zld2oM?gThDIqSRfPjFKgn)4E4Js1&W{?%p8vy|e zK|oJ34V@oBKmAIAol?7vCW6Tu3s9yyGtu-Ul z%qO=6X50AfXQs9>Tvra9)IQdiNr?*~AR=QyuKqVkz_!=-B%t>A->;Fe*qjj&Ftnfu zKFKTO>ta`@AX5rK?_+h^BO;NwR6mx+yt*WYFjS2a3YkL3`su6bDSBmIjS{lzJtS0e ztb8QoN44RR?bw%epk^a%p6o9~1%Xm=xD-FR*w6P7qUb5ri9llUFbr)=$)E;yf&05=7B+3ePmsNe_Vv-@D=cmZ9eB1%;<$(u#nV z=S#d7Or0ySh7JYQ=Aa}m?v$=e3ZYO6bY#{VJzqw{_A{a{2eJ4NujR@>>kzmC=&x`E z|A9z8Lds$y0^+U15nSUp7YxIP2rCfQ#mH;Hh9Zx+uTfquclrsU3Uq*KF24tt*E!c- zoi{qK!IdrzboUK8h3AT-_Q-2UPJVX;G_+cF-Q<$adWsr`lObtoz__2~qm~O<;UNZ| z{*EvbP&qj)r~LYiN;eSBIPns zA_L{Vd0=oUkdse4tTp(^wGb$R7$JE#$`us?#U>za1Rx-J!F50Cd*|woNfSt|w*a%g zLeST-S8M_?<+iRD_#t!^?zBhz#@?5+ywGg!!sS!*6NrrPfS?fJ+?2=@rhed0!jE7~c$9O-|6&X) z8p$7+5h{6-58!XZMllNKTx+_6NUfwNiudvbipO4^@%KHOm(EhNcP3WyR$wr1xasen z2@GP2Vj6V5JTefdn9YyO(=Q-XH`uOSiijELR-HWVWFFyb1oKM~uyKN+^wP=P+hF^@ z_&<-Yh=4E}@IW>4GyxVNuLTdz3YN|7xlVjy@_Q-wgf5pyB`H zXCkS2z2ro=K%La#25e7>>#UtXhH?H9i3;Ke3d&WR0mNKi;Vz~ zQ(qXGd+lNhu%%jIr~o(;Apk}Q8%6KSTuK>vLlLS*0SMls0H>VbmY3Qk?}RxBizi3C zFBVu7ySA15a=#>wdmE6b;UwmyEIB$v22MZ169bsrd^Bpd->kB(Nm;SCl!jiy;KWDmVab zYkWt>hCq%{qA0G)RiqT?uyGu*UaSTWS@j&2PMO7O2V~X~MJ;2azC&>M9}NrL0|4~G zqd1TdQS=J-oX|}U0fIqXBW!*$19zZH(E(3eK{W8LVq6gjGKLHk zKoukvgg3q%F8^J{gAHWW`+#IDZ8+~z5gu186txL} zA5sQ9ZHy)C0tw&J*W{iq!X^)Bp{-bDB0i->5np%gj78lzu${lXjvD@{xG3L+7v{j56m??mr6MKGz^F-e)5RR4N>{RpHCI6 zYX^p;ty)q<^qT%>5-K4$QE$O`CDH!b2)+Pe6a*ECYdi<9)v0SjCiF))cv{yHKuIJl!PSA=g5A~<0zaa6)0g#Ym~ zX<$k|^nV_hV~9h|&uBlVMU))GeW(xbyG24){$~hv4hDAXT*h9y;zp;42qLpu{u=Cg zM#KMS669FRNFVsmap?>R&-BQKg4j=ZflC+QdLp4$l#si~=eTsmr{P#23Y7=Ic#2Cl z*cS=}Ll{q>&XjOm0t#F@G}*jlA)Ts55>9stJoxDyY59Gj8RSr8Q`!DSO4RDq~o0K$zQ=VTj zLfp@|ho@w~;Zd_lmQHA))P`c8Zwz?)D+V?cWW$3a>sw$+SBBW00iRBn{X1lMgG~VG45Y3i9#FIn6rcPYq}1515+maG3K2jN9Hb0J2P)f*6TT1OL6Xk?H;W4cF~HWndrFr`CQv5ov@zScgnk|)T|_Un z3P3WdX5Hr@63E&3FFf)a7Jz6BrtH&`BuNgb73IQi0gxdE3KC46Z0Iiq?YlfcVS zBF(kPvSAwF>B{^ga0Dc5YH%99N+J@CL@@fFA=Ebj`vO1NVkBzMT?Q-X9{q}1w-Ygt zJTF-Cf2Wb_b|O8F<~s+f3$dO`8(-J>45%)-hJUJOsu{ijs?*c>d@CfJpLdYXfa(Ly z)oG9&^iE!+6QH_vI6-B6CH8<;-(V92TLP#8dFCDg+lBZM5GQZzp5}qSm;v`+z2`3j zE^-@0v(p{0B!SZ(e777?C<4*KMr4e1ghwc?y@Agu}f*lz-X>15IK zO4JG7>W;#l)zwq&Bs_pTMalFz^A}*Fop2j<*^lA_`(fE4`CloBKn1{dowH+lR^WHy zNUi^9gHj$IDEwyUKuV{nF}s2q@bd!~SfNMhhCk#la^^|SbB_C94}HKNMS6;!$PG5q za~{u!k3ewsSFZkVb2L1jI{)_M6D^~z5aO-SF$03rVEKXrD75Rw0h$frp@JIu|4u>` zxvzi(;=_v1OgFA50()E}jQKJl)<1!;0{zWRm$K1cHEK3ZL}Rf1 z2N2*>J?JI6nouYb=)x;=kVo(s{<>1d61DMZ(?b_KDM+! ziO*7yFKEBLj~VHxPV_vN0;qK##h-Zt`H9pEA%B5{GsgB_f2(b1)29K` z+IpqaLDU=&OTLCOl_ss-sTrr4BFY&W`K2)ti~ZzC_q74q#FlM`VpG-7p_2cEK?Cw+ zdNbu=6`kSsi`^FW@WY3GY6Pt-?0!73qI zUA8=skhLn`mj}N;Mgqhm4r(VO+~KLg#K-y{FDem$>OD}KJ=xw3c)$+BU(ZWoCh>Jo(V7-G zKpk~y^b`0wqerDn@Pjs8CT_ey5OAE_dV}T98>1FW%6d%B8IryX> zZlxknXj(~{mOd{TD;bwcS;vYX%yp9mS>leQy|uMKDVdsks^*GH(Jd1Kw@6WuuqF05-yb{4G;RWmiZPzL@A8p+ge`#Dd5-d zKR6!jHnw)3{hFKt-;%NM!)@ebmvo@pIwi*#2TI*uBqkOT6sC_FFAq1+VTh^ga|B&= z1)eUKp(z_S&>3xE7gNu76jcEvirc=%*h?9+9l>RoxoIy*nO%x&%xupv1+F?Tc&P#z z>AO)6mToxkivnnQd3jk`87xxR{V`7@h0xf|yO*{RRRJ`l2)p*G)Whr|syGux(g1*{ zT0_@4dw^B+)a(yI{59LDjCxo)y@p`%XJAz(OQX!%>`gJ9pxp~g+x-sURUcoOn z)2cDjX&>64{x6DP756rX}i-$LpIu*DnUi0 zB!NT2?Pj{-Kd)%;!ykXtBh@2Exh*a6fsv$C!ue@OOIH(8CkLQlXQ&%~)uHEf|LUA$l;hYIQx@XZ z*xja4rcz-0$nnok5Sd_e1aqG!Br$kXnDNYwP$5t$)Hfi?7xSGrg$E8%`4BhamjB9o zT5}Z*B~n6`-We9Y+Zuq$G%GU%ce1oEx7|a@H0#H6Zts^+|iqbdz&?3qR51cmv=&kBAVO4tUFaARcK{=Y=3(( zp3-?upvrY)W#Znm>@f3zT-9=Yzmk%0&G6nV16TUzJ@s5$A9!RI^y>a&RV&n8OSMgt ziVVv!tMFLbn`-K**q&oI+jvROB>y#&q|#}H($c&yo8DRC_4S**hYzsC|Gp zcQ3=r(ws48wA{WUhC5FpR8;bA+vH?J&~$Hqzj7c>LU5_0BN{a;z07d0-5o(~J}Ie| z@Rmr&#bNFz@1~sBrxwQZT2dt@Q(uK-E9WqIMa7ld_2wzM{yN}RP@|tc2_&&x5M6*! zLg5#8g&G~TAhz-fz7glXSKa$Z%U*VT+;(z4MUExy!H&mMq4|89)jv%NLzWXSq`993 z;@;9`W;fZ+D@$xKmL?c^P@zCLnt~Jb$bReK7nNAG>q~0ckT1I5kh&%Mnbg8CpGqh2 zbX~m8e+DV4kjirx| z>U`8o7N2D+X&F1L{-)s!*0VIy`ucL{?akPuomHymg{i=dR}09R;oP#_P7((0Qlkox znsBkbkOllfPJ+TFHg1V{63AsWu3lCD zt**|Xduo2VMdbszH{M>P0x29PMGi;oxRtjx5< zeEITau)etM;21WjZ#^-$SMq*wpnyd=*Eb_$_7C@ZTA`G;qe^MHESS@Zhso_(UZ<7u3I`3z5ZYZ_iV#I`4#RIJPYwn`kObbkHufkT4u2x) z5FdTDk54$wt7lBN&|!PM}EA&qw?|zdP#SYNk@TJ zB`Lddt3sM2oz~LeXT=3owS7^u2gc1&yehI1i2|P0wv*`rZ7aU5mD^-f8{KJ)Bc)59 zth*29vf5T7QSn_+q8sXekDN_4ki(o)8b0L(!dI z^Yj_=DQg7=dgMg@2)L&=N)SPm9ae_J(c8xGlG;n9Y0w^U+7~ca0^wk1CrhNm6y(VW zu#Tm%C2`0vS%~CwU6@I^&f14V)01wKZbuXvE*`m)vbe3H1Ecr;#uLFZz3-mbq4PBi z>vhQ2uU~(E_fxER(c}|EDxm_7iing{^y!wiX#OhMc=Zq!1tt5t$Au$h$4Q#ZI@OvL zFXpW#%I%Mjgt^_iCRjl<>f$EOr>mv6!nr}ooY9UIBMH*KIbW%ra2T< z^0Smh^0zu=3umWJ6E9qKu;;m%t>o<%!XU^J~0v=%&R2XX&G$K}Nqi@H!Vx z6&cGeO%!a`JU*0+U|QW=R4HHh^Jo7_#?o-9a&@Y(WN)!a$2ggw2OTW2&@<8clQ4_r z;3u`f!@bRgfr9PeZ`V}vG)rGJ)e@FgCt`iDi=Xdb;#J5Oc~)wnUEmfcA_-RIHrNa6 zN_h*+I?Z`K-FC8mb8E}vU@A+K^5SGied7btpubPkgBxasP4kWy;IM@VRWvtriICP&!Na z+`9Y0pb6&(GZWL^Ht`F9HQi}aoR((R#8mYMyYIs$$kYm7c!w6*2a*geEfI?wwM|V; zz1Z6zA|{Sa6!cskU&_=RF12h(l~4?&mhH~Xa<6;4xjbGuP~uu(oj(zl!xOaFZ#f7% zhH5g%f80rFkduu+I<&>4AN_2QA!0vV`kY3q%Jo=p&{sZYJ(Bi_1`c9pA(9X%bW$Ok za-3Xu`2Jp=ci0-bej9V5Ao%H{bboF3;tnL50*8&&)ep@&W1gnr*H>SxO+DwfpDs`= zOIFa~&R46HMSoAgx->t(yVjSpck|9b&P1kVrEFS@QWQ-0gTm~0zfc;g0nbmGZQ+%W0&Vy3gL)Ya!=}2oK@7^dFWyI35_4E6BnyRW@j6M32)O?zKK?{xEev%5E zT)M3osO_|gx{V+v!t(C(WyHM!5@#P$D|AI6@(>il)63NJD3$FIAnd;~Bk4zLC{c(= zv@}1br|~(>9v!s^f%sSYUD%I{ix*&67Z5+TUIwT_)8V zVXiv!L?{~CCnaPKkR6!n2A^Q?Uol867S7}+DKnG1bvzYD8<`Y`l?>faV>CuorBo)y ze64osWX>uxdhk{h&<_Bzg<;Enc-`=gP|ajz!~VcZTWhO@{^0kb_mOA0AO%iQrg3-p z3&MBvop>jr@cM+6gbAcY2{a>G9L)r;Qlfeyf;6xo5$55xzdDxVL?PbYIbRg|0_TX` z2pRB?a5f22V*_X=Y}dZ82>VVHX)6$T0BWMLB(9HDn;UM1;#^5dKpN_`Ek-`hlo( zMF{r7=U{TO=LS3jCbd9PWV1q4zAWUOUf@Y@58$lZwZ= zTtV#vv^NF7OOhX~*;@W(;1w-|85u(ZjOneA6w%k|1MsngeOORPjs0TWij@ zs>9Yz2g^eY;ca))?x%U?$sijI;)(r{V+F#w$BxXuWDod**6A8TEWk6S9E&gNawk{4 zr>ob%FMN->ZO#j1r&qneq=72t!G3IGRVLH$&9P7zlvs2=OQJ}mHAg7L7B(1UX3gZqHg$m#1^N=skOU{^G;5R`xzw;p&MJ14Vbr0B59eI6jLQB9CCAW z*9aP^h$L|4pCU0fh1_G*N!I-M-4W**8o4H=%&UmZ%eEKYOdxm+huJ7DATlgHq;Y|9 z%w@r_jj2^dqfQVCRC#Rf#pcA~G0@l@EdR1SUVfe86Es94NtY3#KRoQQw=pz!xZl?@ z5EmbpHWjmpNI>-^eD3OEa zNVvmzYZ(We>|f9QwAi$Z;b;#({10~#%BNb@&ju1Do(lu~>l12e!{tS{CBx~5K5O`( zhqo}&eB+sEimbFNk@O3tu5e$MMYtIs7pMQ@oe}mJC6q_=w6qF$K{gj)CZez(Ojw9j zIJyu1qyM`;+i}emQ?kPOP#NLI&g$6YP|vJ<>&GwUm5hDbe6IIR_C{%LMAZ8c-$T|3 zUfo)%EYN}NiLCA(9ag@`JYexR3`=ze=}0(|_Zs6g$)(v|bRG3;Akw~tBHnP@{`PXU)5I^*1^5KLv4^@X+}#aYr(SJhAAh|lTt0!<03 z$0WyFMx+8mTB(z8XqxjD%LI=nLJTELW zzCY-F?(E_+Ug-|g?Rur4P-x+|6+hB%z9F|OIbERnm4Svr9A}bFxt2?Rt!}cRNUY;e zESFVR`ff?f0B7YI2>v#Hel|vPzT8j|7v!~uyzO?twLwck6q{Lyaz?`~vP4dY_Q4O6 zx7*bY)@S9)_vU+MQGlXEyFD7NWyr-TKVXc^7jR!|O}!sF0dr-gk#sru+cf;_mgG2W z@;{$|?d9>voC%m`BA-?EgXTcX%B|(`GNZ|U;eE^&8VM7*L|(hUnTA_SL#&D+7#IDu zkQxpYY33Ten99~{Abu}#+`oVSqVCA0Av+oC2zc5$*xs~aT)4zU!YZgTv~F&o1?f^* z=MegC6&n~~HNVl5bC*3q5YQ}vpH%e?91?6_mTQSiOY0{!dSg0haDf zV9novYf%!${ki}`AjujP=rNooJw||O7X0()ZJI)i!Ju#h%4y!Ew>^g&g2)OWM{WcJ z1V@?~goyk&x(p|qe*-s<*i0-8CtR7{h>DH9&7zq(F6b~^X5Et_rsBFU3MxMSdc?w& zq_e2VkI9u=Riz@CM$6rc>W0HXiYpuTNFM7BN=kFm<3r55qm?h_YY+DwZ__J0B4p0W zjzp41KgDes;4U$DrcNaFiXxa%r9DgWUIL%T%dXn;Iv>pW;WWkAe&*}9=6KC#ijQSU z)XJ=$RXXMwGz8xDC(X*fj`aR^2h3yXV@Q1v8SXds5H>Y0q}{N`MaE6tc~bXi$Y{mT zsyMBBAwqWD8n2L7uVXH-5>3kHo}C(@fK5Gxkv4s}UO!<6Z}(-$#1^~s6@sj9sJ?h} zB#TejxFx1UW1!u2`;RH89mehD38Nu-p#1(3l%W>4^3t|-)TN*Qq0hb)9RJIb(iPkjBs>U&Pa+@Wxrh{!~D;0 zRmqxn+D^?3M3o?dEmo6;U%~mhdA*qL&eN=ZB+(5USJ_@&EqC1>_j>KqpKEJlqk6nC z&z|Q;K(Fw!`@5~Wx2R1sPOaw8!OytyJWipm^PsrnzK1bbVJSvw&S=kZLk>QuKT!ZO{wvv1yc zI6va_GqtIQRyt0hs9(@w;h`qXBUD}H!E|$Y*0$W;reG{o)t|jt>~^dUi{tx0lj{%% zFuwI=$Rz~c;VgCEZ)a4=Tiw{ec#L_PCxKJB3RJ(6%QWh~18X<<{%7I57O;bYVdWjq z>(m%S^PXqP2a~KnXW-@0t0!avZclH7x2A{%)dwU#vgr(7AtjacBXQlByTfSA1PC~f zBS4%9@9Ni+mGlALWsLM9RRswRm)dkV^)pXene}+-^O5RVfx9AbKDB=HzQnI|nR&9jegfDDnCco8@qK5zi%Lc^oB=Gt0H%i-d} z3{XG}IovFW$qFZ)7_%bodFZsP`KK^ztm&lPvJ)53;Zle#ea$NvwevsF1Y$beIzBwC ze%BUclAur^FL&6It6sG=ofEmx$MB3Xd-olFbAeWokOXdh&<8u`K~U%1^tu+vTV|cW zYcg}-T(mfl!#Euykr2S^Xi=tn6gO5`mMFMAkrgV&WvR(!KGU18#q;A+K(bm7%MqURC*2g4y%Iqf6&y1s}OdK~Aj@+EXg}C#zOQe}q z*gxyn7nWIb7&X6PjvYAOp7;R3dTI2tQP)RjcnNqnr%xyXt^eTgmY$_$-xu4up`vuO zpWf>kBD#r_?aO18sd9HMEEgDEMe*oV&#Oxjbmm-fAycxk51ieKjAcS-WwMn+{f9M@%ETI%9o4iZ1ghR_bpK#)mS)l6VKfgTrdLe& ze}LGQx_6+MQL0YLC2OIU6=OHso~Et9j^7*^x+xj|`ueuyaYG=fD$HYZPQETjCFeI; zO7XJ+mYXzIG&DFp^%RARtibc(f}_*c3{mlK6M>M^Ge{m?Mo*W3V=98nrA1=5xP4I17I| zySocLVdJq}JTI1elTEv7!Np2hVc|O>M&op8BFRXWzG`=3G)kp>O$if?v`?TGjAN@> zY-1J95FSD!MN7pn-QVBOU1+k{n{`;aL`?iJy8w@&p*8ve1H1p-#SYei?*YUr^kFG{ zz4V-YDab~SOT(0MV{6ikiy^u`;b}&omX3a#VK7tvFo3wMePYRawPHhS)wd^sQUZZI?$PSy6R#5BDN#%34lZtAo)L$@9Azhk< zMl$4)uTs8RQGI{gVw!#Vb^V4w=5}y5#Hdob@$>N^jXsTYR!Vs9&2SGK8p%`#PN|vJ zTeotk6?&2$SBd!j>CI7AR>o&ko*Pinzqx3pRFEB!Q-$K5)^~WrpBFiLqrq3czMOEU<>8c>Yi$;TU$VqH1kCnk_GF&_#{D7I)Y#Q< zPZD=ubgh@!IbMQvDqSviv^cAZ@6&uPxi>()C=T1)uj@?Cuq<$$wf2(%`#LPL7Y9ug zgNP$ZEGXYh!iN1WZz=IZi%;p{%9v|d1Ix1P+|0p4xi~JsB!8(keE!`ufuL^|&R#gh-|Y)|=N%_05S5{tU|BB<{bF6xc5H ztzv}Tq`kOZFYVwFG8R*?Hy60_`slq*onrqTa>KkgmnAvVLape(r;4xW*Js+pybk(5 z45q2mt;ezH#cj2b3-+1ad~h0tiNK#Qfku^|^ie0F;xVW~n&=vE@5wSmCy@wx9@%Zo z*>Yx0h?^1okhUbHdh1}Y|F(I)At=#m^b7s`>SO~rVH$#npM8BP-$XY*+mQ(FQB+}ym3D$_flE>ADtEfY{0aEEhlH0!m})1LD6+lFsL99M?+L5^0UnZS@C8=c8b zwi(hc?K@kr6~Sel@Yz6Aa_%v+t-XDv-Sh$|;RTWjuFh-{(?{kg(#mxnu)PBL6pxb` z>wRpM0qf&KCzranZQ%HH-#+SaYNM4jR4J2PdT6OG8nCdhb7y;*f3VUCW||1I=^7c) zSW?X2TJF;#4eARaH`f2|d*22kh#1yjQ7&i5s$J!hwy7dd{j;w~tc=`|?sHxfZbQqv z-aVB9ZH;2nd8pUxhJeIk_kG#&>0T-Ky$uBcU%ZWxI;KV^*Wc8BCLJ;PMEGlKYZWh7 z*V^MN%Phudox)}wtWUS}R61cA>31Z;@UBY~=u|07PSH8Vhh;Vm{dj^-1ANo4H50pV zGDM|20~{&wf-u`jlD)sif^H6M+f5q>(HfXtuF? z{k;F)*>e)es5?g{V!l4fCk^gUKUBlksK;9KJsBNSXgd5iL!}E1n-r+!SmZ=NWWlJB zuMnEfOw*U&quVy@(CrD13{WH`C!&cLa4&USayi_?OyF~lNtKPSEHN8fK05Sie#TvD z)kj%X&n2mta)v=h{)5q^$HK83&%07g5?3Z*zyJn|{i;Z4 zB+6Swx&s!urj;aavuZ`)&~TcMtJAkev%A8otHQpLfZMh4bQvGVC7vb>nwzA2xsFSF zVu2))Qj#IQ!k~N|?pD*#*{UYfQ283z=3gw%|2x-LV>TRmoN`_?bj8 zQC*%U8UCQCen6Y9&4DyWInQlzYl*f^-Eq0w{m&P)Dwpk?XF2)bZF`%UH8@p%>$97* z!KHV%8U26l9wY^C0mKY@y}ok&CxWtHqJj7ey{LYHKxpz-DLTo$`vzL2WGqDE8iAV5<&RR z?%8jou}X&sw@z!!tlV_yieveEYQ9wEh~Q4a%{ygQJsxwPJ{%wMDlcdLcQdxRBS}43 zc1isK8FxItNx~!X;X=#GIEMKam3#E^p(2*4eBfUCL!D1HHaaFI=1|N7BgPW*0q531 zv^9JA&vu*RRr{3{UnGrafZebmG}U_Fkl;k)RL)YC+EORVS6anhPfWI@TISBE)KM7xirQesK>WVx`PC#w-yA=QX-SP?<39p z3|X`)x<5XPb+Y!9lTH{_FWKv%7R89I+Q)3H`_vm&{IaPK)Z`y=b4zH;hy{`Al)9z4 zFa(XR9ponbN7Iw+&inq@Q~s57fkW)A+br7M7CYclAfaln5n`5HMV5z{seGm;VO;6M8CQ)-am4RBmfb)S!-k+J7qZOEe_R%q~ z(Gt#{M`UyUSfErSi^`(-OnrbxomgOme+)WaW5LYpDC~vXtU8W!gS+ixm1d!!U@huT zQssG!Sn_>%xWdp+f8jYov}UnGbDf=#6+aSoHl&JQ7xa|xqwK#f1t%{SE3 zsqzI~a&b#!0UfdJ^1&{PmJ6T9!EB1O!mq9rvE#tCLj~<7slt)~`3mXhP00M5W={p> ze+y0sJ}_E%0TXocxkX0wz~arY$=8>wF@szRa)-u-DZEbe`9~Ogc@X&H0=frCxlb{{ zX*u_emJJ1D%#an7DGJH>lm;hEPO`VredZ)n!WvH^P0zw52mMwjxcj%Ywpl`n2Ac0R3`;p#}+s-+hY2R9?`fT9XR)9 z+Dd9KzC5b^A?$O@9DmQL!g8d2py2p`;f+FDUEO4BG_2a)v0QXeJd3JfeU|m>z~8Qe znpc`P_3sEAOvoh)?C0@Wf75@ans3||^CZxVmN-_>^VMumh8)jg%i&OxUZ_GExP9$1 z*<2{$Sw#Na39HnKDNrr10L?0CQYyi^ZFBOIZ!6gD!AGzlu@;ndU`OMJd9T)_3Sea_O>`i64?2Xk; zcBQ}s+>^9jj{bPZ1mW@q#$f8t{Ah_>3oa;H3vH0ohOHh-Vo#f4!CIdcNd*2GQb?0d z<{01^uX2^kp*GAo8e1~6#%UP=SB2{^!K_s6aR1PrM6x#`e#ZyjZkOZPG>0>qfCHnK z=jaJn7i;fF^`UI)8jc6pP@bz);<#|LjC`=7~TL&!6cdW8|Zp2FLCIVn!suV~5t zE{&|zc;#}w4JaY0dnj?dM*FEqBG!1=PgK}W;WbsqNSZF0KELgS`fLm@|u=7S=m7X6gfd+KtD z+{87iAZW8cJWeb}ON!BSNn4ePu*;_HNEGb*n)5!#^A~lSHQ#;q8(W?MJ6shHHhS)L zg!z*geE$?~kR-v5g$sHFIL%eI76*7;w=BFKVm$UnSl)uVg4(kKIMQP|%^!dWAG9WA zho?kepVVenpXv|`05|YkDbz0zNuZdVPqH-D`=!5<~ox>CqqhVB6~)V4$RTE?ky+CZ2J!G;->i|k%itnUXK77 z#gnvI1ckI_{JsQSYVo9**CA-%4nP?AacF(4a+_1`a7O3r!TJz7Or;NpwLs7dqlE4E zg9;BBiMxlD4T*BNboa?OLp-DNG|DEb?Zv9@@G9pT%PigP&*$^_^YhiNeTCDCLZQei zxnr8+Z=HHr<(Ty$Xdse!WH9*Y8>p=DxfmX|FU4a185t|EE~pRiJZ_?Z$sjRHn9lBx z(Mgs7U3qS!PI0w!q&%VLsBU^P@0D`)cu~z1XpxCJU`BvfXt0nG?`0I2<%!(Uk;^1_ zt4OPy8x_N!0kB*w@DCz&o2hs$@+#*@x@5QlDP9oCIG4%R21`6|f2Q`cz0X}crmu~s zf6nAt9vz?u?TB|EriR^-^FupIFhrPq`|{|%I^1X_hJJu+mMXj0RP>VU_9c8TBLUJH8ORx{x| zM!!~};!v`?wG^vPqKx>sMEESxc#{WdJg&QMG5h$mt#pscW_c8)Z9bfl*k4d8TEM-+ z#4siOihnX#MStt?jMWRg~#K&uKxCWB3 z26O$&tD93~j(L4Ya=fk0{by1#ja2yJh;{HN=|I86&el>#yXbC-zv_L1021!p$FE&r z?X^d2&TBg$smeZV=67Bi-dq}SYLDa2P@J`*k&Ix}O4l!2t`a;xOiAv?fSc239Z;Ws5if0D+>#rM);k_w>z#z-5^RkQDVdt@ZUeGIN%%(mk03;)-q2;0TG zMF z@gT}`r8m5IMCup(3D^URlZF5`2CuQoyM3Ff5}_4O*3&`kLySjuWxe^QZ>4Qf&{I^Y$`CZeF0D+=JY_|RDfe9I;Bqo< z{n;U=gtYV{5j{EXIDW**jiWlG2wJ~hG=Zp?CK*jVucITmP!=c=jykrv$Ti!p@w8}0 z5VUbU9k4Po3THR@>6tE;NA_L1+ReE)24`$>uzUo>$$dC&(l6daJo?0o3XP9u@-!B* z($b8UM?H@ag4Oele>Vh0(#kMwZuBn+PSj-+gq+@FKs@0gScf(nE<6M)K|{w_(w)Yx@1R#Gf>0#8c9Y++_TE&1b&U0`>%SRD>UrvzZdK)xr+=K-2@SO>hi*nb2I0Hs*^aV8^?S3VG^%*Gx6atSpJ7@@&>%ie?GtMh%|r6~^T9 zriZ5o708s8f57#|V*l}OEh?i_i?h8k0mIJhXL z8quV5Wss&LLNdPic@KDAL8fV+U-FH9d|kHU@m;M7L%p*6_+Gl#AaX6S>&-m!AP0%A zs2L}W$a+Ok58Iq^$(rSn!$ND0NM?XJOno=O|iZ5Lij}{GWIVyHv>M!?Bo1hN-pAx_a-Iv6vC8mD;9Pz3*{*>ulK_hAIgu)88Lqrrq@N z{0D@9 zS{>b)R_^WP!(DrZ`vyNWKj~T}3h+-h3>=L&gN80p%=;>zvKJEyQn!knmPFP^yXa^ zeY`bRDdc^FMlOO6B=)@)e*-Xsyq$6FpI{HQ8tRL-8x>0Ua>VwfLj!UxFp?} zu_XB15WyQhgbPYvH=Vw;1d@pYqOP|$$+C7M@uuc80m}GbE{zo1jtz4%Qgc7b<#AY> z%Z=_SPH0okQ?GRG7!Q`w8!jfw&xai=r}25p5(+xD#}PewPY^K<`Wrxl zKOvG~#r=ARK0##R2j5;_5BG=n#a7#N#c3WNPv3DiW7hoA2|DgUrH~4dLWq#j7T3F{;EY9z>KEQTs5tj7g) z3T-wQIK>(c&B_3Z3womAWa*SMq%=x`Ys1P8+YICkYISg{u}H5-o2ypBB+*T6Wn~qk z<3brOLm@FLv(9MD@GSd_%`Z(qNYk*HK_Is7<_nkQd10ziYVlmn zd+kRim-TqJe?!yZSGyk}aPL0MO|5o!;m*|x=h;lOo_OT8GuM^Uz*$LiT62Pu!XJUH zlhKp>Kwa|*9<_OaHu@6Ff%&>)gX@wvoOL6d!a*-O3%zS;?tO#9-O3P!Z#_Ns-KklM z>9UdF34@|p)_S=(reF9a&HyNHwIo1G|3g2(R)32Ni+4yK~`#_h92HQmA zISP&bT%4O9N<&z*_=-$_jTRb7Nf?PWxOXJ*NBXx@tAN*P^+^@BQoO$29(Uj2Z_*Jw zkh6;(@6@B>IBtA0T>KoAmS}}F%iXMcM6dhR4$>T~J8^-^U!Qf2?sGy@^w3?oc%DO$ zGR7E4JQ9ATh{L?lUt<3QecIAsxVaBB432sJefl6hV(P8)(eI9X?%;;ti^rka^sNt7 z#5^y8-_$GNmZ#m5j>%1sr0pCLUO=X)a^1Ju--q{=-7h_WT1 z!a5O_e1DfBJk>FT?eQxR!?s5WJW-baB2JO!HoQUPv^@T7&91n#)T%eLdbC3lJfYz? zBex2wdZIx@_xi+7tG{#Qpm~jdg4{iZ)E<6bd7w4g%fFwogjY@%nS$#;#ZSHDIZSkt zYSoM5@9bKBd}XD>$|k7KdgdRqY^|-S7u6@56jX=oYHci%x$ob6dHk!cAa}WLzQ?2? zAU1V>xIn>g-k*p|K4(Nn@qSC%~Bl?+Z3>!_AHI!bt=R;?w(Thatfdx6W8&v}g_ z&rA}9j4TlxYc~lWeUTa&ZKEf6aWBLTj7d`21Zrj?t{ZyD+2K4}@eig{kG=8BC zPk_BtD@d-|F?H{K@&v04L^yr<8pn+v1a-Qzv~M;qB`e<|r*g91zZE~*rbFkHuFP59 z1fJG09n5Uv4=AYZ%1((J2P$%2@5hOKDjS}Xkzv9VAg3bXpW?J~gmW`2I1M~Gr69)N zT*Z)F@%Z)IQtJt|S-Cj%&@%wuqr&n6FBVhdU_Xg~P;YqI&$2dOQ)p6{rsiRD+4xev zPQav9s{cEce#~`)MKQg*^Ve|#uaf}Ow!dH^ie1Hn2A_FmUy2e@Ntp#)2($>l%<9Jf z6I)F9z+x(Q$Uc%uOTe)4FRhG57@d5nNr6C_)$yhVp(Nw<4(ONpMJ0;QDqs3+(b1sZ zKl1Gw-AKXl&xJno7U?h^PP6`JGgJ+E6-Pf?{BZA?_vNc>C%)x(*_t2DQwg}^@D7i; z+^+9VTDe`=Jz;0`aI@)Vl@CW5((x=zIKm%ZKJ~+y26fsZrxnCB<4=Kl4?Kx%e>C^u zGblX=4}Vw;{r(~KLor<`O+7Dw*wa%Yo3E#NEu7l<`Nvdn%g^B5EWb#FA$gY@Jze2( zpi#@=ZZ~>)YBZ12JPUppHF1VEx-Q-~rG=Ky?mjGLxG<0q{U?5xrU?>*&+sfOIjqGN z-0;UlQm-uhW)RrgYBMsK_K0v-+U*|?I+?|0i|Y$8R0Q#7hQpY(b_-FS0h%o=!IOGH6f;tfP5o$7b~)c|LE zyP}aIdWYT!fnXN_Q4z;Ct_0_&FNxF1OYr#yR_dmd0AK1^tfdie4*HH+)&cO>D zAt79?kxXg==KZ5um3OU2ztF6>UN;hnj^c~92C2`T=9E96AU5UxCyApscm40L6o5`G zJ-K|sW)bGof^IwHhXv{-%BoYl%D*4Cv$U%_ymGxmyB_(tK&O&IoTjQhv#`GFI!-N zcVl{ogL2nD{i{L@5MKBjxu8_kX2t(>JRwucLBYE%AmH(UTX*U3&f1hu+b~aGQ^WQI z+>)n%SOA$ zIT@cI-(h#2@OB$e!Pr_)ch z+ECKh@YfyrK2`d+^%tvC3~}ZS6kY?c{dwiB32^Q*5ORcSL_oqA)hJpdeRa)FW(cq< zLbzE>4vHzCzYGB|0C|bl$qEFaiv?$2KQ;=yw&+Zj&?9s<_LEiI!Gr0^n3ZR5VuW*P zK%i@R#y%9Vj|wqHJ>QR<95MgQ@E~&_KY24AOnN35ayOK@i|1-lm4Ia=iNK#;1XCds zC{b5ljDdJ-`LqLW@-}KHem!s|>Ahs!N!*{~m+gUXfq?3;oC3H{8u^&8Y@8w@B1(?3 zhDw|w2`po{EEEJiUj21%4vicP3Z(;)vpuC6++$?okNC@Ll*sEDXAIur>hK|o;}A){Nm1f&^_3P{5!X%R+uN=`w# zTUugt$mraAhWb3u@BPP*Ft*)s?sKkleT(^zEa&PPxPTAFVu3Tv*Iz`E&h=ai^7i{P z+=fFV;c%rmA*V#!eZ_w6{s}`;9?e*Fq_w9O{@a3zHAn4Pe~0xMv%F|i1vbr$kBZRg zc;7;nhgP$nW|N3RB&v8e%=|WEBj?-iJiZJ_rs^pQGTnY^NX8gW> zfXrP%L902V*e{mToX?x5m-$PVN0M~?xZ9@c{g@#*16#Do4Yd-pu6+2u4#XGclPs`{ zvsoTgK`c8KgZ_6YX}V&P-DV2wvh_^+wOVd3F-bnV#m*{=fzJ>>SVy0!0vtta855X| zP8q+S{1U2qDO_apBeP69n;^gK!kFv}A1eNcFbY;#P`wN8&jje3Z{F??CxxEeU{@-p zOLDGxAgfc6Q&ldXt05I=yEwq8mMB@#Zl-E)6ve56Fn*xU@m?Jz+nplA3^74P0am5` z+>o>)eW*omk;g}gX03+_s^T0#RD4RgGTDMbj6P0F+ZauY$u#dC8N=*hnZrY)KG=<& zLM9^ttflA0vHa<$vWi-tg}TfPV?_iboX&W~exmxNApgK#s=<1{)MJD8drtTJXnhv) zWJTZCuvah1ite8ch~Yu;!lk&N^cqg~A^h30p=S|u!`8WM3Z{z2!|76sTdcZ=L*pMG z={6teKV7aUDlYP8>*EZ4(&*^4wK!%f+`-hx%p7@voUJp-f@kpB;2DTP=%`OVb%Gzk+&9o6pj*}{pHVoOla1=B`AiclSb%3oeY}s`(8vjU|9F!A z1O2KoyIQ4AyFYSeW#vYuVi+H)vZ`tz>&+L}O)r5LnpIY2-i zrLJbkrAQG-lVeq7C3(9FOJ=Az)*{DTr@*=Gs<7fM&_7=NnpG zL~$gMc>`Ud4T`L4*7%jv=N~s+)c+)~YX$HRQ3jjI1|JH;(At?pr^^yj5a{$|%wj2T z&rEY1K~r@8k_1wuf@oGcL5;(09xVTUWZRc`li4p`o;vY0CLJ zZE=sZ77W`$xZou$2rXt~^ZXfzW#?_x*`aVc*VO>96=ss9Ei)#RG^ebznp_2u2lB=> zf8Dppz&Py5Qj&<{2GaM9gFzBrnB&&;;P8M2MD35XzWl%b8#PIH^^RKyDZg{d8GM+c0apkoMp2&&tU zux-25r=6IgCJU17((Un>y^#BQIK*u2{uRrqJ=Y9~ZM6Iv>G#mOX1P*<+LppJ_05>% zXi3RtY}aA`rrNE?hGEWRg$!U3xWxsN$D*=C=;I>tENZpzk$Zef%UXw80Y`V`0_qD;vdckwaq0zVJQL#6lAz zyCs2xSy@{0x^0Q%lRkgW1xQQZ zZ)FoYH((={5HG~8^(FSc?%6WOxvvwi2Mb}P#yzPDe8^3lEjA;3+WcTNnp4sBnP1<0{c<2}!~@_`u=;G$r&>(chb!VRU(> z`z!Yky)>TKul0D#;Iihh%Mck9OtnJCjEs6*<{s!x-bGuHB`_EmSpBj*oXO}dvs|u^ zrwXi&z@`J!B+%_lssw%cetILelLynwnE+_V$PfNU*DUV7DvJk?_K!JwaDvUOi z$IpaL9CMh!Yirm1-WZ08{wDoYR#VUoon^nhC0M{VD!6mN7?Bkf6=ijVT_50_mrI4l zs7mWk^37M`$s?j+s6ANyHUmATL=<<_7YUDU;y?Gq>xr zW#G>tJFw*pGRcW;>6A^19{ip+KT?(S1X?PC$IE_5@(#?_s#pX4tpGJnHiiCe8eZ6S z-sTUah>&KK^xgf{$z4Ch&F^|g+npRIF+5`lIn!P{cpp8W=A)I^IIIx=_TWsskjvW7 zv3EuDJ;@y(kJ_^<@VRwDf9m_6rS2g_Ph4}o+>R@-_r+hq{7Nn4j7W7gLr)O_wxLY? z(q1to;;6Q^r=?}_+o3n$RfKG>hhO1h=<7`?lKS{?B8JBT9bFtytTCyD@k`VUB!xV0 zCL74njLgL4I9wdQX;s(KqPF``;;ZP68G~6k?Yk721nFH9FQBGsx}J{6vAy`k4PC%@ z3(MI#1rYsdGdq>Q_a|`EEmOO-+ox$vn0G=ThOMy#I zpu8~x7V1vHcB9()2)CIjSI2}!1CjCwM*gK7j;twO5XmM+I+_Q6of=`PAOF-vG1=i7 zV_4&J0+WS-Hr1p#43adB?Qd4Qw+cj2z)51eXMMJqc|bpv^blW?rJCeh5wkxZYA8)5 z6vr1}@ev9k9TS5tB^SIl&)`hY%CdFq$SJSmh=?xoy6mtlV>?Q@y)wf5GVN=v(-klw zu(D>8LP|nO(O}RVC=qP7AJ^ zaAn#ZZWhOlSG$B}T4-U4ivzmQhV<6f>nFT^4Zj>>f}XV*i&LMm43l^e&R6*f?P-SU_hx66nRgx z!*%reOyjpC4qpqdLI&AZXY-=h3L}4e0pnk+cPGQ?SZ}v5ol5b;ZR3+&uPSAiR5;DL zj-D+h!Cxp&^E9D55gSDPG%QzM+AbRk-#3e~mpHzSv`v5pt`XgWsm6&)pPtjo$(XMx z^E2*F4RMm00|K=^t89N|Y-?Q7w!0=(d6Cn>oKL?3udVGNT}-!|k&u$%KxSlamBSIP zc0b5U?eguXUzhNBu8p;+RBkG@Cgn31u>3zAgjLhUNF$N!duHR`s`NiRvDCphZ0*}; zB?lTHN|g&=KH!fQZ9$*t&siV)V!gkT`>Ec=cz>zsacVAT(Z!==Lb+|NvDZ1RM1G6Y zgs(lEn8M@3&1;BQj&~^cUY!KMe0EGpTQr{`D0rA7vcias(MO<~N!B}D2zZ>*in1?3 zzgcGTrW|m_ggnC`@T0@qs4_?FP}un%?(Fdg;Q%mB7AqWDH|#K!j;hjLevvM8H13m= z11O8rmU6T0A6Kzhto=FT99qn!a4W0>5bDieH_Xw@H`pxT!ljgwH4o$XOIJ|-v`vla zdZ)mZgmuUIOLmMNRp>`bz1^K%{RKUNp+{-LAGbh zh@KbB1 zKyk5uG;z0$6odR0#%Sz$mowAF9-s4`wO532|58Tqqk=MDp0j)f6cV1DJcy+T<|vsG?9lVk7dju1d~bB&s*fbH{;;_K<%e| z>{|>B&;a#{TFLP@v!1YtKNoc(`%fz;1T+P%=6C%QV{q&U_@^hN0d}x9=`a6UZ+kI+ z{hh1SN(LZjou|6>UFyM6VDa8v3v^ren(Q{uHx1e1i{O&|A@gx9`G={6H? z*z|>m{}Uhq_yVH%t@pQpy<8&6!~b}(fja1~;oaX)`qM)KkWxQko2?plboE@-3Bf<# z^Y>LE5VRrw@LO8W|2P8vK06N#IE8~{?K_59|9TYuIq~b)A2tDp$>m2agli_kc$LdU z-c)VT;rtZffP5erX^G{zSMDe`lfp7Pkp9>PMqQ|ETHx&ed>b5wJgp41`kJ~aes_sV@p+H)Bf0^8x zaLf-hzYf(8_4Pp}8}!8pqe<@PFprX{sc9Q22*LP7eX8{oP)Q#5%D%}HhJqkj-Usvh z76}Uz-w9^@AH&=$uQs)WKv|>eZu^~B1c&$GI?z&D_W##4^Ta7Pk~f6m@gDf+2R=;t zpXM3in2rb8TY|Sm8UnBY{|?Shp_2x`?a01bfL#ve{?0#*!B_sLvi?X`<$%AlHWPmv zAED|Jy!HW*G4nq^-_+yqkfu>7&?~dXUMNy^P-=|ivG^?JQ{zN7k1+~)kgrpRlB7)m zijx~`$_yLVfiJ^*DR(!UDSQm&UgAck_XTWoR7}j`K+>H()=@ zh@z+FH|fQ9Y|JHGTIgH+QT?v}z3&ai?lN8R?3xck%Y8}W9?rY9b|YNOO0Ya=W```z zixlbbz15lzPg}wsO?5tdCn~g%ymp#)>h6;{np_7 zhJmrs5bbyw&>#DD>I@4jE0+`S@sbV^@#G`{zAg{GQMB=)#=jt~_od@#r`&K=q|Aye z^Q>M00jp4Vd}JLRJc8vbQ#FMr1X$%%^9JC7UX&XM7H*&6E5P-;03v6x*Tct;TjE(` zI0s$_3#!?rXQ@2c#f39#U@SE_PSUG*3cMy(7tgui*GTNBJ6GvOBxlalb_sR)Foo8Y zTj_T5C)I?}t1@b8!(u+9#u*DEBSdRcEgB2<_p(XTBk1kT+eB1SB$b=FNP1G?)a>T! zZKQadNJg=#t7$VS?Ou|CxuGHb)Y%JYYey^H>6REC*GdOf7pp({Kpuo?q%%MlsJPvM z)w#{ekF_Nq{50z}m0AfykaJb}_Ky9|IepiL%T$PX0K>CcPk;T!c%5D<=3tg}4m#Cf zp^DL-uknOau;KRevNt}hD<{917#+4_h)k|6$yQ@VVj9W-`#MHrL#6#t#(`JRah9Qv{Hyyg;7M^G{ArS|9o*E`~iBZV#v z(`(nmF5pgp6}W%fI04R#xPVjvzs39pjR6Ovm;F~vlVd-i-=7|2Z_4;2< zcnNRrN3V&jm*%=EO3WgWFrW5mduxbTvHieG({;K#Bc1Hm%JW%VmY!?yMH+?h7C)5ynKNs z9GE&MR;V5WhmNVM4|f#gbClEZ!O!{@dowmWgn|+T)+_{1?`N|kmkkVzD%vxjSP9sVgo5TC#QLC(Y=cre70GN znFgCf#bDEgJE$X}polELbo=#SiPYUDNDtUTq|>Flq)L-eu%rB=x2OePW}7JR78evS zsZ@U7(%@evrMtteCy{Aq29IPH((P|`b=hlFz;_of4!|RrncrOo`n@sP0TouQ_(~zy z0|vzmz0tkR2C195{m5Ux5{t~n%jA;IUg{IcZUulAC3k+V97eMX1!<0Cj^s2(q(5}{ z>JC?8qhL@KyJOH1#|$AMXARRYFRN%Nf>=*ZLm5Ywzlh^3#;U_BQClnH36EUPV)M(S z+oFjtQ{mRu=KIT9fH(;j#;8&7dhqQo$=P3LAm>SG(+1KKmsVp+Euy)MKX1%$r>!4d z>!V|hj?9!_t8KV~##77UhWl4%?B;vtJ40&G&Eb>}9bRVP-J%+Y?N^g&rL&%74;KsC zA31xRI+M(diDCBaYE25yR?b(RM_`+G#zGO3Jau{bjKJ?K9f$p1rXMpNQY=d&o@4oj zK{Lf>^z0_sNEsU&GiFR8r)Jv9)@PwFS`Y2e5k%Pf;9;xjxh{6i%HT1u7h)z^8mI{J zS1wQ=q!AC=nCq8Xep#cJ8Nr&sYuMgzHk{nKx{>^{Th-eZ%dDhYY$p{rR6HH_dma0a zPX1=q36fs>lSl{i@swq-6lBV001vKY>vB>IFkoEvct?!Q5ZGywMI2S`=BSrF=r9IW z4np=v>eZD<^h-k&aasImIec#xPwm{PB4wx@!J<+haJR~MbPw<)=?^voF4p;xhtD?A zgRAYr&d!dXVNp6v$sR6=WYtjBx!#u{U*)cWf59B{@=Mx7`Ag$8 zM9PSd(&Yw#27R{|rG7yN=R{b>iX2-axE5#GwSXrYJytxBs^=niwtB(Fq4)Owl{>-k zlai~yx@Zs+%N3${BN?Y{&L$pVBA<7&396&v$|1W(5_>qZ@YECt1ou`TkL-E z7~t64eX_B?{sgeD>KvW7UoIF?wSE2w^#N1#g~Kr+#N6^`%yZmPHqTs4ra!YdI!@4RC;=TD6q$PuDC^_`qAbk)1gT>*O$7d`fE0z|ufRIwI;%QjZt&&s8_t zTPvuKynjm73FcRZhW7jIR7lBi`~Am;t+el44mMD=_2^YmpEJ&v!KKaRH2{sfx{Z)`kSE& zH@B*C+jVSH#c&tTS4&_e0m@fF^Q6BDZ}eMZB>z+22YY4bqWjj@0px@k>PKy+?0hG3+T0Udf z)gu>Va%9cDl+=#+(K07P{9W;exQeH)2Xk7?$R|bl`GciSrBm&33#meP1)LvhcYjyu zF$8@Z@7{C-W7{^>ldFQ|p0yc$J#L2(>GKT|o|l)0;4GpXz^Yh2!)!Re>XpYS!;ZL6 zLnTHeAlfx{B}KBT)7sjZ4L_Y3cLUuFVEjGwK7Yz9@aFwT6zL_dQ}t*+@&o~^-sZh+ zizG5e`MI6MT7+3cL^dV2Ss33l8GifK+x#YBMO2-o<1K(b?KMRwDG|XrpJKa+c5ZDH z>QO7wYXXZE`lTWhmwq2g2K8iZ=aDXL($Vvv)5KR4v(@!`B3KdP-C1SUq=S&5LfzC} z-b%c1d66+;&HB-hfo{>WPI?hgZqjx;J?VF$*!GDwE{5O!=)goFqj3Z%?dc{?;P*lx za4Jm9qLxb=?uq5p%5arujQ4n+FL17{WUcW1Fo3av_Cg7x$=U|c??dTrry5m~X#mK~Z6CdH;w@!V2$ zG=(TqeD{XRV{o{}<5}rqm%{kgDcD{QC%SBpRSntAb>^EI0^?3or6}JU$)&ERiT#0G z3r5Rj)}>QAb+<{tZSC`$H62t})SdoZi}A9a15dwc$+tEza_|NC0uX}bac|ePL@Jo} zethI)=f|CmBV)Oz9+|6d{AygeoJl1oOH%ji&u^cB*o4c(EN7|xgDmE>u$3Rvb~a}( z?15a7o=-?pgJd)Z+OjaE*@ZdL+gBmeKjulkVZzgz&)mE&Gm?c7tcyJ6$<9q_(kIhd zL`_F;f?531Z9aK(ji^dLKR@~4575K<0OBi@{VAgR1G!popJe~Rf@T`ETnaNfH}M9cZ+*RT7?Uvm2>!wlVqAh*Lk z1=bLM0b_V#zx@S?xX4`1=DweF$UFh3qu9Nl%UagALWi!O-T zG0DW>l-W$r7wx*GO1oHF_hi}4u4o|74X|8$FfV0dLVorU`?E_bxwxMhgJO5?9_|fE zx7A#oT@`Y819lj~G4L-F^=&cHea9D@x{dDSw7zVCa(3GdO&=`@hWqYbiGWqx+zF;s zVBlN_kEBf|eKX5b~#xodNtNqEjpC%Bl2d8(zX2#j3hs`e z<@X=+)xTu2bAa4MLm=LqBs4ouc*BpM@ZbO3M4dS9iAkz}8jW%FsVUgy5uKv=bueM9 zt$ocw@HmZTg7F@^7|x1p@7mn&)BQkb#;na0aDpu&xUT>rHZ#-pdM0iII9XozK9ySg zU#smO9o4W%ZTNoN=Gu4$KK|*_DQf~xYD4L3?P%@L5S?`F7u;6*Q9CN?{#Dsi{@2$| z;U;O=pK)_P5*QJ9;A->YxKsG>o=4hQPNkIN{stf@0Th-^OP!^am6RS9&28pLdWsNd z2+YERDH4ok$Z;aH?Bdt(w;MkkpW#{1{H=B8_Dd(=T_H60uG}!sSxFFbcHLf}VhlUQ zDSpD^=Y>YUpo+|j%B#=YneQbX17kM>L2tQskohed?apWoLK)it^vHYhYa-WqW9Y~q?Fvl|9FV~>BhbQfylKC zrQy##)!ifhb9)Fq+dm93R*u=$AOG*Ab90G=-r^Wp`M>?c-^U1Ak`y22Ky+4aFyM0i z(_H*>0-w)3a2EKTlJfsQ@jp#t@W)Bl8{;3VC8bfz>jTxIXj_w|9|hKRsBp?V z+z~7qHEbbq(f~y6mgq(@c8VA?Fm{^!Y4@G*IL-zAN$7yOIUToA@BJ!um%2#lH%Bhp z)`s2zNf%91Db;S4j7X2XepNjDLIX$7iYaFKd%9&(9Fw-qKvd@k+}Ew&g{xEM~~>jgB0}t3&XN>VVN9 z`MOqxkoE<_py}yn7nLk*7W>d9ZA@oKD1v{!wYe(vtP()gtpBAbRk}>I1Mf@P<-rMt z8#XEL?al+dP0(p579h*|z+f~xX;9HI!sE_=`ABSi&YyQ0@p>C!>2g`B<%I1)!dY8; zv+>6kGjDt7Wq6FolourahqLsozV%k}`{RxI)!-8Ygr{?g;E<=j-(&)Q@OX3eM~U%1 zu8z6d)fRPCbasU*J3FfREhM0!Id0-s3Zc_>K182M1VHw~YA zfA%)i@yMEvzS`xG>6g#s%8F)zKJNBl)FJoX zg+HF}y!N{tzDN6O7Q?@3toS=mO<0SFLr-$tO+pJxLuxryR}2s9?5o>ctEC5#CeG_K z%kTEDWSeCzlhUK+9g#>CF+aLn0K2usx~)yV0KPufC9R;6lT_h=y(s^K{6li-inBLj zffQI7Q|*}Kkgh{o6U;|C_r-E~W7myxa}Mx4um^%r}?4E6cMB zOOBg3E?}%Or08h({}Fw3pbFXJ-2`=2jDaqgLVy;btV>(BF5`y2V)jtU7svUG-ut(b zPlWz6N!EZEEAbyH-2_fENEQUhZfh)u)3#khK21IU%1CAwZXw)Mj!ts8$hGC|APE7P z{skJOfG;sxf~=U9xx>$Ed$8e?L~o&7VZ6*l%owsU_l@Ai%BGg)N6qxN7mz2(8X^KQ zE~&D^?rr!yR?1Z_bR4`*Pj8rhZ_`4(;(nC)mAe7dTwQf_SgfBC$I4zGrJ-chCUCJW zv)P-Dic_R*`#gz*qa*BMO>M1c%g?q<9#zQ6 z1Xp|f5#SiQFE%Ow9+eEW5S;Gk#>yx^R_*!eoO%VYnEaWhvfrbXa3scr z$0z&Hp!gh-j5`4n`1gq2JqWwM-~gTI|248c{*Db%@bRuo@ABK<+WsLz|MSkP_rVnR z;Qb)x83SQ<|M!@{|A0An=jsV@<*eYR$G-;vVOx#Bv&kRxg|sd4?5qU*>cgv($Tes% zLrLXTPaN7G6gJ?f_E@i;Ed)V7XFm|Ch;ujd0X|486WTdEyf{%cOCd8(OE`>cECAsf zd#ZW7%D*_!Y3U|>=U1XHcfWv@@M}OC;k_RVgkv2_+O;&aFb??9(b_O7Wf0RR76D+% zMtE=!MdXt;GaA#&{vZ*}>)u!JjQkVZ4rt%!-#8!5k-fZhO#hx>|Ah^;j{O2)RO;w! z{wnUp_kpJj5E!@xsSvE9K)J73|3exFp5G6}376DEg5cBLMEUjC-9Kw@L!{1+A2!QFD&T+9q=Am5_*4zCphwtxhngR;12 zar{=5h$raYwW$=naSd4L<6LA$N)e;Q0$ooIWNRd`iSOX^-neSWUSpDJkc* z`&(}zt!GsV4VHmH0;pGffran|zZ;Bun=O${3Yod%d9u=dddB)uf@+Gq;SvqeT+B(& z3x8DV!@Vxv0z^J0Phb$GlJ_PbSVE46aG5HCB@@Axu2XkmbD=-{8H62bXw5hvd7kvU zOekG|0d!SUaDApJj!wY@-N_cB0USkuAu7M)(i60pY1kJKRU@-Ko39AGlYlCh+qioN zBbS<^g<;D8&{%{>Hm#h3bM%j4Kw@3^)s>`_qp4A?2Q4emPoBZuU=Gu7?gGJn;plL( zJt=?ys8qi4h>01F9}Vm?m6sDGxFTBge)$HRfrQ+43mhh#&(lMP$(j(2VBcMYYVBOD zreKsen*3rpU@`K~phZu+3%AL4FxHTRn zO`fd==y}*dYdy8X{)xWKflQ^G;LPrr_JqrLI+b*UCl$ZFLb~E%Q%~xVS@6a@k1=;^ z@Y5=Zh3Z)C-$zx8@aSV~1L8L8d^7%ShKl1f)2+eBeGT;WFRq22X zc=zu80l@oMJ^AEN$xvYYxiY!%Kxh++qU~4l{;hf=Iz`x{GF-bsSOcEBCtdacW7cfv zhWQigmDtcwxpV|N3`UCi_}Db1GK4v(4dx@Tb?3>OMo>H*R&3*LYE`K!papvvL;!|j!bE>^6(6tG`KDS~h;+-{$bz#Y5A?z-XO3Q_MZ zw43Y>)pKLDLI4l=kq1)q)U#=epp##0F4T%2RJ`8xHSRHF(X1>o4joU3`L(EPV9;M} z7L%jll%-i^u&nA09HD@82Tl*{Bwt1#@kfWR2MgHL3zRPm7nv7p$JM4>TD;Aj#-55& z<+eE5X$l2-Egum0lc!_2%m8sA>n1lhQ1VkfeDljIAO_Tw)>HLuGg2`yeJFX?=O(&l zoYUsqeNng%ZQTA?zO^?%=h}grV^g=jUj)laXLVdJAhustbw}_@E%Z{4xxFNR&;Ycy z(8OdtXy{!5o1ISWaa!hZQV8@)PpVWDzf;7X2T5Gd2MTu0S+>#3clnZw5P`1t_n+gY z!A%*$;J>O86E{@to5-&p-tm=m-RZn<^%zJJD_?$l3sd9eHto0B?S?G&=P+vJWW~a8 zEuU@SKqEt-WBmG=SP%>(nbofADPsAP-JO_(%Vo)2P39UEdL0o`HP;XKH^VbgHs-;v z=YpS|26F`WCpRI;Qd-|bpb`nXD}*v;fVxT+r7#KZS8W&Zh487KyK-0H^+<9$Xkw|O z$hb^;AL-Uxj1^!z6Ke}+f!p*JPgp>)EymTQAGjJDO&ox9uqhWyojT1joz0Q5b^WKO ziGf`H4~+Gn2%or9WYM3$0#7K_A|p0tc7=>&BC_dGCy?HtqSNnxYkOr}tNiuzQ9fHf z+l70crK=<93Yjke1QH5?E0!V9V0wZl3dl554zaQ20GIPn`uv-ZoQ2XS=I00V@_{|X zD*CMeK2 z-hNxe^GF~NKo6f`;mtr{{E}&7v1b;bB;9Icg+kOZ1B1>#g1_0C3;=Pn1$eN5k~f7j zGASx*@JCnDOqor!Uz^3Bn#EfY!N;msVwU^~-n{d(`>yoQDbyZV>3Flv6+2WocXSLzzm z#olx$!V8H|TUQVO$G zseL|L@6jz0a3vGcEy2KQo>U@rKpwC<+`EMBuJK%l41KZeNdfB!7|-f<1bapj$k5KB zRf49Q>%^kcN#ft-<3Fskd%dS@+}*ETkWAn$R4*&oULDh{eDf_uDh3QY20vgc)mH=h z-j^1t_O~wG;#&evO9%#;rxA*Z6zy@mjypdqwpY2$hgdu>QF1-8pQy>3s7|1}$!YXq zIalj>h!vzsx1$ni4O~uJ3ikpic>pH2w6x?r_iI8XL8#QI|Ml3xuJuf-TBXf=x$R>3 z9zcbe!JJ;fZAMBD6)>KB|NcDbkD(!^$mz7FTX4;>tz7l=$+>)8ut$z-!?JFBU7`fW z0%|oxNiTxRw(wWTBr@CM_+c0I2XQxmAM82>JDd8KpUcavq0Sq>LfU1M4LH}0%=m4B zON;sK7Dz|C3lL~ugaZhKdz5q(ZeIv0;em8fVn}~d4?Pt1y^A%;-e~;jdlO!>+7Ti% zQ0IFi{BBtCt%i`&Hnk#?D%;@_X3&T)w}CX|TJ#5}`4;x9YITRu0WPB?a5AZRe;$(Y zAQk4gy<+yDLJW4aa_DsW?4^jqg%Pw`b~Kln?jCAy)ZPO%*9TZsVTvO6@1KW||4ewN zC2Y*Rj@;iG1^E5R-Bk0@Yqj36#Iol_z-Hlwkhy?Qp`CPGCi)2fl6UmCO;wJ5>!yI1qh*zQhA(`tFrj%pmFYCJ~-Nyp7F8>?Y`?y z<0?b=_$4Nl0Ipct?ya*4SdJ;su3FdD*8l!7RoFi#%=^ z1t;Jjg{8OvyzT9`+ecsXT49^Cz8>z|V|C{SJB9!D0w|!Q^saC49tE$FB-4Bd#Jl7Uqm?@QpB|Ha~;6#!%JL)jshNVQ46|G zFHG)3uY+d5aH$0#8NRsSeeu@TuddpF#eqQ{b585_*eldeB@(5nTjnB2ljnL$$D_GS z=_O-}%=QBbG!lJ?alNIhBQl&pQ&LBU_{vhIe7;DQ@*{LRPpJiFcv<-$p(y z-P?3xgC)xEfW#RT#(F;oh1@#WjqK3kFlhW_Jr0D3$G03;d5}HUUp(DCqWM#Yq+_J{wppgC$^DCaags9PE;yKo4%F zO+Fp5%X2CHQ@G8_TSO}K`abLi^VY(!l4B?-V0>%^+|IUFW@fbfEC$@2P!%GI^v`(8 zn2ZNj1g*9g^g=RSdzSg_r^QoL1EPyfdtd8Vu-_oeoX8WQVVN*o#WRj70Fj#?ZH|`5 zaAy^k#%?A4&i9TCG=o0Hrtw*pYM%9<&VP0?qg% zSC>s=;07{XCL4%~=FSf?Ay>FNie3gW9Apf^ZuPmVoZ)a7&VsBg!iFGjkwc_mEs-cRP3D;>}KW z;Ds1hVb>B)pHPbzn#CQBdT-#}M#2qodQG8KfSmz2bhvo8B|O|fB0)3YQaW{JNU91D zQBqJ);I|HI8-k(=^&%Ld%`rSd0>zFF4m-0ysb593;xLlk?~=uXsMS=Oujea(b^r+l z3oQgSGBP^uc5szGXY~>}sNtUA6Rg1?A02Ua+Z3JUOionnE+avts`h07ioo1hQtEAd zw2*!Ku)PK4AWu^)*FLDzk^@5v3uiR$Lr@30A#fAeRUua&(rT^p`w&nej+7bNgP+`F zC1z#3djW683M%EwBe6BtRG7MXn-hUJdh0pB_atpIToRCo!#V~U=fTpVbF}v=aJnyf zeM~MF_JaOxm}$zv?s~eLy79<+pC%MtxLONfX_z~;nV^70Zxzl|1vS2p*Rnwg{HAbw zygGkV&Yeb?B$b2EM-etUGo268qMzWzn5df8H3MG{YGGVifmt-$;4lx0wCT!S&Nn~Z zk5D1RGjGqhjN3*!1CAWnc+y9aP_QYcz0}-=c?MDqF-s*^0+%(gR+)8WY&OVX+_2Ap zCIuk#`saLnBux4~ds;CfeW&3RtgsliY=P@nsQISBX0drHtzQ=(ZmI+fluKSs=s<@{ zR)ZT@n}E;c;_H>AC6+jwxgVNd!N~r!h5hVM)OeAxHQwW0a$+)YwgDlW4z*rVh#Wfn zi;xRAmelX|(`zy)+^zS3ys^2|rSbM0$T0x%ARvRda~{~1)B>n?6Te9n3esRR5yb`m zkWpB-|5T$fSSV!@1j9d}h&X(293Gmo@Y}6qsT6vNStpA$NK?gwFk$U`gUyQr7B;Ix z&oAgl*)H@CR_mrtL&90r=)f)nWjtJ7EWj(|vM0&3IAY&W<-}iPLC>#aZq5dOV>7~> zt!GY{+rnb>>Nkw-?CeCkO6>s!)4WOTkhD&@$jCKbpbTC6;u0m03|ClfW=unD=YCdj zAux8?sjWOm9sjPCD0xhs+8FfI7QsuO;!{Szho;5)r^Of6S z@Mc;1w^mTWevl$vvtvmr7=}uGM|=o|jBuM#)<5QT|8n0na%mg&X#x4Dh5Gg&5 zgT0C}Um3Ea-}!;U?x*IenW=%KjeLhSQpP*nI(n&>skkkM@^pv$n-!P>Zm#8$tytO!xGc1~HVE!- z^QK6I0E?h;Z$YFkQW)==jz~FJ-O1m#w*XuRwS73TVMi1t%?tk?eB2Y~R~UgPxDrY_ z{=lL(MT)<~oY&@!TYr|y{?;iY;^y2Bw>136mW2kc-$5RYm<`D0C2JS!{Ppf#Gc?a(?{f!Wcj zmq@*^|CyrA+}G;s;z84m5!o`-<5FQa0Xc<4DO;JXXAU$^SD(6!W7ZEZtDc8H_am1o znfZBC)eSQ0i#aAwY4ikJ5r*!Iz?*mZ?UursBU?1+q2z4Y+-4({Z;k}Ynx6k$p&FNY zBQcSuO=B{U1+kBwiq}xe)ffh;w{9#56)BLwaF@%mH7$e&J<;D5qbFx@xEIp3+jBqL zMjFw~)nh3{xdCc~r!M=@A0l72R&7BTq0`nunZflYnK*7i00K1xHj8aRjSQNL<`HR8 z2Nm0#i#yLdE17oF6f)YofKeDk5v%VoC(+tsc@ zyt@am!78@`+u40n)0D-!$aYFPW;dRD8BM19@E=QIFRt zSXew!bkfo4DX(_}srY#cEIzyL>3;q6&1HYr)mMzk2!f0$7fbIpNo=11AsNg{)suON zG)xLP9F9w0N|yP-dgCvqR=&AI^%l70J>QD0rsjOf#wgw<3o7mhPcGf&itw&N=(n({ zluM>t@3+TYxWT-=&?7!m*smRjU=YVVMKHh$ra=gWVveeYV(I~T(8ajN_L|7nhzl@2 zy90;X7h64st*=MRN54K31zX;Xupla-M8)ND8u0_Qa!KA>N{r4szqALfZg^dxR7ur5 z1g$3qPmXfVte0iJ@@y(4OHq$8@1F2&kG73!MD&+vc(Z9#G<~t6WQa=>mm)5H$r0_Y zsi`^Yw3UI#e$nyNC1W5X`)L$N^2ifQ=b#Y}L>V`hCx;8r&o+n3OrEg<3B#|)(Q5W} z_uY*pZhl7Sk7Hyin-VnA5ZUF91JD;`Xwd$JS z`?a7M11#sr7(q|7shu)^?biKy@!;mGvn9ve9z#Pu{zA9QF;e(zH3EHE#~pyd`wIt;0N%lMJvLClfbf(;Td&XGYAp9 zhakF1c2bnUrTI`%ANyZ&%RP=WH-XdEzZuZ~f|FnK&U_@;gZ;>q^f6TxnkNkpe7W?bL`&$}&kr}PUJ$hY7Zm`)o49g^KvEK< zco;o@xUu25yP*quB=e8aty-M?|6sL%8Ba%Gfa!6vXR{nj0q+SAKt^vS5IYUZgkBI# zh)mo0)jvNGr^Lf9NcRs^OFholL=tkc>NUqP!0jOcbc@#*moEAe-t`yo{&U^Vm4oa5 zNljJ`L-bdE_~!zHYnK5~)bN@g99aaI@qgafbM4{i3Gex(N6i0#l|M^~Fp)((E zoZ7n&?!3^Jhsyup>iHM)*Z|6XmB7EKX}$OFNu0a)GvNf5Q0*%dsCXpL|6>&=eD8p0 z?%2=n-Z_8@zjYV8@$VP9kiRnj{V`%b0IaU~J9e)=v^&}VyLfXyPeAiMqzruieBaf) z6H0$ZD@fx2=Wukl;1u}Cdje;GO%|o#npWGj@~s6FpA-`izSgsUz3_KzpRA$)>ep?x z??lJH`MI?Zy`x&2${E1Qdud=E@jW`eQzn1LPpAnl4#j`heBp% z_RQXU-`{!P>!R=L_uswm_xl-VKIfe0Jm;C##vLHJ#0d7JQ-DgvZK$8f*8ffwj7$uR zoO+YpaQ!>Wsf!RYD;0$@8#T%L`m)JGbqP-xzHoz z_;Ti+zjTn~K#@p=W@-5k0LHOV?eE=dRR1mBs(BRdi)~ADtZDjn)b)WqT$HPxV*exL zz*I|XE3eA8=wqeL%}(XpJs>Nq*s%J8tdOXQ+HpIjWq0b6P)ZBVWgUJkZ1p|=jOSRp z6XyFao|l~EfdX3TP>^Ef;*8MO#v?PQ?v)q>7FXmR{6IXkzQ$~YfaBNmGf_}hZsIBvYQR=P#rN!xq#IcDQZhd`5ySXu6!t%hCWr~Rv z=5t3kU21t1xoZ1q`<7$v#DapIhdUOgqM%y(qeqWKA4J};hQc2A2jd)9&K5n4?=Bo| z%Cu^-HiR6qG*>H^$^NGwm>bN7A^*%K$rq__+ST2y%TQN#_^}+MfknO(bXc7Kbe{(o zQM(gPTL)QfkRfk9A(RFMd0KSa@r;$)47|6l4`7@sOnQ5NLuv|h`60ED3E^lNX^e%zFf%O9eYi+7svK|hD8N%yR+IWFq~Yw^-xPbk!B(Zd zzOPbaesZDod$xzDtzmn%0#t;1)|PD}^O-V)(|WRVMdp)~!Tgp)%rY|%j3|zZ+2H#9 zFR*m0R@DaeOhJ!`nI6Y)qf{9i9$7K)g(TVoHyQ5HgAxn!-~S|7Hc!i*vNLN;wv8;9 z8_Q|;x19Nv%(LgCsaozmsKHTD!GFzkt>A{%^+_m;+L&$=c$ZTa%2OnMzukSzw<-*`Ykp3B@1SXwrgu>pFJ5YkVb6ZjHkpp_oqPfnv3-%zET% z25UX*7@*69t3mxqGfDi1B&=>d=p*K^taM}QjG%y1j@`(%^UTP-m3S%!A4YZuYNi`p z+A$w;3BE~Zv+PgGQqYZS<9Mmu13_Vo`$lRbl&YdURu(ZU5NLIN>i&zVj{-g?Z)-4L zIj>DW1?uGdUSc;!Ap$FpU;T9qtT-qj_c(2P?{lmLMKlC`55l5Pe@-L_0sf*uT#iGd z?S%yC7e*;7KWi$2S9wKsWgeekM#?(FItn?xSrj8_6SYuuUH(U6jImaIzqacw9UZg= zqPeVLp{*J@hmue}Xo+6y=i2wVjzt+#rB_(Xe#qj7`zC=xv5_iGh#M_JW zL=e5*my>W5(c6M(xgB?(Fx8o~{`FARa`E+e)?>Ka(aA|7Yi_w~AQ-kOkE2j4i?V@? z?B?tO4hMY$IjGakau%hv!iT3KY0JN`n3CA!8c2_l8LuZ&HRc?bkL1~_hHm4dSI+!= zsz0<`H#6fo*WM~YJiV#(UWe`-DJxrETcfKmH2^=??sBlmn)*)3%eB*;A7N#dqk+l^ zK$RTyr>=#qA~89O$GCTQ%rF0zJ;_P&;28D-MZQ)?DR-ZUrOSUTsqL--Z8bl+^A7GL zZmr^TfyI`8d`E8Vf)ZbaD>IC@HO0lb%Ej2dL?$OV}j&=nabQ!xJgyDUYdb4CJv9Zi=(OW9yqxJNVdLA zBfqAvzz&A}@HQ}+Kz5fIZXS0tgR5BG!sZFyvU|AUuFWdK5UC0isUe0Ae~H?H;v_de zFAioGM>$!u>LE`N8DRnIX8P+7IKpT;g{)Ml<`f zRi78!eQ}LjrR=rkouXG)A*JbZ;L+2!m;appqGCJNRQIz6d^k68=LcK{8FhCn4U+}rI3({H3KB|= zT~g5GAtnaGL~teB<18p1@IyLUze+7JVSoNgM{Bbkc=|VCkMXx|5nQnW6$kawTjG=+ zS~2qPWR|>B)64g8D@}az42{L5^vKA+wT3lNB0cMN_fLc0Wl-iI(Yzh@&1m&1U)_i? z`dAt$aK&18EXPGX#f;adU3l=FLjYNq8f-^+5V5K+pC#Jn7<)AMza`3?VX%)2;hc-! ziw*TcACr&+WRMxm$$`YBAj%u?ob%K2>WWi|{qj69jO7cLqf2}CF7Y1qRjmmW$PIR0 zog>UtnTUJx(xNHWd>S* z{5Y+5to@Qlh}zAYH>bFm&}R{`pT3FvL{y_3;GY#&%SQwR3xHO|L1r z38m2YiCy&Vq5eCfe1>So5L0?5ckdPR8VOX$L3w?oJXuU(mOJ6{#+NuzY+f|Qxzzn= zmUmMTNYN&!f-}S~wK!4p<<6^~3)h-SZfiukL(=q{YrO(Np~$*KtU)AwisZIl=hsc} z9q@IYTTbu%rK{^aL#)4q1xtWd5tslcu7N0vtJgY`{hG_Vh3^e08!_?+iM|xS?(94? zJznu8IFQYcZ0Cg0nuqp0inb3b)cxEW82E9Z$UMu^){i*VDu#}hB*5P5+0{fxKwcg@ z{(}CfmeWj0MZM#_nrdaEeZF>b-Ob}SB35;jo^L^S^7x3nvUzm1r00==gWol3lW#FO z%Spq-E8{FaIrPVkPz)Y8C0M48502ck1pWbIjVV?%p?{jy+&oO}%ryZ6#buMRCfdhB zYuV8j2~On>GoGb8UIwPlJy1>^QDvw8v4dHTp6V)Y2yj;nEWFcU?lqD)O!pT3R;$g= zTf;nUa6F@wRzRFE{-c~jTqeRCA$%$^YEYGNg_b!+M0}>7#=)>!)4Tc!z0O|bwKu@o zKhb;qH1da*0_H8)GU2=OnS(OQwDP##f9t^mFq=A^1T>viZqaJ({Vy2ZKw=67zgHmfK^d_O{=rGo2rZ*7pZ^dnE+XW}e~-#v#K-X1T_j@^E}_W?N;P)f9o z4r7rsUeFb(Kd6}HaeI_G@!}SI@opWBO|R&xuE4Y$)A_D$M-}YTA!W3$%@_<1s%7u& zr7bm|MH{y6ET}sBtLnmlt?mm6Cazf~<5UKbFj`x`G$?Iz7!U zWOzZdkGVSY_$7h!FHcSh%v+qyKYn%L7yn$qNL+4qgVvDC*x%%C@%$qlN8B?`Q`2Fv zm}YddS?-96`rKEC`mT>ZOq)_ZIb3}(HkwrmS|w|Xn50|f5l@sy@8D;h@Y8O+rH69UQ^Wcc+Kx3_A_p)4`}$!#wR-P z+EShBMWz<E}1g&-%Lv~F)Xi?Ae2dsW$4mD6rvmb9*gxfLO#5hi= z?h>&eygz)Qz$}-yjE?TIs7;whC86QJT}`>Jo~|d2taD8l_X+dGw0FM+wT$3`N?HS( zM?XPxjSc=B;*8T-eK4WRZBl1E5=L=mRlSHNXFkhHK%{R;YToQ)VW?f>f`5&?WZ&{x z?$E^*z4G8kp8wH`_0-n5*?*7hb93o9+u42Kp?te#6l;Eog=3+nMR{=SnOkltu&InNsS3NN-a)Yzt-3dEX8uaq{CwFeJOu`Ym{mlvsZz) zG}PKO(2r8zb4x$RmikC#CcHmU5!$s-)8mILkjc}i13e8CqxQs zxzv<5(3m#7)10pmPqJ)zS|mAJyyv`m+TVydDYM4+7v^_4r?%Q-z~^M-=t(r}`HOUUU=6WLp7 zCv}=vO;ZiT?sfTFXgN3&wzWHT*9o5+qm>%(H**>dN@r8coQqlVXqyi7tq46=+Ic6c zBJ{x@KH)Y|v*CFMSqDR-4s{+!v#!2+dD z6%pDZe_3NI_g$=F{;@oj&qIW4)Lx6Xe0CHx{%x{Q{r3&8CnKL$vZIZN_HnoGU*9C= zmxMH0!6jYn@}JpsWxQ$F3rtuqi@N)%v2k&+<}Qrv8BL$cDck)f>YT$1PbTlhdB5=! zU+2sGDj)k;sJf7fabBwYHR)M>{ zI@p}Xe!uH(dayJ-G&R~hrgzw3@TtCDfGdv`wE?S`&CbLTr##7nGgNq`*B`9)4E2_O zu6B<4{X>PL)NY(;t}gP{e!Ap9jsA7klsg;*i_|p3iRybpgetlDehi%$igFJu6ZybPOmww|19RB~>q?r?v+cI(oYJwN3k^}}+imoLM1Xm^bJ)2OR& z6UJPfJp4eL4QG|g-|hu5J@z^`JUZI4SHS_%(?0L6xBUt^rV)4iYQUM;xdvY*H#37H z!%2y*(>=Nh_gpz->u%%^8vkmzyE-jLb=IrB&@DRh!-sCjQ%pwmT>4Xn`8}<<8R~wA0AsiI%lqG)`8-1#eA;|;xonH}9-eR>Sk~w;K6=1RL3Y|>@FzMd z?@4OgKuvDtnLgT#js!?yQe)AhZqI=1{K3gEZ6Sm4TYPFM&Py-or}`?!YGUVp1ZrDX zIOuyHINe)glbfqE&8?deLv#A)Bbkr#Z!-)!-;ZAxaa%0Whi!HH&U@$cI~c><4C^zb z)ON?HvK{0)GvGg_ZQV%OxwKqeo$NOLVNylpji`-LSdL4+Y__)#Ylv;Vw~_tw>pfnh z)ybva6(TdKL#q+#+gRo!3H~M71*7ctf4;*yIrlXz0P@hXUDMU0T_x6=laKLtiR$D`fUWF(S+M>VJzKB0L)GQhLrh?VlS| zD#d3sK$Q!u4EzXOnd5>Z4ca+(R@kelb@P?JxhV#nbQlR+r2enkp+AUd8PHvd!`cws z13GMz!Cge5ZT8+wcAOF5&%OW917Z}mptM)I-xaw|l@f%fAFH>qFPz;!UbW(_G37DD z=F~rtNsx4gRIJXWk>FTn$GP^goS}+N1*wUv`{}%(EWAf!{x^%&`3QxU)j+X)SrJ&0 zvWL7n?b>V`PP=7|hNiaDsOCc_*+vVK`#L#Ux_>^;9TaxUvYTJAYm+>7Ou}xq#Ug%k z|3bx5YwB=)mcvw~UU|+c!K_S!eKs{y=G#*G{)6h&0q&l$xr;w_X{FfYkLvH5@|d!? z_X|oE&1D+rmuxMvQjlWzvY2SQJ-1@g>c%TPb$V*g`TUu(6IMUV;tC(mNjcB3$GDgm zI(6RptJb+3@4-&XUQpsvFy^K+|1fu{?uK29V;={tI8%&!-FX_Arg_e4eO2)4{n8hy zTVELy>|N4!d+EP*o?ZN6p0(uF>Bj1)u1KRgnqy^u#T1e8uCsZm`aon|tKoGmt<~v0l`5+xUPeWC z|K2J0D+@Zqd;Qwf>khw#gW+|%cBnx4&&Cdw;%7#exER3LbZ(raVf(avvo04-v;i~T z`OC+R$QGiG+^MNVcBi~+f?YuDLCWoEvwwc;>N_t+h9%s}yYoJMx`^E?Xr*!3p#I}g zqCCQ91(XylG{S=aAvQR#4hv#_68nOMb~h}vRP{*|RJAgBr`8`Mq8o<8MYx*1J*2oF z^<_6QGPxNx8IATbx~1{_3oZk30M_4NLg9t=NT%68PjT2oFuZn?3Oh2WjxN5d>u_j> z*>7_XHnEZ44PcMq#do*|D#$kQ<$D@*r~2^{rxE@c+lu!3tRM#2`aX+B?}u|XchKP}!L^eM%0FtL7q z@XuqIW+axgm%&2%4)b236R=K)l6_UTBmtcZiYZ&kOipZTqL#;szC{OsqJHmP{~Uoh z5|>U*_a_U7)1A6_aTADirl>jqEc_*|pq*l)#cqM{vw%8IZEW7lWr_NO7KPf~m+4_Csu?og4 zuZMzrxv`i?bm!kaT4zU^QZ+?lk3~{69Y*A~37FBS?=D=OL-C&9=gXo>tk%>(&l$O( zy>rcGUnJ(5OV-8M?|s+!q3y8|8rcJ7V2Gm7PXY0qcbHF~#pU%j-?kvIr_Jc>pi7E`7a%4rV<54-1?C`75-a@_(z1 z`m&k%a9C?lP`_J)({6m!Lb@O$9-xKIEt$4{zIE|igjN+oOZAqVQs% z#ZGfWHC&3tRZ!Di`T$_QZ2nBLxro!6VI1d#e!D z`Pmj@@2{y1?{qz4N3-?oqsm9!+m|b-mxfdAZ2JV&Y0ze591kAFbVPr7J%JD>bUn`U zcx5C8ym=(fl5nN!o$ivRZ97+{)nQj5nsq@p!C*T6Y$=pM;P~?)4@?b6>tzdM}3dG-ObtClhQ;q(z||@&WTy%dh+L5jQ{8xS-hYVKN0sWW%NuBax-$6&F_1R z)1x(CTs&rrSlq1VMq4XH`lgS|{+)QJtg!mC^FM(slS{A1i*>zp=B|!(AgMg zR;t2R@WTws1HRPXDe6+yktk*}x;F;w^NOet+et8MMF(ofgpJ!wI&OQgIOU({bd2H; zbzLgb_L%4t*Pw1FDB;g^`J1)FZPM>xU&#HY62ymzac|6T9iQOM9BoN4ZMHbsQ~g~( z%uWxk1IyRkM&=FdU7-ETR;EXQNQ?)1CRp??h0EgH+fz>+ZM_p~T%{0w- zNSiE){{1d1!b|M_eCXWj!s5Fy`7q0}3>MB7J^_JTFg@9G2ul5TX7#ON2sJMXR&DJN zYn|`^!-L`_l(Fi*BS()ej%2VGSOQ72rs^~I6e;X%A5rxWWVh&8MS_AuD&L&uMgk5H zCOjhYOQ1j}x5Ddcb8Nej#|!(R(0Wrfm+o=A({Q$ohu28Kyd0};(erQ7(KoY=W}GI0_~B)UDE zMw5#QE%z|;sfio+emyJ~1g92m2ajyc8gIFB`>lnRhK7b{grL9h?d3wsDMt4wt)+(C z^WVW{h4Y)V+6BKe6=H?8oKA%t(@t@oEG+3PTwk8(Zh^+Qn|kp!#UZ}%wCmLVZWE_O zdduD>+W+pVa=H-lEFtnyVz~VrW7RFV_Y)7Gs2m%_NI2*6J}-ebe>7(?FXe#nKmW0S@y9)L1e~@ zk3Z!%%*f0uD#fp6{StV=97|AaEuTqUCYu=;I!XX%ukBeH>b+IF@zUGfF}ff%f_(gM z1#iOz@1a+&=)YhWes}N7E6og>@@eM#?iSaoKXG#IIQTf)_D_9ws^ip))cl8`^()2C zkGqx!O~Rqk$9^7D$Vuy7h*T-b7kw;T=L4#=V}C}6HPV- zcEHggZW9i%Ig?|Lb}*=j4Zq=j%XGM3DvWAA&NwixevtK>$-T#6 zmHpLZ;2y!H#BF6cA>qfpvD~@u(}rOcZzP1j+W!y`Fkk*ba48QJ8+&f$>Rhq#FehV< ztx{q};}TZoo0`o+r2wcN{ za=B!HQA_mh7cF&()#5#!cj`E%=L0nDa^@#Jw}#r)bGk`K9(_SJ53$n}IrH3w{Wo4s zK1+f<7yJ{duWH$gjDgy>Zk3I=rFR3)ce1y$FMJPkb({HbPErv3SOx(th=O$g=+nxA zh^i`KHK>6w<2b+H>xD=5!lL?l^TkpKMKXQNnDuV(I1%Qyy1-6oC$w6Rgf)D);-L6WFEc5vl+MRCWcDWgYUg~4cJ$RXdAF1v3OP{q@I!izq4uzTX z@`dh;5w|9AG%R;!6tOujkLJ>9$KSb-c1=lXVn}=0wzeqDeQNx4hzD<{I1Bspb9=U5H3xD`+v>&&8 zN!OV55x&qHDk}AH&&1`{OcR6JCufboSpL*#^kRLXhBi97C{-%X3t-^-ht{s^Zm>Z} zvGx=6V0_(;@P{Ni@}NQJ&xn&H2%Y`@v+V}-fyqbz_#r21)B3)BmxOIoMC?QO*nxpc zAj~&L-JMa%UE431x7-CW2Z}vGyadV^5HHw-GGBO~#F90C?2#}Ly+yHDw_y-N>@1~` zb1FENWdG1aJ90bG*mefbVe*{`4fIo}`mc95F>>xNMHipX=wLx9ch&<2K8@;}4>lQG z*1*LmbT9y6vbES08h+3ScaaTVuwsm4IlH99sHnZ2f}u>kCFX{>?^s6 zDFBi%G-zbWBrFQjgdR?p$);m%LBs4b5|}4-MEvnV9m9%}$(Xx2 zx9K55#0m5e+N;p+)7i~m!;5ewUup^#**48=vSmn`l_tgW7x6&NpTSYqo165g<{44E zM}jV+ZPCv+2FIsSM+a`fKLFQa`$hBH8%+lGRGok+-sb|JHQ=km2Cix~^Y$QTD#=jY;ejdtP2nL%^R{#A+#}Bre*_Hh_i4OF2-}BH)5e4fW;S32MC+UfH~aA+ z$s%nm@XcN2HGi$8Xp75pqhP4uYksd8JSrjP;pVa!_N4+k^%202 zPg2K*+m1Bzhp4`aJ^hWyZt;7gW%B4tCHE1P$;_Uc*^cE=etmG;MT>dnx7ikRZbWfR z9)r+~+_Pr|#97Xn=n-%{q6 z>W}Js=6gnOiIutngw?S^kIGyILHRVI2%hZ*qxy1$??Er@h2V{Hv)aaED!O@Z+$ji} zAYqR~A3qTplthiR@!1c3-ATE|L7D(4tgbQ~qW*n-U zfuESUbRqZ@gZo7u1NndsdP99bizz`nuI=QLMqz^IhJWr!)N^*gE_U#~{+5g%v0g1J z?Tl=~t9|WO2y<0JSYYZ)#4MG-`|_NxI{{Cy$p<`rZB;n0w^{fB@()6LY@#bwezW_l zBIQc`l?}o`x*>(PQZ{qWZGQTE!B8}Y@}@sRhb{;Q8T89LARfwn}Z+4H+Tw}#gQ`xgdBGkjgqnSz(Jyn$V5m`nyaEfSC zSTfOGj~5))Lih-rC^Si%o(8Em>apCUKJjT((SC@iQ;Ae(6EfC&yX1|N2TArZ0KRyi zs%o`Pon*%2zC`ekfoho={S>-3x{m_Nn5cH}RM6Lpa0{4Nexo`m z9PmL-$7;njL#M=#UH(r?w9%-5dio%qURUL-#*K1`KoZsQ*1#my@s$|}ljCnv^`sU5 zD3v0VcM~Kh2bXrux5j<9lbD-`N*v1WFz${bEJV(!#Aqcp9*A*Vd=aZ{Ge>Lg;@nev zE0}e;PN8{3DU+Conbxv@KqtSI!EShNzIdSDO$bnTeOqsC}VTC)bu6ujlrO#9%foFjSrr<_1es!_Qf+Kb-ribuBO;Pcp#>W>aJ z$6XVRL!F986}0AC^?t|+iQRvQ(r(uKQsm+66qX|)ls3viqL>dGVApY0EeaNKEY_1k zh;O|2!y9vjH>d48M*G;ZoT$*NL(wiNLn@QKAF2WH_5nt>mA@PW(TSfPu}-dq`kue| z-8v%wa}^#|7nWG=FSfj$^X%EPU~Nb9Kwk451r^K9%2uzAInB4m+vTiUrX|mrkFv}) zF27)>PCY5peQ{ss2lKw!slac463z!(XwBGLRhLmI2Z%R?xrF&~`@&TU`(wIoL9isf#f^tL-( zxzqcu7o&`V#O&fW?E_+bA@1LAU)}FedwQ;wFxwCNbflF6UkLoNJNE|@CpP>UP8rR^ z@LF8|Y`<&jw~WWJokt8?Ct>e&FgVkEPes9rJNE~;JjQH#R2Nr9Kf&d^vyC^}CFk8+ zQx+Bq2;2Mi=n1?QwfjB8&A#|&q1{pc^1w)}i$xypt;}exu=q?LJ6l`g`DP;YMWfjn zV^tA%t3oT2%+!{(Wk&tdZ!XNtDP*lScHL9ZTyA9_&75NH)_3QOoUCs(cb)9W)b(yR z%`0&-CsZo=@x}_QIM;nXZEPm`H|}X7<1QD6yMJeBSSZ8q>(kj(W%mFuT$8s zpjRQb`ZnjBsXR-LcoX4DzGD|{I z5{~U-W7*vY#in`b}P+!85mt7+B6k-DfQVcY)1`!hk+kM6zE zcUg;d`|>IJ56@c5U`o*+LEymvUbHb}H*#}pT4X=AIPie$pjnz*;iA-cC5^q+&w=6G zpzbe^8o_&8A6vqbyt?gbQL$x_7NH~hja759Nn6al#N)Dc5lu2D|5J(O$sK%?D&OJ~ z-0bRH`?}g8s&%$7*iSFTY$EJHjJPe~ir1en7izkiwN^URg{4k9O;ndX>@(;-3ZTS4-L1dWzPhsPPS@wf%AtI+f>}QtpJ)m5hX4%{;SLBwWBi}g5VLLci zQsy9L)@T?U!+OdN@`B_uS4vcW$`cw-EU_kDAq0GBICeATkQJ|UYlL0uEzeh4Gqu5U zS*HhoD13D1-9=ts%hAS!fe*d(qk77D8bmD(YF5?Ftz#l{m%Ve({Fk?&jWX+nL+{(S z^Ro&a>6_%3HPooJC$!Uut;})<9@B1&QeGMxOLl4CQ)72pd1#k=!sv^a>8b9yf%e23 zHC;PK7y69;6vg9Evh!NeB zn|Vs-Bgvs!nmvC&f_S~9ItDy*=bH9OEl+)t8O|P+`pm@dx;%7BK+<`vtff^f$)$t4 z-MK%@JZG|oy~VLfiB&DNzwT3O_xT)`_A}fqr~1>P_!rwiBQRYYtw}9v&K2hqPlM9k z%u>6z-t{`4GBz{$S1Qe}$})C!dYh_CUk9kQ=eoA6KI!{%Mw{JAqXd>mT^@S5b?Zkx z&d(1Zh~5u7t`BDg>c4*alWGokI86IzR*0JYe8AP(l+15-?Ye{T^PTsyEE;7yIj!6u zXum zI?dN+St>8*8GK!Q=$xwe z%2Jh7t5t0>ZI+l#{lb59RE(@dj=;#F9ls@lO;~Z4Z4KY|`Qq%_*(x=bv%}c3#|~&O z{qkdUottm1C-j+EWycV`JB%dyC|BG&*jYMHAGW5fk5E~g)JztKE`?@Qda2vqBs`RQ zuNZ)A5Yn-u0(M^t1*^nHJ?8crdm^M|I(-KeLp4}vvdu~>WP*b^{}^`$X?F@1!7`z% z>FXxOZ#qRvWPy~v0_Nto6-6544`RXbpchHgcR-S|0-EovHNgu|EU%fgca_0?m6NkV z0@V&^t6#6UV|iGANMqkngUPC`S=);d! z{prLSXN?vawxqrE2iM-x2S5`&ioR#uGVYAO7gc?=k!HBO!+_LaoaLJ> z`0^e5*CRZLsT2)%)BA)ygO}dp-V(oEGt;mb1sF^Gtolb$RKq_na9CUDtyZ`t!B*Xmy@B&8UpFt4A{mMglPLug{ZBZnd zueD&f<0)X$yW^g!t??+*5|fJ7gDt&9m~{Wx%k3mCBr=C4>|?=pV;Zn^hdOwzWM1gm z(eFbf2Op3lIc_6PAtazfLF6O@h=)etacpE`x95Bw6R9<}9L5Q9X<386>tOihHP-tJ zFZ>BK;lzl~B~P3rc_t+g;^1_01FIhfP2P7LPNb|gsfQ*v&BMCjOCKo|FWDyt+#~=3 zeq}}offK<=7oi40L*?r|E9?=h%HST^?4gQHJN>1hcH}?=G6-fBy^0cEb&CEEeS%(5 z&zeHTH76m>(9(KP332cec(`SE8$RBe(!1cwCNt6rjw$9d zy7LBumVs$=^0y-b+Q;qAUN61Qh#;s(5pw}0vumFm_}}>b+sndExefS6@~I{F|4G+v z;L8++Zt0Bi<41Q0Bqea&n~G#Uv7F1v1*=+Z#`FbS*KC}qh| z(c7PqI9)sgRcylexgD{|`?K8xKr=vuhST~sO6HufiaLqXYgAH{LMi+Jl|f(Wq6{*< z@oqbpjwbpgc;(Xf)%R}NCB-^ZUYCb#7Z8<4im8X!o8Sd^^dqj&8Q3ZA*;41f(G%05 zj$25_(V4(?qk3=Gnfu6BTpf{%@-70Wytt%6ep9H4MKZwwR2O(LJ(BK4W;Rl<*e)3T zY4bH2lE3wM$7}o=ICR25mKNKq*~o{m#c>+Z62y1XR{_X)8l_z@W8Z_}J2pUFKy+zC zvk^2YrkW>52A~~Q1>#M&{t6y|42#{zX^EhYwY^Fv#{$;69t1x)+VfRB#e0r$#Ft+m zk}eu~^Pp2u7VQYJ(X}ZeEGh``vg)Mf8%{PGaVO&Y-JGz?TBw(Cb<@|#xP>y|IVc%t z(d#_x2q*ne)W-i2=k9n?uEIlf%GXDK&mI1rtOLn7KxT&BO*t)1)`5>V=7d7mQKwxb z>p(#y1&7>MI{k58_-h2Qyy$&?XV;%oygwSwk9>9$0)scdbO?}};Cr_B6N7};4nnrV z4&n<~CPe6*0@f-{rE zbTIBW#USYVXyMRp8<2yFGDi*3W8!#VrT=(WgRJWT;TTu+(Zg5_k~&svmi=?RP4$s* zedwC=23Qcap>;$xMPwPsmmo&ZPJpBoT6g=C_aBZt$K4>d#tH%gez!2*SVN2DKE*Y1 zDkAC3XaDe##HyM%e0^VvA2=Xg@iZxv7M+XZUZ2Mxa82~KAQ^;H$O#i9bjCr9ftAan@>_Q zYGEn=p$=q9p=4@pIjLv*$!cY7m>vl8zSJL2E?w~4OfqO)9E08apVzRh0W4`m1}DGA zJVW35CY$&2hP>ZDEVBh~Lj5|5A4rg4aDbR%v)=AEy&^UKD7-nkABn_}LB#lQqO$2O z`2nDEncq}5jq`cC2v`Vbp#_EMN0p7?@2cjRK(9}{p^2nZvdS&Db5s|88Z#qv{>kvB-9!Ss!=l_!Y? z-e7w)oQNb1sRM6xSsw}@ZG5hyT-Gu1;XEMJ%cUL>Ga;^xU9&BCX~YtWe-Q-SYKPWC zQfAir!t4S#MTUKusHJaVP1lizz=;Dm(ZS*FcX#x!8zIDY_aSMjI6Hoy5rYNPA|Rsy z`5|}{^n*^mhJudk=Es0_2v<+giU>8lTiQGZBJ9hQLN$1t?kTL<2LB;c!i!LS$i9e@ zX(H_UhXpCB4~CbzBQc(w?@eT7MwF`&isy%bk5MvNa|)#F9}<{7SMo%``d5P$YhXla zBS#cJPZf=5`A4uU@4eREv_3P#-BpN&{%7xs2x#qvyqiS86p_uVl@W0=v5I4HbtF!~ z%Ylh6B-_1~ZU-yq3~?I{y zTJAB_Xh*sAg?NZW zgx-Nsp8VG1L3W%d-gAXBk>SPnBR*6j<56T|m%M{QoD0Srpvh8Fe*#UIx6f}vDcH{d zjjteBOO1@j*TTG{ag1OuE}F~#HpTlR;c$|gj5qjE4C9>Km2+4btGf9y#%DLs`La;P zqLAhqJmf|tU}e@Od5@A|AU}_%Gf>Q<_uRFQ%;#jLfxOFIv^zw);;tBNY!|`2@JDt; z^PvG6Dw7Ah$-N+x@G(KP(idj~(&m0{wi|HZB8~3GRO!If9#YG#^CX}shO!K{rt#%K z0wL}m$qjn;?}$b`vQJ>9d{{L{ZCL{nGO7ECX?~lNK#_Nf%qZCUfvIE5fHzLGWB;yk z`NozoB)6hulICP=h<#!B(Su~L_JYZyr0D92G{HJjSg#wjK3AX#zfC!D^(OCPkcRmW zh(?n)h2$Vi^62nwB90Ik7Jrgnh=B=u1)ID!aRjmtpgCW5l{Yvx5er*v0NVrV#5Xfl z^vf3n@^+j-&%h>KtxWkpx%EdvZ~@eG(a44y&9f_; z#womo9RV<5%l+j~&4yFtsbMoHkpu)h1%SCb?UNcvFi8jvUgM$=odebt+G~E~%`>tB zdc+V%;)N$6z)knn-(yJl1;18w4Fi*itDc%RLqZq+;*0%cyd}UcQ}M}YVw41j6{09x z4|0Hog_3E_dXB7(cmt~Fjr`iYKp>}f*EnLm$kIba6f!;W*1($8$?X|jSV;fQT~qT2 z%sxk;v-c^=rzjG*b^Z~~LRnaaqFS#R`%~1eCyxfTDLd5Sa)7WVBY^4aD~YBmSr4;0C&|F%(FWGipO$Bap z9{n8ab+C6A=;Ah~%hQ9Vk#>IQFN0x2e_n?NAxd2Wv2 zkZ2$%4K@;8_OgUA7nzaPI4XQA-kpNwv~@qjI*XBh_|W0yQV*^v4l;B^V6@OYF)BpG zv7RD@Afozkcsp5f{9__%Qaq3>*T@^6Gwnrn|tCYZ; zd#Tzs6vx2cDq?)22PFL^vuffx^VcfmDHA&m*8)U4#ycR38uCE#2x@5Ut2&UI&&rlB z)@T-s`-SiorN3OlmMv&5S?RM-K>&Xp=z1-EB#0=GYtay-A0KI8h23^H6p%k~yt8tB z=t4*}qA!qBJ_!SE=hd;f=kAjVmrU!kP92&IA@&TL-Q@`es2egWeyi(gFiWoXBR5INY zACR7N!SD8Nz)j)H70wKc5Exj+VaWlT2ANO5AqXrEf;Ptfhu76E1|Xk8)C|@XFq0f` za^1qhIHHe|J{y8JLkHJ$U)MvzST#^ohK+_U>tu!q2oV9C!1FJCUeuC=s`v%&7J2p) zV0jekhLO_3l=dmEvmTZcI(zwN>jgjzCLJxh!NxwccmnN~Ed)Zgq*UgXEnBuC4D;WX Y)76429$ADLc(O(Ig1mIhIh_ap2aD&2; exit 1; } +command -v dpkg-deb >/dev/null || fail "dpkg-deb is required (apt install dpkg)" + +VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)" +REVISION="${DEB_REVISION:-1}" +BUILD=1 +[[ "${1:-}" == "--no-build" ]] && BUILD=0 +HOST_ARCH="$(uname -m)" +# Portable builds: link against an old glibc with cargo-zigbuild when available +# (pip install ziglang && cargo install cargo-zigbuild). GLIBC_TARGET=0 disables it. +GLIBC_TARGET="${GLIBC_TARGET:-2.31}" +TARGET="${TARGET:-}" +ZIG=0 +if [[ -z "$TARGET" && "$GLIBC_TARGET" != "0" ]] && command -v cargo-zigbuild >/dev/null 2>&1; then + TARGET="${HOST_ARCH}-unknown-linux-gnu" + ZIG=1 +fi +case "${TARGET:-$HOST_ARCH}" in + x86_64*) ARCH=amd64 ;; + aarch64*) ARCH=arm64 ;; + armv7*) ARCH=armhf ;; + *) ARCH="$(dpkg --print-architecture 2>/dev/null || echo amd64)" ;; +esac +if [[ -n "${BIN:-}" ]]; then + : +elif [[ -n "$TARGET" ]]; then + BIN="${CARGO_TARGET_DIR:-target}/$TARGET/release/active-push" +else + BIN="${CARGO_TARGET_DIR:-target}/release/active-push" +fi + +if [[ $BUILD == 1 ]]; then + printf 'Building release binary %s...\n' "$VERSION" + if [[ $ZIG == 1 ]]; then + cargo zigbuild --release --locked --target "$TARGET.$GLIBC_TARGET" + elif [[ -n "$TARGET" ]]; then + cargo build --release --locked --target "$TARGET" + else + cargo build --release --locked + fi +fi +[[ -x "$BIN" ]] || fail "binary $BIN not found" + +# minimal libc6 version from the binary's versioned symbols +LIBC_MIN="2.31" +if command -v objdump >/dev/null; then + v="$(objdump -T "$BIN" 2>/dev/null | grep -o 'GLIBC_[0-9.]*' | sed 's/GLIBC_//' | sort -V | tail -1)" + [[ -n "$v" ]] && LIBC_MIN="$v" +fi +printf 'Binary %s requires glibc >= %s\n' "$BIN" "$LIBC_MIN" + +PKG="active-push_${VERSION}-${REVISION}_${ARCH}" +STAGE="$(mktemp -d)" +trap 'rm -rf "$STAGE"' EXIT +D="$STAGE/$PKG" + +install -d -m 0755 "$D/DEBIAN" "$D/usr/bin" "$D/lib/systemd/system" "$D/etc/active-push" \ + "$D/usr/share/doc/active-push/examples" "$D/usr/share/active-push" +install -m 0755 "$BIN" "$D/usr/bin/active-push" +strip --strip-unneeded "$D/usr/bin/active-push" 2>/dev/null || true +install -m 0644 deploy/active-push.service "$D/lib/systemd/system/active-push.service" +install -m 0640 deploy/environment.example "$D/etc/active-push/environment" +install -m 0644 deploy/nginx-active-push.conf "$D/usr/share/doc/active-push/examples/nginx-active-push.conf" +install -m 0644 deploy/active-push-autodiscover.conf "$D/usr/share/doc/active-push/examples/active-push-autodiscover.conf" +install -m 0644 README.md "$D/usr/share/doc/active-push/README.md" +for f in docs/*.md; do install -m 0644 "$f" "$D/usr/share/doc/active-push/"; done +install -m 0755 tools/zpush-import.py "$D/usr/share/active-push/zpush-import.py" +install -m 0644 LICENSE "$D/usr/share/doc/active-push/copyright" +gzip -9n -c CHANGELOG.md > "$D/usr/share/doc/active-push/changelog.gz" + +SIZE="$(du -sk "$D" | cut -f1)" +cat > "$D/DEBIAN/control" < +Installed-Size: ${SIZE} +Depends: libc6 (>= ${LIBC_MIN}), adduser, ca-certificates +Recommends: nginx | apache2 | rust-proxy +Suggests: dovecot-imapd, postfix, radicale +Conflicts: z-push-common +Description: Exchange ActiveSync server for IMAP/SMTP, CalDAV and CardDAV + ActivePush lets phones and Outlook synchronise mail, calendars, tasks and + contacts over Exchange ActiveSync (2.5-14.1) with standard IMAP/SMTP, + CalDAV and CardDAV servers. It is a Rust rewrite of Z-Push with a built-in + administration panel (devices, remote wipe, policies, live statistics). +EOF +# Z-Push can be installed side by side; drop the Conflicts line if you rely on that. +sed -i '/^Conflicts: z-push-common/d' "$D/DEBIAN/control" + +echo "/etc/active-push/environment" > "$D/DEBIAN/conffiles" + +cat > "$D/DEBIAN/postinst" <<'EOF' +#!/bin/sh +set -e +case "$1" in + configure) + if ! getent group active-push >/dev/null; then addgroup --system active-push >/dev/null; fi + if ! getent passwd active-push >/dev/null; then + adduser --system --ingroup active-push --home /var/lib/active-push --no-create-home \ + --shell /usr/sbin/nologin --gecos "ActivePush" active-push >/dev/null + fi + install -d -o active-push -g active-push -m 0700 /var/lib/active-push + chown root:active-push /etc/active-push /etc/active-push/environment + chmod 0750 /etc/active-push + chmod 0640 /etc/active-push/environment + if [ -d /run/systemd/system ]; then + systemctl daemon-reload >/dev/null 2>&1 || true + if [ -z "$2" ]; then + systemctl enable --now active-push.service >/dev/null 2>&1 || true + echo "" + echo "ActivePush installed and started." + echo " ActiveSync listener : 127.0.0.1:8081 (proxy /Microsoft-Server-ActiveSync and autodiscover here)" + echo " Admin panel : http://127.0.0.1:9091/ (ssh -L 9091:127.0.0.1:9091 server)" + echo " First administrator : sudo -u active-push active-push admin setup-token" + echo " nginx example : /usr/share/doc/active-push/examples/nginx-active-push.conf" + echo " Import Z-Push config: python3 /usr/share/active-push/zpush-import.py /usr/share/z-push > zpush.json" + echo " sudo -u active-push active-push config apply zpush.json" + echo "" + else + systemctl try-restart active-push.service >/dev/null 2>&1 || true + fi + fi + ;; +esac +exit 0 +EOF + +cat > "$D/DEBIAN/prerm" <<'EOF' +#!/bin/sh +set -e +if [ -d /run/systemd/system ] && [ "$1" = remove ]; then + systemctl disable --now active-push.service >/dev/null 2>&1 || true +fi +exit 0 +EOF + +cat > "$D/DEBIAN/postrm" <<'EOF' +#!/bin/sh +set -e +if [ "$1" = purge ]; then + rm -rf /etc/active-push + # device states, statistics and settings + rm -rf /var/lib/active-push + if getent passwd active-push >/dev/null; then deluser --system active-push >/dev/null 2>&1 || true; fi + if getent group active-push >/dev/null; then delgroup --system active-push >/dev/null 2>&1 || true; fi +fi +if [ -d /run/systemd/system ]; then systemctl daemon-reload >/dev/null 2>&1 || true; fi +exit 0 +EOF +chmod 0755 "$D/DEBIAN/postinst" "$D/DEBIAN/prerm" "$D/DEBIAN/postrm" + +mkdir -p dist +dpkg-deb --root-owner-group -Zxz --build "$D" "dist/$PKG.deb" >/dev/null +sha256sum "dist/$PKG.deb" > "dist/$PKG.deb.sha256" +printf 'Package: dist/%s.deb\n' "$PKG" +dpkg-deb --info "dist/$PKG.deb" | sed -n '1,12p' diff --git a/scripts/check-wbxml-names.py b/scripts/check-wbxml-names.py new file mode 100755 index 0000000..c0f137a --- /dev/null +++ b/scripts/check-wbxml-names.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Verify that every literal "Namespace:Tag" used in the sources exists in the WBXML code pages. + +Element::new() panics on unknown names at runtime; this catches typos at build time. +""" +import pathlib +import re +import sys + +root = pathlib.Path(__file__).resolve().parent.parent +cp = (root / "src/wbxml/codepages.rs").read_text() +namespaces = re.findall(r'"([^"]+)"', re.search(r"NAMESPACES: &\[&str\] = &\[(.*?)\];", cp, re.S).group(1)) +body = cp[cp.index("pub const PAGES"):] +known = set() +for i, chunk in enumerate(re.split(r"\n\s*// \d+ \w+\n", body)[1:]): + for tag in re.findall(r'\(0x[0-9A-Fa-f]+,\s*"([^"]+)"\)', chunk): + known.add(f"{namespaces[i]}:{tag}") + +pattern = re.compile(r'"((?:%s):[A-Za-z0-9]+)"' % "|".join(re.escape(n) for n in namespaces)) +bad = [] +for f in (root / "src").rglob("*.rs"): + if f.name == "codepages.rs": + continue + for n, line in enumerate(f.read_text().splitlines(), 1): + for m in pattern.finditer(line): + if m.group(1) not in known: + bad.append(f"{f.relative_to(root)}:{n}: {m.group(1)}") +if bad: + print("Unknown WBXML tag names:\n " + "\n ".join(bad)) + sys.exit(1) +print(f"WBXML names: OK ({len(known)} known tags)") diff --git a/src/admin.rs b/src/admin.rs new file mode 100644 index 0000000..34e0c43 --- /dev/null +++ b/src/admin.rs @@ -0,0 +1,1254 @@ +//! Administration panel: authentication, JSON API, live events (SSE), Prometheus metrics. + +use std::convert::Infallible; +use std::net::SocketAddr; +use std::sync::atomic::Ordering; +use std::sync::Arc; +use std::time::Duration; + +use argon2::password_hash::{ + rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString, +}; +use argon2::Argon2; +use axum::body::Body; +use axum::extract::{ConnectInfo, Path, Query, Request, State}; +use axum::http::{header, HeaderMap, HeaderValue, Method, StatusCode}; +use axum::middleware::{self, Next}; +use axum::response::sse::{Event as SseEvent, KeepAlive, Sse}; +use axum::response::{IntoResponse, Response}; +use axum::routing::{get, post}; +use axum::{Json, Router}; +use futures_util::stream::Stream; +use serde::Deserialize; +use serde_json::{json, Value}; +use sqlx::Row; + +use crate::app::App; +use crate::backend::dav::DavKind; +use crate::db::{self, DeviceField}; +use crate::util::{self, now, sha256_hex}; + +const SESSION_COOKIE: &str = "ap_session"; + +// ------------------------------------------------------------------ static assets + +const INDEX_HTML: &str = include_str!("../web/index.html"); +const APP_JS: &str = include_str!("../web/app.js"); +const STYLE_CSS: &str = include_str!("../web/style.css"); +const FAVICON: &str = include_str!("../web/favicon.svg"); + +fn asset(ct: &'static str, body: &'static str) -> Response { + let mut r = Response::new(Body::from(body)); + r.headers_mut() + .insert(header::CONTENT_TYPE, HeaderValue::from_static(ct)); + r.headers_mut() + .insert(header::CACHE_CONTROL, HeaderValue::from_static("no-cache")); + r +} + +// ------------------------------------------------------------------ password helpers + +pub fn hash_password(pw: &str) -> anyhow::Result { + let salt = SaltString::generate(&mut OsRng); + Argon2::default() + .hash_password(pw.as_bytes(), &salt) + .map(|h| h.to_string()) + .map_err(|e| anyhow::anyhow!("hash: {e}")) +} + +pub fn verify_password(pw: &str, hash: &str) -> bool { + PasswordHash::new(hash) + .map(|h| Argon2::default().verify_password(pw.as_bytes(), &h).is_ok()) + .unwrap_or(false) +} + +pub fn password_ok(pw: &str) -> Result<(), &'static str> { + if pw.chars().count() < 12 { + return Err("Password must have at least 12 characters"); + } + if pw.len() > 256 { + return Err("Password too long"); + } + Ok(()) +} + +fn valid_admin_name(u: &str) -> bool { + (3..=64).contains(&u.len()) + && u.chars() + .all(|c| c.is_ascii_alphanumeric() || matches!(c, '_' | '.' | '-')) +} + +// ------------------------------------------------------------------ sessions + +#[derive(Clone)] +struct AdminSession { + admin_id: i64, + username: String, + csrf: String, +} + +fn cookie_token(h: &HeaderMap) -> Option { + let c = h.get(header::COOKIE)?.to_str().ok()?; + c.split(';').find_map(|kv| { + let (k, v) = kv.trim().split_once('=')?; + (k == SESSION_COOKIE && v.len() == 64 && v.chars().all(|c| c.is_ascii_hexdigit())) + .then(|| v.to_string()) + }) +} + +async fn load_session(app: &App, h: &HeaderMap) -> Option { + let tok = cookie_token(h)?; + let th = sha256_hex(tok.as_bytes()); + let r = sqlx::query( + "SELECT s.admin_id, s.csrf, a.username FROM admin_sessions s JOIN admins a ON a.id = s.admin_id WHERE s.token_hash = ? AND s.expires_at > ?", + ) + .bind(&th) + .bind(now()) + .fetch_optional(&app.db) + .await + .ok()??; + let ttl = app.settings().panel.session_ttl_minutes.max(5) as i64 * 60; + let _ = + sqlx::query("UPDATE admin_sessions SET last_seen = ?, expires_at = ? WHERE token_hash = ?") + .bind(now()) + .bind(now() + ttl) + .bind(&th) + .execute(&app.db) + .await; + Some(AdminSession { + admin_id: r.get(0), + csrf: r.get(1), + username: r.get(2), + }) +} + +fn is_https(app: &App, h: &HeaderMap) -> bool { + app.boot.admin_tls.is_some() + || h.get("x-forwarded-proto") + .and_then(|v| v.to_str().ok()) + .map(|v| v.eq_ignore_ascii_case("https")) + .unwrap_or(false) +} + +fn session_cookie(token: &str, secure: bool, max_age: i64) -> HeaderValue { + let s = format!( + "{SESSION_COOKIE}={token}; Path=/; HttpOnly; SameSite=Strict; Max-Age={max_age}{}", + if secure { "; Secure" } else { "" } + ); + HeaderValue::from_str(&s).unwrap() +} + +fn peer_ip(app: &App, peer: SocketAddr, h: &HeaderMap) -> String { + crate::eas::client_ip(peer, h, &app.settings()).to_string() +} + +fn err(status: StatusCode, msg: &str) -> Response { + (status, Json(json!({ "error": msg }))).into_response() +} + +// ------------------------------------------------------------------ middleware + +async fn security_headers( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + req: Request, + next: Next, +) -> Response { + let nets = app.settings().panel.allowed_networks.clone(); + if !nets.is_empty() { + let ip = util::normalize(peer.ip()); + if !util::ip_in_any(&ip, &nets) { + return StatusCode::FORBIDDEN.into_response(); + } + } + let mut r = next.run(req).await; + let h = r.headers_mut(); + h.insert( + "Content-Security-Policy", + HeaderValue::from_static("default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'; connect-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'"), + ); + h.insert( + "X-Content-Type-Options", + HeaderValue::from_static("nosniff"), + ); + h.insert("X-Frame-Options", HeaderValue::from_static("DENY")); + h.insert("Referrer-Policy", HeaderValue::from_static("no-referrer")); + h.insert( + "Cross-Origin-Opener-Policy", + HeaderValue::from_static("same-origin"), + ); + h.insert( + "Permissions-Policy", + HeaderValue::from_static("camera=(), microphone=(), geolocation=()"), + ); + r +} + +/// Requires a valid session; non-GET requests also require the CSRF header. +async fn require_auth(State(app): State>, mut req: Request, next: Next) -> Response { + let Some(sess) = load_session(&app, req.headers()).await else { + return err(StatusCode::UNAUTHORIZED, "not authenticated"); + }; + if req.method() != Method::GET && req.method() != Method::HEAD { + let ok = req + .headers() + .get("x-csrf-token") + .and_then(|v| v.to_str().ok()) + .map(|v| util::ct_eq(v.as_bytes(), sess.csrf.as_bytes())) + .unwrap_or(false); + if !ok { + return err(StatusCode::FORBIDDEN, "CSRF token missing or invalid"); + } + } + req.extensions_mut().insert(sess); + next.run(req).await +} + +// ------------------------------------------------------------------ router + +pub fn router(app: Arc) -> Router { + let api = Router::new() + .route("/api/overview", get(overview)) + .route("/api/timeseries", get(timeseries)) + .route("/api/stats/hourly", get(hourly)) + .route("/api/live", get(live)) + .route("/api/events", get(events)) + .route("/api/devices", get(devices)) + .route("/api/devices/{id}", get(device_detail)) + .route("/api/devices/{id}/{action}", post(device_action)) + .route("/api/users", get(users)) + .route("/api/settings", get(get_settings).put(put_settings)) + .route("/api/test/{what}", post(test_backend)) + .route("/api/logs", get(logs)) + .route("/api/audit", get(audit)) + .route("/api/lockouts", get(lockouts)) + .route("/api/lockouts/unlock", post(unlock)) + .route("/api/password", post(change_password)) + .route("/api/logout", post(logout)) + .route("/api/sessions/revoke-others", post(revoke_others)) + .route_layer(middleware::from_fn_with_state(app.clone(), require_auth)); + Router::new() + .route( + "/", + get(|| async { asset("text/html; charset=utf-8", INDEX_HTML) }), + ) + .route( + "/app.js", + get(|| async { asset("application/javascript; charset=utf-8", APP_JS) }), + ) + .route( + "/style.css", + get(|| async { asset("text/css; charset=utf-8", STYLE_CSS) }), + ) + .route( + "/favicon.svg", + get(|| async { asset("image/svg+xml", FAVICON) }), + ) + .route("/api/session", get(session_info)) + .route("/api/login", post(login)) + .route("/api/setup", post(setup)) + .route("/metrics", get(prometheus)) + .route("/healthz", get(panel_healthz)) + .merge(api) + .layer(middleware::from_fn_with_state( + app.clone(), + security_headers, + )) + .layer(axum::extract::DefaultBodyLimit::max(2 * 1024 * 1024)) + .with_state(app) +} + +async fn panel_healthz(State(app): State>) -> Response { + match sqlx::query_scalar::<_, i64>("SELECT 1") + .fetch_one(&app.db) + .await + { + Ok(_) => "ok\n".into_response(), + Err(_) => (StatusCode::SERVICE_UNAVAILABLE, "database unavailable\n").into_response(), + } +} + +// ------------------------------------------------------------------ auth endpoints + +async fn admin_count(app: &App) -> i64 { + sqlx::query_scalar("SELECT COUNT(*) FROM admins") + .fetch_one(&app.db) + .await + .unwrap_or(0) +} + +async fn session_info(State(app): State>, headers: HeaderMap) -> Response { + let setup = admin_count(&app).await == 0; + match load_session(&app, &headers).await { + Some(s) => Json(json!({ + "authenticated": true, "username": s.username, "csrf": s.csrf, + "version": env!("CARGO_PKG_VERSION"), "setup_required": false, + "server_name": app.settings().general.server_name, + })) + .into_response(), + None => Json(json!({ + "authenticated": false, "setup_required": setup, "version": env!("CARGO_PKG_VERSION"), + })) + .into_response(), + } +} + +#[derive(Deserialize)] +struct LoginReq { + username: String, + password: String, + #[serde(default)] + token: String, +} + +async fn create_session( + app: &App, + admin_id: i64, + ip: &str, + ua: &str, + secure: bool, +) -> anyhow::Result { + let token = util::random_token(32); + let csrf = util::random_token(24); + let ttl = app.settings().panel.session_ttl_minutes.max(5) as i64 * 60; + sqlx::query( + "INSERT INTO admin_sessions (token_hash, admin_id, csrf, created_at, expires_at, last_seen, ip, user_agent) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + ) + .bind(sha256_hex(token.as_bytes())) + .bind(admin_id) + .bind(&csrf) + .bind(now()) + .bind(now() + ttl) + .bind(now()) + .bind(ip) + .bind(util::truncate_bytes(ua, 200)) + .execute(&app.db) + .await?; + sqlx::query("UPDATE admins SET last_login = ? WHERE id = ?") + .bind(now()) + .bind(admin_id) + .execute(&app.db) + .await?; + let mut r = Json(json!({ "ok": true, "csrf": csrf })).into_response(); + r.headers_mut() + .insert(header::SET_COOKIE, session_cookie(&token, secure, ttl)); + Ok(r) +} + +async fn login( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + headers: HeaderMap, + Json(req): Json, +) -> Response { + let ip = peer_ip(&app, peer, &headers); + let key = format!("panel:{ip}"); + if app.auth.locked_until(&key).is_some() { + return err( + StatusCode::TOO_MANY_REQUESTS, + "Too many failed attempts, try again later", + ); + } + let row = sqlx::query("SELECT id, password_hash FROM admins WHERE username = ?") + .bind(&req.username) + .fetch_optional(&app.db) + .await + .ok() + .flatten(); + // constant work even for unknown users + static DUMMY: std::sync::OnceLock = std::sync::OnceLock::new(); + let dummy = + DUMMY.get_or_init(|| hash_password("dummy-password-for-timing").unwrap_or_default()); + let (id, hash) = row + .map(|r| (r.get::(0), r.get::(1))) + .unwrap_or((0, dummy.clone())); + let ok = verify_password(&req.password, &hash) && id > 0; + if !ok { + app.auth.fail(&key, 5, 600, 900); + tracing::warn!(target: "active_push::auth", "panel login failed user={} ip={ip}", req.username); + db::audit(&app.db, &req.username, "panel_login_failed", "", &ip, "").await; + tokio::time::sleep(Duration::from_millis(400)).await; + return err(StatusCode::UNAUTHORIZED, "Invalid username or password"); + } + app.auth.success(&key); + db::audit(&app.db, &req.username, "panel_login", "", &ip, "").await; + let ua = headers + .get(header::USER_AGENT) + .and_then(|v| v.to_str().ok()) + .unwrap_or(""); + create_session(&app, id, &ip, ua, is_https(&app, &headers)) + .await + .unwrap_or_else(|e| err(StatusCode::INTERNAL_SERVER_ERROR, &e.to_string())) +} + +async fn setup( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + headers: HeaderMap, + Json(req): Json, +) -> Response { + let ip = peer_ip(&app, peer, &headers); + let key = format!("setup:{ip}"); + if app.auth.locked_until(&key).is_some() { + return err(StatusCode::TOO_MANY_REQUESTS, "Too many attempts"); + } + if admin_count(&app).await > 0 { + return err(StatusCode::CONFLICT, "Administrator already exists"); + } + let stored: Option<(String, i64)> = + sqlx::query("SELECT token_hash, expires_at FROM setup_token WHERE id = 1") + .fetch_optional(&app.db) + .await + .ok() + .flatten() + .map(|r| (r.get(0), r.get(1))); + let valid = stored + .map(|(h, exp)| { + exp > now() + && util::ct_eq( + h.as_bytes(), + sha256_hex(req.token.trim().as_bytes()).as_bytes(), + ) + }) + .unwrap_or(false); + if !valid { + app.auth.fail(&key, 5, 600, 1800); + return err( + StatusCode::FORBIDDEN, + "Invalid or expired setup token (run: active-push admin setup-token)", + ); + } + if !valid_admin_name(&req.username) { + return err( + StatusCode::BAD_REQUEST, + "Username: 3-64 characters A-Z a-z 0-9 _ . -", + ); + } + if let Err(e) = password_ok(&req.password) { + return err(StatusCode::BAD_REQUEST, e); + } + let Ok(hash) = hash_password(&req.password) else { + return err(StatusCode::INTERNAL_SERVER_ERROR, "hash failed"); + }; + let r = sqlx::query("INSERT INTO admins (username, password_hash, created_at, password_changed_at) VALUES (?, ?, ?, ?) RETURNING id") + .bind(&req.username) + .bind(hash) + .bind(now()) + .bind(now()) + .fetch_one(&app.db) + .await; + let Ok(row) = r else { + return err(StatusCode::CONFLICT, "Could not create administrator"); + }; + let _ = sqlx::query("DELETE FROM setup_token") + .execute(&app.db) + .await; + db::audit( + &app.db, + &req.username, + "admin_created", + "", + &ip, + "setup token", + ) + .await; + let ua = headers + .get(header::USER_AGENT) + .and_then(|v| v.to_str().ok()) + .unwrap_or(""); + create_session(&app, row.get(0), &ip, ua, is_https(&app, &headers)) + .await + .unwrap_or_else(|e| err(StatusCode::INTERNAL_SERVER_ERROR, &e.to_string())) +} + +async fn logout(State(app): State>, headers: HeaderMap) -> Response { + if let Some(t) = cookie_token(&headers) { + let _ = sqlx::query("DELETE FROM admin_sessions WHERE token_hash = ?") + .bind(sha256_hex(t.as_bytes())) + .execute(&app.db) + .await; + } + let mut r = Json(json!({"ok": true})).into_response(); + r.headers_mut().insert( + header::SET_COOKIE, + session_cookie("", is_https(&app, &headers), 0), + ); + r +} + +#[derive(Deserialize)] +struct PwChange { + current: String, + new: String, +} + +async fn change_password( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + headers: HeaderMap, + axum::Extension(s): axum::Extension, + Json(req): Json, +) -> Response { + let hash: Option = sqlx::query_scalar("SELECT password_hash FROM admins WHERE id = ?") + .bind(s.admin_id) + .fetch_optional(&app.db) + .await + .ok() + .flatten(); + if !hash + .map(|h| verify_password(&req.current, &h)) + .unwrap_or(false) + { + return err(StatusCode::FORBIDDEN, "Current password is wrong"); + } + if let Err(e) = password_ok(&req.new) { + return err(StatusCode::BAD_REQUEST, e); + } + let Ok(h) = hash_password(&req.new) else { + return err(StatusCode::INTERNAL_SERVER_ERROR, "hash failed"); + }; + let _ = + sqlx::query("UPDATE admins SET password_hash = ?, password_changed_at = ? WHERE id = ?") + .bind(h) + .bind(now()) + .bind(s.admin_id) + .execute(&app.db) + .await; + // revoke all other sessions + if let Some(t) = cookie_token(&headers) { + let _ = sqlx::query("DELETE FROM admin_sessions WHERE admin_id = ? AND token_hash != ?") + .bind(s.admin_id) + .bind(sha256_hex(t.as_bytes())) + .execute(&app.db) + .await; + } + db::audit( + &app.db, + &s.username, + "password_changed", + "", + &peer_ip(&app, peer, &headers), + "", + ) + .await; + Json(json!({"ok": true})).into_response() +} + +async fn revoke_others( + State(app): State>, + headers: HeaderMap, + axum::Extension(s): axum::Extension, +) -> Response { + if let Some(t) = cookie_token(&headers) { + let _ = sqlx::query("DELETE FROM admin_sessions WHERE admin_id = ? AND token_hash != ?") + .bind(s.admin_id) + .bind(sha256_hex(t.as_bytes())) + .execute(&app.db) + .await; + } + Json(json!({"ok": true})).into_response() +} + +// ------------------------------------------------------------------ data endpoints + +fn rss_bytes() -> u64 { + std::fs::read_to_string("/proc/self/statm") + .ok() + .and_then(|s| { + s.split_whitespace() + .nth(1) + .and_then(|v| v.parse::().ok()) + }) + .map(|pages| pages * 4096) + .unwrap_or(0) +} + +async fn overview(State(app): State>) -> Response { + let c = &app.metrics.c; + let s = app.settings(); + let dev_total: i64 = sqlx::query_scalar("SELECT COUNT(DISTINCT device_id) FROM devices") + .fetch_one(&app.db) + .await + .unwrap_or(0); + let dev_24h: i64 = + sqlx::query_scalar("SELECT COUNT(DISTINCT device_id) FROM devices WHERE last_seen > ?") + .bind(now() - 86400) + .fetch_one(&app.db) + .await + .unwrap_or(0); + let partnerships: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM devices") + .fetch_one(&app.db) + .await + .unwrap_or(0); + let users_total: i64 = sqlx::query_scalar("SELECT COUNT(DISTINCT username) FROM devices") + .fetch_one(&app.db) + .await + .unwrap_or(0); + let wipes: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM devices WHERE wipe_status IN (2, 4)") + .fetch_one(&app.db) + .await + .unwrap_or(0); + let pending: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM devices WHERE approved = 0") + .fetch_one(&app.db) + .await + .unwrap_or(0); + let mut types: Vec<(String, i64)> = sqlx::query( + "SELECT device_type, COUNT(DISTINCT device_id) FROM devices GROUP BY device_type ORDER BY 2 DESC LIMIT 8", + ) + .fetch_all(&app.db) + .await + .unwrap_or_default() + .into_iter() + .map(|r| (r.get(0), r.get(1))) + .collect(); + types.retain(|(t, _)| !t.is_empty()); + let mut cmds: Vec<(String, crate::metrics::CmdStat)> = + app.metrics.commands().into_iter().collect(); + cmds.sort_by_key(|c| std::cmp::Reverse(c.1.count)); + Json(json!({ + "version": env!("CARGO_PKG_VERSION"), + "server_name": s.general.server_name, + "uptime": app.started.elapsed().as_secs(), + "started": app.started_ts, + "rss": rss_bytes(), + "requests": c.requests.load(Ordering::Relaxed), + "errors": c.errors.load(Ordering::Relaxed), + "auth_failures": c.auth_failures.load(Ordering::Relaxed), + "bytes_in": c.bytes_in.load(Ordering::Relaxed), + "bytes_out": c.bytes_out.load(Ordering::Relaxed), + "items_out": c.items_out.load(Ordering::Relaxed), + "items_in": c.items_in.load(Ordering::Relaxed), + "mails_sent": c.mails_sent.load(Ordering::Relaxed), + "autodiscover": c.autodiscover.load(Ordering::Relaxed), + "active_requests": app.metrics.active().len(), + "pings": app.metrics.ping_count(), + "devices_total": dev_total, + "devices_24h": dev_24h, + "devices_pending": pending, + "wipes_pending": wipes, + "users_total": users_total, + "partnerships_total": partnerships, + "db_bytes": db_size(&app.boot.data_dir, "active-push.db"), + "wal_bytes": db_size(&app.boot.data_dir, "active-push.db-wal"), + "users_active_15m": app.metrics.users_active(900), + "imap_pool": app.pool.size(), + "lockouts": app.auth.lockouts().len(), + "device_types": types, + "commands": cmds, + "backends": { + "imap": format!("{}:{}", s.imap.host, s.imap.port), + "smtp": if s.smtp.method == crate::config::SendMethod::Sendmail { s.smtp.sendmail_path.clone() } else { format!("{}:{}", s.smtp.host, s.smtp.port) }, + "caldav": if s.caldav.enabled { s.caldav.base_url.clone() } else { String::new() }, + "carddav": if s.carddav.enabled { s.carddav.base_url.clone() } else { String::new() }, + }, + "provisioning": s.provisioning.enabled, + })) + .into_response() +} + +#[derive(Deserialize)] +struct MinQ { + minutes: Option, + hours: Option, +} + +async fn timeseries(State(app): State>, Query(q): Query) -> Response { + let n = q.minutes.unwrap_or(60).clamp(5, 1440); + Json(app.metrics.minutes(n)).into_response() +} + +async fn hourly(State(app): State>, Query(q): Query) -> Response { + // flush first so the current hour is visible + app.metrics.flush_hour(&app.db).await; + let hours = q.hours.unwrap_or(168).clamp(1, 24 * 90); + let rows = sqlx::query( + "SELECT hour, requests, errors, auth_failures, bytes_in, bytes_out, items_out, items_in, mails_sent, total_ms, commands FROM stats_hourly WHERE hour >= ? ORDER BY hour", + ) + .bind(now() - hours * 3600) + .fetch_all(&app.db) + .await + .unwrap_or_default(); + let v: Vec = rows + .into_iter() + .map(|r| { + json!({ + "t": r.get::(0), "requests": r.get::(1), "errors": r.get::(2), + "auth_failures": r.get::(3), "bytes_in": r.get::(4), "bytes_out": r.get::(5), + "items_out": r.get::(6), "items_in": r.get::(7), "mails_sent": r.get::(8), + "total_ms": r.get::(9), + "commands": serde_json::from_str::(&r.get::(10)).unwrap_or(Value::Null), + }) + }) + .collect(); + Json(v).into_response() +} + +async fn live(State(app): State>) -> Response { + Json(json!({ + "active": app.metrics.active(), + "pings": app.metrics.pings(), + "recent": app.metrics.recent(200), + "now": now(), + })) + .into_response() +} + +async fn events( + State(app): State>, +) -> Sse>> { + let mut rx = app.metrics.events.subscribe(); + let shutdown = app.shutdown.clone(); + let stream = async_stream(move |tx| async move { + loop { + tokio::select! { + ev = rx.recv() => match ev { + Ok(e) => { + let data = serde_json::to_string(&e).unwrap_or_default(); + if tx.send(Ok(SseEvent::default().event("request").data(data))).await.is_err() { break; } + } + Err(tokio::sync::broadcast::error::RecvError::Lagged(_)) => continue, + Err(_) => break, + }, + _ = shutdown.cancelled() => break, + } + } + }); + Sse::new(stream).keep_alive(KeepAlive::new().interval(Duration::from_secs(15))) +} + +/// Minimal channel-backed stream helper (avoids an extra dependency). +fn async_stream(f: F) -> impl Stream> +where + F: FnOnce(tokio::sync::mpsc::Sender>) -> Fut, + Fut: std::future::Future + Send + 'static, +{ + let (tx, rx) = tokio::sync::mpsc::channel(64); + tokio::spawn(f(tx)); + futures_util::stream::unfold(rx, |mut rx| async move { rx.recv().await.map(|v| (v, rx)) }) +} + +async fn devices(State(app): State>) -> Response { + let pings = app.metrics.pings(); + match db::device_list(&app.db).await { + Ok(list) => { + let v: Vec = list + .into_iter() + .map(|d| { + let pinging = pings + .iter() + .any(|p| p.device_id == d.device_id && p.user == d.username); + let mut j = serde_json::to_value(&d).unwrap_or_default(); + j["pinging"] = json!(pinging); + j["has_recovery_password"] = json!(!d.recovery_password.is_empty()); + j + }) + .collect(); + Json(v).into_response() + } + Err(e) => err(StatusCode::INTERNAL_SERVER_ERROR, &e.to_string()), + } +} + +async fn device_detail(State(app): State>, Path(id): Path) -> Response { + let Ok(Some(d)) = db::device_by_id(&app.db, id).await else { + return err(StatusCode::NOT_FOUND, "device not found"); + }; + let folders = db::folder_stats(&app.db, id).await.unwrap_or_default(); + let recent: Vec<_> = app + .metrics + .recent(500) + .into_iter() + .filter(|e| e.device_id == d.device_id && e.user == d.username) + .take(50) + .collect(); + let mut j = serde_json::to_value(&d).unwrap_or_default(); + j["folders"] = json!(folders); + j["recent"] = json!(recent); + j["has_recovery_password"] = json!(!d.recovery_password.is_empty()); + j["pinging"] = json!(app + .metrics + .pings() + .iter() + .any(|p| p.device_id == d.device_id && p.user == d.username)); + Json(j).into_response() +} + +#[derive(Deserialize, Default)] +struct ActionBody { + #[serde(default)] + notes: String, +} + +async fn device_action( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + headers: HeaderMap, + axum::Extension(s): axum::Extension, + Path((id, action)): Path<(i64, String)>, + body: Option>, +) -> Response { + let Ok(Some(d)) = db::device_by_id(&app.db, id).await else { + return err(StatusCode::NOT_FOUND, "device not found"); + }; + let ip = peer_ip(&app, peer, &headers); + let key = format!("{}\u{0}{}", d.device_id, d.username); + let res = match action.as_str() { + "wipe" => { + app.metrics.ping_interrupt(&key); + db::device_request_wipe(&app.db, id, &s.username, false).await + } + "cancel-wipe" => { + db::device_set_field( + &app.db, + id, + DeviceField::WipeStatus, + Some(db::WIPE_NA), + None, + ) + .await + } + "resync" => { + app.metrics.ping_interrupt(&key); + db::device_reset_states(&app.db, id).await + } + "reprovision" => { + app.metrics.ping_interrupt(&key); + db::device_set_field(&app.db, id, DeviceField::PolicyKey, Some(0), None).await + } + "block" => { + app.metrics.ping_interrupt(&key); + db::device_set_field(&app.db, id, DeviceField::Blocked, Some(1), None).await + } + "unblock" => db::device_set_field(&app.db, id, DeviceField::Blocked, Some(0), None).await, + "approve" => db::device_set_field(&app.db, id, DeviceField::Approved, Some(1), None).await, + "remove" => { + app.metrics.ping_interrupt(&key); + db::device_delete(&app.db, id).await + } + "notes" => { + let n = body.map(|b| b.0.notes).unwrap_or_default(); + db::device_set_field( + &app.db, + id, + DeviceField::Notes, + None, + Some(util::truncate_bytes(&n, 2000)), + ) + .await + } + "recovery-password" => { + db::audit( + &app.db, + &s.username, + "device_recovery_password_viewed", + &d.device_id, + &ip, + &d.username, + ) + .await; + return Json(json!({ "password": d.recovery_password })).into_response(); + } + _ => return err(StatusCode::BAD_REQUEST, "unknown action"), + }; + match res { + Ok(()) => { + db::audit( + &app.db, + &s.username, + &format!("device_{action}"), + &d.device_id, + &ip, + &d.username, + ) + .await; + tracing::info!(admin = %s.username, device = %d.device_id, user = %d.username, "device action: {action}"); + Json(json!({"ok": true})).into_response() + } + Err(e) => err(StatusCode::INTERNAL_SERVER_ERROR, &e.to_string()), + } +} + +fn db_size(dir: &std::path::Path, f: &str) -> u64 { + std::fs::metadata(dir.join(f)).map(|m| m.len()).unwrap_or(0) +} + +async fn users(State(app): State>) -> Response { + let rows = sqlx::query( + "SELECT d.username, COUNT(*), MAX(d.last_seen), SUM(d.requests), SUM(CASE WHEN d.blocked = 1 THEN 1 ELSE 0 END), + GROUP_CONCAT(DISTINCT COALESCE(NULLIF(d.friendly_name, ''), NULLIF(d.model, ''), d.device_type)), + (SELECT GROUP_CONCAT(DISTINCT o.username) FROM devices o + WHERE o.device_id IN (SELECT device_id FROM devices WHERE username = d.username) AND o.username != d.username) + FROM devices d GROUP BY d.username ORDER BY MAX(d.last_seen) DESC", + ) + .fetch_all(&app.db) + .await + .unwrap_or_default(); + let s = app.settings(); + let pings = app.metrics.pings(); + let v: Vec = rows + .into_iter() + .map(|r| { + let u: String = r.get(0); + json!({ + "username": u, "devices": r.get::(1), "last_seen": r.get::(2), + "requests": r.get::(3), "blocked_devices": r.get::(4), + "blocked": s.security.blocked_users.iter().any(|b| b.eq_ignore_ascii_case(&u)), + "pings": pings.iter().filter(|p| p.user == u).count(), + "policy": s.policy_for(&u).name, + "device_names": r.get::, _>(5).unwrap_or_default(), + "same_device": r.get::, _>(6).unwrap_or_default(), + }) + }) + .collect(); + Json(v).into_response() +} + +async fn get_settings(State(app): State>) -> Response { + Json(json!({ + "settings": app.settings().redacted(), + "revision": app.settings_rev.load(Ordering::SeqCst), + "timezones": chrono_tz::TZ_VARIANTS.iter().map(|t| t.name()).collect::>(), + })) + .into_response() +} + +async fn put_settings( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + headers: HeaderMap, + axum::Extension(s): axum::Extension, + Json(v): Json, +) -> Response { + let cur = app.settings(); + let new = match cur.merge_update(v) { + Ok(n) => n, + Err(e) => return err(StatusCode::BAD_REQUEST, &e), + }; + // diff summary for the audit log + let old_v = cur.redacted(); + let new_v = new.redacted(); + let mut changed = Vec::new(); + if let (Some(o), Some(n)) = (old_v.as_object(), new_v.as_object()) { + for (k, nv) in n { + if o.get(k) != Some(nv) { + changed.push(k.clone()); + } + } + } + match app.update_settings(new).await { + Ok(rev) => { + db::audit( + &app.db, + &s.username, + "settings_saved", + &changed.join(","), + &peer_ip(&app, peer, &headers), + &format!("revision {rev}"), + ) + .await; + tracing::info!(admin = %s.username, sections = %changed.join(","), "settings updated (revision {rev})"); + Json(json!({"ok": true, "revision": rev})).into_response() + } + Err(e) => err(StatusCode::INTERNAL_SERVER_ERROR, &e.to_string()), + } +} + +#[derive(Deserialize)] +struct TestReq { + #[serde(default)] + login: String, + #[serde(default)] + password: String, + /// optional unsaved settings to test + settings: Option, +} + +async fn test_backend( + State(app): State>, + Path(what): Path, + Json(req): Json, +) -> Response { + let cur = app.settings(); + let s = match req.settings { + Some(v) => match cur.merge_update(v) { + Ok(s) => Arc::new(s), + Err(e) => return err(StatusCode::BAD_REQUEST, &e), + }, + None => cur, + }; + let res = tokio::time::timeout(Duration::from_secs(30), async { + match what.as_str() { + "imap" => crate::backend::test_imap(&s, &req.login, &req.password).await, + "smtp" => crate::backend::smtp::test(&s.smtp, &req.login, &req.password).await, + "caldav" => { + crate::backend::test_dav(&s, DavKind::Calendar, &req.login, &req.password).await + } + "carddav" => { + crate::backend::test_dav(&s, DavKind::AddressBook, &req.login, &req.password).await + } + _ => Err(anyhow::anyhow!("unknown backend")), + } + }) + .await; + match res { + Ok(Ok(msg)) => Json(json!({"ok": true, "message": msg})).into_response(), + Ok(Err(e)) => Json(json!({"ok": false, "message": format!("{e:#}")})).into_response(), + Err(_) => Json(json!({"ok": false, "message": "timeout"})).into_response(), + } +} + +#[derive(Deserialize)] +struct LogQ { + level: Option, + q: Option, + n: Option, +} + +async fn logs(State(app): State>, Query(q): Query) -> Response { + Json(app.logs.tail( + q.n.unwrap_or(500).min(5000), + q.level.as_deref(), + q.q.as_deref(), + )) + .into_response() +} + +async fn audit(State(app): State>) -> Response { + Json(db::audit_list(&app.db, 500).await.unwrap_or_default()).into_response() +} + +async fn lockouts(State(app): State>) -> Response { + Json( + app.auth + .lockouts() + .into_iter() + .map(|(k, t)| json!({"key": k, "until": t})) + .collect::>(), + ) + .into_response() +} + +#[derive(Deserialize)] +struct UnlockReq { + key: String, +} + +async fn unlock( + State(app): State>, + axum::Extension(s): axum::Extension, + Json(r): Json, +) -> Response { + app.auth.unlock(&r.key); + db::audit(&app.db, &s.username, "lockout_cleared", &r.key, "", "").await; + Json(json!({"ok": true})).into_response() +} + +// ------------------------------------------------------------------ Prometheus + +async fn prometheus(State(app): State>, headers: HeaderMap) -> Response { + let token = app.settings().panel.prometheus_token.clone(); + if token.is_empty() { + return StatusCode::NOT_FOUND.into_response(); + } + let ok = headers + .get(header::AUTHORIZATION) + .and_then(|v| v.to_str().ok()) + .and_then(|v| v.strip_prefix("Bearer ")) + .map(|t| util::ct_eq(t.trim().as_bytes(), token.as_bytes())) + .unwrap_or(false); + if !ok { + return StatusCode::UNAUTHORIZED.into_response(); + } + let c = &app.metrics.c; + let mut out = String::new(); + let mut m = |name: &str, kind: &str, help: &str, v: u64| { + out.push_str(&format!("# HELP activepush_{name} {help}\n# TYPE activepush_{name} {kind}\nactivepush_{name} {v}\n")); + }; + m( + "requests_total", + "counter", + "ActiveSync requests", + c.requests.load(Ordering::Relaxed), + ); + m( + "errors_total", + "counter", + "Failed requests", + c.errors.load(Ordering::Relaxed), + ); + m( + "auth_failures_total", + "counter", + "Failed logins", + c.auth_failures.load(Ordering::Relaxed), + ); + m( + "bytes_in_total", + "counter", + "Request bytes", + c.bytes_in.load(Ordering::Relaxed), + ); + m( + "bytes_out_total", + "counter", + "Response bytes", + c.bytes_out.load(Ordering::Relaxed), + ); + m( + "items_out_total", + "counter", + "Items sent to devices", + c.items_out.load(Ordering::Relaxed), + ); + m( + "items_in_total", + "counter", + "Items received from devices", + c.items_in.load(Ordering::Relaxed), + ); + m( + "mails_sent_total", + "counter", + "Messages submitted", + c.mails_sent.load(Ordering::Relaxed), + ); + m( + "pings_active", + "gauge", + "Hanging Ping/Sync requests", + app.metrics.ping_count() as u64, + ); + m( + "imap_pool_connections", + "gauge", + "Pooled IMAP connections", + app.pool.size() as u64, + ); + m( + "uptime_seconds", + "gauge", + "Uptime", + app.started.elapsed().as_secs(), + ); + m("resident_memory_bytes", "gauge", "RSS", rss_bytes()); + out.push_str("# HELP activepush_command_total Requests per command\n# TYPE activepush_command_total counter\n"); + for (k, v) in app.metrics.commands() { + out.push_str(&format!( + "activepush_command_total{{command=\"{}\"}} {}\n", + k.replace('"', ""), + v.count + )); + } + let mut r = Response::new(Body::from(out)); + r.headers_mut().insert( + header::CONTENT_TYPE, + HeaderValue::from_static("text/plain; version=0.0.4"), + ); + r +} + +// ------------------------------------------------------------------ CLI helpers + +pub async fn cli_setup_token(app: &App) -> anyhow::Result { + if admin_count(app).await > 0 { + anyhow::bail!("an administrator already exists; use `admin reset-password` instead"); + } + let token = util::random_token(32); + sqlx::query("INSERT OR REPLACE INTO setup_token (id, token_hash, expires_at) VALUES (1, ?, ?)") + .bind(sha256_hex(token.as_bytes())) + .bind(now() + 3600) + .execute(&app.db) + .await?; + Ok(token) +} + +pub async fn cli_init(app: &App, username: &str, password: &str) -> anyhow::Result<()> { + if admin_count(app).await > 0 { + anyhow::bail!("an administrator already exists"); + } + if !valid_admin_name(username) { + anyhow::bail!("invalid username (3-64 chars: A-Z a-z 0-9 _ . -)"); + } + password_ok(password).map_err(|e| anyhow::anyhow!(e))?; + sqlx::query("INSERT INTO admins (username, password_hash, created_at, password_changed_at) VALUES (?, ?, ?, ?)") + .bind(username) + .bind(hash_password(password)?) + .bind(now()) + .bind(now()) + .execute(&app.db) + .await?; + db::audit(&app.db, username, "admin_created", "", "cli", "").await; + Ok(()) +} + +pub async fn cli_reset_password( + app: &App, + username: Option<&str>, + password: &str, +) -> anyhow::Result { + password_ok(password).map_err(|e| anyhow::anyhow!(e))?; + let user: String = match username { + Some(u) => u.to_string(), + None => sqlx::query_scalar("SELECT username FROM admins ORDER BY id LIMIT 1") + .fetch_optional(&app.db) + .await? + .ok_or_else(|| anyhow::anyhow!("no administrator exists; use `admin init`"))?, + }; + let r = sqlx::query( + "UPDATE admins SET password_hash = ?, password_changed_at = ? WHERE username = ?", + ) + .bind(hash_password(password)?) + .bind(now()) + .bind(&user) + .execute(&app.db) + .await?; + if r.rows_affected() == 0 { + anyhow::bail!("administrator {user} not found"); + } + sqlx::query("DELETE FROM admin_sessions") + .execute(&app.db) + .await?; + db::audit( + &app.db, + &user, + "password_reset", + "", + "cli", + "all sessions revoked", + ) + .await; + Ok(user) +} + +pub async fn cli_logout_all(app: &App) -> anyhow::Result { + Ok(sqlx::query("DELETE FROM admin_sessions") + .execute(&app.db) + .await? + .rows_affected()) +} + +pub async fn cli_status(app: &App) -> anyhow::Result { + let admins: Vec<(String, Option)> = sqlx::query("SELECT username, last_login FROM admins") + .fetch_all(&app.db) + .await? + .into_iter() + .map(|r| (r.get(0), r.get(1))) + .collect(); + let sessions: i64 = + sqlx::query_scalar("SELECT COUNT(*) FROM admin_sessions WHERE expires_at > ?") + .bind(now()) + .fetch_one(&app.db) + .await?; + if admins.is_empty() { + return Ok("No administrator configured. Run `active-push admin setup-token` or `active-push admin init --username NAME`.".into()); + } + let mut s = String::new(); + for (u, l) in admins { + s.push_str(&format!( + "admin {u}, last login {}\n", + l.map(util::format_ts).unwrap_or_else(|| "never".into()) + )); + } + s.push_str(&format!("active sessions: {sessions}")); + Ok(s) +} diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..3b67193 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,149 @@ +//! Shared application state. + +use std::net::SocketAddr; +use std::path::PathBuf; +use std::sync::atomic::{AtomicI64, Ordering}; +use std::sync::{Arc, Mutex}; +use std::time::Instant; + +use arc_swap::ArcSwap; +use rand::RngCore; + +use crate::backend::dav::DavClient; +use crate::backend::{ImapPool, Session}; +use crate::config::Settings; +use crate::db::{self, Db}; +use crate::logging::LogRing; +use crate::metrics::{AuthGuard, Metrics}; + +#[derive(Debug, Clone)] +pub struct Boot { + pub data_dir: PathBuf, + pub eas_listen: SocketAddr, + pub admin_listen: SocketAddr, + pub allow_remote_admin: bool, + pub admin_tls: Option<(String, String)>, + pub eas_tls: Option<(String, String)>, +} + +pub struct App { + pub db: Db, + pub boot: Boot, + settings: ArcSwap, + pub settings_rev: AtomicI64, + pub metrics: Metrics, + pub auth: AuthGuard, + pub pool: Arc, + pub logs: Arc, + pub started: Instant, + pub started_ts: i64, + http: Mutex<(i64, Option, Option)>, + /// Random per-process key for HMACs (credential cache keys). + pub secret: [u8; 32], + loops: Mutex>, + pub shutdown: tokio_util::sync::CancellationToken, + /// Collection ids a device still uses but that do not exist here (e.g. left over from + /// Z-Push). They are sent as FolderHierarchy Delete on the next FolderSync. + stale: Mutex>>, +} + +impl App { + pub async fn new(boot: Boot, logs: Arc) -> anyhow::Result> { + let db = db::open(&boot.data_dir).await?; + let (settings, rev) = db::load_settings(&db).await?; + if let Err(e) = settings.validate() { + tracing::warn!("stored settings do not validate ({e}); running with them anyway"); + } + logs.set_cap(settings.logging.ring_size); + let mut secret = [0u8; 32]; + rand::rngs::OsRng.fill_bytes(&mut secret); + Ok(Arc::new(App { + db, + boot, + settings: ArcSwap::from_pointee(settings), + settings_rev: AtomicI64::new(rev), + metrics: Metrics::new(), + auth: AuthGuard::default(), + pool: Arc::new(ImapPool::new(secret)), + logs, + started: Instant::now(), + started_ts: crate::util::now(), + http: Mutex::new((-1, None, None)), + secret, + loops: Mutex::new(std::collections::HashMap::new()), + shutdown: tokio_util::sync::CancellationToken::new(), + stale: Mutex::new(std::collections::HashMap::new()), + })) + } + + pub fn settings(&self) -> Arc { + self.settings.load_full() + } + + pub async fn update_settings(&self, s: Settings) -> anyhow::Result { + let rev = db::save_settings(&self.db, &s).await?; + self.logs.set_cap(s.logging.ring_size); + self.settings.store(Arc::new(s)); + self.settings_rev.store(rev, Ordering::SeqCst); + // backend endpoints may have changed + self.pool.clear(); + self.auth.clear_cache(); + Ok(rev) + } + + fn http_clients(&self, s: &Settings) -> (Option, Option) { + let rev = self.settings_rev.load(Ordering::SeqCst); + let mut g = self.http.lock().unwrap(); + if g.0 != rev { + let cal = s + .caldav + .enabled + .then(|| DavClient::build_http(s.caldav.verify_tls, s.caldav.timeout_secs).ok()) + .flatten(); + let card = s + .carddav + .enabled + .then(|| DavClient::build_http(s.carddav.verify_tls, s.carddav.timeout_secs).ok()) + .flatten(); + *g = (rev, cal, card); + } + (g.1.clone(), g.2.clone()) + } + + pub fn stale_add(&self, device: i64, collection: &str) { + if collection.is_empty() || collection.len() > 64 { + return; + } + let mut g = self.stale.lock().unwrap(); + let set = g.entry(device).or_default(); + if set.len() < 500 { + set.insert(collection.to_string()); + } + } + + pub fn stale_take(&self, device: i64) -> Vec { + self.stale + .lock() + .unwrap() + .remove(&device) + .map(|s| s.into_iter().collect()) + .unwrap_or_default() + } + + /// Count how often a (device, collection, old sync key) was retried within the last hour. + pub fn loop_hit(&self, key: &str) -> u32 { + let now = crate::util::now(); + let mut g = self.loops.lock().unwrap(); + g.retain(|_, (_, t)| *t > now - 3600); + let e = g.entry(key.to_string()).or_insert((0, now)); + e.0 += 1; + e.1 = now; + e.0 + } + + pub fn session(&self, login: &str, password: &str) -> Session { + let s = self.settings(); + let (cal, card) = self.http_clients(&s); + Session::new(s, self.pool.clone(), cal, card, login, password) + } +} diff --git a/src/autodiscover.rs b/src/autodiscover.rs new file mode 100644 index 0000000..1b724f9 --- /dev/null +++ b/src/autodiscover.rs @@ -0,0 +1,215 @@ +//! Autodiscover for mobile devices (MobileSync schema) - replaces z-push/autodiscover. + +use std::net::SocketAddr; +use std::sync::Arc; + +use axum::body::Body; +use axum::extract::{ConnectInfo, State}; +use axum::http::{HeaderMap, HeaderValue, Method, StatusCode}; +use axum::response::{IntoResponse, Response}; +use http_body_util::BodyExt; + +use crate::app::App; +use crate::backend::AuthResult; +use crate::eas::{basic_auth, client_ip, normalize_login, user_allowed}; +use crate::metrics::Event; +use crate::util::{now, xml_escape}; +use crate::xmltree; + +const MOBILESYNC: &str = + "http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006"; + +fn xml_response(status: StatusCode, body: String) -> Response { + let mut r = (status, body).into_response(); + r.headers_mut().insert( + "Content-Type", + HeaderValue::from_static("text/xml; charset=utf-8"), + ); + r +} + +fn error_xml(code: u32, msg: &str) -> String { + format!( + r#" + + + + {code} + {} + + + +"#, + chrono::Utc::now().format("%H:%M:%S%.6f"), + xml_escape(msg) + ) +} + +fn unauthorized() -> Response { + let mut r = (StatusCode::UNAUTHORIZED, "Access denied").into_response(); + r.headers_mut().insert( + "WWW-Authenticate", + HeaderValue::from_static("Basic realm=\"ActiveSync\""), + ); + r +} + +fn safe_host(h: &str) -> Option<&str> { + (!h.is_empty() + && h.len() < 256 + && h.chars() + .all(|c| c.is_ascii_alphanumeric() || matches!(c, '.' | '-' | ':' | '[' | ']'))) + .then_some(h) +} + +pub async fn handler( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + method: Method, + headers: HeaderMap, + body: Body, +) -> Response { + let s = app.settings(); + let ip = client_ip(peer, &headers, &s).to_string(); + let started = std::time::Instant::now(); + app.metrics + .c + .autodiscover + .fetch_add(1, std::sync::atomic::Ordering::Relaxed); + if !s.autodiscover.enabled { + return StatusCode::NOT_FOUND.into_response(); + } + if method != Method::POST && method != Method::GET { + return StatusCode::METHOD_NOT_ALLOWED.into_response(); + } + let body = match http_body_util::Limited::new(body, 64 * 1024) + .collect() + .await + { + Ok(b) => b.to_bytes(), + Err(_) => return StatusCode::PAYLOAD_TOO_LARGE.into_response(), + }; + // requested address + schema + let (mut email, schema) = if body.is_empty() { + (String::new(), MOBILESYNC.to_string()) + } else { + match xmltree::parse(&body) { + Ok(x) => ( + x.text_of("EMailAddress").unwrap_or_default(), + x.text_of("AcceptableResponseSchema").unwrap_or_default(), + ), + Err(_) => return xml_response(StatusCode::OK, error_xml(600, "Invalid Request")), + } + }; + if schema != MOBILESYNC { + tracing::info!(ip = %ip, schema = %schema, "autodiscover: unsupported response schema"); + return xml_response(StatusCode::OK, error_xml(600, "Invalid Request")); + } + + // authentication + let creds = basic_auth(&headers, &s); + let login = match (&creds, s.autodiscover.require_auth) { + (None, true) => return unauthorized(), + (Some((l, _)), _) => l.clone(), + (None, false) => match normalize_login(&email, &s) { + Some(l) => l, + None => return xml_response(StatusCode::OK, error_xml(600, "Invalid Request")), + }, + }; + let ip_key = format!("ip:{ip}"); + let user_key = format!("user:{login}"); + if app.auth.locked_until(&ip_key).is_some() || app.auth.locked_until(&user_key).is_some() { + return (StatusCode::TOO_MANY_REQUESTS, "Too many failed logins").into_response(); + } + if !user_allowed(&login, &s) { + return unauthorized(); + } + if let Some((l, p)) = &creds { + let key = app.pool.key(l, p); + if !app.auth.is_cached(&key) { + let mut sess = app.session(l, p); + match sess.authenticate().await { + Ok(AuthResult::Ok) => { + app.auth.success(&user_key); + app.auth.cache_ok(key, s.security.auth_cache_secs); + sess.close().await; + } + Ok(AuthResult::Denied) => { + app.metrics.auth_failure(); + if s.security.log_auth_failures { + tracing::warn!(target: "active_push::auth", "authentication failed user={l} ip={ip} service=autodiscover"); + } + let (m, w, lo) = ( + s.security.auth_fail_max, + s.security.auth_fail_window_secs, + s.security.lockout_secs, + ); + app.auth.fail(&ip_key, m * 3, w, lo); + app.auth.fail(&user_key, m, w, lo); + return unauthorized(); + } + Err(e) => { + tracing::error!("autodiscover: backend unavailable: {e:#}"); + return StatusCode::SERVICE_UNAVAILABLE.into_response(); + } + } + } + } + if email.is_empty() || !email.contains('@') { + email = crate::backend::primary_email(&s, &login); + } + let url = if !s.autodiscover.server_url.is_empty() { + s.autodiscover.server_url.clone() + } else { + let host = headers + .get("x-forwarded-host") + .or_else(|| headers.get("host")) + .and_then(|h| h.to_str().ok()) + .and_then(safe_host) + .unwrap_or("localhost"); + format!("https://{host}/Microsoft-Server-ActiveSync") + }; + let display = email.clone(); + let xml = format!( + r#" + + + en:en + + {} + {} + + + + + MobileSync + {} + {} + + + + +"#, + xml_escape(&display), + xml_escape(&email), + xml_escape(&url), + xml_escape(&url) + ); + tracing::info!(user = %login, ip = %ip, "autodiscover answered"); + app.metrics.record(Event { + ts: now(), + user: login, + device_id: String::new(), + device_type: "Autodiscover".into(), + command: "Autodiscover".into(), + ip, + http: 200, + status: "ok".into(), + ms: started.elapsed().as_millis() as u64, + bytes_in: body.len() as u64, + bytes_out: xml.len() as u64, + items_out: 0, + items_in: 0, + }); + xml_response(StatusCode::OK, xml) +} diff --git a/src/backend/dav.rs b/src/backend/dav.rs new file mode 100644 index 0000000..f356c67 --- /dev/null +++ b/src/backend/dav.rs @@ -0,0 +1,580 @@ +//! Minimal CalDAV / CardDAV client (RFC 4791 / RFC 6352). + +use std::time::Duration; + +use anyhow::{anyhow, bail, Context, Result}; +use percent_encoding::{percent_decode_str, utf8_percent_encode, AsciiSet, CONTROLS}; +use reqwest::{Client, Method, StatusCode}; + +use crate::util::xml_escape; +use crate::xmltree; + +const PATH_SEG: &AsciiSet = &CONTROLS + .add(b' ') + .add(b'"') + .add(b'#') + .add(b'<') + .add(b'>') + .add(b'?') + .add(b'`') + .add(b'{') + .add(b'}') + .add(b'/') + .add(b'%') + .add(b'\\'); + +pub fn encode_segment(s: &str) -> String { + utf8_percent_encode(s, PATH_SEG).to_string() +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DavKind { + Calendar, + AddressBook, +} + +#[derive(Debug, Clone)] +pub struct Collection { + pub href: String, + pub display_name: String, + pub ctag: String, + pub sync_token: String, + pub supports_events: bool, + pub supports_todos: bool, +} + +#[derive(Debug, Clone)] +pub struct Resource { + pub href: String, + pub etag: String, + pub data: Option, +} + +#[derive(Clone)] +pub struct DavClient { + http: Client, + base: url::Url, + user: String, + pass: String, +} + +impl DavClient { + pub fn build_http(verify: bool, timeout_secs: u64) -> Result { + let mut b = Client::builder() + .timeout(Duration::from_secs(timeout_secs.max(5))) + .connect_timeout(Duration::from_secs(10)) + .redirect(reqwest::redirect::Policy::limited(3)) + .user_agent(concat!("ActivePush/", env!("CARGO_PKG_VERSION"))) + .pool_idle_timeout(Duration::from_secs(60)); + if !verify { + b = b.danger_accept_invalid_certs(true); + } + Ok(b.build()?) + } + + pub fn new(http: Client, base_url: &str, user: &str, pass: &str) -> Result { + let base = url::Url::parse(base_url).context("invalid DAV base URL")?; + Ok(DavClient { + http, + base, + user: user.to_string(), + pass: pass.to_string(), + }) + } + + fn url(&self, href: &str) -> Result { + let u = self.base.join(href)?; + // never follow hrefs to other hosts (SSRF protection) + if u.host_str() != self.base.host_str() + || u.port_or_known_default() != self.base.port_or_known_default() + { + bail!("DAV href points to a different host"); + } + Ok(u) + } + + async fn request( + &self, + method: &str, + href: &str, + depth: Option<&str>, + body: Option, + content_type: &str, + extra: &[(&str, String)], + ) -> Result<(StatusCode, reqwest::header::HeaderMap, String)> { + let m = Method::from_bytes(method.as_bytes())?; + let mut rb = self + .http + .request(m, self.url(href)?) + .basic_auth(&self.user, Some(&self.pass)); + if let Some(d) = depth { + rb = rb.header("Depth", d); + } + for (k, v) in extra { + rb = rb.header(*k, v); + } + if let Some(b) = body { + rb = rb.header("Content-Type", content_type).body(b); + } + let resp = rb + .send() + .await + .with_context(|| format!("DAV {method} {href}"))?; + let status = resp.status(); + let headers = resp.headers().clone(); + let text = resp.text().await.unwrap_or_default(); + if status == StatusCode::UNAUTHORIZED { + bail!("DAV authentication failed"); + } + Ok((status, headers, text)) + } + + pub async fn check(&self, home: &str) -> Result<()> { + let body = r#""#; + let (st, _, _) = self + .request( + "PROPFIND", + home, + Some("0"), + Some(body.into()), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if !st.is_success() && st.as_u16() != 207 { + bail!("DAV home {home} returned {st}"); + } + Ok(()) + } + + /// Discover collections below a home path. + pub async fn collections(&self, home: &str, kind: DavKind) -> Result> { + let body = r#" + + +"#; + let (st, _, text) = self + .request( + "PROPFIND", + home, + Some("1"), + Some(body.into()), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if st.as_u16() != 207 { + bail!("PROPFIND {home} returned {st}"); + } + let doc = xmltree::parse(text.as_bytes())?; + let mut out = Vec::new(); + for resp in doc.children_named("response") { + let href = resp.text_of("href").unwrap_or_default(); + let Some(rt) = resp.find("resourcetype") else { + continue; + }; + let is_cal = rt.child("calendar").is_some(); + let is_book = rt.child("addressbook").is_some(); + if (kind == DavKind::Calendar && !is_cal) || (kind == DavKind::AddressBook && !is_book) + { + continue; + } + let (mut ev, mut todo) = (true, true); + if let Some(set) = resp.find("supported-calendar-component-set") { + let comps: Vec = set + .children_named("comp") + .filter_map(|c| c.attr("name").map(|n| n.to_ascii_uppercase())) + .collect(); + if !comps.is_empty() { + ev = comps.iter().any(|c| c == "VEVENT"); + todo = comps.iter().any(|c| c == "VTODO"); + } + } + let name = resp + .text_of("displayname") + .filter(|s| !s.is_empty()) + .unwrap_or_else(|| last_segment(&href)); + out.push(Collection { + href: normalize_dir(&href), + display_name: name, + ctag: resp.text_of("getctag").unwrap_or_default(), + sync_token: resp.text_of("sync-token").unwrap_or_default(), + supports_events: ev, + supports_todos: todo, + }); + } + Ok(out) + } + + /// Cheap change marker for a collection (ctag / sync-token / etag list hash fallback). + pub async fn ctag(&self, href: &str) -> Result { + let body = r#""#; + let (st, _, text) = self + .request( + "PROPFIND", + href, + Some("0"), + Some(body.into()), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if st.as_u16() != 207 { + bail!("PROPFIND {href} returned {st}"); + } + let doc = xmltree::parse(text.as_bytes())?; + let tag = doc.text_of("getctag").filter(|s| !s.is_empty()); + let tok = doc.text_of("sync-token").filter(|s| !s.is_empty()); + Ok(tag.or(tok).unwrap_or_default()) + } + + /// List resources (href + etag). For calendars a component filter and optional + /// time-range start (UTC, compact format) are applied server side. + pub async fn list( + &self, + href: &str, + comp: Option<&str>, + since: Option<&str>, + ) -> Result> { + let text = if let Some(comp) = comp { + let range = since + .map(|s| format!("", xml_escape(s))) + .unwrap_or_default(); + let body = format!( + r#" + + + {range} +"# + ); + let (st, _, text) = self + .request( + "REPORT", + href, + Some("1"), + Some(body), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if st.as_u16() != 207 { + bail!("calendar-query {href} returned {st}"); + } + text + } else { + let body = r#""#; + let (st, _, text) = self + .request( + "PROPFIND", + href, + Some("1"), + Some(body.into()), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if st.as_u16() != 207 { + bail!("PROPFIND {href} returned {st}"); + } + text + }; + let doc = xmltree::parse(text.as_bytes())?; + let base = normalize_dir(href); + let mut out = Vec::new(); + for resp in doc.children_named("response") { + let h = resp.text_of("href").unwrap_or_default(); + if normalize_dir(&h) == base || h.ends_with('/') { + continue; + } + if resp + .find("resourcetype") + .map(|r| !r.children.is_empty()) + .unwrap_or(false) + { + continue; + } + let ok = resp.children_named("propstat").any(|p| { + p.text_of("status") + .map(|s| s.contains(" 200")) + .unwrap_or(true) + && p.find("getetag").is_some() + }); + if !ok { + continue; + } + out.push(Resource { + href: h, + etag: resp.text_of("getetag").unwrap_or_default(), + data: None, + }); + } + Ok(out) + } + + /// Fetch several resources at once (calendar-multiget / addressbook-multiget). + pub async fn multiget( + &self, + collection: &str, + hrefs: &[String], + kind: DavKind, + ) -> Result> { + if hrefs.is_empty() { + return Ok(vec![]); + } + let mut hs = String::new(); + for h in hrefs { + hs.push_str(&format!("{}", xml_escape(h))); + } + let body = match kind { + DavKind::Calendar => format!( + r#"{hs}"# + ), + DavKind::AddressBook => format!( + r#"{hs}"# + ), + }; + let (st, _, text) = self + .request( + "REPORT", + collection, + Some("1"), + Some(body), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if st.as_u16() != 207 { + // fallback: individual GETs + let mut out = Vec::new(); + for h in hrefs { + if let Ok(r) = self.get(h).await { + out.push(r); + } + } + return Ok(out); + } + let doc = xmltree::parse(text.as_bytes())?; + let mut out = Vec::new(); + for resp in doc.children_named("response") { + let data = resp + .text_of("calendar-data") + .or_else(|| resp.text_of("address-data")) + .filter(|s| !s.is_empty()); + if data.is_none() { + continue; + } + out.push(Resource { + href: resp.text_of("href").unwrap_or_default(), + etag: resp.text_of("getetag").unwrap_or_default(), + data, + }); + } + Ok(out) + } + + pub async fn get(&self, href: &str) -> Result { + let (st, headers, text) = self.request("GET", href, None, None, "", &[]).await?; + if st == StatusCode::NOT_FOUND { + bail!("not found"); + } + if !st.is_success() { + bail!("GET {href} returned {st}"); + } + Ok(Resource { + href: href.to_string(), + etag: headers + .get("etag") + .and_then(|v| v.to_str().ok()) + .unwrap_or_default() + .to_string(), + data: Some(text), + }) + } + + /// PUT a resource. `if_match` = Some(etag) for updates, None for create (If-None-Match: *). + pub async fn put( + &self, + href: &str, + body: String, + content_type: &str, + if_match: Option<&str>, + ) -> Result { + let extra = match if_match { + Some(e) if !e.is_empty() => vec![("If-Match", e.to_string())], + Some(_) => vec![], + None => vec![("If-None-Match", "*".to_string())], + }; + let (st, headers, text) = self + .request("PUT", href, None, Some(body), content_type, &extra) + .await?; + if st == StatusCode::PRECONDITION_FAILED { + bail!("conflict: resource changed on server"); + } + if !st.is_success() { + bail!( + "PUT {href} returned {st}: {}", + crate::util::truncate_bytes(&text, 200) + ); + } + let etag = headers + .get("etag") + .and_then(|v| v.to_str().ok()) + .map(|s| s.to_string()); + match etag { + Some(e) => Ok(e), + None => Ok(self.get(href).await.map(|r| r.etag).unwrap_or_default()), + } + } + + pub async fn delete(&self, href: &str, if_match: Option<&str>) -> Result<()> { + let extra = if_match + .filter(|e| !e.is_empty()) + .map(|e| vec![("If-Match", e.to_string())]) + .unwrap_or_default(); + let (st, _, _) = self.request("DELETE", href, None, None, "", &extra).await?; + if st.is_success() || st == StatusCode::NOT_FOUND { + Ok(()) + } else { + Err(anyhow!("DELETE {href} returned {st}")) + } + } + + pub async fn make_collection( + &self, + href: &str, + name: &str, + kind: DavKind, + todo: bool, + ) -> Result<()> { + let n = xml_escape(name); + let (method, body) = match kind { + DavKind::Calendar => ( + "MKCALENDAR", + format!( + r#"{n}"#, + if todo { "VTODO" } else { "VEVENT" } + ), + ), + DavKind::AddressBook => ( + "MKCOL", + format!( + r#"{n}"# + ), + ), + }; + let (st, _, text) = self + .request( + method, + href, + None, + Some(body), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if !st.is_success() { + bail!( + "{method} {href} returned {st}: {}", + crate::util::truncate_bytes(&text, 200) + ); + } + Ok(()) + } + + pub async fn rename(&self, href: &str, name: &str) -> Result<()> { + let body = format!( + r#"{}"#, + xml_escape(name) + ); + let (st, _, _) = self + .request( + "PROPPATCH", + href, + None, + Some(body), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if !(st.is_success() || st.as_u16() == 207) { + bail!("PROPPATCH {href} returned {st}"); + } + Ok(()) + } + + /// addressbook-query text match on FN / EMAIL (GAL search). + pub async fn search_cards(&self, href: &str, text: &str) -> Result> { + let t = xml_escape(text); + let body = format!( + r#" + + + + {t} + {t} + {t} + +"# + ); + let (st, _, resp) = self + .request( + "REPORT", + href, + Some("1"), + Some(body), + "application/xml; charset=utf-8", + &[], + ) + .await?; + if st.as_u16() != 207 { + bail!("addressbook-query returned {st}"); + } + let doc = xmltree::parse(resp.as_bytes())?; + let mut out = Vec::new(); + for r in doc.children_named("response") { + if let Some(d) = r.text_of("address-data").filter(|s| !s.is_empty()) { + out.push(Resource { + href: r.text_of("href").unwrap_or_default(), + etag: r.text_of("getetag").unwrap_or_default(), + data: Some(d), + }); + } + } + Ok(out) + } +} + +pub fn normalize_dir(h: &str) -> String { + let d = percent_decode_str(h).decode_utf8_lossy().into_owned(); + if d.ends_with('/') { + d + } else { + format!("{d}/") + } +} + +pub fn last_segment(h: &str) -> String { + let d = percent_decode_str(h.trim_end_matches('/')) + .decode_utf8_lossy() + .into_owned(); + d.rsplit('/').next().unwrap_or("").to_string() +} + +/// Re-encode a decoded collection path for use in URLs. +pub fn encode_path(path: &str) -> String { + path.split('/') + .map(encode_segment) + .collect::>() + .join("/") +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn paths() { + assert_eq!(normalize_dir("/a/b%20c"), "/a/b c/"); + assert_eq!(last_segment("/a/b/x%40y.ics"), "x@y.ics"); + assert_eq!(encode_path("/a b/c@d/"), "/a%20b/c@d/"); + } +} diff --git a/src/backend/ical.rs b/src/backend/ical.rs new file mode 100644 index 0000000..eca7bf4 --- /dev/null +++ b/src/backend/ical.rs @@ -0,0 +1,412 @@ +//! Generic iCalendar (RFC 5545) / vCard (RFC 6350, 2.1/3.0 tolerant) content-line model. + +#[derive(Debug, Clone, PartialEq)] +pub struct Property { + pub name: String, + pub params: Vec<(String, String)>, + pub value: String, +} + +impl Property { + pub fn new(name: &str, value: impl Into) -> Self { + Property { + name: name.to_ascii_uppercase(), + params: vec![], + value: value.into(), + } + } + + pub fn text(name: &str, value: &str) -> Self { + Property::new(name, escape_text(value)) + } + + pub fn with_param(mut self, k: &str, v: &str) -> Self { + self.params.push((k.to_ascii_uppercase(), v.to_string())); + self + } + + pub fn param(&self, k: &str) -> Option<&str> { + self.params + .iter() + .find(|(n, _)| n.eq_ignore_ascii_case(k)) + .map(|(_, v)| v.as_str()) + } + + /// All TYPE values (handles `TYPE=a,b`, repeated TYPE and vCard 2.1 bare params). + pub fn types(&self) -> Vec { + let mut out = Vec::new(); + for (k, v) in &self.params { + if k.eq_ignore_ascii_case("TYPE") { + out.extend(v.split(',').map(|s| s.trim().to_ascii_lowercase())); + } else if v.is_empty() { + out.push(k.to_ascii_lowercase()); + } + } + out + } + + pub fn text_value(&self) -> String { + unescape_text(&self.value) + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Component { + pub name: String, + pub props: Vec, + pub children: Vec, +} + +impl Component { + pub fn new(name: &str) -> Self { + Component { + name: name.to_ascii_uppercase(), + ..Default::default() + } + } + + pub fn prop(&self, name: &str) -> Option<&Property> { + self.props + .iter() + .find(|p| p.name.eq_ignore_ascii_case(name)) + } + + pub fn props_named<'a>(&'a self, name: &'a str) -> impl Iterator + 'a { + self.props + .iter() + .filter(move |p| p.name.eq_ignore_ascii_case(name)) + } + + pub fn text(&self, name: &str) -> Option { + self.prop(name) + .map(|p| p.text_value()) + .filter(|s| !s.is_empty()) + } + + pub fn remove(&mut self, name: &str) { + self.props.retain(|p| !p.name.eq_ignore_ascii_case(name)); + } + + pub fn set(&mut self, p: Property) { + self.remove(&p.name.clone()); + self.props.push(p); + } + + pub fn add(&mut self, p: Property) { + self.props.push(p); + } + + pub fn child(&self, name: &str) -> Option<&Component> { + self.children + .iter() + .find(|c| c.name.eq_ignore_ascii_case(name)) + } + + pub fn children_named<'a>(&'a self, name: &'a str) -> impl Iterator + 'a { + self.children + .iter() + .filter(move |c| c.name.eq_ignore_ascii_case(name)) + } + + pub fn serialize(&self) -> String { + let mut out = String::new(); + self.write(&mut out); + out + } + + fn write(&self, out: &mut String) { + fold_line(out, &format!("BEGIN:{}", self.name)); + for p in &self.props { + let mut line = p.name.clone(); + for (k, v) in &p.params { + line.push(';'); + line.push_str(k); + line.push('='); + if v.contains([':', ';', ',']) && !v.starts_with('"') { + line.push('"'); + line.push_str(&v.replace('"', "'")); + line.push('"'); + } else { + line.push_str(v); + } + } + line.push(':'); + line.push_str(&p.value); + fold_line(out, &line); + } + for c in &self.children { + c.write(out); + } + fold_line(out, &format!("END:{}", self.name)); + } +} + +fn fold_line(out: &mut String, line: &str) { + // fold at 75 octets on char boundaries + let line = line.replace(['\r', '\n'], ""); + let mut count = 0; + for c in line.chars() { + let l = c.len_utf8(); + if count + l > 75 { + out.push_str("\r\n "); + count = 1; + } + out.push(c); + count += l; + } + out.push_str("\r\n"); +} + +/// Parse an iCalendar/vCard stream. Returns the top-level components. +pub fn parse(input: &str) -> Vec { + // unfold + let mut lines: Vec = Vec::new(); + for raw in input.split('\n') { + let raw = raw.strip_suffix('\r').unwrap_or(raw); + if (raw.starts_with(' ') || raw.starts_with('\t')) && !lines.is_empty() { + lines.last_mut().unwrap().push_str(&raw[1..]); + } else if !raw.is_empty() { + lines.push(raw.to_string()); + } + } + // vCard 2.1 quoted-printable soft line breaks + let mut merged: Vec = Vec::new(); + for l in lines { + if let Some(last) = merged.last_mut() { + if last.to_ascii_uppercase().contains("QUOTED-PRINTABLE") && last.ends_with('=') { + last.pop(); + last.push_str(&l); + continue; + } + } + merged.push(l); + } + + let mut stack: Vec = vec![Component::new("ROOT")]; + for line in merged { + let Some(p) = parse_line(&line) else { continue }; + if p.name == "BEGIN" { + if stack.len() > 32 { + break; + } + stack.push(Component::new(&p.value)); + } else if p.name == "END" { + if stack.len() > 1 { + let c = stack.pop().unwrap(); + stack.last_mut().unwrap().children.push(c); + } + } else if let Some(top) = stack.last_mut() { + if top.props.len() < 10_000 { + top.props.push(p); + } + } + } + while stack.len() > 1 { + let c = stack.pop().unwrap(); + stack.last_mut().unwrap().children.push(c); + } + stack.pop().map(|r| r.children).unwrap_or_default() +} + +fn parse_line(line: &str) -> Option { + // find the first ':' not inside quotes + let mut in_q = false; + let mut colon = None; + for (i, c) in line.char_indices() { + match c { + '"' => in_q = !in_q, + ':' if !in_q => { + colon = Some(i); + break; + } + _ => {} + } + } + let colon = colon?; + let head = &line[..colon]; + let mut value = line[colon + 1..].to_string(); + let mut parts = split_unquoted(head, ';').into_iter(); + let mut name = parts.next()?.trim().to_ascii_uppercase(); + // strip vCard group prefix (item1.EMAIL) + if let Some((_, n)) = name.split_once('.') { + name = n.to_string(); + } + let mut params = Vec::new(); + for p in parts { + match p.split_once('=') { + Some((k, v)) => params.push(( + k.trim().to_ascii_uppercase(), + v.trim().trim_matches('"').to_string(), + )), + None => params.push((p.trim().to_ascii_uppercase(), String::new())), + } + } + let qp = params.iter().any(|(k, v)| { + (k == "ENCODING" && v.eq_ignore_ascii_case("QUOTED-PRINTABLE")) || k == "QUOTED-PRINTABLE" + }); + if qp { + value = decode_qp(&value); + params.retain(|(k, v)| { + !(k == "ENCODING" && v.eq_ignore_ascii_case("QUOTED-PRINTABLE")) + && k != "QUOTED-PRINTABLE" + }); + } + Some(Property { + name, + params, + value, + }) +} + +fn split_unquoted(s: &str, sep: char) -> Vec { + let mut out = Vec::new(); + let mut cur = String::new(); + let mut in_q = false; + for c in s.chars() { + if c == '"' { + in_q = !in_q; + } + if c == sep && !in_q { + out.push(std::mem::take(&mut cur)); + } else { + cur.push(c); + } + } + out.push(cur); + out +} + +fn decode_qp(s: &str) -> String { + let b = s.as_bytes(); + let mut out = Vec::with_capacity(b.len()); + let mut i = 0; + while i < b.len() { + if b[i] == b'=' && i + 2 < b.len() + 1 { + if let (Some(h), Some(l)) = (b.get(i + 1), b.get(i + 2)) { + if let Ok(v) = u8::from_str_radix(&format!("{}{}", *h as char, *l as char), 16) { + out.push(v); + i += 3; + continue; + } + } + } + out.push(b[i]); + i += 1; + } + String::from_utf8_lossy(&out).into_owned() +} + +pub fn escape_text(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + for c in s.chars() { + match c { + '\\' => out.push_str("\\\\"), + ';' => out.push_str("\\;"), + ',' => out.push_str("\\,"), + '\n' => out.push_str("\\n"), + '\r' => {} + _ => out.push(c), + } + } + out +} + +pub fn unescape_text(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + let mut it = s.chars(); + while let Some(c) = it.next() { + if c == '\\' { + match it.next() { + Some('n') | Some('N') => out.push('\n'), + Some(o) => out.push(o), + None => {} + } + } else { + out.push(c); + } + } + out +} + +/// Split a structured value (N, ADR) on unescaped `;`. +pub fn split_structured(s: &str) -> Vec { + let mut out = Vec::new(); + let mut cur = String::new(); + let mut esc = false; + for c in s.chars() { + if esc { + cur.push('\\'); + cur.push(c); + esc = false; + } else if c == '\\' { + esc = true; + } else if c == ';' { + out.push(unescape_text(&std::mem::take(&mut cur))); + } else { + cur.push(c); + } + } + out.push(unescape_text(&cur)); + out +} + +/// Split a list value (CATEGORIES) on unescaped `,`. +pub fn split_list(s: &str) -> Vec { + let mut out = Vec::new(); + let mut cur = String::new(); + let mut esc = false; + for c in s.chars() { + if esc { + cur.push('\\'); + cur.push(c); + esc = false; + } else if c == '\\' { + esc = true; + } else if c == ',' { + out.push(unescape_text(&std::mem::take(&mut cur))); + } else { + cur.push(c); + } + } + out.push(unescape_text(&cur)); + out.into_iter() + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_and_roundtrip() { + let src = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\nUID:abc\r\nSUMMARY:Spotkanie\\, ważne\r\nDESCRIPTION:Linia 1\\nLinia 2 bardzo długa linia, która musi zostać zawinięta bo przekracza 75 bajtów w UTF-8 ąęś\r\nDTSTART;TZID=Europe/Warsaw:20261105T100000\r\nATTENDEE;CN=\"Kowalski, Jan\";PARTSTAT=ACCEPTED:mailto:jan@x.pl\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"; + let c = parse(src); + assert_eq!(c.len(), 1); + let ev = c[0].child("VEVENT").unwrap(); + assert_eq!(ev.text("SUMMARY").unwrap(), "Spotkanie, ważne"); + assert_eq!( + ev.prop("DTSTART").unwrap().param("TZID"), + Some("Europe/Warsaw") + ); + assert_eq!( + ev.prop("ATTENDEE").unwrap().param("CN"), + Some("Kowalski, Jan") + ); + let again = parse(&c[0].serialize()); + assert_eq!(again[0], c[0]); + } + + #[test] + fn vcard21() { + let src = "BEGIN:VCARD\nVERSION:2.1\nitem1.TEL;CELL;PREF:+48 600\nN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kowalsk=C4=85;Anna;;;\nEND:VCARD\n"; + let c = parse(src); + let tel = c[0].prop("TEL").unwrap(); + assert!(tel.types().contains(&"cell".to_string())); + assert_eq!( + split_structured(&c[0].prop("N").unwrap().value)[0], + "Kowalską" + ); + } +} diff --git a/src/backend/imap.rs b/src/backend/imap.rs new file mode 100644 index 0000000..9cd1ffe --- /dev/null +++ b/src/backend/imap.rs @@ -0,0 +1,1072 @@ +//! Minimal, strict async IMAP4rev1 client (RFC 3501 + UIDPLUS, MOVE, SPECIAL-USE, CONDSTORE). +//! +//! Only the subset needed by the ActiveSync gateway is implemented. Every command runs under +//! a timeout, response size is bounded and literals are length checked. + +use std::sync::Arc; +use std::time::Duration; + +use anyhow::{anyhow, bail, Context, Result}; +use base64::Engine; +use tokio::io::{AsyncBufReadExt, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, BufReader}; +use tokio::net::TcpStream; +use tokio_rustls::client::TlsStream; + +use crate::config::{ImapSettings, TlsMode}; +use crate::tls::client_config; + +/// Max size of one response (protects against hostile/broken servers). Messages larger than +/// this cannot be synchronised. +const MAX_RESPONSE: usize = 256 * 1024 * 1024; + +enum Stream { + Plain(TcpStream), + Tls(Box>), +} + +impl AsyncRead for Stream { + fn poll_read( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &mut tokio::io::ReadBuf<'_>, + ) -> std::task::Poll> { + match self.get_mut() { + Stream::Plain(s) => std::pin::Pin::new(s).poll_read(cx, buf), + Stream::Tls(s) => std::pin::Pin::new(s.as_mut()).poll_read(cx, buf), + } + } +} + +impl AsyncWrite for Stream { + fn poll_write( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &[u8], + ) -> std::task::Poll> { + match self.get_mut() { + Stream::Plain(s) => std::pin::Pin::new(s).poll_write(cx, buf), + Stream::Tls(s) => std::pin::Pin::new(s.as_mut()).poll_write(cx, buf), + } + } + fn poll_flush( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + match self.get_mut() { + Stream::Plain(s) => std::pin::Pin::new(s).poll_flush(cx), + Stream::Tls(s) => std::pin::Pin::new(s.as_mut()).poll_flush(cx), + } + } + fn poll_shutdown( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + match self.get_mut() { + Stream::Plain(s) => std::pin::Pin::new(s).poll_shutdown(cx), + Stream::Tls(s) => std::pin::Pin::new(s.as_mut()).poll_shutdown(cx), + } + } +} + +// ------------------------------------------------------------------ values + +#[derive(Debug, Clone, PartialEq)] +pub enum Value { + Atom(String), + Str(Vec), + List(Vec), + Nil, +} + +impl Value { + pub fn as_str(&self) -> Option { + match self { + Value::Atom(a) => Some(a.clone()), + Value::Str(s) => Some(String::from_utf8_lossy(s).into_owned()), + _ => None, + } + } + pub fn as_u64(&self) -> Option { + match self { + Value::Atom(a) => a.parse().ok(), + _ => None, + } + } + pub fn as_list(&self) -> &[Value] { + match self { + Value::List(l) => l, + _ => &[], + } + } + pub fn into_bytes(self) -> Vec { + match self { + Value::Str(s) => s, + Value::Atom(a) => a.into_bytes(), + _ => Vec::new(), + } + } +} + +struct Tokenizer<'a> { + b: &'a [u8], + p: usize, +} + +impl<'a> Tokenizer<'a> { + fn skip_ws(&mut self) { + while self.p < self.b.len() && (self.b[self.p] == b' ') { + self.p += 1; + } + } + + fn at_end(&mut self) -> bool { + self.skip_ws(); + self.p >= self.b.len() || self.b[self.p] == b'\r' || self.b[self.p] == b'\n' + } + + fn value(&mut self) -> Result { + self.skip_ws(); + let c = *self + .b + .get(self.p) + .ok_or_else(|| anyhow!("imap: unexpected end"))?; + match c { + b'(' => { + self.p += 1; + let mut items = Vec::new(); + loop { + self.skip_ws(); + match self.b.get(self.p) { + Some(b')') => { + self.p += 1; + break; + } + None => bail!("imap: unterminated list"), + _ => items.push(self.value()?), + } + } + Ok(Value::List(items)) + } + b'"' => { + self.p += 1; + let mut out = Vec::new(); + loop { + let c = *self + .b + .get(self.p) + .ok_or_else(|| anyhow!("imap: unterminated string"))?; + self.p += 1; + match c { + b'\\' => { + let n = *self + .b + .get(self.p) + .ok_or_else(|| anyhow!("imap: bad escape"))?; + self.p += 1; + out.push(n); + } + b'"' => break, + _ => out.push(c), + } + } + Ok(Value::Str(out)) + } + b'{' => { + let close = self.b[self.p..] + .iter() + .position(|c| *c == b'}') + .ok_or_else(|| anyhow!("imap: bad literal"))?; + let num = + std::str::from_utf8(&self.b[self.p + 1..self.p + close])?.trim_end_matches('+'); + let n: usize = num.parse()?; + self.p += close + 1; + if self.b.get(self.p) == Some(&b'\r') { + self.p += 1; + } + if self.b.get(self.p) == Some(&b'\n') { + self.p += 1; + } + if self.p + n > self.b.len() { + bail!("imap: literal overflow"); + } + let v = self.b[self.p..self.p + n].to_vec(); + self.p += n; + Ok(Value::Str(v)) + } + _ => { + let start = self.p; + let mut depth = 0i32; + while self.p < self.b.len() { + let c = self.b[self.p]; + if c == b'[' { + depth += 1; + } else if c == b']' { + depth -= 1; + } else if depth <= 0 + && (c == b' ' || c == b'(' || c == b')' || c == b'\r' || c == b'\n') + { + break; + } + self.p += 1; + } + let atom = String::from_utf8_lossy(&self.b[start..self.p]).into_owned(); + if atom.eq_ignore_ascii_case("NIL") { + Ok(Value::Nil) + } else { + Ok(Value::Atom(atom)) + } + } + } + } + + fn rest_text(&mut self) -> String { + self.skip_ws(); + let s = String::from_utf8_lossy(&self.b[self.p..]) + .trim_end() + .to_string(); + self.p = self.b.len(); + s + } +} + +#[derive(Debug)] +pub struct Untagged { + pub raw: Vec, +} + +impl Untagged { + /// Tokenize the untagged response (without the leading `* `). + pub fn values(&self) -> Result> { + let mut t = Tokenizer { + b: &self.raw[2..], + p: 0, + }; + let mut out = Vec::new(); + // status responses carry free text; only tokenize the leading code + let first = t.value()?; + let is_status = matches!(&first, Value::Atom(a) if ["OK","NO","BAD","BYE","PREAUTH"].contains(&a.to_ascii_uppercase().as_str())); + out.push(first); + if is_status { + t.skip_ws(); + if t.b.get(t.p) == Some(&b'[') { + let v = t.value()?; + out.push(v); + } + out.push(Value::Str(t.rest_text().into_bytes())); + return Ok(out); + } + while !t.at_end() { + out.push(t.value()?); + } + Ok(out) + } + + pub fn kind(&self) -> String { + // `* 12 FETCH` -> FETCH ; `* LIST` -> LIST + let s = String::from_utf8_lossy(&self.raw[2..self.raw.len().min(64)]).to_string(); + let mut parts = s.split_whitespace(); + let a = parts.next().unwrap_or("").to_ascii_uppercase(); + if a.chars().all(|c| c.is_ascii_digit()) { + parts.next().unwrap_or("").to_ascii_uppercase() + } else { + a + } + } +} + +#[derive(Debug, Clone)] +pub struct Mailbox { + pub name: String, + pub delimiter: Option, + pub attributes: Vec, +} + +impl Mailbox { + pub fn has_attr(&self, a: &str) -> bool { + self.attributes.iter().any(|x| x.eq_ignore_ascii_case(a)) + } +} + +#[derive(Debug, Clone, Default)] +pub struct MailboxStatus { + pub messages: u32, + pub uidnext: u32, + pub uidvalidity: u32, + pub unseen: u32, + pub highestmodseq: u64, +} + +#[derive(Debug, Clone)] +pub struct FlagInfo { + pub uid: u32, + pub flags: Vec, + pub size: u32, +} + +#[derive(Debug, Clone)] +pub struct FetchedMessage { + pub uid: u32, + pub flags: Vec, + pub internal_date: Option>, + pub body: Vec, + pub size: u32, +} + +pub struct ImapConn { + io: BufReader, + tag: u32, + pub caps: Vec, + pub selected: Option, + pub uidvalidity: u32, + timeout: Duration, + pub last_used: std::time::Instant, + pub broken: bool, +} + +impl ImapConn { + pub async fn connect(cfg: &ImapSettings) -> Result { + let timeout = Duration::from_secs(cfg.timeout_secs.max(5)); + let addr = format!("{}:{}", cfg.host, cfg.port); + let tcp = tokio::time::timeout(timeout, TcpStream::connect(&addr)) + .await + .map_err(|_| anyhow!("IMAP connect timeout ({addr})"))? + .with_context(|| format!("IMAP connect {addr}"))?; + let _ = tcp.set_nodelay(true); + let stream = if cfg.security == TlsMode::Tls { + Stream::Tls(Box::new(tls_wrap(tcp, &cfg.host, cfg.verify_tls).await?)) + } else { + Stream::Plain(tcp) + }; + let mut conn = ImapConn { + io: BufReader::with_capacity(64 * 1024, stream), + tag: 0, + caps: Vec::new(), + selected: None, + uidvalidity: 0, + timeout, + last_used: std::time::Instant::now(), + broken: false, + }; + let greeting = conn.read_line_full().await?; + if !greeting.starts_with(b"* OK") && !greeting.starts_with(b"* PREAUTH") { + bail!( + "IMAP greeting rejected: {}", + String::from_utf8_lossy(&greeting).trim() + ); + } + conn.capability().await?; + if cfg.security == TlsMode::StartTls { + if !conn.has_cap("STARTTLS") { + bail!("IMAP server does not offer STARTTLS"); + } + conn.run("STARTTLS").await?; + let inner = conn.io.into_inner(); + let tcp = match inner { + Stream::Plain(t) => t, + Stream::Tls(_) => bail!("already TLS"), + }; + conn.io = BufReader::with_capacity( + 64 * 1024, + Stream::Tls(Box::new(tls_wrap(tcp, &cfg.host, cfg.verify_tls).await?)), + ); + conn.capability().await?; + } + Ok(conn) + } + + pub fn has_cap(&self, c: &str) -> bool { + self.caps.iter().any(|x| x.eq_ignore_ascii_case(c)) + } + + async fn capability(&mut self) -> Result<()> { + let (untagged, _) = self.run("CAPABILITY").await?; + for u in untagged { + if u.kind() == "CAPABILITY" { + self.caps = String::from_utf8_lossy(&u.raw[2..]) + .split_whitespace() + .skip(1) + .map(|s| s.to_ascii_uppercase()) + .collect(); + } + } + Ok(()) + } + + pub async fn login(&mut self, user: &str, pass: &str) -> Result { + let res = if self.has_cap("AUTH=PLAIN") { + let mut raw = Vec::with_capacity(user.len() + pass.len() + 2); + raw.push(0); + raw.extend_from_slice(user.as_bytes()); + raw.push(0); + raw.extend_from_slice(pass.as_bytes()); + let b64 = base64::engine::general_purpose::STANDARD.encode(&raw); + zeroize::Zeroize::zeroize(&mut raw); + if self.has_cap("SASL-IR") { + self.run_secret(&format!("AUTHENTICATE PLAIN {b64}")).await + } else { + self.run_with_continuation("AUTHENTICATE PLAIN", b64.as_bytes()) + .await + } + } else { + if self.has_cap("LOGINDISABLED") { + bail!("IMAP LOGIN disabled and AUTH=PLAIN not offered (TLS required?)"); + } + let cmd = format!("LOGIN {} {}", quote(user), quote(pass)); + self.run_secret(&cmd).await + }; + match res { + Ok(_) => { + // capabilities may change after login + let _ = self.capability().await; + Ok(true) + } + Err(e) => { + let msg = e.to_string(); + if msg.contains("IMAP NO") || msg.contains("IMAP BAD") { + Ok(false) + } else { + Err(e) + } + } + } + } + + pub async fn logout(&mut self) { + let _ = tokio::time::timeout(Duration::from_secs(2), self.run("LOGOUT")).await; + } + + pub async fn noop(&mut self) -> Result<()> { + self.run("NOOP").await.map(|_| ()) + } + + pub async fn list(&mut self) -> Result> { + let cmd = if self.has_cap("SPECIAL-USE") && self.has_cap("LIST-EXTENDED") { + "LIST \"\" \"*\" RETURN (SPECIAL-USE)" + } else { + "LIST \"\" \"*\"" + }; + let (untagged, _) = self.run(cmd).await?; + let mut out = Vec::new(); + for u in untagged { + if u.kind() != "LIST" { + continue; + } + let v = u.values()?; + // LIST (attrs) "delim" name + if v.len() < 4 { + continue; + } + let attrs = v[1] + .as_list() + .iter() + .filter_map(|a| a.as_str()) + .collect::>(); + let delim = v[2].as_str().and_then(|s| s.chars().next()); + let name = match v[3].as_str() { + Some(n) => n, + None => continue, + }; + out.push(Mailbox { + name, + delimiter: delim, + attributes: attrs, + }); + } + Ok(out) + } + + /// Leave the selected mailbox without expunging (UNSELECT, RFC 3691). + pub async fn unselect(&mut self) -> Result<()> { + if self.selected.is_some() { + if self.has_cap("UNSELECT") { + self.run("UNSELECT").await?; + } else { + // EXAMINE of a non-existent mailbox leaves the selected state without CLOSE's expunge + let _ = self.run("EXAMINE \"\"").await; + } + self.selected = None; + } + Ok(()) + } + + pub async fn status(&mut self, mailbox: &str) -> Result { + // STATUS on the selected mailbox may report the (stale) session view + if self.selected.as_deref() == Some(mailbox) { + self.unselect().await?; + } + let items = if self.has_cap("CONDSTORE") { + "(MESSAGES UIDNEXT UIDVALIDITY UNSEEN HIGHESTMODSEQ)" + } else { + "(MESSAGES UIDNEXT UIDVALIDITY UNSEEN)" + }; + let (untagged, _) = self + .run(&format!("STATUS {} {items}", quote(mailbox))) + .await?; + let mut st = MailboxStatus::default(); + for u in untagged { + if u.kind() != "STATUS" { + continue; + } + let v = u.values()?; + if let Some(Value::List(l)) = v.get(2) { + let mut it = l.iter(); + while let (Some(k), Some(val)) = (it.next(), it.next()) { + let n = val.as_u64().unwrap_or(0); + match k.as_str().unwrap_or_default().to_ascii_uppercase().as_str() { + "MESSAGES" => st.messages = n as u32, + "UIDNEXT" => st.uidnext = n as u32, + "UIDVALIDITY" => st.uidvalidity = n as u32, + "UNSEEN" => st.unseen = n as u32, + "HIGHESTMODSEQ" => st.highestmodseq = n, + _ => {} + } + } + } + } + Ok(st) + } + + pub async fn select(&mut self, mailbox: &str) -> Result { + if self.selected.as_deref() == Some(mailbox) { + // refresh the view of the already selected mailbox (new EXISTS/EXPUNGE) + self.run("NOOP").await?; + return Ok(self.uidvalidity); + } + self.selected = None; + let (untagged, _) = self.run(&format!("SELECT {}", quote(mailbox))).await?; + let mut uv = 0; + for u in untagged { + let s = String::from_utf8_lossy(&u.raw); + if let Some(i) = s.find("[UIDVALIDITY ") { + uv = s[i + 13..] + .split(']') + .next() + .and_then(|x| x.trim().parse().ok()) + .unwrap_or(0); + } + } + self.selected = Some(mailbox.to_string()); + self.uidvalidity = uv; + Ok(uv) + } + + pub async fn uid_search(&mut self, criteria: &str) -> Result> { + let (untagged, _) = self.run(&format!("UID SEARCH {criteria}")).await?; + let mut out = Vec::new(); + for u in untagged { + if u.kind() == "SEARCH" { + for v in String::from_utf8_lossy(&u.raw[2..]) + .split_whitespace() + .skip(1) + { + if let Ok(n) = v.parse() { + out.push(n); + } + } + } + } + out.sort_unstable(); + Ok(out) + } + + /// UID SEARCH with a UTF-8 charset and literal argument (for user supplied text). + pub async fn uid_search_text( + &mut self, + key: &str, + text: &str, + extra: &str, + ) -> Result> { + let lit = text.as_bytes(); + let cmd = format!("UID SEARCH CHARSET UTF-8 {extra}{key} {{{}}}", lit.len()); + let (untagged, _) = self.run_with_continuation(&cmd, lit).await?; + let mut out = Vec::new(); + for u in untagged { + if u.kind() == "SEARCH" { + for v in String::from_utf8_lossy(&u.raw[2..]) + .split_whitespace() + .skip(1) + { + if let Ok(n) = v.parse() { + out.push(n); + } + } + } + } + out.sort_unstable(); + Ok(out) + } + + pub async fn uid_fetch_flags(&mut self, set: &str) -> Result> { + let (untagged, _) = self + .run(&format!("UID FETCH {set} (UID FLAGS RFC822.SIZE)")) + .await?; + let mut out = Vec::new(); + for u in untagged { + if u.kind() != "FETCH" { + continue; + } + let v = u.values()?; + let Some(Value::List(items)) = v.get(2) else { + continue; + }; + let mut info = FlagInfo { + uid: 0, + flags: vec![], + size: 0, + }; + let mut it = items.iter(); + while let (Some(k), Some(val)) = (it.next(), it.next()) { + match k.as_str().unwrap_or_default().to_ascii_uppercase().as_str() { + "UID" => info.uid = val.as_u64().unwrap_or(0) as u32, + "RFC822.SIZE" => info.size = val.as_u64().unwrap_or(0) as u32, + "FLAGS" => { + info.flags = val.as_list().iter().filter_map(|f| f.as_str()).collect() + } + _ => {} + } + } + if info.uid > 0 { + out.push(info); + } + } + Ok(out) + } + + /// Fetch full messages (BODY.PEEK[] does not set \Seen). + pub async fn uid_fetch_full(&mut self, set: &str) -> Result> { + self.uid_fetch_section(set, "BODY.PEEK[]").await + } + + /// Fetch only headers (cheap listing for search results). + pub async fn uid_fetch_headers(&mut self, set: &str) -> Result> { + self.uid_fetch_section(set, "BODY.PEEK[HEADER]").await + } + + async fn uid_fetch_section(&mut self, set: &str, section: &str) -> Result> { + let (untagged, _) = self + .run(&format!( + "UID FETCH {set} (UID FLAGS INTERNALDATE RFC822.SIZE {section})" + )) + .await?; + let mut out = Vec::new(); + for u in untagged { + if u.kind() != "FETCH" { + continue; + } + let v = u.values()?; + let Some(Value::List(items)) = v.get(2) else { + continue; + }; + let mut m = FetchedMessage { + uid: 0, + flags: vec![], + internal_date: None, + body: vec![], + size: 0, + }; + let mut it = items.iter().cloned(); + while let (Some(k), Some(val)) = (it.next(), it.next()) { + let key = k.as_str().unwrap_or_default().to_ascii_uppercase(); + match key.as_str() { + "UID" => m.uid = val.as_u64().unwrap_or(0) as u32, + "RFC822.SIZE" => m.size = val.as_u64().unwrap_or(0) as u32, + "FLAGS" => m.flags = val.as_list().iter().filter_map(|f| f.as_str()).collect(), + "INTERNALDATE" => { + m.internal_date = val.as_str().and_then(|s| { + chrono::DateTime::parse_from_str(&s, "%d-%b-%Y %H:%M:%S %z") + .ok() + .map(|d| d.with_timezone(&chrono::Utc)) + }) + } + k if k.starts_with("BODY[") => m.body = val.into_bytes(), + _ => {} + } + } + if m.uid > 0 { + out.push(m); + } + } + Ok(out) + } + + pub async fn uid_store(&mut self, uid: u32, op: &str, flags: &str) -> Result<()> { + self.run(&format!("UID STORE {uid} {op}FLAGS.SILENT ({flags})")) + .await + .map(|_| ()) + } + + /// Move a message; returns the new UID when the server reports COPYUID. + pub async fn uid_move(&mut self, uid: u32, dest: &str) -> Result> { + if self.has_cap("MOVE") { + let (untagged, tagged) = self.run(&format!("UID MOVE {uid} {}", quote(dest))).await?; + let mut all: Vec = untagged + .iter() + .map(|u| String::from_utf8_lossy(&u.raw).into_owned()) + .collect(); + all.push(tagged); + return Ok(all.iter().find_map(|s| parse_copyuid(s))); + } + let (_, tagged) = self.run(&format!("UID COPY {uid} {}", quote(dest))).await?; + let new_uid = parse_copyuid(&tagged); + self.uid_store(uid, "+", "\\Deleted").await?; + self.uid_expunge(uid).await?; + Ok(new_uid) + } + + pub async fn uid_expunge(&mut self, uid: u32) -> Result<()> { + if self.has_cap("UIDPLUS") { + self.run(&format!("UID EXPUNGE {uid}")).await.map(|_| ()) + } else { + self.run("EXPUNGE").await.map(|_| ()) + } + } + + pub async fn append(&mut self, mailbox: &str, flags: &str, data: &[u8]) -> Result> { + let cmd = format!("APPEND {} ({flags}) {{{}}}", quote(mailbox), data.len()); + let (_, tagged) = self.run_with_continuation(&cmd, data).await?; + // [APPENDUID uidvalidity uid] + Ok(tagged.find("[APPENDUID ").and_then(|i| { + tagged[i + 11..] + .split(']') + .next() + .and_then(|s| s.split_whitespace().nth(1)) + .and_then(|s| s.parse().ok()) + })) + } + + pub async fn create(&mut self, mailbox: &str) -> Result<()> { + self.run(&format!("CREATE {}", quote(mailbox))).await?; + let _ = self.run(&format!("SUBSCRIBE {}", quote(mailbox))).await; + Ok(()) + } + + pub async fn rename(&mut self, from: &str, to: &str) -> Result<()> { + if self.selected.as_deref() == Some(from) { + self.selected = None; + } + self.run(&format!("RENAME {} {}", quote(from), quote(to))) + .await?; + let _ = self.run(&format!("UNSUBSCRIBE {}", quote(from))).await; + let _ = self.run(&format!("SUBSCRIBE {}", quote(to))).await; + Ok(()) + } + + pub async fn delete(&mut self, mailbox: &str) -> Result<()> { + if self.selected.as_deref() == Some(mailbox) { + self.run("CLOSE").await.ok(); + self.selected = None; + } + let _ = self.run(&format!("UNSUBSCRIBE {}", quote(mailbox))).await; + self.run(&format!("DELETE {}", quote(mailbox))) + .await + .map(|_| ()) + } + + // ------------------------------------------------------------- plumbing + + async fn send_line(&mut self, line: &[u8]) -> Result<()> { + let s = self.io.get_mut(); + s.write_all(line).await?; + s.write_all(b"\r\n").await?; + s.flush().await?; + Ok(()) + } + + fn next_tag(&mut self) -> String { + self.tag += 1; + format!("A{:04}", self.tag) + } + + pub async fn run(&mut self, cmd: &str) -> Result<(Vec, String)> { + self.run_inner(cmd, None, false).await + } + + async fn run_secret(&mut self, cmd: &str) -> Result<(Vec, String)> { + self.run_inner(cmd, None, true).await + } + + async fn run_with_continuation( + &mut self, + cmd: &str, + payload: &[u8], + ) -> Result<(Vec, String)> { + self.run_inner(cmd, Some(payload), false).await + } + + async fn run_inner( + &mut self, + cmd: &str, + payload: Option<&[u8]>, + secret: bool, + ) -> Result<(Vec, String)> { + if self.broken { + bail!("IMAP connection is broken"); + } + let timeout = self.timeout; + let fut = self.run_raw(cmd, payload); + let res = match tokio::time::timeout(timeout, fut).await { + Ok(r) => r, + Err(_) => { + self.broken = true; + Err(anyhow!("IMAP command timeout")) + } + }; + self.last_used = std::time::Instant::now(); + if let Err(e) = &res { + let m = e.to_string(); + if !(m.contains("IMAP NO") || m.contains("IMAP BAD")) { + self.broken = true; + } + if secret { + return Err(anyhow!("{}", m.split(':').next().unwrap_or("IMAP error"))); + } + } + res + } + + async fn run_raw( + &mut self, + cmd: &str, + payload: Option<&[u8]>, + ) -> Result<(Vec, String)> { + let tag = self.next_tag(); + self.send_line(format!("{tag} {cmd}").as_bytes()).await?; + let mut untagged = Vec::new(); + let mut payload_sent = payload.is_none(); + loop { + let line = self.read_line_full().await?; + if line.starts_with(b"+") { + if let Some(p) = payload.filter(|_| !payload_sent) { + let s = self.io.get_mut(); + s.write_all(p).await?; + s.write_all(b"\r\n").await?; + s.flush().await?; + payload_sent = true; + continue; + } + // unexpected continuation (e.g. SASL challenge): cancel + self.send_line(b"*").await?; + continue; + } + if line.starts_with(b"* ") { + if line.len() > 6 && line[2..].starts_with(b"BYE") { + self.broken = true; + } + untagged.push(Untagged { raw: line }); + continue; + } + if line.starts_with(tag.as_bytes()) { + let rest = String::from_utf8_lossy(&line[tag.len()..]) + .trim() + .to_string(); + let upper = rest.to_ascii_uppercase(); + if upper.starts_with("OK") { + return Ok((untagged, rest)); + } + let verb = cmd.split_whitespace().next().unwrap_or(""); + if upper.starts_with("NO") { + bail!("IMAP NO ({verb}): {}", truncate(&rest, 200)); + } + bail!("IMAP BAD ({verb}): {}", truncate(&rest, 200)); + } + // stray line, ignore + } + } + + /// Read one logical response line including any literal payloads. + async fn read_line_full(&mut self) -> Result> { + let mut buf: Vec = Vec::with_capacity(256); + loop { + let start = buf.len(); + let n = self.io.read_until(b'\n', &mut buf).await?; + if n == 0 { + self.broken = true; + bail!("IMAP connection closed"); + } + if buf.len() > MAX_RESPONSE { + self.broken = true; + bail!("IMAP response too large"); + } + let chunk = &buf[start..]; + // literal at end of line: {123}\r\n + let trimmed = chunk + .strip_suffix(b"\r\n") + .or_else(|| chunk.strip_suffix(b"\n")); + if let Some(t) = trimmed { + if t.ends_with(b"}") { + if let Some(open) = t.iter().rposition(|c| *c == b'{') { + let num = std::str::from_utf8(&t[open + 1..t.len() - 1]) + .unwrap_or("") + .trim_end_matches('+'); + if let Ok(len) = num.parse::() { + if buf.len() + len > MAX_RESPONSE { + self.broken = true; + bail!("IMAP literal too large"); + } + let old = buf.len(); + buf.resize(old + len, 0); + self.io.read_exact(&mut buf[old..]).await?; + continue; + } + } + } + } + return Ok(buf); + } + } +} + +fn truncate(s: &str, n: usize) -> String { + if s.len() <= n { + s.to_string() + } else { + let mut i = n; + while !s.is_char_boundary(i) { + i -= 1; + } + format!("{}…", &s[..i]) + } +} + +fn parse_copyuid(s: &str) -> Option { + let i = s.find("[COPYUID ")?; + let inner = s[i + 9..].split(']').next()?; + let dst = inner.split_whitespace().nth(2)?; + // single uid expected + dst.split(':').next()?.split(',').next()?.parse().ok() +} + +/// Quote an IMAP string (UTF-8 safe for mailbox names already encoded in modified UTF-7). +pub fn quote(s: &str) -> String { + let mut out = String::with_capacity(s.len() + 2); + out.push('"'); + for c in s.chars() { + if c == '"' || c == '\\' { + out.push('\\'); + } + if c == '\r' || c == '\n' { + continue; + } + out.push(c); + } + out.push('"'); + out +} + +async fn tls_wrap(tcp: TcpStream, host: &str, verify: bool) -> Result> { + let cfg: Arc = client_config(verify); + let connector = tokio_rustls::TlsConnector::from(cfg); + let name = rustls::pki_types::ServerName::try_from(host.to_string()) + .map_err(|_| anyhow!("invalid TLS server name {host}"))?; + connector.connect(name, tcp).await.context("TLS handshake") +} + +// ------------------------------------------------------------- modified UTF-7 + +/// Decode an IMAP modified UTF-7 mailbox name (RFC 3501 5.1.3). +pub fn utf7_decode(s: &str) -> String { + let mut out = String::new(); + let mut chars = s.chars().peekable(); + while let Some(c) = chars.next() { + if c != '&' { + out.push(c); + continue; + } + let mut b64 = String::new(); + for d in chars.by_ref() { + if d == '-' { + break; + } + b64.push(if d == ',' { '/' } else { d }); + } + if b64.is_empty() { + out.push('&'); + continue; + } + let bytes = base64::engine::general_purpose::STANDARD_NO_PAD + .decode(b64.trim_end_matches('=')) + .unwrap_or_default(); + let units: Vec = bytes + .chunks(2) + .filter(|c| c.len() == 2) + .map(|c| u16::from_be_bytes([c[0], c[1]])) + .collect(); + out.push_str(&String::from_utf16_lossy(&units)); + } + out +} + +pub fn utf7_encode(s: &str) -> String { + let mut out = String::new(); + let mut pending: Vec = Vec::new(); + let flush = |pending: &mut Vec, out: &mut String| { + if pending.is_empty() { + return; + } + let bytes: Vec = pending.iter().flat_map(|u| u.to_be_bytes()).collect(); + let enc = base64::engine::general_purpose::STANDARD_NO_PAD + .encode(bytes) + .replace('/', ","); + out.push('&'); + out.push_str(&enc); + out.push('-'); + pending.clear(); + }; + for c in s.chars() { + if (' '..='~').contains(&c) { + flush(&mut pending, &mut out); + if c == '&' { + out.push_str("&-"); + } else { + out.push(c); + } + } else { + let mut buf = [0u16; 2]; + pending.extend_from_slice(c.encode_utf16(&mut buf)); + } + } + flush(&mut pending, &mut out); + out +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn utf7_roundtrip() { + for s in ["INBOX", "Wysłane", "Kosz & śmieci", "日本語", "a&b"] { + assert_eq!(utf7_decode(&utf7_encode(s)), s); + } + assert_eq!(utf7_decode("Wys&AUI-ane"), "Wysłane"); + assert_eq!(utf7_encode("Wysłane"), "Wys&AUI-ane"); + } + + #[test] + fn tokenize_fetch() { + let raw = + b"* 12 FETCH (UID 55 FLAGS (\\Seen $Forwarded) RFC822.SIZE 10 BODY[] {5}\r\nhello)\r\n" + .to_vec(); + let u = Untagged { raw }; + assert_eq!(u.kind(), "FETCH"); + let v = u.values().unwrap(); + let items = v[2].as_list(); + assert_eq!(items[1].as_u64(), Some(55)); + assert_eq!(items[7].clone().into_bytes(), b"hello"); + } + + #[test] + fn tokenize_list() { + let u = Untagged { + raw: b"* LIST (\\HasNoChildren \\Sent) \"/\" \"Sent Items\"\r\n".to_vec(), + }; + let v = u.values().unwrap(); + assert_eq!(v[3].as_str().unwrap(), "Sent Items"); + assert_eq!(v[2].as_str().unwrap(), "/"); + } + + #[test] + fn copyuid() { + assert_eq!(parse_copyuid("* OK [COPYUID 123 4 99] Moved"), Some(99)); + } +} diff --git a/src/backend/mime.rs b/src/backend/mime.rs new file mode 100644 index 0000000..a24d8cd --- /dev/null +++ b/src/backend/mime.rs @@ -0,0 +1,247 @@ +//! Small MIME builder used for SmartReply / SmartForward composition. + +use base64::Engine; +use rand::Rng; + +pub struct Attachment { + pub name: String, + pub content_type: String, + pub data: Vec, + pub content_id: Option, + pub inline: bool, +} + +fn boundary() -> String { + let n: u64 = rand::thread_rng().gen(); + format!("=_ap_{n:016x}") +} + +fn b64_lines(data: &[u8]) -> String { + let enc = base64::engine::general_purpose::STANDARD.encode(data); + let mut out = String::with_capacity(enc.len() + enc.len() / 76 * 2 + 2); + for chunk in enc.as_bytes().chunks(76) { + out.push_str(std::str::from_utf8(chunk).unwrap_or("")); + out.push_str("\r\n"); + } + out +} + +/// RFC 2047 encoded-word for header values / filenames when needed. +pub fn encode_word(s: &str) -> String { + if s.chars().all(|c| c.is_ascii() && !c.is_ascii_control()) && !s.contains("=?") { + return s.to_string(); + } + format!( + "=?UTF-8?B?{}?=", + base64::engine::general_purpose::STANDARD.encode(s.as_bytes()) + ) +} + +fn quote_param(s: &str) -> String { + let e = encode_word(s); + format!("\"{}\"", e.replace(['"', '\\', '\r', '\n'], "_")) +} + +/// Build a complete message from header lines (already folded/encoded), bodies and attachments. +pub fn build( + headers: &[(String, String)], + text: Option<&str>, + html: Option<&str>, + atts: &[Attachment], +) -> Vec { + let mut out = String::new(); + for (k, v) in headers { + let v = v.replace(['\r', '\n'], " "); + out.push_str(&format!("{k}: {v}\r\n")); + } + out.push_str("MIME-Version: 1.0\r\n"); + + let text_part = |t: &str| { + format!( + "Content-Type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n\r\n{}", + b64_lines(t.replace("\r\n", "\n").replace('\n', "\r\n").as_bytes()) + ) + }; + let html_part = |h: &str| { + format!( + "Content-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: base64\r\n\r\n{}", + b64_lines(h.as_bytes()) + ) + }; + let body = match (text, html) { + (Some(t), Some(h)) => { + let b = boundary(); + format!( + "Content-Type: multipart/alternative; boundary=\"{b}\"\r\n\r\n--{b}\r\n{}--{b}\r\n{}--{b}--\r\n", + text_part(t), + html_part(h) + ) + } + (Some(t), None) => text_part(t), + (None, Some(h)) => html_part(h), + (None, None) => text_part(""), + }; + if atts.is_empty() { + out.push_str(&body); + return out.into_bytes(); + } + let b = boundary(); + out.push_str(&format!( + "Content-Type: multipart/mixed; boundary=\"{b}\"\r\n\r\nThis is a multi-part message in MIME format.\r\n--{b}\r\n{body}" + )); + for a in atts { + let ct = if a.content_type.contains('/') { + a.content_type.clone() + } else { + "application/octet-stream".into() + }; + out.push_str(&format!("\r\n--{b}\r\n")); + if ct.eq_ignore_ascii_case("message/rfc822") { + out.push_str(&format!( + "Content-Type: message/rfc822; name={}\r\nContent-Disposition: attachment; filename={}\r\n\r\n", + quote_param(&a.name), + quote_param(&a.name) + )); + out.push_str(&String::from_utf8_lossy(&a.data)); + continue; + } + out.push_str(&format!( + "Content-Type: {ct}; name={}\r\n", + quote_param(&a.name) + )); + out.push_str("Content-Transfer-Encoding: base64\r\n"); + if let Some(cid) = &a.content_id { + out.push_str(&format!( + "Content-ID: <{}>\r\n", + cid.trim_matches(['<', '>']) + )); + } + out.push_str(&format!( + "Content-Disposition: {}; filename={}\r\n\r\n", + if a.inline { "inline" } else { "attachment" }, + quote_param(&a.name) + )); + out.push_str(&b64_lines(&a.data)); + } + out.push_str(&format!("--{b}--\r\n")); + out.into_bytes() +} + +/// Split a raw message into (header block, body) at the first empty line. +pub fn split_headers(raw: &[u8]) -> (&[u8], &[u8]) { + for (i, w) in raw.windows(4).enumerate() { + if w == b"\r\n\r\n" { + return (&raw[..i + 2], &raw[i + 4..]); + } + } + for (i, w) in raw.windows(2).enumerate() { + if w == b"\n\n" { + return (&raw[..i + 1], &raw[i + 2..]); + } + } + (raw, &[]) +} + +/// Unfolded raw header lines (name, value). +pub fn header_lines(block: &[u8]) -> Vec<(String, String)> { + let text = String::from_utf8_lossy(block); + let mut out: Vec<(String, String)> = Vec::new(); + for line in text.split('\n') { + let line = line.trim_end_matches('\r'); + if line.is_empty() { + continue; + } + if line.starts_with([' ', '\t']) { + if let Some(last) = out.last_mut() { + last.1.push(' '); + last.1.push_str(line.trim()); + } + continue; + } + if let Some((k, v)) = line.split_once(':') { + out.push((k.trim().to_string(), v.trim().to_string())); + } + } + out +} + +/// Remove headers (case-insensitive) from a raw message, keeping the body untouched. +pub fn strip_headers(raw: &[u8], names: &[&str]) -> Vec { + let (h, body) = split_headers(raw); + let text = String::from_utf8_lossy(h); + let mut out = String::with_capacity(raw.len()); + let mut skipping = false; + for line in text.split_inclusive('\n') { + if line.starts_with([' ', '\t']) { + if !skipping { + out.push_str(line); + } + continue; + } + let name = line.split(':').next().unwrap_or("").trim(); + skipping = names.iter().any(|n| n.eq_ignore_ascii_case(name)); + if !skipping { + out.push_str(line); + } + } + let mut v = out.into_bytes(); + if !v.ends_with(b"\n") { + v.extend_from_slice(b"\r\n"); + } + v.extend_from_slice(b"\r\n"); + v.extend_from_slice(body); + v +} + +/// Prepend header lines to a raw message. +pub fn prepend_headers(raw: &[u8], headers: &[(String, String)]) -> Vec { + let mut v = Vec::with_capacity(raw.len() + 256); + for (k, val) in headers { + v.extend_from_slice(format!("{k}: {}\r\n", val.replace(['\r', '\n'], " ")).as_bytes()); + } + v.extend_from_slice(raw); + v +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn build_and_parse() { + let raw = build( + &[ + ("Subject".into(), encode_word("Zażółć")), + ("To".into(), "a@b.pl".into()), + ], + Some("tekst"), + Some("

tekst

"), + &[Attachment { + name: "plik ą.txt".into(), + content_type: "text/plain".into(), + data: b"abc".to_vec(), + content_id: None, + inline: false, + }], + ); + let m = mail_parser::MessageParser::default().parse(&raw).unwrap(); + assert_eq!(m.subject(), Some("Zażółć")); + assert_eq!(m.body_text(0).unwrap(), "tekst"); + assert_eq!(m.attachment_count(), 1); + use mail_parser::MimeHeaders; + assert_eq!( + m.attachment(0).unwrap().attachment_name(), + Some("plik ą.txt") + ); + } + + #[test] + fn strip() { + let raw = b"From: a\r\nBcc: x@y,\r\n z@w\r\nSubject: s\r\n\r\nbody"; + let s = strip_headers(raw, &["bcc"]); + assert_eq!( + String::from_utf8(s).unwrap(), + "From: a\r\nSubject: s\r\n\r\nbody" + ); + } +} diff --git a/src/backend/mod.rs b/src/backend/mod.rs new file mode 100644 index 0000000..884f6db --- /dev/null +++ b/src/backend/mod.rs @@ -0,0 +1,1174 @@ +//! Combined backend: IMAP (mail) + CalDAV (calendar, tasks) + CardDAV (contacts) + SMTP. +//! Equivalent of Z-Push `BackendCombined` with the imap/caldav/carddav backends. + +pub mod dav; +pub mod ical; +pub mod imap; +pub mod mime; +pub mod smtp; +pub mod tz; + +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; + +use anyhow::{anyhow, bail, Context, Result}; +use chrono::{DateTime, Utc}; +use hmac::{Hmac, Mac}; +use sha2::Sha256; +use zeroize::Zeroizing; + +use crate::config::{expand_user_template, Settings}; +use dav::{DavClient, DavKind}; +use imap::ImapConn; + +// ------------------------------------------------------------------ folder model + +pub const FT_GENERIC: u8 = 1; +pub const FT_INBOX: u8 = 2; +pub const FT_DRAFTS: u8 = 3; +pub const FT_TRASH: u8 = 4; +pub const FT_SENT: u8 = 5; +pub const FT_OUTBOX: u8 = 6; +pub const FT_TASKS: u8 = 7; +pub const FT_CALENDAR: u8 = 8; +pub const FT_CONTACTS: u8 = 9; +pub const FT_USER_MAIL: u8 = 12; +pub const FT_USER_CALENDAR: u8 = 13; +pub const FT_USER_CONTACTS: u8 = 14; +pub const FT_USER_TASKS: u8 = 15; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub enum Kind { + Mail, + Calendar, + Tasks, + Contacts, +} + +impl Kind { + pub fn from_backend_id(id: &str) -> Option { + match id.get(..2)? { + "m:" => Some(Kind::Mail), + "c:" => Some(Kind::Calendar), + "t:" => Some(Kind::Tasks), + "a:" => Some(Kind::Contacts), + _ => None, + } + } + pub fn class(&self) -> &'static str { + match self { + Kind::Mail => "Email", + Kind::Calendar => "Calendar", + Kind::Tasks => "Tasks", + Kind::Contacts => "Contacts", + } + } + pub fn from_type(t: u8) -> Kind { + match t { + FT_TASKS | FT_USER_TASKS => Kind::Tasks, + FT_CALENDAR | FT_USER_CALENDAR => Kind::Calendar, + FT_CONTACTS | FT_USER_CONTACTS => Kind::Contacts, + _ => Kind::Mail, + } + } +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)] +pub struct BFolder { + pub id: String, + pub parent: Option, + pub name: String, + pub ftype: u8, +} + +impl BFolder { + pub fn kind(&self) -> Kind { + Kind::from_backend_id(&self.id).unwrap_or(Kind::Mail) + } + /// Backend specific path (IMAP mailbox or DAV collection path). + pub fn path(&self) -> &str { + &self.id[2..] + } +} + +#[derive(Debug, Clone, Default)] +pub struct Listing { + /// Opaque validity marker (IMAP UIDVALIDITY). A change invalidates the state. + pub meta: String, + /// item id -> fingerprint + pub items: Vec<(String, String)>, +} + +pub enum RawItem { + Mail(imap::FetchedMessage), + Dav { + id: String, + etag: String, + data: String, + }, +} + +// ------------------------------------------------------------------ IMAP pool + +type PoolKey = [u8; 32]; + +pub struct ImapPool { + inner: Mutex>>, + hmac_key: [u8; 32], +} + +impl ImapPool { + pub fn new(hmac_key: [u8; 32]) -> Self { + ImapPool { + inner: Mutex::new(HashMap::new()), + hmac_key, + } + } + + pub fn key(&self, login: &str, pass: &str) -> PoolKey { + let mut mac = as Mac>::new_from_slice(&self.hmac_key).expect("hmac"); + mac.update(login.as_bytes()); + mac.update(&[0]); + mac.update(pass.as_bytes()); + mac.finalize().into_bytes().into() + } + + pub fn take(&self, key: &PoolKey, idle: Duration) -> Option { + let mut g = self.inner.lock().unwrap(); + let v = g.get_mut(key)?; + while let Some(c) = v.pop() { + if !c.broken && c.last_used.elapsed() < idle { + return Some(c); + } + } + None + } + + pub fn put(&self, key: PoolKey, conn: ImapConn, max: usize) { + if conn.broken { + return; + } + let mut g = self.inner.lock().unwrap(); + let v = g.entry(key).or_default(); + if v.len() < max { + v.push(conn); + } + } + + pub fn clear(&self) { + self.inner.lock().unwrap().clear(); + } + + pub fn evict_idle(&self, idle: Duration) -> usize { + let mut g = self.inner.lock().unwrap(); + let mut n = 0; + g.retain(|_, v| { + v.retain(|c| c.last_used.elapsed() < idle && !c.broken); + n += v.len(); + !v.is_empty() + }); + n + } + + pub fn size(&self) -> usize { + self.inner.lock().unwrap().values().map(|v| v.len()).sum() + } +} + +// ------------------------------------------------------------------ session + +pub struct Session { + pub settings: Arc, + pub login: String, + password: Zeroizing, + pub email: String, + pool: Arc, + pool_key: PoolKey, + imap: Option, + http_cal: Option, + http_card: Option, + folder_cache: Option>, +} + +impl Drop for Session { + fn drop(&mut self) { + if let Some(c) = self.imap.take() { + self.pool + .put(self.pool_key, c, self.settings.imap.pool_max_per_user); + } + } +} + +pub enum AuthResult { + Ok, + Denied, +} + +impl Session { + pub fn new( + settings: Arc, + pool: Arc, + http_cal: Option, + http_card: Option, + login: &str, + password: &str, + ) -> Self { + let email = primary_email(&settings, login); + let pool_key = pool.key(login, password); + Session { + settings, + login: login.to_string(), + password: Zeroizing::new(password.to_string()), + email, + pool, + pool_key, + imap: None, + http_cal, + http_card, + folder_cache: None, + } + } + + pub fn password(&self) -> &str { + &self.password + } + + /// Authenticate against IMAP (or reuse a pooled authenticated connection). + pub async fn authenticate(&mut self) -> Result { + let idle = Duration::from_secs(self.settings.imap.pool_idle_secs); + if let Some(c) = self.pool.take(&self.pool_key, idle) { + self.imap = Some(c); + return Ok(AuthResult::Ok); + } + let mut c = ImapConn::connect(&self.settings.imap).await?; + if c.login(&self.login, &self.password).await? { + self.imap = Some(c); + Ok(AuthResult::Ok) + } else { + c.logout().await; + Ok(AuthResult::Denied) + } + } + + pub async fn imap(&mut self) -> Result<&mut ImapConn> { + // validate an existing (possibly pooled, long idle) connection + if let Some(c) = self.imap.as_mut() { + if c.broken + || (c.last_used.elapsed() > Duration::from_secs(30) && c.noop().await.is_err()) + { + self.imap = None; + } + } + if self.imap.is_none() { + let idle = Duration::from_secs(self.settings.imap.pool_idle_secs); + let mut pooled = self.pool.take(&self.pool_key, idle); + if let Some(c) = pooled.as_mut() { + if c.last_used.elapsed() > Duration::from_secs(30) && c.noop().await.is_err() { + pooled = None; + } + } + let conn = match pooled { + Some(c) => c, + None => { + let mut c = ImapConn::connect(&self.settings.imap).await?; + if !c.login(&self.login, &self.password).await? { + bail!("IMAP authentication failed"); + } + c + } + }; + self.imap = Some(conn); + } + Ok(self.imap.as_mut().expect("connection present")) + } + + fn dav(&self, kind: DavKind) -> Result> { + let s = &self.settings; + let (enabled, base, path, http) = match kind { + DavKind::Calendar => ( + s.caldav.enabled, + &s.caldav.base_url, + &s.caldav.path, + &self.http_cal, + ), + DavKind::AddressBook => ( + s.carddav.enabled, + &s.carddav.base_url, + &s.carddav.path, + &self.http_card, + ), + }; + if !enabled { + return Ok(None); + } + let http = http + .clone() + .ok_or_else(|| anyhow!("DAV client not configured"))?; + let client = DavClient::new(http, base, &self.login, &self.password)?; + let home = dav::encode_path(&expand_user_template( + path, + &self.login, + &s.general.default_domain, + )); + Ok(Some((client, home))) + } + + pub fn caldav(&self) -> Result> { + self.dav(DavKind::Calendar) + } + + pub fn carddav(&self) -> Result> { + self.dav(DavKind::AddressBook) + } + + fn dav_for(&self, kind: Kind) -> Result { + let k = if kind == Kind::Contacts { + DavKind::AddressBook + } else { + DavKind::Calendar + }; + self.dav(k)? + .map(|(c, _)| c) + .ok_or_else(|| anyhow!("{kind:?} backend disabled")) + } + + // -------------------------------------------------------------- hierarchy + + pub async fn folders(&mut self) -> Result> { + if let Some(f) = &self.folder_cache { + return Ok(f.clone()); + } + let mut out = self.mail_folders().await?; + let s = self.settings.clone(); + if let Some((c, home)) = self.caldav()? { + match c.collections(&home, DavKind::Calendar).await { + Ok(cols) => { + let cols = filter_cols(cols, &s.caldav.include_regex, &s.caldav.exclude_regex); + let def = + pick_default(&cols, &s.caldav.default_collection, |c| c.supports_events); + let def_t = + pick_default(&cols, &s.caldav.default_collection, |c| c.supports_todos); + for (i, col) in cols.iter().enumerate() { + if col.supports_events { + out.push(BFolder { + id: format!("c:{}", col.href), + parent: None, + name: col.display_name.clone(), + ftype: if Some(i) == def { + FT_CALENDAR + } else { + FT_USER_CALENDAR + }, + }); + } + if col.supports_todos { + let name = if col.supports_events { + format!("{} (tasks)", col.display_name) + } else { + col.display_name.clone() + }; + out.push(BFolder { + id: format!("t:{}", col.href), + parent: None, + name, + ftype: if Some(i) == def_t { + FT_TASKS + } else { + FT_USER_TASKS + }, + }); + } + } + } + Err(e) => tracing::warn!(user = %self.login, "CalDAV discovery failed: {e:#}"), + } + } + if let Some((c, home)) = self.carddav()? { + match c.collections(&home, DavKind::AddressBook).await { + Ok(cols) => { + let cols = + filter_cols(cols, &s.carddav.include_regex, &s.carddav.exclude_regex); + let gal = s.carddav.gal_path.trim_end_matches('/').to_string(); + let cols: Vec<_> = cols + .into_iter() + .filter(|c| { + gal.is_empty() + || c.href.trim_end_matches('/') + != expand_user_template( + &gal, + &self.login, + &s.general.default_domain, + ) + }) + .collect(); + let def = pick_default(&cols, &s.carddav.default_collection, |_| true); + for (i, col) in cols.iter().enumerate() { + out.push(BFolder { + id: format!("a:{}", col.href), + parent: None, + name: col.display_name.clone(), + ftype: if Some(i) == def { + FT_CONTACTS + } else { + FT_USER_CONTACTS + }, + }); + } + } + Err(e) => tracing::warn!(user = %self.login, "CardDAV discovery failed: {e:#}"), + } + } + self.folder_cache = Some(out.clone()); + Ok(out) + } + + pub fn invalidate_folders(&mut self) { + self.folder_cache = None; + } + + async fn mail_folders(&mut self) -> Result> { + let s = self.settings.clone(); + let cfg = &s.imap; + let boxes = self.imap().await?.list().await?; + let prefix = cfg.folder_prefix.clone(); + let names: std::collections::HashSet = + boxes.iter().map(|b| b.name.clone()).collect(); + let excluded = |decoded: &str| { + cfg.excluded_folders.iter().any(|p| { + let p = p.trim(); + if let Some(pre) = p.strip_suffix('*') { + decoded.starts_with(pre) + } else { + !p.is_empty() && decoded.eq_ignore_ascii_case(p) + } + }) + }; + let mut used: HashMap = HashMap::new(); + let mut out = Vec::new(); + // INBOX first so it gets type 2 + let mut boxes = boxes; + boxes.sort_by_key(|b| { + if b.name.eq_ignore_ascii_case("INBOX") { + 0 + } else { + 1 + } + }); + for b in boxes.iter() { + if b.has_attr("\\Noselect") || b.has_attr("\\NonExistent") { + continue; + } + let decoded = imap::utf7_decode(&b.name); + if excluded(&decoded) { + continue; + } + let rel = decoded + .strip_prefix(&imap::utf7_decode(&prefix)) + .unwrap_or(&decoded) + .to_string(); + let mut ftype = FT_USER_MAIL; + let is = |cfgname: &str| { + !cfgname.is_empty() + && (rel.eq_ignore_ascii_case(cfgname) + || decoded.eq_ignore_ascii_case(cfgname) + || decoded.eq_ignore_ascii_case(&format!( + "{}{}", + imap::utf7_decode(&prefix), + cfgname + ))) + }; + if b.name.eq_ignore_ascii_case("INBOX") || is(&cfg.folder_inbox) { + ftype = FT_INBOX; + } else if cfg.use_special_use && b.has_attr("\\Sent") { + ftype = FT_SENT; + } else if cfg.use_special_use && b.has_attr("\\Drafts") { + ftype = FT_DRAFTS; + } else if cfg.use_special_use && b.has_attr("\\Trash") { + ftype = FT_TRASH; + } else if is(&cfg.folder_sent) { + ftype = FT_SENT; + } else if is(&cfg.folder_drafts) { + ftype = FT_DRAFTS; + } else if is(&cfg.folder_trash) { + ftype = FT_TRASH; + } + if ftype != FT_USER_MAIL { + if used.get(&ftype).copied().unwrap_or(false) { + ftype = FT_USER_MAIL; + } else { + used.insert(ftype, true); + } + } + // parent + let mut parent = None; + let mut display = rel.clone(); + if let Some(d) = b.delimiter { + if let Some(pos) = b.name.rfind(d) { + let pname = &b.name[..pos]; + if names.contains(pname) && pname != prefix.trim_end_matches(d) { + let pdec = imap::utf7_decode(pname); + if !excluded(&pdec) { + parent = Some(format!("m:{pname}")); + } + } + if parent.is_some() { + display = imap::utf7_decode(&b.name[pos + d.len_utf8()..]); + } + } + } + out.push(BFolder { + id: format!("m:{}", b.name), + parent, + name: display, + ftype, + }); + } + Ok(out) + } + + pub async fn folder(&mut self, backend_id: &str) -> Result> { + Ok(self + .folders() + .await? + .into_iter() + .find(|f| f.id == backend_id)) + } + + pub async fn special_folder(&mut self, ftype: u8) -> Result> { + Ok(self.folders().await?.into_iter().find(|f| f.ftype == ftype)) + } + + // -------------------------------------------------------------- listing + + pub async fn list( + &mut self, + folder: &BFolder, + since: Option>, + ) -> Result
{ + match folder.kind() { + Kind::Mail => { + let c = self.imap().await?; + let uv = c.select(folder.path()).await?; + let infos = if let Some(since) = since { + let uids = c + .uid_search(&format!("UNDELETED SINCE {}", since.format("%d-%b-%Y"))) + .await?; + if uids.is_empty() { + vec![] + } else { + let mut all = Vec::new(); + for chunk in uids.chunks(5000) { + all.extend(c.uid_fetch_flags(&uid_set(chunk)).await?); + } + all + } + } else { + c.uid_fetch_flags("1:*").await.or_else(|e| { + // empty mailbox: some servers answer BAD/NO for 1:* + if e.to_string().contains("IMAP") { + Ok(vec![]) + } else { + Err(e) + } + })? + }; + let items = infos + .into_iter() + .filter(|i| !i.flags.iter().any(|f| f.eq_ignore_ascii_case("\\Deleted"))) + .map(|i| (i.uid.to_string(), mail_fingerprint(&i.flags))) + .collect(); + Ok(Listing { + meta: uv.to_string(), + items, + }) + } + k => { + let c = self.dav_for(k)?; + let href = dav::encode_path(folder.path()); + let comp = match k { + Kind::Calendar => Some("VEVENT"), + Kind::Tasks => Some("VTODO"), + _ => None, + }; + let since_s = if k == Kind::Calendar { + since.map(|d| tz::fmt_compact(&d)) + } else { + None + }; + let res = c.list(&href, comp, since_s.as_deref()).await?; + let items = res + .into_iter() + .map(|r| (dav::last_segment(&r.href), r.etag)) + .collect(); + Ok(Listing { + meta: String::new(), + items, + }) + } + } + } + + /// Cheap change marker used by Ping. + pub async fn signature(&mut self, folder: &BFolder) -> Result { + match folder.kind() { + Kind::Mail => { + let st = self.imap().await?.status(folder.path()).await?; + Ok(format!( + "{}/{}/{}/{}/{}", + st.uidvalidity, st.uidnext, st.messages, st.unseen, st.highestmodseq + )) + } + k => { + let c = self.dav_for(k)?; + let href = dav::encode_path(folder.path()); + let tag = c.ctag(&href).await?; + if tag.is_empty() { + // no ctag support: hash the etag listing + let l = self.list(folder, None).await?; + let mut s: Vec = l + .items + .into_iter() + .map(|(a, b)| format!("{a}={b}")) + .collect(); + s.sort(); + Ok(crate::util::sha256_hex(s.join("\n").as_bytes())) + } else { + Ok(tag) + } + } + } + } + + // -------------------------------------------------------------- fetch + + pub async fn fetch(&mut self, folder: &BFolder, ids: &[String]) -> Result> { + if ids.is_empty() { + return Ok(vec![]); + } + match folder.kind() { + Kind::Mail => { + let uids: Vec = ids.iter().filter_map(|i| i.parse().ok()).collect(); + let c = self.imap().await?; + c.select(folder.path()).await?; + let mut out = Vec::new(); + for chunk in uids.chunks(25) { + for m in c.uid_fetch_full(&uid_set(chunk)).await? { + out.push(RawItem::Mail(m)); + } + } + Ok(out) + } + k => { + let c = self.dav_for(k)?; + let base = folder.path().to_string(); + let hrefs: Vec = ids + .iter() + .map(|id| format!("{}{}", dav::encode_path(&base), dav::encode_segment(id))) + .collect(); + let dk = if k == Kind::Contacts { + DavKind::AddressBook + } else { + DavKind::Calendar + }; + let mut out = Vec::new(); + for chunk in hrefs.chunks(50) { + for r in c.multiget(&dav::encode_path(&base), chunk, dk).await? { + if let Some(d) = r.data { + out.push(RawItem::Dav { + id: dav::last_segment(&r.href), + etag: r.etag, + data: d, + }); + } + } + } + Ok(out) + } + } + } + + pub async fn fetch_mail(&mut self, mailbox: &str, uid: u32) -> Result { + let c = self.imap().await?; + c.select(mailbox).await?; + c.uid_fetch_full(&uid.to_string()) + .await? + .into_iter() + .next() + .ok_or_else(|| anyhow!("message not found")) + } + + pub async fn fetch_dav(&mut self, folder: &BFolder, id: &str) -> Result { + let c = self.dav_for(folder.kind())?; + let href = format!( + "{}{}", + dav::encode_path(folder.path()), + dav::encode_segment(id) + ); + c.get(&href).await + } + + // -------------------------------------------------------------- mail changes + + pub async fn mail_set_flags( + &mut self, + folder: &BFolder, + uid: u32, + read: Option, + flagged: Option, + ) -> Result { + let c = self.imap().await?; + c.select(folder.path()).await?; + if let Some(r) = read { + c.uid_store(uid, if r { "+" } else { "-" }, "\\Seen") + .await?; + } + if let Some(f) = flagged { + c.uid_store(uid, if f { "+" } else { "-" }, "\\Flagged") + .await?; + } + let info = c.uid_fetch_flags(&uid.to_string()).await?; + Ok(info + .first() + .map(|i| mail_fingerprint(&i.flags)) + .unwrap_or_default()) + } + + pub async fn mail_add_flag(&mut self, mailbox: &str, uid: u32, flag: &str) -> Result<()> { + let c = self.imap().await?; + c.select(mailbox).await?; + c.uid_store(uid, "+", flag).await + } + + pub async fn mail_delete(&mut self, folder: &BFolder, uid: u32, to_trash: bool) -> Result<()> { + let trash = if to_trash && folder.ftype != FT_TRASH { + self.special_folder(FT_TRASH).await? + } else { + None + }; + let autoseen = self.settings.imap.autoseen_on_delete; + let c = self.imap().await?; + c.select(folder.path()).await?; + match trash { + Some(t) => { + if autoseen { + c.uid_store(uid, "+", "\\Seen").await?; + } + c.uid_move(uid, t.path()).await?; + } + None => { + c.uid_store(uid, "+", "\\Deleted").await?; + c.uid_expunge(uid).await?; + } + } + Ok(()) + } + + pub async fn mail_move( + &mut self, + src: &BFolder, + uid: u32, + dst: &BFolder, + ) -> Result> { + let c = self.imap().await?; + c.select(src.path()).await?; + let new_uid = c.uid_move(uid, dst.path()).await?; + if new_uid.is_some() { + return Ok(new_uid); + } + // no UIDPLUS: newest message in destination + c.select(dst.path()).await?; + let uids = c.uid_search("ALL").await?; + Ok(uids.last().copied()) + } + + pub async fn mail_append( + &mut self, + mailbox: &str, + flags: &str, + data: &[u8], + ) -> Result> { + let c = self.imap().await?; + c.append(mailbox, flags, data).await + } + + pub async fn mail_empty(&mut self, folder: &BFolder) -> Result<()> { + let c = self.imap().await?; + c.select(folder.path()).await?; + let uids = c.uid_search("UNDELETED").await?; + if uids.is_empty() { + return Ok(()); + } + c.run(&format!( + "UID STORE {} +FLAGS.SILENT (\\Deleted)", + uid_set(&uids) + )) + .await?; + c.run("EXPUNGE").await?; + Ok(()) + } + + // -------------------------------------------------------------- DAV changes + + pub async fn dav_put( + &mut self, + folder: &BFolder, + id: Option<&str>, + body: String, + if_match: Option<&str>, + ) -> Result<(String, String)> { + let c = self.dav_for(folder.kind())?; + let (id, create) = match id { + Some(i) => (i.to_string(), false), + None => { + let ext = if folder.kind() == Kind::Contacts { + "vcf" + } else { + "ics" + }; + (format!("{}.{ext}", uuid::Uuid::new_v4()), true) + } + }; + let href = format!( + "{}{}", + dav::encode_path(folder.path()), + dav::encode_segment(&id) + ); + let ct = if folder.kind() == Kind::Contacts { + "text/vcard; charset=utf-8" + } else { + "text/calendar; charset=utf-8" + }; + let etag = c + .put( + &href, + body, + ct, + if create { + None + } else { + Some(if_match.unwrap_or("")) + }, + ) + .await?; + Ok((id, etag)) + } + + pub async fn dav_delete(&mut self, folder: &BFolder, id: &str) -> Result<()> { + let c = self.dav_for(folder.kind())?; + let href = format!( + "{}{}", + dav::encode_path(folder.path()), + dav::encode_segment(id) + ); + c.delete(&href, None).await + } + + /// Move a DAV resource by GET + PUT + DELETE (portable across servers). + pub async fn dav_move(&mut self, src: &BFolder, id: &str, dst: &BFolder) -> Result { + let r = self.fetch_dav(src, id).await?; + let (new_id, _) = self + .dav_put(dst, None, r.data.unwrap_or_default(), None) + .await?; + self.dav_delete(src, id).await?; + Ok(new_id) + } + + // -------------------------------------------------------------- folder ops + + pub async fn create_folder( + &mut self, + parent: Option<&BFolder>, + name: &str, + ftype: u8, + ) -> Result { + let kind = Kind::from_type(ftype); + self.invalidate_folders(); + match kind { + Kind::Mail => { + let c = self.imap().await?; + let list = c.list().await?; + let delim = list.iter().find_map(|b| b.delimiter).unwrap_or('/'); + let enc = imap::utf7_encode(name); + let full = match parent.filter(|p| p.kind() == Kind::Mail) { + Some(p) => format!("{}{delim}{enc}", p.path()), + None => format!("{}{enc}", self.settings.imap.folder_prefix), + }; + if enc.contains(delim) { + bail!("folder name contains the hierarchy delimiter"); + } + let c = self.imap().await?; + c.create(&full).await?; + Ok(BFolder { + id: format!("m:{full}"), + parent: parent.map(|p| p.id.clone()), + name: name.to_string(), + ftype: FT_USER_MAIL, + }) + } + k => { + let (c, home) = match k { + Kind::Contacts => self.carddav()?, + _ => self.caldav()?, + } + .ok_or_else(|| anyhow!("{k:?} backend disabled"))?; + let seg = uuid::Uuid::new_v4().to_string(); + let href = format!("{}{}/", home.trim_end_matches('/').to_string() + "/", seg); + let dk = if k == Kind::Contacts { + DavKind::AddressBook + } else { + DavKind::Calendar + }; + c.make_collection(&href, name, dk, k == Kind::Tasks).await?; + let decoded = dav::normalize_dir(&href); + let prefix = match k { + Kind::Calendar => "c", + Kind::Tasks => "t", + _ => "a", + }; + Ok(BFolder { + id: format!("{prefix}:{decoded}"), + parent: None, + name: name.to_string(), + ftype, + }) + } + } + } + + pub async fn rename_folder( + &mut self, + folder: &BFolder, + new_parent: Option<&BFolder>, + name: &str, + ) -> Result { + self.invalidate_folders(); + match folder.kind() { + Kind::Mail => { + if folder.ftype != FT_USER_MAIL { + bail!("system folders cannot be renamed"); + } + let c = self.imap().await?; + let list = c.list().await?; + let delim = list.iter().find_map(|b| b.delimiter).unwrap_or('/'); + let enc = imap::utf7_encode(name); + let full = match new_parent.filter(|p| p.kind() == Kind::Mail) { + Some(p) => format!("{}{delim}{enc}", p.path()), + None => format!("{}{enc}", self.settings.imap.folder_prefix), + }; + let c = self.imap().await?; + c.rename(folder.path(), &full).await?; + Ok(BFolder { + id: format!("m:{full}"), + parent: new_parent.map(|p| p.id.clone()), + name: name.to_string(), + ftype: folder.ftype, + }) + } + k => { + let c = self.dav_for(k)?; + c.rename(&dav::encode_path(folder.path()), name).await?; + let mut f = folder.clone(); + f.name = name.to_string(); + Ok(f) + } + } + } + + pub async fn delete_folder(&mut self, folder: &BFolder) -> Result<()> { + self.invalidate_folders(); + match folder.kind() { + Kind::Mail => { + if folder.ftype != FT_USER_MAIL { + bail!("system folders cannot be deleted"); + } + self.imap().await?.delete(folder.path()).await + } + k => { + if matches!(folder.ftype, FT_CALENDAR | FT_CONTACTS | FT_TASKS) { + bail!("default folders cannot be deleted"); + } + let c = self.dav_for(k)?; + c.delete(&dav::encode_path(folder.path()), None).await + } + } + } + + // -------------------------------------------------------------- search helpers + + pub async fn mail_search( + &mut self, + folder: &BFolder, + text: &str, + since: Option>, + ) -> Result> { + let c = self.imap().await?; + c.select(folder.path()).await?; + let extra = since + .map(|d| format!("SINCE {} ", d.format("%d-%b-%Y"))) + .unwrap_or_default(); + if text.trim().is_empty() { + return c.uid_search(&format!("{extra}ALL")).await; + } + c.uid_search_text("TEXT", text, &extra).await + } + + pub async fn close(mut self) { + if let Some(c) = self.imap.take() { + self.pool + .put(self.pool_key, c, self.settings.imap.pool_max_per_user); + } + } + + pub fn smtp_settings(&self) -> &crate::config::SmtpSettings { + &self.settings.smtp + } +} + +fn filter_cols(cols: Vec, inc: &str, exc: &str) -> Vec { + let inc = (!inc.is_empty()) + .then(|| regex::Regex::new(inc).ok()) + .flatten(); + let exc = (!exc.is_empty()) + .then(|| regex::Regex::new(exc).ok()) + .flatten(); + cols.into_iter() + .filter(|c| inc.as_ref().map(|r| r.is_match(&c.href)).unwrap_or(true)) + .filter(|c| !exc.as_ref().map(|r| r.is_match(&c.href)).unwrap_or(false)) + .collect() +} + +fn pick_default( + cols: &[dav::Collection], + wanted: &str, + ok: impl Fn(&dav::Collection) -> bool, +) -> Option { + if !wanted.is_empty() { + if let Some(i) = cols.iter().position(|c| { + ok(c) && (dav::last_segment(&c.href) == wanted || c.display_name == wanted) + }) { + return Some(i); + } + } + cols.iter().position(ok) +} + +pub fn mail_fingerprint(flags: &[String]) -> String { + let mut s = String::new(); + let has = |f: &str| flags.iter().any(|x| x.eq_ignore_ascii_case(f)); + if has("\\Seen") { + s.push('S'); + } + if has("\\Flagged") { + s.push('F'); + } + if has("\\Answered") { + s.push('A'); + } + if has("$Forwarded") || has("Forwarded") { + s.push('W'); + } + if s.is_empty() { + s.push('-'); + } + s +} + +/// Compress a sorted uid list into an IMAP sequence set. +pub fn uid_set(uids: &[u32]) -> String { + let mut out = String::new(); + let mut i = 0; + while i < uids.len() { + let start = uids[i]; + let mut end = start; + while i + 1 < uids.len() && uids[i + 1] == end + 1 { + i += 1; + end = uids[i]; + } + if !out.is_empty() { + out.push(','); + } + if start == end { + out.push_str(&start.to_string()); + } else { + out.push_str(&format!("{start}:{end}")); + } + i += 1; + } + out +} + +pub fn primary_email(s: &Settings, login: &str) -> String { + let e = expand_user_template(&s.general.email_template, login, &s.general.default_domain); + if e.contains('@') { + e + } else if !s.general.default_domain.is_empty() { + format!("{e}@{}", s.general.default_domain) + } else { + e + } +} + +/// Validate backend connectivity for the panel (optionally with credentials). +pub async fn test_imap(s: &Settings, login: &str, pass: &str) -> Result { + let t = Instant::now(); + let mut c = ImapConn::connect(&s.imap).await.context("connect")?; + let caps = c.caps.join(" "); + if !login.is_empty() { + if !c.login(login, pass).await? { + bail!("connected, but login was rejected"); + } + let n = c.list().await?.len(); + c.logout().await; + return Ok(format!( + "OK in {} ms, login OK, {n} folders. Capabilities: {caps}", + t.elapsed().as_millis() + )); + } + c.logout().await; + Ok(format!( + "OK in {} ms. Capabilities: {caps}", + t.elapsed().as_millis() + )) +} + +pub async fn test_dav(s: &Settings, kind: DavKind, login: &str, pass: &str) -> Result { + let (base, path, verify, timeout) = match kind { + DavKind::Calendar => ( + &s.caldav.base_url, + &s.caldav.path, + s.caldav.verify_tls, + s.caldav.timeout_secs, + ), + DavKind::AddressBook => ( + &s.carddav.base_url, + &s.carddav.path, + s.carddav.verify_tls, + s.carddav.timeout_secs, + ), + }; + let http = DavClient::build_http(verify, timeout)?; + let c = DavClient::new(http, base, login, pass)?; + let home = dav::encode_path(&expand_user_template( + path, + login, + &s.general.default_domain, + )); + let cols = c.collections(&home, kind).await?; + Ok(format!( + "OK: {} collection(s): {}", + cols.len(), + cols.iter() + .map(|c| c.display_name.clone()) + .collect::>() + .join(", ") + )) +} + +#[cfg(test)] +mod tests { + #[test] + fn uidset() { + assert_eq!(super::uid_set(&[1, 2, 3, 5, 7, 8]), "1:3,5,7:8"); + } +} diff --git a/src/backend/smtp.rs b/src/backend/smtp.rs new file mode 100644 index 0000000..ba4b66a --- /dev/null +++ b/src/backend/smtp.rs @@ -0,0 +1,145 @@ +//! Outgoing mail: SMTP submission (lettre) or local sendmail binary. + +use std::time::Duration; + +use anyhow::{anyhow, bail, Context, Result}; +use lettre::address::Envelope; +use lettre::transport::smtp::authentication::Credentials; +use lettre::transport::smtp::client::{Tls, TlsParameters}; +use lettre::{Address, AsyncSmtpTransport, AsyncTransport, Tokio1Executor}; +use tokio::io::AsyncWriteExt; + +use crate::config::{SendMethod, SmtpAuth, SmtpSettings, TlsMode}; + +pub async fn send( + cfg: &SmtpSettings, + login: &str, + password: &str, + from: &str, + recipients: &[String], + raw: &[u8], +) -> Result<()> { + if recipients.is_empty() { + bail!("message has no recipients"); + } + if raw.len() as u64 > cfg.max_message_mb * 1024 * 1024 { + bail!("message too large"); + } + let from_addr: Address = from + .parse() + .map_err(|_| anyhow!("invalid sender address {from}"))?; + let mut to = Vec::with_capacity(recipients.len()); + for r in recipients { + to.push( + r.parse::
() + .map_err(|_| anyhow!("invalid recipient address {r}"))?, + ); + } + match cfg.method { + SendMethod::Smtp => { + let tls = |host: &str| -> Result { + Ok(TlsParameters::builder(host.to_string()) + .dangerous_accept_invalid_certs(!cfg.verify_tls) + .dangerous_accept_invalid_hostnames(!cfg.verify_tls) + .build_rustls()?) + }; + let mut b = AsyncSmtpTransport::::builder_dangerous(&cfg.host) + .port(cfg.port) + .timeout(Some(Duration::from_secs(cfg.timeout_secs.max(5)))); + b = match cfg.security { + TlsMode::None => b.tls(Tls::None), + TlsMode::StartTls => b.tls(Tls::Required(tls(&cfg.host)?)), + TlsMode::Tls => b.tls(Tls::Wrapper(tls(&cfg.host)?)), + }; + b = match cfg.auth { + SmtpAuth::None => b, + SmtpAuth::UserCredentials => { + b.credentials(Credentials::new(login.to_string(), password.to_string())) + } + SmtpAuth::Static => { + b.credentials(Credentials::new(cfg.username.clone(), cfg.password.clone())) + } + }; + let transport = b.build(); + let env = Envelope::new(Some(from_addr), to).context("invalid envelope")?; + transport + .send_raw(&env, raw) + .await + .map_err(|e| anyhow!("SMTP: {e}"))?; + Ok(()) + } + SendMethod::Sendmail => { + let mut cmd = tokio::process::Command::new(&cfg.sendmail_path); + cmd.arg("-i").arg("-f").arg(&from_addr).arg("--"); + for t in &to { + cmd.arg(t); + } + cmd.stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::piped()) + .kill_on_drop(true); + let mut child = cmd.spawn().context("spawn sendmail")?; + if let Some(mut stdin) = child.stdin.take() { + stdin.write_all(raw).await?; + stdin.shutdown().await.ok(); + } + let out = tokio::time::timeout( + Duration::from_secs(cfg.timeout_secs.max(5)), + child.wait_with_output(), + ) + .await + .map_err(|_| anyhow!("sendmail timeout"))??; + if !out.status.success() { + bail!( + "sendmail failed ({}): {}", + out.status, + String::from_utf8_lossy(&out.stderr).trim() + ); + } + Ok(()) + } + } +} + +/// Check connectivity (and optionally authentication) for the panel "test" button. +pub async fn test(cfg: &SmtpSettings, login: &str, password: &str) -> Result { + match cfg.method { + SendMethod::Sendmail => { + if std::path::Path::new(&cfg.sendmail_path).exists() { + Ok(format!("{} exists", cfg.sendmail_path)) + } else { + bail!("{} not found", cfg.sendmail_path) + } + } + SendMethod::Smtp => { + let tls = TlsParameters::builder(cfg.host.clone()) + .dangerous_accept_invalid_certs(!cfg.verify_tls) + .dangerous_accept_invalid_hostnames(!cfg.verify_tls) + .build_rustls()?; + let mut b = AsyncSmtpTransport::::builder_dangerous(&cfg.host) + .port(cfg.port) + .timeout(Some(Duration::from_secs(10))); + b = match cfg.security { + TlsMode::None => b.tls(Tls::None), + TlsMode::StartTls => b.tls(Tls::Required(tls)), + TlsMode::Tls => b.tls(Tls::Wrapper(tls)), + }; + match cfg.auth { + SmtpAuth::UserCredentials if !login.is_empty() => { + b = b.credentials(Credentials::new(login.into(), password.into())) + } + SmtpAuth::Static => { + b = b.credentials(Credentials::new(cfg.username.clone(), cfg.password.clone())) + } + _ => {} + } + let t: AsyncSmtpTransport = b.build(); + let ok = t.test_connection().await.map_err(|e| anyhow!("{e}"))?; + if ok { + Ok(format!("SMTP {}:{} OK", cfg.host, cfg.port)) + } else { + bail!("SMTP connection test failed") + } + } + } +} diff --git a/src/backend/tz.rs b/src/backend/tz.rs new file mode 100644 index 0000000..ebf7551 --- /dev/null +++ b/src/backend/tz.rs @@ -0,0 +1,501 @@ +//! Time zone helpers: EAS TIME_ZONE_INFORMATION blobs <-> IANA zones, date formats, iCal dates. + +use std::collections::HashMap; +use std::sync::{Mutex, OnceLock}; + +use base64::Engine; +use chrono::{DateTime, Datelike, NaiveDate, NaiveDateTime, Offset, TimeZone, Timelike, Utc}; +use chrono_tz::Tz; + +use super::ical::{Component, Property}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct SysTime { + pub year: u16, + pub month: u16, + pub dow: u16, + pub day: u16, + pub hour: u16, + pub minute: u16, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct TzRule { + pub bias: i32, + pub std_date: SysTime, + pub std_bias: i32, + pub dst_date: SysTime, + pub dst_bias: i32, +} + +fn offset_min(tz: &Tz, t: DateTime) -> i32 { + t.with_timezone(tz).offset().fix().local_minus_utc() / 60 +} + +fn sys_from_local(local: NaiveDateTime) -> SysTime { + let day = local.day(); + let dim = days_in_month(local.year(), local.month()); + let week = if day + 7 > dim { 5 } else { (day - 1) / 7 + 1 }; + SysTime { + year: 0, + month: local.month() as u16, + dow: local.weekday().num_days_from_sunday() as u16, + day: week as u16, + hour: local.hour() as u16, + minute: local.minute() as u16, + } +} + +pub fn days_in_month(y: i32, m: u32) -> u32 { + let (ny, nm) = if m == 12 { (y + 1, 1) } else { (y, m + 1) }; + NaiveDate::from_ymd_opt(ny, nm, 1) + .and_then(|d| d.pred_opt()) + .map(|d| d.day()) + .unwrap_or(30) +} + +/// Compute the Windows-style rule for a zone in a given year. +pub fn rule_for(tz: &Tz, year: i32) -> TzRule { + static CACHE: OnceLock>> = OnceLock::new(); + let key = (tz.name().to_string(), year); + if let Some(r) = CACHE + .get_or_init(Default::default) + .lock() + .unwrap() + .get(&key) + { + return *r; + } + let start = Utc.with_ymd_and_hms(year, 1, 1, 0, 0, 0).unwrap(); + let mut transitions = Vec::new(); + let mut prev = offset_min(tz, start); + let mut min_off = prev; + let mut max_off = prev; + let mut t = start; + // hourly scan, then refine to the minute + for _ in 0..(366 * 24) { + let n = t + chrono::Duration::hours(1); + let o = offset_min(tz, n); + if o != prev { + let mut lo = t; + let mut hi = n; + while (hi - lo).num_minutes() > 1 { + let mid = lo + (hi - lo) / 2; + if offset_min(tz, mid) == prev { + lo = mid; + } else { + hi = mid; + } + } + transitions.push((hi, prev, o)); + prev = o; + } + min_off = min_off.min(o); + max_off = max_off.max(o); + t = n; + if t.year() > year { + break; + } + } + let mut rule = TzRule { + bias: -min_off, + ..Default::default() + }; + if max_off != min_off && transitions.len() >= 2 { + rule.dst_bias = -(max_off - min_off); + for (instant, from, to) in transitions { + if to > from { + // into daylight: expressed in local standard time + let local = (instant + chrono::Duration::minutes(from as i64)).naive_utc(); + rule.dst_date = sys_from_local(local); + } else { + // into standard: expressed in local daylight time + let local = (instant + chrono::Duration::minutes(from as i64)).naive_utc(); + rule.std_date = sys_from_local(local); + } + } + } + CACHE + .get_or_init(Default::default) + .lock() + .unwrap() + .insert(key, rule); + rule +} + +fn write_sys(out: &mut Vec, s: &SysTime) { + for v in [s.year, s.month, s.dow, s.day, s.hour, s.minute, 0, 0] { + out.extend_from_slice(&v.to_le_bytes()); + } +} + +fn write_name(out: &mut Vec, name: &str) { + let mut units: Vec = name.encode_utf16().take(31).collect(); + units.resize(32, 0); + for u in units { + out.extend_from_slice(&u.to_le_bytes()); + } +} + +pub fn blob_for(tz: &Tz, year: i32) -> String { + let r = rule_for(tz, year); + let mut out = Vec::with_capacity(172); + out.extend_from_slice(&r.bias.to_le_bytes()); + write_name(&mut out, tz.name()); + write_sys(&mut out, &r.std_date); + out.extend_from_slice(&r.std_bias.to_le_bytes()); + write_name(&mut out, tz.name()); + write_sys(&mut out, &r.dst_date); + out.extend_from_slice(&r.dst_bias.to_le_bytes()); + base64::engine::general_purpose::STANDARD.encode(out) +} + +pub fn parse_blob(b64: &str) -> Option { + let b = base64::engine::general_purpose::STANDARD + .decode(b64.trim()) + .ok()?; + if b.len() < 172 { + return None; + } + let i32_at = |o: usize| i32::from_le_bytes([b[o], b[o + 1], b[o + 2], b[o + 3]]); + let u16_at = |o: usize| u16::from_le_bytes([b[o], b[o + 1]]); + let sys_at = |o: usize| SysTime { + year: u16_at(o), + month: u16_at(o + 2), + dow: u16_at(o + 4), + day: u16_at(o + 6), + hour: u16_at(o + 8), + minute: u16_at(o + 10), + }; + Some(TzRule { + bias: i32_at(0), + std_date: sys_at(68), + std_bias: i32_at(84), + dst_date: sys_at(152), + dst_bias: i32_at(168), + }) +} + +fn rules_match(a: &TzRule, b: &TzRule) -> bool { + let norm = |s: &SysTime| (s.month, s.dow, s.day, s.hour); + a.bias == b.bias + && (a.dst_date.month == 0) == (b.dst_date.month == 0) + && (a.dst_date.month == 0 + || (norm(&a.std_date) == norm(&b.std_date) + && norm(&a.dst_date) == norm(&b.dst_date) + && a.dst_bias == b.dst_bias)) +} + +/// Map a device-supplied blob to an IANA zone (preferring `preferred`, then common zones). +pub fn tz_from_blob(b64: &str, preferred: Tz) -> Tz { + static CACHE: OnceLock>> = OnceLock::new(); + let key = (b64.to_string(), preferred); + if let Some(t) = CACHE + .get_or_init(Default::default) + .lock() + .unwrap() + .get(&key) + { + return *t; + } + let Some(rule) = parse_blob(b64) else { + return preferred; + }; + let year = Utc::now().year(); + const COMMON: &[&str] = &[ + "Europe/Warsaw", + "Europe/Berlin", + "Europe/London", + "Europe/Kiev", + "Europe/Moscow", + "America/New_York", + "America/Chicago", + "America/Denver", + "America/Los_Angeles", + "Asia/Tokyo", + "Asia/Shanghai", + "Australia/Sydney", + ]; + let found = if rules_match(&rule_for(&preferred, year), &rule) { + preferred + } else if rule.bias == 0 && rule.dst_date.month == 0 { + chrono_tz::UTC + } else { + COMMON + .iter() + .filter_map(|n| n.parse::().ok()) + .chain( + chrono_tz::TZ_VARIANTS + .iter() + .copied() + .filter(|z| !z.name().starts_with("Etc/") || rule.dst_date.month == 0), + ) + .find(|z| rules_match(&rule_for(z, year), &rule)) + .unwrap_or(preferred) + }; + { + let mut c = CACHE.get_or_init(Default::default).lock().unwrap(); + if c.len() > 2000 { + c.clear(); + } + c.insert(key, found); + } + found +} + +// ------------------------------------------------------------------ EAS date formats + +pub fn fmt_compact(d: &DateTime) -> String { + d.format("%Y%m%dT%H%M%SZ").to_string() +} + +pub fn fmt_iso(d: &DateTime) -> String { + d.format("%Y-%m-%dT%H:%M:%S.000Z").to_string() +} + +pub fn parse_eas_date(s: &str) -> Option> { + let s = s.trim(); + for f in [ + "%Y%m%dT%H%M%SZ", + "%Y-%m-%dT%H:%M:%S%.fZ", + "%Y-%m-%dT%H:%M:%SZ", + "%Y%m%dT%H%M%S", + ] { + if let Ok(n) = NaiveDateTime::parse_from_str(s, f) { + return Some(Utc.from_utc_datetime(&n)); + } + } + DateTime::parse_from_rfc3339(s) + .ok() + .map(|d| d.with_timezone(&Utc)) +} + +// ------------------------------------------------------------------ iCalendar dates + +/// Resolve a TZID parameter to an IANA zone. +pub fn resolve_tzid(tzid: &str, default: Tz) -> Tz { + let t = tzid.trim().trim_matches('"'); + if let Ok(z) = t.parse::() { + return z; + } + // /mozilla.org/20050126_1/Europe/Warsaw, /freeassociation.sourceforge.net/Tzfile/Europe/Warsaw + let segs: Vec<&str> = t.split('/').filter(|s| !s.is_empty()).collect(); + for n in [3usize, 2, 1] { + if segs.len() >= n { + if let Ok(z) = segs[segs.len() - n..].join("/").parse::() { + return z; + } + } + } + let windows = [ + ("Central European Standard Time", "Europe/Warsaw"), + ("Central Europe Standard Time", "Europe/Budapest"), + ("W. Europe Standard Time", "Europe/Berlin"), + ("Romance Standard Time", "Europe/Paris"), + ("GMT Standard Time", "Europe/London"), + ("Greenwich Standard Time", "Atlantic/Reykjavik"), + ("E. Europe Standard Time", "Europe/Chisinau"), + ("FLE Standard Time", "Europe/Kiev"), + ("GTB Standard Time", "Europe/Bucharest"), + ("Russian Standard Time", "Europe/Moscow"), + ("Eastern Standard Time", "America/New_York"), + ("Central Standard Time", "America/Chicago"), + ("Mountain Standard Time", "America/Denver"), + ("Pacific Standard Time", "America/Los_Angeles"), + ("UTC", "UTC"), + ("Coordinated Universal Time", "UTC"), + ("China Standard Time", "Asia/Shanghai"), + ("Tokyo Standard Time", "Asia/Tokyo"), + ("India Standard Time", "Asia/Kolkata"), + ("AUS Eastern Standard Time", "Australia/Sydney"), + ]; + for (w, i) in windows { + if t.eq_ignore_ascii_case(w) { + return i.parse().unwrap_or(default); + } + } + default +} + +#[derive(Debug, Clone, Copy)] +pub struct IcalTime { + pub utc: DateTime, + pub all_day: bool, + pub tz: Option, + pub date: Option, +} + +pub fn parse_ical_time(p: &Property, default: Tz) -> Option { + let v = p.value.trim(); + let is_date = p + .param("VALUE") + .map(|x| x.eq_ignore_ascii_case("DATE")) + .unwrap_or(false) + || (v.len() == 8 && v.chars().all(|c| c.is_ascii_digit())); + if is_date { + let d = NaiveDate::parse_from_str(&v[..8.min(v.len())], "%Y%m%d").ok()?; + let local = d.and_hms_opt(0, 0, 0)?; + let utc = default + .from_local_datetime(&local) + .earliest() + .map(|x| x.with_timezone(&Utc))?; + return Some(IcalTime { + utc, + all_day: true, + tz: None, + date: Some(d), + }); + } + if let Some(stripped) = v.strip_suffix('Z') { + let n = NaiveDateTime::parse_from_str(stripped, "%Y%m%dT%H%M%S").ok()?; + return Some(IcalTime { + utc: Utc.from_utc_datetime(&n), + all_day: false, + tz: None, + date: None, + }); + } + let n = NaiveDateTime::parse_from_str(v, "%Y%m%dT%H%M%S").ok()?; + let tz = p + .param("TZID") + .map(|t| resolve_tzid(t, default)) + .unwrap_or(default); + let utc = tz + .from_local_datetime(&n) + .earliest() + .or_else(|| { + tz.from_local_datetime(&(n + chrono::Duration::hours(1))) + .earliest() + }) + .map(|x| x.with_timezone(&Utc))?; + Some(IcalTime { + utc, + all_day: false, + tz: Some(tz), + date: None, + }) +} + +pub fn ical_utc(name: &str, d: &DateTime) -> Property { + Property::new(name, d.format("%Y%m%dT%H%M%SZ").to_string()) +} + +pub fn ical_local(name: &str, d: &DateTime, tz: &Tz) -> Property { + Property::new( + name, + d.with_timezone(tz).format("%Y%m%dT%H%M%S").to_string(), + ) + .with_param("TZID", tz.name()) +} + +pub fn ical_date(name: &str, d: NaiveDate) -> Property { + Property::new(name, d.format("%Y%m%d").to_string()).with_param("VALUE", "DATE") +} + +/// Build a VTIMEZONE for `tz` using the rules of the current year. +pub fn vtimezone(tz: &Tz) -> Component { + let mut c = Component::new("VTIMEZONE"); + c.add(Property::new("TZID", tz.name())); + let year = Utc::now().year(); + let r = rule_for(tz, year); + let fmt_off = |m: i32| { + let s = if m < 0 { '-' } else { '+' }; + format!("{s}{:02}{:02}", m.abs() / 60, m.abs() % 60) + }; + let std_off = -r.bias; + if r.dst_date.month == 0 { + let mut s = Component::new("STANDARD"); + s.add(Property::new("DTSTART", "19700101T000000")); + s.add(Property::new("TZOFFSETFROM", fmt_off(std_off))); + s.add(Property::new("TZOFFSETTO", fmt_off(std_off))); + c.children.push(s); + return c; + } + let dst_off = std_off - r.dst_bias; + let byday = |st: &SysTime| { + let wd = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"][st.dow as usize % 7]; + let n = if st.day >= 5 { + "-1".to_string() + } else { + st.day.to_string() + }; + format!("FREQ=YEARLY;BYMONTH={};BYDAY={n}{wd}", st.month) + }; + let mut d = Component::new("DAYLIGHT"); + d.add(Property::new( + "DTSTART", + format!("19700101T{:02}{:02}00", r.dst_date.hour, r.dst_date.minute), + )); + d.add(Property::new("RRULE", byday(&r.dst_date))); + d.add(Property::new("TZOFFSETFROM", fmt_off(std_off))); + d.add(Property::new("TZOFFSETTO", fmt_off(dst_off))); + let mut s = Component::new("STANDARD"); + s.add(Property::new( + "DTSTART", + format!("19700101T{:02}{:02}00", r.std_date.hour, r.std_date.minute), + )); + s.add(Property::new("RRULE", byday(&r.std_date))); + s.add(Property::new("TZOFFSETFROM", fmt_off(dst_off))); + s.add(Property::new("TZOFFSETTO", fmt_off(std_off))); + c.children.push(d); + c.children.push(s); + c +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn warsaw_rule() { + let r = rule_for(&chrono_tz::Europe::Warsaw, 2026); + assert_eq!(r.bias, -60); + assert_eq!(r.dst_bias, -60); + assert_eq!( + ( + r.dst_date.month, + r.dst_date.day, + r.dst_date.dow, + r.dst_date.hour + ), + (3, 5, 0, 2) + ); + assert_eq!( + ( + r.std_date.month, + r.std_date.day, + r.std_date.dow, + r.std_date.hour + ), + (10, 5, 0, 3) + ); + } + + #[test] + fn blob_roundtrip() { + let b = blob_for(&chrono_tz::America::New_York, 2026); + let tz = tz_from_blob(&b, chrono_tz::Europe::Warsaw); + let r1 = rule_for(&tz, 2026); + assert_eq!(r1, rule_for(&chrono_tz::America::New_York, 2026)); + let w = blob_for(&chrono_tz::Europe::Warsaw, 2026); + assert_eq!( + tz_from_blob(&w, chrono_tz::Europe::Warsaw), + chrono_tz::Europe::Warsaw + ); + } + + #[test] + fn ical_times() { + let p = Property::new("DTSTART", "20260704T100000") + .with_param("TZID", "/mozilla.org/x/Europe/Warsaw"); + let t = parse_ical_time(&p, chrono_tz::UTC).unwrap(); + assert_eq!(fmt_compact(&t.utc), "20260704T080000Z"); + let d = parse_ical_time( + &Property::new("DTSTART", "20260704").with_param("VALUE", "DATE"), + chrono_tz::Europe::Warsaw, + ) + .unwrap(); + assert!(d.all_day); + assert_eq!(fmt_compact(&d.utc), "20260703T220000Z"); + } +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..c012791 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,764 @@ +//! Runtime settings. Persisted as JSON in SQLite, editable from the admin panel and hot-applied. +//! Defaults mirror Z-Push `config.php`, `backend/*/config.php` and `policies.ini`. + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +#[serde(rename_all = "snake_case")] +pub enum TlsMode { + None, + #[default] + StartTls, + Tls, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +#[serde(rename_all = "snake_case")] +pub enum LoginFormat { + /// Use the login exactly as the device sent it (after stripping a Windows `DOMAIN\`). + #[default] + AsGiven, + /// Use only the local part (`user` from `user@example.com`) - Z-Push USE_FULLEMAIL_FOR_LOGIN=false. + LocalPart, + /// Always use a full address; append `default_domain` when missing. + FullEmail, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +#[derive(Default)] +pub struct Settings { + pub general: General, + pub imap: ImapSettings, + pub smtp: SmtpSettings, + pub caldav: DavSettings, + pub carddav: CardDavSettings, + pub sync: SyncSettings, + pub ping: PingSettings, + pub provisioning: Provisioning, + pub autodiscover: Autodiscover, + pub security: Security, + pub logging: Logging, + pub panel: Panel, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct General { + /// Shown in the panel and used for autodiscover display name. + pub server_name: String, + /// IANA zone used for all-day events and recurring items when the device gives no zone. + pub default_timezone: String, + pub login_format: LoginFormat, + /// Domain appended for FullEmail login and used for `{domain}` in templates. + pub default_domain: String, + /// If non-empty, only these domains may log in (lowercase). + pub allowed_domains: Vec, + /// Template for the user's primary e-mail address. Placeholders: {login} {local} {domain}. + pub email_template: String, + /// Highest ActiveSync protocol version announced to devices. + pub max_protocol: String, +} + +impl Default for General { + fn default() -> Self { + General { + server_name: "ActivePush".into(), + default_timezone: "Europe/Warsaw".into(), + login_format: LoginFormat::AsGiven, + default_domain: String::new(), + allowed_domains: vec![], + email_template: "{login}".into(), + max_protocol: "14.1".into(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct ImapSettings { + pub host: String, + pub port: u16, + pub security: TlsMode, + pub verify_tls: bool, + /// Optional namespace prefix (e.g. "INBOX.") - Z-Push IMAP_FOLDER_PREFIX. + pub folder_prefix: String, + pub folder_inbox: String, + pub folder_sent: String, + pub folder_drafts: String, + pub folder_trash: String, + pub folder_spam: String, + pub folder_archive: String, + /// Prefer RFC 6154 SPECIAL-USE flags over the names above. + pub use_special_use: bool, + /// Folders hidden from devices (exact names or `prefix*`). + pub excluded_folders: Vec, + /// Mark messages \Seen before moving them to Trash - IMAP_AUTOSEEN_ON_DELETE. + pub autoseen_on_delete: bool, + /// Inline (true) or attached (false) forward body - IMAP_INLINE_FORWARD. + pub inline_forward: bool, + pub timeout_secs: u64, + /// Keep authenticated connections for reuse between requests of the same user. + pub pool_idle_secs: u64, + pub pool_max_per_user: usize, +} + +impl Default for ImapSettings { + fn default() -> Self { + ImapSettings { + host: "127.0.0.1".into(), + port: 143, + security: TlsMode::None, + verify_tls: true, + folder_prefix: String::new(), + folder_inbox: "INBOX".into(), + folder_sent: "Sent".into(), + folder_drafts: "Drafts".into(), + folder_trash: "Trash".into(), + folder_spam: "Junk".into(), + folder_archive: "Archive".into(), + use_special_use: true, + excluded_folders: vec![], + autoseen_on_delete: false, + inline_forward: true, + timeout_secs: 60, + pool_idle_secs: 90, + pool_max_per_user: 4, + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +#[serde(rename_all = "snake_case")] +pub enum SendMethod { + #[default] + Smtp, + Sendmail, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +#[serde(rename_all = "snake_case")] +pub enum SmtpAuth { + None, + /// Authenticate with the device user's own credentials (recommended with submission port). + #[default] + UserCredentials, + /// Authenticate with a fixed relay account. + Static, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct SmtpSettings { + pub method: SendMethod, + pub host: String, + pub port: u16, + pub security: TlsMode, + pub verify_tls: bool, + pub auth: SmtpAuth, + pub username: String, + /// Secret - never returned by the API. + pub password: String, + pub sendmail_path: String, + pub timeout_secs: u64, + /// Store a copy of sent mail in the Sent folder when the device asks for it. + pub save_in_sent: bool, + /// Reject messages whose From is not one of the user's addresses (anti-spoofing). + pub enforce_from: bool, + pub max_message_mb: u64, +} + +impl Default for SmtpSettings { + fn default() -> Self { + SmtpSettings { + method: SendMethod::Smtp, + host: "127.0.0.1".into(), + port: 587, + security: TlsMode::StartTls, + verify_tls: false, + auth: SmtpAuth::UserCredentials, + username: String::new(), + password: String::new(), + sendmail_path: "/usr/sbin/sendmail".into(), + timeout_secs: 60, + save_in_sent: true, + enforce_from: true, + max_message_mb: 50, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct DavSettings { + pub enabled: bool, + /// Base URL of the server, e.g. `https://dav.example.com`. + pub base_url: String, + /// Path to the user's calendar home. Placeholders: %u login, %l local part, %d domain. + pub path: String, + pub verify_tls: bool, + /// Only collections whose path matches this regex (empty = all). + pub include_regex: String, + pub exclude_regex: String, + pub timeout_secs: u64, + /// Name of the default calendar (path segment); empty = first found. + pub default_collection: String, +} + +impl Default for DavSettings { + fn default() -> Self { + DavSettings { + enabled: false, + base_url: "https://127.0.0.1".into(), + path: "/dav/calendars/%u/".into(), + verify_tls: true, + include_regex: String::new(), + exclude_regex: String::new(), + timeout_secs: 60, + default_collection: String::new(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct CardDavSettings { + pub enabled: bool, + pub base_url: String, + pub path: String, + pub verify_tls: bool, + pub include_regex: String, + pub exclude_regex: String, + pub timeout_secs: u64, + pub default_collection: String, + /// Global address list collection (GAL search); empty = search the user's books. + pub gal_path: String, + pub gal_min_length: usize, + pub max_picture_kb: usize, +} + +impl Default for CardDavSettings { + fn default() -> Self { + CardDavSettings { + enabled: false, + base_url: "https://127.0.0.1".into(), + path: "/dav/addressbooks/%u/".into(), + verify_tls: true, + include_regex: String::new(), + exclude_regex: String::new(), + timeout_secs: 60, + default_collection: String::new(), + gal_path: String::new(), + gal_min_length: 3, + max_picture_kb: 5120, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct SyncSettings { + /// SYNC_MAX_ITEMS - upper bound for WindowSize. + pub max_items: u32, + /// SYNC_FILTERTIME_MAX - 0 = no limit, otherwise EAS filter type 1..7. + pub filter_time_max: u8, + /// SYNC_CONFLICT_DEFAULT: true = server wins (overwrite PIM), false = client wins. + pub server_wins: bool, + pub max_attachment_mb: u64, + pub max_request_mb: u64, + /// Hanging Sync (Wait / HeartbeatInterval) bounds in seconds. + pub heartbeat_min: u64, + pub heartbeat_max: u64, + /// Detect a device retrying the same SyncKey and shrink its window (loop detection). + pub loop_detection: bool, + /// Max seconds a Search waits - SEARCH_WAIT. + pub search_wait_secs: u64, + /// SEARCH_MAXRESULTS + pub search_max_results: u32, + /// Retry-After for 503 responses - RETRY_AFTER_DELAY. + pub retry_after_secs: u64, +} + +impl Default for SyncSettings { + fn default() -> Self { + SyncSettings { + max_items: 512, + filter_time_max: 0, + server_wins: true, + max_attachment_mb: 50, + max_request_mb: 60, + heartbeat_min: 60, + heartbeat_max: 3540, + loop_detection: true, + search_wait_secs: 10, + search_max_results: 50, + retry_after_secs: 300, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct PingSettings { + /// PING_INTERVAL - how often backend changes are checked while a Ping hangs. + pub check_interval_secs: u64, + /// PING_LOWER_BOUND_LIFETIME / PING_HIGHER_BOUND_LIFETIME. + pub lifetime_min: u64, + pub lifetime_max: u64, + pub max_folders: usize, +} + +impl Default for PingSettings { + fn default() -> Self { + PingSettings { + check_interval_secs: 30, + lifetime_min: 60, + lifetime_max: 3540, + max_folders: 300, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct Provisioning { + pub enabled: bool, + /// LOOSE_PROVISIONING - allow devices that never provision. + pub loose: bool, + pub default_policy: String, + pub policies: Vec, + /// Per-user policy assignment: (username, policy name). + pub user_policies: Vec, +} + +impl Default for Provisioning { + fn default() -> Self { + Provisioning { + enabled: true, + loose: false, + default_policy: "default".into(), + policies: vec![Policy::default()], + user_policies: vec![], + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct UserPolicy { + pub username: String, + pub policy: String, +} + +/// All fields from Z-Push `policies.ini`. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct Policy { + pub name: String, + pub devpwenabled: bool, + pub alphanumpwreq: bool, + pub devencenabled: bool, + pub attenabled: bool, + pub mindevpwlenngth: u32, + pub maxinacttimedevlock: u32, + pub maxdevpwfailedattempts: u32, + /// -1 = unlimited + pub maxattsize: i64, + pub allowsimpledevpw: bool, + pub devpwexpiration: u32, + pub devpwhistory: u32, + pub allowstoragecard: bool, + pub allowcam: bool, + pub reqdevenc: bool, + pub allowunsignedapps: bool, + pub allowunsignedinstallationpackages: bool, + pub mindevcomplexchars: u32, + pub allowwifi: bool, + pub allowtextmessaging: bool, + pub allowpopimapemail: bool, + /// 0 disabled, 1 handsfree only, 2 allowed + pub allowbluetooth: u32, + pub allowirda: bool, + pub reqmansyncroam: bool, + pub allowdesktopsync: bool, + pub maxcalagefilter: u32, + pub allowhtmlemail: bool, + pub maxemailagefilter: u32, + pub maxemailbodytruncsize: i64, + pub maxemailhtmlbodytruncsize: i64, + pub reqsignedsmimemessages: bool, + pub reqencsmimemessages: bool, + pub reqsignedsmimealgorithm: u32, + pub reqencsmimealgorithm: u32, + pub allowsmimeencalgneg: u32, + pub allowsmimesoftcerts: bool, + pub allowbrowser: bool, + pub allowconsumeremail: bool, + pub allowremotedesktop: bool, + pub allowinternetsharing: bool, + pub pwrecoveryenabled: bool, +} + +impl Default for Policy { + fn default() -> Self { + Policy { + name: "default".into(), + devpwenabled: false, + alphanumpwreq: false, + devencenabled: false, + attenabled: true, + mindevpwlenngth: 4, + maxinacttimedevlock: 900, + maxdevpwfailedattempts: 8, + maxattsize: -1, + allowsimpledevpw: true, + devpwexpiration: 0, + devpwhistory: 0, + allowstoragecard: true, + allowcam: true, + reqdevenc: false, + allowunsignedapps: true, + allowunsignedinstallationpackages: true, + mindevcomplexchars: 3, + allowwifi: true, + allowtextmessaging: true, + allowpopimapemail: true, + allowbluetooth: 2, + allowirda: true, + reqmansyncroam: false, + allowdesktopsync: true, + maxcalagefilter: 0, + allowhtmlemail: true, + maxemailagefilter: 0, + maxemailbodytruncsize: -1, + maxemailhtmlbodytruncsize: -1, + reqsignedsmimemessages: false, + reqencsmimemessages: false, + reqsignedsmimealgorithm: 0, + reqencsmimealgorithm: 0, + allowsmimeencalgneg: 2, + allowsmimesoftcerts: true, + allowbrowser: true, + allowconsumeremail: true, + allowremotedesktop: true, + allowinternetsharing: true, + pwrecoveryenabled: false, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct Autodiscover { + pub enabled: bool, + /// Public ActiveSync URL handed to devices; empty = derived from the request Host. + pub server_url: String, + /// Validate credentials against IMAP before answering (recommended). + pub require_auth: bool, +} + +impl Default for Autodiscover { + fn default() -> Self { + Autodiscover { + enabled: true, + server_url: String::new(), + require_auth: true, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct Security { + /// Failed logins per IP / per user before lockout. + pub auth_fail_max: u32, + pub auth_fail_window_secs: u64, + pub lockout_secs: u64, + /// Proxies whose forwarded-for header is trusted (CIDR). Default: loopback. + pub trusted_proxies: Vec, + pub real_ip_header: String, + /// If non-empty, only these client networks may use ActiveSync (CIDR). + pub eas_allowed_networks: Vec, + /// Users that may never sync (lowercase logins). + pub blocked_users: Vec, + /// If non-empty, only these users may sync. + pub allowed_users: Vec, + /// New devices need administrator approval before they can sync. + pub require_device_approval: bool, + /// Device types (case-insensitive substring of DeviceType or User-Agent) that are refused. + pub blocked_device_types: Vec, + /// LOGAUTHFAIL - log failed logins (fail2ban friendly line). + pub log_auth_failures: bool, + /// Successful credentials are cached (HMAC only, never plaintext) for this many seconds. + pub auth_cache_secs: u64, +} + +impl Default for Security { + fn default() -> Self { + Security { + auth_fail_max: 8, + auth_fail_window_secs: 600, + lockout_secs: 900, + trusted_proxies: vec!["127.0.0.1/32".into(), "::1/128".into()], + real_ip_header: "X-Forwarded-For".into(), + eas_allowed_networks: vec![], + blocked_users: vec![], + allowed_users: vec![], + require_device_approval: false, + blocked_device_types: vec![], + log_auth_failures: true, + auth_cache_secs: 300, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct Logging { + /// Log decoded WBXML of requests and responses (debug only; contains mail data!). + pub log_wbxml: bool, + /// Users with verbose (WBXML) logging regardless of global setting - LOGUSERLEVEL. + pub debug_users: Vec, + /// Lines kept in memory for the panel log viewer. + pub ring_size: usize, + /// Days of hourly statistics kept in the database. + pub stats_retention_days: u32, + /// Days of audit log kept. + pub audit_retention_days: u32, +} + +impl Default for Logging { + fn default() -> Self { + Logging { + log_wbxml: false, + debug_users: vec![], + ring_size: 2000, + stats_retention_days: 90, + audit_retention_days: 365, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(default)] +pub struct Panel { + pub session_ttl_minutes: u64, + /// Bearer token for /metrics (Prometheus). Empty = metrics endpoint disabled. Secret. + pub prometheus_token: String, + /// Remove devices not seen for this many days (0 = never) - like `z-push-admin -a fixstates`. + pub device_inactive_days: u32, + /// If non-empty, the panel only answers these client networks (CIDR). + pub allowed_networks: Vec, +} + +impl Default for Panel { + fn default() -> Self { + Panel { + session_ttl_minutes: 480, + prometheus_token: String::new(), + device_inactive_days: 180, + allowed_networks: vec![], + } + } +} + +/// JSON pointers of secret values. They are blanked on read and kept when an update sends "". +pub const SECRET_FIELDS: &[&str] = &["/smtp/password", "/panel/prometheus_token"]; + +impl Settings { + pub fn validate(&self) -> Result<(), String> { + if self.imap.host.trim().is_empty() { + return Err("IMAP host is required".into()); + } + if self.imap.port == 0 { + return Err("IMAP port is invalid".into()); + } + if self + .general + .default_timezone + .parse::() + .is_err() + { + return Err(format!( + "Unknown time zone '{}'", + self.general.default_timezone + )); + } + if !["2.5", "12.0", "12.1", "14.0", "14.1"].contains(&self.general.max_protocol.as_str()) { + return Err("max_protocol must be one of 2.5, 12.0, 12.1, 14.0, 14.1".into()); + } + for (name, d) in [ + ("CalDAV", &self.caldav.base_url), + ("CardDAV", &self.carddav.base_url), + ] { + if !d.is_empty() && url::Url::parse(d).is_err() { + return Err(format!("{name} base URL is invalid")); + } + } + for r in [ + &self.caldav.include_regex, + &self.caldav.exclude_regex, + &self.carddav.include_regex, + &self.carddav.exclude_regex, + ] { + if !r.is_empty() && regex::Regex::new(r).is_err() { + return Err(format!("Invalid regular expression: {r}")); + } + } + for n in self + .security + .trusted_proxies + .iter() + .chain(self.security.eas_allowed_networks.iter()) + .chain(self.panel.allowed_networks.iter()) + { + if crate::util::Cidr::parse(n).is_none() { + return Err(format!( + "Invalid network '{n}' (expected CIDR, e.g. 10.0.0.0/8)" + )); + } + } + if self.provisioning.policies.is_empty() { + return Err("At least one policy is required".into()); + } + if !self + .provisioning + .policies + .iter() + .any(|p| p.name == self.provisioning.default_policy) + { + return Err("Default policy does not exist".into()); + } + if self.sync.max_items == 0 || self.sync.max_items > 2000 { + return Err("sync.max_items must be 1..2000".into()); + } + if self.ping.check_interval_secs < 5 { + return Err("ping.check_interval_secs must be >= 5".into()); + } + if self.ping.lifetime_min > self.ping.lifetime_max { + return Err("ping lifetime min > max".into()); + } + if self.smtp.method == SendMethod::Sendmail + && !std::path::Path::new(&self.smtp.sendmail_path).is_absolute() + { + return Err("sendmail_path must be absolute".into()); + } + Ok(()) + } + + pub fn policy_for(&self, user: &str) -> &Policy { + let name = self + .provisioning + .user_policies + .iter() + .find(|u| u.username.eq_ignore_ascii_case(user)) + .map(|u| u.policy.as_str()) + .unwrap_or(&self.provisioning.default_policy); + self.provisioning + .policies + .iter() + .find(|p| p.name == name) + .or_else(|| self.provisioning.policies.first()) + .expect("validated: at least one policy") + } + + pub fn timezone(&self) -> chrono_tz::Tz { + self.general + .default_timezone + .parse() + .unwrap_or(chrono_tz::Europe::Warsaw) + } + + /// Remove secrets for display. + pub fn redacted(&self) -> serde_json::Value { + let mut v = serde_json::to_value(self).unwrap_or_default(); + for p in SECRET_FIELDS { + if let Some(x) = v.pointer_mut(p) { + let set = x.as_str().map(|s| !s.is_empty()).unwrap_or(false); + *x = serde_json::Value::String(if set { "__SET__".into() } else { String::new() }); + } + } + v + } + + /// Merge an update from the panel: secret fields that are "__SET__" or missing keep the old value. + pub fn merge_update(&self, incoming: serde_json::Value) -> Result { + let old = serde_json::to_value(self).map_err(|e| e.to_string())?; + // deep-merge: a partial document only changes the keys it contains + let mut incoming = { + let mut base = old.clone(); + json_merge(&mut base, incoming); + base + }; + for p in SECRET_FIELDS { + let keep = match incoming.pointer(p) { + None => true, + Some(v) => v.as_str() == Some("__SET__"), + }; + if keep { + if let (Some(dst), Some(src)) = (incoming.pointer_mut(p), old.pointer(p)) { + *dst = src.clone(); + } + } + } + let s: Settings = + serde_json::from_value(incoming).map_err(|e| format!("Invalid settings: {e}"))?; + s.validate()?; + Ok(s) + } +} + +fn json_merge(base: &mut serde_json::Value, patch: serde_json::Value) { + match (base, patch) { + (serde_json::Value::Object(b), serde_json::Value::Object(p)) => { + for (k, v) in p { + json_merge(b.entry(k).or_insert(serde_json::Value::Null), v); + } + } + (b, p) => *b = p, + } +} + +pub fn expand_user_template(tpl: &str, login: &str, default_domain: &str) -> String { + let (local, domain) = match login.split_once('@') { + Some((l, d)) => (l.to_string(), d.to_string()), + None => (login.to_string(), default_domain.to_string()), + }; + tpl.replace("%u", login) + .replace("%l", &local) + .replace("%d", &domain) + .replace("{login}", login) + .replace("{local}", &local) + .replace("{domain}", &domain) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn defaults_validate() { + Settings::default().validate().unwrap(); + } + + #[test] + fn secrets_kept() { + let mut s = Settings::default(); + s.smtp.password = "secret".into(); + let red = s.redacted(); + assert_eq!(red.pointer("/smtp/password").unwrap(), "__SET__"); + let merged = s.merge_update(red).unwrap(); + assert_eq!(merged.smtp.password, "secret"); + } + + #[test] + fn template() { + assert_eq!( + expand_user_template("/dav/%u/", "a@b.pl", "x"), + "/dav/a@b.pl/" + ); + assert_eq!( + expand_user_template("{local}@{domain}", "jan", "firma.pl"), + "jan@firma.pl" + ); + } +} diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 0000000..44cfaed --- /dev/null +++ b/src/db.rs @@ -0,0 +1,735 @@ +//! SQLite persistence (WAL). All queries are parameterised. + +use std::path::Path; +use std::str::FromStr; +use std::time::Duration; + +use anyhow::{Context, Result}; +use serde::Serialize; +use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions, SqliteSynchronous}; +use sqlx::{FromRow, Row, SqlitePool}; + +use crate::config::Settings; +use crate::util::now; + +pub type Db = SqlitePool; + +pub async fn open(data_dir: &Path) -> Result { + std::fs::create_dir_all(data_dir).with_context(|| format!("create {}", data_dir.display()))?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let _ = std::fs::set_permissions(data_dir, std::fs::Permissions::from_mode(0o700)); + } + let path = data_dir.join("active-push.db"); + let opts = SqliteConnectOptions::from_str(&format!("sqlite://{}", path.display()))? + .create_if_missing(true) + .journal_mode(SqliteJournalMode::Wal) + .synchronous(SqliteSynchronous::Normal) + .foreign_keys(true) + .busy_timeout(Duration::from_secs(15)) + // new databases release freed pages incrementally (see housekeeping) + .auto_vacuum(sqlx::sqlite::SqliteAutoVacuum::Incremental); + let pool = SqlitePoolOptions::new() + .max_connections(8) + .connect_with(opts) + .await + .with_context(|| format!("open database {}", path.display()))?; + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + for f in ["active-push.db", "active-push.db-wal", "active-push.db-shm"] { + let _ = + std::fs::set_permissions(data_dir.join(f), std::fs::Permissions::from_mode(0o600)); + } + } + sqlx::migrate!("./migrations").run(&pool).await?; + Ok(pool) +} + +// ------------------------------------------------------------------ settings + +pub async fn load_settings(db: &Db) -> Result<(Settings, i64)> { + let row = sqlx::query("SELECT json, revision FROM settings WHERE id = 1") + .fetch_optional(db) + .await?; + match row { + Some(r) => { + let json: String = r.get(0); + let rev: i64 = r.get(1); + let s: Settings = serde_json::from_str(&json).context("stored settings are invalid")?; + Ok((s, rev)) + } + None => { + let s = Settings::default(); + save_settings(db, &s).await?; + Ok((s, 1)) + } + } +} + +pub async fn save_settings(db: &Db, s: &Settings) -> Result { + let json = serde_json::to_string(s)?; + let r = sqlx::query( + "INSERT INTO settings (id, json, revision, updated_at) VALUES (1, ?, 1, ?) + ON CONFLICT(id) DO UPDATE SET json = excluded.json, revision = settings.revision + 1, updated_at = excluded.updated_at + RETURNING revision", + ) + .bind(json) + .bind(now()) + .fetch_one(db) + .await?; + Ok(r.get(0)) +} + +// ------------------------------------------------------------------ devices + +#[derive(Debug, Clone, FromRow, Serialize, Default)] +pub struct Device { + pub id: i64, + pub device_id: String, + pub username: String, + pub device_type: String, + pub user_agent: String, + pub model: String, + pub imei: String, + pub friendly_name: String, + pub os: String, + pub os_language: String, + pub phone_number: String, + pub mobile_operator: String, + pub as_version: String, + pub policy_key: i64, + pub policy_temp_key: i64, + pub policy_name: String, + pub policy_hash: String, + pub wipe_status: i64, + pub wipe_requested_at: Option, + pub wipe_requested_by: Option, + pub wipe_completed_at: Option, + pub blocked: i64, + pub approved: i64, + pub first_seen: i64, + pub last_seen: i64, + pub last_ip: String, + pub last_command: String, + pub requests: i64, + #[serde(skip)] + pub recovery_password: String, + #[serde(skip)] + pub ping_folders: String, + pub ping_lifetime: i64, + #[serde(skip)] + pub last_sync_request: String, + pub notes: String, +} + +/// Wipe status values (Z-Push SYNC_PROVISION_RWSTATUS_*). +pub const WIPE_NA: i64 = 0; +pub const WIPE_OK: i64 = 1; +pub const WIPE_PENDING: i64 = 2; +pub const WIPE_REQUESTED: i64 = 4; +pub const WIPE_WIPED: i64 = 8; +pub const WIPE_ACCOUNT_PENDING: i64 = 16; +pub const WIPE_ACCOUNT_REQUESTED: i64 = 32; +pub const WIPE_ACCOUNT_WIPED: i64 = 64; + +pub async fn device_get_or_create( + db: &Db, + device_id: &str, + username: &str, + device_type: &str, + user_agent: &str, + approved_default: bool, +) -> Result<(Device, bool)> { + if let Some(d) = device_get(db, device_id, username).await? { + return Ok((d, false)); + } + let ts = now(); + sqlx::query( + "INSERT OR IGNORE INTO devices (device_id, username, device_type, user_agent, first_seen, last_seen, approved) + VALUES (?, ?, ?, ?, ?, ?, ?)", + ) + .bind(device_id) + .bind(username) + .bind(device_type) + .bind(user_agent) + .bind(ts) + .bind(ts) + .bind(approved_default as i64) + .execute(db) + .await?; + let d = device_get(db, device_id, username) + .await? + .context("device insert failed")?; + Ok((d, true)) +} + +pub async fn device_get(db: &Db, device_id: &str, username: &str) -> Result> { + Ok( + sqlx::query_as::<_, Device>("SELECT * FROM devices WHERE device_id = ? AND username = ?") + .bind(device_id) + .bind(username) + .fetch_optional(db) + .await?, + ) +} + +pub async fn device_by_id(db: &Db, id: i64) -> Result> { + Ok( + sqlx::query_as::<_, Device>("SELECT * FROM devices WHERE id = ?") + .bind(id) + .fetch_optional(db) + .await?, + ) +} + +pub async fn device_list(db: &Db) -> Result> { + Ok( + sqlx::query_as::<_, Device>("SELECT * FROM devices ORDER BY last_seen DESC") + .fetch_all(db) + .await?, + ) +} + +pub async fn device_touch( + db: &Db, + id: i64, + ip: &str, + command: &str, + as_version: &str, + user_agent: &str, + device_type: &str, +) -> Result<()> { + sqlx::query( + "UPDATE devices SET last_seen = ?, last_ip = ?, last_command = ?, requests = requests + 1, + as_version = CASE WHEN ? = '' THEN as_version ELSE ? END, + user_agent = CASE WHEN ? = '' THEN user_agent ELSE ? END, + device_type = CASE WHEN ? = '' THEN device_type ELSE ? END + WHERE id = ?", + ) + .bind(now()) + .bind(ip) + .bind(command) + .bind(as_version) + .bind(as_version) + .bind(user_agent) + .bind(user_agent) + .bind(device_type) + .bind(device_type) + .bind(id) + .execute(db) + .await?; + Ok(()) +} + +#[derive(Debug, Default, Clone)] +pub struct DeviceInfo { + pub model: Option, + pub imei: Option, + pub friendly_name: Option, + pub os: Option, + pub os_language: Option, + pub phone_number: Option, + pub mobile_operator: Option, + pub user_agent: Option, +} + +pub async fn device_set_info(db: &Db, id: i64, i: &DeviceInfo) -> Result<()> { + sqlx::query( + "UPDATE devices SET model = COALESCE(?, model), imei = COALESCE(?, imei), friendly_name = COALESCE(?, friendly_name), + os = COALESCE(?, os), os_language = COALESCE(?, os_language), phone_number = COALESCE(?, phone_number), + mobile_operator = COALESCE(?, mobile_operator), user_agent = COALESCE(?, user_agent) WHERE id = ?", + ) + .bind(&i.model) + .bind(&i.imei) + .bind(&i.friendly_name) + .bind(&i.os) + .bind(&i.os_language) + .bind(&i.phone_number) + .bind(&i.mobile_operator) + .bind(&i.user_agent) + .bind(id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn device_set_field( + db: &Db, + id: i64, + field: DeviceField, + value: Option, + text: Option<&str>, +) -> Result<()> { + let col = match field { + DeviceField::PolicyKey => "policy_key", + DeviceField::PolicyTempKey => "policy_temp_key", + DeviceField::WipeStatus => "wipe_status", + DeviceField::Blocked => "blocked", + DeviceField::Approved => "approved", + DeviceField::PingLifetime => "ping_lifetime", + DeviceField::PolicyName => "policy_name", + DeviceField::PolicyHash => "policy_hash", + DeviceField::RecoveryPassword => "recovery_password", + DeviceField::PingFolders => "ping_folders", + DeviceField::LastSyncRequest => "last_sync_request", + DeviceField::Notes => "notes", + }; + let sql = format!("UPDATE devices SET {col} = ? WHERE id = ?"); + let q = sqlx::query(&sql); + let q = match (value, text) { + (Some(v), _) => q.bind(v), + (None, Some(t)) => q.bind(t.to_string()), + (None, None) => q.bind(Option::::None), + }; + q.bind(id).execute(db).await?; + Ok(()) +} + +#[derive(Debug, Clone, Copy)] +pub enum DeviceField { + PolicyKey, + PolicyTempKey, + WipeStatus, + Blocked, + Approved, + PingLifetime, + PolicyName, + PolicyHash, + RecoveryPassword, + PingFolders, + LastSyncRequest, + Notes, +} + +pub async fn device_request_wipe(db: &Db, id: i64, by: &str, account_only: bool) -> Result<()> { + let st = if account_only { + WIPE_ACCOUNT_PENDING + } else { + WIPE_PENDING + }; + sqlx::query("UPDATE devices SET wipe_status = ?, wipe_requested_at = ?, wipe_requested_by = ?, wipe_completed_at = NULL WHERE id = ?") + .bind(st) + .bind(now()) + .bind(by) + .bind(id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn device_wipe_done(db: &Db, id: i64, status: i64) -> Result<()> { + sqlx::query("UPDATE devices SET wipe_status = ?, wipe_completed_at = ? WHERE id = ?") + .bind(status) + .bind(now()) + .bind(id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn device_delete(db: &Db, id: i64) -> Result<()> { + sqlx::query("DELETE FROM devices WHERE id = ?") + .bind(id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn device_reset_states(db: &Db, id: i64) -> Result<()> { + sqlx::query("DELETE FROM sync_states WHERE device_rowid = ?") + .bind(id) + .execute(db) + .await?; + sqlx::query("DELETE FROM folder_stats WHERE device_rowid = ?") + .bind(id) + .execute(db) + .await?; + sqlx::query("UPDATE devices SET ping_folders = '', last_sync_request = '' WHERE id = ?") + .bind(id) + .execute(db) + .await?; + Ok(()) +} + +pub async fn devices_cleanup_inactive(db: &Db, days: u32) -> Result { + if days == 0 { + return Ok(0); + } + let cutoff = now() - days as i64 * 86400; + let r = sqlx::query( + "DELETE FROM devices WHERE last_seen < ? AND wipe_status NOT IN (2, 4, 16, 32)", + ) + .bind(cutoff) + .execute(db) + .await?; + Ok(r.rows_affected()) +} + +// ------------------------------------------------------------------ states + +pub async fn state_get( + db: &Db, + dev: i64, + collection: &str, + uuid: &str, + counter: i64, +) -> Result>> { + let r = sqlx::query( + "SELECT data FROM sync_states WHERE device_rowid = ? AND collection = ? AND uuid = ? AND counter = ?", + ) + .bind(dev) + .bind(collection) + .bind(uuid) + .bind(counter) + .fetch_optional(db) + .await?; + Ok(r.map(|r| r.get(0))) +} + +/// Store state `counter` and drop everything older than `counter - 1` +/// (the previous state is kept so a device may retry a lost response). +pub async fn state_put( + db: &Db, + dev: i64, + collection: &str, + uuid: &str, + counter: i64, + data: &[u8], +) -> Result<()> { + let mut tx = db.begin().await?; + sqlx::query( + "INSERT OR REPLACE INTO sync_states (device_rowid, collection, uuid, counter, data, created_at) VALUES (?, ?, ?, ?, ?, ?)", + ) + .bind(dev) + .bind(collection) + .bind(uuid) + .bind(counter) + .bind(data) + .bind(now()) + .execute(&mut *tx) + .await?; + sqlx::query( + "DELETE FROM sync_states WHERE device_rowid = ? AND collection = ? AND (uuid != ? OR counter < ?)", + ) + .bind(dev) + .bind(collection) + .bind(uuid) + .bind(counter - 1) + .execute(&mut *tx) + .await?; + tx.commit().await?; + Ok(()) +} + +pub async fn state_delete_collection(db: &Db, dev: i64, collection: &str) -> Result<()> { + sqlx::query("DELETE FROM sync_states WHERE device_rowid = ? AND collection = ?") + .bind(dev) + .bind(collection) + .execute(db) + .await?; + sqlx::query("DELETE FROM folder_stats WHERE device_rowid = ? AND collection = ?") + .bind(dev) + .bind(collection) + .execute(db) + .await?; + Ok(()) +} + +/// Latest state per collection for a device (used by Ping/GetItemEstimate when no key is given). +pub async fn state_latest( + db: &Db, + dev: i64, + collection: &str, +) -> Result)>> { + let r = sqlx::query( + "SELECT uuid, counter, data FROM sync_states WHERE device_rowid = ? AND collection = ? ORDER BY created_at DESC, counter DESC LIMIT 1", + ) + .bind(dev) + .bind(collection) + .fetch_optional(db) + .await?; + Ok(r.map(|r| (r.get(0), r.get(1), r.get(2)))) +} + +pub async fn state_collections(db: &Db, dev: i64) -> Result> { + let rows = sqlx::query("SELECT DISTINCT collection FROM sync_states WHERE device_rowid = ?") + .bind(dev) + .fetch_all(db) + .await?; + Ok(rows.into_iter().map(|r| r.get(0)).collect()) +} + +// ------------------------------------------------------------------ folder / item maps + +pub async fn folder_short_id(db: &Db, user: &str, backend_id: &str) -> Result { + if let Some(r) = + sqlx::query("SELECT short_id FROM folder_map WHERE username = ? AND backend_id = ?") + .bind(user) + .bind(backend_id) + .fetch_optional(db) + .await? + { + return Ok(r.get(0)); + } + let r = sqlx::query( + "INSERT INTO folder_map (username, backend_id, short_id) + VALUES (?, ?, (SELECT COALESCE(MAX(short_id), 0) + 1 FROM folder_map WHERE username = ?)) + ON CONFLICT(username, backend_id) DO UPDATE SET short_id = folder_map.short_id + RETURNING short_id", + ) + .bind(user) + .bind(backend_id) + .bind(user) + .fetch_one(db) + .await?; + Ok(r.get(0)) +} + +pub async fn folder_backend_id(db: &Db, user: &str, short_id: &str) -> Result> { + let Ok(n) = short_id.parse::() else { + return Ok(None); + }; + let r = sqlx::query("SELECT backend_id FROM folder_map WHERE username = ? AND short_id = ?") + .bind(user) + .bind(n) + .fetch_optional(db) + .await?; + Ok(r.map(|r| r.get(0))) +} + +pub async fn folder_rename_backend(db: &Db, user: &str, old: &str, new: &str) -> Result<()> { + // a stale mapping of a previously deleted folder with the new name must go + sqlx::query("DELETE FROM folder_map WHERE username = ? AND backend_id = ?") + .bind(user) + .bind(new) + .execute(db) + .await?; + sqlx::query("UPDATE folder_map SET backend_id = ? WHERE username = ? AND backend_id = ?") + .bind(new) + .bind(user) + .bind(old) + .execute(db) + .await?; + Ok(()) +} + +pub async fn item_short(db: &Db, user: &str, folder: &str, long_id: &str) -> Result { + if let Some(r) = sqlx::query( + "SELECT short_id FROM item_map WHERE username = ? AND folder = ? AND long_id = ?", + ) + .bind(user) + .bind(folder) + .bind(long_id) + .fetch_optional(db) + .await? + { + return Ok(r.get(0)); + } + let r = sqlx::query( + "INSERT INTO item_map (username, folder, long_id, short_id) + VALUES (?, ?, ?, (SELECT COALESCE(MAX(short_id), 0) + 1 FROM item_map WHERE username = ? AND folder = ?)) + ON CONFLICT(username, folder, long_id) DO UPDATE SET short_id = item_map.short_id + RETURNING short_id", + ) + .bind(user) + .bind(folder) + .bind(long_id) + .bind(user) + .bind(folder) + .fetch_one(db) + .await?; + Ok(r.get(0)) +} + +pub async fn item_long(db: &Db, user: &str, folder: &str, short: i64) -> Result> { + let r = sqlx::query( + "SELECT long_id FROM item_map WHERE username = ? AND folder = ? AND short_id = ?", + ) + .bind(user) + .bind(folder) + .bind(short) + .fetch_optional(db) + .await?; + Ok(r.map(|r| r.get(0))) +} + +// ------------------------------------------------------------------ folder stats + +#[derive(Debug, Clone, FromRow, Serialize)] +pub struct FolderStat { + pub collection: String, + pub folder_name: String, + pub folder_class: String, + pub last_sync: i64, + pub items_out: i64, + pub items_in: i64, + pub item_count: i64, + pub last_status: i64, + pub window_size: i64, + pub loop_hits: i64, +} + +#[allow(clippy::too_many_arguments)] +pub async fn folder_stat_update( + db: &Db, + dev: i64, + collection: &str, + name: &str, + class: &str, + out: i64, + inn: i64, + count: i64, + status: i64, + window: i64, + loop_hit: bool, +) -> Result<()> { + sqlx::query( + "INSERT INTO folder_stats (device_rowid, collection, folder_name, folder_class, last_sync, items_out, items_in, item_count, last_status, window_size, loop_hits) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(device_rowid, collection) DO UPDATE SET + folder_name = CASE WHEN excluded.folder_name = '' THEN folder_name ELSE excluded.folder_name END, + folder_class = CASE WHEN excluded.folder_class = '' THEN folder_class ELSE excluded.folder_class END, + last_sync = excluded.last_sync, items_out = items_out + excluded.items_out, items_in = items_in + excluded.items_in, + item_count = excluded.item_count, last_status = excluded.last_status, window_size = excluded.window_size, + loop_hits = loop_hits + excluded.loop_hits", + ) + .bind(dev) + .bind(collection) + .bind(name) + .bind(class) + .bind(now()) + .bind(out) + .bind(inn) + .bind(count) + .bind(status) + .bind(window) + .bind(loop_hit as i64) + .execute(db) + .await?; + Ok(()) +} + +pub async fn folder_stats(db: &Db, dev: i64) -> Result> { + Ok(sqlx::query_as::<_, FolderStat>( + "SELECT collection, folder_name, folder_class, last_sync, items_out, items_in, item_count, last_status, window_size, loop_hits + FROM folder_stats WHERE device_rowid = ? ORDER BY folder_class, folder_name", + ) + .bind(dev) + .fetch_all(db) + .await?) +} + +// ------------------------------------------------------------------ audit + +pub async fn audit(db: &Db, actor: &str, action: &str, target: &str, ip: &str, details: &str) { + let _ = sqlx::query( + "INSERT INTO audit_log (ts, actor, action, target, ip, details) VALUES (?, ?, ?, ?, ?, ?)", + ) + .bind(now()) + .bind(actor) + .bind(action) + .bind(target) + .bind(ip) + .bind(details) + .execute(db) + .await; +} + +#[derive(Debug, Clone, FromRow, Serialize)] +pub struct AuditEntry { + pub id: i64, + pub ts: i64, + pub actor: String, + pub action: String, + pub target: String, + pub ip: String, + pub details: String, +} + +pub async fn audit_list(db: &Db, limit: i64) -> Result> { + Ok( + sqlx::query_as::<_, AuditEntry>("SELECT * FROM audit_log ORDER BY id DESC LIMIT ?") + .bind(limit) + .fetch_all(db) + .await?, + ) +} + +pub async fn housekeeping(db: &Db, s: &Settings) -> Result<()> { + let ts = now(); + sqlx::query("DELETE FROM admin_sessions WHERE expires_at < ?") + .bind(ts) + .execute(db) + .await?; + sqlx::query("DELETE FROM setup_token WHERE expires_at < ?") + .bind(ts) + .execute(db) + .await?; + sqlx::query("DELETE FROM stats_hourly WHERE hour < ?") + .bind(ts - s.logging.stats_retention_days as i64 * 86400) + .execute(db) + .await?; + sqlx::query("DELETE FROM audit_log WHERE ts < ?") + .bind(ts - s.logging.audit_retention_days as i64 * 86400) + .execute(db) + .await?; + let removed = devices_cleanup_inactive(db, s.panel.device_inactive_days).await?; + if removed > 0 { + tracing::info!(removed, "removed inactive devices"); + } + // id maps of accounts that no longer have any device + sqlx::query( + "DELETE FROM item_map WHERE username NOT IN (SELECT DISTINCT username FROM devices)", + ) + .execute(db) + .await?; + sqlx::query( + "DELETE FROM folder_map WHERE username NOT IN (SELECT DISTINCT username FROM devices)", + ) + .execute(db) + .await?; + // states of collections a device stopped syncing more than a year ago + sqlx::query("DELETE FROM sync_states WHERE created_at < ?") + .bind(ts - 400 * 86400) + .execute(db) + .await?; + compact(db).await; + Ok(()) +} + +/// Keep the database files small: checkpoint/truncate the WAL and give free pages back. +pub async fn compact(db: &Db) { + let _ = sqlx::query("PRAGMA wal_checkpoint(TRUNCATE)") + .execute(db) + .await; + let mode: i64 = sqlx::query_scalar("PRAGMA auto_vacuum") + .fetch_one(db) + .await + .unwrap_or(0); + let free: i64 = sqlx::query_scalar("PRAGMA freelist_count") + .fetch_one(db) + .await + .unwrap_or(0); + let pages: i64 = sqlx::query_scalar("PRAGMA page_count") + .fetch_one(db) + .await + .unwrap_or(1); + if mode == 0 { + // databases created by 0.1.0: switch to incremental vacuum once (one full VACUUM) + tracing::info!("converting database to incremental auto-vacuum"); + if let Ok(mut c) = db.acquire().await { + let _ = sqlx::query("PRAGMA auto_vacuum = INCREMENTAL") + .execute(&mut *c) + .await; + let _ = sqlx::query("VACUUM").execute(&mut *c).await; + } + } else if free > 256 && free * 5 > pages { + let _ = sqlx::query("PRAGMA incremental_vacuum").execute(db).await; + } + let _ = sqlx::query("PRAGMA optimize").execute(db).await; + let _ = sqlx::query("PRAGMA wal_checkpoint(TRUNCATE)") + .execute(db) + .await; +} diff --git a/src/eas/convert/calendar.rs b/src/eas/convert/calendar.rs new file mode 100644 index 0000000..c19f2d0 --- /dev/null +++ b/src/eas/convert/calendar.rs @@ -0,0 +1,1159 @@ +//! iCalendar VEVENT <-> EAS Calendar. + +use chrono::{DateTime, Datelike, NaiveDate, TimeZone, Utc, Weekday}; +use chrono_tz::Tz; + +use super::{categories, categories_element, incoming_body, pim_body, Options}; +use crate::backend::ical::{self, Component, Property}; +use crate::backend::tz::{self, IcalTime}; +use crate::wbxml::Element; + +const DOW: [&str; 7] = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]; + +pub struct CalContext<'a> { + pub ver: u32, + pub opts: &'a Options, + pub default_tz: Tz, + pub user_email: &'a str, +} + +fn mail_of(p: &Property) -> String { + let v = p.value.trim(); + let v = v + .strip_prefix("mailto:") + .or_else(|| v.strip_prefix("MAILTO:")) + .or_else(|| v.strip_prefix("Mailto:")) + .unwrap_or(v); + v.to_string() +} + +fn duration_minutes(s: &str) -> Option { + // -PT15M, PT1H, -P1D, -PT1H30M, P1W + let neg = s.starts_with('-'); + let s = s.trim_start_matches(['-', '+']).strip_prefix('P')?; + let mut total = 0i64; + let mut num = String::new(); + let mut in_time = false; + for c in s.chars() { + match c { + 'T' => in_time = true, + '0'..='9' => num.push(c), + 'W' => { + total += num.parse::().ok()? * 7 * 1440; + num.clear() + } + 'D' => { + total += num.parse::().ok()? * 1440; + num.clear() + } + 'H' if in_time => { + total += num.parse::().ok()? * 60; + num.clear() + } + 'M' if in_time => { + total += num.parse::().ok()?; + num.clear() + } + 'S' if in_time => num.clear(), + _ => return None, + } + } + Some(if neg { -total } else { total }) +} + +pub fn reminder_minutes(ev: &Component) -> Option { + let alarm = ev.child("VALARM")?; + let trig = alarm.prop("TRIGGER")?; + if trig + .param("VALUE") + .map(|v| v.eq_ignore_ascii_case("DATE-TIME")) + .unwrap_or(false) + { + return Some(15); + } + let m = duration_minutes(trig.value.trim())?; + Some((-m).max(0)) +} + +fn busy_status(ev: &Component) -> u8 { + if let Some(b) = ev.text("X-MICROSOFT-CDO-BUSYSTATUS") { + return match b.to_ascii_uppercase().as_str() { + "FREE" => 0, + "TENTATIVE" => 1, + "OOF" => 3, + _ => 2, + }; + } + if ev + .text("TRANSP") + .map(|t| t.eq_ignore_ascii_case("TRANSPARENT")) + .unwrap_or(false) + { + return 0; + } + if ev + .text("STATUS") + .map(|t| t.eq_ignore_ascii_case("TENTATIVE")) + .unwrap_or(false) + { + return 1; + } + 2 +} + +fn sensitivity(ev: &Component) -> &'static str { + match ev + .text("CLASS") + .unwrap_or_default() + .to_ascii_uppercase() + .as_str() + { + "PRIVATE" => "2", + "CONFIDENTIAL" => "3", + _ => "0", + } +} + +fn partstat_to_eas(p: &str) -> &'static str { + match p.to_ascii_uppercase().as_str() { + "ACCEPTED" => "3", + "TENTATIVE" => "2", + "DECLINED" => "4", + "NEEDS-ACTION" => "5", + _ => "0", + } +} + +fn eas_to_partstat(s: &str) -> &'static str { + match s { + "3" => "ACCEPTED", + "2" => "TENTATIVE", + "4" => "DECLINED", + _ => "NEEDS-ACTION", + } +} + +fn end_of(ev: &Component, start: &IcalTime, dtz: Tz) -> DateTime { + if let Some(e) = ev.prop("DTEND").and_then(|p| tz::parse_ical_time(p, dtz)) { + return e.utc; + } + if let Some(d) = ev.text("DURATION").and_then(|d| duration_minutes(&d)) { + return start.utc + chrono::Duration::minutes(d); + } + if start.all_day { + start.utc + chrono::Duration::days(1) + } else { + start.utc + } +} + +pub fn masters_and_overrides(cal: &Component, comp: &str) -> (Option, Vec) { + let mut master = None; + let mut ovr = Vec::new(); + for c in cal.children_named(comp) { + if c.prop("RECURRENCE-ID").is_some() { + ovr.push(c.clone()); + } else if master.is_none() { + master = Some(c.clone()); + } + } + if master.is_none() && !ovr.is_empty() { + master = Some(ovr.remove(0)); + } + (master, ovr) +} + +// ------------------------------------------------------------------ RRULE -> EAS + +pub fn rrule_to_eas( + rrule: &str, + start: &DateTime, + tzone: &Tz, + ns: &str, + all_day: bool, +) -> Option { + let mut parts = std::collections::HashMap::new(); + for kv in rrule.split(';') { + if let Some((k, v)) = kv.split_once('=') { + parts.insert(k.trim().to_ascii_uppercase(), v.trim().to_string()); + } + } + let freq = parts.get("FREQ")?.to_ascii_uppercase(); + let local = start.with_timezone(tzone); + let interval: u32 = parts + .get("INTERVAL") + .and_then(|v| v.parse().ok()) + .unwrap_or(1); + let mut rec = Element::new(&format!("{ns}:Recurrence")); + let byday: Vec<(i32, u32)> = parts + .get("BYDAY") + .map(|v| { + v.split(',') + .filter_map(|d| { + let d = d.trim(); + if d.len() < 2 { + return None; + } + let (n, wd) = d.split_at(d.len() - 2); + let idx = DOW.iter().position(|x| x.eq_ignore_ascii_case(wd))? as u32; + Some((n.parse::().unwrap_or(0), idx)) + }) + .collect() + }) + .unwrap_or_default(); + let setpos: Option = parts + .get("BYSETPOS") + .and_then(|v| v.split(',').next()?.parse().ok()); + let mask = |days: &[(i32, u32)]| days.iter().fold(0u32, |m, (_, d)| m | (1 << d)); + let wom = |n: i32| if !(0..5).contains(&n) { 5 } else { n as u32 }; + let start_dow = local.weekday().num_days_from_sunday(); + let (typ, extra): (u32, Vec<(&str, String)>) = match freq.as_str() { + "DAILY" => { + if !byday.is_empty() { + (1, vec![("DayOfWeek", mask(&byday).to_string())]) + } else { + (0, vec![]) + } + } + "WEEKLY" => { + let m = if byday.is_empty() { + 1 << start_dow + } else { + mask(&byday) + }; + (1, vec![("DayOfWeek", m.to_string())]) + } + "MONTHLY" => { + let nth = byday + .iter() + .find(|(n, _)| *n != 0) + .map(|(n, _)| *n) + .or(setpos); + if let (Some(n), false) = (nth, byday.is_empty()) { + ( + 3, + vec![ + ("DayOfWeek", mask(&byday).to_string()), + ("WeekOfMonth", wom(n).to_string()), + ], + ) + } else { + let d = parts + .get("BYMONTHDAY") + .and_then(|v| v.split(',').next()?.parse::().ok()) + .map(|d| if d < 0 { 31 } else { d as u32 }) + .unwrap_or(local.day()); + (2, vec![("DayOfMonth", d.to_string())]) + } + } + "YEARLY" => { + let month = parts + .get("BYMONTH") + .and_then(|v| v.split(',').next()?.parse::().ok()) + .unwrap_or(local.month()); + let nth = byday + .iter() + .find(|(n, _)| *n != 0) + .map(|(n, _)| *n) + .or(setpos); + if let (Some(n), false) = (nth, byday.is_empty()) { + ( + 6, + vec![ + ("DayOfWeek", mask(&byday).to_string()), + ("WeekOfMonth", wom(n).to_string()), + ("MonthOfYear", month.to_string()), + ], + ) + } else { + let d = parts + .get("BYMONTHDAY") + .and_then(|v| v.split(',').next()?.parse::().ok()) + .unwrap_or(local.day()); + ( + 5, + vec![ + ("DayOfMonth", d.to_string()), + ("MonthOfYear", month.to_string()), + ], + ) + } + } + _ => return None, + }; + rec.push_text(&format!("{ns}:Type"), typ.to_string()); + if let Some(u) = parts.get("UNTIL") { + let until = if u.len() == 8 { + NaiveDate::parse_from_str(u, "%Y%m%d").ok().and_then(|d| { + let t = if all_day { + d.and_hms_opt(0, 0, 0) + } else { + d.and_hms_opt(23, 59, 59) + }?; + tzone + .from_local_datetime(&t) + .earliest() + .map(|x| x.with_timezone(&Utc)) + }) + } else { + tz::parse_eas_date(u).or_else(|| { + chrono::NaiveDateTime::parse_from_str(u, "%Y%m%dT%H%M%S") + .ok() + .and_then(|n| { + tzone + .from_local_datetime(&n) + .earliest() + .map(|x| x.with_timezone(&Utc)) + }) + }) + }; + if let Some(u) = until { + rec.push_text(&format!("{ns}:Until"), tz::fmt_compact(&u)); + } + } + if let Some(c) = parts.get("COUNT") { + rec.push_text(&format!("{ns}:Occurrences"), c.clone()); + } + rec.push_text(&format!("{ns}:Interval"), interval.to_string()); + for (k, v) in extra { + rec.push_text(&format!("{ns}:{k}"), v); + } + Some(rec) +} + +// ------------------------------------------------------------------ EAS -> RRULE + +pub fn eas_to_rrule(rec: &Element, ns: &str, all_day: bool, tzone: &Tz) -> Option { + let g = |n: &str| rec.child_u32(&format!("{ns}:{n}")); + let typ = g("Type")?; + let interval = g("Interval").unwrap_or(1).max(1); + let dow_mask = g("DayOfWeek").unwrap_or(0); + let days: Vec<&str> = (0..7) + .filter(|i| dow_mask & (1 << i) != 0) + .map(|i| DOW[i]) + .collect(); + let week = g("WeekOfMonth").unwrap_or(1); + let n = if week >= 5 { -1 } else { week as i32 }; + let mut r = match typ { + 0 => { + if days.is_empty() { + "FREQ=DAILY".to_string() + } else { + format!("FREQ=WEEKLY;BYDAY={}", days.join(",")) + } + } + 1 => { + if days.is_empty() { + "FREQ=WEEKLY".to_string() + } else { + format!("FREQ=WEEKLY;BYDAY={}", days.join(",")) + } + } + 2 => format!("FREQ=MONTHLY;BYMONTHDAY={}", g("DayOfMonth").unwrap_or(1)), + 3 => { + if days.len() == 1 { + format!("FREQ=MONTHLY;BYDAY={n}{}", days[0]) + } else { + format!("FREQ=MONTHLY;BYDAY={};BYSETPOS={n}", days.join(",")) + } + } + 5 => format!( + "FREQ=YEARLY;BYMONTH={};BYMONTHDAY={}", + g("MonthOfYear").unwrap_or(1), + g("DayOfMonth").unwrap_or(1) + ), + 6 => { + let m = g("MonthOfYear").unwrap_or(1); + if days.len() == 1 { + format!("FREQ=YEARLY;BYMONTH={m};BYDAY={n}{}", days[0]) + } else { + format!( + "FREQ=YEARLY;BYMONTH={m};BYDAY={};BYSETPOS={n}", + days.join(",") + ) + } + } + _ => return None, + }; + if interval > 1 { + r.push_str(&format!(";INTERVAL={interval}")); + } + if let Some(u) = rec + .child_text(&format!("{ns}:Until")) + .and_then(|u| tz::parse_eas_date(&u)) + { + if all_day { + r.push_str(&format!( + ";UNTIL={}", + u.with_timezone(tzone).format("%Y%m%d") + )); + } else { + r.push_str(&format!(";UNTIL={}", tz::fmt_compact(&u))); + } + } else if let Some(c) = g("Occurrences") { + r.push_str(&format!(";COUNT={c}")); + } + Some(r) +} + +// ------------------------------------------------------------------ iCal -> EAS + +pub fn to_eas(ics: &str, ctx: &CalContext) -> Option { + let cals = ical::parse(ics); + let cal = cals.iter().find(|c| c.name == "VCALENDAR")?; + let (master, overrides) = masters_and_overrides(cal, "VEVENT"); + let ev = master?; + let dtz = ctx.default_tz; + let start = ev + .prop("DTSTART") + .and_then(|p| tz::parse_ical_time(p, dtz))?; + let end = end_of(&ev, &start, dtz); + let tzone = start.tz.unwrap_or(dtz); + let mut app = Element::new("AirSync:ApplicationData"); + app.push_text("Calendar:TimeZone", tz::blob_for(&tzone, start.utc.year())); + app.push_text( + "Calendar:AllDayEvent", + if start.all_day { "1" } else { "0" }, + ); + let desc = ev.text("DESCRIPTION").unwrap_or_default(); + if ctx.ver >= 120 { + if let Some(b) = pim_body(&desc, ctx.opts, ctx.ver) { + app.push(b); + } + } else if !desc.is_empty() { + app.push_text("Calendar:Body", desc.clone()); + } + app.push_text("Calendar:BusyStatus", busy_status(&ev).to_string()); + let organizer = ev.prop("ORGANIZER"); + let org_mail = organizer.map(mail_of).unwrap_or_default(); + if let Some(o) = organizer { + app.push_opt( + "Calendar:OrganizerName", + o.param("CN").map(|s| s.to_string()), + ); + app.push_text("Calendar:OrganizerEmail", org_mail.clone()); + } + let stamp = ev + .prop("DTSTAMP") + .and_then(|p| tz::parse_ical_time(p, dtz)) + .map(|t| t.utc) + .unwrap_or_else(Utc::now); + app.push_text("Calendar:DtStamp", tz::fmt_compact(&stamp)); + app.push_text("Calendar:EndTime", tz::fmt_compact(&end)); + app.push_opt("Calendar:Location", ev.text("LOCATION")); + if let Some(r) = reminder_minutes(&ev) { + app.push_text("Calendar:Reminder", r.to_string()); + } + app.push_text("Calendar:Sensitivity", sensitivity(&ev)); + app.push_text("Calendar:Subject", ev.text("SUMMARY").unwrap_or_default()); + app.push_text("Calendar:StartTime", tz::fmt_compact(&start.utc)); + if let Some(uid) = ev.text("UID") { + if uid.len() <= 300 { + app.push_text("Calendar:UID", uid); + } + } + let attendees: Vec<&Property> = ev.props_named("ATTENDEE").collect(); + let is_org = org_mail.eq_ignore_ascii_case(ctx.user_email) || org_mail.is_empty(); + let meeting_status = if attendees.is_empty() { + 0 + } else if is_org { + 1 + } else { + 3 + }; + let cancelled = ev + .text("STATUS") + .map(|s| s.eq_ignore_ascii_case("CANCELLED")) + .unwrap_or(false); + let ms = if cancelled && meeting_status != 0 { + meeting_status + 4 + } else { + meeting_status + }; + app.push_text("Calendar:MeetingStatus", ms.to_string()); + if !attendees.is_empty() { + let mut list = Element::new("Calendar:Attendees"); + for a in &attendees { + let mail = mail_of(a); + if mail.is_empty() { + continue; + } + let mut e = Element::new("Calendar:Attendee").with_text("Calendar:Email", mail.clone()); + e.push_text( + "Calendar:Name", + a.param("CN") + .map(|s| s.to_string()) + .unwrap_or_else(|| mail.clone()), + ); + if ctx.ver >= 120 { + e.push_text( + "Calendar:AttendeeStatus", + partstat_to_eas(a.param("PARTSTAT").unwrap_or("")), + ); + let typ = match ( + a.param("CUTYPE") + .unwrap_or("") + .to_ascii_uppercase() + .as_str(), + a.param("ROLE").unwrap_or("").to_ascii_uppercase().as_str(), + ) { + ("RESOURCE", _) | ("ROOM", _) => "3", + (_, "OPT-PARTICIPANT") | (_, "NON-PARTICIPANT") => "2", + _ => "1", + }; + e.push_text("Calendar:AttendeeType", typ); + } + list.push(e); + } + app.push(list); + } + let cats: Vec = ev + .props_named("CATEGORIES") + .flat_map(|p| ical::split_list(&p.value)) + .collect(); + if let Some(c) = categories_element("Calendar", &cats) { + app.push(c); + } + if let Some(rr) = ev.prop("RRULE") { + if let Some(rec) = rrule_to_eas(&rr.value, &start.utc, &tzone, "Calendar", start.all_day) { + app.push(rec); + } + // exceptions + let mut exs = Element::new("Calendar:Exceptions"); + for ex in ev.props_named("EXDATE") { + for v in ex.value.split(',') { + let p = Property { + name: "EXDATE".into(), + params: ex.params.clone(), + value: v.to_string(), + }; + if let Some(t) = tz::parse_ical_time(&p, tzone) { + let t = if t.all_day { + start_on_date(&start, t.date.unwrap(), &tzone) + } else { + t.utc + }; + exs.push( + Element::new("Calendar:Exception") + .with_text("Calendar:Deleted", "1") + .with_text("Calendar:ExceptionStartTime", tz::fmt_compact(&t)), + ); + } + } + } + for o in &overrides { + let Some(rid) = o + .prop("RECURRENCE-ID") + .and_then(|p| tz::parse_ical_time(p, tzone)) + else { + continue; + }; + let rid_t = if rid.all_day { + start_on_date(&start, rid.date.unwrap(), &tzone) + } else { + rid.utc + }; + let mut e = Element::new("Calendar:Exception"); + let ostart = o.prop("DTSTART").and_then(|p| tz::parse_ical_time(p, dtz)); + if o.text("STATUS") + .map(|s| s.eq_ignore_ascii_case("CANCELLED")) + .unwrap_or(false) + { + e.push_text("Calendar:Deleted", "1"); + e.push_text("Calendar:ExceptionStartTime", tz::fmt_compact(&rid_t)); + exs.push(e); + continue; + } + e.push_text("Calendar:ExceptionStartTime", tz::fmt_compact(&rid_t)); + e.push_opt("Calendar:Subject", o.text("SUMMARY")); + if let Some(os) = &ostart { + e.push_text("Calendar:StartTime", tz::fmt_compact(&os.utc)); + e.push_text("Calendar:EndTime", tz::fmt_compact(&end_of(o, os, dtz))); + e.push_text("Calendar:AllDayEvent", if os.all_day { "1" } else { "0" }); + } + e.push_opt("Calendar:Location", o.text("LOCATION")); + if ctx.ver >= 120 { + if let Some(d) = o.text("DESCRIPTION") { + if let Some(b) = pim_body(&d, ctx.opts, ctx.ver) { + e.push(b); + } + } + } + e.push_text("Calendar:BusyStatus", busy_status(o).to_string()); + if let Some(r) = reminder_minutes(o) { + e.push_text("Calendar:Reminder", r.to_string()); + } + exs.push(e); + } + if !exs.children.is_empty() { + app.push(exs); + } + } + if ctx.ver >= 140 { + if meeting_status == 3 { + app.push_text("Calendar:ResponseRequested", "1"); + let me = attendees + .iter() + .find(|a| mail_of(a).eq_ignore_ascii_case(ctx.user_email)); + let rt = me + .and_then(|a| a.param("PARTSTAT")) + .map(|p| match partstat_to_eas(p) { + "3" => "3", + "2" => "2", + "4" => "4", + _ => "5", + }) + .unwrap_or("5"); + app.push_text("Calendar:ResponseType", rt); + } else if meeting_status == 1 { + app.push_text("Calendar:ResponseType", "1"); + } + } + if ctx.ver >= 120 { + app.push_text("AirSyncBase:NativeBodyType", "1"); + } + Some(app) +} + +fn start_on_date(start: &IcalTime, d: NaiveDate, tzone: &Tz) -> DateTime { + let local = start.utc.with_timezone(tzone); + let t = d.and_time(local.time()); + tzone + .from_local_datetime(&t) + .earliest() + .map(|x| x.with_timezone(&Utc)) + .unwrap_or(start.utc) +} + +// ------------------------------------------------------------------ EAS -> iCal + +const MANAGED: &[&str] = &[ + "DTSTART", + "DTEND", + "DURATION", + "SUMMARY", + "LOCATION", + "DESCRIPTION", + "CLASS", + "TRANSP", + "X-MICROSOFT-CDO-BUSYSTATUS", + "ATTENDEE", + "ORGANIZER", + "CATEGORIES", + "RRULE", + "EXDATE", + "RDATE", + "DTSTAMP", + "LAST-MODIFIED", + "SEQUENCE", + "UID", +]; + +fn ensure_vtimezone(cal: &mut Component, tzone: &Tz) { + let exists = cal + .children_named("VTIMEZONE") + .any(|c| c.text("TZID").map(|t| t == tzone.name()).unwrap_or(false)); + if !exists { + cal.children.insert(0, tz::vtimezone(tzone)); + } +} + +fn time_props( + cal: &mut Component, + ev: &mut Component, + start: DateTime, + end: DateTime, + all_day: bool, + tzone: &Tz, + use_tz: bool, +) { + ev.remove("DTSTART"); + ev.remove("DTEND"); + ev.remove("DURATION"); + if all_day { + let sd = start.with_timezone(tzone).date_naive(); + let mut ed = end.with_timezone(tzone).date_naive(); + if ed <= sd { + ed = sd.succ_opt().unwrap_or(sd); + } + ev.add(tz::ical_date("DTSTART", sd)); + ev.add(tz::ical_date("DTEND", ed)); + } else if use_tz && tzone.name() != "UTC" { + ensure_vtimezone(cal, tzone); + ev.add(tz::ical_local("DTSTART", &start, tzone)); + ev.add(tz::ical_local("DTEND", &end, tzone)); + } else { + ev.add(tz::ical_utc("DTSTART", &start)); + ev.add(tz::ical_utc("DTEND", &end)); + } +} + +fn set_alarm(ev: &mut Component, minutes: Option, summary: &str) { + ev.children.retain(|c| c.name != "VALARM"); + if let Some(m) = minutes { + let mut a = Component::new("VALARM"); + a.add(Property::new("ACTION", "DISPLAY")); + a.add(Property::text( + "DESCRIPTION", + if summary.is_empty() { + "Reminder" + } else { + summary + }, + )); + a.add(Property::new("TRIGGER", format!("-PT{m}M"))); + ev.children.push(a); + } +} + +fn apply_common(ev: &mut Component, app: &Element, ns: &str) { + let get = |n: &str| app.child_text(&format!("{ns}:{n}")); + ev.remove("SUMMARY"); + if let Some(s) = get("Subject").filter(|s| !s.is_empty()) { + ev.add(Property::text("SUMMARY", &s)); + } + ev.remove("LOCATION"); + let loc = get("Location").or_else(|| { + app.child("AirSyncBase:Location") + .and_then(|l| l.child_text("AirSyncBase:DisplayName")) + }); + if let Some(l) = loc.filter(|s| !s.is_empty()) { + ev.add(Property::text("LOCATION", &l)); + } + if app.has("AirSyncBase:Body") || app.has(&format!("{ns}:Body")) { + ev.remove("DESCRIPTION"); + if let Some(b) = incoming_body(app, ns).filter(|s| !s.trim().is_empty()) { + ev.add(Property::text("DESCRIPTION", &b)); + } + } + if let Some(s) = get("Sensitivity") { + ev.remove("CLASS"); + ev.add(Property::new( + "CLASS", + match s.as_str() { + "2" => "PRIVATE", + "3" => "CONFIDENTIAL", + _ => "PUBLIC", + }, + )); + } + if let Some(b) = get("BusyStatus") { + ev.remove("TRANSP"); + ev.remove("X-MICROSOFT-CDO-BUSYSTATUS"); + let (transp, cdo) = match b.as_str() { + "0" => ("TRANSPARENT", "FREE"), + "1" => ("OPAQUE", "TENTATIVE"), + "3" => ("OPAQUE", "OOF"), + "4" => ("OPAQUE", "WORKINGELSEWHERE"), + _ => ("OPAQUE", "BUSY"), + }; + ev.add(Property::new("TRANSP", transp)); + ev.add(Property::new("X-MICROSOFT-CDO-BUSYSTATUS", cdo)); + } +} + +/// Build/merge an iCalendar object from EAS ApplicationData. +pub fn from_eas( + app: &Element, + existing: Option<&str>, + default_tz: Tz, + user_email: &str, + user_name: &str, +) -> Option { + let mut cal = existing + .and_then(|e| ical::parse(e).into_iter().find(|c| c.name == "VCALENDAR")) + .unwrap_or_else(|| { + let mut c = Component::new("VCALENDAR"); + c.add(Property::new("VERSION", "2.0")); + c.add(Property::new("PRODID", "-//ActivePush//ActiveSync//EN")); + c.add(Property::new("CALSCALE", "GREGORIAN")); + c + }); + let (old_master, _old_ovr) = masters_and_overrides(&cal, "VEVENT"); + let mut ev = old_master + .clone() + .unwrap_or_else(|| Component::new("VEVENT")); + let tzone = app + .child_text("Calendar:TimeZone") + .map(|b| tz::tz_from_blob(&b, default_tz)) + .unwrap_or(default_tz); + let all_day = app.child_u32("Calendar:AllDayEvent").unwrap_or(0) == 1; + let start = app + .child_text("Calendar:StartTime") + .and_then(|s| tz::parse_eas_date(&s)) + .or_else(|| { + old_master + .as_ref() + .and_then(|m| m.prop("DTSTART")) + .and_then(|p| tz::parse_ical_time(p, default_tz)) + .map(|t| t.utc) + })?; + let end = app + .child_text("Calendar:EndTime") + .and_then(|s| tz::parse_eas_date(&s)) + .unwrap_or(start + chrono::Duration::hours(1)); + let recurring = app.has("Calendar:Recurrence"); + + // keep unmanaged properties of the old master + ev.props + .retain(|p| !MANAGED.iter().any(|m| p.name.eq_ignore_ascii_case(m))); + let uid = old_master + .as_ref() + .and_then(|m| m.text("UID")) + .or_else(|| app.child_text("Calendar:UID").filter(|u| !u.is_empty())) + .unwrap_or_else(|| uuid::Uuid::new_v4().to_string()); + let seq = old_master + .as_ref() + .map(|m| { + m.text("SEQUENCE") + .and_then(|s| s.parse::().ok()) + .unwrap_or(0) + + 1 + }) + .unwrap_or(0); + ev.props.insert(0, Property::text("UID", &uid)); + ev.add(tz::ical_utc("DTSTAMP", &Utc::now())); + ev.add(tz::ical_utc("LAST-MODIFIED", &Utc::now())); + ev.add(Property::new("SEQUENCE", seq.to_string())); + time_props( + &mut cal, + &mut ev, + start, + end, + all_day, + &tzone, + recurring || existing.map(|e| e.contains("TZID")).unwrap_or(false), + ); + apply_common(&mut ev, app, "Calendar"); + let summary = ev.text("SUMMARY").unwrap_or_default(); + set_alarm(&mut ev, app.child_u32("Calendar:Reminder"), &summary); + if let Some(cats) = categories(app, "Calendar") { + if !cats.is_empty() { + ev.add(Property::new( + "CATEGORIES", + cats.iter() + .map(|c| ical::escape_text(c)) + .collect::>() + .join(","), + )); + } + } else if let Some(m) = &old_master { + for c in m.props_named("CATEGORIES") { + ev.add(c.clone()); + } + } + + // attendees / organizer + let old_att: Vec = old_master + .as_ref() + .map(|m| m.props_named("ATTENDEE").cloned().collect()) + .unwrap_or_default(); + let old_org = old_master + .as_ref() + .and_then(|m| m.prop("ORGANIZER").cloned()); + if let Some(list) = app.child("Calendar:Attendees") { + let mut any = false; + for a in list.children_named("Calendar:Attendee") { + let Some(mail) = a.child_text("Calendar:Email").filter(|m| m.contains('@')) else { + continue; + }; + any = true; + let name = a.child_text("Calendar:Name").unwrap_or_default(); + let prev = old_att + .iter() + .find(|p| mail_of(p).eq_ignore_ascii_case(&mail)); + let partstat = a + .child_text("Calendar:AttendeeStatus") + .filter(|s| s != "0") + .map(|s| eas_to_partstat(&s).to_string()) + .or_else(|| { + prev.and_then(|p| p.param("PARTSTAT")) + .map(|s| s.to_string()) + }) + .unwrap_or_else(|| "NEEDS-ACTION".into()); + let role = match a.child_text("Calendar:AttendeeType").as_deref() { + Some("2") => "OPT-PARTICIPANT", + _ => "REQ-PARTICIPANT", + }; + let mut p = Property::new("ATTENDEE", format!("mailto:{mail}")); + if !name.is_empty() && name != mail { + p = p.with_param("CN", &name); + } + p = p.with_param("PARTSTAT", &partstat).with_param("ROLE", role); + if a.child_text("Calendar:AttendeeType").as_deref() == Some("3") { + p = p.with_param("CUTYPE", "RESOURCE"); + } + if partstat == "NEEDS-ACTION" { + p = p.with_param("RSVP", "TRUE"); + } + ev.add(p); + } + if any { + let org = old_org.clone().unwrap_or_else(|| { + let mail = app + .child_text("Calendar:OrganizerEmail") + .unwrap_or_else(|| user_email.to_string()); + let name = app + .child_text("Calendar:OrganizerName") + .unwrap_or_else(|| user_name.to_string()); + let mut p = Property::new("ORGANIZER", format!("mailto:{mail}")); + if !name.is_empty() { + p = p.with_param("CN", &name); + } + p + }); + ev.add(org); + } + } else { + for a in old_att { + ev.add(a); + } + if let Some(o) = old_org { + ev.add(o); + } + } + + // recurrence + exceptions + let mut overrides: Vec = Vec::new(); + if let Some(rec) = app.child("Calendar:Recurrence") { + if let Some(rr) = eas_to_rrule(rec, "Calendar", all_day, &tzone) { + ev.add(Property::new("RRULE", rr)); + } + if let Some(exs) = app.child("Calendar:Exceptions") { + for ex in exs.children_named("Calendar:Exception") { + let Some(orig) = ex + .child_text("Calendar:ExceptionStartTime") + .and_then(|s| tz::parse_eas_date(&s)) + else { + continue; + }; + let rid = if all_day { + tz::ical_date("RECURRENCE-ID", orig.with_timezone(&tzone).date_naive()) + } else if tzone.name() != "UTC" { + tz::ical_local("RECURRENCE-ID", &orig, &tzone) + } else { + tz::ical_utc("RECURRENCE-ID", &orig) + }; + if ex.child_u32("Calendar:Deleted").unwrap_or(0) == 1 { + let mut p = rid.clone(); + p.name = "EXDATE".into(); + ev.add(p); + continue; + } + let mut o = Component::new("VEVENT"); + o.add(Property::text("UID", &uid)); + o.add(rid); + o.add(tz::ical_utc("DTSTAMP", &Utc::now())); + let os = ex + .child_text("Calendar:StartTime") + .and_then(|s| tz::parse_eas_date(&s)) + .unwrap_or(orig); + let oe = ex + .child_text("Calendar:EndTime") + .and_then(|s| tz::parse_eas_date(&s)) + .unwrap_or(os + (end - start)); + let oad = ex + .child_u32("Calendar:AllDayEvent") + .map(|v| v == 1) + .unwrap_or(all_day); + time_props(&mut cal, &mut o, os, oe, oad, &tzone, true); + // inherit subject/location when not overridden + let mut merged = ex.clone(); + if !merged.has("Calendar:Subject") { + if let Some(s) = app.child("Calendar:Subject") { + merged.push(s.clone()); + } + } + if !merged.has("Calendar:Location") { + if let Some(s) = app.child("Calendar:Location") { + merged.push(s.clone()); + } + } + apply_common(&mut o, &merged, "Calendar"); + let s = o.text("SUMMARY").unwrap_or_default(); + set_alarm( + &mut o, + ex.child_u32("Calendar:Reminder") + .or(app.child_u32("Calendar:Reminder")), + &s, + ); + overrides.push(o); + } + } + } + + cal.children.retain(|c| c.name != "VEVENT"); + cal.children.push(ev); + cal.children.extend(overrides); + Some(cal.serialize()) +} + +/// Update the PARTSTAT of `user_email` (MeetingResponse) and return the new iCalendar. +pub fn set_partstat(ics: &str, user_email: &str, partstat: &str) -> Option { + let mut cals = ical::parse(ics); + let cal = cals.iter_mut().find(|c| c.name == "VCALENDAR")?; + cal.remove("METHOD"); + for ev in cal.children.iter_mut().filter(|c| c.name == "VEVENT") { + let mut found = false; + for p in ev.props.iter_mut().filter(|p| p.name == "ATTENDEE") { + if mail_of(p).eq_ignore_ascii_case(user_email) { + p.params.retain(|(k, _)| k != "PARTSTAT" && k != "RSVP"); + p.params.push(("PARTSTAT".into(), partstat.into())); + found = true; + } + } + if !found { + ev.add( + Property::new("ATTENDEE", format!("mailto:{user_email}")) + .with_param("PARTSTAT", partstat), + ); + } + } + Some(cal.serialize()) +} + +/// Build an iMIP REPLY for the organizer. +pub fn imip_reply( + ics: &str, + user_email: &str, + user_name: &str, + partstat: &str, +) -> Option<(String, String, String)> { + let cals = ical::parse(ics); + let cal = cals.iter().find(|c| c.name == "VCALENDAR")?; + let (master, _) = masters_and_overrides(cal, "VEVENT"); + let ev = master?; + let org = ev.prop("ORGANIZER").map(mail_of)?; + let mut out = Component::new("VCALENDAR"); + out.add(Property::new("VERSION", "2.0")); + out.add(Property::new("PRODID", "-//ActivePush//ActiveSync//EN")); + out.add(Property::new("METHOD", "REPLY")); + for t in cal.children_named("VTIMEZONE") { + out.children.push(t.clone()); + } + let mut r = Component::new("VEVENT"); + for n in [ + "UID", + "DTSTART", + "DTEND", + "DURATION", + "SEQUENCE", + "SUMMARY", + "ORGANIZER", + "RECURRENCE-ID", + ] { + for p in ev.props_named(n) { + r.add(p.clone()); + } + } + r.add(tz::ical_utc("DTSTAMP", &Utc::now())); + let mut a = + Property::new("ATTENDEE", format!("mailto:{user_email}")).with_param("PARTSTAT", partstat); + if !user_name.is_empty() { + a = a.with_param("CN", user_name); + } + r.add(a); + out.children.push(r); + let summary = ev.text("SUMMARY").unwrap_or_default(); + Some((org, summary, out.serialize())) +} + +pub fn weekday_from(i: u32) -> Weekday { + match i { + 0 => Weekday::Sun, + 1 => Weekday::Mon, + 2 => Weekday::Tue, + 3 => Weekday::Wed, + 4 => Weekday::Thu, + 5 => Weekday::Fri, + _ => Weekday::Sat, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn ctx<'a>(o: &'a Options) -> CalContext<'a> { + CalContext { + ver: 141, + opts: o, + default_tz: chrono_tz::Europe::Warsaw, + user_email: "jan@x.pl", + } + } + + #[test] + fn roundtrip_recurring() { + let ics = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\nUID:u1\r\nDTSTART;TZID=Europe/Warsaw:20261102T090000\r\nDTEND;TZID=Europe/Warsaw:20261102T100000\r\nSUMMARY:Daily\r\nRRULE:FREQ=WEEKLY;BYDAY=MO,WE;COUNT=10\r\nEXDATE;TZID=Europe/Warsaw:20261104T090000\r\nX-CUSTOM:keep\r\nBEGIN:VALARM\r\nACTION:DISPLAY\r\nTRIGGER:-PT10M\r\nEND:VALARM\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"; + let o = Options::default(); + let app = to_eas(ics, &ctx(&o)).unwrap(); + assert_eq!( + app.child_text("Calendar:StartTime").unwrap(), + "20261102T080000Z" + ); + assert_eq!(app.child_text("Calendar:Reminder").unwrap(), "10"); + let rec = app.child("Calendar:Recurrence").unwrap(); + assert_eq!(rec.child_text("Calendar:Type").unwrap(), "1"); + assert_eq!( + rec.child_text("Calendar:DayOfWeek").unwrap(), + (2 | 8).to_string() + ); + assert_eq!(rec.child_text("Calendar:Occurrences").unwrap(), "10"); + let ex = app + .path(&["Calendar:Exceptions", "Calendar:Exception"]) + .unwrap(); + assert_eq!( + ex.child_text("Calendar:ExceptionStartTime").unwrap(), + "20261104T080000Z" + ); + + let back = from_eas( + &app, + Some(ics), + chrono_tz::Europe::Warsaw, + "jan@x.pl", + "Jan", + ) + .unwrap(); + assert!(back.contains("X-CUSTOM:keep")); + assert!(back.contains("RRULE:FREQ=WEEKLY;BYDAY=MO,WE;COUNT=10")); + assert!(back.contains("DTSTART;TZID=Europe/Warsaw:20261102T090000")); + assert!(back.contains("EXDATE;TZID=Europe/Warsaw:20261104T090000")); + assert!(back.contains("TRIGGER:-PT10M")); + assert!(back.contains("SEQUENCE:1")); + } + + #[test] + fn allday() { + let mut app = Element::new("AirSync:ApplicationData"); + app.push_text( + "Calendar:TimeZone", + tz::blob_for(&chrono_tz::Europe::Warsaw, 2026), + ); + app.push_text("Calendar:AllDayEvent", "1"); + app.push_text("Calendar:StartTime", "20261224T230000Z"); + app.push_text("Calendar:EndTime", "20261225T230000Z"); + app.push_text("Calendar:Subject", "Święta"); + let ics = from_eas(&app, None, chrono_tz::UTC, "jan@x.pl", "Jan").unwrap(); + assert!(ics.contains("DTSTART;VALUE=DATE:20261225")); + assert!(ics.contains("DTEND;VALUE=DATE:20261226")); + } + + #[test] + fn monthly_nth() { + let start = Utc.with_ymd_and_hms(2026, 11, 10, 9, 0, 0).unwrap(); + let e = rrule_to_eas( + "FREQ=MONTHLY;BYDAY=-1FR", + &start, + &chrono_tz::UTC, + "Calendar", + false, + ) + .unwrap(); + assert_eq!(e.child_text("Calendar:Type").unwrap(), "3"); + assert_eq!(e.child_text("Calendar:WeekOfMonth").unwrap(), "5"); + let r = eas_to_rrule(&e, "Calendar", false, &chrono_tz::UTC).unwrap(); + assert_eq!(r, "FREQ=MONTHLY;BYDAY=-1FR"); + } +} diff --git a/src/eas/convert/contact.rs b/src/eas/convert/contact.rs new file mode 100644 index 0000000..2a26218 --- /dev/null +++ b/src/eas/convert/contact.rs @@ -0,0 +1,650 @@ +//! vCard <-> EAS Contacts (with lossless merge of unmapped vCard data). + +use base64::Engine; +use chrono::{NaiveDate, TimeZone, Utc}; +use chrono_tz::Tz; + +use super::{categories, categories_element, incoming_body, pim_body, Options}; +use crate::backend::ical::{self, Component, Property}; +use crate::backend::tz; +use crate::wbxml::Element; + +/// Phone slots: (EAS tag, required types, excluded types) +const PHONE_SLOTS: &[(&str, &[&str], &[&str])] = &[ + ("Contacts:MobilePhoneNumber", &["cell"], &[]), + ("Contacts:BusinessFaxNumber", &["work", "fax"], &[]), + ("Contacts:HomeFaxNumber", &["fax"], &["work"]), + ("Contacts:PagerNumber", &["pager"], &[]), + ("Contacts:CarPhoneNumber", &["car"], &[]), + ( + "Contacts:BusinessPhoneNumber", + &["work"], + &["fax", "cell", "pager"], + ), + ( + "Contacts:Business2PhoneNumber", + &["work"], + &["fax", "cell", "pager"], + ), + ("Contacts:HomePhoneNumber", &["home"], &["fax", "cell"]), + ("Contacts:Home2PhoneNumber", &["home"], &["fax", "cell"]), + ("Contacts:RadioPhoneNumber", &["x-radio"], &[]), + ("Contacts:AssistantPhoneNumber", &["x-assistant"], &[]), + ("Contacts2:CompanyMainPhone", &["x-company"], &[]), + ("Contacts2:MMS", &["x-mms"], &[]), +]; + +fn tel_types(slot: &str) -> &'static str { + match slot { + "Contacts:MobilePhoneNumber" => "CELL", + "Contacts:BusinessFaxNumber" => "WORK,FAX", + "Contacts:HomeFaxNumber" => "HOME,FAX", + "Contacts:PagerNumber" => "PAGER", + "Contacts:CarPhoneNumber" => "CAR", + "Contacts:BusinessPhoneNumber" | "Contacts:Business2PhoneNumber" => "WORK,VOICE", + "Contacts:HomePhoneNumber" | "Contacts:Home2PhoneNumber" => "HOME,VOICE", + "Contacts:RadioPhoneNumber" => "X-RADIO", + "Contacts:AssistantPhoneNumber" => "X-ASSISTANT", + "Contacts2:CompanyMainPhone" => "X-COMPANY", + "Contacts2:MMS" => "X-MMS", + _ => "VOICE", + } +} + +/// Assign TEL properties to EAS slots. Returns (slot -> prop index) and leftover indices. +fn assign_tels(tels: &[&Property]) -> (Vec<(&'static str, usize)>, Vec) { + let mut used = vec![false; tels.len()]; + let mut out = Vec::new(); + for (slot, req, exc) in PHONE_SLOTS { + let pos = tels.iter().enumerate().position(|(i, p)| { + if used[i] { + return false; + } + let t = p.types(); + req.iter().all(|r| t.iter().any(|x| x == r)) + && !exc.iter().any(|e| t.iter().any(|x| x == e)) + }); + if let Some(i) = pos { + used[i] = true; + out.push((*slot, i)); + } + } + // untyped / voice-only numbers go to free home/business/mobile slots + for fallback in [ + "Contacts:HomePhoneNumber", + "Contacts:BusinessPhoneNumber", + "Contacts:MobilePhoneNumber", + "Contacts:Home2PhoneNumber", + "Contacts:Business2PhoneNumber", + ] { + if out.iter().any(|(s, _)| *s == fallback) { + continue; + } + if let Some(i) = (0..tels.len()).find(|i| { + !used[*i] && { + let t = tels[*i].types(); + t.is_empty() + || t.iter().all(|x| { + x == "voice" || x == "pref" || x == "other" || x.starts_with("pref") + }) + } + }) { + used[i] = true; + out.push((fallback, i)); + } + } + let left = (0..tels.len()).filter(|i| !used[*i]).collect(); + (out, left) +} + +const ADR_SLOTS: &[(&str, &str)] = &[("Business", "work"), ("Home", "home"), ("Other", "other")]; + +fn assign_adrs(adrs: &[&Property]) -> (Vec<(&'static str, usize)>, Vec) { + let mut used = vec![false; adrs.len()]; + let mut out = Vec::new(); + for (slot, typ) in ADR_SLOTS { + if let Some(i) = + (0..adrs.len()).find(|i| !used[*i] && adrs[*i].types().iter().any(|t| t == typ)) + { + used[i] = true; + out.push((*slot, i)); + } + } + // untyped address -> Other / Home + for (slot, _) in [("Other", ""), ("Home", "")] { + if out.iter().any(|(s, _)| *s == slot) { + continue; + } + if let Some(i) = (0..adrs.len()).find(|i| { + !used[*i] + && adrs[*i] + .types() + .iter() + .all(|t| t == "pref" || t == "postal" || t == "parcel") + }) { + used[i] = true; + out.push((slot, i)); + } + } + let left = (0..adrs.len()).filter(|i| !used[*i]).collect(); + (out, left) +} + +fn bday_to_eas(v: &str, dtz: &Tz) -> Option { + let v = v.trim(); + let d = if v.len() >= 10 && v.as_bytes()[4] == b'-' { + NaiveDate::parse_from_str(&v[..10], "%Y-%m-%d").ok() + } else if v.starts_with("--") { + // --MMDD (no year) -> use 1604 like Apple/Outlook + NaiveDate::parse_from_str(&format!("1604{}", &v[2..6.min(v.len())]), "%Y%m%d").ok() + } else { + NaiveDate::parse_from_str(&v[..8.min(v.len())], "%Y%m%d").ok() + }?; + let local = dtz + .from_local_datetime(&d.and_hms_opt(0, 0, 0)?) + .earliest()?; + Some(tz::fmt_iso(&local.with_timezone(&Utc))) +} + +fn eas_to_date(s: &str, dtz: &Tz) -> Option { + let t = tz::parse_eas_date(s)?; + Some( + (t + chrono::Duration::hours(12)) + .with_timezone(dtz) + .date_naive(), + ) +} + +pub fn to_eas(vcf: &str, opts: &Options, ver: u32, dtz: Tz, max_picture: usize) -> Option { + let cards = ical::parse(vcf); + let c = cards.iter().find(|c| c.name == "VCARD")?; + let mut app = Element::new("AirSync:ApplicationData"); + let get = |n: &str| c.text(n); + if let Some(b) = get("ANNIVERSARY") + .or_else(|| get("X-ANNIVERSARY")) + .and_then(|v| bday_to_eas(&v, &dtz)) + { + app.push_text("Contacts:Anniversary", b); + } + app.push_opt( + "Contacts:AssistantName", + get("X-ASSISTANT").or_else(|| get("X-MS-ASSISTANT")), + ); + if let Some(b) = get("BDAY").and_then(|v| bday_to_eas(&v, &dtz)) { + app.push_text("Contacts:Birthday", b); + } + let note = get("NOTE").unwrap_or_default(); + if let Some(b) = pim_body(¬e, opts, ver) { + if !note.is_empty() { + app.push(b); + } + } else if !note.is_empty() { + app.push_text("Contacts:Body", note.clone()); + } + // phones + let tels: Vec<&Property> = c.props_named("TEL").collect(); + let (slots, _) = assign_tels(&tels); + // addresses + let adrs: Vec<&Property> = c.props_named("ADR").collect(); + let (aslots, _) = assign_adrs(&adrs); + for (slot, i) in &aslots { + let parts = ical::split_structured(&adrs[*i].value); + let p = |n: usize| parts.get(n).cloned().unwrap_or_default(); + let street = [p(1), p(2)] + .iter() + .filter(|s| !s.is_empty()) + .cloned() + .collect::>() + .join("\n"); + for (suffix, val) in [ + ("City", p(3)), + ("Country", p(6)), + ("PostalCode", p(5)), + ("State", p(4)), + ("Street", street), + ] { + if !val.is_empty() { + app.push_text(&format!("Contacts:{slot}{suffix}"), val); + } + } + } + for (slot, i) in &slots { + if !slot.starts_with("Contacts2") { + app.push_text(slot, tels[*i].text_value()); + } + } + let cats: Vec = c + .props_named("CATEGORIES") + .flat_map(|p| ical::split_list(&p.value)) + .collect(); + if let Some(e) = categories_element("Contacts", &cats) { + app.push(e); + } + if let Some(org) = c.prop("ORG") { + let parts = ical::split_structured(&org.value); + if let Some(n) = parts.first().filter(|s| !s.is_empty()) { + app.push_text("Contacts:CompanyName", n.clone()); + } + if let Some(d) = parts.get(1).filter(|s| !s.is_empty()) { + app.push_text("Contacts:Department", d.clone()); + } + } + for (i, e) in c.props_named("EMAIL").take(3).enumerate() { + app.push_text(&format!("Contacts:Email{}Address", i + 1), e.text_value()); + } + let n = c + .prop("N") + .map(|n| ical::split_structured(&n.value)) + .unwrap_or_default(); + let np = |i: usize| n.get(i).cloned().filter(|s| !s.is_empty()); + let fileas = get("X-EAS-FILEAS") + .or_else(|| get("FN")) + .or_else(|| match (np(0), np(1)) { + (Some(l), Some(f)) => Some(format!("{l}, {f}")), + (Some(l), None) => Some(l), + (None, Some(f)) => Some(f), + _ => None, + }); + app.push_opt("Contacts:FileAs", fileas); + app.push_opt("Contacts:FirstName", np(1)); + app.push_opt("Contacts:JobTitle", get("TITLE")); + app.push_opt("Contacts:LastName", np(0)); + app.push_opt("Contacts:MiddleName", np(2)); + app.push_opt("Contacts:OfficeLocation", get("X-OFFICE-LOCATION")); + app.push_opt("Contacts:Spouse", get("X-SPOUSE")); + app.push_opt("Contacts:Suffix", np(4)); + app.push_opt("Contacts:Title", np(3)); + app.push_opt("Contacts:WebPage", get("URL")); + app.push_opt("Contacts:YomiCompanyName", get("X-PHONETIC-ORG")); + app.push_opt("Contacts:YomiFirstName", get("X-PHONETIC-FIRST-NAME")); + app.push_opt("Contacts:YomiLastName", get("X-PHONETIC-LAST-NAME")); + if let Some(ph) = c.prop("PHOTO") { + let v = ph.value.trim(); + let data = if let Some(idx) = v.find("base64,") { + v[idx + 7..].to_string() + } else if ph + .param("ENCODING") + .map(|e| e.eq_ignore_ascii_case("b") || e.eq_ignore_ascii_case("BASE64")) + .unwrap_or(false) + || ph.params.iter().any(|(k, _)| k == "BASE64") + { + v.to_string() + } else { + String::new() + }; + let data: String = data.chars().filter(|c| !c.is_whitespace()).collect(); + if !data.is_empty() && data.len() * 3 / 4 <= max_picture { + app.push_text("Contacts:Picture", data); + } + } + // Contacts2 + app.push_opt("Contacts2:CustomerId", get("X-CUSTOMER-ID")); + app.push_opt("Contacts2:GovernmentId", get("X-GOVERNMENT-ID")); + for (i, im) in c.props_named("IMPP").take(3).enumerate() { + let tag = if i == 0 { + "Contacts2:IMAddress".to_string() + } else { + format!("Contacts2:IMAddress{}", i + 1) + }; + app.push_text(&tag, im.text_value()); + } + app.push_opt("Contacts2:ManagerName", get("X-MANAGER")); + for (slot, i) in &slots { + if slot.starts_with("Contacts2") { + app.push_text(slot, tels[*i].text_value()); + } + } + app.push_opt("Contacts2:AccountName", get("X-ACCOUNT-NAME")); + app.push_opt("Contacts2:NickName", get("NICKNAME")); + if ver >= 120 { + app.push_text("AirSyncBase:NativeBodyType", "1"); + } + Some(app) +} + +const MANAGED: &[&str] = &[ + "FN", + "N", + "ORG", + "TITLE", + "BDAY", + "ANNIVERSARY", + "X-ANNIVERSARY", + "URL", + "NOTE", + "CATEGORIES", + "NICKNAME", + "X-SPOUSE", + "X-ASSISTANT", + "X-MS-ASSISTANT", + "X-MANAGER", + "X-OFFICE-LOCATION", + "X-PHONETIC-ORG", + "X-PHONETIC-FIRST-NAME", + "X-PHONETIC-LAST-NAME", + "X-CUSTOMER-ID", + "X-GOVERNMENT-ID", + "X-ACCOUNT-NAME", + "X-EAS-FILEAS", + "REV", +]; + +pub fn from_eas(app: &Element, existing: Option<&str>, dtz: Tz) -> Option { + let mut card = existing + .and_then(|e| ical::parse(e).into_iter().find(|c| c.name == "VCARD")) + .unwrap_or_else(|| { + let mut c = Component::new("VCARD"); + c.add(Property::new("VERSION", "3.0")); + c.add(Property::new("PRODID", "-//ActivePush//ActiveSync//EN")); + c.add(Property::text("UID", &uuid::Uuid::new_v4().to_string())); + c + }); + let v4 = card + .text("VERSION") + .map(|v| v.starts_with('4')) + .unwrap_or(false); + let g = |n: &str| app.child_text(n).filter(|s| !s.trim().is_empty()); + + // keep overflow EMAIL/TEL/ADR/IMPP that EAS cannot represent + let old_emails: Vec = card.props_named("EMAIL").skip(3).cloned().collect(); + let old_tels: Vec = card.props_named("TEL").cloned().collect(); + let tel_refs: Vec<&Property> = old_tels.iter().collect(); + let (_, tel_left) = assign_tels(&tel_refs); + let keep_tels: Vec = tel_left.iter().map(|i| old_tels[*i].clone()).collect(); + let old_adrs: Vec = card.props_named("ADR").cloned().collect(); + let adr_refs: Vec<&Property> = old_adrs.iter().collect(); + let (_, adr_left) = assign_adrs(&adr_refs); + let keep_adrs: Vec = adr_left.iter().map(|i| old_adrs[*i].clone()).collect(); + let old_impp: Vec = card.props_named("IMPP").skip(3).cloned().collect(); + let old_photo = card.prop("PHOTO").cloned(); + + card.props.retain(|p| { + !MANAGED.iter().any(|m| p.name.eq_ignore_ascii_case(m)) + && !["EMAIL", "TEL", "ADR", "IMPP", "PHOTO"].contains(&p.name.as_str()) + }); + + let (first, last, middle, title, suffix) = ( + g("Contacts:FirstName").unwrap_or_default(), + g("Contacts:LastName").unwrap_or_default(), + g("Contacts:MiddleName").unwrap_or_default(), + g("Contacts:Title").unwrap_or_default(), + g("Contacts:Suffix").unwrap_or_default(), + ); + let company = g("Contacts:CompanyName").unwrap_or_default(); + let fn_ = [ + title.as_str(), + first.as_str(), + middle.as_str(), + last.as_str(), + suffix.as_str(), + ] + .iter() + .filter(|s| !s.is_empty()) + .cloned() + .collect::>() + .join(" "); + let fn_ = if fn_.is_empty() { + g("Contacts:FileAs") + .or_else(|| (!company.is_empty()).then(|| company.clone())) + .or_else(|| g("Contacts:Email1Address")) + .unwrap_or_else(|| "?".into()) + } else { + fn_ + }; + card.add(Property::text("FN", &fn_)); + card.add(Property::new( + "N", + [&last, &first, &middle, &title, &suffix] + .iter() + .map(|s| ical::escape_text(s)) + .collect::>() + .join(";"), + )); + if let Some(fa) = g("Contacts:FileAs") { + if fa != fn_ { + card.add(Property::text("X-EAS-FILEAS", &fa)); + } + } + let dept = g("Contacts:Department").unwrap_or_default(); + if !company.is_empty() || !dept.is_empty() { + card.add(Property::new( + "ORG", + format!( + "{};{}", + ical::escape_text(&company), + ical::escape_text(&dept) + ), + )); + } + if let Some(t) = g("Contacts:JobTitle") { + card.add(Property::text("TITLE", &t)); + } + for i in 1..=3 { + if let Some(e) = g(&format!("Contacts:Email{i}Address")) { + // devices send `"Name" ` + let addr = e + .rsplit_once('<') + .map(|(_, a)| a.trim_end_matches('>').to_string()) + .unwrap_or(e) + .trim() + .to_string(); + let typ = match i { + 1 => "INTERNET,WORK", + 2 => "INTERNET,HOME", + _ => "INTERNET,OTHER", + }; + card.add(Property::text("EMAIL", &addr).with_param("TYPE", typ)); + } + } + card.props.extend(old_emails); + for (slot, _, _) in PHONE_SLOTS { + if let Some(n) = g(slot) { + card.add(Property::text("TEL", &n).with_param("TYPE", tel_types(slot))); + } + } + card.props.extend(keep_tels); + for (slot, typ) in ADR_SLOTS { + let f = |s: &str| g(&format!("Contacts:{slot}{s}")).unwrap_or_default(); + let (street, city, state, zip, country) = ( + f("Street"), + f("City"), + f("State"), + f("PostalCode"), + f("Country"), + ); + if [&street, &city, &state, &zip, &country] + .iter() + .any(|s| !s.is_empty()) + { + let v = ["", "", &street, &city, &state, &zip, &country] + .iter() + .map(|s| ical::escape_text(s)) + .collect::>() + .join(";"); + card.add(Property::new("ADR", v).with_param("TYPE", &typ.to_ascii_uppercase())); + } + } + card.props.extend(keep_adrs); + if let Some(b) = g("Contacts:Birthday").and_then(|s| eas_to_date(&s, &dtz)) { + card.add(Property::new( + "BDAY", + b.format(if v4 { "%Y%m%d" } else { "%Y-%m-%d" }).to_string(), + )); + } + if let Some(b) = g("Contacts:Anniversary").and_then(|s| eas_to_date(&s, &dtz)) { + let name = if v4 { "ANNIVERSARY" } else { "X-ANNIVERSARY" }; + card.add(Property::new( + name, + b.format(if v4 { "%Y%m%d" } else { "%Y-%m-%d" }).to_string(), + )); + } + if let Some(u) = g("Contacts:WebPage") { + card.add(Property::new("URL", u)); + } + if let Some(n) = incoming_body(app, "Contacts").filter(|s| !s.trim().is_empty()) { + card.add(Property::text("NOTE", &n)); + } + if let Some(c) = categories(app, "Contacts").filter(|c| !c.is_empty()) { + card.add(Property::new( + "CATEGORIES", + c.iter() + .map(|x| ical::escape_text(x)) + .collect::>() + .join(","), + )); + } + for (tag, prop) in [ + ("Contacts:AssistantName", "X-ASSISTANT"), + ("Contacts:Spouse", "X-SPOUSE"), + ("Contacts:OfficeLocation", "X-OFFICE-LOCATION"), + ("Contacts:YomiCompanyName", "X-PHONETIC-ORG"), + ("Contacts:YomiFirstName", "X-PHONETIC-FIRST-NAME"), + ("Contacts:YomiLastName", "X-PHONETIC-LAST-NAME"), + ("Contacts2:CustomerId", "X-CUSTOMER-ID"), + ("Contacts2:GovernmentId", "X-GOVERNMENT-ID"), + ("Contacts2:ManagerName", "X-MANAGER"), + ("Contacts2:AccountName", "X-ACCOUNT-NAME"), + ("Contacts2:NickName", "NICKNAME"), + ] { + if let Some(v) = g(tag) { + card.add(Property::text(prop, &v)); + } + } + for t in [ + "Contacts2:IMAddress", + "Contacts2:IMAddress2", + "Contacts2:IMAddress3", + ] { + if let Some(v) = g(t) { + card.add(Property::text("IMPP", &v)); + } + } + card.props.extend(old_impp); + match app.child("Contacts:Picture") { + Some(p) => { + let data = p.text_value(); + if !data.is_empty() + && base64::engine::general_purpose::STANDARD + .decode(data.trim()) + .is_ok() + { + if v4 { + card.add(Property::new( + "PHOTO", + format!("data:image/jpeg;base64,{}", data.trim()), + )); + } else { + card.add( + Property::new("PHOTO", data.trim().to_string()) + .with_param("ENCODING", "b") + .with_param("TYPE", "JPEG"), + ); + } + } + } + None => { + if let Some(p) = old_photo { + card.add(p); + } + } + } + card.add(Property::new( + "REV", + Utc::now().format("%Y%m%dT%H%M%SZ").to_string(), + )); + // VERSION must come first + if let Some(pos) = card.props.iter().position(|p| p.name == "VERSION") { + let v = card.props.remove(pos); + card.props.insert(0, v); + } + Some(card.serialize()) +} + +/// Short summary for GAL / ResolveRecipients. +pub struct CardSummary { + pub display_name: String, + pub first: String, + pub last: String, + pub emails: Vec, + pub phone: String, + pub mobile: String, + pub company: String, + pub title: String, + pub office: String, +} + +pub fn summary(vcf: &str) -> Option { + let cards = ical::parse(vcf); + let c = cards.iter().find(|c| c.name == "VCARD")?; + let n = c + .prop("N") + .map(|n| ical::split_structured(&n.value)) + .unwrap_or_default(); + let tels: Vec<&Property> = c.props_named("TEL").collect(); + let (slots, _) = assign_tels(&tels); + let slot = |s: &str| { + slots + .iter() + .find(|(x, _)| *x == s) + .map(|(_, i)| tels[*i].text_value()) + .unwrap_or_default() + }; + Some(CardSummary { + display_name: c.text("FN").unwrap_or_default(), + first: n.get(1).cloned().unwrap_or_default(), + last: n.first().cloned().unwrap_or_default(), + emails: c.props_named("EMAIL").map(|e| e.text_value()).collect(), + phone: slot("Contacts:BusinessPhoneNumber"), + mobile: slot("Contacts:MobilePhoneNumber"), + company: c + .prop("ORG") + .map(|o| { + ical::split_structured(&o.value) + .first() + .cloned() + .unwrap_or_default() + }) + .unwrap_or_default(), + title: c.text("TITLE").unwrap_or_default(), + office: c.text("X-OFFICE-LOCATION").unwrap_or_default(), + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn roundtrip_lossless() { + let v = "BEGIN:VCARD\r\nVERSION:3.0\r\nUID:c1\r\nFN:Jan Kowalski\r\nN:Kowalski;Jan;;;\r\nEMAIL;TYPE=WORK:a@x.pl\r\nEMAIL:b@x.pl\r\nEMAIL:c@x.pl\r\nEMAIL:d@x.pl\r\nTEL;TYPE=CELL:+48600\r\nTEL;TYPE=WORK:+4822\r\nTEL;TYPE=X-WEIRD:999\r\nADR;TYPE=HOME:;;Polna 1;Warszawa;;00-001;PL\r\nBDAY:1985-05-12\r\nX-SOCIAL:keep\r\nEND:VCARD\r\n"; + let app = to_eas( + v, + &Options::default(), + 141, + chrono_tz::Europe::Warsaw, + 100000, + ) + .unwrap(); + assert_eq!( + app.child_text("Contacts:MobilePhoneNumber").unwrap(), + "+48600" + ); + assert_eq!( + app.child_text("Contacts:BusinessPhoneNumber").unwrap(), + "+4822" + ); + assert_eq!(app.child_text("Contacts:HomeCity").unwrap(), "Warszawa"); + assert_eq!( + app.child_text("Contacts:Birthday").unwrap(), + "1985-05-11T22:00:00.000Z" + ); + assert_eq!(app.child_text("Contacts:Email3Address").unwrap(), "c@x.pl"); + let back = from_eas(&app, Some(v), chrono_tz::Europe::Warsaw).unwrap(); + assert!(back.contains("d@x.pl"), "4th email kept"); + assert!(back.contains("X-WEIRD"), "unmapped phone kept"); + assert!(back.contains("X-SOCIAL:keep")); + assert!(back.contains("BDAY:1985-05-12")); + assert!(back.contains("UID:c1")); + assert!(back.starts_with("BEGIN:VCARD\r\nVERSION:3.0")); + } +} diff --git a/src/eas/convert/email.rs b/src/eas/convert/email.rs new file mode 100644 index 0000000..d534458 --- /dev/null +++ b/src/eas/convert/email.rs @@ -0,0 +1,580 @@ +//! RFC 5322 message -> EAS Email ApplicationData. + +use base64::Engine; +use mail_parser::{MessageParser, MimeHeaders, PartType}; + +use super::{body_element, legacy_trunc_size, BodyPref, Options, BODY_HTML, BODY_MIME, BODY_TEXT}; +use crate::backend::ical; +use crate::backend::imap::FetchedMessage; +use crate::backend::tz; +use crate::util::{html_to_text, text_to_html, truncate_bytes}; +use crate::wbxml::Element; + +pub struct MailContext<'a> { + pub collection: &'a str, + pub ver: u32, + pub opts: &'a Options, + pub default_tz: chrono_tz::Tz, +} + +fn fmt_addr(name: Option<&str>, addr: Option<&str>) -> String { + match (name.map(str::trim).filter(|n| !n.is_empty()), addr) { + (Some(n), Some(a)) => format!("\"{}\" <{}>", n.replace('"', "'"), a), + (None, Some(a)) => a.to_string(), + (Some(n), None) => n.to_string(), + _ => String::new(), + } +} + +fn addr_list(a: Option<&mail_parser::Address>) -> Option { + let a = a?; + let v: Vec = a + .iter() + .map(|x| fmt_addr(x.name(), x.address())) + .filter(|s| !s.is_empty()) + .collect(); + (!v.is_empty()).then(|| v.join(", ")) +} + +fn display_names(a: Option<&mail_parser::Address>) -> Option { + let a = a?; + let v: Vec = a + .iter() + .map(|x| x.name().or(x.address()).unwrap_or("").to_string()) + .filter(|s| !s.is_empty()) + .collect(); + (!v.is_empty()).then(|| v.join("; ")) +} + +pub fn file_reference(collection: &str, uid: u32, idx: usize) -> String { + format!("{collection}:{uid}:{idx}") +} + +pub fn parse_file_reference(r: &str) -> Option<(String, u32, usize)> { + let mut it = r.rsplitn(3, ':'); + let idx = it.next()?.parse().ok()?; + let uid = it.next()?.parse().ok()?; + let col = it.next()?.to_string(); + Some((col, uid, idx)) +} + +/// Outlook compatible GlobalObjId wrapping an iCalendar UID. +pub fn global_obj_id(uid: &str) -> String { + let mut v = + hex::decode("040000008200E00074C5B7101A82E0080000000000000000000000000000000000000000") + .unwrap(); + if uid.len() <= 64 { + v.extend_from_slice(&((13 + uid.len()) as u32).to_le_bytes()); + v.extend_from_slice(b"vCal-Uid"); + v.extend_from_slice(&1u32.to_le_bytes()); + v.extend_from_slice(uid.as_bytes()); + v.push(0); + } else if let Ok(b) = hex::decode(uid) { + v = b; + } + base64::engine::general_purpose::STANDARD.encode(v) +} + +pub fn uid_from_global_obj_id(b64: &str) -> Option { + let b = base64::engine::general_purpose::STANDARD + .decode(b64.trim()) + .ok()?; + let pos = b + .windows(8) + .position(|w| w.eq_ignore_ascii_case(b"vCal-Uid"))?; + if pos < 4 { + return None; + } + let len = u32::from_le_bytes([b[pos - 4], b[pos - 3], b[pos - 2], b[pos - 1]]) as usize; + let start = pos + 12; + let end = (start + len.saturating_sub(13)).min(b.len()); + Some(String::from_utf8_lossy(&b[start..end]).into_owned()) +} + +fn conversation_id(subject: &str) -> Vec { + let s = subject.trim(); + let mut t = s; + loop { + let l = t.to_ascii_lowercase(); + let stripped = [ + "re:", "fw:", "fwd:", "aw:", "odp:", "pd:", "wg:", "sv:", "tr:", + ] + .iter() + .find(|p| l.starts_with(*p)) + .map(|p| t[p.len()..].trim_start()); + match stripped { + Some(n) => t = n, + None => break, + } + } + use md5::{Digest, Md5}; + Md5::digest(t.to_lowercase().as_bytes()).to_vec() +} + +pub struct Converted { + pub app: Element, + pub size: usize, +} + +/// Convert a fetched message to ApplicationData. +pub fn to_eas(m: &FetchedMessage, ctx: &MailContext) -> Converted { + let parser = MessageParser::default(); + let msg = parser.parse(&m.body); + let mut app = Element::new("AirSync:ApplicationData"); + let ver = ctx.ver; + let Some(msg) = msg else { + app.push_text("Email:Subject", "(unparseable message)"); + app.push_text("Email:Read", "0"); + app.push_text("Email:MessageClass", "IPM.Note"); + return Converted { + app, + size: m.body.len(), + }; + }; + + let subject = msg.subject().unwrap_or("").to_string(); + app.push_opt("Email:To", addr_list(msg.to())); + app.push_opt("Email:Cc", addr_list(msg.cc())); + app.push_opt("Email:From", addr_list(msg.from())); + app.push_text("Email:Subject", subject.clone()); + app.push_opt("Email:ReplyTo", addr_list(msg.reply_to())); + let date = m + .internal_date + .or_else(|| { + msg.date() + .and_then(|d| chrono::DateTime::from_timestamp(d.to_timestamp(), 0)) + }) + .unwrap_or_else(chrono::Utc::now); + app.push_text("Email:DateReceived", tz::fmt_iso(&date)); + app.push_opt("Email:DisplayTo", display_names(msg.to())); + app.push_text("Email:ThreadTopic", subject.clone()); + let importance = { + let xp = msg + .header_raw("X-Priority") + .unwrap_or("") + .trim() + .to_string(); + let imp = msg + .header_raw("Importance") + .unwrap_or("") + .trim() + .to_ascii_lowercase(); + if xp.starts_with('1') || xp.starts_with('2') || imp == "high" { + 2 + } else if xp.starts_with('4') || xp.starts_with('5') || imp == "low" { + 0 + } else { + 1 + } + }; + app.push_text("Email:Importance", importance.to_string()); + let read = m.flags.iter().any(|f| f.eq_ignore_ascii_case("\\Seen")); + app.push_text("Email:Read", if read { "1" } else { "0" }); + + // ---- attachments + let mut atts = Vec::new(); + for (idx, part) in msg.attachments().enumerate() { + let name = part + .attachment_name() + .map(|s| s.to_string()) + .unwrap_or_else(|| { + let ct = part.content_type(); + let ext = match ct.and_then(|c| c.subtype()).unwrap_or("bin") { + "calendar" => "ics", + "rfc822" => "eml", + s => s, + }; + format!("attachment{}.{}", idx + 1, ext) + }); + let size = part.contents().len(); + let cid = part + .content_id() + .map(|c| c.trim_matches(['<', '>']).to_string()); + let inline = part + .content_disposition() + .map(|d| d.ctype().eq_ignore_ascii_case("inline")) + .unwrap_or(false) + && cid.is_some(); + atts.push((idx, name, size, cid, inline, part.is_message())); + } + if !atts.is_empty() { + if ver >= 120 { + let mut a = Element::new("AirSyncBase:Attachments"); + for (idx, name, size, cid, inline, is_msg) in &atts { + let mut e = Element::new("AirSyncBase:Attachment") + .with_text("AirSyncBase:DisplayName", name.clone()) + .with_text( + "AirSyncBase:FileReference", + file_reference(ctx.collection, m.uid, *idx), + ) + .with_text("AirSyncBase:Method", if *is_msg { "5" } else { "1" }) + .with_text("AirSyncBase:EstimatedDataSize", size.to_string()); + if let Some(c) = cid { + e.push_text("AirSyncBase:ContentId", c.clone()); + } + if *inline { + e.push_text("AirSyncBase:IsInline", "1"); + } + a.push(e); + } + app.push(a); + } else { + let mut a = Element::new("Email:Attachments"); + for (idx, name, size, _, _, _) in &atts { + a.push( + Element::new("Email:Attachment") + .with_text("Email:AttMethod", "1") + .with_text("Email:AttSize", size.to_string()) + .with_text("Email:DisplayName", name.clone()) + .with_text("Email:AttName", file_reference(ctx.collection, m.uid, *idx)), + ); + } + app.push(a); + } + } + + // ---- body + let html = msg + .body_html(0) + .map(|s| s.into_owned()) + .filter(|_| msg.html_body_count() > 0 && has_real_html(&msg)); + let text = msg.body_text(0).map(|s| s.into_owned()); + let plain = text + .clone() + .unwrap_or_else(|| html.as_deref().map(html_to_text).unwrap_or_default()); + let ctype = msg + .content_type() + .map(|c| format!("{}/{}", c.ctype(), c.subtype().unwrap_or("")).to_ascii_lowercase()) + .unwrap_or_default(); + let is_smime = ctype.contains("signed") || ctype.contains("pkcs7"); + let native = if html.is_some() { BODY_HTML } else { BODY_TEXT }; + let opts = ctx.opts; + if ver >= 120 { + let want_mime = opts.wants(BODY_MIME).is_some() + && (opts.mime_support == 2 || (opts.mime_support == 1 && is_smime)); + let (typ, data): (u8, String) = if want_mime { + (BODY_MIME, String::from_utf8_lossy(&m.body).into_owned()) + } else if opts.wants(BODY_HTML).is_some() + && (html.is_some() || opts.wants(BODY_TEXT).is_none()) + { + ( + BODY_HTML, + html.clone().unwrap_or_else(|| text_to_html(&plain)), + ) + } else { + (BODY_TEXT, plain.replace("\r\n", "\n").replace('\n', "\r\n")) + }; + let pref = opts.wants(typ).cloned().unwrap_or(BodyPref { + typ, + ..Default::default() + }); + app.push(body_element(typ, &data, &pref, Some(&plain))); + } else { + // AS 2.5 + if opts.mime_support == 2 || (opts.mime_support == 1 && is_smime) { + let raw = String::from_utf8_lossy(&m.body).into_owned(); + let limit = opts.mime_trunc.and_then(legacy_trunc_size); + let t = limit.map(|l| l < raw.len()).unwrap_or(false); + app.push_text("Email:MIMETruncated", if t { "1" } else { "0" }); + app.push_text("Email:MIMESize", raw.len().to_string()); + app.push_text( + "Email:MIMEData", + truncate_bytes(&raw, limit.unwrap_or(usize::MAX)), + ); + } else { + let limit = opts.legacy_trunc.and_then(legacy_trunc_size); + let t = limit.map(|l| l < plain.len()).unwrap_or(false); + app.push_text("Email:BodyTruncated", if t { "1" } else { "0" }); + app.push_text( + "Email:Body", + truncate_bytes(&plain, limit.unwrap_or(usize::MAX)), + ); + } + } + + // ---- class / meeting + let mut class = if is_smime { + if ctype.contains("signed") { + "IPM.Note.SMIME.MultipartSigned" + } else { + "IPM.Note.SMIME" + } + .to_string() + } else { + "IPM.Note".to_string() + }; + let mut meeting: Option = None; + if let Some(ics) = find_calendar_part(&msg) { + if let Some((cls, mr)) = meeting_request(&ics, ctx.default_tz) { + class = cls; + meeting = mr; + } + } + app.push_text("Email:MessageClass", class); + if let Some(mr) = meeting { + app.push(mr); + } + app.push_text("Email:InternetCPID", "65001"); + if ver >= 120 { + let flagged = m.flags.iter().any(|f| f.eq_ignore_ascii_case("\\Flagged")); + if flagged { + app.push( + Element::new("Email:Flag") + .with_text("Email:FlagStatus", "2") + .with_text("Email:FlagType", "Flag for follow up"), + ); + } else { + app.push(Element::new("Email:Flag")); + } + app.push_text("Email:ContentClass", "urn:content-classes:message"); + app.push_text("AirSyncBase:NativeBodyType", native.to_string()); + } + if ver >= 140 { + app.push(Element::opaque( + "Email2:ConversationId", + conversation_id(&subject), + )); + let mut idx = Vec::with_capacity(5); + idx.push(0x01); + idx.extend_from_slice(&(date.timestamp() as u32).to_be_bytes()); + app.push(Element::opaque("Email2:ConversationIndex", idx)); + let answered = m.flags.iter().any(|f| f.eq_ignore_ascii_case("\\Answered")); + let forwarded = m + .flags + .iter() + .any(|f| f.eq_ignore_ascii_case("$Forwarded") || f.eq_ignore_ascii_case("Forwarded")); + if answered || forwarded { + app.push_text("Email2:LastVerbExecuted", if forwarded { "3" } else { "1" }); + app.push_text("Email2:LastVerbExecutionTime", tz::fmt_iso(&date)); + } + } + Converted { + app, + size: m.body.len(), + } +} + +/// Changes-only payload (flags) for Sync Change commands. +pub fn flags_change(flags: &[String], ver: u32) -> Element { + let mut app = Element::new("AirSync:ApplicationData"); + let read = flags.iter().any(|f| f.eq_ignore_ascii_case("\\Seen")); + app.push_text("Email:Read", if read { "1" } else { "0" }); + if ver >= 120 { + if flags.iter().any(|f| f.eq_ignore_ascii_case("\\Flagged")) { + app.push( + Element::new("Email:Flag") + .with_text("Email:FlagStatus", "2") + .with_text("Email:FlagType", "Flag for follow up"), + ); + } else { + app.push(Element::new("Email:Flag")); + } + } + app +} + +pub fn flags_from_fingerprint(fp: &str) -> Vec { + let mut v = Vec::new(); + for c in fp.chars() { + match c { + 'S' => v.push("\\Seen".to_string()), + 'F' => v.push("\\Flagged".to_string()), + 'A' => v.push("\\Answered".to_string()), + 'W' => v.push("$Forwarded".to_string()), + _ => {} + } + } + v +} + +fn has_real_html(msg: &mail_parser::Message) -> bool { + msg.html_bodies() + .any(|p| matches!(p.body, PartType::Html(_))) +} + +fn find_calendar_part(msg: &mail_parser::Message) -> Option { + for part in msg.parts.iter() { + let ct = part.content_type(); + let is_cal = ct + .map(|c| { + c.ctype().eq_ignore_ascii_case("text") + && c.subtype() + .map(|s| s.eq_ignore_ascii_case("calendar")) + .unwrap_or(false) + }) + .unwrap_or(false); + if is_cal { + if let Some(t) = part.text_contents() { + return Some(t.to_string()); + } + return Some(String::from_utf8_lossy(part.contents()).into_owned()); + } + } + None +} + +/// Build Email:MeetingRequest from an iMIP calendar part. +fn meeting_request(ics: &str, default_tz: chrono_tz::Tz) -> Option<(String, Option)> { + let cals = ical::parse(ics); + let cal = cals.first()?; + let method = cal.text("METHOD").unwrap_or_default().to_ascii_uppercase(); + let ev = cal.child("VEVENT")?; + let class = match method.as_str() { + "REQUEST" => "IPM.Schedule.Meeting.Request", + "CANCEL" => "IPM.Schedule.Meeting.Canceled", + "REPLY" => { + let st = ev + .prop("ATTENDEE") + .and_then(|a| a.param("PARTSTAT")) + .unwrap_or("") + .to_ascii_uppercase(); + match st.as_str() { + "ACCEPTED" => "IPM.Schedule.Meeting.Resp.Pos", + "TENTATIVE" => "IPM.Schedule.Meeting.Resp.Tent", + "DECLINED" => "IPM.Schedule.Meeting.Resp.Neg", + _ => "IPM.Note", + } + } + _ => return None, + }; + if !(method == "REQUEST" || method == "CANCEL") { + return Some((class.to_string(), None)); + } + let start = ev + .prop("DTSTART") + .and_then(|p| tz::parse_ical_time(p, default_tz))?; + let end = ev + .prop("DTEND") + .and_then(|p| tz::parse_ical_time(p, default_tz)) + .map(|t| t.utc) + .unwrap_or(start.utc + chrono::Duration::hours(1)); + let mut mr = Element::new("Email:MeetingRequest"); + mr.push_text("Email:AllDayEvent", if start.all_day { "1" } else { "0" }); + mr.push_text("Email:StartTime", tz::fmt_iso(&start.utc)); + let stamp = ev + .prop("DTSTAMP") + .and_then(|p| tz::parse_ical_time(p, default_tz)) + .map(|t| t.utc) + .unwrap_or_else(chrono::Utc::now); + mr.push_text("Email:DtStamp", tz::fmt_iso(&stamp)); + mr.push_text("Email:EndTime", tz::fmt_iso(&end)); + mr.push_text( + "Email:InstanceType", + if ev.prop("RRULE").is_some() { "1" } else { "0" }, + ); + mr.push_opt("Email:Location", ev.text("LOCATION")); + if let Some(o) = ev.prop("ORGANIZER") { + let addr = o + .value + .trim_start_matches("mailto:") + .trim_start_matches("MAILTO:") + .to_string(); + mr.push_text("Email:Organizer", fmt_addr(o.param("CN"), Some(&addr))); + } + if ev.child("VALARM").is_some() { + mr.push_text("Email:Reminder", "15"); + } + mr.push_text("Email:ResponseRequested", "1"); + let sens = match ev + .text("CLASS") + .unwrap_or_default() + .to_ascii_uppercase() + .as_str() + { + "PRIVATE" => "2", + "CONFIDENTIAL" => "3", + _ => "0", + }; + mr.push_text("Email:Sensitivity", sens); + mr.push_text("Email:BusyStatus", "2"); + let tzone = start.tz.unwrap_or(default_tz); + mr.push_text( + "Email:TimeZone", + tz::blob_for(&tzone, chrono::Datelike::year(&start.utc)), + ); + if let Some(uid) = ev.text("UID") { + mr.push_text("Email:GlobalObjId", global_obj_id(&uid)); + } + mr.push_text("Email2:MeetingMessageType", "1"); + Some((class.to_string(), Some(mr))) +} + +/// Raw bytes of one attachment by index (as numbered in `to_eas`). +pub fn attachment(raw: &[u8], idx: usize) -> Option<(String, String, Vec)> { + let msg = MessageParser::default().parse(raw)?; + let part = msg.attachments().nth(idx)?; + let ct = part + .content_type() + .map(|c| format!("{}/{}", c.ctype(), c.subtype().unwrap_or("octet-stream"))) + .unwrap_or_else(|| "application/octet-stream".into()); + let name = part.attachment_name().unwrap_or("attachment").to_string(); + let data = if part.is_message() { + // keep the embedded message raw + raw.get(part.raw_body_offset() as usize..part.raw_end_offset() as usize) + .map(|s| s.to_vec()) + .unwrap_or_else(|| part.contents().to_vec()) + } else { + part.contents().to_vec() + }; + Some((name, ct, data)) +} + +/// Calendar part of a message (for MeetingResponse). +pub fn calendar_of(raw: &[u8]) -> Option { + let msg = MessageParser::default().parse(raw)?; + find_calendar_part(&msg) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn goid_roundtrip() { + let g = global_obj_id("abc-123@example.com"); + assert_eq!(uid_from_global_obj_id(&g).unwrap(), "abc-123@example.com"); + } + + #[test] + fn convert_simple() { + let raw = "From: Jan \r\nTo: Anna \r\nSubject: =?utf-8?q?Za=C5=BC=C3=B3=C5=82=C4=87?=\r\nDate: Thu, 05 Nov 2026 10:00:00 +0100\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nTreść wiadomości\r\n".as_bytes().to_vec(); + let m = FetchedMessage { + uid: 7, + flags: vec!["\\Seen".into()], + internal_date: None, + body: raw, + size: 0, + }; + let opts = Options { + prefs: vec![BodyPref { + typ: 1, + trunc: Some(5), + ..Default::default() + }], + ..Default::default() + }; + let c = to_eas( + &m, + &MailContext { + collection: "3", + ver: 141, + opts: &opts, + default_tz: chrono_tz::UTC, + }, + ); + assert_eq!(c.app.child_text("Email:Subject").unwrap(), "Zażółć"); + assert_eq!(c.app.child_text("Email:Read").unwrap(), "1"); + let body = c.app.child("AirSyncBase:Body").unwrap(); + assert_eq!(body.child_text("AirSyncBase:Truncated").unwrap(), "1"); + assert_eq!(body.child_text("AirSyncBase:Data").unwrap(), "Treś"); + assert!(c.app.child_text("Email:From").unwrap().contains("jan@x.pl")); + } + + #[test] + fn fileref() { + assert_eq!( + parse_file_reference("12:345:2"), + Some(("12".into(), 345, 2)) + ); + } +} diff --git a/src/eas/convert/mod.rs b/src/eas/convert/mod.rs new file mode 100644 index 0000000..a976ff7 --- /dev/null +++ b/src/eas/convert/mod.rs @@ -0,0 +1,169 @@ +//! Conversions between backend formats (RFC 5322, iCalendar, vCard) and EAS ApplicationData. + +pub mod calendar; +pub mod contact; +pub mod email; +pub mod task; + +use crate::util::{html_to_text, text_to_html, truncate_bytes}; +use crate::wbxml::Element; + +pub const BODY_TEXT: u8 = 1; +pub const BODY_HTML: u8 = 2; +pub const BODY_RTF: u8 = 3; +pub const BODY_MIME: u8 = 4; + +#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)] +pub struct BodyPref { + pub typ: u8, + pub trunc: Option, + pub all_or_none: bool, + pub preview: Option, +} + +/// Options of a collection (or ItemOperations/Search fetch). +#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)] +pub struct Options { + pub prefs: Vec, + pub mime_support: u8, + /// AS 2.5 Truncation code (0..9) + pub legacy_trunc: Option, + pub mime_trunc: Option, + pub filter_type: u8, + pub conflict: Option, + pub max_items: Option, +} + +impl Options { + pub fn parse(opts: &Element) -> Options { + let mut o = Options::default(); + for bp in opts.children_named("AirSyncBase:BodyPreference") { + o.prefs.push(BodyPref { + typ: bp.child_u32("AirSyncBase:Type").unwrap_or(1) as u8, + trunc: bp.child_u32("AirSyncBase:TruncationSize"), + all_or_none: bp.child_u32("AirSyncBase:AllOrNone").unwrap_or(0) == 1, + preview: bp.child_u32("AirSyncBase:Preview"), + }); + } + o.mime_support = opts.child_u32("AirSync:MIMESupport").unwrap_or(0) as u8; + o.legacy_trunc = opts.child_u32("AirSync:Truncation").map(|v| v as u8); + o.mime_trunc = opts.child_u32("AirSync:MIMETruncation").map(|v| v as u8); + o.filter_type = opts.child_u32("AirSync:FilterType").unwrap_or(0) as u8; + o.conflict = opts.child_u32("AirSync:Conflict").map(|v| v as u8); + o.max_items = opts.child_u32("AirSync:MaxItems"); + o + } + + pub fn wants(&self, t: u8) -> Option<&BodyPref> { + self.prefs.iter().find(|p| p.typ == t) + } +} + +/// AS 2.5 truncation codes to byte sizes. +pub fn legacy_trunc_size(code: u8) -> Option { + match code { + 0 => Some(0), + 1 => Some(4096), + 2 => Some(5120), + 3 => Some(7168), + 4 => Some(10240), + 5 => Some(20480), + 6 => Some(51200), + 7 => Some(102400), + _ => None, + } +} + +/// Build an AirSyncBase:Body element for PIM items (calendar/contacts/tasks), which store +/// plain text natively. +pub fn pim_body(text: &str, opts: &Options, ver: u32) -> Option { + if ver < 120 { + return None; + } + let want_html = opts.wants(BODY_HTML).is_some() && opts.wants(BODY_TEXT).is_none(); + let pref = opts + .wants(if want_html { BODY_HTML } else { BODY_TEXT }) + .cloned() + .unwrap_or(BodyPref { + typ: BODY_TEXT, + ..Default::default() + }); + let data = if pref.typ == BODY_HTML { + text_to_html(text) + } else { + text.replace("\r\n", "\n").replace('\n', "\r\n") + }; + Some(body_element(pref.typ, &data, &pref, Some(text))) +} + +/// Create AirSyncBase:Body with truncation / preview handling. +pub fn body_element( + typ: u8, + data: &str, + pref: &BodyPref, + plain_for_preview: Option<&str>, +) -> Element { + let full = data.len(); + let mut body = Element::new("AirSyncBase:Body").with_text("AirSyncBase:Type", typ.to_string()); + let truncated = pref.trunc.map(|t| (t as usize) < full).unwrap_or(false); + body.push_text("AirSyncBase:EstimatedDataSize", full.to_string()); + if truncated { + body.push_text("AirSyncBase:Truncated", "1"); + if !pref.all_or_none { + let t = pref.trunc.unwrap_or(0) as usize; + body.push_text("AirSyncBase:Data", truncate_bytes(data, t)); + } + } else if full > 0 { + body.push_text("AirSyncBase:Data", data); + } + if let Some(p) = pref.preview.filter(|p| *p > 0) { + let src = plain_for_preview.map(|s| s.to_string()).unwrap_or_else(|| { + if typ == BODY_HTML { + html_to_text(data) + } else { + data.to_string() + } + }); + let flat: String = src.split_whitespace().collect::>().join(" "); + body.push_text( + "AirSyncBase:Preview", + truncate_bytes(&flat, p.min(255) as usize), + ); + } + body +} + +/// Extract plain text from a client supplied body (AirSyncBase:Body or legacy fields). +pub fn incoming_body(app: &Element, legacy_ns: &str) -> Option { + if let Some(b) = app.child("AirSyncBase:Body") { + let typ = b.child_u32("AirSyncBase:Type").unwrap_or(1); + let data = b.child_text("AirSyncBase:Data")?; + return Some(if typ == 2_u32 { + html_to_text(&data) + } else { + data.replace("\r\n", "\n") + }); + } + app.child_text(&format!("{legacy_ns}:Body")) + .map(|s| s.replace("\r\n", "\n")) +} + +pub fn categories(app: &Element, ns: &str) -> Option> { + app.child(&format!("{ns}:Categories")).map(|c| { + c.children_named(&format!("{ns}:Category")) + .map(|x| x.text_value()) + .filter(|s| !s.is_empty()) + .collect() + }) +} + +pub fn categories_element(ns: &str, cats: &[String]) -> Option { + if cats.is_empty() { + return None; + } + let mut c = Element::new(&format!("{ns}:Categories")); + for x in cats { + c.push_text(&format!("{ns}:Category"), x.clone()); + } + Some(c) +} diff --git a/src/eas/convert/task.rs b/src/eas/convert/task.rs new file mode 100644 index 0000000..806fee0 --- /dev/null +++ b/src/eas/convert/task.rs @@ -0,0 +1,299 @@ +//! iCalendar VTODO <-> EAS Tasks. + +use chrono::{DateTime, NaiveDateTime, TimeZone, Utc}; +use chrono_tz::Tz; + +use super::calendar::{eas_to_rrule, masters_and_overrides, rrule_to_eas}; +use super::{categories, categories_element, incoming_body, pim_body, Options}; +use crate::backend::ical::{self, Component, Property}; +use crate::backend::tz; +use crate::wbxml::Element; + +/// "Local" EAS task dates are local wall-clock times written with a Z suffix. +fn local_as_utc(d: &DateTime, tzone: &Tz) -> String { + tz::fmt_iso(&Utc.from_utc_datetime(&d.with_timezone(tzone).naive_local())) +} + +fn utc_from_local_field(s: &str, tzone: &Tz) -> Option> { + let fake = tz::parse_eas_date(s)?; + let n: NaiveDateTime = fake.naive_utc(); + tzone + .from_local_datetime(&n) + .earliest() + .map(|x| x.with_timezone(&Utc)) +} + +pub fn to_eas(ics: &str, opts: &Options, ver: u32, dtz: Tz) -> Option { + let cals = ical::parse(ics); + let cal = cals.iter().find(|c| c.name == "VCALENDAR")?; + let (master, _) = masters_and_overrides(cal, "VTODO"); + let t = master?; + let mut app = Element::new("AirSync:ApplicationData"); + let desc = t.text("DESCRIPTION").unwrap_or_default(); + if let Some(b) = pim_body(&desc, opts, ver) { + app.push(b); + } else if ver < 120 && !desc.is_empty() { + app.push_text("Tasks:Body", desc.clone()); + } + let cats: Vec = t + .props_named("CATEGORIES") + .flat_map(|p| ical::split_list(&p.value)) + .collect(); + if let Some(c) = categories_element("Tasks", &cats) { + app.push(c); + } + let completed = t + .text("STATUS") + .map(|s| s.eq_ignore_ascii_case("COMPLETED")) + .unwrap_or(false) + || t.prop("COMPLETED").is_some(); + app.push_text("Tasks:Complete", if completed { "1" } else { "0" }); + if completed { + let c = t + .prop("COMPLETED") + .and_then(|p| tz::parse_ical_time(p, dtz)) + .map(|x| x.utc) + .unwrap_or_else(Utc::now); + app.push_text("Tasks:DateCompleted", tz::fmt_iso(&c)); + } + let due = t.prop("DUE").and_then(|p| tz::parse_ical_time(p, dtz)); + if let Some(d) = &due { + app.push_text("Tasks:DueDate", local_as_utc(&d.utc, &d.tz.unwrap_or(dtz))); + app.push_text("Tasks:UtcDueDate", tz::fmt_iso(&d.utc)); + } + let prio: u32 = t.text("PRIORITY").and_then(|p| p.parse().ok()).unwrap_or(0); + let imp = match prio { + 1..=4 => 2, + 6..=9 => 0, + _ => 1, + }; + app.push_text("Tasks:Importance", imp.to_string()); + let start = t.prop("DTSTART").and_then(|p| tz::parse_ical_time(p, dtz)); + if let (Some(rr), Some(s)) = (t.prop("RRULE"), &start) { + if let Some(mut rec) = + rrule_to_eas(&rr.value, &s.utc, &s.tz.unwrap_or(dtz), "Tasks", s.all_day) + { + rec.push_text("Tasks:Start", local_as_utc(&s.utc, &s.tz.unwrap_or(dtz))); + app.push(rec); + } + } + // reminder + let mut reminder: Option> = None; + if let Some(a) = t.child("VALARM") { + if let Some(tr) = a.prop("TRIGGER") { + if tr + .param("VALUE") + .map(|v| v.eq_ignore_ascii_case("DATE-TIME")) + .unwrap_or(false) + || tr.value.ends_with('Z') + { + reminder = tz::parse_eas_date(&tr.value); + } else if let Some(m) = super::calendar::reminder_minutes(&t) { + let base = if tr + .param("RELATED") + .map(|r| r.eq_ignore_ascii_case("END")) + .unwrap_or(false) + { + due.as_ref().map(|d| d.utc) + } else { + start + .as_ref() + .map(|s| s.utc) + .or(due.as_ref().map(|d| d.utc)) + }; + reminder = base.map(|b| b - chrono::Duration::minutes(m)); + } + } + } + app.push_text( + "Tasks:ReminderSet", + if reminder.is_some() { "1" } else { "0" }, + ); + if let Some(r) = reminder { + app.push_text("Tasks:ReminderTime", tz::fmt_iso(&r)); + } + let sens = match t + .text("CLASS") + .unwrap_or_default() + .to_ascii_uppercase() + .as_str() + { + "PRIVATE" => "2", + "CONFIDENTIAL" => "3", + _ => "0", + }; + app.push_text("Tasks:Sensitivity", sens); + if let Some(s) = &start { + app.push_text( + "Tasks:StartDate", + local_as_utc(&s.utc, &s.tz.unwrap_or(dtz)), + ); + app.push_text("Tasks:UtcStartDate", tz::fmt_iso(&s.utc)); + } + app.push_text("Tasks:Subject", t.text("SUMMARY").unwrap_or_default()); + Some(app) +} + +const MANAGED: &[&str] = &[ + "SUMMARY", + "DESCRIPTION", + "STATUS", + "COMPLETED", + "PERCENT-COMPLETE", + "DUE", + "DTSTART", + "PRIORITY", + "CLASS", + "CATEGORIES", + "RRULE", + "DTSTAMP", + "LAST-MODIFIED", + "UID", +]; + +pub fn from_eas(app: &Element, existing: Option<&str>, dtz: Tz) -> Option { + let mut cal = existing + .and_then(|e| ical::parse(e).into_iter().find(|c| c.name == "VCALENDAR")) + .unwrap_or_else(|| { + let mut c = Component::new("VCALENDAR"); + c.add(Property::new("VERSION", "2.0")); + c.add(Property::new("PRODID", "-//ActivePush//ActiveSync//EN")); + c + }); + let (old, _) = masters_and_overrides(&cal, "VTODO"); + let mut t = old.clone().unwrap_or_else(|| Component::new("VTODO")); + let uid = old + .as_ref() + .and_then(|o| o.text("UID")) + .unwrap_or_else(|| uuid::Uuid::new_v4().to_string()); + t.props + .retain(|p| !MANAGED.iter().any(|m| p.name.eq_ignore_ascii_case(m))); + t.props.insert(0, Property::text("UID", &uid)); + t.add(tz::ical_utc("DTSTAMP", &Utc::now())); + t.add(tz::ical_utc("LAST-MODIFIED", &Utc::now())); + if let Some(s) = app.child_text("Tasks:Subject") { + t.add(Property::text("SUMMARY", &s)); + } + if let Some(b) = incoming_body(app, "Tasks").filter(|b| !b.trim().is_empty()) { + t.add(Property::text("DESCRIPTION", &b)); + } else if !app.has("AirSyncBase:Body") { + if let Some(d) = old.as_ref().and_then(|o| o.prop("DESCRIPTION")) { + t.add(d.clone()); + } + } + let complete = app.child_u32("Tasks:Complete").unwrap_or(0) == 1; + if complete { + t.add(Property::new("STATUS", "COMPLETED")); + t.add(Property::new("PERCENT-COMPLETE", "100")); + let c = app + .child_text("Tasks:DateCompleted") + .and_then(|s| tz::parse_eas_date(&s)) + .unwrap_or_else(Utc::now); + t.add(tz::ical_utc("COMPLETED", &c)); + } else { + t.add(Property::new("STATUS", "NEEDS-ACTION")); + } + let due = app + .child_text("Tasks:UtcDueDate") + .and_then(|s| tz::parse_eas_date(&s)) + .or_else(|| { + app.child_text("Tasks:DueDate") + .and_then(|s| utc_from_local_field(&s, &dtz)) + }); + if let Some(d) = due { + t.add(tz::ical_utc("DUE", &d)); + } + let start = app + .child_text("Tasks:UtcStartDate") + .and_then(|s| tz::parse_eas_date(&s)) + .or_else(|| { + app.child_text("Tasks:StartDate") + .and_then(|s| utc_from_local_field(&s, &dtz)) + }); + if let Some(s) = start { + t.add(tz::ical_utc("DTSTART", &s)); + } + let prio = match app.child_u32("Tasks:Importance").unwrap_or(1) { + 2 => "1", + 0 => "9", + _ => "5", + }; + t.add(Property::new("PRIORITY", prio)); + if let Some(s) = app.child_text("Tasks:Sensitivity") { + t.add(Property::new( + "CLASS", + match s.as_str() { + "2" => "PRIVATE", + "3" => "CONFIDENTIAL", + _ => "PUBLIC", + }, + )); + } + if let Some(cats) = categories(app, "Tasks").filter(|c| !c.is_empty()) { + t.add(Property::new( + "CATEGORIES", + cats.iter() + .map(|c| ical::escape_text(c)) + .collect::>() + .join(","), + )); + } + if let Some(rec) = app.child("Tasks:Recurrence") { + if let Some(rr) = eas_to_rrule(rec, "Tasks", false, &dtz) { + t.add(Property::new("RRULE", rr)); + if start.is_none() { + if let Some(s) = rec + .child_text("Tasks:Start") + .and_then(|s| utc_from_local_field(&s, &dtz)) + { + t.add(tz::ical_utc("DTSTART", &s)); + } + } + } + } + t.children.retain(|c| c.name != "VALARM"); + if app.child_u32("Tasks:ReminderSet").unwrap_or(0) == 1 { + if let Some(r) = app + .child_text("Tasks:ReminderTime") + .and_then(|s| tz::parse_eas_date(&s)) + { + let mut a = Component::new("VALARM"); + a.add(Property::new("ACTION", "DISPLAY")); + a.add(Property::text( + "DESCRIPTION", + &t.text("SUMMARY").unwrap_or_else(|| "Reminder".into()), + )); + a.add(tz::ical_utc("TRIGGER", &r).with_param("VALUE", "DATE-TIME")); + t.children.push(a); + } + } + cal.children.retain(|c| c.name != "VTODO"); + cal.children.push(t); + Some(cal.serialize()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn roundtrip() { + let ics = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nBEGIN:VTODO\r\nUID:t1\r\nSUMMARY:Kup mleko\r\nDUE:20261106T120000Z\r\nPRIORITY:1\r\nEND:VTODO\r\nEND:VCALENDAR\r\n"; + let app = to_eas(ics, &Options::default(), 141, chrono_tz::Europe::Warsaw).unwrap(); + assert_eq!( + app.child_text("Tasks:UtcDueDate").unwrap(), + "2026-11-06T12:00:00.000Z" + ); + assert_eq!( + app.child_text("Tasks:DueDate").unwrap(), + "2026-11-06T13:00:00.000Z" + ); + assert_eq!(app.child_text("Tasks:Importance").unwrap(), "2"); + let mut app2 = app.clone(); + app2.children.retain(|c| !c.is("Tasks:Complete")); + app2.push_text("Tasks:Complete", "1"); + let back = from_eas(&app2, Some(ics), chrono_tz::Europe::Warsaw).unwrap(); + assert!(back.contains("STATUS:COMPLETED")); + assert!(back.contains("UID:t1")); + } +} diff --git a/src/eas/folders.rs b/src/eas/folders.rs new file mode 100644 index 0000000..d22ff8a --- /dev/null +++ b/src/eas/folders.rs @@ -0,0 +1,340 @@ +//! FolderSync, FolderCreate, FolderUpdate, FolderDelete, GetHierarchy. + +use std::collections::BTreeMap; + +use anyhow::Result; +use sqlx::Row; + +use super::state::{self, HierarchyState, SyncKey, HIERARCHY}; +use super::{Ctx, Reply}; +use crate::backend::BFolder; +use crate::db; +use crate::wbxml::Element; + +pub async fn short_id(ctx: &Ctx, backend_id: &str) -> Result { + Ok(db::folder_short_id(&ctx.app.db, ctx.user(), backend_id) + .await? + .to_string()) +} + +/// Resolve a device-visible folder id to the backend folder. +pub async fn resolve(ctx: &mut Ctx, short: &str) -> Result> { + let Some(bid) = db::folder_backend_id(&ctx.app.db, ctx.user(), short).await? else { + return Ok(None); + }; + ctx.sess.folder(&bid).await +} + +pub async fn current_hierarchy(ctx: &mut Ctx) -> Result<(HierarchyState, Vec<(String, BFolder)>)> { + let folders = ctx.sess.folders().await?; + let mut st = HierarchyState::default(); + let mut list = Vec::new(); + let mut ids: BTreeMap = BTreeMap::new(); + for f in &folders { + let sid = short_id(ctx, &f.id).await?; + ids.insert(f.id.clone(), sid); + } + for f in folders { + let sid = ids[&f.id].clone(); + let parent = f + .parent + .as_ref() + .and_then(|p| ids.get(p).cloned()) + .unwrap_or_else(|| "0".to_string()); + st.folders + .insert(sid.clone(), (parent, f.name.clone(), f.ftype)); + list.push((sid, f)); + } + Ok((st, list)) +} + +fn folder_el(tag: &str, sid: &str, parent: &str, name: &str, ftype: u8) -> Element { + Element::new(tag) + .with_text("FolderHierarchy:ServerId", sid) + .with_text("FolderHierarchy:ParentId", parent) + .with_text("FolderHierarchy:DisplayName", name) + .with_text("FolderHierarchy:Type", ftype.to_string()) +} + +fn fs_status(root: &str, status: u32) -> Reply { + Reply::Wbxml(Element::new(root).with_text("FolderHierarchy:Status", status.to_string())) +} + +pub async fn folder_sync(ctx: &mut Ctx, req: Option) -> Result { + let Some(req) = req else { + return Ok(fs_status("FolderHierarchy:FolderSync", 10)); + }; + let key_s = req + .child_text("FolderHierarchy:SyncKey") + .unwrap_or_default(); + let Some(key) = SyncKey::parse(&key_s) else { + ctx.status = "invalid synckey".into(); + return Ok(fs_status("FolderHierarchy:FolderSync", 9)); + }; + let old: HierarchyState = match &key { + SyncKey::Initial => { + // full resync: forget every collection state of this device + db::device_reset_states(&ctx.app.db, ctx.dev.id).await?; + HierarchyState::default() + } + k => match state::load(ctx, HIERARCHY, k).await? { + Some(s) => s, + None => { + ctx.status = "unknown synckey".into(); + return Ok(fs_status("FolderHierarchy:FolderSync", 9)); + } + }, + }; + let (cur, _) = current_hierarchy(ctx).await?; + let mut adds = Vec::new(); + let mut updates = Vec::new(); + let mut deletes = Vec::new(); + for (sid, v) in &cur.folders { + match old.folders.get(sid) { + None => adds.push((sid.clone(), v.clone())), + Some(o) if o != v => updates.push((sid.clone(), v.clone())), + _ => {} + } + } + for sid in old.folders.keys() { + if !cur.folders.contains_key(sid) { + deletes.push(sid.clone()); + } + } + // collections the device still references but which never existed here (Z-Push leftovers) + let stale: Vec = ctx + .app + .stale_take(ctx.dev.id) + .into_iter() + .filter(|s| !cur.folders.contains_key(s) && !deletes.contains(s)) + .collect(); + if !stale.is_empty() { + tracing::info!(user = %ctx.user(), device = %ctx.req.device_id, folders = %stale.join(","), "removing stale collections from device"); + deletes.extend(stale); + } + // parents before children + adds.sort_by_key(|(sid, (p, _, _))| (depth(&cur, sid), p.clone())); + let changed = !(adds.is_empty() && updates.is_empty() && deletes.is_empty()); + let new_key = match (&key, changed) { + (SyncKey::Key { .. }, false) => key_s.clone(), + (SyncKey::Key { uuid, counter }, true) => { + state::save(ctx, HIERARCHY, uuid, counter + 1, &cur).await?; + state::make_key(uuid, counter + 1) + } + (SyncKey::Initial, _) => { + let u = state::new_uuid(); + state::save(ctx, HIERARCHY, &u, 1, &cur).await?; + state::make_key(&u, 1) + } + }; + for sid in &deletes { + db::state_delete_collection(&ctx.app.db, ctx.dev.id, sid).await?; + } + let mut changes = Element::new("FolderHierarchy:Changes").with_text( + "FolderHierarchy:Count", + (adds.len() + updates.len() + deletes.len()).to_string(), + ); + for (sid, (p, n, t)) in &updates { + changes.push(folder_el("FolderHierarchy:Update", sid, p, n, *t)); + } + for sid in &deletes { + changes.push( + Element::new("FolderHierarchy:Delete") + .with_text("FolderHierarchy:ServerId", sid.clone()), + ); + } + for (sid, (p, n, t)) in &adds { + changes.push(folder_el("FolderHierarchy:Add", sid, p, n, *t)); + } + ctx.items_out = (adds.len() + updates.len() + deletes.len()) as u64; + Ok(Reply::Wbxml( + Element::new("FolderHierarchy:FolderSync") + .with_text("FolderHierarchy:Status", "1") + .with_text("FolderHierarchy:SyncKey", new_key) + .with(changes), + )) +} + +fn depth(st: &HierarchyState, sid: &str) -> usize { + let mut d = 0; + let mut cur = sid.to_string(); + while let Some((p, _, _)) = st.folders.get(&cur) { + if p == "0" || d > 32 { + break; + } + d += 1; + cur = p.clone(); + } + d +} + +pub async fn folder_change(ctx: &mut Ctx, req: Option) -> Result { + let cmd = ctx.req.cmd.clone(); + let root = format!("FolderHierarchy:{cmd}"); + let Some(req) = req else { + return Ok(fs_status(&root, 10)); + }; + let key_s = req + .child_text("FolderHierarchy:SyncKey") + .unwrap_or_default(); + let Some(key @ SyncKey::Key { .. }) = SyncKey::parse(&key_s) else { + return Ok(fs_status(&root, 9)); + }; + let SyncKey::Key { uuid, counter } = &key else { + unreachable!() + }; + let Some(mut st): Option = state::load(ctx, HIERARCHY, &key).await? else { + return Ok(fs_status(&root, 9)); + }; + let name = req + .child_text("FolderHierarchy:DisplayName") + .unwrap_or_default(); + let parent_sid = req + .child_text("FolderHierarchy:ParentId") + .unwrap_or_else(|| "0".into()); + let parent = if parent_sid == "0" { + None + } else { + resolve(ctx, &parent_sid).await? + }; + if parent_sid != "0" && parent.is_none() { + return Ok(fs_status(&root, 5)); + } + let res: Result = async { + match cmd.as_str() { + "FolderCreate" => { + if name.trim().is_empty() || name.len() > 256 { + return Ok(Element::new(&root).with_text("FolderHierarchy:Status", "10")); + } + if st + .folders + .values() + .any(|(p, n, _)| p == &parent_sid && n.eq_ignore_ascii_case(&name)) + { + return Ok(Element::new(&root).with_text("FolderHierarchy:Status", "2")); + } + let ftype: u8 = req.child_u32("FolderHierarchy:Type").unwrap_or(12) as u8; + let f = ctx + .sess + .create_folder(parent.as_ref(), name.trim(), ftype) + .await?; + let sid = short_id(ctx, &f.id).await?; + st.folders + .insert(sid.clone(), (parent_sid.clone(), f.name.clone(), f.ftype)); + state::save(ctx, HIERARCHY, uuid, counter + 1, &st).await?; + db::audit(&ctx.app.db, ctx.user(), "folder_create", &f.id, &ctx.ip, "").await; + Ok(Element::new(&root) + .with_text("FolderHierarchy:Status", "1") + .with_text( + "FolderHierarchy:SyncKey", + state::make_key(uuid, counter + 1), + ) + .with_text("FolderHierarchy:ServerId", sid)) + } + "FolderUpdate" | "FolderDelete" => { + let sid = req + .child_text("FolderHierarchy:ServerId") + .unwrap_or_default(); + let Some(folder) = resolve(ctx, &sid).await? else { + return Ok(Element::new(&root).with_text("FolderHierarchy:Status", "4")); + }; + if cmd == "FolderDelete" { + if folder.ftype != crate::backend::FT_USER_MAIL + && !matches!(folder.ftype, 13..=15) + { + return Ok(Element::new(&root).with_text("FolderHierarchy:Status", "3")); + } + ctx.sess.delete_folder(&folder).await?; + st.folders.remove(&sid); + db::state_delete_collection(&ctx.app.db, ctx.dev.id, &sid).await?; + db::audit( + &ctx.app.db, + ctx.user(), + "folder_delete", + &folder.id, + &ctx.ip, + "", + ) + .await; + } else { + if folder.ftype != crate::backend::FT_USER_MAIL + && !matches!(folder.ftype, 13..=15) + { + return Ok(Element::new(&root).with_text("FolderHierarchy:Status", "3")); + } + let nf = ctx + .sess + .rename_folder(&folder, parent.as_ref(), name.trim()) + .await?; + if nf.id != folder.id { + rename_mapping(ctx, &folder.id, &nf.id).await?; + } + st.folders + .insert(sid.clone(), (parent_sid.clone(), nf.name.clone(), nf.ftype)); + db::audit( + &ctx.app.db, + ctx.user(), + "folder_update", + &nf.id, + &ctx.ip, + "", + ) + .await; + } + state::save(ctx, HIERARCHY, uuid, counter + 1, &st).await?; + Ok(Element::new(&root) + .with_text("FolderHierarchy:Status", "1") + .with_text( + "FolderHierarchy:SyncKey", + state::make_key(uuid, counter + 1), + )) + } + _ => Ok(Element::new(&root).with_text("FolderHierarchy:Status", "10")), + } + } + .await; + match res { + Ok(e) => Ok(Reply::Wbxml(e)), + Err(e) => { + tracing::warn!(user = %ctx.user(), "{cmd} failed: {e:#}"); + ctx.status = format!("error: {e}"); + let m = e.to_string().to_ascii_lowercase(); + let code = if m.contains("alreadyexists") || m.contains("already exists") { + 2 + } else { + 6 + }; + Ok(fs_status(&root, code)) + } + } +} + +/// After an IMAP rename, move the short-id mapping of the folder and all its children. +async fn rename_mapping(ctx: &Ctx, old: &str, new: &str) -> Result<()> { + let rows = sqlx::query("SELECT backend_id FROM folder_map WHERE username = ?") + .bind(ctx.user()) + .fetch_all(&ctx.app.db) + .await?; + for r in rows { + let bid: String = r.get(0); + if bid == old { + db::folder_rename_backend(&ctx.app.db, ctx.user(), &bid, new).await?; + } else if let Some(rest) = bid.strip_prefix(old) { + if rest.starts_with(['/', '.']) { + db::folder_rename_backend(&ctx.app.db, ctx.user(), &bid, &format!("{new}{rest}")) + .await?; + } + } + } + Ok(()) +} + +/// Legacy AS 1.0/2.0 GetHierarchy. +pub async fn get_hierarchy(ctx: &mut Ctx) -> Result { + let (st, _) = current_hierarchy(ctx).await?; + let mut root = Element::new("FolderHierarchy:Folders"); + for (sid, (p, n, t)) in st.folders { + root.push(folder_el("FolderHierarchy:Folder", &sid, &p, &n, t)); + } + Ok(Reply::Wbxml(root)) +} diff --git a/src/eas/itemops.rs b/src/eas/itemops.rs new file mode 100644 index 0000000..47d2797 --- /dev/null +++ b/src/eas/itemops.rs @@ -0,0 +1,279 @@ +//! ItemOperations and GetAttachment. + +use anyhow::{anyhow, Result}; +use base64::Engine; + +use super::convert::{email, Options}; +use super::folders::resolve; +use super::sync::{convert_raw, parse_server_id}; +use super::{Ctx, Reply}; +use crate::backend::Kind; +use crate::wbxml::{self, Element}; + +/// Load one attachment by FileReference. Returns (name, content type, bytes). +async fn load_attachment(ctx: &mut Ctx, fref: &str) -> Result<(String, String, Vec)> { + let (col, uid, idx) = + email::parse_file_reference(fref).ok_or_else(|| anyhow!("invalid file reference"))?; + let folder = resolve(ctx, &col) + .await? + .ok_or_else(|| anyhow!("not found"))?; + if folder.kind() != Kind::Mail { + return Err(anyhow!("not found")); + } + let m = ctx + .sess + .fetch_mail(folder.path(), uid) + .await + .map_err(|_| anyhow!("not found"))?; + email::attachment(&m.body, idx).ok_or_else(|| anyhow!("not found")) +} + +fn attachments_allowed(ctx: &Ctx) -> bool { + !ctx.s.provisioning.enabled || ctx.s.policy_for(ctx.user()).attenabled +} + +fn max_att(ctx: &Ctx) -> usize { + let mut m = (ctx.s.sync.max_attachment_mb * 1024 * 1024) as usize; + if ctx.s.provisioning.enabled { + let p = ctx.s.policy_for(ctx.user()).maxattsize; + if p > 0 { + m = m.min(p as usize); + } + } + m +} + +pub async fn get_attachment(ctx: &mut Ctx) -> Result { + let name = ctx.req.attachment_name.clone().unwrap_or_default(); + if !attachments_allowed(ctx) { + return Ok(Reply::Status(axum::http::StatusCode::FORBIDDEN)); + } + match load_attachment(ctx, &name).await { + Ok((_, _, data)) if data.len() > max_att(ctx) => { + Ok(Reply::Status(axum::http::StatusCode::PAYLOAD_TOO_LARGE)) + } + Ok((_, _ct, data)) => { + ctx.items_out += 1; + Ok(Reply::Raw("application/octet-stream", data)) + } + Err(e) => { + ctx.status = format!("attachment: {e}"); + Ok(Reply::Status(axum::http::StatusCode::NOT_FOUND)) + } + } +} + +fn parse_range(r: &str, total: usize) -> Option<(usize, usize)> { + let (a, b) = r.split_once('-')?; + let a: usize = a.trim().parse().ok()?; + let b: usize = b.trim().parse().ok()?; + if a > b || a >= total.max(1) { + return None; + } + Some((a, b.min(total.saturating_sub(1)))) +} + +pub async fn item_operations(ctx: &mut Ctx, req: Option) -> Result { + let Some(req) = req else { + return Ok(Reply::Wbxml( + Element::new("ItemOperations:ItemOperations").with_text("ItemOperations:Status", "2"), + )); + }; + let multipart = ctx.req.accept_multipart; + let mut parts: Vec> = Vec::new(); + let mut response = Element::new("ItemOperations:Response"); + for op in &req.children { + match op.tag() { + "Fetch" => { + let mut f = Element::new("ItemOperations:Fetch"); + let opts = op + .child("ItemOperations:Options") + .map(Options::parse) + .unwrap_or_default(); + let range = op + .child("ItemOperations:Options") + .and_then(|o| o.child_text("ItemOperations:Range")); + if let Some(fref) = op.child_text("AirSyncBase:FileReference") { + if !attachments_allowed(ctx) { + f.push_text("ItemOperations:Status", "16"); + f.push_text("AirSyncBase:FileReference", fref); + response.push(f); + continue; + } + match load_attachment(ctx, &fref).await { + Ok((_, ct, data)) if data.len() > max_att(ctx) => { + let _ = ct; + f.push_text("ItemOperations:Status", "11"); + f.push_text("AirSyncBase:FileReference", fref); + } + Ok((_, ct, data)) => { + let total = data.len(); + let (slice, rng) = + match range.as_deref().and_then(|r| parse_range(r, total)) { + Some((a, b)) => ( + &data[a..=b.min(total.saturating_sub(1))], + Some(format!("{a}-{b}")), + ), + None if range.is_some() && total > 0 => { + f.push_text("ItemOperations:Status", "8"); + f.push_text("AirSyncBase:FileReference", fref); + response.push(f); + continue; + } + None => (&data[..], None), + }; + f.push_text("ItemOperations:Status", "1"); + f.push_text("AirSyncBase:FileReference", fref); + let mut props = Element::new("ItemOperations:Properties"); + props.push_text("AirSyncBase:ContentType", ct); + if let Some(r) = rng { + props.push_text("ItemOperations:Range", r); + props.push_text("ItemOperations:Total", total.to_string()); + } + if multipart { + parts.push(slice.to_vec()); + props.push_text("ItemOperations:Part", parts.len().to_string()); + } else { + props.push_text( + "ItemOperations:Data", + base64::engine::general_purpose::STANDARD.encode(slice), + ); + } + f.push(props); + ctx.items_out += 1; + } + Err(e) => { + tracing::info!(user = %ctx.user(), "attachment fetch failed: {e:#}"); + f.push_text( + "ItemOperations:Status", + if e.to_string().contains("invalid") { + "15" + } else { + "6" + }, + ); + f.push_text("AirSyncBase:FileReference", fref); + } + } + response.push(f); + continue; + } + // item fetch (by CollectionId + ServerId, or LongId from Search) + let (col, sid) = match ( + op.child_text("AirSync:CollectionId"), + op.child_text("AirSync:ServerId"), + op.child_text("Search:LongId"), + ) { + (Some(c), Some(s), _) => (c, s), + (_, _, Some(l)) => (super::sync::collection_of(&l).to_string(), l), + _ => { + f.push_text("ItemOperations:Status", "2"); + response.push(f); + continue; + } + }; + let res: Result = async { + let folder = resolve(ctx, &col) + .await? + .ok_or_else(|| anyhow!("not found"))?; + let id = parse_server_id(ctx, &sid, &folder.id) + .await? + .ok_or_else(|| anyhow!("not found"))?; + let raw = ctx + .sess + .fetch(&folder, std::slice::from_ref(&id)) + .await? + .into_iter() + .next() + .ok_or_else(|| anyhow!("not found"))?; + let app = convert_raw(ctx, &col, folder.kind(), &raw, &opts) + .ok_or_else(|| anyhow!("conversion failed"))?; + Ok(app) + } + .await; + match res { + Ok(app) => { + f.push_text("ItemOperations:Status", "1"); + if op.has("Search:LongId") { + f.push_text("Search:LongId", sid.clone()); + } else { + f.push_text("AirSync:CollectionId", col.clone()); + f.push_text("AirSync:ServerId", sid.clone()); + } + let mut props = Element::new("ItemOperations:Properties"); + props.children = app.children; + f.push(props); + ctx.items_out += 1; + } + Err(e) => { + f.push_text( + "ItemOperations:Status", + if e.to_string().contains("not found") { + "6" + } else { + "3" + }, + ); + f.push_text("AirSync:CollectionId", col); + f.push_text("AirSync:ServerId", sid); + } + } + response.push(f); + } + "EmptyFolderContents" => { + let col = op.child_text("AirSync:CollectionId").unwrap_or_default(); + let mut e = Element::new("ItemOperations:EmptyFolderContents"); + let res: Result<()> = async { + let folder = resolve(ctx, &col) + .await? + .ok_or_else(|| anyhow!("not found"))?; + match folder.kind() { + Kind::Mail => ctx.sess.mail_empty(&folder).await, + _ => { + let l = ctx.sess.list(&folder, None).await?; + for (id, _) in l.items { + ctx.sess.dav_delete(&folder, &id).await?; + } + Ok(()) + } + } + } + .await; + e.push_text("ItemOperations:Status", if res.is_ok() { "1" } else { "3" }); + e.push_text("AirSync:CollectionId", col); + response.push(e); + } + "Move" => { + let mut m = Element::new("ItemOperations:Move"); + m.push_text("ItemOperations:Status", "2"); + if let Some(c) = op.child("ItemOperations:ConversationId") { + m.push(c.clone()); + } + response.push(m); + } + _ => {} + } + } + let root = Element::new("ItemOperations:ItemOperations") + .with_text("ItemOperations:Status", "1") + .with(response); + if multipart { + let wb = wbxml::encode(&root); + let mut all = vec![wb]; + all.extend(parts); + let n = all.len(); + let mut body = Vec::new(); + body.extend_from_slice(&(n as i32).to_le_bytes()); + let mut offset = 4 + n * 8; + for p in &all { + body.extend_from_slice(&(offset as i32).to_le_bytes()); + body.extend_from_slice(&(p.len() as i32).to_le_bytes()); + offset += p.len(); + } + for p in all { + body.extend_from_slice(&p); + } + return Ok(Reply::Raw("application/vnd.ms-sync.multipart", body)); + } + Ok(Reply::Wbxml(root)) +} diff --git a/src/eas/mailcmd.rs b/src/eas/mailcmd.rs new file mode 100644 index 0000000..2136cfb --- /dev/null +++ b/src/eas/mailcmd.rs @@ -0,0 +1,481 @@ +//! SendMail, SmartReply, SmartForward, MeetingResponse. + +use anyhow::{anyhow, Result}; +use axum::http::StatusCode; +use mail_parser::{MessageParser, MimeHeaders}; + +use super::convert::{calendar, email}; +use super::folders::resolve; +use super::sync::{parse_server_id, server_id}; +use super::{Ctx, Reply}; +use crate::backend::{mime, smtp, Kind, FT_CALENDAR, FT_SENT}; +use crate::db; +use crate::util::{html_escape, html_to_text}; +use crate::wbxml::Element; + +fn fail(ctx: &mut Ctx, status: u32, why: &str) -> Reply { + ctx.status = format!("error: {why}"); + tracing::warn!(user = %ctx.user(), cmd = %ctx.req.cmd, "send failed: {why}"); + if ctx.req.ver() >= 140 { + Reply::Wbxml( + Element::new(&format!("ComposeMail:{}", ctx.req.cmd)) + .with_text("ComposeMail:Status", status.to_string()), + ) + } else { + Reply::Status(StatusCode::INTERNAL_SERVER_ERROR) + } +} + +fn addrs(m: &mail_parser::Message, out: &mut Vec) { + for a in [m.to(), m.cc(), m.bcc()].into_iter().flatten() { + for x in a.iter() { + if let Some(ad) = x.address() { + let ad = ad.trim().to_string(); + if ad.contains('@') && !out.iter().any(|o| o.eq_ignore_ascii_case(&ad)) { + out.push(ad); + } + } + } + } +} + +pub async fn send_mail(ctx: &mut Ctx, req: Option, body: &[u8]) -> Result { + let cmd = ctx.req.cmd.clone(); + // ---- collect parameters (WBXML for AS 14+, query + raw MIME below) + let (mime_raw, save_sent, src_folder, src_item, src_long, replace_mime) = match &req { + Some(r) => { + let mime = r + .child("ComposeMail:MIME") + .map(|m| m.bytes_value()) + .unwrap_or_default(); + let src = r.child("ComposeMail:Source"); + ( + mime, + r.has("ComposeMail:SaveInSentItems"), + src.and_then(|s| s.child_text("ComposeMail:FolderId")), + src.and_then(|s| s.child_text("ComposeMail:ItemId")), + src.and_then(|s| s.child_text("ComposeMail:LongId")), + r.has("ComposeMail:ReplaceMime"), + ) + } + None => ( + body.to_vec(), + ctx.req.save_in_sent, + ctx.req.collection_id.clone(), + ctx.req.item_id.clone(), + ctx.req.long_id.clone(), + false, + ), + }; + if mime_raw.is_empty() { + return Ok(fail(ctx, 107, "empty MIME")); + } + let Some(msg) = MessageParser::default().parse(&mime_raw) else { + return Ok(fail(ctx, 107, "invalid MIME")); + }; + let mut rcpts = Vec::new(); + addrs(&msg, &mut rcpts); + if rcpts.is_empty() { + return Ok(fail(ctx, 107, "no recipients")); + } + + // ---- original message for smart reply / forward + let mut original: Option<(crate::backend::BFolder, u32, Vec)> = None; + if cmd != "SendMail" { + let (fid, iid) = if let Some(l) = src_long.clone() { + let mut p = l.splitn(2, ':'); + (p.next().map(|s| s.to_string()), Some(l)) + } else { + (src_folder.clone(), src_item.clone()) + }; + if let (Some(fid), Some(iid)) = (fid, iid) { + let iid = if iid.contains(':') { + iid + } else { + format!("{fid}:{iid}") + }; + if let Some(folder) = resolve(ctx, &fid).await? { + if let Some(uid) = parse_server_id(ctx, &iid, &folder.id) + .await? + .and_then(|u| u.parse::().ok()) + { + if let Ok(m) = ctx.sess.fetch_mail(folder.path(), uid).await { + original = Some((folder, uid, m.body)); + } + } + } + } + if original.is_none() { + tracing::info!(user = %ctx.user(), "smart reply/forward source not found, sending as is"); + } + } + + // ---- compose + let from_addr = ctx.sess.email.clone(); + let mut out: Vec = match (&original, replace_mime) { + (Some((_, _, orig)), false) => { + compose_smart(ctx, &msg, &mime_raw, orig, cmd == "SmartForward")? + } + _ => mime_raw.clone(), + }; + // sender handling + let from_hdr = msg + .from() + .and_then(|f| f.first()) + .and_then(|a| a.address()) + .map(|s| s.to_string()); + match from_hdr { + None => { + out = mime::prepend_headers(&out, &[("From".into(), from_addr.clone())]); + } + Some(f) if ctx.s.smtp.enforce_from && !f.eq_ignore_ascii_case(&from_addr) => { + let name = msg + .from() + .and_then(|f| f.first()) + .and_then(|a| a.name()) + .map(|n| n.to_string()); + out = mime::strip_headers(&out, &["From"]); + let v = match name { + Some(n) => format!("{} <{}>", mime::encode_word(&n), from_addr), + None => from_addr.clone(), + }; + out = mime::prepend_headers(&out, &[("From".into(), v)]); + tracing::info!(user = %ctx.user(), "From header {f} replaced with {from_addr}"); + } + _ => {} + } + if msg.date().is_none() { + out = mime::prepend_headers(&out, &[("Date".into(), chrono::Utc::now().to_rfc2822())]); + } + if msg.message_id().is_none() { + let dom = from_addr.split('@').nth(1).unwrap_or("activepush.local"); + out = mime::prepend_headers( + &out, + &[( + "Message-ID".into(), + format!("<{}@{}>", uuid::Uuid::new_v4(), dom), + )], + ); + } + let wire = mime::strip_headers(&out, &["Bcc"]); + + let password = ctx.sess.password().to_string(); + if let Err(e) = smtp::send( + &ctx.s.smtp, + &ctx.sess.login, + &password, + &from_addr, + &rcpts, + &wire, + ) + .await + { + return Ok(fail(ctx, 110, &format!("{e:#}"))); + } + ctx.app.metrics.mail_sent(); + ctx.items_in += 1; + tracing::info!(user = %ctx.user(), device = %ctx.req.device_id, recipients = rcpts.len(), bytes = wire.len(), "{cmd} delivered to SMTP"); + + if save_sent && ctx.s.smtp.save_in_sent { + match ctx.sess.special_folder(FT_SENT).await { + Ok(Some(sent)) => { + if let Err(e) = ctx.sess.mail_append(sent.path(), "\\Seen", &out).await { + tracing::warn!(user = %ctx.user(), "saving to Sent failed: {e:#}"); + } + } + _ => tracing::warn!(user = %ctx.user(), "no Sent folder found; copy not saved"), + } + } + if let Some((folder, uid, _)) = &original { + let flag = if cmd == "SmartForward" { + "$Forwarded" + } else { + "\\Answered" + }; + let _ = ctx.sess.mail_add_flag(folder.path(), *uid, flag).await; + } + Ok(Reply::Empty) +} + +fn compose_smart( + ctx: &Ctx, + msg: &mail_parser::Message, + raw: &[u8], + orig_raw: &[u8], + forward: bool, +) -> Result> { + let orig = MessageParser::default() + .parse(orig_raw) + .ok_or_else(|| anyhow!("original message unparseable"))?; + // headers from the client message (minus MIME structure headers) + let (hblock, _) = mime::split_headers(raw); + let mut headers: Vec<(String, String)> = mime::header_lines(hblock) + .into_iter() + .filter(|(k, _)| { + ![ + "content-type", + "content-transfer-encoding", + "mime-version", + "content-disposition", + ] + .contains(&k.to_ascii_lowercase().as_str()) + }) + .collect(); + if !forward { + if let Some(mid) = orig.message_id() { + if !headers + .iter() + .any(|(k, _)| k.eq_ignore_ascii_case("In-Reply-To")) + { + headers.push(("In-Reply-To".into(), format!("<{mid}>"))); + } + if !headers + .iter() + .any(|(k, _)| k.eq_ignore_ascii_case("References")) + { + let mut refs: Vec = orig + .references() + .as_text_list() + .map(|l| l.iter().map(|r| format!("<{r}>")).collect()) + .or_else(|| orig.references().as_text().map(|r| vec![format!("<{r}>")])) + .unwrap_or_default(); + refs.push(format!("<{mid}>")); + headers.push(("References".into(), refs.join(" "))); + } + } + } + let new_text = msg.body_text(0).map(|s| s.into_owned()).unwrap_or_default(); + let new_html = if msg.html_body_count() > 0 + && msg + .html_bodies() + .any(|p| matches!(p.body, mail_parser::PartType::Html(_))) + { + msg.body_html(0).map(|s| s.into_owned()) + } else { + None + }; + let o_text = orig + .body_text(0) + .map(|s| s.into_owned()) + .unwrap_or_else(|| { + orig.body_html(0) + .map(|h| html_to_text(&h)) + .unwrap_or_default() + }); + let o_html = if orig.html_body_count() > 0 + && orig + .html_bodies() + .any(|p| matches!(p.body, mail_parser::PartType::Html(_))) + { + orig.body_html(0).map(|s| s.into_owned()) + } else { + None + }; + let addr = |a: Option<&mail_parser::Address>| { + a.map(|a| { + a.iter() + .map(|x| match (x.name(), x.address()) { + (Some(n), Some(ad)) => format!("{n} <{ad}>"), + (None, Some(ad)) => ad.to_string(), + _ => String::new(), + }) + .collect::>() + .join(", ") + }) + .unwrap_or_default() + }; + let date = orig.date().map(|d| d.to_rfc822()).unwrap_or_default(); + let subj = orig.subject().unwrap_or("").to_string(); + let from = addr(orig.from()); + let to = addr(orig.to()); + let (text, html, mut atts) = if forward && !ctx.s.imap.inline_forward { + ( + new_text.clone(), + new_html.clone(), + vec![mime::Attachment { + name: format!("{}.eml", if subj.is_empty() { "message" } else { &subj }), + content_type: "message/rfc822".into(), + data: orig_raw.to_vec(), + content_id: None, + inline: false, + }], + ) + } else if forward { + let head = format!("-------- Original Message --------\nSubject: {subj}\nDate: {date}\nFrom: {from}\nTo: {to}\n\n"); + let text = format!("{new_text}\n\n{head}{o_text}"); + let html = new_html.clone().map(|nh| { + let oh = o_html.clone().unwrap_or_else(|| format!("
{}
", html_escape(&o_text))); + format!( + "{nh}
-------- Original Message --------
Subject: {}
Date: {}
From: {}
To: {}

{oh}
", + html_escape(&subj), + html_escape(&date), + html_escape(&from), + html_escape(&to) + ) + }); + let mut a = Vec::new(); + for (i, part) in orig.attachments().enumerate() { + if let Some((name, ct, data)) = email::attachment(orig_raw, i) { + a.push(mime::Attachment { + name, + content_type: ct, + data, + content_id: part.content_id().map(|s| s.to_string()), + inline: false, + }); + } + } + (text, html, a) + } else { + let quoted: String = o_text.lines().map(|l| format!("> {l}\n")).collect(); + let text = format!("{new_text}\n\nOn {date}, {from} wrote:\n{quoted}"); + let html = new_html.clone().map(|nh| { + let oh = o_html.clone().unwrap_or_else(|| format!("
{}
", html_escape(&o_text))); + format!( + "{nh}
On {}, {} wrote:
{oh}
", + html_escape(&date), + html_escape(&from) + ) + }); + (text, html, Vec::new()) + }; + // attachments the client added itself + for (i, part) in msg.attachments().enumerate() { + if let Some((name, ct, data)) = email::attachment(raw, i) { + atts.push(mime::Attachment { + name, + content_type: ct, + data, + content_id: part.content_id().map(|s| s.to_string()), + inline: false, + }); + } + } + Ok(mime::build(&headers, Some(&text), html.as_deref(), &atts)) +} + +// ------------------------------------------------------------------ MeetingResponse + +pub async fn meeting_response(ctx: &mut Ctx, req: Option) -> Result { + let mut root = Element::new("MeetingResponse:MeetingResponse"); + let Some(req) = req else { + return Ok(Reply::Wbxml(root)); + }; + for r in req.children_named("MeetingResponse:Request") { + let resp_code = r.child_u32("MeetingResponse:UserResponse").unwrap_or(0); + let col = r + .child_text("MeetingResponse:CollectionId") + .unwrap_or_default(); + let rid = r + .child_text("MeetingResponse:RequestId") + .or_else(|| r.child_text("Search:LongId")) + .unwrap_or_default(); + let mut res = Element::new("MeetingResponse:Result") + .with_text("MeetingResponse:RequestId", rid.clone()); + let outcome: Result> = async { + let col = if col.is_empty() { + super::sync::collection_of(&rid).to_string() + } else { + col.clone() + }; + let folder = resolve(ctx, &col) + .await? + .ok_or_else(|| anyhow!("collection not found"))?; + let sid = if rid.contains(':') { + rid.clone() + } else { + format!("{col}:{rid}") + }; + match folder.kind() { + Kind::Mail => { + let uid: u32 = parse_server_id(ctx, &sid, &folder.id) + .await? + .and_then(|u| u.parse().ok()) + .ok_or_else(|| anyhow!("item not found"))?; + let m = ctx.sess.fetch_mail(folder.path(), uid).await?; + let ics = + email::calendar_of(&m.body).ok_or_else(|| anyhow!("no calendar part"))?; + let partstat = match resp_code { + 1 => "ACCEPTED", + 2 => "TENTATIVE", + _ => "DECLINED", + }; + let mut cal_id = None; + if resp_code != 3 && ctx.s.caldav.enabled { + if let Some(cal) = ctx.sess.special_folder(FT_CALENDAR).await? { + let updated = calendar::set_partstat(&ics, &ctx.sess.email, partstat) + .ok_or_else(|| anyhow!("bad calendar data"))?; + let (id, _) = ctx.sess.dav_put(&cal, None, updated, None).await?; + let cal_sid = folder_short(ctx, &cal.id).await?; + cal_id = Some(server_id(ctx, &cal_sid, &cal.id, &id).await?); + } + } + // the device sends the reply e-mail itself; remove the invitation like Z-Push + let _ = ctx.sess.mail_delete(&folder, uid, true).await; + Ok(cal_id) + } + Kind::Calendar => { + let id = parse_server_id(ctx, &sid, &folder.id) + .await? + .ok_or_else(|| anyhow!("item not found"))?; + let cur = ctx.sess.fetch_dav(&folder, &id).await?; + let partstat = match resp_code { + 1 => "ACCEPTED", + 2 => "TENTATIVE", + _ => "DECLINED", + }; + let updated = calendar::set_partstat( + cur.data.as_deref().unwrap_or(""), + &ctx.sess.email, + partstat, + ) + .ok_or_else(|| anyhow!("bad calendar data"))?; + ctx.sess + .dav_put(&folder, Some(&id), updated, Some(&cur.etag)) + .await?; + Ok(Some(sid)) + } + _ => Err(anyhow!("invalid collection")), + } + } + .await; + match outcome { + Ok(cal) => { + res.push_text("MeetingResponse:Status", "1"); + if let Some(c) = cal { + if resp_code != 3 { + res.push_text("MeetingResponse:CalendarId", c); + } + } + db::audit( + &ctx.app.db, + ctx.user(), + "meeting_response", + &rid, + &ctx.ip, + &resp_code.to_string(), + ) + .await; + } + Err(e) => { + tracing::warn!(user = %ctx.user(), "MeetingResponse failed: {e:#}"); + res.push_text( + "MeetingResponse:Status", + if e.to_string().contains("not found") { + "2" + } else { + "4" + }, + ); + } + } + root.push(res); + } + Ok(Reply::Wbxml(root)) +} + +async fn folder_short(ctx: &Ctx, bid: &str) -> Result { + Ok(db::folder_short_id(&ctx.app.db, ctx.user(), bid) + .await? + .to_string()) +} diff --git a/src/eas/misc.rs b/src/eas/misc.rs new file mode 100644 index 0000000..c904cc5 --- /dev/null +++ b/src/eas/misc.rs @@ -0,0 +1,445 @@ +//! Settings, Search (GAL + Mailbox), ResolveRecipients. + +use std::time::{Duration, Instant}; + +use anyhow::Result; + +use super::convert::{contact, Options}; +use super::folders::resolve; +use super::provision::device_info_from; +use super::sync::server_id; +use super::{Ctx, Reply}; +use crate::backend::{dav, imap, Kind}; +use crate::config::expand_user_template; +use crate::db::{self, DeviceField}; +use crate::wbxml::Element; + +// ------------------------------------------------------------------ Settings + +pub async fn settings(ctx: &mut Ctx, req: Option) -> Result { + let mut root = Element::new("Settings:Settings").with_text("Settings:Status", "1"); + let Some(req) = req else { + return Ok(Reply::Wbxml(root)); + }; + for item in &req.children { + match item.tag() { + "Oof" => { + let mut o = Element::new("Settings:Oof"); + if item.has("Settings:Get") { + o.push_text("Settings:Status", "1"); + o.push(Element::new("Settings:Get").with_text("Settings:OofState", "0")); + } else { + // out-of-office is managed by the mail server (e.g. Sieve vacation) + o.push_text("Settings:Status", "2"); + } + root.push(o); + } + "DeviceInformation" => { + if let Some(set) = item.child("Settings:Set") { + db::device_set_info(&ctx.app.db, ctx.dev.id, &device_info_from(set)).await?; + } + root.push( + Element::new("Settings:DeviceInformation").with_text("Settings:Status", "1"), + ); + } + "DevicePassword" => { + if let Some(pw) = item.path(&["Settings:Set", "Settings:Password"]) { + let v = pw.text_value(); + if v.len() <= 256 { + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::RecoveryPassword, + None, + Some(&v), + ) + .await?; + db::audit( + &ctx.app.db, + ctx.user(), + "recovery_password_set", + &ctx.req.device_id, + &ctx.ip, + "", + ) + .await; + } + } + root.push( + Element::new("Settings:DevicePassword").with_text("Settings:Status", "1"), + ); + } + "UserInformation" => { + let email = ctx.sess.email.clone(); + let mut get = Element::new("Settings:Get"); + if ctx.req.ver() >= 141 { + get.push( + Element::new("Settings:Accounts").with( + Element::new("Settings:Account") + .with_text("Settings:UserDisplayName", email.clone()) + .with( + Element::new("Settings:EmailAddresses") + .with_text("Settings:PrimarySmtpAddress", email.clone()), + ), + ), + ); + } else { + get.push( + Element::new("Settings:EmailAddresses") + .with_text("Settings:SmtpAddress", email), + ); + } + root.push( + Element::new("Settings:UserInformation") + .with_text("Settings:Status", "1") + .with(get), + ); + } + "RightsManagementInformation" => { + root.push( + Element::new("Settings:RightsManagementInformation") + .with_text("Settings:Status", "1") + .with( + Element::new("Settings:Get") + .with(Element::new("RightsManagement:RightsManagementTemplates")), + ), + ); + } + _ => {} + } + } + Ok(Reply::Wbxml(root)) +} + +// ------------------------------------------------------------------ GAL helpers + +pub struct Person { + pub summary: contact::CardSummary, + pub from_gal: bool, +} + +pub async fn find_people(ctx: &mut Ctx, query: &str, limit: usize) -> Result> { + let mut out: Vec = Vec::new(); + let q = query.trim(); + if q.chars().count() < ctx.s.carddav.gal_min_length.max(1) { + return Ok(out); + } + let Some((client, home)) = ctx.sess.carddav()? else { + return Ok(out); + }; + let s = ctx.s.clone(); + let mut books: Vec<(String, bool)> = Vec::new(); + if !s.carddav.gal_path.is_empty() { + books.push(( + dav::encode_path(&expand_user_template( + &s.carddav.gal_path, + ctx.user(), + &s.general.default_domain, + )), + true, + )); + } + if let Ok(cols) = client.collections(&home, dav::DavKind::AddressBook).await { + for c in cols { + let p = dav::encode_path(&c.href); + if !books.iter().any(|(b, _)| *b == p) { + books.push((p, false)); + } + } + } + for (b, gal) in books { + let res = match client.search_cards(&b, q).await { + Ok(r) => r, + Err(e) => { + tracing::debug!("GAL search in {b} failed: {e:#}"); + continue; + } + }; + for r in res { + if let Some(sm) = r.data.as_deref().and_then(contact::summary) { + if sm.emails.is_empty() && sm.display_name.is_empty() { + continue; + } + let dup = out.iter().any(|p| { + !sm.emails.is_empty() && p.summary.emails.first() == sm.emails.first() + }); + if !dup { + out.push(Person { + summary: sm, + from_gal: gal, + }); + } + if out.len() >= limit { + return Ok(out); + } + } + } + } + Ok(out) +} + +fn parse_range(r: Option, def: usize) -> (usize, usize) { + r.and_then(|r| { + let (a, b) = r.split_once('-')?; + Some((a.trim().parse().ok()?, b.trim().parse().ok()?)) + }) + .filter(|(a, b)| a <= b) + .unwrap_or((0, def.saturating_sub(1))) +} + +// ------------------------------------------------------------------ Search + +pub async fn search(ctx: &mut Ctx, req: Option) -> Result { + let status_only = + |s: &str| Reply::Wbxml(Element::new("Search:Search").with_text("Search:Status", s)); + let Some(req) = req else { + return Ok(status_only("2")); + }; + let Some(store) = req.child("Search:Store") else { + return Ok(status_only("2")); + }; + let name = store.child_text("Search:Name").unwrap_or_default(); + let opts_el = store.child("Search:Options"); + let max = ctx.s.sync.search_max_results as usize; + let (from, to) = parse_range( + opts_el.and_then(|o| o.child_text("Search:Range")), + max.min(100), + ); + let to = to.min(from + max.max(1) - 1); + let mut st = Element::new("Search:Store"); + let started = Instant::now(); + let deadline = Duration::from_secs(ctx.s.sync.search_wait_secs.max(3)); + + match name.to_ascii_lowercase().as_str() { + "gal" => { + let q = store.child_text("Search:Query").unwrap_or_default(); + let people = find_people(ctx, &q, to + 1).await.unwrap_or_default(); + st.push_text("Search:Status", "1"); + let total = people.len(); + for p in people.into_iter().skip(from).take(to + 1 - from) { + let s = p.summary; + let mut props = Element::new("Search:Properties"); + props.push_text( + "GAL:DisplayName", + if s.display_name.is_empty() { + s.emails.first().cloned().unwrap_or_default() + } else { + s.display_name.clone() + }, + ); + props.push_opt("GAL:Phone", (!s.phone.is_empty()).then(|| s.phone.clone())); + props.push_opt( + "GAL:Office", + (!s.office.is_empty()).then(|| s.office.clone()), + ); + props.push_opt("GAL:Title", (!s.title.is_empty()).then(|| s.title.clone())); + props.push_opt( + "GAL:Company", + (!s.company.is_empty()).then(|| s.company.clone()), + ); + props.push_opt( + "GAL:FirstName", + (!s.first.is_empty()).then(|| s.first.clone()), + ); + props.push_opt("GAL:LastName", (!s.last.is_empty()).then(|| s.last.clone())); + props.push_opt( + "GAL:MobilePhone", + (!s.mobile.is_empty()).then(|| s.mobile.clone()), + ); + if let Some(e) = s.emails.first() { + props.push_text("GAL:EmailAddress", e.clone()); + } + st.push(Element::new("Search:Result").with(props)); + } + if total > 0 { + st.push_text( + "Search:Range", + format!( + "{from}-{}", + (from + total.min(to + 1 - from)).saturating_sub(1) + ), + ); + } + st.push_text("Search:Total", total.to_string()); + ctx.items_out += total as u64; + } + "mailbox" => { + let Some(query) = store.child("Search:Query") else { + return Ok(status_only("2")); + }; + let and = query.child("Search:And").unwrap_or(query); + let text = and.child_text("Search:FreeText").unwrap_or_default(); + let col = and.child_text("AirSync:CollectionId"); + let since = and + .child("Search:GreaterThan") + .and_then(|g| g.child_text("Search:Value")) + .and_then(|v| crate::backend::tz::parse_eas_date(&v)); + let deep = opts_el + .map(|o| o.has("Search:DeepTraversal")) + .unwrap_or(false); + let mut opts = opts_el.map(Options::parse).unwrap_or_default(); + if opts.prefs.is_empty() { + opts.prefs.push(super::convert::BodyPref { + typ: 1, + trunc: Some(5120), + preview: Some(255), + ..Default::default() + }); + } + // folders to search + let all = ctx.sess.folders().await?; + let mut folders = Vec::new(); + match &col { + Some(c) => { + if let Some(f) = resolve(ctx, c).await? { + if deep { + let pref = f.id.clone(); + for x in all.iter().filter(|x| { + x.kind() == Kind::Mail + && (x.id == pref + || x.id.starts_with(&format!("{pref}/")) + || x.id.starts_with(&format!("{pref}."))) + }) { + folders.push(x.clone()); + } + } else { + folders.push(f); + } + } + } + None => folders.extend(all.iter().filter(|x| x.kind() == Kind::Mail).cloned()), + } + let mut hits: Vec<(crate::backend::BFolder, u32)> = Vec::new(); + for f in folders { + if started.elapsed() > deadline { + break; + } + match ctx.sess.mail_search(&f, &text, since).await { + Ok(uids) => hits.extend(uids.into_iter().rev().map(|u| (f.clone(), u))), + Err(e) => tracing::debug!("search in {} failed: {e:#}", f.name), + } + } + let total = hits.len(); + st.push_text("Search:Status", "1"); + for (f, uid) in hits.into_iter().skip(from).take(to + 1 - from) { + let Ok(m) = ctx.sess.fetch_mail(f.path(), uid).await else { + continue; + }; + let cid = super::folders::short_id(ctx, &f.id).await?; + let sid = server_id(ctx, &cid, &f.id, &uid.to_string()).await?; + let conv = super::convert::email::to_eas( + &m, + &super::convert::email::MailContext { + collection: &cid, + ver: ctx.req.ver(), + opts: &opts, + default_tz: ctx.s.timezone(), + }, + ); + let mut props = Element::new("Search:Properties"); + props.children = conv.app.children; + st.push( + Element::new("Search:Result") + .with_text("AirSync:Class", "Email") + .with_text("Search:LongId", sid) + .with_text("AirSync:CollectionId", cid) + .with(props), + ); + ctx.items_out += 1; + } + if total > 0 { + st.push_text( + "Search:Range", + format!( + "{from}-{}", + (from + total.min(to + 1 - from)).saturating_sub(1) + ), + ); + } + st.push_text("Search:Total", total.to_string()); + } + _ => { + st.push_text("Search:Status", "3"); + } + } + let _ = imap::quote; // keep module linked for docs + Ok(Reply::Wbxml( + Element::new("Search:Search") + .with_text("Search:Status", "1") + .with(Element::new("Search:Response").with(st)), + )) +} + +// ------------------------------------------------------------------ ResolveRecipients + +pub async fn resolve_recipients(ctx: &mut Ctx, req: Option) -> Result { + let mut root = Element::new("ResolveRecipients:ResolveRecipients"); + let Some(req) = req else { + return Ok(Reply::Wbxml( + root.with_text("ResolveRecipients:Status", "5"), + )); + }; + let opts = req.child("ResolveRecipients:Options"); + let max_amb = opts + .and_then(|o| o.child_u32("ResolveRecipients:MaxAmbiguousRecipients")) + .unwrap_or(19) + .clamp(1, 100) as usize; + let want_certs = opts + .and_then(|o| o.child_u32("ResolveRecipients:CertificateRetrieval")) + .unwrap_or(1) + > 1; + let want_avail = opts + .map(|o| o.has("ResolveRecipients:Availability")) + .unwrap_or(false); + root.push_text("ResolveRecipients:Status", "1"); + for to in req.children_named("ResolveRecipients:To") { + let q = to.text_value(); + let people = find_people(ctx, &q, max_amb).await.unwrap_or_default(); + let mut resp = + Element::new("ResolveRecipients:Response").with_text("ResolveRecipients:To", q.clone()); + let mut recips: Vec<(u8, String, String)> = people + .into_iter() + .filter_map(|p| { + let e = p.summary.emails.first()?.clone(); + let n = if p.summary.display_name.is_empty() { + e.clone() + } else { + p.summary.display_name.clone() + }; + Some((if p.from_gal { 1 } else { 2 }, n, e)) + }) + .collect(); + if recips.is_empty() && q.contains('@') && !q.contains(' ') { + recips.push((1, q.clone(), q.clone())); + } + let status = match recips.len() { + 0 => "4", + 1 => "1", + _ => "2", + }; + resp.push_text("ResolveRecipients:Status", status); + resp.push_text("ResolveRecipients:RecipientCount", recips.len().to_string()); + for (t, n, e) in recips { + let mut r = Element::new("ResolveRecipients:Recipient") + .with_text("ResolveRecipients:Type", t.to_string()) + .with_text("ResolveRecipients:DisplayName", n) + .with_text("ResolveRecipients:EmailAddress", e); + if want_avail { + r.push( + Element::new("ResolveRecipients:Availability") + .with_text("ResolveRecipients:Status", "163"), + ); + } + if want_certs { + r.push( + Element::new("ResolveRecipients:Certificates") + .with_text("ResolveRecipients:Status", "7") + .with_text("ResolveRecipients:CertificateCount", "0"), + ); + } + resp.push(r); + } + root.push(resp); + } + Ok(Reply::Wbxml(root)) +} diff --git a/src/eas/mod.rs b/src/eas/mod.rs new file mode 100644 index 0000000..b734546 --- /dev/null +++ b/src/eas/mod.rs @@ -0,0 +1,836 @@ +//! Exchange ActiveSync HTTP endpoint (`/Microsoft-Server-ActiveSync`). + +pub mod convert; +pub mod folders; +pub mod itemops; +pub mod mailcmd; +pub mod misc; +pub mod ping; +pub mod provision; +pub mod state; +pub mod sync; + +use std::net::{IpAddr, SocketAddr}; +use std::sync::Arc; +use std::time::Instant; + +use axum::body::Body; +use axum::extract::{ConnectInfo, State}; +use axum::http::{HeaderMap, HeaderValue, Method, StatusCode, Uri}; +use axum::response::{IntoResponse, Response}; +use base64::Engine; +use http_body_util::BodyExt; + +use crate::app::App; +use crate::backend::{AuthResult, Session}; +use crate::config::{LoginFormat, Settings}; +use crate::db::{self, Device}; +use crate::metrics::{ActiveRequest, Event}; +use crate::util::{self, now}; +use crate::wbxml::{self, Element}; + +pub const SUPPORTED_VERSIONS: &[&str] = &["2.5", "12.0", "12.1", "14.0", "14.1"]; +pub const COMMANDS: &str = "Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,Search,Settings,Ping,ItemOperations,Provision,ResolveRecipients,ValidateCert"; + +#[derive(Debug, Clone, Default)] +pub struct EasRequest { + pub cmd: String, + pub user: String, + pub device_id: String, + pub device_type: String, + pub version: String, + pub policy_key: Option, + pub attachment_name: Option, + pub collection_id: Option, + pub item_id: Option, + pub long_id: Option, + pub parent_id: Option, + pub occurrence: Option, + pub save_in_sent: bool, + pub accept_multipart: bool, + pub user_agent: String, + pub content_type: String, +} + +impl EasRequest { + /// Protocol version as integer: 25, 120, 121, 140, 141. + pub fn ver(&self) -> u32 { + match self.version.as_str() { + "2.5" => 25, + "12.0" => 120, + "12.1" => 121, + "14.0" => 140, + "14.1" => 141, + "16.0" => 160, + "16.1" => 161, + _ => 25, + } + } +} + +const BASE64_COMMANDS: &[(u8, &str)] = &[ + (0, "Sync"), + (1, "SendMail"), + (2, "SmartForward"), + (3, "SmartReply"), + (4, "GetAttachment"), + (9, "FolderSync"), + (10, "FolderCreate"), + (11, "FolderDelete"), + (12, "FolderUpdate"), + (13, "MoveItems"), + (14, "GetItemEstimate"), + (15, "MeetingResponse"), + (16, "Search"), + (17, "Settings"), + (18, "Ping"), + (19, "ItemOperations"), + (20, "Provision"), + (21, "ResolveRecipients"), + (22, "ValidateCert"), +]; + +pub fn parse_request(uri: &Uri, headers: &HeaderMap) -> Result { + let q = uri.query().unwrap_or(""); + let h = |n: &str| { + headers + .get(n) + .and_then(|v| v.to_str().ok()) + .unwrap_or("") + .trim() + .to_string() + }; + let mut r = EasRequest { + user_agent: h("user-agent"), + content_type: h("content-type"), + ..Default::default() + }; + if q.contains("Cmd=") || q.contains("DeviceId=") || q.is_empty() { + for (k, v) in url::form_urlencoded::parse(q.as_bytes()) { + let v = v.to_string(); + match k.as_ref() { + "Cmd" => r.cmd = v, + "User" => r.user = v, + "DeviceId" => r.device_id = v, + "DeviceType" => r.device_type = v, + "AttachmentName" => r.attachment_name = Some(v), + "CollectionId" => r.collection_id = Some(v), + "ItemId" => r.item_id = Some(v), + "LongId" => r.long_id = Some(v), + "ParentId" => r.parent_id = Some(v), + "Occurrence" => r.occurrence = Some(v), + "SaveInSent" => r.save_in_sent = v.eq_ignore_ascii_case("T"), + _ => {} + } + } + r.version = h("ms-asprotocolversion"); + let pk = h("x-ms-policykey"); + if !pk.is_empty() { + r.policy_key = pk.parse().ok(); + } + r.accept_multipart = h("ms-asacceptmultipart").eq_ignore_ascii_case("T"); + } else { + // base64 encoded query (MS-ASHTTP 2.2.1.1.1.1) + let raw = percent_encoding::percent_decode_str(q) + .decode_utf8_lossy() + .into_owned(); + let b = base64::engine::general_purpose::STANDARD + .decode(raw.trim()) + .map_err(|_| "invalid base64 query")?; + struct Cur<'a> { + b: &'a [u8], + p: usize, + } + impl<'a> Cur<'a> { + fn byte(&mut self) -> Result { + let v = *self.b.get(self.p).ok_or("truncated query")?; + self.p += 1; + Ok(v) + } + fn take(&mut self, n: usize) -> Result<&'a [u8], &'static str> { + let s = self.b.get(self.p..self.p + n).ok_or("truncated query")?; + self.p += n; + Ok(s) + } + } + let mut c = Cur { b: &b, p: 0 }; + let ver = c.byte()?; + r.version = format!("{}.{}", ver / 10, ver % 10); + let code = c.byte()?; + r.cmd = BASE64_COMMANDS + .iter() + .find(|(cc, _)| *cc == code) + .map(|(_, n)| n.to_string()) + .ok_or("unknown command code")?; + let _locale = c.take(2)?; + let dlen = c.byte()? as usize; + let dev = c.take(dlen)?; + r.device_id = if dev.iter().all(|x| x.is_ascii_graphic()) { + String::from_utf8_lossy(dev).into_owned() + } else { + hex::encode(dev) + }; + let pklen = c.byte()? as usize; + let pk = c.take(pklen)?; + if pklen == 4 { + r.policy_key = Some(u32::from_le_bytes([pk[0], pk[1], pk[2], pk[3]])); + } + let tlen = c.byte()? as usize; + r.device_type = String::from_utf8_lossy(c.take(tlen)?).into_owned(); + while c.p + 1 < c.b.len() { + let tag = c.byte()?; + let len = c.byte()? as usize; + let val = c.take(len)?; + let sv = String::from_utf8_lossy(val).into_owned(); + match tag { + 0 => r.attachment_name = Some(sv), + 1 => r.collection_id = Some(sv), + 3 => r.item_id = Some(sv), + 4 => r.long_id = Some(sv), + 5 => r.parent_id = Some(sv), + 6 => r.occurrence = Some(sv), + 7 => { + let o = val.first().copied().unwrap_or(0); + r.save_in_sent = o & 0x01 != 0; + r.accept_multipart = o & 0x02 != 0; + } + 8 => r.user = sv, + _ => {} + } + } + } + if r.version.is_empty() { + r.version = "2.5".into(); + } + Ok(r) +} + +fn valid_device_id(s: &str) -> bool { + !s.is_empty() + && s.len() <= 128 + && s.chars() + .all(|c| c.is_ascii_alphanumeric() || matches!(c, '-' | '_' | '.')) +} + +fn valid_device_type(s: &str) -> bool { + s.len() <= 64 && s.chars().all(|c| c.is_ascii_graphic()) +} + +/// Determine the real client IP honouring trusted proxies. +pub fn client_ip(peer: SocketAddr, headers: &HeaderMap, s: &Settings) -> IpAddr { + let peer_ip = util::normalize(peer.ip()); + if !util::ip_in_any(&peer_ip, &s.security.trusted_proxies) { + return peer_ip; + } + let hv = headers + .get(s.security.real_ip_header.as_str()) + .and_then(|v| v.to_str().ok()) + .unwrap_or(""); + // walk right-to-left skipping trusted proxies + for part in hv.split(',').rev() { + if let Ok(ip) = part.trim().parse::() { + let ip = util::normalize(ip); + if !util::ip_in_any(&ip, &s.security.trusted_proxies) { + return ip; + } + } + } + peer_ip +} + +/// Parse `Authorization: Basic` and normalise the login according to settings. +pub fn basic_auth(headers: &HeaderMap, s: &Settings) -> Option<(String, String)> { + let v = headers.get("authorization")?.to_str().ok()?; + let (scheme, data) = v.split_once(' ')?; + if !scheme.eq_ignore_ascii_case("basic") { + return None; + } + let dec = base64::engine::general_purpose::STANDARD + .decode(data.trim()) + .ok()?; + let dec = String::from_utf8(dec).ok()?; + let (user, pass) = dec.split_once(':')?; + let login = normalize_login(user, s)?; + if pass.is_empty() || pass.len() > 1024 { + return None; + } + Some((login, pass.to_string())) +} + +pub fn normalize_login(user: &str, s: &Settings) -> Option { + let mut u = user.trim().to_string(); + if let Some((_, rest)) = u.split_once('\\') { + u = rest.to_string(); + } + let u = match s.general.login_format { + LoginFormat::AsGiven => u, + LoginFormat::LocalPart => u.split('@').next().unwrap_or("").to_string(), + LoginFormat::FullEmail => { + if u.contains('@') || s.general.default_domain.is_empty() { + u + } else { + format!("{u}@{}", s.general.default_domain) + } + } + }; + let u = u.to_lowercase(); + util::valid_login(&u).then_some(u) +} + +/// Access policy checks shared by EAS and Autodiscover. +pub fn user_allowed(login: &str, s: &Settings) -> bool { + let sec = &s.security; + if sec + .blocked_users + .iter() + .any(|b| b.eq_ignore_ascii_case(login)) + { + return false; + } + if !sec.allowed_users.is_empty() + && !sec + .allowed_users + .iter() + .any(|b| b.eq_ignore_ascii_case(login)) + { + return false; + } + if !s.general.allowed_domains.is_empty() { + let dom = login.split('@').nth(1).unwrap_or(&s.general.default_domain); + if !s + .general + .allowed_domains + .iter() + .any(|d| d.eq_ignore_ascii_case(dom)) + { + return false; + } + } + true +} + +pub enum Reply { + Wbxml(Element), + Raw(&'static str, Vec), + Empty, + Status(StatusCode), +} + +pub struct Ctx { + pub app: Arc, + pub s: Arc, + pub req: EasRequest, + pub dev: Device, + pub sess: Session, + pub ip: String, + pub items_out: u64, + pub items_in: u64, + pub status: String, + pub debug: bool, +} + +impl Ctx { + pub fn ping_key(&self) -> String { + format!("{}\u{0}{}", self.req.device_id, self.sess.login) + } + + pub fn user(&self) -> &str { + &self.sess.login + } +} + +fn unauthorized() -> Response { + let mut r = (StatusCode::UNAUTHORIZED, "Access denied").into_response(); + r.headers_mut().insert( + "WWW-Authenticate", + HeaderValue::from_static("Basic realm=\"ActiveSync\""), + ); + r +} + +fn server_headers(r: &mut Response, s: &Settings) { + let h = r.headers_mut(); + h.insert("MS-Server-ActiveSync", HeaderValue::from_static("14.1")); + h.insert("Cache-Control", HeaderValue::from_static("private")); + let _ = s; +} + +fn versions(s: &Settings) -> String { + let max = s.general.max_protocol.as_str(); + let idx = SUPPORTED_VERSIONS + .iter() + .position(|v| *v == max) + .unwrap_or(SUPPORTED_VERSIONS.len() - 1); + SUPPORTED_VERSIONS[..=idx].join(",") +} + +/// Axum handler for the ActiveSync endpoint. +pub async fn handler( + State(app): State>, + ConnectInfo(peer): ConnectInfo, + method: Method, + uri: Uri, + headers: HeaderMap, + body: Body, +) -> Response { + let s = app.settings(); + let ip = client_ip(peer, &headers, &s); + let ip_s = ip.to_string(); + if !s.security.eas_allowed_networks.is_empty() + && !util::ip_in_any(&ip, &s.security.eas_allowed_networks) + { + tracing::warn!(ip = %ip_s, "ActiveSync request from network that is not allowed"); + return (StatusCode::FORBIDDEN, "Forbidden").into_response(); + } + if method == Method::GET { + let mut r = ( + StatusCode::OK, + [("Content-Type", "text/html; charset=utf-8")], + "ActiveSync

This is an Exchange ActiveSync endpoint and can only be accessed by ActiveSync-capable devices.

", + ) + .into_response(); + server_headers(&mut r, &s); + return r; + } + if method != Method::POST && method != Method::OPTIONS { + return StatusCode::METHOD_NOT_ALLOWED.into_response(); + } + + // ---- authentication + let Some((login, password)) = basic_auth(&headers, &s) else { + return unauthorized(); + }; + let ip_key = format!("ip:{ip_s}"); + let user_key = format!("user:{login}"); + for k in [&ip_key, &user_key] { + if let Some(until) = app.auth.locked_until(k) { + app.metrics.auth_failure(); + let mut r = (StatusCode::TOO_MANY_REQUESTS, "Too many failed logins").into_response(); + if let Ok(v) = HeaderValue::from_str(&(until - now()).max(1).to_string()) { + r.headers_mut().insert("Retry-After", v); + } + return r; + } + } + if !user_allowed(&login, &s) { + tracing::warn!(user = %login, ip = %ip_s, "ActiveSync access denied by policy"); + return (StatusCode::FORBIDDEN, "Forbidden").into_response(); + } + let mut sess = app.session(&login, &password); + let cache_key = app.pool.key(&login, &password); + if !app.auth.is_cached(&cache_key) { + match sess.authenticate().await { + Ok(AuthResult::Ok) => { + app.auth.success(&user_key); + app.auth.cache_ok(cache_key, s.security.auth_cache_secs); + } + Ok(AuthResult::Denied) => { + app.metrics.auth_failure(); + if s.security.log_auth_failures { + tracing::warn!(target: "active_push::auth", "authentication failed user={login} ip={ip_s} service=activesync"); + } + let max = s.security.auth_fail_max; + let w = s.security.auth_fail_window_secs; + let l = s.security.lockout_secs; + if app.auth.fail(&ip_key, max * 3, w, l) || app.auth.fail(&user_key, max, w, l) { + tracing::warn!(user = %login, ip = %ip_s, "login locked out after repeated failures"); + db::audit( + &app.db, + "system", + "lockout", + &login, + &ip_s, + "repeated ActiveSync login failures", + ) + .await; + } + return unauthorized(); + } + Err(e) => { + tracing::error!(user = %login, "backend unavailable during authentication: {e:#}"); + let mut r = + (StatusCode::SERVICE_UNAVAILABLE, "Backend unavailable").into_response(); + if let Ok(v) = HeaderValue::from_str(&s.sync.retry_after_secs.to_string()) { + r.headers_mut().insert("Retry-After", v); + } + return r; + } + } + } + + if method == Method::OPTIONS { + let mut r = StatusCode::OK.into_response(); + server_headers(&mut r, &s); + let h = r.headers_mut(); + h.insert( + "MS-ASProtocolVersions", + HeaderValue::from_str(&versions(&s)).unwrap(), + ); + h.insert("MS-ASProtocolCommands", HeaderValue::from_static(COMMANDS)); + h.insert("Allow", HeaderValue::from_static("OPTIONS,POST")); + h.insert("Public", HeaderValue::from_static("OPTIONS,POST")); + sess.close().await; + return r; + } + + // ---- request + let req = match parse_request(&uri, &headers) { + Ok(r) => r, + Err(e) => { + tracing::info!(ip = %ip_s, "bad ActiveSync request: {e}"); + return (StatusCode::BAD_REQUEST, e).into_response(); + } + }; + let mut req = req; + if !COMMANDS.split(',').any(|c| c == req.cmd) { + req.cmd = "Unknown".into(); + } + if !valid_device_id(&req.device_id) + || !valid_device_type(&req.device_type) + || req.cmd.is_empty() + { + return (StatusCode::BAD_REQUEST, "Missing or invalid parameters").into_response(); + } + let blocked_type = s.security.blocked_device_types.iter().any(|b| { + let b = b.to_lowercase(); + !b.is_empty() + && (req.device_type.to_lowercase().contains(&b) + || req.user_agent.to_lowercase().contains(&b)) + }); + if blocked_type { + tracing::warn!(user = %login, device = %req.device_id, "device type blocked by policy"); + return (StatusCode::FORBIDDEN, "Device type not allowed").into_response(); + } + + let max_body = (s.sync.max_request_mb * 1024 * 1024) as usize; + let body = match http_body_util::Limited::new(body, max_body).collect().await { + Ok(b) => b.to_bytes(), + Err(_) => return (StatusCode::PAYLOAD_TOO_LARGE, "Request too large").into_response(), + }; + + let (dev, created) = match db::device_get_or_create( + &app.db, + &req.device_id, + &login, + &req.device_type, + &req.user_agent, + !s.security.require_device_approval, + ) + .await + { + Ok(d) => d, + Err(e) => { + tracing::error!("database error: {e:#}"); + return StatusCode::INTERNAL_SERVER_ERROR.into_response(); + } + }; + if created { + tracing::info!(user = %login, device = %req.device_id, kind = %req.device_type, "new device registered"); + db::audit( + &app.db, + &login, + "device_new", + &req.device_id, + &ip_s, + &req.user_agent, + ) + .await; + } + if dev.blocked != 0 { + return (StatusCode::FORBIDDEN, "Device blocked").into_response(); + } + if dev.approved == 0 { + tracing::info!(user = %login, device = %req.device_id, "device awaiting approval"); + return ( + StatusCode::FORBIDDEN, + "Device awaiting administrator approval", + ) + .into_response(); + } + let _ = db::device_touch( + &app.db, + dev.id, + &ip_s, + &req.cmd, + &req.version, + &req.user_agent, + &req.device_type, + ) + .await; + + let debug = s.logging.log_wbxml + || s.logging + .debug_users + .iter() + .any(|u| u.eq_ignore_ascii_case(&login)); + let started = Instant::now(); + let active_id = app.metrics.begin(ActiveRequest { + id: 0, + user: login.clone(), + device_id: req.device_id.clone(), + device_type: req.device_type.clone(), + command: req.cmd.clone(), + ip: ip_s.clone(), + started: now(), + version: req.version.clone(), + }); + + let mut ctx = Ctx { + app: app.clone(), + s: s.clone(), + req: req.clone(), + dev, + sess, + ip: ip_s.clone(), + items_out: 0, + items_in: 0, + status: String::new(), + debug, + }; + // A new request from the device ends its hanging Ping/Sync. + if ctx.req.cmd != "Ping" && ctx.req.cmd != "Sync" { + app.metrics.ping_interrupt(&ctx.ping_key()); + } + + let reply = dispatch(&mut ctx, &body).await; + let (mut resp, http, out_len) = match reply { + Ok(Reply::Wbxml(el)) => { + if ctx.debug { + tracing::info!(user = %login, cmd = %req.cmd, "response:\n{}", el.to_xml()); + } + let bytes = wbxml::encode(&el); + let n = bytes.len(); + let mut r = Response::new(Body::from(bytes)); + r.headers_mut().insert( + "Content-Type", + HeaderValue::from_static("application/vnd.ms-sync.wbxml"), + ); + (r, 200u16, n) + } + Ok(Reply::Raw(ct, bytes)) => { + let n = bytes.len(); + let mut r = Response::new(Body::from(bytes)); + r.headers_mut() + .insert("Content-Type", HeaderValue::from_static(ct)); + (r, 200, n) + } + Ok(Reply::Empty) => (StatusCode::OK.into_response(), 200, 0), + Ok(Reply::Status(code)) => (code.into_response(), code.as_u16(), 0), + Err(e) => { + tracing::error!(user = %login, device = %req.device_id, cmd = %req.cmd, "request failed: {e:#}"); + ctx.status = format!("error: {e}"); + let mut r = StatusCode::INTERNAL_SERVER_ERROR.into_response(); + if e.to_string().contains("IMAP") || e.to_string().contains("connect") { + r = StatusCode::SERVICE_UNAVAILABLE.into_response(); + if let Ok(v) = HeaderValue::from_str(&s.sync.retry_after_secs.to_string()) { + r.headers_mut().insert("Retry-After", v); + } + } + let code = r.status().as_u16(); + (r, code, 0) + } + }; + server_headers(&mut resp, &s); + let ms = started.elapsed().as_millis() as u64; + if ms > 5000 && req.cmd != "Ping" && req.cmd != "Sync" { + tracing::info!(user = %login, cmd = %req.cmd, ms, "slow request"); + } + app.metrics.end( + active_id, + Event { + ts: now(), + user: login.clone(), + device_id: req.device_id.clone(), + device_type: req.device_type.clone(), + command: req.cmd.clone(), + ip: ip_s, + http, + status: if ctx.status.is_empty() { + "ok".into() + } else { + ctx.status.clone() + }, + ms, + bytes_in: body.len() as u64, + bytes_out: out_len as u64, + items_out: ctx.items_out, + items_in: ctx.items_in, + }, + ); + ctx.sess.close().await; + resp +} + +fn needs_provisioning(cmd: &str) -> bool { + !matches!(cmd, "Provision" | "Ping") +} + +/// WBXML root/status for "device must provision" answers (AS 14+). +fn provision_status_reply(cmd: &str, status: u32) -> Option { + let (root, st) = match cmd { + "Sync" => ("AirSync:Sync", "AirSync:Status"), + "FolderSync" => ("FolderHierarchy:FolderSync", "FolderHierarchy:Status"), + "FolderCreate" => ("FolderHierarchy:FolderCreate", "FolderHierarchy:Status"), + "FolderUpdate" => ("FolderHierarchy:FolderUpdate", "FolderHierarchy:Status"), + "FolderDelete" => ("FolderHierarchy:FolderDelete", "FolderHierarchy:Status"), + "GetItemEstimate" => ("GetItemEstimate:GetItemEstimate", "GetItemEstimate:Status"), + "Ping" => ("Ping:Ping", "Ping:Status"), + "ItemOperations" => ("ItemOperations:ItemOperations", "ItemOperations:Status"), + "Settings" => ("Settings:Settings", "Settings:Status"), + "Search" => ("Search:Search", "Search:Status"), + "SendMail" => ("ComposeMail:SendMail", "ComposeMail:Status"), + "SmartReply" => ("ComposeMail:SmartReply", "ComposeMail:Status"), + "SmartForward" => ("ComposeMail:SmartForward", "ComposeMail:Status"), + "MeetingResponse" => ("MeetingResponse:MeetingResponse", "MeetingResponse:Status"), + "ResolveRecipients" => ( + "ResolveRecipients:ResolveRecipients", + "ResolveRecipients:Status", + ), + "MoveItems" => ("Move:MoveItems", "Move:Status"), + _ => return None, + }; + Some(Element::new(root).with_text(st, status.to_string())) +} + +async fn dispatch(ctx: &mut Ctx, body: &[u8]) -> anyhow::Result { + // ---- provisioning enforcement + let wipe_pending = matches!( + ctx.dev.wipe_status, + db::WIPE_PENDING + | db::WIPE_REQUESTED + | db::WIPE_ACCOUNT_PENDING + | db::WIPE_ACCOUNT_REQUESTED + ); + if ctx.s.provisioning.enabled + && (needs_provisioning(&ctx.req.cmd) || (wipe_pending && ctx.req.cmd != "Provision")) + { + let sent = ctx.req.policy_key; + let current = ctx.dev.policy_key as u32; + let policy_changed = !provision::policy_hash_matches(ctx); + let ok = match sent { + Some(k) => k != 0 && k == current && !policy_changed && !wipe_pending, + None => ctx.s.provisioning.loose && !wipe_pending, + }; + if !ok { + ctx.status = "provisioning required".into(); + tracing::info!(user = %ctx.user(), device = %ctx.req.device_id, "provisioning required"); + if ctx.req.ver() >= 140 { + let code = if wipe_pending { + 140 + } else if sent.map(|k| k != 0).unwrap_or(false) { + 144 + } else { + 142 + }; + if let Some(e) = provision_status_reply(&ctx.req.cmd, code) { + return Ok(Reply::Wbxml(e)); + } + } + return Ok(Reply::Status(StatusCode::from_u16(449).unwrap())); + } + } + + // ---- plain-input commands (AS < 14 SendMail family uses raw MIME) + let is_mime = ctx + .req + .content_type + .to_ascii_lowercase() + .starts_with("message/rfc822"); + let req_el = if body.is_empty() || is_mime || ctx.req.cmd == "GetAttachment" { + None + } else { + match wbxml::decode(body) { + Ok(e) => { + if ctx.debug { + tracing::info!(user = %ctx.user(), cmd = %ctx.req.cmd, "request:\n{}", e.to_xml()); + } + Some(e) + } + Err(err) => { + tracing::info!(user = %ctx.user(), cmd = %ctx.req.cmd, "invalid WBXML: {err}"); + ctx.status = "invalid wbxml".into(); + return Ok(Reply::Status(StatusCode::BAD_REQUEST)); + } + } + }; + + match ctx.req.cmd.as_str() { + "Provision" => provision::provision(ctx, req_el).await, + "FolderSync" => folders::folder_sync(ctx, req_el).await, + "FolderCreate" | "FolderUpdate" | "FolderDelete" => { + folders::folder_change(ctx, req_el).await + } + "GetHierarchy" => folders::get_hierarchy(ctx).await, + "Sync" => sync::sync(ctx, req_el).await, + "GetItemEstimate" => sync::get_item_estimate(ctx, req_el).await, + "Ping" => ping::ping(ctx, req_el).await, + "MoveItems" => sync::move_items(ctx, req_el).await, + "SendMail" | "SmartReply" | "SmartForward" => mailcmd::send_mail(ctx, req_el, body).await, + "GetAttachment" => itemops::get_attachment(ctx).await, + "ItemOperations" => itemops::item_operations(ctx, req_el).await, + "Settings" => misc::settings(ctx, req_el).await, + "Search" => misc::search(ctx, req_el).await, + "ResolveRecipients" => misc::resolve_recipients(ctx, req_el).await, + "MeetingResponse" => mailcmd::meeting_response(ctx, req_el).await, + "ValidateCert" => Ok(Reply::Wbxml( + Element::new("ValidateCert:ValidateCert").with_text("ValidateCert:Status", "1"), + )), + other => { + tracing::info!(cmd = other, "unsupported ActiveSync command"); + ctx.status = "not implemented".into(); + Ok(Reply::Status(StatusCode::NOT_IMPLEMENTED)) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn base64_query() { + // version 14.1, Sync (0), locale 0x0409, devid "abc", pk 4 bytes, type "iPhone", User "jan" + let mut b = vec![141u8, 0, 0x09, 0x04, 3]; + b.extend_from_slice(b"abc"); + b.push(4); + b.extend_from_slice(&7u32.to_le_bytes()); + b.push(6); + b.extend_from_slice(b"iPhone"); + b.extend_from_slice(&[8, 3]); + b.extend_from_slice(b"jan"); + let q = base64::engine::general_purpose::STANDARD.encode(&b); + let uri: Uri = format!("/Microsoft-Server-ActiveSync?{q}").parse().unwrap(); + let r = parse_request(&uri, &HeaderMap::new()).unwrap(); + assert_eq!(r.cmd, "Sync"); + assert_eq!(r.version, "14.1"); + assert_eq!(r.device_id, "abc"); + assert_eq!(r.policy_key, Some(7)); + assert_eq!(r.device_type, "iPhone"); + assert_eq!(r.user, "jan"); + } + + #[test] + fn plain_query() { + let uri: Uri = "/Microsoft-Server-ActiveSync?Cmd=FolderSync&User=jan&DeviceId=ABC123&DeviceType=Android" + .parse() + .unwrap(); + let mut h = HeaderMap::new(); + h.insert("MS-ASProtocolVersion", HeaderValue::from_static("14.0")); + h.insert("X-MS-PolicyKey", HeaderValue::from_static("123")); + let r = parse_request(&uri, &h).unwrap(); + assert_eq!(r.cmd, "FolderSync"); + assert_eq!(r.ver(), 140); + assert_eq!(r.policy_key, Some(123)); + } + + #[test] + fn login_formats() { + let mut s = Settings::default(); + s.general.default_domain = "firma.pl".into(); + s.general.login_format = LoginFormat::FullEmail; + assert_eq!(normalize_login("DOM\\Jan", &s).unwrap(), "jan@firma.pl"); + s.general.login_format = LoginFormat::LocalPart; + assert_eq!(normalize_login("jan@firma.pl", &s).unwrap(), "jan"); + assert!(normalize_login("a b", &s).is_none()); + } +} diff --git a/src/eas/ping.rs b/src/eas/ping.rs new file mode 100644 index 0000000..5f72c3a --- /dev/null +++ b/src/eas/ping.rs @@ -0,0 +1,238 @@ +//! Ping (push) and the shared "wait for changes" loop used by hanging Sync. + +use std::time::{Duration, Instant}; + +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +use super::folders::resolve; +use super::state::{self, CollectionState}; +use super::sync::{diff, effective_filter, filter_since}; +use super::{Ctx, Reply}; +use crate::backend::{BFolder, Kind}; +use crate::db; +use crate::metrics::PingInfo; +use crate::util::now; +use crate::wbxml::Element; + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PingFolder { + id: String, + class: String, +} + +fn ping_status(status: u32) -> Element { + Element::new("Ping:Ping").with_text("Ping:Status", status.to_string()) +} + +pub async fn ping(ctx: &mut Ctx, req: Option) -> Result { + let s = ctx.s.clone(); + let mut lifetime = ctx.dev.ping_lifetime.max(0) as u64; + let mut folders: Vec = + serde_json::from_str(&ctx.dev.ping_folders).unwrap_or_default(); + if let Some(r) = &req { + if let Some(h) = r.child_u32("Ping:HeartbeatInterval") { + lifetime = h as u64; + } + if let Some(f) = r.child("Ping:Folders") { + folders = f + .children_named("Ping:Folder") + .map(|x| PingFolder { + id: x.child_text("Ping:Id").unwrap_or_default(), + class: x.child_text("Ping:Class").unwrap_or_default(), + }) + .filter(|f| !f.id.is_empty()) + .collect(); + } + } + if lifetime == 0 || folders.is_empty() { + ctx.status = "ping: missing parameters".into(); + return Ok(Reply::Wbxml(ping_status(3))); + } + if lifetime < s.ping.lifetime_min || lifetime > s.ping.lifetime_max { + let lim = if lifetime < s.ping.lifetime_min { + s.ping.lifetime_min + } else { + s.ping.lifetime_max + }; + return Ok(Reply::Wbxml( + ping_status(5).with_text("Ping:HeartbeatInterval", lim.to_string()), + )); + } + if folders.len() > s.ping.max_folders { + return Ok(Reply::Wbxml( + ping_status(6).with_text("Ping:MaxFolders", s.ping.max_folders.to_string()), + )); + } + // persist for subsequent empty Pings + let fj = serde_json::to_string(&folders)?; + if fj != ctx.dev.ping_folders { + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + db::DeviceField::PingFolders, + None, + Some(&fj), + ) + .await?; + } + if lifetime as i64 != ctx.dev.ping_lifetime { + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + db::DeviceField::PingLifetime, + Some(lifetime as i64), + None, + ) + .await?; + } + let ids: Vec = folders.iter().map(|f| f.id.clone()).collect(); + match wait_for_changes(ctx, &ids, lifetime, "ping").await { + Err(e) if e.to_string() == "hierarchy" => { + ctx.status = "ping: folder sync required".into(); + Ok(Reply::Wbxml(ping_status(7))) + } + Err(e) => Err(e), + Ok(None) => { + ctx.status = "ping: no changes".into(); + Ok(Reply::Wbxml(ping_status(1))) + } + Ok(Some(changed)) => { + ctx.status = format!("ping: {} changed", changed.len()); + let mut f = Element::new("Ping:Folders"); + for c in changed { + f.push_text("Ping:Folder", c); + } + Ok(Reply::Wbxml(ping_status(2).with(f))) + } + } +} + +struct Watched { + id: String, + folder: BFolder, + sig: String, +} + +/// Does the device's latest state for `cid` differ from the backend? +async fn has_changes(ctx: &mut Ctx, cid: &str, folder: &BFolder) -> Result { + let Some((_, _, st)) = state::load_latest::(ctx, cid).await? else { + // never synced: nothing to report until the device primes the folder + return Ok(false); + }; + let filter = effective_filter(ctx, folder.kind(), st.filter); + let listing = match folder.kind() { + Kind::Tasks if filter == 8 => ctx.sess.list(folder, None).await?, + _ => ctx.sess.list(folder, filter_since(filter)).await?, + }; + if !st.meta.is_empty() && !listing.meta.is_empty() && st.meta != listing.meta { + return Ok(true); + } + let d = diff(&st.items, &listing, folder.kind()); + Ok(!(d.adds.is_empty() && d.changes.is_empty() && d.deletes.is_empty())) +} + +/// Wait until one of the collections changes. Returns Ok(None) on timeout/interruption, +/// Err("hierarchy") if a collection does not exist anymore. +pub async fn wait_for_changes( + ctx: &mut Ctx, + ids: &[String], + lifetime: u64, + kind: &'static str, +) -> Result>> { + let mut watched = Vec::new(); + for id in ids { + match resolve(ctx, id).await? { + Some(f) => watched.push(Watched { + id: id.clone(), + folder: f, + sig: String::new(), + }), + None => { + ctx.app.stale_add(ctx.dev.id, id); + if kind == "ping" { + return Err(anyhow::anyhow!("hierarchy")); + } + } + } + } + let key = ctx.ping_key(); + let (cancel, gen) = ctx.app.metrics.ping_start( + &key, + PingInfo { + user: ctx.user().to_string(), + device_id: ctx.req.device_id.clone(), + device_type: ctx.req.device_type.clone(), + started: now(), + lifetime, + folders: watched.len(), + kind, + }, + ); + let result = async { + // initial check: changes that happened while the device was not pinging + let mut changed = Vec::new(); + for w in watched.iter_mut() { + w.sig = ctx.sess.signature(&w.folder).await.unwrap_or_default(); + let st = state::load_latest::(ctx, &w.id).await?; + let stored = st.map(|(_, _, s)| s.signature).unwrap_or_default(); + if (stored.is_empty() || stored != w.sig) + && has_changes(ctx, &w.id.clone(), &w.folder.clone()).await? + { + changed.push(w.id.clone()); + } + } + if !changed.is_empty() { + return Ok(Some(changed)); + } + let deadline = Instant::now() + Duration::from_secs(lifetime.saturating_sub(5).max(5)); + let interval = Duration::from_secs(ctx.s.ping.check_interval_secs.max(5)); + let mut checks = 0u32; + loop { + let now_i = Instant::now(); + if now_i >= deadline { + return Ok(None); + } + let sleep = interval.min(deadline - now_i); + tokio::select! { + _ = tokio::time::sleep(sleep) => {} + _ = cancel.notified() => return Ok(None), + _ = ctx.app.shutdown.cancelled() => return Ok(None), + } + checks += 1; + let mut changed = Vec::new(); + for w in watched.iter_mut() { + let sig = match ctx.sess.signature(&w.folder).await { + Ok(s) => s, + Err(e) => { + tracing::debug!("ping signature failed: {e:#}"); + continue; + } + }; + if sig != w.sig { + w.sig = sig; + if has_changes(ctx, &w.id.clone(), &w.folder.clone()).await? { + changed.push(w.id.clone()); + } + } + } + if !changed.is_empty() { + return Ok(Some(changed)); + } + // every ~10 checks verify the folders still exist + if checks % 10 == 0 && kind == "ping" { + ctx.sess.invalidate_folders(); + let all = ctx.sess.folders().await?; + if watched + .iter() + .any(|w| !all.iter().any(|f| f.id == w.folder.id)) + { + return Err(anyhow::anyhow!("hierarchy")); + } + } + } + } + .await; + ctx.app.metrics.ping_end(&key, gen); + result +} diff --git a/src/eas/provision.rs b/src/eas/provision.rs new file mode 100644 index 0000000..d6cacda --- /dev/null +++ b/src/eas/provision.rs @@ -0,0 +1,346 @@ +//! Provision command (policies + remote wipe). + +use anyhow::Result; +use rand::Rng; + +use super::{Ctx, Reply}; +use crate::config::Policy; +use crate::db::{self, DeviceField, DeviceInfo}; +use crate::util::sha256_hex; +use crate::wbxml::Element; + +pub fn policy_hash(p: &Policy) -> String { + sha256_hex(serde_json::to_string(p).unwrap_or_default().as_bytes())[..16].to_string() +} + +pub fn policy_hash_matches(ctx: &Ctx) -> bool { + let p = ctx.s.policy_for(ctx.user()); + ctx.dev.policy_hash.is_empty() || ctx.dev.policy_hash == policy_hash(p) +} + +fn b(v: bool) -> &'static str { + if v { + "1" + } else { + "0" + } +} + +/// MS-ASPROV EASProvisionDoc. +pub fn provision_doc(p: &Policy, ver: u32) -> Element { + let mut d = Element::new("Provision:EASProvisionDoc"); + d.push_text("Provision:DevicePasswordEnabled", b(p.devpwenabled)); + d.push_text( + "Provision:AlphanumericDevicePasswordRequired", + b(p.alphanumpwreq), + ); + d.push_text("Provision:PasswordRecoveryEnabled", b(p.pwrecoveryenabled)); + d.push_text("Provision:DeviceEncryptionEnabled", b(p.devencenabled)); + d.push_text("Provision:AttachmentsEnabled", b(p.attenabled)); + d.push_text( + "Provision:MinDevicePasswordLength", + p.mindevpwlenngth.to_string(), + ); + d.push_text( + "Provision:MaxInactivityTimeDeviceLock", + p.maxinacttimedevlock.to_string(), + ); + d.push_text( + "Provision:MaxDevicePasswordFailedAttempts", + p.maxdevpwfailedattempts.to_string(), + ); + if p.maxattsize >= 0 { + d.push_text("Provision:MaxAttachmentSize", p.maxattsize.to_string()); + } else { + d.push(Element::new("Provision:MaxAttachmentSize")); + } + d.push_text("Provision:AllowSimpleDevicePassword", b(p.allowsimpledevpw)); + if p.devpwexpiration > 0 { + d.push_text( + "Provision:DevicePasswordExpiration", + p.devpwexpiration.to_string(), + ); + } else { + d.push(Element::new("Provision:DevicePasswordExpiration")); + } + d.push_text( + "Provision:DevicePasswordHistory", + p.devpwhistory.to_string(), + ); + if ver >= 121 { + d.push_text("Provision:AllowStorageCard", b(p.allowstoragecard)); + d.push_text("Provision:AllowCamera", b(p.allowcam)); + d.push_text("Provision:RequireDeviceEncryption", b(p.reqdevenc)); + d.push_text( + "Provision:AllowUnsignedApplications", + b(p.allowunsignedapps), + ); + d.push_text( + "Provision:AllowUnsignedInstallationPackages", + b(p.allowunsignedinstallationpackages), + ); + d.push_text( + "Provision:MinDevicePasswordComplexCharacters", + p.mindevcomplexchars.to_string(), + ); + d.push_text("Provision:AllowWiFi", b(p.allowwifi)); + d.push_text("Provision:AllowTextMessaging", b(p.allowtextmessaging)); + d.push_text("Provision:AllowPOPIMAPEmail", b(p.allowpopimapemail)); + d.push_text("Provision:AllowBluetooth", p.allowbluetooth.to_string()); + d.push_text("Provision:AllowIrDA", b(p.allowirda)); + d.push_text( + "Provision:RequireManualSyncWhenRoaming", + b(p.reqmansyncroam), + ); + d.push_text("Provision:AllowDesktopSync", b(p.allowdesktopsync)); + d.push_text( + "Provision:MaxCalendarAgeFilter", + p.maxcalagefilter.to_string(), + ); + d.push_text("Provision:AllowHTMLEmail", b(p.allowhtmlemail)); + d.push_text( + "Provision:MaxEmailAgeFilter", + p.maxemailagefilter.to_string(), + ); + if p.maxemailbodytruncsize >= 0 { + d.push_text( + "Provision:MaxEmailBodyTruncationSize", + p.maxemailbodytruncsize.to_string(), + ); + } else { + d.push(Element::new("Provision:MaxEmailBodyTruncationSize")); + } + if p.maxemailhtmlbodytruncsize >= 0 { + d.push_text( + "Provision:MaxEmailHTMLBodyTruncationSize", + p.maxemailhtmlbodytruncsize.to_string(), + ); + } else { + d.push(Element::new("Provision:MaxEmailHTMLBodyTruncationSize")); + } + d.push_text( + "Provision:RequireSignedSMIMEMessages", + b(p.reqsignedsmimemessages), + ); + d.push_text( + "Provision:RequireEncryptedSMIMEMessages", + b(p.reqencsmimemessages), + ); + d.push_text( + "Provision:RequireSignedSMIMEAlgorithm", + p.reqsignedsmimealgorithm.to_string(), + ); + d.push_text( + "Provision:RequireEncryptionSMIMEAlgorithm", + p.reqencsmimealgorithm.to_string(), + ); + d.push_text( + "Provision:AllowSMIMEEncryptionAlgorithmNegotiation", + p.allowsmimeencalgneg.to_string(), + ); + d.push_text("Provision:AllowSMIMESoftCerts", b(p.allowsmimesoftcerts)); + d.push_text("Provision:AllowBrowser", b(p.allowbrowser)); + d.push_text("Provision:AllowConsumerEmail", b(p.allowconsumeremail)); + d.push_text("Provision:AllowRemoteDesktop", b(p.allowremotedesktop)); + d.push_text("Provision:AllowInternetSharing", b(p.allowinternetsharing)); + d.push(Element::new("Provision:UnapprovedInROMApplicationList")); + d.push(Element::new("Provision:ApprovedApplicationList")); + } + d +} + +pub fn device_info_from(set: &Element) -> DeviceInfo { + let g = |n: &str| { + set.child_text(n) + .map(|s| crate::util::truncate_bytes(&s, 200).to_string()) + }; + DeviceInfo { + model: g("Settings:Model"), + imei: g("Settings:IMEI"), + friendly_name: g("Settings:FriendlyName"), + os: g("Settings:OS"), + os_language: g("Settings:OSLanguage"), + phone_number: g("Settings:PhoneNumber"), + mobile_operator: g("Settings:MobileOperator"), + user_agent: g("Settings:UserAgent"), + } +} + +fn new_key() -> u32 { + rand::thread_rng().gen_range(1_000_000..u32::MAX) +} + +pub async fn provision(ctx: &mut Ctx, req: Option) -> Result { + let Some(req) = req else { + return Ok(Reply::Wbxml( + Element::new("Provision:Provision").with_text("Provision:Status", "2"), + )); + }; + let ver = ctx.req.ver(); + let mut resp = Element::new("Provision:Provision").with_text("Provision:Status", "1"); + + if let Some(di) = req.child("Settings:DeviceInformation") { + if let Some(set) = di.child("Settings:Set") { + db::device_set_info(&ctx.app.db, ctx.dev.id, &device_info_from(set)).await?; + } + resp.push(Element::new("Settings:DeviceInformation").with_text("Settings:Status", "1")); + } + + // ---- remote wipe acknowledgement + if let Some(rw) = req + .child("Provision:RemoteWipe") + .or_else(|| req.child("Provision:AccountOnlyRemoteWipe")) + { + let st = rw.child_u32("Provision:Status").unwrap_or(0); + tracing::warn!(user = %ctx.user(), device = %ctx.req.device_id, status = st, "device acknowledged remote wipe"); + db::device_wipe_done( + &ctx.app.db, + ctx.dev.id, + if st == 1 { + db::WIPE_WIPED + } else { + db::WIPE_REQUESTED + }, + ) + .await?; + db::audit( + &ctx.app.db, + ctx.user(), + "wipe_ack", + &ctx.req.device_id, + &ctx.ip, + &format!("status {st}"), + ) + .await; + return Ok(Reply::Wbxml(resp)); + } + + let wipe = matches!(ctx.dev.wipe_status, db::WIPE_PENDING | db::WIPE_REQUESTED); + + if let Some(pol) = req.path(&["Provision:Policies", "Provision:Policy"]) { + let ptype = pol.child_text("Provision:PolicyType").unwrap_or_default(); + let mut pe = + Element::new("Provision:Policy").with_text("Provision:PolicyType", ptype.clone()); + if ptype != "MS-EAS-Provisioning-WBXML" && ptype != "MS-WAP-Provisioning-XML" { + pe.push_text("Provision:Status", "3"); + resp.push(Element::new("Provision:Policies").with(pe)); + return Ok(Reply::Wbxml(resp)); + } + if !ctx.s.provisioning.enabled { + pe.push_text("Provision:Status", "2"); + resp.push(Element::new("Provision:Policies").with(pe)); + return Ok(Reply::Wbxml(resp)); + } + let policy = ctx.s.policy_for(ctx.user()).clone(); + match pol + .child_text("Provision:PolicyKey") + .and_then(|k| k.parse::().ok()) + { + None => { + // phase 1: deliver the policy with a temporary key + let temp = new_key(); + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::PolicyTempKey, + Some(temp as i64), + None, + ) + .await?; + pe.push_text("Provision:Status", "1"); + pe.push_text("Provision:PolicyKey", temp.to_string()); + let data = if ptype == "MS-WAP-Provisioning-XML" { + Element::text( + "Provision:Data", + format!( + "", + if policy.devpwenabled { 0 } else { 1 } + ), + ) + } else { + Element::new("Provision:Data").with(provision_doc(&policy, ver)) + }; + pe.push(data); + ctx.status = "policy sent".into(); + } + Some(key) => { + // phase 2: acknowledgement + let client_status = pol.child_u32("Provision:Status").unwrap_or(1); + let ok_key = key == ctx.dev.policy_temp_key as u32 + || key == ctx.dev.policy_key as u32 + || ctx.dev.policy_temp_key == 0; + if !ok_key { + pe.push_text("Provision:Status", "5"); + } else if client_status == 1 || (client_status == 2 && ctx.s.provisioning.loose) { + let fin = new_key(); + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::PolicyKey, + Some(fin as i64), + None, + ) + .await?; + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::PolicyTempKey, + Some(0), + None, + ) + .await?; + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::PolicyName, + None, + Some(&policy.name), + ) + .await?; + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::PolicyHash, + None, + Some(&policy_hash(&policy)), + ) + .await?; + pe.push_text("Provision:Status", "1"); + pe.push_text("Provision:PolicyKey", fin.to_string()); + ctx.status = "provisioned".into(); + tracing::info!(user = %ctx.user(), device = %ctx.req.device_id, policy = %policy.name, "device provisioned"); + } else { + tracing::warn!(user = %ctx.user(), device = %ctx.req.device_id, client_status, "device could not apply policy"); + pe.push_text("Provision:Status", "1"); + pe.push_text("Provision:PolicyKey", "0"); + ctx.status = format!("device rejected policy ({client_status})"); + } + } + } + resp.push(Element::new("Provision:Policies").with(pe)); + } + + if wipe { + resp.push(Element::new("Provision:RemoteWipe")); + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + DeviceField::WipeStatus, + Some(db::WIPE_REQUESTED), + None, + ) + .await?; + db::audit( + &ctx.app.db, + "system", + "wipe_sent", + &ctx.req.device_id, + &ctx.ip, + ctx.user(), + ) + .await; + tracing::warn!(user = %ctx.user(), device = %ctx.req.device_id, "remote wipe command sent to device"); + ctx.status = "remote wipe sent".into(); + } + Ok(Reply::Wbxml(resp)) +} diff --git a/src/eas/state.rs b/src/eas/state.rs new file mode 100644 index 0000000..32b6fe7 --- /dev/null +++ b/src/eas/state.rs @@ -0,0 +1,128 @@ +//! Sync keys and persisted per-device state (folder hierarchy + item fingerprints). + +use std::collections::BTreeMap; + +use anyhow::Result; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; + +use crate::db; + +use super::convert::Options; +use super::Ctx; + +pub const HIERARCHY: &str = "h"; + +#[derive(Debug, Clone, PartialEq)] +pub enum SyncKey { + Initial, + Key { uuid: String, counter: i64 }, +} + +impl SyncKey { + pub fn parse(s: &str) -> Option { + let s = s.trim(); + if s == "0" { + return Some(SyncKey::Initial); + } + let rest = s.strip_prefix('{')?; + let (uuid, counter) = rest.split_once('}')?; + if uuid.len() != 36 || !uuid.chars().all(|c| c.is_ascii_hexdigit() || c == '-') { + return None; + } + Some(SyncKey::Key { + uuid: uuid.to_string(), + counter: counter.parse().ok()?, + }) + } +} + +pub fn make_key(uuid: &str, counter: i64) -> String { + format!("{{{uuid}}}{counter}") +} + +pub fn new_uuid() -> String { + uuid::Uuid::new_v4().to_string() +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct HierarchyState { + /// short id -> (parent short id, name, type) + pub folders: BTreeMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct CollectionState { + pub backend_id: String, + pub class: String, + pub meta: String, + pub filter: u8, + /// item id -> fingerprint, as known by the device + pub items: BTreeMap, + /// client id -> server id of the last processed Adds (idempotent retries) + pub client_ids: Vec<(String, String)>, + /// Options remembered for empty/partial Sync requests + pub options: Option, + /// last backend signature (Ping) + pub signature: String, + /// number of consecutive retries of the same key (loop detection) + pub retries: u32, + pub window: u32, +} + +pub async fn load( + ctx: &Ctx, + collection: &str, + key: &SyncKey, +) -> Result> { + let SyncKey::Key { uuid, counter } = key else { + return Ok(None); + }; + let Some(data) = db::state_get(&ctx.app.db, ctx.dev.id, collection, uuid, *counter).await? + else { + return Ok(None); + }; + Ok(serde_json::from_slice(&data).ok()) +} + +pub async fn load_latest( + ctx: &Ctx, + collection: &str, +) -> Result> { + let Some((uuid, counter, data)) = db::state_latest(&ctx.app.db, ctx.dev.id, collection).await? + else { + return Ok(None); + }; + Ok(serde_json::from_slice(&data) + .ok() + .map(|t| (uuid, counter, t))) +} + +pub async fn save( + ctx: &Ctx, + collection: &str, + uuid: &str, + counter: i64, + v: &T, +) -> Result<()> { + let data = serde_json::to_vec(v)?; + db::state_put(&ctx.app.db, ctx.dev.id, collection, uuid, counter, &data).await +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn keys() { + let u = new_uuid(); + let k = make_key(&u, 5); + assert_eq!( + SyncKey::parse(&k), + Some(SyncKey::Key { + uuid: u, + counter: 5 + }) + ); + assert_eq!(SyncKey::parse("0"), Some(SyncKey::Initial)); + assert_eq!(SyncKey::parse("garbage"), None); + } +} diff --git a/src/eas/sync.rs b/src/eas/sync.rs new file mode 100644 index 0000000..8b197a6 --- /dev/null +++ b/src/eas/sync.rs @@ -0,0 +1,1081 @@ +//! Sync, GetItemEstimate, MoveItems. + +use std::collections::{BTreeMap, HashMap}; +use std::time::{Duration, Instant}; + +use anyhow::Result; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; + +use super::convert::{self, calendar, contact, email, task, Options}; +use super::folders::resolve; +use super::state::{self, CollectionState, SyncKey}; +use super::{Ctx, Reply}; +use crate::backend::{BFolder, Kind, Listing, RawItem}; +use crate::db; +use crate::wbxml::Element; + +pub const DEFAULT_WINDOW: u32 = 100; + +// ------------------------------------------------------------------ server ids + +pub async fn server_id( + ctx: &Ctx, + collection: &str, + folder_bid: &str, + item: &str, +) -> Result { + if item.len() > 40 || item.contains(':') || item.starts_with('~') { + let n = db::item_short(&ctx.app.db, ctx.user(), folder_bid, item).await?; + Ok(format!("{collection}:~{n}")) + } else { + Ok(format!("{collection}:{item}")) + } +} + +pub async fn parse_server_id(ctx: &Ctx, sid: &str, folder_bid: &str) -> Result> { + let Some((_, item)) = sid.split_once(':') else { + return Ok(None); + }; + if let Some(n) = item.strip_prefix('~') { + let Ok(n) = n.parse::() else { + return Ok(None); + }; + return db::item_long(&ctx.app.db, ctx.user(), folder_bid, n).await; + } + Ok(Some(item.to_string())) +} + +pub fn collection_of(sid: &str) -> &str { + sid.split(':').next().unwrap_or("") +} + +// ------------------------------------------------------------------ filters + +pub fn filter_since(filter: u8) -> Option> { + let days = match filter { + 1 => 1, + 2 => 3, + 3 => 7, + 4 => 14, + 5 => 31, + 6 => 92, + 7 => 183, + _ => return None, + }; + Some(Utc::now() - chrono::Duration::days(days)) +} + +pub fn effective_filter(ctx: &Ctx, kind: Kind, requested: u8) -> u8 { + let mut f = requested; + let cap = |f: u8, max: u8| -> u8 { + if max == 0 { + f + } else if f == 0 || f > max { + max + } else { + f + } + }; + if matches!(kind, Kind::Mail | Kind::Calendar) { + f = cap(f, ctx.s.sync.filter_time_max); + let pol = ctx.s.policy_for(ctx.user()); + let pmax = if kind == Kind::Mail { + pol.maxemailagefilter + } else { + pol.maxcalagefilter + } as u8; + if ctx.s.provisioning.enabled { + f = cap(f, pmax); + } + } + if kind == Kind::Contacts { + 0 + } else if kind == Kind::Tasks { + if f == 8 { + 8 + } else { + 0 + } + } else { + f + } +} + +// ------------------------------------------------------------------ request model + +#[derive(Debug, Clone, Serialize, Deserialize, Default)] +pub struct ColReq { + pub id: String, + pub key: String, + pub class: Option, + pub get_changes: Option, + pub deletes_as_moves: Option, + pub window: Option, + pub options: Option, + #[serde(skip)] + pub commands: Option, +} + +fn parse_collection(c: &Element) -> ColReq { + let flag = |n: &str| { + c.child(n).map(|e| { + let t = e.text_value(); + t.is_empty() || t == "1" + }) + }; + ColReq { + id: c.child_text("AirSync:CollectionId").unwrap_or_default(), + key: c.child_text("AirSync:SyncKey").unwrap_or_default(), + class: c.child_text("AirSync:Class"), + get_changes: flag("AirSync:GetChanges"), + deletes_as_moves: flag("AirSync:DeletesAsMoves"), + window: c.child_u32("AirSync:WindowSize"), + options: c + .children_named("AirSync:Options") + .find(|o| { + o.child_text("AirSync:Class") + .map(|cl| cl != "SMS") + .unwrap_or(true) + }) + .map(Options::parse), + commands: c.child("AirSync:Commands").cloned(), + } +} + +struct ColResult { + el: Element, + changed: bool, +} + +// ------------------------------------------------------------------ Sync + +pub async fn sync(ctx: &mut Ctx, req: Option) -> Result { + let cached: Vec = serde_json::from_str(&ctx.dev.last_sync_request).unwrap_or_default(); + let mut wait: Option = None; + let mut global_window: Option = None; + let mut cols: Vec = Vec::new(); + match &req { + None => { + // empty Sync: repeat the previous request with current keys + if cached.is_empty() { + return Ok(Reply::Wbxml( + Element::new("AirSync:Sync").with_text("AirSync:Status", "13"), + )); + } + cols = cached.clone(); + } + Some(r) => { + wait = r + .child_u32("AirSync:Wait") + .map(|m| m as u64 * 60) + .or_else(|| r.child_u32("AirSync:HeartbeatInterval").map(|s| s as u64)); + global_window = r.child_u32("AirSync:WindowSize"); + if let Some(c) = r.child("AirSync:Collections") { + for col in c.children_named("AirSync:Collection") { + cols.push(parse_collection(col)); + } + } + let partial = r.has("AirSync:Partial"); + if partial || cols.is_empty() { + for c in &cached { + if !cols.iter().any(|x| x.id == c.id) { + cols.push(ColReq { + key: String::new(), + ..c.clone() + }); + } + } + } + if cols.is_empty() { + return Ok(Reply::Wbxml( + Element::new("AirSync:Sync").with_text("AirSync:Status", "13"), + )); + } + } + } + if let Some(w) = wait { + if w < ctx.s.sync.heartbeat_min || w > ctx.s.sync.heartbeat_max { + let lim = if w < ctx.s.sync.heartbeat_min { + ctx.s.sync.heartbeat_min + } else { + ctx.s.sync.heartbeat_max + }; + let tag = if req.as_ref().map(|r| r.has("AirSync:Wait")).unwrap_or(false) { + Element::text("AirSync:Wait", (lim / 60).to_string()) + } else { + Element::text("AirSync:HeartbeatInterval", lim.to_string()) + }; + return Ok(Reply::Wbxml( + Element::new("AirSync:Sync") + .with_text("AirSync:Status", "14") + .with(tag), + )); + } + } + // fill in missing keys / options from the latest state + for c in cols.iter_mut() { + if c.key.is_empty() { + if let Some((u, n, st)) = state::load_latest::(ctx, &c.id).await? { + c.key = state::make_key(&u, n); + if c.options.is_none() { + c.options = st.options.clone(); + } + } + } + if c.options.is_none() { + c.options = cached + .iter() + .find(|x| x.id == c.id) + .and_then(|x| x.options.clone()); + } + } + // remember the request (without commands) for empty/partial syncs + let to_cache: Vec = cols + .iter() + .map(|c| ColReq { + commands: None, + key: String::new(), + ..c.clone() + }) + .collect(); + if let Ok(j) = serde_json::to_string(&to_cache) { + if j != ctx.dev.last_sync_request { + db::device_set_field( + &ctx.app.db, + ctx.dev.id, + db::DeviceField::LastSyncRequest, + None, + Some(&j), + ) + .await?; + ctx.dev.last_sync_request = j; + } + } + + let mut budget = global_window + .unwrap_or(u32::MAX) + .min(ctx.s.sync.max_items * 4); + let mut results = Vec::new(); + let mut any_change = false; + for c in cols.iter() { + let r = sync_collection(ctx, c, &mut budget).await?; + any_change |= r.changed; + results.push(r.el); + } + + // hanging sync: no changes -> wait for backend changes + if let (false, Some(lifetime), true) = (any_change, wait, req.is_some()) { + let changed = super::ping::wait_for_changes( + ctx, + &cols.iter().map(|c| c.id.clone()).collect::>(), + lifetime, + "sync", + ) + .await?; + match changed { + None => { + ctx.status = "hanging sync: no changes".into(); + return Ok(Reply::Empty); + } + Some(_) => { + // re-run with the current keys (the device keeps its keys until it gets a response) + results.clear(); + let mut budget = global_window + .unwrap_or(u32::MAX) + .min(ctx.s.sync.max_items * 4); + for c in cols.iter() { + let mut c2 = c.clone(); + c2.commands = None; + let r = sync_collection(ctx, &c2, &mut budget).await?; + results.push(r.el); + } + } + } + } + + let mut colls = Element::new("AirSync:Collections"); + for r in results { + colls.push(r); + } + Ok(Reply::Wbxml(Element::new("AirSync:Sync").with(colls))) +} + +fn col_status(c: &ColReq, ver: u32, key: &str, status: u32) -> Element { + let mut e = Element::new("AirSync:Collection"); + if ver <= 121 { + if let Some(cl) = &c.class { + e.push_text("AirSync:Class", cl.clone()); + } + } + e.push_text("AirSync:SyncKey", key); + e.push_text("AirSync:CollectionId", c.id.clone()); + e.push_text("AirSync:Status", status.to_string()); + e +} + +async fn sync_collection(ctx: &mut Ctx, c: &ColReq, budget: &mut u32) -> Result { + let ver = ctx.req.ver(); + let Some(folder) = resolve(ctx, &c.id).await? else { + ctx.status = format!("collection {} not found", c.id); + ctx.app.stale_add(ctx.dev.id, &c.id); + return Ok(ColResult { + el: col_status(c, ver, &c.key, 12), + changed: true, + }); + }; + let kind = folder.kind(); + let Some(key) = SyncKey::parse(&c.key) else { + return Ok(ColResult { + el: col_status(c, ver, "0", 3), + changed: true, + }); + }; + let opts = c.options.clone().unwrap_or_default(); + let filter = effective_filter(ctx, kind, opts.filter_type); + + // ---- initial sync + let (uuid, counter) = match &key { + SyncKey::Initial => { + let st = CollectionState { + backend_id: folder.id.clone(), + class: kind.class().to_string(), + filter, + options: c.options.clone(), + window: c.window.unwrap_or(DEFAULT_WINDOW), + ..Default::default() + }; + let u = state::new_uuid(); + state::save(ctx, &c.id, &u, 1, &st).await?; + db::folder_stat_update( + &ctx.app.db, + ctx.dev.id, + &c.id, + &folder.name, + kind.class(), + 0, + 0, + 0, + 1, + 0, + false, + ) + .await?; + return Ok(ColResult { + el: col_status(c, ver, &state::make_key(&u, 1), 1), + changed: true, + }); + } + SyncKey::Key { uuid, counter } => (uuid.clone(), *counter), + }; + let Some(mut st): Option = state::load(ctx, &c.id, &key).await? else { + ctx.status = format!("invalid synckey for {}", c.id); + return Ok(ColResult { + el: col_status(c, ver, "0", 3), + changed: true, + }); + }; + if st.backend_id != folder.id { + return Ok(ColResult { + el: col_status(c, ver, "0", 3), + changed: true, + }); + } + if c.options.is_some() { + st.options = c.options.clone(); + } + + // ---- loop detection: same key requested again and again + let mut loop_hit = false; + let mut window = c + .window + .unwrap_or(DEFAULT_WINDOW) + .clamp(1, ctx.s.sync.max_items); + let retrying_old_key = match db::state_latest(&ctx.app.db, ctx.dev.id, &c.id).await? { + Some((u, n, _)) => u == uuid && n > counter, + None => false, + }; + if ctx.s.sync.loop_detection && retrying_old_key { + let lk = format!("{}\u{0}{}\u{0}{}", ctx.dev.id, c.id, c.key); + let n = ctx.app.loop_hit(&lk); + if n >= 3 && c.commands.is_none() { + window = (window / (1 << (n - 2).min(6))).max(1); + loop_hit = true; + tracing::warn!(user = %ctx.user(), device = %ctx.req.device_id, collection = %c.id, retries = n, window, "sync loop detected, reducing window size"); + } + } + + let mut responses = Element::new("AirSync:Responses"); + let mut items_in = 0u64; + let mut dirty = false; + + // ---- client changes + if let Some(cmds) = &c.commands { + let deletes_as_moves = c.deletes_as_moves.unwrap_or(true); + for cmd in &cmds.children { + items_in += 1; + let tag = cmd.tag(); + match tag { + "Add" => { + let client_id = cmd.child_text("AirSync:ClientId").unwrap_or_default(); + if let Some((_, sid)) = st.client_ids.iter().find(|(cid, _)| *cid == client_id) + { + responses.push( + Element::new("AirSync:Add") + .with_text("AirSync:ClientId", client_id.clone()) + .with_text("AirSync:ServerId", sid.clone()) + .with_text("AirSync:Status", "1"), + ); + continue; + } + let app = cmd.child("AirSync:ApplicationData"); + let res = match (kind, app) { + (Kind::Mail, _) | (_, None) => Err(anyhow::anyhow!("unsupported add")), + (_, Some(app)) => client_add(ctx, &folder, app).await, + }; + match res { + Ok((id, etag)) => { + let sid = server_id(ctx, &c.id, &folder.id, &id).await?; + st.items.insert(id, etag); + st.client_ids.push((client_id.clone(), sid.clone())); + dirty = true; + responses.push( + Element::new("AirSync:Add") + .with_text("AirSync:ClientId", client_id) + .with_text("AirSync:ServerId", sid) + .with_text("AirSync:Status", "1"), + ); + } + Err(e) => { + tracing::warn!(user = %ctx.user(), collection = %c.id, "client Add failed: {e:#}"); + responses.push( + Element::new("AirSync:Add") + .with_text("AirSync:ClientId", client_id) + .with_text("AirSync:Status", "6"), + ); + } + } + } + "Change" => { + let sid = cmd.child_text("AirSync:ServerId").unwrap_or_default(); + let Some(id) = parse_server_id(ctx, &sid, &folder.id).await? else { + responses.push( + Element::new("AirSync:Change") + .with_text("AirSync:ServerId", sid) + .with_text("AirSync:Status", "8"), + ); + continue; + }; + let Some(app) = cmd.child("AirSync:ApplicationData") else { + continue; + }; + match client_change(ctx, &folder, &id, app, st.items.get(&id).cloned()).await { + Ok(Some(fp)) => { + st.items.insert(id, fp); + dirty = true; + } + Ok(None) => { + // conflict: server wins, the server version will be re-sent + st.items.insert(id, "__conflict__".into()); + dirty = true; + responses.push( + Element::new("AirSync:Change") + .with_text("AirSync:ServerId", sid) + .with_text("AirSync:Status", "7"), + ); + } + Err(e) => { + tracing::warn!(user = %ctx.user(), collection = %c.id, "client Change failed: {e:#}"); + let status = if e.to_string().contains("not found") { + "8" + } else { + "6" + }; + responses.push( + Element::new("AirSync:Change") + .with_text("AirSync:ServerId", sid) + .with_text("AirSync:Status", status), + ); + } + } + } + "Delete" => { + let sid = cmd.child_text("AirSync:ServerId").unwrap_or_default(); + let Some(id) = parse_server_id(ctx, &sid, &folder.id).await? else { + continue; + }; + let r = match kind { + Kind::Mail => match id.parse::() { + Ok(uid) => ctx.sess.mail_delete(&folder, uid, deletes_as_moves).await, + Err(_) => Ok(()), + }, + _ => ctx.sess.dav_delete(&folder, &id).await, + }; + if let Err(e) = r { + tracing::warn!(user = %ctx.user(), collection = %c.id, "client Delete failed: {e:#}"); + responses.push( + Element::new("AirSync:Delete") + .with_text("AirSync:ServerId", sid) + .with_text("AirSync:Status", "8"), + ); + } + st.items.remove(&id); + dirty = true; + } + "Fetch" => { + let sid = cmd.child_text("AirSync:ServerId").unwrap_or_default(); + let id = parse_server_id(ctx, &sid, &folder.id) + .await? + .unwrap_or_default(); + let fetched = ctx + .sess + .fetch(&folder, std::slice::from_ref(&id)) + .await + .unwrap_or_default(); + let mut el = + Element::new("AirSync:Fetch").with_text("AirSync:ServerId", sid.clone()); + match fetched + .into_iter() + .next() + .and_then(|raw| convert_raw(ctx, &c.id, kind, &raw, &opts)) + { + Some(app) => { + el.push_text("AirSync:Status", "1"); + el.push(app); + ctx.items_out += 1; + } + None => el.push_text("AirSync:Status", "8"), + } + responses.push(el); + } + _ => {} + } + } + // keep only the latest batch of client ids + let keep = st.client_ids.len().saturating_sub(200); + st.client_ids.drain(..keep); + } + ctx.items_in += items_in; + + // ---- server changes + let get_changes = c.get_changes.unwrap_or(true); + let mut commands = Element::new("AirSync:Commands"); + let mut more = false; + let mut sent = 0u64; + let mut item_count = st.items.len() as i64; + let mut sig_changed = false; + if get_changes && *budget > 0 { + let sig = ctx.sess.signature(&folder).await.unwrap_or_default(); + if sig != st.signature { + st.signature = sig; + sig_changed = true; + } + let listing = match kind { + Kind::Tasks if filter == 8 => ctx.sess.list(&folder, None).await?, + _ => ctx.sess.list(&folder, filter_since(filter)).await?, + }; + if !st.meta.is_empty() && !listing.meta.is_empty() && st.meta != listing.meta { + // UIDVALIDITY changed: the device must resync this folder + tracing::info!(user = %ctx.user(), collection = %c.id, "UIDVALIDITY changed, forcing resync"); + db::state_delete_collection(&ctx.app.db, ctx.dev.id, &c.id).await?; + return Ok(ColResult { + el: col_status(c, ver, "0", 3), + changed: true, + }); + } + st.meta = listing.meta.clone(); + item_count = listing.items.len() as i64; + let soft = filter != 0 && filter != 8; + let diff = diff(&st.items, &listing, kind); + let limit = window.min(*budget) as usize; + let total = diff.deletes.len() + diff.changes.len() + diff.adds.len(); + more = total > limit; + let mut room = limit; + // deletes + for id in diff.deletes.iter().take(room) { + let sid = server_id(ctx, &c.id, &folder.id, id).await?; + commands.push( + Element::new(if soft && kind == Kind::Mail { + "AirSync:SoftDelete" + } else { + "AirSync:Delete" + }) + .with_text("AirSync:ServerId", sid), + ); + st.items.remove(id); + room -= 1; + sent += 1; + } + // changes + adds need data + let mut todo: Vec<(String, String, bool)> = Vec::new(); + for (id, fp) in diff.changes.iter() { + if todo.len() >= room { + break; + } + todo.push((id.clone(), fp.clone(), false)); + } + for (id, fp) in diff.adds.iter() { + if todo.len() >= room { + break; + } + todo.push((id.clone(), fp.clone(), true)); + } + // flag-only mail changes don't need a fetch + let mut fetch_ids = Vec::new(); + for (id, fp, add) in &todo { + if kind == Kind::Mail + && !add + && st + .items + .get(id) + .map(|o| o != "__conflict__") + .unwrap_or(false) + { + let sid = server_id(ctx, &c.id, &folder.id, id).await?; + commands.push( + Element::new("AirSync:Change") + .with_text("AirSync:ServerId", sid) + .with(email::flags_change(&email::flags_from_fingerprint(fp), ver)), + ); + st.items.insert(id.clone(), fp.clone()); + sent += 1; + } else { + fetch_ids.push(id.clone()); + } + } + let fps: HashMap = todo + .iter() + .map(|(i, f, a)| (i.clone(), (f.clone(), *a))) + .collect(); + let mut fetched: HashMap = HashMap::new(); + if !fetch_ids.is_empty() { + for raw in ctx.sess.fetch(&folder, &fetch_ids).await? { + let id = match &raw { + RawItem::Mail(m) => m.uid.to_string(), + RawItem::Dav { id, .. } => id.clone(), + }; + fetched.insert(id, raw); + } + } + for id in fetch_ids { + let (fp, is_add) = fps.get(&id).cloned().unwrap_or_default(); + let sid = server_id(ctx, &c.id, &folder.id, &id).await?; + match fetched + .get(&id) + .and_then(|raw| convert_raw(ctx, &c.id, kind, raw, &opts)) + { + Some(app) => { + let tag = if is_add && !st.items.contains_key(&id) { + "AirSync:Add" + } else { + "AirSync:Change" + }; + commands.push( + Element::new(tag) + .with_text("AirSync:ServerId", sid) + .with(app), + ); + let fp = match fetched.get(&id) { + Some(RawItem::Mail(m)) => crate::backend::mail_fingerprint(&m.flags), + Some(RawItem::Dav { etag, .. }) => etag.clone(), + None => fp, + }; + st.items.insert(id, fp); + sent += 1; + } + None => { + if fetched.contains_key(&id) { + // unconvertible item: remember it so we don't loop on it + tracing::warn!(user = %ctx.user(), collection = %c.id, item = %id, "item could not be converted, skipping"); + st.items.insert(id, fp); + } else if st.items.contains_key(&id) { + // vanished between listing and fetch + commands.push( + Element::new("AirSync:Delete").with_text("AirSync:ServerId", sid), + ); + st.items.remove(&id); + sent += 1; + } + } + } + } + if sent > 0 || !diff.deletes.is_empty() { + dirty = true; + } + *budget = budget.saturating_sub(sent as u32); + } + ctx.items_out += sent; + + let new_key = if dirty || st.filter != filter { + st.filter = filter; + state::save(ctx, &c.id, &uuid, counter + 1, &st).await?; + state::make_key(&uuid, counter + 1) + } else { + // nothing changed: keep the key, but persist remembered options + if c.options.is_some() || sig_changed { + state::save(ctx, &c.id, &uuid, counter, &st).await?; + } + state::make_key(&uuid, counter) + }; + db::folder_stat_update( + &ctx.app.db, + ctx.dev.id, + &c.id, + &folder.name, + kind.class(), + sent as i64, + items_in as i64, + item_count, + 1, + window as i64, + loop_hit, + ) + .await?; + + let mut el = col_status(c, ver, &new_key, 1); + if !responses.children.is_empty() { + el.push(responses); + } + if more { + el.push(Element::new("AirSync:MoreAvailable")); + } + if !commands.children.is_empty() { + el.push(commands); + } + Ok(ColResult { + el, + changed: dirty || more, + }) +} + +pub struct Diff { + pub adds: Vec<(String, String)>, + pub changes: Vec<(String, String)>, + pub deletes: Vec, +} + +pub fn diff(known: &BTreeMap, listing: &Listing, kind: Kind) -> Diff { + let mut adds = Vec::new(); + let mut changes = Vec::new(); + let mut present = std::collections::HashSet::with_capacity(listing.items.len()); + for (id, fp) in &listing.items { + present.insert(id.as_str()); + match known.get(id) { + None => adds.push((id.clone(), fp.clone())), + Some(old) if old != fp => changes.push((id.clone(), fp.clone())), + _ => {} + } + } + let deletes = known + .keys() + .filter(|k| !present.contains(k.as_str())) + .cloned() + .collect(); + if kind == Kind::Mail { + // newest first + adds.sort_by_key(|(id, _)| std::cmp::Reverse(id.parse::().unwrap_or(0))); + } + Diff { + adds, + changes, + deletes, + } +} + +pub fn convert_raw( + ctx: &Ctx, + collection: &str, + kind: Kind, + raw: &RawItem, + opts: &Options, +) -> Option { + let ver = ctx.req.ver(); + let dtz = ctx.s.timezone(); + match raw { + RawItem::Mail(m) => Some( + email::to_eas( + m, + &email::MailContext { + collection, + ver, + opts, + default_tz: dtz, + }, + ) + .app, + ), + RawItem::Dav { data, .. } => match kind { + Kind::Calendar => calendar::to_eas( + data, + &calendar::CalContext { + ver, + opts, + default_tz: dtz, + user_email: &ctx.sess.email, + }, + ), + Kind::Tasks => task::to_eas(data, opts, ver, dtz), + Kind::Contacts => { + contact::to_eas(data, opts, ver, dtz, ctx.s.carddav.max_picture_kb * 1024) + } + Kind::Mail => None, + }, + } +} + +async fn client_add(ctx: &mut Ctx, folder: &BFolder, app: &Element) -> Result<(String, String)> { + let dtz = ctx.s.timezone(); + let body = match folder.kind() { + Kind::Calendar => calendar::from_eas(app, None, dtz, &ctx.sess.email.clone(), ""), + Kind::Tasks => task::from_eas(app, None, dtz), + Kind::Contacts => contact::from_eas(app, None, dtz), + Kind::Mail => None, + } + .ok_or_else(|| anyhow::anyhow!("conversion failed"))?; + ctx.sess.dav_put(folder, None, body, None).await +} + +/// Apply a client change. Ok(Some(fp)) = applied, Ok(None) = conflict (server wins). +async fn client_change( + ctx: &mut Ctx, + folder: &BFolder, + id: &str, + app: &Element, + known_fp: Option, +) -> Result> { + match folder.kind() { + Kind::Mail => { + let uid: u32 = id.parse().map_err(|_| anyhow::anyhow!("not found"))?; + let read = app.child_u32("Email:Read").map(|v| v == 1); + let flagged = app + .child("Email:Flag") + .map(|f| f.child_u32("Email:FlagStatus").unwrap_or(0) == 2); + let fp = ctx.sess.mail_set_flags(folder, uid, read, flagged).await?; + Ok(Some(fp)) + } + k => { + let cur = ctx.sess.fetch_dav(folder, id).await?; + let server_changed = known_fp.as_deref().map(|k| k != cur.etag).unwrap_or(false); + if server_changed && ctx.s.sync.server_wins { + return Ok(None); + } + let dtz = ctx.s.timezone(); + let existing = cur.data.as_deref(); + let body = match k { + Kind::Calendar => { + calendar::from_eas(app, existing, dtz, &ctx.sess.email.clone(), "") + } + Kind::Tasks => task::from_eas(app, existing, dtz), + Kind::Contacts => contact::from_eas(app, existing, dtz), + Kind::Mail => None, + } + .ok_or_else(|| anyhow::anyhow!("conversion failed"))?; + let etag = if server_changed { + None + } else { + Some(cur.etag.as_str()) + }; + match ctx + .sess + .dav_put(folder, Some(id), body, Some(etag.unwrap_or(""))) + .await + { + Ok((_, etag)) => Ok(Some(etag)), + Err(e) if e.to_string().contains("conflict") && ctx.s.sync.server_wins => Ok(None), + Err(e) => Err(e), + } + } + } +} + +// ------------------------------------------------------------------ GetItemEstimate + +pub async fn get_item_estimate(ctx: &mut Ctx, req: Option) -> Result { + let Some(req) = req else { + return Ok(Reply::Wbxml( + Element::new("GetItemEstimate:GetItemEstimate") + .with_text("GetItemEstimate:Status", "2"), + )); + }; + let mut root = Element::new("GetItemEstimate:GetItemEstimate"); + let Some(cols) = req.child("GetItemEstimate:Collections") else { + return Ok(Reply::Wbxml(root.with_text("GetItemEstimate:Status", "2"))); + }; + for c in cols.children_named("GetItemEstimate:Collection") { + let id = c + .child_text("GetItemEstimate:CollectionId") + .unwrap_or_default(); + let key_s = c.child_text("AirSync:SyncKey").unwrap_or_default(); + let filter_req = c + .child("AirSync:Options") + .map(|o| Options::parse(o).filter_type) + .or_else(|| c.child_u32("AirSync:FilterType").map(|f| f as u8)) + .unwrap_or(0); + let resp = |status: &str, est: Option| { + let mut col = Element::new("GetItemEstimate:Collection") + .with_text("GetItemEstimate:CollectionId", id.clone()); + if let Some(e) = est { + col.push_text("GetItemEstimate:Estimate", e.to_string()); + } + Element::new("GetItemEstimate:Response") + .with_text("GetItemEstimate:Status", status) + .with(col) + }; + let Some(folder) = resolve(ctx, &id).await? else { + root.push(resp("2", None)); + continue; + }; + let key = match SyncKey::parse(&key_s) { + Some(SyncKey::Initial) => { + root.push(resp("3", None)); + continue; + } + Some(k) => k, + None => { + root.push(resp("4", None)); + continue; + } + }; + let Some(st): Option = state::load(ctx, &id, &key).await? else { + root.push(resp("4", None)); + continue; + }; + let f = effective_filter(ctx, folder.kind(), filter_req); + let listing = ctx.sess.list(&folder, filter_since(f)).await?; + let d = diff(&st.items, &listing, folder.kind()); + root.push(resp( + "1", + Some(d.adds.len() + d.changes.len() + d.deletes.len()), + )); + } + Ok(Reply::Wbxml(root)) +} + +// ------------------------------------------------------------------ MoveItems + +/// Patch the latest state of a collection in place (used after moves). +async fn patch_latest( + ctx: &Ctx, + collection: &str, + f: impl FnOnce(&mut CollectionState), +) -> Result<()> { + if let Some((u, n, mut st)) = state::load_latest::(ctx, collection).await? { + f(&mut st); + state::save(ctx, collection, &u, n, &st).await?; + } + Ok(()) +} + +pub async fn move_items(ctx: &mut Ctx, req: Option) -> Result { + let mut root = Element::new("Move:MoveItems"); + let Some(req) = req else { + return Ok(Reply::Wbxml(root)); + }; + let started = Instant::now(); + for mv in req.children_named("Move:Move") { + let src_msg = mv.child_text("Move:SrcMsgId").unwrap_or_default(); + let src_fld = mv.child_text("Move:SrcFldId").unwrap_or_default(); + let dst_fld = mv.child_text("Move:DstFldId").unwrap_or_default(); + let mut resp = Element::new("Move:Response").with_text("Move:SrcMsgId", src_msg.clone()); + if started.elapsed() > Duration::from_secs(120) { + resp.push_text("Move:Status", "7"); + root.push(resp); + continue; + } + let src = resolve(ctx, &src_fld).await?; + let dst = resolve(ctx, &dst_fld).await?; + let (Some(src), Some(dst)) = (src, dst) else { + resp.push_text( + "Move:Status", + if ctx.sess.folders().await.is_ok() { + "2" + } else { + "5" + }, + ); + root.push(resp); + continue; + }; + if src.id == dst.id { + resp.push_text("Move:Status", "4"); + root.push(resp); + continue; + } + let Some(item) = parse_server_id(ctx, &src_msg, &src.id).await? else { + resp.push_text("Move:Status", "1"); + root.push(resp); + continue; + }; + let res: Result> = async { + match (src.kind(), dst.kind()) { + (Kind::Mail, Kind::Mail) => { + let uid: u32 = item.parse()?; + let new = ctx.sess.mail_move(&src, uid, &dst).await?; + Ok(new.map(|u| (u.to_string(), String::new()))) + } + (a, b) if a == b => { + let new = ctx.sess.dav_move(&src, &item, &dst).await?; + Ok(Some((new, String::new()))) + } + _ => Ok(None), + } + } + .await; + match res { + Ok(Some((new_id, _))) => { + let new_sid = server_id(ctx, &dst_fld, &dst.id, &new_id).await?; + // the device already moved the item: reflect it in its states + let item_c = item.clone(); + patch_latest(ctx, &src_fld, |st| { + st.items.remove(&item_c); + }) + .await?; + let fp = if dst.kind() == Kind::Mail { + // fingerprint will be refreshed on next sync if different + ctx.sess + .list(&dst, None) + .await + .ok() + .and_then(|l| { + l.items + .into_iter() + .find(|(i, _)| *i == new_id) + .map(|(_, f)| f) + }) + .unwrap_or_default() + } else { + ctx.sess + .fetch_dav(&dst, &new_id) + .await + .map(|r| r.etag) + .unwrap_or_default() + }; + let nid = new_id.clone(); + patch_latest(ctx, &dst_fld, |st| { + st.items.insert(nid, fp); + }) + .await?; + resp.push_text("Move:Status", "3"); + resp.push_text("Move:DstMsgId", new_sid); + ctx.items_in += 1; + } + Ok(None) => resp.push_text("Move:Status", "5"), + Err(e) => { + tracing::warn!(user = %ctx.user(), "MoveItems failed: {e:#}"); + resp.push_text( + "Move:Status", + if e.to_string().contains("not found") { + "1" + } else { + "5" + }, + ); + } + } + root.push(resp); + } + Ok(Reply::Wbxml(root)) +} + +#[allow(dead_code)] +fn _unused(_: &convert::BodyPref) {} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..82cad61 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,68 @@ +//! ActivePush - Exchange ActiveSync gateway for IMAP/SMTP + CalDAV/CardDAV (Z-Push rewrite). + +pub mod admin; +pub mod app; +pub mod autodiscover; +pub mod backend; +pub mod config; +pub mod db; +pub mod eas; +pub mod logging; +pub mod metrics; +pub mod probe; +pub mod server; +pub mod tls; +pub mod util; +pub mod wbxml; +pub mod xmltree; + +use std::sync::Arc; + +use axum::routing::any; +use axum::Router; + +/// Public (device facing) router: ActiveSync + Autodiscover. Paths match the nginx +/// locations previously routed to Z-Push. +pub fn public_router(app: Arc) -> Router { + Router::new() + .route("/Microsoft-Server-ActiveSync", any(eas::handler)) + .route("/microsoft-server-activesync", any(eas::handler)) + .route("/AutoDiscover/AutoDiscover.xml", any(autodiscover::handler)) + .route("/Autodiscover/Autodiscover.xml", any(autodiscover::handler)) + .route("/autodiscover/autodiscover.xml", any(autodiscover::handler)) + .route("/healthz", axum::routing::get(healthz)) + .route("/", axum::routing::get(index)) + .fallback(not_found) + .with_state(app) +} + +async fn index() -> impl axum::response::IntoResponse { + ( + [("Content-Type", "text/plain; charset=utf-8")], + "ActivePush - Exchange ActiveSync endpoint.\nDevices connect to /Microsoft-Server-ActiveSync.\n", + ) +} + +async fn not_found() -> impl axum::response::IntoResponse { + ( + axum::http::StatusCode::NOT_FOUND, + [("Content-Type", "text/plain; charset=utf-8")], + "Not found.\n", + ) +} + +/// Liveness + database check for load balancers and monitoring. +async fn healthz( + axum::extract::State(app): axum::extract::State>, +) -> impl axum::response::IntoResponse { + match sqlx::query_scalar::<_, i64>("SELECT 1") + .fetch_one(&app.db) + .await + { + Ok(_) => (axum::http::StatusCode::OK, "ok\n"), + Err(_) => ( + axum::http::StatusCode::SERVICE_UNAVAILABLE, + "database unavailable\n", + ), + } +} diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..2e14258 --- /dev/null +++ b/src/logging.rs @@ -0,0 +1,134 @@ +//! tracing setup + in-memory ring buffer exposed in the admin panel. + +use std::collections::VecDeque; +use std::fmt::Write as _; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::{Arc, Mutex}; + +use serde::Serialize; +use tracing::field::{Field, Visit}; +use tracing::{Event, Level, Subscriber}; +use tracing_subscriber::layer::{Context, SubscriberExt}; +use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::{EnvFilter, Layer}; + +#[derive(Debug, Clone, Serialize)] +pub struct LogLine { + pub ts: i64, + pub level: String, + pub target: String, + pub message: String, +} + +pub struct LogRing { + lines: Mutex>, + cap: AtomicUsize, +} + +impl LogRing { + pub fn new(cap: usize) -> Arc { + Arc::new(LogRing { + lines: Mutex::new(VecDeque::with_capacity(cap)), + cap: AtomicUsize::new(cap.max(100)), + }) + } + pub fn set_cap(&self, cap: usize) { + self.cap.store(cap.clamp(100, 100_000), Ordering::Relaxed); + } + pub fn push(&self, l: LogLine) { + let cap = self.cap.load(Ordering::Relaxed); + let mut g = self.lines.lock().unwrap(); + g.push_back(l); + while g.len() > cap { + g.pop_front(); + } + } + pub fn tail(&self, n: usize, min_level: Option<&str>, q: Option<&str>) -> Vec { + let rank = |l: &str| match l { + "ERROR" => 5, + "WARN" => 4, + "INFO" => 3, + "DEBUG" => 2, + _ => 1, + }; + let min = min_level.map(rank).unwrap_or(0); + let q = q.map(|s| s.to_lowercase()); + let g = self.lines.lock().unwrap(); + let mut out: Vec = g + .iter() + .rev() + .filter(|l| rank(&l.level) >= min) + .filter(|l| { + q.as_ref() + .map(|q| l.message.to_lowercase().contains(q) || l.target.contains(q)) + .unwrap_or(true) + }) + .take(n) + .cloned() + .collect(); + out.reverse(); + out + } +} + +struct RingLayer { + ring: Arc, +} + +struct MsgVisitor(String); + +impl Visit for MsgVisitor { + fn record_debug(&mut self, field: &Field, value: &dyn std::fmt::Debug) { + if field.name() == "message" { + let _ = write!(self.0, "{value:?}"); + } else { + let _ = write!(self.0, " {}={:?}", field.name(), value); + } + } + fn record_str(&mut self, field: &Field, value: &str) { + if field.name() == "message" { + self.0.push_str(value); + } else { + let _ = write!(self.0, " {}={}", field.name(), value); + } + } +} + +impl Layer for RingLayer { + fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) { + let meta = event.metadata(); + if *meta.level() > Level::INFO && !meta.target().starts_with("active_push") { + return; + } + let mut v = MsgVisitor(String::new()); + event.record(&mut v); + self.ring.push(LogLine { + ts: chrono::Utc::now().timestamp(), + level: meta.level().to_string(), + target: meta.target().to_string(), + message: v.0, + }); + } +} + +pub fn init(ring: Arc, json: bool) { + let filter = EnvFilter::try_from_default_env() + .unwrap_or_else(|_| EnvFilter::new("active_push=info,warn")); + let ring_layer = RingLayer { ring }.with_filter(EnvFilter::new( + std::env::var("ACTIVE_PUSH_PANEL_LOG").unwrap_or_else(|_| "active_push=info,warn".into()), + )); + let registry = tracing_subscriber::registry().with(ring_layer); + if json { + registry + .with(tracing_subscriber::fmt::layer().json().with_filter(filter)) + .init(); + } else { + registry + .with( + tracing_subscriber::fmt::layer() + .with_target(false) + .with_filter(filter), + ) + .init(); + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..3a78024 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,486 @@ +use std::io::Read; +use std::net::SocketAddr; +use std::path::PathBuf; +use std::sync::Arc; +use std::time::Duration; + +use anyhow::{bail, Context, Result}; +use clap::{Parser, Subcommand}; + +use active_push::app::{App, Boot}; +use active_push::{admin, db, logging, probe, public_router, server, tls}; + +#[derive(Parser)] +#[command( + name = "active-push", + version, + about = "ActivePush - Exchange ActiveSync server for IMAP/SMTP/CalDAV/CardDAV" +)] +struct Cli { + /// Data directory (SQLite database). + #[arg( + long, + env = "ACTIVE_PUSH_DATA_DIR", + default_value = "/var/lib/active-push", + global = true + )] + data_dir: PathBuf, + /// Device facing listener (put nginx/RustProxy in front of it). + #[arg( + long, + env = "ACTIVE_PUSH_EAS_LISTEN", + default_value = "127.0.0.1:8081", + global = true + )] + eas_listen: SocketAddr, + /// Administration panel listener. + #[arg( + long, + env = "ACTIVE_PUSH_ADMIN_LISTEN", + default_value = "127.0.0.1:9091", + global = true + )] + admin_listen: SocketAddr, + /// Allow the panel to listen on a non-loopback address. + #[arg(long, env = "ACTIVE_PUSH_ALLOW_REMOTE_ADMIN", global = true)] + allow_remote_admin: bool, + /// Optional TLS for the panel (PEM files). + #[arg(long, env = "ACTIVE_PUSH_ADMIN_TLS_CERT", global = true)] + admin_tls_cert: Option, + #[arg(long, env = "ACTIVE_PUSH_ADMIN_TLS_KEY", global = true)] + admin_tls_key: Option, + /// Optional TLS for the ActiveSync listener (normally TLS ends at the reverse proxy). + #[arg(long, env = "ACTIVE_PUSH_EAS_TLS_CERT", global = true)] + eas_tls_cert: Option, + #[arg(long, env = "ACTIVE_PUSH_EAS_TLS_KEY", global = true)] + eas_tls_key: Option, + /// JSON log output (for journald/ELK). + #[arg(long, env = "ACTIVE_PUSH_LOG_JSON", global = true)] + log_json: bool, + #[command(subcommand)] + cmd: Option, +} + +#[derive(Subcommand)] +enum Cmd { + /// Run the server (default). + Serve, + /// Administrator management. + Admin { + #[command(subcommand)] + cmd: AdminCmd, + }, + /// Settings import/export. + Config { + #[command(subcommand)] + cmd: ConfigCmd, + }, + /// Device management (z-push-admin equivalents). + Device { + #[command(subcommand)] + cmd: DeviceCmd, + }, + /// ActiveSync smoke test against a running server. + Probe { + #[arg(long)] + url: String, + #[arg(long)] + user: String, + /// Read the password from this environment variable (otherwise prompt). + #[arg(long)] + password_env: Option, + #[arg(long)] + insecure: bool, + /// Device id used for the test partnership. + #[arg(long, default_value = "probe0000000001")] + device_id: String, + #[arg(long, default_value = "ActivePushProbe")] + device_type: String, + /// Model reported via DeviceInformation. + #[arg(long, default_value = "ActivePush probe")] + model: String, + }, +} + +#[derive(Subcommand)] +enum AdminCmd { + /// Print a one-time setup token (valid 1 hour) for creating the first admin in the panel. + SetupToken, + /// Create the first administrator (password is prompted). + Init { + #[arg(long)] + username: String, + }, + /// Reset an administrator password and revoke all sessions. + ResetPassword { + #[arg(long)] + username: Option, + }, + /// Revoke all panel sessions. + LogoutAll, + Status, +} + +#[derive(Subcommand)] +enum ConfigCmd { + /// Print current settings as JSON (secrets redacted unless --with-secrets). + Get { + #[arg(long)] + with_secrets: bool, + }, + /// Validate and store settings from a JSON file ("-" = stdin). A running server picks + /// them up on restart; use the panel for live changes. + Apply { file: String }, + /// Validate a JSON settings file without storing it. + Validate { file: String }, +} + +#[derive(Subcommand)] +enum DeviceCmd { + List, + /// Request a remote wipe. + Wipe { + id: i64, + }, + /// Forget all sync states (device resynchronises everything). + Resync { + id: i64, + }, + Remove { + id: i64, + }, + Block { + id: i64, + }, + Unblock { + id: i64, + }, +} + +fn read_password(prompt: &str) -> Result { + let p1 = rpassword::prompt_password(prompt)?; + let p2 = rpassword::prompt_password("Repeat password: ")?; + if p1 != p2 { + bail!("passwords do not match"); + } + Ok(p1) +} + +fn read_file(f: &str) -> Result { + if f == "-" { + let mut s = String::new(); + std::io::stdin().read_to_string(&mut s)?; + Ok(s) + } else { + std::fs::read_to_string(f).with_context(|| format!("read {f}")) + } +} + +fn main() -> Result<()> { + let cli = Cli::parse(); + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()?; + rt.block_on(run(cli)) +} + +async fn run(cli: Cli) -> Result<()> { + let ring = logging::LogRing::new(2000); + let cmd = cli.cmd.unwrap_or(Cmd::Serve); + if matches!(cmd, Cmd::Serve) { + logging::init(ring.clone(), cli.log_json); + } else { + // CLI commands: quiet logging to stderr + let _ = tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::EnvFilter::new( + std::env::var("RUST_LOG").unwrap_or_else(|_| "warn".into()), + )) + .with_writer(std::io::stderr) + .try_init(); + } + if let Cmd::Probe { + url, + user, + password_env, + insecure, + device_id, + device_type, + model, + } = &cmd + { + let pass = match password_env { + Some(v) => { + std::env::var(v).with_context(|| format!("environment variable {v} not set"))? + } + None => rpassword::prompt_password("Password: ")?, + }; + return probe::run(url, user, &pass, *insecure, device_id, device_type, model).await; + } + let boot = Boot { + data_dir: cli.data_dir.clone(), + eas_listen: cli.eas_listen, + admin_listen: cli.admin_listen, + allow_remote_admin: cli.allow_remote_admin, + admin_tls: cli.admin_tls_cert.clone().zip(cli.admin_tls_key.clone()), + eas_tls: cli.eas_tls_cert.clone().zip(cli.eas_tls_key.clone()), + }; + check_data_dir_owner(&boot.data_dir)?; + let app = App::new(boot, ring).await?; + match cmd { + Cmd::Serve => serve(app).await, + Cmd::Admin { cmd } => match cmd { + AdminCmd::SetupToken => { + let t = admin::cli_setup_token(&app).await?; + println!("{t}"); + eprintln!("One-time setup token (valid 60 minutes). Open the panel and paste it to create the administrator."); + Ok(()) + } + AdminCmd::Init { username } => { + let pw = read_password("New administrator password (min. 12 characters): ")?; + admin::cli_init(&app, &username, &pw).await?; + println!("Administrator {username} created."); + Ok(()) + } + AdminCmd::ResetPassword { username } => { + let pw = read_password("New password (min. 12 characters): ")?; + let u = admin::cli_reset_password(&app, username.as_deref(), &pw).await?; + println!("Password for {u} changed; all panel sessions were revoked."); + Ok(()) + } + AdminCmd::LogoutAll => { + let n = admin::cli_logout_all(&app).await?; + println!("{n} session(s) revoked."); + Ok(()) + } + AdminCmd::Status => { + println!("{}", admin::cli_status(&app).await?); + Ok(()) + } + }, + Cmd::Config { cmd } => match cmd { + ConfigCmd::Get { with_secrets } => { + let s = app.settings(); + let v = if with_secrets { + serde_json::to_value(&*s)? + } else { + s.redacted() + }; + println!("{}", serde_json::to_string_pretty(&v)?); + Ok(()) + } + ConfigCmd::Apply { file } => { + let v: serde_json::Value = serde_json::from_str(&read_file(&file)?)?; + let s = app + .settings() + .merge_update(v) + .map_err(|e| anyhow::anyhow!(e))?; + let rev = app.update_settings(s).await?; + db::audit( + &app.db, + "cli", + "settings_saved", + "", + "cli", + &format!("revision {rev}"), + ) + .await; + println!("Settings stored (revision {rev}). Restart the service or save in the panel to apply live."); + Ok(()) + } + ConfigCmd::Validate { file } => { + let v: serde_json::Value = serde_json::from_str(&read_file(&file)?)?; + app.settings() + .merge_update(v) + .map_err(|e| anyhow::anyhow!(e))?; + println!("Settings are valid."); + Ok(()) + } + }, + Cmd::Device { cmd } => { + match cmd { + DeviceCmd::List => { + println!( + "{:>5} {:<28} {:<16} {:<30} {:<19} STATE", + "ID", "USER", "TYPE", "DEVICE ID", "LAST SEEN" + ); + for d in db::device_list(&app.db).await? { + let state = if d.blocked == 1 { + "blocked" + } else if d.wipe_status == db::WIPE_WIPED { + "wiped" + } else if d.wipe_status >= db::WIPE_PENDING { + "wipe pending" + } else if d.approved == 0 { + "awaiting approval" + } else { + "ok" + }; + println!( + "{:>5} {:<28} {:<16} {:<30} {:<19} {state}", + d.id, + d.username, + d.device_type, + d.device_id, + active_push::util::format_ts(d.last_seen) + ); + } + } + DeviceCmd::Wipe { id } => { + db::device_request_wipe(&app.db, id, "cli", false).await?; + db::audit(&app.db, "cli", "device_wipe", &id.to_string(), "cli", "").await; + println!("Remote wipe requested for device {id}; it is executed on the next device connection."); + } + DeviceCmd::Resync { id } => { + db::device_reset_states(&app.db, id).await?; + println!("States of device {id} removed."); + } + DeviceCmd::Remove { id } => { + db::device_delete(&app.db, id).await?; + println!("Device {id} removed."); + } + DeviceCmd::Block { id } => { + db::device_set_field(&app.db, id, db::DeviceField::Blocked, Some(1), None) + .await?; + println!("Device {id} blocked."); + } + DeviceCmd::Unblock { id } => { + db::device_set_field(&app.db, id, db::DeviceField::Blocked, Some(0), None) + .await?; + println!("Device {id} unblocked."); + } + } + Ok(()) + } + Cmd::Probe { .. } => unreachable!(), + } +} + +/// Refuse to touch a data directory owned by another user (e.g. `active-push admin …` run as +/// root against the service's /var/lib/active-push would leave root-owned database files). +fn check_data_dir_owner(dir: &std::path::Path) -> Result<()> { + #[cfg(target_os = "linux")] + { + use std::os::unix::fs::MetadataExt; + let Ok(meta) = std::fs::metadata(dir) else { + return Ok(()); + }; + let euid = std::fs::read_to_string("/proc/self/status") + .ok() + .and_then(|s| { + s.lines().find(|l| l.starts_with("Uid:")).and_then(|l| { + l.split_whitespace() + .nth(2) + .and_then(|v| v.parse::().ok()) + }) + }); + if let Some(euid) = euid { + if euid != meta.uid() && std::env::var("ACTIVE_PUSH_ALLOW_FOREIGN_DATA_DIR").is_err() { + bail!( + "{} belongs to uid {}, but this command runs as uid {euid}.\nRun it as the service user, e.g.: sudo -u active-push active-push …", + dir.display(), + meta.uid() + ); + } + } + } + Ok(()) +} + +async fn serve(app: Arc) -> Result<()> { + let boot = app.boot.clone(); + if !boot.admin_listen.ip().is_loopback() && !boot.allow_remote_admin { + bail!( + "refusing to expose the admin panel on {} - use a loopback address, an SSH tunnel/reverse proxy, or pass --allow-remote-admin", + boot.admin_listen + ); + } + let admin_tls = match &boot.admin_tls { + Some((c, k)) => Some(tls::server_config(c, k)?), + None => None, + }; + let eas_tls = match &boot.eas_tls { + Some((c, k)) => Some(tls::server_config(c, k)?), + None => None, + }; + let eas_l = tokio::net::TcpListener::bind(boot.eas_listen) + .await + .with_context(|| format!("bind ActiveSync listener {}", boot.eas_listen))?; + let adm_l = tokio::net::TcpListener::bind(boot.admin_listen) + .await + .with_context(|| format!("bind admin listener {}", boot.admin_listen))?; + let s = app.settings(); + tracing::info!( + version = env!("CARGO_PKG_VERSION"), + eas = %boot.eas_listen, + panel = %boot.admin_listen, + imap = %format!("{}:{}", s.imap.host, s.imap.port), + caldav = s.caldav.enabled, + carddav = s.carddav.enabled, + "ActivePush started" + ); + let has_admin: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM admins") + .fetch_one(&app.db) + .await + .unwrap_or(0); + if has_admin == 0 { + tracing::warn!( + "no administrator yet - run `active-push admin setup-token` and open the panel" + ); + } + + // background housekeeping + let bg = app.clone(); + tokio::spawn(async move { + let mut tick = tokio::time::interval(Duration::from_secs(60)); + let mut n: u64 = 0; + loop { + tokio::select! { + _ = tick.tick() => {} + _ = bg.shutdown.cancelled() => break, + } + n += 1; + let s = bg.settings(); + bg.pool + .evict_idle(Duration::from_secs(s.imap.pool_idle_secs)); + bg.auth.housekeeping(); + bg.metrics.prune(); + if n % 5 == 0 { + bg.metrics.flush_hour(&bg.db).await; + } + if n % 60 == 1 { + if let Err(e) = db::housekeeping(&bg.db, &s).await { + tracing::warn!("housekeeping failed: {e:#}"); + } + } + } + }); + + let shutdown = app.shutdown.clone(); + let eas = tokio::spawn(server::serve( + "activesync", + eas_l, + public_router(app.clone()), + eas_tls, + shutdown.clone(), + )); + let adm = tokio::spawn(server::serve( + "panel", + adm_l, + admin::router(app.clone()), + admin_tls, + shutdown.clone(), + )); + + let mut term = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())?; + tokio::select! { + _ = tokio::signal::ctrl_c() => {} + _ = term.recv() => {} + } + tracing::info!("shutdown requested"); + shutdown.cancel(); + let _ = tokio::join!(eas, adm); + app.metrics.flush_hour(&app.db).await; + app.db.close().await; + tracing::info!("bye"); + Ok(()) +} diff --git a/src/metrics.rs b/src/metrics.rs new file mode 100644 index 0000000..846ce5b --- /dev/null +++ b/src/metrics.rs @@ -0,0 +1,479 @@ +//! In-memory metrics, live request registry and per-device ping tracking. + +use std::collections::{HashMap, VecDeque}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, Mutex}; + +use serde::Serialize; +use tokio::sync::{broadcast, Notify}; + +use crate::db::Db; +use crate::util::now; + +#[derive(Default)] +pub struct Counters { + pub requests: AtomicU64, + pub errors: AtomicU64, + pub auth_failures: AtomicU64, + pub bytes_in: AtomicU64, + pub bytes_out: AtomicU64, + pub items_out: AtomicU64, + pub items_in: AtomicU64, + pub mails_sent: AtomicU64, + pub autodiscover: AtomicU64, +} + +#[derive(Debug, Clone, Default, Serialize)] +pub struct CmdStat { + pub count: u64, + pub errors: u64, + pub total_ms: u64, + pub max_ms: u64, +} + +#[derive(Debug, Clone, Default, Serialize)] +pub struct Bucket { + pub t: i64, + pub requests: u64, + pub errors: u64, + pub auth_failures: u64, + pub items_out: u64, + pub items_in: u64, + pub bytes_in: u64, + pub bytes_out: u64, + pub total_ms: u64, + pub pings: u64, + pub mails_sent: u64, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ActiveRequest { + pub id: u64, + pub user: String, + pub device_id: String, + pub device_type: String, + pub command: String, + pub ip: String, + pub started: i64, + pub version: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct Event { + pub ts: i64, + pub user: String, + pub device_id: String, + pub device_type: String, + pub command: String, + pub ip: String, + pub http: u16, + pub status: String, + pub ms: u64, + pub bytes_in: u64, + pub bytes_out: u64, + pub items_out: u64, + pub items_in: u64, +} + +#[derive(Debug, Clone, Serialize)] +pub struct PingInfo { + pub user: String, + pub device_id: String, + pub device_type: String, + pub started: i64, + pub lifetime: u64, + pub folders: usize, + pub kind: &'static str, +} + +struct PingSlot { + info: PingInfo, + cancel: Arc, + gen: u64, +} + +pub struct Metrics { + pub c: Counters, + commands: Mutex>, + minutes: Mutex>, + hour_acc: Mutex<(i64, Bucket, HashMap)>, + active: Mutex>, + next_id: AtomicU64, + recent: Mutex>, + pub events: broadcast::Sender, + pings: Mutex>, + ping_gen: AtomicU64, + users_seen: Mutex>, +} + +impl Default for Metrics { + fn default() -> Self { + Self::new() + } +} + +impl Metrics { + pub fn new() -> Self { + let (tx, _) = broadcast::channel(512); + Metrics { + c: Counters::default(), + commands: Mutex::new(HashMap::new()), + minutes: Mutex::new(VecDeque::with_capacity(1441)), + hour_acc: Mutex::new((now() / 3600 * 3600, Bucket::default(), HashMap::new())), + active: Mutex::new(HashMap::new()), + next_id: AtomicU64::new(1), + recent: Mutex::new(VecDeque::with_capacity(501)), + events: tx, + pings: Mutex::new(HashMap::new()), + ping_gen: AtomicU64::new(1), + users_seen: Mutex::new(HashMap::new()), + } + } + + fn with_bucket(&self, f: impl FnOnce(&mut Bucket)) { + let minute = now() / 60 * 60; + let mut m = self.minutes.lock().unwrap(); + if m.back().map(|b| b.t) != Some(minute) { + m.push_back(Bucket { + t: minute, + ..Default::default() + }); + while m.len() > 1440 { + m.pop_front(); + } + } + f(m.back_mut().unwrap()); + } + + pub fn begin(&self, r: ActiveRequest) -> u64 { + let id = self.next_id.fetch_add(1, Ordering::Relaxed); + let mut r = r; + r.id = id; + if !r.user.is_empty() { + self.users_seen + .lock() + .unwrap() + .insert(r.user.clone(), now()); + } + self.active.lock().unwrap().insert(id, r); + id + } + + pub fn end(&self, id: u64, ev: Event) { + self.active.lock().unwrap().remove(&id); + self.record(ev); + } + + pub fn record(&self, ev: Event) { + let failed = ev.http >= 500 || ev.status.starts_with("error"); + self.c.requests.fetch_add(1, Ordering::Relaxed); + if failed { + self.c.errors.fetch_add(1, Ordering::Relaxed); + } + self.c.bytes_in.fetch_add(ev.bytes_in, Ordering::Relaxed); + self.c.bytes_out.fetch_add(ev.bytes_out, Ordering::Relaxed); + self.c.items_out.fetch_add(ev.items_out, Ordering::Relaxed); + self.c.items_in.fetch_add(ev.items_in, Ordering::Relaxed); + { + let mut cmds = self.commands.lock().unwrap(); + let s = cmds.entry(ev.command.clone()).or_default(); + s.count += 1; + if failed { + s.errors += 1; + } + // pings/hanging syncs would skew latency + if ev.command != "Ping" { + s.total_ms += ev.ms; + s.max_ms = s.max_ms.max(ev.ms); + } + } + let is_ping = ev.command == "Ping"; + self.with_bucket(|b| { + b.requests += 1; + if failed { + b.errors += 1; + } + b.items_out += ev.items_out; + b.items_in += ev.items_in; + b.bytes_in += ev.bytes_in; + b.bytes_out += ev.bytes_out; + if is_ping { + b.pings += 1; + } else { + b.total_ms += ev.ms; + } + }); + { + let mut h = self.hour_acc.lock().unwrap(); + h.1.requests += 1; + if failed { + h.1.errors += 1; + } + h.1.bytes_in += ev.bytes_in; + h.1.bytes_out += ev.bytes_out; + h.1.items_out += ev.items_out; + h.1.items_in += ev.items_in; + if !is_ping { + h.1.total_ms += ev.ms; + } + *h.2.entry(ev.command.clone()).or_default() += 1; + } + { + let mut r = self.recent.lock().unwrap(); + r.push_back(ev.clone()); + while r.len() > 500 { + r.pop_front(); + } + } + let _ = self.events.send(ev); + } + + pub fn auth_failure(&self) { + self.c.auth_failures.fetch_add(1, Ordering::Relaxed); + self.with_bucket(|b| b.auth_failures += 1); + self.hour_acc.lock().unwrap().1.auth_failures += 1; + } + + pub fn mail_sent(&self) { + self.c.mails_sent.fetch_add(1, Ordering::Relaxed); + self.with_bucket(|b| b.mails_sent += 1); + self.hour_acc.lock().unwrap().1.mails_sent += 1; + } + + pub fn active(&self) -> Vec { + let mut v: Vec<_> = self.active.lock().unwrap().values().cloned().collect(); + v.sort_by_key(|a| a.started); + v + } + + pub fn recent(&self, n: usize) -> Vec { + let r = self.recent.lock().unwrap(); + r.iter().rev().take(n).cloned().collect() + } + + pub fn minutes(&self, n: usize) -> Vec { + let m = self.minutes.lock().unwrap(); + let skip = m.len().saturating_sub(n); + m.iter().skip(skip).cloned().collect() + } + + pub fn commands(&self) -> HashMap { + self.commands.lock().unwrap().clone() + } + + /// Drop per-user activity entries older than a day (bounded memory). + pub fn prune(&self) { + let cutoff = now() - 86400; + self.users_seen.lock().unwrap().retain(|_, t| *t >= cutoff); + } + + pub fn users_active(&self, window_secs: i64) -> usize { + let cutoff = now() - window_secs; + self.users_seen + .lock() + .unwrap() + .values() + .filter(|t| **t >= cutoff) + .count() + } + + // ---------------------------------------------------------------- pings + + /// Register a hanging request for a device. Any previous hanging request of the same + /// device is cancelled (the device opened a new connection). + pub fn ping_start(&self, key: &str, info: PingInfo) -> (Arc, u64) { + let gen = self.ping_gen.fetch_add(1, Ordering::Relaxed); + let cancel = Arc::new(Notify::new()); + let mut p = self.pings.lock().unwrap(); + if let Some(old) = p.insert( + key.to_string(), + PingSlot { + info, + cancel: cancel.clone(), + gen, + }, + ) { + old.cancel.notify_one(); + } + (cancel, gen) + } + + pub fn ping_end(&self, key: &str, gen: u64) { + let mut p = self.pings.lock().unwrap(); + if p.get(key).map(|s| s.gen) == Some(gen) { + p.remove(key); + } + } + + /// A new request from a device interrupts its hanging Ping/Sync. + pub fn ping_interrupt(&self, key: &str) { + if let Some(s) = self.pings.lock().unwrap().remove(key) { + s.cancel.notify_one(); + } + } + + pub fn pings(&self) -> Vec { + self.pings + .lock() + .unwrap() + .values() + .map(|s| s.info.clone()) + .collect() + } + + pub fn ping_count(&self) -> usize { + self.pings.lock().unwrap().len() + } + + // ---------------------------------------------------------------- persistence + + /// Flush the current hour accumulator into SQLite (called periodically). + pub async fn flush_hour(&self, db: &Db) { + let (hour, b, cmds) = { + let mut h = self.hour_acc.lock().unwrap(); + let cur_hour = now() / 3600 * 3600; + let snapshot = (h.0, std::mem::take(&mut h.1), std::mem::take(&mut h.2)); + h.0 = cur_hour; + snapshot + }; + if b.requests == 0 && b.auth_failures == 0 && b.mails_sent == 0 { + return; + } + // merge command json + let existing: Option = + sqlx::query_scalar("SELECT commands FROM stats_hourly WHERE hour = ?") + .bind(hour) + .fetch_optional(db) + .await + .ok() + .flatten(); + let mut merged: HashMap = existing + .and_then(|s| serde_json::from_str(&s).ok()) + .unwrap_or_default(); + for (k, v) in cmds { + *merged.entry(k).or_default() += v; + } + let _ = sqlx::query( + "INSERT INTO stats_hourly (hour, requests, errors, auth_failures, bytes_in, bytes_out, items_out, items_in, mails_sent, total_ms, commands) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(hour) DO UPDATE SET requests = requests + excluded.requests, errors = errors + excluded.errors, + auth_failures = auth_failures + excluded.auth_failures, bytes_in = bytes_in + excluded.bytes_in, + bytes_out = bytes_out + excluded.bytes_out, items_out = items_out + excluded.items_out, + items_in = items_in + excluded.items_in, mails_sent = mails_sent + excluded.mails_sent, + total_ms = total_ms + excluded.total_ms, commands = excluded.commands", + ) + .bind(hour) + .bind(b.requests as i64) + .bind(b.errors as i64) + .bind(b.auth_failures as i64) + .bind(b.bytes_in as i64) + .bind(b.bytes_out as i64) + .bind(b.items_out as i64) + .bind(b.items_in as i64) + .bind(b.mails_sent as i64) + .bind(b.total_ms as i64) + .bind(serde_json::to_string(&merged).unwrap_or_default()) + .execute(db) + .await; + } +} + +/// Simple sliding-window failure counter + lockout (per IP and per user). +pub struct AuthGuard { + fails: Mutex>>, + locked: Mutex>, + ok_cache: Mutex>, +} + +impl Default for AuthGuard { + fn default() -> Self { + AuthGuard { + fails: Mutex::new(HashMap::new()), + locked: Mutex::new(HashMap::new()), + ok_cache: Mutex::new(HashMap::new()), + } + } +} + +impl AuthGuard { + pub fn locked_until(&self, key: &str) -> Option { + let mut l = self.locked.lock().unwrap(); + match l.get(key) { + Some(t) if *t > now() => Some(*t), + Some(_) => { + l.remove(key); + None + } + None => None, + } + } + + /// Record a failure; returns true if the key just became locked. + pub fn fail(&self, key: &str, max: u32, window: u64, lockout: u64) -> bool { + let t = now(); + let mut f = self.fails.lock().unwrap(); + let q = f.entry(key.to_string()).or_default(); + q.push_back(t); + while q.front().map(|x| *x < t - window as i64).unwrap_or(false) { + q.pop_front(); + } + if max > 0 && q.len() as u32 >= max { + q.clear(); + self.locked + .lock() + .unwrap() + .insert(key.to_string(), t + lockout as i64); + return true; + } + false + } + + pub fn success(&self, key: &str) { + self.fails.lock().unwrap().remove(key); + } + + pub fn cache_ok(&self, k: [u8; 32], ttl: u64) { + if ttl > 0 { + self.ok_cache.lock().unwrap().insert(k, now() + ttl as i64); + } + } + + pub fn is_cached(&self, k: &[u8; 32]) -> bool { + self.ok_cache + .lock() + .unwrap() + .get(k) + .map(|t| *t > now()) + .unwrap_or(false) + } + + pub fn clear_cache(&self) { + self.ok_cache.lock().unwrap().clear(); + } + + pub fn lockouts(&self) -> Vec<(String, i64)> { + let t = now(); + self.locked + .lock() + .unwrap() + .iter() + .filter(|(_, v)| **v > t) + .map(|(k, v)| (k.clone(), *v)) + .collect() + } + + pub fn unlock(&self, key: &str) { + self.locked.lock().unwrap().remove(key); + self.fails.lock().unwrap().remove(key); + } + + pub fn housekeeping(&self) { + let t = now(); + self.locked.lock().unwrap().retain(|_, v| *v > t); + self.ok_cache.lock().unwrap().retain(|_, v| *v > t); + self.fails + .lock() + .unwrap() + .retain(|_, q| q.back().map(|x| *x > t - 86400).unwrap_or(false)); + } +} diff --git a/src/probe.rs b/src/probe.rs new file mode 100644 index 0000000..72f847f --- /dev/null +++ b/src/probe.rs @@ -0,0 +1,266 @@ +//! `active-push probe` - a small ActiveSync client used for smoke tests and diagnostics. + +use anyhow::{bail, Context, Result}; + +use crate::wbxml::{self, Element}; + +pub struct Probe { + http: reqwest::Client, + url: String, + user: String, + pass: String, + device: String, + pub device_type: String, + pub model: String, + pub policy_key: String, + pub version: String, +} + +impl Probe { + pub fn new(url: &str, user: &str, pass: &str, device: &str, insecure: bool) -> Result { + let http = reqwest::Client::builder() + .danger_accept_invalid_certs(insecure) + .timeout(std::time::Duration::from_secs(120)) + .build()?; + Ok(Probe { + http, + url: url.trim_end_matches('/').to_string(), + user: user.into(), + pass: pass.into(), + device: device.into(), + device_type: "ActivePushProbe".into(), + model: "ActivePush probe".into(), + policy_key: "0".into(), + version: "14.1".into(), + }) + } + + pub async fn options(&self) -> Result<(u16, String, String)> { + let r = self + .http + .request(reqwest::Method::OPTIONS, &self.url) + .basic_auth(&self.user, Some(&self.pass)) + .send() + .await?; + let h = |n: &str| { + r.headers() + .get(n) + .and_then(|v| v.to_str().ok()) + .unwrap_or("") + .to_string() + }; + Ok(( + r.status().as_u16(), + h("ms-asprotocolversions"), + h("ms-asprotocolcommands"), + )) + } + + pub async fn cmd(&self, cmd: &str, body: Option) -> Result<(u16, Option)> { + self.cmd_q(cmd, body, "").await + } + + pub async fn cmd_q( + &self, + cmd: &str, + body: Option, + extra_q: &str, + ) -> Result<(u16, Option)> { + let url = format!( + "{}?Cmd={cmd}&User={}&DeviceId={}&DeviceType={}{extra_q}", + self.url, + url::form_urlencoded::byte_serialize(self.user.as_bytes()).collect::(), + self.device, + url::form_urlencoded::byte_serialize(self.device_type.as_bytes()).collect::() + ); + let mut rb = self + .http + .post(url) + .basic_auth(&self.user, Some(&self.pass)) + .header("MS-ASProtocolVersion", &self.version) + .header("X-MS-PolicyKey", &self.policy_key) + .header("User-Agent", "ActivePush-Probe/1.0") + .header("Content-Type", "application/vnd.ms-sync.wbxml"); + if let Some(b) = body { + rb = rb.body(wbxml::encode(&b)); + } + let r = rb.send().await.with_context(|| format!("{cmd} request"))?; + let st = r.status().as_u16(); + let bytes = r.bytes().await?; + if bytes.is_empty() || st != 200 { + return Ok((st, None)); + } + Ok((st, Some(wbxml::decode(&bytes).context("decode response")?))) + } + + pub async fn provision(&mut self) -> Result { + let req = Element::new("Provision:Provision") + .with( + Element::new("Settings:DeviceInformation").with( + Element::new("Settings:Set") + .with_text("Settings:Model", self.model.clone()) + .with_text("Settings:FriendlyName", self.model.clone()) + .with_text("Settings:OS", "ActivePush probe") + .with_text("Settings:UserAgent", "ActivePush-Probe/1.0"), + ), + ) + .with( + Element::new("Provision:Policies").with( + Element::new("Provision:Policy") + .with_text("Provision:PolicyType", "MS-EAS-Provisioning-WBXML"), + ), + ); + let (_, r) = self.cmd("Provision", Some(req)).await?; + let r = r.context("empty provision response")?; + let pol = r + .path(&["Provision:Policies", "Provision:Policy"]) + .context("no policy")?; + if pol.child_text("Provision:Status").as_deref() == Some("2") { + return Ok("provisioning disabled on server".into()); + } + let temp = pol + .child_text("Provision:PolicyKey") + .context("no temp key")?; + self.policy_key = temp.clone(); + let ack = Element::new("Provision:Provision").with( + Element::new("Provision:Policies").with( + Element::new("Provision:Policy") + .with_text("Provision:PolicyType", "MS-EAS-Provisioning-WBXML") + .with_text("Provision:PolicyKey", temp) + .with_text("Provision:Status", "1"), + ), + ); + let (_, r) = self.cmd("Provision", Some(ack)).await?; + let r = r.context("empty provision ack")?; + let key = r + .path(&["Provision:Policies", "Provision:Policy"]) + .and_then(|p| p.child_text("Provision:PolicyKey")) + .context("no final key")?; + self.policy_key = key.clone(); + Ok(key) + } + + pub async fn folder_sync(&self, key: &str) -> Result { + let (st, r) = self + .cmd( + "FolderSync", + Some( + Element::new("FolderHierarchy:FolderSync") + .with_text("FolderHierarchy:SyncKey", key), + ), + ) + .await?; + r.with_context(|| format!("FolderSync returned HTTP {st}")) + } + + pub async fn sync( + &self, + collection: &str, + key: &str, + window: u32, + commands: Option, + ) -> Result { + let mut col = Element::new("AirSync:Collection") + .with_text("AirSync:SyncKey", key) + .with_text("AirSync:CollectionId", collection); + if key != "0" { + col.push(Element::new("AirSync:DeletesAsMoves")); + col.push(Element::new("AirSync:GetChanges")); + col.push_text("AirSync:WindowSize", window.to_string()); + col.push( + Element::new("AirSync:Options").with( + Element::new("AirSyncBase:BodyPreference") + .with_text("AirSyncBase:Type", "1") + .with_text("AirSyncBase:TruncationSize", "2048"), + ), + ); + } + if let Some(c) = commands { + col.push(c); + } + let req = Element::new("AirSync:Sync").with(Element::new("AirSync:Collections").with(col)); + let (st, r) = self.cmd("Sync", Some(req)).await?; + r.with_context(|| format!("Sync returned HTTP {st} without body")) + } +} + +/// Run a read-only smoke test and print a report. +pub async fn run( + url: &str, + user: &str, + pass: &str, + insecure: bool, + device_id: &str, + device_type: &str, + model: &str, +) -> Result<()> { + let mut p = Probe::new(url, user, pass, device_id, insecure)?; + p.device_type = device_type.to_string(); + p.model = model.to_string(); + let (st, vers, _) = p.options().await?; + println!("OPTIONS HTTP {st} versions: {vers}"); + if st == 401 { + bail!("authentication failed"); + } + match p.provision().await { + Ok(k) => println!("Provision policy key {k}"), + Err(e) => println!("Provision failed: {e:#}"), + } + let fs = p.folder_sync("0").await?; + let status = fs.child_text("FolderHierarchy:Status").unwrap_or_default(); + let mut inbox = None; + let mut n = 0; + if let Some(ch) = fs.child("FolderHierarchy:Changes") { + for a in ch.children_named("FolderHierarchy:Add") { + n += 1; + let t = a.child_text("FolderHierarchy:Type").unwrap_or_default(); + let name = a + .child_text("FolderHierarchy:DisplayName") + .unwrap_or_default(); + let id = a.child_text("FolderHierarchy:ServerId").unwrap_or_default(); + println!(" folder {id:>4} type {t:>2} {name}"); + if t == "2" { + inbox = Some(id); + } + } + } + println!("FolderSync status {status}, {n} folders"); + if let Some(ib) = inbox { + let s0 = p.sync(&ib, "0", 0, None).await?; + let key = s0 + .path(&["AirSync:Collections", "AirSync:Collection"]) + .and_then(|c| c.child_text("AirSync:SyncKey")) + .context("no sync key")?; + let s1 = p.sync(&ib, &key, 5, None).await?; + let col = s1 + .path(&["AirSync:Collections", "AirSync:Collection"]) + .context("no collection")?; + let adds = col + .child("AirSync:Commands") + .map(|c| c.children.len()) + .unwrap_or(0); + println!( + "Sync Inbox status {}, {adds} item(s){}", + col.child_text("AirSync:Status").unwrap_or_default(), + if col.has("AirSync:MoreAvailable") { + ", more available" + } else { + "" + } + ); + if let Some(first) = col + .child("AirSync:Commands") + .and_then(|c| c.children.first()) + { + if let Some(app) = first.child("AirSync:ApplicationData") { + println!( + " newest: {} from {}", + app.child_text("Email:Subject").unwrap_or_default(), + app.child_text("Email:From").unwrap_or_default() + ); + } + } + } + println!("OK"); + Ok(()) +} diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 0000000..eafb8f1 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,97 @@ +//! HTTP(S) listeners with graceful shutdown. + +use std::net::SocketAddr; +use std::sync::Arc; +use std::time::Duration; + +use axum::extract::ConnectInfo; +use axum::Router; +use hyper_util::rt::{TokioExecutor, TokioIo}; +use hyper_util::server::conn::auto::Builder; +use hyper_util::service::TowerToHyperService; +use tokio::net::TcpListener; +use tokio::task::JoinSet; +use tokio_util::sync::CancellationToken; + +pub async fn serve( + name: &'static str, + listener: TcpListener, + router: Router, + tls: Option>, + shutdown: CancellationToken, +) { + let acceptor = tls.map(tokio_rustls::TlsAcceptor::from); + let mut conns = JoinSet::new(); + loop { + let (stream, peer) = tokio::select! { + r = listener.accept() => match r { + Ok(x) => x, + Err(e) => { + tracing::warn!("{name}: accept failed: {e}"); + tokio::time::sleep(Duration::from_millis(100)).await; + continue; + } + }, + _ = shutdown.cancelled() => break, + }; + let _ = stream.set_nodelay(true); + let svc = router + .clone() + .layer(axum::Extension(ConnectInfo::(peer))); + let acceptor = acceptor.clone(); + let stop = shutdown.clone(); + conns.spawn(async move { + let hyper_svc = TowerToHyperService::new(svc); + let mut builder = Builder::new(TokioExecutor::new()); + builder + .http1() + .timer(hyper_util::rt::TokioTimer::new()) + .header_read_timeout(Duration::from_secs(30)) + .max_buf_size(256 * 1024); + builder.http2().max_concurrent_streams(64); + match acceptor { + Some(a) => { + let tls = match tokio::time::timeout(Duration::from_secs(15), a.accept(stream)) + .await + { + Ok(Ok(s)) => s, + _ => return, + }; + let conn = builder.serve_connection_with_upgrades(TokioIo::new(tls), hyper_svc); + tokio::pin!(conn); + tokio::select! { + _ = conn.as_mut() => {} + _ = stop.cancelled() => { + conn.as_mut().graceful_shutdown(); + let _ = tokio::time::timeout(Duration::from_secs(10), conn).await; + } + } + } + None => { + let conn = + builder.serve_connection_with_upgrades(TokioIo::new(stream), hyper_svc); + tokio::pin!(conn); + tokio::select! { + _ = conn.as_mut() => {} + _ = stop.cancelled() => { + conn.as_mut().graceful_shutdown(); + let _ = tokio::time::timeout(Duration::from_secs(10), conn).await; + } + } + } + } + }); + // reap finished connections + while let Some(r) = conns.try_join_next() { + let _ = r; + } + } + tracing::info!( + "{name}: stopping, waiting for {} connection(s)", + conns.len() + ); + let _ = tokio::time::timeout(Duration::from_secs(12), async { + while conns.join_next().await.is_some() {} + }) + .await; +} diff --git a/src/tls.rs b/src/tls.rs new file mode 100644 index 0000000..6bfd3ef --- /dev/null +++ b/src/tls.rs @@ -0,0 +1,112 @@ +//! Shared rustls client configuration (system trust store + optional insecure mode). + +use std::sync::{Arc, OnceLock}; + +use rustls::client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier}; +use rustls::pki_types::{CertificateDer, ServerName, UnixTime}; +use rustls::{ClientConfig, DigitallySignedStruct, RootCertStore, SignatureScheme}; + +fn provider() -> Arc { + Arc::new(rustls::crypto::ring::default_provider()) +} + +fn roots() -> RootCertStore { + let mut store = RootCertStore::empty(); + let native = rustls_native_certs::load_native_certs(); + for cert in native.certs { + let _ = store.add(cert); + } + if store.is_empty() { + store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned()); + } + store +} + +pub fn client_config(verify: bool) -> Arc { + static VERIFIED: OnceLock> = OnceLock::new(); + static INSECURE: OnceLock> = OnceLock::new(); + if verify { + VERIFIED + .get_or_init(|| { + Arc::new( + ClientConfig::builder_with_provider(provider()) + .with_safe_default_protocol_versions() + .expect("tls versions") + .with_root_certificates(roots()) + .with_no_client_auth(), + ) + }) + .clone() + } else { + INSECURE + .get_or_init(|| { + Arc::new( + ClientConfig::builder_with_provider(provider()) + .with_safe_default_protocol_versions() + .expect("tls versions") + .dangerous() + .with_custom_certificate_verifier(Arc::new(NoVerify)) + .with_no_client_auth(), + ) + }) + .clone() + } +} + +/// Accepts any certificate. Only used when the administrator explicitly disables +/// verification for a backend (e.g. self-signed certificate on localhost). +#[derive(Debug)] +struct NoVerify; + +impl ServerCertVerifier for NoVerify { + fn verify_server_cert( + &self, + _end_entity: &CertificateDer<'_>, + _intermediates: &[CertificateDer<'_>], + _server_name: &ServerName<'_>, + _ocsp_response: &[u8], + _now: UnixTime, + ) -> Result { + Ok(ServerCertVerified::assertion()) + } + fn verify_tls12_signature( + &self, + _message: &[u8], + _cert: &CertificateDer<'_>, + _dss: &DigitallySignedStruct, + ) -> Result { + Ok(HandshakeSignatureValid::assertion()) + } + fn verify_tls13_signature( + &self, + _message: &[u8], + _cert: &CertificateDer<'_>, + _dss: &DigitallySignedStruct, + ) -> Result { + Ok(HandshakeSignatureValid::assertion()) + } + fn supported_verify_schemes(&self) -> Vec { + rustls::crypto::ring::default_provider() + .signature_verification_algorithms + .supported_schemes() + } +} + +/// Load a PEM certificate chain + key for the optional built-in HTTPS listeners. +pub fn server_config(cert_path: &str, key_path: &str) -> anyhow::Result> { + use anyhow::Context; + let certs = rustls_pemfile::certs(&mut std::io::BufReader::new( + std::fs::File::open(cert_path).with_context(|| format!("open {cert_path}"))?, + )) + .collect::, _>>()?; + let key = rustls_pemfile::private_key(&mut std::io::BufReader::new( + std::fs::File::open(key_path).with_context(|| format!("open {key_path}"))?, + ))? + .ok_or_else(|| anyhow::anyhow!("no private key in {key_path}"))?; + let mut cfg = rustls::ServerConfig::builder_with_provider(provider()) + .with_safe_default_protocol_versions()? + .with_no_client_auth() + .with_single_cert(certs, key)?; + cfg.alpn_protocols = vec![b"h2".to_vec(), b"http/1.1".to_vec()]; + Ok(Arc::new(cfg)) +} diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..c43de64 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,276 @@ +use std::net::IpAddr; + +use rand::RngCore; +use sha2::{Digest, Sha256}; + +pub fn now() -> i64 { + chrono::Utc::now().timestamp() +} + +pub fn random_token(bytes: usize) -> String { + let mut b = vec![0u8; bytes]; + rand::rngs::OsRng.fill_bytes(&mut b); + hex::encode(b) +} + +pub fn sha256_hex(data: &[u8]) -> String { + hex::encode(Sha256::digest(data)) +} + +pub fn ct_eq(a: &[u8], b: &[u8]) -> bool { + use subtle::ConstantTimeEq; + a.len() == b.len() && bool::from(a.ct_eq(b)) +} + +#[derive(Debug, Clone, Copy)] +pub struct Cidr { + addr: IpAddr, + prefix: u8, +} + +impl Cidr { + pub fn parse(s: &str) -> Option { + let s = s.trim(); + let (a, p) = match s.split_once('/') { + Some((a, p)) => (a, Some(p)), + None => (s, None), + }; + let addr: IpAddr = a.parse().ok()?; + let max = if addr.is_ipv4() { 32 } else { 128 }; + let prefix = match p { + Some(p) => p.parse().ok().filter(|x: &u8| *x <= max)?, + None => max, + }; + Some(Cidr { addr, prefix }) + } + + pub fn contains(&self, ip: &IpAddr) -> bool { + let ip = normalize(*ip); + match (self.addr, ip) { + (IpAddr::V4(n), IpAddr::V4(i)) => { + let mask = if self.prefix == 0 { + 0 + } else { + u32::MAX << (32 - self.prefix) + }; + (u32::from(n) & mask) == (u32::from(i) & mask) + } + (IpAddr::V6(n), IpAddr::V6(i)) => { + let mask = if self.prefix == 0 { + 0 + } else { + u128::MAX << (128 - self.prefix) + }; + (u128::from(n) & mask) == (u128::from(i) & mask) + } + _ => false, + } + } +} + +pub fn normalize(ip: IpAddr) -> IpAddr { + match ip { + IpAddr::V6(v6) => v6.to_ipv4_mapped().map(IpAddr::V4).unwrap_or(ip), + v4 => v4, + } +} + +pub fn ip_in_any(ip: &IpAddr, nets: &[String]) -> bool { + nets.iter() + .filter_map(|n| Cidr::parse(n)) + .any(|c| c.contains(ip)) +} + +pub fn html_escape(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + for c in s.chars() { + match c { + '&' => out.push_str("&"), + '<' => out.push_str("<"), + '>' => out.push_str(">"), + '"' => out.push_str("""), + '\'' => out.push_str("'"), + _ => out.push(c), + } + } + out +} + +pub fn xml_escape(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + for c in s.chars() { + match c { + '&' => out.push_str("&"), + '<' => out.push_str("<"), + '>' => out.push_str(">"), + '"' => out.push_str("""), + '\'' => out.push_str("'"), + c if (c as u32) < 0x20 && c != '\n' && c != '\r' && c != '\t' => {} + _ => out.push(c), + } + } + out +} + +/// Truncate a string to at most `n` bytes on a char boundary. +pub fn truncate_bytes(s: &str, n: usize) -> &str { + if s.len() <= n { + return s; + } + let mut i = n; + while i > 0 && !s.is_char_boundary(i) { + i -= 1; + } + &s[..i] +} + +/// Convert HTML to readable plain text (used when a device wants text but only HTML exists). +pub fn html_to_text(html: &str) -> String { + let mut out = String::with_capacity(html.len() / 2); + let lower = html.to_ascii_lowercase(); + let bytes = html.as_bytes(); + let mut i = 0; + let mut skip_until: Option<&str> = None; + while i < bytes.len() { + if let Some(end) = skip_until { + if lower[i..].starts_with(end) { + skip_until = None; + i += end.len(); + } else { + i += 1; + } + continue; + } + if bytes[i] == b'<' { + let close = match html[i..].find('>') { + Some(c) => i + c, + None => break, + }; + let tag = lower[i + 1..close].trim_start_matches('/'); + let name: String = tag + .chars() + .take_while(|c| c.is_ascii_alphanumeric()) + .collect(); + match name.as_str() { + "script" => skip_until = Some(""), + "style" => skip_until = Some(""), + "head" => skip_until = Some(""), + "br" => out.push('\n'), + "p" | "div" | "tr" | "li" | "h1" | "h2" | "h3" | "h4" | "blockquote" | "table" => { + if !out.ends_with('\n') { + out.push('\n'); + } + if name == "li" && !lower[i + 1..].starts_with('/') { + out.push_str("• "); + } + } + "td" | "th" => out.push('\t'), + _ => {} + } + i = close + 1; + continue; + } + if bytes[i] == b'&' { + if let Some(semi) = html[i..].find(';').filter(|s| *s < 10) { + let ent = &html[i + 1..i + semi]; + let rep = match ent { + "nbsp" => Some(' '), + "amp" => Some('&'), + "lt" => Some('<'), + "gt" => Some('>'), + "quot" => Some('"'), + "apos" | "#39" => Some('\''), + e if e.starts_with("#x") => u32::from_str_radix(&e[2..], 16) + .ok() + .and_then(char::from_u32), + e if e.starts_with('#') => e[1..].parse().ok().and_then(char::from_u32), + _ => None, + }; + if let Some(c) = rep { + out.push(c); + i += semi + 1; + continue; + } + } + } + let ch = html[i..].chars().next().unwrap_or(' '); + if ch == '\r' || ch == '\n' || ch == '\t' { + if !out.ends_with(' ') && !out.ends_with('\n') { + out.push(' '); + } + } else { + out.push(ch); + } + i += ch.len_utf8(); + } + // collapse 3+ newlines + let mut res = String::with_capacity(out.len()); + let mut nl = 0; + for c in out.chars() { + if c == '\n' { + nl += 1; + if nl > 2 { + continue; + } + } else { + nl = 0; + } + res.push(c); + } + res.trim().to_string() +} + +pub fn text_to_html(text: &str) -> String { + let mut out = String::from("
"); + out.push_str(&html_escape(text)); + out.push_str("
"); + out +} + +/// Validate a login name received from a device. +pub fn valid_login(s: &str) -> bool { + !s.is_empty() + && s.len() <= 254 + && s.chars().all(|c| { + !c.is_control() + && !c.is_whitespace() + && !matches!(c, '/' | '\\' | '"' | '\'' | '<' | '>' | '%' | '*' | '?') + }) +} + +pub fn format_ts(ts: i64) -> String { + chrono::DateTime::from_timestamp(ts, 0) + .map(|d| d.format("%Y-%m-%d %H:%M:%S").to_string()) + .unwrap_or_default() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn cidr() { + let c = Cidr::parse("10.0.0.0/8").unwrap(); + assert!(c.contains(&"10.2.3.4".parse().unwrap())); + assert!(!c.contains(&"11.2.3.4".parse().unwrap())); + let l = Cidr::parse("127.0.0.1").unwrap(); + assert!(l.contains(&"::ffff:127.0.0.1".parse().unwrap())); + assert!(Cidr::parse("::1/128") + .unwrap() + .contains(&"::1".parse().unwrap())); + assert!(Cidr::parse("1.2.3.4/33").is_none()); + } + + #[test] + fn html2text() { + let t = html_to_text("

Hello World


a & b"); + assert_eq!(t, "Hello World\n\na & b"); + } + + #[test] + fn logins() { + assert!(valid_login("jan.kowalski@firma.pl")); + assert!(!valid_login("a b")); + assert!(!valid_login("../etc")); + } +} diff --git a/src/wbxml/codepages.rs b/src/wbxml/codepages.rs new file mode 100644 index 0000000..6978bf7 --- /dev/null +++ b/src/wbxml/codepages.rs @@ -0,0 +1,763 @@ +// Generated from Z-Push wbxmldefs.php with MS-ASWBXML standard tag names. +pub const NAMESPACES: &[&str] = &[ + "AirSync", + "Contacts", + "Email", + "AirNotify", + "Calendar", + "Move", + "GetItemEstimate", + "FolderHierarchy", + "MeetingResponse", + "Tasks", + "ResolveRecipients", + "ValidateCert", + "Contacts2", + "Ping", + "Provision", + "Search", + "GAL", + "AirSyncBase", + "Settings", + "DocumentLibrary", + "ItemOperations", + "ComposeMail", + "Email2", + "Notes", + "RightsManagement", + "Find", +]; + +pub const PAGES: &[&[(u8, &str)]] = &[ + // 0 AirSync + &[ + (0x05, "Sync"), + (0x06, "Responses"), + (0x07, "Add"), + (0x08, "Change"), + (0x09, "Delete"), + (0x0A, "Fetch"), + (0x0B, "SyncKey"), + (0x0C, "ClientId"), + (0x0D, "ServerId"), + (0x0E, "Status"), + (0x0F, "Collection"), + (0x10, "Class"), + (0x11, "Version"), + (0x12, "CollectionId"), + (0x13, "GetChanges"), + (0x14, "MoreAvailable"), + (0x15, "WindowSize"), + (0x16, "Commands"), + (0x17, "Options"), + (0x18, "FilterType"), + (0x19, "Truncation"), + (0x1A, "RTFTruncation"), + (0x1B, "Conflict"), + (0x1C, "Collections"), + (0x1D, "ApplicationData"), + (0x1E, "DeletesAsMoves"), + (0x1F, "NotifyGUID"), + (0x20, "Supported"), + (0x21, "SoftDelete"), + (0x22, "MIMESupport"), + (0x23, "MIMETruncation"), + (0x24, "Wait"), + (0x25, "Limit"), + (0x26, "Partial"), + (0x27, "ConversationMode"), + (0x28, "MaxItems"), + (0x29, "HeartbeatInterval"), + ], + // 1 Contacts + &[ + (0x05, "Anniversary"), + (0x06, "AssistantName"), + (0x07, "AssistantPhoneNumber"), + (0x08, "Birthday"), + (0x09, "Body"), + (0x0A, "BodySize"), + (0x0B, "BodyTruncated"), + (0x0C, "Business2PhoneNumber"), + (0x0D, "BusinessCity"), + (0x0E, "BusinessCountry"), + (0x0F, "BusinessPostalCode"), + (0x10, "BusinessState"), + (0x11, "BusinessStreet"), + (0x12, "BusinessFaxNumber"), + (0x13, "BusinessPhoneNumber"), + (0x14, "CarPhoneNumber"), + (0x15, "Categories"), + (0x16, "Category"), + (0x17, "Children"), + (0x18, "Child"), + (0x19, "CompanyName"), + (0x1A, "Department"), + (0x1B, "Email1Address"), + (0x1C, "Email2Address"), + (0x1D, "Email3Address"), + (0x1E, "FileAs"), + (0x1F, "FirstName"), + (0x20, "Home2PhoneNumber"), + (0x21, "HomeCity"), + (0x22, "HomeCountry"), + (0x23, "HomePostalCode"), + (0x24, "HomeState"), + (0x25, "HomeStreet"), + (0x26, "HomeFaxNumber"), + (0x27, "HomePhoneNumber"), + (0x28, "JobTitle"), + (0x29, "LastName"), + (0x2A, "MiddleName"), + (0x2B, "MobilePhoneNumber"), + (0x2C, "OfficeLocation"), + (0x2D, "OtherCity"), + (0x2E, "OtherCountry"), + (0x2F, "OtherPostalCode"), + (0x30, "OtherState"), + (0x31, "OtherStreet"), + (0x32, "PagerNumber"), + (0x33, "RadioPhoneNumber"), + (0x34, "Spouse"), + (0x35, "Suffix"), + (0x36, "Title"), + (0x37, "WebPage"), + (0x38, "YomiCompanyName"), + (0x39, "YomiFirstName"), + (0x3A, "YomiLastName"), + (0x3B, "Rtf"), + (0x3C, "Picture"), + (0x3D, "Alias"), + (0x3E, "WeightedRank"), + ], + // 2 Email + &[ + (0x05, "Attachment"), + (0x06, "Attachments"), + (0x07, "AttName"), + (0x08, "AttSize"), + (0x09, "AttOid"), + (0x0A, "AttMethod"), + (0x0B, "AttRemoved"), + (0x0C, "Body"), + (0x0D, "BodySize"), + (0x0E, "BodyTruncated"), + (0x0F, "DateReceived"), + (0x10, "DisplayName"), + (0x11, "DisplayTo"), + (0x12, "Importance"), + (0x13, "MessageClass"), + (0x14, "Subject"), + (0x15, "Read"), + (0x16, "To"), + (0x17, "Cc"), + (0x18, "From"), + (0x19, "ReplyTo"), + (0x1A, "AllDayEvent"), + (0x1B, "Categories"), + (0x1C, "Category"), + (0x1D, "DtStamp"), + (0x1E, "EndTime"), + (0x1F, "InstanceType"), + (0x20, "BusyStatus"), + (0x21, "Location"), + (0x22, "MeetingRequest"), + (0x23, "Organizer"), + (0x24, "RecurrenceId"), + (0x25, "Reminder"), + (0x26, "ResponseRequested"), + (0x27, "Recurrences"), + (0x28, "Recurrence"), + (0x29, "Type"), + (0x2A, "Until"), + (0x2B, "Occurrences"), + (0x2C, "Interval"), + (0x2D, "DayOfWeek"), + (0x2E, "DayOfMonth"), + (0x2F, "WeekOfMonth"), + (0x30, "MonthOfYear"), + (0x31, "StartTime"), + (0x32, "Sensitivity"), + (0x33, "TimeZone"), + (0x34, "GlobalObjId"), + (0x35, "ThreadTopic"), + (0x36, "MIMEData"), + (0x37, "MIMETruncated"), + (0x38, "MIMESize"), + (0x39, "InternetCPID"), + (0x3A, "Flag"), + (0x3B, "FlagStatus"), + (0x3C, "ContentClass"), + (0x3D, "FlagType"), + (0x3E, "CompleteTime"), + (0x3F, "DisallowNewTimeProposal"), + ], + // 3 AirNotify + &[ + (0x05, "Notify"), + (0x06, "Notification"), + (0x07, "Version"), + (0x08, "Lifetime"), + (0x09, "DeviceInfo"), + (0x0A, "Enable"), + (0x0B, "Folder"), + (0x0C, "ServerEntryId"), + (0x0D, "DeviceAddress"), + (0x0E, "ValidCarrierProfiles"), + (0x0F, "CarrierProfile"), + (0x10, "Status"), + (0x11, "Replies"), + (0x12, "Devices"), + (0x13, "Device"), + (0x14, "Id"), + (0x15, "Expiry"), + (0x16, "NotifyGUID"), + ], + // 4 Calendar + &[ + (0x05, "TimeZone"), + (0x06, "AllDayEvent"), + (0x07, "Attendees"), + (0x08, "Attendee"), + (0x09, "Email"), + (0x0A, "Name"), + (0x0B, "Body"), + (0x0C, "BodyTruncated"), + (0x0D, "BusyStatus"), + (0x0E, "Categories"), + (0x0F, "Category"), + (0x10, "Rtf"), + (0x11, "DtStamp"), + (0x12, "EndTime"), + (0x13, "Exception"), + (0x14, "Exceptions"), + (0x15, "Deleted"), + (0x16, "ExceptionStartTime"), + (0x17, "Location"), + (0x18, "MeetingStatus"), + (0x19, "OrganizerEmail"), + (0x1A, "OrganizerName"), + (0x1B, "Recurrence"), + (0x1C, "Type"), + (0x1D, "Until"), + (0x1E, "Occurrences"), + (0x1F, "Interval"), + (0x20, "DayOfWeek"), + (0x21, "DayOfMonth"), + (0x22, "WeekOfMonth"), + (0x23, "MonthOfYear"), + (0x24, "Reminder"), + (0x25, "Sensitivity"), + (0x26, "Subject"), + (0x27, "StartTime"), + (0x28, "UID"), + (0x29, "AttendeeStatus"), + (0x2A, "AttendeeType"), + (0x2B, "Attachment"), + (0x2C, "Attachments"), + (0x2D, "AttName"), + (0x2E, "AttSize"), + (0x2F, "AttOid"), + (0x30, "AttMethod"), + (0x31, "AttRemoved"), + (0x32, "DisplayName"), + (0x33, "DisallowNewTimeProposal"), + (0x34, "ResponseRequested"), + (0x35, "AppointmentReplyTime"), + (0x36, "ResponseType"), + (0x37, "CalendarType"), + (0x38, "IsLeapMonth"), + (0x39, "FirstDayOfWeek"), + (0x3A, "OnlineMeetingConfLink"), + (0x3B, "OnlineMeetingExternalLink"), + (0x3C, "ClientUid"), + ], + // 5 Move + &[ + (0x05, "MoveItems"), + (0x06, "Move"), + (0x07, "SrcMsgId"), + (0x08, "SrcFldId"), + (0x09, "DstFldId"), + (0x0A, "Response"), + (0x0B, "Status"), + (0x0C, "DstMsgId"), + ], + // 6 GetItemEstimate + &[ + (0x05, "GetItemEstimate"), + (0x06, "Version"), + (0x07, "Collections"), + (0x08, "Collection"), + (0x09, "Class"), + (0x0A, "CollectionId"), + (0x0B, "DateTime"), + (0x0C, "Estimate"), + (0x0D, "Response"), + (0x0E, "Status"), + ], + // 7 FolderHierarchy + &[ + (0x05, "Folders"), + (0x06, "Folder"), + (0x07, "DisplayName"), + (0x08, "ServerId"), + (0x09, "ParentId"), + (0x0A, "Type"), + (0x0B, "Response"), + (0x0C, "Status"), + (0x0D, "ContentClass"), + (0x0E, "Changes"), + (0x0F, "Add"), + (0x10, "Delete"), + (0x11, "Update"), + (0x12, "SyncKey"), + (0x13, "FolderCreate"), + (0x14, "FolderDelete"), + (0x15, "FolderUpdate"), + (0x16, "FolderSync"), + (0x17, "Count"), + (0x18, "Version"), + ], + // 8 MeetingResponse + &[ + (0x05, "CalendarId"), + (0x06, "CollectionId"), + (0x07, "MeetingResponse"), + (0x08, "RequestId"), + (0x09, "Request"), + (0x0A, "Result"), + (0x0B, "Status"), + (0x0C, "UserResponse"), + (0x0D, "Version"), + (0x0E, "InstanceId"), + (0x10, "ProposedStartTime"), + (0x11, "ProposedEndTime"), + (0x12, "SendResponse"), + ], + // 9 Tasks + &[ + (0x05, "Body"), + (0x06, "BodySize"), + (0x07, "BodyTruncated"), + (0x08, "Categories"), + (0x09, "Category"), + (0x0A, "Complete"), + (0x0B, "DateCompleted"), + (0x0C, "DueDate"), + (0x0D, "UtcDueDate"), + (0x0E, "Importance"), + (0x0F, "Recurrence"), + (0x10, "Type"), + (0x11, "Start"), + (0x12, "Until"), + (0x13, "Occurrences"), + (0x14, "Interval"), + (0x15, "DayOfMonth"), + (0x16, "DayOfWeek"), + (0x17, "WeekOfMonth"), + (0x18, "MonthOfYear"), + (0x19, "Regenerate"), + (0x1A, "DeadOccur"), + (0x1B, "ReminderSet"), + (0x1C, "ReminderTime"), + (0x1D, "Sensitivity"), + (0x1E, "StartDate"), + (0x1F, "UtcStartDate"), + (0x20, "Subject"), + (0x21, "Rtf"), + (0x22, "OrdinalDate"), + (0x23, "SubOrdinalDate"), + (0x24, "CalendarType"), + (0x25, "IsLeapMonth"), + (0x26, "FirstDayOfWeek"), + ], + // 10 ResolveRecipients + &[ + (0x05, "ResolveRecipients"), + (0x06, "Response"), + (0x07, "Status"), + (0x08, "Type"), + (0x09, "Recipient"), + (0x0A, "DisplayName"), + (0x0B, "EmailAddress"), + (0x0C, "Certificates"), + (0x0D, "Certificate"), + (0x0E, "MiniCertificate"), + (0x0F, "Options"), + (0x10, "To"), + (0x11, "CertificateRetrieval"), + (0x12, "RecipientCount"), + (0x13, "MaxCertificates"), + (0x14, "MaxAmbiguousRecipients"), + (0x15, "CertificateCount"), + (0x16, "Availability"), + (0x17, "StartTime"), + (0x18, "EndTime"), + (0x19, "MergedFreeBusy"), + (0x1A, "Picture"), + (0x1B, "MaxSize"), + (0x1C, "Data"), + (0x1D, "MaxPictures"), + ], + // 11 ValidateCert + &[ + (0x05, "ValidateCert"), + (0x06, "Certificates"), + (0x07, "Certificate"), + (0x08, "CertificateChain"), + (0x09, "CheckCRL"), + (0x0A, "Status"), + ], + // 12 Contacts2 + &[ + (0x05, "CustomerId"), + (0x06, "GovernmentId"), + (0x07, "IMAddress"), + (0x08, "IMAddress2"), + (0x09, "IMAddress3"), + (0x0A, "ManagerName"), + (0x0B, "CompanyMainPhone"), + (0x0C, "AccountName"), + (0x0D, "NickName"), + (0x0E, "MMS"), + ], + // 13 Ping + &[ + (0x05, "Ping"), + (0x06, "AutdState"), + (0x07, "Status"), + (0x08, "HeartbeatInterval"), + (0x09, "Folders"), + (0x0A, "Folder"), + (0x0B, "Id"), + (0x0C, "Class"), + (0x0D, "MaxFolders"), + (0x0E, "Version"), + ], + // 14 Provision + &[ + (0x05, "Provision"), + (0x06, "Policies"), + (0x07, "Policy"), + (0x08, "PolicyType"), + (0x09, "PolicyKey"), + (0x0A, "Data"), + (0x0B, "Status"), + (0x0C, "RemoteWipe"), + (0x0D, "EASProvisionDoc"), + (0x0E, "DevicePasswordEnabled"), + (0x0F, "AlphanumericDevicePasswordRequired"), + (0x10, "DeviceEncryptionEnabled"), + (0x11, "PasswordRecoveryEnabled"), + (0x12, "DocumentBrowseEnabled"), + (0x13, "AttachmentsEnabled"), + (0x14, "MinDevicePasswordLength"), + (0x15, "MaxInactivityTimeDeviceLock"), + (0x16, "MaxDevicePasswordFailedAttempts"), + (0x17, "MaxAttachmentSize"), + (0x18, "AllowSimpleDevicePassword"), + (0x19, "DevicePasswordExpiration"), + (0x1A, "DevicePasswordHistory"), + (0x1B, "AllowStorageCard"), + (0x1C, "AllowCamera"), + (0x1D, "RequireDeviceEncryption"), + (0x1E, "AllowUnsignedApplications"), + (0x1F, "AllowUnsignedInstallationPackages"), + (0x20, "MinDevicePasswordComplexCharacters"), + (0x21, "AllowWiFi"), + (0x22, "AllowTextMessaging"), + (0x23, "AllowPOPIMAPEmail"), + (0x24, "AllowBluetooth"), + (0x25, "AllowIrDA"), + (0x26, "RequireManualSyncWhenRoaming"), + (0x27, "AllowDesktopSync"), + (0x28, "MaxCalendarAgeFilter"), + (0x29, "AllowHTMLEmail"), + (0x2A, "MaxEmailAgeFilter"), + (0x2B, "MaxEmailBodyTruncationSize"), + (0x2C, "MaxEmailHTMLBodyTruncationSize"), + (0x2D, "RequireSignedSMIMEMessages"), + (0x2E, "RequireEncryptedSMIMEMessages"), + (0x2F, "RequireSignedSMIMEAlgorithm"), + (0x30, "RequireEncryptionSMIMEAlgorithm"), + (0x31, "AllowSMIMEEncryptionAlgorithmNegotiation"), + (0x32, "AllowSMIMESoftCerts"), + (0x33, "AllowBrowser"), + (0x34, "AllowConsumerEmail"), + (0x35, "AllowRemoteDesktop"), + (0x36, "AllowInternetSharing"), + (0x37, "UnapprovedInROMApplicationList"), + (0x38, "ApplicationName"), + (0x39, "ApprovedApplicationList"), + (0x3A, "Hash"), + (0x3B, "AccountOnlyRemoteWipe"), + ], + // 15 Search + &[ + (0x05, "Search"), + (0x07, "Store"), + (0x08, "Name"), + (0x09, "Query"), + (0x0A, "Options"), + (0x0B, "Range"), + (0x0C, "Status"), + (0x0D, "Response"), + (0x0E, "Result"), + (0x0F, "Properties"), + (0x10, "Total"), + (0x11, "EqualTo"), + (0x12, "Value"), + (0x13, "And"), + (0x14, "Or"), + (0x15, "FreeText"), + (0x17, "DeepTraversal"), + (0x18, "LongId"), + (0x19, "RebuildResults"), + (0x1A, "LessThan"), + (0x1B, "GreaterThan"), + (0x1C, "Schema"), + (0x1D, "Supported"), + (0x1E, "UserName"), + (0x1F, "Password"), + (0x20, "ConversationId"), + (0x21, "Picture"), + (0x22, "MaxSize"), + (0x23, "MaxPictures"), + ], + // 16 GAL + &[ + (0x05, "DisplayName"), + (0x06, "Phone"), + (0x07, "Office"), + (0x08, "Title"), + (0x09, "Company"), + (0x0A, "Alias"), + (0x0B, "FirstName"), + (0x0C, "LastName"), + (0x0D, "HomePhone"), + (0x0E, "MobilePhone"), + (0x0F, "EmailAddress"), + (0x10, "Picture"), + (0x11, "Status"), + (0x12, "Data"), + ], + // 17 AirSyncBase + &[ + (0x05, "BodyPreference"), + (0x06, "Type"), + (0x07, "TruncationSize"), + (0x08, "AllOrNone"), + (0x0A, "Body"), + (0x0B, "Data"), + (0x0C, "EstimatedDataSize"), + (0x0D, "Truncated"), + (0x0E, "Attachments"), + (0x0F, "Attachment"), + (0x10, "DisplayName"), + (0x11, "FileReference"), + (0x12, "Method"), + (0x13, "ContentId"), + (0x14, "ContentLocation"), + (0x15, "IsInline"), + (0x16, "NativeBodyType"), + (0x17, "ContentType"), + (0x18, "Preview"), + (0x19, "BodyPartPreference"), + (0x1A, "BodyPart"), + (0x1B, "Status"), + (0x1C, "Add"), + (0x1D, "Delete"), + (0x1E, "ClientId"), + (0x1F, "Content"), + (0x20, "Location"), + (0x21, "Annotation"), + (0x22, "Street"), + (0x23, "City"), + (0x24, "State"), + (0x25, "Country"), + (0x26, "PostalCode"), + (0x27, "Latitude"), + (0x28, "Longitude"), + (0x29, "Accuracy"), + (0x2A, "Altitude"), + (0x2B, "AltitudeAccuracy"), + (0x2C, "LocationUri"), + (0x2D, "InstanceId"), + ], + // 18 Settings + &[ + (0x05, "Settings"), + (0x06, "Status"), + (0x07, "Get"), + (0x08, "Set"), + (0x09, "Oof"), + (0x0A, "OofState"), + (0x0B, "StartTime"), + (0x0C, "EndTime"), + (0x0D, "OofMessage"), + (0x0E, "AppliesToInternal"), + (0x0F, "AppliesToExternalKnown"), + (0x10, "AppliesToExternalUnknown"), + (0x11, "Enabled"), + (0x12, "ReplyMessage"), + (0x13, "BodyType"), + (0x14, "DevicePassword"), + (0x15, "Password"), + (0x16, "DeviceInformation"), + (0x17, "Model"), + (0x18, "IMEI"), + (0x19, "FriendlyName"), + (0x1A, "OS"), + (0x1B, "OSLanguage"), + (0x1C, "PhoneNumber"), + (0x1D, "UserInformation"), + (0x1E, "EmailAddresses"), + (0x1F, "SmtpAddress"), + (0x20, "UserAgent"), + (0x21, "EnableOutboundSMS"), + (0x22, "MobileOperator"), + (0x23, "PrimarySmtpAddress"), + (0x24, "Accounts"), + (0x25, "Account"), + (0x26, "AccountId"), + (0x27, "AccountName"), + (0x28, "UserDisplayName"), + (0x29, "SendDisabled"), + (0x2B, "RightsManagementInformation"), + ], + // 19 DocumentLibrary + &[ + (0x05, "LinkId"), + (0x06, "DisplayName"), + (0x07, "IsFolder"), + (0x08, "CreationDate"), + (0x09, "LastModifiedDate"), + (0x0A, "IsHidden"), + (0x0B, "ContentLength"), + (0x0C, "ContentType"), + ], + // 20 ItemOperations + &[ + (0x05, "ItemOperations"), + (0x06, "Fetch"), + (0x07, "Store"), + (0x08, "Options"), + (0x09, "Range"), + (0x0A, "Total"), + (0x0B, "Properties"), + (0x0C, "Data"), + (0x0D, "Status"), + (0x0E, "Response"), + (0x0F, "Version"), + (0x10, "Schema"), + (0x11, "Part"), + (0x12, "EmptyFolderContents"), + (0x13, "DeleteSubFolders"), + (0x14, "UserName"), + (0x15, "Password"), + (0x16, "Move"), + (0x17, "DstFldId"), + (0x18, "ConversationId"), + (0x19, "MoveAlways"), + ], + // 21 ComposeMail + &[ + (0x05, "SendMail"), + (0x06, "SmartForward"), + (0x07, "SmartReply"), + (0x08, "SaveInSentItems"), + (0x09, "ReplaceMime"), + (0x0A, "Type"), + (0x0B, "Source"), + (0x0C, "FolderId"), + (0x0D, "ItemId"), + (0x0E, "LongId"), + (0x0F, "InstanceId"), + (0x10, "MIME"), + (0x11, "ClientId"), + (0x12, "Status"), + (0x13, "AccountId"), + (0x15, "Forwardees"), + (0x16, "Forwardee"), + (0x17, "Name"), + (0x18, "Email"), + ], + // 22 Email2 + &[ + (0x05, "UmCallerId"), + (0x06, "UmUserNotes"), + (0x07, "UmAttDuration"), + (0x08, "UmAttOrder"), + (0x09, "ConversationId"), + (0x0A, "ConversationIndex"), + (0x0B, "LastVerbExecuted"), + (0x0C, "LastVerbExecutionTime"), + (0x0D, "ReceivedAsBcc"), + (0x0E, "Sender"), + (0x0F, "CalendarType"), + (0x10, "IsLeapMonth"), + (0x11, "AccountId"), + (0x12, "FirstDayOfWeek"), + (0x13, "MeetingMessageType"), + (0x15, "IsDraft"), + (0x16, "Bcc"), + (0x17, "Send"), + ], + // 23 Notes + &[ + (0x05, "Subject"), + (0x06, "MessageClass"), + (0x07, "LastModifiedDate"), + (0x08, "Categories"), + (0x09, "Category"), + ], + // 24 RightsManagement + &[ + (0x05, "RightsManagementSupport"), + (0x06, "RightsManagementTemplates"), + (0x07, "RightsManagementTemplate"), + (0x08, "RightsManagementLicense"), + (0x09, "EditAllowed"), + (0x0A, "ReplyAllowed"), + (0x0B, "ReplyAllAllowed"), + (0x0C, "ForwardAllowed"), + (0x0D, "ModifyRecipientsAllowed"), + (0x0E, "ExtractAllowed"), + (0x0F, "PrintAllowed"), + (0x10, "ExportAllowed"), + (0x11, "ProgrammaticAccessAllowed"), + (0x12, "Owner"), + (0x13, "ContentExpiryDate"), + (0x14, "TemplateID"), + (0x15, "TemplateName"), + (0x16, "TemplateDescription"), + (0x17, "ContentOwner"), + (0x18, "RemoveRightsManagementProtection"), + ], + // 25 Find + &[ + (0x05, "Find"), + (0x06, "SearchId"), + (0x07, "ExecuteSearch"), + (0x08, "MailBoxSearchCriterion"), + (0x09, "Query"), + (0x0A, "Status"), + (0x0B, "FreeText"), + (0x0C, "Options"), + (0x0D, "Range"), + (0x0E, "DeepTraversal"), + (0x11, "Response"), + (0x12, "Result"), + (0x13, "Properties"), + (0x14, "Preview"), + (0x15, "HasAttachments"), + (0x16, "Total"), + (0x17, "DisplayCc"), + (0x18, "DisplayBcc"), + (0x19, "GalSearchCriterion"), + (0x20, "MaxPictures"), + (0x21, "MaxSize"), + (0x22, "Picture"), + ], +]; diff --git a/src/wbxml/mod.rs b/src/wbxml/mod.rs new file mode 100644 index 0000000..1627ea3 --- /dev/null +++ b/src/wbxml/mod.rs @@ -0,0 +1,556 @@ +//! WBXML (MS-ASWBXML) encoder/decoder with a small element tree. +//! +//! Elements are addressed by `"Namespace:Tag"` names, e.g. `"AirSync:SyncKey"`. + +mod codepages; + +use std::collections::HashMap; +use std::fmt::Write as _; +use std::sync::OnceLock; + +pub use codepages::NAMESPACES; + +const SWITCH_PAGE: u8 = 0x00; +const END: u8 = 0x01; +const ENTITY: u8 = 0x02; +const STR_I: u8 = 0x03; +const LITERAL: u8 = 0x04; +const STR_T: u8 = 0x83; +const OPAQUE: u8 = 0xC3; +const WITH_CONTENT: u8 = 0x40; +const WITH_ATTRIBUTES: u8 = 0x80; + +/// Hard limits protecting the decoder against hostile input. +const MAX_DEPTH: usize = 64; +const MAX_ELEMENTS: usize = 500_000; + +#[derive(Debug, thiserror::Error)] +pub enum WbxmlError { + #[error("unexpected end of WBXML stream")] + Eof, + #[error("invalid WBXML: {0}")] + Invalid(&'static str), + #[error("unknown WBXML tag {0}")] + UnknownName(String), +} + +struct Tables { + by_name: HashMap, +} + +fn tables() -> &'static Tables { + static T: OnceLock = OnceLock::new(); + T.get_or_init(|| { + let mut by_name = HashMap::new(); + for (page, tags) in codepages::PAGES.iter().enumerate() { + let ns = codepages::NAMESPACES[page]; + for (code, tag) in tags.iter() { + by_name.insert(format!("{ns}:{tag}"), (page as u8, *code)); + } + } + Tables { by_name } + }) +} + +/// Resolve a `Namespace:Tag` name into its (page, token) pair. +pub fn lookup(name: &str) -> Option<(u8, u8)> { + tables().by_name.get(name).copied() +} + +fn tag_name(page: u8, code: u8) -> (&'static str, &'static str) { + let ns = codepages::NAMESPACES + .get(page as usize) + .copied() + .unwrap_or("Unknown"); + let tag = codepages::PAGES + .get(page as usize) + .and_then(|t| t.iter().find(|(c, _)| *c == code).map(|(_, n)| *n)) + .unwrap_or("Unknown"); + (ns, tag) +} + +#[derive(Debug, Clone, PartialEq)] +pub enum Content { + None, + Text(String), + Opaque(Vec), +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Element { + pub page: u8, + pub code: u8, + pub children: Vec, + pub content: Content, +} + +impl Element { + /// Create a new element. Panics on unknown names: tag names are compile-time literals + /// in this code base and covered by tests. + pub fn new(name: &str) -> Self { + let (page, code) = lookup(name).unwrap_or_else(|| panic!("unknown WBXML tag name {name}")); + Element { + page, + code, + children: Vec::new(), + content: Content::None, + } + } + + pub fn ns(&self) -> &'static str { + tag_name(self.page, self.code).0 + } + + pub fn tag(&self) -> &'static str { + tag_name(self.page, self.code).1 + } + + pub fn name(&self) -> String { + let (ns, tag) = tag_name(self.page, self.code); + format!("{ns}:{tag}") + } + + pub fn is(&self, name: &str) -> bool { + lookup(name) == Some((self.page, self.code)) + } + + // ----- builder helpers ----- + + pub fn text(name: &str, value: impl Into) -> Self { + let mut e = Element::new(name); + e.content = Content::Text(value.into()); + e + } + + pub fn opaque(name: &str, value: Vec) -> Self { + let mut e = Element::new(name); + e.content = Content::Opaque(value); + e + } + + pub fn with(mut self, child: Element) -> Self { + self.children.push(child); + self + } + + pub fn with_text(mut self, name: &str, value: impl Into) -> Self { + self.children.push(Element::text(name, value)); + self + } + + pub fn with_opt(mut self, name: &str, value: Option>) -> Self { + if let Some(v) = value { + self.children.push(Element::text(name, v)); + } + self + } + + pub fn with_empty(mut self, name: &str) -> Self { + self.children.push(Element::new(name)); + self + } + + pub fn push(&mut self, child: Element) { + self.children.push(child); + } + + pub fn push_text(&mut self, name: &str, value: impl Into) { + self.children.push(Element::text(name, value)); + } + + pub fn push_opt(&mut self, name: &str, value: Option>) { + if let Some(v) = value { + self.children.push(Element::text(name, v)); + } + } + + // ----- query helpers ----- + + pub fn child(&self, name: &str) -> Option<&Element> { + let key = lookup(name)?; + self.children.iter().find(|c| (c.page, c.code) == key) + } + + pub fn children_named<'a>(&'a self, name: &str) -> impl Iterator + 'a { + let key = lookup(name); + self.children + .iter() + .filter(move |c| Some((c.page, c.code)) == key) + } + + /// Text of a direct child element. + pub fn child_text(&self, name: &str) -> Option { + self.child(name).map(|c| c.text_value()) + } + + pub fn child_u32(&self, name: &str) -> Option { + self.child_text(name).and_then(|t| t.trim().parse().ok()) + } + + pub fn has(&self, name: &str) -> bool { + self.child(name).is_some() + } + + /// Follow a path of direct children. + pub fn path(&self, names: &[&str]) -> Option<&Element> { + let mut cur = self; + for n in names { + cur = cur.child(n)?; + } + Some(cur) + } + + pub fn text_value(&self) -> String { + match &self.content { + Content::Text(s) => s.clone(), + Content::Opaque(b) => String::from_utf8_lossy(b).into_owned(), + Content::None => String::new(), + } + } + + pub fn bytes_value(&self) -> Vec { + match &self.content { + Content::Text(s) => s.as_bytes().to_vec(), + Content::Opaque(b) => b.clone(), + Content::None => Vec::new(), + } + } + + /// Human readable XML rendering for debug logs (data truncated). + pub fn to_xml(&self) -> String { + let mut out = String::new(); + self.write_xml(&mut out, 0); + out + } + + fn write_xml(&self, out: &mut String, depth: usize) { + let pad = " ".repeat(depth); + let (ns, tag) = tag_name(self.page, self.code); + let name = format!("{ns}:{tag}"); + match (&self.content, self.children.is_empty()) { + (Content::None, true) => { + let _ = writeln!(out, "{pad}<{name}/>"); + } + (Content::Text(t), _) => { + let shown = if tag == "Password" || tag == "Data" && t.len() > 256 { + format!("[{} chars]", t.len()) + } else if t.len() > 256 { + format!("{}…", &t[..t.floor_char_boundary_compat(256)]) + } else { + t.clone() + }; + let _ = writeln!(out, "{pad}<{name}>{}", xml_escape(&shown)); + } + (Content::Opaque(b), _) => { + let _ = writeln!(out, "{pad}<{name}>[opaque {} bytes]", b.len()); + } + (Content::None, false) => { + let _ = writeln!(out, "{pad}<{name}>"); + for c in &self.children { + c.write_xml(out, depth + 1); + } + let _ = writeln!(out, "{pad}"); + } + } + } +} + +trait FloorBoundary { + fn floor_char_boundary_compat(&self, idx: usize) -> usize; +} + +impl FloorBoundary for String { + fn floor_char_boundary_compat(&self, idx: usize) -> usize { + let mut i = idx.min(self.len()); + while i > 0 && !self.is_char_boundary(i) { + i -= 1; + } + i + } +} + +fn xml_escape(s: &str) -> String { + s.replace('&', "&") + .replace('<', "<") + .replace('>', ">") +} + +// ---------------------------------------------------------------- encoder + +pub fn encode(root: &Element) -> Vec { + let mut out = Vec::with_capacity(512); + out.extend_from_slice(&[0x03, 0x01, 0x6A, 0x00]); + let mut page = 0u8; + encode_element(root, &mut out, &mut page); + out +} + +fn encode_element(e: &Element, out: &mut Vec, page: &mut u8) { + if e.page != *page { + out.push(SWITCH_PAGE); + out.push(e.page); + *page = e.page; + } + let has_content = !e.children.is_empty() || !matches!(e.content, Content::None); + out.push(if has_content { + e.code | WITH_CONTENT + } else { + e.code + }); + if !has_content { + return; + } + match &e.content { + Content::Text(t) => { + out.push(STR_I); + // NUL bytes would terminate the inline string; strip them. + out.extend(t.bytes().filter(|b| *b != 0)); + out.push(0); + } + Content::Opaque(b) => { + out.push(OPAQUE); + write_mb_u32(out, b.len() as u32); + out.extend_from_slice(b); + } + Content::None => {} + } + for c in &e.children { + encode_element(c, out, page); + } + out.push(END); +} + +fn write_mb_u32(out: &mut Vec, mut v: u32) { + let mut buf = [0u8; 5]; + let mut i = 4; + buf[i] = (v & 0x7f) as u8; + v >>= 7; + while v > 0 { + i -= 1; + buf[i] = 0x80 | (v & 0x7f) as u8; + v >>= 7; + } + out.extend_from_slice(&buf[i..]); +} + +// ---------------------------------------------------------------- decoder + +struct Reader<'a> { + data: &'a [u8], + pos: usize, +} + +impl<'a> Reader<'a> { + fn byte(&mut self) -> Result { + let b = *self.data.get(self.pos).ok_or(WbxmlError::Eof)?; + self.pos += 1; + Ok(b) + } + + fn peek(&self) -> Option { + self.data.get(self.pos).copied() + } + + fn mb_u32(&mut self) -> Result { + let mut v: u32 = 0; + for _ in 0..5 { + let b = self.byte()?; + v = v + .checked_shl(7) + .ok_or(WbxmlError::Invalid("mb_u_int32 overflow"))? + | (b & 0x7f) as u32; + if b & 0x80 == 0 { + return Ok(v); + } + } + Err(WbxmlError::Invalid("mb_u_int32 too long")) + } + + fn cstr(&mut self) -> Result, WbxmlError> { + let start = self.pos; + let rel = self.data[start..] + .iter() + .position(|b| *b == 0) + .ok_or(WbxmlError::Eof)?; + self.pos = start + rel + 1; + Ok(self.data[start..start + rel].to_vec()) + } + + fn take(&mut self, n: usize) -> Result<&'a [u8], WbxmlError> { + if self.pos + n > self.data.len() { + return Err(WbxmlError::Eof); + } + let s = &self.data[self.pos..self.pos + n]; + self.pos += n; + Ok(s) + } +} + +pub fn decode(data: &[u8]) -> Result { + let mut r = Reader { data, pos: 0 }; + let _version = r.byte()?; + let _public_id = r.mb_u32()?; + let _charset = r.mb_u32()?; + let strtbl_len = r.mb_u32()? as usize; + let strtbl = r.take(strtbl_len)?.to_vec(); + let mut page = 0u8; + let mut count = 0usize; + // skip leading switch pages + loop { + match r.peek() { + Some(SWITCH_PAGE) => { + r.byte()?; + page = r.byte()?; + } + Some(_) => break, + None => return Err(WbxmlError::Eof), + } + } + decode_element(&mut r, &mut page, &strtbl, 0, &mut count) +} + +fn decode_element( + r: &mut Reader, + page: &mut u8, + strtbl: &[u8], + depth: usize, + count: &mut usize, +) -> Result { + if depth > MAX_DEPTH { + return Err(WbxmlError::Invalid("nesting too deep")); + } + *count += 1; + if *count > MAX_ELEMENTS { + return Err(WbxmlError::Invalid("too many elements")); + } + let tok = r.byte()?; + if tok == LITERAL { + return Err(WbxmlError::Invalid("literal tags not supported")); + } + if tok & WITH_ATTRIBUTES != 0 { + return Err(WbxmlError::Invalid("attributes not supported")); + } + let mut el = Element { + page: *page, + code: tok & 0x3f, + children: Vec::new(), + content: Content::None, + }; + if tok & WITH_CONTENT == 0 { + return Ok(el); + } + let mut text: Option> = None; + let mut opaque: Option> = None; + loop { + let next = r.peek().ok_or(WbxmlError::Eof)?; + match next { + END => { + r.byte()?; + break; + } + SWITCH_PAGE => { + r.byte()?; + *page = r.byte()?; + } + STR_I => { + r.byte()?; + let s = r.cstr()?; + text.get_or_insert_with(Vec::new).extend_from_slice(&s); + } + STR_T => { + r.byte()?; + let off = r.mb_u32()? as usize; + let rest = strtbl + .get(off..) + .ok_or(WbxmlError::Invalid("bad string table offset"))?; + let end = rest.iter().position(|b| *b == 0).unwrap_or(rest.len()); + text.get_or_insert_with(Vec::new) + .extend_from_slice(&rest[..end]); + } + ENTITY => { + r.byte()?; + let cp = r.mb_u32()?; + if let Some(c) = char::from_u32(cp) { + let mut b = [0u8; 4]; + text.get_or_insert_with(Vec::new) + .extend_from_slice(c.encode_utf8(&mut b).as_bytes()); + } + } + OPAQUE => { + r.byte()?; + let len = r.mb_u32()? as usize; + let b = r.take(len)?; + opaque.get_or_insert_with(Vec::new).extend_from_slice(b); + } + _ => { + let child = decode_element(r, page, strtbl, depth + 1, count)?; + el.children.push(child); + } + } + } + if let Some(o) = opaque { + el.content = Content::Opaque(o); + } else if let Some(t) = text { + el.content = Content::Text(String::from_utf8_lossy(&t).into_owned()); + } + Ok(el) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn roundtrip() { + let root = Element::new("AirSync:Sync").with( + Element::new("AirSync:Collections").with( + Element::new("AirSync:Collection") + .with_text("AirSync:SyncKey", "{abc}1") + .with_text("AirSync:CollectionId", "5") + .with_empty("AirSync:GetChanges") + .with( + Element::new("AirSync:Options") + .with( + Element::new("AirSyncBase:BodyPreference") + .with_text("AirSyncBase:Type", "2"), + ) + .with(Element::opaque("ComposeMail:MIME", vec![0, 1, 2, 255])), + ), + ), + ); + let bytes = encode(&root); + let back = decode(&bytes).unwrap(); + assert_eq!(root, back); + let col = back + .path(&["AirSync:Collections", "AirSync:Collection"]) + .unwrap(); + assert_eq!(col.child_text("AirSync:SyncKey").unwrap(), "{abc}1"); + assert!(col.has("AirSync:GetChanges")); + } + + #[test] + fn mb_u32() { + for v in [0u32, 1, 127, 128, 300, 16383, 16384, 1 << 28, u32::MAX] { + let mut out = vec![]; + write_mb_u32(&mut out, v); + let mut r = Reader { data: &out, pos: 0 }; + assert_eq!(r.mb_u32().unwrap(), v); + } + } + + #[test] + fn all_names_unique_per_page() { + for (p, tags) in codepages::PAGES.iter().enumerate() { + let mut seen = std::collections::HashSet::new(); + for (c, _) in tags.iter() { + assert!(seen.insert(*c), "duplicate token {c:#x} on page {p}"); + } + } + } + + #[test] + fn rejects_garbage() { + assert!(decode(&[0x03, 0x01, 0x6a, 0x00, 0x45]).is_err()); + assert!(decode(&[]).is_err()); + } +} diff --git a/src/xmltree.rs b/src/xmltree.rs new file mode 100644 index 0000000..3f35c4d --- /dev/null +++ b/src/xmltree.rs @@ -0,0 +1,166 @@ +//! Tiny namespace-aware XML DOM built on quick-xml (no DTD / entity expansion). + +use anyhow::{bail, Result}; +use quick_xml::events::Event; +use quick_xml::name::ResolveResult; +use quick_xml::NsReader; + +#[derive(Debug, Clone, Default)] +pub struct XNode { + pub ns: String, + pub name: String, + pub text: String, + pub attrs: Vec<(String, String)>, + pub children: Vec, +} + +impl XNode { + pub fn attr(&self, name: &str) -> Option<&str> { + self.attrs + .iter() + .find(|(k, _)| k.eq_ignore_ascii_case(name)) + .map(|(_, v)| v.as_str()) + } + pub fn child(&self, name: &str) -> Option<&XNode> { + self.children + .iter() + .find(|c| c.name.eq_ignore_ascii_case(name)) + } + pub fn children_named<'a>(&'a self, name: &'a str) -> impl Iterator + 'a { + self.children + .iter() + .filter(move |c| c.name.eq_ignore_ascii_case(name)) + } + /// Depth-first search for the first descendant with this local name. + pub fn find(&self, name: &str) -> Option<&XNode> { + for c in &self.children { + if c.name.eq_ignore_ascii_case(name) { + return Some(c); + } + if let Some(f) = c.find(name) { + return Some(f); + } + } + None + } + pub fn find_all<'a>(&'a self, name: &str, out: &mut Vec<&'a XNode>) { + for c in &self.children { + if c.name.eq_ignore_ascii_case(name) { + out.push(c); + } + c.find_all(name, out); + } + } + pub fn text_of(&self, name: &str) -> Option { + self.find(name).map(|n| n.text.trim().to_string()) + } +} + +fn attrs_of(e: &quick_xml::events::BytesStart) -> Vec<(String, String)> { + e.attributes() + .flatten() + .take(64) + .map(|a| { + ( + String::from_utf8_lossy(a.key.local_name().as_ref()).into_owned(), + a.unescape_value() + .map(|v| v.into_owned()) + .unwrap_or_default(), + ) + }) + .collect() +} + +pub fn parse(xml: &[u8]) -> Result { + if xml.len() > 64 * 1024 * 1024 { + bail!("XML document too large"); + } + let text = String::from_utf8_lossy(xml); + // Refuse DTDs outright (XXE / billion laughs protection). + if text.contains(" = vec![XNode::default()]; + let mut depth = 0usize; + loop { + match reader.read_resolved_event()? { + (ns, Event::Start(e)) => { + depth += 1; + if depth > 128 { + bail!("XML nesting too deep"); + } + let ns = match ns { + ResolveResult::Bound(n) => String::from_utf8_lossy(n.as_ref()).into_owned(), + _ => String::new(), + }; + stack.push(XNode { + ns, + name: String::from_utf8_lossy(e.local_name().as_ref()).into_owned(), + attrs: attrs_of(&e), + ..Default::default() + }); + } + (ns, Event::Empty(e)) => { + let ns = match ns { + ResolveResult::Bound(n) => String::from_utf8_lossy(n.as_ref()).into_owned(), + _ => String::new(), + }; + let node = XNode { + ns, + name: String::from_utf8_lossy(e.local_name().as_ref()).into_owned(), + attrs: attrs_of(&e), + ..Default::default() + }; + if let Some(top) = stack.last_mut() { + top.children.push(node); + } + } + (_, Event::End(_)) => { + depth = depth.saturating_sub(1); + let node = stack.pop().unwrap_or_default(); + match stack.last_mut() { + Some(top) => top.children.push(node), + None => bail!("unbalanced XML"), + } + } + (_, Event::Text(t)) => { + if let Some(top) = stack.last_mut() { + let s = t.unescape().map(|c| c.into_owned()).unwrap_or_default(); + top.text.push_str(&s); + } + } + (_, Event::CData(t)) => { + if let Some(top) = stack.last_mut() { + top.text.push_str(&String::from_utf8_lossy(&t)); + } + } + (_, Event::Eof) => break, + (_, Event::DocType(_)) => bail!("XML DTD not allowed"), + _ => {} + } + } + let root = stack.pop().unwrap_or_default(); + root.children + .into_iter() + .next() + .ok_or_else(|| anyhow::anyhow!("empty XML document")) +} + +#[cfg(test)] +mod tests { + #[test] + fn parse_ns() { + let x = br#"/a/b.ics"x""#; + let n = super::parse(x).unwrap(); + assert_eq!(n.name, "multistatus"); + assert_eq!(n.ns, "DAV:"); + assert_eq!(n.text_of("getetag").unwrap(), "\"x\""); + } + + #[test] + fn rejects_dtd() { + assert!(super::parse(b"]>&a;").is_err()); + } +} diff --git a/tests/e2e.rs b/tests/e2e.rs new file mode 100644 index 0000000..ad5ea2a --- /dev/null +++ b/tests/e2e.rs @@ -0,0 +1,634 @@ +//! End-to-end test against a running ActivePush with the dev backends +//! (`tools/dev/test-backends.sh` + `tools/dev/test-settings.json`). +//! +//! AP_E2E_URL=http://127.0.0.1:18081 cargo test --test e2e -- --nocapture --test-threads=1 +//! +//! Skipped when AP_E2E_URL is not set. + +use std::time::Duration; + +use active_push::backend::imap::ImapConn; +use active_push::config::{ImapSettings, TlsMode}; +use active_push::probe::Probe; +use active_push::wbxml::Element; + +const USER: &str = "jan@test.local"; +const PASS: &str = "Test-Password-123"; + +fn url() -> Option { + std::env::var("AP_E2E_URL") + .ok() + .map(|u| format!("{}/Microsoft-Server-ActiveSync", u.trim_end_matches('/'))) +} + +async fn imap() -> ImapConn { + let cfg = ImapSettings { + host: "127.0.0.1".into(), + port: 11143, + security: TlsMode::None, + ..Default::default() + }; + let mut c = ImapConn::connect(&cfg).await.unwrap(); + assert!(c.login(USER, PASS).await.unwrap()); + c +} + +struct Folders { + list: Vec<(String, String, String, String)>, // id, parent, name, type +} + +impl Folders { + fn by_type(&self, t: &str) -> String { + self.list + .iter() + .find(|f| f.3 == t) + .map(|f| f.0.clone()) + .unwrap_or_else(|| panic!("no folder of type {t}")) + } + fn by_name(&self, n: &str) -> (String, String) { + self.list + .iter() + .find(|f| f.2 == n) + .map(|f| (f.0.clone(), f.1.clone())) + .unwrap_or_else(|| panic!("no folder {n}")) + } +} + +fn col(r: &Element) -> &Element { + r.path(&["AirSync:Collections", "AirSync:Collection"]) + .expect("collection in sync response") +} + +async fn full_sync(p: &Probe, id: &str) -> (String, Vec) { + let r = p.sync(id, "0", 0, None).await.unwrap(); + let mut key = col(&r).child_text("AirSync:SyncKey").unwrap(); + let mut items = Vec::new(); + for _ in 0..50 { + let r = p.sync(id, &key, 100, None).await.unwrap(); + let c = col(&r); + assert_eq!( + c.child_text("AirSync:Status").as_deref(), + Some("1"), + "sync status: {}", + r.to_xml() + ); + key = c.child_text("AirSync:SyncKey").unwrap(); + if let Some(cmds) = c.child("AirSync:Commands") { + items.extend(cmds.children.iter().cloned()); + } + if !c.has("AirSync:MoreAvailable") { + break; + } + } + (key, items) +} + +async fn changes(p: &Probe, id: &str, key: &str, cmds: Option) -> (String, Element) { + let r = p.sync(id, key, 100, cmds).await.unwrap(); + let c = col(&r).clone(); + (c.child_text("AirSync:SyncKey").unwrap(), c) +} + +#[tokio::test] +async fn e2e_full_flow() { + let Some(url) = url() else { + eprintln!("AP_E2E_URL not set - skipping end-to-end test"); + return; + }; + let dev = format!("e2e{}", std::process::id()); + // seed fresh messages with an attachment + { + let mut im = imap().await; + for f in ["Zmieniony", "Nowy folder &AXw-"] { + let _ = im.delete(f).await; + } + for i in 1..=3 { + let m = format!("From: Anna Nowak \r\nTo: Jan \r\nSubject: Testowa wiadomość e2e {i}\r\nMessage-ID: \r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=b1\r\n\r\n--b1\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nTreść wiadomości numer {i}.\r\n--b1\r\nContent-Type: application/pdf; name=\"raport.pdf\"\r\nContent-Disposition: attachment; filename=\"raport.pdf\"\r\nContent-Transfer-Encoding: base64\r\n\r\nJVBERi0xLjQKJcOkw7zDtsOfCg==\r\n--b1--\r\n"); + im.append("INBOX", "", m.as_bytes()).await.unwrap(); + } + } + let mut p = Probe::new(&url, USER, PASS, &dev, true).unwrap(); + + // ---- auth failure gives 401 + let bad = Probe::new(&url, USER, "wrong-password", &dev, true).unwrap(); + assert_eq!(bad.options().await.unwrap().0, 401); + + // ---- provisioning is enforced + let (st, _) = p + .cmd( + "FolderSync", + Some( + Element::new("FolderHierarchy:FolderSync") + .with_text("FolderHierarchy:SyncKey", "0"), + ), + ) + .await + .unwrap(); + assert!( + st == 449 || st == 200, + "unprovisioned FolderSync answered {st}" + ); + p.provision().await.unwrap(); + + // ---- hierarchy + let fs = p.folder_sync("0").await.unwrap(); + let fkey = fs.child_text("FolderHierarchy:SyncKey").unwrap(); + let mut list = Vec::new(); + for a in fs + .child("FolderHierarchy:Changes") + .unwrap() + .children_named("FolderHierarchy:Add") + { + list.push(( + a.child_text("FolderHierarchy:ServerId").unwrap(), + a.child_text("FolderHierarchy:ParentId").unwrap(), + a.child_text("FolderHierarchy:DisplayName").unwrap(), + a.child_text("FolderHierarchy:Type").unwrap(), + )); + } + let f = Folders { list }; + let inbox = f.by_type("2"); + let trash = f.by_type("4"); + let sent = f.by_type("5"); + let cal = f.by_type("8"); + let tasks = f.by_type("7"); + let contacts = f.by_type("9"); + let (projekty, _) = f.by_name("Projekty"); + let (_, alfa_parent) = f.by_name("Alfa"); + assert_eq!(alfa_parent, projekty, "subfolder parent"); + // unchanged hierarchy keeps key + let fs2 = p.folder_sync(&fkey).await.unwrap(); + assert_eq!( + fs2.path(&["FolderHierarchy:Changes", "FolderHierarchy:Count"]) + .unwrap() + .text_value(), + "0" + ); + + // ---- Z-Push leftovers: a collection id unknown here must be deleted on the device + let zr = p + .sync( + "a6271970", + "{11111111-2222-3333-4444-555555555555}7", + 10, + None, + ) + .await + .unwrap(); + assert_eq!(col(&zr).child_text("AirSync:Status").as_deref(), Some("12")); + let fs3 = p.folder_sync(&fkey).await.unwrap(); + let ch3 = fs3.child("FolderHierarchy:Changes").expect("changes"); + assert!( + ch3.children_named("FolderHierarchy:Delete") + .any(|d| d.child_text("FolderHierarchy:ServerId").as_deref() == Some("a6271970")), + "stale collection deleted: {}", + fs3.to_xml() + ); + let fkey = fs3.child_text("FolderHierarchy:SyncKey").unwrap(); + + // ---- mail + let (mut ikey, mails) = full_sync(&p, &inbox).await; + assert!(mails.len() >= 3, "expected mails, got {}", mails.len()); + let mails: Vec = mails + .into_iter() + .filter(|m| { + m.child("AirSync:ApplicationData") + .and_then(|a| a.child_text("Email:Subject")) + .map(|s| s.starts_with("Testowa wiadomo")) + .unwrap_or(false) + }) + .collect(); + assert!(mails.len() >= 3, "seeded test mails present"); + let first = &mails[0]; + let app = first.child("AirSync:ApplicationData").unwrap(); + assert!(app + .child_text("Email:Subject") + .unwrap() + .starts_with("Testowa wiadomo")); + let fref = app + .path(&["AirSyncBase:Attachments", "AirSyncBase:Attachment"]) + .and_then(|a| a.child_text("AirSyncBase:FileReference")) + .expect("attachment"); + // attachment via ItemOperations + let io = Element::new("ItemOperations:ItemOperations").with( + Element::new("ItemOperations:Fetch") + .with_text("ItemOperations:Store", "Mailbox") + .with_text("AirSyncBase:FileReference", fref.clone()), + ); + let (_, r) = p.cmd("ItemOperations", Some(io)).await.unwrap(); + let r = r.unwrap(); + let data = r + .path(&[ + "ItemOperations:Response", + "ItemOperations:Fetch", + "ItemOperations:Properties", + ]) + .and_then(|x| x.child_text("ItemOperations:Data")) + .expect("attachment data"); + assert_eq!(data, "JVBERi0xLjQKJcOkw7zDtsOfCg=="); + + // client marks read + flag + let sid = first.child_text("AirSync:ServerId").unwrap(); + let ch = Element::new("AirSync:Commands").with( + Element::new("AirSync:Change") + .with_text("AirSync:ServerId", sid.clone()) + .with( + Element::new("AirSync:ApplicationData") + .with_text("Email:Read", "1") + .with(Element::new("Email:Flag").with_text("Email:FlagStatus", "2")), + ), + ); + let (k, c) = changes(&p, &inbox, &ikey, Some(ch)).await; + ikey = k; + assert!( + c.child("AirSync:Commands").is_none(), + "own change must not be echoed: {}", + c.to_xml() + ); + let uid: u32 = sid.split(':').nth(1).unwrap().parse().unwrap(); + let mut im = imap().await; + im.select("INBOX").await.unwrap(); + let fl = im.uid_fetch_flags(&uid.to_string()).await.unwrap(); + assert!( + fl[0].flags.iter().any(|x| x == "\\Seen") && fl[0].flags.iter().any(|x| x == "\\Flagged") + ); + + // server side change -> device gets Change + im.uid_store(uid, "-", "\\Flagged").await.unwrap(); + let (k, c) = changes(&p, &inbox, &ikey, None).await; + ikey = k; + let cmds = c.child("AirSync:Commands").expect("server change"); + assert!(cmds.children.iter().any(|x| x.is("AirSync:Change"))); + + // new mail arrives -> Add + im.append( + "INBOX", + "", + b"From: x@y.pl\r\nTo: jan@test.local\r\nSubject: Nowa\r\n\r\nhej\r\n", + ) + .await + .unwrap(); + let (k, c) = changes(&p, &inbox, &ikey, None).await; + ikey = k; + assert!(c + .child("AirSync:Commands") + .unwrap() + .children + .iter() + .any(|x| x.is("AirSync:Add"))); + + // delete from device -> Trash + let ch = Element::new("AirSync:Commands") + .with(Element::new("AirSync:Delete").with_text("AirSync:ServerId", sid.clone())); + let (k, _) = changes(&p, &inbox, &ikey, Some(ch)).await; + ikey = k; + im.select("Trash").await.unwrap(); + assert!( + !im.uid_search("ALL").await.unwrap().is_empty(), + "message moved to Trash" + ); + + // GetItemEstimate (nothing pending) + let gie = Element::new("GetItemEstimate:GetItemEstimate").with( + Element::new("GetItemEstimate:Collections").with( + Element::new("GetItemEstimate:Collection") + .with_text("AirSync:SyncKey", ikey.clone()) + .with_text("GetItemEstimate:CollectionId", inbox.clone()), + ), + ); + let (_, r) = p.cmd("GetItemEstimate", Some(gie)).await.unwrap(); + let r = r.unwrap(); + let est_dbg = r.to_xml(); + let est = r + .path(&["GetItemEstimate:Response", "GetItemEstimate:Collection"]) + .unwrap() + .child_text("GetItemEstimate:Estimate") + .unwrap(); + if est != "0" { + let (_, c) = changes(&p, &inbox, &ikey, None).await; + panic!("estimate {est}: {est_dbg}\npending: {}", c.to_xml()); + } + + // MoveItems inbox -> Projekty + let (_, c) = changes(&p, &inbox, &ikey, None).await; + let _ = c; + let mv_sid = mails[1].child_text("AirSync:ServerId").unwrap(); + let mv = Element::new("Move:MoveItems").with( + Element::new("Move:Move") + .with_text("Move:SrcMsgId", mv_sid) + .with_text("Move:SrcFldId", inbox.clone()) + .with_text("Move:DstFldId", projekty.clone()), + ); + let (_, r) = p.cmd("MoveItems", Some(mv)).await.unwrap(); + let r = r.unwrap(); + let resp = r.child("Move:Response").unwrap(); + assert_eq!( + resp.child_text("Move:Status").as_deref(), + Some("3"), + "{}", + r.to_xml() + ); + assert!(resp + .child_text("Move:DstMsgId") + .unwrap() + .starts_with(&format!("{projekty}:"))); + + // ---- SendMail + Sent copy + let mime = format!("From: Jan <{USER}>\r\nTo: anna@test.local\r\nBcc: tajny@test.local\r\nSubject: E2E wysyłka\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nCześć Anno!\r\n"); + let sm = Element::new("ComposeMail:SendMail") + .with_text("ComposeMail:ClientId", "c1") + .with_empty("ComposeMail:SaveInSentItems") + .with(Element::opaque("ComposeMail:MIME", mime.into_bytes())); + let (st, r) = p.cmd("SendMail", Some(sm)).await.unwrap(); + assert_eq!(st, 200); + assert!( + r.is_none(), + "SendMail success returns empty body: {:?}", + r.map(|x| x.to_xml()) + ); + im.select("Sent").await.unwrap(); + assert!( + !im.uid_search("SUBJECT \"E2E\"").await.unwrap().is_empty(), + "copy in Sent" + ); + + // SmartReply quoting original + let reply_src = mails[2].child_text("AirSync:ServerId").unwrap(); + let mime = format!("From: {USER}\r\nTo: anna@test.local\r\nSubject: Re: test\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nOdpowiedź\r\n"); + let sr = Element::new("ComposeMail:SmartReply") + .with_text("ComposeMail:ClientId", "c2") + .with( + Element::new("ComposeMail:Source") + .with_text("ComposeMail:FolderId", inbox.clone()) + .with_text("ComposeMail:ItemId", reply_src), + ) + .with(Element::opaque("ComposeMail:MIME", mime.into_bytes())); + let (st, _) = p.cmd("SmartReply", Some(sr)).await.unwrap(); + assert_eq!(st, 200); + tokio::time::sleep(Duration::from_millis(300)).await; + let sink = std::fs::read_dir("data/test-backends/sink") + .map(|d| d.count()) + .unwrap_or(0); + assert!(sink >= 2, "SMTP sink got messages"); + + // ---- calendar + let (ckey, evs) = full_sync(&p, &cal).await; + let ev = evs + .iter() + .filter_map(|e| e.child("AirSync:ApplicationData")) + .find(|a| a.child_text("Calendar:Subject").as_deref() == Some("Spotkanie zespołu")) + .expect("seeded event"); + assert_eq!( + ev.child_text("Calendar:Subject").unwrap(), + "Spotkanie zespołu" + ); + assert_eq!( + ev.path(&["Calendar:Recurrence", "Calendar:Type"]) + .unwrap() + .text_value(), + "1" + ); + assert_eq!(ev.child_text("Calendar:Reminder").unwrap(), "15"); + // device adds an event + let add = Element::new("AirSync:Commands").with( + Element::new("AirSync:Add") + .with_text("AirSync:ClientId", "ev-new") + .with( + Element::new("AirSync:ApplicationData") + .with_text( + "Calendar:TimeZone", + active_push::backend::tz::blob_for(&chrono_tz::Europe::Warsaw, 2026), + ) + .with_text("Calendar:AllDayEvent", "0") + .with_text("Calendar:StartTime", "20261120T090000Z") + .with_text("Calendar:EndTime", "20261120T100000Z") + .with_text("Calendar:Subject", "Z telefonu") + .with_text("Calendar:Reminder", "30") + .with_text("Calendar:BusyStatus", "2"), + ), + ); + let (ckey2, c) = changes(&p, &cal, &ckey, Some(add)).await; + let resp = c.path(&["AirSync:Responses", "AirSync:Add"]).unwrap(); + assert_eq!(resp.child_text("AirSync:Status").as_deref(), Some("1")); + let new_sid = resp.child_text("AirSync:ServerId").unwrap(); + // idempotent retry with the same key returns the same id + let add_again = Element::new("AirSync:Commands").with( + Element::new("AirSync:Add") + .with_text("AirSync:ClientId", "ev-new") + .with(Element::new("AirSync:ApplicationData").with_text("Calendar:Subject", "dup")), + ); + let (_, c2) = changes(&p, &cal, &ckey2, Some(add_again)).await; + assert_eq!( + c2.path(&["AirSync:Responses", "AirSync:Add"]) + .unwrap() + .child_text("AirSync:ServerId") + .unwrap(), + new_sid + ); + // stored in Radicale + let body = reqwest::Client::new() + .request( + reqwest::Method::from_bytes(b"PROPFIND").unwrap(), + "http://127.0.0.1:15232/jan@test.local/kalendarz/", + ) + .basic_auth(USER, Some(PASS)) + .header("Depth", "1") + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + assert!( + body.matches(".ics").count() >= 3, + "new event stored on CalDAV" + ); + + // ---- tasks + contacts + let (_, ts) = full_sync(&p, &tasks).await; + assert!(ts.iter().any(|t| t + .child("AirSync:ApplicationData") + .and_then(|a| a.child_text("Tasks:Subject")) + .as_deref() + == Some("Kupić mleko"))); + let (kkey, cs) = full_sync(&p, &contacts).await; + assert_eq!(cs.len(), 1); + let c0 = cs[0].child("AirSync:ApplicationData").unwrap(); + assert_eq!( + c0.child_text("Contacts:MobilePhoneNumber").unwrap(), + "+48 600 100 200" + ); + let csid = cs[0].child_text("AirSync:ServerId").unwrap(); + let mut changed = c0.clone(); + changed.children.retain(|x| !x.is("Contacts:JobTitle")); + changed.push_text("Contacts:JobTitle", "Kierownik"); + let ch = Element::new("AirSync:Commands").with( + Element::new("AirSync:Change") + .with_text("AirSync:ServerId", csid) + .with(changed), + ); + let (_, c) = changes(&p, &contacts, &kkey, Some(ch)).await; + assert!( + c.child("AirSync:Responses").is_none(), + "contact change ok: {}", + c.to_xml() + ); + + // ---- search + let gal = Element::new("Search:Search").with( + Element::new("Search:Store") + .with_text("Search:Name", "GAL") + .with_text("Search:Query", "Nowak") + .with(Element::new("Search:Options").with_text("Search:Range", "0-9")), + ); + let (_, r) = p.cmd("Search", Some(gal)).await.unwrap(); + let r = r.unwrap(); + assert_eq!( + r.path(&["Search:Response", "Search:Store"]) + .unwrap() + .child_text("Search:Total") + .as_deref(), + Some("1"), + "{}", + r.to_xml() + ); + let ms = Element::new("Search:Search").with( + Element::new("Search:Store") + .with_text("Search:Name", "Mailbox") + .with( + Element::new("Search:Query").with( + Element::new("Search:And") + .with_text("AirSync:Class", "Email") + .with_text("AirSync:CollectionId", inbox.clone()) + .with_text("Search:FreeText", "wiadomości numer"), + ), + ) + .with(Element::new("Search:Options").with_text("Search:Range", "0-9")), + ); + let (_, r) = p.cmd("Search", Some(ms)).await.unwrap(); + let r = r.unwrap(); + let total: u32 = r + .path(&["Search:Response", "Search:Store"]) + .unwrap() + .child_text("Search:Total") + .unwrap() + .parse() + .unwrap(); + assert!(total >= 1, "mailbox search: {}", r.to_xml()); + + // ---- folder create / rename / delete + let fc = Element::new("FolderHierarchy:FolderCreate") + .with_text("FolderHierarchy:SyncKey", fkey.clone()) + .with_text("FolderHierarchy:ParentId", "0") + .with_text("FolderHierarchy:DisplayName", "Nowy folder ż") + .with_text("FolderHierarchy:Type", "12"); + let (_, r) = p.cmd("FolderCreate", Some(fc)).await.unwrap(); + let r = r.unwrap(); + assert_eq!( + r.child_text("FolderHierarchy:Status").as_deref(), + Some("1"), + "{}", + r.to_xml() + ); + let nkey = r.child_text("FolderHierarchy:SyncKey").unwrap(); + let nid = r.child_text("FolderHierarchy:ServerId").unwrap(); + let fu = Element::new("FolderHierarchy:FolderUpdate") + .with_text("FolderHierarchy:SyncKey", nkey) + .with_text("FolderHierarchy:ServerId", nid.clone()) + .with_text("FolderHierarchy:ParentId", "0") + .with_text("FolderHierarchy:DisplayName", "Zmieniony"); + let (_, r) = p.cmd("FolderUpdate", Some(fu)).await.unwrap(); + let r = r.unwrap(); + assert_eq!( + r.child_text("FolderHierarchy:Status").as_deref(), + Some("1"), + "{}", + r.to_xml() + ); + let fd = Element::new("FolderHierarchy:FolderDelete") + .with_text( + "FolderHierarchy:SyncKey", + r.child_text("FolderHierarchy:SyncKey").unwrap(), + ) + .with_text("FolderHierarchy:ServerId", nid); + let (_, r) = p.cmd("FolderDelete", Some(fd)).await.unwrap(); + assert_eq!( + r.unwrap().child_text("FolderHierarchy:Status").as_deref(), + Some("1") + ); + + // ---- settings / user information + let s = Element::new("Settings:Settings") + .with(Element::new("Settings:UserInformation").with_empty("Settings:Get")); + let (_, r) = p.cmd("Settings", Some(s)).await.unwrap(); + assert!(r.unwrap().to_xml().contains(USER)); + + // ---- ping: new mail during heartbeat + let (fresh_key, _) = changes(&p, &inbox, &ikey, None).await; + let _ = fresh_key; + let ping = Element::new("Ping:Ping") + .with_text("Ping:HeartbeatInterval", "60") + .with( + Element::new("Ping:Folders").with( + Element::new("Ping:Folder") + .with_text("Ping:Id", inbox.clone()) + .with_text("Ping:Class", "Email"), + ), + ); + let started = std::time::Instant::now(); + let pinger = tokio::spawn({ + let p2 = Probe::new(&url, USER, PASS, &dev, true).unwrap(); + let key = p.policy_key.clone(); + async move { + let mut p2 = p2; + p2.policy_key = key; + p2.cmd("Ping", Some(ping)).await + } + }); + tokio::time::sleep(Duration::from_secs(3)).await; + im.append( + "INBOX", + "", + b"From: x@y.pl\r\nTo: jan@test.local\r\nSubject: Push!\r\n\r\npush\r\n", + ) + .await + .unwrap(); + let (_, r) = pinger.await.unwrap().unwrap(); + let r = r.unwrap(); + assert_eq!( + r.child_text("Ping:Status").as_deref(), + Some("2"), + "{}", + r.to_xml() + ); + assert!( + started.elapsed() < Duration::from_secs(20), + "push latency {:?}", + started.elapsed() + ); + eprintln!("ping reported change after {:?}", started.elapsed()); + + // ---- sent folder sync works too + let (_, sent_items) = full_sync(&p, &sent).await; + assert!(!sent_items.is_empty()); + let (_, trash_items) = full_sync(&p, &trash).await; + assert!(!trash_items.is_empty()); + + // ---- autodiscover + let base = std::env::var("AP_E2E_URL").unwrap(); + let ad = reqwest::Client::new() + .post(format!("{base}/autodiscover/autodiscover.xml")) + .basic_auth(USER, Some(PASS)) + .body(r#"jan@test.localhttp://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006"#) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); + assert!( + ad.contains("MobileSync") && ad.contains("Microsoft-Server-ActiveSync"), + "{ad}" + ); + eprintln!("e2e OK"); +} diff --git a/tools/dev/screenshots.js b/tools/dev/screenshots.js new file mode 100644 index 0000000..b943bc2 --- /dev/null +++ b/tools/dev/screenshots.js @@ -0,0 +1,73 @@ +// Regenerate docs/images/*.png from a running ActivePush panel (Playwright). +// node tools/dev/screenshots.js http://127.0.0.1:9091 admin 'password' [outdir] +// With SETUP_TOKEN= in the environment the first-run screen is captured and the +// administrator is created with the given credentials. +const { chromium } = require('playwright'); +const path = require('path'); + +(async () => { + const [base, user, pass, out = path.join(__dirname, '../../docs/images')] = process.argv.slice(2); + if (!base || !user || !pass) { + console.error('usage: node screenshots.js URL USER PASSWORD [OUTDIR]'); + process.exit(2); + } + const browser = await chromium.launch(); + const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 }, locale: 'en-US', deviceScaleFactor: 1 }); + const page = await ctx.newPage(); + const errors = []; + page.on('pageerror', (e) => errors.push(e.message)); + const shot = async (name, full = false) => { + await page.screenshot({ path: path.join(out, `${name}.png`), fullPage: full }); + console.log('saved', name); + }; + + await page.goto(base + '/'); + await page.waitForSelector('#auth:not([hidden])'); + if (process.env.SETUP_TOKEN) { + await page.fill('#setup-token', process.env.SETUP_TOKEN); + await page.fill('#username', user); + await shot('setup'); + await page.fill('#password', pass); + await page.fill('#password2', pass); + } else { + await page.fill('#username', user); + await page.fill('#password', pass); + } + await page.click('#auth-submit'); + await page.waitForSelector('#shell:not([hidden])'); + + const pages = [ + ['overview', true, 5000], ['live', false, 6000], ['devices', false, 2500], ['users', false, 2500], + ['backends', false, 1500], ['activesync', false, 1500], ['policies', false, 1500], ['security', false, 1500], + ['logs', false, 4000], + ]; + for (const [id, full, wait] of pages) { + await page.goto(`${base}/#${id}`); + await page.waitForTimeout(wait); + await shot(id === 'users' ? 'mailboxes' : id, full); + } + await page.goto(`${base}/#devices`); + await page.waitForTimeout(2000); + const chips = await page.$$('.chip[data-pid]'); + if (chips.length) { + await chips[0].click(); + await page.waitForTimeout(1200); + await shot('device'); + } + await page.goto(`${base}/#overview`); + await page.waitForTimeout(500); + await page.click('#theme'); + await page.waitForTimeout(4000); + await shot('overview-light'); + await page.click('#theme'); + + const mobile = await browser.newContext({ viewport: { width: 390, height: 844 }, locale: 'en-US', deviceScaleFactor: 2, storageState: await ctx.storageState() }); + const mp = await mobile.newPage(); + await mp.goto(`${base}/#overview`); + await mp.waitForTimeout(4000); + await mp.screenshot({ path: path.join(out, 'mobile.png') }); + console.log('saved mobile'); + + if (errors.length) console.error('page errors:', errors); + await browser.close(); +})(); diff --git a/tools/dev/test-backends.sh b/tools/dev/test-backends.sh new file mode 100755 index 0000000..37ed441 --- /dev/null +++ b/tools/dev/test-backends.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash +# Local throw-away backends for development and end-to-end tests: +# Dovecot IMAP 127.0.0.1:11143 (plain, test only) +# Radicale 127.0.0.1:15232 (CalDAV + CardDAV) +# SMTP sink 127.0.0.1:12525 (prints/stores every message, no auth) +# Test account: jan@test.local / Test-Password-123 +# +# NEVER use this configuration in production. Ctrl+C stops everything. +set -euo pipefail +ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" +DIR="${AP_TEST_DIR:-$ROOT/data/test-backends}" +RUN_USER="${AP_TEST_USER:-$(id -un)}" +if [[ "$RUN_USER" == "root" ]]; then + printf 'Run as a normal user or set AP_TEST_USER=.\n' >&2 + exit 2 +fi +for bin in dovecot radicale python3; do + command -v "$bin" >/dev/null 2>&1 || { printf 'Missing %s (apt install dovecot-imapd; pip install radicale aiosmtpd)\n' "$bin" >&2; exit 127; } +done +python3 -c 'import aiosmtpd' 2>/dev/null || { printf 'Missing python aiosmtpd (pip install aiosmtpd)\n' >&2; exit 127; } +UIDN="$(id -u "$RUN_USER")"; GIDN="$(id -g "$RUN_USER")" +mkdir -p "$DIR"/{mail,run,radicale,sink} +chown -R "$RUN_USER" "$DIR" 2>/dev/null || true + +cat > "$DIR/users" < "$DIR/dovecot.conf" < "$DIR/radicale/users" +cat > "$DIR/radicale/config" < "$DIR/sink.py" <<'EOF' +import asyncio, sys, time, os +from aiosmtpd.controller import Controller +out = sys.argv[1] +class H: + async def handle_DATA(self, server, session, envelope): + name = os.path.join(out, f"{time.time():.6f}.eml") + with open(name, "wb") as f: + f.write(f"X-Envelope-From: {envelope.mail_from}\r\nX-Envelope-To: {', '.join(envelope.rcpt_tos)}\r\n".encode()) + f.write(envelope.content) + print(f"[smtp-sink] {envelope.mail_from} -> {envelope.rcpt_tos} ({len(envelope.content)} bytes) saved {name}", flush=True) + return "250 OK" +c = Controller(H(), hostname="127.0.0.1", port=12525) +c.start() +print("[smtp-sink] listening on 127.0.0.1:12525", flush=True) +try: + asyncio.new_event_loop().run_forever() +except KeyboardInterrupt: + pass +EOF + +pids=() +cleanup() { for p in "${pids[@]}"; do kill "$p" 2>/dev/null || true; done; dovecot -c "$DIR/dovecot.conf" stop 2>/dev/null || true; } +trap cleanup EXIT INT TERM + +dovecot -c "$DIR/dovecot.conf" +if [[ "$(id -un)" == "$RUN_USER" ]]; then + radicale -C "$DIR/radicale/config" >"$DIR/radicale.log" 2>&1 & pids+=($!) + python3 "$DIR/sink.py" "$DIR/sink" & pids+=($!) +else + su -s /bin/bash "$RUN_USER" -c "radicale -C '$DIR/radicale/config' >'$DIR/radicale.log' 2>&1" & pids+=($!) + su -s /bin/bash "$RUN_USER" -c "python3 '$DIR/sink.py' '$DIR/sink'" & pids+=($!) +fi +sleep 1 +cat < $DIR/sink + accounts jan, anna, biuro, kasia @test.local, password Test-Password-123 +Apply matching settings with: ./dev.sh config apply tools/dev/test-settings.json +Press Ctrl+C to stop. +EOF +wait diff --git a/tools/dev/test-settings.json b/tools/dev/test-settings.json new file mode 100644 index 0000000..ed5a076 --- /dev/null +++ b/tools/dev/test-settings.json @@ -0,0 +1,10 @@ +{ + "general": { "server_name": "ActivePush DEV", "default_timezone": "Europe/Warsaw", "login_format": "as_given", "default_domain": "test.local", "email_template": "{login}" }, + "imap": { "host": "127.0.0.1", "port": 11143, "security": "none", "verify_tls": false }, + "smtp": { "method": "smtp", "host": "127.0.0.1", "port": 12525, "security": "none", "auth": "none", "verify_tls": false }, + "caldav": { "enabled": true, "base_url": "http://127.0.0.1:15232", "path": "/%u/", "verify_tls": false }, + "carddav": { "enabled": true, "base_url": "http://127.0.0.1:15232", "path": "/%u/", "verify_tls": false, "gal_min_length": 2 }, + "ping": { "check_interval_secs": 5, "lifetime_min": 30, "lifetime_max": 3540, "max_folders": 300 }, + "sync": { "heartbeat_min": 30 }, + "security": { "auth_fail_max": 20 } +} diff --git a/tools/zpush-import.py b/tools/zpush-import.py new file mode 100755 index 0000000..6e01272 --- /dev/null +++ b/tools/zpush-import.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python3 +"""Convert an existing Z-Push installation's configuration into ActivePush settings JSON. + +Usage: + python3 zpush-import.py /usr/share/z-push # source layout (config.php, backend/*/config.php) + python3 zpush-import.py /etc/z-push # Debian package layout (*.conf.php) + python3 zpush-import.py /var/www/z-push > zpush.json + active-push config apply zpush.json + +Only settings are converted. Device sync states are not portable: devices notice the new +server (unknown sync key / policy key) and resynchronise automatically. +""" +import configparser +import json +import pathlib +import re +import sys + +DEFINE = re.compile(r"""^\s*define\s*\(\s*['"]([A-Z0-9_]+)['"]\s*,\s*(.+?)\)\s*;""", re.S) + + +def php_value(raw): + raw = raw.strip() + if raw.startswith(("'", '"')) and raw.endswith(raw[0]): + return raw[1:-1].replace("\\'", "'").replace('\\"', '"') + low = raw.lower() + if low in ("true", "false"): + return low == "true" + if re.fullmatch(r"-?\d+", raw): + return int(raw) + if low.startswith("array(") or raw.startswith("["): + inner = raw[raw.index("(") + 1: raw.rindex(")")] if low.startswith("array(") else raw[1:-1] + out = {} + for k, v in re.findall(r"""['"]([^'"]+)['"]\s*=>\s*('[^']*'|"[^"]*"|[^,\)]+)""", inner): + out[k] = php_value(v) + return out + if low.startswith("serialize("): + return None + return {"__const__": raw} + + +def read_defines(paths): + defs = {} + for p in paths: + text = p.read_text(errors="replace") + # strip block comments and line comments + text = re.sub(r"/\*.*?\*/", "", text, flags=re.S) + lines = [l for l in text.splitlines() if not l.strip().startswith(("//", "#"))] + joined = "\n".join(lines) + for m in re.finditer(r"define\s*\(.*?\)\s*;", joined, re.S): + d = DEFINE.match(m.group(0)) + if d: + defs[d.group(1)] = php_value(d.group(2)) + return defs + + +def find_configs(root): + root = pathlib.Path(root) + files = [] + for pat in ["config.php", "*.conf.php", "backend/*/config.php", "autodiscover/config.php", "src/config.php", "src/backend/*/config.php", "src/autodiscover/config.php"]: + files += [f for f in root.glob(pat) if f.is_file()] + policies = [f for f in [root / "policies.ini", root / "src/policies.ini"] if f.is_file()] + return sorted(set(files)), policies + + +FILTER = {"SYNC_FILTERTYPE_ALL": 0, "SYNC_FILTERTYPE_1DAY": 1, "SYNC_FILTERTYPE_3DAYS": 2, "SYNC_FILTERTYPE_1WEEK": 3, + "SYNC_FILTERTYPE_2WEEKS": 4, "SYNC_FILTERTYPE_1MONTH": 5, "SYNC_FILTERTYPE_3MONTHS": 6, "SYNC_FILTERTYPE_6MONTHS": 7} + +POLICY_KEYS = { + "devpwenabled": bool, "alphanumpwreq": bool, "devencenabled": bool, "attenabled": bool, "mindevpwlenngth": int, + "maxinacttimedevlock": int, "maxdevpwfailedattempts": int, "maxattsize": int, "allowsimpledevpw": bool, + "devpwexpiration": int, "devpwhistory": int, "allowstoragecard": bool, "allowcam": bool, "reqdevenc": bool, + "allowunsignedapps": bool, "mindevcomplexchars": int, "allowwifi": bool, "allowtextmessaging": bool, + "allowpopimapemail": bool, "allowbluetooth": int, "allowirda": bool, "reqmansyncroam": bool, "maxcalagefilter": int, + "allowhtmlemail": bool, "maxemailagefilter": int, "maxemailbodytruncsize": int, "maxemailhtmlbodytruncsize": int, + "reqsignedsmimemessages": bool, "reqencsmimemessages": bool, "reqsignedsmimealgorithm": int, + "reqencsmimealgorithm": int, "allowsmimeencalgneg": int, "allowsmimesoftcerts": bool, "allowbrowser": bool, + "allowconsumeremail": bool, "allowinternetsharing": bool, "allowremotedesktop": bool, "allowdesktopsync": bool, + "allowunsignedinstallationpackages": bool, "pwrecoveryenabled": bool, +} + + +def parse_policies(path): + cp = configparser.ConfigParser(interpolation=None, strict=False) + cp.read_string(path.read_text(errors="replace")) + out = [] + for sec in cp.sections(): + p = {"name": sec} + for k, typ in POLICY_KEYS.items(): + if k in cp[sec]: + v = cp[sec][k].strip().strip("'\"") + if v == "": + continue + try: + p[k] = (int(v) != 0) if typ is bool else int(v) + except ValueError: + pass + out.append(p) + return out + + +def main(): + if len(sys.argv) != 2: + print(__doc__, file=sys.stderr) + sys.exit(2) + files, pol_files = find_configs(sys.argv[1]) + if not files: + sys.exit(f"no Z-Push configuration files found in {sys.argv[1]}") + d = read_defines(files) + notes = [f"read {f}" for f in files] + s = {"general": {}, "imap": {}, "smtp": {}, "caldav": {}, "carddav": {}, "sync": {}, "ping": {}, "provisioning": {}, "autodiscover": {}} + + if isinstance(d.get("TIMEZONE"), str) and d["TIMEZONE"]: + s["general"]["default_timezone"] = d["TIMEZONE"] + if "USE_FULLEMAIL_FOR_LOGIN" in d: + s["general"]["login_format"] = "as_given" if d["USE_FULLEMAIL_FOR_LOGIN"] else "local_part" + + # IMAP + if "IMAP_SERVER" in d: + s["imap"]["host"] = d["IMAP_SERVER"] + if "IMAP_PORT" in d: + s["imap"]["port"] = int(d["IMAP_PORT"]) + opts = str(d.get("IMAP_OPTIONS", "")).lower() + if opts: + if "/ssl" in opts: + s["imap"]["security"] = "tls" + elif "/tls" in opts: + s["imap"]["security"] = "start_tls" + elif "/notls" in opts: + s["imap"]["security"] = "none" + s["imap"]["verify_tls"] = "novalidate-cert" not in opts + for zk, ak in [("IMAP_FOLDER_PREFIX", "folder_prefix"), ("IMAP_FOLDER_INBOX", "folder_inbox"), ("IMAP_FOLDER_SENT", "folder_sent"), + ("IMAP_FOLDER_DRAFT", "folder_drafts"), ("IMAP_FOLDER_TRASH", "folder_trash"), ("IMAP_FOLDER_SPAM", "folder_spam"), + ("IMAP_FOLDER_ARCHIVE", "folder_archive")]: + if isinstance(d.get(zk), str): + s["imap"][ak] = d[zk] + if "IMAP_AUTOSEEN_ON_DELETE" in d: + s["imap"]["autoseen_on_delete"] = bool(d["IMAP_AUTOSEEN_ON_DELETE"]) + if "IMAP_INLINE_FORWARD" in d: + s["imap"]["inline_forward"] = bool(d["IMAP_INLINE_FORWARD"]) + if isinstance(d.get("IMAP_EXCLUDED_FOLDERS"), str) and d["IMAP_EXCLUDED_FOLDERS"]: + s["imap"]["excluded_folders"] = [x for x in d["IMAP_EXCLUDED_FOLDERS"].split("|") if x] + df = d.get("IMAP_DEFAULTFROM") + if isinstance(df, str): + if df.startswith("@"): + s["general"]["email_template"] = "{local}" + df + elif df == "domain": + s["general"]["email_template"] = "{local}@{domain}" + elif df in ("", "username"): + s["general"]["email_template"] = "{login}" + elif df in ("sql", "ldap"): + notes.append("IMAP_DEFAULTFROM sql/ldap is not supported; using {login} - adjust email_template") + + # SMTP + method = str(d.get("IMAP_SMTP_METHOD", "")).lower() + if method in ("mail", "sendmail"): + s["smtp"]["method"] = "sendmail" + notes.append("SMTP method 'mail'/'sendmail' -> sendmail (consider SMTP submission on port 587 instead)") + elif method == "smtp": + s["smtp"]["method"] = "smtp" + params = d.get("IMAP_SMTP_PARAMS") if isinstance(d.get("IMAP_SMTP_PARAMS"), dict) else {} + host = str(params.get("host", "localhost")) + if host.startswith("ssl://") or host.startswith("tls://"): + s["smtp"]["security"] = "tls" + host = host.split("://", 1)[1] + s["smtp"]["host"] = host + s["smtp"]["port"] = int(params.get("port", 25)) + if s["smtp"]["port"] == 587: + s["smtp"]["security"] = "start_tls" + if params.get("auth"): + if params.get("username") == "imap_username": + s["smtp"]["auth"] = "user_credentials" + else: + s["smtp"]["auth"] = "static" + s["smtp"]["username"] = str(params.get("username", "")) + s["smtp"]["password"] = str(params.get("password", "")) + else: + s["smtp"]["auth"] = "none" + if params.get("verify_peer") is False: + s["smtp"]["verify_tls"] = False + + # CalDAV / CardDAV + def dav(prefix, key): + server = d.get(f"{prefix}_SERVER") + if not isinstance(server, str) or server in ("", "caldavserver.domain.com"): + return + proto = d.get(f"{prefix}_PROTOCOL", "https") + port = d.get(f"{prefix}_PORT", 443 if proto == "https" else 80) + default_port = (proto == "https" and str(port) == "443") or (proto == "http" and str(port) == "80") + s[key]["enabled"] = True + s[key]["base_url"] = f"{proto}://{server}" + ("" if default_port else f":{port}") + if isinstance(d.get(f"{prefix}_PATH"), str): + s[key]["path"] = d[f"{prefix}_PATH"] + if f"{prefix}_PATH_INCLUDE" in d and isinstance(d[f"{prefix}_PATH_INCLUDE"], str): + s[key]["include_regex"] = d[f"{prefix}_PATH_INCLUDE"].strip("/") + if f"{prefix}_PATH_EXCLUDE" in d and isinstance(d[f"{prefix}_PATH_EXCLUDE"], str): + s[key]["exclude_regex"] = d[f"{prefix}_PATH_EXCLUDE"].strip("/") + ssl = d.get("DAV_SSL_VERIFY") + if isinstance(ssl, dict) and "NONE" in ssl.get("__const__", ""): + s[key]["verify_tls"] = False + dav("CALDAV", "caldav") + dav("CARDDAV", "carddav") + if isinstance(d.get("CARDDAV_GAL_PATH"), str): + s["carddav"]["gal_path"] = d["CARDDAV_GAL_PATH"] + if isinstance(d.get("CARDDAV_GAL_MIN_LENGTH"), int): + s["carddav"]["gal_min_length"] = d["CARDDAV_GAL_MIN_LENGTH"] + if isinstance(d.get("CARDDAV_DEFAULT_PATH"), str): + s["carddav"]["default_collection"] = d["CARDDAV_DEFAULT_PATH"].rstrip("/").rsplit("/", 1)[-1] + + # sync / ping / provisioning + if isinstance(d.get("SYNC_MAX_ITEMS"), int): + s["sync"]["max_items"] = d["SYNC_MAX_ITEMS"] + ft = d.get("SYNC_FILTERTIME_MAX") + if isinstance(ft, dict) and ft.get("__const__") in FILTER: + s["sync"]["filter_time_max"] = FILTER[ft["__const__"]] + sc = d.get("SYNC_CONFLICT_DEFAULT") + if isinstance(sc, dict): + s["sync"]["server_wins"] = "OVERWRITE_PIM" in sc["__const__"] + for zk, sec, ak in [("PING_INTERVAL", "ping", "check_interval_secs"), ("PING_LOWER_BOUND_LIFETIME", "ping", "lifetime_min"), + ("PING_HIGHER_BOUND_LIFETIME", "ping", "lifetime_max"), ("RETRY_AFTER_DELAY", "sync", "retry_after_secs"), + ("SEARCH_WAIT", "sync", "search_wait_secs"), ("SEARCH_MAXRESULTS", "sync", "search_max_results")]: + if isinstance(d.get(zk), int) and not isinstance(d.get(zk), bool): + s[sec][ak] = d[zk] + if isinstance(d.get("SYNC_CONTACTS_MAXPICTURESIZE"), int): + s["carddav"]["max_picture_kb"] = max(1, d["SYNC_CONTACTS_MAXPICTURESIZE"] // 1024) + if "PROVISIONING" in d: + s["provisioning"]["enabled"] = bool(d["PROVISIONING"]) + if "LOOSE_PROVISIONING" in d: + s["provisioning"]["loose"] = bool(d["LOOSE_PROVISIONING"]) + if pol_files: + pols = parse_policies(pol_files[0]) + if pols: + s["provisioning"]["policies"] = pols + s["provisioning"]["default_policy"] = "default" if any(p["name"] == "default" for p in pols) else pols[0]["name"] + notes.append(f"imported {len(pols)} polic{'y' if len(pols) == 1 else 'ies'} from {pol_files[0]}") + if isinstance(d.get("ZPUSH_HOST"), str) and d["ZPUSH_HOST"]: + s["autodiscover"]["server_url"] = f"https://{d['ZPUSH_HOST']}/Microsoft-Server-ActiveSync" + + s = {k: v for k, v in s.items() if v} + for n in notes: + print(f"# {n}", file=sys.stderr) + print(json.dumps(s, indent=2, ensure_ascii=False)) + + +if __name__ == "__main__": + main() diff --git a/web/app.js b/web/app.js new file mode 100644 index 0000000..43f3ff4 --- /dev/null +++ b/web/app.js @@ -0,0 +1,931 @@ +'use strict'; +(() => { + // ------------------------------------------------------------------ basics + const $ = (s, r = document) => r.querySelector(s); + const $$ = (s, r = document) => Array.from(r.querySelectorAll(s)); + const ESC = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; + const esc = (s) => String(s ?? '').replace(/[&<>"']/g, (c) => ESC[c]); + const store = { + get(k, d) { try { return localStorage.getItem(k) ?? d; } catch { return d; } }, + set(k, v) { try { localStorage.setItem(k, v); } catch { /* private mode */ } }, + }; + let LANG = store.get('ap.lang', 'en'); + const T = (pl, en) => (LANG === 'pl' ? pl : en); + + const S = { session: null, csrf: '', settings: null, timezones: [], timers: [], sse: null, page: 'overview', devices: [] }; + + function clearTimers() { + S.timers.forEach((t) => clearInterval(t)); + S.timers = []; + if (S.sse) { S.sse.close(); S.sse = null; } + } + function every(ms, fn) { fn(); S.timers.push(setInterval(fn, ms)); } + + // ------------------------------------------------------------------ formatting + const fmtNum = (n) => (n == null ? '-' : Number(n).toLocaleString(LANG === 'pl' ? 'pl-PL' : 'en-US')); + function fmtBytes(b) { + b = Number(b || 0); + const u = ['B', 'KB', 'MB', 'GB', 'TB']; + let i = 0; + while (b >= 1024 && i < u.length - 1) { b /= 1024; i++; } + return `${b.toFixed(b < 10 && i ? 1 : 0)} ${u[i]}`; + } + function fmtDur(s) { + s = Math.max(0, Math.floor(s)); + const d = Math.floor(s / 86400), h = Math.floor((s % 86400) / 3600), m = Math.floor((s % 3600) / 60); + if (d) return `${d}d ${h}h`; + if (h) return `${h}h ${m}m`; + if (m) return `${m}m ${s % 60}s`; + return `${s}s`; + } + const fmtTs = (t) => (t ? new Date(t * 1000).toLocaleString(LANG === 'pl' ? 'pl-PL' : 'en-GB') : '-'); + const fmtTime = (t) => (t ? new Date(t * 1000).toLocaleTimeString(LANG === 'pl' ? 'pl-PL' : 'en-GB') : '-'); + function ago(t) { + if (!t) return T('nigdy', 'never'); + const s = Math.floor(Date.now() / 1000) - t; + if (s < 60) return T(`${s}s temu`, `${s}s ago`); + return T(`${fmtDur(s)} temu`, `${fmtDur(s)} ago`); + } + + // ------------------------------------------------------------------ api + async function api(method, path, body) { + const opt = { method, credentials: 'same-origin', headers: {} }; + if (method !== 'GET') opt.headers['X-CSRF-Token'] = S.csrf; + if (body !== undefined) { + opt.headers['Content-Type'] = 'application/json'; + opt.body = JSON.stringify(body); + } + const r = await fetch(path, opt); + if (r.status === 401 && !path.startsWith('/api/login') && !path.startsWith('/api/setup')) { + showAuth(); + throw new Error(T('Sesja wygasła', 'Session expired')); + } + const ct = r.headers.get('content-type') || ''; + const data = ct.includes('json') ? await r.json() : await r.text(); + if (!r.ok) throw new Error((data && data.error) || `HTTP ${r.status}`); + return data; + } + + let toastT; + function toast(msg, error) { + const t = $('#toast'); + t.textContent = msg; + t.classList.toggle('error', !!error); + t.hidden = false; + clearTimeout(toastT); + toastT = setTimeout(() => { t.hidden = true; }, error ? 6000 : 3000); + } + + function applyWidths(root) { + $$('[data-w]', root).forEach((el) => { el.style.width = `${Math.max(0, Math.min(100, Number(el.dataset.w)))}%`; }); + } + + // ------------------------------------------------------------------ charts (SVG) + const NS = 'http://www.w3.org/2000/svg'; + function niceMax(v) { + if (v <= 0) return 1; + const p = 10 ** Math.floor(Math.log10(v)); + for (const m of [1, 2, 2.5, 5, 10]) if (m * p >= v) return m * p; + return 10 * p; + } + + /** Line/area chart. series: [{name, cls:'k1', values:[...] }], labels: [string] */ + function lineChart(el, { labels, series, height = 170, area = true, fmt = fmtNum, bars = false, min = 1 }) { + const W = Math.max(el.clientWidth || 600, 280), H = height, L = 46, R = 22, Tp = 8, B = 20; + const n = labels.length; + const max = niceMax(Math.max(min, ...series.flatMap((s) => s.values))); + const slot = (W - L - R) / Math.max(1, n); + const x = bars ? (i) => L + slot * (i + 0.5) : (i) => L + (n <= 1 ? 0 : (i * (W - L - R)) / (n - 1)); + const y = (v) => Tp + (H - Tp - B) * (1 - v / max); + let svg = ``; + for (let g = 0; g <= 4; g++) { + const v = (max * g) / 4, yy = y(v); + svg += `${esc(fmt(Math.round(v * 100) / 100))}`; + } + const step = Math.max(1, Math.ceil(n / 8)); + for (let i = 0; i < n; i += step) { + const anchor = !bars && n > 1 && i === 0 ? 'start' : (x(i) > W - R - 30 ? 'end' : 'middle'); + svg += `${esc(labels[i])}`; + } + if (bars) { + const bw = Math.min(26, Math.max(1, (slot * 0.7) / series.length)); + series.forEach((s, si) => { + s.values.forEach((v, i) => { + const xx = x(i) - (bw * series.length) / 2 + si * bw; + svg += ``; + }); + }); + } else { + series.forEach((s) => { + const pts = s.values.map((v, i) => `${x(i)},${y(v)}`).join(' '); + if (area && n > 1) svg += ``; + svg += ``; + }); + } + svg += ``; + el.innerHTML = `
${svg}
+
${series.map((s) => `${esc(s.name)}`).join('')}
`; + const wrap = $('.chart-wrap', el), tip = $('.chart-tip', el), cur = $('#cur', el), svgEl = $('svg', el); + wrap.addEventListener('mousemove', (e) => { + const rect = svgEl.getBoundingClientRect(); + const px = ((e.clientX - rect.left) / rect.width) * W; + const i = Math.max(0, Math.min(n - 1, bars ? Math.floor((px - L) / slot) : Math.round(((px - L) / (W - L - R)) * (n - 1)))); + cur.setAttribute('x1', x(i)); cur.setAttribute('x2', x(i)); cur.setAttribute('visibility', 'visible'); + tip.innerHTML = `${esc(labels[i])}
${series.map((s) => `${esc(s.name)}: ${esc(fmt(s.values[i]))}`).join('
')}`; + tip.hidden = false; + const left = Math.min(e.clientX - rect.left + 12, rect.width - tip.offsetWidth - 4); + tip.style.left = `${Math.max(0, left)}px`; + tip.style.top = '6px'; + }); + wrap.addEventListener('mouseleave', () => { tip.hidden = true; cur.setAttribute('visibility', 'hidden'); }); + } + + function spark(values, cls = 'k1') { + const n = values.length; + if (n < 2) return ''; + const max = Math.max(1, ...values); + const pts = values.map((v, i) => `${(i * 100) / (n - 1)},${30 - (v / max) * 28}`).join(' '); + return ``; + } + + function donut(el, items, center) { + const total = items.reduce((a, b) => a + b.value, 0) || 1; + const r = 48, C = 2 * Math.PI * r; + let off = 0, arcs = ''; + items.forEach((it, i) => { + const len = (it.value / total) * C; + arcs += `${esc(it.label)}: ${it.value}`; + off += len; + }); + el.innerHTML = `
${arcs}${esc(center ?? total)} +
${items.map((it, i) => `
${esc(it.label)} - ${fmtNum(it.value)}
`).join('') || `
${T('Brak danych', 'No data')}
`}
`; + } + + function hbars(items, cls = 'k1') { + const max = Math.max(1, ...items.map((i) => i.value)); + return items.map((i) => `
${esc(i.label)}
${fmtNum(i.value)}
`).join('') + || `
${T('Brak danych', 'No data')}
`; + } + + // ------------------------------------------------------------------ modal + function modal(html, cls = '') { + const root = $('#modal-root'); + root.innerHTML = `
`; + const bd = $('.backdrop', root); + bd.addEventListener('mousedown', (e) => { if (e.target === bd) closeModal(); }); + $$('[data-close]', root).forEach((b) => b.addEventListener('click', closeModal)); + document.addEventListener('keydown', escClose); + applyWidths(root); + return $('.dialog', root); + } + function escClose(e) { if (e.key === 'Escape') closeModal(); } + function closeModal() { $('#modal-root').innerHTML = ''; document.removeEventListener('keydown', escClose); } + + function confirmBox(title, text, danger, typed) { + return new Promise((resolve) => { + const d = modal(`

${esc(title)}

+

${esc(text)}

+ ${typed ? `` : ''} +
`, 'small'); + $('#cf-ok', d).addEventListener('click', () => { + if (typed && $('#cf-typed', d).value.trim() !== typed) { toast(T('Wpisany tekst się nie zgadza', 'Text does not match'), true); return; } + closeModal(); resolve(true); + }); + $$('[data-close]', d).forEach((b) => b.addEventListener('click', () => resolve(false))); + }); + } + + // ------------------------------------------------------------------ navigation + const NAV = [ + ['overview', T('Przegląd', 'Overview')], + ['live', T('Na żywo', 'Live')], + ['devices', T('Urządzenia', 'Devices')], + ['users', T('Skrzynki', 'Mailboxes')], + ['backends', T('Backendy', 'Backends')], + ['activesync', 'ActiveSync'], + ['policies', T('Polityki', 'Policies')], + ['security', T('Bezpieczeństwo', 'Security')], + ['logs', T('Logi i audyt', 'Logs & audit')], + ['about', T('O programie', 'About')], + ]; + const navLabel = (id) => (NAV.find((n) => n[0] === id) || NAV[0])[1]; + + function renderNav() { + $('#nav').innerHTML = NAV.map((n, i) => ``).join(''); + $$('#nav .nav').forEach((b) => b.addEventListener('click', () => { location.hash = b.dataset.page; $('#nav').classList.remove('open'); })); + } + + function go() { + const id = (location.hash || '#overview').slice(1).split('/')[0]; + S.page = PAGES[id] ? id : 'overview'; + clearTimers(); + closeModal(); + renderNav(); + $('#page-label').textContent = navLabel(S.page); + const v = $('#view'); + v.innerHTML = ''; + PAGES[S.page](v).catch((e) => { v.innerHTML = `
${esc(e.message)}
`; }); + } + + function head(eyebrow, title, desc, actions = '') { + return `
${esc(eyebrow)}

${esc(title)}

${desc ? `

${esc(desc)}

` : ''}
${actions}
`; + } + + // ------------------------------------------------------------------ pages + const PAGES = {}; + + PAGES.overview = async (v) => { + v.innerHTML = head(T('PANEL STEROWANIA', 'CONTROL ROOM'), T('Przegląd', 'Overview'), T('Ruch ActiveSync, aktywne połączenia push, urządzenia i stan backendów.', 'ActiveSync traffic, push connections, devices and backend state.'), ``) + + `
+
+
${T('ŻĄDANIA / MIN', 'REQUESTS / MIN')}

${T('Ruch', 'Traffic')}

+
${T('ELEMENTY / MIN', 'ITEMS / MIN')}

${T('Synchronizacja danych', 'Data synchronisation')}

+
${T('TRANSFER / MIN', 'TRANSFER / MIN')}

${T('Dane', 'Data')}

+
${T('OSTATNIE 7 DNI', 'LAST 7 DAYS')}

${T('Żądania na godzinę', 'Requests per hour')}

+
+
+
${T('OD STARTU', 'SINCE START')}

${T('Komendy', 'Commands')}

+
${T('URZĄDZENIA', 'DEVICES')}

${T('Typy urządzeń', 'Device types')}

+
RUNTIME

${T('Serwer', 'Server')}

+
`; + const rangeSel = $('#range', v); + rangeSel.value = store.get('ap.range', '60'); + rangeSel.addEventListener('change', () => { store.set('ap.range', rangeSel.value); refresh(); }); + async function refresh() { + const [o, ts] = await Promise.all([api('GET', '/api/overview'), api('GET', `/api/timeseries?minutes=${rangeSel.value}`)]); + const lab = ts.map((b) => new Date(b.t * 1000).toLocaleTimeString(LANG === 'pl' ? 'pl-PL' : 'en-GB', { hour: '2-digit', minute: '2-digit' })); + const last = ts.slice(-15); + const rpm = last.length ? Math.round(last.reduce((a, b) => a + b.requests, 0) / last.length * 10) / 10 : 0; + const errRate = o.requests ? ((o.errors / o.requests) * 100).toFixed(2) : '0.00'; + const tile = (label, value, sub, cls = '', sp = '') => `
${esc(label)}
${value}
${sub}
${sp}
`; + $('#tiles').innerHTML = [ + tile(T('Żądania / min', 'Requests / min'), esc(rpm), T(`łącznie ${fmtNum(o.requests)}`, `total ${fmtNum(o.requests)}`), 'accent', spark(ts.map((b) => b.requests))), + tile(T('Połączenia push', 'Push connections'), fmtNum(o.pings), T(`${o.active_requests} aktywnych żądań`, `${o.active_requests} active requests`), 'good', spark(ts.map((b) => b.pings), 'k2')), + tile(T('Urządzenia', 'Devices'), `${fmtNum(o.devices_24h)}/ ${fmtNum(o.devices_total)}`, T(`aktywne 24h / wszystkie · ${fmtNum(o.partnerships_total)} partnerstw`, `active 24h / total · ${fmtNum(o.partnerships_total)} partnerships`)), + tile(T('Skrzynki', 'Mailboxes'), `${fmtNum(o.users_active_15m)}/ ${fmtNum(o.users_total)}`, T('aktywne 15 min / wszystkie', 'active 15 min / total')), + tile(T('Wysłane maile', 'Mails sent'), fmtNum(o.mails_sent), T(`elementy ↓${fmtNum(o.items_out)} ↑${fmtNum(o.items_in)}`, `items ↓${fmtNum(o.items_out)} ↑${fmtNum(o.items_in)}`), '', spark(ts.map((b) => b.mails_sent), 'k3')), + tile(T('Błędy', 'Errors'), fmtNum(o.errors), `${errRate}% ${T('żądań', 'of requests')}`, o.errors ? 'bad' : '', spark(ts.map((b) => b.errors), 'k5')), + tile(T('Nieudane logowania', 'Failed logins'), fmtNum(o.auth_failures), T(`${o.lockouts} blokad aktywnych`, `${o.lockouts} active lockouts`), o.lockouts ? 'bad' : '', spark(ts.map((b) => b.auth_failures), 'k5')), + tile(T('Transfer', 'Transfer'), fmtBytes(o.bytes_out), `↑ ${fmtBytes(o.bytes_in)}`, '', spark(ts.map((b) => b.bytes_out), 'k4')), + ].join(''); + if (o.devices_pending || o.wipes_pending) { + $('#tiles').insertAdjacentHTML('afterbegin', `
${o.devices_pending ? `${o.devices_pending} ${T('urządzeń czeka na zatwierdzenie', 'devices await approval')}` : ''}${o.wipes_pending ? `${o.wipes_pending} ${T('zdalnych wymazań w toku', 'remote wipes pending')}` : ''}
`); + } + lineChart($('#ch-req'), { labels: lab, series: [ + { name: T('żądania', 'requests'), cls: 'k1', values: ts.map((b) => b.requests) }, + { name: 'ping', cls: 'k2', values: ts.map((b) => b.pings) }, + { name: T('błędy', 'errors'), cls: 'k5', values: ts.map((b) => b.errors) }, + ] }); + lineChart($('#ch-items'), { labels: lab, bars: true, series: [ + { name: T('do urządzeń', 'to devices'), cls: 'k3', values: ts.map((b) => b.items_out) }, + { name: T('z urządzeń', 'from devices'), cls: 'k4', values: ts.map((b) => b.items_in) }, + ] }); + lineChart($('#ch-bytes'), { labels: lab, fmt: fmtBytes, min: 1024, series: [ + { name: T('wysłane', 'sent'), cls: 'k4', values: ts.map((b) => b.bytes_out) }, + { name: T('odebrane', 'received'), cls: 'k6', values: ts.map((b) => b.bytes_in) }, + ] }); + $('#cmds').innerHTML = hbars(o.commands.slice(0, 12).map(([k, s]) => ({ label: k, value: s.count }))); + applyWidths($('#cmds')); + donut($('#types'), o.device_types.map(([t, n]) => ({ label: t, value: n })), o.devices_total); + $('#runtime').innerHTML = [ + [T('Wersja', 'Version'), o.version], + ['Uptime', fmtDur(o.uptime)], + [T('Pamięć RSS', 'Memory RSS'), fmtBytes(o.rss)], + [T('Pula IMAP', 'IMAP pool'), o.imap_pool], + [T('Baza danych', 'Database'), `${fmtBytes(o.db_bytes)} + WAL ${fmtBytes(o.wal_bytes)}`], + ['IMAP', o.backends.imap], + ['SMTP', o.backends.smtp], + ['CalDAV', o.backends.caldav || T('wyłączony', 'disabled')], + ['CardDAV', o.backends.carddav || T('wyłączony', 'disabled')], + ['Provisioning', o.provisioning ? T('włączony', 'enabled') : T('wyłączony', 'disabled')], + ['Autodiscover', fmtNum(o.autodiscover)], + ].map(([k, val]) => `
${esc(k)}
${esc(val)}
`).join(''); + $('#push-count').textContent = `PUSH ${o.pings}`; + } + async function hourly() { + const h = await api('GET', '/api/stats/hourly?hours=168'); + const lab = h.map((b) => { const d = new Date(b.t * 1000); return `${d.toLocaleDateString(LANG === 'pl' ? 'pl-PL' : 'en-GB', { weekday: 'short' })} ${String(d.getHours()).padStart(2, '0')}:00`; }); + lineChart($('#ch-hourly'), { labels: lab, bars: true, series: [ + { name: T('żądania', 'requests'), cls: 'k1', values: h.map((b) => b.requests) }, + { name: T('błędy', 'errors'), cls: 'k5', values: h.map((b) => b.errors) }, + ] }); + } + every(5000, () => refresh().catch(() => {})); + every(300000, () => hourly().catch(() => {})); + }; + + PAGES.live = async (v) => { + v.innerHTML = head(T('NA ŻYWO', 'LIVE'), T('Ruch na żywo', 'Live traffic'), T('Trwające żądania, połączenia push (Ping / hanging Sync) i strumień zakończonych żądań.', 'In-flight requests, push connections (Ping / hanging Sync) and a stream of finished requests.'), ``) + + `
+
PUSH

${T('Aktywne połączenia push', 'Active push connections')}

0
+
IN-FLIGHT

${T('Trwające żądania', 'Requests in progress')}

0
+
+
STREAM

${T('Zakończone żądania', 'Finished requests')}

+
+
`; + let paused = false; + $('#pause', v).addEventListener('click', (e) => { paused = !paused; e.target.textContent = paused ? T('Wznów', 'Resume') : T('Pauza', 'Pause'); }); + const filter = $('#feed-filter', v); + const feed = $('#feed', v); + const row = (e, fresh) => `
+ ${esc(fmtTime(e.ts))}${esc(e.user)} + ${esc(e.command)} ${esc(e.device_type)} ${esc(e.http)} ${esc(e.status)}${e.items_out || e.items_in ? ` ↓${e.items_out} ↑${e.items_in}` : ''} + ${e.command === 'Ping' ? fmtDur(e.ms / 1000) : `${e.ms} ms`}${fmtBytes(e.bytes_out)}
`; + const applyFilter = () => { + const q = filter.value.trim().toLowerCase(); + $$('.feed-row', feed).forEach((r) => { r.hidden = q && !r.dataset.s.includes(q); }); + }; + filter.addEventListener('input', applyFilter); + const data = await api('GET', '/api/live'); + feed.innerHTML = data.recent.map((e) => row(e, false)).join('') || `
${T('Brak żądań', 'No requests yet')}
`; + S.sse = new EventSource('/api/events'); + S.sse.addEventListener('request', (m) => { + if (paused) return; + const e = JSON.parse(m.data); + $('.empty', feed)?.remove(); + feed.insertAdjacentHTML('afterbegin', row(e, true)); + while (feed.children.length > 400) feed.lastElementChild.remove(); + applyFilter(); + }); + every(2000, async () => { + const d = await api('GET', '/api/live').catch(() => null); + if (!d) return; + $('#ping-n').textContent = d.pings.length; + $('#act-n').textContent = d.active.length; + $('#pings').innerHTML = d.pings.length ? `${d.pings.sort((a, b) => a.started - b.started).map((p) => { + const el = d.now - p.started, pct = Math.min(100, (el / Math.max(1, p.lifetime)) * 100); + return ``; + }).join('')}
${T('Użytkownik', 'User')}${T('Urządzenie', 'Device')}${T('Typ', 'Kind')}${T('Foldery', 'Folders')}${T('Heartbeat', 'Heartbeat')}
${esc(p.user)}${esc(p.device_type)}${esc(p.device_id)}${esc(p.kind)}${p.folders}${fmtDur(el)} / ${fmtDur(p.lifetime)}
` : `
${T('Brak połączeń push', 'No push connections')}
`; + $('#active').innerHTML = d.active.length ? `${d.active.map((a) => ``).join('')}
${T('Komenda', 'Command')}${T('Użytkownik', 'User')}${T('Urządzenie', 'Device')}IP${T('Czas', 'Time')}
${esc(a.command)}${esc(a.user)}${esc(a.device_type)}AS ${esc(a.version)}${esc(a.ip)}${fmtDur(d.now - a.started)}
` : `
${T('Brak', 'None')}
`; + applyWidths(v); + }); + }; + + function deviceState(d) { + const p = []; + if (d.pinging) p.push(`PUSH`); + if (d.blocked) p.push(`${T('ZABLOKOWANE', 'BLOCKED')}`); + if (!d.approved) p.push(`${T('DO ZATWIERDZENIA', 'PENDING')}`); + if (d.wipe_status === 2 || d.wipe_status === 4) p.push(`WIPE ${d.wipe_status === 4 ? T('WYSŁANY', 'SENT') : T('CZEKA', 'PENDING')}`); + if (d.wipe_status === 8) p.push(`${T('WYMAZANE', 'WIPED')}`); + if (!p.length) p.push(`OK`); + return p.join(' '); + } + + PAGES.devices = async (v) => { + v.innerHTML = head(T('PARTNERSTWA', 'PARTNERSHIPS'), T('Urządzenia', 'Devices'), T('Jeden wiersz to jedno fizyczne urządzenie; skrzynki skonfigurowane na nim są widoczne jako osobne partnerstwa. Kliknij skrzynkę, aby zobaczyć foldery, historię i akcje (wymazanie, resynchronizacja, blokada).', 'One row per physical device; each mailbox configured on it is a separate partnership. Click a mailbox for folders, history and actions (wipe, resync, block).')) + + `
+ +
`; + const q = $('#dev-q', v), f = $('#dev-f', v); + q.value = store.get('ap.devq', ''); + const draw = () => { + store.set('ap.devq', q.value); + const s = q.value.trim().toLowerCase(), now = Date.now() / 1000; + const list = S.devices.filter((d) => { + const hay = `${d.username} ${d.device_id} ${d.device_type} ${d.model} ${d.friendly_name} ${d.os} ${d.user_agent} ${d.last_ip}`.toLowerCase(); + if (s && !hay.includes(s)) return false; + if (f.value === 'push') return d.pinging; + if (f.value === 'pending') return !d.approved; + if (f.value === 'blocked') return d.blocked; + if (f.value === 'stale') return now - d.last_seen > 30 * 86400; + return true; + }); + // one row per physical device (DeviceId); every mailbox on it is a partnership chip + const groups = new Map(); + list.forEach((d) => { + if (!groups.has(d.device_id)) groups.set(d.device_id, []); + groups.get(d.device_id).push(d); + }); + const rows = Array.from(groups.values()).map((g) => g.sort((a, b2) => b2.last_seen - a.last_seen)) + .sort((a, b2) => b2[0].last_seen - a[0].last_seen); + const physical = new Set(S.devices.map((d) => d.device_id)).size; + $('#dev-n').textContent = T(`${rows.length} / ${physical} urządzeń · ${list.length} partnerstw`, `${rows.length} / ${physical} devices · ${list.length} partnerships`); + $('#dev-table').innerHTML = rows.length ? `${rows.map((g) => { + const d = g[0]; + const merged = { ...d, pinging: g.some((x) => x.pinging), blocked: g.some((x) => x.blocked), approved: g.every((x) => x.approved), wipe_status: Math.max(...g.map((x) => x.wipe_status)) }; + return ` + + + + `; + }).join('')}
${T('Urządzenie', 'Device')}${T('Skrzynki', 'Mailboxes')}OSAS${T('Ostatnio', 'Last seen')}IP${T('Żądania', 'Requests')}${T('Stan', 'State')}
${esc(d.friendly_name || d.model || d.device_type)}${esc(d.device_type)} · ${esc(d.device_id)}${g.map((x) => ``).join('')}${esc(d.os || '-')}${esc(d.as_version || '-')}${esc(ago(d.last_seen))}${esc(d.last_command)}${esc(d.last_ip)}${fmtNum(g.reduce((a, x) => a + x.requests, 0))}${deviceState(merged)}
` : `
${T('Brak urządzeń', 'No devices')}
`; + $$('.chip[data-pid]', v).forEach((c) => c.addEventListener('click', (e) => { e.stopPropagation(); deviceDialog(Number(c.dataset.pid), load); })); + $$('tr.clickable', v).forEach((tr) => tr.addEventListener('click', () => deviceDialog(Number(tr.dataset.id), load))); + }; + async function load() { + S.devices = await api('GET', '/api/devices'); + const nc = $('#nav-dev-count'); + if (nc) nc.textContent = new Set(S.devices.map((d) => d.device_id)).size; + draw(); + } + q.addEventListener('input', draw); + f.addEventListener('change', draw); + every(10000, () => load().catch(() => {})); + }; + + async function deviceDialog(id, reload) { + const d = await api('GET', `/api/devices/${id}`); + const kv = [ + [T('Użytkownik', 'User'), d.username], ['Device ID', d.device_id], [T('Typ', 'Type'), d.device_type], [T('Model', 'Model'), d.model], + [T('Nazwa', 'Friendly name'), d.friendly_name], ['OS', `${d.os} ${d.os_language}`], ['IMEI', d.imei], [T('Telefon', 'Phone'), d.phone_number], + [T('Operator', 'Operator'), d.mobile_operator], ['User-Agent', d.user_agent], ['ActiveSync', d.as_version], + [T('Polityka', 'Policy'), `${d.policy_name || '-'} (key ${d.policy_key || 0})`], [T('Pierwszy raz', 'First seen'), fmtTs(d.first_seen)], + [T('Ostatnio', 'Last seen'), `${fmtTs(d.last_seen)} · ${d.last_command} · ${d.last_ip}`], [T('Żądania', 'Requests'), fmtNum(d.requests)], + [T('Ping', 'Ping'), d.ping_lifetime ? `${d.ping_lifetime}s` : '-'], + ['Wipe', d.wipe_requested_at ? `${T('zlecony', 'requested')} ${fmtTs(d.wipe_requested_at)} ${T('przez', 'by')} ${d.wipe_requested_by || ''}${d.wipe_completed_at ? ` · ${T('potwierdzony', 'acknowledged')} ${fmtTs(d.wipe_completed_at)}` : ''}` : '-'], + ].filter(([, val]) => val && String(val).trim()); + const folders = d.folders.length ? `${d.folders.map((f) => ``).join('')}
${T('Folder', 'Folder')}${T('Klasa', 'Class')}${T('Elementy', 'Items')}↓↑${T('Ostatnia sync.', 'Last sync')}${T('Okno', 'Window')}${T('Pętle', 'Loops')}
${esc(f.folder_name)}id ${esc(f.collection)}${esc(f.folder_class)}${fmtNum(f.item_count)}${fmtNum(f.items_out)}${fmtNum(f.items_in)}${esc(ago(f.last_sync))}${f.window_size}${f.loop_hits ? `${f.loop_hits}` : 0}
` : `
${T('Brak zsynchronizowanych folderów', 'No synchronised folders')}
`; + const recent = d.recent.length ? `
${d.recent.map((e) => `
${esc(fmtTime(e.ts))}${esc(e.ip)}${esc(e.command)} ${e.http} ${esc(e.status)}${e.ms} ms${fmtBytes(e.bytes_out)}
`).join('')}
` : `
-
`; + const btn = (act, label, cls = 'outline') => ``; + const dlg = modal(`
${T('URZĄDZENIE', 'DEVICE')} #${d.id}

${esc(d.friendly_name || d.model || d.device_type)} - ${esc(d.username)}

${deviceState(d)}
+
+ ${d.approved ? '' : btn('approve', T('Zatwierdź', 'Approve'), 'primary')} + ${btn('resync', T('Resynchronizuj wszystko', 'Full resync'))} + ${btn('reprovision', T('Wymuś provisioning', 'Force re-provision'))} + ${d.blocked ? btn('unblock', T('Odblokuj', 'Unblock')) : btn('block', T('Zablokuj', 'Block'), 'danger')} + ${d.wipe_status === 2 || d.wipe_status === 4 ? btn('cancel-wipe', T('Anuluj wymazanie', 'Cancel wipe')) : btn('wipe', T('Zdalnie wymaż urządzenie', 'Remote wipe device'), 'danger')} + ${d.has_recovery_password ? btn('recovery-password', T('Hasło odzyskiwania', 'Recovery password'), 'quiet') : ''} + ${btn('remove', T('Usuń partnerstwo', 'Remove partnership'), 'danger')} +
+

${T('Szczegóły', 'Details')}

${kv.map(([k, val]) => `
${esc(k)}
${esc(val)}
`).join('')}
+

${T('Notatki', 'Notes')}

+

${T('Ostatnie żądania', 'Recent requests')}

${recent}
+

${T('Foldery', 'Folders')}

${folders}
`); + $$('[data-act]', dlg).forEach((b) => b.addEventListener('click', async () => { + const act = b.dataset.act; + if (act === 'wipe' && !(await confirmBox(T('Zdalne wymazanie', 'Remote wipe'), T('Urządzenie przy następnym połączeniu wykona reset do ustawień fabrycznych i usunie WSZYSTKIE dane. Tej operacji nie można cofnąć po jej wykonaniu przez urządzenie.', 'On its next connection the device performs a factory reset and erases ALL data. This cannot be undone once the device executes it.'), true, d.device_id))) return; + if (act === 'remove' && !(await confirmBox(T('Usunąć partnerstwo?', 'Remove partnership?'), T('Stany synchronizacji zostaną usunięte; urządzenie zsynchronizuje się od nowa przy następnym połączeniu.', 'Sync states are removed; the device will resync from scratch on its next connection.'), true))) return; + if (act === 'block' && !(await confirmBox(T('Zablokować urządzenie?', 'Block device?'), T('Urządzenie otrzyma HTTP 403 przy każdej próbie synchronizacji.', 'The device receives HTTP 403 on every sync attempt.'), true))) return; + try { + if (act === 'recovery-password') { + const r = await api('POST', `/api/devices/${id}/recovery-password`); + toast(`${T('Hasło odzyskiwania', 'Recovery password')}: ${r.password}`); + return; + } + const body = act === 'notes' ? { notes: $('#dev-notes', dlg).value } : undefined; + await api('POST', `/api/devices/${id}/${act}`, body); + toast(T('Zapisano', 'Done')); + if (act === 'remove') { closeModal(); } else if (act !== 'notes') { deviceDialog(id, reload); } + reload && reload(); + } catch (e) { toast(e.message, true); } + })); + } + + PAGES.users = async (v) => { + v.innerHTML = head(T('KONTA', 'ACCOUNTS'), T('Skrzynki', 'Mailboxes'), T('Skrzynki (loginy) synchronizowane przez ActiveSync. Jedna osoba może mieć kilka skrzynek na tym samym telefonie - kolumna "Na tym samym urządzeniu" je łączy. Blokada działa natychmiast na wszystkich urządzeniach.', 'Mailboxes (logins) syncing through ActiveSync. One person may have several mailboxes on the same phone - the "Same device as" column links them. Blocking applies immediately on every device.')) + + `
+
${T('OCHRONA', 'PROTECTION')}

${T('Aktywne blokady logowania', 'Active login lockouts')}

`; + let users = []; + const draw = () => { + const s = $('#u-q', v).value.trim().toLowerCase(); + const list = users.filter((u) => !s || u.username.includes(s)); + $('#u-table').innerHTML = list.length ? `${list.map((u) => ` + + + + `).join('')}
${T('Skrzynka', 'Mailbox')}${T('Urządzenia', 'Devices')}${T('Na tym samym urządzeniu', 'Same device as')}PUSH${T('Żądania', 'Requests')}${T('Ostatnio', 'Last seen')}${T('Polityka', 'Policy')}${T('Stan', 'State')}
${esc(u.username)}${esc((u.device_names || '-').split(',').join(', '))}${u.devices} ${T('partnerstw', 'partnership(s)')}${u.same_device ? u.same_device.split(',').map((x) => `${esc(x)}`).join('') : '-'}${u.pings}${fmtNum(u.requests)}${esc(ago(u.last_seen))}${esc(u.policy)}${u.blocked ? `${T('ZABLOKOWANA', 'BLOCKED')}` : 'OK'}
` : `
${T('Brak skrzynek', 'No mailboxes')}
`; + $$('[data-u]', v).forEach((b) => b.addEventListener('click', async () => { + const name = b.dataset.u, block = b.dataset.b === '1'; + if (block && !(await confirmBox(T('Zablokować skrzynkę?', 'Block mailbox?'), name, true))) return; + const s2 = await loadSettings(); + const set = new Set(s2.security.blocked_users.map((x) => x.toLowerCase())); + if (block) set.add(name.toLowerCase()); else set.delete(name.toLowerCase()); + s2.security.blocked_users = Array.from(set); + await saveSettings(s2); + load(); + })); + $$('[data-dev]', v).forEach((b) => b.addEventListener('click', () => { store.set('ap.devq', b.dataset.dev); location.hash = 'devices'; })); + }; + async function load() { + users = await api('GET', '/api/users'); + draw(); + const locks = await api('GET', '/api/lockouts'); + $('#locks').innerHTML = locks.length ? `${locks.map((l) => ``).join('')}
${T('Klucz', 'Key')}${T('Do', 'Until')}
${esc(l.key)}${esc(fmtTs(l.until))}
` : `
${T('Brak blokad', 'No lockouts')}
`; + $$('[data-unlock]', v).forEach((b) => b.addEventListener('click', async () => { await api('POST', '/api/lockouts/unlock', { key: b.dataset.unlock }); load(); })); + } + $('#u-q', v).addEventListener('input', draw); + every(15000, () => load().catch(() => {})); + }; + + // ------------------------------------------------------------------ settings forms + async function loadSettings() { + const r = await api('GET', '/api/settings'); + S.settings = r.settings; + S.timezones = r.timezones; + return JSON.parse(JSON.stringify(r.settings)); + } + async function saveSettings(s) { + const r = await api('PUT', '/api/settings', s); + toast(T(`Zapisano i zastosowano (rewizja ${r.revision})`, `Saved and applied (revision ${r.revision})`)); + return loadSettings(); + } + const getP = (o, p) => p.split('.').reduce((a, k) => (a == null ? a : a[k]), o); + function setP(o, p, val) { + const ks = p.split('.'); + let c = o; + ks.slice(0, -1).forEach((k) => { c = c[k]; }); + c[ks[ks.length - 1]] = val; + } + + /** field: [path, label, type, opts] type: text|number|bool|select|list|secret|tz|textarea */ + function fieldHtml(s, f) { + const [path, label, type, opt = {}] = f; + const val = getP(s, path); + const id = `f-${path.replace(/\./g, '-')}`; + const help = opt.help ? `
${esc(opt.help)}
` : ''; + const wide = opt.wide || type === 'list' || type === 'textarea' ? ' wide' : ''; + if (type === 'bool') return `
${help}
`; + let input; + if (type === 'select') input = ``; + else if (type === 'tz') input = `${S.timezones.map((t) => ``; + else if (type === 'list') input = ``; + else if (type === 'secret') input = ``; + else if (type === 'number') input = ``; + else input = ``; + return `
${input}${help}
`; + } + + function collect(root, s) { + $$('[data-path]', root).forEach((el) => { + const p = el.dataset.path, t = el.dataset.type; + let val; + if (t === 'bool') val = el.checked; + else if (t === 'number') val = el.value === '' ? 0 : Number(el.value); + else if (t === 'list') val = el.value.split('\n').map((x) => x.trim()).filter(Boolean); + else if (t === 'secret') val = el.value === '' ? (getP(S.settings, p) === '__SET__' ? '__SET__' : '') : el.value; + else val = el.value.trim(); + setP(s, p, val); + }); + return s; + } + + function section(s, title, desc, fields, extra = '') { + return `

${esc(title)}

${desc ? `

${esc(desc)}

` : ''}
${fields.map((f) => fieldHtml(s, f)).join('')}
${extra}
`; + } + + async function settingsPage(v, eyebrow, title, desc, build, after) { + const s = await loadSettings(); + v.innerHTML = head(eyebrow, title, desc, ``) + `
${build(s)}
`; + const form = $('#form', v); + form.addEventListener('input', () => { $('#dirty').hidden = false; }); + form.addEventListener('change', () => { $('#dirty').hidden = false; }); + $('#reset', v).addEventListener('click', () => go()); + $('#save', v).addEventListener('click', async (e) => { + e.target.disabled = true; + try { + const cur = JSON.parse(JSON.stringify(S.settings)); + collect(form, cur); + if (after?.collect) after.collect(form, cur); + await saveSettings(cur); + go(); + } catch (err) { toast(err.message, true); } finally { e.target.disabled = false; } + }); + after?.bind?.(form, s); + } + + function testBlock(kind) { + return `
+
+
`; + } + function bindTests(form) { + $$('[data-test]', form).forEach((b) => b.addEventListener('click', async () => { + const k = b.dataset.test; + const out = $(`[data-result="${k}"]`, form); + out.hidden = false; out.className = 'result'; out.textContent = T('Testowanie…', 'Testing…'); + b.disabled = true; + try { + const cur = collect(form, JSON.parse(JSON.stringify(S.settings))); + const r = await api('POST', `/api/test/${k}`, { login: $(`[data-test-user="${k}"]`, form).value, password: $(`[data-test-pass="${k}"]`, form).value, settings: cur }); + out.classList.add(r.ok ? 'ok' : 'bad'); + out.textContent = r.message; + } catch (e) { out.classList.add('bad'); out.textContent = e.message; } finally { b.disabled = false; } + })); + } + + const TLS = () => [['none', T('brak (tylko localhost)', 'none (localhost only)')], ['start_tls', 'STARTTLS'], ['tls', T('TLS (implicit)', 'TLS (implicit)')]]; + + PAGES.backends = (v) => settingsPage(v, T('ŹRÓDŁA DANYCH', 'DATA SOURCES'), T('Backendy', 'Backends'), T('Poczta przez IMAP/SMTP, kalendarze i zadania przez CalDAV, kontakty przez CardDAV - odpowiednik backendu "combined" z Z-Push.', 'Mail via IMAP/SMTP, calendars and tasks via CalDAV, contacts via CardDAV - the Z-Push "combined" backend.'), (s) => + section(s, 'IMAP', T('Serwer poczty przychodzącej (np. Dovecot). Uwierzytelnianie urządzeń odbywa się loginem IMAP.', 'Incoming mail server (e.g. Dovecot). Devices authenticate with their IMAP login.'), [ + ['imap.host', T('Host', 'Host'), 'text'], ['imap.port', T('Port', 'Port'), 'number', { min: 1, max: 65535 }], + ['imap.security', T('Szyfrowanie', 'Encryption'), 'select', { options: TLS() }], ['imap.verify_tls', T('Weryfikuj certyfikat', 'Verify certificate'), 'bool'], + ['imap.folder_prefix', T('Prefiks folderów', 'Folder prefix'), 'text', { ph: 'INBOX.' }], + ['imap.use_special_use', T('Rozpoznawaj foldery po SPECIAL-USE', 'Detect folders via SPECIAL-USE'), 'bool'], + ['imap.folder_inbox', 'Inbox', 'text'], ['imap.folder_sent', T('Wysłane', 'Sent'), 'text'], ['imap.folder_drafts', T('Szkice', 'Drafts'), 'text'], + ['imap.folder_trash', T('Kosz', 'Trash'), 'text'], ['imap.folder_spam', 'Spam', 'text'], ['imap.folder_archive', T('Archiwum', 'Archive'), 'text'], + ['imap.excluded_folders', T('Ukryte foldery', 'Hidden folders'), 'list', { ph: 'Shared/*\nPublic' }], + ['imap.autoseen_on_delete', T('Oznacz jako przeczytane przed usunięciem', 'Mark read before delete'), 'bool'], + ['imap.inline_forward', T('Przekazywanie inline (zamiast załącznika .eml)', 'Inline forward (instead of .eml)'), 'bool'], + ['imap.timeout_secs', T('Timeout (s)', 'Timeout (s)'), 'number', { min: 5 }], ['imap.pool_idle_secs', T('Czas życia połączeń w puli (s)', 'Pool idle time (s)'), 'number'], + ['imap.pool_max_per_user', T('Maks. połączeń w puli / użytkownika', 'Max pooled per user'), 'number', { min: 0, max: 20 }], + ], testBlock('imap')) + + section(s, 'SMTP', T('Wysyłka poczty z urządzeń (SendMail / SmartReply / SmartForward).', 'Outgoing mail from devices (SendMail / SmartReply / SmartForward).'), [ + ['smtp.method', T('Metoda', 'Method'), 'select', { options: [['smtp', 'SMTP'], ['sendmail', 'sendmail']] }], + ['smtp.host', 'Host', 'text'], ['smtp.port', 'Port', 'number'], ['smtp.security', T('Szyfrowanie', 'Encryption'), 'select', { options: TLS() }], + ['smtp.verify_tls', T('Weryfikuj certyfikat', 'Verify certificate'), 'bool'], + ['smtp.auth', T('Uwierzytelnianie', 'Authentication'), 'select', { options: [['user_credentials', T('dane użytkownika urządzenia', 'device user credentials')], ['static', T('stałe konto relay', 'static relay account')], ['none', T('brak', 'none')]] }], + ['smtp.username', T('Login relay', 'Relay username'), 'text'], ['smtp.password', T('Hasło relay', 'Relay password'), 'secret'], + ['smtp.sendmail_path', T('Ścieżka sendmail', 'sendmail path'), 'text'], ['smtp.timeout_secs', 'Timeout (s)', 'number'], + ['smtp.max_message_mb', T('Maks. rozmiar wiadomości (MB)', 'Max message size (MB)'), 'number'], + ['smtp.save_in_sent', T('Zapisuj kopię w Wysłanych', 'Save copy to Sent'), 'bool'], + ['smtp.enforce_from', T('Wymuszaj adres nadawcy = adres konta', 'Force sender = account address'), 'bool', { help: T('Zapobiega podszywaniu się pod inne adresy.', 'Prevents sender spoofing.') }], + ], testBlock('smtp')) + + section(s, 'CalDAV', T('Kalendarze i zadania (VEVENT/VTODO). Placeholders: %u login, %l część lokalna, %d domena.', 'Calendars and tasks (VEVENT/VTODO). Placeholders: %u login, %l local part, %d domain.'), [ + ['caldav.enabled', T('Włączony', 'Enabled'), 'bool'], ['caldav.base_url', 'URL', 'text', { ph: 'https://dav.example.com' }], + ['caldav.path', T('Ścieżka kalendarzy', 'Calendar home path'), 'text', { ph: '/dav/calendars/%u/' }], ['caldav.verify_tls', T('Weryfikuj certyfikat', 'Verify certificate'), 'bool'], + ['caldav.default_collection', T('Domyślny kalendarz', 'Default calendar'), 'text'], ['caldav.include_regex', T('Tylko kolekcje pasujące do regex', 'Include regex'), 'text'], + ['caldav.exclude_regex', T('Pomiń kolekcje pasujące do regex', 'Exclude regex'), 'text'], ['caldav.timeout_secs', 'Timeout (s)', 'number'], + ], testBlock('caldav')) + + section(s, 'CardDAV', T('Kontakty oraz globalna książka adresowa (GAL) do wyszukiwania i rozwiązywania odbiorców.', 'Contacts plus a global address list (GAL) for search and recipient resolution.'), [ + ['carddav.enabled', T('Włączony', 'Enabled'), 'bool'], ['carddav.base_url', 'URL', 'text'], + ['carddav.path', T('Ścieżka książek adresowych', 'Address book home path'), 'text', { ph: '/dav/addressbooks/%u/' }], ['carddav.verify_tls', T('Weryfikuj certyfikat', 'Verify certificate'), 'bool'], + ['carddav.default_collection', T('Domyślna książka', 'Default book'), 'text'], ['carddav.gal_path', T('Ścieżka GAL', 'GAL path'), 'text', { ph: '/dav/addressbooks/%d/gal/' }], + ['carddav.gal_min_length', T('Min. długość zapytania GAL', 'GAL min query length'), 'number'], ['carddav.max_picture_kb', T('Maks. zdjęcie kontaktu (KB)', 'Max contact picture (KB)'), 'number'], + ['carddav.include_regex', 'Include regex', 'text'], ['carddav.exclude_regex', 'Exclude regex', 'text'], ['carddav.timeout_secs', 'Timeout (s)', 'number'], + ], testBlock('carddav')), { bind: bindTests }); + + PAGES.activesync = (v) => settingsPage(v, 'PROTOCOL', 'ActiveSync', T('Logowanie, protokół, synchronizacja, push i Autodiscover.', 'Login, protocol, synchronisation, push and Autodiscover.'), (s) => + section(s, T('Ogólne', 'General'), '', [ + ['general.server_name', T('Nazwa serwera', 'Server name'), 'text'], ['general.default_timezone', T('Domyślna strefa czasowa', 'Default time zone'), 'tz'], + ['general.login_format', T('Format loginu', 'Login format'), 'select', { options: [['as_given', T('jak podany przez urządzenie', 'as given by device')], ['local_part', T('tylko część lokalna (bez @domena)', 'local part only')], ['full_email', T('pełny e-mail (dopisz domenę)', 'full e-mail (append domain)')]], help: T('Odpowiednik USE_FULLEMAIL_FOR_LOGIN. Prefiks DOMENA\\ jest zawsze usuwany.', 'Equivalent of USE_FULLEMAIL_FOR_LOGIN. DOMAIN\\ prefixes are always stripped.') }], + ['general.default_domain', T('Domyślna domena', 'Default domain'), 'text'], + ['general.email_template', T('Szablon adresu e-mail', 'E-mail address template'), 'text', { help: '{login} {local} {domain}' }], + ['general.max_protocol', T('Najwyższa wersja protokołu', 'Highest protocol version'), 'select', { options: ['14.1', '14.0', '12.1', '12.0', '2.5'].map((x) => [x, x]) }], + ['general.allowed_domains', T('Dozwolone domeny (puste = wszystkie)', 'Allowed domains (empty = all)'), 'list'], + ]) + + section(s, T('Synchronizacja', 'Synchronisation'), '', [ + ['sync.max_items', T('Maks. elementów w paczce (SYNC_MAX_ITEMS)', 'Max items per batch'), 'number', { min: 1, max: 2000 }], + ['sync.filter_time_max', T('Maks. zakres czasu', 'Max time window'), 'select', { num: true, options: [[0, T('bez limitu', 'unlimited')], [1, T('1 dzień', '1 day')], [2, T('3 dni', '3 days')], [3, T('1 tydzień', '1 week')], [4, T('2 tygodnie', '2 weeks')], [5, T('1 miesiąc', '1 month')], [6, T('3 miesiące', '3 months')], [7, T('6 miesięcy', '6 months')]] }], + ['sync.server_wins', T('Konflikty: wygrywa serwer', 'Conflicts: server wins'), 'bool'], ['sync.loop_detection', T('Wykrywanie pętli synchronizacji', 'Sync loop detection'), 'bool'], + ['sync.max_attachment_mb', T('Maks. załącznik (MB)', 'Max attachment (MB)'), 'number'], ['sync.max_request_mb', T('Maks. żądanie (MB)', 'Max request (MB)'), 'number'], + ['sync.heartbeat_min', T('Hanging Sync min (s)', 'Hanging Sync min (s)'), 'number'], ['sync.heartbeat_max', T('Hanging Sync max (s)', 'Hanging Sync max (s)'), 'number'], + ['sync.search_wait_secs', T('Limit czasu wyszukiwania (s)', 'Search time limit (s)'), 'number'], ['sync.search_max_results', T('Maks. wyników wyszukiwania', 'Max search results'), 'number'], + ['sync.retry_after_secs', 'Retry-After (s)', 'number'], + ]) + + section(s, 'Push (Ping)', T('Urządzenia trzymają otwarte połączenie; serwer sprawdza zmiany w backendzie co zadany interwał.', 'Devices keep a connection open; the server checks the backend for changes every interval.'), [ + ['ping.check_interval_secs', T('Interwał sprawdzania (s)', 'Check interval (s)'), 'number', { min: 5 }], + ['ping.lifetime_min', T('Min. heartbeat (s)', 'Min heartbeat (s)'), 'number'], ['ping.lifetime_max', T('Maks. heartbeat (s)', 'Max heartbeat (s)'), 'number'], + ['ping.max_folders', T('Maks. folderów', 'Max folders'), 'number'], + ]) + + section(s, 'Autodiscover', T('Automatyczna konfiguracja kont na telefonach (/autodiscover/autodiscover.xml).', 'Automatic account configuration (/autodiscover/autodiscover.xml).'), [ + ['autodiscover.enabled', T('Włączony', 'Enabled'), 'bool'], ['autodiscover.require_auth', T('Wymagaj poprawnego hasła', 'Require valid password'), 'bool'], + ['autodiscover.server_url', T('Publiczny URL ActiveSync', 'Public ActiveSync URL'), 'text', { wide: true, ph: 'https://mail.example.com/Microsoft-Server-ActiveSync', help: T('Puste = wyznaczony z nagłówka Host.', 'Empty = derived from the Host header.') }], + ]) + + section(s, T('Logowanie i retencja', 'Logging & retention'), '', [ + ['logging.log_wbxml', T('Loguj zdekodowany WBXML (debug, zawiera treść poczty!)', 'Log decoded WBXML (debug, contains mail data!)'), 'bool'], + ['logging.debug_users', T('Użytkownicy z logowaniem debug', 'Debug users'), 'list'], + ['logging.ring_size', T('Linii logu w panelu', 'Log lines in panel'), 'number'], ['logging.stats_retention_days', T('Retencja statystyk (dni)', 'Stats retention (days)'), 'number'], + ['logging.audit_retention_days', T('Retencja audytu (dni)', 'Audit retention (days)'), 'number'], + ['panel.device_inactive_days', T('Usuwaj urządzenia nieaktywne (dni, 0 = nigdy)', 'Remove inactive devices (days, 0 = never)'), 'number'], + ])); + + const POLICY_FIELDS = () => [ + ['devpwenabled', T('Wymagaj hasła urządzenia', 'Require device password'), 'bool'], ['alphanumpwreq', T('Hasło alfanumeryczne', 'Alphanumeric password'), 'bool'], + ['allowsimpledevpw', T('Pozwól na proste hasła', 'Allow simple passwords'), 'bool'], ['mindevpwlenngth', T('Min. długość hasła', 'Min password length'), 'number'], + ['mindevcomplexchars', T('Min. znaków złożonych', 'Min complex characters'), 'number'], ['maxinacttimedevlock', T('Blokada po bezczynności (s)', 'Lock after inactivity (s)'), 'number'], + ['maxdevpwfailedattempts', T('Wymaż po N błędnych hasłach', 'Wipe after N failed passwords'), 'number'], ['devpwexpiration', T('Wygaśnięcie hasła (dni)', 'Password expiration (days)'), 'number'], + ['devpwhistory', T('Historia haseł', 'Password history'), 'number'], ['pwrecoveryenabled', T('Odzyskiwanie hasła', 'Password recovery'), 'bool'], + ['devencenabled', T('Szyfrowanie urządzenia', 'Device encryption'), 'bool'], ['reqdevenc', T('Wymagaj szyfrowania', 'Require encryption'), 'bool'], + ['attenabled', T('Załączniki dozwolone', 'Attachments allowed'), 'bool'], ['maxattsize', T('Maks. załącznik (bajty, -1 = bez limitu)', 'Max attachment (bytes, -1 unlimited)'), 'number'], + ['allowhtmlemail', T('Poczta HTML', 'HTML email'), 'bool'], ['maxemailagefilter', T('Maks. wiek poczty (0-5)', 'Max email age filter'), 'number'], + ['maxcalagefilter', T('Maks. wiek kalendarza (0,4-7)', 'Max calendar age filter'), 'number'], ['maxemailbodytruncsize', T('Obcięcie treści (bajty, -1)', 'Body truncation (bytes, -1)'), 'number'], + ['maxemailhtmlbodytruncsize', T('Obcięcie HTML (bajty, -1)', 'HTML truncation (bytes, -1)'), 'number'], ['allowstoragecard', T('Karta pamięci', 'Storage card'), 'bool'], + ['allowcam', T('Aparat', 'Camera'), 'bool'], ['allowwifi', 'Wi-Fi', 'bool'], ['allowbluetooth', 'Bluetooth (0/1/2)', 'number'], ['allowirda', 'IrDA', 'bool'], + ['allowtextmessaging', 'SMS', 'bool'], ['allowpopimapemail', 'POP/IMAP', 'bool'], ['allowbrowser', T('Przeglądarka', 'Browser'), 'bool'], + ['allowconsumeremail', T('Prywatna poczta', 'Consumer email'), 'bool'], ['allowinternetsharing', T('Udostępnianie internetu', 'Internet sharing'), 'bool'], + ['allowremotedesktop', T('Pulpit zdalny', 'Remote desktop'), 'bool'], ['allowdesktopsync', T('Synchronizacja z PC', 'Desktop sync'), 'bool'], + ['allowunsignedapps', T('Niepodpisane aplikacje', 'Unsigned apps'), 'bool'], ['allowunsignedinstallationpackages', T('Niepodpisane pakiety', 'Unsigned packages'), 'bool'], + ['reqmansyncroam', T('Ręczna synchronizacja w roamingu', 'Manual sync when roaming'), 'bool'], ['reqsignedsmimemessages', T('Wymagaj podpisu S/MIME', 'Require signed S/MIME'), 'bool'], + ['reqencsmimemessages', T('Wymagaj szyfrowania S/MIME', 'Require encrypted S/MIME'), 'bool'], ['allowsmimesoftcerts', T('Certyfikaty programowe S/MIME', 'S/MIME soft certs'), 'bool'], + ]; + + PAGES.policies = async (v) => { + let sel = 0; + await settingsPage(v, 'PROVISIONING', T('Polityki urządzeń', 'Device policies'), T('Polityki bezpieczeństwa przekazywane urządzeniom (odpowiednik policies.ini). Zmiana polityki wymusza ponowny provisioning urządzeń.', 'Security policies pushed to devices (policies.ini equivalent). Changing a policy forces devices to re-provision.'), (s) => { + const pols = s.provisioning.policies; + return section(s, 'Provisioning', '', [ + ['provisioning.enabled', T('Wymuszaj provisioning', 'Enforce provisioning'), 'bool'], + ['provisioning.loose', T('Luźny provisioning (urządzenia bez obsługi polityk)', 'Loose provisioning (devices without policy support)'), 'bool'], + ['provisioning.default_policy', T('Domyślna polityka', 'Default policy'), 'select', { options: pols.map((p) => [p.name, p.name]) }], + ]) + `

${T('Polityka', 'Policy')}

+

${T('Przypisania użytkowników', 'User assignments')}

${T('Jedna linia: login=nazwa_polityki', 'One per line: login=policy_name')}

`; + }, { + bind(form, s) { + const pf = $('#pol-form', form); + const drawPol = () => { + const p = s.provisioning.policies[sel]; + pf.innerHTML = `
${fieldHtml({ p }, ['p.name', T('Nazwa', 'Name'), 'text'])}${POLICY_FIELDS().map((f) => fieldHtml({ p }, [`p.${f[0]}`, f[1], f[2]])).join('')}
`; + $$('[data-path]', pf).forEach((el) => { el.dataset.pol = el.dataset.path.slice(2); el.removeAttribute('data-path'); }); + }; + const keep = () => { + const p = s.provisioning.policies[sel]; + $$('[data-pol]', pf).forEach((el) => { + const k = el.dataset.pol; + p[k] = el.type === 'checkbox' ? el.checked : el.type === 'number' ? Number(el.value) : el.value.trim(); + }); + }; + $('#pol-sel', form).addEventListener('change', (e) => { keep(); sel = Number(e.target.value); drawPol(); }); + $('#pol-add', form).addEventListener('click', () => { + keep(); + const c = JSON.parse(JSON.stringify(s.provisioning.policies[sel])); + c.name = `${c.name}-copy`; + s.provisioning.policies.push(c); + sel = s.provisioning.policies.length - 1; + $('#pol-sel', form).insertAdjacentHTML('beforeend', ``); + $('#pol-sel', form).value = String(sel); + drawPol(); + $('#dirty').hidden = false; + }); + $('#pol-del', form).addEventListener('click', () => { + if (s.provisioning.policies.length < 2) { toast(T('Musi zostać przynajmniej jedna polityka', 'At least one policy is required'), true); return; } + s.provisioning.policies.splice(sel, 1); + sel = 0; + $('#pol-sel', form).innerHTML = s.provisioning.policies.map((p, i) => ``).join(''); + drawPol(); + $('#dirty').hidden = false; + }); + drawPol(); + this.keep = keep; + this.s = s; + }, + collect(form, cur) { + this.keep(); + cur.provisioning.policies = this.s.provisioning.policies; + cur.provisioning.user_policies = $('#pol-users', form).value.split('\n').map((l) => l.trim()).filter((l) => l.includes('=')).map((l) => { const [u, p] = l.split('='); return { username: u.trim(), policy: p.trim() }; }); + }, + }); + }; + + PAGES.security = async (v) => { + await settingsPage(v, 'HARDENING', T('Bezpieczeństwo', 'Security'), T('Ochrona przed zgadywaniem haseł, kontrola dostępu sieciowego, urządzeń i panelu.', 'Brute-force protection, network/device access control and panel security.'), (s) => + section(s, T('Ochrona logowania', 'Login protection'), T('Po przekroczeniu limitu konto (i IP przy 3× limicie) jest blokowane. Linia logu jest zgodna z fail2ban.', 'Exceeding the limit locks the account (and the IP at 3× the limit). The log line is fail2ban friendly.'), [ + ['security.auth_fail_max', T('Maks. błędnych logowań', 'Max failed logins'), 'number'], ['security.auth_fail_window_secs', T('Okno (s)', 'Window (s)'), 'number'], + ['security.lockout_secs', T('Czas blokady (s)', 'Lockout (s)'), 'number'], ['security.auth_cache_secs', T('Cache poprawnego logowania (s)', 'Successful login cache (s)'), 'number', { help: T('Przechowywany jest tylko HMAC, nigdy hasło.', 'Only an HMAC is kept, never the password.') }], + ['security.log_auth_failures', T('Loguj nieudane logowania', 'Log failed logins'), 'bool'], + ]) + + section(s, T('Sieć', 'Network'), '', [ + ['security.trusted_proxies', T('Zaufane proxy (CIDR)', 'Trusted proxies (CIDR)'), 'list', { help: T('Tylko od nich akceptowany jest nagłówek z prawdziwym IP klienta.', 'Only these may set the real client IP header.') }], + ['security.real_ip_header', T('Nagłówek z IP klienta', 'Client IP header'), 'text'], + ['security.eas_allowed_networks', T('Sieci z dostępem do ActiveSync (puste = wszystkie)', 'Networks allowed to use ActiveSync (empty = all)'), 'list'], + ['panel.allowed_networks', T('Sieci z dostępem do panelu (puste = wszystkie)', 'Networks allowed to use the panel (empty = all)'), 'list'], + ]) + + section(s, T('Użytkownicy i urządzenia', 'Users & devices'), '', [ + ['security.require_device_approval', T('Nowe urządzenia wymagają zatwierdzenia', 'New devices require approval'), 'bool'], + ['security.allowed_users', T('Tylko ci użytkownicy (puste = wszyscy)', 'Only these users (empty = all)'), 'list'], + ['security.blocked_users', T('Zablokowani użytkownicy', 'Blocked users'), 'list'], + ['security.blocked_device_types', T('Zablokowane typy urządzeń / User-Agent', 'Blocked device types / User-Agent'), 'list', { ph: 'WindowsMail\nOutlook' }], + ]) + + section(s, T('Panel', 'Panel'), '', [ + ['panel.session_ttl_minutes', T('Wygasanie sesji (min)', 'Session lifetime (min)'), 'number'], + ['panel.prometheus_token', T('Token Prometheus (/metrics)', 'Prometheus token (/metrics)'), 'secret', { help: T('Puste = endpoint wyłączony. Użycie: Authorization: Bearer ', 'Empty = endpoint disabled. Use: Authorization: Bearer ') }], + ]) + + `

${T('Konto administratora', 'Administrator account')}

+
+
+
+
`, + { + bind(form) { + $('#pw-save', form).addEventListener('click', async () => { + const n = $('#pw-new', form).value; + if (n !== $('#pw-new2', form).value) { toast(T('Hasła się różnią', 'Passwords differ'), true); return; } + try { await api('POST', '/api/password', { current: $('#pw-cur', form).value, new: n }); toast(T('Hasło zmienione', 'Password changed')); $$('#pw-cur,#pw-new,#pw-new2', form).forEach((i) => { i.value = ''; }); } catch (e) { toast(e.message, true); } + }); + $('#revoke', form).addEventListener('click', async () => { await api('POST', '/api/sessions/revoke-others'); toast(T('Inne sesje wylogowane', 'Other sessions revoked')); }); + // password fields are not settings + $$('#pw-cur,#pw-new,#pw-new2', form).forEach((i) => i.addEventListener('input', (e) => e.stopPropagation())); + }, + }); + }; + + PAGES.logs = async (v) => { + v.innerHTML = head(T('DIAGNOSTYKA', 'DIAGNOSTICS'), T('Logi i audyt', 'Logs & audit'), T('Ostatnie wpisy logu serwera oraz dziennik działań administracyjnych.', 'Recent server log lines and the administrative audit trail.')) + + `
+
+ `; + $$('.tab', v).forEach((t) => t.addEventListener('click', () => { + $$('.tab', v).forEach((x) => x.classList.toggle('active', x === t)); + $('#tab-log').hidden = t.dataset.tab !== 'log'; + $('#tab-audit').hidden = t.dataset.tab !== 'audit'; + })); + async function logs() { + if (!$('#lf').checked) return; + const q = new URLSearchParams({ n: '800' }); + if ($('#lv').value) q.set('level', $('#lv').value); + if ($('#lq').value.trim()) q.set('q', $('#lq').value.trim()); + const l = await api('GET', `/api/logs?${q}`); + const box = $('#logbox'); + const atBottom = box.scrollTop + box.clientHeight >= box.scrollHeight - 30; + box.innerHTML = l.map((x) => `
${esc(fmtTime(x.ts))}${esc(x.level)}${esc(x.message)}
`).join('') || `
-
`; + if (atBottom) box.scrollTop = box.scrollHeight; + } + async function audit() { + const a = await api('GET', '/api/audit'); + $('#auditbox').innerHTML = a.length ? `${a.map((e) => ``).join('')}
${T('Czas', 'Time')}${T('Kto', 'Actor')}${T('Akcja', 'Action')}${T('Cel', 'Target')}IP${T('Szczegóły', 'Details')}
${esc(fmtTs(e.ts))}${esc(e.actor)}${esc(e.action)}${esc(e.target)}${esc(e.ip)}${esc(e.details)}
` : `
-
`; + } + $('#lv').addEventListener('change', logs); + $('#lq').addEventListener('input', () => { clearTimeout(PAGES._lq); PAGES._lq = setTimeout(logs, 300); }); + every(3000, () => logs().catch(() => {})); + every(30000, () => audit().catch(() => {})); + }; + + PAGES.about = async (v) => { + const o = await api('GET', '/api/overview'); + v.innerHTML = head('ABOUT', 'ActivePush', T('Serwer Exchange ActiveSync dla IMAP/SMTP + CalDAV/CardDAV - przepisany z Z-Push na Rust.', 'Exchange ActiveSync server for IMAP/SMTP + CalDAV/CardDAV - Z-Push rewritten in Rust.')) + + `

${T('Wersja', 'Version')} ${esc(o.version)}

+
ActiveSync
2.5, 12.0, 12.1, 14.0, 14.1
+
${T('Komendy', 'Commands')}
Sync, FolderSync, FolderCreate/Update/Delete, Ping, Provision, SendMail, SmartReply, SmartForward, GetAttachment, ItemOperations, GetItemEstimate, MoveItems, MeetingResponse, Search (GAL, Mailbox), ResolveRecipients, Settings, ValidateCert
+
Endpoints
/Microsoft-Server-ActiveSync
/autodiscover/autodiscover.xml (+ AutoDiscover/AutoDiscover.xml, Autodiscover/Autodiscover.xml)
+
CLI
active-push admin | config | device | probe
+

nginx

${T('Zastępuje lokalizacje fastcgi Z-Push:', 'Replaces the Z-Push fastcgi locations:')}

location = /Microsoft-Server-ActiveSync {
+    proxy_pass http://127.0.0.1:8081;
+    proxy_set_header Host $host;
+    proxy_set_header X-Forwarded-For $remote_addr;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_read_timeout 3660s;
+    proxy_buffering off;
+    client_max_body_size 64m;
+}
+location ~* ^/autodiscover/autodiscover\\.xml$ {
+    proxy_pass http://127.0.0.1:8081;
+    proxy_set_header Host $host;
+    proxy_set_header X-Forwarded-For $remote_addr;
+}
`; + }; + + // ------------------------------------------------------------------ auth / boot + function setAuthTexts(setup) { + $('#auth-eyebrow').textContent = setup ? T('PIERWSZE URUCHOMIENIE', 'FIRST RUN') : T('ADMINISTRACJA', 'ADMINISTRATION'); + $('#auth-title').textContent = setup ? T('Utwórz administratora', 'Create administrator') : T('Zaloguj się', 'Sign in'); + $('#setup-help').textContent = T('Wygeneruj jednorazowy token na serwerze i wklej go poniżej:', 'Generate a one-time token on the server and paste it below:'); + $('#lbl-token').textContent = T('Token instalacyjny', 'Setup token'); + $('#lbl-user').textContent = T('Login', 'Username'); + $('#lbl-pass').textContent = setup ? T('Hasło (min. 12 znaków)', 'Password (min. 12 characters)') : T('Hasło', 'Password'); + $('#lbl-pass2').textContent = T('Powtórz hasło', 'Repeat password'); + $('#auth-submit').textContent = setup ? T('Utwórz i zaloguj', 'Create & sign in') : T('Zaloguj', 'Sign in'); + $('#setup-fields').hidden = !setup; + $('#confirm-wrap').hidden = !setup; + $('#password').autocomplete = setup ? 'new-password' : 'current-password'; + } + + function showAuth(setup) { + clearTimers(); + $('#loading').hidden = true; + $('#shell').hidden = true; + $('#auth').hidden = false; + S.setup = !!setup; + setAuthTexts(S.setup); + $('#username').focus(); + } + + async function boot() { + let sess; + try { sess = await api('GET', '/api/session'); } catch (e) { $('#loading').textContent = e.message; return; } + if (!sess.authenticated) { showAuth(sess.setup_required); return; } + S.session = sess; + S.csrf = sess.csrf; + $('#loading').hidden = true; + $('#auth').hidden = true; + $('#shell').hidden = false; + $('#whoami').textContent = sess.username; + $('#logout').textContent = T('Zablokuj', 'Lock'); + $('#theme').title = T('Motyw jasny/ciemny', 'Light/dark theme'); + document.title = `${sess.server_name || 'ActivePush'} / Control room`; + go(); + } + + $('#auth-form').addEventListener('submit', async (e) => { + e.preventDefault(); + const msg = $('#auth-msg'); + msg.textContent = ''; + const body = { username: $('#username').value.trim(), password: $('#password').value, token: $('#setup-token').value.trim() }; + if (S.setup && body.password !== $('#password2').value) { msg.textContent = T('Hasła się różnią', 'Passwords differ'); return; } + $('#auth-submit').disabled = true; + try { + await api('POST', S.setup ? '/api/setup' : '/api/login', body); + $('#password').value = ''; + $('#password2').value = ''; + await boot(); + } catch (err) { msg.textContent = err.message; } finally { $('#auth-submit').disabled = false; } + }); + + $('#logout').addEventListener('click', async () => { try { await api('POST', '/api/logout'); } catch { /* ignore */ } showAuth(false); }); + $('#menu-toggle').addEventListener('click', () => $('#nav').classList.toggle('open')); + const theme = store.get('ap.theme', 'dark'); + document.documentElement.dataset.theme = theme; + $('#theme').addEventListener('click', () => { + const t = document.documentElement.dataset.theme === 'dark' ? 'light' : 'dark'; + document.documentElement.dataset.theme = t; + store.set('ap.theme', t); + if (S.session) go(); + }); + const langSel = $('#lang'); + langSel.value = LANG; + document.documentElement.lang = LANG; + langSel.addEventListener('change', () => { LANG = langSel.value; store.set('ap.lang', LANG); location.reload(); }); + window.addEventListener('hashchange', () => { if (S.session) go(); }); + let resizeT; + window.addEventListener('resize', () => { clearTimeout(resizeT); resizeT = setTimeout(() => { if (S.session && S.page === 'overview') go(); }, 400); }); + boot(); +})(); diff --git a/web/favicon.svg b/web/favicon.svg new file mode 100644 index 0000000..64f6d61 --- /dev/null +++ b/web/favicon.svg @@ -0,0 +1 @@ +a/p diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..b961aea --- /dev/null +++ b/web/index.html @@ -0,0 +1,74 @@ + + + + + + + ActivePush / Control room + + + + + +
ACTIVEPUSH
+ + + +
+ + + + + diff --git a/web/style.css b/web/style.css new file mode 100644 index 0000000..34ded3b --- /dev/null +++ b/web/style.css @@ -0,0 +1,363 @@ +/* ActivePush control room - visual language shared with RustProxy */ +:root { + color-scheme: dark; + --bg: #131615; + --panel: #1b1f1d; + --panel2: #202622; + --line: #323a34; + --row-line: #2b332c; + --muted: #a0aaa0; + --subtle: #879082; + --text: #edf0e9; + --accent: #f69b74; + --accent-hover: #ffb090; + --accent-ink: #221810; + --green: #bdd293; + --red: #ffaaa2; + --blue: #8ebcff; + --violet: #d7adff; + --sand: #c9b99c; + --sidebar-bg: #101310; + --brand2: #cfe0ac; + --nav-active: #242b23; + --nav-hover: #20251f; + --field-bg: #131813; + --field-line: #47523f; + --outline: #717b67; + --grid: #333c33; + --code-bg: #101810; + --notice-bg: #29251c; + --notice-line: #554833; + --pill-line: #6d5a45; + --pill-live: #576847; + --danger-line: #79514e; + --shadow: #0009; + --backdrop: rgba(0, 0, 0, .68); + --r-surface: 6px; + --r-control: 4px; + --mono: ui-monospace, SFMono-Regular, "JetBrains Mono", Consolas, monospace; + --sans: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; +} + +html[data-theme=light] { + color-scheme: light; + --bg: #f4f6f2; + --panel: #fff; + --panel2: #edf1eb; + --line: #cbd3c7; + --row-line: #e0e5dd; + --muted: #5e685f; + --subtle: #687369; + --text: #1d241f; + --accent: #b85b38; + --accent-hover: #a84f30; + --accent-ink: #fff; + --green: #5f783f; + --red: #b64a43; + --blue: #4f77a9; + --violet: #7d4fa3; + --sand: #685b45; + --sidebar-bg: #eef2ec; + --brand2: #6b8249; + --nav-active: #e1e8dc; + --nav-hover: #e8ede6; + --field-bg: #fff; + --field-line: #b7c1b5; + --outline: #98a497; + --grid: #d4dbd1; + --code-bg: #edf3e9; + --notice-bg: #fff9ef; + --notice-line: #d4c2a5; + --pill-line: #cbb28f; + --pill-live: #a8ba8d; + --danger-line: #d7a29d; + --shadow: rgba(31, 39, 33, .22); + --backdrop: rgba(31, 39, 33, .45); +} + +* { box-sizing: border-box; scrollbar-color: #4f5d50 transparent; scrollbar-width: thin; } +[hidden] { display: none !important; } +html, body { margin: 0; } +body { + background: var(--bg); + color: var(--text); + font: 12px/1.5 var(--sans); + min-height: 100vh; +} +a { color: inherit; text-decoration: none; } +code, .mono { font-family: var(--mono); } +h1 { margin: 0; font-size: clamp(26px, 3vw, 40px); font-weight: 520; letter-spacing: -1.5px; line-height: 1.1; } +h2 { margin: 0; font-size: 15px; letter-spacing: -.3px; } +h3 { margin: 0 0 8px; font-size: 13px; } + +/* ---------------------------------------------------------------- controls */ +button { font: inherit; cursor: pointer; border: 0; } +button:disabled { opacity: .5; cursor: wait; } +.primary, .outline, .quiet, .danger { + display: inline-flex; align-items: center; justify-content: center; gap: 6px; + min-height: 27px; padding: 5px 11px; font-size: 11px; border-radius: var(--r-control); white-space: nowrap; +} +.primary { background: var(--accent); color: var(--accent-ink); border: 1px solid var(--accent); font-weight: 650; } +.primary:hover { background: var(--accent-hover); } +.outline { background: transparent; color: var(--text); border: 1px solid var(--outline); } +.outline:hover { border-color: var(--accent); } +.quiet { background: transparent; color: var(--muted); border: 1px solid var(--line); } +.quiet:hover { color: var(--text); border-color: var(--outline); } +.danger { background: transparent; color: var(--red); border: 1px solid var(--danger-line); } +.danger:hover { background: color-mix(in srgb, var(--red) 12%, transparent); } +a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { + outline: 2px solid var(--accent); outline-offset: 2px; +} + +input, select, textarea { + font: inherit; font-size: 12px; width: 100%; min-width: 0; + background: var(--field-bg); color: var(--text); + border: 1px solid var(--field-line); border-radius: var(--r-control); + padding: 6px 8px; min-height: 29px; +} +textarea { min-height: 70px; resize: vertical; font-family: var(--mono); } +input[type=checkbox] { width: 15px; height: 15px; min-height: 0; accent-color: var(--accent); } +label { display: block; color: var(--muted); font-size: 11px; margin: 0 0 3px; } + +.small-label { font: 9px var(--mono); letter-spacing: 1.2px; color: var(--muted); text-transform: uppercase; } +.fine { font-size: 11px; color: var(--muted); line-height: 1.6; overflow-wrap: anywhere; } +.pill { + display: inline-block; padding: 2px 7px; border: 1px solid var(--pill-line); color: var(--accent); + font: 9px var(--mono); letter-spacing: .8px; border-radius: 3px; white-space: nowrap; text-transform: uppercase; +} +.pill.live, .pill.ok { border-color: var(--pill-live); color: var(--green); } +.pill.bad { border-color: var(--danger-line); color: var(--red); } +.pill.info { border-color: color-mix(in srgb, var(--blue) 45%, transparent); color: var(--blue); } +.pill.muted { border-color: var(--line); color: var(--muted); } +.signal { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--green); margin-right: 6px; } +.signal.pulse { animation: pulse 1.6s infinite; } +@keyframes pulse { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--green) 60%, transparent); } 70% { box-shadow: 0 0 0 7px transparent; } 100% { box-shadow: 0 0 0 0 transparent; } } + +.notice { + display: flex; gap: 12px; align-items: flex-start; color: var(--sand); border: 1px solid var(--notice-line); + background: var(--notice-bg); border-radius: var(--r-surface); padding: 8px 11px; margin-bottom: 10px; font-size: 11px; line-height: 1.6; +} +.notice b { font-family: var(--mono); color: var(--accent); } + +/* ---------------------------------------------------------------- shell */ +.shell { display: grid; grid-template-columns: 218px minmax(0, 1fr); min-height: 100vh; } +.sidebar { + background: var(--sidebar-bg); border-right: 1px solid var(--line); padding: 18px 12px; + display: flex; flex-direction: column; gap: 14px; position: sticky; top: 0; height: 100vh; overflow-y: auto; +} +.brand { display: flex; align-items: center; gap: 10px; font-weight: 650; font-size: 14px; letter-spacing: -.2px; } +.brand-mark { + display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; white-space: nowrap; width: 34px; height: 34px; border: 1px solid var(--line); + border-radius: 8px; font: 700 12px var(--mono); color: var(--accent); background: var(--panel); +} +.brand-mark span { color: var(--brand2); } +.edition { font: 9px var(--mono); letter-spacing: 1.6px; color: var(--subtle); } +.main-navigation { display: flex; flex-direction: column; gap: 2px; } +.nav { + display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; background: transparent; + color: var(--muted); padding: 7px 9px; border-radius: var(--r-control); font-size: 12px; +} +.nav span { font: 10px var(--mono); color: var(--subtle); width: 18px; } +.nav b { font-weight: 500; } +.nav:hover { background: var(--nav-hover); color: var(--text); } +.nav.active { background: var(--nav-active); color: var(--brand2); } +.nav.active span { color: var(--accent); } +.nav .count { margin-left: auto; font: 10px var(--mono); color: var(--accent); } +.sidebar-bottom { margin-top: auto; border-top: 1px solid var(--line); padding-top: 12px; } +.sidebar-bottom p { margin: 6px 0; color: var(--subtle); font: 10px/1.6 var(--mono); } +.local-tag { display: flex; align-items: center; gap: 6px; font: 9px var(--mono); letter-spacing: 1.2px; color: var(--green); } +.mobile-toggle { display: none; } + +main { min-width: 0; padding: 0 24px 40px; } +.topbar { + display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; + border-bottom: 1px solid var(--line); margin-bottom: 18px; position: sticky; top: 0; background: var(--bg); z-index: 5; +} +.breadcrumb { font: 10px var(--mono); letter-spacing: 1.4px; color: var(--muted); } +.breadcrumb span { color: var(--subtle); margin: 0 4px; } +.breadcrumb b { color: var(--text); font-weight: 500; } +.top-actions { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; } +.top-actions select { width: auto; min-height: 27px; padding: 4px 8px; } +#theme { min-width: 30px; font-size: 13px; } + +.page-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 16px; margin-bottom: 16px; flex-wrap: wrap; } +.page-head .eyebrow { margin-bottom: 6px; } +.page-head p { margin: 6px 0 0; max-width: 720px; } + +/* ---------------------------------------------------------------- cards / grid */ +.grid { display: grid; gap: 10px; } +.grid.stats { grid-template-columns: repeat(4, minmax(0, 1fr)); } +.grid.two { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.grid.three { grid-template-columns: repeat(3, minmax(0, 1fr)); } +#view { display: flex; flex-direction: column; gap: 12px; } +#view > .page-head, #view > .tabs { margin-bottom: 0; } +.stack { display: flex; flex-direction: column; gap: 12px; } +.stack > * + * { margin-top: 0; } +.grid.stats > .notice { grid-column: 1 / -1; margin: 0; } +.card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-surface); padding: 12px 14px; min-width: 0; } +.stack > * + * { margin-top: 10px; } +.card-heading { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; } +.card-heading .small-label { display: block; margin-bottom: 2px; } +.stat { position: relative; overflow: hidden; } +.stat .value { font: 600 24px/1.15 var(--mono); letter-spacing: -1px; margin-top: 6px; } +.stat .value small { font-size: 12px; color: var(--muted); letter-spacing: 0; margin-left: 4px; } +.stat .sub { color: var(--muted); font-size: 10.5px; margin-top: 2px; } +.stat svg.spark { position: absolute; right: 0; bottom: 0; width: 55%; height: 34px; opacity: .55; pointer-events: none; } +.stat.accent .value { color: var(--accent); } +.stat.good .value { color: var(--green); } +.stat.bad .value { color: var(--red); } + +/* ---------------------------------------------------------------- tables */ +.table-scroll { overflow: auto; } +table { width: 100%; border-collapse: collapse; font-size: 11px; } +th { + font: 9.5px var(--mono); letter-spacing: .6px; color: var(--muted); font-weight: 400; text-transform: uppercase; + border-bottom: 1px solid var(--line); padding: 7px 8px; text-align: left; white-space: nowrap; position: sticky; top: 0; background: var(--panel); +} +td { border-bottom: 1px solid var(--row-line); padding: 7px 8px; font-family: var(--mono); max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +tr.clickable { cursor: pointer; } +tr.clickable:hover td { background: var(--nav-hover); } +td.num, th.num { text-align: right; } +td .sub { display: block; color: var(--muted); font-size: 10px; } +.empty { color: var(--muted); padding: 18px 4px; text-align: center; } + +/* ---------------------------------------------------------------- forms */ +.form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px 14px; } +.field.wide { grid-column: 1 / -1; } +.field .help { font-size: 10.5px; color: var(--subtle); margin-top: 3px; line-height: 1.45; } +.check { display: flex; align-items: center; gap: 8px; color: var(--text); font-size: 12px; margin-top: 18px; cursor: pointer; } +.check input { flex: 0 0 auto; } +.form-actions { display: flex; gap: 8px; align-items: center; justify-content: flex-end; margin-top: 12px; flex-wrap: wrap; } +.section-title { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin: 2px 0 10px; } +.dirty-flag { color: var(--accent); font: 10px var(--mono); } +.test-row { display: grid; grid-template-columns: 1fr 1fr auto; gap: 8px; align-items: end; margin-top: 12px; padding-top: 12px; border-top: 1px dashed var(--line); } +.result { margin-top: 8px; font: 11px/1.5 var(--mono); padding: 7px 9px; border-radius: var(--r-control); background: var(--code-bg); border: 1px solid var(--line); white-space: pre-wrap; overflow-wrap: anywhere; } +.result.ok { color: var(--green); } +.result.bad { color: var(--red); } + +.tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--line); margin-bottom: 12px; flex-wrap: wrap; } +.tab { background: transparent; color: var(--muted); padding: 7px 11px; border-bottom: 2px solid transparent; font-size: 12px; } +.tab.active { color: var(--text); border-bottom-color: var(--accent); } + +.toolbar { display: flex; gap: 8px; align-items: center; margin-bottom: 10px; flex-wrap: wrap; } +.toolbar input, .toolbar select { width: auto; min-width: 180px; } + +/* ---------------------------------------------------------------- charts */ +.chart { width: 100%; display: block; } +.chart text { fill: var(--muted); font: 9.5px var(--mono); } +.chart .grid-line { stroke: var(--grid); stroke-dasharray: 2 5; } +.chart-wrap { position: relative; } +.chart-tip { + position: absolute; pointer-events: none; background: var(--panel2); border: 1px solid var(--line); border-radius: var(--r-control); + padding: 5px 8px; font: 10.5px/1.5 var(--mono); box-shadow: 0 8px 20px var(--shadow); white-space: nowrap; z-index: 3; +} +.legend { display: flex; gap: 14px; flex-wrap: wrap; font: 10px var(--mono); color: var(--muted); margin-top: 6px; } +.legend i { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin-right: 5px; vertical-align: -1px; } +.hbar { display: grid; grid-template-columns: 120px 1fr 54px; gap: 8px; align-items: center; font: 11px var(--mono); margin: 5px 0; } +.hbar .track { height: 8px; background: var(--panel2); border-radius: 3px; overflow: hidden; } +.hbar .fill { height: 100%; background: var(--accent); border-radius: 3px; } +.hbar .n { text-align: right; color: var(--muted); } +.donut-layout { display: grid; grid-template-columns: 130px 1fr; gap: 14px; align-items: center; } + +/* ---------------------------------------------------------------- live feed */ +.feed { font: 11px/1.55 var(--mono); max-height: 460px; overflow: auto; } +.feed-row { display: grid; grid-template-columns: 64px minmax(90px, 3fr) minmax(90px, 2fr) 72px 64px; gap: 10px; padding: 3px 4px; border-bottom: 1px solid var(--row-line); } +.feed-row.fresh { animation: flash 1.2s ease-out; } +@keyframes flash { from { background: color-mix(in srgb, var(--accent) 22%, transparent); } to { background: transparent; } } +.feed-row .t { color: var(--subtle); } +.feed-row .cmd { color: var(--accent); } +.feed-row .err { color: var(--red); } +.countdown { height: 3px; background: var(--panel2); border-radius: 2px; overflow: hidden; margin-top: 3px; } +.countdown div { height: 100%; background: var(--green); } + +/* ---------------------------------------------------------------- dialog / toast */ +.backdrop { position: fixed; inset: 0; background: var(--backdrop); z-index: 40; display: grid; place-items: center; padding: 16px; } +.dialog { + background: var(--panel); border: 1px solid var(--line); border-radius: 10px; width: min(980px, 100%); + max-height: calc(100vh - 32px); overflow: auto; box-shadow: 0 24px 60px var(--shadow); padding: 16px 18px; +} +.dialog.small { width: min(460px, 100%); } +.dialog-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 12px; } +.kv { display: grid; grid-template-columns: 150px 1fr; gap: 5px 12px; font-size: 11.5px; } +.kv dt { color: var(--muted); } +.kv dd { margin: 0; font-family: var(--mono); overflow-wrap: anywhere; } +.actions-row { display: flex; gap: 6px; flex-wrap: wrap; margin: 12px 0; } +.toast { + position: fixed; right: 18px; bottom: 18px; z-index: 60; background: #d0dfb4; color: #1c2818; border: 1px solid #ebf2de; + padding: 9px 13px; border-radius: 6px; box-shadow: 0 10px 28px var(--shadow); max-width: 420px; font-size: 12px; +} +.toast.error { background: #ffd2bd; color: #42241b; border-color: #ff9f7a; } + +/* ---------------------------------------------------------------- auth */ +.auth-page { display: grid; place-items: center; min-height: 100vh; padding: 16px; } +.auth-card { width: min(420px, 100%); } +.auth-card .brand { margin-bottom: 22px; } +.auth-card h1 { margin-bottom: 18px; } +.auth-card form > * + * { margin-top: 10px; } +.auth-card .primary { width: 100%; min-height: 34px; margin-top: 14px; } +.command { display: block; font: 11px var(--mono); background: var(--code-bg); border: 1px solid var(--line); padding: 7px 9px; border-radius: 4px; margin: 6px 0; overflow-wrap: anywhere; } + +/* ---------------------------------------------------------------- loading */ +.app-loading { display: grid; place-items: center; min-height: 100vh; color: var(--muted); font: 11px var(--mono); letter-spacing: 1.5px; } +.spinner { width: 22px; height: 22px; border: 2px solid var(--line); border-top-color: var(--accent); border-radius: 50%; animation: spin .8s linear infinite; margin: 0 auto 12px; } +@keyframes spin { to { transform: rotate(360deg); } } + +/* ---------------------------------------------------------------- responsive */ +@media (max-width: 1100px) { + .grid.stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .grid.three { grid-template-columns: repeat(2, minmax(0, 1fr)); } +} +@media (max-width: 880px) { + .shell { grid-template-columns: 1fr; } + .sidebar { position: static; height: auto; padding: 10px 14px; flex-direction: row; flex-wrap: wrap; align-items: center; } + .sidebar .edition, .sidebar-bottom { display: none; } + .mobile-toggle { display: inline-flex; margin-left: auto; } + .main-navigation { display: none; width: 100%; } + .main-navigation.open { display: flex; } + main { padding: 0 14px 30px; } + .grid.two, .grid.three { grid-template-columns: 1fr; } + .grid.stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .stat .value { font-size: 20px; } + .test-row { grid-template-columns: 1fr; } + .kv { grid-template-columns: 1fr; } + .feed-row { grid-template-columns: 56px 1fr 60px; } + .feed-row .u, .feed-row .ms { display: none; } + .donut-layout { grid-template-columns: 1fr; } +} + +/* chart colour classes (CSP: no inline styles) */ +.k1 { stroke: var(--accent); fill: var(--accent); } +.k2 { stroke: var(--green); fill: var(--green); } +.k3 { stroke: var(--blue); fill: var(--blue); } +.k4 { stroke: var(--violet); fill: var(--violet); } +.k5 { stroke: var(--red); fill: var(--red); } +.k6 { stroke: var(--sand); fill: var(--sand); } +.k7 { stroke: var(--muted); fill: var(--muted); } +.ln { fill: none; stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; vector-effect: non-scaling-stroke; } +.ar { stroke: none; fill-opacity: .14; } +.br { stroke: none; } +.dn { fill: none; stroke-width: 14; } +.cursor { stroke: var(--outline); stroke-dasharray: 3 3; } +.sw.k1, .fill.k1 { background: var(--accent); } +.sw.k2, .fill.k2 { background: var(--green); } +.sw.k3, .fill.k3 { background: var(--blue); } +.sw.k4, .fill.k4 { background: var(--violet); } +.sw.k5, .fill.k5 { background: var(--red); } +.sw.k6, .fill.k6 { background: var(--sand); } +.sw.k7, .fill.k7 { background: var(--muted); } +.donut-center { fill: var(--text); font: 600 15px var(--mono); } +.mt { margin-top: 14px; } + +.card-heading input { max-width: 340px; } + +/* select dropdown colours (native popups ignore transparent backgrounds) */ +select option, select optgroup { background: var(--panel); color: var(--text); } +select.quiet { background: var(--panel); color: var(--text); } +.feed-row > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.chip { + display: inline-flex; align-items: center; gap: 5px; margin: 1px 4px 1px 0; padding: 1px 7px; border: 1px solid var(--line); + border-radius: 10px; background: var(--panel2); color: var(--text); font: 10.5px var(--mono); cursor: pointer; +} +.chip:hover { border-color: var(--accent); } +.chip .signal { margin: 0; width: 6px; height: 6px; } +td.wrap { white-space: normal; max-width: 420px; }

W8i3xQ4m(QOMFv)t(M~Xb6hf_8)#gw_v=wTPH_c zURw56x^Bq{!RMgVjF*MnEkz%M{zz?Uyx&O+8c?3;?jcv_j*3RnqK-t`*jgJaRl4t0 zs{kpx_?8@_*&5DwH}CTAFIBVH$lzQ3g4OFFlk6E)^^V%I_J5!(fxrel&Kp;+mMvv02h)$?nY@_u$yT=g zeWQV&#BR4~##U`#v9mi3eH9~|cW>hd>L0(7`tMxbEHdVqU*bRW^YS*es343ND0AG0 zUIJM6*LTKbRD{1#i*?>Dzr0&gCxb%pxhu??OJLk-s;t(aLtb-oa>_PZtk!^fc5i~F zIxQXKXFTN-ek>Bs&^I=#BVt{rKNBC3ixiFCSDudGTiROp|;>N zc*{VgU$%lGM@|?qg#Fz+?d#jxo^Qxw!qPTIyq?aiyDzduwc*KM{$NgSW(cr2>I2vXv74Cslhj7D>|D;uxJT@2; zZF6>lz++|ubneoW_XP+-Ye$$?tF+{B`6T$3i>qFh*)&-;-CsMp8_vB8p_ZRMGKmn2 ziRn$2fxeG8Xg287jM1vOT%9;xeVNp#IeWnHOpWJ|Vsip?u>N9>YD-(X+Id0M7drK- zGWYvt(I*SCr(1B#X$gBpB_$(+F)qHvLdOPG-MR_%S|pYpDMY>yu^h!-lxSa2!cvR% zP0cko&n@Db2);Oc0m6R40SlyJ6U^3v)XaRU0~LSVEiIy+DU{eU)@z2)2U4z$I?pU)ovP zUZx&Pmxl$zZ5vyZf+`(cOBqY8eXVo!>C&)xnC`DJluFV^yGyMiA&W}vug3DH{h3Wo zOv;R>o#yYnAkZU)S`SD0=?aUj>B>q#hCHwc_WQ9yfLHH)&S?YT(R51-vIQVH{MrqF zFjdk%PrSv-cfW54!sr9}Y=cvy)Uk9bZ_GA6;)$bOFeAOSxcH>e=oZ0KYO@)*vdk~z z=BDrjK{#Udsys-)my{Zly~23bCB0knEG>mZbPQm)rv>+wS- zo%f%tbG$9l4+_Pb(ke3wXUvRf46ifXhoZqUEOwu#qcK=$y2CQ*PrRMTq<@bhs*hMe z7g1Qld+}=%^&mF!JZW`QY8X6Eq+A?551sp?f~HbKmMY9$(C7o1wGJ!NHY&QV`f@HAEqrHNFgi6Cp%xJX}> zKBq)9(v|~Qmw;TQ{I4AA$m;OaH+5XYAn%aD=L9g4B|cr1b%BIH)l#QRfRUUokDNic zxjbGsifIO^dz@F}dkkFr0d$0yV zH7!ZRuss&GLQ#>Q!=rJKQKj2m=C>K;g7yt=p`QzJyd zi!jpL`!ixMfp%nT4&S*1qkUuajfoWe8bJ1(t9n&!`n200tRUW64yqMK7N*xGX9+BUjZ{Q&UnZWWQIbdWK8YUgfrofwQdtu7U#L^rGG9 z>O=(uvVetsZ=|?BFsJ+W8o9!3`W0UETq2v}RMSB6WWOaJPpM-A$Z|O%dH=OVXIDV}dzxS0m@&PUrD#2{ zur`(}E8!YtgsEOMUiRMT(%F!TR()g`92~@DwRmU89v7OB&UWICoc=m&2uFQ(#(sA$ zs2vL%7wk4_PIV`=^j?ZX2p@m<`{vLm>hy6jv`P)^)Mw9jW*eRRxy@43-=8Hqr!)a(7nMC&Gvt8$-!y|Aa ztv%l0v*i0RWKAW zh&-j@D-_G~RBG)X*L{EOItA9g921pKGZz6_buO2x!zxhKN6j zAll`y$7i%{>y%sG*=exdoI=$&z6I7x1+Le0UyDD)5)cc2fqM>*5>lX638nkm7m?8MzF7e68&mX6ehffi z#kv179!Y@)pwYdVH@^f?9K@oUtzwa-#_q^Ew=YWNQ8<-%uL~yL__793J z_^6~zZvWw7%>W1`)4`Hi?|=_u1sX{kU*4-~QkjZ&!JF#-R%I4KgMIDd2iD<5@yap^ zo79SbaS-If$#egol59O8BK`>)&H+#Ztu|+cI#U`RdCMF>2n^r#U`t<^S1ugA#gQSmlt;KK{bj)g# zK*vwP`5gOTR_Mr@AMfb!@N)j%p4CWiHv7~0a)$?y^;kQVKC>%(30(gfid;a7@{ux+bYCVbziOwB!aj*tR z;NeuCV=%{A-dwCUo9qS*;`RH;b?k?AxbqZxGIF8w^tn0_j7=nOYX9U~W`;HG@0qgf z0L;&jc-hgCwQhy3`I^_P+a$LH;#Z2-7l*@0_%%$%Q#KH3;U;dXzhW{{UfQAW3s@9iV6#o9@FeR8Oi@%>@^8jqc(_T;iXHfr{y6NqIC{HR6 zaZ8F>Hj@7c0j^*sBLBStSt9%grNrZ4jX&2x4#UR!SCa7X(;^B{<1iB(5Ej*yM zRRu$xe5FdJVA*t|aGmzRjBE+<;M0@SFH&DVuy;HC-|y1N03|I6MfpInLPG<>H_LnA zXOAbZ&~UOBw1D;1j_bFa&? zJLjC4XP$ZD^F0+(`Zhd$+?~OYIXE~H%jZ&E98}zl<6n$z;Bve}rttDYPjceW0MxaE zQg;5=>vt4_1}$ay6(-$^g?q=J>zR!e>}>6*Pv#yk<3$2dXjWF%hz!{o*x3N zb=Sur9pqnLu4HVbvUN(QR&Ij*kT5$ZFEu~^Yfg@Qgzn3N zR5SL15xO*&m2X)0A7bK`8Z<`}eR0sJvpd;n&RC)AN-YM}?_gsuI-TCIttsCD9r1S^ zmJU2@4&rO<>6MeGSM9&}_;}ONsDQ><)81lMs<8O!DwB-ruhpVYP)bFnYu%3)tAbq| zcNJw7pV65G!AYi4zVA!maKcUUT&TRis~XxP)`O)naCd+Ja`b+{(u-t2i6`< z$pzgLQ%2=Lq$cwjMAtK|eIP;@Oj8ciZxDD+_ybC!*@RhR&+X?T`o4hFpOBE??d`pv z{9w4o_0>6gP~Q8zg0Q`7gCiq`PntCrJ3v^R(BQANiD?Xz!1HtAFXKa(4i9f_$crG* z{d4tWpPh~E@c5XCaR4MUvaG!EKW}#6Bd*w40=ja3UaGm=w=}UGe7AdNKLA{G2y|8v z@{--h#UKVjG@2+-qcS}5aJLBqpU`=8oO+o9N~ACbU5&09*Wekk0|}N-oKC9%2m+)z z0SHvIYY$awen9Mv2{kexJET}gB?Csk&$oqh4@K|eE9KTzDrhEPo} zvTPv!JiY%KeKB$&(I1-|3tcPsqOGsm>XyV`l5o2MofPr$_o1PD&hu~%vQ9q^>4wu7 zewDKu`vSe8Bcr~niwm;Y zM=JdT7{Yg9VMB?z)GFL(3;-TcrT&h;tE+3FG+QV!hbfTo^4PczWTvclzfdziI$rqR z*w|PVyrv5SPH&)W0Bf`A_f9KAiUQBU^5+UL!=*`~*jDMNcS;h^UtBt!q3UqEeLJ2S zvrOgxfQe#6r%|K3bIrf1&EcZ6niiWW636T2up3h4k$-7>8Z{x|owPbX>*M0ED+nV@ z7h9n})n*O>LX)Pu$5jMlZ$wIXxldbKTEMN;MLu9lDWU9lzFenPxJ`DZ@OX9!pT_fLB78{boht(FN6Mv0O@||gyKU4;IjM2%wkKF<^|SSX?^fu4Ef_7B{9lNepR+OP zHR5s|oOsh)jknRzk1v+;Jo;;)$&hLzf<2yrSS$gE^@ZER5<(A{|9Vj!D8RQ^_7e{@ zOB1lbo}c`my?7ZG>eV#)G(K6jgh}{k+Wh$h{W_@EX4!)$hco}Hnc%OFP7-(rEkbA1 zQF_pL@V{;y@B+?13e3K;y579+1S-;#K(#$1L>F3$e2CQ*ER`pdCDcw&)H0Jxd%QVS zQYm|oOTb?uR-UZ`pVEW>e(C2W3J79%G<91D8m?8zlQP4(KSOv#*l=f22f9a3kS2Z2 zRx4E*e5uKunVpUN-Neici%v@cVze>Zkycs#PA&Rn#BS38%6cw5v)^v$93jb!%hRYo zlT2SkfNqVx22YjkN=^X5%X`)rDb)Ms{`>`Kf2k57<#{?i*ijZIWIqs430|8hV$}o+DJ$PA2_w8x&#)i@yQ5!fdUw?3OaoQ5LY|UnW>W|# zpWbB8^^b-!Vi<<0)B~MCMJ1F1i1#cLpqNZIkv6atbREY#l2t;0U9PTH^AS4%hEc7| zJgcA}Bme8y{N&JjL_8z$ZvB3olV2@jka<{>>g~nDvE1~stf~#mRDZ{4LQdfH5`SE#pIyr;qriCFRr&Mjf6bh^Z)7SL$vE2N8Hp9jB z%JE8N2CbM9$W)H@gN;;3Oo2?jQQ|HLL0W3nWxY{VJ=c{2F$B6Cbs*e|6ngo7GgT%< zA+S%A+wJD{+4@Z+;A`MvK0jB?)oOO`Pn>YSc{2v;`1P>|uqgqtFK@21nw%fwH1vS&@C}CTkvG`QSVv_+HbnY>LIaZ(;F#vsR zC|!j#KG`yfiWmzSsG=FYig)>O*bCSWro;K6+LOMQB2Z-mVId)YxAWthohwkN{bT=v zj0JSN70pm_gM#)3ZVz@^Ga3bC_0H|S4--3l9-L0w$DqDnb}mhIX=-e5y5VU4q6CL3 zEWvcL7KsKULN;QIUin^9n3r+B53l23A383S{#iSsNnT#`-f(kWqyfb5oAh{ zC?W@dsmuMFrCzg&@F&1OcXYT6g}aAv|3O%zj8F%ki{u(@Nb@gzFQ$r@orVLL(G2ko z*C)Y0Kx96m1CpzZ>x_y&#_u}6jzTbH7Lz~aaS?PMkp}p7KqLm3E}!$b&rti|?OD70 z=>CV>-8naOJmQI3#S-7UHa3@+&Y-{On+2%;39GOK^T|)sdTaIb04XCQgyr$@z<>QrUuJQ8Vyvg&akXP3fXe9#xezh zGXeXE{QMpd*d0M=ExGub-@~n3_akzznwq$nm^DI-68WUPYO36>Ki)}BEY(B?>pW|wiT+R%2`XIA2!@r#mD^jtuCZwRi3LoI z6b5)@IpKw*W~Fo5kLuf_o>YFS6iI|M$xax(YQNBRg+7f`*tj^@3A*sm?)<`*PwTks z%8m!S^YPX8Eq-zwEnt3!%fo)qer0QF(I@ruFx!a?YVCfkWf(oV2iBa^(I%?a{;RlC zml)#sP!dkyywh=#p3EuN6r_5PaGG5DuI7D-=WwRsuqJ~hlj`|*w@e8P8IZ@ z_r>w}NKQ~Ze!Se_)c{HxJmCRfhLeVg2{0u-dXVrl8;>_0M7G_qIgghGkAYeLSX$sS#-hG)$+v0U}Xa73NJ6gEu|Z$%a&M0@S5WdJz=raHDTT9jpZ%it$v&5clEfga$W+BK&LxAg)9Ae z82o$FAp7yv@)SvrnA`4p;fJ`8qcv@h`^EK29znT_lXEIDUNkTF+3tAl5$KEgGG>W{ zj4ZaYrEJ*(f8~6I%uJ~s*fs~?v{RK!>rHw&F?qc9JPUX0_U7DF%3rruG2<{|bQxol zkc8PU=7Rp(tINa#gGAnmqt?O@SGvYXXb;)GnOCWnLxf)c#Ct((@j>HVV&WVC ze%w^pk45uW>`WKavOHFJ(+pLDrhu+xL~bgm0~^i;bKSSRxc%_aqe!_5a4upAcve{};*)njL|iCuTkE(_o3H*WEF>XD zs!YXEeY(j7WI_S4v-2sBUpDB{N5kbJ_4A=tQqI*Vx}CoPYrzy$zZD1B1nnF)!q7+j zXME71fj@j#Y(4PeEt6Raco0)$N7Bpbl>nOz_o_x6gG{72Z2{?Ru%D+Gc{}2w65WG^yfv2Y+C$~ACzVr!6kIQi@H!tcEdNpb)os8iqbj2@mk76msV%VQ%INVlzWn=uA-c$WdCg# ziTCPwc=RPMOmq3xFq9|o>?t;d-EUR(zb`c04E}KL8z478RI7dc{WEfcYihpu$M`!2 z4pCNDa~&chpK23=G%Bbb=H%n!a|7r)#fqypXB$hP@`{()mRTnplvRbqb6_JOHjub$ zy4aOjn9vOePXV#mr+H7Cg_^U+^0gXtgx;k9&ePY`uR#ApkLrD%WO?q(ZiX~Q%U&vC8M5tQ3JW%|D5}OK1#1zKwk71#47x=Ji=|7# z=Vdg_iQBf#jZ zk6LotZuT_Q-Q%6%)t;yqy33AJ0Z>bTx0=_h_XQBGlXL$;Du4)rz4?Jswy zOXW4?XTbRyKaR_xtG(R_ghr2IdO-I_O?mmUEnb0EZBSrvQMQgBg8k;m!P(jE@xr4n ze0+Qthi$=!a9)GMBO}kA7E^Io>_*+MF<+~jI`b_>#0M>t|CzbV$}kBy@HStd$^#&S zDJdBQT<}RgkMy)$Ts$l+JPbTsbi1v~89?c{xV(YrDbWzEg@lNK^Q+1CArO;9eDI*6 zv>0^7x{kmDnXf&5_!u>gvRIqxUaD0P8s|CB^&5S?@|r!b%}Wb|<}8s#L_+ z&(H6jZ_512f*;*OLR_}T94#AP9yz3@rtD2uJ|ZLxVfs%X4HMD<%i{?4v@cNH$o}y@ z6BG6B+ScA#^W6A&$M^5u?NiDJiLcBvb8xnCjh`PGEmez+80kDoK{E8ay_5&`<(t zs`b()DnODf%RsxMEEadRDyG;i#=ei`$YjAHxL(g&a|YWOt{S#cwn0)UCj@RpRaI5B z_;j9dRdaQ+={@<6c_F21WCAY$`WTdr@&8LEF-b^nPe-73&SCHS6E^z3)(O@;S~fN| zv9^WdqVE#IhzBzpE<0Qw8qyC}j$%MT@8=k1c6uG2%d^2|F|_9S2#g441ZUu!LZsSD z+WP^tBq~Q`cOum&v!bG;z1%je4|Gd_*dOQ+0|l~gU%YtHN`rL|jUeFJ3F@)S$)2A= zKyWaMn!Dr8?#|8(D6_m`I0YEk%;#*3xwYP|0AgKcU#ebeQDodo{#fLLdFM~jy+4~u z2Yutucm^b#61wUbCw2(Vfam14y`OdENUVc%a5{2Tl0hHG=WyB+cr-3;Hk_?a%fX>? zO@mxLRbN<^sh|8c+u>kZl;J_aL1a5X*J*0X6V-4y-}bptJWBoOk^drU>Fw2K-b=E0 zfDpLna*qWC5s|}r-FW8GJ_fLaUthoupP!$i!U;MPLG2EpX`EkBrZK-s z7zeT5uGK8m&*_)|j3SOkm?c}&_CZl<(%}t|5O!l%u86`f`77o_S^~#`_UjP}s6k^^ zL(K+~7uy>pM}|GYF_%ZQXBIPG_;j2_(w1*4uB(8!b9zp6t{RU~QB20N7;fLoJ`j8o z@);i={{>qRS3z))4KoB7NY{WM9?!$F8^UYGpwTj!5oQh`iBogAXcniW_EJCAa94U zB~JtNt~h~!J6k%!KWQ4$3M4DuKhJuZ%8LiIm%h6vAp3mqCin*cTlC+?Cs#5Ct4)uRs5CH#pL|C;}G%pFY za?9*62@n4HBw*f)rNO!UP3o!$bUY7HtbR)m{WgdlPl0E{B=rFra*AbW#P}cArUN9{ z{6l2khn;>hcrb{^@RujPev5_#iYWpPRY!`t6Pv=#Q&e+%8;_7SeaJ| zfX~+0C$&O~r9&rpL|Z_bIFV|@^DDO{aEb)#kmhZoFI~Y#YaH!NK>X8jRfnqtr#dQ6 zlnDkv<2aG34@C-H)>QeD0S``(Q6E1Z9#dN#{2Zc8BYafUN6^zHC*F91)+=Y(oC=PF z2^jN2)H0;-R%C#L^U?vAl0&~jx0{Co9TPV3BJm=|`3L_em1ot$l@h2iCx;)>(Rf7;9VmQt(E?e8%kDRH3KN1rBe6|9+=o0NG zFWdZ%{1U;8h(3b@P#qy3;SrW$fY}Mc$N7^1v8lR4uTuHO56&NaNVoe;Z|N3M0niqM zy3<}D6ES!4GMbj+5n(Z;NLmXE@d4_Y!$^<{=c&^R1OOZ%p%N z@#_jz$I9%ejI>0u zD*OFheorzO?2dnW!I7WoZU-3V0d@y%#xbs9QLZ-|hg$C2B2W;G`vo^Oj^$Tlcx~EA zZn6N(!}+Y=^W@J}bTq)mhR-wp-QImCU0x!i$o}p#J3D)s*stL~8@wqYj2#QXce%>< zhU@3%-64+&Cb>j+j=%qj1x!AX`q)CIO)~dI+0xm?1$;4(?Qz~YEQ5Y=V*~8JJ@mhQ zC4mI!<|`~Hm@I#G3K+cQPP$X+M&iqqoD*j0S_4JbOR9wjWlD7VPg|B zEE)wwc;AEst-YH%@%JPKGeh`vvOYlCMB!|9hU!JUC*4bA){y@vANAAbDM2?;$^Vz# zeXg&cRu&g+?Kp(P2>qv@ru9s6GTFQmJ{1zkW3g zW}^%55P0&L)pTgxzdsC6u|ncmuvH&KexL-Z5)0_nufFj14o?q%Z!RgaUxE?7mn5et zOr#lv!w}kq5A@hKCg4AspgH`U?*DN*Wk~(ufJX*^CCI2~W;6Ao-E6%8xME-Ss6IR; zIT=KHF3hGXZWEO8rG91BK3AB|7OA(7l^1|0Jaoqy+1-jhQAgY5eG5FTH0BRP59`7k z#;fetI`ya=EvB6IPI*@n6K~K#9o-}cBcoMo3Kjs@ay#!Emu-%O-!L+=06n-m$Fo_` zE;UN8?Xq%>mHg~yYyO|P_IuQ6vZO|zjaZtzYJL8v>kw%T$oNe9pC$U*T$Y(wBfgAud?m=1t_`L$0vPn$8Jl4&BJ=S9M-vl$F7f^y(m#$c= zMng^g+f&{1%!TgJr&~ZZ!cGVd^=Bi(f5zt3^Jrc|l^mJ_&+w0lcy7(F?a@GT)7B;i zX3jSz>0YUtnrf7lWAn4!X>OCAG*Iw8TkSwgDR#&k6A*yN%GycC#+WqO?_%!jM``O5 zw!d#>U|`_nB5V$a8RV0W(N4>+yCcsO-TmA4E^faG+3d zy`$qEERfI@4GH=b#YSzQ74(;UFmw~ffVnwMNQB>qMP>Lt%sRsS}ziBs86VxGW4Hu-Qr70xK`2iqM>T6TO>NmYiAk3E&lV9&~ zr1f0&`I~;BS*!u(VfnG40L0+^qk|)xqhH{a-vJKN2E=_JZ@;VqQ!CKi%|d71`whW4 z_R5(V@Z54&Pv5(=hXF_QeE0`L^2Cj5x{1l{+0kB86Te-YocdlyA@%3EUmoc;(^TG^&Bhb0Q?r+JE zP>0K{v;A&|fJQOT?yw+I*9H49^G-3rp^Z(lAen50Z0wCfPb#Gb+dqyCgb|hp7^wH}`zz zGHc#MEy?JsceubeMF#|>CXNpgYfl|)FWAYvg+q9#lJc|Y3o_C1A4ab!^}+u{$^G8+ z<{v}%2OBNGC&m@EPD5w%`WD^=tyXgMCF|Mt_GR%A8MAsF82K9&lN(-4F^1x{X@DE!!8%V`sA_= zjSPba;S$}H)T0BW!{OiSh?B1I;tXQTAZLm++|5*FOA zz1C9lQ<2-N_DSQ&pDhW520>7-*7eGsdqNFhTE9F}|Ks?D$HEc@|Kr5z7Xzm>_I}sG z?{AGIYy8#t`D+Uuf>u{e){g%Qv)TCHQT}@YdEJ7L*#QaKPeHj323Vd4e{a2*P?r^X zbg8!lIBqu>^S6Hn_scE4kObbJ>xtE&J|x@;mN4+2A^qIF1+*T5!Yu|~H4QV1hx2Ox zu`N*N5(io{7EBy+T^7Y-%hn|+3G$F86JJH=1l@puONjjz!8)j3T0Em(GU`nX6l!im zl?gONiSBErPXXDH|+%txY(%}BmqVCR4eZ$-91n^h@ zNAUVndu#imI5Gb@=iw`jd}*uY00b(!09e4e1Bx^|TxE26N|!6a%30`{nKUtUMp{*- z=^Y&b^GUuuq9dD%>SgAEAQh&vuAY(x!X^DuQ_3S|DoCv3?iYt;vXSo~9i8n`<=3Fr z@%R3NdEZOOSxpdzY?po(V<7^5Da0un6H*C#{;d6hOOl5bnOhzUwZ4+xucOPdA`HNM z{HS^0?s%Qhpx?(b;=*htHHIzK$%uxNS! zoX&Zma`Kv7rpk1MToiS#;mQg``5!)!mgCBM%ULy_G*63D0AydVsqYuX{$h6p><3sW z08P*6r$b7(Rs*XE9rT(N&|D< zv2>4LJi6u8&uDwEDC}H(13+vQ0x}ox)#>^EuAU@qWIK#g=jv*iI%t){Xb2xFmJSAK zJkm)AV;>+XrhIL9i+X|90-|DhrV7IUEx_W0G-gqQEB-VOA$`E|idobPFf_nfe5Ts{ zYFRrYU$dIN+}6g9&wjhKl7Q$@3CLEAzYh$YD76S~NaXJVxUz{thwpuKHR#IpTB5x* z?0YhSu;h*WujlgbLO>q2arX!Z6aC7Os3rQZwf>uqMd|?!lJgUbC;UDT|1uNBlAcS@ z)!p$3nqvs`5B&Q;*ii?of%kJmSVn+`=bKX-S^qpa0k7+)jkdo-@%lc%7EO5eQ2(>q z1x#Ui#Js$pCgr56*Q!`MId#rVqZHrmhmt`n!JF~eml6NWMg6=x;-HrGFh`&$rIo8< zPb0&S2(&jMfIFP2bk}Gy)19L3n=@oNc|c~&cp}%}GxpO2%g@d$Rc#=?D-}Z%zZTsK zza|Stc({JI-Qf4GaD(+4YMBIxu^{rakO)23B=tb$j;16dM(?R zqPk=VS-t_-;Kt(br7sU$zYo*)vyP4ojtmd<*mkdaA7z38I~{v175}vAq^PiOphr4T z$RU$t)7m9^KX`p(LshZt+o6J@0tN&zxgbOPTcrrujL^4sE}1}A@oq!9t&#kU)I1+e z5z*ivvDOeZc1v@mw)-`2>E7qrMX^w;)*4$Uw+YNOmX>D8h`FU+zMrhH2=kUn&CCo4 z1npjatw10&RqnZLmfDDEx@45;ShnU+#NZtr-8VzE&yT9hHcd@$uJHLbWK=Tp^XVrk zd{f64^)WI9qgZLDzEz8Ui8i<58pk5vxIjJ$EbqvB9dE8yD##=uB`?JhBpHXOzd4+n znw=daxnKv%*I#}YleP{;-DDFe07%sZ2rQ;p>w7rtIMyze2M(>TzRweWVR-{v+J=gs zla-w;wIJk27G|&8^LfN9J0~agVRCMoMva(x97d>ajG)(>M;+-%Xx9RxmI@x{>kGnS z_p=l$l$5N7v$Tz7KRBsAV`_)SAi~$+DqsIT+noYA@wfgUDC_I{*4atdq4tzssT3Dk z2qXvY!QT@V5vz2mPDNlC>yC}FwQ~pw3f&y|>I0gLY3RDtSaQeq{cpnx_ZgQNsvUO| zAdkp+De)2KJ_;ne&s@%FHZv73(%cem35XnQB@f$>l>qv#6qM?Zvgsc5m?J9mT3a@4YD3;`SP`tU^R z=xcApgy7GLnCGeK_T4G(MENJ&4pH`j;-*h+?Xm@BrpRGO-|Wlh&yh4bGUn|VF^X{u zX6uEVVYA*RB_%nM%qc>&o2G{en{|05h^wlrCf&+%G)vg}et?zk+4{i>b1=muxFfS8 z#!?I6-aT+~L1vZUS1eG{lox)ar;Ey(XPWYGuv*lNu=v(c`>S2-Vrx+9J3+5)j1FHo z|Kw!B42zwc{#n&K`Vr>Vak~~s7;ul_qR`(^n>mKDvIp@-0a=8iY~BQw5T)wCwq$o;D|KiW;|4&n1%|w!m9V*JB(! zPASYp_eX`(bjG}ZTsj>Gk1^wovX0_ z!~*!Q)y}6JEkPS`{#><|tSk%#jipU3L{59))w5?sg|s?Ifk>|s_`H((8FfvN^<0In zcU&rhgMvSyBX|?7Gpg`Z#PpWEBn=WEmh zI!*U_#vmx*X+mmK@MiR_$+!Y_*uA+uR_>#C_t1zDQ`5_y*s3e2uavu)t3DIuAcfl+ z=!bDoKoJG4fgL}u2AR5y^ohmSoNT`n7Q0kA1!{xwL!**+ z=EgH*!|;Ra>t{0~DBhvr@i_E!thV!+ty(twquSe>(BF4tdWs%#uKp=4Ho=VTI_vK4XZ2T6;YGK4|X*)2J-76 z-lb0lQ7g%?Ju3r)Q-iaLs7Xk+WKqZj$+U>IhVNS!S~vP3$a~n^+cVoQcJb44qhJZ4 z=L#a56le2XGw>H^PC4Kra)mLX^59|2+kJ0K%1kg6K{mKNW^DYQi=%*3RqoT zB`5u+qE+u67;ra)latfFt*7UO%Dm?SNN)*eW#@aN!NU@n3wlL;j3)CVt)OT0a<1g4 zdfif%P~>IJf92kX)>nCdIo~Nfqcj&&HGFYV*MfdDodj`s?;-4~jvp(&2-oq5uI8Sp z=G^JS!w;SZQd4&VO*7gu`Q_zB{Wbmm?oMHqsKl^>-8Uu|cWAq4C4;1L-{hqks3fG_N!!IBx zP;IghmISd&XoEdT8)T=xrJT6Uw;}e)#oW-pkU{7@vEA{v{nD9ojPuxPe}18`P>Syg zjfMX-Z|a7_h5qZ$?#R6u1d}`<-_k^za{ep*$n?xu6TFAVP z2ZWE$_4j+Z*>x^*=NAcM7DEWQxw%tGtF511FJ_fwe31Xp>m2)BQX<9O7gvUv0!9$V za%q;SuQv@5`*lu;_3K@0&zr35*;=>MSuG;(eMtkwCp>sw{P~|qd&nZcA*MfB5+&LE zEQTS5k2~0T7-U1aMUr9MI@*Pu%3;4d+~nzV=PD~3zqGHp+gbaKun`v}>@AvC0jd=u z3JMk$ruvk++QcUuY|KF9U`!mWh7c#-x8sc%dhht0_bW@&*wV%hZz$H+E9M?VG{8&Y z^u)1$|2FB(x!`iL;Ww}b<)#twW6k3XbS43PIFgV|Cvf~_yu4m`bd-BK%ZU3Ws?b&k z6z#otBkEoz|6sE;iMp=*Ex)DieXuL0s;cJ1L?QE2N=<3>b61QbSgy_jf!EXL05m0L z{}Aism}08kc8$R`H@|Ja#_ky#^A;WW0Uh9?Re29XLiCM{w1HM{V%W(kWn0SE(b@5i z@WjM0&fLTx#9$Uk-!hoFpFV%KTTkli)8am1av;+oi=-EWv=Xwtj1BE9i;!2c2>u)^ zHZd_F`!Vo2j^RlEI(it{7~i2i+tHmo??tQB9~c_=MuUiE{~_Wd87)OH?mhYrtYs`*7xmWi z%j!$4k63}7ffpASLvlkKu^WrJi(Tfb{bQ-3B?*SGtb6CLuVXRkm>eOD{u2CYZUck4 zntU6Zg`>)h?%CPn6-7);OkI*)mb!C|c`wnoJ9@hGgHj_$qes_`KwK+wsrAXjOI2lT zWCREeO&1S=w}6<(+D(ASFnbCjzO>{^@1rrq{MzyHi9?h_+2`CV4yYW>DpbarFBI;N z>%gdU;&DPAi_ABW?U%uz!QoU@a*)i11-!-WZ0%K5(xRUd`|9)6c_0Ekk>9n4$LveUjI%XQxEA%!;O_ zoAF;9Ut5atr4`SUCxC}V%ecTUDNbq^>n?!coT)z+_Ja}ZL%n;Avju{cZ z(Cj}xsYanJER6cmZg|9G2o>$|FJtp_n=nog*z{LGvJMpdaStdhYt}eP%g9)HcHbcc zmeO!dpB+N`^l@%M1_OjtWiHfM=%q!dIzPJx{?O^!QK`GSR``Z73$#{7$10)kt(3qvDq4M;p!c|O= z8s8^2^GS|l+r}_a9l?dXtqSkEJ{Z=GmM|%}S)EzxW0rnzR4WW7&rJ^Y7Nw*loi0o( zqA>E7*YtjvkjGiZ5yrg;)^>h{DfAcwbazH3X(2QMMl{J$h>UQx;%E)_Yr7M+$sF60 zBX$BF$`E^UGO~Kzi#?#q%6&6lc7A3M7#PUwY^$QeXe>4k5ozyq+$6IS1 zy{$jCRaw{{oSp8dqn|(EBW7~D++JVDRmNGfUTSZ&ovwTa>Vn6SkWgwAR1}suE7@Lp zqP2R+rSmQb$H8&B^pS$kS(eH8uq^JEWR z!%U^qRc9n*`Rms-VlKk)PoIX<2nheRXrDAU*3@V#EwPVC zOmFff1$CMt<|)K|!WKVQ6=v>tozNOF!~yYyVGs-c6mvY{l%imvMbEQxibH?4HGr5(PP=VsAzaR1`SF=>1qAednFfj0l76 ziYy}|thr@ek)P}Xb1zsbXaU{f$$c!X8tWaC9(i2rD*t&=V_Y+xkm+l0*HUeqc?ozM-a} z@$ii8Mv7ZaL1TC-lwR5rWqTz++vprxaAJ6Zhbe9u18f>J|6Lyb!fRI2zK zlCS!Gey3KEF!T8FW1d=`Rl3;rrlyEb;h-ZcDK+PAYHYgd5s^Ru99prteuU60Rjv5+ zaAz;|sr?%Vhvr5`LJ2imFHP!Zk=k&Nq2?&tjm_H;oi6?#R z1tCB~K}LR+z{6|Mbu8%f?(%}@onJ(E%&n5fs~CIQr2rkRj(BFrroq&9G@`=>hn=rL zmcpmboS*6*pVn+{Zf+B?77BnOR_i~ZGBO`WyFp#v_-;%~>(WowO!u@$KP|mLqb}54 z3$3A8cLo0~*O{$|sil#R-IzsUY{{yVGnxwlj(>B1m&6_hM~3U^uJ|w|3(IyR3_m8G z%%h2jNP~FRl@+Y90_{Y8%Y(v&)YTqMtJR(=ag1E`L^(PBTa17V z8k_Fo6lmmTr8;pfv#@2#e~?eQPt5jqG)1*QyH;$%@G&hjEe(_Dc3P3cONWptp!OU! zMa^G%=E<3Mj6=2$Tp*+V6uiJ-vrDDwb4R56@6X|smR|~Z+P9LBIrj(}^YSrAn*>J<8w6thrzU=F(>c|OCg!1|u?docs?8j_VZqX;AkXI=QD=Q@l z_O*7LwFhzc?ul8<*7{{~+O3qEN2q-|(=p}7UJnx%xkL|MSTi~~-5l8}oNuYMy`qom z50aB+H|#rqpJmk+Vgeb;*W^xH>nnmiMLR7YEAZc&Ysk>%_ov(&H%%s>c}(`x1@|KH zyK~}$i0;+!=hmS69t^#})VsT06F`?L_(fFd-A3IsgULaHf#z3T1M z&|Bkva#?!t9UMZLnVFK)zNRsuIarB*N{sO;5EMTjdP6&PfAVY1slZiMsC2J z$e9-hsp39pL};0j{$b>JMlaDEzCIn=d{x%f*2dB79}&Z#J)+nOvA2${&ZxjwZo4s( zk7M;%49*IAUZCC3G~Aq)oSa)?Iddt^Y}kW@$bpY_q97|fJJRa({i}V5$B$A!i<98+ zm(Xa%`5=3Lf4o>PlCZ`H`15xl8ih|al&6EK0sFMdvke{(Y7!FiK_v^O6pAh1?BrPQ z{J#9*E)md4adnZ!dc42>4DLio=q1o%m}e2pnypjy5X6h$9<8HA!|Uwq^-D==bS~py zXLsD2<+bXNaCPO0I@^0BO8_u1+yz>7obKcz0-g;GUxGiYU6pNteoS8XSy!b>8Tk^Q z@WO%i&)*}RIA1bbWJUwK;iV+yi6HhnsslWGuiLoBFoOB>e%V5Na9#~@BO<`YcerdZ z8GZJH0#;kdQ`^&Wv}X>RJ`VJKW^RC{#ko1w zjRA0oZ>4Sc6*b1WDAGV-;LpI;&%=!XTs}F10h;st-U62ny1w#VxnrI$afSux!|yb-U;5=j(qTZ#qZ$6&xbkB~d-0 z`xDkD_Df&$0<23F>t!dRFuPt^hy$^+d| z64#kJqrH-K+?Ox=>fQ3*R#y4=gpMiNgD+qS5>`|kaol?domue_nVA_ShP|}(G!E7q zYs<#{&E2+3ZM{1l+ut~ub}C|Dr6$<#PMfTUH+}w0l*Ei0&u6=Pb5}{_9>ycynb1TV zy-nbOvPgU8{^f&1LwqPmGM-B)UJ))i6hQ9tYlbCUmF=3APZQmZ8{YPJ_b)ItCEa({ zUtr$x?~cxESy-n2o;=o%Tw^!UHCcb_DF~p?TZ7-$Pw!sn$d0_sV-{;sjk~O> zs;myf<1SKW2!`49(bJnFr`-|$43?ZSyJJ6@#Jy)>>5YAe_@XQ5dl7mT)3xyFjwG~{ zD0C?%QTTkic4x$fk(9UZ7?F#$>YSNd%zXXQcgC$FdwQ;fjPOC?0hiaA2mdpZz4Lxx z_^Ya9gbyAsJtZIh8}9rS32}tQoImG&z(o!_=Y2=${uv1m4gHOGgHE(|`0ad?a0@Jc zskVZO-R;fYWwt_gkMo12cEHh{t#M4eKzVu+kKyz7G~^^hYmgMh0XK4gX;BHto9bkYkFGAbLHNf*fn49(6oj*T)p~^bM4=(E;0}Xuurik-$R7=8I+ri800UQs( zD{9ZcH^-73T6K-ZUCxnRyo3qeW0W)f@Ygl}HIvW7kggqjWj&V~^rY!9{^ybY{H}9u z7_Li0IB*fYGIFAS{VD0s{TGD5@{nZQM3U0MTL$Iimc{=&Ksvqh%5Gd;|SvFC`&QSi-zzpEMnCpMDPS=P0hZ z;WCwe{rj8~5vgZTe7tU1p+V0yraWPAU9v9aN~=O*RvoAPsP=RDw3ToW*yehs!UOxn}= ze{Rn>q)|{C7WyRuIaC67AOHR5V6rBH?@+rndO-nxF>eb8N&IU7(982mOaSk2zYGgU z5P-XJgB^wixACv*2LG5Br`o4L-~i6~*S^o$U-M7*nwWPixJ<7hF);KGKRlev#v0~) zJN|lj_1UmqM*x|OggYKAi_AaQ{oCY2pJN|fy`ZPCnp#)qNMBWhPnv>x;hmt=lDzoH zvXHoAeq0i6?wX+NAkU;me#q1Za&Tg~%Yz`o|2{f8f_R;?@QJ9}qK`_TcM2@e-dvr> zULP+6SrS>@!6G6&vlX_xfQEmra%ED&*4lPtuOh7!j)BC|O)9cFJlwO=SHJlSYkmv(VBN@2qq4dk=xRP^qR_JZkv|9@VOg6D^00*F?W2-#nct^HB(So zd95T}EbR33jQ@Q8Ca>SQyhRXzGj0p_(xs9kDMKv-`7eGwAAuvd@riM+@`!+>f&FOVKWqw$B`7=ErTBt(b|_lPSF-VZK$Ebz0M3$CB9A1>J8+X@-0v$6th)Srlf z0D#yEaHl^Br>#F<>x-Z4sPNL#9tw`h2!!)Q9K~k+(UPCncZ9V)AbQBz4tx3R1d&GjBPY(K$^iKA1*@ z=b;6A{%$Epi;82*W46fEq`#`F3hSdvO!NyufE%<&WfhyusW1wm*_nEVoo0%kSj#D( z^b!Frdq+`*O1{uO1EgcXkCjb{$Mt@vPYp)jUBZJ$A&KsgFcQ(a0H+nM#;o0n^DRzt zIYz7fMr--D39d;S>k%#2!=s}!l3|ao5b7Cchb`SnQDto$)P-i|5+(v>>z=eZ%B<|H zZ*tl#Ev>~&#h}6b?6^}NB%Ur+L;8A~cUE`V>_>+OABjmlmud>o*7A2pJJ%KTA0MBB zlq>qe7L^voaoCezbB>$o=sI9N!V-?qa&vBKsx7E8y?W>7S(gxgc^6}Td69*2)DdqU zLZeh;jE;@vK(d&fQ!q0&+B4aAE$`ME(~$T@^Gu5pLCpE?J?#c>D};Mrkdyu1?Vo#RX6r{A!04c~+}-7E#9M&8Btq<9xb zyt(q8d1fS?pI6b>_VDw?NNoEb@7oNu3<5+A8nU~?_6tT>_J5xaBN`rR!5_A-0X z3kMZ=xZ9jx8-0w$b{@;%2s%7uS-S2oCM4Ppy+>kg?GVS~B(#3L`C&8gZ52L zjf=;sRiXdYZMnIQH-_10E-r5nYXb{?us~aG?Dtr5P#uJV)8ogd>pOP3^CcF&u_bT` z-P&_-Vq&8w7M+U9ABcLOlCWW71OGAnk=Ih&dk1TKG+xJSm$Q7vzC`vfS#S}-L{k+i zYHIrjhr2U1W-DFk4&|fw&aME$6V0O15T$`|lXckktZ#>+&c7M93AVAV&AES<$n8pP z5uKcYA*_jubK-2{JNI(SGgj77=Q}e;`&N6id0Uq!Ic#rK?p9F3=Nw1q)$I_zaX#62 zWv7N-C5 zDrWKFV&vCXEIWpad~fHI$Py>4msc0F=Ze}=&z0iSoZTU?utKn6V(&uk6AsKxxr{#; zsq-jc4$yd!z}GoGjJx)=^!`>T43Va}hC+6!vKOgB6HDIoOFaK@v`M0A-g}H~Z6+i~ ze3f#e1H=2cT*gW5R5SQE*U#w)wI}ws| zXt5B4Y{AAs^)h zJm)|Re`n_nE(Nxg6*r#Eo9oKSdGAyoO__lM^V_MA$x04RX=&B1v}S)akSxC-IrV!z z5>O1(fK=R*2P4S@?YH{Sh=y+~%)f&OJ$Jd~NKVz#U3L8&C3`=}QwJEASED( zbO=aED@aMVAl==Fbax|2cStu#cQ?}A-QC>_*q8sfV?X!a&vWeK{rLJ(CalR~&NZ*= z9KSKfUTWx4&$4XO9pqN&T!^YLM1^f;2JY(S<_Bx4pXkVYrem z|Acb4OvLCj3>YyeHM_lpS#oy~1y9bo_3etviW0jH8Ec^0IA206X@-gJ29EJTa<77G z*iTuCm17EYVM92YEK9rVyJs$Xci)rO%9z05RB4;6I}0gR+fxmxIfNfRJr@k*d^TiH zK_?~B7TxUucV_CFq5UQI-ZQvT_s=X!V?9$*SeTe^-%?gp0b?j5Jq;!LE6kqW!SLwt zR(cM%E3!9lN|5fEFQ%doCD?41hrw`bD488^o9Mf_ zNB`2%UcU9(=E~tr{Z`L%q}$y+s5p*^k5Gw)&C0A<@2td=D)LeHcgBPJw%$b%7MbLH zdVLd@L%(a!%)Z;v7Z3j}HI+x+*4C2PSY2kxbA&t7V7|_hh<($+(z5jYTztFQe6il? zX4A0!C16duIy$YbEO)oRD#*#bTT+4*oaD^Elu+Pwir?JAO0O!$QdQjplU)?TcjD^m z0}ZIg%A^z&bNPxx{*gJsxNOhTpwi+wOaK`1YJG!~)9+xuamsl5MFsVgkVKYxy>`3s z=cEtTVN`;#{TGMtqKB2H+Ha6sG+s-};^Ui-LpV@A!bPk7hzVnuCph-(Z&j{v@E2J#7~e>0UYxtoh05AO+tV z6ZqByIsM;#_+VviD>TMpHvha{&UwPq?%?2{&X(Er_?S4LtI@Sp0bdp_7K%geCEttiB2HP$bs#bw!+qI})=54R9JTrtsyH1%oIr&AyE7=zGPKXA&hlaX32C^2U zjjwaHg~)x`l-ah4>4}PKd>kHm&0YX5M`>38xGJ(5dx3DhM-%*t3WqB3;=8ng;f9{R z0khqg&zK>__@Hka78K~V-=U$QlGfI+_4W3h>|N5lHAv0Lj}BJWFw@{&sjg*+jEVt5 zxVo|t4m)IX0}pauE&YX*ip-zwnW8d-0+=$9PxxXNebeOE(wWGXZyvZo9^qP_jP)NQ zPrn8fZ$Uxf@(06_L^Dp~_LU$!w>?vQQ%o9l2IB`BC5!JBr6M9CT2@XMtFI!Xuerjd zDNUncGBe3c@e2o&8>E!wJD!&`6hIu7e>5~eZ-$B9T;JfU7Z7nf#Y?|j)(Q$9%lx$t z9_k-T>QOBANBYhknT*qXY22XPEU8ZNSE^4>PYKjbv~Qf0ORXwvm5&hCy3*ekOoZ{J zXXqj#A--IsFwi%63%Pl74Dx?U_558RN-{F&T;EfV<`2AQ^g)I^>mPRUR~RJ(Z>WgF z!;T3v+-`Pl_2rpA;)w|p5b$cR7>$vm+7JQwHMMxiiC?%s5DP2=`Td+WH#P~8*cWTY zv6O9WIg&Zt2?^ZpE=_I3#X?uznzywUku0#zu($>Ph#uU--M^5yk3w|(h<-cYtu4%}-l@~I@LvsV( za#FILmTp#1P(M9Tog&t2>Ljc^lk|xypR0PU}HUT-3zGq{wV=%6$GUEp@%! zL0w-;sCaf()`^96etu=B(=7&978b{weVkDZ0ndX z{jxr;udzpu7--xQlM=DGrYugFGSfZqEQF_t14N2nD50;sjgcsoLM?-i=vaomJ+(2C zQVB#W{!3Udbw$r$zl6jmU(QutA3jxB$`=BniE8+LeSP$r&%0J)13*(3h{;%bXnz$Q zo$@vz`bSbkTts+y&#y1TD`15#r(9MI4Gn>~nBA*anJz5$E0r7%_VrQI(K+7i%7ayV zYN`}3FRzBiVgHZjAMx?8(c|Ny#>G#F-iisx35bh7kIknDO^Jw(F16NEhsAh>QR)i8 zeuWbqAJ6WR8Jn9cqMmXWcU6bsRJ%Jw9mVeKDkvi(Bd=Z=t2_io)rl7uVaa#L!xmKKw%tD8ENN@{9B1$C-&*Eh=6?`hr? zhI&MldDY4fl?+qYvN;X}Nr(t^&kS&Ze)c&Qr4;71X&Z&%@JKf}X!!}b^;dc;o<}Zn zdN!8QJ&|2Q*EcsXFwK`pouIdCtGc-??{*{uet$6)LFg^@*H{dq8LqPODYu@!K4me= z{a%Z4C9qnmGM&Lr3G*n6mZxziBuw57ok&b9z)B^#+UQfn-%oM*p|+o(gyB=5T)i?g zhFyW@!1QHjbfcl+BbT!sQ2n4{ilYLo6pEz~1{G|4l9C8q^9yibgMw01kcC>OsmT7A zRC$_TF*!jH`Lv*&+U&ydOw=AdyUTg^z7T4%|RE_th@^Xrdi0KIUCIvV! zk9qkCA<^%XZFl^`WT_Pkcedt1Ow))MzBA2SKUQ| z?{k6^8g{2v2%GrJ8(3J7ahD^JqK^`uehtbX$R&R?Y2R-~=f|9!oD#C3Z@a%KDU6Vj z`Gm-ay<=nqo?-kSIk^-Rb&;I<;}Af&MaF}RYS)3PJySQKjt? zuxpugFpnMVew}ng^sAGtsVL}gZ>I*-SZC+%WFd8@kZ<=rRc3BUO-=4KXi~3btBq|h z%ANRl>9*H-u-x*}T%%*L$&G@Gi?`96{XHi5_@B7UlO)NAYnRNLj%aqEGr6)OO00G@ zE#TUiWZ%cvWDA;4Y*_z=VJ}(D%YWM(7&tUEAS@!EuM6kr_JO|vj!`nvf^n$20$CVXOGK)~)~!xF}ztrwEqcA2RXRz8@B%0Q34 zlfhJI9876cJHAR_2GdmWdYp+40)}D^wz>KGGfLuzGc+AhD$91dg8Jv!CGZnBp7ChIL#X_auCyo%+BCQHG)tR|*|kqlKKr_P_UIYiuU=~8EjB7Mds zzk4;Tm_I_k8W@m!c~Hhh{~)6!1Gdwpe8bQX_F2#caoh=>Rv3`WJ=@(Kyvp5zou zzVOuQouuj~mf3d)p&By)|h-2y&QSYHIs|9_enA*!_LhO$_v)A z)UxiDpth#Ab4=8_oTVk>xIfJW%2$Mwqck1{PhUTE$MfYAp3vE;`nGAM z7hl68BG6yG3Xj%z{RNx_au#-bTkgm3m!y{0f};)?nsSix!S!Q)wC$PlI}qX4R3WDH zV7s??(e^D+ET*6aAU1W+_5>bAKQ#rqYZH^;cbLw0r`aajC|U8BR_*0KZrxdCz9B<9 z^g&C{p8{jHSD(aSu;?Lt(9tPPs(ED5kZZ2rL_K`5S{>oGJ7jxh8BfuC?FBl<3#-d< z*dZa71sy5#R$6>uWjq1Udw0?k;`X1_n&^ zMt=k+EzC|n_j}P1pZZh?)K-3@`Sm%CzoKHo636^Y0UVKtA^&84!wV=+v)O@~;0AmQ z*QYUPgXl8oNya3&!^G9*^Hakn+|&8ZezB@xrLJc3F$k6D{F*tPkTreU?4m=*$>I7Q~cWI$Sa=-H*cYK>M=VerMp9!s{w59~8YZ9qV8 z2)Ett_LtBUR@jw>cE6`ml6H0ykb0l6mt81C?8}FPDtq|T?oxbwE;FMY;QnS{7^bJu z;;bU4pf1;5h_AIaDAKIo1vRsj@Q&y>Sy>aruUk;{f3SqM!CP9{d>Nhqd2bZbl9DOx zhwjr@D9%>|VG$9K`zu)LSo(!ZYgB8j)x3$l{eyz5qq()CBRsTLr{3xlN~xIe?_J@8 zbP~D9&iX;$Wd4+buHj(p7TucK2B*zMQe;W*5Kk?LoRpl6T#sA#h<$hc2s=K=<_s;w z>Oekn9dfo)Oj}!9HuUAGn=ww$yGuQvE(~g3@3jsEVzuv^ z7%zq0&y-DLa#?Rec4S*Y1Gb%|-Ra4UX0r%Si?pSsWoMbw1p5FAF0UsPbqsy2>z%~v zoxmfhFfA>Oi;Lau9TBLXovka}QQf9jYw*Fo$g(kRTxSK~#yaKElOCyE&!Jrx;MGT8>hJ9K*fi0`qZ|<8l&6l`JVDgEp z|8ltx3-Yr9bkkGX3rn@qxm{O-_MTwD89LW~D2t`{dC!H78^ytLs5O+KTHMTej_jPI zb;+`?^F?c(?QuwP?V@yhV6gS@knM@9w-#yn;7$3bHEEYBcs57_%xs0x8RTY3BWx<7 zR8C&e8TsPZtnEgx{_gGpKfm(QWef%c&4q7B<9C6;Ad;}6-*HL)_UPI6mR(3yWR7G! ztLewKz@x=7I!rCBSPbD~v`=TFg^G&fAKZJ?!15l3Gr|60#+uEo1!|eX4Un=IuqnV% zw0r&YTRE1Qdh;tP>kNXRqt(Si^(MQA{u^++ljx9u84LqC1v$NHg~?icFp>c+=&AS2 zYMQTiH6JMuOqeuLVRxtET7DI%=mYaOuoYV9-csXms59#EZg$p$a46dZY6fHg; zKi9iLS>kzoL3#bbHyP9mzkHGuo+&UnmV*su6+4#$T*^2z!yr6>k+S3Zb#Rc@0+Q3w zAn7)gTdT7@ffxEkoW9RlLah1K;kkDk7*24-d(WXYuf@`^pnKlLf6;MAT}ix)7gqwb817$9a=|U?n08plkDsU={3t1sk{q7>ulS1 z5zkuKz2Zh6^}6}SoSA@V>rvt%&N($?1N9!49adm8ra z*|YYD*c5K(L9dQxdeDwU?6qCO#d^0 z_|FtP$cmI^XV8x)9Ce7K>2H+?=+x`1b}MjrTPd_W8=NkjddG1VNxRN>O>2!~QE5Jh zK--BpT+1UN;f>o(Kfw%oiq z-}S|sf!geM54;lo%|u5BRuarl(vBPZW2jQSCSA3Ro-Eo%GJ{FY!|pAwAq}Ji9A+{? z2AfA>G3JX6g@ZFgLqum7n@Qzcd^l@K99LSNi#0SsU@g!1?$AJY%SZWiB?DfGK~ZN7 zs~1d_F3y9c@Y!+ste?)q(W_O!oM9PMU)!H-w{MTEfmvZ~9dbZ`PUBAdj6M&DnuHL~ zRUJ%MFJT!YhXhPLf*E-&MwTOlf!mI5da75C#b5<0K!Ob$(wdZwFc&Q*5z%UZLQSn(|Em-w?wN`=cw zFK}zqs+WAcWJcmZe0B?0sMPTFqO1}WHdL~DHhTUN;6^>>u)17lyVi~T(R1&*C?hme zZ%ovNAGF9?SWxhB-TAtOa4BMRR@DK5`m8{`DR~EPv~G}z4oOVNiCkep3fssELmV@! zF!V{&4Xbqm4%TIYG9*R}puS~T#@=mJt} zo8}7v5q0n%?8NZ^LJ-qV$w1}YZeOLOzx&zk&$bjV9!KRH?xr$8u-}d6J>+0>*aC#b z^D(GJ5_9=WOBUGs?D-agnhd&PN^VEUdKqlru9>s(vZx=xA0T)zU?5uMcAtF@hoVEe zx0IW*`v+P9@q$rV3QKuoIKb+7B&{Q~hld;d{ZC;B$b;PW9#1KOy|9h19elPtp7)GJ zM9exbYEk@&nnHmGp$Zuk?zp7zYZ9t6TcJhCDbwBGw9oICw1IKEebOZO0z`-}%)?qAdo~-Q z1p~fYcGT^yDZ;wJX86Cn*53!Wu)H}oEuK|TQl)-wQDL$Ex84ojx_>(w@(bo+(H6ir zNpJ-JXTGbSDA7?5w~h!{n0aA~-p z{k+S^2fd1}gIoqCD`1R@i;YK=j=<&CbZZCx0i}vgV(_+;=##zWj{W-gC7?daW{V4$ z|7hCTvDJ&B|19lYR5WNP7EE|>aO8g6das&tVdC$do16Qny(AXPNAVed3ElnlFUWZl zp`^Uj)`T>Tn6|eAs?u@EJ+7~($4F~fSy(k8_Nw?NPTdb>b4cF%=&xVx7?}3^w`WyU zY^`Oz%fOC9Jt!EPC5oAG2f9&Lm_QB%cJyatlaCK820Xb9D-t3CU-3)k%1Z`B1SG~7 zI`trJZ5vtHmm5`|g6L>zgL^k-yBYmNMj{83I4Z-?$N~IS28h=xL>~) zvOy(1m?^IZ#ICLp`75+n;o;Fgk33#U03o17eu)z7UMU_Gmv#-Ai|N(xozGBAqCUek zc|DOJahb!BmY2T|h<7VX2Vz#hCq!iS1);Rh-b*RZP)JDHc5%Ok)oErvLuqa!27iff zl0Q1HVPRNnS&@S-)Ss~i1WeH3`Urko@T=L~HNL83F0Xq3D5tLEer{d9x7hcqMZ|nr z%g~I_tW#EvuOKBqNmP-4v!q9^D0u(1jwEF zX`D3N@vQ7@T2QPy*V}0ti%Pb&b?3THH6}YcLN}urmBHti4<=MZDff$ux?Fpce12f! z1x82h^nTUDDf55cB&j&iAL0WHyOdD(3*L?K9o=FGOKT(>Bt9y~WOy%}ER)g=hJc1r zcusd*G{kH|YOynb2HV>o4dJ6)T0AaQ(e`(=#4}S1h3X8@2ltVLF&b~$WPgv3-))1n zP7B3esdT+FActYFTxAu&*Rrv*W49*%)zhQB6=Dj^$KM3``Dxb$mTN3C)YX#shmv*| z8>xfNwgwE|@~-Q2UDC$HV7fGbmcK)lTC1N)g%_>&TrVktyz%I!+vxqAkT2#Nt?xvR zR!VqEo|Kf9E|xnBFEz!m`T%5Gw?snX()IQnh0Rj@b8sag&(+6|^Y!+7b#C{0$as@2 zg`z9V%h+s_bAzqfiYbIIbAq?l*1T1725)5z#NRO-e!QvnCtpw+!Kb4uvW)DS<(N@c zikD1c`*C#SOiRhf2h&9ADNh~yf07}`oxY?YNAB^1omc{l6=q|t_o)SGO{*P%(!rV+Hu92^|y=LrM_zy07>X8TzX zR1mmT?CZDCJvcZqtVPRPcg1v|mwI>Ff!CQsCnzwPmSVe*R^zkneHU8nx5VYVo9^Qi zR|20eK^iFma;yYQb0mB=x3;F(+=EA_daafg7jh(?6>C-pD4!t{?Ct;n2$%r@h}L}n z;oDD_o3aiiHdvTzbyoM;#X(<29VobJz;kzo<|EUwvQNXp5-eRd599_1Mvjd~RZ6hC zYsyf0=eMg>)~|^Ce9|q)2FT& z^Uda{h*fHF1FrC!rdTeCEt_vl*OpDa%gRAE_ zOW;^2j0N9zw^vS%T<>EigoP`Rer6xXG&%>w;G8Zm1tzV=2Q$cQ>|f~{{aC(?e|{^h}6qL6qClc)$+Sr>o2gdLd!smFNkr{?G(Ru z?K!o4nFHvS*6F1I+a<20rR*Wx-{2aQ**oSb24`2h9gvUPWQ~dv1R`d0va<`-t1aiM z2ujVDF1HthOP88#4Z%WOx9jt$zAI8`%h?ZomKwrz9aa(b>7+J;{hPeH=Wj zn|6L)ejt+aUc@a*&;v2^+GOzEFk=@8jLyn2n&*rS5q0zJzwh|V%H6%Sb=d5I8Df$RSC=2HK?2hOkGPKU| z_t9{0n8*8^+p}ro36%1uDJ0WfT<;0FL-=@)!Ydgu9I6C_g7F83x{fB7bSL*=BPl*h zDHtrw1aejghmzc)Vy|y)aoZvq>ll9wh>?@v`n~e-B#LiAovejJ*h%*Ny19F5)dumD zT-AAhrkS}BR~0FZuB#3SJUy-1&ig3Qi@v#GH>RkLN2uSt<&{{%gDTG!q${WR*%FG& zk25XO%iI|^pK1~VY%2t~99MT&O-vWC-j9TndeUn&`FK}EMHLlEXlY5wPXI8&IK{33 zuo3c_VjLU^;H_wb8`V>u#_Rj>-f&?7PRmZW%%U+fHx-+3FfS*!uoF6~LQ-nis>n+z}z@lRs2TW-~A|gO$awEVK+1P5q0E_Xms@D|cUd+v2eg?>F zpmP^CUZy{S|CXd*8~B8ET4nyfzyT_Ng5jcrvL>6yMIz!}dJ_6T;VpSIUG|>4IkmWu zZ0+oXbZ^&qSn8@Fu>pA5g2H8f-!`uml;o9}wIS1-_4Zl={_W)X8(7Qlncf}aei-en zJDQ}O1J|tOr&Sj1u)7veWvqJ>pPZbQnLDjFLp1!K)c^GiIJA)=9iRZz*&N77ONU2C zBkM+zyrJ}YiBIx|DNkgGP&D3lX?+hldO$C|i4Lf^wNh$+Su@nrl+fpQ03cBDr<)5Z#ARgoGV%g9z|Kq*;duC?d zH%yFFJF@!jO!eP$zk}x;bkg5)dPU*h3TRw4IVdFJa*#7LDu72s$gNOhJTQ}yRv5ge z|M+IQrh{mJ4=RM{;APqaTgOwdujNkhcx`+FcgKzC(|8ZLBz=CeEe&I5zPtOg zAXo1^)P!he#@PL3@Bdw-?w`c80-e|$tq(o1JsnN{g1p`Fws^^$!MxUK370X(gnPd_OQFA$^U6y-BW_xJa=RrLobwe(=_O&Ab6C4l)Y3t@QKzonYo;w`)O zMi#|~dj4p#Z;kb3ha()ftdnYu$fy*42~E8ZaFrYZuO{Th`@WM~l$090faDjMu`3KZ zOlDE=NffG8W~W%Yt8Jm?I}-TXYW7JaDWS5dsKhI)#A)~HCJrUC`AI=%yf^YLiyLQU zWs9SsqdUxtH+?Qn6804C{_9)Ag|uTXMg&Y{Hf6bOHocnf-@ki2G1d?Y(gh|@e%}xW zOoB$O2mI`0h?f`m8koet^AnMFIomXi%n@HIaXagk@4I$z48=z{=SH7a5T&9bgC!0+ zuV4bo6>%~lQGR|YET=)g5AbbEyEhfC{YE;cOa&wXdQ2f1KV0)#7wsk18R7fY!GZdr z^yF3<-~t(F2MH)OT9fJH>vC$Gn44IbuU-*fqodoL4nw&^5qqY4Wv_jr)KGp3_vux( z$_E!UsTmJgW=hK5v*Xi}kR2klYdaV~4Ov*hK6{qJiB)&t&fx@VHh$LS=PPefS?x)z zjF!DaMJ?{`ro_X`SFJ7rDQ6^CIbrE-tE=g&pcr9&b6o?aK3(B#nq%xNY0l16tzJ1N zqblGlN9QQ3KB08$4*m^mZ~ItdDSv+T_(N*-t>x$w{}yiY*R-Vi+7o+_nLb$eW@Ycd zz`lwEY4v%iv%1Lgfkuu{^i^&m;+QCOmi@N6K98N~#z=Xf5s?;?b&&1j<3lsgu~Lct z{Pd~d0L>s;LG64BIbZxI{b%R%?U?XnOMn}8g{Dw;_qj`3Iy)x-PiuR7v4MdBNp4V? z@(*PI@wvD_8l5h;b2Ap|?T3WXLbd7Xsn=FEI<4T?NvBzW=3NJ53jrmiH!LZy-dNdK ziHP2p*dKX{%DU+u_IX_lOfCt9jGeu+#iK)3B+gb*<5xzP z5*@cQ=0g1@BR-j+AW;hU@+1J^-pQy3mxvsw1eZ#Eg87Ot><+f7*XYp1q=o0}9mbzZ zuwv!q6iT5nv!W-oizBv_b}2S6T)H3EZ7wMpGx8Cse+{(`R<#$_2dpnGo=VA5P$M8d z*LwJf=(Y<&5~$z4wW+8CF?a;{iI%NL`|lX2*kH9$VyN-vPF_+lPBE~LcIrn)M!aI6 zniLOIuaD2n$!QM`&ygM)9UWsHpRoM?r=YuLu84%RIYhu>#$-hd=I+tV_Srms1sdfK zlZ6~ouR~DmI3BNwFhty-_Nc}KdV9f|A3Wwj=^GX8g*OOdS?i`;|3LMfhvAa_8=FAD zJ*p++$myxob}+1V;0kFYon`|hZ_#vD^e8g8uB7PPA~-5V(<4k+%_OnNO_!U=5h72e*#mx+iKKk#OVJ_-RwGgH@~i@|Dizjz5QVSg|Q+5 zr_*!H?#OOR+Cmg4C^yP{#j{OmY+{KJ6y!P;dHIVsyE{9wUH7PWZQ4goPi15xnjf3A zHcqqZ?GCjM`P3?%k{XjP9$cLv_pTu6b>)wn0R4n@bfyEL68Yp@izccn>dDO?bH-h? zX~(-8L=N3%Vpoaaed_LZ*KO^Cdt5l8211=&w{2+?&L!Wx{~~bS&he+(E;hm4Zw@4R zr(6N!fEP5ha40?=>+k{OTQeb~!GW=Vu<8nwUETMcIWsqQ)F=@K`ewmSSh3()0l zFSrM5%z43b(0{G0CWrrWz{y=M8Pbc1@k+v#|j7()QDpH|8JfNXzsr8_q5}JS??CM&% zI|yC_h7FIoCRaEu&(vBj16MfIORp1<&!U8Fxx4kuU8q>B>rV|4>Hk4PY|fHW|6}*7 z>CZFWrHt>IUEF^Bbm{n)^aYR^;n$@0o-kif`z5|jF64|EP9l&`l7qm^hC{pzHT0{hRs9lSJF8z!I4XEmrA zHD3@m>HEz<4Ah7p2(fW?Lb0~R!+6!6u4^wHs@1(NNG?1`U96aRmT28C8{=x5U?e=P(!~r9B4YQvS6g{>7I0r%%1dXc?t;>LpsG^><;3iTJD#n$u1B{km6s zmYZgOiG<q5Q(m%1$$L}pu&sg8Q>7X_3ue_f4v(x!QlKW*`^icjhH9-6+fTAK=;VSyYwH$M(d2Xj`Q{TP;9PlWdy!wE$h%KUN}J(adlkpZ6$9!R+?q`uCQfHp50I`8|aA{vp{xreR1T z-f0?+b5)+`UPb-wL+57kEJm@2iXsV+PVp=$k&@;ut!&JS4tCV$4bMI1u9XJ0x_p(5 zyX6!^??&H`j*Wt1y4`q?@2pzyaxeng&vGt*xx&CgkRfD}*uld8B|j@Zc#q1OgG4Z)j-1$H&*t(ueINhlOw8(-t?xy+QDJK;Tkinx_bnHhyT9UWZ;oltX8^I8djzBM9J{CB5hOZ8lF`YVsJ^tKxS=Kfxevvf6PngHeL+Cb7UV;mt}m2j4WeVBZx62Ks*RU!<@Z>MW@;P;R}CeT8M&lG zGcfzrN^I{ZZ{BaEaJwcm8W`%E&y|?o{@SUpKH^%oe!}}=TI`dU0=+t?DWn20$G^`( zM<)GWBN&0wyu3ug(u38vP|YT3+svvWCV3-J!arw52QQj=*v` zjMe+If9B}@{#D$bKv%p4A7iN(FRu5$O*gL`mxJE~8B>k|4gBbTUL)6@2vSpjeGsw% z-TzAn%ErIlHjs}nxjBD+!?D=Q)F)l^_a|e^|A^}G)bxK69R1hz$74(mB>hRq&gk@? zKl1l@nx2@a=^roHA}Rix960e4R;T#uG>(_hQz!p%ILP`~LkF)CdN(6A)I?9;>2>(`AnYVX$U8=^nM;0F*;E3j%FO-L3SV4l&EzxD8 z4VBI4uM^r63L=tW8mQhk(9P^nf{d-nd1baFwCB~1g=T*;R6x5a(7!Krd>+Vb-b6=?XgonmXO?SWe z%pnU4)Bk*IB(`{PqT??=2Pe$?@sj!?ZY+zNhPwJKqpNC_4P%CjQNXN_ zle2qOROpbK`4MA^t#KMZ@Pq@+W+k>=bz9O*Q`qAZKvjl&5mg!728;WeyQA0 zIO*|JUrcMI5P_+M)qQdQ8xqhk`v1?;IR9bA&&cP`pQrMWOJL7UWFkdniMgk6m}6pe z?@siE>x9D8!&58LT%6;>2&Qj(&5yJmIvk^68FuwVQuriu(^655bWA&(WnYN<=(Jrk z_Ql?Zlm#znB{I0}?~GB*&#OT{MJ0ZKMuJJhWP@75;&+x?&Ppp9Le@*4`6hLV<4-hFP>*|wbk+3e9whD4&ryJeiJv21R2lzABIbXNj*<<}Z(?#R+>+lGf2=T6QrtwYMWbmX9 z4c8U6*_(-Gv;)yH2CLf=&ys|K@r;a2TQB_|FBp%;3JqD1KO={xc|UV{e(j^U$7o%V zoHi`-y+!e5%g3$hp*q0AQBYSGz5CxJd6M)>PgEbdh2N6AaW#S7MkYuIp-XNCgBVf{ z4n=ccx@%n%&#+3Y5E0p%4%`!@@vtazeo`3&_xLar7)gO(-xvEdX{j|e z*S^Tc!`nS!ukEiMN_g09qyXRXSt0Gf;%|I(P)a&l*z*F)+#t|s} z_%n?l7&xcgzNEmDOIDeGVv(T!Y*+)2mil4X37o{#?FoD6_b>JZ^=KkM1K= zyT$oPK2M|O-dF z+eDnPoK{mF_bEZ7E%in#WTzyh_=F@5BBz!qb0CPCu5V1tmMbuKbdc>$nXA+|?3A`F z6DND`CgM@<#_#e9drN*xWV50yai&-B;Lp!ckg&UKb#;4igEAr-J?AJla{v;F)81{; zaz>Z^y?H1YOH=Jgx-rt+#!LQSG#Wkk4;e)1CznzWoQ^s?I-G4$itVFxO0ub~eW;7| ziS@f`s}0mni+ycbdW4-qE^A}d+uws2P=B&l6%jN?^Bqq7rP|q z6TitmGghQwj-^qqF&rZ5g1!gu+=w5eu8__F;tzIPbQE_?AXi?T5~={{Avs2R%5cm~ zy$vjNcHQ^g6YOmE7Ug-uY`qhFG6j}bbiqgk`JCH8YrJ-_wiJXNP`e!5UlPekMRZ}+ zm+~8zNqJ;2yT&uc6qEf+bbulT!NscnXCFRb(#@-@t0~#B?eQBAQe`>Jcx|Bk-{l5u zZk4v-AO;lF%O4~aIGr;M4ABdiYSLF#O@b{h!AHHgy1IBrqRGaB|H=m(eEx$EAnf}I zwvDvJ%wlq#`*X}71ecjlO|79YLdVMLbhsPO zH8q>NLNla>o%Kwg!(KLvjR|K6p=@of+3y`O8ee+#M3PfdSAQe=58(mJfA7s6KX|^n z6q;JhWIbwJzgoV)rBGmM=)r9K%*2HeRdZP1aCO-CA-#adn}Plc9WR5b%Y5#r_L{g^ z?-RX(2uVinFFti`9m%8}6LFUj*0I^qT+iPibqBbd{+j5RnXRMWTqPBT)@*P= zSnE?PX6DEx9ke=He0mx0rjC+2o;{X{1Rwe&9--RLAF*Wqx!(| zEQWN}6WIwe4DL=RsP!z*EOf75fbzt%H0=^5D&U|Tp)QHxEMa+JqGtbLf4y9HsmQcGT0W{&85!=0XKIyO zkwh$=nlFm37;v>V=G7rOueA#~UF?rN^&5x+9%M(G$MEx%@K_MLC2rY!>jVu%pX-45 zgsYR2oA!XmE{E(760Y=|2XO8U;27u zZOhuG)D5z2B=p(iX$(2pUqnKg8XW88w*KwM_)2kJ%;qP}HBr|S$EuEwHz9OYB^5ke zYaqq>t9AL}%g)emL@(!jfw@ptNh%JAmelWM(>8Imu#Xm+LpS)=*SaDi3RKrXI?HtJ zoMGnGvFFpf*ytG1PoKJ}DPI@S{AK;`tjjCQ!-f4%&VQBU&i@A}foN}WsxyO!4&l!| zmWwJhCILnWa7aIqgyh$s$3*y{V@revZSolJL5LY z__Bi4BB!_S2hL#}YR@s^uvAKQo0N$j&gGvOb3b_q>*+cYATylXrA#8!=j>M^h#4C} zNP3ki;OGcq<@Rl&P`I6*lD>JzmS0hZyApBkrNf2>WvYDgD=|Gc%H+d`%gPmLG5U`N zcfTGD`V;RVH`Ykj<)l!44Z_d8vApguH(e!?xSV%JU%7Ist4X!OgTQwaGc(`(sIszm z_^V%kIsf|7AMHI4htKKM-FsT>%o%paa&vvMzVkkb-Cn^=^==b|7s@j|UFRB@pB6y= z9SD8r1xsN~o)$Dxe(!_1YPvXXtjKpkH44qnN3GiL%qeO9?r5ZIZaUrZr1UwCGLFXLY|bM_G=@;{+2q6#Xa=KjuV>&96&01Y zm5=JUB7#CwQYi(`!&mM#Ock9l4{3s;%B}NxhDzJf!2N8H_W~Ww%C0=r3IG1`v)X&J zl-_?sAY4kI|2G7JJ4llhY!%(y?$CT4&M8S)u8KY76y)Abxar+>4{F>cNNHHxQ`-fx zex(7R_gs}pkfaFDOz+zm?ilz9qI@>v%kN=#Ks-RPD(ShFEd~U+Ppfd&&^NcKqtpz`b%%m*dadB<|AL7k*c+yi&UBmo5g9Rceu`@4Y z3IJOpVbS7nxny=N^8)d_q`Yzy>xELYS@aPU(fIoKQ20;c=G50DB+#Cyn=f|meq|0M zRDVu>=h}WdK&?m%DxM4T@-|lslC0TS*^J=^2Sc>(OLch{7u&ffZT=T=Zyi?E`gi>* zBArswB`Mt*n^6Z~ z?HU+xVT{^8YO<7RgBna~Q(Pj4tN(3t6K`->8R$3;+iI(30|pgGt>TX3qssNrkYG&A zVmIBOQnW(fFd&jOaJ}BEEi5eLPo*xxdceGoKk9CmtJ|rl&_h zpz+~@-03mssA?WfuNawg&KxIfz23b}!DTlkk^T@Den3o?Lzn9#HDH2UwxG&eHx+c! zlP(aNtWr!xN=E4IdczfW_sN`t8-lkdNouV962s`Es~GcS}<`BRzX@$wWuh44|ic zYf=>Av~a)tOLiX9wk4u?D*+%~C@3k7>@e%5{({Hdzk9qoxM{kj zyyMp!iq%6y-9<-dkePE1zVJbDeILkIFxIH@O>qZ9FvB0rdn}2(q~m8F=_vjRG_t)h zFIOnYkVfxBo(+E1n^#_^4J~7Edxg_QvViTbepQg{k3p~-{8l$_V7S`KaR$1i%xtjy zhSu*aB!!5&ZBjvJNKpH|*Y!-{4G&mY@K}+1R-6^&=lkYV;#ht1@R;&OjN$dkk8f8i zf9nUxNc>Y{ia%2H%e{T|rYnRux`&q#!|D{2F#yk=*JC6hD*7^~+Q`!K!NR-4wm#jd z$|4Q*yWqYBKjmm`e6VsAo-g1IaSs8JTd4k(lG^i5NL2IF`K1m{D=Y!+)Tiv++#6Oa zblEfc6-9zyE|3YB;-x;1-Z9t|5kX7{4UaJMNEEUc*;;8UA4*fNwC(F1-7Dl+j6x#JqFeD9aM z-M}~XeDuTYHg8qO<2KR_`Q+5>rjCvYMGlV$43oI;g6=+iER8 zAluR12@78x77_E9n(pHvAMBM{zIDxW)!`I&`wDyaC+>K7n+$BEr^^TMuq?_V>m@z0X2q=fHrEglD5;6!ghJ06|v zS~k)vsL>ejyPVGYxvadWT;gjwx}FjGcD((i@3rof^F@kLp21Yo(>*ioz9|6C`GsCBAbB#mxN_f9!0e91( z9R>Gx9z2o8;|4i}D(;Q&WawkUun-hYK)zoedW?W@7)6T%R;Y*@!<})=R#)RM#DWQg z1b?%8bV%wmJc-4_$FatkJNu84?5MD1w-!{?HwK(l97(0X;`V2dT@kc{IzkowY7 zQ6(kGT?`|)w54LvX*4J!oo_d9mRc;FgFLJ@X5;5#&<_jXm_1-2e=>bfKVIjOQO;W( z0qB86LqO{W-GW7qE4ISx+;+qKF7uC^oRH7EVz{Bv)XaP3z(O!Z%;<~UtDy+;sr>_Z zHWM}AUL)q^omzUVSU&?k(g8wma!Mi?y(_Lyd%^t2f!MqcjJ*@^)az9T7`== z`fN^y)$P65m{+6|*o@mjK~n$Y&8CH!5_u!wMI zLfB)x<$6f^b&PWfT58JmSBZIF@>CTM%7Fvl*3fWmvbm^L3U6TItHJ1*OwH59JnHMg zXuRfxsKXi1TU2_pRj1-XKfS3k;C#GoX3zX$Xh=hd7f9k2mQj@s7rng!wDcFwyv<}y z7V`qTq4R8Y_u*>hI90~jj)zaD$GOMx`DTM35^~w|?0SN`mS@HS`869K&nDb~4$&yC zM45)VT+bz$RT^0uu$N7aCb6p20JWF(LsG$|KP22f+G;TRC?*F^1WZ`gArStqK=GIoCV0>#UA={wUX>*V*%JMjh z{V$^F{zMFY)v6=2vuHe%Jowy3jSX!fNu;srP(+9b2;OA${H|a|7T~JMW;Xo)c?K8Q_u7aynuc%Mx+vsQ1C9iv*+u)wwo;`LD zL8s1XGad-G@*rwP8OvnjebUBQ?V!3nzI0C_H02%s0|J+!h6bn-{9}H1p`Q`dQv=BB z@+%#S*TNo!dCdFd_h(dW*1nx4s| ze};`Qnp*;h~;tIu1TOpB62q5Jw7`XDf7YM z8Z+pb5XK};hkmBZ{t#^4MtUl45(R}Qq@umYLJQs^VZTqZVPkM}KSOV6YomBCovX}@ zU``mg9UdOu+)~5JvJMAr5aCAtnHQLZJyk;sjn<+;xP5DSyHWh9A?zf?Z?+Vp5q@Pc zlZkTY#%L*tW%?=?FIKv8Rw^(PLE?Gf2tp`ONLGNsq0qRMz#6$3d*Mren=i#t5l(Qj3*Ficlp6@F%v}W1$LFYn@tVrT ziy&1&Cv(q}*P|BF#Laf6fQLgxMb#)4*fMTY@7}zmea+i&PUE0${CX zGyBl!PK`x{g#c3OwnO_UXPK<#VROd{{YZ}TP3y2aAW~G=EU?i?J=3aVodOD{OjrK*3x`rQb_1pxP8>h$oV|MH7lw0?f{+n13ggtqbiC1Gz63;cXb zzCWwZ^)@emLuO*MA@+!fob1^TQG^aMUGBGYFII$@SsD+9z?-?x%?e2HZC#zW2bpbs zBv1|Bk>BL@r?5^D5`3Vt0c&%R^7gc5aZwVffBO>zZXG1)w|^WLdMY^6-f@`Tw|{^9 z)aJHCf4cCj0Wo-ygr(4P z)QhLie>uzVM*y$A>wyBK_}WuJ*&%-VUsC)9{r}HW{P%a{wYLDY;Rm3^qi~{L>rd8D zN<0fW>3VYV3B7`&8&j&R>7eMABLM{!2e!-h_BYX2Nik7JElu_4BZHe-uScW$N=k~? zKi5L(0oknbAugjSr7?hdIkdj#O2>msm8Woqg|(nW$;O_gp?m~WEj>6m-bnd~rb)Td zn$g>15G_;ByF{#&~l!#>`?VuPM- zk_M8%v?v9Djuch=Tyqao4vc;wl$=w-io;?rXU-M*Pi6){#QdbBACH8nLAA@i#2hKGmGGEQgg*Qj=mt9BzH zdA^}|V%1kSr^Im?59kkW^g(-HNb9~e8){|mFxAN^WFH%V-o{a9->lpkTTNAFW9|c) zAeaCT7gO6Q$Eb%7*AVeGJG&aY{=+%~r+puU_!$YjIJ|r=Tt=ruS$Z=XKQ$n?^Q!#M z59fk5i9td-=c@w7RhSGB`+)`Wdl6qy<&m8 z<2BCAXb_Pc7I-8`3|!pYahz!Li;MYIt)+8~-VN@%!fk$a0Lorf&gB!&Jyh+e^l+so zrc0q;w5AIrooQ%kLC)o5dkUbTpL45jcw9IG#U7e{F}c*M+4M zdbmEIJ72u#N5s9MH7Nlf!nTuMGBkds^)#WleJ`Q-Nf0Q6@wnrT`u-}r zqrKg#&~n2eds3Q_dVZ{=qpaIg4L~dcOyI}^z#6t|N=`u`k~1tkw7tEp@^`TRdE)