Skip to content

Commit 30dbd05

Browse files
feat: add openid connect settings interface
1 parent 4c62deb commit 30dbd05

File tree

9 files changed

+818
-14
lines changed

9 files changed

+818
-14
lines changed

jellyseerr-api.yml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,41 @@ components:
185185
enableSpecialEpisodes:
186186
type: boolean
187187
example: false
188+
OidcProvider:
189+
type: object
190+
properties:
191+
slug:
192+
type: string
193+
readOnly: true
194+
name:
195+
type: string
196+
issuerUrl:
197+
type: string
198+
clientId:
199+
type: string
200+
clientSecret:
201+
type: string
202+
logo:
203+
type: string
204+
requiredClaims:
205+
type: string
206+
scopes:
207+
type: string
208+
newUserLogin:
209+
type: boolean
210+
required:
211+
- slug
212+
- name
213+
- issuerUrl
214+
- clientId
215+
- clientSecret
216+
OidcSettings:
217+
type: object
218+
properties:
219+
providers:
220+
type: array
221+
items:
222+
$ref: '#/components/schemas/OidcProvider'
188223
NetworkSettings:
189224
type: object
190225
properties:
@@ -2045,6 +2080,64 @@ paths:
20452080
application/json:
20462081
schema:
20472082
$ref: '#/components/schemas/MainSettings'
2083+
/settings/oidc:
2084+
get:
2085+
summary: Get OpenID Connect settings
2086+
description: Retrieves all OpenID Connect settings in a JSON object.
2087+
tags:
2088+
- settings
2089+
responses:
2090+
'200':
2091+
description: OK
2092+
content:
2093+
application/json:
2094+
schema:
2095+
$ref: '#/components/schemas/OidcSettings'
2096+
/settings/oidc/{provider}:
2097+
put:
2098+
summary: Update OpenID Connect provider
2099+
description: Updates an existing OpenID Connect provider with the provided values.
2100+
tags:
2101+
- settings
2102+
parameters:
2103+
- in: path
2104+
name: provider
2105+
required: true
2106+
schema:
2107+
type: string
2108+
description: Provider slug
2109+
requestBody:
2110+
required: true
2111+
content:
2112+
application/json:
2113+
schema:
2114+
$ref: '#/components/schemas/OidcProvider'
2115+
responses:
2116+
'200':
2117+
description: 'Radarr instance updated'
2118+
content:
2119+
application/json:
2120+
schema:
2121+
$ref: '#/components/schemas/RadarrSettings'
2122+
delete:
2123+
summary: Delete OpenID Connect provider
2124+
description: Deletes an existing OpenID Connect provider based on the provider slug parameter.
2125+
tags:
2126+
- settings
2127+
parameters:
2128+
- in: path
2129+
name: provider
2130+
required: true
2131+
schema:
2132+
type: string
2133+
description: Provider slug
2134+
responses:
2135+
'200':
2136+
description: 'OpenID Connect provider deleted'
2137+
content:
2138+
application/json:
2139+
schema:
2140+
$ref: '#/components/schemas/OidcSettings'
20482141
/settings/network:
20492142
get:
20502143
summary: Get network settings

public/images/openid.svg

Lines changed: 57 additions & 0 deletions
Loading

server/routes/settings/index.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,45 @@ settingsRoutes.post('/main/regenerate', async (req, res, next) => {
105105
return res.status(200).json(filteredMainSettings(req.user, main));
106106
});
107107

108+
settingsRoutes.get('/oidc', async (req, res) => {
109+
const settings = getSettings();
110+
111+
return res.status(200).json(settings.oidc);
112+
});
113+
114+
settingsRoutes.put('/oidc/:slug', async (req, res) => {
115+
const settings = getSettings();
116+
let provider = settings.oidc.providers.findIndex(
117+
(p) => p.slug === req.params.slug
118+
);
119+
120+
if (provider !== -1) {
121+
Object.assign(settings.oidc.providers[provider], req.body);
122+
} else {
123+
settings.oidc.providers.push({ slug: req.params.slug, ...req.body });
124+
provider = settings.oidc.providers.length - 1;
125+
}
126+
127+
await settings.save();
128+
129+
return res.status(200).json(settings.oidc.providers[provider]);
130+
});
131+
132+
settingsRoutes.delete('/oidc/:slug', async (req, res) => {
133+
const settings = getSettings();
134+
const provider = settings.oidc.providers.findIndex(
135+
(p) => p.slug === req.params.slug
136+
);
137+
138+
if (provider === -1)
139+
return res.status(404).json({ message: 'Provider not found' });
140+
141+
settings.oidc.providers.splice(provider, 1);
142+
await settings.save();
143+
144+
return res.status(200).json(settings.oidc);
145+
});
146+
108147
settingsRoutes.get('/plex', (_req, res) => {
109148
const settings = getSettings();
110149

src/components/Common/LabeledCheckbox/index.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
import { Field } from 'formik';
2+
import { useId } from 'react';
23
import { twMerge } from 'tailwind-merge';
34

45
interface LabeledCheckboxProps {
5-
id: string;
6+
name: string;
67
className?: string;
78
label: string;
89
description: string;
9-
onChange: () => void;
10+
onChange?: () => void;
1011
children?: React.ReactNode;
1112
}
1213

1314
const LabeledCheckbox: React.FC<LabeledCheckboxProps> = ({
14-
id,
15+
name,
1516
className,
1617
label,
1718
description,
1819
onChange,
1920
children,
2021
}) => {
22+
const id = useId();
23+
2124
return (
2225
<>
2326
<div className={twMerge('relative flex items-start', className)}>
2427
<div className="flex h-6 items-center">
25-
<Field type="checkbox" id={id} name={id} onChange={onChange} />
28+
<Field type="checkbox" id={id} name={name} onChange={onChange} />
2629
</div>
2730
<div className="ml-3 text-sm leading-6">
28-
<label htmlFor="localLogin" className="block">
31+
<label htmlFor={id} className="block">
2932
<div className="flex flex-col">
3033
<span className="font-medium text-white">{label}</span>
3134
<span className="font-normal text-gray-400">{description}</span>

0 commit comments

Comments
 (0)