|
@@ -1,9 +1,11 @@
|
|
|
-import { ConfigSource, toNonBlankStringOrUndefined } from '@growi/core/dist/interfaces';
|
|
|
|
|
|
|
+import { ConfigSource, toNonBlankStringOrUndefined, SCOPE } from '@growi/core/dist/interfaces';
|
|
|
import { ErrorV3 } from '@growi/core/dist/models';
|
|
import { ErrorV3 } from '@growi/core/dist/models';
|
|
|
import xss from 'xss';
|
|
import xss from 'xss';
|
|
|
|
|
|
|
|
|
|
+
|
|
|
import { SupportedAction } from '~/interfaces/activity';
|
|
import { SupportedAction } from '~/interfaces/activity';
|
|
|
import { PageDeleteConfigValue } from '~/interfaces/page-delete-config';
|
|
import { PageDeleteConfigValue } from '~/interfaces/page-delete-config';
|
|
|
|
|
+import { accessTokenParser } from '~/server/middlewares/access-token-parser';
|
|
|
import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
|
|
import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
|
|
|
import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
|
|
import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
|
|
|
import ShareLink from '~/server/models/share-link';
|
|
import ShareLink from '~/server/models/share-link';
|
|
@@ -454,7 +456,7 @@ module.exports = (crowi) => {
|
|
|
* githubOAuth:
|
|
* githubOAuth:
|
|
|
* $ref: '#/components/schemas/GitHubOAuthSetting'
|
|
* $ref: '#/components/schemas/GitHubOAuthSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
|
|
|
|
+ router.get('/', accessTokenParser([SCOPE.READ.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
|
|
|
|
|
const securityParams = {
|
|
const securityParams = {
|
|
|
generalSetting: {
|
|
generalSetting: {
|
|
@@ -592,7 +594,7 @@ module.exports = (crowi) => {
|
|
|
* description: updated param
|
|
* description: updated param
|
|
|
*/
|
|
*/
|
|
|
// eslint-disable-next-line max-len
|
|
// eslint-disable-next-line max-len
|
|
|
- router.put('/authentication/enabled', loginRequiredStrictly, adminRequired, addActivity, validator.authenticationSetting, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
|
|
+ router.put('/authentication/enabled', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity, validator.authenticationSetting, apiV3FormValidator, async(req, res) => {
|
|
|
const { isEnabled, authId } = req.body;
|
|
const { isEnabled, authId } = req.body;
|
|
|
|
|
|
|
|
let setupStrategies = await crowi.passportService.getSetupStrategies();
|
|
let setupStrategies = await crowi.passportService.getSetupStrategies();
|
|
@@ -704,7 +706,7 @@ module.exports = (crowi) => {
|
|
|
* description: setup strategie
|
|
* description: setup strategie
|
|
|
* example: ["local"]
|
|
* example: ["local"]
|
|
|
*/
|
|
*/
|
|
|
- router.get('/authentication/', loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
|
|
|
|
+ router.get('/authentication/', accessTokenParser([SCOPE.READ.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
const setupStrategies = await crowi.passportService.getSetupStrategies();
|
|
const setupStrategies = await crowi.passportService.getSetupStrategies();
|
|
|
|
|
|
|
|
return res.apiv3({ setupStrategies });
|
|
return res.apiv3({ setupStrategies });
|
|
@@ -734,70 +736,72 @@ module.exports = (crowi) => {
|
|
|
* schema:
|
|
* schema:
|
|
|
* $ref: '#/components/schemas/GeneralSetting'
|
|
* $ref: '#/components/schemas/GeneralSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/general-setting', loginRequiredStrictly, adminRequired, addActivity, validator.generalSetting, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- const updateData = {
|
|
|
|
|
- 'security:sessionMaxAge': parseInt(req.body.sessionMaxAge),
|
|
|
|
|
- 'security:restrictGuestMode': req.body.restrictGuestMode,
|
|
|
|
|
- 'security:pageDeletionAuthority': req.body.pageDeletionAuthority,
|
|
|
|
|
- 'security:pageRecursiveDeletionAuthority': req.body.pageRecursiveDeletionAuthority,
|
|
|
|
|
- 'security:pageCompleteDeletionAuthority': req.body.pageCompleteDeletionAuthority,
|
|
|
|
|
- 'security:pageRecursiveCompleteDeletionAuthority': req.body.pageRecursiveCompleteDeletionAuthority,
|
|
|
|
|
- 'security:isAllGroupMembershipRequiredForPageCompleteDeletion': req.body.isAllGroupMembershipRequiredForPageCompleteDeletion,
|
|
|
|
|
- 'security:list-policy:hideRestrictedByOwner': req.body.hideRestrictedByOwner,
|
|
|
|
|
- 'security:list-policy:hideRestrictedByGroup': req.body.hideRestrictedByGroup,
|
|
|
|
|
- 'security:user-homepage-deletion:isEnabled': req.body.isUsersHomepageDeletionEnabled,
|
|
|
|
|
- // Validate user-homepage-deletion config
|
|
|
|
|
- 'security:user-homepage-deletion:isForceDeleteUserHomepageOnUserDeletion': req.body.isUsersHomepageDeletionEnabled
|
|
|
|
|
- ? req.body.isForceDeleteUserHomepageOnUserDeletion
|
|
|
|
|
- : false,
|
|
|
|
|
- 'security:isRomUserAllowedToComment': req.body.isRomUserAllowedToComment,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ router.put('/general-setting', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.generalSetting, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ const updateData = {
|
|
|
|
|
+ 'security:sessionMaxAge': parseInt(req.body.sessionMaxAge),
|
|
|
|
|
+ 'security:restrictGuestMode': req.body.restrictGuestMode,
|
|
|
|
|
+ 'security:pageDeletionAuthority': req.body.pageDeletionAuthority,
|
|
|
|
|
+ 'security:pageRecursiveDeletionAuthority': req.body.pageRecursiveDeletionAuthority,
|
|
|
|
|
+ 'security:pageCompleteDeletionAuthority': req.body.pageCompleteDeletionAuthority,
|
|
|
|
|
+ 'security:pageRecursiveCompleteDeletionAuthority': req.body.pageRecursiveCompleteDeletionAuthority,
|
|
|
|
|
+ 'security:isAllGroupMembershipRequiredForPageCompleteDeletion': req.body.isAllGroupMembershipRequiredForPageCompleteDeletion,
|
|
|
|
|
+ 'security:list-policy:hideRestrictedByOwner': req.body.hideRestrictedByOwner,
|
|
|
|
|
+ 'security:list-policy:hideRestrictedByGroup': req.body.hideRestrictedByGroup,
|
|
|
|
|
+ 'security:user-homepage-deletion:isEnabled': req.body.isUsersHomepageDeletionEnabled,
|
|
|
|
|
+ // Validate user-homepage-deletion config
|
|
|
|
|
+ 'security:user-homepage-deletion:isForceDeleteUserHomepageOnUserDeletion': req.body.isUsersHomepageDeletionEnabled
|
|
|
|
|
+ ? req.body.isForceDeleteUserHomepageOnUserDeletion
|
|
|
|
|
+ : false,
|
|
|
|
|
+ 'security:isRomUserAllowedToComment': req.body.isRomUserAllowedToComment,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- // Validate delete config
|
|
|
|
|
- const [singleAuthority1, recursiveAuthority1] = prepareDeleteConfigValuesForCalc(req.body.pageDeletionAuthority, req.body.pageRecursiveDeletionAuthority);
|
|
|
|
|
- // eslint-disable-next-line max-len
|
|
|
|
|
- const [singleAuthority2, recursiveAuthority2] = prepareDeleteConfigValuesForCalc(req.body.pageCompleteDeletionAuthority, req.body.pageRecursiveCompleteDeletionAuthority);
|
|
|
|
|
- const isDeleteConfigNormalized = validateDeleteConfigs(singleAuthority1, recursiveAuthority1)
|
|
|
|
|
|
|
+ // Validate delete config
|
|
|
|
|
+ const [singleAuthority1, recursiveAuthority1] = prepareDeleteConfigValuesForCalc(req.body.pageDeletionAuthority, req.body.pageRecursiveDeletionAuthority);
|
|
|
|
|
+ // eslint-disable-next-line max-len
|
|
|
|
|
+ const [singleAuthority2, recursiveAuthority2] = prepareDeleteConfigValuesForCalc(req.body.pageCompleteDeletionAuthority, req.body.pageRecursiveCompleteDeletionAuthority);
|
|
|
|
|
+ const isDeleteConfigNormalized = validateDeleteConfigs(singleAuthority1, recursiveAuthority1)
|
|
|
&& validateDeleteConfigs(singleAuthority2, recursiveAuthority2);
|
|
&& validateDeleteConfigs(singleAuthority2, recursiveAuthority2);
|
|
|
- if (!isDeleteConfigNormalized) {
|
|
|
|
|
- return res.apiv3Err(new ErrorV3('Delete config values are not correct.', 'delete_config_not_normalized'));
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!isDeleteConfigNormalized) {
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3('Delete config values are not correct.', 'delete_config_not_normalized'));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- const wikiMode = await configManager.getConfig('security:wikiMode');
|
|
|
|
|
- if (wikiMode === 'private' || wikiMode === 'public') {
|
|
|
|
|
- logger.debug('security:restrictGuestMode will not be changed because wiki mode is forced to set');
|
|
|
|
|
- delete updateData['security:restrictGuestMode'];
|
|
|
|
|
- }
|
|
|
|
|
- try {
|
|
|
|
|
- await configManager.updateConfigs(updateData);
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- sessionMaxAge: await configManager.getConfig('security:sessionMaxAge'),
|
|
|
|
|
- restrictGuestMode: await configManager.getConfig('security:restrictGuestMode'),
|
|
|
|
|
- pageDeletionAuthority: await configManager.getConfig('security:pageDeletionAuthority'),
|
|
|
|
|
- pageCompleteDeletionAuthority: await configManager.getConfig('security:pageCompleteDeletionAuthority'),
|
|
|
|
|
- pageRecursiveDeletionAuthority: await configManager.getConfig('security:pageRecursiveDeletionAuthority'),
|
|
|
|
|
- pageRecursiveCompleteDeletionAuthority: await configManager.getConfig('security:pageRecursiveCompleteDeletionAuthority'),
|
|
|
|
|
- isAllGroupMembershipRequiredForPageCompleteDeletion:
|
|
|
|
|
|
|
+ const wikiMode = await configManager.getConfig('security:wikiMode');
|
|
|
|
|
+ if (wikiMode === 'private' || wikiMode === 'public') {
|
|
|
|
|
+ logger.debug('security:restrictGuestMode will not be changed because wiki mode is forced to set');
|
|
|
|
|
+ delete updateData['security:restrictGuestMode'];
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ await configManager.updateConfigs(updateData);
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ sessionMaxAge: await configManager.getConfig('security:sessionMaxAge'),
|
|
|
|
|
+ restrictGuestMode: await configManager.getConfig('security:restrictGuestMode'),
|
|
|
|
|
+ pageDeletionAuthority: await configManager.getConfig('security:pageDeletionAuthority'),
|
|
|
|
|
+ pageCompleteDeletionAuthority: await configManager.getConfig('security:pageCompleteDeletionAuthority'),
|
|
|
|
|
+ pageRecursiveDeletionAuthority: await configManager.getConfig('security:pageRecursiveDeletionAuthority'),
|
|
|
|
|
+ pageRecursiveCompleteDeletionAuthority: await configManager.getConfig('security:pageRecursiveCompleteDeletionAuthority'),
|
|
|
|
|
+ isAllGroupMembershipRequiredForPageCompleteDeletion:
|
|
|
await configManager.getConfig('security:isAllGroupMembershipRequiredForPageCompleteDeletion'),
|
|
await configManager.getConfig('security:isAllGroupMembershipRequiredForPageCompleteDeletion'),
|
|
|
- hideRestrictedByOwner: await configManager.getConfig('security:list-policy:hideRestrictedByOwner'),
|
|
|
|
|
- hideRestrictedByGroup: await configManager.getConfig('security:list-policy:hideRestrictedByGroup'),
|
|
|
|
|
- isUsersHomepageDeletionEnabled: await configManager.getConfig('security:user-homepage-deletion:isEnabled'),
|
|
|
|
|
- isForceDeleteUserHomepageOnUserDeletion:
|
|
|
|
|
|
|
+ hideRestrictedByOwner: await configManager.getConfig('security:list-policy:hideRestrictedByOwner'),
|
|
|
|
|
+ hideRestrictedByGroup: await configManager.getConfig('security:list-policy:hideRestrictedByGroup'),
|
|
|
|
|
+ isUsersHomepageDeletionEnabled: await configManager.getConfig('security:user-homepage-deletion:isEnabled'),
|
|
|
|
|
+ isForceDeleteUserHomepageOnUserDeletion:
|
|
|
await configManager.getConfig('security:user-homepage-deletion:isForceDeleteUserHomepageOnUserDeletion'),
|
|
await configManager.getConfig('security:user-homepage-deletion:isForceDeleteUserHomepageOnUserDeletion'),
|
|
|
- isRomUserAllowedToComment: await configManager.getConfig('security:isRomUserAllowedToComment'),
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ isRomUserAllowedToComment: await configManager.getConfig('security:isRomUserAllowedToComment'),
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_SECURITY_SETTINGS_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_SECURITY_SETTINGS_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating security setting';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating security setting';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -825,26 +829,28 @@ module.exports = (crowi) => {
|
|
|
* securitySettingParams:
|
|
* securitySettingParams:
|
|
|
* $ref: '#/components/schemas/ShareLinkSetting'
|
|
* $ref: '#/components/schemas/ShareLinkSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/share-link-setting', loginRequiredStrictly, adminRequired, addActivity, validator.generalSetting, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- const updateData = {
|
|
|
|
|
- 'security:disableLinkSharing': req.body.disableLinkSharing,
|
|
|
|
|
- };
|
|
|
|
|
- try {
|
|
|
|
|
- await configManager.updateConfigs(updateData);
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- disableLinkSharing: configManager.getConfig('security:disableLinkSharing'),
|
|
|
|
|
|
|
+ router.put('/share-link-setting', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.generalSetting, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ const updateData = {
|
|
|
|
|
+ 'security:disableLinkSharing': req.body.disableLinkSharing,
|
|
|
};
|
|
};
|
|
|
- // eslint-disable-next-line max-len
|
|
|
|
|
- const parameters = { action: updateData['security:disableLinkSharing'] ? SupportedAction.ACTION_ADMIN_REJECT_SHARE_LINK : SupportedAction.ACTION_ADMIN_PERMIT_SHARE_LINK };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating security setting';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await configManager.updateConfigs(updateData);
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ disableLinkSharing: configManager.getConfig('security:disableLinkSharing'),
|
|
|
|
|
+ };
|
|
|
|
|
+ // eslint-disable-next-line max-len
|
|
|
|
|
+ const parameters = { action: updateData['security:disableLinkSharing'] ? SupportedAction.ACTION_ADMIN_REJECT_SHARE_LINK : SupportedAction.ACTION_ADMIN_PERMIT_SHARE_LINK };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating security setting';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-secuirty-setting failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -868,7 +874,7 @@ module.exports = (crowi) => {
|
|
|
* type: object
|
|
* type: object
|
|
|
* description: suceed to get all share links
|
|
* description: suceed to get all share links
|
|
|
*/
|
|
*/
|
|
|
- router.get('/all-share-links/', loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
|
|
|
|
+ router.get('/all-share-links/', accessTokenParser([SCOPE.READ.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
const page = parseInt(req.query.page) || 1;
|
|
const page = parseInt(req.query.page) || 1;
|
|
|
const limit = 10;
|
|
const limit = 10;
|
|
|
const linkQuery = {};
|
|
const linkQuery = {};
|
|
@@ -914,7 +920,7 @@ module.exports = (crowi) => {
|
|
|
* type: number
|
|
* type: number
|
|
|
* description: total number of removed share links
|
|
* description: total number of removed share links
|
|
|
*/
|
|
*/
|
|
|
- router.delete('/all-share-links/', loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
|
|
|
|
+ router.delete('/all-share-links/', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
try {
|
|
try {
|
|
|
const removedAct = await ShareLink.remove({});
|
|
const removedAct = await ShareLink.remove({});
|
|
|
const removeTotal = await removedAct.n;
|
|
const removeTotal = await removedAct.n;
|
|
@@ -953,36 +959,38 @@ module.exports = (crowi) => {
|
|
|
* localSettingParams:
|
|
* localSettingParams:
|
|
|
* $ref: '#/components/schemas/LocalSetting'
|
|
* $ref: '#/components/schemas/LocalSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/local-setting', loginRequiredStrictly, adminRequired, addActivity, validator.localSetting, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- try {
|
|
|
|
|
- const sanitizedRegistrationWhitelist = req.body.registrationWhitelist
|
|
|
|
|
- .map(line => xss(line, { stripIgnoreTag: true }));
|
|
|
|
|
|
|
+ router.put('/local-setting', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.localSetting, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const sanitizedRegistrationWhitelist = req.body.registrationWhitelist
|
|
|
|
|
+ .map(line => xss(line, { stripIgnoreTag: true }));
|
|
|
|
|
|
|
|
- const requestParams = {
|
|
|
|
|
- 'security:registrationMode': req.body.registrationMode,
|
|
|
|
|
- 'security:registrationWhitelist': sanitizedRegistrationWhitelist,
|
|
|
|
|
- 'security:passport-local:isPasswordResetEnabled': req.body.isPasswordResetEnabled,
|
|
|
|
|
- 'security:passport-local:isEmailAuthenticationEnabled': req.body.isEmailAuthenticationEnabled,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ const requestParams = {
|
|
|
|
|
+ 'security:registrationMode': req.body.registrationMode,
|
|
|
|
|
+ 'security:registrationWhitelist': sanitizedRegistrationWhitelist,
|
|
|
|
|
+ 'security:passport-local:isPasswordResetEnabled': req.body.isPasswordResetEnabled,
|
|
|
|
|
+ 'security:passport-local:isEmailAuthenticationEnabled': req.body.isEmailAuthenticationEnabled,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- await updateAndReloadStrategySettings('local', requestParams);
|
|
|
|
|
|
|
+ await updateAndReloadStrategySettings('local', requestParams);
|
|
|
|
|
|
|
|
- const localSettingParams = {
|
|
|
|
|
- registrationMode: await configManager.getConfig('security:registrationMode'),
|
|
|
|
|
- registrationWhitelist: await configManager.getConfig('security:registrationWhitelist'),
|
|
|
|
|
- isPasswordResetEnabled: await configManager.getConfig('security:passport-local:isPasswordResetEnabled'),
|
|
|
|
|
- isEmailAuthenticationEnabled: await configManager.getConfig('security:passport-local:isEmailAuthenticationEnabled'),
|
|
|
|
|
- };
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_ID_PASS_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ localSettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating local setting';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-local-setting failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const localSettingParams = {
|
|
|
|
|
+ registrationMode: await configManager.getConfig('security:registrationMode'),
|
|
|
|
|
+ registrationWhitelist: await configManager.getConfig('security:registrationWhitelist'),
|
|
|
|
|
+ isPasswordResetEnabled: await configManager.getConfig('security:passport-local:isPasswordResetEnabled'),
|
|
|
|
|
+ isEmailAuthenticationEnabled: await configManager.getConfig('security:passport-local:isEmailAuthenticationEnabled'),
|
|
|
|
|
+ };
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_ID_PASS_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ localSettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating local setting';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-local-setting failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -1010,49 +1018,51 @@ module.exports = (crowi) => {
|
|
|
* securitySettingParams:
|
|
* securitySettingParams:
|
|
|
* $ref: '#/components/schemas/LdapAuthSetting'
|
|
* $ref: '#/components/schemas/LdapAuthSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/ldap', loginRequiredStrictly, adminRequired, addActivity, validator.ldapAuth, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- const requestParams = {
|
|
|
|
|
- 'security:passport-ldap:serverUrl': req.body.serverUrl,
|
|
|
|
|
- 'security:passport-ldap:isUserBind': req.body.isUserBind,
|
|
|
|
|
- 'security:passport-ldap:bindDN': req.body.ldapBindDN,
|
|
|
|
|
- 'security:passport-ldap:bindDNPassword': req.body.ldapBindDNPassword,
|
|
|
|
|
- 'security:passport-ldap:searchFilter': req.body.ldapSearchFilter,
|
|
|
|
|
- 'security:passport-ldap:attrMapUsername': req.body.ldapAttrMapUsername,
|
|
|
|
|
- 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
- 'security:passport-ldap:attrMapMail': req.body.ldapAttrMapMail,
|
|
|
|
|
- 'security:passport-ldap:attrMapName': req.body.ldapAttrMapName,
|
|
|
|
|
- 'security:passport-ldap:groupSearchBase': req.body.ldapGroupSearchBase,
|
|
|
|
|
- 'security:passport-ldap:groupSearchFilter': req.body.ldapGroupSearchFilter,
|
|
|
|
|
- 'security:passport-ldap:groupDnProperty': req.body.ldapGroupDnProperty,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ router.put('/ldap', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.ldapAuth, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ const requestParams = {
|
|
|
|
|
+ 'security:passport-ldap:serverUrl': req.body.serverUrl,
|
|
|
|
|
+ 'security:passport-ldap:isUserBind': req.body.isUserBind,
|
|
|
|
|
+ 'security:passport-ldap:bindDN': req.body.ldapBindDN,
|
|
|
|
|
+ 'security:passport-ldap:bindDNPassword': req.body.ldapBindDNPassword,
|
|
|
|
|
+ 'security:passport-ldap:searchFilter': req.body.ldapSearchFilter,
|
|
|
|
|
+ 'security:passport-ldap:attrMapUsername': req.body.ldapAttrMapUsername,
|
|
|
|
|
+ 'security:passport-ldap:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
+ 'security:passport-ldap:attrMapMail': req.body.ldapAttrMapMail,
|
|
|
|
|
+ 'security:passport-ldap:attrMapName': req.body.ldapAttrMapName,
|
|
|
|
|
+ 'security:passport-ldap:groupSearchBase': req.body.ldapGroupSearchBase,
|
|
|
|
|
+ 'security:passport-ldap:groupSearchFilter': req.body.ldapGroupSearchFilter,
|
|
|
|
|
+ 'security:passport-ldap:groupDnProperty': req.body.ldapGroupDnProperty,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- try {
|
|
|
|
|
- await updateAndReloadStrategySettings('ldap', requestParams);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await updateAndReloadStrategySettings('ldap', requestParams);
|
|
|
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- serverUrl: await configManager.getConfig('security:passport-ldap:serverUrl'),
|
|
|
|
|
- isUserBind: await configManager.getConfig('security:passport-ldap:isUserBind'),
|
|
|
|
|
- ldapBindDN: await configManager.getConfig('security:passport-ldap:bindDN'),
|
|
|
|
|
- ldapBindDNPassword: await configManager.getConfig('security:passport-ldap:bindDNPassword'),
|
|
|
|
|
- ldapSearchFilter: await configManager.getConfig('security:passport-ldap:searchFilter'),
|
|
|
|
|
- ldapAttrMapUsername: await configManager.getConfig('security:passport-ldap:attrMapUsername'),
|
|
|
|
|
- isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
- ldapAttrMapMail: await configManager.getConfig('security:passport-ldap:attrMapMail'),
|
|
|
|
|
- ldapAttrMapName: await configManager.getConfig('security:passport-ldap:attrMapName'),
|
|
|
|
|
- ldapGroupSearchBase: await configManager.getConfig('security:passport-ldap:groupSearchBase'),
|
|
|
|
|
- ldapGroupSearchFilter: await configManager.getConfig('security:passport-ldap:groupSearchFilter'),
|
|
|
|
|
- ldapGroupDnProperty: await configManager.getConfig('security:passport-ldap:groupDnProperty'),
|
|
|
|
|
- };
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_LDAP_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating SAML setting';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ serverUrl: await configManager.getConfig('security:passport-ldap:serverUrl'),
|
|
|
|
|
+ isUserBind: await configManager.getConfig('security:passport-ldap:isUserBind'),
|
|
|
|
|
+ ldapBindDN: await configManager.getConfig('security:passport-ldap:bindDN'),
|
|
|
|
|
+ ldapBindDNPassword: await configManager.getConfig('security:passport-ldap:bindDNPassword'),
|
|
|
|
|
+ ldapSearchFilter: await configManager.getConfig('security:passport-ldap:searchFilter'),
|
|
|
|
|
+ ldapAttrMapUsername: await configManager.getConfig('security:passport-ldap:attrMapUsername'),
|
|
|
|
|
+ isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-ldap:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
+ ldapAttrMapMail: await configManager.getConfig('security:passport-ldap:attrMapMail'),
|
|
|
|
|
+ ldapAttrMapName: await configManager.getConfig('security:passport-ldap:attrMapName'),
|
|
|
|
|
+ ldapGroupSearchBase: await configManager.getConfig('security:passport-ldap:groupSearchBase'),
|
|
|
|
|
+ ldapGroupSearchFilter: await configManager.getConfig('security:passport-ldap:groupSearchFilter'),
|
|
|
|
|
+ ldapGroupDnProperty: await configManager.getConfig('security:passport-ldap:groupDnProperty'),
|
|
|
|
|
+ };
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_LDAP_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating SAML setting';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -1080,78 +1090,80 @@ module.exports = (crowi) => {
|
|
|
* securitySettingParams:
|
|
* securitySettingParams:
|
|
|
* $ref: '#/components/schemas/SamlAuthSetting'
|
|
* $ref: '#/components/schemas/SamlAuthSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/saml', loginRequiredStrictly, adminRequired, addActivity, validator.samlAuth, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- const { t } = await getTranslation({ lang: req.user.lang, ns: ['translation', 'admin'] });
|
|
|
|
|
|
|
+ router.put('/saml', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.samlAuth, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ const { t } = await getTranslation({ lang: req.user.lang, ns: ['translation', 'admin'] });
|
|
|
|
|
|
|
|
- // For the value of each mandatory items,
|
|
|
|
|
- // check whether it from the environment variables is empty and form value to update it is empty
|
|
|
|
|
- // validate the syntax of a attribute - based login control rule
|
|
|
|
|
- const invalidValues = [];
|
|
|
|
|
- for (const configKey of crowi.passportService.mandatoryConfigKeysForSaml) {
|
|
|
|
|
- const key = configKey.replace('security:passport-saml:', '');
|
|
|
|
|
- const formValue = req.body[key];
|
|
|
|
|
- if (configManager.getConfig(configKey, ConfigSource.env) == null && formValue == null) {
|
|
|
|
|
- const formItemName = t(`security_settings.form_item_name.${key}`);
|
|
|
|
|
- invalidValues.push(t('input_validation.message.required', { param: formItemName }));
|
|
|
|
|
|
|
+ // For the value of each mandatory items,
|
|
|
|
|
+ // check whether it from the environment variables is empty and form value to update it is empty
|
|
|
|
|
+ // validate the syntax of a attribute - based login control rule
|
|
|
|
|
+ const invalidValues = [];
|
|
|
|
|
+ for (const configKey of crowi.passportService.mandatoryConfigKeysForSaml) {
|
|
|
|
|
+ const key = configKey.replace('security:passport-saml:', '');
|
|
|
|
|
+ const formValue = req.body[key];
|
|
|
|
|
+ if (configManager.getConfig(configKey, ConfigSource.env) == null && formValue == null) {
|
|
|
|
|
+ const formItemName = t(`security_settings.form_item_name.${key}`);
|
|
|
|
|
+ invalidValues.push(t('input_validation.message.required', { param: formItemName }));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- if (invalidValues.length !== 0) {
|
|
|
|
|
- return res.apiv3Err(t('input_validation.message.error_message'), 400, invalidValues);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- const rule = req.body.ABLCRule;
|
|
|
|
|
- // Empty string disables attribute-based login control.
|
|
|
|
|
- // So, when rule is empty string, validation is passed.
|
|
|
|
|
- if (rule != null) {
|
|
|
|
|
- try {
|
|
|
|
|
- crowi.passportService.parseABLCRule(rule);
|
|
|
|
|
|
|
+ if (invalidValues.length !== 0) {
|
|
|
|
|
+ return res.apiv3Err(t('input_validation.message.error_message'), 400, invalidValues);
|
|
|
}
|
|
}
|
|
|
- catch (err) {
|
|
|
|
|
- return res.apiv3Err(t('input_validation.message.invalid_syntax', { syntax: t('security_settings.form_item_name.ABLCRule') }), 400);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const rule = req.body.ABLCRule;
|
|
|
|
|
+ // Empty string disables attribute-based login control.
|
|
|
|
|
+ // So, when rule is empty string, validation is passed.
|
|
|
|
|
+ if (rule != null) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ crowi.passportService.parseABLCRule(rule);
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ return res.apiv3Err(t('input_validation.message.invalid_syntax', { syntax: t('security_settings.form_item_name.ABLCRule') }), 400);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- const requestParams = {
|
|
|
|
|
- 'security:passport-saml:entryPoint': req.body.entryPoint,
|
|
|
|
|
- 'security:passport-saml:issuer': req.body.issuer,
|
|
|
|
|
- 'security:passport-saml:cert': req.body.cert,
|
|
|
|
|
- 'security:passport-saml:attrMapId': req.body.attrMapId,
|
|
|
|
|
- 'security:passport-saml:attrMapUsername': req.body.attrMapUsername,
|
|
|
|
|
- 'security:passport-saml:attrMapMail': req.body.attrMapMail,
|
|
|
|
|
- 'security:passport-saml:attrMapFirstName': req.body.attrMapFirstName,
|
|
|
|
|
- 'security:passport-saml:attrMapLastName': req.body.attrMapLastName,
|
|
|
|
|
- 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
- 'security:passport-saml:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
|
|
|
|
|
- 'security:passport-saml:ABLCRule': req.body.ABLCRule,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ const requestParams = {
|
|
|
|
|
+ 'security:passport-saml:entryPoint': req.body.entryPoint,
|
|
|
|
|
+ 'security:passport-saml:issuer': req.body.issuer,
|
|
|
|
|
+ 'security:passport-saml:cert': req.body.cert,
|
|
|
|
|
+ 'security:passport-saml:attrMapId': req.body.attrMapId,
|
|
|
|
|
+ 'security:passport-saml:attrMapUsername': req.body.attrMapUsername,
|
|
|
|
|
+ 'security:passport-saml:attrMapMail': req.body.attrMapMail,
|
|
|
|
|
+ 'security:passport-saml:attrMapFirstName': req.body.attrMapFirstName,
|
|
|
|
|
+ 'security:passport-saml:attrMapLastName': req.body.attrMapLastName,
|
|
|
|
|
+ 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
+ 'security:passport-saml:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
|
|
|
|
|
+ 'security:passport-saml:ABLCRule': req.body.ABLCRule,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- try {
|
|
|
|
|
- await updateAndReloadStrategySettings('saml', requestParams);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await updateAndReloadStrategySettings('saml', requestParams);
|
|
|
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- missingMandatoryConfigKeys: await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
|
|
|
|
|
- samlEntryPoint: await configManager.getConfig('security:passport-saml:entryPoint', ConfigSource.db),
|
|
|
|
|
- samlIssuer: await configManager.getConfig('security:passport-saml:issuer', ConfigSource.db),
|
|
|
|
|
- samlCert: await configManager.getConfig('security:passport-saml:cert', ConfigSource.db),
|
|
|
|
|
- samlAttrMapId: await configManager.getConfig('security:passport-saml:attrMapId', ConfigSource.db),
|
|
|
|
|
- samlAttrMapUsername: await configManager.getConfig('security:passport-saml:attrMapUsername', ConfigSource.db),
|
|
|
|
|
- samlAttrMapMail: await configManager.getConfig('security:passport-saml:attrMapMail', ConfigSource.db),
|
|
|
|
|
- samlAttrMapFirstName: await configManager.getConfig('security:passport-saml:attrMapFirstName', ConfigSource.db),
|
|
|
|
|
- samlAttrMapLastName: await configManager.getConfig('security:passport-saml:attrMapLastName', ConfigSource.db),
|
|
|
|
|
- isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
- isSameEmailTreatedAsIdenticalUser: await configManager.getConfig('security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
|
|
|
|
|
- samlABLCRule: await configManager.getConfig('security:passport-saml:ABLCRule'),
|
|
|
|
|
- };
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_SAML_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating SAML setting';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ missingMandatoryConfigKeys: await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
|
|
|
|
|
+ samlEntryPoint: await configManager.getConfig('security:passport-saml:entryPoint', ConfigSource.db),
|
|
|
|
|
+ samlIssuer: await configManager.getConfig('security:passport-saml:issuer', ConfigSource.db),
|
|
|
|
|
+ samlCert: await configManager.getConfig('security:passport-saml:cert', ConfigSource.db),
|
|
|
|
|
+ samlAttrMapId: await configManager.getConfig('security:passport-saml:attrMapId', ConfigSource.db),
|
|
|
|
|
+ samlAttrMapUsername: await configManager.getConfig('security:passport-saml:attrMapUsername', ConfigSource.db),
|
|
|
|
|
+ samlAttrMapMail: await configManager.getConfig('security:passport-saml:attrMapMail', ConfigSource.db),
|
|
|
|
|
+ samlAttrMapFirstName: await configManager.getConfig('security:passport-saml:attrMapFirstName', ConfigSource.db),
|
|
|
|
|
+ samlAttrMapLastName: await configManager.getConfig('security:passport-saml:attrMapLastName', ConfigSource.db),
|
|
|
|
|
+ isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-saml:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
+ isSameEmailTreatedAsIdenticalUser: await configManager.getConfig('security:passport-saml:isSameEmailTreatedAsIdenticalUser'),
|
|
|
|
|
+ samlABLCRule: await configManager.getConfig('security:passport-saml:ABLCRule'),
|
|
|
|
|
+ };
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_SAML_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating SAML setting';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-SAML-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -1179,61 +1191,63 @@ module.exports = (crowi) => {
|
|
|
* securitySettingParams:
|
|
* securitySettingParams:
|
|
|
* $ref: '#/components/schemas/OidcAuthSetting'
|
|
* $ref: '#/components/schemas/OidcAuthSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/oidc', loginRequiredStrictly, adminRequired, addActivity, validator.oidcAuth, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- const requestParams = {
|
|
|
|
|
- 'security:passport-oidc:providerName': req.body.oidcProviderName,
|
|
|
|
|
- 'security:passport-oidc:issuerHost': req.body.oidcIssuerHost,
|
|
|
|
|
- 'security:passport-oidc:authorizationEndpoint': req.body.oidcAuthorizationEndpoint,
|
|
|
|
|
- 'security:passport-oidc:tokenEndpoint': req.body.oidcTokenEndpoint,
|
|
|
|
|
- 'security:passport-oidc:revocationEndpoint': req.body.oidcRevocationEndpoint,
|
|
|
|
|
- 'security:passport-oidc:introspectionEndpoint': req.body.oidcIntrospectionEndpoint,
|
|
|
|
|
- 'security:passport-oidc:userInfoEndpoint': req.body.oidcUserInfoEndpoint,
|
|
|
|
|
- 'security:passport-oidc:endSessionEndpoint': req.body.oidcEndSessionEndpoint,
|
|
|
|
|
- 'security:passport-oidc:registrationEndpoint': req.body.oidcRegistrationEndpoint,
|
|
|
|
|
- 'security:passport-oidc:jwksUri': req.body.oidcJWKSUri,
|
|
|
|
|
- 'security:passport-oidc:clientId': req.body.oidcClientId,
|
|
|
|
|
- 'security:passport-oidc:clientSecret': req.body.oidcClientSecret,
|
|
|
|
|
- 'security:passport-oidc:attrMapId': req.body.oidcAttrMapId,
|
|
|
|
|
- 'security:passport-oidc:attrMapUserName': req.body.oidcAttrMapUserName,
|
|
|
|
|
- 'security:passport-oidc:attrMapName': req.body.oidcAttrMapName,
|
|
|
|
|
- 'security:passport-oidc:attrMapMail': req.body.oidcAttrMapEmail,
|
|
|
|
|
- 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
- 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ router.put('/oidc', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.oidcAuth, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ const requestParams = {
|
|
|
|
|
+ 'security:passport-oidc:providerName': req.body.oidcProviderName,
|
|
|
|
|
+ 'security:passport-oidc:issuerHost': req.body.oidcIssuerHost,
|
|
|
|
|
+ 'security:passport-oidc:authorizationEndpoint': req.body.oidcAuthorizationEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:tokenEndpoint': req.body.oidcTokenEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:revocationEndpoint': req.body.oidcRevocationEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:introspectionEndpoint': req.body.oidcIntrospectionEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:userInfoEndpoint': req.body.oidcUserInfoEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:endSessionEndpoint': req.body.oidcEndSessionEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:registrationEndpoint': req.body.oidcRegistrationEndpoint,
|
|
|
|
|
+ 'security:passport-oidc:jwksUri': req.body.oidcJWKSUri,
|
|
|
|
|
+ 'security:passport-oidc:clientId': req.body.oidcClientId,
|
|
|
|
|
+ 'security:passport-oidc:clientSecret': req.body.oidcClientSecret,
|
|
|
|
|
+ 'security:passport-oidc:attrMapId': req.body.oidcAttrMapId,
|
|
|
|
|
+ 'security:passport-oidc:attrMapUserName': req.body.oidcAttrMapUserName,
|
|
|
|
|
+ 'security:passport-oidc:attrMapName': req.body.oidcAttrMapName,
|
|
|
|
|
+ 'security:passport-oidc:attrMapMail': req.body.oidcAttrMapEmail,
|
|
|
|
|
+ 'security:passport-oidc:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
+ 'security:passport-oidc:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- try {
|
|
|
|
|
- await updateAndReloadStrategySettings('oidc', requestParams);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await updateAndReloadStrategySettings('oidc', requestParams);
|
|
|
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- oidcProviderName: await configManager.getConfig('security:passport-oidc:providerName'),
|
|
|
|
|
- oidcIssuerHost: await configManager.getConfig('security:passport-oidc:issuerHost'),
|
|
|
|
|
- oidcAuthorizationEndpoint: await configManager.getConfig('security:passport-oidc:authorizationEndpoint'),
|
|
|
|
|
- oidcTokenEndpoint: await configManager.getConfig('security:passport-oidc:tokenEndpoint'),
|
|
|
|
|
- oidcRevocationEndpoint: await configManager.getConfig('security:passport-oidc:revocationEndpoint'),
|
|
|
|
|
- oidcIntrospectionEndpoint: await configManager.getConfig('security:passport-oidc:introspectionEndpoint'),
|
|
|
|
|
- oidcUserInfoEndpoint: await configManager.getConfig('security:passport-oidc:userInfoEndpoint'),
|
|
|
|
|
- oidcEndSessionEndpoint: await configManager.getConfig('security:passport-oidc:endSessionEndpoint'),
|
|
|
|
|
- oidcRegistrationEndpoint: await configManager.getConfig('security:passport-oidc:registrationEndpoint'),
|
|
|
|
|
- oidcJWKSUri: await configManager.getConfig('security:passport-oidc:jwksUri'),
|
|
|
|
|
- oidcClientId: await configManager.getConfig('security:passport-oidc:clientId'),
|
|
|
|
|
- oidcClientSecret: await configManager.getConfig('security:passport-oidc:clientSecret'),
|
|
|
|
|
- oidcAttrMapId: await configManager.getConfig('security:passport-oidc:attrMapId'),
|
|
|
|
|
- oidcAttrMapUserName: await configManager.getConfig('security:passport-oidc:attrMapUserName'),
|
|
|
|
|
- oidcAttrMapName: await configManager.getConfig('security:passport-oidc:attrMapName'),
|
|
|
|
|
- oidcAttrMapEmail: await configManager.getConfig('security:passport-oidc:attrMapMail'),
|
|
|
|
|
- isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
- isSameEmailTreatedAsIdenticalUser: await configManager.getConfig('security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
|
|
|
|
|
- };
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_OIDC_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating OpenIDConnect';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-OpenIDConnect-failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ oidcProviderName: await configManager.getConfig('security:passport-oidc:providerName'),
|
|
|
|
|
+ oidcIssuerHost: await configManager.getConfig('security:passport-oidc:issuerHost'),
|
|
|
|
|
+ oidcAuthorizationEndpoint: await configManager.getConfig('security:passport-oidc:authorizationEndpoint'),
|
|
|
|
|
+ oidcTokenEndpoint: await configManager.getConfig('security:passport-oidc:tokenEndpoint'),
|
|
|
|
|
+ oidcRevocationEndpoint: await configManager.getConfig('security:passport-oidc:revocationEndpoint'),
|
|
|
|
|
+ oidcIntrospectionEndpoint: await configManager.getConfig('security:passport-oidc:introspectionEndpoint'),
|
|
|
|
|
+ oidcUserInfoEndpoint: await configManager.getConfig('security:passport-oidc:userInfoEndpoint'),
|
|
|
|
|
+ oidcEndSessionEndpoint: await configManager.getConfig('security:passport-oidc:endSessionEndpoint'),
|
|
|
|
|
+ oidcRegistrationEndpoint: await configManager.getConfig('security:passport-oidc:registrationEndpoint'),
|
|
|
|
|
+ oidcJWKSUri: await configManager.getConfig('security:passport-oidc:jwksUri'),
|
|
|
|
|
+ oidcClientId: await configManager.getConfig('security:passport-oidc:clientId'),
|
|
|
|
|
+ oidcClientSecret: await configManager.getConfig('security:passport-oidc:clientSecret'),
|
|
|
|
|
+ oidcAttrMapId: await configManager.getConfig('security:passport-oidc:attrMapId'),
|
|
|
|
|
+ oidcAttrMapUserName: await configManager.getConfig('security:passport-oidc:attrMapUserName'),
|
|
|
|
|
+ oidcAttrMapName: await configManager.getConfig('security:passport-oidc:attrMapName'),
|
|
|
|
|
+ oidcAttrMapEmail: await configManager.getConfig('security:passport-oidc:attrMapMail'),
|
|
|
|
|
+ isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-oidc:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
+ isSameEmailTreatedAsIdenticalUser: await configManager.getConfig('security:passport-oidc:isSameEmailTreatedAsIdenticalUser'),
|
|
|
|
|
+ };
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_OIDC_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating OpenIDConnect';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-OpenIDConnect-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -1261,32 +1275,33 @@ module.exports = (crowi) => {
|
|
|
* securitySettingParams:
|
|
* securitySettingParams:
|
|
|
* $ref: '#/components/schemas/GoogleOAuthSetting'
|
|
* $ref: '#/components/schemas/GoogleOAuthSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/google-oauth', loginRequiredStrictly, adminRequired, addActivity, validator.googleOAuth, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
-
|
|
|
|
|
- try {
|
|
|
|
|
- await updateAndReloadStrategySettings('google', {
|
|
|
|
|
- 'security:passport-google:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
|
|
|
|
|
- });
|
|
|
|
|
- await updateAndReloadStrategySettings('google', {
|
|
|
|
|
- 'security:passport-google:clientId': toNonBlankStringOrUndefined(req.body.googleClientId),
|
|
|
|
|
- 'security:passport-google:clientSecret': toNonBlankStringOrUndefined(req.body.googleClientSecret),
|
|
|
|
|
- }, { removeIfUndefined: true });
|
|
|
|
|
|
|
+ router.put('/google-oauth', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.googleOAuth, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await updateAndReloadStrategySettings('google', {
|
|
|
|
|
+ 'security:passport-google:isSameEmailTreatedAsIdenticalUser': req.body.isSameEmailTreatedAsIdenticalUser,
|
|
|
|
|
+ });
|
|
|
|
|
+ await updateAndReloadStrategySettings('google', {
|
|
|
|
|
+ 'security:passport-google:clientId': toNonBlankStringOrUndefined(req.body.googleClientId),
|
|
|
|
|
+ 'security:passport-google:clientSecret': toNonBlankStringOrUndefined(req.body.googleClientSecret),
|
|
|
|
|
+ }, { removeIfUndefined: true });
|
|
|
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- googleClientId: await configManager.getConfig('security:passport-google:clientId'),
|
|
|
|
|
- googleClientSecret: await configManager.getConfig('security:passport-google:clientSecret'),
|
|
|
|
|
- isSameEmailTreatedAsIdenticalUser: await configManager.getConfig('security:passport-google:isSameEmailTreatedAsIdenticalUser'),
|
|
|
|
|
- };
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_GOOGLE_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- const msg = 'Error occurred in updating googleOAuth';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-googleOAuth-failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ googleClientId: await configManager.getConfig('security:passport-google:clientId'),
|
|
|
|
|
+ googleClientSecret: await configManager.getConfig('security:passport-google:clientSecret'),
|
|
|
|
|
+ isSameEmailTreatedAsIdenticalUser: await configManager.getConfig('security:passport-google:isSameEmailTreatedAsIdenticalUser'),
|
|
|
|
|
+ };
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_GOOGLE_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating googleOAuth';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-googleOAuth-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
@@ -1314,33 +1329,35 @@ module.exports = (crowi) => {
|
|
|
* securitySettingParams:
|
|
* securitySettingParams:
|
|
|
* $ref: '#/components/schemas/GitHubOAuthSetting'
|
|
* $ref: '#/components/schemas/GitHubOAuthSetting'
|
|
|
*/
|
|
*/
|
|
|
- router.put('/github-oauth', loginRequiredStrictly, adminRequired, addActivity, validator.githubOAuth, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
- const requestParams = {
|
|
|
|
|
- 'security:passport-github:clientId': req.body.githubClientId,
|
|
|
|
|
- 'security:passport-github:clientSecret': req.body.githubClientSecret,
|
|
|
|
|
- 'security:passport-github:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ router.put('/github-oauth', accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]), loginRequiredStrictly, adminRequired, addActivity,
|
|
|
|
|
+ validator.githubOAuth, apiV3FormValidator,
|
|
|
|
|
+ async(req, res) => {
|
|
|
|
|
+ const requestParams = {
|
|
|
|
|
+ 'security:passport-github:clientId': req.body.githubClientId,
|
|
|
|
|
+ 'security:passport-github:clientSecret': req.body.githubClientSecret,
|
|
|
|
|
+ 'security:passport-github:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- try {
|
|
|
|
|
- await updateAndReloadStrategySettings('github', requestParams);
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ await updateAndReloadStrategySettings('github', requestParams);
|
|
|
|
|
|
|
|
- const securitySettingParams = {
|
|
|
|
|
- githubClientId: await configManager.getConfig('security:passport-github:clientId'),
|
|
|
|
|
- githubClientSecret: await configManager.getConfig('security:passport-github:clientSecret'),
|
|
|
|
|
- isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
- };
|
|
|
|
|
- const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_GITHUB_UPDATE };
|
|
|
|
|
- activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
- return res.apiv3({ securitySettingParams });
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
|
|
+ const securitySettingParams = {
|
|
|
|
|
+ githubClientId: await configManager.getConfig('security:passport-github:clientId'),
|
|
|
|
|
+ githubClientSecret: await configManager.getConfig('security:passport-github:clientSecret'),
|
|
|
|
|
+ isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig('security:passport-github:isSameUsernameTreatedAsIdenticalUser'),
|
|
|
|
|
+ };
|
|
|
|
|
+ const parameters = { action: SupportedAction.ACTION_ADMIN_AUTH_GITHUB_UPDATE };
|
|
|
|
|
+ activityEvent.emit('update', res.locals.activity._id, parameters);
|
|
|
|
|
+ return res.apiv3({ securitySettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
// reset strategy
|
|
// reset strategy
|
|
|
- await crowi.passportService.resetGitHubStrategy();
|
|
|
|
|
- const msg = 'Error occurred in updating githubOAuth';
|
|
|
|
|
- logger.error('Error', err);
|
|
|
|
|
- return res.apiv3Err(new ErrorV3(msg, 'update-githubOAuth-failed'));
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ await crowi.passportService.resetGitHubStrategy();
|
|
|
|
|
+ const msg = 'Error occurred in updating githubOAuth';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-githubOAuth-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
return router;
|
|
return router;
|
|
|
};
|
|
};
|