From 26297b403571edab2325be3b3ccc48c5178e33fe Mon Sep 17 00:00:00 2001 From: Nutomic Date: Thu, 23 Nov 2023 15:47:49 +0100 Subject: [PATCH 01/71] Users can view their own posts after removal (fixes #4186) (#4192) --- crates/db_views/src/post_view.rs | 12 ++++++++++-- crates/utils/translations | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index e133d9e4a..3b67955c7 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -274,8 +274,16 @@ fn queries<'a>() -> Queries< // Hide deleted and removed for non-admins or mods if !is_mod_or_admin { query = query - .filter(community::removed.eq(false)) - .filter(post::removed.eq(false)) + .filter( + community::removed + .eq(false) + .or(post::creator_id.eq(person_id_join)), + ) + .filter( + post::removed + .eq(false) + .or(post::creator_id.eq(person_id_join)), + ) // users can see their own deleted posts .filter( community::deleted diff --git a/crates/utils/translations b/crates/utils/translations index a36865ee8..277e3c335 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit a36865ee8ca3658fea31ba948b67b75a812e84fc +Subproject commit 277e3c335bbb9c00c4a600bd4d655b273393f84a From 6e4278b1c9bbd8bfd616da2173b6a15c3ee47ae4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 23 Nov 2023 20:39:46 -0500 Subject: [PATCH 02/71] Setting rank column defaults to a small number. Fixes #4178 (#4191) * Setting rank column defaults to a small number. Fixes #4178 * Fixing tests. --- api_tests/package.json | 14 +- api_tests/yarn.lock | 150 +++++++++--------- crates/db_schema/src/utils.rs | 1 + crates/db_views/src/comment_report_view.rs | 4 +- crates/db_views/src/comment_view.rs | 4 +- crates/db_views/src/post_view.rs | 8 +- .../down.sql | 11 ++ .../up.sql | 16 ++ 8 files changed, 118 insertions(+), 90 deletions(-) create mode 100644 migrations/2023-11-22-194806_low_rank_defaults/down.sql create mode 100644 migrations/2023-11-22-194806_low_rank_defaults/up.sql diff --git a/api_tests/package.json b/api_tests/package.json index bd6681535..a6bf91f72 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -19,17 +19,17 @@ "api-test-image": "jest -i image.spec.ts" }, "devDependencies": { - "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@types/jest": "^29.5.10", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", "download-file-sync": "^1.0.4", - "eslint": "^8.53.0", + "eslint": "^8.54.0", "eslint-plugin-prettier": "^5.0.1", "jest": "^29.5.0", "lemmy-js-client": "0.19.0-alpha.18", - "prettier": "^3.0.0", + "prettier": "^3.1.0", "ts-jest": "^29.1.0", - "typescript": "^5.0.4" + "typescript": "^5.3.2" } } diff --git a/api_tests/yarn.lock b/api_tests/yarn.lock index 9a272efee..7167c9b93 100644 --- a/api_tests/yarn.lock +++ b/api_tests/yarn.lock @@ -329,10 +329,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.53.0": - version "8.53.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" - integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== +"@eslint/js@8.54.0": + version "8.54.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf" + integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ== "@humanwhocodes/config-array@^0.11.13": version "0.11.13" @@ -704,10 +704,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.8": - version "29.5.8" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.8.tgz#ed5c256fe2bc7c38b1915ee5ef1ff24a3427e120" - integrity sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g== +"@types/jest@^29.5.10": + version "29.5.10" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.10.tgz#a10fc5bab9e426081c12b2ef73d24d4f0c9b7f50" + integrity sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -722,10 +722,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.0.tgz#10ddf0119cf20028781c06d7115562934e53f745" integrity sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ== -"@types/node@^20.9.0": - version "20.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== +"@types/node@^20.9.4": + version "20.9.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.4.tgz#cc8f970e869c26834bdb7ed480b30ede622d74c7" + integrity sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA== dependencies: undici-types "~5.26.4" @@ -751,16 +751,16 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz#cfe2bd34e26d2289212946b96ab19dcad64b661a" - integrity sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg== +"@typescript-eslint/eslint-plugin@^6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz#2a647d278bb48bf397fef07ba0507612ff9dd812" + integrity sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/type-utils" "6.10.0" - "@typescript-eslint/utils" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/type-utils" "6.12.0" + "@typescript-eslint/utils" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -768,72 +768,72 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.10.0.tgz#578af79ae7273193b0b6b61a742a2bc8e02f875a" - integrity sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog== +"@typescript-eslint/parser@^6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.12.0.tgz#9fb21ed7d88065a4a2ee21eb80b8578debb8217c" + integrity sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg== dependencies: - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz#b0276118b13d16f72809e3cecc86a72c93708540" - integrity sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg== +"@typescript-eslint/scope-manager@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz#5833a16dbe19cfbad639d4d33bcca5e755c7044b" + integrity sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw== dependencies: - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" -"@typescript-eslint/type-utils@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz#1007faede067c78bdbcef2e8abb31437e163e2e1" - integrity sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg== +"@typescript-eslint/type-utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz#968f7c95162808d69950ab5dff710ad730e58287" + integrity sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng== dependencies: - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/utils" "6.10.0" + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/utils" "6.12.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.10.0.tgz#f4f0a84aeb2ac546f21a66c6e0da92420e921367" - integrity sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg== +"@typescript-eslint/types@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.12.0.tgz#ffc5297bcfe77003c8b7b545b51c2505748314ac" + integrity sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q== -"@typescript-eslint/typescript-estree@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz#667381eed6f723a1a8ad7590a31f312e31e07697" - integrity sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg== +"@typescript-eslint/typescript-estree@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz#764ccc32598549e5b48ec99e3b85f89b1385310c" + integrity sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw== dependencies: - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" - integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== +"@typescript-eslint/utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.12.0.tgz#c6ce8c06fe9b0212620e5674a2036f6f8f611754" + integrity sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz#b9eaf855a1ac7e95633ae1073af43d451e8f84e3" - integrity sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg== +"@typescript-eslint/visitor-keys@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz#5877950de42a0f3344261b7a1eee15417306d7e9" + integrity sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw== dependencies: - "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/types" "6.12.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -1338,15 +1338,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.53.0: - version "8.53.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" - integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== +eslint@^8.54.0: + version "8.54.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.54.0.tgz#588e0dd4388af91a2e8fa37ea64924074c783537" + integrity sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.3" - "@eslint/js" "8.53.0" + "@eslint/js" "8.54.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -2619,10 +2619,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" - integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== +prettier@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" + integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -2952,10 +2952,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^5.0.4: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typescript@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" + integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== undici-types@~5.26.4: version "5.26.5" diff --git a/crates/db_schema/src/utils.rs b/crates/db_schema/src/utils.rs index 1ebdd36e2..594c93629 100644 --- a/crates/db_schema/src/utils.rs +++ b/crates/db_schema/src/utils.rs @@ -49,6 +49,7 @@ use url::Url; const FETCH_LIMIT_DEFAULT: i64 = 10; pub const FETCH_LIMIT_MAX: i64 = 50; const POOL_TIMEOUT: Option = Some(Duration::from_secs(5)); +pub const RANK_DEFAULT: f64 = 0.0001; pub type ActualDbPool = Pool; diff --git a/crates/db_views/src/comment_report_view.rs b/crates/db_views/src/comment_report_view.rs index b883fb8fe..acf31eb4c 100644 --- a/crates/db_views/src/comment_report_view.rs +++ b/crates/db_views/src/comment_report_view.rs @@ -230,7 +230,7 @@ mod tests { post::{Post, PostInsertForm}, }, traits::{Crud, Joinable, Reportable}, - utils::build_db_pool_for_tests, + utils::{build_db_pool_for_tests, RANK_DEFAULT}, }; use serial_test::serial; @@ -431,7 +431,7 @@ mod tests { downvotes: 0, published: agg.published, child_count: 0, - hot_rank: 0.1728, + hot_rank: RANK_DEFAULT, controversy_rank: 0.0, }, my_vote: None, diff --git a/crates/db_views/src/comment_view.rs b/crates/db_views/src/comment_view.rs index db2e286d5..9d853df3f 100644 --- a/crates/db_views/src/comment_view.rs +++ b/crates/db_views/src/comment_view.rs @@ -410,7 +410,7 @@ mod tests { post::{Post, PostInsertForm}, }, traits::{Blockable, Crud, Joinable, Likeable}, - utils::build_db_pool_for_tests, + utils::{build_db_pool_for_tests, RANK_DEFAULT}, SubscribedType, }; use serial_test::serial; @@ -1044,7 +1044,7 @@ mod tests { downvotes: 0, published: agg.published, child_count: 5, - hot_rank: 0.1728, + hot_rank: RANK_DEFAULT, controversy_rank: 0.0, }, } diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index 3b67955c7..fcffe214a 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -753,7 +753,7 @@ mod tests { post::{Post, PostInsertForm, PostLike, PostLikeForm, PostUpdateForm}, }, traits::{Blockable, Crud, Joinable, Likeable}, - utils::{build_db_pool_for_tests, DbPool}, + utils::{build_db_pool_for_tests, DbPool, RANK_DEFAULT}, SortType, SubscribedType, }; @@ -1533,10 +1533,10 @@ mod tests { newest_comment_time: inserted_post.published, featured_community: false, featured_local: false, - hot_rank: 0.1728, - hot_rank_active: 0.1728, + hot_rank: RANK_DEFAULT, + hot_rank_active: RANK_DEFAULT, controversy_rank: 0.0, - scaled_rank: 0.3621, + scaled_rank: RANK_DEFAULT, community_id: inserted_post.community_id, creator_id: inserted_post.creator_id, instance_id: data.inserted_instance.id, diff --git a/migrations/2023-11-22-194806_low_rank_defaults/down.sql b/migrations/2023-11-22-194806_low_rank_defaults/down.sql new file mode 100644 index 000000000..2b1be4cfe --- /dev/null +++ b/migrations/2023-11-22-194806_low_rank_defaults/down.sql @@ -0,0 +1,11 @@ +ALTER TABLE community_aggregates + ALTER COLUMN hot_rank SET DEFAULT 0.1728; + +ALTER TABLE comment_aggregates + ALTER COLUMN hot_rank SET DEFAULT 0.1728; + +ALTER TABLE post_aggregates + ALTER COLUMN hot_rank SET DEFAULT 0.1728, + ALTER COLUMN hot_rank_active SET DEFAULT 0.1728, + ALTER COLUMN scaled_rank SET DEFAULT 0.3621; + diff --git a/migrations/2023-11-22-194806_low_rank_defaults/up.sql b/migrations/2023-11-22-194806_low_rank_defaults/up.sql new file mode 100644 index 000000000..a1ef1ff51 --- /dev/null +++ b/migrations/2023-11-22-194806_low_rank_defaults/up.sql @@ -0,0 +1,16 @@ +-- Change the hot_ranks to a miniscule number, so that new / fetched content +-- won't crowd out existing content. +-- +-- They must be non-zero, in order for them to be picked up by the hot_ranks updater. +-- See https://github.com/LemmyNet/lemmy/issues/4178 +ALTER TABLE community_aggregates + ALTER COLUMN hot_rank SET DEFAULT 0.0001; + +ALTER TABLE comment_aggregates + ALTER COLUMN hot_rank SET DEFAULT 0.0001; + +ALTER TABLE post_aggregates + ALTER COLUMN hot_rank SET DEFAULT 0.0001, + ALTER COLUMN hot_rank_active SET DEFAULT 0.0001, + ALTER COLUMN scaled_rank SET DEFAULT 0.0001; + From d795c54a7a938e786943a4a4c79344a34686e394 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 23 Nov 2023 21:09:56 -0500 Subject: [PATCH 03/71] Version 0.19.0-rc.7 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ crates/utils/translations | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 333e41565..5e2f08908 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2530,7 +2530,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "actix-web", @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "actix-web", @@ -2592,7 +2592,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "actix-web", @@ -2610,7 +2610,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "actix-web", @@ -2649,7 +2649,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "async-trait", @@ -2685,7 +2685,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "actix-web", "diesel", @@ -2703,7 +2703,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "chrono", "diesel", @@ -2720,7 +2720,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "diesel", "diesel-async", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "anyhow", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "actix-web", @@ -2779,7 +2779,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "activitypub_federation", "actix-cors", @@ -2820,7 +2820,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index f5baaa037..b7a09212f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.0-rc.6" +version = "0.19.0-rc.7" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -84,16 +84,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.0-rc.6", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.0-rc.6", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.0-rc.6", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.0-rc.6", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.0-rc.6", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.0-rc.6", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.0-rc.6", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.0-rc.6", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.0-rc.6", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.0-rc.6", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.0-rc.7", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.0-rc.7", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.0-rc.7", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.0-rc.7", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.0-rc.7", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.0-rc.7", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.0-rc.7", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.0-rc.7", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.0-rc.7", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.0-rc.7", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } @@ -163,7 +163,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.0-rc.6", path = "crates/federate" } +lemmy_federate = { version = "0.19.0-rc.7", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } diff --git a/crates/utils/translations b/crates/utils/translations index 277e3c335..a36865ee8 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit 277e3c335bbb9c00c4a600bd4d655b273393f84a +Subproject commit a36865ee8ca3658fea31ba948b67b75a812e84fc From 2b5a31b41162331a6c1028d76a84f83a9c6feaa9 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 24 Nov 2023 04:29:41 -0500 Subject: [PATCH 04/71] Upgrading deps. (#4196) * Upgrading deps. * Try to use native node-fetch function. * Fixing image upload tests. --- Cargo.lock | 494 +++++++++++++++++--------------- Cargo.toml | 28 +- api_tests/.eslintrc.json | 1 + api_tests/src/comment.spec.ts | 1 - api_tests/src/community.spec.ts | 2 +- api_tests/src/image.spec.ts | 14 +- api_tests/src/post.spec.ts | 2 +- api_tests/src/shared.ts | 14 +- api_tests/src/user.spec.ts | 2 + crates/api_common/Cargo.toml | 2 +- crates/federate/Cargo.toml | 2 +- crates/utils/Cargo.toml | 2 +- 12 files changed, 294 insertions(+), 270 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e2f08908..8d795b690 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,7 +115,7 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "ahash 0.8.5", + "ahash 0.8.6", "base64 0.21.5", "bitflags 2.4.1", "brotli", @@ -151,7 +151,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -241,7 +241,7 @@ dependencies = [ "futures-core", "impl-more", "pin-project-lite", - "rustls 0.21.8", + "rustls 0.21.9", "rustls-webpki", "tokio", "tokio-rustls 0.23.4", @@ -276,7 +276,7 @@ dependencies = [ "actix-tls", "actix-utils", "actix-web-codegen", - "ahash 0.8.5", + "ahash 0.8.6", "bytes", "bytestring", "cfg-if", @@ -310,7 +310,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -356,9 +356,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7d5a2cecb58716e47d67d5703a249964b14c7be1ec3cad3affc295b2d1c35d" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom", @@ -481,9 +481,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f658e2baef915ba0f26f1f7c42bfb8e12f532a01f449a090ded75ae7a07e9ba2" +checksum = "bc2d0cfb2a7388d34f590e76686704c494ed7aaceed62ee1ba35cbf363abc2a5" dependencies = [ "flate2", "futures-core", @@ -506,7 +506,7 @@ dependencies = [ "log", "parking", "polling", - "rustix 0.37.26", + "rustix 0.37.27", "slab", "socket2 0.4.10", "waker-fn", @@ -540,7 +540,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -551,7 +551,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -732,9 +732,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -772,9 +772,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytestring" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" +checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" dependencies = [ "bytes", ] @@ -804,9 +804,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" dependencies = [ "serde", ] @@ -873,9 +873,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.7" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" dependencies = [ "clap_builder", "clap_derive", @@ -883,9 +883,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" dependencies = [ "anstream", "anstyle", @@ -902,7 +902,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -937,9 +937,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" dependencies = [ "once_cell", "owo-colors", @@ -980,9 +980,9 @@ dependencies = [ [[package]] name = "config" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" dependencies = [ "async-trait", "json5", @@ -1016,8 +1016,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" dependencies = [ "futures-core", - "prost 0.12.1", - "prost-types 0.12.1", + "prost 0.12.3", + "prost-types 0.12.3", "tonic 0.10.2", "tracing-core", ] @@ -1058,7 +1058,7 @@ dependencies = [ "futures-task", "hdrhistogram", "humantime", - "prost-types 0.12.1", + "prost-types 0.12.3", "serde", "serde_json", "thread_local", @@ -1131,9 +1131,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1258,7 +1258,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1291,7 +1291,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1405,9 +1405,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.1.3" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2268a214a6f118fce1838edba3d1561cf0e78d8de785475957a580a7f8c69d33" +checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" dependencies = [ "bitflags 2.4.1", "byteorder", @@ -1443,7 +1443,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1454,7 +1454,7 @@ checksum = "c7267437d5b12df60ae29bd97f8d120f1c3a6272d6f213551afa56bbb2ecfbb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1466,7 +1466,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1496,7 +1496,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1557,9 +1557,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "dyn-clone" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "either" @@ -1673,22 +1673,22 @@ checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" [[package]] name = "enum-map" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53337c2dbf26a3c31eccc73a37b10c1614e8d4ae99b6a50d553e8936423c1f16" +checksum = "09e6b4f374c071b18172e23134e01026653dc980636ee139e0dfe59c538c61e5" dependencies = [ "enum-map-derive", ] [[package]] name = "enum-map-derive" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d0b288e3bb1d861c4403c1774a6f7a798781dfc519b3647df2a3dd4ae95f25" +checksum = "bfdb3d73d1beaf47c8593a1364e577fde072677cbfd103600345c0f547408cc0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1723,9 +1723,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ "libc", "windows-sys 0.48.0", @@ -1748,9 +1748,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" dependencies = [ "indenter", "once_cell", @@ -1798,9 +1798,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" dependencies = [ "simd-adler32", ] @@ -1844,9 +1844,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1873,9 +1873,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1888,9 +1888,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1898,15 +1898,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1915,9 +1915,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -1936,32 +1936,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -2021,9 +2021,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -2031,7 +2031,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -2053,7 +2053,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.5", + "ahash 0.8.6", ] [[package]] @@ -2064,11 +2064,11 @@ checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] name = "hdrhistogram" -version = "7.5.2" +version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.13.1", + "base64 0.21.5", "byteorder", "flate2", "nom", @@ -2171,9 +2171,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -2260,14 +2260,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.8", + "rustls 0.21.9", "tokio", "tokio-rustls 0.24.1", ] @@ -2338,9 +2338,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2385,9 +2385,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.2", @@ -2484,9 +2484,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] @@ -2666,7 +2666,7 @@ dependencies = [ "lemmy_utils", "once_cell", "regex", - "rustls 0.21.8", + "rustls 0.21.9", "serde", "serde_json", "serde_with", @@ -2812,7 +2812,7 @@ dependencies = [ "tracing", "tracing-actix-web", "tracing-error", - "tracing-log", + "tracing-log 0.1.4", "tracing-opentelemetry 0.19.0", "tracing-subscriber", "url", @@ -2883,9 +2883,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "line-wrap" @@ -2925,15 +2925,15 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "local-channel" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a493488de5f18c8ffcba89eebb8532ffc562dc400490eb65b84893fae0b178" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" dependencies = [ "futures-core", "futures-sink", @@ -2942,9 +2942,9 @@ dependencies = [ [[package]] name = "local-waker" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" @@ -2958,9 +2958,9 @@ dependencies = [ [[package]] name = "lodepng" -version = "3.9.1" +version = "3.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cdccd0cf57a5d456f0656ebcff72c2e19503287e1afbf3b84382812adc0606" +checksum = "b00f56ff9bcd5721ab172b73eac8a7d4e9439f47a98581e666178dbe7df97e13" dependencies = [ "crc32fast", "fallible_collections", @@ -3186,6 +3186,12 @@ dependencies = [ "uuid", ] +[[package]] +name = "mutually_exclusive_features" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d02c0b00610773bb7fc61d85e13d86c7858cbdf00e1a120bfc41bc055dbaa0e" + [[package]] name = "native-tls" version = "0.2.11" @@ -3304,9 +3310,9 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.59" +version = "0.10.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -3325,7 +3331,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3336,9 +3342,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -3639,9 +3645,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -3674,7 +3680,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3787,12 +3793,12 @@ dependencies = [ "time", "tokio", "tokio-util", - "toml 0.8.4", + "toml 0.8.8", "tracing", "tracing-actix-web", "tracing-error", "tracing-futures", - "tracing-log", + "tracing-log 0.1.4", "tracing-opentelemetry 0.21.0", "tracing-subscriber", "url", @@ -3816,7 +3822,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3839,14 +3845,14 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "plist" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a4a0cfc5fb21a09dc6af4bf834cf10d4a32fccd9e2ea468c4b1751a097487aa" +checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ "base64 0.21.5", - "indexmap 1.9.3", + "indexmap 2.1.0", "line-wrap", - "quick-xml 0.30.0", + "quick-xml 0.31.0", "serde", "time", ] @@ -3955,7 +3961,7 @@ dependencies = [ "byteorder", "hex", "lazy_static", - "rustix 0.36.16", + "rustix 0.36.17", ] [[package]] @@ -3987,12 +3993,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive 0.12.1", + "prost-derive 0.12.3", ] [[package]] @@ -4010,15 +4016,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4032,11 +4038,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" dependencies = [ - "prost 0.12.1", + "prost 0.12.3", ] [[package]] @@ -4102,6 +4108,15 @@ dependencies = [ "serde", ] +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.33" @@ -4164,7 +4179,7 @@ checksum = "b8f439da1766942fe069954da6058b2e6c1760eb878bae76f5be9fc29f56f574" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4176,15 +4191,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -4271,7 +4277,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls 0.21.9", "rustls-pemfile", "serde", "serde_json", @@ -4287,7 +4293,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.25.2", + "webpki-roots 0.25.3", "winreg", ] @@ -4332,9 +4338,9 @@ checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" [[package]] name = "rgb" -version = "0.8.36" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" dependencies = [ "bytemuck", ] @@ -4444,9 +4450,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.16" +version = "0.36.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da3636faa25820d8648e0e31c5d519bbb01f72fdf57131f0f5f7da5fed36eab" +checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" dependencies = [ "bitflags 1.3.2", "errno", @@ -4458,9 +4464,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.26" +version = "0.37.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f3f8f960ed3b5a59055428714943298bf3fa2d4a1d53135084e0544829d995" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno", @@ -4472,14 +4478,14 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.20" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ "bitflags 2.4.1", "errno", "libc", - "linux-raw-sys 0.4.10", + "linux-raw-sys 0.4.11", "windows-sys 0.48.0", ] @@ -4497,9 +4503,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", "ring 0.17.5", @@ -4509,9 +4515,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ "base64 0.21.5", ] @@ -4661,31 +4667,31 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.189" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -4731,7 +4737,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.2", + "indexmap 2.1.0", "serde", "serde_json", "serde_with_macros", @@ -4747,7 +4753,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4772,7 +4778,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4891,9 +4897,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smart-default" @@ -4903,7 +4909,7 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5022,7 +5028,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5044,9 +5050,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -5118,14 +5124,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall 0.3.5", - "rustix 0.38.20", + "redox_syscall 0.4.1", + "rustix 0.38.25", "windows-sys 0.48.0", ] @@ -5142,9 +5148,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] @@ -5166,7 +5172,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5231,9 +5237,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -5261,13 +5267,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5314,7 +5320,7 @@ checksum = "dd5831152cb0d3f79ef5523b357319ba154795d64c7078b2daa95a803b54057f" dependencies = [ "futures", "ring 0.16.20", - "rustls 0.21.8", + "rustls 0.21.9", "tokio", "tokio-postgres", "tokio-rustls 0.24.1", @@ -5337,7 +5343,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls 0.21.9", "tokio", ] @@ -5389,14 +5395,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef75d881185fd2df4a040793927c153d863651108a93c7e17a9e591baa95cc6" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.4", + "toml_edit 0.21.0", ] [[package]] @@ -5414,7 +5420,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -5423,11 +5429,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.4" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380f9e8120405471f7c9ad1860a713ef5ece6a670c7eae39225e477340f32fc4" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "serde", "serde_spanned", "toml_datetime", @@ -5512,7 +5518,7 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.1", + "prost 0.12.3", "tokio", "tokio-stream", "tower", @@ -5583,11 +5589,12 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a512ec11fae6c666707625e84f83e5d58f941e9ab15723289c0d380edfe48f09" +checksum = "1fe0d5feac3f4ca21ba33496bcb1ccab58cca6412b1405ae80f0581541e0ca78" dependencies = [ "actix-web", + "mutually_exclusive_features", "opentelemetry 0.20.0", "pin-project", "tracing", @@ -5603,7 +5610,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5647,6 +5654,17 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + [[package]] name = "tracing-opentelemetry" version = "0.16.0" @@ -5656,7 +5674,7 @@ dependencies = [ "opentelemetry 0.16.0", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.1.4", "tracing-subscriber", ] @@ -5670,7 +5688,7 @@ dependencies = [ "opentelemetry 0.19.0", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.1.4", "tracing-subscriber", ] @@ -5686,7 +5704,7 @@ dependencies = [ "smallvec", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.1.4", "tracing-subscriber", ] @@ -5702,9 +5720,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -5717,7 +5735,7 @@ dependencies = [ "thread_local", "tracing", "tracing-core", - "tracing-log", + "tracing-log 0.2.0", "tracing-serde", ] @@ -5753,7 +5771,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "termcolor", ] @@ -5774,7 +5792,7 @@ checksum = "29a3151c41d0b13e3d011f98adc24434560ef06673a155a6c7f66b9879eecce2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5851,12 +5869,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna 0.5.0", "percent-encoding", "serde", ] @@ -5875,9 +5893,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8-width" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "utf8parse" @@ -5887,9 +5905,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", "serde", @@ -5946,9 +5964,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5956,24 +5974,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ "cfg-if", "js-sys", @@ -5983,9 +6001,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5993,22 +6011,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-streams" @@ -6034,9 +6052,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -6090,9 +6108,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "whoami" @@ -6278,9 +6296,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.17" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] @@ -6323,29 +6341,29 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.13" +version = "0.7.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ffc046c9f849405a42c87e82e2f2f861d1f0a06b855910c76c2bd1e87be900c" +checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.13" +version = "0.7.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246c000cfc5f942bac7ff99fde24a9ebb589d92e024bc758c6c733c15a02a73e" +checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index b7a09212f..3bb1c58a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -97,10 +97,10 @@ lemmy_db_views_moderator = { version = "=0.19.0-rc.7", path = "./crates/db_views activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } -diesel = "2.1.3" +diesel = "2.1.4" diesel_migrations = "2.1.0" diesel-async = "0.3.2" -serde = { version = "1.0.189", features = ["derive"] } +serde = { version = "1.0.193", features = ["derive"] } serde_with = "3.4.0" actix-web = { version = "4.4.0", default-features = false, features = [ "macros", @@ -111,11 +111,11 @@ actix-web = { version = "4.4.0", default-features = false, features = [ "cookies", ] } tracing = "0.1.40" -tracing-actix-web = { version = "0.7.8", default-features = false } +tracing-actix-web = { version = "0.7.9", default-features = false } tracing-error = "0.2.0" tracing-log = "0.1.4" -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -url = { version = "2.4.1", features = ["serde"] } +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +url = { version = "2.5.0", features = ["serde"] } reqwest = { version = "0.11.22", features = ["json", "blocking", "gzip"] } reqwest-middleware = "0.2.4" reqwest-tracing = "0.4.6" @@ -123,9 +123,9 @@ clokwerk = "0.4.0" doku = { version = "0.21.1", features = ["url-2"] } bcrypt = "0.15.0" chrono = { version = "0.4.31", features = ["serde"], default-features = false } -serde_json = { version = "1.0.107", features = ["preserve_order"] } +serde_json = { version = "1.0.108", features = ["preserve_order"] } base64 = "0.21.5" -uuid = { version = "1.5.0", features = ["serde", "v4"] } +uuid = { version = "1.6.1", features = ["serde", "v4"] } async-trait = "0.1.74" captcha = "0.0.9" anyhow = { version = "1.0.75", features = [ @@ -134,7 +134,7 @@ anyhow = { version = "1.0.75", features = [ diesel_ltree = "0.3.0" typed-builder = "0.15.2" serial_test = "2.0.0" -tokio = { version = "1.33.0", features = ["full"] } +tokio = { version = "1.34.0", features = ["full"] } regex = "1.10.2" once_cell = "1.18.0" diesel-derive-newtype = "2.1.0" @@ -142,15 +142,15 @@ diesel-derive-enum = { version = "2.1.0", features = ["postgres"] } strum = "0.25.0" strum_macros = "0.25.3" itertools = "0.11.0" -futures = "0.3.28" -http = "0.2.9" -percent-encoding = "2.3.0" +futures = "0.3.29" +http = "0.2.11" +percent-encoding = "2.3.1" rosetta-i18n = "0.1.3" opentelemetry = { version = "0.19.0", features = ["rt-tokio"] } tracing-opentelemetry = { version = "0.19.0" } ts-rs = { version = "7.0.0", features = ["serde-compat", "chrono-impl"] } -rustls = { version = "0.21.8", features = ["dangerous_configuration"] } -futures-util = "0.3.28" +rustls = { version = "0.21.9", features = ["dangerous_configuration"] } +futures-util = "0.3.29" tokio-postgres = "0.7.10" tokio-postgres-rustls = "0.10.0" enum-map = "2.7" @@ -190,4 +190,4 @@ futures-util = { workspace = true } chrono = { workspace = true } prometheus = { version = "0.13.3", features = ["process"] } serial_test = { workspace = true } -clap = { version = "4.4.7", features = ["derive"] } +clap = { version = "4.4.8", features = ["derive"] } diff --git a/api_tests/.eslintrc.json b/api_tests/.eslintrc.json index c48d71f94..75b1706aa 100644 --- a/api_tests/.eslintrc.json +++ b/api_tests/.eslintrc.json @@ -14,6 +14,7 @@ "@typescript-eslint/ban-ts-comment": 0, "@typescript-eslint/no-explicit-any": 0, "@typescript-eslint/explicit-module-boundary-types": 0, + "@typescript-eslint/no-var-requires": 0, "arrow-body-style": 0, "curly": 0, "eol-last": 0, diff --git a/api_tests/src/comment.spec.ts b/api_tests/src/comment.spec.ts index 915c87a57..1ce40a5cc 100644 --- a/api_tests/src/comment.spec.ts +++ b/api_tests/src/comment.spec.ts @@ -39,7 +39,6 @@ import { delay, } from "./shared"; import { CommentView, CommunityView } from "lemmy-js-client"; -import { LemmyHttp } from "lemmy-js-client"; let betaCommunity: CommunityView | undefined; let postOnAlphaRes: PostResponse; diff --git a/api_tests/src/community.spec.ts b/api_tests/src/community.spec.ts index 3b6697a68..b4a58bb7b 100644 --- a/api_tests/src/community.spec.ts +++ b/api_tests/src/community.spec.ts @@ -32,7 +32,7 @@ import { resolveBetaCommunity, longDelay, } from "./shared"; -import { EditSite, LemmyHttp } from "lemmy-js-client"; +import { EditSite } from "lemmy-js-client"; beforeAll(setupLogins); diff --git a/api_tests/src/image.spec.ts b/api_tests/src/image.spec.ts index e6407ec1a..681015802 100644 --- a/api_tests/src/image.spec.ts +++ b/api_tests/src/image.spec.ts @@ -7,7 +7,7 @@ import { PurgePost, } from "lemmy-js-client"; import { - alpha, + alphaImage, alphaUrl, beta, betaUrl, @@ -18,13 +18,13 @@ import { setupLogins, unfollowRemotes, } from "./shared"; -import fs = require("fs"); +import * as fs from "node:fs"; const downloadFileSync = require("download-file-sync"); beforeAll(setupLogins); afterAll(() => { - unfollowRemotes(alpha); + unfollowRemotes(alphaImage); }); test("Upload image and delete it", async () => { @@ -33,7 +33,7 @@ test("Upload image and delete it", async () => { const upload_form: UploadImage = { image: upload_image, }; - const upload = await alpha.uploadImage(upload_form); + const upload = await alphaImage.uploadImage(upload_form); expect(upload.files![0].file).toBeDefined(); expect(upload.files![0].delete_token).toBeDefined(); expect(upload.url).toBeDefined(); @@ -48,7 +48,7 @@ test("Upload image and delete it", async () => { token: upload.files![0].delete_token, filename: upload.files![0].file, }; - const delete_ = await alpha.deleteImage(delete_form); + const delete_ = await alphaImage.deleteImage(delete_form); expect(delete_).toBe(true); // ensure that image is deleted @@ -57,7 +57,7 @@ test("Upload image and delete it", async () => { }); test("Purge user, uploaded image removed", async () => { - let user = await registerUser(alpha, alphaUrl); + let user = await registerUser(alphaImage, alphaUrl); // upload test image const upload_image = fs.readFileSync("test.png"); @@ -79,7 +79,7 @@ test("Purge user, uploaded image removed", async () => { const purge_form: PurgePerson = { person_id: site.my_user!.local_user_view.person.id, }; - const delete_ = await alpha.purgePerson(purge_form); + const delete_ = await alphaImage.purgePerson(purge_form); expect(delete_.success).toBe(true); // ensure that image is deleted diff --git a/api_tests/src/post.spec.ts b/api_tests/src/post.spec.ts index f92fedf6c..72029157d 100644 --- a/api_tests/src/post.spec.ts +++ b/api_tests/src/post.spec.ts @@ -39,7 +39,7 @@ import { loginUser, } from "./shared"; import { PostView } from "lemmy-js-client/dist/types/PostView"; -import { LemmyHttp, ResolveObject } from "lemmy-js-client"; +import { ResolveObject } from "lemmy-js-client"; let betaCommunity: CommunityView | undefined; diff --git a/api_tests/src/shared.ts b/api_tests/src/shared.ts index ace3a6fac..167804e94 100644 --- a/api_tests/src/shared.ts +++ b/api_tests/src/shared.ts @@ -75,17 +75,20 @@ import { GetPersonDetailsResponse } from "lemmy-js-client/dist/types/GetPersonDe import { GetPersonDetails } from "lemmy-js-client/dist/types/GetPersonDetails"; import { ListingType } from "lemmy-js-client/dist/types/ListingType"; +export const fetchFunction = fetch; + export let alphaUrl = "http://127.0.0.1:8541"; export let betaUrl = "http://127.0.0.1:8551"; export let gammaUrl = "http://127.0.0.1:8561"; export let deltaUrl = "http://127.0.0.1:8571"; export let epsilonUrl = "http://127.0.0.1:8581"; -export let alpha = new LemmyHttp(alphaUrl); -export let beta = new LemmyHttp(betaUrl); -export let gamma = new LemmyHttp(gammaUrl); -export let delta = new LemmyHttp(deltaUrl); -export let epsilon = new LemmyHttp(epsilonUrl); +export let alpha = new LemmyHttp(alphaUrl, { fetchFunction }); +export let alphaImage = new LemmyHttp(alphaUrl); +export let beta = new LemmyHttp(betaUrl, { fetchFunction }); +export let gamma = new LemmyHttp(gammaUrl, { fetchFunction }); +export let delta = new LemmyHttp(deltaUrl, { fetchFunction }); +export let epsilon = new LemmyHttp(epsilonUrl, { fetchFunction }); export let betaAllowedInstances = [ "lemmy-alpha", @@ -135,6 +138,7 @@ export async function setupLogins() { resEpsilon, ]); alpha.setHeaders({ Authorization: `Bearer ${res[0].jwt ?? ""}` }); + alphaImage.setHeaders({ Authorization: `Bearer ${res[0].jwt ?? ""}` }); beta.setHeaders({ Authorization: `Bearer ${res[1].jwt ?? ""}` }); gamma.setHeaders({ Authorization: `Bearer ${res[2].jwt ?? ""}` }); delta.setHeaders({ Authorization: `Bearer ${res[3].jwt ?? ""}` }); diff --git a/api_tests/src/user.spec.ts b/api_tests/src/user.spec.ts index c3c7d0bec..ccfc5e1fe 100644 --- a/api_tests/src/user.spec.ts +++ b/api_tests/src/user.spec.ts @@ -18,6 +18,7 @@ import { saveUserSettings, getPost, getComments, + fetchFunction, } from "./shared"; import { LemmyHttp, SaveUserSettings } from "lemmy-js-client"; import { GetPosts } from "lemmy-js-client/dist/types/GetPosts"; @@ -114,6 +115,7 @@ test("Delete user", async () => { test("Requests with invalid auth should be treated as unauthenticated", async () => { let invalid_auth = new LemmyHttp(alphaUrl, { headers: { Authorization: "Bearer foobar" }, + fetchFunction, }); let site = await getSite(invalid_auth); expect(site.my_user).toBeUndefined(); diff --git a/crates/api_common/Cargo.toml b/crates/api_common/Cargo.toml index a45d2f65a..1d310e749 100644 --- a/crates/api_common/Cargo.toml +++ b/crates/api_common/Cargo.toml @@ -68,7 +68,7 @@ once_cell = { workspace = true, optional = true } actix-web = { workspace = true, optional = true } jsonwebtoken = { version = "8.3.0", optional = true } # necessary for wasmt compilation -getrandom = { version = "0.2.10", features = ["js"] } +getrandom = { version = "0.2.11", features = ["js"] } enum-map = { workspace = true } [package.metadata.cargo-machete] diff --git a/crates/federate/Cargo.toml b/crates/federate/Cargo.toml index 85c781a40..41ee72110 100644 --- a/crates/federate/Cargo.toml +++ b/crates/federate/Cargo.toml @@ -31,4 +31,4 @@ serde_json.workspace = true tokio = { workspace = true, features = ["full"] } tracing.workspace = true moka = { version = "0.11.3", features = ["future"] } -tokio-util = "0.7.9" +tokio-util = "0.7.10" diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index 1c2aa5433..34e0ab1d7 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -41,7 +41,7 @@ uuid = { workspace = true, features = ["serde", "v4"] } rosetta-i18n = { workspace = true } percent-encoding = { workspace = true } tokio = { workspace = true } -openssl = "0.10.57" +openssl = "0.10.60" html2text = "0.6.0" deser-hjson = "1.2.0" smart-default = "0.7.1" From 7d489f1e3fe7de9589f39f20f4911e1563083e9c Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 24 Nov 2023 13:44:17 +0100 Subject: [PATCH 05/71] Upgrade pictrs to 0.5.0-beta.2 (#4194) * Upgrade pictrs to 0.5.0-beta.2 * Update src/main.rs Co-authored-by: asonix * add comment --------- Co-authored-by: asonix --- .cargo/config | 3 +- Cargo.lock | 486 ++++++++++++++++++++++-------------- Cargo.toml | 2 +- crates/db_schema/src/lib.rs | 6 +- src/main.rs | 4 +- 5 files changed, 304 insertions(+), 197 deletions(-) diff --git a/.cargo/config b/.cargo/config index bff29e6e1..f6e10093d 100644 --- a/.cargo/config +++ b/.cargo/config @@ -1,2 +1,3 @@ [build] -rustflags = ["--cfg", "tokio_unstable"] +# these are necessary for building with embed-pictrs feature +rustflags = ["--cfg", "tokio_unstable", "--cfg", "uuid_unstable"] diff --git a/Cargo.lock b/Cargo.lock index 8d795b690..e86d861a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,7 +115,7 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "ahash 0.8.6", + "ahash", "base64 0.21.5", "bitflags 2.4.1", "brotli", @@ -276,7 +276,7 @@ dependencies = [ "actix-tls", "actix-utils", "actix-web-codegen", - "ahash 0.8.6", + "ahash", "bytes", "bytestring", "cfg-if", @@ -343,17 +343,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.6" @@ -567,6 +556,12 @@ dependencies = [ "quick-xml 0.30.0", ] +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "autocfg" version = "1.1.0" @@ -633,6 +628,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "barrel" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9e605929a6964efbec5ac0884bd0fe93f12a3b1eb271f52c251316640c68d9" + [[package]] name = "base32" version = "0.4.0" @@ -985,12 +986,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" dependencies = [ "async-trait", - "json5", "lazy_static", "nom", "pathdiff", "ron", - "rust-ini", "serde", "serde_json", "toml 0.5.11", @@ -1416,6 +1415,7 @@ dependencies = [ "itoa", "pq-sys", "serde_json", + "time", "uuid", ] @@ -1434,6 +1434,21 @@ dependencies = [ "tokio-postgres", ] +[[package]] +name = "diesel-async" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acada1517534c92d3f382217b485db8a8638f111b0e3f2a2a8e26165050f77be" +dependencies = [ + "async-trait", + "deadpool", + "diesel", + "futures-util", + "scoped-futures", + "tokio", + "tokio-postgres", +] + [[package]] name = "diesel-derive-enum" version = "2.1.0" @@ -1519,12 +1534,6 @@ dependencies = [ "chrono", ] -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - [[package]] name = "doku" version = "0.21.1" @@ -1768,7 +1777,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a88c69768c0a15262df21899142bc6df9b9b823546d4b4b9a7bc2d6c448ec6fd" dependencies = [ - "hashbrown 0.13.2", + "hashbrown 0.13.1", ] [[package]] @@ -1821,6 +1830,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2043,17 +2064,14 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.7", -] [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.6", + "ahash", ] [[package]] @@ -2491,17 +2509,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - [[package]] name = "jsonwebtoken" version = "8.3.0" @@ -2657,7 +2664,7 @@ dependencies = [ "chrono", "deadpool", "diesel", - "diesel-async", + "diesel-async 0.3.2", "diesel-derive-enum", "diesel-derive-newtype", "diesel_ltree", @@ -2689,7 +2696,7 @@ version = "0.19.0-rc.7" dependencies = [ "actix-web", "diesel", - "diesel-async", + "diesel-async 0.3.2", "diesel_ltree", "lemmy_db_schema", "lemmy_utils", @@ -2707,7 +2714,7 @@ version = "0.19.0-rc.7" dependencies = [ "chrono", "diesel", - "diesel-async", + "diesel-async 0.3.2", "lemmy_db_schema", "serde", "serde_with", @@ -2723,7 +2730,7 @@ name = "lemmy_db_views_moderator" version = "0.19.0-rc.7" dependencies = [ "diesel", - "diesel-async", + "diesel-async 0.3.2", "lemmy_db_schema", "serde", "serde_with", @@ -2738,7 +2745,7 @@ dependencies = [ "anyhow", "chrono", "diesel", - "diesel-async", + "diesel-async 0.3.2", "futures", "lemmy_api_common", "lemmy_apub", @@ -2789,7 +2796,7 @@ dependencies = [ "clokwerk", "console-subscriber 0.1.10", "diesel", - "diesel-async", + "diesel-async 0.3.2", "futures-util", "lemmy_api", "lemmy_api_common", @@ -3096,6 +3103,60 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metrics" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +dependencies = [ + "ahash", + "metrics-macros", + "portable-atomic", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" +dependencies = [ + "base64 0.21.5", + "hyper", + "indexmap 1.9.3", + "ipnet", + "metrics", + "metrics-util", + "quanta", + "thiserror", + "tokio", +] + +[[package]] +name = "metrics-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "metrics-util" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.13.1", + "metrics", + "num_cpus", + "quanta", + "sketches-ddsketch", +] + [[package]] name = "migrations_internals" version = "2.1.0" @@ -3192,6 +3253,15 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d02c0b00610773bb7fc61d85e13d86c7858cbdf00e1a120bfc41bc055dbaa0e" +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -3375,18 +3445,24 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" dependencies = [ - "opentelemetry_api 0.19.0", + "opentelemetry_api", "opentelemetry_sdk 0.19.0", ] [[package]] name = "opentelemetry" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" +checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", + "futures-core", + "futures-sink", + "indexmap 2.1.0", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", ] [[package]] @@ -3409,17 +3485,17 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" +checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930" dependencies = [ "async-trait", "futures-core", "http", - "opentelemetry-proto 0.3.0", + "opentelemetry 0.21.0", + "opentelemetry-proto 0.4.0", "opentelemetry-semantic-conventions", - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", + "opentelemetry_sdk 0.21.1", "prost 0.11.9", "thiserror", "tokio", @@ -3441,23 +3517,23 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" +checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1" dependencies = [ - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", + "opentelemetry 0.21.0", + "opentelemetry_sdk 0.21.1", "prost 0.11.9", "tonic 0.9.2", ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" +checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84" dependencies = [ - "opentelemetry 0.20.0", + "opentelemetry 0.21.0", ] [[package]] @@ -3476,22 +3552,6 @@ dependencies = [ "urlencoding", ] -[[package]] -name = "opentelemetry_api" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" -dependencies = [ - "futures-channel", - "futures-util", - "indexmap 1.9.3", - "js-sys", - "once_cell", - "pin-project-lite", - "thiserror", - "urlencoding", -] - [[package]] name = "opentelemetry_sdk" version = "0.19.0" @@ -3506,7 +3566,7 @@ dependencies = [ "futures-executor", "futures-util", "once_cell", - "opentelemetry_api 0.19.0", + "opentelemetry_api", "percent-encoding", "rand", "thiserror", @@ -3516,22 +3576,21 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" +checksum = "968ba3f2ca03e90e5187f5e4f46c791ef7f2c163ae87789c8ce5f5ca3b7b7de5" dependencies = [ "async-trait", "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", + "glob", "once_cell", - "opentelemetry_api 0.20.0", + "opentelemetry 0.21.0", "ordered-float", "percent-encoding", "rand", - "regex", - "serde_json", "thiserror", "tokio", "tokio-stream", @@ -3539,23 +3598,13 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.9.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +checksum = "536900a8093134cf9ccf00a27deb3532421099e958d9dd431135d0c7543ca1e8" dependencies = [ "num-traits", ] -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.3", -] - [[package]] name = "overload" version = "0.1.1" @@ -3649,51 +3698,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pest" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "pest_meta" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - [[package]] name = "phf" version = "0.10.1" @@ -3738,7 +3742,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -3747,59 +3751,66 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] name = "pict-rs" -version = "0.4.5" +version = "0.5.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abe9ff018542d54d486f8fe3ea05f7bb09dc172fdbaa08e945abf0e64b2495" +checksum = "9aee5f19113e9a0e221c4ed01eaa10830926aa8d3ab7330e8bc87911c776062c" dependencies = [ "actix-form-data", - "actix-rt", - "actix-server", "actix-web", "anyhow", "async-trait", + "barrel", "base64 0.21.5", "clap", "color-eyre", "config", "console-subscriber 0.2.0", "dashmap", - "futures-util", + "deadpool", + "diesel", + "diesel-async 0.4.1", + "diesel-derive-enum", + "flume", + "futures-core", "hex", "md-5", + "metrics", + "metrics-exporter-prometheus", "mime", - "num_cpus", - "once_cell", - "opentelemetry 0.20.0", - "opentelemetry-otlp 0.13.0", + "opentelemetry 0.21.0", + "opentelemetry-otlp 0.14.0", + "opentelemetry_sdk 0.21.1", "pin-project-lite", - "quick-xml 0.30.0", + "refinery", "reqwest", "reqwest-middleware", "reqwest-tracing", "rusty-s3", "serde", + "serde-tuple-vec-map", "serde_json", "serde_urlencoded", "sha2", "sled", "storage-path-generator", + "streem", "subtle", "thiserror", "time", "tokio", + "tokio-postgres", "tokio-util", "toml 0.8.8", "tracing", "tracing-actix-web", "tracing-error", - "tracing-futures", - "tracing-log 0.1.4", - "tracing-opentelemetry 0.21.0", + "tracing-log 0.2.0", + "tracing-opentelemetry 0.22.0", "tracing-subscriber", "url", "uuid", @@ -3886,6 +3897,26 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "portable-atomic" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" + +[[package]] +name = "postgres" +version = "0.19.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7915b33ed60abc46040cbcaa25ffa1c7ec240668e0477c4f3070786f5916d451" +dependencies = [ + "bytes", + "fallible-iterator", + "futures-util", + "log", + "tokio", + "tokio-postgres", +] + [[package]] name = "postgres-protocol" version = "0.6.6" @@ -3913,6 +3944,10 @@ dependencies = [ "bytes", "fallible-iterator", "postgres-protocol", + "serde", + "serde_json", + "time", + "uuid", ] [[package]] @@ -4087,16 +4122,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "quick-xml" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc053f057dd768a56f62cd7e434c42c831d296968997e9ac1f76ea7c2d14c41" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quick-xml" version = "0.30.0" @@ -4200,6 +4225,52 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "refinery" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529664dbccc0a296947615c997a857912d72d1c44be1fafb7bae54ecfa7a8c24" +dependencies = [ + "refinery-core", + "refinery-macros", +] + +[[package]] +name = "refinery-core" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e895cb870cf06e92318cbbeb701f274d022d5ca87a16fa8244e291cd035ef954" +dependencies = [ + "async-trait", + "cfg-if", + "lazy_static", + "log", + "postgres", + "regex", + "serde", + "siphasher 1.0.0", + "thiserror", + "time", + "tokio", + "tokio-postgres", + "toml 0.7.8", + "url", + "walkdir", +] + +[[package]] +name = "refinery-macros" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123e8b80f8010c3ae38330c81e76938fc7adf6cdbfbaad20295bb8c22718b4f1" +dependencies = [ + "proc-macro2", + "quote", + "refinery-core", + "regex", + "syn 2.0.39", +] + [[package]] name = "regex" version = "1.10.2" @@ -4423,16 +4494,6 @@ dependencies = [ "quick-xml 0.30.0", ] -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if", - "ordered-multimap", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -4540,15 +4601,15 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "rusty-s3" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c92776b0db0fea6d7cc3abb9d0d745814c71124471a3bfd84b1265a28c06130" +checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" dependencies = [ "base64 0.21.5", "hmac", "md-5", "percent-encoding", - "quick-xml 0.27.1", + "quick-xml 0.30.0", "serde", "serde_json", "sha2", @@ -4674,6 +4735,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-tuple-vec-map" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a04d0ebe0de77d7d445bb729a895dcb0a288854b267ca85f030ce51cdc578c82" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.193" @@ -4845,6 +4915,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ac45299ccbd390721be55b412d41931911f654fa99e2cb8bfb57184b2061fe" + [[package]] name = "sitemap-rs" version = "0.2.0" @@ -4870,6 +4946,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "sketches-ddsketch" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" + [[package]] name = "slab" version = "0.4.9" @@ -4943,6 +5025,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "stacker" @@ -4963,6 +5048,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f11d35dae9818c4313649da4a97c8329e29357a7fe584526c1d78f5b63ef836" +[[package]] +name = "streem" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8b0c8184b0fe05b37dd75d66205195cd57563c6c87cb92134a025a34a6ab34" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "string_cache" version = "0.8.7" @@ -5595,10 +5690,10 @@ checksum = "1fe0d5feac3f4ca21ba33496bcb1ccab58cca6412b1405ae80f0581541e0ca78" dependencies = [ "actix-web", "mutually_exclusive_features", - "opentelemetry 0.20.0", + "opentelemetry 0.21.0", "pin-project", "tracing", - "tracing-opentelemetry 0.21.0", + "tracing-opentelemetry 0.22.0", "uuid", ] @@ -5694,18 +5789,20 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8" +checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" dependencies = [ + "js-sys", "once_cell", - "opentelemetry 0.20.0", - "opentelemetry_sdk 0.20.0", + "opentelemetry 0.21.0", + "opentelemetry_sdk 0.21.1", "smallvec", "tracing", "tracing-core", - "tracing-log 0.1.4", + "tracing-log 0.2.0", "tracing-subscriber", + "web-time", ] [[package]] @@ -5801,12 +5898,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - [[package]] name = "unicase" version = "2.7.0" @@ -5909,6 +6000,7 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ + "atomic", "getrandom", "serde", ] @@ -6060,6 +6152,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57099a701fb3a8043f993e8228dc24229c7b942e2b009a1b962e54489ba1d3bf" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webmention" version = "0.5.0" diff --git a/Cargo.toml b/Cargo.toml index 3bb1c58a2..5b9e319ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -183,7 +183,7 @@ tracing-opentelemetry = { workspace = true, optional = true } opentelemetry = { workspace = true, optional = true } console-subscriber = { version = "0.1.10", optional = true } opentelemetry-otlp = { version = "0.12.0", optional = true } -pict-rs = { version = "0.4.5", optional = true } +pict-rs = { version = "0.5.0-beta.2", optional = true } tokio.workspace = true actix-cors = "0.6.4" futures-util = { workspace = true } diff --git a/crates/db_schema/src/lib.rs b/crates/db_schema/src/lib.rs index 8d5ad8d79..a53a1733c 100644 --- a/crates/db_schema/src/lib.rs +++ b/crates/db_schema/src/lib.rs @@ -31,7 +31,11 @@ pub mod schema; #[cfg(feature = "full")] pub mod aliases { use crate::schema::{community_moderator, person}; - diesel::alias!(person as person1: Person1, person as person2: Person2, community_moderator as community_moderator1: CommunityModerator1); + diesel::alias!( + person as person1: Person1, + person as person2: Person2, + community_moderator as community_moderator1: CommunityModerator1 + ); } pub mod source; #[cfg(feature = "full")] diff --git a/src/main.rs b/src/main.rs index a876f7f11..85d74fb13 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,7 +18,7 @@ pub async fn main() -> Result<(), LemmyError> { .port() .unwrap_or(8080); let pictrs_address = ["127.0.0.1", &pictrs_port.to_string()].join(":"); - pict_rs::ConfigSource::memory(serde_json::json!({ + let pictrs_config = pict_rs::ConfigSource::memory(serde_json::json!({ "server": { "address": pictrs_address }, @@ -36,7 +36,7 @@ pub async fn main() -> Result<(), LemmyError> { })) .init::<&str>(None) .expect("initialize pictrs config"); - let (lemmy, pictrs) = tokio::join!(start_lemmy_server(args), pict_rs::run()); + let (lemmy, pictrs) = tokio::join!(start_lemmy_server(args), pictrs_config.run_on_localset()); lemmy?; pictrs.expect("run pictrs"); } From 934fe7d1cb0e012ffca144f8a39ac932c9cc2f70 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 24 Nov 2023 17:26:21 +0100 Subject: [PATCH 06/71] Remove pictrs config section `old_db` (#4199) * Remove pictrs config section `old_db` (ref #4194) * ci * remove cargo config comment * ci * Revert "remove cargo config comment" This reverts commit 9389e936490ec1a82e5a51a61f61a576201479a8. * rename .cargo to .cargo_home --- .woodpecker.yml | 24 ++++++++++++------------ src/main.rs | 3 --- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 29e5939b5..86f27b213 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -60,7 +60,7 @@ steps: image: rustlang/rust:nightly environment: # store cargo data in repo folder so that it gets cached between steps - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: # need make existing toolchain available - cargo +nightly fmt -- --check @@ -92,7 +92,7 @@ steps: cache_key: "rust-cache" path-style: true mount: - - ".cargo" + - ".cargo_home" - "target" - "api_tests/node_modules" secrets: @@ -103,7 +103,7 @@ steps: check_api_common_default_features: image: *rust_image environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: - cargo check --package lemmy_api_common when: *slow_check_paths @@ -111,7 +111,7 @@ steps: lemmy_api_common_doesnt_depend_on_diesel: image: *rust_image environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: - "! cargo tree -p lemmy_api_common --no-default-features -i diesel" when: *slow_check_paths @@ -119,7 +119,7 @@ steps: lemmy_api_common_works_with_wasm: image: *rust_image environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: - "rustup target add wasm32-unknown-unknown" - "cargo check --target wasm32-unknown-unknown -p lemmy_api_common" @@ -128,7 +128,7 @@ steps: check_defaults_hjson_updated: image: *rust_image environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: - export LEMMY_CONFIG_LOCATION=./config/config.hjson - ./scripts/update_config_defaults.sh config/defaults_current.hjson @@ -138,7 +138,7 @@ steps: check_diesel_schema: image: willsquire/diesel-cli environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home DATABASE_URL: postgres://lemmy:password@database:5432/lemmy commands: - diesel migration run @@ -149,7 +149,7 @@ steps: check_diesel_migration_revertable: image: willsquire/diesel-cli environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home DATABASE_URL: postgres://lemmy:password@database:5432/lemmy commands: - diesel migration run @@ -159,7 +159,7 @@ steps: cargo_clippy: image: *rust_image environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: # when adding new clippy lints, make sure to also add them in scripts/lint.sh - rustup component add clippy @@ -169,7 +169,7 @@ steps: cargo_build: image: *rust_image environment: - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: - cargo build - mv target/debug/lemmy_server target/lemmy_server @@ -181,7 +181,7 @@ steps: environment: LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy RUST_BACKTRACE: "1" - CARGO_HOME: .cargo + CARGO_HOME: .cargo_home commands: - export LEMMY_CONFIG_LOCATION=../../config/config.hjson - cargo test --workspace --no-fail-fast @@ -218,7 +218,7 @@ steps: region: us-east-1 path-style: true mount: - - ".cargo" + - ".cargo_home" - "target" - "api_tests/node_modules" secrets: diff --git a/src/main.rs b/src/main.rs index 85d74fb13..1544bcecf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,9 +22,6 @@ pub async fn main() -> Result<(), LemmyError> { "server": { "address": pictrs_address }, - "old_db": { - "path": "./pictrs/old" - }, "repo": { "type": "sled", "path": "./pictrs/sled-repo" From 8a05c8f8be517a7b2bab98120e9cb16b8a3074cf Mon Sep 17 00:00:00 2001 From: Enzo Nocera Date: Fri, 24 Nov 2023 18:52:19 +0100 Subject: [PATCH 07/71] fix: Cross-compilation to ARM64 (#4142) * feat(docker/docs): explain how building lemmy works Signed-off-by: Enzo NOCERA * feat: add arm build * review: rename script & fix typo * feat(ci): allow cross platform compilation * feat(ci): prettier * fix(docker): fix base image name * fix: add dockerfile in CI path Signed-off-by: Enzo Nocera * fix(docker): fix runner name * fix(docker): fix builder base image * fix(docker): fix builder base image platform * fix(docker): avoid using the wrapper adduser/addgroup * feat: avoid adding the whole docker directory in the build context --------- Signed-off-by: Enzo NOCERA Signed-off-by: Enzo Nocera Co-authored-by: Dessalines Co-authored-by: Nutomic --- .dockerignore | 1 + .woodpecker.yml | 18 ++- docker/Dockerfile | 108 +++++++----------- docker/README.md | 21 ++++ .../builders/lemmy-builder-arm64/Dockerfile | 23 ++++ .../lemmy-builder-arm64/docker-build.sh | 20 ++++ 6 files changed, 119 insertions(+), 72 deletions(-) create mode 100644 docker/README.md create mode 100644 docker/builders/lemmy-builder-arm64/Dockerfile create mode 100644 docker/builders/lemmy-builder-arm64/docker-build.sh diff --git a/.dockerignore b/.dockerignore index 5982307c0..b999debba 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,7 @@ # build folders and similar which are not needed for the docker build target docker +!docker/builders/lemmy-builder-arm64/docker-build.sh api_tests ansible tests diff --git a/.woodpecker.yml b/.woodpecker.yml index 86f27b213..667e49582 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -227,17 +227,29 @@ steps: - event: push branch: main + publish_builder_arm64: + image: woodpeckerci/plugin-docker-buildx + secrets: [docker_username, docker_password] + settings: + repo: dessalines/lemmy-builder-arm64 + dockerfile: docker/builders/lemmy-builder-arm64/Dockerfile + platforms: linux/amd64 + build_args: + - RUST_RELEASE_MODE=release + tag: ${CI_COMMIT_TAG} + when: + event: tag + publish_release_docker: image: woodpeckerci/plugin-docker-buildx secrets: [docker_username, docker_password] settings: repo: dessalines/lemmy dockerfile: docker/Dockerfile - # TODO fix arm build: see: https://woodpecker.join-lemmy.org/repos/129/pipeline/2888/20 - # platforms: linux/amd64,linux/arm64 - platforms: linux/amd64 + platforms: linux/amd64, linux/arm64 build_args: - RUST_RELEASE_MODE=release + - LEMMY_VERSION=${CI_COMMIT_TAG} tag: ${CI_COMMIT_TAG} when: event: tag diff --git a/docker/Dockerfile b/docker/Dockerfile index eab612598..359c030ad 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,10 +1,18 @@ +# syntax=docker/dockerfile:1.6 ARG RUST_VERSION=1.72.1 ARG CARGO_BUILD_FEATURES=default ARG RUST_RELEASE_MODE=debug +ARG LEMMY_VERSION="dev" + ARG AMD_BUILDER_IMAGE=rust:${RUST_VERSION} -ARG ARM_BUILDER_IMAGE=blackdex/rust-musl:aarch64-musl-stable-${RUST_VERSION}-openssl3 +ARG ARM_BUILDER_IMAGE="dessalines/lemmy-builder-arm64:${LEMMY_VERSION}" + ARG AMD_RUNNER_IMAGE=debian:bookworm-slim -ARG ARM_RUNNER_IMAGE=alpine:3.18 +ARG ARM_RUNNER_IMAGE=debian:bookworm-slim + +ARG UNAME=lemmy +ARG UID=1000 +ARG GID=1000 # AMD64 builder FROM --platform=${BUILDPLATFORM} ${AMD_BUILDER_IMAGE} AS build-amd64 @@ -33,79 +41,41 @@ RUN set -ex; \ fi # ARM64 builder -# TODO currently broken -# FROM --platform=${BUILDPLATFORM} ${ARM_BUILDER_IMAGE} as build-arm64 +# NB(raskyld): this is a hack to be able to COPY --from= this image, because the variable doesn't +# seem to be expended in --form arg of COPY :( +FROM --platform=linux/amd64 ${ARM_BUILDER_IMAGE} AS build-arm64 -# ENV DEBIAN_FRONTEND=noninteractive -# ENV CARGO_HOME=/root/.cargo -# ENV PQ_LIB_DIR=/usr/local/musl/pq15/lib - -# RUN apt update && apt install -y \ -# --no-install-recommends \ -# git - -# RUN mkdir -pv "${CARGO_HOME}" && \ -# rustup set profile minimal && \ -# rustup target add aarch64-unknown-linux-musl - -# ARG CARGO_BUILD_FEATURES -# ARG RUST_RELEASE_MODE - -# WORKDIR /lemmy - -# COPY . ./ - -# # Debug build -# RUN --mount=type=cache,target=/lemmy/target set -ex; \ -# if [ "${RUST_RELEASE_MODE}" = "debug" ]; then \ -# echo "pub const VERSION: &str = \"$(git describe --tag)\";" > crates/utils/src/version.rs; \ -# cargo build --target=aarch64-unknown-linux-musl --features "${CARGO_BUILD_FEATURES}"; \ -# mv target/aarch64-unknown-linux-musl/debug/lemmy_server ./lemmy; \ -# fi - -# # Release build -# RUN set -ex; \ -# if [ "${RUST_RELEASE_MODE}" = "release" ]; then \ -# echo "pub const VERSION: &str = \"$(git describe --tag)\";" > crates/utils/src/version.rs; \ -# cargo build --target=aarch64-unknown-linux-musl --features "${CARGO_BUILD_FEATURES}" --release; \ -# mv target/aarch64-unknown-linux-musl/release/lemmy_server ./lemmy; \ -# fi - -## Final image -FROM ${AMD_RUNNER_IMAGE} +# amd64 base runner +FROM ${AMD_RUNNER_IMAGE} AS runner-linux-amd64 # Federation needs CA certificates RUN apt update && apt install -y libssl-dev libpq-dev ca-certificates -# Debian / Ubuntu non-root user creds -ARG UNAME=lemmy -ARG UID=1000 -ARG GID=1000 -RUN groupadd -g $GID -o $UNAME -RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME +COPY --from=build-amd64 --chmod=0755 /lemmy/lemmy /usr/local/bin + +# arm base runner +FROM ${ARM_RUNNER_IMAGE} AS runner-linux-arm64 + +RUN apt update && apt install -y ca-certificates libssl-dev libpq-dev + +COPY --from=build-arm64 --chmod=0755 /home/lemmy/lemmy_server /usr/local/bin + +# Final image that use a base runner based on the target OS and ARCH +FROM runner-${TARGETOS}-${TARGETARCH} + +LABEL org.opencontainers.image.authors="The Lemmy Authors" +LABEL org.opencontainers.image.source="https://github.com/LemmyNet/lemmy" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.description="A link aggregator and forum for the fediverse" + +ARG UNAME +ARG GID +ARG UID + +RUN groupadd -g ${GID} -o ${UNAME} && \ + useradd -m -u ${UID} -g ${GID} -o -s /bin/bash ${UNAME} USER $UNAME -COPY --from=build-amd64 /lemmy/lemmy ./ -CMD ["./lemmy"] +ENTRYPOINT ["lemmy_server"] EXPOSE 8536 STOPSIGNAL SIGTERM - -## Arm Runner -# FROM --platform=${BUILDPLATFORM} ${ARM_RUNNER_IMAGE} - -# ARG UNAME=lemmy -# ARG UID=1000 -# ARG GID=1000 - -# RUN apk add --no-cache ca-certificates - -# COPY --from=build-arm64 --chmod=0755 /lemmy/lemmy /usr/local/bin - -# RUN addgroup -S -g ${GID} ${UNAME} && \ -# adduser -S -H -D -G ${UNAME} -u ${UID} -g "" -s /sbin/nologin ${UNAME} -# USER $UNAME - -# CMD ["lemmy"] -# EXPOSE 8536 -# STOPSIGNAL SIGTERM - diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..8972055a0 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,21 @@ +# Building Lemmy Images + +Lemmy's images are meant to be **built** on `linux/amd64`, +but they can be **executed** on both `linux/amd64` and `linux/arm64`. + +To do so we need to use a _cross toolchain_ whose goal is to build +**from** amd64 **to** arm64. + +Namely, we need to link the _lemmy_server_ with `pq` and `openssl` +shared libraries and a few others, and they need to be in `arm64`, +indeed. + +The toolchain we use to cross-compile is specifically tailored for +Lemmy's needs, see [the image repository][image-repo]. + +#### References + +- [The Linux Documentation Project on Shared Libraries][tldp-lib] + +[tldp-lib]: https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html +[image-repo]: https://github.com/raskyld/lemmy-cross-toolchains diff --git a/docker/builders/lemmy-builder-arm64/Dockerfile b/docker/builders/lemmy-builder-arm64/Dockerfile new file mode 100644 index 000000000..8863b2f99 --- /dev/null +++ b/docker/builders/lemmy-builder-arm64/Dockerfile @@ -0,0 +1,23 @@ +ARG ARM_CROSS_TOOLCHAIN="ghcr.io/raskyld/aarch64-lemmy-linux-gnu:v0.1.0" + +FROM ${ARM_CROSS_TOOLCHAIN} + +# NB(raskyld): Please, do not hesitate to contact me through @raskyld@social.vivaldi.net (mastodon) +# If you have any question about the cross-toolchain +LABEL org.opencontainers.image.authors="Enzo Nocera " +LABEL org.opencontainers.image.source="https://github.com/LemmyNet/lemmy" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.description="A prebuilt lemmy server using a cross toolchain from amd64 to aarch64/arm64" + +ARG CARGO_BUILD_FEATURES=default +ARG RUST_RELEASE_MODE=debug + +WORKDIR /home/lemmy/src +USER 10001:10001 + +COPY --chown=lemmy:lemmy . ./ + +ENV RUST_RELEASE_MODE=${RUST_RELEASE_MODE} \ + CARGO_BUILD_FEATURES=${CARGO_BUILD_FEATURES} + +RUN --mount=type=cache,target=./target,uid=10001,gid=10001 bash ./docker/builders/lemmy-builder-arm64/docker-build.sh diff --git a/docker/builders/lemmy-builder-arm64/docker-build.sh b/docker/builders/lemmy-builder-arm64/docker-build.sh new file mode 100644 index 000000000..752fda80b --- /dev/null +++ b/docker/builders/lemmy-builder-arm64/docker-build.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e; + +source "$HOME/.cargo/env" + +case "$RUST_RELEASE_MODE" in + "debug") + echo "pub const VERSION: &str = \"$(git describe --tag)\";" > "crates/utils/src/version.rs" + cargo build --features "${CARGO_BUILD_FEATURES}" + cp "./target/$CARGO_BUILD_TARGET/$RUST_RELEASE_MODE/lemmy_server" /home/lemmy/lemmy_server + ;; + "release") + # Pass a value to $USE_RELEASE_CACHE to avoid purging the cache for release builds + [[ -z "$USE_RELEASE_CACHE" ]] || cargo clean --release + echo "pub const VERSION: &str = \"$(git describe --tag)\";" > "crates/utils/src/version.rs" + cargo build --features "${CARGO_BUILD_FEATURES}" --release + cp "./target/$CARGO_BUILD_TARGET/$RUST_RELEASE_MODE/lemmy_server" /home/lemmy/lemmy_server + ;; +esac From fc07ba2d3bfb7292e01aa887db0ec6008fb3b12d Mon Sep 17 00:00:00 2001 From: Kroese Date: Sun, 26 Nov 2023 22:50:31 +0100 Subject: [PATCH 08/71] Fix entrypoint in Dockerfile (#4202) * Fix entrypoint * Delete docker/builders/lemmy-builder-arm64/docker-build.sh * Delete docker/builders directory * Remove exception for builder * Remove publish_builder_arm64 --- .dockerignore | 3 +- .woodpecker.yml | 14 ------- docker/Dockerfile | 41 ++++++++++++++++--- .../builders/lemmy-builder-arm64/Dockerfile | 23 ----------- .../lemmy-builder-arm64/docker-build.sh | 20 --------- 5 files changed, 36 insertions(+), 65 deletions(-) delete mode 100644 docker/builders/lemmy-builder-arm64/Dockerfile delete mode 100644 docker/builders/lemmy-builder-arm64/docker-build.sh diff --git a/.dockerignore b/.dockerignore index b999debba..43381f7b7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,9 +1,8 @@ # build folders and similar which are not needed for the docker build target docker -!docker/builders/lemmy-builder-arm64/docker-build.sh api_tests ansible tests *.sh -pictrs \ No newline at end of file +pictrs diff --git a/.woodpecker.yml b/.woodpecker.yml index 667e49582..910db0ce9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -227,19 +227,6 @@ steps: - event: push branch: main - publish_builder_arm64: - image: woodpeckerci/plugin-docker-buildx - secrets: [docker_username, docker_password] - settings: - repo: dessalines/lemmy-builder-arm64 - dockerfile: docker/builders/lemmy-builder-arm64/Dockerfile - platforms: linux/amd64 - build_args: - - RUST_RELEASE_MODE=release - tag: ${CI_COMMIT_TAG} - when: - event: tag - publish_release_docker: image: woodpeckerci/plugin-docker-buildx secrets: [docker_username, docker_password] @@ -249,7 +236,6 @@ steps: platforms: linux/amd64, linux/arm64 build_args: - RUST_RELEASE_MODE=release - - LEMMY_VERSION=${CI_COMMIT_TAG} tag: ${CI_COMMIT_TAG} when: event: tag diff --git a/docker/Dockerfile b/docker/Dockerfile index 359c030ad..6ba506961 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,10 +2,9 @@ ARG RUST_VERSION=1.72.1 ARG CARGO_BUILD_FEATURES=default ARG RUST_RELEASE_MODE=debug -ARG LEMMY_VERSION="dev" ARG AMD_BUILDER_IMAGE=rust:${RUST_VERSION} -ARG ARM_BUILDER_IMAGE="dessalines/lemmy-builder-arm64:${LEMMY_VERSION}" +ARG ARM_BUILDER_IMAGE="ghcr.io/raskyld/aarch64-lemmy-linux-gnu:v0.1.0" ARG AMD_RUNNER_IMAGE=debian:bookworm-slim ARG ARM_RUNNER_IMAGE=debian:bookworm-slim @@ -29,15 +28,16 @@ RUN --mount=type=cache,target=/lemmy/target set -ex; \ if [ "${RUST_RELEASE_MODE}" = "debug" ]; then \ echo "pub const VERSION: &str = \"$(git describe --tag)\";" > crates/utils/src/version.rs; \ cargo build --features "${CARGO_BUILD_FEATURES}"; \ - mv target/debug/lemmy_server ./lemmy; \ + mv target/"${RUST_RELEASE_MODE}"/lemmy_server ./lemmy_server; \ fi # Release build -RUN set -ex; \ +RUN --mount=type=cache,target=/lemmy/target set -ex; \ if [ "${RUST_RELEASE_MODE}" = "release" ]; then \ echo "pub const VERSION: &str = \"$(git describe --tag)\";" > crates/utils/src/version.rs; \ + [ -z "$USE_RELEASE_CACHE" ] && cargo clean --release; \ cargo build --features "${CARGO_BUILD_FEATURES}" --release; \ - mv target/release/lemmy_server ./lemmy; \ + mv target/"${RUST_RELEASE_MODE}"/lemmy_server ./lemmy_server; \ fi # ARM64 builder @@ -45,13 +45,42 @@ RUN set -ex; \ # seem to be expended in --form arg of COPY :( FROM --platform=linux/amd64 ${ARM_BUILDER_IMAGE} AS build-arm64 +ARG RUST_RELEASE_MODE +ARG CARGO_BUILD_FEATURES + +WORKDIR /home/lemmy/src +USER 10001:10001 + +COPY --chown=lemmy:lemmy . ./ + +ENV PATH="/home/lemmy/.cargo/bin:${PATH}" +ENV RUST_RELEASE_MODE=${RUST_RELEASE_MODE} \ + CARGO_BUILD_FEATURES=${CARGO_BUILD_FEATURES} + +# Debug build +RUN --mount=type=cache,target=./target,uid=10001,gid=10001 set -ex; \ + if [ "${RUST_RELEASE_MODE}" = "debug" ]; then \ + echo "pub const VERSION: &str = \"$(git describe --tag)\";" > crates/utils/src/version.rs; \ + cargo build --features "${CARGO_BUILD_FEATURES}"; \ + mv "./target/$CARGO_BUILD_TARGET/$RUST_RELEASE_MODE/lemmy_server" /home/lemmy/lemmy_server; \ + fi + +# Release build +RUN --mount=type=cache,target=./target,uid=10001,gid=10001 set -ex; \ + if [ "${RUST_RELEASE_MODE}" = "release" ]; then \ + echo "pub const VERSION: &str = \"$(git describe --tag)\";" > crates/utils/src/version.rs; \ + [ -z "$USE_RELEASE_CACHE" ] && cargo clean --release; \ + cargo build --features "${CARGO_BUILD_FEATURES}" --release; \ + mv "./target/$CARGO_BUILD_TARGET/$RUST_RELEASE_MODE/lemmy_server" /home/lemmy/lemmy_server; \ + fi + # amd64 base runner FROM ${AMD_RUNNER_IMAGE} AS runner-linux-amd64 # Federation needs CA certificates RUN apt update && apt install -y libssl-dev libpq-dev ca-certificates -COPY --from=build-amd64 --chmod=0755 /lemmy/lemmy /usr/local/bin +COPY --from=build-amd64 --chmod=0755 /lemmy/lemmy_server /usr/local/bin # arm base runner FROM ${ARM_RUNNER_IMAGE} AS runner-linux-arm64 diff --git a/docker/builders/lemmy-builder-arm64/Dockerfile b/docker/builders/lemmy-builder-arm64/Dockerfile deleted file mode 100644 index 8863b2f99..000000000 --- a/docker/builders/lemmy-builder-arm64/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -ARG ARM_CROSS_TOOLCHAIN="ghcr.io/raskyld/aarch64-lemmy-linux-gnu:v0.1.0" - -FROM ${ARM_CROSS_TOOLCHAIN} - -# NB(raskyld): Please, do not hesitate to contact me through @raskyld@social.vivaldi.net (mastodon) -# If you have any question about the cross-toolchain -LABEL org.opencontainers.image.authors="Enzo Nocera " -LABEL org.opencontainers.image.source="https://github.com/LemmyNet/lemmy" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" -LABEL org.opencontainers.image.description="A prebuilt lemmy server using a cross toolchain from amd64 to aarch64/arm64" - -ARG CARGO_BUILD_FEATURES=default -ARG RUST_RELEASE_MODE=debug - -WORKDIR /home/lemmy/src -USER 10001:10001 - -COPY --chown=lemmy:lemmy . ./ - -ENV RUST_RELEASE_MODE=${RUST_RELEASE_MODE} \ - CARGO_BUILD_FEATURES=${CARGO_BUILD_FEATURES} - -RUN --mount=type=cache,target=./target,uid=10001,gid=10001 bash ./docker/builders/lemmy-builder-arm64/docker-build.sh diff --git a/docker/builders/lemmy-builder-arm64/docker-build.sh b/docker/builders/lemmy-builder-arm64/docker-build.sh deleted file mode 100644 index 752fda80b..000000000 --- a/docker/builders/lemmy-builder-arm64/docker-build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -set -e; - -source "$HOME/.cargo/env" - -case "$RUST_RELEASE_MODE" in - "debug") - echo "pub const VERSION: &str = \"$(git describe --tag)\";" > "crates/utils/src/version.rs" - cargo build --features "${CARGO_BUILD_FEATURES}" - cp "./target/$CARGO_BUILD_TARGET/$RUST_RELEASE_MODE/lemmy_server" /home/lemmy/lemmy_server - ;; - "release") - # Pass a value to $USE_RELEASE_CACHE to avoid purging the cache for release builds - [[ -z "$USE_RELEASE_CACHE" ]] || cargo clean --release - echo "pub const VERSION: &str = \"$(git describe --tag)\";" > "crates/utils/src/version.rs" - cargo build --features "${CARGO_BUILD_FEATURES}" --release - cp "./target/$CARGO_BUILD_TARGET/$RUST_RELEASE_MODE/lemmy_server" /home/lemmy/lemmy_server - ;; -esac From 7972dd0fcf5c877e1e508627ada69d88634b950c Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 26 Nov 2023 22:26:57 -0500 Subject: [PATCH 09/71] Version 0.19.0-rc.8 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e86d861a4..94a35da8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2537,7 +2537,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "actix-web", @@ -2565,7 +2565,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "actix-web", @@ -2599,7 +2599,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "actix-web", @@ -2617,7 +2617,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "actix-web", @@ -2656,7 +2656,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "async-trait", @@ -2692,7 +2692,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "actix-web", "diesel", @@ -2710,7 +2710,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "chrono", "diesel", @@ -2727,7 +2727,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "diesel", "diesel-async 0.3.2", @@ -2739,7 +2739,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "anyhow", @@ -2762,7 +2762,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "actix-web", @@ -2786,7 +2786,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "activitypub_federation", "actix-cors", @@ -2827,7 +2827,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 5b9e319ba..fbba47c91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.0-rc.7" +version = "0.19.0-rc.8" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -84,16 +84,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.0-rc.7", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.0-rc.7", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.0-rc.7", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.0-rc.7", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.0-rc.7", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.0-rc.7", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.0-rc.7", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.0-rc.7", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.0-rc.7", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.0-rc.7", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.0-rc.8", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.0-rc.8", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.0-rc.8", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.0-rc.8", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.0-rc.8", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.0-rc.8", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.0-rc.8", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.0-rc.8", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.0-rc.8", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.0-rc.8", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } @@ -163,7 +163,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.0-rc.7", path = "crates/federate" } +lemmy_federate = { version = "0.19.0-rc.8", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } From d95df3a46f8883398a82b7675c7d8e5a3485cb69 Mon Sep 17 00:00:00 2001 From: dullbananas Date: Mon, 27 Nov 2023 02:31:19 -0700 Subject: [PATCH 10/71] Update diesel-async (#4203) * Update diesel-async * Fix --- Cargo.toml | 2 +- crates/db_schema/src/utils.rs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fbba47c91..f8178b336 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,7 +99,7 @@ activitypub_federation = { version = "0.5.0-beta.5", default-features = false, f ] } diesel = "2.1.4" diesel_migrations = "2.1.0" -diesel-async = "0.3.2" +diesel-async = "0.4.1" serde = { version = "1.0.193", features = ["derive"] } serde_with = "3.4.0" actix-web = { version = "4.4.0", default-features = false, features = [ diff --git a/crates/db_schema/src/utils.rs b/crates/db_schema/src/utils.rs index 594c93629..9ac2d4c88 100644 --- a/crates/db_schema/src/utils.rs +++ b/crates/db_schema/src/utils.rs @@ -24,6 +24,7 @@ use diesel_async::{ pooled_connection::{ deadpool::{Object as PooledConnection, Pool}, AsyncDieselConnectionManager, + ManagerConfig, }, }; use diesel_migrations::EmbeddedMigrations; @@ -291,7 +292,9 @@ pub async fn build_db_pool() -> Result { let manager = if tls_enabled { // diesel-async does not support any TLS connections out of the box, so we need to manually // provide a setup function which handles creating the connection - AsyncDieselConnectionManager::::new_with_setup(&db_url, establish_connection) + let mut config = ManagerConfig::default(); + config.custom_setup = Box::new(establish_connection); + AsyncDieselConnectionManager::::new_with_config(&db_url, config) } else { AsyncDieselConnectionManager::::new(&db_url) }; From 6fa3b59d2599aeb505430c4808f3da8fb7015ad2 Mon Sep 17 00:00:00 2001 From: Bhoomtawath Plinsut Date: Mon, 27 Nov 2023 16:46:03 +0700 Subject: [PATCH 11/71] Fix:#4197: validate post title must be shorter than 200 letters (#4198) * validate post title must be shorter than 200 letters * use range contains --- crates/utils/src/utils/validation.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index 36aa2c5f1..654232a46 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -4,9 +4,6 @@ use once_cell::sync::Lazy; use regex::{Regex, RegexBuilder}; use url::Url; -static VALID_POST_TITLE_REGEX: Lazy = - Lazy::new(|| Regex::new(r".*\S{3,200}.*").expect("compile regex")); - // From here: https://github.com/vector-im/element-android/blob/develop/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt#L35 static VALID_MATRIX_ID_REGEX: Lazy = Lazy::new(|| { Regex::new(r"^@[A-Za-z0-9\\x21-\\x39\\x3B-\\x7F]+:[A-Za-z0-9.-]+(:[0-9]{2,5})?$") @@ -150,7 +147,8 @@ pub fn is_valid_matrix_id(matrix_id: &str) -> LemmyResult<()> { } pub fn is_valid_post_title(title: &str) -> LemmyResult<()> { - let check = VALID_POST_TITLE_REGEX.is_match(title) && !has_newline(title); + let length = title.trim().len(); + let check = (3..=200).contains(&length) && !has_newline(title); if !check { Err(LemmyErrorType::InvalidPostTitle.into()) } else { @@ -330,9 +328,13 @@ mod tests { fn regex_checks() { assert!(is_valid_post_title("hi").is_err()); assert!(is_valid_post_title("him").is_ok()); + assert!(is_valid_post_title(" him ").is_ok()); assert!(is_valid_post_title("n\n\n\n\nanother").is_err()); assert!(is_valid_post_title("hello there!\n this is a test.").is_err()); assert!(is_valid_post_title("hello there! this is a test.").is_ok()); + assert!(is_valid_post_title(("12345".repeat(40) + "x").as_str()).is_err()); + assert!(is_valid_post_title("12345".repeat(40).as_str()).is_ok()); + assert!(is_valid_post_title((("12345".repeat(40)) + " ").as_str()).is_ok()); } #[test] From a986db1a006f19d292d95fc5d12034ea82dfd226 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 29 Nov 2023 05:00:06 -0500 Subject: [PATCH 12/71] Fixing rust-analyzer suggestions on rss feeds. (#4210) * Fixing rust-analyzer suggestions on rss feeds. * Get rid of other pointless builders. * More cleanup. --- crates/routes/src/feeds.rs | 185 +++++++++++++++++++------------------ 1 file changed, 93 insertions(+), 92 deletions(-) diff --git a/crates/routes/src/feeds.rs b/crates/routes/src/feeds.rs index 46997055f..56c75a625 100644 --- a/crates/routes/src/feeds.rs +++ b/crates/routes/src/feeds.rs @@ -25,13 +25,7 @@ use lemmy_utils::{ utils::markdown::{markdown_to_html, sanitize_html}, }; use once_cell::sync::Lazy; -use rss::{ - extension::dublincore::DublinCoreExtensionBuilder, - ChannelBuilder, - GuidBuilder, - Item, - ItemBuilder, -}; +use rss::{extension::dublincore::DublinCoreExtension, Channel, Guid, Item}; use serde::Deserialize; use std::{collections::BTreeMap, str::FromStr}; @@ -146,18 +140,19 @@ async fn get_feed_data( let items = create_post_items(posts, &context.settings().get_protocol_and_hostname())?; - let mut channel_builder = ChannelBuilder::default(); - channel_builder - .namespaces(RSS_NAMESPACE.clone()) - .title(&format!("{} - {}", site_view.site.name, listing_type)) - .link(context.settings().get_protocol_and_hostname()) - .items(items); + let mut channel = Channel { + namespaces: RSS_NAMESPACE.clone(), + title: format!("{} - {}", site_view.site.name, listing_type), + link: context.settings().get_protocol_and_hostname(), + items, + ..Default::default() + }; if let Some(site_desc) = site_view.site.description { - channel_builder.description(&site_desc); + channel.set_description(&site_desc); } - let rss = channel_builder.build().to_string(); + let rss = channel.to_string(); Ok( HttpResponse::Ok() .content_type("application/rss+xml") @@ -217,7 +212,7 @@ async fn get_feed( } .map_err(ErrorBadRequest)?; - let rss = builder.build().to_string(); + let rss = builder.to_string(); Ok( HttpResponse::Ok() @@ -233,7 +228,7 @@ async fn get_feed_user( limit: &i64, page: &i64, user_name: &str, -) -> Result { +) -> Result { let site_view = SiteView::read_local(&mut context.pool()).await?; let person = Person::read_from_name(&mut context.pool(), user_name, false).await?; @@ -252,14 +247,15 @@ async fn get_feed_user( let items = create_post_items(posts, &context.settings().get_protocol_and_hostname())?; - let mut channel_builder = ChannelBuilder::default(); - channel_builder - .namespaces(RSS_NAMESPACE.clone()) - .title(&format!("{} - {}", site_view.site.name, person.name)) - .link(person.actor_id.to_string()) - .items(items); + let channel = Channel { + namespaces: RSS_NAMESPACE.clone(), + title: format!("{} - {}", site_view.site.name, person.name), + link: person.actor_id.to_string(), + items, + ..Default::default() + }; - Ok(channel_builder) + Ok(channel) } #[tracing::instrument(skip_all)] @@ -269,7 +265,7 @@ async fn get_feed_community( limit: &i64, page: &i64, community_name: &str, -) -> Result { +) -> Result { let site_view = SiteView::read_local(&mut context.pool()).await?; let community = Community::read_from_name(&mut context.pool(), community_name, false).await?; @@ -287,18 +283,19 @@ async fn get_feed_community( let items = create_post_items(posts, &context.settings().get_protocol_and_hostname())?; - let mut channel_builder = ChannelBuilder::default(); - channel_builder - .namespaces(RSS_NAMESPACE.clone()) - .title(&format!("{} - {}", site_view.site.name, community.name)) - .link(community.actor_id.to_string()) - .items(items); + let mut channel = Channel { + namespaces: RSS_NAMESPACE.clone(), + title: format!("{} - {}", site_view.site.name, community.name), + link: community.actor_id.to_string(), + items, + ..Default::default() + }; if let Some(community_desc) = community.description { - channel_builder.description(markdown_to_html(&community_desc)); + channel.set_description(markdown_to_html(&community_desc)); } - Ok(channel_builder) + Ok(channel) } #[tracing::instrument(skip_all)] @@ -308,7 +305,7 @@ async fn get_feed_front( limit: &i64, page: &i64, jwt: &str, -) -> Result { +) -> Result { let site_view = SiteView::read_local(&mut context.pool()).await?; let local_user = local_user_view_from_jwt(jwt, context).await?; @@ -328,22 +325,23 @@ async fn get_feed_front( let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let items = create_post_items(posts, &protocol_and_hostname)?; - let mut channel_builder = ChannelBuilder::default(); - channel_builder - .namespaces(RSS_NAMESPACE.clone()) - .title(&format!("{} - Subscribed", site_view.site.name)) - .link(protocol_and_hostname) - .items(items); + let mut channel = Channel { + namespaces: RSS_NAMESPACE.clone(), + title: format!("{} - Subscribed", site_view.site.name), + link: protocol_and_hostname, + items, + ..Default::default() + }; if let Some(site_desc) = site_view.site.description { - channel_builder.description(markdown_to_html(&site_desc)); + channel.set_description(markdown_to_html(&site_desc)); } - Ok(channel_builder) + Ok(channel) } #[tracing::instrument(skip_all)] -async fn get_feed_inbox(context: &LemmyContext, jwt: &str) -> Result { +async fn get_feed_inbox(context: &LemmyContext, jwt: &str) -> Result { let site_view = SiteView::read_local(&mut context.pool()).await?; let local_user = local_user_view_from_jwt(jwt, context).await?; let person_id = local_user.local_user.person_id; @@ -378,18 +376,19 @@ async fn get_feed_inbox(context: &LemmyContext, jwt: &str) -> Result Result { - let mut i = ItemBuilder::default(); - i.title(format!("Reply from {creator_name}")); - let author_url = format!("{protocol_and_hostname}/u/{creator_name}"); - i.author(format!( - "/u/{creator_name} (link)" - )); - let dt = published; - i.pub_date(dt.to_rfc2822()); - i.comments(url.to_owned()); - let guid = GuidBuilder::default().permalink(true).value(url).build(); - i.guid(guid); - i.link(url.to_owned()); // TODO add images - let html = markdown_to_html(content); - i.description(html); - Ok(i.build()) + let author_url = format!("{protocol_and_hostname}/u/{creator_name}"); + let guid = Some(Guid { + permalink: true, + value: url.to_owned(), + }); + let description = Some(markdown_to_html(content)); + + Ok(Item { + title: Some(format!("Reply from {creator_name}")), + author: Some(format!( + "/u/{creator_name} (link)" + )), + pub_date: Some(published.to_rfc2822()), + comments: Some(url.to_owned()), + link: Some(url.to_owned()), + guid, + description, + ..Default::default() + }) } #[tracing::instrument(skip_all)] @@ -464,31 +467,21 @@ fn create_post_items( let mut items: Vec = Vec::new(); for p in posts { - let mut i = ItemBuilder::default(); - let mut dc_extension = DublinCoreExtensionBuilder::default(); - - i.title(sanitize_html(&p.post.name)); - - dc_extension.creators(vec![p.creator.actor_id.to_string()]); - - let dt = p.post.published; - i.pub_date(dt.to_rfc2822()); - + // TODO add images let post_url = format!("{}/post/{}", protocol_and_hostname, p.post.id); - i.comments(post_url.clone()); - let guid = GuidBuilder::default() - .permalink(true) - .value(&post_url) - .build(); - i.guid(guid); - let community_url = format!( "{}/c/{}", protocol_and_hostname, sanitize_html(&p.community.name) ); - - // TODO add images + let dublin_core_ext = Some(DublinCoreExtension { + creators: vec![p.creator.actor_id.to_string()], + ..DublinCoreExtension::default() + }); + let guid = Some(Guid { + permalink: true, + value: post_url.clone(), + }); let mut description = format!("submitted by {} to {}
{} points | {} comments", p.creator.actor_id, sanitize_html(&p.creator.name), @@ -499,23 +492,31 @@ fn create_post_items( p.counts.comments); // If its a url post, add it to the description - if let Some(url) = p.post.url { + let link = Some(if let Some(url) = p.post.url { let link_html = format!("
{url}"); description.push_str(&link_html); - i.link(url.to_string()); + url.to_string() } else { - i.link(post_url.clone()); - } + post_url.clone() + }); if let Some(body) = p.post.body { let html = markdown_to_html(&body); description.push_str(&html); } - i.description(description); + let i = Item { + title: Some(sanitize_html(&p.post.name)), + pub_date: Some(p.post.published.to_rfc2822()), + comments: Some(post_url.clone()), + guid, + description: Some(description), + dublin_core_ext, + link, + ..Default::default() + }; - i.dublin_core_ext(dc_extension.build()); - items.push(i.build()); + items.push(i); } Ok(items) From 23b266ec12680fbc88a62e31a33a8dd0e869516d Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 29 Nov 2023 05:06:34 -0500 Subject: [PATCH 13/71] Upgrade deps, fix issue with wrong diesel-async in Cargo.lock (#4211) Co-authored-by: Nutomic --- Cargo.lock | 181 ++++++++++++++++++++++++++++++++++------------------- Cargo.toml | 2 +- 2 files changed, 117 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94a35da8b..e18a8c456 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -874,9 +874,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" dependencies = [ "clap_builder", "clap_derive", @@ -884,9 +884,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" dependencies = [ "anstream", "anstyle", @@ -1300,7 +1300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core 0.9.9", @@ -1419,21 +1419,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "diesel-async" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e7974099f0d9bde0e010dd3a673555276a474f3362a7a52ab535a57b7c5056" -dependencies = [ - "async-trait", - "deadpool", - "diesel", - "futures-util", - "scoped-futures", - "tokio", - "tokio-postgres", -] - [[package]] name = "diesel-async" version = "0.4.1" @@ -1682,18 +1667,18 @@ checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" [[package]] name = "enum-map" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e6b4f374c071b18172e23134e01026653dc980636ee139e0dfe59c538c61e5" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" dependencies = [ "enum-map-derive", ] [[package]] name = "enum-map-derive" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdb3d73d1beaf47c8593a1364e577fde072677cbfd103600345c0f547408cc0" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", @@ -1732,12 +1717,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2030,9 +2015,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -2076,9 +2061,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hdrhistogram" @@ -2408,7 +2393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "serde", ] @@ -2502,9 +2487,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -2664,7 +2649,7 @@ dependencies = [ "chrono", "deadpool", "diesel", - "diesel-async 0.3.2", + "diesel-async", "diesel-derive-enum", "diesel-derive-newtype", "diesel_ltree", @@ -2696,7 +2681,7 @@ version = "0.19.0-rc.8" dependencies = [ "actix-web", "diesel", - "diesel-async 0.3.2", + "diesel-async", "diesel_ltree", "lemmy_db_schema", "lemmy_utils", @@ -2714,7 +2699,7 @@ version = "0.19.0-rc.8" dependencies = [ "chrono", "diesel", - "diesel-async 0.3.2", + "diesel-async", "lemmy_db_schema", "serde", "serde_with", @@ -2730,7 +2715,7 @@ name = "lemmy_db_views_moderator" version = "0.19.0-rc.8" dependencies = [ "diesel", - "diesel-async 0.3.2", + "diesel-async", "lemmy_db_schema", "serde", "serde_with", @@ -2745,7 +2730,7 @@ dependencies = [ "anyhow", "chrono", "diesel", - "diesel-async 0.3.2", + "diesel-async", "futures", "lemmy_api_common", "lemmy_apub", @@ -2796,7 +2781,7 @@ dependencies = [ "clokwerk", "console-subscriber 0.1.10", "diesel", - "diesel-async 0.3.2", + "diesel-async", "futures-util", "lemmy_api", "lemmy_api_common", @@ -3773,7 +3758,7 @@ dependencies = [ "dashmap", "deadpool", "diesel", - "diesel-async 0.4.1", + "diesel-async", "diesel-derive-enum", "flume", "futures-core", @@ -3979,9 +3964,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -4439,9 +4424,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" dependencies = [ "cc", "getrandom", @@ -4569,7 +4554,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring 0.17.5", + "ring 0.17.6", "rustls-webpki", "sct", ] @@ -4589,7 +4574,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", + "ring 0.17.6", "untrusted 0.9.0", ] @@ -4679,7 +4664,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", + "ring 0.17.6", "untrusted 0.9.0", ] @@ -5838,9 +5823,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f" +checksum = "d0c5a71827ac326072b6405552093e2ad2accd25a32fd78d4edc82d98c7f2409" [[package]] name = "try-lock" @@ -6056,9 +6041,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -6066,9 +6051,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", @@ -6081,9 +6066,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -6093,9 +6078,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6103,9 +6088,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", @@ -6116,9 +6101,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-streams" @@ -6144,9 +6129,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -6195,7 +6180,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.5", + "ring 0.17.6", "untrusted 0.9.0", ] @@ -6282,6 +6267,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -6312,6 +6306,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -6324,6 +6333,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -6336,6 +6351,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -6348,6 +6369,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -6360,6 +6387,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -6372,6 +6405,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -6384,6 +6423,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -6396,6 +6441,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" version = "0.5.19" diff --git a/Cargo.toml b/Cargo.toml index f8178b336..40c1cbf59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -190,4 +190,4 @@ futures-util = { workspace = true } chrono = { workspace = true } prometheus = { version = "0.13.3", features = ["process"] } serial_test = { workspace = true } -clap = { version = "4.4.8", features = ["derive"] } +clap = { version = "4.4.10", features = ["derive"] } From 86990d5138abecb8496386c5c0a382292145e38b Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 29 Nov 2023 05:08:23 -0500 Subject: [PATCH 14/71] Registrations and Reports should sort by New when viewing unresolved / unread. (#4207) - Fixes #4206 --- crates/db_views/src/comment_report_view.rs | 14 ++++++++------ crates/db_views/src/post_report_view.rs | 16 +++++++++------- .../src/registration_application_view.rs | 12 +++++++----- docker/docker-compose.yml | 2 +- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/crates/db_views/src/comment_report_view.rs b/crates/db_views/src/comment_report_view.rs index acf31eb4c..a26b984b2 100644 --- a/crates/db_views/src/comment_report_view.rs +++ b/crates/db_views/src/comment_report_view.rs @@ -105,16 +105,18 @@ fn queries<'a>() -> Queries< query = query.filter(post::community_id.eq(community_id)); } + // If viewing all reports, order by newest, but if viewing unresolved only, show the oldest first (FIFO) if options.unresolved_only { - query = query.filter(comment_report::resolved.eq(false)); + query = query + .filter(comment_report::resolved.eq(false)) + .order_by(comment_report::published.asc()); + } else { + query = query.order_by(comment_report::published.desc()); } let (limit, offset) = limit_and_offset(options.page, options.limit)?; - query = query - .order_by(comment_report::published.asc()) - .limit(limit) - .offset(offset); + query = query.limit(limit).offset(offset); // If its not an admin, get only the ones you mod if !user.local_user.admin { @@ -475,8 +477,8 @@ mod tests { assert_eq!( reports, [ - expected_sara_report_view.clone(), expected_jessica_report_view.clone(), + expected_sara_report_view.clone(), ] ); diff --git a/crates/db_views/src/post_report_view.rs b/crates/db_views/src/post_report_view.rs index 32d8f8392..843b1ee54 100644 --- a/crates/db_views/src/post_report_view.rs +++ b/crates/db_views/src/post_report_view.rs @@ -83,16 +83,18 @@ fn queries<'a>() -> Queries< query = query.filter(post::community_id.eq(community_id)); } + // If viewing all reports, order by newest, but if viewing unresolved only, show the oldest first (FIFO) if options.unresolved_only { - query = query.filter(post_report::resolved.eq(false)); + query = query + .filter(post_report::resolved.eq(false)) + .order_by(post_report::published.asc()); + } else { + query = query.order_by(post_report::published.desc()); } let (limit, offset) = limit_and_offset(options.page, options.limit)?; - query = query - .order_by(post_report::published.asc()) - .limit(limit) - .offset(offset); + query = query.limit(limit).offset(offset); // If its not an admin, get only the ones you mod if !user.local_user.admin { @@ -337,8 +339,8 @@ mod tests { .await .unwrap(); - assert_eq!(reports[0].creator.id, inserted_sara.id); - assert_eq!(reports[1].creator.id, inserted_jessica.id); + assert_eq!(reports[1].creator.id, inserted_sara.id); + assert_eq!(reports[0].creator.id, inserted_jessica.id); // Make sure the counts are correct let report_count = PostReportView::get_report_count(pool, inserted_timmy.id, false, None) diff --git a/crates/db_views/src/registration_application_view.rs b/crates/db_views/src/registration_application_view.rs index 1b0b1a370..9a298eb77 100644 --- a/crates/db_views/src/registration_application_view.rs +++ b/crates/db_views/src/registration_application_view.rs @@ -49,8 +49,13 @@ fn queries<'a>() -> Queries< let list = move |mut conn: DbConn<'a>, options: RegistrationApplicationQuery| async move { let mut query = all_joins(registration_application::table.into_boxed()); + // If viewing all applications, order by newest, but if viewing unresolved only, show the oldest first (FIFO) if options.unread_only { - query = query.filter(registration_application::admin_id.is_null()) + query = query + .filter(registration_application::admin_id.is_null()) + .order_by(registration_application::published.asc()); + } else { + query = query.order_by(registration_application::published.desc()); } if options.verified_email_only { @@ -59,10 +64,7 @@ fn queries<'a>() -> Queries< let (limit, offset) = limit_and_offset(options.page, options.limit)?; - query = query - .limit(limit) - .offset(offset) - .order_by(registration_application::published.asc()); + query = query.limit(limit).offset(offset); query.load::(&mut conn).await }; diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index bd339aabb..9626af84a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -55,7 +55,7 @@ services: lemmy-ui: # use "image" to pull down an already compiled lemmy-ui. make sure to comment out "build". - image: dessalines/lemmy-ui:0.19.0-rc.3 + image: dessalines/lemmy-ui:0.19.0-rc.8 # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1. # use "build" to build your local lemmy ui image for development. make sure to comment out "image". # run: docker compose up --build From e84f8f55a2886eb4b25f7257ac68e73314caeeb3 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 29 Nov 2023 09:58:35 -0500 Subject: [PATCH 15/71] Remove httpOnly requirement. (#4212) --- crates/api/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index e3acae193..712498f0f 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -84,10 +84,9 @@ pub fn read_auth_token(req: &HttpRequest) -> Result, LemmyError> else if let Some(cookie) = &req.cookie(AUTH_COOKIE_NAME) { // ensure that its marked as httponly and secure let secure = cookie.secure().unwrap_or_default(); - let http_only = cookie.http_only().unwrap_or_default(); let is_debug_mode = cfg!(debug_assertions); - if !is_debug_mode && (!secure || !http_only) { + if !is_debug_mode && !secure { Err(LemmyError::from(LemmyErrorType::AuthCookieInsecure)) } else { Ok(Some(cookie.value().to_string())) From 7ef64765204fef7602b83e197d11a562e3bddbd4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 29 Nov 2023 10:04:42 -0500 Subject: [PATCH 16/71] Version 0.19.0-rc.10 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ crates/utils/translations | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e18a8c456..ce48002a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2522,7 +2522,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "actix-web", @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "actix-web", @@ -2584,7 +2584,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "actix-web", @@ -2602,7 +2602,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "actix-web", @@ -2641,7 +2641,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "async-trait", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "actix-web", "diesel", @@ -2695,7 +2695,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "chrono", "diesel", @@ -2712,7 +2712,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "diesel", "diesel-async", @@ -2724,7 +2724,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "anyhow", @@ -2747,7 +2747,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "actix-web", @@ -2771,7 +2771,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "activitypub_federation", "actix-cors", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 40c1cbf59..411afa35d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.0-rc.8" +version = "0.19.0-rc.10" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -84,16 +84,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.0-rc.8", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.0-rc.8", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.0-rc.8", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.0-rc.8", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.0-rc.8", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.0-rc.8", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.0-rc.8", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.0-rc.8", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.0-rc.8", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.0-rc.8", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.0-rc.10", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.0-rc.10", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.0-rc.10", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.0-rc.10", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.0-rc.10", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.0-rc.10", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.0-rc.10", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.0-rc.10", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.0-rc.10", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.0-rc.10", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } @@ -163,7 +163,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.0-rc.8", path = "crates/federate" } +lemmy_federate = { version = "0.19.0-rc.10", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } diff --git a/crates/utils/translations b/crates/utils/translations index a36865ee8..d4e6619d6 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit a36865ee8ca3658fea31ba948b67b75a812e84fc +Subproject commit d4e6619d6ec60e8062e28646741e4967d3843042 From 170b3ec45f297215be6fd6727e9d80121728df15 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 30 Nov 2023 04:44:18 -0500 Subject: [PATCH 17/71] Removing cookie secure check. (#4213) --- api_tests/package.json | 2 +- api_tests/yarn.lock | 8 ++++---- crates/api/src/lib.rs | 10 +--------- crates/utils/src/error.rs | 2 -- 4 files changed, 6 insertions(+), 16 deletions(-) diff --git a/api_tests/package.json b/api_tests/package.json index a6bf91f72..8ab01b628 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -27,7 +27,7 @@ "eslint": "^8.54.0", "eslint-plugin-prettier": "^5.0.1", "jest": "^29.5.0", - "lemmy-js-client": "0.19.0-alpha.18", + "lemmy-js-client": "0.19.0-rc.19", "prettier": "^3.1.0", "ts-jest": "^29.1.0", "typescript": "^5.3.2" diff --git a/api_tests/yarn.lock b/api_tests/yarn.lock index 7167c9b93..ebf36bc58 100644 --- a/api_tests/yarn.lock +++ b/api_tests/yarn.lock @@ -2286,10 +2286,10 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -lemmy-js-client@0.19.0-alpha.18: - version "0.19.0-alpha.18" - resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.19.0-alpha.18.tgz#f94841681cabdf9d5c4ce7048eacb57557f68724" - integrity sha512-cKJfKKnjK+ijk0Yd6ydtne3Y4FILp2RbQg05pCru9n6PCyPAa85eQL4QxPB1PPed20ckSZRcHLcnr/bYFDgpaw== +lemmy-js-client@0.19.0-rc.19: + version "0.19.0-rc.19" + resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.19.0-rc.19.tgz#13932ab2b40cf16aa5218715509ebdc48f874f84" + integrity sha512-kae8V33QixbyYIA+pn7+sCeOOWL3eRgnFaNkZU8Y8vxhwZExIhkZus9jzVt/BoyPddVlafyBHxgAUsWXLA4tRA== dependencies: cross-fetch "^3.1.5" form-data "^4.0.0" diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index 712498f0f..faa74824e 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -82,15 +82,7 @@ pub fn read_auth_token(req: &HttpRequest) -> Result, LemmyError> } // If that fails, try to read from cookie else if let Some(cookie) = &req.cookie(AUTH_COOKIE_NAME) { - // ensure that its marked as httponly and secure - let secure = cookie.secure().unwrap_or_default(); - let is_debug_mode = cfg!(debug_assertions); - - if !is_debug_mode && !secure { - Err(LemmyError::from(LemmyErrorType::AuthCookieInsecure)) - } else { - Ok(Some(cookie.value().to_string())) - } + Ok(Some(cookie.value().to_string())) } // Otherwise, there's no auth else { diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index c5cbaa07e..34f636705 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -221,8 +221,6 @@ pub enum LemmyErrorType { CouldntSendWebmention, ContradictingFilters, InstanceBlockAlreadyExists, - /// `jwt` cookie must be marked secure and httponly - AuthCookieInsecure, /// Thrown when an API call is submitted with more than 1000 array elements, see [[MAX_API_PARAM_ELEMENTS]] TooManyItems, CommunityHasNoFollowers, From 70003407a7b9e1dc2ea706434e5c1c002e9d6862 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 30 Nov 2023 05:02:18 -0500 Subject: [PATCH 18/71] Version 0.19.0-rc.11 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ crates/utils/translations | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce48002a9..d35eb9b5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2522,7 +2522,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "actix-web", @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "actix-web", @@ -2584,7 +2584,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "actix-web", @@ -2602,7 +2602,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "actix-web", @@ -2641,7 +2641,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "async-trait", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "actix-web", "diesel", @@ -2695,7 +2695,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "chrono", "diesel", @@ -2712,7 +2712,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "diesel", "diesel-async", @@ -2724,7 +2724,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "anyhow", @@ -2747,7 +2747,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "actix-web", @@ -2771,7 +2771,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "activitypub_federation", "actix-cors", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 411afa35d..e9de6eba2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.0-rc.10" +version = "0.19.0-rc.11" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -84,16 +84,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.0-rc.10", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.0-rc.10", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.0-rc.10", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.0-rc.10", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.0-rc.10", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.0-rc.10", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.0-rc.10", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.0-rc.10", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.0-rc.10", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.0-rc.10", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.0-rc.11", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.0-rc.11", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.0-rc.11", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.0-rc.11", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.0-rc.11", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.0-rc.11", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.0-rc.11", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.0-rc.11", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.0-rc.11", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.0-rc.11", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } @@ -163,7 +163,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.0-rc.10", path = "crates/federate" } +lemmy_federate = { version = "0.19.0-rc.11", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } diff --git a/crates/utils/translations b/crates/utils/translations index d4e6619d6..aa9438c49 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit d4e6619d6ec60e8062e28646741e4967d3843042 +Subproject commit aa9438c4930deb23ae0dc54a061ed4b0b3824582 From 809fc05cb3f8beb746b14b055c651d41cebbcbea Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 1 Dec 2023 15:16:22 +0100 Subject: [PATCH 19/71] Only allow distinguishing own comments (fixes #4216) (#4222) --- crates/api/src/comment/distinguish.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/api/src/comment/distinguish.rs b/crates/api/src/comment/distinguish.rs index f29e01f76..a346bf4ca 100644 --- a/crates/api/src/comment/distinguish.rs +++ b/crates/api/src/comment/distinguish.rs @@ -26,6 +26,11 @@ pub async fn distinguish_comment( ) .await?; + // Verify that only the creator can distinguish + if local_user_view.person.id != orig_comment.creator.id { + Err(LemmyErrorType::NoCommentEditAllowed)? + } + // Verify that only a mod or admin can distinguish a comment check_community_mod_action( &local_user_view.person, From d7376d9541d6feef53b611d8daf52e614b8484aa Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 1 Dec 2023 15:16:55 +0100 Subject: [PATCH 20/71] Fix cors_origin wildcard (fixes #4214) (#4221) --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index e99e9ce81..28dcaafe6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -326,7 +326,7 @@ fn cors_config(settings: &Settings) -> Cors { (Some(origin), false) => { // Need to call send_wildcard() explicitly, passing this into allowed_origin() results in error if cors_origin_setting.as_deref() == Some("*") { - Cors::default().send_wildcard() + Cors::default().allow_any_origin().send_wildcard() } else { Cors::default() .allowed_origin(&origin) From 16ac893e1578ec1fa7601a30f6b86357eb6a7c56 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 1 Dec 2023 15:18:29 +0100 Subject: [PATCH 21/71] Some changes to help debug auth problems on lemmy.ml (#4220) * Some changes to help debug auth problems on lemmy.ml * fix * clippy --- config/defaults.hjson | 2 ++ crates/api/src/lib.rs | 6 ++++++ crates/utils/src/settings/structs.rs | 3 +++ scripts/lint.sh | 2 +- src/session_middleware.rs | 13 ++++++++++--- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/config/defaults.hjson b/config/defaults.hjson index 880af802c..47d3ed24f 100644 --- a/config/defaults.hjson +++ b/config/defaults.hjson @@ -98,4 +98,6 @@ # Sets a response Access-Control-Allow-Origin CORS header # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin cors_origin: "*" + # Always send cache-control: private header for api responses, avoid problems with wrong caching. + disable_cache_control: true } diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index faa74824e..c41b2315a 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -15,6 +15,7 @@ use lemmy_utils::{ }; use std::io::Cursor; use totp_rs::{Secret, TOTP}; +use tracing::log::warn; pub mod comment; pub mod comment_report; @@ -84,6 +85,11 @@ pub fn read_auth_token(req: &HttpRequest) -> Result, LemmyError> else if let Some(cookie) = &req.cookie(AUTH_COOKIE_NAME) { Ok(Some(cookie.value().to_string())) } + // Read old auth cookie + else if let Some(cookie) = &req.cookie("jwt") { + warn!("Falling back to jwt cookie"); + Ok(Some(cookie.value().to_string())) + } // Otherwise, there's no auth else { Ok(None) diff --git a/crates/utils/src/settings/structs.rs b/crates/utils/src/settings/structs.rs index 886cd71b6..ba247d7db 100644 --- a/crates/utils/src/settings/structs.rs +++ b/crates/utils/src/settings/structs.rs @@ -57,6 +57,9 @@ pub struct Settings { #[default(None)] #[doku(example = "*")] cors_origin: Option, + /// Always send cache-control: private header for api responses, avoid problems with wrong caching. + #[default(None)] + pub disable_cache_control: Option, } impl Settings { diff --git a/scripts/lint.sh b/scripts/lint.sh index 924fba390..6a9526dfc 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -5,7 +5,7 @@ CWD="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" cd $CWD/../ -cargo clippy --workspace --fix --allow-staged --allow-dirty --tests --all-targets --all-features -- -D warnings +cargo clippy --workspace --fix --allow-staged --allow-dirty --tests --all-targets -- -D warnings # Format rust files cargo +nightly fmt diff --git a/src/session_middleware.rs b/src/session_middleware.rs index f50e0eccd..bdecb9818 100644 --- a/src/session_middleware.rs +++ b/src/session_middleware.rs @@ -11,6 +11,7 @@ use lemmy_api::{local_user_view_from_jwt, read_auth_token}; use lemmy_api_common::context::LemmyContext; use reqwest::header::HeaderValue; use std::{future::ready, rc::Rc}; +use tracing::log::warn; #[derive(Clone)] pub struct SessionMiddleware { @@ -71,8 +72,11 @@ where // TODO: this means it will be impossible to get any error message for invalid jwt. Need // to add a separate endpoint for that. // https://github.com/LemmyNet/lemmy/issues/3702 - let local_user_view = local_user_view_from_jwt(jwt, &context).await.ok(); - if let Some(local_user_view) = local_user_view { + let local_user_view = local_user_view_from_jwt(jwt, &context).await; + if let Err(e) = &local_user_view { + warn!("Failed to handle user login: {e}"); + } + if let Ok(local_user_view) = local_user_view { req.extensions_mut().insert(local_user_view); } } @@ -81,11 +85,14 @@ where // Add cache-control header. If user is authenticated, mark as private. Otherwise cache // up to one minute. - let cache_value = if jwt.is_some() { + + let disable_cache = context.settings().disable_cache_control.unwrap_or(false); + let cache_value = if jwt.is_some() || disable_cache { "private" } else { "public, max-age=60" }; + res .headers_mut() .insert(CACHE_CONTROL, HeaderValue::from_static(cache_value)); From 3f79eacb53c8a1bb0e23c4bd9037606a7cc58857 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 1 Dec 2023 09:29:44 -0500 Subject: [PATCH 22/71] Version 0.19.0-rc.12 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d35eb9b5c..2f375fa1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2522,7 +2522,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "actix-web", @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "actix-web", @@ -2584,7 +2584,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "actix-web", @@ -2602,7 +2602,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "actix-web", @@ -2641,7 +2641,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "async-trait", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "actix-web", "diesel", @@ -2695,7 +2695,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "chrono", "diesel", @@ -2712,7 +2712,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "diesel", "diesel-async", @@ -2724,7 +2724,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "anyhow", @@ -2747,7 +2747,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "actix-web", @@ -2771,7 +2771,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "activitypub_federation", "actix-cors", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index e9de6eba2..544627596 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.0-rc.11" +version = "0.19.0-rc.12" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -84,16 +84,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.0-rc.11", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.0-rc.11", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.0-rc.11", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.0-rc.11", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.0-rc.11", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.0-rc.11", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.0-rc.11", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.0-rc.11", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.0-rc.11", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.0-rc.11", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.0-rc.12", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.0-rc.12", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.0-rc.12", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.0-rc.12", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.0-rc.12", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.0-rc.12", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.0-rc.12", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.0-rc.12", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.0-rc.12", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.0-rc.12", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } @@ -163,7 +163,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.0-rc.11", path = "crates/federate" } +lemmy_federate = { version = "0.19.0-rc.12", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } From a5386187e3f9b44442889920adc0be009881ccd7 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Mon, 4 Dec 2023 15:53:53 +0100 Subject: [PATCH 23/71] Enable missing code for prometheus actix-web stats (#4230) * Enable missing code for prometheus actix-web stats * enable middleware conditionally --- Cargo.lock | 14 ++++++++++++++ Cargo.toml | 1 + docker/docker-compose.yml | 4 ++-- src/lib.rs | 11 ++++++++--- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f375fa1b..7a25e9a4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -328,6 +328,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "actix-web-prom" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23f332a652836b8f3a6876103c70c9ed436d0e69fa779ab5d7f57b1d5c8d488" +dependencies = [ + "actix-web", + "futures-core", + "pin-project-lite", + "prometheus", + "regex", +] + [[package]] name = "addr2line" version = "0.21.0" @@ -2776,6 +2789,7 @@ dependencies = [ "activitypub_federation", "actix-cors", "actix-web", + "actix-web-prom", "chrono", "clap", "clokwerk", diff --git a/Cargo.toml b/Cargo.toml index 544627596..067eadc0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -191,3 +191,4 @@ chrono = { workspace = true } prometheus = { version = "0.13.3", features = ["process"] } serial_test = { workspace = true } clap = { version = "4.4.10", features = ["derive"] } +actix-web-prom = "0.7.0" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9626af84a..fdf6c32c2 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -43,8 +43,8 @@ services: - RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug" - RUST_BACKTRACE=full ports: - # prometheus metrics available at the path /metrics on port 10002 by default - # enable prometheus metrics by setting the CARGO_BUILD_FEATURES build arg above to "prometheus-metrics" + # prometheus metrics can be enabled with the `prometheus` config option. they are available on + # port 10002, path /metrics by default - "10002:10002" volumes: - ./lemmy.hjson:/config/config.hjson:Z diff --git a/src/lib.rs b/src/lib.rs index 28dcaafe6..6edcf1b37 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,13 +16,14 @@ use activitypub_federation::config::{FederationConfig, FederationMiddleware}; use actix_cors::Cors; use actix_web::{ dev::{ServerHandle, ServiceResponse}, - middleware::{self, ErrorHandlerResponse, ErrorHandlers}, + middleware::{self, Condition, ErrorHandlerResponse, ErrorHandlers}, web::Data, App, HttpResponse, HttpServer, Result, }; +use actix_web_prom::PrometheusMetricsBuilder; use clap::{ArgAction, Parser}; use lemmy_api_common::{ context::LemmyContext, @@ -49,6 +50,7 @@ use lemmy_utils::{ response::jsonify_plain_text_errors, settings::{structs::Settings, SETTINGS}, }; +use prometheus::default_registry; use prometheus_metrics::serve_prometheus; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_tracing::TracingMiddleware; @@ -271,7 +273,6 @@ fn create_http_server( ) -> Result { // this must come before the HttpServer creation // creates a middleware that populates http metrics for each path, method, and status code - #[cfg(feature = "prometheus-metrics")] let prom_api_metrics = PrometheusMetricsBuilder::new("lemmy_api") .registry(default_registry().clone()) .build() @@ -296,7 +297,11 @@ fn create_http_server( .app_data(Data::new(context.clone())) .app_data(Data::new(rate_limit_cell.clone())) .wrap(FederationMiddleware::new(federation_config.clone())) - .wrap(SessionMiddleware::new(context.clone())); + .wrap(SessionMiddleware::new(context.clone())) + .wrap(Condition::new( + SETTINGS.prometheus.is_some(), + prom_api_metrics.clone(), + )); // The routes app From de85e51fac53d6e6a73c4e98d913b1996725dddf Mon Sep 17 00:00:00 2001 From: Nutomic Date: Tue, 5 Dec 2023 17:19:12 +0100 Subject: [PATCH 24/71] Dont set duplicate context for activities (#4233) --- crates/apub/src/http/mod.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/apub/src/http/mod.rs b/crates/apub/src/http/mod.rs index 7c1d8529a..d3e925de4 100644 --- a/crates/apub/src/http/mod.rs +++ b/crates/apub/src/http/mod.rs @@ -96,6 +96,13 @@ pub(crate) async fn get_activity( if sensitive { Ok(HttpResponse::Forbidden().finish()) } else { - create_apub_response(&activity.data) + // Don't use create_apub_response() to avoid duplicate context (the activity stored in db + // already includes context). + let json = serde_json::to_string_pretty(&activity.data)?; + Ok( + HttpResponse::Ok() + .content_type(FEDERATION_CONTENT_TYPE) + .body(json), + ) } } From a790a24c4d0680ca9aaef087a9b9da7ea316472c Mon Sep 17 00:00:00 2001 From: Nutomic Date: Tue, 5 Dec 2023 17:22:08 +0100 Subject: [PATCH 25/71] Revert debug auth (#4232) * Revert "Some changes to help debug auth problems on lemmy.ml (#4220)" This reverts commit 16ac893e1578ec1fa7601a30f6b86357eb6a7c56. * Rename auth cookie back to jwt --- config/defaults.hjson | 2 -- crates/api/src/lib.rs | 6 ------ crates/api_common/src/utils.rs | 2 +- crates/utils/src/settings/structs.rs | 3 --- scripts/lint.sh | 2 +- src/session_middleware.rs | 13 +++---------- 6 files changed, 5 insertions(+), 23 deletions(-) diff --git a/config/defaults.hjson b/config/defaults.hjson index 47d3ed24f..880af802c 100644 --- a/config/defaults.hjson +++ b/config/defaults.hjson @@ -98,6 +98,4 @@ # Sets a response Access-Control-Allow-Origin CORS header # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin cors_origin: "*" - # Always send cache-control: private header for api responses, avoid problems with wrong caching. - disable_cache_control: true } diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index c41b2315a..faa74824e 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -15,7 +15,6 @@ use lemmy_utils::{ }; use std::io::Cursor; use totp_rs::{Secret, TOTP}; -use tracing::log::warn; pub mod comment; pub mod comment_report; @@ -85,11 +84,6 @@ pub fn read_auth_token(req: &HttpRequest) -> Result, LemmyError> else if let Some(cookie) = &req.cookie(AUTH_COOKIE_NAME) { Ok(Some(cookie.value().to_string())) } - // Read old auth cookie - else if let Some(cookie) = &req.cookie("jwt") { - warn!("Falling back to jwt cookie"); - Ok(Some(cookie.value().to_string())) - } // Otherwise, there's no auth else { Ok(None) diff --git a/crates/api_common/src/utils.rs b/crates/api_common/src/utils.rs index 3c57a36cd..0ea27f794 100644 --- a/crates/api_common/src/utils.rs +++ b/crates/api_common/src/utils.rs @@ -43,7 +43,7 @@ use std::collections::HashSet; use tracing::warn; use url::{ParseError, Url}; -pub static AUTH_COOKIE_NAME: &str = "auth"; +pub static AUTH_COOKIE_NAME: &str = "jwt"; #[tracing::instrument(skip_all)] pub async fn is_mod_or_admin( diff --git a/crates/utils/src/settings/structs.rs b/crates/utils/src/settings/structs.rs index ba247d7db..886cd71b6 100644 --- a/crates/utils/src/settings/structs.rs +++ b/crates/utils/src/settings/structs.rs @@ -57,9 +57,6 @@ pub struct Settings { #[default(None)] #[doku(example = "*")] cors_origin: Option, - /// Always send cache-control: private header for api responses, avoid problems with wrong caching. - #[default(None)] - pub disable_cache_control: Option, } impl Settings { diff --git a/scripts/lint.sh b/scripts/lint.sh index 6a9526dfc..924fba390 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -5,7 +5,7 @@ CWD="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" cd $CWD/../ -cargo clippy --workspace --fix --allow-staged --allow-dirty --tests --all-targets -- -D warnings +cargo clippy --workspace --fix --allow-staged --allow-dirty --tests --all-targets --all-features -- -D warnings # Format rust files cargo +nightly fmt diff --git a/src/session_middleware.rs b/src/session_middleware.rs index bdecb9818..f50e0eccd 100644 --- a/src/session_middleware.rs +++ b/src/session_middleware.rs @@ -11,7 +11,6 @@ use lemmy_api::{local_user_view_from_jwt, read_auth_token}; use lemmy_api_common::context::LemmyContext; use reqwest::header::HeaderValue; use std::{future::ready, rc::Rc}; -use tracing::log::warn; #[derive(Clone)] pub struct SessionMiddleware { @@ -72,11 +71,8 @@ where // TODO: this means it will be impossible to get any error message for invalid jwt. Need // to add a separate endpoint for that. // https://github.com/LemmyNet/lemmy/issues/3702 - let local_user_view = local_user_view_from_jwt(jwt, &context).await; - if let Err(e) = &local_user_view { - warn!("Failed to handle user login: {e}"); - } - if let Ok(local_user_view) = local_user_view { + let local_user_view = local_user_view_from_jwt(jwt, &context).await.ok(); + if let Some(local_user_view) = local_user_view { req.extensions_mut().insert(local_user_view); } } @@ -85,14 +81,11 @@ where // Add cache-control header. If user is authenticated, mark as private. Otherwise cache // up to one minute. - - let disable_cache = context.settings().disable_cache_control.unwrap_or(false); - let cache_value = if jwt.is_some() || disable_cache { + let cache_value = if jwt.is_some() { "private" } else { "public, max-age=60" }; - res .headers_mut() .insert(CACHE_CONTROL, HeaderValue::from_static(cache_value)); From 203ca9d617095c5bd375a015140766f4182343b4 Mon Sep 17 00:00:00 2001 From: Kroese Date: Tue, 5 Dec 2023 17:35:59 +0100 Subject: [PATCH 26/71] Print version to log (#4226) * Print version to log * Keep cargofmt happy * Keep cargo_fmt happy * Keep Clippy happy --- src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6edcf1b37..ede4bb8f0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -49,6 +49,7 @@ use lemmy_utils::{ rate_limit::RateLimitCell, response::jsonify_plain_text_errors, settings::{structs::Settings, SETTINGS}, + version, }; use prometheus::default_registry; use prometheus_metrics::serve_prometheus; @@ -108,6 +109,9 @@ pub struct CmdArgs { /// Placing the main function in lib.rs allows other crates to import it and embed Lemmy pub async fn start_lemmy_server(args: CmdArgs) -> Result<(), LemmyError> { + // Print version number to log + println!("Lemmy v{}", version::VERSION); + // return error 503 while running db migrations and startup tasks let mut startup_server_handle = None; if args.http_server { @@ -133,7 +137,7 @@ pub async fn start_lemmy_server(args: CmdArgs) -> Result<(), LemmyError> { let federation_enabled = local_site.federation_enabled; if federation_enabled { - println!("federation enabled, host is {}", &SETTINGS.hostname); + println!("Federation enabled, host is {}", &SETTINGS.hostname); } check_private_instance_and_federation_enabled(&local_site)?; @@ -144,7 +148,7 @@ pub async fn start_lemmy_server(args: CmdArgs) -> Result<(), LemmyError> { let rate_limit_cell = RateLimitCell::new(rate_limit_config); println!( - "Starting http server at {}:{}", + "Starting HTTP server at {}:{}", SETTINGS.bind, SETTINGS.port ); From c85e680aba101c78f70657131573ba7bdfc6450b Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 6 Dec 2023 18:20:52 -0500 Subject: [PATCH 27/71] Version 0.19.0-rc.13 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ crates/utils/translations | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a25e9a4c..98c9fe806 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2535,7 +2535,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "actix-web", @@ -2563,7 +2563,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "actix-web", @@ -2597,7 +2597,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "actix-web", @@ -2615,7 +2615,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "actix-web", @@ -2654,7 +2654,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "async-trait", @@ -2690,7 +2690,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "actix-web", "diesel", @@ -2708,7 +2708,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "chrono", "diesel", @@ -2725,7 +2725,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "diesel", "diesel-async", @@ -2737,7 +2737,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "anyhow", @@ -2760,7 +2760,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "actix-web", @@ -2784,7 +2784,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "activitypub_federation", "actix-cors", @@ -2826,7 +2826,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 067eadc0f..a897dae60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.0-rc.12" +version = "0.19.0-rc.13" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -84,16 +84,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.0-rc.12", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.0-rc.12", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.0-rc.12", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.0-rc.12", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.0-rc.12", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.0-rc.12", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.0-rc.12", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.0-rc.12", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.0-rc.12", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.0-rc.12", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.0-rc.13", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.0-rc.13", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.0-rc.13", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.0-rc.13", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.0-rc.13", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.0-rc.13", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.0-rc.13", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.0-rc.13", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.0-rc.13", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.0-rc.13", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.0-beta.5", default-features = false, features = [ "actix-web", ] } @@ -163,7 +163,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.0-rc.12", path = "crates/federate" } +lemmy_federate = { version = "0.19.0-rc.13", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } diff --git a/crates/utils/translations b/crates/utils/translations index aa9438c49..b3343aef7 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit aa9438c4930deb23ae0dc54a061ed4b0b3824582 +Subproject commit b3343aef72e5a7e5df34cf328b910ed798027270 From 2d4037ba619ad923c00261b9cd05597c9c836569 Mon Sep 17 00:00:00 2001 From: Kroese Date: Mon, 11 Dec 2023 11:24:51 +0100 Subject: [PATCH 28/71] Extend sitemap span (#4231) * Extend sitemap span * Keep cargo_fmt happy * Add FETCH_LIMIT_SITEMAP * Use FETCH_LIMIT_SITEMAP * Keep cargo_fmt happy * Update utils.rs * Use SITEMAP_DAYS * Keep cargo_fmt happy * Sitemap * Keep cargo_fmt happy * Sitemap * Sitemap * Increase to 31 days --- crates/api/src/sitemap.rs | 4 ++-- crates/db_schema/src/impls/post.rs | 13 +++++++++++-- crates/db_schema/src/utils.rs | 2 ++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/api/src/sitemap.rs b/crates/api/src/sitemap.rs index 438a8b8e8..b1b961350 100644 --- a/crates/api/src/sitemap.rs +++ b/crates/api/src/sitemap.rs @@ -26,7 +26,7 @@ async fn generate_urlset( } pub async fn get_sitemap(context: Data) -> LemmyResult { - info!("Generating sitemap with posts from last {} hours...", 24); + info!("Generating sitemap...",); let posts = Post::list_for_sitemap(&mut context.pool()).await?; info!("Loaded latest {} posts", posts.len()); @@ -36,7 +36,7 @@ pub async fn get_sitemap(context: Data) -> LemmyResult)>(conn) .await } diff --git a/crates/db_schema/src/utils.rs b/crates/db_schema/src/utils.rs index 9ac2d4c88..2b1179bee 100644 --- a/crates/db_schema/src/utils.rs +++ b/crates/db_schema/src/utils.rs @@ -49,6 +49,8 @@ use url::Url; const FETCH_LIMIT_DEFAULT: i64 = 10; pub const FETCH_LIMIT_MAX: i64 = 50; +pub const SITEMAP_LIMIT: i64 = 50000; +pub const SITEMAP_DAYS: i64 = 31; const POOL_TIMEOUT: Option = Some(Duration::from_secs(5)); pub const RANK_DEFAULT: f64 = 0.0001; From 60849355dbbc20de529887b84dcca8cee4fb6d35 Mon Sep 17 00:00:00 2001 From: Benjamin Barbeau <73616169+Ategon@users.noreply.github.com> Date: Mon, 11 Dec 2023 09:38:17 -0500 Subject: [PATCH 29/71] Add voters to active users (#4235) * Add voters to active users * Edit formatting * Edit formatting * Edit formatting in down.sql * Fix person table inner joins * Remove post read from calculations --- .../down.sql | 72 +++++++++++ .../up.sql | 114 ++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 migrations/2023-12-06-180359_edit_active_users/down.sql create mode 100644 migrations/2023-12-06-180359_edit_active_users/up.sql diff --git a/migrations/2023-12-06-180359_edit_active_users/down.sql b/migrations/2023-12-06-180359_edit_active_users/down.sql new file mode 100644 index 000000000..dfdce712c --- /dev/null +++ b/migrations/2023-12-06-180359_edit_active_users/down.sql @@ -0,0 +1,72 @@ +CREATE OR REPLACE FUNCTION community_aggregates_activity (i text) + RETURNS TABLE ( + count_ bigint, + community_id_ integer) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN query + SELECT + count(*), + community_id + FROM ( + SELECT + c.creator_id, + p.community_id + FROM + comment c + INNER JOIN post p ON c.post_id = p.id + INNER JOIN person pe ON c.creator_id = pe.id + WHERE + c.published > ('now'::timestamp - i::interval) + AND pe.bot_account = FALSE + UNION + SELECT + p.creator_id, + p.community_id + FROM + post p + INNER JOIN person pe ON p.creator_id = pe.id + WHERE + p.published > ('now'::timestamp - i::interval) + AND pe.bot_account = FALSE) a +GROUP BY + community_id; +END; +$$; + +CREATE OR REPLACE FUNCTION site_aggregates_activity (i text) + RETURNS integer + LANGUAGE plpgsql + AS $$ +DECLARE + count_ integer; +BEGIN + SELECT + count(*) INTO count_ + FROM ( + SELECT + c.creator_id + FROM + comment c + INNER JOIN person u ON c.creator_id = u.id + INNER JOIN person pe ON c.creator_id = pe.id + WHERE + c.published > ('now'::timestamp - i::interval) + AND u.local = TRUE + AND pe.bot_account = FALSE + UNION + SELECT + p.creator_id + FROM + post p + INNER JOIN person u ON p.creator_id = u.id + INNER JOIN person pe ON p.creator_id = pe.id + WHERE + p.published > ('now'::timestamp - i::interval) + AND u.local = TRUE + AND pe.bot_account = FALSE) a; + RETURN count_; +END; +$$; + diff --git a/migrations/2023-12-06-180359_edit_active_users/up.sql b/migrations/2023-12-06-180359_edit_active_users/up.sql new file mode 100644 index 000000000..4fe7689fc --- /dev/null +++ b/migrations/2023-12-06-180359_edit_active_users/up.sql @@ -0,0 +1,114 @@ +-- Edit community aggregates to include voters as active users +CREATE OR REPLACE FUNCTION community_aggregates_activity (i text) + RETURNS TABLE ( + count_ bigint, + community_id_ integer) + LANGUAGE plpgsql + AS $$ +BEGIN + RETURN query + SELECT + count(*), + community_id + FROM ( + SELECT + c.creator_id, + p.community_id + FROM + comment c + INNER JOIN post p ON c.post_id = p.id + INNER JOIN person pe ON c.creator_id = pe.id + WHERE + c.published > ('now'::timestamp - i::interval) + AND pe.bot_account = FALSE + UNION + SELECT + p.creator_id, + p.community_id + FROM + post p + INNER JOIN person pe ON p.creator_id = pe.id + WHERE + p.published > ('now'::timestamp - i::interval) + AND pe.bot_account = FALSE + UNION + SELECT + pl.person_id, + p.community_id + FROM + post_like pl + INNER JOIN post p ON pl.post_id = p.id + INNER JOIN person pe ON pl.person_id = pe.id + WHERE + pl.published > ('now'::timestamp - i::interval) + AND pe.bot_account = FALSE + UNION + SELECT + cl.person_id, + p.community_id + FROM + comment_like cl + INNER JOIN post p ON cl.post_id = p.id + INNER JOIN person pe ON cl.person_id = pe.id + WHERE + cl.published > ('now'::timestamp - i::interval) + AND pe.bot_account = FALSE) a +GROUP BY + community_id; +END; +$$; + +-- Edit site aggregates to include voters and people who have read posts as active users +CREATE OR REPLACE FUNCTION site_aggregates_activity (i text) + RETURNS integer + LANGUAGE plpgsql + AS $$ +DECLARE + count_ integer; +BEGIN + SELECT + count(*) INTO count_ + FROM ( + SELECT + c.creator_id + FROM + comment c + INNER JOIN person pe ON c.creator_id = pe.id + WHERE + c.published > ('now'::timestamp - i::interval) + AND pe.local = TRUE + AND pe.bot_account = FALSE + UNION + SELECT + p.creator_id + FROM + post p + INNER JOIN person pe ON p.creator_id = pe.id + WHERE + p.published > ('now'::timestamp - i::interval) + AND pe.local = TRUE + AND pe.bot_account = FALSE + UNION + SELECT + pl.person_id + FROM + post_like pl + INNER JOIN person pe ON pl.person_id = pe.id + WHERE + pl.published > ('now'::timestamp - i::interval) + AND pe.local = TRUE + AND pe.bot_account = FALSE + UNION + SELECT + cl.person_id + FROM + comment_like cl + INNER JOIN person pe ON cl.person_id = pe.id + WHERE + cl.published > ('now'::timestamp - i::interval) + AND pe.local = TRUE + AND pe.bot_account = FALSE) a; + RETURN count_; +END; +$$; + From cef3f220a209d3e2c63f237b198626c3a7707a10 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Mon, 11 Dec 2023 15:39:18 +0100 Subject: [PATCH 30/71] Make command line options consistent (#4243) --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ede4bb8f0..3807405f6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -72,12 +72,12 @@ use url::Url; long_about = "A link aggregator for the fediverse.\n\nThis is the Lemmy backend API server. This will connect to a PostgreSQL database, run any pending migrations and start accepting API requests." )] pub struct CmdArgs { - #[arg(long, default_value_t = false)] /// Disables running scheduled tasks. /// /// If you are running multiple Lemmy server processes, /// you probably want to disable scheduled tasks on all but one of the processes, /// to avoid running the tasks more often than intended. + #[arg(long, default_value_t = false, action=ArgAction::Set)] disable_scheduled_tasks: bool, /// Whether or not to run the HTTP server. /// From e317947b75eed386692509adfcd9de0724f279fd Mon Sep 17 00:00:00 2001 From: Nutomic Date: Mon, 11 Dec 2023 20:35:53 +0100 Subject: [PATCH 31/71] Dont allow blocking local instance (fixes #4241) (#4242) * Dont allow blocking local instance (fixes #4241) * use localuserview --- crates/api/src/site/block.rs | 4 ++++ crates/utils/src/error.rs | 1 + 2 files changed, 5 insertions(+) diff --git a/crates/api/src/site/block.rs b/crates/api/src/site/block.rs index be48e8ce8..7d28e43d5 100644 --- a/crates/api/src/site/block.rs +++ b/crates/api/src/site/block.rs @@ -19,6 +19,10 @@ pub async fn block_instance( ) -> Result, LemmyError> { let instance_id = data.instance_id; let person_id = local_user_view.person.id; + if local_user_view.person.instance_id == instance_id { + return Err(LemmyErrorType::CantBlockLocalInstance)?; + } + let instance_block_form = InstanceBlockForm { person_id, instance_id, diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index 34f636705..7d84dcbf6 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -227,6 +227,7 @@ pub enum LemmyErrorType { BanExpirationInPast, InvalidUnixTime, InvalidBotAction, + CantBlockLocalInstance, Unknown(String), } From f76499674578ba49e2f07e9e9b0cc4488627f12a Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 11 Dec 2023 14:36:12 -0500 Subject: [PATCH 32/71] Show federated posts on user profile. Fixes #4228 (#4229) * Show federated posts on user profile. Fixes #4228 * Make sure posts are hidden if no listing_type is given. --- crates/apub/src/api/read_person.rs | 2 - crates/db_views/src/comment_view.rs | 15 ++-- crates/db_views/src/post_view.rs | 106 +++++++++++++++------------- 3 files changed, 67 insertions(+), 56 deletions(-) diff --git a/crates/apub/src/api/read_person.rs b/crates/apub/src/api/read_person.rs index 26ad287f1..b32fc5b5f 100644 --- a/crates/apub/src/api/read_person.rs +++ b/crates/apub/src/api/read_person.rs @@ -65,7 +65,6 @@ pub async fn read_person( saved_only, local_user: local_user_view.as_ref(), community_id, - is_profile_view: true, page, limit, creator_id, @@ -79,7 +78,6 @@ pub async fn read_person( sort: sort.map(post_to_comment_sort_type), saved_only, community_id, - is_profile_view: true, page, limit, creator_id, diff --git a/crates/db_views/src/comment_view.rs b/crates/db_views/src/comment_view.rs index 9d853df3f..9e87d902e 100644 --- a/crates/db_views/src/comment_view.rs +++ b/crates/db_views/src/comment_view.rs @@ -177,14 +177,18 @@ fn queries<'a>() -> Queries< }; let list = move |mut conn: DbConn<'a>, options: CommentQuery<'a>| async move { - let person_id = options.local_user.map(|l| l.person.id); - let local_user_id = options.local_user.map(|l| l.local_user.id); + let my_person_id = options.local_user.map(|l| l.person.id); + let my_local_user_id = options.local_user.map(|l| l.local_user.id); // The left join below will return None in this case - let person_id_join = person_id.unwrap_or(PersonId(-1)); - let local_user_id_join = local_user_id.unwrap_or(LocalUserId(-1)); + let person_id_join = my_person_id.unwrap_or(PersonId(-1)); + let local_user_id_join = my_local_user_id.unwrap_or(LocalUserId(-1)); - let mut query = all_joins(comment::table.into_boxed(), person_id, options.saved_only); + let mut query = all_joins( + comment::table.into_boxed(), + my_person_id, + options.saved_only, + ); if let Some(creator_id) = options.creator_id { query = query.filter(comment::creator_id.eq(creator_id)); @@ -373,7 +377,6 @@ pub struct CommentQuery<'a> { pub saved_only: bool, pub liked_only: bool, pub disliked_only: bool, - pub is_profile_view: bool, pub page: Option, pub limit: Option, pub max_depth: Option, diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index fcffe214a..bd768cc38 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -301,16 +301,16 @@ fn queries<'a>() -> Queries< }; let list = move |mut conn: DbConn<'a>, options: PostQuery<'a>| async move { - let person_id = options.local_user.map(|l| l.person.id); - let local_user_id = options.local_user.map(|l| l.local_user.id); + let my_person_id = options.local_user.map(|l| l.person.id); + let my_local_user_id = options.local_user.map(|l| l.local_user.id); // The left join below will return None in this case - let person_id_join = person_id.unwrap_or(PersonId(-1)); - let local_user_id_join = local_user_id.unwrap_or(LocalUserId(-1)); + let person_id_join = my_person_id.unwrap_or(PersonId(-1)); + let local_user_id_join = my_local_user_id.unwrap_or(LocalUserId(-1)); let mut query = all_joins( post_aggregates::table.into_boxed(), - person_id, + my_person_id, options.saved_only, ); @@ -318,7 +318,7 @@ fn queries<'a>() -> Queries< query = query.filter(community::deleted.eq(false)); // only show deleted posts to creator - if let Some(person_id) = person_id { + if let Some(person_id) = my_person_id { query = query.filter(post::deleted.eq(false).or(post::creator_id.eq(person_id))); } else { query = query.filter(post::deleted.eq(false)); @@ -329,7 +329,7 @@ fn queries<'a>() -> Queries< .map(|l| l.local_user.admin) .unwrap_or(false); // only show removed posts to admin when viewing user profile - if !(options.is_profile_view && is_admin) { + if !(options.creator_id.is_some() && is_admin) { query = query .filter(community::removed.eq(false)) .filter(post::removed.eq(false)); @@ -352,41 +352,47 @@ fn queries<'a>() -> Queries< query = query.filter(post_aggregates::creator_id.eq(creator_id)); } - if let Some(person_id) = person_id { - let is_subscribed = exists( - community_follower::table.filter( - post_aggregates::community_id - .eq(community_follower::community_id) - .and(community_follower::person_id.eq(person_id)), - ), - ); - match options.listing_type.unwrap_or_default() { - ListingType::Subscribed => query = query.filter(is_subscribed), - ListingType::Local => { - query = query - .filter(community::local.eq(true)) - .filter(community::hidden.eq(false).or(is_subscribed)); + if let Some(listing_type) = options.listing_type { + if let Some(person_id) = my_person_id { + let is_subscribed = exists( + community_follower::table.filter( + post_aggregates::community_id + .eq(community_follower::community_id) + .and(community_follower::person_id.eq(person_id)), + ), + ); + match listing_type { + ListingType::Subscribed => query = query.filter(is_subscribed), + ListingType::Local => { + query = query + .filter(community::local.eq(true)) + .filter(community::hidden.eq(false).or(is_subscribed)); + } + ListingType::All => query = query.filter(community::hidden.eq(false).or(is_subscribed)), + ListingType::ModeratorView => { + query = query.filter(exists( + community_moderator::table.filter( + post::community_id + .eq(community_moderator::community_id) + .and(community_moderator::person_id.eq(person_id)), + ), + )); + } } - ListingType::All => query = query.filter(community::hidden.eq(false).or(is_subscribed)), - ListingType::ModeratorView => { - query = query.filter(exists( - community_moderator::table.filter( - post::community_id - .eq(community_moderator::community_id) - .and(community_moderator::person_id.eq(person_id)), - ), - )); + } + // If your person_id is missing, only show local + else { + match listing_type { + ListingType::Local => { + query = query + .filter(community::local.eq(true)) + .filter(community::hidden.eq(false)); + } + _ => query = query.filter(community::hidden.eq(false)), } } } else { - match options.listing_type.unwrap_or_default() { - ListingType::Local => { - query = query - .filter(community::local.eq(true)) - .filter(community::hidden.eq(false)); - } - _ => query = query.filter(community::hidden.eq(false)), - } + query = query.filter(community::hidden.eq(false)); } if let Some(url_search) = &options.url_search { @@ -420,7 +426,7 @@ fn queries<'a>() -> Queries< query = query.filter(person::bot_account.eq(false)); }; - if let (true, Some(person_id)) = (options.saved_only, person_id) { + if let (true, Some(person_id)) = (options.saved_only, my_person_id) { query = query.filter(is_saved(person_id)); } // Only hide the read posts, if the saved_only is false. Otherwise ppl with the hide_read @@ -431,12 +437,12 @@ fn queries<'a>() -> Queries< .unwrap_or(true) { // Do not hide read posts when it is a user profile view - if let (false, Some(person_id)) = (options.is_profile_view, person_id) { + if let (Some(_creator_id), Some(person_id)) = (options.creator_id, my_person_id) { query = query.filter(not(is_read(person_id))); } } - if let Some(person_id) = person_id { + if let Some(person_id) = my_person_id { if options.liked_only { query = query.filter(score(person_id).eq(1)); } else if options.disliked_only { @@ -446,7 +452,7 @@ fn queries<'a>() -> Queries< // Dont filter blocks or missing languages for moderator view type if let (Some(person_id), false) = ( - person_id, + my_person_id, options.listing_type.unwrap_or_default() == ListingType::ModeratorView, ) { // Filter out the rows with missing languages @@ -630,7 +636,6 @@ pub struct PostQuery<'a> { pub liked_only: bool, pub disliked_only: bool, pub moderator_view: bool, - pub is_profile_view: bool, pub page: Option, pub limit: Option, pub page_after: Option, @@ -766,6 +771,7 @@ mod tests { inserted_bot: Person, inserted_community: Community, inserted_post: Post, + inserted_bot_post: Post, } async fn init_data(pool: &mut DbPool<'_>) -> Data { @@ -850,7 +856,7 @@ mod tests { .community_id(inserted_community.id) .build(); - let _inserted_bot_post = Post::create(pool, &new_bot_post).await.unwrap(); + let inserted_bot_post = Post::create(pool, &new_bot_post).await.unwrap(); let local_user_view = LocalUserView { local_user: inserted_local_user, person: inserted_person, @@ -864,6 +870,7 @@ mod tests { inserted_bot, inserted_community, inserted_post, + inserted_bot_post, } } @@ -1253,7 +1260,7 @@ mod tests { // Remove the post Post::update( pool, - data.inserted_post.id, + data.inserted_bot_post.id, &PostUpdateForm { removed: Some(true), ..Default::default() @@ -1273,18 +1280,21 @@ mod tests { .unwrap(); assert_eq!(1, post_listings_no_admin.len()); - // Removed post is shown to admins on profile page + // Removed bot post is shown to admins on its profile page data.local_user_view.local_user.admin = true; let post_listings_is_admin = PostQuery { sort: Some(SortType::New), + creator_id: Some(data.inserted_bot.id), local_user: Some(&data.local_user_view), - is_profile_view: true, ..Default::default() } .list(pool) .await .unwrap(); - assert_eq!(2, post_listings_is_admin.len()); + assert_eq!( + data.inserted_bot.id, + post_listings_is_admin[0].post.creator_id + ); cleanup(data, pool).await; } From 95130370f03c910416bd03edd46d50417e650b07 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Tue, 12 Dec 2023 14:54:06 +0100 Subject: [PATCH 33/71] Add CI check for ignored files (#4252) * Add CI check for ignored files * remove ignored files --- .woodpecker.yml | 8 ++++++++ api_tests/pict-rs | Bin 30947232 -> 0 bytes api_tests/test.png | Bin 28211 -> 0 bytes 3 files changed, 8 insertions(+) delete mode 100755 api_tests/pict-rs delete mode 100644 api_tests/test.png diff --git a/.woodpecker.yml b/.woodpecker.yml index 910db0ce9..0b8b6f8c8 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -75,6 +75,14 @@ steps: - cargo binstall -y cargo-machete - cargo machete + ignored_files: + group: format + image: alpine:3 + commands: + - apk add git + - IGNORED=$(git ls-files --cached -i --exclude-standard) + - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi + restore-cache: image: meltwater/drone-cache:v1 pull: true diff --git a/api_tests/pict-rs b/api_tests/pict-rs deleted file mode 100755 index 521d0fdc3ddfa769ba2320325d265daa49bd2904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30947232 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 z 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 +yb6qar$=9U*GkARc!%e%Ca97`}oWs3)WIv~Z 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