Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 203 additions & 0 deletions jellyseerr-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,41 @@ components:
enableSpecialEpisodes:
type: boolean
example: false
OidcProvider:
type: object
properties:
slug:
type: string
readOnly: true
name:
type: string
issuerUrl:
type: string
clientId:
type: string
clientSecret:
type: string
logo:
type: string
requiredClaims:
type: string
scopes:
type: string
newUserLogin:
type: boolean
required:
- slug
- name
- issuerUrl
- clientId
- clientSecret
OidcSettings:
type: object
properties:
providers:
type: array
items:
$ref: '#/components/schemas/OidcProvider'
NetworkSettings:
type: object
properties:
Expand Down Expand Up @@ -2045,6 +2080,64 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/MainSettings'
/settings/oidc:
get:
summary: Get OpenID Connect settings
description: Retrieves all OpenID Connect settings in a JSON object.
tags:
- settings
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/OidcSettings'
/settings/oidc/{provider}:
put:
summary: Update OpenID Connect provider
description: Updates an existing OpenID Connect provider with the provided values.
tags:
- settings
parameters:
- in: path
name: provider
required: true
schema:
type: string
description: Provider slug
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OidcProvider'
responses:
'200':
description: 'Radarr instance updated'
content:
application/json:
schema:
$ref: '#/components/schemas/RadarrSettings'
delete:
summary: Delete OpenID Connect provider
description: Deletes an existing OpenID Connect provider based on the provider slug parameter.
tags:
- settings
parameters:
- in: path
name: provider
required: true
schema:
type: string
description: Provider slug
responses:
'200':
description: 'OpenID Connect provider deleted'
content:
application/json:
schema:
$ref: '#/components/schemas/OidcSettings'
/settings/network:
get:
summary: Get network settings
Expand Down Expand Up @@ -3700,6 +3793,77 @@ paths:
required:
- email
- password
/auth/oidc/login/{slug}:
get:
security: []
summary: Redirect to the OpenID Connect provider
description: Constructs the redirect URL to the OpenID Connect provider, and redirects the user to it.
tags:
- auth
parameters:
- in: path
name: slug
required: true
schema:
type: string
example: 'authentik'
responses:
'302':
description: Redirect to the authentication url for the OpenID Connect provider
headers:
Location:
schema:
type: string
example: https://example.com/auth/oidc/callback?response_type=code&client_id=client_id&redirect_uri=https%3A%2F%2Fexample.com%2Fauth%2Foidc%2Fcallback&scope=openid%20email&state=state
Set-Cookie:
schema:
type: string
example: 'oidc-state=123456789; HttpOnly; max-age=60000; Secure'
/auth/oidc/callback/{slug}:
get:
security: []
summary: The callback endpoint for the OpenID Connect provider redirect
description: Takes the `code` and `state` parameters from the OpenID Connect provider, and exchanges them for a token.
x-allow-unknown-query-parameters: true
tags:
- auth
parameters:
- in: path
name: slug
required: true
schema:
type: string
example: 'authentik'
- in: query
name: code
required: true
schema:
type: string
example: '123456789'
- in: query
name: state
required: true
schema:
type: string
example: '123456789'
- in: cookie
name: oidc-state
required: true
schema:
type: string
example: '123456789'
responses:
'302':
description: A redirect to the home page if successful or back to the login page if not
headers:
Location:
schema:
type: string
example: /
Set-Cookie:
schema:
type: string
example: 'oidc-state=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT'
/auth/logout:
post:
summary: Sign out and clear session cookie
Expand Down Expand Up @@ -4509,6 +4673,23 @@ paths:
responses:
'204':
description: User password updated
/user/{userId}/settings/linked-accounts:
get:
summary: Lists the user's linked OpenID Connect accounts
description: Lists the user's linked OpenID Connect accounts
tags:
- users
parameters:
- in: path
name: userId
required: true
schema:
type: number
responses:
'200':
description: List of linked accounts
'403':
description: Invalid credentials
/user/{userId}/settings/linked-accounts/plex:
post:
summary: Link the provided Plex account to the current user
Expand Down Expand Up @@ -4607,6 +4788,28 @@ paths:
description: Unlink request invalid
'404':
description: User does not exist
/user/{userId}/settings/linked-accounts/{acctId}:
delete:
summary: Remove a linked account for a user
description: Removes the linked account with the given ID for a specific user. Requires `MANAGE_USERS` permission if editing other users.
tags:
- users
parameters:
- in: path
name: userId
required: true
schema:
type: number
- in: path
name: acctId
required: true
schema:
type: number
responses:
'204':
description: Unlinking account succeeded
'404':
description: User or linked account does not exist
/user/{userId}/settings/notifications:
get:
summary: Get notification settings for a user
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
"express-session": "1.17.3",
"formik": "^2.4.6",
"gravatar-url": "3.1.0",
"jwt-decode": "^4.0.0",
"lodash": "4.17.21",
"mime": "3",
"next": "^14.2.25",
Expand Down
9 changes: 9 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions public/images/openid.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 27 additions & 0 deletions server/entity/LinkedAccount.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { User } from './User';

@Entity('linked_accounts')
export class LinkedAccount {
constructor(options: Omit<LinkedAccount, 'id'>) {
Object.assign(this, options);
}

@PrimaryGeneratedColumn()
id: number;

@ManyToOne(() => User, (user) => user.linkedAccounts, { onDelete: 'CASCADE' })
user: User;

/** Slug of the OIDC provider. */
@Column({ type: 'varchar', length: 255 })
provider: string;

/** Unique ID from the OAuth provider */
@Column({ type: 'varchar', length: 255 })
sub: string;

/** Account username from the OAuth provider */
@Column()
username: string;
}
4 changes: 4 additions & 0 deletions server/entity/User.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { MediaRequestStatus, MediaType } from '@server/constants/media';
import { UserType } from '@server/constants/user';
import { getRepository } from '@server/datasource';
import { LinkedAccount } from '@server/entity/LinkedAccount';
import { Watchlist } from '@server/entity/Watchlist';
import type { QuotaResponse } from '@server/interfaces/api/userInterfaces';
import PreparedEmail from '@server/lib/email';
Expand Down Expand Up @@ -92,6 +93,9 @@ export class User {
@Column({ type: 'varchar', nullable: true, select: false })
public plexToken?: string | null;

@OneToMany(() => LinkedAccount, (link) => link.user)
public linkedAccounts: LinkedAccount[];

@Column({ type: 'integer', default: 0 })
public permissions = 0;

Expand Down
Loading