Skip to content

Commit

Permalink
refactor: Service Configuration async on server (#28813)
Browse files Browse the repository at this point in the history
  • Loading branch information
KevLehman committed Apr 5, 2023
1 parent 8060728 commit d941e03
Show file tree
Hide file tree
Showing 15 changed files with 212 additions and 201 deletions.
8 changes: 4 additions & 4 deletions apps/meteor/app/api/server/v1/settings.ts
Expand Up @@ -70,8 +70,8 @@ API.v1.addRoute(
'settings.oauth',
{ authRequired: false },
{
get() {
const oAuthServicesEnabled = ServiceConfiguration.configurations.find({}, { fields: { secret: 0 } }).fetch();
async get() {
const oAuthServicesEnabled = await ServiceConfiguration.configurations.find({}, { fields: { secret: 0 } }).fetchAsync();

return API.v1.success({
services: oAuthServicesEnabled.map((service) => {
Expand Down Expand Up @@ -213,9 +213,9 @@ API.v1.addRoute(
'service.configurations',
{ authRequired: false },
{
get() {
async get() {
return API.v1.success({
configurations: ServiceConfiguration.configurations.find({}, { fields: { secret: 0 } }).fetch(),
configurations: await ServiceConfiguration.configurations.find({}, { fields: { secret: 0 } }).fetchAsync(),
});
},
},
Expand Down
8 changes: 4 additions & 4 deletions apps/meteor/app/apple/server/appleOauthRegisterService.ts
Expand Up @@ -27,16 +27,16 @@ settings.watchMultiple(
'Accounts_OAuth_Apple_iss',
'Accounts_OAuth_Apple_kid',
],
([enabled, clientId, serverSecret, iss, kid]) => {
async ([enabled, clientId, serverSecret, iss, kid]) => {
if (!enabled) {
return ServiceConfiguration.configurations.remove({
return ServiceConfiguration.configurations.removeAsync({
service: 'apple',
});
}

// if everything is empty but Apple login is enabled, don't show the login button
if (!clientId && !serverSecret && !iss && !kid) {
ServiceConfiguration.configurations.upsert(
await ServiceConfiguration.configurations.upsertAsync(
{
service: 'apple',
},
Expand Down Expand Up @@ -72,7 +72,7 @@ settings.watchMultiple(
serverSecret as string,
);

ServiceConfiguration.configurations.upsert(
await ServiceConfiguration.configurations.upsertAsync(
{
service: 'apple',
},
Expand Down
12 changes: 6 additions & 6 deletions apps/meteor/app/cas/server/cas_rocketchat.js
Expand Up @@ -48,12 +48,12 @@ Meteor.startup(function () {

let timer;

function updateServices(/* record*/) {
async function updateServices(/* record*/) {
if (typeof timer !== 'undefined') {
Meteor.clearTimeout(timer);
}

timer = Meteor.setTimeout(function () {
timer = Meteor.setTimeout(async function () {
const data = {
// These will pe passed to 'node-cas' as options
enabled: settings.get('CAS_enabled'),
Expand All @@ -71,14 +71,14 @@ function updateServices(/* record*/) {
// Either register or deregister the CAS login service based upon its configuration
if (data.enabled) {
logger.info('Enabling CAS login service');
ServiceConfiguration.configurations.upsert({ service: 'cas' }, { $set: data });
await ServiceConfiguration.configurations.upsertAsync({ service: 'cas' }, { $set: data });
} else {
logger.info('Disabling CAS login service');
ServiceConfiguration.configurations.remove({ service: 'cas' });
await ServiceConfiguration.configurations.removeAsync({ service: 'cas' });
}
}, 2000);
}

settings.watchByRegex(/^CAS_.+/, (key, value) => {
updateServices(value);
settings.watchByRegex(/^CAS_.+/, async (key, value) => {
await updateServices(value);
});
8 changes: 4 additions & 4 deletions apps/meteor/app/custom-oauth/client/custom_oauth_client.js
Expand Up @@ -59,26 +59,26 @@ export class CustomOAuth {
configureLogin() {
const loginWithService = `loginWith${capitalize(String(this.name || ''))}`;

Meteor[loginWithService] = (options, callback) => {
Meteor[loginWithService] = async (options, callback) => {
// support a callback without options
if (!callback && typeof options === 'function') {
callback = options;
options = null;
}

const credentialRequestCompleteCallback = Accounts.oauth.credentialRequestCompleteHandler(callback);
this.requestCredential(options, credentialRequestCompleteCallback);
await this.requestCredential(options, credentialRequestCompleteCallback);
};
}

requestCredential(options, credentialRequestCompleteCallback) {
async requestCredential(options, credentialRequestCompleteCallback) {
// support both (options, callback) and (callback).
if (!credentialRequestCompleteCallback && typeof options === 'function') {
credentialRequestCompleteCallback = options;
options = {};
}

const config = ServiceConfiguration.configurations.findOne({ service: this.name });
const config = await ServiceConfiguration.configurations.findOneAsync({ service: this.name });
if (!config) {
if (credentialRequestCompleteCallback) {
credentialRequestCompleteCallback(new ServiceConfiguration.ConfigError());
Expand Down
4 changes: 2 additions & 2 deletions apps/meteor/app/custom-oauth/server/custom_oauth_server.js
Expand Up @@ -100,8 +100,8 @@ export class CustomOAuth {
}
}

getAccessToken(query) {
const config = ServiceConfiguration.configurations.findOne({ service: this.name });
async getAccessToken(query) {
const config = await ServiceConfiguration.configurations.findOneAsync({ service: this.name });
if (!config) {
throw new ServiceConfiguration.ConfigError();
}
Expand Down
38 changes: 19 additions & 19 deletions apps/meteor/app/dolphin/lib/common.js
Expand Up @@ -29,28 +29,28 @@ function DolphinOnCreateUser(options, user) {
}

if (Meteor.isServer) {
Meteor.startup(() =>
Meteor.startup(async () => {
settings.watch('Accounts_OAuth_Dolphin_URL', (value) => {
config.serverURL = value;
return Dolphin.configure(config);
}),
);

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'),
};

ServiceConfiguration.configurations.upsert({ service: 'dolphin' }, { $set: data });
}

callbacks.add('beforeCreateUser', DolphinOnCreateUser, callbacks.priority.HIGH, 'dolphin');
});

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 });
}

callbacks.add('beforeCreateUser', DolphinOnCreateUser, callbacks.priority.HIGH, 'dolphin');
});
} else {
Meteor.startup(() =>
Tracker.autorun(function () {
Expand Down
43 changes: 27 additions & 16 deletions apps/meteor/app/lib/server/functions/getAvatarSuggestionForUser.ts
Expand Up @@ -71,22 +71,33 @@ const avatarProviders = {
}
},

customOAuth(user: IUser) {
const avatars = [];
for (const service in user.services) {
if (user.services[service as keyof typeof user.services]._OAuthCustom) {
const services = ServiceConfiguration.configurations.find({ service }, { fields: { secret: 0 } }).fetch();

if (services.length > 0) {
if (user.services[service as keyof typeof user.services].avatarUrl) {
avatars.push({
service,
url: user.services[service as keyof typeof user.services].avatarUrl,
});
async customOAuth(user: IUser) {
const avatars: { service: string; url: string }[] = [];
if (!user.services) {
return avatars;
}

await Promise.all(
Object.keys(user.services).map(async (service) => {
if (!user.services) {
return;
}

if (user.services[service as keyof typeof user.services]._OAuthCustom) {
const services = await ServiceConfiguration.configurations.find({ service }, { fields: { secret: 0 } }).fetchAsync();

if (services.length > 0) {
if (user.services[service as keyof typeof user.services].avatarUrl) {
avatars.push({
service,
url: user.services[service as keyof typeof user.services].avatarUrl,
});
}
}
}
}
}
}),
);

return avatars;
},

Expand Down Expand Up @@ -131,8 +142,8 @@ export async function getAvatarSuggestionForUser(

const avatars = [];

for (const avatarProvider of Object.values(avatarProviders)) {
const avatar = avatarProvider(user);
for await (const avatarProvider of Object.values(avatarProviders)) {
const avatar = await avatarProvider(user);
if (avatar) {
if (Array.isArray(avatar)) {
avatars.push(...avatar);
Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/app/lib/server/methods/refreshOAuthService.ts
Expand Up @@ -29,7 +29,7 @@ Meteor.methods<ServerMethods>({
});
}

ServiceConfiguration.configurations.remove({});
await ServiceConfiguration.configurations.removeAsync({});

await Settings.update({ _id: /^(Accounts_OAuth_|SAML_|CAS_).+/ }, { $set: { _updatedAt: new Date() } }, { multi: true });
},
Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/app/lib/server/oauth/oauth.js
Expand Up @@ -35,7 +35,7 @@ Accounts.registerLoginHandler(async function (options) {
}

// Make sure we're configured
if (!ServiceConfiguration.configurations.findOne({ service: options.serviceName })) {
if (!(await ServiceConfiguration.configurations.findOneAsync({ service: options.serviceName }))) {
throw new ServiceConfiguration.ConfigError();
}

Expand Down

0 comments on commit d941e03

Please sign in to comment.