From 6bfec06fec8691b2c6a3d979e1510a6bdfaa2384 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Wed, 28 Jan 2026 23:15:38 +1100 Subject: [PATCH] feat: add more guides and command parsing --- docs/astro.config.mjs | 8 +- .../content/docs/admin/authentication/oidc.md | 45 +++++++++++ .../docs/admin/authentication/simple.mdx | 26 ++++++ .../content/docs/admin/guides/import-game.mdx | 52 ++++++++++++ .../docs/admin/guides/import-version.mdx | 74 ++++++++++++++++++ .../admin/guides/version-import-wizard.png | Bin 0 -> 104136 bytes .../docs/reference/command-parsing.mdx | 34 ++++++++ 7 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 docs/src/content/docs/admin/authentication/oidc.md create mode 100644 docs/src/content/docs/admin/authentication/simple.mdx create mode 100644 docs/src/content/docs/admin/guides/import-game.mdx create mode 100644 docs/src/content/docs/admin/guides/import-version.mdx create mode 100644 docs/src/content/docs/admin/guides/version-import-wizard.png create mode 100644 docs/src/content/docs/reference/command-parsing.mdx diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index bcb9ca86..0ee1f558 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -32,12 +32,18 @@ export default defineConfig({ items: [ { slug: "admin/guides/exposing" }, { slug: "admin/guides/creating-library" }, + { slug: "admin/guides/import-game" }, + { slug: "admin/guides/import-version" }, ], }, { label: "Metadata", autogenerate: { directory: "admin/metadata" }, }, + { + label: "Authentication", + autogenerate: { directory: "admin/authentication" }, + }, ], }, { @@ -48,5 +54,5 @@ export default defineConfig({ customCss: ["./src/styles/drop.css"], }), ], - site: "https://docs-next.droposs.org/" + site: "https://docs-next.droposs.org/", }); diff --git a/docs/src/content/docs/admin/authentication/oidc.md b/docs/src/content/docs/admin/authentication/oidc.md new file mode 100644 index 00000000..0864771a --- /dev/null +++ b/docs/src/content/docs/admin/authentication/oidc.md @@ -0,0 +1,45 @@ +--- +title: OpenID Connect +--- + +OpenID Connect is a OAuth2 extension support by most identity providers. + +## Configure OpenID Connect + +To configure OIDC, you must set the following environment variables: + +| Variable | Usage | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | +| `OIDC_CLIENT_ID` | Client ID from your identity provider. | +| `OIDC_CLIENT_SECRET` | Client secret from your identity provider. | +| `OIDC_ADMIN_GROUP` | Grant admin to users with this group configured in your identity provider. Tested with Authentik. | +| `OIDC_USER_GROUP` (optional) | Optionally require a OIDC group to sign in. By default, Drop will allow any user. | +| `DISABLE_SIMPLE_AUTH` (optional) | Disable simple auth | +| `OIDC_USERNAME_CLAIM` (optional) | Change the field that Drop pulls the username claim from. Users are merged based on their usernames. Defaults to "preferred_username". | +| `OIDC_PROVIDER_NAME` (optional) | Change the name of the OIDC provider that is displayed on the sign-in page. Default is "external provider". | +| `OIDC_DONT_REQUIRE_HTTPS` (optional) | Flag to disable HTTPS requirement for OIDC providers. | + +--- + +And then, you must configure **either**: + +#### Use `OIDC_WELLKNOWN` + +A unprotected endpoint that returns a OIDC well-known JSON. Fetched on startup + +--- + +#### Provide options individually + +| Variable | Usage | +| -------------------- | ------------------------------------------------------------------------- | +| `OIDC_AUTHORIZATION` | Authorization endpoint. Usually ends with `authorize`. | +| `OIDC_TOKEN` | Token endpoint. Usually ends with `token`. | +| `OIDC_USERINFO` | Userinfo endpoint. Usually ends with `userinfo`. | +| `OIDC_SCOPES` | Comma separated list of scopes. Requires, at least, `openid` and `email`. | +| `OIDC_ISSUER` | OIDC issuer URL. Usually provided by the OIDC provider. | +| `OIDC_JWKS` | OIDC JWKS validation URL. | + +## Redirect URL + +Drop uses the `EXTERNAL_URL` environment variable to create the callback URL: `$EXTERNAL_URL/auth/callback/oidc`. diff --git a/docs/src/content/docs/admin/authentication/simple.mdx b/docs/src/content/docs/admin/authentication/simple.mdx new file mode 100644 index 00000000..8eef4c79 --- /dev/null +++ b/docs/src/content/docs/admin/authentication/simple.mdx @@ -0,0 +1,26 @@ +--- +title: Simple +--- + +import { Steps } from "@astrojs/starlight/components"; + +Simple authentication (or simple auth) is a basic username and password combination. It's the default for Drop, and is the fallback authentication mechanism if Drop is unable to initialise any others. + +Simple authentication works on a system of invites. + +## Creating an Invite + + +1. Head to your Drop Admin dashboard, and click on the **'Users' tab.** + +2. Then, head to the authentication panel by **clicking the 'Authentication →' button.** + +3. Then, **click on the "Simple" auth**, **click the three-dot menu**, and **"Configure"**. + +4. Then, create an invite with the button and modal. + + + +## Disabling Simple Auth + +If you've configured another authentication mechanism, you can disable simple by setting the environment variable `DISABLE_SIMPLE_AUTH` to "true". diff --git a/docs/src/content/docs/admin/guides/import-game.mdx b/docs/src/content/docs/admin/guides/import-game.mdx new file mode 100644 index 00000000..7ac8c8b3 --- /dev/null +++ b/docs/src/content/docs/admin/guides/import-game.mdx @@ -0,0 +1,52 @@ +--- +title: Importing a game +--- + +import { Steps } from "@astrojs/starlight/components"; + +Once you've got a library set up, you can import a game. + +## Set up metadata providers + +Drop's metadata provider system allows you to import from a variety of metadata sources from one interface. **By default, there are a couple metadata providers that require no configuration to be activated.** You can use those for now. + +If you'd like to configure more metadata providers, use the metadata section on the sidebar to view individual configurations for each provider. + +## Importing a game + + +1. **Create your game folder.** + + Following your chosen library structure, create a game folder with a name similar _enough_ to the published title of your game. + + For example, if your game is called "STAR WARS: Jedi Survivor - Deluxe Edition", you can usually get away with just "Jedi Survivor". + +2. **Open import interface.** + + Once you've created your game folder, open the Admin Dashboard, and navigate to the "Library" tab. **Drop should detect you have a new game to import**, and display an alert. **Use the "Import" button to proceed.** + + All games in Drop must be **manually imported** - there is no automatic library matching. However, some automation tools may use the Drop API to automatically import games and versions on your behalf. + + If Drop does not detect your new game folder, double check your library structure and library source configuration. If the issue persists, hop into our Discord or open an issue on GitHub. + +3. **Select your game folder.** + + From the dropdown at the top of the page, select your game folder. + + This starts a metadata search, using the name of the folder. Results will appear in another dropdown, in which you can select the correct option. You can also edit the search parameters and click Search again, to refine your results. Once you've found the correct option, click "Import". + + You can also skip this process by using the manual metadata provider, by clicking "Import without metadata" + + :::tip + **Bulk import mode** can be used to import many games in succession. It turns off the redirect to the imoprt task. + ::: + +4. **Wait for import.** + + Once you've clicked import, Drop will redirect you to the import task. It will show the progress and any log messages about the import. + + :::note + The import happens in the background, so you can leave the page without worrying about cancelling the import. + ::: + + diff --git a/docs/src/content/docs/admin/guides/import-version.mdx b/docs/src/content/docs/admin/guides/import-version.mdx new file mode 100644 index 00000000..4244c89d --- /dev/null +++ b/docs/src/content/docs/admin/guides/import-version.mdx @@ -0,0 +1,74 @@ +--- +title: Importing a version +--- + +import { Steps } from "@astrojs/starlight/components"; + +Once you've got a library set up, and have imported a game, you can import a version for that game. + + +1. ### **Add your version files.** + Following your library structure, copy over your version files to your version directory. Make sure you verify the game works, and you know how to launch it properly. +2. ### **Open import wizard.** + + Head over to your Admin Dashboard, and click on the "Library" tab. Drop should detect that you have a new version to import. To open the import wizard, you can either click on the alert on any game tile, or click "Open in Editor" and navigate to the "Versions" tab. + +3. ### **Select your version folder.** + + From the dropdown, select your version folder. It should load for a little bit, and give you an interface that looks something like this: + + ![Version import wizard for an example game](./version-import-wizard.png) + +4. ### _About the wizard..._ + + Here's what each section is about: + + ### Setup executable/command + + Setup executables are run after download but before first launch, and are useful for extracting files or setting necessary configuration. + + :::tip + Both setup and launch command configurations may provide suggestions based on file extension. To view these suggestions, start typing or click the chevron in the text field. + ::: + + ### Setup mode + + Setup mode removes the requirement of at least one launch command. Useful for installer-only versions. Clients will never show a launch button, only a setup button. + + ### Launch executable/command + + Launch executables can be launched by the user. If multiple launch commands are configured, they will all be shown to the user on launch to pick from. + + :::note + For a version to show up on a platform, **at least one launch command of that platform needs to be configured**, unless the version is in setup-only mode. + ::: + + ### Update mode + + Update mode is for when you're importing a patch. **You have to re-add the launch/setup commands, they are not preserved from previous versions.** + +5. ### **Import your version.** + + There are many different kinds of imports, but for simplicity's sake, we'll do either a portable or installer version. + + ### Portable version + + A portable version can be launched from an executable. To import a portable game, add a launch command with the portable game executable. + + ### Installer version + + A installer version uses "setup mode". Enable the option, and then add the installer executable in setup commands. + + :::note + Setup and launch commands are parsed in a cross-platform, POSIX style. It's not relevant for simple setups, but useful to know. Read more about it in [Command Parsing](/reference/command-parsing/). + ::: + +6. ### **Wait for import.** + + Drop will redirect you to a task page about the import. A version import scales with the size of the version, since the import will read through every file in the version and generate checksums. + + :::note + As with the game import, feel free to leave the import page while it's going, without worrying about it cancelling. + ::: + + diff --git a/docs/src/content/docs/admin/guides/version-import-wizard.png b/docs/src/content/docs/admin/guides/version-import-wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..e054ab78305cc4707e02909f1e1086b8ed228aad GIT binary patch literal 104136 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

