diff --git a/.vscode/settings.json b/.vscode/settings.json index c3d5a6582..2ecb2cbdb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,3 @@ { - "cSpell.words": [ - "ipfs", - "tailwindcss" - ] -} \ No newline at end of file + "cSpell.words": ["ipfs", "repr", "tailwindcss"] +} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 8e6663618..5d8bc7559 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -34,6 +43,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "anyhow" version = "1.0.42" @@ -68,7 +86,7 @@ dependencies = [ "slab", "socket2", "waker-fn", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -115,12 +133,38 @@ dependencies = [ "wildmatch", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.9", +] + [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "backtrace" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide 0.4.4", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.0" @@ -187,6 +231,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "bstr" version = "0.2.16" @@ -267,6 +320,66 @@ dependencies = [ "system-deps", ] +[[package]] +name = "camino" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d74260d9bf6944e2208aa46841b4b8f0d7ffc0849a06837b2f510337f86b2b" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-edit" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "047ae122855956fb253d35948213830c3b21a38b3f69eedec78eba2f3171657a" +dependencies = [ + "atty", + "cargo_metadata", + "crates-index", + "dirs-next", + "dunce", + "env_proxy", + "error-chain", + "git2", + "hex", + "pathdiff", + "regex", + "semver 1.0.4", + "serde", + "serde_derive", + "serde_json", + "structopt", + "subprocess", + "termcolor", + "toml_edit", + "ureq", + "url", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c297bd3135f558552f99a0daa180876984ea2c4ffa7470314540dff8c654109a" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.4", + "serde", + "serde_json", +] + [[package]] name = "cc" version = "1.0.69" @@ -315,7 +428,29 @@ dependencies = [ "num-traits", "serde", "time", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "chunked_transfer" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.1", + "strsim 0.8.0", + "term_size", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] @@ -380,6 +515,16 @@ dependencies = [ "syn 1.0.74", ] +[[package]] +name = "combine" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a909e4d93292cd8e9c42e189f61681eff9d67b6541f96b8a1a737f23737bd001" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -483,6 +628,33 @@ dependencies = [ "objc", ] +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crates-index" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad4af5c8dd9940a497ef4473e6e558b660a4a1b6e5ce2cb9d85454e2aaaf947" +dependencies = [ + "git2", + "glob", + "hex", + "home", + "memchr", + "semver 1.0.4", + "serde", + "serde_derive", + "serde_json", + "smartstring", +] + [[package]] name = "crc32fast" version = "1.2.1" @@ -617,7 +789,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote 1.0.9", - "strsim", + "strsim 0.9.3", "syn 1.0.74", ] @@ -699,7 +871,7 @@ checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" dependencies = [ "libc", "redox_users 0.3.5", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -720,7 +892,7 @@ checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", "redox_users 0.4.0", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -744,6 +916,12 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dunce" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453440c271cf5577fd2a40e4942540cb7d0d2f85e27c8d07dd0023c925a67541" + [[package]] name = "either" version = "1.6.1" @@ -771,6 +949,26 @@ dependencies = [ "syn 1.0.74", ] +[[package]] +name = "env_proxy" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a5019be18538406a43b5419a5501461f0c8b49ea7dfda0cfc32f4e51fc44be1" +dependencies = [ + "log", + "url", +] + +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "backtrace", + "version_check", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -801,7 +999,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall 0.2.10", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1050,7 +1248,7 @@ dependencies = [ "libc", "log", "rustversion", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1085,6 +1283,12 @@ dependencies = [ "wasi 0.10.2+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" + [[package]] name = "gio" version = "0.9.1" @@ -1116,7 +1320,22 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "git2" +version = "0.13.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c1cbbfc9a1996c6af82c2b4caf828d2c653af4fcdbb0e5674cc966eee5a4197" +dependencies = [ + "bitflags 1.3.1", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", ] [[package]] @@ -1164,6 +1383,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "globset" version = "0.4.8" @@ -1288,6 +1513,24 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "home" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2456aef2e6b6a9784192ae780c0f15bc57df0e918585282325e8c8ac27737654" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "html5ever" version = "0.25.1" @@ -1358,6 +1601,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "infer" version = "0.4.0" @@ -1385,6 +1638,29 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "int-enum" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b1428b2b1abe959e6eedb0a17d0ab12f6ba20e1106cc29fc4874e3ba393c177" +dependencies = [ + "cfg-if 0.1.10", + "int-enum-impl", +] + +[[package]] +name = "int-enum-impl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c3cecaad8ca1a5020843500c696de2b9a07b63b624ddeef91f85f9bafb3671" +dependencies = [ + "cfg-if 0.1.10", + "proc-macro-crate 0.1.5", + "proc-macro2", + "quote 1.0.9", + "syn 1.0.74", +] + [[package]] name = "itertools" version = "0.4.19" @@ -1400,6 +1676,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.7" @@ -1469,9 +1754,23 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.99" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765" +checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" + +[[package]] +name = "libgit2-sys" +version = "0.12.23+1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29730a445bae719db3107078b46808cc45a5b7a6bae3f31272923af969453356" +dependencies = [ + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +] [[package]] name = "libsqlite3-sys" @@ -1483,6 +1782,32 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libssh2-sys" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0186af0d8f171ae6b9c4c90ec51898bad5d08a2d5e470903a50d9ad8959cbee" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "lock_api" version = "0.4.4" @@ -1810,12 +2135,27 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55827317fb4c08822499848a14237d2874d6f139828893017237e7ab93eb386" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "open" version = "1.7.1" @@ -1823,7 +2163,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcea7a30d6b81a2423cc59c43554880feff7b57d12916f231a79f8d6d9470201" dependencies = [ "pathdiff", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1866,7 +2206,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1924,7 +2264,7 @@ dependencies = [ "libc", "redox_syscall 0.2.10", "smallvec", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2134,7 +2474,7 @@ dependencies = [ "libc", "log", "wepoll-ffi", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2213,6 +2553,15 @@ dependencies = [ "unicode-xid 0.2.2", ] +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + [[package]] name = "quote" version = "0.3.15" @@ -2425,7 +2774,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2448,7 +2797,22 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.9", ] [[package]] @@ -2463,7 +2827,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2473,6 +2837,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57adcf67c8faaf96f3248c2a7b419a0dbc52ebe36ba83dd57fe83827c1ea4eb3" dependencies = [ "bitflags 1.3.1", + "chrono", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -2481,6 +2846,16 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rusqlite_migration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abaa6d2e015b59342d088590b0c0051ba1ed5508780f8c31315b2986ebbf5b6" +dependencies = [ + "log", + "rusqlite", +] + [[package]] name = "rust-argon2" version = "0.8.3" @@ -2493,6 +2868,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + [[package]] name = "rustc-serialize" version = "0.3.24" @@ -2508,6 +2889,19 @@ dependencies = [ "semver 0.11.0", ] +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring 0.16.20", + "sct", + "webpki", +] + [[package]] name = "rustversion" version = "1.0.5" @@ -2536,7 +2930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ "lazy_static", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2551,18 +2945,32 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring 0.16.20", + "untrusted", +] + [[package]] name = "sd" version = "0.1.0" dependencies = [ + "cargo-edit", "chrono", "crossbeam", "data-encoding", + "int-enum", "rebind", - "ring", + "ring 0.17.0-alpha.10", "rusqlite", + "rusqlite_migration", "serde", "serde_json", + "sha256", "tauri", "tauri-build", ] @@ -2624,6 +3032,9 @@ name = "semver" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" +dependencies = [ + "serde", +] [[package]] name = "semver-parser" @@ -2698,6 +3109,29 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "sha2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +dependencies = [ + "block-buffer", + "cfg-if 1.0.0", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha256" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77f336ed3354742b51d11c47dc0403bf81229548f2e130fcd21ccc471433334a" +dependencies = [ + "hex", + "sha2", +] + [[package]] name = "shader_version" version = "0.2.2" @@ -2711,7 +3145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6be9f7d5565b1483af3e72975e2dee33879b3b86bd48c0929fccf6585d79e65a" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2732,6 +3166,16 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "smartstring" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa6a31c0c2b21327ce875f7e8952322acfcfd0c27569a6e18a647281352c9b" +dependencies = [ + "serde", + "static_assertions", +] + [[package]] name = "socket2" version = "0.4.1" @@ -2739,7 +3183,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "socks" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30f86c7635fadf2814201a4f67efefb0007588ae7422ce299f354ab5c97f61ae" +dependencies = [ + "byteorder", + "libc", + "winapi 0.2.8", + "ws2_32-sys", ] [[package]] @@ -2833,12 +3289,42 @@ dependencies = [ "quote 1.0.9", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +[[package]] +name = "structopt" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf9d950ef167e25e0bdb073cf1d68e9ad2795ac826f2f3f59647817cf23c0bfa" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d838a2c9943ac3125cf6df165eda53493451b719f3255b2a26b85f772d0ba" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote 1.0.9", + "syn 1.0.74", +] + [[package]] name = "strum" version = "0.8.0" @@ -2873,6 +3359,16 @@ dependencies = [ "syn 1.0.74", ] +[[package]] +name = "subprocess" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055cf3ebc2981ad8f0a5a17ef6652f652d87831f79fddcba2ac57bcb9a0aa407" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "subtle" version = "2.4.1" @@ -2960,7 +3456,7 @@ dependencies = [ "serde", "sourceview", "unicode-segmentation", - "winapi", + "winapi 0.3.9", "x11-dl", ] @@ -3077,7 +3573,7 @@ dependencies = [ "tauri-utils", "thiserror", "uuid", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3093,7 +3589,7 @@ dependencies = [ "tauri-runtime", "tauri-utils", "uuid", - "winapi", + "winapi 0.3.9", "wry", ] @@ -3127,7 +3623,7 @@ dependencies = [ "rand 0.8.4", "redox_syscall 0.2.10", "remove_dir_all", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3141,6 +3637,35 @@ dependencies = [ "utf-8", ] +[[package]] +name = "term_size" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "term_size", + "unicode-width", +] + [[package]] name = "thin-slice" version = "0.1.1" @@ -3183,7 +3708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3221,6 +3746,19 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30834716e93eef7db510648299f647427858e7e2c0beeec2699ea2289c7739" +dependencies = [ + "combine", + "indexmap", + "itertools 0.10.1", + "serde", + "vec1", +] + [[package]] name = "typenum" version = "1.13.0" @@ -3254,6 +3792,12 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + [[package]] name = "unicode-xid" version = "0.0.4" @@ -3272,6 +3816,26 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "ureq" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b8b063c2d59218ae09f22b53c42eaad0d53516457905f5235ca4bc9e99daa71" +dependencies = [ + "base64", + "chunked_transfer", + "log", + "once_cell", + "qstring", + "rustls", + "serde", + "serde_json", + "socks", + "url", + "webpki", + "webpki-roots", +] + [[package]] name = "url" version = "2.2.2" @@ -3306,6 +3870,18 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec1" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc1631c774f0f9570797191e01247cbefde789eebfbf128074cb934115a6133" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version-compare" version = "0.0.10" @@ -3337,7 +3913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", - "winapi", + "winapi 0.3.9", "winapi-util", ] @@ -3473,6 +4049,25 @@ dependencies = [ "soup-sys", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring 0.16.20", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + [[package]] name = "webview2" version = "0.1.1" @@ -3483,7 +4078,7 @@ dependencies = [ "once_cell", "webview2-sys", "widestring", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3493,7 +4088,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5288cef1e0cbcf7a0b961e6271e33589b8989c80b2e11078504e989b5346ff" dependencies = [ "com", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3517,6 +4112,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -3527,6 +4128,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -3539,7 +4146,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3563,7 +4170,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e30cba82e22b083dc5a422c2ee77e20dc7927271a0dc981360c57c1453cb48d" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3574,7 +4181,7 @@ checksum = "57790eb281688a4682dab44df2a1ba8b78373233bd71cb291c3e75fecb1a01c4" dependencies = [ "strum 0.8.0", "strum_macros 0.8.0", - "winapi", + "winapi 0.3.9", "winrt", "xml-rs", ] @@ -3605,7 +4212,17 @@ dependencies = [ "webkit2gtk-sys", "webview2", "webview2-sys", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 4de8f10c3..fb7bc578b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -21,9 +21,13 @@ serde_json = "1.0" rebind = "0.2.1" data-encoding = "2.3.2" ring = "0.17.0-alpha.10" -rusqlite = "0.25.3" +rusqlite = { version = "0.25.3", features = ["chrono"] } chrono = { version = "0.4.0", features = ["serde"] } crossbeam = "0.8.1" +cargo-edit = "0.8.0" +sha256 = "1.0.2" +int-enum = "0.4.0" +rusqlite_migration = "0.5.0" [features] default = [ "custom-protocol" ] diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 8d006e679..006011881 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,5 +1,7 @@ +use crate::filesystem::checksum; use crate::filesystem::file; use crate::filesystem::file::File; + use tauri::InvokeError; #[tauri::command(async)] @@ -7,5 +9,17 @@ pub async fn read_file_command(path: &str) -> Result { let file = file::read_file(path) .await .map_err(|error| InvokeError::from(format!("Failed to read file: {}", error)))?; + + file::commit_file(&file).await; + + Ok(file) +} +#[tauri::command(async)] +pub async fn generate_buffer_checksum(path: &str) -> Result { + let mut file = file::read_file(path) + .await + .map_err(|error| InvokeError::from(format!("Failed to read file: {}", error)))?; + + file.buffer_checksum = Some(checksum::create_hash(&file.uri).await.unwrap()); Ok(file) } diff --git a/src-tauri/src/crypto/mod.rs b/src-tauri/src/crypto/mod.rs index 8cec69c26..3703ba59a 100644 --- a/src-tauri/src/crypto/mod.rs +++ b/src-tauri/src/crypto/mod.rs @@ -1,9 +1,22 @@ +use int_enum::IntEnum; use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize)] +#[repr(u8)] +#[derive(Clone, Copy, Debug, Serialize, Deserialize, IntEnum)] pub enum Encryption { - NONE, - AES128, - AES192, - AES256, + NONE = 0, + AES128 = 1, + AES192 = 2, + AES256 = 3, +} + +impl From for Encryption { + fn from(val: i64) -> Self { + match val { + 0 => Encryption::NONE, + 1 => Encryption::AES128, + 2 => Encryption::AES192, + 3 => Encryption::AES256, + } + } } diff --git a/src-tauri/src/db/connection.rs b/src-tauri/src/db/connection.rs new file mode 100644 index 000000000..03c976775 --- /dev/null +++ b/src-tauri/src/db/connection.rs @@ -0,0 +1,10 @@ +use crate::app::config; +use rusqlite; +use tauri::InvokeError; + +pub fn get_connection() -> Result { + let config = config::get_config(); + + rusqlite::Connection::open(config.primary_db) + .map_err(|error| InvokeError::from("database_connection_failure")) +} diff --git a/src-tauri/src/db/init.rs b/src-tauri/src/db/init.rs deleted file mode 100644 index 4366c4230..000000000 --- a/src-tauri/src/db/init.rs +++ /dev/null @@ -1,9 +0,0 @@ -use rusqlite; -// use tauri::api::path; -use crate::app::config; - -pub fn create_connection() -> Result { - let config = config::get_config(); - - rusqlite::Connection::open(config.primary_db) -} diff --git a/src-tauri/src/db/mapper.rs b/src-tauri/src/db/mapper.rs new file mode 100644 index 000000000..d0a412075 --- /dev/null +++ b/src-tauri/src/db/mapper.rs @@ -0,0 +1,15 @@ +pub(crate) trait ToVec { + fn to_vec(self) -> Vec; +} + +pub(crate) type QueryMapper = fn(&rusqlite::Row) -> rusqlite::Result; + +impl ToVec for rusqlite::MappedRows<'_, QueryMapper> { + fn to_vec(self) -> Vec { + let mut list = Vec::new(); + for row in self { + list.push(row.unwrap()); + } + list + } +} diff --git a/src-tauri/src/db/migrate.rs b/src-tauri/src/db/migrate.rs new file mode 100644 index 000000000..f4af7d3aa --- /dev/null +++ b/src-tauri/src/db/migrate.rs @@ -0,0 +1,29 @@ +use rusqlite::Connection; +use rusqlite_migration::{Migrations, M}; + +pub fn run_migrations(mut connection: Connection) { + let migrations = Migrations::new(vec![M::up( + " + CREATE TABLE IF NOT EXISTS files ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + uri STRING NOT NULL, + meta_checksum STRING NOT NULL, + buffer_checksum STRING, + name STRING, + extension STRING, + size_in_bytes INTEGER NOT NULL, + encryption INTEGER DEFAULT 0, + ipfs_id STRING, + user_id STRING, + storage_device_id STRING, + capture_device_id STRING, + parent_file_id STRING + date_created TEXT NOT NULL, + date_modified TEXT NOT NULL, + date_indexed TEXT NOT NULL, + ); +", + )]); + + migrations.to_latest(&mut connection).unwrap(); +} diff --git a/src-tauri/src/db/mod.rs b/src-tauri/src/db/mod.rs index 43763f10a..a5baf7f91 100644 --- a/src-tauri/src/db/mod.rs +++ b/src-tauri/src/db/mod.rs @@ -1 +1,4 @@ -pub mod init; +pub mod connection; +pub mod mapper; +pub mod migrate; +pub mod page; diff --git a/src-tauri/src/db/page.rs b/src-tauri/src/db/page.rs new file mode 100644 index 000000000..c0a518e46 --- /dev/null +++ b/src-tauri/src/db/page.rs @@ -0,0 +1,49 @@ +use serde::{Deserialize, Serialize}; +use std::fmt::{Display, Formatter}; + +#[derive(Serialize, Deserialize, Debug)] +pub(crate) struct PageRequest { + #[serde(default)] + pub(crate) page: i64, + #[serde(default)] + pub(crate) size: i64, + #[serde(default)] + pub(crate) sort_by: String, + #[serde(default)] + pub(crate) direction: SortDirection, +} + +#[derive(Serialize, Deserialize, Debug)] +pub(crate) enum SortDirection { + ASC, + DESC, +} + +impl Default for SortDirection { + fn default() -> Self { + SortDirection::ASC + } +} + +impl Display for SortDirection { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self) + } +} + +#[derive(Serialize, Deserialize, Debug)] +pub(crate) struct PageResponse { + content: Vec, + total_pages: i64, + total_elements: i64, +} + +impl PageResponse { + pub(crate) fn new(content: Vec, total_pages: i64, total_elements: i64) -> Self { + PageResponse { + content, + total_pages, + total_elements, + } + } +} diff --git a/src-tauri/src/filesystem/checksum.rs b/src-tauri/src/filesystem/checksum.rs index ce2250109..ecda57996 100644 --- a/src-tauri/src/filesystem/checksum.rs +++ b/src-tauri/src/filesystem/checksum.rs @@ -1,8 +1,9 @@ -use data_encoding::HEXUPPER; +use data_encoding::HEXLOWER; use ring::digest::{Context, Digest, SHA256}; -use std::fs::File; +use sha256::digest; use std::io; use std::io::{BufReader, Read}; +use std::time::Instant; fn sha256_digest(mut reader: R) -> io::Result { let mut context = Context::new(&SHA256); @@ -18,10 +19,15 @@ fn sha256_digest(mut reader: R) -> io::Result { } pub async fn create_hash(path: &str) -> io::Result { - let input = File::open(path)?; - let reader = BufReader::new(input); - let digest = sha256_digest(reader)?; - let hash = HEXUPPER.encode(digest.as_ref()); - println!("hashing complete {}", hash); - Ok(hash) + let start = Instant::now(); + // read file as buffer and convert to digest + let digest = sha256_digest(BufReader::new(std::fs::File::open(path)?))?; + // create a lowercase hash from + let hex = HEXLOWER.encode(digest.as_ref()); + println!("hashing complete in {:?} {}", start.elapsed(), hex); + Ok(hex) +} + +pub fn create_meta_hash(uri: String, size_in_bytes: u64) -> io::Result { + Ok(digest(format!("{}{}", uri, size_in_bytes.to_string()))) } diff --git a/src-tauri/src/filesystem/file.rs b/src-tauri/src/filesystem/file.rs index a24f69e15..b8fffed6c 100644 --- a/src-tauri/src/filesystem/file.rs +++ b/src-tauri/src/filesystem/file.rs @@ -1,13 +1,16 @@ use crate::crypto; use chrono::prelude::*; -use crossbeam::thread; +use rusqlite::named_params; use serde::{Deserialize, Serialize}; use std::ffi::OsStr; use std::fs; use std::io; use std::path; -use std::time::Instant; +use tauri::InvokeError; + +use crate::db; +// use crate::db::mapper::QueryMapper; use crate::filesystem::checksum; use crate::util::time; @@ -15,7 +18,8 @@ use crate::util::time; pub struct File { // identity pub id: Option, - pub checksum: Option, + pub buffer_checksum: Option, + pub meta_checksum: String, pub uri: String, // metadata pub name: String, @@ -35,58 +39,38 @@ pub struct File { } // Read a file from path returning the File struct -// Generates checksum and extracts metadata +// Generates meta checksum and extracts metadata pub async fn read_file(path: &str) -> io::Result { - // let start = Instant::now(); let path_buff = path::PathBuf::from(path); - // extract metadata - let metadata = match fs::metadata(&path) { - Ok(metadata) => metadata, - Err(e) => return Err(e), - }; + let metadata = fs::metadata(&path)?; - // if metadata.is_dir() { - // return Err(); - // } + if metadata.is_dir() { + // return Err(); + } - // let checksum = thread::scope(|s| { - // let res = s.spawn(move |_| checksum::create_hash(path).unwrap()); - // res.join() - // }) - // .unwrap() - // .unwrap(); + let size = metadata.len(); + let meta_checksum = checksum::create_meta_hash(path.to_owned(), size)?; - // let checksum = match checksum { - // Ok(metadata) => metadata, // Err(e) => return Err(e.into()), - // }; - - // generate checksum - // let checksum = match checksum::create_hash(path) { - // Ok(checksum) => checksum, - // Err(e) => return Err(e), - // }; // assemble File struct with initial values let file = File { name: extract_name(path_buff.file_name()), extension: extract_name(path_buff.extension()), uri: path.to_owned(), - size_in_bytes: metadata.len(), + size_in_bytes: size, date_created: time::system_time_to_date_time(metadata.created()).unwrap_or(Utc::now()), date_modified: time::system_time_to_date_time(metadata.created()).unwrap_or(Utc::now()), date_indexed: Utc::now(), encryption: crypto::Encryption::NONE, // this will be populated later, either by the database or other functions id: None, - checksum: None, + meta_checksum, + buffer_checksum: None, ipfs_id: None, user_id: None, storage_device_id: None, capture_device_id: None, parent_file_id: None, }; - - checksum::create_hash(path).await; - Ok(file) } @@ -98,3 +82,50 @@ fn extract_name(os_string: Option<&OsStr>) -> String { .unwrap_or_default() .to_owned() } + +pub async fn commit_file(file: &File) -> Result<(), InvokeError> { + let connection = db::connection::get_connection()?; + + connection.execute(" + INSERT INTO files (uri, meta_checksum, buffer_checksum, name, extension, size_in_bytes, encryption, ipfs_id, user_id, storage_device_id, capture_device_id, parent_file_id, date_created, date_modified, date_indexed) VALUES (:uri, :meta_checksum, :buffer_checksum, :name, :extension, :size_in_bytes, :encryption, :ipfs_id, :user_id, :storage_device_id, :capture_device_id, :parent_file_id, :date_created, :date_modified, :date_indexed) + ", named_params! { + ":uri": &file.uri, + ":meta_checksum": &file.meta_checksum, + ":buffer_checksum": &file.buffer_checksum, + ":name": &file.name, + ":extension": &file.extension, + ":size_in_bytes": &file.size_in_bytes, + ":encryption": crypto::Encryption::NONE, + ":ipfs_id": &file.ipfs_id, + ":user_id": &file.user_id, + ":storage_device_id": &file.storage_device_id, + ":capture_device_id": &file.capture_device_id, + ":parent_file_id": &file.parent_file_id, + ":date_created": &file.date_created, + ":date_modified": &file.date_modified, + ":date_indexed": &file.date_indexed +}); + + Ok(()) +} + +// const FILE_MAPPER: QueryMapper = |row| { +// Ok(File { +// id: row.get(0)?, +// buffer_checksum: row.get(1)?, +// meta_checksum: row.get(2)?, +// uri: row.get(3)?, +// name: row.get(4)?, +// extension: row.get(5)?, +// size_in_bytes: row.get(6)?, +// encryption: crypto::Encryption::from(row.get(7)?), +// ipfs_id: row.get(8)?, +// user_id: row.get(9)?, +// storage_device_id: row.get(10)?, +// capture_device_id: row.get(11)?, +// parent_file_id: row.get(12)?, +// date_created: chrono::DateTime::parse_from_str(row.get(13).unwrap(), "utc")?, +// date_modified: row.get(14)?, +// date_indexed: row.get(15)?, +// }) +// }; diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 864e82082..c8a866ec1 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -12,12 +12,16 @@ mod util; use crate::app::menu; fn main() { - let connection = db::init::create_connection(); + let connection = db::connection::get_connection().unwrap(); + db::migrate::run_migrations(connection); - println!("primary database connected {:?}", connection); + println!("primary database connected"); tauri::Builder::default() - .invoke_handler(tauri::generate_handler![commands::read_file_command]) + .invoke_handler(tauri::generate_handler![ + commands::read_file_command, + commands::generate_buffer_checksum + ]) .menu(menu::get_menu()) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src/App.tsx b/src/App.tsx index 92df53ff2..248224a8b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -38,11 +38,21 @@ export default function App() { return ( -
+
- setFileInputVal(e.target.value)} /> - + setFileInputVal(e.target.value)} + /> + -