82 Révisions
Auteur SHA1 Message Date
jimmyGALLAND 51b4909cbd - Add workflow Action
Release / build-and-release (push) Successful in 32s
- Version .5
v1.0.6.5
2026-09-19 21:48:19 +02:00
jimmyGALLAND ce42fff915 don't hide media cards whose title matches a guard keyword substring 2026-09-19 18:27:11 +02:00
jimmyGALLAND 720328412c add French translation to the plugin configuration page 2026-09-19 17:48:24 +02:00
jimmyGALLAND 0418910d3d translate the ShareLink action sheet label to French 2026-09-19 17:23:05 +02:00
jimmyGALLAND fbbd9d1433 add ShareLinks to the admin Extensions menu with a share icon 2026-09-19 17:18:57 +02:00
jimmyGALLAND a6ff833c1b hide the empty "..." menu button on BoxSet detail pages for guests 2026-09-19 17:14:09 +02:00
jimmyGALLAND 886156874c Hide remove item from playlist or boxset 2026-09-19 17:11:35 +02:00
jimmyGALLAND 4ee9365b44 Also share sub setbox 2026-09-19 16:58:31 +02:00
jimmyGALLAND 4450906da9 Add collections, videos, images to shareable items 2026-09-18 21:56:11 +02:00
Francois CB e94fda86b6 update 1.0.6.0 in the manifest 2026-09-18 17:22:24 +02:00
Francois CB 6304650197 Fold 1.0.7.0 into 1.0.6.0 2026-09-18 17:22:24 +02:00
Francois CB ce808118a5 update 1.0.7.0 in the manifest 2026-09-18 17:15:13 +02:00
Francois CB 12ce432f77 Fold 1.0.8.0 into 1.0.7.0 2026-09-18 17:15:13 +02:00
Francois CB 254eb1703f add 1.0.8.0 to the manifest 2026-09-18 16:31:45 +02:00
Francois CB 1c7acfe185 Add the client script while index.html is served
Writing the tag into index.html on disk fails on most fresh installs
(linuxserver image, distro packages, Docker as a normal user) because
the web files belong to root. A middleware now adds the tag to the
response instead, so the ShareLink action and the guest lockdown work
right after install. The on-disk edit stays as a best-effort extra, and
the tag uses a relative src so it also works under a base URL.

Bump to 1.0.8.0.
2026-09-18 16:31:45 +02:00
Francois CB 21ca14b780 add 1.0.7.0 to the manifest 2026-09-18 15:48:42 +02:00
Francois CB d88034c988 Don't let a failed index.html backup block the injection
On linuxserver/jellyfin the web folder belongs to root, so copying
index.html to index.html.sharelinks.bak threw even when index.html itself
was writable, and the ShareLink action never got injected. The backup is
best-effort now.

