diff options
Diffstat (limited to 'server/lib')
-rw-r--r-- | server/lib/auth.ts | 4 | ||||
-rw-r--r-- | server/lib/oauth-model.ts | 10 | ||||
-rw-r--r-- | server/lib/plugins/plugin-manager.ts | 12 |
3 files changed, 18 insertions, 8 deletions
diff --git a/server/lib/auth.ts b/server/lib/auth.ts index 3f8e18633..acf0da18a 100644 --- a/server/lib/auth.ts +++ b/server/lib/auth.ts | |||
@@ -52,7 +52,7 @@ async function handleTokenRevocation (req: express.Request, res: express.Respons | |||
52 | const token = res.locals.oauth.token | 52 | const token = res.locals.oauth.token |
53 | 53 | ||
54 | res.locals.explicitLogout = true | 54 | res.locals.explicitLogout = true |
55 | await revokeToken(token) | 55 | const result = await revokeToken(token) |
56 | 56 | ||
57 | // FIXME: uncomment when https://github.com/oauthjs/node-oauth2-server/pull/289 is released | 57 | // FIXME: uncomment when https://github.com/oauthjs/node-oauth2-server/pull/289 is released |
58 | // oAuthServer.revoke(req, res, err => { | 58 | // oAuthServer.revoke(req, res, err => { |
@@ -68,7 +68,7 @@ async function handleTokenRevocation (req: express.Request, res: express.Respons | |||
68 | // } | 68 | // } |
69 | // }) | 69 | // }) |
70 | 70 | ||
71 | return res.json() | 71 | return res.json(result) |
72 | } | 72 | } |
73 | 73 | ||
74 | async function onExternalUserAuthenticated (options: { | 74 | async function onExternalUserAuthenticated (options: { |
diff --git a/server/lib/oauth-model.ts b/server/lib/oauth-model.ts index 3273c6c2d..f7ea98b41 100644 --- a/server/lib/oauth-model.ts +++ b/server/lib/oauth-model.ts | |||
@@ -141,13 +141,15 @@ async function getUser (usernameOrEmail?: string, password?: string) { | |||
141 | return user | 141 | return user |
142 | } | 142 | } |
143 | 143 | ||
144 | async function revokeToken (tokenInfo: { refreshToken: string }) { | 144 | async function revokeToken (tokenInfo: { refreshToken: string }): Promise<{ success: boolean, redirectUrl?: string }> { |
145 | const res: express.Response = this.request.res | 145 | const res: express.Response = this.request.res |
146 | const token = await OAuthTokenModel.getByRefreshTokenAndPopulateUser(tokenInfo.refreshToken) | 146 | const token = await OAuthTokenModel.getByRefreshTokenAndPopulateUser(tokenInfo.refreshToken) |
147 | 147 | ||
148 | if (token) { | 148 | if (token) { |
149 | let redirectUrl: string | ||
150 | |||
149 | if (res.locals.explicitLogout === true && token.User.pluginAuth && token.authName) { | 151 | if (res.locals.explicitLogout === true && token.User.pluginAuth && token.authName) { |
150 | PluginManager.Instance.onLogout(token.User.pluginAuth, token.authName, token.User) | 152 | redirectUrl = await PluginManager.Instance.onLogout(token.User.pluginAuth, token.authName, token.User, this.request) |
151 | } | 153 | } |
152 | 154 | ||
153 | clearCacheByToken(token.accessToken) | 155 | clearCacheByToken(token.accessToken) |
@@ -155,10 +157,10 @@ async function revokeToken (tokenInfo: { refreshToken: string }) { | |||
155 | token.destroy() | 157 | token.destroy() |
156 | .catch(err => logger.error('Cannot destroy token when revoking token.', { err })) | 158 | .catch(err => logger.error('Cannot destroy token when revoking token.', { err })) |
157 | 159 | ||
158 | return true | 160 | return { success: true, redirectUrl } |
159 | } | 161 | } |
160 | 162 | ||
161 | return false | 163 | return { success: false } |
162 | } | 164 | } |
163 | 165 | ||
164 | async function saveToken (token: TokenInfo, client: OAuthClientModel, user: UserModel) { | 166 | async function saveToken (token: TokenInfo, client: OAuthClientModel, user: UserModel) { |
diff --git a/server/lib/plugins/plugin-manager.ts b/server/lib/plugins/plugin-manager.ts index 94b5ecc41..8e7491257 100644 --- a/server/lib/plugins/plugin-manager.ts +++ b/server/lib/plugins/plugin-manager.ts | |||
@@ -1,3 +1,4 @@ | |||
1 | import * as express from 'express' | ||
1 | import { createReadStream, createWriteStream } from 'fs' | 2 | import { createReadStream, createWriteStream } from 'fs' |
2 | import { outputFile, readJSON } from 'fs-extra' | 3 | import { outputFile, readJSON } from 'fs-extra' |
3 | import { basename, join } from 'path' | 4 | import { basename, join } from 'path' |
@@ -166,18 +167,25 @@ export class PluginManager implements ServerHook { | |||
166 | 167 | ||
167 | // ###################### External events ###################### | 168 | // ###################### External events ###################### |
168 | 169 | ||
169 | onLogout (npmName: string, authName: string, user: MUser) { | 170 | async onLogout (npmName: string, authName: string, user: MUser, req: express.Request) { |
170 | const auth = this.getAuth(npmName, authName) | 171 | const auth = this.getAuth(npmName, authName) |
171 | 172 | ||
172 | if (auth?.onLogout) { | 173 | if (auth?.onLogout) { |
173 | logger.info('Running onLogout function from auth %s of plugin %s', authName, npmName) | 174 | logger.info('Running onLogout function from auth %s of plugin %s', authName, npmName) |
174 | 175 | ||
175 | try { | 176 | try { |
176 | auth.onLogout(user) | 177 | // Force await, in case or onLogout returns a promise |
178 | const result = await auth.onLogout(user, req) | ||
179 | |||
180 | return typeof result === 'string' | ||
181 | ? result | ||
182 | : undefined | ||
177 | } catch (err) { | 183 | } catch (err) { |
178 | logger.warn('Cannot run onLogout function from auth %s of plugin %s.', authName, npmName, { err }) | 184 | logger.warn('Cannot run onLogout function from auth %s of plugin %s.', authName, npmName, { err }) |
179 | } | 185 | } |
180 | } | 186 | } |
187 | |||
188 | return undefined | ||
181 | } | 189 | } |
182 | 190 | ||
183 | onSettingsChanged (name: string, settings: any) { | 191 | onSettingsChanged (name: string, settings: any) { |