Просмотр исходного кода

typescriptize and instanciate in the module

Yuki Takei 2 лет назад
Родитель
Сommit
6445417177

+ 2 - 4
apps/app/src/server/crowi/index.js

@@ -23,7 +23,7 @@ import GrowiPlugin from '../models/growi-plugin';
 import PageRedirect from '../models/page-redirect';
 import Tag from '../models/tag';
 import UserGroup from '../models/user-group';
-import AclService from '../service/acl';
+import { aclService as aclServiceSingletonInstance } from '../service/acl';
 import AppService from '../service/app';
 import AttachmentService from '../service/attachment';
 import { configManager as configManagerSingletonInstance } from '../service/config-manager';
@@ -612,9 +612,7 @@ Crowi.prototype.setUpXss = async function() {
  * setup AclService
  */
 Crowi.prototype.setUpAcl = async function() {
-  if (this.aclService == null) {
-    this.aclService = new AclService(this.configManager);
-  }
+  this.aclService = aclServiceSingletonInstance;
 };
 
 /**

+ 30 - 38
apps/app/src/server/service/acl.ts

@@ -1,29 +1,38 @@
 import loggerFactory from '~/utils/logger';
 
-// eslint-disable-next-line no-unused-vars
+import { configManager } from './config-manager';
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:service:AclService');
 
+
+const labels = {
+  SECURITY_RESTRICT_GUEST_MODE_DENY: 'Deny',
+  SECURITY_RESTRICT_GUEST_MODE_READONLY: 'Readonly',
+  // --- unused labels ---
+  // SECURITY_REGISTRATION_MODE_OPEN: 'Open',
+  // SECURITY_REGISTRATION_MODE_RESTRICTED: 'Restricted',
+  // SECURITY_REGISTRATION_MODE_CLOSED: 'Closed',
+};
+
+
+export interface AclService {
+  isAclEnabled(): boolean,
+  isWikiModeForced(): boolean,
+  isGuestAllowedToRead(): boolean,
+  getGuestModeValue(): string,
+}
+
 /**
  * the service class of AclService
  */
-class AclService {
-
-  constructor(configManager) {
-    this.configManager = configManager;
-    this.labels = {
-      SECURITY_RESTRICT_GUEST_MODE_DENY: 'Deny',
-      SECURITY_RESTRICT_GUEST_MODE_READONLY: 'Readonly',
-      SECURITY_REGISTRATION_MODE_OPEN: 'Open',
-      SECURITY_REGISTRATION_MODE_RESTRICTED: 'Restricted',
-      SECURITY_REGISTRATION_MODE_CLOSED: 'Closed',
-    };
-  }
+class AclServiceImpl implements AclService {
 
   /**
    * @returns Whether Access Control is enabled or not
    */
   isAclEnabled() {
-    const wikiMode = this.configManager.getConfig('crowi', 'security:wikiMode');
+    const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
     return wikiMode !== 'public';
   }
 
@@ -31,7 +40,7 @@ class AclService {
    * @returns Whether wiki mode is set
    */
   isWikiModeForced() {
-    const wikiMode = this.configManager.getConfig('crowi', 'security:wikiMode');
+    const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
     const isPrivateOrPublic = wikiMode === 'private' || wikiMode === 'public';
 
     return isPrivateOrPublic;
@@ -41,7 +50,7 @@ class AclService {
    * @returns Whether guest users are allowed to read public pages
    */
   isGuestAllowedToRead() {
-    const wikiMode = this.configManager.getConfig('crowi', 'security:wikiMode');
+    const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
 
     // return false if private wiki mode
     if (wikiMode === 'private') {
@@ -52,36 +61,19 @@ class AclService {
       return true;
     }
 
-    const guestMode = this.configManager.getConfig('crowi', 'security:restrictGuestMode');
+    const guestMode = configManager.getConfig('crowi', 'security:restrictGuestMode');
 
     // 'Readonly' => returns true (allow access to guests)
     // 'Deny', null, undefined, '', ... everything else => returns false (requires login)
-    return guestMode === this.labels.SECURITY_RESTRICT_GUEST_MODE_READONLY;
+    return guestMode === labels.SECURITY_RESTRICT_GUEST_MODE_READONLY;
   }
 
   getGuestModeValue() {
     return this.isGuestAllowedToRead()
-      ? this.labels.SECURITY_RESTRICT_GUEST_MODE_READONLY
-      : this.labels.SECURITY_RESTRICT_GUEST_MODE_DENY;
-  }
-
-  getRestrictGuestModeLabels() {
-    const labels = {};
-    labels[this.labels.SECURITY_RESTRICT_GUEST_MODE_DENY] = 'security_settings.guest_mode.deny';
-    labels[this.labels.SECURITY_RESTRICT_GUEST_MODE_READONLY] = 'security_settings.guest_mode.readonly';
-
-    return labels;
-  }
-
-  getRegistrationModeLabels() {
-    const labels = {};
-    labels[this.labels.SECURITY_REGISTRATION_MODE_OPEN] = 'security_settings.registration_mode.open';
-    labels[this.labels.SECURITY_REGISTRATION_MODE_RESTRICTED] = 'security_settings.registration_mode.restricted';
-    labels[this.labels.SECURITY_REGISTRATION_MODE_CLOSED] = 'security_settings.registration_mode.closed';
-
-    return labels;
+      ? labels.SECURITY_RESTRICT_GUEST_MODE_READONLY
+      : labels.SECURITY_RESTRICT_GUEST_MODE_DENY;
   }
 
 }
 
-module.exports = AclService;
+export const aclService = new AclServiceImpl();

+ 40 - 37
apps/app/test/integration/service/acl.test.ts

@@ -1,12 +1,15 @@
-const { getInstance } = require('../setup-crowi');
+import { aclService } from '../../../src/server/service/acl';
+import { configManager } from '../../../src/server/service/config-manager';
 
 describe('AclService test', () => {
-  let crowi;
 
   const initialEnv = process.env;
 
-  beforeEach(async() => {
-    crowi = await getInstance();
+  beforeAll(async() => {
+    await configManager.loadConfigs();
+  });
+
+  afterEach(() => {
     process.env = initialEnv;
   });
 
@@ -17,11 +20,11 @@ describe('AclService test', () => {
       delete process.env.FORCE_WIKI_MODE;
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isAclEnabled();
+      const result = aclService.isAclEnabled();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe(undefined);
       expect(result).toBe(true);
     });
@@ -30,11 +33,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'dummy string';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isAclEnabled();
+      const result = aclService.isAclEnabled();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('dummy string');
       expect(result).toBe(true);
     });
@@ -43,11 +46,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'private';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isAclEnabled();
+      const result = aclService.isAclEnabled();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('private');
       expect(result).toBe(true);
     });
@@ -56,11 +59,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'public';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isAclEnabled();
+      const result = aclService.isAclEnabled();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('public');
       expect(result).toBe(false);
     });
@@ -74,11 +77,11 @@ describe('AclService test', () => {
       delete process.env.FORCE_WIKI_MODE;
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isWikiModeForced();
+      const result = aclService.isWikiModeForced();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe(undefined);
       expect(result).toBe(false);
     });
@@ -87,11 +90,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'dummy string';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isWikiModeForced();
+      const result = aclService.isWikiModeForced();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('dummy string');
       expect(result).toBe(false);
     });
@@ -100,11 +103,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'private';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isWikiModeForced();
+      const result = aclService.isWikiModeForced();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('private');
       expect(result).toBe(true);
     });