Bump to 1.0.7.0.
2026-09-18 15:48:42 +02:00
Francois CB c365b8859c add 1.0.6.0 to the manifest 2026-09-18 11:56:42 +02:00
Francois Coutau Bégarie 079a1de23e Fix guest sign-in on Jellyfin 12 (#22)
The sign-in page stored the guest's server entry with LastConnectionMode 1
(Remote) but only a ManualAddress. jellyfin-web 12 builds its ApiClient from
that entry, gets no address, throws "Must supply a serverAddress" and never
leaves the splash screen. Store mode 2 (Manual), which is what jellyfin-web
itself writes after a normal sign-in.

Also hide the Modern layout header links, user menu and drawer toggle for
guests (Modern is the default in 12), and close the item action sheet on
desktop when ShareLink opens its popup. Escape only closes it in the TV
layout, a click on the dialog container works everywhere.

Bump to 1.0.6.0.
2026-09-18 11:55:48 +02:00
Francois CB b48f977c22 add 1.0.5.0 to the manifest 2026-09-11 14:50:03 +02:00
Francois Coutau Bégarie f57c1a1955 Keep redemption working on Jellyfin 10.11.9 and later (#20)
Jellyfin 10.11.9 changed IUserManager.ChangePassword to take the user id
instead of the User. A call compiled against either signature throws
MissingMethodException on the other, so look up whichever one the server
has and call it through a delegate. Bumps to 1.0.5.0.
2026-09-11 14:49:55 +02:00
Francois CB 988c5e2b9b Make README wording clearer and more natural 2026-09-07 12:31:02 +02:00
Francois CB 8b14b57793 Correct the screenshot alt text 2026-08-29 22:59:11 +02:00
Francois CB 04d1a04bcb Drop build instructions from the README 2026-08-29 22:49:50 +02:00
Francois CB 06281aeb6d Rewrite the README: threat model, design decisions, tighter wording 2026-08-29 22:49:13 +02:00
Francois CB e2ed426622 Refine README.md for clarity and fix typos
Updated language for clarity and corrected minor typos.
2026-07-27 21:29:05 +02:00
Franciskid 4923746610 add 1.0.4.0 to the manifest 2026-07-27 21:00:56 +02:00
Franciskid 34637f52dc fold the device fix into 1.0.4.0
No point shipping 1.0.5.0 as its own version, neither was ever released.
2026-07-27 20:56:17 +02:00
Francois CB 911ab41b0c delete guest devices on teardown (#18)
Jellyfin does not cascade a user delete to the Device rows redemption
creates, and DeviceManager throws for the whole listing when one device's
user is missing, so a single leftover guest 404s the dashboard devices page.

Deletes the guest's devices before the user, and sweeps devices this plugin
created whose user is already gone at startup for links torn down by older
builds.
2026-07-27 20:56:04 +02:00
Francois CB d1ee74677b Block plugin routes for share guests (#16)
* block plugin routes for share guests

Adds a global MVC filter that refuses share-guest accounts on any plugin
controller. Jellyfin's own API stays open, the share tag policy already
bounds it and playback needs it.

Guests are identified by the auth provider marker on the account, so this
covers a leaked token used from curl or a native client, not just the web
client where the CSS lockdown runs.

* add plugin exception list and honest wording

Config page lists installed plugins with a checkbox each, for the ones that
need to answer guests during playback. Default is unticked.

Renames the hidden selectors setting to say it is cosmetic, and stops the
readme implying the web client lockdown confines anything.

* bump to 1.0.4.0
2026-07-27 20:39:21 +02:00
Francois CB 4c48861506 Revise README for clarity and add workflow images
Updated README to clarify guest session settings and added workflow steps with images.
2026-07-27 20:01:16 +02:00
Francois CB 98065fe170 Add new images to README 2026-07-27 19:30:44 +02:00
Franciskid cf297f121e update the 1.0.3.0 manifest entry for the season share fix 2026-07-27 00:36:10 +02:00
Francois CB 917b80fe50 Merge pull request #14 from Franciskid/fix/season-share-leaks-whole-series
Stop a shared season handing over the rest of the series
2026-07-27 00:35:25 +02:00
Franciskid ad17b17ab4 stop a shared season handing over the rest of the series
Sharing one season let the guest see every season of that show. Sharing a whole
series or a single episode was fine, which is what made it look like a season
specific problem.

The cause is that the tag went upwards as well as downwards. BuildTagTreeTargets
added a season's parent series, so the guest's tag landed on the series itself,
and Jellyfin's GetInheritedTags is an item's own tags plus every ancestor's, with
AllowedTags matched against that. Tagging the series therefore made every other
season and episode under it inherit the tag and become visible. Sharing a series
looked correct because the whole show is meant to be visible, and sharing an
episode looked correct because nothing above it was ever tagged.

Tagging now only ever goes down: the shared item, and its descendants when it is a
folder. A guest sent one season gets that season and its episodes, and the series
page is not theirs to open, which is what sharing a season should mean.

Removal deliberately still reaches up to the parent series. Links created by
earlier builds put the tag there, and taking a tag off can only remove access, so
those get cleaned up when the link expires or is revoked instead of being stranded
on the series forever.
2026-07-27 00:34:55 +02:00
Francois CB a811095784 Update ShareLink expiry and image dimensions
Updated the expiry duration for ShareLink from 30 days to 7 days and changed the image dimensions in the README.
2026-07-27 00:16:37 +02:00
Francois CB bedd7bf36a Update README with new image and text corrections
Updated image source and fixed minor text formatting issues.
2026-07-26 23:52:47 +02:00
Franciskid ddc21f292d fold 1.0.3.1 back into 1.0.3.0 in the manifest 2026-07-26 23:08:04 +02:00
Francois CB 3ed982b893 Merge pull request #12 from Franciskid/feature/cleanup-finished-links
Add a button to clear out finished share links, and fold 1.0.3.1 back into 1.0.3.0
2026-07-26 23:06:40 +02:00
Franciskid 4ad6d5b1ed add a button to clear out finished share links
The dashboard listed every share ever made, including ones revoked or expired
months ago, and nothing ever pruned them. There is now a "Clean up finished links"
button next to Refresh that runs a normal cleanup pass and then drops the records
that are done with, reporting how many went.

Only revoked, expired and failed records are removed. A link that can still be
used is left alone, including a spent one-use link whose guest is still watching
until it expires, since that record is Redeemed rather than finished.

Folded into 1.0.3.0 rather than shipped as 1.0.3.1: the ceiling fix and this are
going out as one replacement of that version.
2026-07-26 23:04:51 +02:00
Franciskid 34ed2c8ad9 add 1.0.3.1 to the plugin manifest 2026-07-26 21:49:48 +02:00
Francois CB 2f91845f7e Merge pull request #11 from Franciskid/fix/viewer-ceiling-refusal
Refuse an over-the-ceiling viewer without destroying the link
2026-07-26 21:48:41 +02:00
Franciskid 01e2235c02 refuse an over-the-ceiling viewer without destroying the link
The ceiling shipped in 1.0.3.0 did the opposite of its job. Jellyfin throws
MediaBrowser.Controller.Net.SecurityException when a user is at their session
limit, and the catch that was meant to handle it named System.Security's type of
the same name, so it never matched. The exception fell through to the failure
path, which marks the record failed and runs cleanup, which deletes the guest
account. Live result with the ceiling at 3: the fourth viewer got a dead-link
page, the three already watching were kicked out, and the link was gone.

Rather than swap one exception type for another and trust it, the over-the-ceiling
viewer is now turned away before anything is written at all: no tag work, no
status change, the guest account untouched. The check mirrors what Jellyfin does
when it creates a session, counting sessions for the guest against the ceiling.
The typed catch stays as a backstop for the race between the check and the call,
and it now names the right type.

A link that has never been redeemed has no guest yet, so it can never be at a
ceiling, and 0 still means no limit.
2026-07-26 21:45:48 +02:00
Franciskid fd1e4a8d3c add 1.0.3.0 to the plugin manifest 2026-07-26 21:30:33 +02:00
Francois CB 111bede362 Merge pull request #10 from Franciskid/feature/multi-use-links
Let a link be used by several people instead of dying on first open
2026-07-26 21:29:25 +02:00
Franciskid 224a79f7e5 cap how many people can watch one multi-use link at once
New setting, ten by default, zero for no limit. Single-use links are unaffected,
they are one viewer by definition.

The catch is what happens at the ceiling. Jellyfin throws SecurityException once a
user is at MaxActiveSessions, and that was landing in the generic handler, which
marks the record failed and runs cleanup, which deletes the guest account. So
without care, adding a ceiling would mean the eleventh person to open a link kicks
out the ten already watching and destroys the link. Capacity is caught separately
now: the record goes back to the state it was in, nothing is torn down, and the
new arrival gets a 503 page inviting them to try again.

Worth being honest that this caps how many people can start watching at once, not
how many ever get in: each redemption issues its own session token that keeps
working until the link is revoked or expires. Revoke is still the hard stop.

README picks up the multi-use option, the new setting, and a section on what a
multi-use link does and does not protect, plus the known limits around the token
in the query string, the unthrottled redeem endpoint, and the tag being hidden in
the web UI only.
2026-07-26 21:22:20 +02:00
Franciskid f0b9e8351b let a link be used by several people instead of dying on first open
The create popup now has a "Let several people use this link" box next to the
expiry controls. Tick it and the link stays redeemable by everyone you send it to
until it expires; leave it and you get the old behaviour, where the first person
to open it is the only one who gets in. The plugin setting that used to be the
only control is now just what the box starts out as, and its label on the config
page says so, because "Default one-use links" explained nothing.

Multi-use did not actually work before this. Two things in Jellyfin stopped it,
and both had to change:

Guests were given MaxActiveSessions = 1, and AuthenticateNewSessionInternal throws
SecurityException once a user is at that limit. The second viewer's redemption
would fail, the record would go to Failed, and cleanup would then delete the guest
account, kicking the first viewer out too. Multi-use links now get 0, which is how
Jellyfin spells "no limit" in that check.

The device id was generated once and reused for every redemption, and
GetAuthorizationToken logs out every existing session for the same user and device
before issuing a token. So even under a raised session cap, each new viewer would
have revoked the previous one's token. Multi-use links now mint a device id per
redemption.

Both viewers of a multi-use link share one temporary account, so they also share
playback position and watched state on the shared title.
2026-07-26 21:05:54 +02:00
Franciskid ca0ab96ee9 add 1.0.2.0 to the plugin manifest 2026-07-26 20:46:18 +02:00
Francois CB e419cbbce4 Merge pull request #9 from Franciskid/security/harden-redemption-and-expiry
Harden redemption, expiry limits, token storage and guest sign-in
2026-07-26 20:44:42 +02:00
Francois CB b9f57e24aa Merge pull request #8 from Franciskid/fix/hide-share-tags-from-non-admins
Keep the share tag out of the UI for everyone except admins
2026-07-26 20:44:11 +02:00