acl.test.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import { aclService } from '../../../src/server/service/acl';
  2. import { configManager } from '../../../src/server/service/config-manager';
  3. describe('AclService', () => {
  4. test("has consts 'isLabeledStatement'", () => {
  5. expect(aclService.labels.SECURITY_RESTRICT_GUEST_MODE_DENY).toBe('Deny');
  6. expect(aclService.labels.SECURITY_RESTRICT_GUEST_MODE_READONLY).toBe('Readonly');
  7. expect(aclService.labels.SECURITY_REGISTRATION_MODE_OPEN).toBe('Open');
  8. expect(aclService.labels.SECURITY_REGISTRATION_MODE_RESTRICTED).toBe('Restricted');
  9. expect(aclService.labels.SECURITY_REGISTRATION_MODE_CLOSED).toBe('Closed');
  10. });
  11. });
  12. describe('AclService test', () => {
  13. const initialEnv = process.env;
  14. beforeAll(async() => {
  15. await configManager.loadConfigs();
  16. });
  17. afterEach(() => {
  18. process.env = initialEnv;
  19. });
  20. describe('isAclEnabled()', () => {
  21. test('to be false when FORCE_WIKI_MODE is undefined', async() => {
  22. delete process.env.FORCE_WIKI_MODE;
  23. // reload
  24. await configManager.loadConfigs();
  25. const result = aclService.isAclEnabled();
  26. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  27. expect(wikiMode).toBe(undefined);
  28. expect(result).toBe(true);
  29. });
  30. test('to be false when FORCE_WIKI_MODE is dummy string', async() => {
  31. process.env.FORCE_WIKI_MODE = 'dummy string';
  32. // reload
  33. await configManager.loadConfigs();
  34. const result = aclService.isAclEnabled();
  35. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  36. expect(wikiMode).toBe('dummy string');
  37. expect(result).toBe(true);
  38. });
  39. test('to be true when FORCE_WIKI_MODE=private', async() => {
  40. process.env.FORCE_WIKI_MODE = 'private';
  41. // reload
  42. await configManager.loadConfigs();
  43. const result = aclService.isAclEnabled();
  44. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  45. expect(wikiMode).toBe('private');
  46. expect(result).toBe(true);
  47. });
  48. test('to be false when FORCE_WIKI_MODE=public', async() => {
  49. process.env.FORCE_WIKI_MODE = 'public';
  50. // reload
  51. await configManager.loadConfigs();
  52. const result = aclService.isAclEnabled();
  53. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  54. expect(wikiMode).toBe('public');
  55. expect(result).toBe(false);
  56. });
  57. });
  58. describe('isWikiModeForced()', () => {
  59. test('to be false when FORCE_WIKI_MODE is undefined', async() => {
  60. delete process.env.FORCE_WIKI_MODE;
  61. // reload
  62. await configManager.loadConfigs();
  63. const result = aclService.isWikiModeForced();
  64. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  65. expect(wikiMode).toBe(undefined);
  66. expect(result).toBe(false);
  67. });
  68. test('to be false when FORCE_WIKI_MODE is dummy string', async() => {
  69. process.env.FORCE_WIKI_MODE = 'dummy string';
  70. // reload
  71. await configManager.loadConfigs();
  72. const result = aclService.isWikiModeForced();
  73. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  74. expect(wikiMode).toBe('dummy string');
  75. expect(result).toBe(false);
  76. });
  77. test('to be true when FORCE_WIKI_MODE=private', async() => {
  78. process.env.FORCE_WIKI_MODE = 'private';
  79. // reload
  80. await configManager.loadConfigs();
  81. const result = aclService.isWikiModeForced();
  82. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  83. expect(wikiMode).toBe('private');
  84. expect(result).toBe(true);
  85. });
  86. test('to be false when FORCE_WIKI_MODE=public', async() => {
  87. process.env.FORCE_WIKI_MODE = 'public';
  88. // reload
  89. await configManager.loadConfigs();
  90. const result = aclService.isWikiModeForced();
  91. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  92. expect(wikiMode).toBe('public');
  93. expect(result).toBe(true);
  94. });
  95. });
  96. describe('isGuestAllowedToRead()', () => {
  97. let getConfigSpy;
  98. beforeEach(async() => {
  99. // prepare spy for ConfigManager.getConfig
  100. getConfigSpy = jest.spyOn(configManager, 'getConfig');
  101. });
  102. test('to be false when FORCE_WIKI_MODE=private', async() => {
  103. process.env.FORCE_WIKI_MODE = 'private';
  104. // reload
  105. await configManager.loadConfigs();
  106. const result = aclService.isGuestAllowedToRead();
  107. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  108. expect(wikiMode).toBe('private');
  109. expect(getConfigSpy).not.toHaveBeenCalledWith('crowi', 'security:restrictGuestMode');
  110. expect(result).toBe(false);
  111. });
  112. test('to be true when FORCE_WIKI_MODE=public', async() => {
  113. process.env.FORCE_WIKI_MODE = 'public';
  114. // reload
  115. await configManager.loadConfigs();
  116. const result = aclService.isGuestAllowedToRead();
  117. const wikiMode = configManager.getConfig('crowi', 'security:wikiMode');
  118. expect(wikiMode).toBe('public');
  119. expect(getConfigSpy).not.toHaveBeenCalledWith('crowi', 'security:restrictGuestMode');
  120. expect(result).toBe(true);
  121. });
  122. /* eslint-disable indent */
  123. describe.each`
  124. restrictGuestMode | expected
  125. ${undefined} | ${false}
  126. ${'Deny'} | ${false}
  127. ${'Readonly'} | ${true}
  128. ${'Open'} | ${false}
  129. ${'Restricted'} | ${false}
  130. ${'closed'} | ${false}
  131. `('to be $expected', ({ restrictGuestMode, expected }) => {
  132. test(`when FORCE_WIKI_MODE is undefined and 'security:restrictGuestMode' is '${restrictGuestMode}`, async() => {
  133. // reload
  134. await configManager.loadConfigs();
  135. // setup mock implementation
  136. getConfigSpy.mockImplementation((ns, key) => {
  137. if (ns === 'crowi' && key === 'security:restrictGuestMode') {
  138. return restrictGuestMode;
  139. }
  140. if (ns === 'crowi' && key === 'security:wikiMode') {
  141. return undefined;
  142. }
  143. throw new Error('Unexpected behavior.');
  144. });
  145. const result = aclService.isGuestAllowedToRead();
  146. expect(getConfigSpy).toHaveBeenCalledTimes(2);
  147. expect(getConfigSpy).toHaveBeenCalledWith('crowi', 'security:wikiMode');
  148. expect(getConfigSpy).toHaveBeenCalledWith('crowi', 'security:restrictGuestMode');
  149. expect(result).toBe(expected);
  150. });
  151. });
  152. });
  153. });