UNPKG

@xrengine/server-core

Version:

Shared components for XREngine server

135 lines (118 loc) 4.91 kB
import { Paginated, Params } from '@feathersjs/feathers' import { SequelizeServiceOptions, Service } from 'feathers-sequelize' import { AdminAuthSetting as AdminAuthSettingInterface } from '@xrengine/common/src/interfaces/AdminAuthSetting' import { UserInterface } from '@xrengine/common/src/interfaces/User' import { Application } from '../../../declarations' import config from '../../appconfig' import logger from '../../ServerLogger' import { UserParams } from '../../user/user/user.class' export type AdminAuthSettingDataType = AdminAuthSettingInterface export class Authentication<T = AdminAuthSettingDataType> extends Service<T> { app: Application constructor(options: Partial<SequelizeServiceOptions>, app: Application) { super(options) this.app = app } async find(params?: UserParams): Promise<T[] | Paginated<T>> { const auth = (await super.find()) as any const loggedInUser = params!.user as UserInterface const data = auth.data.map((el) => { let oauth = JSON.parse(el.oauth) let authStrategies = JSON.parse(el.authStrategies) let local = JSON.parse(el.local) let jwtOptions = JSON.parse(el.jwtOptions) let bearerToken = JSON.parse(el.bearerToken) let callback = JSON.parse(el.callback) if (typeof oauth === 'string') oauth = JSON.parse(oauth) if (typeof authStrategies === 'string') authStrategies = JSON.parse(authStrategies) if (typeof local === 'string') local = JSON.parse(local) if (typeof jwtOptions === 'string') jwtOptions = JSON.parse(jwtOptions) if (typeof bearerToken === 'string') bearerToken = JSON.parse(bearerToken) if (typeof callback === 'string') callback = JSON.parse(callback) if (!loggedInUser.scopes || !loggedInUser.scopes.find((scope) => scope.type === 'admin:admin')) return { id: el.id, entity: el.entity, service: el.service, authStrategies: authStrategies } const returned = { ...el, authStrategies: authStrategies, local: local, jwtOptions: jwtOptions, bearerToken: bearerToken, callback: callback, oauth: { ...oauth } } if (oauth.defaults) returned.oauth.defaults = JSON.parse(oauth.defaults) if (oauth.discord) returned.oauth.discord = JSON.parse(oauth.discord) if (oauth.facebook) returned.oauth.facebook = JSON.parse(oauth.facebook) if (oauth.github) returned.oauth.github = JSON.parse(oauth.github) if (oauth.google) returned.oauth.google = JSON.parse(oauth.google) if (oauth.linkedin) returned.oauth.linkedin = JSON.parse(oauth.linkedin) if (oauth.twitter) returned.oauth.twitter = JSON.parse(oauth.twitter) return returned }) return { total: auth.total, limit: auth.limit, skip: auth.skip, data } } async patch(id: string, data: any, params?: Params): Promise<T[] | T> { const authSettings = await this.app.service('authentication-setting').get(id) let existingCallback = JSON.parse(authSettings.callback as any) if (typeof existingCallback === 'string') existingCallback = JSON.parse(existingCallback) let newOAuth = JSON.parse(data.oauth) data.callback = existingCallback for (let key of Object.keys(newOAuth)) { newOAuth[key] = JSON.parse(newOAuth[key]) if (config.authentication.oauth[key]?.scope) newOAuth[key].scope = config.authentication.oauth[key].scope if (config.authentication.oauth[key]?.custom_data) newOAuth[key].custom_data = config.authentication.oauth[key].custom_data if (key !== 'defaults' && !data.callback[key]) data.callback[key] = `${config.client.url}/auth/oauth/${key}` newOAuth[key] = JSON.stringify(newOAuth[key]) } data.oauth = JSON.stringify(newOAuth) data.callback = JSON.stringify(data.callback) const patchResult = await super.patch(id, data, params) if (this.app.k8AppsClient) { try { logger.info('Attempting to refresh API pods') const refreshApiPodResponse = await this.app.k8AppsClient.patchNamespacedDeployment( `${config.server.releaseName}-xrengine-api`, 'default', { spec: { template: { metadata: { annotations: { 'kubectl.kubernetes.io/restartedAt': new Date().toISOString() } } } } }, undefined, undefined, undefined, undefined, { headers: { 'Content-Type': 'application/strategic-merge-patch+json' } } ) logger.info(refreshApiPodResponse, 'updateBuilderTagResponse') } catch (e) { logger.error(e) return e } } return patchResult } }