X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fmodels%2Foauth%2Foauth-token.ts;h=af4b0ec421daf6cacdca629207996e7479f1ca4d;hb=20213fbd2a366dffc35aa7dddad71323893f8d62;hp=0d21c42fd26a31f02cca7718fdd73d27af5d0b87;hpb=3fd3ab2d34d512b160a5e6084d7609be7b4f4452;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/oauth/oauth-token.ts b/server/models/oauth/oauth-token.ts index 0d21c42fd..af4b0ec42 100644 --- a/server/models/oauth/oauth-token.ts +++ b/server/models/oauth/oauth-token.ts @@ -1,20 +1,65 @@ -import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript' -import { logger } from '../../helpers' +import { Transaction } from 'sequelize' +import { + AfterDestroy, + AfterUpdate, + AllowNull, + BelongsTo, + Column, + CreatedAt, + ForeignKey, + Model, + Scopes, + Table, + UpdatedAt +} from 'sequelize-typescript' +import { TokensCache } from '@server/lib/auth/tokens-cache' +import { MUserAccountId } from '@server/types/models' +import { MOAuthTokenUser } from '@server/types/models/oauth/oauth-token' +import { AttributesOnly } from '@shared/core-utils' +import { logger } from '../../helpers/logger' import { AccountModel } from '../account/account' -import { UserModel } from '../account/user' +import { ActorModel } from '../actor/actor' +import { UserModel } from '../user/user' import { OAuthClientModel } from './oauth-client' export type OAuthTokenInfo = { refreshToken: string - refreshTokenExpiresAt: Date, + refreshTokenExpiresAt: Date client: { id: number - }, - user: { - id: number } + user: MUserAccountId + token: MOAuthTokenUser } +enum ScopeNames { + WITH_USER = 'WITH_USER' +} + +@Scopes(() => ({ + [ScopeNames.WITH_USER]: { + include: [ + { + model: UserModel.unscoped(), + required: true, + include: [ + { + attributes: [ 'id' ], + model: AccountModel.unscoped(), + required: true, + include: [ + { + attributes: [ 'id', 'url' ], + model: ActorModel.unscoped(), + required: true + } + ] + } + ] + } + ] + } +})) @Table({ tableName: 'oAuthToken', indexes: [ @@ -34,7 +79,7 @@ export type OAuthTokenInfo = { } ] }) -export class OAuthTokenModel extends Model { +export class OAuthTokenModel extends Model>> { @AllowNull(false) @Column @@ -52,6 +97,9 @@ export class OAuthTokenModel extends Model { @Column refreshTokenExpiresAt: Date + @Column + authName: string + @CreatedAt createdAt: Date @@ -82,82 +130,91 @@ export class OAuthTokenModel extends Model { }) OAuthClients: OAuthClientModel[] + @AfterUpdate + @AfterDestroy + static removeTokenCache (token: OAuthTokenModel) { + return TokensCache.Instance.clearCacheByToken(token.accessToken) + } + + static loadByRefreshToken (refreshToken: string) { + const query = { + where: { refreshToken } + } + + return OAuthTokenModel.findOne(query) + } + static getByRefreshTokenAndPopulateClient (refreshToken: string) { const query = { where: { - refreshToken: refreshToken + refreshToken }, include: [ OAuthClientModel ] } - return OAuthTokenModel.findOne(query) - .then(token => { - if (!token) return null - - return { - refreshToken: token.refreshToken, - refreshTokenExpiresAt: token.refreshTokenExpiresAt, - client: { - id: token.oAuthClientId - }, - user: { - id: token.userId - } - } as OAuthTokenInfo - }) - .catch(err => { - logger.info('getRefreshToken error.', err) - throw err - }) + return OAuthTokenModel.scope(ScopeNames.WITH_USER) + .findOne(query) + .then(token => { + if (!token) return null + + return { + refreshToken: token.refreshToken, + refreshTokenExpiresAt: token.refreshTokenExpiresAt, + client: { + id: token.oAuthClientId + }, + user: token.User, + token + } as OAuthTokenInfo + }) + .catch(err => { + logger.error('getRefreshToken error.', { err }) + throw err + }) } - static getByTokenAndPopulateUser (bearerToken: string) { + static getByTokenAndPopulateUser (bearerToken: string): Promise { const query = { where: { accessToken: bearerToken - }, - include: [ - { - model: UserModel, - include: [ - { - model: AccountModel, - required: true - } - ] - } - ] + } } - return OAuthTokenModel.findOne(query).then(token => { - if (token) token['user'] = token.User + return OAuthTokenModel.scope(ScopeNames.WITH_USER) + .findOne(query) + .then(token => { + if (!token) return null - return token - }) + return Object.assign(token, { user: token.User }) + }) } - static getByRefreshTokenAndPopulateUser (refreshToken: string) { + static getByRefreshTokenAndPopulateUser (refreshToken: string): Promise { const query = { where: { - refreshToken: refreshToken - }, - include: [ - { - model: UserModel, - include: [ - { - model: AccountModel, - required: true - } - ] - } - ] + refreshToken + } } - return OAuthTokenModel.findOne(query).then(token => { - token['user'] = token.User + return OAuthTokenModel.scope(ScopeNames.WITH_USER) + .findOne(query) + .then(token => { + if (!token) return undefined + + return Object.assign(token, { user: token.User }) + }) + } + + static deleteUserToken (userId: number, t?: Transaction) { + TokensCache.Instance.deleteUserToken(userId) + + const query = { + where: { + userId + }, + transaction: t + } - return token - }) + return OAuthTokenModel.destroy(query) } }