I<~+P-KG^k~`bq!9lm5`r z-bPux92a7XUh%P`L>oGxLt^7@Vof^sHH@|;)NiGmz=x}^xHT@lHP`o?nc+wD?6)?b zkRMvoznlN8mM$R(d*_)}Lh_S!9_RocMU5MPg_Boto6Gw*n;OoDh*peE}HJqK( z-_S{!ktrLpRDeuDIbpJ~4kacG*_(IX;y-#<>N_B_$x_(^X>m#2;lWR6jagbv*NvOg z&ruR4;^x8b>+S2)Fh*(|6rg*)VpK?1D{rv#mc4Y07WskUYhjhlK@*0^E7=+Mv3y9Gqv&0}KNOS3%6A+5se*lj;; z-#CZfpg|$5l%z^KUGw zR;_|^8HJF?I2$3olK#NA)SkU)^D8OfPmoN=5nBTmd;{qF6jyw6HN}x3ORl;9j+Oq~ zXL!=QRCvn0tt&k{hDQD~@1SMXVvTq{lujK`yIL}TWe}A8Y6m`e+6SWI)3U1`3g^iR zkd{3c4mn;xlGhx>daqFc$BSk=kGspP?RT&|^e!L0Pyf+DTbNjgVFJi`*0GS9xAWEC zTf=R8s}katv$5oXoSgJI653YE6B#+<}vQ95}*di^VULV@M<$TV8cU zMT{gKbmJ!92|cWiNxG-8Ap|{~eF2hon_TQHOFb}Tum|^aL1@=4N$np8d7to!8AGq{ zE}GC|v;jPsf$)tWacyb5xRPCy&{8!H|FiVpfqtI&#T=Q0@Lrfz0W_?Py+H9Dg^%_y z)-7W)m(->~Wo(_-*arQs$IoVc)lawyERn4$+|3l+Tl2&-t zeBhV~kptZNG16l5yVFriGDJiInPNz<NN?dzK+Ehamf3EIv7rw6u) z^@=HikARJhgancV1_9Lx45TGQ=0xTM!2$>uq)ezSs2^N^_3Dy}-FE$HDS{xMIG?!d zPczbT;&ZW$zpDGE7Xbh6^;f0o|G)U5|MSCp58H{m| zz*a~gfqyWeQuNvbWjR&dgcpZ+&#S=}*_gb80l|M{e^4|0HX7VESii$k{HLr^Ys)D-EAzYVHd&c=aD#J}{zo?_Bgly#K!cCS zafw*FZ$Iuv&RnrzWEc6qcN21RqFtKcF@R#lm9K7S{-crQ+amPx$H8-=vT7G^8QSzY>fgP)1oUN`m z1_a@Hhi%%$$bXB47!P*}oSChPhoERQ+UEHyICXJfOT&a85SVI-7k_1`4#*6?7REmh z2KQ#P-