diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1dd..7ddfc9e 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,5 +1,11 @@ + + + + + + diff --git a/.idea/wg.iml b/.idea/wg.iml index 6482234..525c890 100644 --- a/.idea/wg.iml +++ b/.idea/wg.iml @@ -6,6 +6,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index 4247334..671c2a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes", "futures-core", "futures-sink", @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "actix-cors" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b340e9cfa5b08690aae90fb61beb44e9b06f44fe3d0f93781aaa58cfba86245e" +checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370" dependencies = [ "actix-utils", "actix-web", @@ -45,7 +45,7 @@ dependencies = [ "actix-utils", "actix-web", "askama_escape", - "bitflags", + "bitflags 1.3.2", "bytes", "derive_more", "futures-core", @@ -59,17 +59,17 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.3.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" +checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash 0.8.3", + "ahash 0.8.9", "base64 0.21.0", - "bitflags", + "bitflags 2.4.2", "brotli", "bytes", "bytestring", @@ -160,7 +160,7 @@ dependencies = [ "futures-util", "mio", "num_cpus", - "socket2", + "socket2 0.4.9", "tokio", "tracing", ] @@ -188,9 +188,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.3.1" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" +checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" dependencies = [ "actix-codec", "actix-http", @@ -201,7 +201,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash 0.7.6", + "ahash 0.8.9", "bytes", "bytestring", "cfg-if", @@ -210,7 +210,6 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "http", "itoa 1.0.6", "language-tags", "log", @@ -222,8 +221,8 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2", - "time 0.3.20", + "socket2 0.5.6", + "time 0.3.34", "url", ] @@ -239,6 +238,55 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "actix-web-lab" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7675c1a84eec1b179c844cdea8488e3e409d8e4984026e92fa96c87dd86f33c6" +dependencies = [ + "actix-http", + "actix-router", + "actix-service", + "actix-utils", + "actix-web", + "actix-web-lab-derive", + "ahash 0.8.9", + "arc-swap", + "async-trait", + "bytes", + "bytestring", + "csv", + "derive_more", + "futures-core", + "futures-util", + "http", + "impl-more", + "itertools 0.12.1", + "local-channel", + "mediatype", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_html_form", + "serde_json", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "actix-web-lab-derive" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa0b287c8de4a76b691f29dbb5451e8dd5b79d777eaf87350c9b0cbfdb5e968" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.51", +] + [[package]] name = "adler" version = "1.0.2" @@ -258,14 +306,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "getrandom 0.2.9", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -307,6 +356,12 @@ version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "array-macro" version = "2.1.5" @@ -319,6 +374,12 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "askama_escape" version = "0.10.3" @@ -359,7 +420,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -375,7 +436,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" dependencies = [ "atk-sys", - "bitflags", + "bitflags 1.3.2", "glib", "libc", ] @@ -394,9 +455,9 @@ dependencies = [ [[package]] name = "atoi" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" dependencies = [ "num-traits", ] @@ -407,6 +468,16 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +[[package]] +name = "atomic-write-file" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" +dependencies = [ + "nix", + "rand 0.8.5", +] + [[package]] name = "atty" version = "0.2.14" @@ -442,12 +513,32 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bigdecimal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +dependencies = [ + "serde", +] + [[package]] name = "block" version = "0.1.6" @@ -544,6 +635,23 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bson" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0aa578035b938855a710ba58d43cfb4d435f3619f99236fb35922a574d6cb1" +dependencies = [ + "base64 0.13.1", + "chrono", + "hex", + "lazy_static", + "linked-hash-map", + "rand 0.7.3", + "serde", + "serde_json", + "uuid 0.8.2", +] + [[package]] name = "bstr" version = "1.4.0" @@ -624,7 +732,7 @@ version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cairo-sys-rs", "glib", "libc", @@ -665,7 +773,7 @@ checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" dependencies = [ "byteorder", "fnv", - "uuid", + "uuid 1.3.1", ] [[package]] @@ -715,7 +823,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "cocoa-foundation", "core-foundation", @@ -731,7 +839,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", @@ -767,6 +875,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "combine" version = "4.6.6" @@ -785,7 +906,7 @@ dependencies = [ "rust_decimal_macros", "serde", "sqlx", - "time 0.3.20", + "time 0.3.34", ] [[package]] @@ -818,6 +939,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "convert_case" version = "0.4.0" @@ -831,7 +958,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.3.20", + "time 0.3.34", "version_check", ] @@ -857,7 +984,7 @@ version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-graphics-types", "foreign-types", @@ -870,7 +997,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "foreign-types", "libc", @@ -975,6 +1102,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "cxx" version = "1.0.94" @@ -999,7 +1147,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -1016,7 +1164,7 @@ checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -1054,6 +1202,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1067,6 +1236,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_utils" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532b4c15dccee12c7044f1fcad956e98410860b22231e44a3b827464797ca7bf" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.6" @@ -1074,6 +1254,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -1102,7 +1283,7 @@ dependencies = [ "bumpslab", "futures-channel", "futures-util", - "indexmap", + "indexmap 1.9.3", "log", "longest-increasing-subsequence", "rustc-hash", @@ -1382,12 +1563,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", - "humantime", + "humantime 1.3.0", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime 2.1.0", + "is-terminal", "log", "regex", "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.1" @@ -1409,6 +1609,17 @@ dependencies = [ "libc", ] +[[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 = "euclid" version = "0.22.9" @@ -1512,6 +1723,17 @@ dependencies = [ "miniz_oxide 0.6.2", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1561,6 +1783,20 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.28" @@ -1577,6 +1813,17 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +[[package]] +name = "futures-enum" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3422d14de7903a52e9dbc10ae05a7e14445ec61890100e098754e120b2bd7b1e" +dependencies = [ + "derive_utils", + "quote", + "syn 1.0.109", +] + [[package]] name = "futures-executor" version = "0.3.28" @@ -1590,13 +1837,13 @@ dependencies = [ [[package]] name = "futures-intrusive" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.11.2", + "parking_lot", ] [[package]] @@ -1628,7 +1875,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -1650,9 +1897,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -1673,7 +1922,7 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -1689,7 +1938,7 @@ version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", @@ -1777,7 +2026,7 @@ version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", @@ -1807,7 +2056,7 @@ version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "futures-channel", "futures-core", "futures-executor", @@ -1882,6 +2131,16 @@ dependencies = [ "system-deps 6.0.5", ] +[[package]] +name = "graphql-parser" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1abd4ce5247dfc04a03ccde70f87a048458c9356c7e41d21ad8c407b3dde6f2" +dependencies = [ + "combine 3.8.1", + "thiserror", +] + [[package]] name = "gtk" version = "0.15.5" @@ -1889,7 +2148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" dependencies = [ "atk", - "bitflags", + "bitflags 1.3.2", "cairo-rs", "field-offset", "futures-channel", @@ -1939,9 +2198,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.17" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1949,7 +2208,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1971,9 +2230,15 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.9", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "hashlink" version = "0.8.1" @@ -2049,6 +2314,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "html5ever" version = "0.25.2" @@ -2112,6 +2386,12 @@ dependencies = [ "quick-error", ] +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "0.14.26" @@ -2129,7 +2409,7 @@ dependencies = [ "httpdate", "itoa 1.0.6", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -2219,6 +2499,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "impl-more" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" + [[package]] name = "indexmap" version = "1.9.3" @@ -2230,6 +2516,16 @@ dependencies = [ "serde", ] +[[package]] +name = "indexmap" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "infer" version = "0.11.0" @@ -2245,7 +2541,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" dependencies = [ - "bitflags", + "bitflags 1.3.2", "inotify-sys", "libc", ] @@ -2275,7 +2571,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a798d7677f07d6f1e77be484ea8626ddb1566194de399f1206306820c406371" dependencies = [ "hashbrown 0.12.3", - "parking_lot 0.12.1", + "parking_lot", ] [[package]] @@ -2321,6 +2617,17 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2330,6 +2637,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -2348,7 +2664,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "glib", "javascriptcore-rs-sys", ] @@ -2372,7 +2688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" dependencies = [ "cesu8", - "combine", + "combine 4.6.6", "jni-sys", "log", "thiserror", @@ -2387,7 +2703,7 @@ checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", "cfg-if", - "combine", + "combine 4.6.6", "jni-sys", "log", "thiserror", @@ -2427,19 +2743,53 @@ checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ "base64 0.21.0", "pem", - "ring", + "ring 0.16.20", "serde", "serde_json", "simple_asn1", ] +[[package]] +name = "juniper" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875dca5a0c08b1521e1bb0ed940e9955a9f38971008aaa2a9f64a2ac6b59e1b5" +dependencies = [ + "async-trait", + "bson", + "chrono", + "fnv", + "futures", + "futures-enum", + "graphql-parser", + "indexmap 1.9.3", + "juniper_codegen", + "serde", + "smartstring", + "static_assertions", + "url", + "uuid 0.8.2", +] + +[[package]] +name = "juniper_codegen" +version = "0.15.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aee97671061ad50301ba077d054d295e01d31a1868fbd07902db651f987e71db" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "keyboard-types" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" dependencies = [ - "bitflags", + "bitflags 1.3.2", "serde", "unicode-segmentation", ] @@ -2460,7 +2810,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587" dependencies = [ - "bitflags", + "bitflags 1.3.2", "libc", ] @@ -2487,22 +2837,48 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" -version = "0.2.141" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] -name = "link-cplusplus" -version = "1.0.8" +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" dependencies = [ "cc", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.3.1" @@ -2516,7 +2892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0500463acd96259d219abb05dc57e5a076ef04b2db9a2112846929b5f174c96" dependencies = [ "libc", - "uuid", + "uuid 1.3.1", "winapi", ] @@ -2550,12 +2926,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "longest-increasing-subsequence" @@ -2616,6 +2989,12 @@ dependencies = [ "digest", ] +[[package]] +name = "mediatype" +version = "0.19.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8878cd8d1b3c8c8ae4b2ba0a36652b7cf192f618a599a7fbdfa25cffd4ea72dd" + [[package]] name = "memchr" version = "2.5.0" @@ -2708,7 +3087,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" dependencies = [ - "bitflags", + "bitflags 1.3.2", "jni-sys", "ndk-sys", "num_enum", @@ -2736,6 +3115,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.2", + "cfg-if", + "libc", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -2758,7 +3148,7 @@ version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58ea850aa68a06e48fdb069c0ec44d0d64c8dbffa49bf3b6f7f0a901fdea1ba9" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crossbeam-channel", "filetime", "fsevent-sys", @@ -2790,6 +3180,29 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.45" @@ -2800,6 +3213,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-rational" version = "0.4.1" @@ -2818,6 +3242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2890,9 +3315,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" @@ -2900,7 +3325,7 @@ version = "0.10.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -2917,7 +3342,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -2953,7 +3378,7 @@ version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" dependencies = [ - "bitflags", + "bitflags 1.3.2", "glib", "libc", "once_cell", @@ -2978,17 +3403,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -2996,21 +3410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.7", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -3064,6 +3464,15 @@ dependencies = [ "base64 0.13.1", ] +[[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.2.0" @@ -3155,6 +3564,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[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.26" @@ -3167,13 +3597,19 @@ version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", "miniz_oxide 0.7.1", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3192,7 +3628,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" dependencies = [ - "env_logger", + "env_logger 0.7.1", "log", ] @@ -3247,9 +3683,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -3282,9 +3718,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -3382,7 +3818,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -3391,7 +3827,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -3477,12 +3913,26 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e" +dependencies = [ + "cc", + "getrandom 0.2.9", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + [[package]] name = "rkyv" version = "0.7.41" @@ -3508,6 +3958,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust-embed" version = "6.6.1" @@ -3591,7 +4061,7 @@ version = "0.37.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", @@ -3601,14 +4071,13 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ - "log", - "ring", + "ring 0.17.3", + "rustls-webpki", "sct", - "webpki", ] [[package]] @@ -3620,6 +4089,16 @@ dependencies = [ "base64 0.21.0", ] +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.3", + "untrusted 0.9.0", +] + [[package]] name = "ryu" version = "1.0.13" @@ -3662,8 +4141,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -3678,7 +4157,7 @@ version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -3701,7 +4180,7 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cssparser", "derive_more", "fxhash", @@ -3723,9 +4202,9 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -3753,13 +4232,26 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", +] + +[[package]] +name = "serde_html_form" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20e1066e1cfa6692a722cf40386a2caec36da5ddc4a2c16df592f0f609677e8c" +dependencies = [ + "form_urlencoded", + "indexmap 2.2.3", + "itoa 1.0.6", + "ryu", + "serde", ] [[package]] @@ -3768,6 +4260,7 @@ version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ + "indexmap 1.9.3", "itoa 1.0.6", "ryu", "serde", @@ -3781,7 +4274,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -3814,11 +4307,11 @@ dependencies = [ "base64 0.13.1", "chrono", "hex", - "indexmap", + "indexmap 1.9.3", "serde", "serde_json", "serde_with_macros", - "time 0.3.20", + "time 0.3.34", ] [[package]] @@ -3874,6 +4367,16 @@ dependencies = [ "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 = "simd-adler32" version = "0.3.5" @@ -3895,7 +4398,7 @@ dependencies = [ "num-bigint", "num-traits", "thiserror", - "time 0.3.20", + "time 0.3.34", ] [[package]] @@ -3907,7 +4410,7 @@ dependencies = [ "atty", "colored", "log", - "time 0.3.20", + "time 0.3.34", "windows-sys 0.42.0", ] @@ -3969,6 +4472,17 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "static_assertions", + "version_check", +] + [[package]] name = "socket2" version = "0.4.9" @@ -3979,13 +4493,23 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "soup2" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" dependencies = [ - "bitflags", + "bitflags 1.3.2", "gio", "glib", "libc", @@ -3999,7 +4523,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" dependencies = [ - "bitflags", + "bitflags 1.3.2", "gio-sys", "glib-sys", "gobject-sys", @@ -4013,6 +4537,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spinning" version = "0.1.0" @@ -4022,89 +4555,105 @@ 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 = "sqlformat" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ - "itertools", + "itertools 0.10.5", "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", ] [[package]] name = "sqlx-core" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ - "ahash 0.7.6", + "ahash 0.8.9", "atoi", - "base64 0.13.1", - "bitflags", + "bigdecimal", "byteorder", "bytes", "crc", "crossbeam-queue", - "dirs", "dotenvy", "either", "event-listener", "futures-channel", "futures-core", "futures-intrusive", + "futures-io", "futures-util", "hashlink", "hex", - "hkdf", - "hmac", - "indexmap", - "itoa 1.0.6", - "libc", + "indexmap 2.2.3", "log", - "md-5", "memchr", - "num-bigint", "once_cell", "paste", "percent-encoding", - "rand 0.8.5", - "rust_decimal", "rustls", "rustls-pemfile", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlformat", - "sqlx-rt", - "stringprep", "thiserror", - "time 0.3.20", + "time 0.3.34", + "tokio", "tokio-stream", + "tracing", "url", "webpki-roots", - "whoami", ] [[package]] name = "sqlx-macros" -version = "0.6.3" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" dependencies = [ + "atomic-write-file", "dotenvy", "either", "heck 0.4.1", @@ -4116,20 +4665,123 @@ dependencies = [ "serde_json", "sha2", "sqlx-core", - "sqlx-rt", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", "syn 1.0.109", + "tempfile", + "tokio", "url", ] [[package]] -name = "sqlx-rt" -version = "0.6.3" +name = "sqlx-mysql" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ + "atoi", + "base64 0.21.0", + "bigdecimal", + "bitflags 2.4.2", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa 1.0.6", + "log", + "md-5", + "memchr", "once_cell", - "tokio", - "tokio-rustls", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "time 0.3.34", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +dependencies = [ + "atoi", + "base64 0.21.0", + "bigdecimal", + "bitflags 2.4.2", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa 1.0.6", + "log", + "md-5", + "memchr", + "num-bigint", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "time 0.3.34", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "time 0.3.34", + "tracing", + "url", + "urlencoding", ] [[package]] @@ -4138,6 +4790,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.8.7" @@ -4146,7 +4804,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -4199,9 +4857,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" dependencies = [ "proc-macro2", "quote", @@ -4240,7 +4898,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cairo-rs", "cc", "cocoa", @@ -4267,14 +4925,14 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "paste", "png", "raw-window-handle", "scopeguard", "serde", "unicode-segmentation", - "uuid", + "uuid 1.3.1", "windows 0.39.0", "windows-implement", "x11-dl", @@ -4342,7 +5000,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -4368,13 +5026,16 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ + "deranged", "itoa 1.0.6", "libc", + "num-conv", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -4382,16 +5043,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -4427,10 +5089,10 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.4.9", "tokio-macros", "windows-sys 0.45.0", ] @@ -4443,7 +5105,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.51", ] [[package]] @@ -4456,17 +5118,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls", - "tokio", - "webpki", -] - [[package]] name = "tokio-stream" version = "0.1.12" @@ -4528,7 +5179,7 @@ version = "0.19.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" dependencies = [ - "indexmap", + "indexmap 1.9.3", "serde", "serde_spanned", "toml_datetime", @@ -4550,9 +5201,21 @@ dependencies = [ "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.51", +] + [[package]] name = "tracing-core" version = "0.1.30" @@ -4638,12 +5301,27 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "untrusted" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.3.1" @@ -4655,12 +5333,24 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + [[package]] name = "uuid" version = "1.3.1" @@ -4700,6 +5390,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "waker-fn" version = "1.1.0" @@ -4843,7 +5539,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cairo-rs", "gdk", "gdk-sys", @@ -4868,7 +5564,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" dependencies = [ "atk-sys", - "bitflags", + "bitflags 1.3.2", "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", @@ -4884,24 +5580,11 @@ dependencies = [ "system-deps 6.0.5", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webview2-com" @@ -4949,14 +5632,17 @@ dependencies = [ "actix-files", "actix-multipart", "actix-web", + "actix-web-lab", "array-macro", "async-trait", "async_once", "base64 0.13.1", "common", "dotenvy", + "env_logger 0.10.2", "futures-util", "jsonwebtoken", + "juniper", "lazy_static", "listenfd", "log", @@ -4971,7 +5657,7 @@ dependencies = [ "serde_with", "sqlx", "thiserror", - "time 0.3.20", + "time 0.3.34", "tokio", ] @@ -4994,7 +5680,7 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_json", - "time 0.3.20", + "time 0.3.34", ] [[package]] @@ -5002,10 +5688,6 @@ name = "whoami" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c70234412ca409cc04e864e89523cb0fc37f5e1344ebed5a3ebf4192b6b9f68" -dependencies = [ - "wasm-bindgen", - "web-sys", -] [[package]] name = "winapi" @@ -5120,6 +5802,15 @@ dependencies = [ "windows-targets 0.48.0", ] +[[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.3", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -5150,6 +5841,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", +] + [[package]] name = "windows-tokens" version = "0.39.0" @@ -5168,6 +5874,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + [[package]] name = "windows_aarch64_msvc" version = "0.39.0" @@ -5186,6 +5898,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + [[package]] name = "windows_i686_gnu" version = "0.39.0" @@ -5204,6 +5922,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + [[package]] name = "windows_i686_msvc" version = "0.39.0" @@ -5222,6 +5946,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + [[package]] name = "windows_x86_64_gnu" version = "0.39.0" @@ -5240,6 +5970,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5252,6 +5988,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + [[package]] name = "windows_x86_64_msvc" version = "0.39.0" @@ -5270,6 +6012,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + [[package]] name = "winnow" version = "0.4.1" @@ -5347,22 +6095,47 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.51", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + [[package]] name = "zstd" -version = "0.12.3+zstd.1.5.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.5+zstd.1.5.4" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" dependencies = [ - "libc", "zstd-sys", ] diff --git a/Cargo.toml b/Cargo.toml index ead57c4..319a447 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,4 @@ [workspace] members = ["api", "app", "common"] -default_members = ["api"] \ No newline at end of file +default_members = ["api"] +resolver = "2" \ No newline at end of file diff --git a/api/Cargo.toml b/api/Cargo.toml index ec8be5e..ce5e85b 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -7,18 +7,15 @@ authors = ["Kartonrad "] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -actix-web = "4.2.1" + actix-files = "0.6.2" -actix-cors = "0.6.3" tokio = { version = "1.24.2", features = ["fs"] } actix-multipart = "0.4.0" rust-embed = "6.4.2" mime_guess = "2.0.4" -sqlx = { version = "0.6.2", default-features = false, features = [ "offline", "runtime-tokio-rustls", "macros", "postgres", "json", "tls", "time", "migrate", "decimal" ] } rust_decimal = "1.26.1" -lazy_static = "1.4.0" async_once = "0.2.6" futures-util = "0.3.24" array-macro = "2.1.5" @@ -27,10 +24,8 @@ thiserror = "1.0.37" common = { path = "../common", features = ["sqlx"] } -serde = { version = "1.0.160", features = ["derive"] } serde_json = "1.0.96" serde_with = "2.0.1" -time = { version = "0.3.14", features = ["serde-well-known", "local-offset", "parsing"] } jsonwebtoken = "8.1.1" pbkdf2 = { version = "0.11.0" } @@ -38,7 +33,19 @@ password-hash = { version = "0.4", features = ["alloc", "std"] } base64 = "0.13.1" listenfd = "1.0.0" -log = "0.4.17" + pretty_env_logger = "0.4.0" -dotenvy = "0.15.5" + async-trait = "0.1.68" + +juniper = "0.15.11" +actix-web = "4.4.0" +actix-cors = "0.6.5" +actix-web-lab = "0.20.1" +env_logger = "0.10.1" +log = "0.4.20" +lazy_static = "1.4.0" +sqlx = { version = "0.7.3", features = [ "macros", "postgres", "json", "time", "migrate", "runtime-tokio", "tls-rustls", "bigdecimal" ] } +dotenvy = "0.15.7" +serde = "1.0.197" +time = { version = "0.3.34", features = ["serde-well-known", "local-offset", "parsing"] } diff --git a/api/src/auth.rs b/api/src/auth.rs index a90f4cc..d7c4024 100644 --- a/api/src/auth.rs +++ b/api/src/auth.rs @@ -5,7 +5,6 @@ use actix_web::{ HttpResponse, Responder, get, http::{header::{self, ContentType use log::{error, warn, info, debug, trace}; use lazy_static::lazy_static; use time::{PrimitiveDateTime, OffsetDateTime}; -use super::{db, DB_POOL}; use pbkdf2::{ password_hash::{ rand_core::OsRng, @@ -22,6 +21,7 @@ use actix_web::{ Error, }; use futures_util::{future::LocalBoxFuture, FutureExt}; +use sqlx::PgPool; // ================================================================================== CONSTS/STATICS ================================================================================== const JWT_ALGO: Algorithm = Algorithm::HS256; @@ -54,6 +54,7 @@ struct JWTClaims { // Newtype pattern 🥴 use common::auth::*; // inner identity from here +#[derive(Clone, Debug)] pub struct Identity(pub IIdentity); //deref bullshit impl std::ops::Deref for Identity { @@ -173,10 +174,10 @@ async fn classist(auth: MaybeIdentity) -> impl Responder { } #[post("/login")] -async fn login_handler(conn: ConnectionInfo, login_info: web::Json) -> Result { +async fn login_handler(conn: ConnectionInfo, login_info: web::Json, db_pool: web::Data) -> Result { trace!("Requestee {:?} attempting to log in with: {}", conn.realip_remote_addr(), login_info.username); // trust realip - let jwt = login(login_info.into_inner()).await?; + let jwt = login(login_info.into_inner(), db_pool.get_ref()).await?; Ok( HttpResponse::Ok().json(Token { token: jwt, @@ -185,10 +186,10 @@ async fn login_handler(conn: ConnectionInfo, login_info: web::Json) - } #[get("/login_unsafe")] -async fn unsafe_login_handler(conn: ConnectionInfo, login_info: web::Query) -> Result { - trace!("Requestee {:?} attempting to log in with: {}", conn.realip_remote_addr(), login_info.username); // trust realip +async fn unsafe_login_handler(conn: ConnectionInfo, login_info: web::Query, db_pool: web::Data) -> Result { + trace!("Requester {:?} attempting to log in with: {}", conn.realip_remote_addr(), login_info.username); // trust realip - let jwt = login(login_info.into_inner()).await?; + let jwt = login(login_info.into_inner(), db_pool.get_ref()).await?; Ok( HttpResponse::Ok() .cookie( @@ -231,10 +232,10 @@ pub fn config(cfg: &mut web::ServiceConfig) { // ================================================================================== AUTH Logic ================================================================================== // Login -async fn login ( login_info: LoginInfo ) -> Result { +async fn login (login_info: LoginInfo, db_pool: &PgPool ) -> Result { // Match a user let user = sqlx::query_as!(IIdentity, "SELECT * FROM users WHERE username = $1;", login_info.username) - .fetch_one(db!()).await + .fetch_one(db_pool).await .map_err( |db_err| { match db_err { sqlx::Error::RowNotFound => LoginError::WrongCredentials, @@ -262,7 +263,7 @@ async fn login ( login_info: LoginInfo ) -> Result { }).await? } -async fn authenticate(provided_token : &str) -> Result { +async fn authenticate(provided_token : &str, db_pool: &PgPool) -> Result { // Block on JWT Decode let provided_token = provided_token.to_owned(); let token_d = @@ -272,7 +273,7 @@ async fn authenticate(provided_token : &str) -> Result { let user = sqlx::query_as!(IIdentity, "SELECT * FROM users WHERE id = $1;", token_d.claims.auth_as) - .fetch_one( db!()).await + .fetch_one( db_pool).await .map_err(|e| match e { sqlx::Error::RowNotFound => AuthError::ObjectGone, _ => AuthError::Database(e), @@ -299,14 +300,19 @@ impl FromRequest for TryIdentity { fn extract(req: &HttpRequest) -> Self::Future { let req = req.clone(); + async move { + let db_pool: Option<&web::Data> = req.app_data(); + let db_pool = db_pool + .ok_or(auth_error::(None, "No Db Pool in App Data!"))?.get_ref(); + match req.cookie(&cookie_name("auth_token")) { - Some(auth_cookie) => Ok( authenticate(auth_cookie.value()).await? ), + Some(auth_cookie) => Ok( authenticate(auth_cookie.value(), db_pool).await? ), None => match req.headers().get(header::AUTHORIZATION) { Some(auth_header) => { let auth_header = auth_header.to_str().map_err(|e |auth_error(Some(e), "Failed to parse Auth-Header!"))?; if let Some( provided_token ) = auth_header.strip_prefix("Bearer ") { - Ok( authenticate(provided_token).await? ) + Ok( authenticate(provided_token, db_pool).await? ) } else { Err( auth_error::(None, "Support only for BEARER Authentication! Make a request to /auth/login or /auth/register to obtain token!") ) } diff --git a/api/src/embedded_asset_serve.rs b/api/src/embedded_asset_serve.rs index 5148bb6..88c6b7a 100644 --- a/api/src/embedded_asset_serve.rs +++ b/api/src/embedded_asset_serve.rs @@ -1,5 +1,6 @@ use rust_embed::RustEmbed; use actix_web::{get, Responder, web::{self, Bytes}, HttpResponse}; +use log::trace; #[derive(RustEmbed)] #[folder = "src/public/"] diff --git a/api/src/main.rs b/api/src/main.rs index 1c94676..edefae0 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -1,121 +1,86 @@ -// Following guide:: https://cloudmaker.dev/how-to-create-a-rest-api-in-rust/ +//! Actix Web juniper example +//! +//! A simple example integrating juniper in Actix Web -//--comfort features -//auto restart -use listenfd::ListenFd; -//env vars -use dotenvy::dotenv; +extern crate core; -//pretty logs -extern crate pretty_env_logger; -#[macro_use] extern crate log; -use std::fs::{create_dir_all, remove_dir_all}; -#[allow(unused_imports)] -use std::{env, io::Error}; +use std::{io, sync::Arc}; +use std::str::FromStr; -//--IMPORT-ANT IMPORTS -use actix_web::{App, HttpServer, Responder, get, middleware::Logger}; -use sqlx::{postgres::{PgPool, PgPoolOptions}}; -use lazy_static::lazy_static; -use async_once::AsyncOnce; use actix_cors::Cors; +use actix_web::{ + get, middleware, route, + web::{self, Data}, + App, HttpResponse, HttpServer, Responder, +}; +use actix_web_lab::respond::Html; +use juniper::http::{graphiql::graphiql_source, GraphQLRequest}; +use sqlx::PgPool; +use crate::auth::{TryIdentity}; -/* -use time::{OffsetDateTime, UtcOffset}; -use std::{env, fs::{read_to_string, read_dir}, fmt::Display}; -use rust_decimal::prelude::*;*/ - -pub mod file_uploads; +pub mod schema; +// pub mod file_uploads; pub mod auth; -pub mod routes; +//pub mod routes; pub mod embedded_asset_serve; -pub mod db_types; +//pub mod db_types; -//-------ROUTES -#[get("/")] -async fn genesis() -> impl Responder { - trace!("Greeting User"); - return "✨ New Rust🦀 Project! ✨" -} +use crate::schema::{AppContext, create_schema, Schema}; -lazy_static! { - static ref DB_POOL: AsyncOnce = AsyncOnce::new(async{ - init_db().await - }); +/// GraphiQL playground UI +#[get("/graphiql")] +async fn graphql_playground() -> impl Responder { + Html(graphiql_source("/graphql", None)) } -async fn init_db() -> PgPool { - // Create a connection pool - info!("Initializing Database Pool..."); - let pool = PgPoolOptions::new() - .max_connections(5) - .connect(&env::var("DATABASE_URL").unwrap()).await.unwrap(); - pool -} -#[macro_export] -macro_rules! db { - () => { - DB_POOL.get().await + +/// GraphQL endpoint +#[route("/graphql", method = "GET", method = "POST")] +async fn graphql(st: web::Data, db_pool: web::Data, data: web::Json, identity: TryIdentity) -> impl Responder { + let ctx = AppContext { + authenticated_user: identity.0, + db_pool: db_pool.get_ref().clone(), + server_origin: "localhost:8080".to_string() }; + let user = data.execute(&st, &ctx).await; + HttpResponse::Ok().json(user) } -///------INIT^ -#[allow(unreachable_code)] #[actix_web::main] -async fn main() -> Result<(),std::io::Error> { - dotenv().ok(); - pretty_env_logger::init(); - info!("Hello, world!"); +async fn main() -> io::Result<()> { + dotenvy::dotenv().ok(); + env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); - // Migrate db - info!("Migrating Database..."); - sqlx::migrate!().run(db!()).await.map_err(|err| Error::new(std::io::ErrorKind::Other, format!("{:?}", err)))?; + // Create Juniper schema + let schema = Arc::new(create_schema()); - // Create and Clear CLEAR temp-uploads folder - create_dir_all("uploads/temp")?; - remove_dir_all("uploads/temp")?; - create_dir_all("uploads/temp")?; + log::info!("starting HTTP server on port 8080"); + log::info!("GraphiQL playground: http://localhost:8080/graphiql"); - // Setup Server - let mut server = HttpServer::new( || { + let server_host = std::env::var("BIND_HOST").unwrap_or("127.0.0.1".to_string()); + let server_port = u16::from_str( + &std::env::var("BIND_PORT").unwrap_or("8080".to_string()) + ).expect("BIND_PORT Variable to be a number"); + + let pool = sqlx::PgPool::connect( + &std::env::var("DATABASE_URL").expect("Enviroment Variable DATABASE_URL is required") + ).await.expect("Postgres failed to connect"); + + // Start HTTP server + HttpServer::new(move || { App::new() - .wrap(Cors::permissive()) - .wrap(Logger::new(r#"[%a] "%r" %s %bb "%{Referer}i" "%{User-Agent}i" %Dms"#)) + .app_data(Data::from(schema.clone())) + .app_data(web::Data::new(pool.clone())) .configure(auth::config) .configure(embedded_asset_serve::config) - .configure(routes::config) - .service(genesis) - //.service(actix_files::Files::new("/uploads", "uploads").show_files_listing()) - .service(file_uploads::get_uploads_service) - } ); - - // take over socket from old process, if available - let mut listenfd = ListenFd::from_env(); - server = match listenfd.take_tcp_listener(0)? { - Some(listener) => { - info!("Reusing Socket for: http://{}", listener.local_addr()?.to_string()); - server.listen(listener)? - }, - None => { - // Bind to Adress specified in .env - let host = env::var("HOST").expect("Host not set"); - let port = env::var("PORT").expect("Port not set"); - info!("Binding Server to http://{}:{}", host, port); - server.bind(format!("{}:{}", host, port))? - } - }; - - //block - server.run().await.into() -} - -/*fn handle_err_except_duplicate(err: sqlx::Error) -> Result<(), sqlx::Error>{ - if let Some(db_err) = err.as_database_error() { - if let Some(err_code) = db_err.code() { - if err_code == "23505" { - trace!("Report Group already in database."); - return Ok(()); - } - } - } - Err(err) -}*/ + .service(graphql) + .service(graphql_playground) + //.service(file_uploads::get_uploads_service) + // the graphiql UI requires CORS to be enabled + .wrap(Cors::permissive()) + .wrap(middleware::Logger::default()) + }) + .workers(2) + .bind((server_host, server_port))? + .run() + .await +} \ No newline at end of file diff --git a/api/src/db_types.rs b/api/src/old/db_types.rs similarity index 100% rename from api/src/db_types.rs rename to api/src/old/db_types.rs diff --git a/api/src/file_uploads.rs b/api/src/old/file_uploads.rs similarity index 100% rename from api/src/file_uploads.rs rename to api/src/old/file_uploads.rs diff --git a/api/src/routes.rs b/api/src/old/routes.rs similarity index 100% rename from api/src/routes.rs rename to api/src/old/routes.rs diff --git a/api/src/schema/equal_balance.rs b/api/src/schema/equal_balance.rs new file mode 100644 index 0000000..29f3df2 --- /dev/null +++ b/api/src/schema/equal_balance.rs @@ -0,0 +1,7 @@ +use super::*; + + +#[derive(GraphQLObject)] +pub struct EqualBalance { + int: i32, +} \ No newline at end of file diff --git a/api/src/schema/mod.rs b/api/src/schema/mod.rs new file mode 100644 index 0000000..5bdec3b --- /dev/null +++ b/api/src/schema/mod.rs @@ -0,0 +1,98 @@ +use std::pin::Pin; +use juniper::{FieldError, FieldResult, graphql_object, RootNode}; +use juniper::{GraphQLEnum, GraphQLInputObject, GraphQLObject}; +use juniper::futures::Stream; +use juniper::serde::Deserialize; +use crate::auth::Identity; + +mod wg; +mod user; +mod upload; +mod equal_balance; +mod share; + + +pub use wg::*; +pub use user::*; +pub use upload::*; +pub use equal_balance::*; +pub use share::*; + + +#[derive(GraphQLObject)] +pub struct Share { + int: i32, +} + + +pub struct QueryRoot; + +impl QueryRoot { + async fn me(ctx: &AppContext) -> FieldResult { + let identity = ctx.authenticated_user.clone().ok_or("Unauthenticated")?; + + let user : User = sqlx::query_as( r#" + SELECT + users.*, + COALESCE(row_to_json(pp), 'null'::json) as profile_pic + FROM users + LEFT JOIN uploads pp ON users.profile_pic = pp.id + WHERE users.id = $1 + "#) + .bind(identity.id) + .fetch_one(&ctx.db_pool).await?; + + return Ok( + user + ); + } +} + +#[graphql_object(context = AppContext)] +impl QueryRoot { + fn wg(_id: String) -> FieldResult { + todo!(); + } + + async fn my_wg(ctx: &AppContext) -> FieldResult> { + let user: User = QueryRoot::me(ctx).await?; + + Ok(user.wg(ctx).await?) + } + + async fn me(ctx: &AppContext) -> FieldResult { + QueryRoot::me(ctx).await + } +} + +pub struct MutationRoot; + +#[graphql_object(context = AppContext)] +impl MutationRoot { + fn cant_mutate() -> i32{ + todo!() + } +} + +pub struct Subscription; + +#[juniper::graphql_subscription(context = AppContext)] +impl Subscription { + async fn api_version() -> Pin> + Send>> { + todo!() + } +} + +pub struct AppContext { + pub authenticated_user: Option, + pub db_pool: sqlx::PgPool, + pub server_origin: String, +} + +impl juniper::Context for AppContext {} + +pub type Schema = RootNode<'static, QueryRoot, MutationRoot, Subscription>; + +pub fn create_schema() -> Schema { + Schema::new(QueryRoot {}, MutationRoot {}, Subscription {}) +} \ No newline at end of file diff --git a/api/src/schema/share.rs b/api/src/schema/share.rs new file mode 100644 index 0000000..dbe50b8 --- /dev/null +++ b/api/src/schema/share.rs @@ -0,0 +1,6 @@ +use super::*; + +#[derive(GraphQLObject)] +pub struct Share { + int: i32, +} \ No newline at end of file diff --git a/api/src/schema/upload.rs b/api/src/schema/upload.rs new file mode 100644 index 0000000..e5b38af --- /dev/null +++ b/api/src/schema/upload.rs @@ -0,0 +1,22 @@ +use super::*; + +#[derive(Clone, sqlx::FromRow, Deserialize)] +pub struct Upload { + pub id: i32, + pub extension: String, + pub size_kb: i32, + pub original_filename: String +} + +#[graphql_object(context = AppContext)] +impl Upload { + pub fn id(&self) -> i32 { self.id } + pub fn extension(&self) -> String { self.extension.clone() } + pub fn size_kb(&self) -> i32 { self.size_kb } + pub fn original_filename(&self) -> String { self.original_filename.clone() } + + pub fn url(&self, ctx: &AppContext) -> String { + format!("https://{}/uploads/{}.{}", ctx.server_origin, self.id, self.extension) + } + +} \ No newline at end of file diff --git a/api/src/schema/user.rs b/api/src/schema/user.rs new file mode 100644 index 0000000..57f8f80 --- /dev/null +++ b/api/src/schema/user.rs @@ -0,0 +1,68 @@ +use super::*; + + +#[derive(Clone, sqlx::FromRow)] +pub struct User { + pub id : i32, + pub username: String, + + pub name: String, + pub bio: String, + + #[sqlx(json)] + pub profile_pic: Option, + pub wg : Option, +} + +impl User { + pub async fn wg(&self, ctx: &AppContext) -> FieldResult> { + return if let Some(wg_id) = self.wg { + let wg: WG = sqlx::query_as(r#" + SELECT + wgs.id, wgs.url, wgs.name, wgs.description, + COALESCE(row_to_json(pp), 'null'::json) as profile_pic, + COALESCE(row_to_json(hp), 'null'::json) as header_pic FROM wgs + LEFT JOIN uploads hp ON wgs.header_pic = hp.id + LEFT JOIN uploads pp ON wgs.profile_pic = pp.id + WHERE wgs.id = $1 + "#) + .bind(wg_id) + .fetch_one(&ctx.db_pool).await?; + + Ok( + Some(wg) + ) + } else { + Ok(None) + } + } + +} + +#[graphql_object(context = AppContext)] +#[graphql(description = "A user of the app")] +impl User { + pub fn id(&self) -> i32 { + self.id + } + pub fn username(&self) -> &str { &self.username } + pub fn name(&self) -> &str { + &self.name + } + pub fn bio(&self) -> &str { + &self.bio + } + pub fn profile_pic(&self) -> Option { + self.profile_pic.clone() + } + pub fn wg_id(&self) -> Option { + self.wg + } + + pub fn is_me(&self, ctx: &AppContext) -> bool { + Some(self.id) == ctx.authenticated_user.as_ref().map(|i| i.id) + } + pub async fn wg(&self, ctx: &AppContext) -> FieldResult> { + Self::wg(self, ctx).await + } +} \ No newline at end of file diff --git a/api/src/schema/wg.rs b/api/src/schema/wg.rs new file mode 100644 index 0000000..5185713 --- /dev/null +++ b/api/src/schema/wg.rs @@ -0,0 +1,64 @@ +use super::*; + +#[derive(sqlx::FromRow, Deserialize, Clone)] +pub struct WG { + pub id : i32, + pub url: String, + + pub name: String, + pub description: String, + #[sqlx(json)] + pub profile_pic: Option, + #[sqlx(json)] + pub header_pic: Option +} + +#[graphql_object(context = AppContext)] +#[graphql(description = "A WG")] +impl WG { + fn id(&self) -> i32 { + self.id + } + fn url(&self) -> &str { + &self.url + } + fn name(&self) -> &str { + &self.name + } + fn description(&self) -> &str { + &self.description + } + fn profile_pic(&self) -> Option { + self.profile_pic.clone() + } + fn header_pic(&self) -> Option { + self.header_pic.clone() + } + + async fn users(&self, ctx: &AppContext) -> FieldResult> { + let users : Vec = sqlx::query_as( r#" + SELECT + users.*, + COALESCE(row_to_json(pp), 'null'::json) as profile_pic + FROM users + LEFT JOIN uploads pp ON users.profile_pic = pp.id + WHERE users.wg = $1 + "#) + .bind(self.id) + .fetch_all(&ctx.db_pool).await?; + + return Ok( + users + ); + } + + fn equal_balances() -> Vec { + todo!() + } + fn costs(&self, ctx: &AppContext) -> Vec { + + + + todo!() + } +} \ No newline at end of file diff --git a/common/Cargo.toml b/common/Cargo.toml index 5b13029..256bae6 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -11,7 +11,7 @@ time = { version = "0.3.14", features = ["serde-well-known", "local-offset", "pa rust_decimal = "1.26.1" rust_decimal_macros = "1.29.1" -sqlx = { version = "0.6.2", default-features = false, optional = true } +sqlx = { version = "0.7.3", optional = true } [features] sqlx = ["dep:sqlx"] \ No newline at end of file