]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/server-commands/users/login-command.ts
Merge branch 'release/4.1.0' into develop
[github/Chocobozzz/PeerTube.git] / shared / server-commands / users / login-command.ts
CommitLineData
4c7e60bc 1import { HttpStatusCode, PeerTubeProblemDocument } from '@shared/models'
41d1d075
C
2import { unwrapBody } from '../requests'
3import { AbstractCommand, OverrideCommandOptions } from '../shared'
4
5export class LoginCommand extends AbstractCommand {
6
7 login (options: OverrideCommandOptions & {
8 client?: { id?: string, secret?: string }
7926c5f9 9 user?: { username: string, password?: string }
41d1d075 10 } = {}) {
89d241a7 11 const { client = this.server.store.client, user = this.server.store.user } = options
41d1d075
C
12 const path = '/api/v1/users/token'
13
14 const body = {
15 client_id: client.id,
16 client_secret: client.secret,
17 username: user.username,
7926c5f9 18 password: user.password ?? 'password',
41d1d075
C
19 response_type: 'code',
20 grant_type: 'password',
21 scope: 'upload'
22 }
23
24 return unwrapBody<{ access_token: string, refresh_token: string } & PeerTubeProblemDocument>(this.postBodyRequest({
25 ...options,
26
27 path,
c0e8b12e 28 requestType: 'form',
41d1d075
C
29 fields: body,
30 implicitToken: false,
31 defaultExpectedStatus: HttpStatusCode.OK_200
32 }))
33 }
34
7926c5f9
C
35 getAccessToken (arg1?: { username: string, password?: string }): Promise<string>
36 getAccessToken (arg1: string, password?: string): Promise<string>
37 async getAccessToken (arg1?: { username: string, password?: string } | string, password?: string) {
38 let user: { username: string, password?: string }
41d1d075 39
89d241a7 40 if (!arg1) user = this.server.store.user
41d1d075
C
41 else if (typeof arg1 === 'object') user = arg1
42 else user = { username: arg1, password }
43
44 try {
45 const body = await this.login({ user })
46
47 return body.access_token
48 } catch (err) {
d0a0fa42 49 throw new Error(`Cannot authenticate. Please check your username/password. (${err})`)
41d1d075
C
50 }
51 }
52
53 loginUsingExternalToken (options: OverrideCommandOptions & {
54 username: string
55 externalAuthToken: string
56 }) {
57 const { username, externalAuthToken } = options
58 const path = '/api/v1/users/token'
59
60 const body = {
89d241a7
C
61 client_id: this.server.store.client.id,
62 client_secret: this.server.store.client.secret,
41d1d075
C
63 username: username,
64 response_type: 'code',
65 grant_type: 'password',
66 scope: 'upload',
67 externalAuthToken
68 }
69
70 return this.postBodyRequest({
71 ...options,
72
73 path,
c0e8b12e 74 requestType: 'form',
41d1d075
C
75 fields: body,
76 implicitToken: false,
77 defaultExpectedStatus: HttpStatusCode.OK_200
78 })
79 }
80
81 logout (options: OverrideCommandOptions & {
82 token: string
83 }) {
84 const path = '/api/v1/users/revoke-token'
85
86 return unwrapBody<{ redirectUrl: string }>(this.postBodyRequest({
87 ...options,
88
89 path,
c0e8b12e 90 requestType: 'form',
41d1d075
C
91 implicitToken: false,
92 defaultExpectedStatus: HttpStatusCode.OK_200
93 }))
94 }
95
96 refreshToken (options: OverrideCommandOptions & {
97 refreshToken: string
98 }) {
99 const path = '/api/v1/users/token'
100
101 const body = {
89d241a7
C
102 client_id: this.server.store.client.id,
103 client_secret: this.server.store.client.secret,
41d1d075
C
104 refresh_token: options.refreshToken,
105 response_type: 'code',
106 grant_type: 'refresh_token'
107 }
108
109 return this.postBodyRequest({
110 ...options,
111
112 path,
c0e8b12e 113 requestType: 'form',
41d1d075
C
114 fields: body,
115 implicitToken: false,
116 defaultExpectedStatus: HttpStatusCode.OK_200
117 })
118 }
119
120 getClient (options: OverrideCommandOptions = {}) {
121 const path = '/api/v1/oauth-clients/local'
122
123 return this.getRequestBody<{ client_id: string, client_secret: string }>({
124 ...options,
125
126 path,
127 host: this.server.host,
128 implicitToken: false,
129 defaultExpectedStatus: HttpStatusCode.OK_200
130 })
131 }
132}