mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix(frontend): only allow 'request as' users w/ request perms (#2991)
This commit is contained in:
@@ -11,8 +11,9 @@ import type {
|
|||||||
ServiceCommonServerWithDetails,
|
ServiceCommonServerWithDetails,
|
||||||
} from '@server/interfaces/api/serviceInterfaces';
|
} from '@server/interfaces/api/serviceInterfaces';
|
||||||
import type { UserResultsResponse } from '@server/interfaces/api/userInterfaces';
|
import type { UserResultsResponse } from '@server/interfaces/api/userInterfaces';
|
||||||
|
import { hasPermission } from '@server/lib/permissions';
|
||||||
import { isEqual } from 'lodash';
|
import { isEqual } from 'lodash';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import { defineMessages, useIntl } from 'react-intl';
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
import Select from 'react-select';
|
import Select from 'react-select';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
@@ -64,7 +65,7 @@ const AdvancedRequester = ({
|
|||||||
onChange,
|
onChange,
|
||||||
}: AdvancedRequesterProps) => {
|
}: AdvancedRequesterProps) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const { user, hasPermission } = useUser();
|
const { user: currentUser, hasPermission: currentHasPermission } = useUser();
|
||||||
const { data, error } = useSWR<ServiceCommonServer[]>(
|
const { data, error } = useSWR<ServiceCommonServer[]>(
|
||||||
`/api/v1/service/${type === 'movie' ? 'radarr' : 'sonarr'}`,
|
`/api/v1/service/${type === 'movie' ? 'radarr' : 'sonarr'}`,
|
||||||
{
|
{
|
||||||
@@ -113,16 +114,41 @@ const AdvancedRequester = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const { data: userData } = useSWR<UserResultsResponse>(
|
const { data: userData } = useSWR<UserResultsResponse>(
|
||||||
hasPermission([Permission.MANAGE_REQUESTS, Permission.MANAGE_USERS])
|
currentHasPermission([Permission.MANAGE_REQUESTS, Permission.MANAGE_USERS])
|
||||||
? '/api/v1/user?take=1000&sort=displayname'
|
? '/api/v1/user?take=1000&sort=displayname'
|
||||||
: null
|
: null
|
||||||
);
|
);
|
||||||
|
const filteredUserData = useMemo(
|
||||||
|
() =>
|
||||||
|
userData?.results.filter((user) =>
|
||||||
|
hasPermission(
|
||||||
|
is4k
|
||||||
|
? [
|
||||||
|
Permission.REQUEST_4K,
|
||||||
|
type === 'movie'
|
||||||
|
? Permission.REQUEST_4K_MOVIE
|
||||||
|
: Permission.REQUEST_4K_TV,
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
Permission.REQUEST,
|
||||||
|
type === 'movie'
|
||||||
|
? Permission.REQUEST_MOVIE
|
||||||
|
: Permission.REQUEST_TV,
|
||||||
|
],
|
||||||
|
user.permissions,
|
||||||
|
{ type: 'or' }
|
||||||
|
)
|
||||||
|
),
|
||||||
|
[userData?.results]
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (userData?.results && !requestUser) {
|
if (filteredUserData && !requestUser) {
|
||||||
setSelectedUser(userData.results.find((u) => u.id === user?.id) ?? null);
|
setSelectedUser(
|
||||||
|
filteredUserData.find((u) => u.id === currentUser?.id) ?? null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}, [userData?.results]);
|
}, [filteredUserData]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let defaultServer = data?.find(
|
let defaultServer = data?.find(
|
||||||
@@ -273,7 +299,7 @@ const AdvancedRequester = ({
|
|||||||
serverData.rootFolders.length < 2 &&
|
serverData.rootFolders.length < 2 &&
|
||||||
(serverData.languageProfiles ?? []).length < 2 &&
|
(serverData.languageProfiles ?? []).length < 2 &&
|
||||||
!serverData.tags?.length)))) &&
|
!serverData.tags?.length)))) &&
|
||||||
(!selectedUser || (userData?.results ?? []).length < 2)
|
(!selectedUser || (filteredUserData ?? []).length < 2)
|
||||||
) {
|
) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -512,9 +538,12 @@ const AdvancedRequester = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{hasPermission([Permission.MANAGE_REQUESTS, Permission.MANAGE_USERS]) &&
|
{currentHasPermission([
|
||||||
|
Permission.MANAGE_REQUESTS,
|
||||||
|
Permission.MANAGE_USERS,
|
||||||
|
]) &&
|
||||||
selectedUser &&
|
selectedUser &&
|
||||||
(userData?.results ?? []).length > 1 && (
|
(filteredUserData ?? []).length > 1 && (
|
||||||
<Listbox
|
<Listbox
|
||||||
as="div"
|
as="div"
|
||||||
value={selectedUser}
|
value={selectedUser}
|
||||||
@@ -565,7 +594,7 @@ const AdvancedRequester = ({
|
|||||||
static
|
static
|
||||||
className="shadow-xs max-h-60 overflow-auto rounded-md py-1 text-base leading-6 focus:outline-none sm:text-sm sm:leading-5"
|
className="shadow-xs max-h-60 overflow-auto rounded-md py-1 text-base leading-6 focus:outline-none sm:text-sm sm:leading-5"
|
||||||
>
|
>
|
||||||
{userData?.results.map((user) => (
|
{filteredUserData?.map((user) => (
|
||||||
<Listbox.Option key={user.id} value={user}>
|
<Listbox.Option key={user.id} value={user}>
|
||||||
{({ selected, active }) => (
|
{({ selected, active }) => (
|
||||||
<div
|
<div
|
||||||
|
Reference in New Issue
Block a user