Compare commits

..

33 Commits

Author SHA1 Message Date
0xsysr3ll
e5c95e00b9 fix(webpush): simplify condition for enabling push notifications
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
4b4272dc10 fix(webpush): set push notification status only if not previously set
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
609082c7b3 fix(webpush): rework web push notification status verification logic
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
39e6115467 fix(webpush): ensure the old endpoint is cleared only when necessary
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
85bca35f98 feat(push-subscription): add unique constraint on endpoint and userId
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
48bebaf727 fix(webpush): only remove the current browser's subscription
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
91d202fcca fix(webpush): remove error throw
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
6d3db3d596 fix(webpush): ensure the local storage reflects the correct notification status
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
d60b75adf4 refactor(webpush): remove redundant checks
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
af75e717f4 refactor(webpush): remove redundant try-catch
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
306582e87f fix(webpush): throw error after notification failure
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
7ff0a8c040 fix(webpush): notification must reflect the actual outcome
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
be5bdc9975 fix(webpush): remove backend checks
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
20d53a6a3e fix(webpush): delete push subscriptions for multiple devices
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
1fb296d64b fix(webpush): remove redundant backend subscription checks
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
9263f2f4b5 fix(webpush): remove unnecessary dependency for user ID verification
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
3d1083279c fix(webpush): update localStorage handling for push notification status
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
337882515f fix(webpush): update existing subscriptions with new keys only if the endpoint matches and the auth differs
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
431fa6ba98 fix(webpush): remove the redundant userId check
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
002b769f3f fix(webpush): add user ID validation to push subscription verification
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
a8307e9118 refactor(webpush): Remove nested error checks
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
0de2ed2086 fix(webpush): add backend subscription check to determine if a valid push subscription exists.
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
7fabd0b1c0 fix(webpush): store push notification status in localStorage
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
37cc665706 fix(webpush): use transaction for race condition prevention
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
2fb742e2a3 fix(webpush): preserve original creation timestamp when updating subscriptions
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
2822240d0f fix(webpush): cleanup is too agressive - avoid removing active subscriptions
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
d79a91e556 fix(webpush): clean up stale push subscriptions for the same device
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
bc5d441047 fix(webpush): update existing subscriptions with new keys
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
b560e50d85 fix(webpush): add logs for AggregateError error
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
381d82488e fix(webpush): improve push notification error handling
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
0xsysr3ll
3f899f5e76 fix(webpush): improve iOS push subscription endpoint cleanup
Signed-off-by: 0xsysr3ll <0xsysr3ll@pm.me>
2025-12-17 18:18:36 +01:00
fallenbagel
3ee69663dc fix(local-login): remove automatic plex linking and reduce logout log verbosity (#2225)
Removed redundant Plex user discovery logic that applies to all media servers currently. This is now
handled explicitly via linked accounts settings page. Also changed the successful logout log level
from info to debug since its routine behaviour
2025-12-15 19:44:43 +08:00
Ludovic Ortega
539d49879d chore: fix translate badge svg url (#2228)
* chore: fix translate badge svg url

Signed-off-by: Ludovic Ortega <ludovic.ortega@adminafk.fr>

* fix: use https instead of http

Signed-off-by: Ludovic Ortega <ludovic.ortega@adminafk.fr>

---------

Signed-off-by: Ludovic Ortega <ludovic.ortega@adminafk.fr>
2025-12-14 05:37:36 +08:00
3 changed files with 9 additions and 77 deletions

View File

@@ -8,7 +8,7 @@
<p align="center">
<a href="https://discord.gg/seerr"><img src="https://img.shields.io/discord/783137440809746482" alt="Discord"></a>
<a href="https://hub.docker.com/r/seerr/seerr"><img src="https://img.shields.io/docker/pulls/seerr/seerr" alt="Docker pulls"></a>
<a href="https://translate.seerr.dev/engage/seerr/"><img src="https://translate.seerr.dev/widget/seerr/seerr-frontend/svg-badge.svg" alt="Translation status" /></a>
<a href="https://translate.seerr.dev/engage/seerr/"><img src="https://translate.seerr.dev/widget/seerr/svg-badge.svg" alt="Translation status" /></a>
<a href="https://github.com/seerr-team/seerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/seerr-team/seerr"></a>
**Seerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.

View File

@@ -626,76 +626,6 @@ authRoutes.post('/local', async (req, res, next) => {
});
}
const mainUser = await userRepository.findOneOrFail({
select: { id: true, plexToken: true, plexId: true },
where: { id: 1 },
});
const mainPlexTv = new PlexTvAPI(mainUser.plexToken ?? '');
if (!user.plexId) {
try {
const plexUsersResponse = await mainPlexTv.getUsers();
const account = plexUsersResponse.MediaContainer.User.find(
(account) =>
account.$.email &&
account.$.email.toLowerCase() === user.email.toLowerCase()
)?.$;
if (
account &&
(await mainPlexTv.checkUserAccess(parseInt(account.id)))
) {
logger.info(
'Found matching Plex user; updating user with Plex data',
{
label: 'API',
ip: req.ip,
email: body.email,
userId: user.id,
plexId: account.id,
plexUsername: account.username,
}
);
user.plexId = parseInt(account.id);
user.avatar = account.thumb;
user.email = account.email;
user.plexUsername = account.username;
user.userType = UserType.PLEX;
await userRepository.save(user);
}
} catch (e) {
logger.error('Something went wrong fetching Plex users', {
label: 'API',
errorMessage: e.message,
});
}
}
if (
user.plexId &&
user.plexId !== mainUser.plexId &&
!(await mainPlexTv.checkUserAccess(user.plexId))
) {
logger.warn(
'Failed sign-in attempt from Plex user without access to the media server',
{
label: 'API',
account: {
ip: req.ip,
email: body.email,
userId: user.id,
plexId: user.plexId,
},
}
);
return next({
status: 403,
message: 'Access denied.',
});
}
// Set logged in session
if (user && req.session) {
req.session.userId = user.id;
@@ -775,7 +705,7 @@ authRoutes.post('/logout', async (req, res, next) => {
});
return next({ status: 500, message: 'Failed to destroy session.' });
}
logger.info('Successfully logged out user', {
logger.debug('Successfully logged out user', {
label: 'Auth',
userId,
});

View File

@@ -185,16 +185,18 @@ const UserWebPushSettings = () => {
(device) => device.userAgent === currentUserAgent
);
if (hasMatchingDevice || dataDevices.length === 1) {
if (hasMatchingDevice) {
isEnabled = true;
}
}
setWebPushEnabled(isEnabled);
localStorage.setItem(
'pushNotificationsEnabled',
isEnabled ? 'true' : 'false'
);
if (localStorage.getItem('pushNotificationsEnabled') === null) {
localStorage.setItem(
'pushNotificationsEnabled',
isEnabled ? 'true' : 'false'
);
}
};
if (user?.id) {