While researching and fixing other issue, it caught my attention that we
are embedding a library patches JSON file from the PrismLauncher meta
repository. However, since we copied that file, a new revision of it was
published with patches that improve compatibility with Apple Silicon
macOS platforms.
These changes update such a file and, perhaps most importantly, add a
comment explaining the provenance and licensing of such a file.
I made a typo on PR https://github.com/modrinth/code/pull/4426 by making
the corresponding SQL query filter by projects with an unexisting
`public` status, instead of `approved`. During my testing, I used the
`archived` status, so I didn't notice it back then.
* Reapply "refactor(app): reduce tech debt by eliminating `wry` fork (#4500)"
This reverts commit 2535156dac.
* test: temporarily replace ad link by something with sound
* Revert "test: temporarily replace ad link by something with sound"
This reverts commit 74bb7eecb7.
* Reapply "test: temporarily replace ad link by something with sound"
This reverts commit f1b0e9f2c4.
* test: also disable ads init muting script for good measure
* Revert "test: also disable ads init muting script for good measure"
This reverts commit 4ac7a81e17.
* Revert "Reapply "test: temporarily replace ad link by something with sound""
This reverts commit c5f1b9f242.
PR #4270 modified the internal `fetch` function used by the application
to download version artifacts in a way that 4xx HTTP errors also caused
an abnormal return, instead of just 5xx errors. That was a good change,
but it had the unintended side effect of exposing our faulty logic
elsewhere of trying to download non-native JAR library artifacts when
only native artifacts are appropriate, at least according to the
PrismLauncher source code I've read. Such a download always returned a
404 error, but because such error was considered successful, a dummy
library file was still created and things worked seemingly fine.
These changes bring the Modrinth App behavior in this regard more in
line with PrismLauncher's, avoiding downloading non-native artifacts for
dependencies that have native artifacts available. (Reference:
https://github.com/PrismLauncher/PrismLauncher/blob/8b5e91920dda7324ad3db98f56b209bba0f4e57d/launcher/minecraft/Library.cpp#L163)
I've tested these changes to work successfully with a variety of old
vanilla and modded Minecraft versions.
Fixes#4464.
PR #3960 reverted the Cranelift usage introduced in #4388 due to its
codegen not being up to standard when compiling some pieces of code
under some platforms. However, it didn't revert the switch to a nightly
Rust toolchain, which is now unnecessary, and produces unnecessary drift
between what's declared in the `rust-toolchain.toml` and the Docker
image manifests, causing inefficiencies.
These changes bring back the usage of stable Rust for the time being to
correct those inefficiencies.
* tweak(path-util): addendum to #4482
These changes improve on those introduced in #4482 in two ways:
- The serialization logic for `SafeRelativeUtf8UnixPathBuf` now more
closely mirrors the deserialization checks, reducing the chance that a
generated path will fail to deserialize. While unlikely in practice,
catching such theoretical cases earlier improves the experience for
users and developers.
- After deeper testing on a clean Windows 10 VM, I found that reserved
device names can have both an extension and an alternate data stream
appended, not just one or the other. These changes handle that case
more gracefully.
* chore: fix typos, add tests
* fix(path-util): extend `SafeRelativeUtf8UnixPathBuf` contract to allow `.` components
While quite useless, they were accepted by previous app versions, the
`.mrpack` specification does not forbid them, and they do not pose
security issues, so accept them for backwards compatibility.
This is a follow-up to PR #4426. I initially didn't consider the
organizations an user belongs to as worth hiding, but given that user
profiles can be public, I suppose there technically is a way to exploit
them for SEO abuse. Overall, it also seems more consistent to hide them
here too.
`cargo sqlx prepare` should be run in the directory of the crate that
contains the database queries instead, as that's what we're documenting
and have standarized on.
* chore(labrinth): set `DELPHI_URL` to a valid default in `.env.local`
* feat(labrinth): make orgs not publicly visible until they meet some conditions
* Revert "Org disabled frontend (#4424)"
This reverts commit 2492b11ec0.
* changelog: update for re-enabling organization creation
* chore: run `sqlx prepare`
* chore(labrinth): tweak tests to work with new org changes
* tweak: apply @triphora's suggestion
Co-authored-by: Emma Alexia <emma@modrinth.com>
Signed-off-by: Alejandro González <7822554+AlexTMjugador@users.noreply.github.com>
* tweak: document `is_visible_organization` relationship with `Project#is_searchable`
---------
Signed-off-by: Alejandro González <7822554+AlexTMjugador@users.noreply.github.com>
Co-authored-by: Emma Alexia <emma@modrinth.com>
These changes add a layered hook to the `markdown-it` renderer rules to
resolve `<img>` element `src` attributes and `<a>` element `href`
attributes to a path-absolute relative URL, to ensure that such URLs
always point to the same resource URL even when the URL the current
resource is being viewed from changes.
This fixes an issue with relative links and image source URLs being
broken when a blog post was watched from a URL that lacked a trailing
slash, as web browsers adjust the path relative URLs are resolved from
depending on whether such character is present, and we didn't account
for that.
While at it, I've rebuilt all the blog posts and their associated RSS
feed.
* feat: consistently format all HTML, XML, JSON, CSS, JS, TS, SQL, TOML, YAML, and Markdown files
* chore: deal with VS Code not being able to parse valid editorconfig syntax
Sometimes I'm surprised that computers even work.
* chore: get rid of IntelliJ IDE config files that should not be there
These were already added to the `.gitignore` a long time ago, and now
are being ignored by Prettier.
* fix: rename `tooling-config` `format` script to `fix` for it to run with Turbo
* feat: surveys
* make assigned and dismissed users fields optional
* fix: set required CSP sources for Tally forms to show up
* make only attempt on windows, temp bypass requirements
* fix: lint issues
* Add prompt for survey prior to popup
* lint
* hide ads when survey is open
---------
Signed-off-by: Cal H. <hendersoncal117@gmail.com>
Co-authored-by: Prospector <prospectordev@gmail.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: Cal H. <hendersoncal117@gmail.com>
Co-authored-by: IMB11 <calum@modrinth.com>
* feat(labrinth): support STMP servers with no auth credentials
* feat: set up Mailpit SMTP server as part of our Docker Compose services swarm
* chore(docker-compose): fix healthcheck for mail service
* feat(docker-compose): enable SpamAssassin integration through Postmark
Unlike spinning up yet another container, this requires no
configuration, and is good and simple enough for a funny little feature
developers may occassionally use with non-confidential messages.
* feat(docker-compose): give all containers a name
* fix(docker-compose): fix healthcheck for clickhouse container
For some reason, its CMD form always returned a healthcheck error, at
least in Podman.
* fix(editorconfig): address formatting regression for YAML files introduced in 8af65f58d9
* fix: frontend temp editorconfig change
* fix(editorconfig): add more extensions that use 2 spaces indentation
---------
Co-authored-by: Calum H. (IMB11) <hendersoncal117@gmail.com>
* chore(docs/labrinth): remove unnecessary trailing spaces in lines
These don't serve an useful purpose, and overall the Markdown source
looks less tidy with them.
* chore: replace Labrinth -> labrinth
* fix(app-frontend): do not emit exceptions when no loaders are available
* refactor(app): simplify Microsoft login code without functional changes
* feat(app): external browser auth flow for Modrinth account login
* chore: address Clippy lint
* chore(app/oauth_utils): simplify `handle_reply` error handling according to review
* chore(app-lib): simplify `Url` usage out of MC auth module
We standarized on using `rustls` as a TLS implementation across the
monorepo, which is written in Rust and has better ergonomics,
integration with the Rust ecosystem, and consistent behavior among
platforms. However, the Labrinth Clickhouse client was the last
remaining exception to this, using the native, OS-provided TLS
implementation, which on Linux is OpenSSL and requires developers and
Docker images to install OpenSSL development packages to build Labrinth,
in addition to introducing an additional runtime dependency to Labrinth.
Let's make the process of building Labrinth slightly simpler by
switching such client to `rustls` as well, which results in finally
using the same TLS implementation for everything, a simplified build and
distribution process, less transitive dependencies, and potentially
smaller binaries (since `rustls` was already being pulled in for, e.g.,
the SMTP client).
* ci(theseus-build): ensure only relevant bundle artifacts are uploaded
Tauri leaves behind quite a bit of intermediate garbage in these target
folders, even when building with no build cache.
* ci(theseus-release): fix typo in RPM package URL generation
* ci(theseus-build): generate shorter and more user-friendly commit build versions
* dist(docker): add `.dockerignore` as symlink to `.gitignore`
This ensures that no files outside of version control are transferred to
the Docker build context for Labrinth and Daedalus images, which
significantly improves build speed (if a `target` directory is already
present) and build reproducibility.
* chore(dist/docker): simplify out unneeeded statements, move `SQLX_OFFLINE` env var setting to build command itself
The latter approach ensures that developers building the image locally
don't forget to set `SQLX_OFFLINE`, too.
* dist(docker): add `curl` package to Labrinth image
* feat(ci): clean up app release build workflow, set app versions to match tag's
* feat(ci): rename Theseus build workflow, add new release workflow
* chore(ci): minor tweaks to `theseus-build` workflow
* chore: update workflow reference in comments
* fix(app): adjust CSP settings for skin manager to work
* tweak: allow current Tauri scheme in CSP
* tweak: remove references to invalid `sunny.png` texture in skin models
These were causing load errors in production app builds.
* tweak: use proper URL imports for skin models
This fixes importing these models in production builds of the app.
* chore(app-frontend): use more proper import style for glTF assets
* tweak: use proper URL imports for skin models in more places
* fix(app): use the same CSP during `tauri dev` as `tauri build`
* chore(app-frontend): make Vite WS CSP policy a bit more strict
* tweak: make Tauri CSP config object readable again
At the cost of some extra code in the Vite config side, but I think it's
worth it.
* chore: fix linter warning in app frontend introduced who knows where else
We need a Git hook to ensure these things aren't pushed only to explode
later on or something.
* tweak(pages/plus): update lack of ads perk desc to match latest changes
* tweak(pages/plus): more perks coming soon -> soon™
At this point it feels a bit fake for reasonable definitions of "soon"
to keep stating that more perks are coming "soon", even though it's not
something that has not been discarded altogether.
However, I think everyone can agree on a more playful and realistic
"soon™" deadline, because everyone likes memes and can relate to things
taking longer to come to fruition than planned :)
An unforeseen consequence of PR #3833 landing was that `tauri dev`
stopped working reliably, getting softlocked when the `app-lib` crate
build script actually needed to build Java scripts: Gradle always
modifies a few files under the `.gradle` directory when run, which get
picked up by Tauri as source code changes that should trigger a rebuild,
but such rebuild triggers Gradle to run and modify those files again ad
infinitum.
This change fixes that by adding such a directory to a documented Tauri
exclusion file, restoring such functionality back.
* feat(ci): sign Windows Theseus bins with DigiCert KeyLocker cloud HSM
* perf(ci): speed up Jsign installation
* fix(ci): use absolute path to DigiCert client certificate
This should avoid errors related to Jsign not being able to find it
we've seen on CI.
* fix(ci): trim strange characters out from DigiCert credentials
* ci: another attempt at fixing Jsign errors
* chore: add comment mentioning why `jsign` choco deps are ignored
* tweak: move KeyLocker signing config to CI release Tauri config file
This prevents casual local builds from attempting to use a signing
command they really can't use, improving developer experience.
* tweak(ci/windows): do not waste time and signatures with MSIs
We aren't distributing these anyway. This should reduce the signing
operations required for building the app from 5 (one for the binary,
another for the MSI installer, two for WiX extension DLLs and one for
the NSIS installer) to 2.
* feat(ci): make Windows code signing toggleable, do not sign non-final builds
* chore(ci): tweak `sign-windows-binaries` input wording
* fix(ci): deal with usual Powershell syntax shenanigans
* fix(ci): work around more Powershell syntax shenanigans
Who thought it'd be a good idea to make a comma a synonymous of a space
for separating command line arguments? Why have to characters for the
same thing?
* perf(ci): do not run app build workflow on Labrinth changes
Labrinth is not related to the app at all, so this is just a waste of CI
minutes.
* ci(theseus): enable Windows code signing by default for manual triggers
These are expected to be not that common, so defaulting to what causes
the least human errors when it comes to publishing a release makes most
sense.
* feat(labrinth): rework v3 side types to a single `environment` field
This field is meant to be able to represent the existing v2 side type
information and beyond, in a way that may also be slightly easier to
comprehend.
* chore(labrinth/migrations): use proper val for `HAVING` clause
* feat(labrinth): add `side_types_migration_review_status` field to projects
* fix(labrinth): return version artifact size exceeded error eagerly
Now we don't wait until the result memory buffer has grown to a size
greater than the maximum allowed, and instead we return such an error
before the buffer is grown with the current chunk, which should reduce
memory usage.
* fix(labrinth): proper supported game versions range for datapacks
* feat(labrinth): allow protected resource and data packs to pass validation
* fix(labrinth): ensure versions get removed from search indexes before ending route execution
* chore: run `sqlx prepare`
* chore(labrinth): simplify `remove_documents` a little
* chore: tweak new comment
* chore(clippy): enable and fix many stricter lints
These ensure that the codebase uses more idiomatic, performant, and
concise language constructions.
* chore: make non-Clippy compiler warnings also deny by default
* refactor: inherit Clippy lint config and Rust edition from workspace
This also ensures developers running `clippy lint` locally get the same
lints as during CI, especially when the Rust toolchain version is fixed
through a `rust-toolchain.toml` file.
* chore(clippy.toml): bump MSRV to 1.87
* perf(ci): use Turbo to schedule both `lint` and `test` tasks at once
* fix(ci): wait until service containers are initialized for tests
This is achieved by adding a health check to the containers, and
instructing the CI workflow to wait until the containers are healthy.
Not doing this wait risks spurious CI failures due to DB migrations
being applied before the DB even starts.
* chore(turbo): use locally installed schema in new Turbo override file
On the latest versions of Turbo, this ensures that the used schema is
always in sync with what's available in the installed Turbo version,
which is something that has already caused confusion to me before.
When an issue has been already handled by our part, and thus gets
closed, but affects many users and the fix takes a while to be rolled
out, it usually happens that those who notice the matter later on don't
notice previous reports and create duplicate issues.
Let's try to improve a little bit on that by not filtering out closed
issues in the links for checking whether the same issue was already
reported before. This should make it more obvious to users who follow
the link whether an issue for their problem already exists.
* fix(labrinth/billing): add Spain and Singapore to the list of countries for currency inferences
This should fix payments in those countries not going through with their
local currencies for products that do not have USD-only pricing.
* fix(labrinth/billing): tentative fix for subscription periods not updating
* chore(labrinth): fix typos, simplify out `remove_duplicates` func
* fix(labrinth): implement `capitalize_first` so that it can't panic on wide chars
* chore(labrinth): refactor out unneeded clone highlighted by nightly Clippy lints
* chore(labrinth): simplify `capitalize_first` implementation
* fix(labrinth): preserve ordering when deduplicating project field values
This addresses an unintended behavior change on
157647faf2.
* fix(labrinth/tests): make `index_swaps` test run successfully
I wonder why we don't run these more often...
* refactor: rename `.env.example` files to `.env.local`, make local envs more consistent between frontend and backend
* chore(labrinth/.env.local): proper email verif. and password reset paths
* chore: undo unintended updater `zip` feature drop, tweak comment
* fix: correct unintended regression on version and project validation
This was caused by a mistake when coalescing mostly copied and pasted
`RE_URL_SAFE` regexes into one.
* chore: inherit dependencies from workspace, optimize some deps out
* Update bitflags from 2.9.0 to 2.9.1
* Fix temp directory leak in check_java_at_filepath
* Fix build
* Fix lint
* chore(app-lib): refactor overkill `futures` executor usage to Tokio MPSC
* chore: fix Clippy lint
* tweak: optimize out dependency on OpenSSL source build
Contrary to what I expected before, this was caused due to the Tauri
updater plugin using a different TLS stack than everything else.
* chore(labrinth): drop now unused dependency
* Update zip because 2.6.1 got yanked
* Downgrade weezl to 0.1.8
* Mention that p256 is also a blocker for rand 0.9
* chore: sidestep GitHub review requirements
* chore: sidestep GitHub review requirements (2)
* chore: sidestep GitHub review requirements (3)
---------
Co-authored-by: Josiah Glosson <soujournme@gmail.com>
* chore(theseus): significantly cleanup MacOS-specific code
* fix(labrinth): only use jemalloc allocator for Linux targets
The upstream crate asserts that its tests only pass for Linux targets,
and there's little point in supporting other OS for now since practical
Labrinth deployments run under a Linux environment anyway. This change
made it easier for me to cross-compile Labrinth.
* chore(theseus): tweak traffic lights pos according to https://github.com/modrinth/code/commit/c39bb78e38cb9cfe13f01f4a9bee277881b52efb
As far as I understand it, that PR introduced the seemingly ad-hoc
additions of 6 and 12 units to the traffic light position calculations,
not directly modifying the `const` values introduced by
https://github.com/modrinth/code/commit/d6a72fbfc4613a45acaa38e0e73da9bcc455e87a.
* fix: re-enable app window shadows on Linux
* chore: log `window.set_shadow` errors
* chore: trigger CI