[package] name = "nigig-core" version = "0.1.0" edition = "2021" [features] default = ["native"] native = ["dep:tokio", "dep:reqwest", "dep:lettre", "matrix_client/native", "async-rt"] async-rt = [] # PDF trip-expense report (finance_report) — off by default so `nigig-traffic` # and other non-email apps do not pull the 74K LOC pdf-graphics stack. pdf = ["dep:nigig-pdf-graphics", "dep:nigig-pdf-cos"] # C1e: the direct backend's IMAP protocol client (async-imap over native # TLS). Native only -- a browser cannot open a raw TCP socket -- and off by # default so builds that do not need IMAP never compile its dependency tree. imap = ["dep:async-imap", "dep:async-native-tls", "dep:async-net"] # C1f: a real keystore-backed CredentialStore (the `keyring` crate: Linux # Secret Service, Windows Credential Manager, macOS Keychain). Native only, # off by default so wasm and keystore-free builds never pull its dependency # tree. Without it, active_store() is the fail-closed UnavailableCredentialStore. keystore = ["dep:keyring"] [dependencies] matrix_client = { path = "../matrix_client", default-features = false } nigig-system-prefs = { path = "../nigig-system-prefs" } makepad-widgets = { workspace = true } serde = { version = "1", features = ["derive"] } serde_json = "1" chrono = { version = "0.4", features = ["serde"] } robius-directories = { git = "https://github.com/project-robius/robius", rev = "b766e62b0600f5d2ee21cc6995648346fc277bd8" } robius-ussd = { path = "../robius-ussd", features = ["serde"] } cfg-if = "1.0" futures = { version = "0.3", default-features = false, features = ["alloc"] } error_set = "0.9.1" url = "2.5.0" clap = { version = "4.0.16", features = ["derive"] } robius-open = { git = "https://github.com/project-robius/robius", rev = "b766e62b0600f5d2ee21cc6995648346fc277bd8" } postcard = { version = "1.1.3", features = ["use-std"] } rand = "0.8.5" csv = "1.3" image = { version = "0.25", default-features = false, features = ["png"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] tokio = { version = "1", features = ["rt", "macros", "sync", "fs", "io-util"], optional = true } reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "stream"], optional = true } robius-location = { git = "https://github.com/project-robius/robius", rev = "b766e62b0600f5d2ee21cc6995648346fc277bd8" } lettre = { version = "0.11", default-features = false, features = [ "tokio1", "tokio1-rustls", "smtp-transport", "pool", "hostname", "builder", "ring", "webpki-roots", ], optional = true } # C1e: the IMAP protocol client (feature `imap`), native only. async-imap = { version = "0.9", optional = true } async-native-tls = { version = "0.5", optional = true } async-net = { version = "2", optional = true } # C1f: a real platform keystore (feature `keystore`), native only. keyring = { version = "4", optional = true } # Trip-expense reports (finance_report) render receipts to PDF with the # nigig PDF stack. Native only + `pdf` feature: a browser cannot # meaningfully write the file the finance department consumes, and # `nigig-traffic` must not pull the stack at all (see `road.rs` 3D view). nigig-pdf-graphics = { path = "../apps/pdf/pdf-graphics", optional = true } nigig-pdf-cos = { path = "../apps/pdf/pdf-cos", optional = true } [dev-dependencies] # E2: property-test the address/date parsers — never panic on arbitrary # input. Same dev-dependency the SMS crate already uses. proptest = "1" # §8 follow-up: execute the TLS handshake against a local server (the # assessment's "TLS handshake never executed" gap). rcgen mints a # self-signed certificate; tokio-rustls/rustls serve it so the production # transport's certificate validation (accept_invalid_certs: false) is # observed, not just read from lettre's source. rcgen = "0.13" tokio-rustls = "0.26" # rustls directly, so the test can build the SERVER side of the handshake # (tokio-rustls only re-exports it through a dep). `ring` matches the # provider lettre selects, so `with_single_cert` can sign an ECDSA key. rustls = { version = "0.23", default-features = false, features = ["ring", "logging", "std", "tls12"] } tokio = { version = "1", features = ["rt", "macros", "net", "time", "io-util", "sync"] } # Parse generated trip reports back in tests (finance_report tests assert # page counts and content, not bytes). nigig-pdf-document = { path = "../apps/pdf/pdf-document" } [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" js-sys = "0.3" getrandom = { version = "0.2", features = ["js"] } web-sys = { version = "0.3", features = [ "Window", "console", "Request", "RequestInit", "Response", "Headers", ] }