import type { IUser, OAuthConfiguration } from '@rocket.chat/core-typings'; import { Meteor } from 'meteor/meteor'; import { ServiceConfiguration } from 'meteor/service-configuration'; import passport from 'passport'; import _ from 'underscore'; import { callbacks } from '../callbacks'; import { beforeCreateUserCallback } from '../callbacks/beforeCreateUserCallback'; import { addPassportCustomOAuth } from '../oauth/addPassportCustomOAuth'; import { CustomOAuth } from './custom-oauth/custom_oauth_server'; import { settings } from '../../settings'; const config: Partial = { serverURL: '', authorizePath: '/m/oauth2/auth/', tokenPath: '/m/oauth2/token/', identityPath: '/m/oauth2/api/me/', scope: 'basic', addAutopublishFields: { forLoggedInUser: ['services.dolphin'], forOtherUsers: ['services.dolphin.name'], }, accessTokenParam: 'access_token', }; const Dolphin = new CustomOAuth('dolphin', config); function DolphinOnCreateUser(options: any, user?: IUser) { // TODO: callbacks Fix this if (user?.services?.dolphin?.NickName) { user.username = user.services.dolphin.NickName; } return options; } const configureDolphinOAuth = () => { passport.unuse('dolphin'); const enabled = settings.get('Accounts_OAuth_Dolphin'); if (!enabled) { return; } const serverURL = settings.get('Accounts_OAuth_Dolphin_URL').trim().replace(/\/*$/, ''); const clientId = settings.get('Accounts_OAuth_Dolphin_id'); const clientSecret = settings.get('Accounts_OAuth_Dolphin_secret'); if (!clientId || !clientSecret || !serverURL) { return; } const completeConfig = { ...config, serverURL, clientId, clientSecret }; if (settings.get('Accounts_OAuth_Use_Modern_Flow')) { addPassportCustomOAuth('dolphin', completeConfig); return; } Dolphin.configure(completeConfig); }; Meteor.startup(async () => { const updateConfig = _.debounce(configureDolphinOAuth, 300); settings.watchMultiple( [ 'Accounts_OAuth_Dolphin', 'Accounts_OAuth_Dolphin_URL', 'Accounts_OAuth_Dolphin_id', 'Accounts_OAuth_Dolphin_secret', 'Accounts_OAuth_Use_Modern_Flow', ], updateConfig, ); if (settings.get('Accounts_OAuth_Dolphin_URL')) { const data = { buttonLabelText: settings.get('Accounts_OAuth_Dolphin_button_label_text'), buttonColor: settings.get('Accounts_OAuth_Dolphin_button_color'), buttonLabelColor: settings.get('Accounts_OAuth_Dolphin_button_label_color'), clientId: settings.get('Accounts_OAuth_Dolphin_id'), secret: settings.get('Accounts_OAuth_Dolphin_secret'), serverURL: settings.get('Accounts_OAuth_Dolphin_URL'), loginStyle: settings.get('Accounts_OAuth_Dolphin_login_style'), }; await ServiceConfiguration.configurations.upsertAsync({ service: 'dolphin' }, { $set: data }); } beforeCreateUserCallback.add(DolphinOnCreateUser, callbacks.priority.HIGH, 'dolphin'); });