@@ -113,11 +116,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'public';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isWikiModeForced();
+      const result = aclService.isWikiModeForced();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('public');
       expect(result).toBe(true);
     });
@@ -130,18 +133,18 @@ describe('AclService test', () => {
 
     beforeEach(async() => {
       // prepare spy for ConfigManager.getConfig
-      getConfigSpy = jest.spyOn(crowi.configManager, 'getConfig');
+      getConfigSpy = jest.spyOn(configManager, 'getConfig');
     });
 
     test('to be false when FORCE_WIKI_MODE=private', async() => {
       process.env.FORCE_WIKI_MODE = 'private';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isGuestAllowedToRead();
+      const result = aclService.isGuestAllowedToRead();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('private');
       expect(getConfigSpy).not.toHaveBeenCalledWith('crowi', 'security:restrictGuestMode');
       expect(result).toBe(false);
@@ -151,11 +154,11 @@ describe('AclService test', () => {
       process.env.FORCE_WIKI_MODE = 'public';
 
       // reload
-      await crowi.configManager.loadConfigs();
+      await configManager.loadConfigs();
 
-      const result = crowi.aclService.isGuestAllowedToRead();
+      const result = aclService.isGuestAllowedToRead();
 
-      const wikiMode = crowi.configManager.getConfig('crowi', 'security:wikiMode');
+      const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
       expect(wikiMode).toBe('public');
       expect(getConfigSpy).not.toHaveBeenCalledWith('crowi', 'security:restrictGuestMode');
       expect(result).toBe(true);
@@ -174,7 +177,7 @@ describe('AclService test', () => {
       test(`when FORCE_WIKI_MODE is undefined and 'security:restrictGuestMode' is '${restrictGuestMode}`, async() => {
 
         // reload
-        await crowi.configManager.loadConfigs();
+        await configManager.loadConfigs();
 
         // setup mock implementation
         getConfigSpy.mockImplementation((ns, key) => {
@@ -187,7 +190,7 @@ describe('AclService test', () => {
           throw new Error('Unexpected behavior.');
         });
 
-        const result = crowi.aclService.isGuestAllowedToRead();
+        const result = aclService.isGuestAllowedToRead();
 
         expect(getConfigSpy).toHaveBeenCalledTimes(2);
         expect(getConfigSpy).toHaveBeenCalledWith('crowi', 'security:wikiMode');