diff --git a/Cargo.lock b/Cargo.lock index 3c35232..5cf2c72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,17 +23,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - [[package]] name = "aes" version = "0.7.5" @@ -46,6 +35,17 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "aes" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe0133578c0986e1fe3dfcd4af1cc5b2dd6c3dbf534d69916ce16a2701d40ba" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.4.3", + "cpufeatures", +] + [[package]] name = "aes-gcm" version = "0.9.4" @@ -60,26 +60,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - [[package]] name = "aho-corasick" version = "0.7.18" @@ -122,7 +102,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7db023823e72175ec1a514231d5ff28ad7f7e15702a3ad7507dbc7ac1feea7b6" dependencies = [ - "enumflags2 0.7.5", + "enumflags2", "futures", "gdk4-wayland", "gdk4-x11", @@ -132,7 +112,7 @@ dependencies = [ "rand", "serde", "serde_repr", - "zbus 2.1.1", + "zbus", ] [[package]] @@ -256,22 +236,22 @@ dependencies = [ "gtk-macros", "gtk4", "hex", - "image 0.24.1", + "image 0.24.2", "libadwaita", - "log", "once_cell", + "oo7", "percent-encoding", - "pretty_env_logger", "qrcode", "rand", "ring", "rust-argon2", "scrypt", "search-provider", - "secret-service", "serde", "serde_json", "tokio", + "tracing", + "tracing-subscriber", "unicase", "url", "uuid", @@ -290,6 +270,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64ct" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" + [[package]] name = "binascii" version = "0.1.4" @@ -306,7 +292,7 @@ dependencies = [ "cexpr", "clang-sys", "clap", - "env_logger 0.9.0", + "env_logger", "lazy_static", "lazycell", "log", @@ -342,15 +328,6 @@ 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 = "block-buffer" version = "0.10.2" @@ -360,21 +337,14 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding", - "cipher 0.2.5", -] - [[package]] name = "block-padding" -version = "0.2.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" +dependencies = [ + "generic-array", +] [[package]] name = "bumpalo" @@ -408,9 +378,9 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "cairo-rs" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129e928d3eda625f53ce257589efbe5143416875fd01bddd08c8c6feb8b9962b" +checksum = "62be3562254e90c1c6050a72aa638f6315593e98c5cdaba9017cedbabf0a5dee" dependencies = [ "bitflags", "cairo-sys-rs", @@ -430,6 +400,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher 0.4.3", +] + [[package]] name = "cc" version = "1.0.73" @@ -484,15 +463,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array", -] - [[package]] name = "cipher" version = "0.3.0" @@ -616,19 +586,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" dependencies = [ "generic-array", + "rand_core", "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "ctr" version = "0.8.0" @@ -691,26 +652,37 @@ dependencies = [ "migrations_macros", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "crypto-common", "subtle", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -744,7 +716,7 @@ version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2170fc0efee383079a8bdd05d6ea2a184d2a0f07a1c1dcabdb2fd5e9f24bc36c" dependencies = [ - "num-bigint 0.4.3", + "num-bigint", "num-traits", "proc-macro2", "quote", @@ -752,37 +724,16 @@ dependencies = [ "syn", ] -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive 0.6.4", - "serde", -] - [[package]] name = "enumflags2" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" dependencies = [ - "enumflags2_derive 0.7.4", + "enumflags2_derive", "serde", ] -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "enumflags2_derive" version = "0.7.4" @@ -794,19 +745,6 @@ dependencies = [ "syn", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.9.0" @@ -814,7 +752,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" dependencies = [ "atty", - "humantime 2.1.0", + "humantime", "log", "regex", "termcolor", @@ -861,14 +799,14 @@ name = "favicon-scrapper" version = "0.1.0" dependencies = [ "base64", - "image 0.24.1", - "log", + "image 0.24.2", "once_cell", "percent-encoding", "quick-xml", "reqwest", "svg_metadata", "tokio", + "tracing", "url", ] @@ -1025,9 +963,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678516f1baef591d270ca10587c01a12542a731a7879cc62391a18191a470831" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" dependencies = [ "bitflags", "gdk-pixbuf-sys", @@ -1184,9 +1122,9 @@ dependencies = [ [[package]] name = "gio" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cd21a7a674ea811749661012512b0ba5237ba404ccbcab2850db5537549b64" +checksum = "0f132be35e05d9662b9fa0fee3f349c6621f7782e0105917f4cc73c1bf47eceb" dependencies = [ "bitflags", "futures-channel", @@ -1214,9 +1152,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a826fad715b57834920839d7a594c3b5e416358c7d790bdaba847a40d7c1d96d" +checksum = "bd124026a2fa8c33a3d17a3fe59c103f2d9fa5bd92c19e029e037736729abeab" dependencies = [ "bitflags", "futures-channel", @@ -1234,13 +1172,13 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac4d47c544af67747652ab1865ace0ffa1155709723ac4f32e97587dd4735b2" +checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" dependencies = [ "anyhow", "heck", - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", @@ -1355,9 +1293,9 @@ dependencies = [ [[package]] name = "gstreamer" -version = "0.18.7" +version = "0.18.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd58af6f8b268fc335122a3ccc66efa0cd56584948f49a37e5feef0b89dfc29b" +checksum = "d66363bacf5e4f6eb281564adc2902e44c52ae5c45082423e7439e9012b75456" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -1483,7 +1421,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f3c4aa605fb3d78205c7aef0eeaa6db61d8cc4dd05a465dc6ffdfdaee84f825" dependencies = [ "anyhow", - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quick-xml", @@ -1561,22 +1499,11 @@ dependencies = [ [[package]] name = "hkdf" -version = "0.10.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" dependencies = [ - "digest 0.9.0", - "hmac 0.10.1", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac", - "digest 0.9.0", + "hmac", ] [[package]] @@ -1585,14 +1512,14 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest", ] [[package]] name = "http" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" dependencies = [ "bytes", "fnv", @@ -1612,9 +1539,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1622,15 +1549,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - [[package]] name = "humantime" version = "2.1.0" @@ -1701,9 +1619,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db207d030ae38f1eb6f240d5a1c1c88ff422aa005d10f8c6c6fc5e75286ab30e" +checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" dependencies = [ "bytemuck", "byteorder", @@ -1730,6 +1648,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ + "block-padding", "generic-array", ] @@ -1809,9 +1728,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.124" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "libloading" @@ -2010,16 +1929,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nb-connect" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" -dependencies = [ - "libc", - "socket2", -] - [[package]] name = "nix" version = "0.14.1" @@ -2033,19 +1942,6 @@ dependencies = [ "void", ] -[[package]] -name = "nix" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - [[package]] name = "nix" version = "0.23.1" @@ -2080,26 +1976,15 @@ dependencies = [ [[package]] name = "num" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" dependencies = [ - "num-bigint 0.3.3", + "num-bigint", "num-complex", "num-integer", "num-iter", - "num-rational 0.3.2", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", + "num-rational 0.4.0", "num-traits", ] @@ -2116,18 +2001,18 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" +checksum = "97fbc387afefefd5e9e39493299f3069e14a140dd34dc19b4c1c1a8fddb6a790" dependencies = [ "num-traits", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -2135,9 +2020,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", @@ -2151,7 +2036,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ "autocfg", - "num-bigint 0.3.3", "num-integer", "num-traits", ] @@ -2163,6 +2047,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" dependencies = [ "autocfg", + "num-bigint", "num-integer", "num-traits", ] @@ -2221,6 +2106,33 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +[[package]] +name = "oo7" +version = "0.1.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "314dc7f6ef9b44aa898c3dfdf4ad80ab63996409b255aac9f575f590d74120b0" +dependencies = [ + "aes 0.8.1", + "byteorder", + "cbc", + "cipher 0.4.3", + "digest", + "dirs", + "futures", + "hkdf", + "hmac", + "num", + "once_cell", + "pbkdf2", + "rand", + "serde", + "sha2", + "tokio", + "tracing", + "zbus", + "zeroize", +] + [[package]] name = "opaque-debug" version = "0.3.0" @@ -2335,6 +2247,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "password-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e029e94abc8fb0065241c308f1ac6bc8d20f450e8f7c5f0b25cd9b8d526ba294" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + [[package]] name = "paste" version = "1.0.7" @@ -2347,7 +2270,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.3", + "digest", + "hmac", + "password-hash", + "sha2", ] [[package]] @@ -2373,9 +2299,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -2463,28 +2389,9 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "pretty-hex" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5c99d529f0d30937f6f4b8a86d988047327bb88d04d2c4afc356de74722131" - -[[package]] -name = "pretty_env_logger" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" -dependencies = [ - "env_logger 0.7.1", - "log", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] +checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" [[package]] name = "proc-macro-crate" @@ -2539,12 +2446,6 @@ dependencies = [ "image 0.23.14", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quick-xml" version = "0.22.0" @@ -2613,6 +2514,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + [[package]] name = "regex" version = "1.5.5" @@ -2769,12 +2681,6 @@ dependencies = [ "parking_lot", ] -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "scopeguard" version = "1.1.0" @@ -2787,10 +2693,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac 0.12.1", + "hmac", "pbkdf2", "salsa20", - "sha2 0.10.2", + "sha2", ] [[package]] @@ -2801,29 +2707,9 @@ checksum = "350ac7d1c6898fa22b7ac0e4fbc857997c1b5f077ece7cdb1415c13954402f17" dependencies = [ "futures", "serde", - "zbus 2.1.1", - "zvariant 3.1.2", - "zvariant_derive 3.1.2", -] - -[[package]] -name = "secret-service" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2400fb1bf2a87b303ada204946294f932ade4929477e9e2bf66d7b49a66656ec" -dependencies = [ - "aes 0.6.0", - "block-modes", - "hkdf", - "lazy_static", - "num", - "rand", - "serde", - "sha2 0.9.9", - "zbus 1.9.1", - "zbus_macros 1.9.1", - "zvariant 2.10.0", - "zvariant_derive 2.10.0", + "zbus", + "zvariant", + "zvariant_derive", ] [[package]] @@ -2942,19 +2828,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.2" @@ -2963,7 +2836,16 @@ checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.3", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", ] [[package]] @@ -3042,15 +2924,27 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "system-deps" version = "6.0.2" @@ -3123,10 +3017,19 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.5.1" +name = "thread_local" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -3139,15 +3042,16 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b" dependencies = [ "bytes", "libc", "memchr", "mio", "num_cpus", + "once_cell", "pin-project-lite", "socket2", "tokio-macros", @@ -3218,9 +3122,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -3234,6 +3138,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" +dependencies = [ + "ansi_term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] @@ -3265,9 +3195,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-normalization" @@ -3327,6 +3257,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -3538,29 +3474,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "zbus" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" -dependencies = [ - "async-io", - "byteorder", - "derivative", - "enumflags2 0.6.4", - "fastrand", - "futures", - "nb-connect", - "nix 0.17.0", - "once_cell", - "polling", - "scoped-tls", - "serde", - "serde_repr", - "zbus_macros 1.9.1", - "zvariant 2.10.0", -] - [[package]] name = "zbus" version = "2.1.1" @@ -3577,7 +3490,7 @@ dependencies = [ "async-trait", "byteorder", "derivative", - "enumflags2 0.7.5", + "enumflags2", "event-listener", "futures-core", "futures-sink", @@ -3592,22 +3505,11 @@ dependencies = [ "serde_repr", "sha1", "static_assertions", + "tokio", "winapi", - "zbus_macros 2.1.1", + "zbus_macros", "zbus_names", - "zvariant 3.1.2", -] - -[[package]] -name = "zbus_macros" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn", + "zvariant", ] [[package]] @@ -3616,7 +3518,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36823cc10fddc3c6b19f048903262dacaf8274170e9a255784bdd8b4570a8040" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "regex", @@ -3631,21 +3533,28 @@ checksum = "45dfcdcf87b71dad505d30cc27b1b7b88a64b6d1c435648f48f9dbc1fdc4b7e1" dependencies = [ "serde", "static_assertions", - "zvariant 3.1.2", + "zvariant", ] [[package]] -name = "zvariant" -version = "2.10.0" +name = "zeroize" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68c7b55f2074489b7e8e07d2d0a6ee6b4f233867a653c664d8020ba53692525" +checksum = "7eb5728b8afd3f280a869ce1d4c554ffaed35f45c231fc41bfbd0381bef50317" dependencies = [ - "byteorder", - "enumflags2 0.6.4", - "libc", - "serde", - "static_assertions", - "zvariant_derive 2.10.0", + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] @@ -3655,23 +3564,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49ea5dc38b2058fae6a5b79009388143dadce1e91c26a67f984a0fc0381c8033" dependencies = [ "byteorder", - "enumflags2 0.7.5", + "enumflags2", "libc", "serde", "static_assertions", - "zvariant_derive 3.1.2", -] - -[[package]] -name = "zvariant_derive" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn", + "zvariant_derive", ] [[package]] @@ -3680,7 +3577,7 @@ version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c2cecc5a61c2a053f7f653a24cd15b3b0195d7f7ddb5042c837fb32e161fb7a" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate", "proc-macro2", "quote", "syn", diff --git a/Cargo.toml b/Cargo.toml index 0745c2a..5191797 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,15 +17,15 @@ gtk = {package = "gtk4", version = "0.4"} gtk-macros = "0.3" search-provider = "0.3" hex = { version = "0.4.3", features = [ "serde" ] } -log = "0.4" +tracing = "0.1" +tracing-subscriber = "0.3" once_cell = "1.9" percent-encoding = "2.1" -pretty_env_logger = "0.4" qrcode = {version = "0.12", features = ["image"]} rand = "0.8" ring = "0.16" rust-argon2 = "1.0" -secret-service = "2.0" +oo7 = {version = "0.1.0-alpha.3", default-features = false, features = ["tokio_runtime", "tracing"]} serde = "1.0" serde_json = "1.0" unicase = "2.6" diff --git a/build-aux/com.belmoussaoui.Authenticator.Devel.json b/build-aux/com.belmoussaoui.Authenticator.Devel.json index fde1616..71991d5 100644 --- a/build-aux/com.belmoussaoui.Authenticator.Devel.json +++ b/build-aux/com.belmoussaoui.Authenticator.Devel.json @@ -15,7 +15,7 @@ "--socket=wayland", "--device=dri", "--talk-name=org.freedesktop.secrets", - "--env=RUST_LOG=authenticator=debug,ashpd=debug", + "--env=RUST_LOG=authenticator=debug,ashpd=debug,oo7=debug", "--env=G_MESSAGES_DEBUG=none", "--own-name=com.belmoussaoui.Authenticator.Devel.SearchProvider" ], diff --git a/data/com.belmoussaoui.Authenticator.gschema.xml.in b/data/com.belmoussaoui.Authenticator.gschema.xml.in index d5a2454..8642524 100644 --- a/data/com.belmoussaoui.Authenticator.gschema.xml.in +++ b/data/com.belmoussaoui.Authenticator.gschema.xml.in @@ -31,5 +31,8 @@ Auto lock timeout Lock the application on idle after X minutes + + false + diff --git a/favicon-scrapper/Cargo.toml b/favicon-scrapper/Cargo.toml index d184e27..f640501 100644 --- a/favicon-scrapper/Cargo.toml +++ b/favicon-scrapper/Cargo.toml @@ -13,7 +13,7 @@ quick-xml = "0.22" image = {version = "0.24", features = ["ico", "png"], default-features = false} url = "2.2" once_cell = "1.9" -log = "0.4" +tracing = "0.1" base64 = "0.13.0" svg_metadata = "0.4" tokio = { version = "1.0", features = ["rt-multi-thread", "fs", "io-util", "macros"] } diff --git a/favicon-scrapper/src/favicon.rs b/favicon-scrapper/src/favicon.rs index 3b68a52..a21335b 100644 --- a/favicon-scrapper/src/favicon.rs +++ b/favicon-scrapper/src/favicon.rs @@ -77,16 +77,16 @@ impl Favicon { /// Save the favicon into `destination` and convert it to a [`Format::Png`] /// if it is original format is [`Format::Ico`]. pub async fn save(&self, destination: PathBuf) -> Result<(), Error> { - log::debug!("Caching the icon into {:#?}", destination); + tracing::debug!("Caching the icon into {:#?}", destination); let format = *self.metadata().format(); let body = self.data().await?; if format.is_ico() { - log::debug!("Found a ICO favicon, converting to PNG"); + tracing::debug!("Found a ICO favicon, converting to PNG"); if let Ok(ico) = image::load_from_memory_with_format(&body, image::ImageFormat::Ico) { ico.save_with_format(destination, image::ImageFormat::Png)?; return Ok(()); } else { - log::debug!("It seems to not be a ICO favicon, fallback to PNG"); + tracing::debug!("It seems to not be a ICO favicon, fallback to PNG"); }; } let mut dest = tokio::fs::File::create(destination).await?; diff --git a/favicon-scrapper/src/scrapper.rs b/favicon-scrapper/src/scrapper.rs index a2ab580..3a35716 100644 --- a/favicon-scrapper/src/scrapper.rs +++ b/favicon-scrapper/src/scrapper.rs @@ -1,7 +1,7 @@ -use log::debug; use percent_encoding::percent_decode_str; use quick_xml::events::{attributes::Attribute, BytesStart, Event}; use std::{fmt, path::PathBuf}; +use tracing::debug; use url::Url; use crate::{Error, Favicon, Format, Metadata, CLIENT}; diff --git a/src/application.rs b/src/application.rs index cbfbdb2..1cdde3b 100644 --- a/src/application.rs +++ b/src/application.rs @@ -1,6 +1,8 @@ use crate::{ config, - models::{Account, Keyring, OTPUri, Provider, ProvidersModel, FAVICONS_PATH}, + models::{ + keyring, Account, OTPUri, Provider, ProvidersModel, FAVICONS_PATH, RUNTIME, SECRET_SERVICE, + }, widgets::{PreferencesWindow, ProvidersDialog, Window}, }; use adw::prelude::*; @@ -9,12 +11,15 @@ use glib::clone; use gtk::{gio, glib, subclass::prelude::*}; use gtk_macros::{action, get_action}; use search_provider::{ResultID, ResultMeta, SearchProvider, SearchProviderImpl}; -use std::str::FromStr; +use std::{collections::HashMap, str::FromStr}; mod imp { + use crate::utils::spawn_tokio_blocking; + use super::*; use adw::subclass::prelude::*; use glib::{ParamSpec, ParamSpecBoolean, Value, WeakRef}; + use once_cell::sync::OnceCell; use std::cell::{Cell, RefCell}; // The basic struct that holds our state and widgets @@ -25,7 +30,7 @@ mod imp { pub locked: Cell, pub lock_timeout_id: RefCell>, pub can_be_locked: Cell, - pub settings: gio::Settings, + pub settings: OnceCell, pub search_provider: RefCell>>, } @@ -39,12 +44,11 @@ mod imp { // Initialize with default values fn new() -> Self { let model = ProvidersModel::new(); - let settings = gio::Settings::new(config::APP_ID); Self { window: RefCell::new(None), model, - settings, + settings: OnceCell::default(), can_be_locked: Cell::new(false), lock_timeout_id: RefCell::default(), locked: Cell::new(false), @@ -188,7 +192,7 @@ mod imp { } }); - self.settings.connect_changed( + self.settings.get().unwrap().connect_changed( None, clone!(@weak app => move |settings, key| { match key { @@ -217,7 +221,7 @@ mod imp { Ok(search_provider) => { imp.search_provider.replace(Some(search_provider)); }, - Err(err) => log::debug!("Could not start search provider: {}", err), + Err(err) => tracing::debug!("Could not start search provider: {}", err), }; })); } @@ -233,7 +237,8 @@ mod imp { window.present(); self.window.replace(Some(window.downgrade())); - let has_set_password = Keyring::has_set_password().unwrap_or(false); + let has_set_password = + spawn_tokio_blocking(async { keyring::has_set_password().await.unwrap_or(false) }); app.set_accels_for_action("app.quit", &["q"]); app.set_accels_for_action("app.lock", &["l"]); app.set_accels_for_action("app.providers", &["p"]); @@ -283,13 +288,50 @@ glib::wrapper! { impl Application { pub fn run() { - info!("Authenticator ({})", config::APP_ID); - info!("Version: {} ({})", config::VERSION, config::PROFILE); - info!("Datadir: {}", config::PKGDATADIR); + tracing::info!("Authenticator ({})", config::APP_ID); + tracing::info!("Version: {} ({})", config::VERSION, config::PROFILE); + tracing::info!("Datadir: {}", config::PKGDATADIR); std::fs::create_dir_all(&*FAVICONS_PATH.clone()).ok(); - Keyring::ensure_unlocked() - .expect("Authenticator couldn't reach a secret service provider or unlock it"); + + // To be removed in the upcoming release + let settings = gio::Settings::new(config::APP_ID); + if !settings.boolean("keyrings-migrated") { + tracing::info!("Migrating the secrets to the file backend"); + let output: oo7::Result<()> = RUNTIME.block_on(async { + oo7::migrate( + vec![ + HashMap::from([("application", config::APP_ID), ("type", "token")]), + HashMap::from([("application", config::APP_ID), ("type", "password")]), + ], + false, + ) + .await?; + Ok(()) + }); + match output { + Ok(_) => { + settings + .set_boolean("keyrings-migrated", true) + .expect("Failed to update settings"); + tracing::info!("Secrets were migrated successfully"); + } + Err(err) => { + tracing::error!("Failed to migrate your data {err}"); + } + } + } + + RUNTIME.block_on(async { + let keyring = oo7::Keyring::new() + .await + .expect("Failed to start a location service"); + keyring + .unlock() + .await + .expect("Failed to unlock the default collection"); + SECRET_SERVICE.set(keyring).unwrap() + }); let app = glib::Object::new::(&[ ("application-id", &Some(config::APP_ID)), @@ -297,6 +339,8 @@ impl Application { ("resource-base-path", &"/com/belmoussaoui/Authenticator"), ]) .unwrap(); + let imp = app.imp(); + imp.settings.set(settings).unwrap(); ApplicationExtManual::run(&app); } @@ -334,8 +378,8 @@ impl Application { /// Starts or restarts the lock timeout. pub fn restart_lock_timeout(&self) { let imp = self.imp(); - let auto_lock = imp.settings.boolean("auto-lock"); - let timeout = imp.settings.uint("auto-lock-timeout") * 60; + let auto_lock = imp.settings.get().unwrap().boolean("auto-lock"); + let timeout = imp.settings.get().unwrap().uint("auto-lock-timeout") * 60; if !auto_lock { return; @@ -364,7 +408,7 @@ impl Application { fn update_color_scheme(&self) { let manager = self.style_manager(); if !manager.system_supports_color_schemes() { - let color_scheme = if self.imp().settings.boolean("dark-theme") { + let color_scheme = if self.imp().settings.get().unwrap().boolean("dark-theme") { adw::ColorScheme::PreferDark } else { adw::ColorScheme::PreferLight diff --git a/src/backup/aegis.rs b/src/backup/aegis.rs index 99ee23f..d84f8ee 100644 --- a/src/backup/aegis.rs +++ b/src/backup/aegis.rs @@ -157,7 +157,7 @@ impl Aegis { // Check whether file is encrypted or in plaintext match aegis_root { Aegis::Plaintext(plain_text) => { - log::info!( + tracing::info!( "Found unencrypted aegis vault with version {} and database version {}.", plain_text.version, plain_text.db.version @@ -180,7 +180,7 @@ impl Aegis { } } Aegis::Encrypted(encrypted) => { - log::info!( + tracing::info!( "Found encrypted aegis vault with version {}.", encrypted.version ); @@ -212,7 +212,7 @@ impl Aegis { .iter() .filter(|slot| slot.type_ == 1) // We don't handle biometric slots for now .map(|slot| -> Result> { - log::info!("Found possible master key with UUID {}.", slot.uuid); + tracing::info!("Found possible master key with UUID {}.", slot.uuid); // Create parameters for scrypt function and derive decryption key for master key // @@ -250,20 +250,20 @@ impl Aegis { .filter_map(|x| match x { Ok(x) => Some(x), Err(e) => { - log::error!("Decrypting master key failed: {:?}", e); + tracing::error!("Decrypting master key failed: {:?}", e); None } }) .collect(); // Choose the first valid master key. I don't think there are aegis installations with two valid password slots. - log::info!( + tracing::info!( "Found {} valid password slots / master keys.", master_keys.len() ); let master_key = match master_keys.first() { Some(x) => { - log::info!("Using only the first valid key slot / master key."); + tracing::info!("Using only the first valid key slot / master key."); x } None => anyhow::bail!( @@ -288,7 +288,7 @@ impl Aegis { .context("Deserialize decrypted database failed")?; // Check version of the database - log::info!("Found aegis database with version {}.", db.version); + tracing::info!("Found aegis database with version {}.", db.version); if encrypted.version > 2 { anyhow::bail!( "Aegis database version expected to be 1 or 2. Found {} instead.", diff --git a/src/main.rs b/src/main.rs index bb2747e..32e54eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,10 @@ #[macro_use] -extern crate log; -#[macro_use] extern crate diesel; #[macro_use] extern crate diesel_migrations; use gtk::{gio, glib}; +mod utils; use gettextrs::*; mod application; mod backup; @@ -25,13 +24,13 @@ fn init_i18n() -> anyhow::Result<()> { } fn main() { - pretty_env_logger::init(); + tracing_subscriber::fmt::init(); gtk::init().expect("failed to init gtk"); gst::init().expect("failed to init gstreamer"); gst4gtk::plugin_register_static().expect("Failed to register gstgtk4 plugin"); if let Err(err) = init_i18n() { - error!("Failed to initialize i18n {}", err); + tracing::error!("Failed to initialize i18n {}", err); } let res = gio::Resource::load(config::PKGDATADIR.to_owned() + "/authenticator.gresource") diff --git a/src/models/account.rs b/src/models/account.rs index c3bd565..1f694c9 100644 --- a/src/models/account.rs +++ b/src/models/account.rs @@ -1,10 +1,11 @@ use super::{ provider::{DiProvider, Provider}, - OTPMethod, OTPUri, + OTPMethod, OTPUri, RUNTIME, }; use crate::{ - models::{database, otp, Keyring}, + models::{database, keyring, otp}, schema::accounts, + utils::spawn_tokio_blocking, widgets::QRCodeData, }; use anyhow::{Context, Result}; @@ -177,8 +178,13 @@ impl Account { let db = database::connection(); let conn = db.get()?; - let token_id = Keyring::store(&format!("{} - {}", provider.name(), name), token) - .context("Failed to save token")?; + let label = format!("{} - {}", provider.name(), name); + let token_send = token.to_owned(); + let token_id = spawn_tokio_blocking(async move { + keyring::store(&label, &token_send) + .await + .context("Failed to save token") + })?; diesel::insert_into(accounts::table) .values(NewAccount { @@ -255,7 +261,12 @@ impl Account { let token = if let Some(t) = token { t.to_string() } else { - Keyring::token(token_id)?.context("Could not get item from keyring")? + let token_id = token_id.to_owned(); + spawn_tokio_blocking(async move { + keyring::token(&token_id) + .await? + .context("Could not get item from keyring") + })? }; account.imp().token.set(token).unwrap(); account.generate_otp(); @@ -288,7 +299,7 @@ impl Account { let label = match otp_password { Ok(password) => password, Err(err) => { - warn!("Failed to generate the OTP {}", err); + tracing::warn!("Failed to generate the OTP {}", err); "Error".to_string() } }; @@ -402,9 +413,9 @@ impl Account { pub fn delete(&self) -> Result<()> { let token_id = self.token_id(); - std::thread::spawn(move || { - if let Err(err) = Keyring::remove_token(&token_id) { - error!("Failed to remove the token from secret service {}", err); + RUNTIME.spawn(async move { + if let Err(err) = keyring::remove_token(&token_id).await { + tracing::error!("Failed to remove the token from secret service {}", err); } }); let db = database::connection(); diff --git a/src/models/database.rs b/src/models/database.rs index 5ae5fe6..5245783 100644 --- a/src/models/database.rs +++ b/src/models/database.rs @@ -15,7 +15,7 @@ pub(crate) fn connection() -> Pool { } fn run_migration_on(connection: &SqliteConnection) -> Result<()> { - info!("Running DB Migrations..."); + tracing::info!("Running DB Migrations..."); embedded_migrations::run_with_output(connection, &mut std::io::stdout()).map_err(From::from) } @@ -33,6 +33,6 @@ fn init_pool() -> Result { let db = pool.get()?; run_migration_on(&*db)?; } - info!("Database pool initialized."); + tracing::info!("Database pool initialized."); Ok(pool) } diff --git a/src/models/keyring.rs b/src/models/keyring.rs index 767c8b7..0713f82 100644 --- a/src/models/keyring.rs +++ b/src/models/keyring.rs @@ -1,14 +1,9 @@ use crate::config; -use once_cell::sync::Lazy; -use secret_service::{Collection, EncryptionType, Error, SecretService}; +use once_cell::sync::OnceCell; +use rand::RngCore; use std::collections::HashMap; -static SECRET_SERVICE: Lazy> = Lazy::new(|| { - SecretService::new(EncryptionType::Dh) - .expect("A running secret-service is required for Authenticator") -}); - -pub struct Keyring; +pub static SECRET_SERVICE: OnceCell = OnceCell::new(); fn token_attributes(token_id: &str) -> HashMap<&str, &str> { let mut attributes = HashMap::new(); @@ -25,135 +20,94 @@ fn password_attributes() -> HashMap<&'static str, &'static str> { attributes } -fn random_salt() -> [u8; 64] { - use rand::RngCore; - +fn encode_argon2(secret: &str) -> anyhow::Result { + let password = secret.as_bytes(); let mut salt = [0u8; 64]; rand::thread_rng().fill_bytes(&mut salt); - salt -} - -fn encode_argon2(secret: &str) -> anyhow::Result { - use argon2::Config; - - let password = secret.as_bytes(); - let salt = &random_salt(); - let config = Config::default(); - let hash = argon2::hash_encoded(password, salt, &config)?; + let config = argon2::Config::default(); + let hash = argon2::hash_encoded(password, &salt, &config)?; Ok(hash) } -/// Verifies that the hash generated by `password` corresponds -/// to `hash`. -fn verify_argon2(hash: &str, password: &str) -> anyhow::Result { - Ok(argon2::verify_encoded(hash, password.as_bytes())?) +pub async fn store(label: &str, token: &str) -> anyhow::Result { + let token_id = encode_argon2(token)?; + let attributes = token_attributes(&token_id); + let base64_encoded_token = hex::encode(token.as_bytes()); + SECRET_SERVICE + .get() + .unwrap() + .create_item(label, attributes, base64_encoded_token.as_bytes(), true) + .await?; + Ok(token_id) } -impl Keyring { - pub fn get_default_collection<'a>() -> Result, Error> { - let collection = match SECRET_SERVICE.get_default_collection() { - Err(Error::NoResult) => SECRET_SERVICE.create_collection("default", "default"), - e => e, - }?; +pub async fn token(token_id: &str) -> anyhow::Result> { + let attributes = token_attributes(token_id); + let items = SECRET_SERVICE + .get() + .unwrap() + .search_items(attributes) + .await?; + Ok(match items.get(0) { + Some(e) => Some(String::from_utf8(hex::decode(&*e.secret().await?).unwrap()).unwrap()), + _ => None, + }) +} - Ok(collection) +pub async fn remove_token(token_id: &str) -> anyhow::Result<()> { + let attributes = token_attributes(token_id); + SECRET_SERVICE.get().unwrap().delete(attributes).await?; + Ok(()) +} + +pub async fn has_set_password() -> anyhow::Result { + let attributes = password_attributes(); + match SECRET_SERVICE.get().unwrap().search_items(attributes).await { + Ok(items) => Ok(matches!(items.get(0), Some(_))), + _ => Ok(false), } +} - pub fn ensure_unlocked() -> Result<(), Error> { - let collection = Self::get_default_collection()?; - collection.unlock()?; - - Ok(()) - } - - pub fn store(label: &str, token: &str) -> anyhow::Result { - let col = Self::get_default_collection()?; - let token_id = encode_argon2(token)?; - let attributes = token_attributes(&token_id); - let base64_encoded_token = hex::encode(token.as_bytes()); - col.create_item( - label, - attributes, - base64_encoded_token.as_bytes(), - true, - "text/plain", - )?; - Ok(token_id) - } - - pub fn token(token_id: &str) -> Result, Error> { - let col = Self::get_default_collection()?; - - let attributes = token_attributes(token_id); - let items = col.search_items(attributes)?; - Ok(match items.get(0) { - Some(e) => Some(String::from_utf8(hex::decode(e.get_secret()?).unwrap()).unwrap()), - _ => None, - }) - } - - pub fn remove_token(token_id: &str) -> Result<(), Error> { - let col = Self::get_default_collection()?; - - let attributes = token_attributes(token_id); - let items = col.search_items(attributes)?; - match items.get(0) { - Some(e) => e.delete(), - _ => Err(Error::NoResult), - } - } - - pub fn has_set_password() -> Result { - let col = Self::get_default_collection()?; - - let attributes = password_attributes(); - match col.search_items(attributes) { - Ok(items) => Ok(matches!(items.get(0), Some(_))), - _ => Ok(false), - } - } - - /// Stores password using the Argon2 algorithm with a random 128bit salt. - pub fn set_password(password: &str) -> anyhow::Result<()> { - let col = Self::get_default_collection()?; - - let encoded_password = encode_argon2(password)?; - let attributes = password_attributes(); - col.create_item( +/// Stores password using the Argon2 algorithm with a random 128bit salt. +pub async fn set_password(password: &str) -> anyhow::Result<()> { + let encoded_password = encode_argon2(password)?; + let attributes = password_attributes(); + SECRET_SERVICE + .get() + .unwrap() + .create_item( "Authenticator password", attributes, encoded_password.as_bytes(), true, - "plain", - )?; - Ok(()) - } - - pub fn reset_password() -> Result<(), Error> { - let col = Self::get_default_collection()?; - - let attributes = password_attributes(); - let items = col.search_items(attributes)?; - - match items.get(0) { - Some(i) => i.delete(), - None => Err(Error::NoResult), - } - } - - pub fn is_current_password(password: &str) -> anyhow::Result { - let col = Self::get_default_collection()?; - - let attributes = password_attributes(); - let items = col.search_items(attributes)?; - Ok(match items.get(0) { - Some(i) => { - let secret = &i.get_secret()?; - let stored_pass = std::str::from_utf8(secret)?; - verify_argon2(stored_pass, password)? - } - None => false, - }) - } + ) + .await?; + Ok(()) +} + +pub async fn reset_password() -> anyhow::Result<()> { + let attributes = password_attributes(); + SECRET_SERVICE.get().unwrap().delete(attributes).await?; + Ok(()) +} + +pub async fn is_current_password(password: &str) -> anyhow::Result { + let attributes = password_attributes(); + let items = SECRET_SERVICE + .get() + .unwrap() + .search_items(attributes) + .await?; + Ok(match items.get(0) { + Some(i) => { + // Verifies that the hash generated by `password` corresponds + // to `hash`. + argon2::verify_encoded( + &String::from_utf8_lossy(&*i.secret().await?), + password.as_bytes(), + )? + } + None => false, + }) } diff --git a/src/models/mod.rs b/src/models/mod.rs index f17ad5a..d102385 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -5,7 +5,7 @@ mod accounts; mod algorithm; pub mod database; pub mod i18n; -mod keyring; +pub mod keyring; pub mod otp; mod otp_uri; mod provider; @@ -25,7 +25,7 @@ pub use self::{ account_sorter::AccountSorter, accounts::AccountsModel, algorithm::{Algorithm, OTPMethod}, - keyring::Keyring, + keyring::SECRET_SERVICE, otp_uri::OTPUri, provider::{Provider, ProviderPatch}, provider_sorter::ProviderSorter, diff --git a/src/models/provider.rs b/src/models/provider.rs index ebcd768..1c871b3 100644 --- a/src/models/provider.rs +++ b/src/models/provider.rs @@ -381,7 +381,7 @@ impl Provider { ) -> Result> { let website_url = Url::parse(&website)?; let favicon = favicon_scrapper::Scrapper::from_url(website_url).await?; - log::debug!("Found the following icons {:#?} for {}", favicon, name); + tracing::debug!("Found the following icons {:#?} for {}", favicon, name); let icon_name = format!("{}_{}", id, name.replace(' ', "_")); let icon_name = glib::base64_encode(icon_name.as_bytes()); @@ -392,15 +392,15 @@ impl Provider { // - 32x32 for the accounts lists // - 96x96 elsewhere if let Some(best_favicon) = favicon.find_best().await { - log::debug!("Largest favicon found is {:#?}", best_favicon); + tracing::debug!("Largest favicon found is {:#?}", best_favicon); let cache_path = FAVICONS_PATH.join(&*icon_name); best_favicon.save(cache_path.clone()).await?; // Don't try to scale down svg variants if !best_favicon.metadata().format().is_svg() { - log::debug!("Creating scaled down variants for {:#?}", cache_path); + tracing::debug!("Creating scaled down variants for {:#?}", cache_path); { let pixbuf = gdk_pixbuf::Pixbuf::from_file(cache_path.clone())?; - log::debug!("Creating a 32x32 variant of the favicon"); + tracing::debug!("Creating a 32x32 variant of the favicon"); let small_pixbuf = pixbuf .scale_simple(32, 32, gdk_pixbuf::InterpType::Bilinear) .unwrap(); @@ -409,7 +409,7 @@ impl Provider { small_cache.set_file_name(small_icon_name); small_pixbuf.savev(small_cache.clone(), "png", &[])?; - log::debug!("Creating a 96x96 variant of the favicon"); + tracing::debug!("Creating a 96x96 variant of the favicon"); let large_pixbuf = pixbuf .scale_simple(96, 96, gdk_pixbuf::InterpType::Bilinear) .unwrap(); diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..8db44cd --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,29 @@ +use crate::models::RUNTIME; + +pub fn spawn_tokio_blocking(fut: F) -> F::Output +where + F: std::future::Future + Send + 'static, + F::Output: Send + 'static, +{ + let (sender, receiver) = tokio::sync::oneshot::channel(); + + RUNTIME.spawn(async { + let response = fut.await; + sender.send(response) + }); + receiver.blocking_recv().unwrap() +} + +pub async fn spawn_tokio(fut: F) -> F::Output +where + F: std::future::Future + Send + 'static, + F::Output: Send + 'static, +{ + let (sender, receiver) = tokio::sync::oneshot::channel(); + + RUNTIME.spawn(async { + let response = fut.await; + sender.send(response) + }); + receiver.await.unwrap() +} diff --git a/src/widgets/accounts/add.rs b/src/widgets/accounts/add.rs index 4824b43..21d1930 100644 --- a/src/widgets/accounts/add.rs +++ b/src/widgets/accounts/add.rs @@ -154,7 +154,7 @@ impl AccountAddDialog { fn scan_from_screenshot(&self) { spawn!(clone!(@weak self as page => async move { if let Err(err) = page.imp().camera.from_screenshot().await { - log::error!("Failed to scan from screenshot {}", err); + tracing::error!("Failed to scan from screenshot {}", err); } })); } diff --git a/src/widgets/accounts/details.rs b/src/widgets/accounts/details.rs index 4f65369..81b44d4 100644 --- a/src/widgets/accounts/details.rs +++ b/src/widgets/accounts/details.rs @@ -84,7 +84,7 @@ mod imp { }); klass.install_action("account.save", None, move |page, _, _| { if let Err(err) = page.save() { - log::error!("Failed to save account details {}", err); + tracing::error!("Failed to save account details {}", err); } }); diff --git a/src/widgets/accounts/row.rs b/src/widgets/accounts/row.rs index 0140515..a815e6a 100644 --- a/src/widgets/accounts/row.rs +++ b/src/widgets/accounts/row.rs @@ -47,7 +47,7 @@ mod imp { klass.install_action("account.increment-counter", None, move |row, _, _| { match row.account().increment_counter() { Ok(_) => row.account().generate_otp(), - Err(err) => log::error!("Failed to increment the counter {err}"), + Err(err) => tracing::error!("Failed to increment the counter {err}"), }; }); } diff --git a/src/widgets/camera.rs b/src/widgets/camera.rs index 1574587..e6eac42 100644 --- a/src/widgets/camera.rs +++ b/src/widgets/camera.rs @@ -159,7 +159,7 @@ impl Camera { fn set_state(&self, state: CameraState) { let imp = self.imp(); - info!("The camera state changed to {:#?}", state); + tracing::info!("The camera state changed to {:#?}", state); match state { CameraState::NotFound => { imp.stack.set_visible_child_name("not-found"); @@ -199,13 +199,13 @@ impl Camera { Ok(Some((stream_fd, node_id))) => { match camera.imp().paintable.set_pipewire_node_id(stream_fd, node_id) { Ok(_) => camera.start(), - Err(err) => log::error!("Failed to start the camera stream {err}"), + Err(err) => tracing::error!("Failed to start the camera stream {err}"), }; }, Ok(None) => { camera.set_state(CameraState::NotFound); } - Err(e) => log::error!("Failed to stream {}", e), + Err(e) => tracing::error!("Failed to stream {}", e), } })); } diff --git a/src/widgets/camera_paintable.rs b/src/widgets/camera_paintable.rs index 5593716..c466c09 100644 --- a/src/widgets/camera_paintable.rs +++ b/src/widgets/camera_paintable.rs @@ -11,6 +11,7 @@ use gtk::{ }; use gtk_macros::send; use once_cell::sync::Lazy; +use tracing::error; static PIPELINE_NAME: Lazy = Lazy::new(|| glib::GString::from("camera")); /// Fancy Camera with QR code detection using ZBar /// @@ -125,16 +126,16 @@ impl CameraPaintable { pipewire_element.set_property("fd", &raw_fd); if let Some(node_id) = node_id { pipewire_element.set_property("path", &node_id.to_string()); - log::debug!("Loading PipeWire Node ID: {} with FD: {}", node_id, raw_fd); + tracing::debug!("Loading PipeWire Node ID: {} with FD: {}", node_id, raw_fd); } else { - log::debug!("Loading PipeWire with FD: {}", raw_fd); + tracing::debug!("Loading PipeWire with FD: {}", raw_fd); } self.init_pipeline(pipewire_element)?; Ok(()) } fn init_pipeline(&self, pipewire_src: gst::Element) -> anyhow::Result<()> { - log::debug!("Init pipeline"); + tracing::debug!("Init pipeline"); let imp = self.imp(); let pipeline = gst::Pipeline::new(None); @@ -187,7 +188,7 @@ impl CameraPaintable { let sender = paintable.imp().sender.borrow().as_ref().unwrap().clone(); match msg.view() { MessageView::Error(err) => { - log::error!( + tracing::error!( "Error from {:?}: {} ({:?})", err.src().map(|s| s.path_string()), err.error(), @@ -222,10 +223,10 @@ impl CameraPaintable { } pub fn close_pipeline(&self) { - log::debug!("Closing pipeline"); + tracing::debug!("Closing pipeline"); if let Some(pipeline) = self.imp().pipeline.borrow_mut().take() { if let Err(err) = pipeline.set_state(gst::State::Null) { - log::error!("Failed to close the pipeline: {err}"); + tracing::error!("Failed to close the pipeline: {err}"); } } } @@ -233,7 +234,7 @@ impl CameraPaintable { pub fn start(&self) { if let Some(pipeline) = &*self.imp().pipeline.borrow() { if let Err(err) = pipeline.set_state(gst::State::Playing) { - log::error!("Failed to start the camera stream: {err}"); + tracing::error!("Failed to start the camera stream: {err}"); } } } @@ -241,7 +242,7 @@ impl CameraPaintable { pub fn stop(&self) { if let Some(pipeline) = &*self.imp().pipeline.borrow() { if let Err(err) = pipeline.set_state(gst::State::Null) { - log::error!("Failed to stop the camera stream: {err}"); + tracing::error!("Failed to stop the camera stream: {err}"); } } } diff --git a/src/widgets/preferences/password_page.rs b/src/widgets/preferences/password_page.rs index 641566f..50326c1 100644 --- a/src/widgets/preferences/password_page.rs +++ b/src/widgets/preferences/password_page.rs @@ -1,4 +1,4 @@ -use crate::{config, models::Keyring, widgets::ErrorRevealer}; +use crate::{config, models::keyring, utils::spawn_tokio, widgets::ErrorRevealer}; use gettextrs::gettext; use glib::clone; use gtk::{gio, glib, prelude::*, subclass::prelude::*, CompositeTemplate}; @@ -178,7 +178,10 @@ impl PasswordPage { actions, "save_password", clone!(@weak self as page => move |_, _| { - page.save(); + let ctx = glib::MainContext::default(); + ctx.spawn_local(clone!(@weak page => async move { + page.save().await; + })); }) ); @@ -186,7 +189,10 @@ impl PasswordPage { actions, "reset_password", clone!(@weak self as page => move |_,_| { - page.reset_password(); + let ctx = glib::MainContext::default(); + ctx.spawn_local(clone!(@weak page => async move { + page.reset_password().await; + })); }) ); get_action!(actions, @save_password).set_enabled(false); @@ -200,18 +206,23 @@ impl PasswordPage { .build(); } - fn reset_password(&self) { + async fn reset_password(&self) { let imp = self.imp(); let current_password = imp.current_password_entry.text(); - - if self.has_set_password() - && !Keyring::is_current_password(¤t_password).unwrap_or(false) - { + let is_current_password = + spawn_tokio(async move { keyring::is_current_password(¤t_password).await }) + .await + .unwrap_or(false); + if self.has_set_password() && !is_current_password { imp.error_revealer.popup(&gettext("Wrong Passphrase")); return; } - if Keyring::reset_password().is_ok() { + + let password_was_reset = + spawn_tokio(async move { keyring::reset_password().await.is_ok() }).await; + + if password_was_reset { let imp = self.imp(); let actions = imp.actions.get().unwrap(); @@ -229,21 +240,26 @@ impl PasswordPage { imp.confirm_password_entry.get().set_text(""); } - fn save(&self) { + async fn save(&self) { let imp = self.imp(); let actions = imp.actions.get().unwrap(); let current_password = imp.current_password_entry.text(); let password = imp.password_entry.text(); + let is_current_password = spawn_tokio(async move { + keyring::is_current_password(¤t_password) + .await + .unwrap_or(false) + }) + .await; - if self.has_set_password() - && !Keyring::is_current_password(¤t_password).unwrap_or(false) - { + if self.has_set_password() && is_current_password { imp.error_revealer.popup(&gettext("Wrong Passphrase")); return; } - - if Keyring::set_password(&password).is_ok() { + let password_was_set = + spawn_tokio(async move { keyring::set_password(&password).await.is_ok() }).await; + if password_was_set { self.reset(); get_action!(actions, @save_password).set_enabled(false); self.set_has_set_password(true); diff --git a/src/widgets/preferences/window.rs b/src/widgets/preferences/window.rs index fee50d7..8303a85 100644 --- a/src/widgets/preferences/window.rs +++ b/src/widgets/preferences/window.rs @@ -256,7 +256,7 @@ impl PreferencesWindow { win.encyption_key(Operation::Backup, &T::identifier()) }).flatten(); if let Err(err) = T::backup(&model, &d.file().unwrap(), key.as_deref()) { - warn!("Failed to create a backup {}", err); + tracing::warn!("Failed to create a backup {}", err); } } d.destroy(); @@ -325,7 +325,7 @@ impl PreferencesWindow { win.restore_items::(items); }, Err(err) => { - warn!("Failed to parse the selected file {}", err); + tracing::warn!("Failed to parse the selected file {}", err); } } } @@ -355,7 +355,7 @@ impl PreferencesWindow { .filter(Result::is_ok) .for_each(|item| { if let Err(err) = item { - warn!("Failed to restore item {}", err); + tracing::warn!("Failed to restore item {}", err); } }); self.emit_by_name::<()>("restore-completed", &[]); diff --git a/src/widgets/providers/image.rs b/src/widgets/providers/image.rs index b1d6b04..3beef94 100644 --- a/src/widgets/providers/image.rs +++ b/src/widgets/providers/image.rs @@ -3,6 +3,7 @@ use crate::models::{Provider, FAVICONS_PATH}; use glib::{clone, Receiver, Sender}; use gtk::{gio, glib, prelude::*, subclass::prelude::*, CompositeTemplate}; use gtk_macros::send; +use tracing::error; pub enum ImageAction { Ready(String), @@ -205,7 +206,7 @@ impl ProviderImage { sender.send(Some(cache_name)).unwrap(); } Err(err) => { - log::error!("Failed to load favicon {}", err); + tracing::error!("Failed to load favicon {}", err); sender.send(None).unwrap(); } }; @@ -223,7 +224,7 @@ impl ProviderImage { send!(imp.sender.clone(), ImageAction::Failed); }, Err(_) => { - log::debug!("Provider image fetching aborted"); + tracing::debug!("Provider image fetching aborted"); } }; })); @@ -283,7 +284,7 @@ impl ProviderImage { if let Some(provider) = self.provider() { let guard = provider.freeze_notify(); if let Err(err) = provider.set_image_uri(&image_path) { - warn!("Failed to update provider image {}", err); + tracing::warn!("Failed to update provider image {}", err); } drop(guard); } diff --git a/src/widgets/providers/page.rs b/src/widgets/providers/page.rs index 800857d..00e82fc 100644 --- a/src/widgets/providers/page.rs +++ b/src/widgets/providers/page.rs @@ -103,12 +103,12 @@ mod imp { klass.install_action("providers.save", None, move |page, _, _| { if let Err(err) = page.save() { - warn!("Failed to save provider {}", err); + tracing::warn!("Failed to save provider {}", err); } }); klass.install_action("providers.delete", None, move |page, _, _| { if let Err(err) = page.delete_provider() { - warn!("Failed to delete the provider {}", err); + tracing::warn!("Failed to delete the provider {}", err); } }); @@ -268,13 +268,13 @@ impl ProviderPage { // Create a 96x96 & 32x32 variants let stream = file.read(gio::Cancellable::NONE)?; let pixbuf = gdk_pixbuf::Pixbuf::from_stream(&stream, gio::Cancellable::NONE)?; - log::debug!("Creating a 32x32 variant of the selected favicon"); + tracing::debug!("Creating a 32x32 variant of the selected favicon"); let small_pixbuf = pixbuf .scale_simple(32, 32, gdk_pixbuf::InterpType::Bilinear) .unwrap(); small_pixbuf.savev(FAVICONS_PATH.join(small_icon_name), "png", &[])?; - log::debug!("Creating a 96x96 variant of the selected favicon"); + tracing::debug!("Creating a 96x96 variant of the selected favicon"); let large_pixbuf = pixbuf .scale_simple(96, 96, gdk_pixbuf::InterpType::Bilinear) .unwrap(); diff --git a/src/widgets/window.rs b/src/widgets/window.rs index 41b43f4..c23bb6d 100644 --- a/src/widgets/window.rs +++ b/src/widgets/window.rs @@ -1,7 +1,8 @@ use crate::{ application::Application, config, - models::{Account, Keyring, OTPUri, ProvidersModel}, + models::{keyring, Account, OTPUri, ProvidersModel}, + utils::spawn_tokio_blocking, widgets::{ accounts::AccountDetailsPage, providers::{ProvidersList, ProvidersListView}, @@ -247,7 +248,7 @@ impl Window { // save window state on delete event self.connect_close_request(move |window| { if let Err(err) = window.save_window_state() { - warn!("Failed to save window state {:#?}", err); + tracing::warn!("Failed to save window state {:#?}", err); } Inhibit(false) }); @@ -326,10 +327,11 @@ impl Window { "unlock", clone!(@weak self as win, @weak password_entry, @weak app => move |_, _| { let password = password_entry.text(); - let is_current_password = Keyring::is_current_password(&password).unwrap_or_else(|err| { - debug!("Could not verify password: {:?}", err); + let is_current_password = spawn_tokio_blocking(async move { + keyring::is_current_password(&password).await.unwrap_or_else(|err| { + tracing::debug!("Could not verify password: {:?}", err); false - }); + })}); if is_current_password { password_entry.set_text(""); app.set_locked(false);