فهرست منبع

divide check auth strategy methods

ryoji-s 2 سال پیش
والد
کامیت
3cceb5fded

+ 0 - 41
apps/app/src/server/routes/apiv3/security-settings/checkAllSetupStrategiesHasAdmin.ts

@@ -1,41 +0,0 @@
-import Crowi from '~/server/crowi';
-
-const checkAuthStrategyHasAdmin = (async(crowi: Crowi, strategy: string): Promise<boolean> => {
-  const ExternalAccount = crowi.model('ExternalAccount');
-  const User = crowi.model('User');
-
-  if (strategy === 'local') {
-    // Get all local admin accounts and filter local admins that are not in external accounts
-    const localAdmins = await User.aggregate([
-      { $match: { admin: true, status: User.STATUS_ACTIVE } },
-      {
-        $lookup: {
-          from: 'externalaccounts',
-          localField: '_id',
-          foreignField: 'user',
-          as: 'externalAccounts',
-        },
-      },
-      { $match: { externalAccounts: [] } },
-    ]).exec();
-    return localAdmins.length > 0;
-  }
-
-  const externalAccounts = await ExternalAccount.find({ providerType: strategy })
-    .populate('user', null, { admin: true, status: User.STATUS_ACTIVE })
-    .exec();
-
-  const hasAdmin = externalAccounts.some(account => account.user !== null);
-
-  return hasAdmin;
-});
-
-
-export const checkAllSetupStrategiesHasAdmin = (async(crowi: Crowi, setupStrategies: string[]): Promise<boolean> => {
-  const results = await Promise.all(setupStrategies.map(async(strategy) => {
-    const hasAdmin = await checkAuthStrategyHasAdmin(crowi, strategy);
-    return hasAdmin;
-  }));
-
-  return results.some(hasAdmin => hasAdmin);
-});

+ 53 - 0
apps/app/src/server/routes/apiv3/security-settings/checkSetupStrategiesHasAdmin.ts

@@ -0,0 +1,53 @@
+import type { GrowiExternalAuthProviderType } from '~/features/questionnaire/interfaces/growi-info';
+import Crowi from '~/server/crowi';
+
+
+const checkLocalStrategyHasAdmin = (async(crowi: Crowi): Promise<boolean> => {
+  // TODO: update check local strategy has admin methods
+  const User = crowi.model('User');
+
+  const localAdmins = await User.aggregate([
+    { $match: { admin: true, status: User.STATUS_ACTIVE } },
+    {
+      $lookup: {
+        from: 'externalaccounts',
+        localField: '_id',
+        foreignField: 'user',
+        as: 'externalAccounts',
+      },
+    },
+    { $match: { externalAccounts: [] } },
+  ]).exec();
+  return localAdmins.length > 0;
+});
+
+const checkExternalStrategiesHasAdmin = (async(crowi: Crowi, setupStrategies: GrowiExternalAuthProviderType[]): Promise<boolean> => {
+  // TODO: update check external strategy has admin methods
+  const ExternalAccount = crowi.model('ExternalAccount');
+  const User = crowi.model('User');
+
+  const results = await Promise.all(setupStrategies.map(async(strategy) => {
+    const externalAccounts = await ExternalAccount.find({ providerType: strategy })
+      .populate('user', null, { admin: true, status: User.STATUS_ACTIVE })
+      .exec();
+
+    const hasAdmin = externalAccounts.some(account => account.user !== null);
+    return hasAdmin;
+  }));
+
+  return results.some(hasAdmin => hasAdmin);
+});
+
+export const checkSetupStrategiesHasAdmin = (async(crowi: Crowi, setupStrategies: (GrowiExternalAuthProviderType | 'local')[]): Promise<boolean> => {
+  if (setupStrategies.includes('local')) {
+    const isLocalStrategyHasAdmin = await checkLocalStrategyHasAdmin(crowi);
+    if (isLocalStrategyHasAdmin) {
+      return true;
+    }
+  }
+
+  const setupStrategiesWithoutLocal = setupStrategies.filter(strategy => strategy !== 'local') as GrowiExternalAuthProviderType[];
+  const isExternalStrategiesHasAdmin = await checkExternalStrategiesHasAdmin(crowi, setupStrategiesWithoutLocal);
+
+  return isExternalStrategiesHasAdmin;
+});

+ 2 - 2
apps/app/src/server/routes/apiv3/security-settings/index.js

@@ -8,7 +8,7 @@ import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
 import { validateDeleteConfigs, prepareDeleteConfigValuesForCalc } from '~/utils/page-delete-config';
 
-import { checkAllSetupStrategiesHasAdmin } from './checkAllSetupStrategiesHasAdmin';
+import { checkSetupStrategiesHasAdmin } from './checkSetupStrategiesHasAdmin';
 
 
 const logger = loggerFactory('growi:routes:apiv3:security-setting');
@@ -491,7 +491,7 @@ module.exports = (crowi) => {
     }
 
     if (!isEnabled) {
-      const isSetupStrategiesHasAdmin = await checkAllSetupStrategiesHasAdmin(crowi, setupStrategies);
+      const isSetupStrategiesHasAdmin = await checkSetupStrategiesHasAdmin(crowi, setupStrategies);
 
       // Return an error when disabling an strategy when there are no setup strategies with admin-enabled login
       if (!isSetupStrategiesHasAdmin) {