From e6d3329f6f72fd39c998bd73f8ef95f59dbf8371 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Wed, 15 Nov 2023 20:10:40 +0100
Subject: [PATCH 01/13] sqlx v0.7.x
---
Cargo.lock | 642 ++---
Cargo.toml | 2 +-
...1be5d26cb26924d53dc5a68ee4ea48d6bbbfd.json | 12 +
...4df7006c1fde2faaca0f7952a009d6cda90a3.json | 12 +
...3b4c594f373084c73000bc7865a280df74fdd.json | 62 +
...ae5c3f58b57b222ba4333216b5c50c3c58c71.json | 12 +
...01361b6f97c552d6af8477da12cddb03d4865.json | 12 +
...25fd68743ae30d1ec0b0ca5c7dfc367fdf357.json | 12 +
...0c1bf690f40b6cc6ec5f008eb0e928f376659.json | 12 +
...1591e0f35eab7211692bcde8230c68e4cedf3.json | 12 +
...5bd8ee5d50331d94abeee076ae4db46215a56.json | 98 +
...488e75d20c1c436a3ba2c5aa3f54da62fe861.json | 62 +
...cb320fb51fd2e53ed25054d24e9801df0c358.json | 12 +
...60da940bdab3c87690ee42569ae3da1a8e791.json | 12 +
...202be5129c74a5569b2dc7bf95761fe09a6a3.json | 32 +
...5eebd144cf020e9230d154e9e4d0c8d6e01ca.json | 12 +
...a3b89948ee6ac5116e442faef8512c1a615c0.json | 12 +
...15a0092355e120c5cbe006c877afdfc4a4e8c.json | 12 +
...202be315c42dfc820d3c37bba498b1b783811.json | 98 +
...4c7d0ce930da5d841b9d788a9c0e84b580bc6.json | 44 +
...3d1477ad7e4e983b61ede013e5b066940eb5c.json | 12 +
...1a89d96383e28b15186576f90ff59f309196c.json | 12 +
...f07d2c863a93fff693aec1b47378c44bf77de.json | 38 +
...d1592cbc5180abbba6d5abd44326bf0862669.json | 44 +
...c50676ec21cf94e2e50e18f9279c91e6b85c8.json | 12 +
...e85c5a012d71cd745494049a8d9bebab3ed61.json | 12 +
...daf48204274ab62d73ec8968bcd0c7568b157.json | 12 +
...8b4ac09c371af689c444eb439a37f91ecf7a5.json | 12 +
...3b87de0dcb78316628d48f0e6efc0f8103040.json | 12 +
...8f999fc55a6fb8ad4abe7af89ec52e0d10a0e.json | 12 +
...7f3109a07a1ca193cb3082d13687af65c6de0.json | 12 +
...f599728b74e545df3e986e3e7e66882f73ba0.json | 98 +
...dbccc0dd4d12ebcb933024d9867f07bba3eb8.json | 32 +
...302731b3ff82da99ba7771c2728d88aee642a.json | 12 +
...cc25482cef1a57ba4c467fa0bc0fdf25bf39c.json | 12 +
...9754908b1c173e9dce383663d723891a89cd1.json | 12 +
...786b85f23b9638d1c7eaa7b633c052703c911.json | 12 +
...e2c3ffbc590c0f305ff5a8f44350fba3eaec7.json | 32 +
...fde26d6d36b8c8de9935179d41f6c7c755978.json | 12 +
...145baf72b3361f43e4127350a14a183ef63f7.json | 12 +
...5b68d2311c5ae05c1e18db43424c8ed2f2e4e.json | 98 +
...29477c2746765f6e7d5679058ec6525ee7253.json | 38 +
...489b29b2a61b9f73f6ca4b5df7e9fb9bccf90.json | 98 +
...bb7cad49c91bfe7f084d8c25c6c571673ab90.json | 12 +
...9559428be9d0d59df6409ca9ec7cd728f6001.json | 44 +
...7f3dfcf0fe7a30364b1fb57c3e6b757093578.json | 12 +
...0f0dafc78a0e8b69221dee4715f84841839da.json | 12 +
...7363290640b3af7d177a024cad06220a770f0.json | 32 +
...5ba76d7efa1677bfe8291a62b8cbf9cd9e0d5.json | 12 +
...33d4ff1c2e250b2d103d8500fae203fb18a6d.json | 56 +
...41004f988e683d28df2f533ff6272bc71b356.json | 12 +
...7975921c79aef8fcd6d15a4d63c10f2377d24.json | 12 +
...03c50bc90daed80ee2df1fd0dc1d9d2c67b26.json | 12 +
...e6c2210f583cddb0d478075f78124258712dd.json | 12 +
...5eca82d816650fabe65464e2059d5908d8a28.json | 12 +
...93646319950334494ecb5fa7effe9806d07ab.json | 50 +
...91faff7e3668204a179e827a87d6279a02c40.json | 12 +
...5198a1ddd775cd1bda10f6e4a8acfbca64b72.json | 12 +
...91ce94d1df9fa1ccd65b549be92d16741f9d2.json | 98 +
...89800509d94f3a858be99fb7ce8c8bc05d8b7.json | 98 +
...d0dedf4776f73e7a86f19e06772a0adf83406.json | 50 +
...6b7b9723258f4051bce8287038e3dd1ac928a.json | 44 +
...ec1ac248865810cafafd5d78d6cc3f74d5237.json | 98 +
...2f676dce0f67275466566d5bbedf0f4b7f4f5.json | 62 +
...b4a5f13a09cece9ec78e0b6e018950c91facb.json | 62 +
...2d3c547634e2b608d6be91814bce657e07b65.json | 20 +
...bad4bdf22760d431265cf97b911e6456b2fd8.json | 62 +
...4a91a129a0173fbbc3e2536f52d41e8dc99c4.json | 62 +
...63538d29d75c57b67d5eac1ac4ceaa1472a5c.json | 12 +
...526e68fb3d88a1feb28bdafb414e990da55e8.json | 12 +
...2262ac4c0a8fc0921fbd934d2b98146d3f413.json | 12 +
...25216693532c7233a3bf61674b64c2fb3dad7.json | 62 +
crates/database/Cargo.toml | 2 +-
crates/database/sqlx-data.json | 2129 -----------------
74 files changed, 2623 insertions(+), 2418 deletions(-)
create mode 100644 crates/database/.sqlx/query-06cfa74715f3725e99e63aa206f1be5d26cb26924d53dc5a68ee4ea48d6bbbfd.json
create mode 100644 crates/database/.sqlx/query-0b60c7829e95dde4145b7f207b64df7006c1fde2faaca0f7952a009d6cda90a3.json
create mode 100644 crates/database/.sqlx/query-13c26aaf556d259535afb95f5c53b4c594f373084c73000bc7865a280df74fdd.json
create mode 100644 crates/database/.sqlx/query-184d704e75f00513082dd2c6cc3ae5c3f58b57b222ba4333216b5c50c3c58c71.json
create mode 100644 crates/database/.sqlx/query-1e2edc8cf28832344dbfa0878ac01361b6f97c552d6af8477da12cddb03d4865.json
create mode 100644 crates/database/.sqlx/query-2d562e7b19d7d8303a0e79d143d25fd68743ae30d1ec0b0ca5c7dfc367fdf357.json
create mode 100644 crates/database/.sqlx/query-2ee77458d93ae79d957e03e6ca50c1bf690f40b6cc6ec5f008eb0e928f376659.json
create mode 100644 crates/database/.sqlx/query-32d35bdd1f4cf64ce0ff7beb7a11591e0f35eab7211692bcde8230c68e4cedf3.json
create mode 100644 crates/database/.sqlx/query-37000307a757b4912ca300c346b5bd8ee5d50331d94abeee076ae4db46215a56.json
create mode 100644 crates/database/.sqlx/query-37681902a5f5d87492812a525a6488e75d20c1c436a3ba2c5aa3f54da62fe861.json
create mode 100644 crates/database/.sqlx/query-3c8e31ffa5cbfd4dded8a272777cb320fb51fd2e53ed25054d24e9801df0c358.json
create mode 100644 crates/database/.sqlx/query-44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791.json
create mode 100644 crates/database/.sqlx/query-46caa546db24d2c1e8192f9e699202be5129c74a5569b2dc7bf95761fe09a6a3.json
create mode 100644 crates/database/.sqlx/query-520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca.json
create mode 100644 crates/database/.sqlx/query-52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0.json
create mode 100644 crates/database/.sqlx/query-545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c.json
create mode 100644 crates/database/.sqlx/query-5567f75b47f739e85da3469bec0202be315c42dfc820d3c37bba498b1b783811.json
create mode 100644 crates/database/.sqlx/query-56a9c0dff010858189a95087d014c7d0ce930da5d841b9d788a9c0e84b580bc6.json
create mode 100644 crates/database/.sqlx/query-58e0626629a768c33783bbc926c3d1477ad7e4e983b61ede013e5b066940eb5c.json
create mode 100644 crates/database/.sqlx/query-5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c.json
create mode 100644 crates/database/.sqlx/query-5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de.json
create mode 100644 crates/database/.sqlx/query-5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669.json
create mode 100644 crates/database/.sqlx/query-62c75412f673f6a293b0d188d79c50676ec21cf94e2e50e18f9279c91e6b85c8.json
create mode 100644 crates/database/.sqlx/query-645f583812c4d71570d1e84b866e85c5a012d71cd745494049a8d9bebab3ed61.json
create mode 100644 crates/database/.sqlx/query-657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157.json
create mode 100644 crates/database/.sqlx/query-68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5.json
create mode 100644 crates/database/.sqlx/query-693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040.json
create mode 100644 crates/database/.sqlx/query-6fa3c48b9e93fb9ec6807f7547a8f999fc55a6fb8ad4abe7af89ec52e0d10a0e.json
create mode 100644 crates/database/.sqlx/query-6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0.json
create mode 100644 crates/database/.sqlx/query-71c74369dc5d374d8ec5aa347b5f599728b74e545df3e986e3e7e66882f73ba0.json
create mode 100644 crates/database/.sqlx/query-73bdbde04fca37f2411e7a9e1b6dbccc0dd4d12ebcb933024d9867f07bba3eb8.json
create mode 100644 crates/database/.sqlx/query-7b7f2430b2a719b3d5ce504c0a9302731b3ff82da99ba7771c2728d88aee642a.json
create mode 100644 crates/database/.sqlx/query-7f26b73408318040f94fb6574d5cc25482cef1a57ba4c467fa0bc0fdf25bf39c.json
create mode 100644 crates/database/.sqlx/query-87906834faa6f185aee0e4d893b9754908b1c173e9dce383663d723891a89cd1.json
create mode 100644 crates/database/.sqlx/query-8c131e1f73ffa01fc3e5e08071a786b85f23b9638d1c7eaa7b633c052703c911.json
create mode 100644 crates/database/.sqlx/query-8c37375b0694df02b7f1b6678e4e2c3ffbc590c0f305ff5a8f44350fba3eaec7.json
create mode 100644 crates/database/.sqlx/query-93b15a942a6c7db595990f00e14fde26d6d36b8c8de9935179d41f6c7c755978.json
create mode 100644 crates/database/.sqlx/query-9784afe2dcff4db86908175d4e3145baf72b3361f43e4127350a14a183ef63f7.json
create mode 100644 crates/database/.sqlx/query-979c7ba41dac5ea5593fc169ea95b68d2311c5ae05c1e18db43424c8ed2f2e4e.json
create mode 100644 crates/database/.sqlx/query-9a3aef02e55fc436e9c09c1ee6d29477c2746765f6e7d5679058ec6525ee7253.json
create mode 100644 crates/database/.sqlx/query-9dc379b0f3a3c944a33ef01dc40489b29b2a61b9f73f6ca4b5df7e9fb9bccf90.json
create mode 100644 crates/database/.sqlx/query-9f1885c4786f73335b4d614f562bb7cad49c91bfe7f084d8c25c6c571673ab90.json
create mode 100644 crates/database/.sqlx/query-a0dd1ddcc7d58fad78ed6c5027a9559428be9d0d59df6409ca9ec7cd728f6001.json
create mode 100644 crates/database/.sqlx/query-a2bf546b2cf6a53a3a127c08fbb7f3dfcf0fe7a30364b1fb57c3e6b757093578.json
create mode 100644 crates/database/.sqlx/query-a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da.json
create mode 100644 crates/database/.sqlx/query-a9e910eedc27c495262571520627363290640b3af7d177a024cad06220a770f0.json
create mode 100644 crates/database/.sqlx/query-aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5.json
create mode 100644 crates/database/.sqlx/query-adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d.json
create mode 100644 crates/database/.sqlx/query-afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356.json
create mode 100644 crates/database/.sqlx/query-b3936ae237f02cc048ca084372f7975921c79aef8fcd6d15a4d63c10f2377d24.json
create mode 100644 crates/database/.sqlx/query-baaae9952348da17e2f4d099c6903c50bc90daed80ee2df1fd0dc1d9d2c67b26.json
create mode 100644 crates/database/.sqlx/query-c00e5fce25caebdeeb24db20880e6c2210f583cddb0d478075f78124258712dd.json
create mode 100644 crates/database/.sqlx/query-c28c88869239edc02c073f461645eca82d816650fabe65464e2059d5908d8a28.json
create mode 100644 crates/database/.sqlx/query-c3dcd38a2d4ff391aed4a2ac3f393646319950334494ecb5fa7effe9806d07ab.json
create mode 100644 crates/database/.sqlx/query-c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40.json
create mode 100644 crates/database/.sqlx/query-c724c273f9d99bde48c29d7a0e65198a1ddd775cd1bda10f6e4a8acfbca64b72.json
create mode 100644 crates/database/.sqlx/query-ca7d100a9440fb7854a27f9aafd91ce94d1df9fa1ccd65b549be92d16741f9d2.json
create mode 100644 crates/database/.sqlx/query-cf12bd3112b2047f263118649ba89800509d94f3a858be99fb7ce8c8bc05d8b7.json
create mode 100644 crates/database/.sqlx/query-cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406.json
create mode 100644 crates/database/.sqlx/query-d166553746afb2d3eaa1ddcb9986b7b9723258f4051bce8287038e3dd1ac928a.json
create mode 100644 crates/database/.sqlx/query-d6d3a401f5563ce339099ccbdedec1ac248865810cafafd5d78d6cc3f74d5237.json
create mode 100644 crates/database/.sqlx/query-d8517e5faa5292da25d21a85fcb2f676dce0f67275466566d5bbedf0f4b7f4f5.json
create mode 100644 crates/database/.sqlx/query-e22ba816faac0c17ca9f2c31fd1b4a5f13a09cece9ec78e0b6e018950c91facb.json
create mode 100644 crates/database/.sqlx/query-e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65.json
create mode 100644 crates/database/.sqlx/query-eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8.json
create mode 100644 crates/database/.sqlx/query-eb1a0153c88b0b2744ed1b71df04a91a129a0173fbbc3e2536f52d41e8dc99c4.json
create mode 100644 crates/database/.sqlx/query-ebe28f418d28303b2efe1fe192a63538d29d75c57b67d5eac1ac4ceaa1472a5c.json
create mode 100644 crates/database/.sqlx/query-ed27954feb3e21b5c519ccd0312526e68fb3d88a1feb28bdafb414e990da55e8.json
create mode 100644 crates/database/.sqlx/query-f705411720bd037562f7e3622832262ac4c0a8fc0921fbd934d2b98146d3f413.json
create mode 100644 crates/database/.sqlx/query-fb35faa6eb7349f783d0053509225216693532c7233a3bf61674b64c2fb3dad7.json
delete mode 100644 crates/database/sqlx-data.json
diff --git a/Cargo.lock b/Cargo.lock
index 77670a8..27d53ee 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -27,17 +27,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-[[package]]
-name = "ahash"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
-dependencies = [
- "getrandom",
- "once_cell",
- "version_check",
-]
-
[[package]]
name = "ahash"
version = "0.8.3"
@@ -45,6 +34,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
dependencies = [
"cfg-if",
+ "getrandom",
"once_cell",
"version_check",
]
@@ -154,9 +144,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",
]
@@ -245,6 +235,9 @@ name = "bitflags"
version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
+dependencies = [
+ "serde",
+]
[[package]]
name = "blake2"
@@ -405,9 +398,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]]
name = "cookie"
-version = "0.17.0"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
+checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8"
dependencies = [
"percent-encoding",
"time 0.3.23",
@@ -607,7 +600,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"
dependencies = [
"const-oid",
- "pem-rfc7468",
+ "pem-rfc7468 0.6.0",
+ "zeroize",
+]
+
+[[package]]
+name = "der"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+dependencies = [
+ "const-oid",
+ "pem-rfc7468 0.7.0",
"zeroize",
]
@@ -693,7 +697,7 @@ version = "0.14.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c"
dependencies = [
- "der",
+ "der 0.6.1",
"elliptic-curve",
"rfc6979",
"signature 1.6.4",
@@ -716,14 +720,14 @@ checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
dependencies = [
"base16ct",
"crypto-bigint",
- "der",
+ "der 0.6.1",
"digest",
"ff",
"generic-array",
"group",
"hkdf",
- "pem-rfc7468",
- "pkcs8",
+ "pem-rfc7468 0.6.0",
+ "pkcs8 0.9.0",
"rand_core",
"sec1",
"subtle",
@@ -789,7 +793,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -802,6 +806,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",
+]
+
[[package]]
name = "event-listener"
version = "2.5.3"
@@ -885,14 +900,14 @@ dependencies = [
[[package]]
name = "filetime"
-version = "0.2.21"
+version = "0.2.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153"
+checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.2.16",
- "windows-sys 0.48.0",
+ "redox_syscall",
+ "windows-sys",
]
[[package]]
@@ -907,13 +922,12 @@ dependencies = [
[[package]]
name = "flume"
-version = "0.10.14"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
+checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
dependencies = [
"futures-core",
"futures-sink",
- "pin-project",
"spin 0.9.8",
]
@@ -985,13 +999,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]]
@@ -1182,7 +1196,7 @@ version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
dependencies = [
- "ahash 0.8.3",
+ "ahash",
"allocator-api2",
]
@@ -1234,6 +1248,15 @@ dependencies = [
"digest",
]
+[[package]]
+name = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys",
+]
+
[[package]]
name = "hostname"
version = "0.3.1"
@@ -1427,6 +1450,7 @@ checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
dependencies = [
"equivalent",
"hashbrown 0.14.0",
+ "serde",
]
[[package]]
@@ -1478,7 +1502,7 @@ checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
"hermit-abi",
"libc",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1489,7 +1513,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi",
"rustix 0.38.3",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1602,11 +1626,11 @@ dependencies = [
"nom",
"once_cell",
"quoted_printable",
- "rustls 0.21.3",
+ "rustls",
"rustls-pemfile",
"socket2",
"tokio",
- "tokio-rustls 0.24.1",
+ "tokio-rustls",
"webpki-roots 0.23.1",
]
@@ -1624,9 +1648,9 @@ checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
[[package]]
name = "libsqlite3-sys"
-version = "0.24.2"
+version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14"
+checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326"
dependencies = [
"cc",
"pkg-config",
@@ -1691,6 +1715,16 @@ dependencies = [
"regex-automata 0.1.10",
]
+[[package]]
+name = "md-5"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
+dependencies = [
+ "cfg-if",
+ "digest",
+]
+
[[package]]
name = "memchr"
version = "2.5.0"
@@ -1752,7 +1786,7 @@ dependencies = [
"libc",
"log",
"wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1894,25 +1928,26 @@ version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
name = "notify"
-version = "5.2.0"
+version = "6.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486"
+checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.3.3",
"crossbeam-channel",
"filetime",
"fsevent-sys",
"inotify",
"kqueue",
"libc",
+ "log",
"mio",
"walkdir",
- "windows-sys 0.45.0",
+ "windows-sys",
]
[[package]]
@@ -2108,17 +2143,6 @@ dependencies = [
"sha2",
]
-[[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"
@@ -2126,21 +2150,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
- "parking_lot_core 0.9.8",
-]
-
-[[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]]
@@ -2151,9 +2161,9 @@ checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.3.5",
+ "redox_syscall",
"smallvec",
- "windows-targets 0.48.1",
+ "windows-targets",
]
[[package]]
@@ -2201,7 +2211,7 @@ checksum = "0ec95680a7087503575284e5063e14b694b7a9c0b065e5dceec661e0497127e8"
dependencies = [
"inlinable_string",
"pear_codegen",
- "yansi",
+ "yansi 0.5.1",
]
[[package]]
@@ -2225,6 +2235,15 @@ dependencies = [
"base64ct",
]
+[[package]]
+name = "pem-rfc7468"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
+dependencies = [
+ "base64ct",
+]
+
[[package]]
name = "percent-encoding"
version = "2.3.0"
@@ -2363,26 +2382,6 @@ dependencies = [
"siphasher",
]
-[[package]]
-name = "pin-project"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.24",
-]
-
[[package]]
name = "pin-project-lite"
version = "0.2.10"
@@ -2401,20 +2400,41 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eff33bdbdfc54cc98a2eca766ebdec3e1b8fb7387523d5c9c9a2891da856f719"
dependencies = [
- "der",
- "pkcs8",
- "spki",
+ "der 0.6.1",
+ "pkcs8 0.9.0",
+ "spki 0.6.0",
"zeroize",
]
+[[package]]
+name = "pkcs1"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
+dependencies = [
+ "der 0.7.8",
+ "pkcs8 0.10.2",
+ "spki 0.7.2",
+]
+
[[package]]
name = "pkcs8"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba"
dependencies = [
- "der",
- "spki",
+ "der 0.6.1",
+ "spki 0.6.0",
+]
+
+[[package]]
+name = "pkcs8"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
+dependencies = [
+ "der 0.7.8",
+ "spki 0.7.2",
]
[[package]]
@@ -2461,7 +2481,7 @@ dependencies = [
"quote",
"syn 2.0.24",
"version_check",
- "yansi",
+ "yansi 0.5.1",
]
[[package]]
@@ -2515,15 +2535,6 @@ dependencies = [
"getrandom",
]
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags 1.3.2",
-]
-
[[package]]
name = "redox_syscall"
version = "0.3.5"
@@ -2635,9 +2646,9 @@ dependencies = [
[[package]]
name = "rocket"
-version = "0.5.0-rc.3"
+version = "0.5.0-rc.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58734f7401ae5cfd129685b48f61182331745b357b96f2367f01aebaf1cc9cc9"
+checksum = "85ae34c956708013335f62150ff64e133be7f9e8ca60203852bc7b13d6044d01"
dependencies = [
"async-stream",
"async-trait",
@@ -2647,13 +2658,12 @@ dependencies = [
"either",
"figment",
"futures",
- "indexmap 1.9.3",
- "is-terminal",
+ "indexmap 2.0.0",
"log",
"memchr",
"multer",
"num_cpus",
- "parking_lot 0.12.1",
+ "parking_lot",
"pin-project-lite",
"rand",
"ref-cast",
@@ -2669,30 +2679,30 @@ dependencies = [
"tokio-util",
"ubyte",
"version_check",
- "yansi",
+ "yansi 1.0.0-rc.1",
]
[[package]]
name = "rocket_codegen"
-version = "0.5.0-rc.3"
+version = "0.5.0-rc.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7093353f14228c744982e409259fb54878ba9563d08214f2d880d59ff2fc508b"
+checksum = "896efc56a554a4e1fd03df1d8186c955b803aa652bbe8725a731f64e20f9cee8"
dependencies = [
"devise",
"glob",
- "indexmap 1.9.3",
+ "indexmap 2.0.0",
"proc-macro2",
"quote",
"rocket_http",
"syn 2.0.24",
"unicode-xid",
+ "version_check",
]
[[package]]
name = "rocket_cors"
version = "0.6.0-alpha2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b12771b47f52e34d5d0e0e444aeba382863e73263cb9e18847e7d5b74aa2cbd0"
+source = "git+https://github.com/j03-dev/rocket_cors?branch=master#4a562dfdc1c550ca1832ea56a6fd41de04b536c6"
dependencies = [
"http",
"log",
@@ -2707,9 +2717,9 @@ dependencies = [
[[package]]
name = "rocket_db_pools"
-version = "0.1.0-rc.3"
+version = "0.1.0-rc.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e841c280fd98c042cd3d0353c31920da78a4eb19b12f0e0e3b7a362abe66bec0"
+checksum = "07442bdd9c491414bc1ec4019c92a2cec55971bdb9a7a3c1072fa695b50d5635"
dependencies = [
"rocket",
"rocket_db_pools_codegen",
@@ -2719,9 +2729,9 @@ dependencies = [
[[package]]
name = "rocket_db_pools_codegen"
-version = "0.1.0-rc.3"
+version = "0.1.0-rc.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e26ff5b517c54ffe049209e6126705fd455529ff0b37c83023d56bf8fd677a76"
+checksum = "256459847a854aacad39fc3d4ff3b05610a66bcd21da42d293248fffc8d730ef"
dependencies = [
"devise",
"quote",
@@ -2729,29 +2739,29 @@ dependencies = [
[[package]]
name = "rocket_dyn_templates"
-version = "0.1.0-rc.3"
+version = "0.1.0-rc.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "276cac97fcddca93d741a4a530f58969f45a5bdb587f8c6b04c75cf849ca7f4c"
+checksum = "f44ce172f8a9070daf777dec707273ee042223ad9b030d780349baa0b660ae4f"
dependencies = [
- "glob",
"normpath",
"notify",
"rocket",
"tera",
+ "walkdir",
]
[[package]]
name = "rocket_http"
-version = "0.5.0-rc.3"
+version = "0.5.0-rc.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936012c99162a03a67f37f9836d5f938f662e26f2717809761a9ac46432090f4"
+checksum = "a1b9b7377bab513717a00ca4f91fe1378328b078e7705bfe5f6b69635e9f1719"
dependencies = [
"cookie",
"either",
"futures",
"http",
"hyper",
- "indexmap 1.9.3",
+ "indexmap 2.0.0",
"log",
"memchr",
"pear",
@@ -2790,8 +2800,8 @@ dependencies = [
"num-integer",
"num-iter",
"num-traits",
- "pkcs1",
- "pkcs8",
+ "pkcs1 0.4.1",
+ "pkcs8 0.9.0",
"rand_core",
"signature 1.6.4",
"smallvec",
@@ -2811,14 +2821,34 @@ dependencies = [
"num-integer",
"num-iter",
"num-traits",
- "pkcs1",
- "pkcs8",
+ "pkcs1 0.4.1",
+ "pkcs8 0.9.0",
"rand_core",
"signature 2.1.0",
"subtle",
"zeroize",
]
+[[package]]
+name = "rsa"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d"
+dependencies = [
+ "const-oid",
+ "digest",
+ "num-bigint-dig",
+ "num-integer",
+ "num-traits",
+ "pkcs1 0.7.5",
+ "pkcs8 0.10.2",
+ "rand_core",
+ "signature 2.1.0",
+ "spki 0.7.2",
+ "subtle",
+ "zeroize",
+]
+
[[package]]
name = "rustc-demangle"
version = "0.1.23"
@@ -2851,7 +2881,7 @@ dependencies = [
"io-lifetimes",
"libc",
"linux-raw-sys 0.3.8",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -2864,19 +2894,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys 0.4.3",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "rustls"
-version = "0.20.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
-dependencies = [
- "log",
- "ring",
- "sct",
- "webpki",
+ "windows-sys",
]
[[package]]
@@ -2970,9 +2988,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
dependencies = [
"base16ct",
- "der",
+ "der 0.6.1",
"generic-array",
- "pkcs8",
+ "pkcs8 0.9.0",
"subtle",
"zeroize",
]
@@ -3224,7 +3242,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"
dependencies = [
"base64ct",
- "der",
+ "der 0.6.1",
+]
+
+[[package]]
+name = "spki"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a"
+dependencies = [
+ "base64ct",
+ "der 0.7.8",
]
[[package]]
@@ -3240,23 +3268,25 @@ dependencies = [
[[package]]
name = "sqlx"
-version = "0.6.3"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188"
+checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33"
dependencies = [
"sqlx-core",
"sqlx-macros",
+ "sqlx-mysql",
+ "sqlx-postgres",
+ "sqlx-sqlite",
]
[[package]]
name = "sqlx-core"
-version = "0.6.3"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029"
+checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d"
dependencies = [
- "ahash 0.7.6",
+ "ahash",
"atoi",
- "bitflags 1.3.2",
"byteorder",
"bytes",
"chrono",
@@ -3265,42 +3295,52 @@ dependencies = [
"dotenvy",
"either",
"event-listener",
- "flume",
"futures-channel",
"futures-core",
- "futures-executor",
"futures-intrusive",
+ "futures-io",
"futures-util",
"hashlink",
"hex",
- "indexmap 1.9.3",
- "itoa",
- "libc",
- "libsqlite3-sys",
+ "indexmap 2.0.0",
"log",
"memchr",
"once_cell",
"paste",
"percent-encoding",
- "rustls 0.20.8",
+ "rustls",
"rustls-pemfile",
"serde",
+ "serde_json",
"sha2",
"smallvec",
"sqlformat",
- "sqlx-rt",
- "stringprep",
"thiserror",
+ "tokio",
"tokio-stream",
+ "tracing",
"url",
- "webpki-roots 0.22.6",
+ "webpki-roots 0.24.0",
]
[[package]]
name = "sqlx-macros"
-version = "0.6.3"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9"
+checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "sqlx-core",
+ "sqlx-macros-core",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "sqlx-macros-core"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc"
dependencies = [
"dotenvy",
"either",
@@ -3313,20 +3353,119 @@ 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.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024"
+checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db"
dependencies = [
+ "atoi",
+ "base64 0.21.2",
+ "bitflags 2.3.3",
+ "byteorder",
+ "bytes",
+ "chrono",
+ "crc",
+ "digest",
+ "dotenvy",
+ "either",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "generic-array",
+ "hex",
+ "hkdf",
+ "hmac",
+ "itoa",
+ "log",
+ "md-5",
+ "memchr",
"once_cell",
- "tokio",
- "tokio-rustls 0.23.4",
+ "percent-encoding",
+ "rand",
+ "rsa 0.9.3",
+ "serde",
+ "sha1",
+ "sha2",
+ "smallvec",
+ "sqlx-core",
+ "stringprep",
+ "thiserror",
+ "tracing",
+ "whoami",
+]
+
+[[package]]
+name = "sqlx-postgres"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624"
+dependencies = [
+ "atoi",
+ "base64 0.21.2",
+ "bitflags 2.3.3",
+ "byteorder",
+ "chrono",
+ "crc",
+ "dotenvy",
+ "etcetera",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "hex",
+ "hkdf",
+ "hmac",
+ "home",
+ "itoa",
+ "log",
+ "md-5",
+ "memchr",
+ "once_cell",
+ "rand",
+ "serde",
+ "serde_json",
+ "sha1",
+ "sha2",
+ "smallvec",
+ "sqlx-core",
+ "stringprep",
+ "thiserror",
+ "tracing",
+ "whoami",
+]
+
+[[package]]
+name = "sqlx-sqlite"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f"
+dependencies = [
+ "atoi",
+ "chrono",
+ "flume",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-intrusive",
+ "futures-util",
+ "libsqlite3-sys",
+ "log",
+ "percent-encoding",
+ "serde",
+ "sqlx-core",
+ "tracing",
+ "url",
]
[[package]]
@@ -3340,9 +3479,9 @@ dependencies = [
[[package]]
name = "state"
-version = "0.5.3"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b"
+checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
dependencies = [
"loom",
]
@@ -3400,9 +3539,9 @@ dependencies = [
"autocfg",
"cfg-if",
"fastrand",
- "redox_syscall 0.3.5",
+ "redox_syscall",
"rustix 0.37.23",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -3526,7 +3665,7 @@ dependencies = [
"signal-hook-registry",
"socket2",
"tokio-macros",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -3540,24 +3679,13 @@ dependencies = [
"syn 2.0.24",
]
-[[package]]
-name = "tokio-rustls"
-version = "0.23.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
-dependencies = [
- "rustls 0.20.8",
- "tokio",
- "webpki",
-]
-
[[package]]
name = "tokio-rustls"
version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
dependencies = [
- "rustls 0.21.3",
+ "rustls",
"tokio",
]
@@ -3661,6 +3789,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [
"cfg-if",
+ "log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -3919,9 +4048,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "walkdir"
-version = "2.3.3"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
dependencies = [
"same-file",
"winapi-util",
@@ -4012,25 +4141,6 @@ dependencies = [
"wasm-bindgen",
]
-[[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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
-dependencies = [
- "webpki",
-]
-
[[package]]
name = "webpki-roots"
version = "0.23.1"
@@ -4040,6 +4150,21 @@ dependencies = [
"rustls-webpki 0.100.1",
]
+[[package]]
+name = "webpki-roots"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888"
+dependencies = [
+ "rustls-webpki 0.101.1",
+]
+
+[[package]]
+name = "whoami"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50"
+
[[package]]
name = "winapi"
version = "0.3.9"
@@ -4077,16 +4202,7 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
dependencies = [
- "windows-targets 0.48.1",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
+ "windows-targets",
]
[[package]]
@@ -4095,22 +4211,7 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-targets 0.48.1",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
+ "windows-targets",
]
[[package]]
@@ -4119,93 +4220,51 @@ version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
dependencies = [
- "windows_aarch64_gnullvm 0.48.0",
- "windows_aarch64_msvc 0.48.0",
- "windows_i686_gnu 0.48.0",
- "windows_i686_msvc 0.48.0",
- "windows_x86_64_gnu 0.48.0",
- "windows_x86_64_gnullvm 0.48.0",
- "windows_x86_64_msvc 0.48.0",
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
]
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"
@@ -4233,6 +4292,15 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+[[package]]
+name = "yansi"
+version = "1.0.0-rc.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377"
+dependencies = [
+ "is-terminal",
+]
+
[[package]]
name = "zeroize"
version = "1.6.0"
diff --git a/Cargo.toml b/Cargo.toml
index e59e89b..cfdbcfa 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,7 +8,7 @@ members = [
[workspace.dependencies]
thiserror = "1"
chrono = "0.4"
-sqlx = "0.6"
+sqlx = "0.7"
url = "2.3"
serde = "1"
serde_json = "1"
diff --git a/crates/database/.sqlx/query-06cfa74715f3725e99e63aa206f1be5d26cb26924d53dc5a68ee4ea48d6bbbfd.json b/crates/database/.sqlx/query-06cfa74715f3725e99e63aa206f1be5d26cb26924d53dc5a68ee4ea48d6bbbfd.json
new file mode 100644
index 0000000..66bbf95
--- /dev/null
+++ b/crates/database/.sqlx/query-06cfa74715f3725e99e63aa206f1be5d26cb26924d53dc5a68ee4ea48d6bbbfd.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update settings\n\nset business_logo = ?\n\nwhere id is 0\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "06cfa74715f3725e99e63aa206f1be5d26cb26924d53dc5a68ee4ea48d6bbbfd"
+}
diff --git a/crates/database/.sqlx/query-0b60c7829e95dde4145b7f207b64df7006c1fde2faaca0f7952a009d6cda90a3.json b/crates/database/.sqlx/query-0b60c7829e95dde4145b7f207b64df7006c1fde2faaca0f7952a009d6cda90a3.json
new file mode 100644
index 0000000..4252806
--- /dev/null
+++ b/crates/database/.sqlx/query-0b60c7829e95dde4145b7f207b64df7006c1fde2faaca0f7952a009d6cda90a3.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update settings\n\nset business_name = ?\n\nwhere id is 0\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "0b60c7829e95dde4145b7f207b64df7006c1fde2faaca0f7952a009d6cda90a3"
+}
diff --git a/crates/database/.sqlx/query-13c26aaf556d259535afb95f5c53b4c594f373084c73000bc7865a280df74fdd.json b/crates/database/.sqlx/query-13c26aaf556d259535afb95f5c53b4c594f373084c73000bc7865a280df74fdd.json
new file mode 100644
index 0000000..11e775b
--- /dev/null
+++ b/crates/database/.sqlx/query-13c26aaf556d259535afb95f5c53b4c594f373084c73000bc7865a280df74fdd.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere is_archived is 0\norder by created_at desc",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "redirect_uri",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "secret",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_confidential: bool",
+ "ordinal": 6,
+ "type_info": "Int64"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 7,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "13c26aaf556d259535afb95f5c53b4c594f373084c73000bc7865a280df74fdd"
+}
diff --git a/crates/database/.sqlx/query-184d704e75f00513082dd2c6cc3ae5c3f58b57b222ba4333216b5c50c3c58c71.json b/crates/database/.sqlx/query-184d704e75f00513082dd2c6cc3ae5c3f58b57b222ba4333216b5c50c3c58c71.json
new file mode 100644
index 0000000..5400960
--- /dev/null
+++ b/crates/database/.sqlx/query-184d704e75f00513082dd2c6cc3ae5c3f58b57b222ba4333216b5c50c3c58c71.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update apps\n\nset label = ?,\n redirect_uri = ?,\n is_confidential = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 4
+ },
+ "nullable": []
+ },
+ "hash": "184d704e75f00513082dd2c6cc3ae5c3f58b57b222ba4333216b5c50c3c58c71"
+}
diff --git a/crates/database/.sqlx/query-1e2edc8cf28832344dbfa0878ac01361b6f97c552d6af8477da12cddb03d4865.json b/crates/database/.sqlx/query-1e2edc8cf28832344dbfa0878ac01361b6f97c552d6af8477da12cddb03d4865.json
new file mode 100644
index 0000000..4806aca
--- /dev/null
+++ b/crates/database/.sqlx/query-1e2edc8cf28832344dbfa0878ac01361b6f97c552d6af8477da12cddb03d4865.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update apps\n\nset secret = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "1e2edc8cf28832344dbfa0878ac01361b6f97c552d6af8477da12cddb03d4865"
+}
diff --git a/crates/database/.sqlx/query-2d562e7b19d7d8303a0e79d143d25fd68743ae30d1ec0b0ca5c7dfc367fdf357.json b/crates/database/.sqlx/query-2d562e7b19d7d8303a0e79d143d25fd68743ae30d1ec0b0ca5c7dfc367fdf357.json
new file mode 100644
index 0000000..341ec0f
--- /dev/null
+++ b/crates/database/.sqlx/query-2d562e7b19d7d8303a0e79d143d25fd68743ae30d1ec0b0ca5c7dfc367fdf357.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update apps\n\nset is_archived = 1\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "2d562e7b19d7d8303a0e79d143d25fd68743ae30d1ec0b0ca5c7dfc367fdf357"
+}
diff --git a/crates/database/.sqlx/query-2ee77458d93ae79d957e03e6ca50c1bf690f40b6cc6ec5f008eb0e928f376659.json b/crates/database/.sqlx/query-2ee77458d93ae79d957e03e6ca50c1bf690f40b6cc6ec5f008eb0e928f376659.json
new file mode 100644
index 0000000..4bebeb3
--- /dev/null
+++ b/crates/database/.sqlx/query-2ee77458d93ae79d957e03e6ca50c1bf690f40b6cc6ec5f008eb0e928f376659.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update roles\n\nset is_archived = ?\n\nwhere name is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "2ee77458d93ae79d957e03e6ca50c1bf690f40b6cc6ec5f008eb0e928f376659"
+}
diff --git a/crates/database/.sqlx/query-32d35bdd1f4cf64ce0ff7beb7a11591e0f35eab7211692bcde8230c68e4cedf3.json b/crates/database/.sqlx/query-32d35bdd1f4cf64ce0ff7beb7a11591e0f35eab7211692bcde8230c68e4cedf3.json
new file mode 100644
index 0000000..6ab6f4d
--- /dev/null
+++ b/crates/database/.sqlx/query-32d35bdd1f4cf64ce0ff7beb7a11591e0f35eab7211692bcde8230c68e4cedf3.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset password_recover = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "32d35bdd1f4cf64ce0ff7beb7a11591e0f35eab7211692bcde8230c68e4cedf3"
+}
diff --git a/crates/database/.sqlx/query-37000307a757b4912ca300c346b5bd8ee5d50331d94abeee076ae4db46215a56.json b/crates/database/.sqlx/query-37000307a757b4912ca300c346b5bd8ee5d50331d94abeee076ae4db46215a56.json
new file mode 100644
index 0000000..58c24ea
--- /dev/null
+++ b/crates/database/.sqlx/query-37000307a757b4912ca300c346b5bd8ee5d50331d94abeee076ae4db46215a56.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere email is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "37000307a757b4912ca300c346b5bd8ee5d50331d94abeee076ae4db46215a56"
+}
diff --git a/crates/database/.sqlx/query-37681902a5f5d87492812a525a6488e75d20c1c436a3ba2c5aa3f54da62fe861.json b/crates/database/.sqlx/query-37681902a5f5d87492812a525a6488e75d20c1c436a3ba2c5aa3f54da62fe861.json
new file mode 100644
index 0000000..5dc09ac
--- /dev/null
+++ b/crates/database/.sqlx/query-37681902a5f5d87492812a525a6488e75d20c1c436a3ba2c5aa3f54da62fe861.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select\n -- info\n token,\n ip_address,\n user,\n app,\n\n -- timings\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\"\nfrom refresh_tokens\n\nwhere token is (?)",
+ "describe": {
+ "columns": [
+ {
+ "name": "token",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "ip_address",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "user",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "app",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "expires_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "used_at: DateTime",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "revoked_at: DateTime",
+ "ordinal": 7,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "37681902a5f5d87492812a525a6488e75d20c1c436a3ba2c5aa3f54da62fe861"
+}
diff --git a/crates/database/.sqlx/query-3c8e31ffa5cbfd4dded8a272777cb320fb51fd2e53ed25054d24e9801df0c358.json b/crates/database/.sqlx/query-3c8e31ffa5cbfd4dded8a272777cb320fb51fd2e53ed25054d24e9801df0c358.json
new file mode 100644
index 0000000..be28ccc
--- /dev/null
+++ b/crates/database/.sqlx/query-3c8e31ffa5cbfd4dded8a272777cb320fb51fd2e53ed25054d24e9801df0c358.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update refresh_tokens\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "3c8e31ffa5cbfd4dded8a272777cb320fb51fd2e53ed25054d24e9801df0c358"
+}
diff --git a/crates/database/.sqlx/query-44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791.json b/crates/database/.sqlx/query-44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791.json
new file mode 100644
index 0000000..58c2686
--- /dev/null
+++ b/crates/database/.sqlx/query-44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into roles (name, label)\nvalues (?, ?)\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791"
+}
diff --git a/crates/database/.sqlx/query-46caa546db24d2c1e8192f9e699202be5129c74a5569b2dc7bf95761fe09a6a3.json b/crates/database/.sqlx/query-46caa546db24d2c1e8192f9e699202be5129c74a5569b2dc7bf95761fe09a6a3.json
new file mode 100644
index 0000000..a28f563
--- /dev/null
+++ b/crates/database/.sqlx/query-46caa546db24d2c1e8192f9e699202be5129c74a5569b2dc7bf95761fe09a6a3.json
@@ -0,0 +1,32 @@
+{
+ "db_name": "SQLite",
+ "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\nwhere role is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "user",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "role",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "46caa546db24d2c1e8192f9e699202be5129c74a5569b2dc7bf95761fe09a6a3"
+}
diff --git a/crates/database/.sqlx/query-520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca.json b/crates/database/.sqlx/query-520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca.json
new file mode 100644
index 0000000..dc666b1
--- /dev/null
+++ b/crates/database/.sqlx/query-520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into users (id, is_admin, username, password)\nvalues (?, ?, ?, ?)\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 4
+ },
+ "nullable": []
+ },
+ "hash": "520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca"
+}
diff --git a/crates/database/.sqlx/query-52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0.json b/crates/database/.sqlx/query-52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0.json
new file mode 100644
index 0000000..758139d
--- /dev/null
+++ b/crates/database/.sqlx/query-52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset is_archived = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0"
+}
diff --git a/crates/database/.sqlx/query-545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c.json b/crates/database/.sqlx/query-545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c.json
new file mode 100644
index 0000000..f1adb7c
--- /dev/null
+++ b/crates/database/.sqlx/query-545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset username = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c"
+}
diff --git a/crates/database/.sqlx/query-5567f75b47f739e85da3469bec0202be315c42dfc820d3c37bba498b1b783811.json b/crates/database/.sqlx/query-5567f75b47f739e85da3469bec0202be315c42dfc820d3c37bba498b1b783811.json
new file mode 100644
index 0000000..5543786
--- /dev/null
+++ b/crates/database/.sqlx/query-5567f75b47f739e85da3469bec0202be315c42dfc820d3c37bba498b1b783811.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere username is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "5567f75b47f739e85da3469bec0202be315c42dfc820d3c37bba498b1b783811"
+}
diff --git a/crates/database/.sqlx/query-56a9c0dff010858189a95087d014c7d0ce930da5d841b9d788a9c0e84b580bc6.json b/crates/database/.sqlx/query-56a9c0dff010858189a95087d014c7d0ce930da5d841b9d788a9c0e84b580bc6.json
new file mode 100644
index 0000000..018ae8b
--- /dev/null
+++ b/crates/database/.sqlx/query-56a9c0dff010858189a95087d014c7d0ce930da5d841b9d788a9c0e84b580bc6.json
@@ -0,0 +1,44 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\",\n private_der,\n public_der\n\nfrom keys\norder by created_at desc\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "revoked_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "private_der",
+ "ordinal": 3,
+ "type_info": "Blob"
+ },
+ {
+ "name": "public_der",
+ "ordinal": 4,
+ "type_info": "Blob"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ true,
+ false,
+ false
+ ]
+ },
+ "hash": "56a9c0dff010858189a95087d014c7d0ce930da5d841b9d788a9c0e84b580bc6"
+}
diff --git a/crates/database/.sqlx/query-58e0626629a768c33783bbc926c3d1477ad7e4e983b61ede013e5b066940eb5c.json b/crates/database/.sqlx/query-58e0626629a768c33783bbc926c3d1477ad7e4e983b61ede013e5b066940eb5c.json
new file mode 100644
index 0000000..c72c0d6
--- /dev/null
+++ b/crates/database/.sqlx/query-58e0626629a768c33783bbc926c3d1477ad7e4e983b61ede013e5b066940eb5c.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset timezone = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "58e0626629a768c33783bbc926c3d1477ad7e4e983b61ede013e5b066940eb5c"
+}
diff --git a/crates/database/.sqlx/query-5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c.json b/crates/database/.sqlx/query-5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c.json
new file mode 100644
index 0000000..d51c948
--- /dev/null
+++ b/crates/database/.sqlx/query-5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and used_at is null",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c"
+}
diff --git a/crates/database/.sqlx/query-5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de.json b/crates/database/.sqlx/query-5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de.json
new file mode 100644
index 0000000..bdd0bbd
--- /dev/null
+++ b/crates/database/.sqlx/query-5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de.json
@@ -0,0 +1,38 @@
+{
+ "db_name": "SQLite",
+ "query": "select name,\n label,\n created_at as \"created_at: DateTime\",\n is_archived as \"is_archived: bool\"\nfrom roles\n\norder by created_at desc\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "name",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de"
+}
diff --git a/crates/database/.sqlx/query-5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669.json b/crates/database/.sqlx/query-5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669.json
new file mode 100644
index 0000000..9e36604
--- /dev/null
+++ b/crates/database/.sqlx/query-5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669.json
@@ -0,0 +1,44 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\",\n private_der,\n public_der\n\nfrom keys\nwhere revoked_at is not null\norder by created_at desc\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "revoked_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "private_der",
+ "ordinal": 3,
+ "type_info": "Blob"
+ },
+ {
+ "name": "public_der",
+ "ordinal": 4,
+ "type_info": "Blob"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ true,
+ false,
+ false
+ ]
+ },
+ "hash": "5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669"
+}
diff --git a/crates/database/.sqlx/query-62c75412f673f6a293b0d188d79c50676ec21cf94e2e50e18f9279c91e6b85c8.json b/crates/database/.sqlx/query-62c75412f673f6a293b0d188d79c50676ec21cf94e2e50e18f9279c91e6b85c8.json
new file mode 100644
index 0000000..8b695de
--- /dev/null
+++ b/crates/database/.sqlx/query-62c75412f673f6a293b0d188d79c50676ec21cf94e2e50e18f9279c91e6b85c8.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert or ignore into settings(id)\nvalues (0);",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": []
+ },
+ "hash": "62c75412f673f6a293b0d188d79c50676ec21cf94e2e50e18f9279c91e6b85c8"
+}
diff --git a/crates/database/.sqlx/query-645f583812c4d71570d1e84b866e85c5a012d71cd745494049a8d9bebab3ed61.json b/crates/database/.sqlx/query-645f583812c4d71570d1e84b866e85c5a012d71cd745494049a8d9bebab3ed61.json
new file mode 100644
index 0000000..f95565f
--- /dev/null
+++ b/crates/database/.sqlx/query-645f583812c4d71570d1e84b866e85c5a012d71cd745494049a8d9bebab3ed61.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "645f583812c4d71570d1e84b866e85c5a012d71cd745494049a8d9bebab3ed61"
+}
diff --git a/crates/database/.sqlx/query-657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157.json b/crates/database/.sqlx/query-657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157.json
new file mode 100644
index 0000000..fca73b9
--- /dev/null
+++ b/crates/database/.sqlx/query-657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "vacuum",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": []
+ },
+ "hash": "657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157"
+}
diff --git a/crates/database/.sqlx/query-68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5.json b/crates/database/.sqlx/query-68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5.json
new file mode 100644
index 0000000..331a66d
--- /dev/null
+++ b/crates/database/.sqlx/query-68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset paper_key = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5"
+}
diff --git a/crates/database/.sqlx/query-693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040.json b/crates/database/.sqlx/query-693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040.json
new file mode 100644
index 0000000..3e08f64
--- /dev/null
+++ b/crates/database/.sqlx/query-693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update roles\n\nset label = ?\n\nwhere name is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040"
+}
diff --git a/crates/database/.sqlx/query-6fa3c48b9e93fb9ec6807f7547a8f999fc55a6fb8ad4abe7af89ec52e0d10a0e.json b/crates/database/.sqlx/query-6fa3c48b9e93fb9ec6807f7547a8f999fc55a6fb8ad4abe7af89ec52e0d10a0e.json
new file mode 100644
index 0000000..a95f182
--- /dev/null
+++ b/crates/database/.sqlx/query-6fa3c48b9e93fb9ec6807f7547a8f999fc55a6fb8ad4abe7af89ec52e0d10a0e.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "delete\nfrom permissions\n\nwhere user is ?\n and role is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "6fa3c48b9e93fb9ec6807f7547a8f999fc55a6fb8ad4abe7af89ec52e0d10a0e"
+}
diff --git a/crates/database/.sqlx/query-6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0.json b/crates/database/.sqlx/query-6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0.json
new file mode 100644
index 0000000..a942303
--- /dev/null
+++ b/crates/database/.sqlx/query-6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset is_admin = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0"
+}
diff --git a/crates/database/.sqlx/query-71c74369dc5d374d8ec5aa347b5f599728b74e545df3e986e3e7e66882f73ba0.json b/crates/database/.sqlx/query-71c74369dc5d374d8ec5aa347b5f599728b74e545df3e986e3e7e66882f73ba0.json
new file mode 100644
index 0000000..7d8f135
--- /dev/null
+++ b/crates/database/.sqlx/query-71c74369dc5d374d8ec5aa347b5f599728b74e545df3e986e3e7e66882f73ba0.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere id is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "71c74369dc5d374d8ec5aa347b5f599728b74e545df3e986e3e7e66882f73ba0"
+}
diff --git a/crates/database/.sqlx/query-73bdbde04fca37f2411e7a9e1b6dbccc0dd4d12ebcb933024d9867f07bba3eb8.json b/crates/database/.sqlx/query-73bdbde04fca37f2411e7a9e1b6dbccc0dd4d12ebcb933024d9867f07bba3eb8.json
new file mode 100644
index 0000000..eaf15bc
--- /dev/null
+++ b/crates/database/.sqlx/query-73bdbde04fca37f2411e7a9e1b6dbccc0dd4d12ebcb933024d9867f07bba3eb8.json
@@ -0,0 +1,32 @@
+{
+ "db_name": "SQLite",
+ "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\nwhere user is (?)\n and role is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "user",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "role",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": [
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "73bdbde04fca37f2411e7a9e1b6dbccc0dd4d12ebcb933024d9867f07bba3eb8"
+}
diff --git a/crates/database/.sqlx/query-7b7f2430b2a719b3d5ce504c0a9302731b3ff82da99ba7771c2728d88aee642a.json b/crates/database/.sqlx/query-7b7f2430b2a719b3d5ce504c0a9302731b3ff82da99ba7771c2728d88aee642a.json
new file mode 100644
index 0000000..dc5723d
--- /dev/null
+++ b/crates/database/.sqlx/query-7b7f2430b2a719b3d5ce504c0a9302731b3ff82da99ba7771c2728d88aee642a.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update keys\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere revoked_at is null\n and id is not (?)\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "7b7f2430b2a719b3d5ce504c0a9302731b3ff82da99ba7771c2728d88aee642a"
+}
diff --git a/crates/database/.sqlx/query-7f26b73408318040f94fb6574d5cc25482cef1a57ba4c467fa0bc0fdf25bf39c.json b/crates/database/.sqlx/query-7f26b73408318040f94fb6574d5cc25482cef1a57ba4c467fa0bc0fdf25bf39c.json
new file mode 100644
index 0000000..1aa1dd7
--- /dev/null
+++ b/crates/database/.sqlx/query-7f26b73408318040f94fb6574d5cc25482cef1a57ba4c467fa0bc0fdf25bf39c.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update authorization_codes\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere code is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "7f26b73408318040f94fb6574d5cc25482cef1a57ba4c467fa0bc0fdf25bf39c"
+}
diff --git a/crates/database/.sqlx/query-87906834faa6f185aee0e4d893b9754908b1c173e9dce383663d723891a89cd1.json b/crates/database/.sqlx/query-87906834faa6f185aee0e4d893b9754908b1c173e9dce383663d723891a89cd1.json
new file mode 100644
index 0000000..beacd78
--- /dev/null
+++ b/crates/database/.sqlx/query-87906834faa6f185aee0e4d893b9754908b1c173e9dce383663d723891a89cd1.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update settings\n\nset url = ?\n\nwhere id is 0\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "87906834faa6f185aee0e4d893b9754908b1c173e9dce383663d723891a89cd1"
+}
diff --git a/crates/database/.sqlx/query-8c131e1f73ffa01fc3e5e08071a786b85f23b9638d1c7eaa7b633c052703c911.json b/crates/database/.sqlx/query-8c131e1f73ffa01fc3e5e08071a786b85f23b9638d1c7eaa7b633c052703c911.json
new file mode 100644
index 0000000..edb3b77
--- /dev/null
+++ b/crates/database/.sqlx/query-8c131e1f73ffa01fc3e5e08071a786b85f23b9638d1c7eaa7b633c052703c911.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset name = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "8c131e1f73ffa01fc3e5e08071a786b85f23b9638d1c7eaa7b633c052703c911"
+}
diff --git a/crates/database/.sqlx/query-8c37375b0694df02b7f1b6678e4e2c3ffbc590c0f305ff5a8f44350fba3eaec7.json b/crates/database/.sqlx/query-8c37375b0694df02b7f1b6678e4e2c3ffbc590c0f305ff5a8f44350fba3eaec7.json
new file mode 100644
index 0000000..0cd8ab3
--- /dev/null
+++ b/crates/database/.sqlx/query-8c37375b0694df02b7f1b6678e4e2c3ffbc590c0f305ff5a8f44350fba3eaec7.json
@@ -0,0 +1,32 @@
+{
+ "db_name": "SQLite",
+ "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\nwhere user is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "user",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "role",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "8c37375b0694df02b7f1b6678e4e2c3ffbc590c0f305ff5a8f44350fba3eaec7"
+}
diff --git a/crates/database/.sqlx/query-93b15a942a6c7db595990f00e14fde26d6d36b8c8de9935179d41f6c7c755978.json b/crates/database/.sqlx/query-93b15a942a6c7db595990f00e14fde26d6d36b8c8de9935179d41f6c7c755978.json
new file mode 100644
index 0000000..3b7b28c
--- /dev/null
+++ b/crates/database/.sqlx/query-93b15a942a6c7db595990f00e14fde26d6d36b8c8de9935179d41f6c7c755978.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere app is ?\n and revoked_at is null",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "93b15a942a6c7db595990f00e14fde26d6d36b8c8de9935179d41f6c7c755978"
+}
diff --git a/crates/database/.sqlx/query-9784afe2dcff4db86908175d4e3145baf72b3361f43e4127350a14a183ef63f7.json b/crates/database/.sqlx/query-9784afe2dcff4db86908175d4e3145baf72b3361f43e4127350a14a183ef63f7.json
new file mode 100644
index 0000000..f5d5098
--- /dev/null
+++ b/crates/database/.sqlx/query-9784afe2dcff4db86908175d4e3145baf72b3361f43e4127350a14a183ef63f7.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset password = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "9784afe2dcff4db86908175d4e3145baf72b3361f43e4127350a14a183ef63f7"
+}
diff --git a/crates/database/.sqlx/query-979c7ba41dac5ea5593fc169ea95b68d2311c5ae05c1e18db43424c8ed2f2e4e.json b/crates/database/.sqlx/query-979c7ba41dac5ea5593fc169ea95b68d2311c5ae05c1e18db43424c8ed2f2e4e.json
new file mode 100644
index 0000000..fb185a3
--- /dev/null
+++ b/crates/database/.sqlx/query-979c7ba41dac5ea5593fc169ea95b68d2311c5ae05c1e18db43424c8ed2f2e4e.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\norder by created_at desc\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "979c7ba41dac5ea5593fc169ea95b68d2311c5ae05c1e18db43424c8ed2f2e4e"
+}
diff --git a/crates/database/.sqlx/query-9a3aef02e55fc436e9c09c1ee6d29477c2746765f6e7d5679058ec6525ee7253.json b/crates/database/.sqlx/query-9a3aef02e55fc436e9c09c1ee6d29477c2746765f6e7d5679058ec6525ee7253.json
new file mode 100644
index 0000000..d302470
--- /dev/null
+++ b/crates/database/.sqlx/query-9a3aef02e55fc436e9c09c1ee6d29477c2746765f6e7d5679058ec6525ee7253.json
@@ -0,0 +1,38 @@
+{
+ "db_name": "SQLite",
+ "query": "select name,\n label,\n created_at as \"created_at: DateTime\",\n is_archived as \"is_archived: bool\"\nfrom roles\n\nwhere name is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "name",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "9a3aef02e55fc436e9c09c1ee6d29477c2746765f6e7d5679058ec6525ee7253"
+}
diff --git a/crates/database/.sqlx/query-9dc379b0f3a3c944a33ef01dc40489b29b2a61b9f73f6ca4b5df7e9fb9bccf90.json b/crates/database/.sqlx/query-9dc379b0f3a3c944a33ef01dc40489b29b2a61b9f73f6ca4b5df7e9fb9bccf90.json
new file mode 100644
index 0000000..f204ff3
--- /dev/null
+++ b/crates/database/.sqlx/query-9dc379b0f3a3c944a33ef01dc40489b29b2a61b9f73f6ca4b5df7e9fb9bccf90.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\",\n u.timezone,\n u.totp_secret,\n u.totp_backup\nfrom users u\n\n inner join settings s on u.id = s.first_admin\n\nwhere u.is_admin is 1\n and u.is_archived is 0\n and u.id is s.first_admin\n\nlimit 1",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "9dc379b0f3a3c944a33ef01dc40489b29b2a61b9f73f6ca4b5df7e9fb9bccf90"
+}
diff --git a/crates/database/.sqlx/query-9f1885c4786f73335b4d614f562bb7cad49c91bfe7f084d8c25c6c571673ab90.json b/crates/database/.sqlx/query-9f1885c4786f73335b4d614f562bb7cad49c91bfe7f084d8c25c6c571673ab90.json
new file mode 100644
index 0000000..4a0a54e
--- /dev/null
+++ b/crates/database/.sqlx/query-9f1885c4786f73335b4d614f562bb7cad49c91bfe7f084d8c25c6c571673ab90.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere revoked_at is null",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": []
+ },
+ "hash": "9f1885c4786f73335b4d614f562bb7cad49c91bfe7f084d8c25c6c571673ab90"
+}
diff --git a/crates/database/.sqlx/query-a0dd1ddcc7d58fad78ed6c5027a9559428be9d0d59df6409ca9ec7cd728f6001.json b/crates/database/.sqlx/query-a0dd1ddcc7d58fad78ed6c5027a9559428be9d0d59df6409ca9ec7cd728f6001.json
new file mode 100644
index 0000000..ca6e7e5
--- /dev/null
+++ b/crates/database/.sqlx/query-a0dd1ddcc7d58fad78ed6c5027a9559428be9d0d59df6409ca9ec7cd728f6001.json
@@ -0,0 +1,44 @@
+{
+ "db_name": "SQLite",
+ "query": "select\n -- info\n token,\n user,\n\n -- timings\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\"\nfrom totp_login_requests\n\nwhere token is (?)",
+ "describe": {
+ "columns": [
+ {
+ "name": "token",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "user",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "expires_at: DateTime",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "used_at: DateTime",
+ "ordinal": 4,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ true
+ ]
+ },
+ "hash": "a0dd1ddcc7d58fad78ed6c5027a9559428be9d0d59df6409ca9ec7cd728f6001"
+}
diff --git a/crates/database/.sqlx/query-a2bf546b2cf6a53a3a127c08fbb7f3dfcf0fe7a30364b1fb57c3e6b757093578.json b/crates/database/.sqlx/query-a2bf546b2cf6a53a3a127c08fbb7f3dfcf0fe7a30364b1fb57c3e6b757093578.json
new file mode 100644
index 0000000..c8ba3a8
--- /dev/null
+++ b/crates/database/.sqlx/query-a2bf546b2cf6a53a3a127c08fbb7f3dfcf0fe7a30364b1fb57c3e6b757093578.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into totp_login_requests (token, user, expires_at)\nvalues (?, ?, datetime(?, 'unixepoch'))\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 3
+ },
+ "nullable": []
+ },
+ "hash": "a2bf546b2cf6a53a3a127c08fbb7f3dfcf0fe7a30364b1fb57c3e6b757093578"
+}
diff --git a/crates/database/.sqlx/query-a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da.json b/crates/database/.sqlx/query-a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da.json
new file mode 100644
index 0000000..d6b6b3e
--- /dev/null
+++ b/crates/database/.sqlx/query-a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into authorization_codes (code, app, user, expires_at)\nvalues (?, ?, ?, datetime(?, 'unixepoch'))\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 4
+ },
+ "nullable": []
+ },
+ "hash": "a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da"
+}
diff --git a/crates/database/.sqlx/query-a9e910eedc27c495262571520627363290640b3af7d177a024cad06220a770f0.json b/crates/database/.sqlx/query-a9e910eedc27c495262571520627363290640b3af7d177a024cad06220a770f0.json
new file mode 100644
index 0000000..9de5f40
--- /dev/null
+++ b/crates/database/.sqlx/query-a9e910eedc27c495262571520627363290640b3af7d177a024cad06220a770f0.json
@@ -0,0 +1,32 @@
+{
+ "db_name": "SQLite",
+ "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "user",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "role",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "a9e910eedc27c495262571520627363290640b3af7d177a024cad06220a770f0"
+}
diff --git a/crates/database/.sqlx/query-aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5.json b/crates/database/.sqlx/query-aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5.json
new file mode 100644
index 0000000..46bd056
--- /dev/null
+++ b/crates/database/.sqlx/query-aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update settings\n\nset first_admin = ?\n\nwhere id is 0\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5"
+}
diff --git a/crates/database/.sqlx/query-adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d.json b/crates/database/.sqlx/query-adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d.json
new file mode 100644
index 0000000..3a56c37
--- /dev/null
+++ b/crates/database/.sqlx/query-adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d.json
@@ -0,0 +1,56 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n business_name,\n business_logo,\n url,\n first_admin\n\nfrom settings\n\nwhere id is 0\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Int64"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "business_name",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "business_logo",
+ "ordinal": 4,
+ "type_info": "Blob"
+ },
+ {
+ "name": "url",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "first_admin",
+ "ordinal": 6,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true
+ ]
+ },
+ "hash": "adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d"
+}
diff --git a/crates/database/.sqlx/query-afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356.json b/crates/database/.sqlx/query-afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356.json
new file mode 100644
index 0000000..ace51eb
--- /dev/null
+++ b/crates/database/.sqlx/query-afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset totp_secret = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356"
+}
diff --git a/crates/database/.sqlx/query-b3936ae237f02cc048ca084372f7975921c79aef8fcd6d15a4d63c10f2377d24.json b/crates/database/.sqlx/query-b3936ae237f02cc048ca084372f7975921c79aef8fcd6d15a4d63c10f2377d24.json
new file mode 100644
index 0000000..45a5da9
--- /dev/null
+++ b/crates/database/.sqlx/query-b3936ae237f02cc048ca084372f7975921c79aef8fcd6d15a4d63c10f2377d24.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into refresh_tokens (token, ip_address, user, app, expires_at)\nvalues (?, ?, ?, ?, datetime(?, 'unixepoch'))\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 5
+ },
+ "nullable": []
+ },
+ "hash": "b3936ae237f02cc048ca084372f7975921c79aef8fcd6d15a4d63c10f2377d24"
+}
diff --git a/crates/database/.sqlx/query-baaae9952348da17e2f4d099c6903c50bc90daed80ee2df1fd0dc1d9d2c67b26.json b/crates/database/.sqlx/query-baaae9952348da17e2f4d099c6903c50bc90daed80ee2df1fd0dc1d9d2c67b26.json
new file mode 100644
index 0000000..a437ee4
--- /dev/null
+++ b/crates/database/.sqlx/query-baaae9952348da17e2f4d099c6903c50bc90daed80ee2df1fd0dc1d9d2c67b26.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset totp_backup = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "baaae9952348da17e2f4d099c6903c50bc90daed80ee2df1fd0dc1d9d2c67b26"
+}
diff --git a/crates/database/.sqlx/query-c00e5fce25caebdeeb24db20880e6c2210f583cddb0d478075f78124258712dd.json b/crates/database/.sqlx/query-c00e5fce25caebdeeb24db20880e6c2210f583cddb0d478075f78124258712dd.json
new file mode 100644
index 0000000..5796527
--- /dev/null
+++ b/crates/database/.sqlx/query-c00e5fce25caebdeeb24db20880e6c2210f583cddb0d478075f78124258712dd.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and revoked_at is null",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "c00e5fce25caebdeeb24db20880e6c2210f583cddb0d478075f78124258712dd"
+}
diff --git a/crates/database/.sqlx/query-c28c88869239edc02c073f461645eca82d816650fabe65464e2059d5908d8a28.json b/crates/database/.sqlx/query-c28c88869239edc02c073f461645eca82d816650fabe65464e2059d5908d8a28.json
new file mode 100644
index 0000000..1022356
--- /dev/null
+++ b/crates/database/.sqlx/query-c28c88869239edc02c073f461645eca82d816650fabe65464e2059d5908d8a28.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update users\n\nset email = ?\n\nwhere id is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "c28c88869239edc02c073f461645eca82d816650fabe65464e2059d5908d8a28"
+}
diff --git a/crates/database/.sqlx/query-c3dcd38a2d4ff391aed4a2ac3f393646319950334494ecb5fa7effe9806d07ab.json b/crates/database/.sqlx/query-c3dcd38a2d4ff391aed4a2ac3f393646319950334494ecb5fa7effe9806d07ab.json
new file mode 100644
index 0000000..dfcaf95
--- /dev/null
+++ b/crates/database/.sqlx/query-c3dcd38a2d4ff391aed4a2ac3f393646319950334494ecb5fa7effe9806d07ab.json
@@ -0,0 +1,50 @@
+{
+ "db_name": "SQLite",
+ "query": "select code,\n app,\n user,\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\"\nfrom authorization_codes\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "code",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "app",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "user",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "expires_at: DateTime",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "used_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true
+ ]
+ },
+ "hash": "c3dcd38a2d4ff391aed4a2ac3f393646319950334494ecb5fa7effe9806d07ab"
+}
diff --git a/crates/database/.sqlx/query-c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40.json b/crates/database/.sqlx/query-c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40.json
new file mode 100644
index 0000000..0d07457
--- /dev/null
+++ b/crates/database/.sqlx/query-c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere token is ?",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40"
+}
diff --git a/crates/database/.sqlx/query-c724c273f9d99bde48c29d7a0e65198a1ddd775cd1bda10f6e4a8acfbca64b72.json b/crates/database/.sqlx/query-c724c273f9d99bde48c29d7a0e65198a1ddd775cd1bda10f6e4a8acfbca64b72.json
new file mode 100644
index 0000000..bc0e38e
--- /dev/null
+++ b/crates/database/.sqlx/query-c724c273f9d99bde48c29d7a0e65198a1ddd775cd1bda10f6e4a8acfbca64b72.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into permissions(user, role)\nvalues (?, ?)\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "c724c273f9d99bde48c29d7a0e65198a1ddd775cd1bda10f6e4a8acfbca64b72"
+}
diff --git a/crates/database/.sqlx/query-ca7d100a9440fb7854a27f9aafd91ce94d1df9fa1ccd65b549be92d16741f9d2.json b/crates/database/.sqlx/query-ca7d100a9440fb7854a27f9aafd91ce94d1df9fa1ccd65b549be92d16741f9d2.json
new file mode 100644
index 0000000..a311ef4
--- /dev/null
+++ b/crates/database/.sqlx/query-ca7d100a9440fb7854a27f9aafd91ce94d1df9fa1ccd65b549be92d16741f9d2.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\",\n u.timezone,\n u.totp_secret,\n u.totp_backup\nfrom users u\n\n inner join refresh_tokens rt on u.id = rt.user\n\nwhere rt.token is ?\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "ca7d100a9440fb7854a27f9aafd91ce94d1df9fa1ccd65b549be92d16741f9d2"
+}
diff --git a/crates/database/.sqlx/query-cf12bd3112b2047f263118649ba89800509d94f3a858be99fb7ce8c8bc05d8b7.json b/crates/database/.sqlx/query-cf12bd3112b2047f263118649ba89800509d94f3a858be99fb7ce8c8bc05d8b7.json
new file mode 100644
index 0000000..2590fda
--- /dev/null
+++ b/crates/database/.sqlx/query-cf12bd3112b2047f263118649ba89800509d94f3a858be99fb7ce8c8bc05d8b7.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere password_recover is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "cf12bd3112b2047f263118649ba89800509d94f3a858be99fb7ce8c8bc05d8b7"
+}
diff --git a/crates/database/.sqlx/query-cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406.json b/crates/database/.sqlx/query-cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406.json
new file mode 100644
index 0000000..3e815e6
--- /dev/null
+++ b/crates/database/.sqlx/query-cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406.json
@@ -0,0 +1,50 @@
+{
+ "db_name": "SQLite",
+ "query": "select code,\n app,\n user,\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\"\nfrom authorization_codes\n\nwhere code is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "code",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "app",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "user",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "expires_at: DateTime",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "used_at: DateTime",
+ "ordinal": 5,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true
+ ]
+ },
+ "hash": "cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406"
+}
diff --git a/crates/database/.sqlx/query-d166553746afb2d3eaa1ddcb9986b7b9723258f4051bce8287038e3dd1ac928a.json b/crates/database/.sqlx/query-d166553746afb2d3eaa1ddcb9986b7b9723258f4051bce8287038e3dd1ac928a.json
new file mode 100644
index 0000000..0e34ded
--- /dev/null
+++ b/crates/database/.sqlx/query-d166553746afb2d3eaa1ddcb9986b7b9723258f4051bce8287038e3dd1ac928a.json
@@ -0,0 +1,44 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\",\n private_der,\n public_der\n\nfrom keys\nwhere revoked_at is null\norder by created_at desc\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "revoked_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "private_der",
+ "ordinal": 3,
+ "type_info": "Blob"
+ },
+ {
+ "name": "public_der",
+ "ordinal": 4,
+ "type_info": "Blob"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ true,
+ false,
+ false
+ ]
+ },
+ "hash": "d166553746afb2d3eaa1ddcb9986b7b9723258f4051bce8287038e3dd1ac928a"
+}
diff --git a/crates/database/.sqlx/query-d6d3a401f5563ce339099ccbdedec1ac248865810cafafd5d78d6cc3f74d5237.json b/crates/database/.sqlx/query-d6d3a401f5563ce339099ccbdedec1ac248865810cafafd5d78d6cc3f74d5237.json
new file mode 100644
index 0000000..1f5622e
--- /dev/null
+++ b/crates/database/.sqlx/query-d6d3a401f5563ce339099ccbdedec1ac248865810cafafd5d78d6cc3f74d5237.json
@@ -0,0 +1,98 @@
+{
+ "db_name": "SQLite",
+ "query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\",\n u.timezone,\n u.totp_secret,\n u.totp_backup\nfrom users u\n\n inner join authorization_codes ac on u.id = ac.user\n\nwhere ac.code is ?",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_admin: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ },
+ {
+ "name": "username",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "name",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "email",
+ "ordinal": 6,
+ "type_info": "Text"
+ },
+ {
+ "name": "password",
+ "ordinal": 7,
+ "type_info": "Text"
+ },
+ {
+ "name": "password_recover",
+ "ordinal": 8,
+ "type_info": "Text"
+ },
+ {
+ "name": "paper_key",
+ "ordinal": 9,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 10,
+ "type_info": "Int64"
+ },
+ {
+ "name": "timezone",
+ "ordinal": 11,
+ "type_info": "Text"
+ },
+ {
+ "name": "totp_secret",
+ "ordinal": 12,
+ "type_info": "Blob"
+ },
+ {
+ "name": "totp_backup",
+ "ordinal": 13,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ true,
+ true
+ ]
+ },
+ "hash": "d6d3a401f5563ce339099ccbdedec1ac248865810cafafd5d78d6cc3f74d5237"
+}
diff --git a/crates/database/.sqlx/query-d8517e5faa5292da25d21a85fcb2f676dce0f67275466566d5bbedf0f4b7f4f5.json b/crates/database/.sqlx/query-d8517e5faa5292da25d21a85fcb2f676dce0f67275466566d5bbedf0f4b7f4f5.json
new file mode 100644
index 0000000..dcc5b4e
--- /dev/null
+++ b/crates/database/.sqlx/query-d8517e5faa5292da25d21a85fcb2f676dce0f67275466566d5bbedf0f4b7f4f5.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere is_archived is 1\norder by created_at desc",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "redirect_uri",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "secret",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_confidential: bool",
+ "ordinal": 6,
+ "type_info": "Int64"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 7,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "d8517e5faa5292da25d21a85fcb2f676dce0f67275466566d5bbedf0f4b7f4f5"
+}
diff --git a/crates/database/.sqlx/query-e22ba816faac0c17ca9f2c31fd1b4a5f13a09cece9ec78e0b6e018950c91facb.json b/crates/database/.sqlx/query-e22ba816faac0c17ca9f2c31fd1b4a5f13a09cece9ec78e0b6e018950c91facb.json
new file mode 100644
index 0000000..a9d610d
--- /dev/null
+++ b/crates/database/.sqlx/query-e22ba816faac0c17ca9f2c31fd1b4a5f13a09cece9ec78e0b6e018950c91facb.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere id is (?)\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "redirect_uri",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "secret",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_confidential: bool",
+ "ordinal": 6,
+ "type_info": "Int64"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 7,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "e22ba816faac0c17ca9f2c31fd1b4a5f13a09cece9ec78e0b6e018950c91facb"
+}
diff --git a/crates/database/.sqlx/query-e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65.json b/crates/database/.sqlx/query-e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65.json
new file mode 100644
index 0000000..c3b11d2
--- /dev/null
+++ b/crates/database/.sqlx/query-e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "select page_count * page_size\nFROM pragma_page_count(), pragma_page_size();",
+ "describe": {
+ "columns": [
+ {
+ "name": "page_count * page_size",
+ "ordinal": 0,
+ "type_info": "Int"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ null
+ ]
+ },
+ "hash": "e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65"
+}
diff --git a/crates/database/.sqlx/query-eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8.json b/crates/database/.sqlx/query-eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8.json
new file mode 100644
index 0000000..40156dc
--- /dev/null
+++ b/crates/database/.sqlx/query-eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select a.id,\n a.created_at as \"created_at: DateTime\",\n a.updated_at as \"updated_at: DateTime\",\n a.label,\n a.redirect_uri,\n a.secret,\n a.is_confidential as \"is_confidential: bool\",\n a.is_archived as \"is_archived: bool\"\nfrom apps a\n\n inner join authorization_codes ac on a.id = ac.app\n\nwhere ac.code is ?\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "redirect_uri",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "secret",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_confidential: bool",
+ "ordinal": 6,
+ "type_info": "Int64"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 7,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8"
+}
diff --git a/crates/database/.sqlx/query-eb1a0153c88b0b2744ed1b71df04a91a129a0173fbbc3e2536f52d41e8dc99c4.json b/crates/database/.sqlx/query-eb1a0153c88b0b2744ed1b71df04a91a129a0173fbbc3e2536f52d41e8dc99c4.json
new file mode 100644
index 0000000..c4b881a
--- /dev/null
+++ b/crates/database/.sqlx/query-eb1a0153c88b0b2744ed1b71df04a91a129a0173fbbc3e2536f52d41e8dc99c4.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere id is (?)\n and redirect_uri is (?)\n and is_archived is 0\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "redirect_uri",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "secret",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_confidential: bool",
+ "ordinal": 6,
+ "type_info": "Int64"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 7,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "eb1a0153c88b0b2744ed1b71df04a91a129a0173fbbc3e2536f52d41e8dc99c4"
+}
diff --git a/crates/database/.sqlx/query-ebe28f418d28303b2efe1fe192a63538d29d75c57b67d5eac1ac4ceaa1472a5c.json b/crates/database/.sqlx/query-ebe28f418d28303b2efe1fe192a63538d29d75c57b67d5eac1ac4ceaa1472a5c.json
new file mode 100644
index 0000000..1ae835a
--- /dev/null
+++ b/crates/database/.sqlx/query-ebe28f418d28303b2efe1fe192a63538d29d75c57b67d5eac1ac4ceaa1472a5c.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "update authorization_codes\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and used_at is null",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": []
+ },
+ "hash": "ebe28f418d28303b2efe1fe192a63538d29d75c57b67d5eac1ac4ceaa1472a5c"
+}
diff --git a/crates/database/.sqlx/query-ed27954feb3e21b5c519ccd0312526e68fb3d88a1feb28bdafb414e990da55e8.json b/crates/database/.sqlx/query-ed27954feb3e21b5c519ccd0312526e68fb3d88a1feb28bdafb414e990da55e8.json
new file mode 100644
index 0000000..99f76a8
--- /dev/null
+++ b/crates/database/.sqlx/query-ed27954feb3e21b5c519ccd0312526e68fb3d88a1feb28bdafb414e990da55e8.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into apps (id, label, redirect_uri, secret, is_confidential)\nvalues (?, ?, ?, ?, ?)\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 5
+ },
+ "nullable": []
+ },
+ "hash": "ed27954feb3e21b5c519ccd0312526e68fb3d88a1feb28bdafb414e990da55e8"
+}
diff --git a/crates/database/.sqlx/query-f705411720bd037562f7e3622832262ac4c0a8fc0921fbd934d2b98146d3f413.json b/crates/database/.sqlx/query-f705411720bd037562f7e3622832262ac4c0a8fc0921fbd934d2b98146d3f413.json
new file mode 100644
index 0000000..1beaa47
--- /dev/null
+++ b/crates/database/.sqlx/query-f705411720bd037562f7e3622832262ac4c0a8fc0921fbd934d2b98146d3f413.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "insert into keys (id, private_der, public_der)\nvalues (?, ?, ?)\n",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 3
+ },
+ "nullable": []
+ },
+ "hash": "f705411720bd037562f7e3622832262ac4c0a8fc0921fbd934d2b98146d3f413"
+}
diff --git a/crates/database/.sqlx/query-fb35faa6eb7349f783d0053509225216693532c7233a3bf61674b64c2fb3dad7.json b/crates/database/.sqlx/query-fb35faa6eb7349f783d0053509225216693532c7233a3bf61674b64c2fb3dad7.json
new file mode 100644
index 0000000..e55a6a8
--- /dev/null
+++ b/crates/database/.sqlx/query-fb35faa6eb7349f783d0053509225216693532c7233a3bf61674b64c2fb3dad7.json
@@ -0,0 +1,62 @@
+{
+ "db_name": "SQLite",
+ "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\norder by created_at desc\n",
+ "describe": {
+ "columns": [
+ {
+ "name": "id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "updated_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 3,
+ "type_info": "Text"
+ },
+ {
+ "name": "redirect_uri",
+ "ordinal": 4,
+ "type_info": "Text"
+ },
+ {
+ "name": "secret",
+ "ordinal": 5,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_confidential: bool",
+ "ordinal": 6,
+ "type_info": "Int64"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 7,
+ "type_info": "Int64"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "fb35faa6eb7349f783d0053509225216693532c7233a3bf61674b64c2fb3dad7"
+}
diff --git a/crates/database/Cargo.toml b/crates/database/Cargo.toml
index 8f5dcfc..431629e 100644
--- a/crates/database/Cargo.toml
+++ b/crates/database/Cargo.toml
@@ -8,4 +8,4 @@ thiserror = { workspace = true }
[dependencies.sqlx]
workspace = true
-features = ["sqlite", "macros", "migrate", "chrono", "offline", "runtime-tokio-rustls"]
+features = ["sqlite", "macros", "migrate", "chrono", "runtime-tokio-rustls"]
diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json
deleted file mode 100644
index 33c88e9..0000000
--- a/crates/database/sqlx-data.json
+++ /dev/null
@@ -1,2129 +0,0 @@
-{
- "db": "SQLite",
- "06cfa74715f3725e99e63aa206f1be5d26cb26924d53dc5a68ee4ea48d6bbbfd": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update settings\n\nset business_logo = ?\n\nwhere id is 0\n"
- },
- "0b60c7829e95dde4145b7f207b64df7006c1fde2faaca0f7952a009d6cda90a3": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update settings\n\nset business_name = ?\n\nwhere id is 0\n"
- },
- "13c26aaf556d259535afb95f5c53b4c594f373084c73000bc7865a280df74fdd": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "redirect_uri",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "secret",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "is_confidential: bool",
- "ordinal": 6,
- "type_info": "Int64"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 7,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere is_archived is 0\norder by created_at desc"
- },
- "184d704e75f00513082dd2c6cc3ae5c3f58b57b222ba4333216b5c50c3c58c71": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 4
- }
- },
- "query": "update apps\n\nset label = ?,\n redirect_uri = ?,\n is_confidential = ?\n\nwhere id is ?"
- },
- "1e2edc8cf28832344dbfa0878ac01361b6f97c552d6af8477da12cddb03d4865": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update apps\n\nset secret = ?\n\nwhere id is ?"
- },
- "2d562e7b19d7d8303a0e79d143d25fd68743ae30d1ec0b0ca5c7dfc367fdf357": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update apps\n\nset is_archived = 1\n\nwhere id is ?"
- },
- "2ee77458d93ae79d957e03e6ca50c1bf690f40b6cc6ec5f008eb0e928f376659": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update roles\n\nset is_archived = ?\n\nwhere name is ?"
- },
- "32d35bdd1f4cf64ce0ff7beb7a11591e0f35eab7211692bcde8230c68e4cedf3": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset password_recover = ?\n\nwhere id is ?"
- },
- "37000307a757b4912ca300c346b5bd8ee5d50331d94abeee076ae4db46215a56": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere email is (?)\n"
- },
- "37681902a5f5d87492812a525a6488e75d20c1c436a3ba2c5aa3f54da62fe861": {
- "describe": {
- "columns": [
- {
- "name": "token",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "ip_address",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "user",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "app",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "expires_at: DateTime",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "used_at: DateTime",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "revoked_at: DateTime",
- "ordinal": 7,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select\n -- info\n token,\n ip_address,\n user,\n app,\n\n -- timings\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\"\nfrom refresh_tokens\n\nwhere token is (?)"
- },
- "3c8e31ffa5cbfd4dded8a272777cb320fb51fd2e53ed25054d24e9801df0c358": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update refresh_tokens\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?"
- },
- "44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "insert into roles (name, label)\nvalues (?, ?)\n"
- },
- "46caa546db24d2c1e8192f9e699202be5129c74a5569b2dc7bf95761fe09a6a3": {
- "describe": {
- "columns": [
- {
- "name": "user",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "role",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\nwhere role is (?)\n"
- },
- "520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 4
- }
- },
- "query": "insert into users (id, is_admin, username, password)\nvalues (?, ?, ?, ?)\n"
- },
- "52c16bb0e76dd1726d151b69d1ba3b89948ee6ac5116e442faef8512c1a615c0": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset is_archived = ?\n\nwhere id is ?"
- },
- "545f19b0373c7ffe16864eb242c15a0092355e120c5cbe006c877afdfc4a4e8c": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset username = ?\n\nwhere id is ?"
- },
- "5567f75b47f739e85da3469bec0202be315c42dfc820d3c37bba498b1b783811": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere username is (?)\n"
- },
- "56a9c0dff010858189a95087d014c7d0ce930da5d841b9d788a9c0e84b580bc6": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "revoked_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "private_der",
- "ordinal": 3,
- "type_info": "Blob"
- },
- {
- "name": "public_der",
- "ordinal": 4,
- "type_info": "Blob"
- }
- ],
- "nullable": [
- false,
- false,
- true,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\",\n private_der,\n public_der\n\nfrom keys\norder by created_at desc\n"
- },
- "58e0626629a768c33783bbc926c3d1477ad7e4e983b61ede013e5b066940eb5c": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset timezone = ?\n\nwhere id is ?"
- },
- "5a365b761ada7d5f67e5ad3ff9a1a89d96383e28b15186576f90ff59f309196c": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and used_at is null"
- },
- "5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de": {
- "describe": {
- "columns": [
- {
- "name": "name",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 3,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select name,\n label,\n created_at as \"created_at: DateTime\",\n is_archived as \"is_archived: bool\"\nfrom roles\n\norder by created_at desc\n"
- },
- "5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "revoked_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "private_der",
- "ordinal": 3,
- "type_info": "Blob"
- },
- {
- "name": "public_der",
- "ordinal": 4,
- "type_info": "Blob"
- }
- ],
- "nullable": [
- false,
- false,
- true,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\",\n private_der,\n public_der\n\nfrom keys\nwhere revoked_at is not null\norder by created_at desc\n"
- },
- "62c75412f673f6a293b0d188d79c50676ec21cf94e2e50e18f9279c91e6b85c8": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 0
- }
- },
- "query": "insert or ignore into settings(id)\nvalues (0);"
- },
- "645f583812c4d71570d1e84b866e85c5a012d71cd745494049a8d9bebab3ed61": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?"
- },
- "657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 0
- }
- },
- "query": "vacuum"
- },
- "68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset paper_key = ?\n\nwhere id is ?"
- },
- "693c8c3de266cb3a8fc98bdea8e3b87de0dcb78316628d48f0e6efc0f8103040": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update roles\n\nset label = ?\n\nwhere name is ?"
- },
- "6fa3c48b9e93fb9ec6807f7547a8f999fc55a6fb8ad4abe7af89ec52e0d10a0e": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "delete\nfrom permissions\n\nwhere user is ?\n and role is ?"
- },
- "6ff12f357d884a50035d708577a7f3109a07a1ca193cb3082d13687af65c6de0": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset is_admin = ?\n\nwhere id is ?"
- },
- "71c74369dc5d374d8ec5aa347b5f599728b74e545df3e986e3e7e66882f73ba0": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere id is (?)\n"
- },
- "73bdbde04fca37f2411e7a9e1b6dbccc0dd4d12ebcb933024d9867f07bba3eb8": {
- "describe": {
- "columns": [
- {
- "name": "user",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "role",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 2
- }
- },
- "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\nwhere user is (?)\n and role is (?)\n"
- },
- "7b7f2430b2a719b3d5ce504c0a9302731b3ff82da99ba7771c2728d88aee642a": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update keys\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere revoked_at is null\n and id is not (?)\n"
- },
- "7f26b73408318040f94fb6574d5cc25482cef1a57ba4c467fa0bc0fdf25bf39c": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update authorization_codes\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere code is ?"
- },
- "87906834faa6f185aee0e4d893b9754908b1c173e9dce383663d723891a89cd1": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update settings\n\nset url = ?\n\nwhere id is 0\n"
- },
- "8c131e1f73ffa01fc3e5e08071a786b85f23b9638d1c7eaa7b633c052703c911": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset name = ?\n\nwhere id is ?"
- },
- "8c37375b0694df02b7f1b6678e4e2c3ffbc590c0f305ff5a8f44350fba3eaec7": {
- "describe": {
- "columns": [
- {
- "name": "user",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "role",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\nwhere user is (?)\n"
- },
- "93b15a942a6c7db595990f00e14fde26d6d36b8c8de9935179d41f6c7c755978": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere app is ?\n and revoked_at is null"
- },
- "9784afe2dcff4db86908175d4e3145baf72b3361f43e4127350a14a183ef63f7": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset password = ?\n\nwhere id is ?"
- },
- "979c7ba41dac5ea5593fc169ea95b68d2311c5ae05c1e18db43424c8ed2f2e4e": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\norder by created_at desc\n"
- },
- "9a3aef02e55fc436e9c09c1ee6d29477c2746765f6e7d5679058ec6525ee7253": {
- "describe": {
- "columns": [
- {
- "name": "name",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 3,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select name,\n label,\n created_at as \"created_at: DateTime\",\n is_archived as \"is_archived: bool\"\nfrom roles\n\nwhere name is (?)\n"
- },
- "9dc379b0f3a3c944a33ef01dc40489b29b2a61b9f73f6ca4b5df7e9fb9bccf90": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\",\n u.timezone,\n u.totp_secret,\n u.totp_backup\nfrom users u\n\n inner join settings s on u.id = s.first_admin\n\nwhere u.is_admin is 1\n and u.is_archived is 0\n and u.id is s.first_admin\n\nlimit 1"
- },
- "9f1885c4786f73335b4d614f562bb7cad49c91bfe7f084d8c25c6c571673ab90": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 0
- }
- },
- "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere revoked_at is null"
- },
- "a0dd1ddcc7d58fad78ed6c5027a9559428be9d0d59df6409ca9ec7cd728f6001": {
- "describe": {
- "columns": [
- {
- "name": "token",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "user",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "expires_at: DateTime",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "used_at: DateTime",
- "ordinal": 4,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select\n -- info\n token,\n user,\n\n -- timings\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\"\nfrom totp_login_requests\n\nwhere token is (?)"
- },
- "a2bf546b2cf6a53a3a127c08fbb7f3dfcf0fe7a30364b1fb57c3e6b757093578": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 3
- }
- },
- "query": "insert into totp_login_requests (token, user, expires_at)\nvalues (?, ?, datetime(?, 'unixepoch'))\n"
- },
- "a55b17a3a70e6445517f19536220f0dafc78a0e8b69221dee4715f84841839da": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 4
- }
- },
- "query": "insert into authorization_codes (code, app, user, expires_at)\nvalues (?, ?, ?, datetime(?, 'unixepoch'))\n"
- },
- "a9e910eedc27c495262571520627363290640b3af7d177a024cad06220a770f0": {
- "describe": {
- "columns": [
- {
- "name": "user",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "role",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select user,\n role,\n created_at as \"created_at: DateTime\"\n\nfrom permissions\n"
- },
- "aae93a39c5a9f46235b5ef871b45ba76d7efa1677bfe8291a62b8cbf9cd9e0d5": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update settings\n\nset first_admin = ?\n\nwhere id is 0\n"
- },
- "adcbc32e2c284b59eefb79fd2ff33d4ff1c2e250b2d103d8500fae203fb18a6d": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Int64"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "business_name",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "business_logo",
- "ordinal": 4,
- "type_info": "Blob"
- },
- {
- "name": "url",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "first_admin",
- "ordinal": 6,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- true,
- true,
- true,
- true
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n business_name,\n business_logo,\n url,\n first_admin\n\nfrom settings\n\nwhere id is 0\n"
- },
- "afc08ba1fd47656c7d987e3817941004f988e683d28df2f533ff6272bc71b356": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset totp_secret = ?\n\nwhere id is ?"
- },
- "b3936ae237f02cc048ca084372f7975921c79aef8fcd6d15a4d63c10f2377d24": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 5
- }
- },
- "query": "insert into refresh_tokens (token, ip_address, user, app, expires_at)\nvalues (?, ?, ?, ?, datetime(?, 'unixepoch'))\n"
- },
- "baaae9952348da17e2f4d099c6903c50bc90daed80ee2df1fd0dc1d9d2c67b26": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset totp_backup = ?\n\nwhere id is ?"
- },
- "c00e5fce25caebdeeb24db20880e6c2210f583cddb0d478075f78124258712dd": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and revoked_at is null"
- },
- "c28c88869239edc02c073f461645eca82d816650fabe65464e2059d5908d8a28": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "update users\n\nset email = ?\n\nwhere id is ?"
- },
- "c3dcd38a2d4ff391aed4a2ac3f393646319950334494ecb5fa7effe9806d07ab": {
- "describe": {
- "columns": [
- {
- "name": "code",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "app",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "user",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "expires_at: DateTime",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "used_at: DateTime",
- "ordinal": 5,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select code,\n app,\n user,\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\"\nfrom authorization_codes\n"
- },
- "c6157ec3928527ec0ac5f493a5a91faff7e3668204a179e827a87d6279a02c40": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update refresh_tokens\n\nset revoked_at = CURRENT_TIMESTAMP\n\nwhere token is ?"
- },
- "c724c273f9d99bde48c29d7a0e65198a1ddd775cd1bda10f6e4a8acfbca64b72": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 2
- }
- },
- "query": "insert into permissions(user, role)\nvalues (?, ?)\n"
- },
- "ca7d100a9440fb7854a27f9aafd91ce94d1df9fa1ccd65b549be92d16741f9d2": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\",\n u.timezone,\n u.totp_secret,\n u.totp_backup\nfrom users u\n\n inner join refresh_tokens rt on u.id = rt.user\n\nwhere rt.token is ?\n"
- },
- "cf12bd3112b2047f263118649ba89800509d94f3a858be99fb7ce8c8bc05d8b7": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n is_admin as \"is_admin: bool\",\n username,\n name,\n email,\n password,\n password_recover,\n paper_key,\n is_archived as \"is_archived: bool\",\n timezone,\n totp_secret,\n totp_backup\nfrom users\n\nwhere password_recover is (?)\n"
- },
- "cf624c4e122477228e3bab09f7cd0dedf4776f73e7a86f19e06772a0adf83406": {
- "describe": {
- "columns": [
- {
- "name": "code",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "app",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "user",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "expires_at: DateTime",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "used_at: DateTime",
- "ordinal": 5,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select code,\n app,\n user,\n created_at as \"created_at: DateTime\",\n expires_at as \"expires_at: DateTime\",\n used_at as \"used_at: DateTime\"\nfrom authorization_codes\n\nwhere code is (?)\n"
- },
- "d166553746afb2d3eaa1ddcb9986b7b9723258f4051bce8287038e3dd1ac928a": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "revoked_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "private_der",
- "ordinal": 3,
- "type_info": "Blob"
- },
- {
- "name": "public_der",
- "ordinal": 4,
- "type_info": "Blob"
- }
- ],
- "nullable": [
- false,
- false,
- true,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n revoked_at as \"revoked_at: DateTime\",\n private_der,\n public_der\n\nfrom keys\nwhere revoked_at is null\norder by created_at desc\n"
- },
- "d6d3a401f5563ce339099ccbdedec1ac248865810cafafd5d78d6cc3f74d5237": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "is_admin: bool",
- "ordinal": 3,
- "type_info": "Int64"
- },
- {
- "name": "username",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "name",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "email",
- "ordinal": 6,
- "type_info": "Text"
- },
- {
- "name": "password",
- "ordinal": 7,
- "type_info": "Text"
- },
- {
- "name": "password_recover",
- "ordinal": 8,
- "type_info": "Text"
- },
- {
- "name": "paper_key",
- "ordinal": 9,
- "type_info": "Text"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 10,
- "type_info": "Int64"
- },
- {
- "name": "timezone",
- "ordinal": 11,
- "type_info": "Text"
- },
- {
- "name": "totp_secret",
- "ordinal": 12,
- "type_info": "Blob"
- },
- {
- "name": "totp_backup",
- "ordinal": 13,
- "type_info": "Text"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- true,
- true,
- true,
- true,
- true,
- false,
- false,
- true,
- true
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select u.id,\n u.created_at as \"created_at: DateTime\",\n u.updated_at as \"updated_at: DateTime\",\n u.is_admin as \"is_admin: bool\",\n u.username,\n u.name,\n u.email,\n u.password,\n u.password_recover,\n u.paper_key,\n u.is_archived as \"is_archived: bool\",\n u.timezone,\n u.totp_secret,\n u.totp_backup\nfrom users u\n\n inner join authorization_codes ac on u.id = ac.user\n\nwhere ac.code is ?"
- },
- "d8517e5faa5292da25d21a85fcb2f676dce0f67275466566d5bbedf0f4b7f4f5": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "redirect_uri",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "secret",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "is_confidential: bool",
- "ordinal": 6,
- "type_info": "Int64"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 7,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere is_archived is 1\norder by created_at desc"
- },
- "e22ba816faac0c17ca9f2c31fd1b4a5f13a09cece9ec78e0b6e018950c91facb": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "redirect_uri",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "secret",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "is_confidential: bool",
- "ordinal": 6,
- "type_info": "Int64"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 7,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere id is (?)\n"
- },
- "e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65": {
- "describe": {
- "columns": [
- {
- "name": "page_count * page_size",
- "ordinal": 0,
- "type_info": "Int"
- }
- ],
- "nullable": [
- null
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select page_count * page_size\nFROM pragma_page_count(), pragma_page_size();"
- },
- "eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "redirect_uri",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "secret",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "is_confidential: bool",
- "ordinal": 6,
- "type_info": "Int64"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 7,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 1
- }
- },
- "query": "select a.id,\n a.created_at as \"created_at: DateTime\",\n a.updated_at as \"updated_at: DateTime\",\n a.label,\n a.redirect_uri,\n a.secret,\n a.is_confidential as \"is_confidential: bool\",\n a.is_archived as \"is_archived: bool\"\nfrom apps a\n\n inner join authorization_codes ac on a.id = ac.app\n\nwhere ac.code is ?\n"
- },
- "eb1a0153c88b0b2744ed1b71df04a91a129a0173fbbc3e2536f52d41e8dc99c4": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "redirect_uri",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "secret",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "is_confidential: bool",
- "ordinal": 6,
- "type_info": "Int64"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 7,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 2
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere id is (?)\n and redirect_uri is (?)\n and is_archived is 0\n"
- },
- "ebe28f418d28303b2efe1fe192a63538d29d75c57b67d5eac1ac4ceaa1472a5c": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 1
- }
- },
- "query": "update authorization_codes\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and used_at is null"
- },
- "ed27954feb3e21b5c519ccd0312526e68fb3d88a1feb28bdafb414e990da55e8": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 5
- }
- },
- "query": "insert into apps (id, label, redirect_uri, secret, is_confidential)\nvalues (?, ?, ?, ?, ?)\n"
- },
- "f705411720bd037562f7e3622832262ac4c0a8fc0921fbd934d2b98146d3f413": {
- "describe": {
- "columns": [],
- "nullable": [],
- "parameters": {
- "Right": 3
- }
- },
- "query": "insert into keys (id, private_der, public_der)\nvalues (?, ?, ?)\n"
- },
- "fb35faa6eb7349f783d0053509225216693532c7233a3bf61674b64c2fb3dad7": {
- "describe": {
- "columns": [
- {
- "name": "id",
- "ordinal": 0,
- "type_info": "Text"
- },
- {
- "name": "created_at: DateTime",
- "ordinal": 1,
- "type_info": "Text"
- },
- {
- "name": "updated_at: DateTime",
- "ordinal": 2,
- "type_info": "Text"
- },
- {
- "name": "label",
- "ordinal": 3,
- "type_info": "Text"
- },
- {
- "name": "redirect_uri",
- "ordinal": 4,
- "type_info": "Text"
- },
- {
- "name": "secret",
- "ordinal": 5,
- "type_info": "Text"
- },
- {
- "name": "is_confidential: bool",
- "ordinal": 6,
- "type_info": "Int64"
- },
- {
- "name": "is_archived: bool",
- "ordinal": 7,
- "type_info": "Int64"
- }
- ],
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ],
- "parameters": {
- "Right": 0
- }
- },
- "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\norder by created_at desc\n"
- }
-}
\ No newline at end of file
From 2ae345800c1143ee3cc394ab38baca5457c49185 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Wed, 15 Nov 2023 20:11:27 +0100
Subject: [PATCH 02/13] temporary patch to rocket_cors until new release
---
Cargo.toml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Cargo.toml b/Cargo.toml
index cfdbcfa..05aff74 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,3 +19,7 @@ gen_passphrase = "0.1.1"
[profile.dev.package.sqlx-macros]
opt-level = 3
+
+# temporary
+[patch.crates-io]
+rocket_cors = { git = "https://github.com/j03-dev/rocket_cors", branch = "master" }
From b4271853a9a092ab1162fa6e0843d4b61c2563e3 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Wed, 15 Nov 2023 21:01:22 +0100
Subject: [PATCH 03/13] rocket v0.5-rc4 with some adjustements:
- all db access are done with transactions
- Forwards in Outcomes return a status
---
crates/ezidam/Cargo.toml | 6 +-
crates/ezidam/src/guards/access_token.rs | 10 +-
crates/ezidam/src/guards/basic_auth.rs | 6 +-
crates/ezidam/src/guards/completed_setup.rs | 6 +-
crates/ezidam/src/guards/jwt.rs | 98 +++++++++----------
.../src/guards/jwt/admin_not_current.rs | 7 +-
crates/ezidam/src/guards/need_setup.rs | 6 +-
crates/ezidam/src/guards/refresh_token.rs | 3 +-
crates/ezidam/src/guards/totp_request.rs | 5 +-
crates/ezidam/src/routes.rs | 1 +
crates/ezidam/src/routes/admin/apps.rs | 27 +++--
crates/ezidam/src/routes/admin/dashboard.rs | 8 +-
crates/ezidam/src/routes/admin/permissions.rs | 36 +++----
crates/ezidam/src/routes/admin/roles.rs | 20 ++--
crates/ezidam/src/routes/admin/settings.rs | 45 +++++----
crates/ezidam/src/routes/admin/users.rs | 60 +++++++-----
crates/ezidam/src/routes/oauth/authorize.rs | 14 +--
crates/ezidam/src/routes/oauth/redirect.rs | 27 ++---
crates/ezidam/src/routes/oauth/token.rs | 53 +++++-----
crates/ezidam/src/routes/oauth/totp.rs | 38 +++----
.../ezidam/src/routes/root/forgot_password.rs | 10 +-
crates/ezidam/src/routes/root/logo.rs | 4 +-
crates/ezidam/src/routes/root/logout.rs | 22 +++--
.../ezidam/src/routes/root/reset_password.rs | 7 +-
crates/ezidam/src/routes/settings/personal.rs | 15 +--
crates/ezidam/src/routes/settings/security.rs | 45 ++++-----
crates/ezidam/src/routes/setup.rs | 15 ++-
crates/ezidam/src/routes/well_known.rs | 8 +-
28 files changed, 332 insertions(+), 270 deletions(-)
diff --git a/crates/ezidam/Cargo.toml b/crates/ezidam/Cargo.toml
index 3450b7b..ae07f1e 100644
--- a/crates/ezidam/Cargo.toml
+++ b/crates/ezidam/Cargo.toml
@@ -4,9 +4,9 @@ version = "0.1.0"
edition = "2021"
[dependencies]
-rocket = { version = "=0.5.0-rc.3", features = ["json"] }
-rocket_db_pools = { version = "=0.1.0-rc.3", features = ["sqlx_sqlite"] }
-rocket_dyn_templates = { version = "=0.1.0-rc.3", features = ["tera"] }
+rocket = { version = "=0.5.0-rc.4", features = ["json"] }
+rocket_db_pools = { version = "=0.1.0-rc.4", features = ["sqlx_sqlite"] }
+rocket_dyn_templates = { version = "=0.1.0-rc.4", features = ["tera"] }
infer = { version = "0.13", default-features = false }
erased-serde = "0.3"
url = { workspace = true }
diff --git a/crates/ezidam/src/guards/access_token.rs b/crates/ezidam/src/guards/access_token.rs
index 476d2d2..0756af9 100644
--- a/crates/ezidam/src/guards/access_token.rs
+++ b/crates/ezidam/src/guards/access_token.rs
@@ -35,7 +35,7 @@ impl AccessToken {
},
Err(e) => match e {
Outcome::Success(s) => Ok(Some(Self(s))),
- Outcome::Failure(e) => Err(BearerAuthError::Jwt(e.1)),
+ Outcome::Error(e) => Err(BearerAuthError::Jwt(e.1)),
Outcome::Forward(_) => Ok(None),
},
}
@@ -50,15 +50,15 @@ impl<'r> FromRequest<'r> for AccessToken {
let keys: Vec<_> = request.headers().get("Authorization").collect();
match keys.len() {
- 0 => Outcome::Forward(()),
+ 0 => Outcome::Forward(Status::Unauthorized),
1 => match AccessToken::from_bearer(keys[0], request).await {
Ok(access_token) => match access_token {
Some(access_token) => Outcome::Success(access_token),
- None => Outcome::Forward(()),
+ None => Outcome::Forward(Status::Unauthorized),
},
- Err(e) => Outcome::Failure((Status::Unauthorized, e)),
+ Err(e) => Outcome::Error((Status::Unauthorized, e)),
},
- _ => Outcome::Failure((Status::BadRequest, BearerAuthError::BadCount)),
+ _ => Outcome::Error((Status::BadRequest, BearerAuthError::BadCount)),
}
}
}
diff --git a/crates/ezidam/src/guards/basic_auth.rs b/crates/ezidam/src/guards/basic_auth.rs
index a8a4d2b..cccb549 100644
--- a/crates/ezidam/src/guards/basic_auth.rs
+++ b/crates/ezidam/src/guards/basic_auth.rs
@@ -56,12 +56,12 @@ impl<'r> FromRequest<'r> for BasicAuth {
let keys: Vec<_> = request.headers().get("Authorization").collect();
match keys.len() {
- 0 => Outcome::Forward(()),
+ 0 => Outcome::Forward(Status::BadRequest),
1 => match BasicAuth::from_base64(keys[0]) {
Ok(auth_header) => Outcome::Success(auth_header),
- Err(e) => Outcome::Failure((Status::BadRequest, e)),
+ Err(e) => Outcome::Error((Status::BadRequest, e)),
},
- _ => Outcome::Failure((Status::BadRequest, BasicAuthError::BadCount)),
+ _ => Outcome::Error((Status::BadRequest, BasicAuthError::BadCount)),
}
}
}
diff --git a/crates/ezidam/src/guards/completed_setup.rs b/crates/ezidam/src/guards/completed_setup.rs
index 057eb35..2a38e15 100644
--- a/crates/ezidam/src/guards/completed_setup.rs
+++ b/crates/ezidam/src/guards/completed_setup.rs
@@ -19,16 +19,16 @@ impl<'r> FromRequest<'r> for CompletedSetup {
async fn from_request(request: &'r Request<'_>) -> Outcome {
let db = match request.guard::<&Database>().await {
Outcome::Success(database) => database,
- Outcome::Failure(e) => return Outcome::Failure((e.0, Error::GetDatabase)),
+ Outcome::Error(e) => return Outcome::Error((e.0, Error::GetDatabase)),
Outcome::Forward(f) => return Outcome::Forward(f),
};
match User::get_initial_admin(&**db).await {
Ok(initial_admin) => match initial_admin {
Some(_) => Outcome::Success(CompletedSetup),
- None => Outcome::Forward(()),
+ None => Outcome::Forward(Status::PermanentRedirect),
},
- Err(e) => Outcome::Failure((Status::InternalServerError, Error::Request(e))),
+ Err(e) => Outcome::Error((Status::InternalServerError, Error::Request(e))),
}
}
}
diff --git a/crates/ezidam/src/guards/jwt.rs b/crates/ezidam/src/guards/jwt.rs
index ddc5f57..83fdb97 100644
--- a/crates/ezidam/src/guards/jwt.rs
+++ b/crates/ezidam/src/guards/jwt.rs
@@ -16,6 +16,7 @@ use rocket::time::Duration;
use rocket::tokio::task;
use rocket::Request;
use settings::Settings;
+use std::ops::DerefMut;
use users::User;
mod admin;
@@ -78,14 +79,14 @@ pub async fn validate_jwt(
// Get database
let db = match request.guard::<&Database>().await {
Outcome::Success(database) => database,
- Outcome::Failure(e) => return Err(Outcome::Failure((e.0, Error::GetDatabase))),
+ Outcome::Error(e) => return Err(Outcome::Error((e.0, Error::GetDatabase))),
Outcome::Forward(f) => return Err(Outcome::Forward(f)),
};
let mut transaction = match db.begin().await {
Ok(transaction) => transaction,
Err(_e) => {
- return Err(Outcome::Failure((
+ return Err(Outcome::Error((
Status::InternalServerError,
Error::StartTransaction,
)));
@@ -93,10 +94,10 @@ pub async fn validate_jwt(
};
// Get keys
- let keys = match Key::get_all(&mut transaction, Some(false)).await {
+ let keys = match Key::get_all(transaction.deref_mut(), Some(false)).await {
Ok(keys) => keys,
Err(e) => {
- return Err(Outcome::Failure((
+ return Err(Outcome::Error((
Status::InternalServerError,
Error::Keys(e),
)))
@@ -105,10 +106,10 @@ pub async fn validate_jwt(
if let Some(specific_user) = specific_user {
// Get settings
- let settings = match Settings::get(&mut transaction).await {
+ let settings = match Settings::get(transaction.deref_mut()).await {
Ok(settings) => settings,
Err(e) => {
- return Err(Outcome::Failure((
+ return Err(Outcome::Error((
Status::InternalServerError,
Error::GetSettings(e),
)));
@@ -119,7 +120,7 @@ pub async fn validate_jwt(
let first_admin = match settings.first_admin() {
Some(home_page) => UserID(home_page.to_string()),
None => {
- return Err(Outcome::Failure((
+ return Err(Outcome::Error((
Status::InternalServerError,
Error::FirstAdminNotSet,
)));
@@ -133,7 +134,7 @@ pub async fn validate_jwt(
}
if let Err(_e) = transaction.commit().await {
- return Err(Outcome::Failure((
+ return Err(Outcome::Error((
Status::InternalServerError,
Error::CommitTransaction,
)));
@@ -191,11 +192,11 @@ pub async fn validate_jwt(
// Return jwt claims
Ok(claims)
}
- Err(_e) => Err(Outcome::Forward(())),
+ Err(_e) => Err(Outcome::Forward(Status::Unauthorized)),
},
Err(e) => {
// Failed to run blocking task
- Err(Outcome::Failure((
+ Err(Outcome::Error((
Status::InternalServerError,
Error::BlockingTask(e.to_string()),
)))
@@ -211,92 +212,92 @@ pub async fn use_refresh_token(
// Get database
let db = match request.guard::<&Database>().await {
Outcome::Success(database) => database,
- Outcome::Failure(e) => return Outcome::Failure((e.0, Error::GetDatabase)),
+ Outcome::Error(e) => return Outcome::Error((e.0, Error::GetDatabase)),
Outcome::Forward(f) => return Outcome::Forward(f),
};
// Get cookies
let cookie_jar = match request.guard::<&CookieJar>().await {
Outcome::Success(cookie_jar) => cookie_jar,
- Outcome::Failure(e) => return Outcome::Failure((e.0, Error::GetCookies)),
+ Outcome::Error(e) => return Outcome::Error((e.0, Error::GetCookies)),
Outcome::Forward(f) => return Outcome::Forward(f),
};
let mut transaction = match db.begin().await {
Ok(transaction) => transaction,
Err(_e) => {
- return Outcome::Failure((Status::InternalServerError, Error::StartTransaction));
+ return Outcome::Error((Status::InternalServerError, Error::StartTransaction));
}
};
- let refresh_token = match RefreshToken::get_one(&mut transaction, &refresh).await {
+ let refresh_token = match RefreshToken::get_one(transaction.deref_mut(), &refresh).await {
Ok(refresh_token) => match refresh_token {
Some(refresh_token) => refresh_token,
- None => return Outcome::Forward(()),
+ None => return Outcome::Forward(Status::Unauthorized),
},
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::GetRefreshToken(e)));
+ return Outcome::Error((Status::InternalServerError, Error::GetRefreshToken(e)));
}
};
- let user = match User::get_one_from_refresh_token(&mut transaction, &refresh).await {
+ let user = match User::get_one_from_refresh_token(transaction.deref_mut(), &refresh).await {
Ok(user) => match user {
Some(user) => user,
None => {
- return Outcome::Failure((Status::InternalServerError, Error::UserNotFound));
+ return Outcome::Error((Status::InternalServerError, Error::UserNotFound));
}
},
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::GetUser(e)));
+ return Outcome::Error((Status::InternalServerError, Error::GetUser(e)));
}
};
// make sure that `get_admin` is respected, dont generate token for unwanted users!
if let Some(get_admin) = get_admin {
if user.is_admin() != get_admin {
- return Outcome::Forward(());
+ return Outcome::Forward(Status::Forbidden);
}
}
if refresh_token.has_been_used() {
// Revoke all tokens for user
if let Err(e) =
- RefreshToken::revoke_all_for_user(&mut transaction, refresh_token.user()).await
+ RefreshToken::revoke_all_for_user(transaction.deref_mut(), refresh_token.user()).await
{
- return Outcome::Failure((Status::InternalServerError, Error::RevokeRefreshTokens(e)));
+ return Outcome::Error((Status::InternalServerError, Error::RevokeRefreshTokens(e)));
}
if let Err(_e) = transaction.commit().await {
- return Outcome::Failure((Status::InternalServerError, Error::CommitTransaction));
+ return Outcome::Error((Status::InternalServerError, Error::CommitTransaction));
}
- return Outcome::Forward(());
+ return Outcome::Forward(Status::Unauthorized);
}
if refresh_token.is_revoked() {
- return Outcome::Forward(());
+ return Outcome::Forward(Status::Unauthorized);
}
if refresh_token.has_expired() {
- return Outcome::Forward(());
+ return Outcome::Forward(Status::Unauthorized);
}
- if let Err(e) = refresh_token.use_token(&mut transaction).await {
- return Outcome::Failure((Status::InternalServerError, Error::MarkRefreshTokenUsed(e)));
+ if let Err(e) = refresh_token.use_token(transaction.deref_mut()).await {
+ return Outcome::Error((Status::InternalServerError, Error::MarkRefreshTokenUsed(e)));
}
// Get base url
- let settings = match Settings::get(&mut transaction).await {
+ let settings = match Settings::get(transaction.deref_mut()).await {
Ok(settings) => settings,
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::GetSettings(e)));
+ return Outcome::Error((Status::InternalServerError, Error::GetSettings(e)));
}
};
let home_page = match settings.url().map(String::from) {
Some(home_page) => home_page,
None => {
- return Outcome::Failure((Status::InternalServerError, Error::ServerUrlNotSet));
+ return Outcome::Error((Status::InternalServerError, Error::ServerUrlNotSet));
}
};
@@ -304,7 +305,7 @@ pub async fn use_refresh_token(
let new_refresh_token = match task::spawn_blocking(SecretString::default).await {
Ok(new_refresh_token) => new_refresh_token,
Err(e) => {
- return Outcome::Failure((
+ return Outcome::Error((
Status::InternalServerError,
Error::BlockingTask(e.to_string()),
));
@@ -315,13 +316,13 @@ pub async fn use_refresh_token(
let ip_address = match request.client_ip() {
Some(ip) => ip.to_string(),
None => {
- return Outcome::Failure((Status::BadRequest, Error::UnknownIp));
+ return Outcome::Error((Status::BadRequest, Error::UnknownIp));
}
};
// Insert refresh token in database
if let Err(e) = RefreshToken::insert(
- &mut transaction,
+ transaction.deref_mut(),
new_refresh_token.as_ref(),
ip_address,
user.id(),
@@ -330,7 +331,7 @@ pub async fn use_refresh_token(
)
.await
{
- return Outcome::Failure((Status::InternalServerError, Error::SaveRefreshToken(e)));
+ return Outcome::Error((Status::InternalServerError, Error::SaveRefreshToken(e)));
}
// Add refresh token as a cookie
@@ -345,24 +346,21 @@ pub async fn use_refresh_token(
cookie_jar.add(cookie);
// Get latest key from database
- let key = match Key::get_most_recent(&mut transaction).await {
+ let key = match Key::get_most_recent(transaction.deref_mut()).await {
Ok(key) => match key {
Some(key) => key,
None => {
- return Outcome::Failure((
- Status::InternalServerError,
- Error::MostRecentKeyNotFound,
- ));
+ return Outcome::Error((Status::InternalServerError, Error::MostRecentKeyNotFound));
}
},
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::GetKey(e)));
+ return Outcome::Error((Status::InternalServerError, Error::GetKey(e)));
}
};
// Make sure key has not been revoked
if key.is_revoked() {
- return Outcome::Failure((Status::InternalServerError, Error::MostRecentKeyRevoked));
+ return Outcome::Error((Status::InternalServerError, Error::MostRecentKeyRevoked));
}
// Import private key
@@ -373,11 +371,11 @@ pub async fn use_refresh_token(
Ok(private_key) => match private_key {
Ok(private_key) => private_key,
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::ImportKey(e)));
+ return Outcome::Error((Status::InternalServerError, Error::ImportKey(e)));
}
},
Err(e) => {
- return Outcome::Failure((
+ return Outcome::Error((
Status::InternalServerError,
Error::BlockingTask(e.to_string()),
));
@@ -385,13 +383,13 @@ pub async fn use_refresh_token(
};
// Get user roles
- let roles = match Permission::get_all(&mut transaction, Some(user.id()), None).await {
+ let roles = match Permission::get_all(transaction.deref_mut(), Some(user.id()), None).await {
Ok(roles) => roles
.into_iter()
.map(|role| role.role().to_string())
.collect(),
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::GetPermissions(e)));
+ return Outcome::Error((Status::InternalServerError, Error::GetPermissions(e)));
}
};
@@ -403,7 +401,7 @@ pub async fn use_refresh_token(
{
Ok(jwt) => jwt,
Err(e) => {
- return Outcome::Failure((Status::InternalServerError, Error::SignJwt(e)));
+ return Outcome::Error((Status::InternalServerError, Error::SignJwt(e)));
}
};
@@ -416,7 +414,7 @@ pub async fn use_refresh_token(
cookie_jar.add(cookie);
if let Err(_e) = transaction.commit().await {
- return Outcome::Failure((Status::InternalServerError, Error::CommitTransaction));
+ return Outcome::Error((Status::InternalServerError, Error::CommitTransaction));
}
Outcome::Success(jwt_claims)
@@ -436,7 +434,7 @@ pub async fn use_access_token_or_refresh_token(
match validate_jwt(access, request, get_admin, specific_user).await {
Ok(jwt_claims) => match jwt_claims {
Some(jwt_claims) => Outcome::Success(jwt_claims),
- None => Outcome::Forward(()),
+ None => Outcome::Forward(Status::Unauthorized),
},
Err(e) => e,
}
@@ -447,7 +445,7 @@ pub async fn use_access_token_or_refresh_token(
}
(None, None) => {
// Nothing to do
- Outcome::Forward(())
+ Outcome::Forward(Status::Unauthorized)
}
}
}
diff --git a/crates/ezidam/src/guards/jwt/admin_not_current.rs b/crates/ezidam/src/guards/jwt/admin_not_current.rs
index 6ce90c8..6145a11 100644
--- a/crates/ezidam/src/guards/jwt/admin_not_current.rs
+++ b/crates/ezidam/src/guards/jwt/admin_not_current.rs
@@ -2,6 +2,7 @@ use super::Error;
use crate::guards::{use_access_token_or_refresh_token, SpecificUser};
use crate::id::RocketUserID;
use jwt::JwtClaims;
+use rocket::http::Status;
use rocket::request::{FromRequest, Outcome};
use rocket::Request;
@@ -30,7 +31,7 @@ impl<'r> FromRequest<'r> for JwtAdminNotCurrent {
ret
} {
Some(user_id) => user_id,
- None => return Outcome::Forward(()),
+ None => return Outcome::Forward(Status::Forbidden),
};
// Don't allow first admin
@@ -49,10 +50,10 @@ impl<'r> FromRequest<'r> for JwtAdminNotCurrent {
if success.0.subject != user_id.0 .0 {
Outcome::Success(success)
} else {
- Outcome::Forward(())
+ Outcome::Forward(Status::Forbidden)
}
}
- Outcome::Failure(failure) => Outcome::Failure(failure),
+ Outcome::Error(failure) => Outcome::Error(failure),
Outcome::Forward(forward) => Outcome::Forward(forward),
}
}
diff --git a/crates/ezidam/src/guards/need_setup.rs b/crates/ezidam/src/guards/need_setup.rs
index 953c50b..5f39172 100644
--- a/crates/ezidam/src/guards/need_setup.rs
+++ b/crates/ezidam/src/guards/need_setup.rs
@@ -19,16 +19,16 @@ impl<'r> FromRequest<'r> for NeedSetup {
async fn from_request(request: &'r Request<'_>) -> Outcome {
let db = match request.guard::<&Database>().await {
Outcome::Success(database) => database,
- Outcome::Failure(e) => return Outcome::Failure((e.0, Error::GetDatabase)),
+ Outcome::Error(e) => return Outcome::Error((e.0, Error::GetDatabase)),
Outcome::Forward(f) => return Outcome::Forward(f),
};
match User::get_initial_admin(&**db).await {
Ok(initial_admin) => match initial_admin {
- Some(_) => Outcome::Forward(()),
+ Some(_) => Outcome::Forward(Status::PermanentRedirect),
None => Outcome::Success(NeedSetup),
},
- Err(e) => Outcome::Failure((Status::InternalServerError, Error::Request(e))),
+ Err(e) => Outcome::Error((Status::InternalServerError, Error::Request(e))),
}
}
}
diff --git a/crates/ezidam/src/guards/refresh_token.rs b/crates/ezidam/src/guards/refresh_token.rs
index c92eac4..8c95876 100644
--- a/crates/ezidam/src/guards/refresh_token.rs
+++ b/crates/ezidam/src/guards/refresh_token.rs
@@ -1,4 +1,5 @@
use crate::tokens::REFRESH_TOKEN_COOKIE_NAME;
+use rocket::http::Status;
use rocket::request::{FromRequest, Outcome};
use rocket::Request;
@@ -26,7 +27,7 @@ impl<'r> FromRequest<'r> for RefreshToken {
async fn from_request(request: &'r Request<'_>) -> Outcome {
match get_refresh_token_from_cookie(request) {
Some(refresh_token) => Outcome::Success(Self(refresh_token)),
- None => Outcome::Forward(()),
+ None => Outcome::Forward(Status::Unauthorized),
}
}
}
diff --git a/crates/ezidam/src/guards/totp_request.rs b/crates/ezidam/src/guards/totp_request.rs
index 16cd50f..31fc6cb 100644
--- a/crates/ezidam/src/guards/totp_request.rs
+++ b/crates/ezidam/src/guards/totp_request.rs
@@ -1,3 +1,4 @@
+use rocket::http::Status;
use rocket::request::{FromRequest, Outcome};
use rocket::Request;
use users::totp_login_request::{TOTP_REQUEST_COOKIE_NAME, TOTP_REQUEST_LEN};
@@ -16,10 +17,10 @@ impl<'r> FromRequest<'r> for TotpRequest {
if value.len() == TOTP_REQUEST_LEN {
Outcome::Success(Self(value.to_string()))
} else {
- Outcome::Forward(())
+ Outcome::Forward(Status::BadRequest)
}
}
- None => Outcome::Forward(()),
+ None => Outcome::Forward(Status::BadRequest),
}
}
}
diff --git a/crates/ezidam/src/routes.rs b/crates/ezidam/src/routes.rs
index 03c6050..c5372c8 100644
--- a/crates/ezidam/src/routes.rs
+++ b/crates/ezidam/src/routes.rs
@@ -27,6 +27,7 @@ pub(self) mod prelude {
pub use rocket_db_pools::sqlx::Acquire;
pub use rocket_db_pools::Connection;
pub use rocket_dyn_templates::Template;
+ pub use std::ops::DerefMut;
pub type Result = std::result::Result;
}
diff --git a/crates/ezidam/src/routes/admin/apps.rs b/crates/ezidam/src/routes/admin/apps.rs
index 89c8fd6..976377c 100644
--- a/crates/ezidam/src/routes/admin/apps.rs
+++ b/crates/ezidam/src/routes/admin/apps.rs
@@ -10,7 +10,9 @@ pub async fn admin_apps_list(
admin: JwtAdmin,
flash: Option>,
) -> Result {
- let apps = App::get_all(&mut *db, None).await?;
+ let mut transaction = db.begin().await?;
+ let apps = App::get_all(transaction.deref_mut(), None).await?;
+ transaction.commit().await?;
let page = Page::AdminAppsList(super::content::AdminAppsList {
user: admin.0,
@@ -54,8 +56,9 @@ pub async fn admin_apps_new_form(
let app_secret_hash = task::spawn_blocking(move || Secret::new(app_secret)).await??;
// Insert in database
+ let mut transaction = db.begin().await?;
App::insert(
- &mut *db,
+ transaction.deref_mut(),
&app_id,
form.label,
&redirect_uri,
@@ -63,6 +66,7 @@ pub async fn admin_apps_new_form(
form.is_confidential,
)
.await?;
+ transaction.commit().await?;
Ok(Flash::new(
Redirect::to(uri!(admin_apps_list)),
@@ -79,9 +83,11 @@ pub async fn admin_apps_view(
flash: Option>,
) -> Result {
let app_id = id.0;
- let app = App::get_one_by_id(&mut *db, app_id.as_ref())
+ let mut transaction = db.begin().await?;
+ let app = App::get_one_by_id(transaction.deref_mut(), app_id.as_ref())
.await?
.ok_or_else(|| Error::not_found(app_id.to_string()))?;
+ transaction.commit().await?;
if app.is_archived() {
return Err(Error::gone(format!(
@@ -108,14 +114,16 @@ pub async fn admin_apps_view_form(
let redirect_uri = Url::parse(form.redirect_uri)?;
// Update app
+ let mut transaction = db.begin().await?;
App::update(
- &mut *db,
+ transaction.deref_mut(),
&id.0,
form.label,
&redirect_uri,
form.is_confidential,
)
.await?;
+ transaction.commit().await?;
Ok(Flash::new(
Redirect::to(uri!(admin_apps_list)),
@@ -144,7 +152,7 @@ pub async fn admin_apps_new_secret(
// Get app
let app_id = &id.0;
- let app = App::get_one_by_id(&mut transaction, app_id.as_ref())
+ let app = App::get_one_by_id(transaction.deref_mut(), app_id.as_ref())
.await?
.ok_or_else(|| Error::not_found(app_id.to_string()))?;
@@ -163,7 +171,8 @@ pub async fn admin_apps_new_secret(
let app_secret_hash = task::spawn_blocking(move || Secret::new(app_secret)).await??;
// Save new secret
- app.new_secret(&mut transaction, &app_secret_hash).await?;
+ app.new_secret(transaction.deref_mut(), &app_secret_hash)
+ .await?;
transaction.commit().await?;
@@ -198,7 +207,7 @@ pub async fn admin_apps_archive(
// Get app
let app_id = &id.0;
- let app = App::get_one_by_id(&mut transaction, app_id.as_ref())
+ let app = App::get_one_by_id(transaction.deref_mut(), app_id.as_ref())
.await?
.ok_or_else(|| Error::not_found(app_id.to_string()))?;
@@ -210,10 +219,10 @@ pub async fn admin_apps_archive(
}
// Archive
- app.archive(&mut transaction).await?;
+ app.archive(transaction.deref_mut()).await?;
// Revoke refresh tokens
- refresh_tokens::RefreshToken::revoke_all_for_app(&mut transaction, app_id).await?;
+ refresh_tokens::RefreshToken::revoke_all_for_app(transaction.deref_mut(), app_id).await?;
transaction.commit().await?;
diff --git a/crates/ezidam/src/routes/admin/dashboard.rs b/crates/ezidam/src/routes/admin/dashboard.rs
index fdee596..b4b2622 100644
--- a/crates/ezidam/src/routes/admin/dashboard.rs
+++ b/crates/ezidam/src/routes/admin/dashboard.rs
@@ -10,17 +10,17 @@ pub async fn admin_dashboard(mut db: Connection, admin: JwtAdmin) -> R
let mut transaction = db.begin().await?;
// Get users
- let users = User::get_all(&mut transaction).await?;
+ let users = User::get_all(transaction.deref_mut()).await?;
// Get roles
- let roles = Role::get_all(&mut transaction).await?;
+ let roles = Role::get_all(transaction.deref_mut()).await?;
// Get apps
- let apps = App::get_all(&mut transaction, None).await?;
+ let apps = App::get_all(transaction.deref_mut(), None).await?;
// Get number of logins in the last 24 hours
let number_logins_last_24_hours =
- AuthorizationCode::used_in_last_24_hours(&mut transaction).await?;
+ AuthorizationCode::used_in_last_24_hours(transaction.deref_mut()).await?;
transaction.commit().await?;
diff --git a/crates/ezidam/src/routes/admin/permissions.rs b/crates/ezidam/src/routes/admin/permissions.rs
index 5d852f7..ff777da 100644
--- a/crates/ezidam/src/routes/admin/permissions.rs
+++ b/crates/ezidam/src/routes/admin/permissions.rs
@@ -25,7 +25,7 @@ pub async fn admin_permissions_users(
) -> Result {
let mut transaction = db.begin().await?;
- let users = User::get_all(&mut transaction)
+ let users = User::get_all(transaction.deref_mut())
.await?
.into_iter()
.filter(|user| !user.is_archived())
@@ -69,7 +69,7 @@ pub async fn admin_permissions_for_user(
let mut transaction = db.begin().await?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Failed to find user"))?;
@@ -78,14 +78,14 @@ pub async fn admin_permissions_for_user(
}
// Get roles
- let roles = Role::get_all(&mut transaction)
+ let roles = Role::get_all(transaction.deref_mut())
.await?
.into_iter()
.filter(|role| !role.is_archived())
.collect::>();
// Get permissions for user
- let permissions = Permission::get_all(&mut transaction, Some(user.id()), None).await?;
+ let permissions = Permission::get_all(transaction.deref_mut(), Some(user.id()), None).await?;
transaction.commit().await?;
@@ -138,7 +138,7 @@ pub async fn admin_permissions_for_user_form(
let mut transaction = db.begin().await?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Failed to find user"))?;
@@ -147,14 +147,14 @@ pub async fn admin_permissions_for_user_form(
}
// Get roles
- let roles = Role::get_all(&mut transaction)
+ let roles = Role::get_all(transaction.deref_mut())
.await?
.into_iter()
.filter(|role| !role.is_archived())
.collect::>();
// Get permissions for user
- let permissions = Permission::get_all(&mut transaction, Some(user.id()), None).await?;
+ let permissions = Permission::get_all(transaction.deref_mut(), Some(user.id()), None).await?;
transaction.commit().await?;
@@ -167,14 +167,14 @@ pub async fn admin_permissions_for_user_form(
if permissions.iter().all(|perm| perm.role() != role.name()) {
// If the permission does not exist, add it
- Permission::add(&mut transaction, user.id(), role.name()).await?;
+ Permission::add(transaction.deref_mut(), user.id(), role.name()).await?;
}
} else {
// Intent is to delete permission
if permissions.iter().any(|perm| perm.role() == role.name()) {
// If the permission exists, delete it
- Permission::delete(&mut transaction, user.id(), role.name()).await?;
+ Permission::delete(transaction.deref_mut(), user.id(), role.name()).await?;
}
}
}
@@ -200,7 +200,7 @@ pub async fn admin_permissions_roles(
) -> Result {
let mut transaction = db.begin().await?;
- let roles = Role::get_all(&mut transaction)
+ let roles = Role::get_all(transaction.deref_mut())
.await?
.into_iter()
.filter(|role| !role.is_archived())
@@ -236,7 +236,7 @@ pub async fn admin_permissions_for_role(
let mut transaction = db.begin().await?;
// Get role
- let role = Role::get_by_name(&mut transaction, &id.0)
+ let role = Role::get_by_name(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Failed to find role"))?;
@@ -245,14 +245,14 @@ pub async fn admin_permissions_for_role(
}
// Get users
- let users = User::get_all(&mut transaction)
+ let users = User::get_all(transaction.deref_mut())
.await?
.into_iter()
.filter(|user| !user.is_archived())
.collect::>();
// Get permissions for role
- let permissions = Permission::get_all(&mut transaction, None, Some(role.name())).await?;
+ let permissions = Permission::get_all(transaction.deref_mut(), None, Some(role.name())).await?;
transaction.commit().await?;
@@ -305,7 +305,7 @@ pub async fn admin_permissions_for_role_form(
let mut transaction = db.begin().await?;
// Get role
- let role = Role::get_by_name(&mut transaction, &id.0)
+ let role = Role::get_by_name(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Failed to find role"))?;
@@ -314,14 +314,14 @@ pub async fn admin_permissions_for_role_form(
}
// Get users
- let users = User::get_all(&mut transaction)
+ let users = User::get_all(transaction.deref_mut())
.await?
.into_iter()
.filter(|user| !user.is_archived())
.collect::>();
// Get permissions for role
- let permissions = Permission::get_all(&mut transaction, None, Some(role.name())).await?;
+ let permissions = Permission::get_all(transaction.deref_mut(), None, Some(role.name())).await?;
transaction.commit().await?;
@@ -334,14 +334,14 @@ pub async fn admin_permissions_for_role_form(
if permissions.iter().all(|perm| perm.user() != user.id()) {
// If the permission does not exist, add it
- Permission::add(&mut transaction, user.id(), role.name()).await?;
+ Permission::add(transaction.deref_mut(), user.id(), role.name()).await?;
}
} else {
// Intent is to delete permission
if permissions.iter().any(|perm| perm.user() == user.id()) {
// If the permission exists, delete it
- Permission::delete(&mut transaction, user.id(), role.name()).await?;
+ Permission::delete(transaction.deref_mut(), user.id(), role.name()).await?;
}
}
}
diff --git a/crates/ezidam/src/routes/admin/roles.rs b/crates/ezidam/src/routes/admin/roles.rs
index 2b78ccf..79242de 100644
--- a/crates/ezidam/src/routes/admin/roles.rs
+++ b/crates/ezidam/src/routes/admin/roles.rs
@@ -12,7 +12,7 @@ pub async fn admin_roles_list(
) -> Result {
let mut transaction = db.begin().await?;
- let roles = Role::get_all(&mut transaction).await?;
+ let roles = Role::get_all(transaction.deref_mut()).await?;
transaction.commit().await?;
@@ -62,7 +62,7 @@ pub async fn admin_roles_new_form(
let mut transaction = db.begin().await?;
// Insert role in database
- if let Err(e) = Role::insert(&mut transaction, &name, form.label).await {
+ if let Err(e) = Role::insert(transaction.deref_mut(), &name, form.label).await {
return Ok(Flash::new(
Redirect::to(uri!(admin_roles_new)),
FlashKind::Danger,
@@ -91,7 +91,7 @@ pub async fn admin_roles_view(
let mut transaction = db.begin().await?;
- let role = Role::get_by_name(&mut transaction, &role_id)
+ let role = Role::get_by_name(transaction.deref_mut(), &role_id)
.await?
.ok_or_else(|| Error::not_found(role_id.to_string()))?;
@@ -128,12 +128,13 @@ pub async fn admin_roles_archive(
let mut transaction = db.begin().await?;
// Get role
- let role = Role::get_by_name(&mut transaction, &id.0)
+ let role = Role::get_by_name(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find role"))?;
// Set new status
- role.set_archive_status(&mut transaction, true).await?;
+ role.set_archive_status(transaction.deref_mut(), true)
+ .await?;
transaction.commit().await?;
@@ -149,12 +150,13 @@ pub async fn admin_roles_archive(
let mut transaction = db.begin().await?;
// Get role
- let role = Role::get_by_name(&mut transaction, &id.0)
+ let role = Role::get_by_name(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find role"))?;
// Set new status
- role.set_archive_status(&mut transaction, false).await?;
+ role.set_archive_status(transaction.deref_mut(), false)
+ .await?;
transaction.commit().await?;
@@ -191,7 +193,7 @@ pub async fn admin_roles_info_update(
) -> Result> {
let mut transaction = db.begin().await?;
- let role = Role::get_by_name(&mut transaction, &id.0)
+ let role = Role::get_by_name(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find role"))?;
@@ -201,7 +203,7 @@ pub async fn admin_roles_info_update(
// Update label
if role.label() != form.label {
- if let Err(e) = role.set_label(&mut transaction, form.label).await {
+ if let Err(e) = role.set_label(transaction.deref_mut(), form.label).await {
return Ok(Flash::new(
Redirect::to(uri!(admin_roles_view(id))),
FlashKind::Danger,
diff --git a/crates/ezidam/src/routes/admin/settings.rs b/crates/ezidam/src/routes/admin/settings.rs
index 3d6be7c..b6be5f4 100644
--- a/crates/ezidam/src/routes/admin/settings.rs
+++ b/crates/ezidam/src/routes/admin/settings.rs
@@ -15,7 +15,9 @@ use users::User;
#[get("/admin/settings/branding")]
pub async fn settings_branding(mut db: Connection, admin: JwtAdmin) -> Result {
- let settings = Settings::get(&mut *db).await?;
+ let mut transaction = db.begin().await?;
+ let settings = Settings::get(transaction.deref_mut()).await?;
+ transaction.commit().await?;
Ok(Page::AdminSettingsBranding(
super::content::AdminSettingsBranding {
@@ -44,12 +46,12 @@ pub async fn settings_update_branding(
match form.delete_logo {
Some(delete_logo) => {
if delete_logo {
- Settings::delete_business_logo(&mut transaction).await?;
+ Settings::delete_business_logo(transaction.deref_mut()).await?;
}
}
None => {
if let Some(business_name) = form.business_name {
- Settings::set_business_name(&mut transaction, business_name).await?;
+ Settings::set_business_name(transaction.deref_mut(), business_name).await?;
}
if form.file.len() != 0 {
@@ -61,7 +63,7 @@ pub async fn settings_update_branding(
let file_bytes = rocket::tokio::fs::read(file_path).await?;
// Save in database
- Settings::set_business_logo(&mut transaction, &file_bytes).await?;
+ Settings::set_business_logo(transaction.deref_mut(), &file_bytes).await?;
}
}
}
@@ -110,30 +112,39 @@ pub async fn settings_security_form(
task::spawn_blocking(move || jwt::generate(&key_id_for_generation)).await??;
// Insert keys in database
- jwt::database::save_new_keys(&mut transaction, &key_id, &private_key, &public_key)
- .await?;
+ jwt::database::save_new_keys(
+ transaction.deref_mut(),
+ &key_id,
+ &private_key,
+ &public_key,
+ )
+ .await?;
// Revoke all keys except new one
- jwt::database::revoke_all_except_one(&mut transaction, &key_id).await?;
+ jwt::database::revoke_all_except_one(transaction.deref_mut(), &key_id).await?;
// Get app
- let app = App::get_one_by_id(&mut transaction, "ezidam")
+ let app = App::get_one_by_id(transaction.deref_mut(), "ezidam")
.await?
.ok_or_else(|| Error::not_found("Could not find application"))?;
// Get user info
- let user = User::get_by_login(&mut transaction, &admin.0.subject)
+ let user = User::get_by_login(transaction.deref_mut(), &admin.0.subject)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
// Revoke all refresh tokens
- RefreshToken::revoke_all(&mut transaction).await?;
+ RefreshToken::revoke_all(transaction.deref_mut()).await?;
// Generate refresh token
- let refresh_token =
- generate_refresh_token(&mut transaction, ip_address, user.id(), app.id())
- .await
- .map_err(Error::internal_server_error)?;
+ let refresh_token = generate_refresh_token(
+ transaction.deref_mut(),
+ ip_address,
+ user.id(),
+ app.id(),
+ )
+ .await
+ .map_err(Error::internal_server_error)?;
// Add refresh token as a cookie
let mut cookie = Cookie::new(REFRESH_TOKEN_COOKIE_NAME, refresh_token);
@@ -144,7 +155,7 @@ pub async fn settings_security_form(
cookie_jar.add(cookie);
// Get base url
- let settings = Settings::get(&mut transaction).await?;
+ let settings = Settings::get(transaction.deref_mut()).await?;
let home_page = settings
.url()
.map(String::from)
@@ -152,7 +163,7 @@ pub async fn settings_security_form(
// Generate jwt
let jwt = generate_jwt(
- &mut transaction,
+ transaction.deref_mut(),
&private_key,
&home_page,
&app.id().0,
@@ -194,7 +205,7 @@ pub async fn settings_maintenance(
) -> Result {
let mut transaction = db.begin().await?;
- let database_size = Settings::database_size(&mut transaction)
+ let database_size = Settings::database_size(transaction.deref_mut())
.await?
.ok_or_else(|| Error::internal_server_error("Failed to get database size"))?;
diff --git a/crates/ezidam/src/routes/admin/users.rs b/crates/ezidam/src/routes/admin/users.rs
index 5cd77b5..6b40e2e 100644
--- a/crates/ezidam/src/routes/admin/users.rs
+++ b/crates/ezidam/src/routes/admin/users.rs
@@ -18,7 +18,9 @@ pub async fn admin_users_list(
admin: JwtAdmin,
flash: Option>,
) -> Result {
- let users = User::get_all(&mut *db).await?;
+ let mut transaction = db.begin().await?;
+ let users = User::get_all(transaction.deref_mut()).await?;
+ transaction.commit().await?;
let page = Page::AdminUsersList(super::content::AdminUsersList {
user: admin.0,
@@ -68,7 +70,7 @@ pub async fn admin_users_new_form(
let mut transaction = db.begin().await?;
// Insert user in database
- if let Err(e) = User::insert(&mut transaction, &user_id, false, &username, None).await {
+ if let Err(e) = User::insert(transaction.deref_mut(), &user_id, false, &username, None).await {
return Ok(Flash::new(
Redirect::to(uri!(admin_users_new)),
FlashKind::Danger,
@@ -94,9 +96,11 @@ pub async fn admin_users_view(
flash: Option>,
) -> Result {
let user_id = id.0;
- let user = User::get_by_id(&mut *db, &user_id)
+ let mut transaction = db.begin().await?;
+ let user = User::get_by_id(transaction.deref_mut(), &user_id)
.await?
.ok_or_else(|| Error::not_found(user_id.to_string()))?;
+ transaction.commit().await?;
// If user has password reset token
let password_recover_expiration = user
@@ -136,13 +140,13 @@ pub async fn admin_users_archive(
let mut transaction = db.begin().await?;
// Get ID of first admin
- let settings = Settings::get(&mut transaction).await?;
+ let settings = Settings::get(transaction.deref_mut()).await?;
let first_admin = settings
.first_admin()
.ok_or_else(|| Error::bad_request("First user is not set"))?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
@@ -152,17 +156,19 @@ pub async fn admin_users_archive(
}
// Set new status
- user.set_archive_status(&mut transaction, true).await?;
+ user.set_archive_status(transaction.deref_mut(), true)
+ .await?;
// Revoke refresh tokens
- refresh_tokens::RefreshToken::revoke_all_for_user(&mut transaction, user.id()).await?;
+ refresh_tokens::RefreshToken::revoke_all_for_user(transaction.deref_mut(), user.id())
+ .await?;
// Use all authorization codes
- AuthorizationCode::use_all_for_user(&mut transaction, user.id()).await?;
+ AuthorizationCode::use_all_for_user(transaction.deref_mut(), user.id()).await?;
// Use all totp login requests
if user.totp_secret().is_some() {
- TotpLoginRequest::use_all_for_user(&mut transaction, user.id()).await?;
+ TotpLoginRequest::use_all_for_user(transaction.deref_mut(), user.id()).await?;
}
transaction.commit().await?;
@@ -178,12 +184,13 @@ pub async fn admin_users_archive(
let mut transaction = db.begin().await?;
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
// Set new status
- user.set_archive_status(&mut transaction, false).await?;
+ user.set_archive_status(transaction.deref_mut(), false)
+ .await?;
transaction.commit().await?;
@@ -234,10 +241,10 @@ pub async fn admin_users_password_reset(
let mut transaction = db.begin().await?;
// Get settings
- let settings = Settings::get(&mut transaction).await?;
+ let settings = Settings::get(transaction.deref_mut()).await?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
@@ -245,7 +252,7 @@ pub async fn admin_users_password_reset(
let token = task::spawn_blocking(PasswordResetToken::generate).await?;
// Save in database
- user.set_password_reset_token(&mut transaction, Some(&token))
+ user.set_password_reset_token(transaction.deref_mut(), Some(&token))
.await?;
transaction.commit().await?;
@@ -414,12 +421,12 @@ pub async fn admin_users_paper_key_reset(
let mut transaction = db.begin().await?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
// Delete paper key
- user.set_paper_key(&mut transaction, None).await?;
+ user.set_paper_key(transaction.deref_mut(), None).await?;
transaction.commit().await?;
@@ -452,15 +459,15 @@ pub async fn admin_users_totp_secret_disable(
let mut transaction = db.begin().await?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
// Delete totp secret
- user.set_totp_secret(&mut transaction, None).await?;
+ user.set_totp_secret(transaction.deref_mut(), None).await?;
// Delete totp backup
- user.set_totp_backup(&mut transaction, None).await?;
+ user.set_totp_backup(transaction.deref_mut(), None).await?;
transaction.commit().await?;
@@ -493,12 +500,12 @@ pub async fn admin_users_totp_backup_delete(
let mut transaction = db.begin().await?;
// Get user
- let user = User::get_by_id(&mut transaction, &id.0)
+ let user = User::get_by_id(transaction.deref_mut(), &id.0)
.await?
.ok_or_else(|| Error::not_found("Could not find user"))?;
// Delete totp backup
- user.set_totp_backup(&mut transaction, None).await?;
+ user.set_totp_backup(transaction.deref_mut(), None).await?;
transaction.commit().await?;
@@ -531,7 +538,7 @@ pub async fn admin_users_info_update(
) -> Result