| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754 |
- import {
- ConfigSource,
- SCOPE,
- toNonBlankStringOrUndefined,
- } from '@growi/core/dist/interfaces';
- import { ErrorV3 } from '@growi/core/dist/models';
- import xss from 'xss';
- import { SupportedAction } from '~/interfaces/activity';
- import { PageDeleteConfigValue } from '~/interfaces/page-delete-config';
- import { accessTokenParser } from '~/server/middlewares/access-token-parser';
- import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
- import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
- import ShareLink from '~/server/models/share-link';
- import { configManager } from '~/server/service/config-manager';
- import loggerFactory from '~/utils/logger';
- import {
- prepareDeleteConfigValuesForCalc,
- validateDeleteConfigs,
- } from '~/utils/page-delete-config';
- import { checkSetupStrategiesHasAdmin } from './checkSetupStrategiesHasAdmin';
- import { handleSamlUpdate, samlAuthValidator } from './saml';
- const logger = loggerFactory('growi:routes:apiv3:security-setting');
- const express = require('express');
- const router = express.Router();
- const { body } = require('express-validator');
- const validator = {
- generalSetting: [
- body('sessionMaxAge').optional({ checkFalsy: true }).trim().isInt(),
- body('restrictGuestMode')
- .if((value) => value != null)
- .isString()
- .isIn(['Deny', 'Readonly']),
- body('pageCompleteDeletionAuthority')
- .if((value) => value != null)
- .isString()
- .isIn(Object.values(PageDeleteConfigValue)),
- body('hideRestrictedByOwner')
- .if((value) => value != null)
- .isBoolean(),
- body('hideRestrictedByGroup')
- .if((value) => value != null)
- .isBoolean(),
- body('isUsersHomepageDeletionEnabled')
- .if((value) => value != null)
- .isBoolean(),
- body('isForceDeleteUserHomepageOnUserDeletion')
- .if((value) => value != null)
- .isBoolean(),
- ],
- shareLinkSetting: [
- body('disableLinkSharing')
- .if((value) => value != null)
- .isBoolean(),
- ],
- authenticationSetting: [
- body('isEnabled')
- .if((value) => value != null)
- .isBoolean(),
- body('authId')
- .isString()
- .isIn(['local', 'ldap', 'saml', 'oidc', 'google', 'github']),
- ],
- localSetting: [
- body('registrationMode').isString().isIn(['Open', 'Restricted', 'Closed']),
- body('registrationWhitelist')
- .if((value) => value != null)
- .isArray()
- .customSanitizer((value, { req }) => {
- return value.filter((email) => email !== '');
- }),
- ],
- ldapAuth: [
- body('serverUrl')
- .if((value) => value != null)
- .isString(),
- body('isUserBind')
- .if((value) => value != null)
- .isBoolean(),
- body('ldapBindDN')
- .if((value) => value != null)
- .isString(),
- body('ldapBindDNPassword')
- .if((value) => value != null)
- .isString(),
- body('ldapSearchFilter')
- .if((value) => value != null)
- .isString(),
- body('ldapAttrMapUsername')
- .if((value) => value != null)
- .isString(),
- body('isSameUsernameTreatedAsIdenticalUser')
- .if((value) => value != null)
- .isBoolean(),
- body('ldapAttrMapMail')
- .if((value) => value != null)
- .isString(),
- body('ldapAttrMapName')
- .if((value) => value != null)
- .isString(),
- body('ldapGroupSearchBase')
- .if((value) => value != null)
- .isString(),
- body('ldapGroupSearchFilter')
- .if((value) => value != null)
- .isString(),
- body('ldapGroupDnProperty')
- .if((value) => value != null)
- .isString(),
- ],
- oidcAuth: [
- body('oidcProviderName')
- .if((value) => value != null)
- .isString(),
- body('oidcIssuerHost')
- .if((value) => value != null)
- .isString(),
- body('oidcAuthorizationEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcTokenEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcRevocationEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcIntrospectionEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcUserInfoEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcEndSessionEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcRegistrationEndpoint')
- .if((value) => value != null)
- .isString(),
- body('oidcJWKSUri')
- .if((value) => value != null)
- .isString(),
- body('oidcClientId')
- .if((value) => value != null)
- .isString(),
- body('oidcClientSecret')
- .if((value) => value != null)
- .isString(),
- body('oidcAttrMapId')
- .if((value) => value != null)
- .isString(),
- body('oidcAttrMapUserName')
- .if((value) => value != null)
- .isString(),
- body('oidcAttrMapEmail')
- .if((value) => value != null)
- .isString(),
- body('isSameUsernameTreatedAsIdenticalUser')
- .if((value) => value != null)
- .isBoolean(),
- body('isSameEmailTreatedAsIdenticalUser')
- .if((value) => value != null)
- .isBoolean(),
- ],
- googleOAuth: [
- body('googleClientId')
- .if((value) => value != null)
- .isString(),
- body('googleClientSecret')
- .if((value) => value != null)
- .isString(),
- body('isSameUsernameTreatedAsIdenticalUser')
- .if((value) => value != null)
- .isBoolean(),
- ],
- githubOAuth: [
- body('githubClientId')
- .if((value) => value != null)
- .isString(),
- body('githubClientSecret')
- .if((value) => value != null)
- .isString(),
- body('isSameUsernameTreatedAsIdenticalUser')
- .if((value) => value != null)
- .isBoolean(),
- ],
- };
- /**
- * @swagger
- *
- * components:
- * schemas:
- * GeneralSetting:
- * type: object
- * properties:
- * restrictGuestMode:
- * type: string
- * description: type of restrictGuestMode
- * pageDeletionAuthority:
- * type: string
- * description: type of pageDeletionAuthority
- * pageRecursiveDeletionAuthority:
- * type: string
- * description: type of pageRecursiveDeletionAuthority
- * pageRecursiveCompleteDeletionAuthority:
- * type: string
- * description: type of pageRecursiveCompleteDeletionAuthority
- * isAllGroupMembershipRequiredForPageCompleteDeletion:
- * type: boolean
- * description: enable all group membership required for page complete deletion
- * pageCompleteDeletionAuthority:
- * type: string
- * description: type of pageDeletionAuthority
- * hideRestrictedByOwner:
- * type: boolean
- * description: enable hide by owner
- * hideRestrictedByGroup:
- * type: boolean
- * description: enable hide by group
- * isUsersHomepageDeletionEnabled:
- * type: boolean
- * description: enable user homepage deletion
- * isForceDeleteUserHomepageOnUserDeletion:
- * type: boolean
- * description: enable force delete user homepage on user deletion
- * isRomUserAllowedToComment:
- * type: boolean
- * description: enable rom user allowed to comment
- * wikiMode:
- * type: string
- * description: type of wikiMode
- * sessionMaxAge:
- * type: integer
- * description: max age of session
- * ShareLinkSetting:
- * type: object
- * properties:
- * disableLinkSharing:
- * type: boolean
- * description: disable link sharing
- * LocalSetting:
- * type: object
- * properties:
- * useOnlyEnvVarsForSomeOptions:
- * type: boolean
- * description: use only env vars for some options
- * isPasswordResetEnabled:
- * type: boolean
- * description: enable password reset
- * isEmailAuthenticationEnabled:
- * type: boolean
- * description: enable email authentication
- * isLocalEnabled:
- * type: boolean
- * description: local setting mode
- * registrationMode:
- * type: string
- * description: type of registrationMode
- * registrationWhitelist:
- * type: array
- * description: array of regsitrationList
- * items:
- * type: string
- * description: registration whitelist
- * GeneralAuthSetting:
- * type: object
- * properties:
- * isLocalEnabled:
- * type: boolean
- * description: local setting mode
- * isLdapEnabled:
- * type: boolean
- * description: ldap setting mode
- * isSamlEnabled:
- * type: boolean
- * description: saml setting mode
- * isOidcEnabled:
- * type: boolean
- * description: oidc setting mode
- * isGoogleEnabled:
- * type: boolean
- * description: google setting mode
- * isGitHubEnabled:
- * type: boolean
- * description: github setting mode
- * LdapAuthSetting:
- * type: object
- * properties:
- * serverUrl:
- * type: string
- * description: server url for ldap
- * isUserBind:
- * type: boolean
- * description: enable user bind
- * ldapBindDN:
- * type: string
- * description: the query used to bind with the directory service
- * ldapBindDNPassword:
- * type: string
- * description: the password that is entered in the login page will be used to bind
- * ldapSearchFilter:
- * type: string
- * description: the query used to locate the authenticated user
- * ldapAttrMapUsername:
- * type: string
- * description: specification of mappings for username when creating new users
- * isSameUsernameTreatedAsIdenticalUser:
- * type: boolean
- * description: local account automatically linked the user name matched
- * ldapAttrMapMail:
- * type: string
- * description: specification of mappings for mail address when creating new users
- * ldapAttrMapName:
- * type: string
- * description: Specification of mappings for full name address when creating new users
- * ldapGroupSearchBase:
- * type: string
- * description: the base DN from which to search for groups.
- * ldapGroupSearchFilter:
- * type: string
- * description: the query used to filter for groups
- * ldapGroupDnProperty:
- * type: string
- * description: The property of user object to use in dn interpolation of Group Search Filter
- * OidcAuthSetting:
- * type: object
- * properties:
- * oidcProviderName:
- * type: string
- * description: provider name for oidc
- * oidcIssuerHost:
- * type: string
- * description: issuer host for oidc
- * oidcAuthorizationEndpoint:
- * type: string
- * description: authorization endpoint for oidc
- * oidcTokenEndpoint:
- * type: string
- * description: token endpoint for oidc
- * oidcRevocationEndpoint:
- * type: string
- * description: revocation endpoint for oidc
- * oidcIntrospectionEndpoint:
- * type: string
- * description: introspection endpoint for oidc
- * oidcUserInfoEndpoint:
- * type: string
- * description: userinfo endpoint for oidc
- * oidcEndSessionEndpoint:
- * type: string
- * description: end session endpoint for oidc
- * oidcRegistrationEndpoint:
- * type: string
- * description: registration endpoint for oidc
- * oidcJWKSUri:
- * type: string
- * description: JSON Web Key Set URI for oidc
- * oidcClientId:
- * type: string
- * description: client id for oidc
- * oidcClientSecret:
- * type: string
- * description: client secret for oidc
- * oidcAttrMapId:
- * type: string
- * description: attr map id for oidc
- * oidcAttrMapUserName:
- * type: string
- * description: attr map username for oidc
- * oidcAttrMapName:
- * type: string
- * description: attr map name for oidc
- * oidcAttrMapMail:
- * type: string
- * description: attr map mail for oidc
- * isSameUsernameTreatedAsIdenticalUser:
- * type: boolean
- * description: local account automatically linked the user name matched
- * isSameEmailTreatedAsIdenticalUser:
- * type: boolean
- * description: local account automatically linked the email matched
- * GitHubOAuthSetting:
- * type: object
- * properties:
- * githubClientId:
- * type: string
- * description: key of comsumer
- * githubClientSecret:
- * type: string
- * description: password of comsumer
- * isSameUsernameTreatedAsIdenticalUser:
- * type: boolean
- * description: local account automatically linked the email matched
- * GoogleOAuthSetting:
- * type: object
- * properties:
- * googleClientId:
- * type: string
- * description: key of comsumer
- * googleClientSecret:
- * type: string
- * description: password of comsumer
- * isSameUsernameTreatedAsIdenticalUser:
- * type: boolean
- * description: local account automatically linked the email matched
- */
- /** @param {import('~/server/crowi').default} crowi Crowi instance */
- module.exports = (crowi) => {
- const loginRequiredStrictly = require('~/server/middlewares/login-required')(
- crowi,
- );
- const adminRequired = require('~/server/middlewares/admin-required')(crowi);
- const addActivity = generateAddActivityMiddleware(crowi);
- const activityEvent = crowi.event('activity');
- async function updateAndReloadStrategySettings(
- authId,
- params,
- opts = { removeIfUndefined: false },
- ) {
- const { passportService } = crowi;
- // update config without publishing S2sMessage
- await configManager.updateConfigs(params, {
- skipPubsub: true,
- removeIfUndefined: opts.removeIfUndefined,
- });
- await passportService.setupStrategyById(authId);
- passportService.publishUpdatedMessage(authId);
- }
- /**
- * @swagger
- *
- * /security-setting/:
- * get:
- * tags: [SecuritySetting]
- * description: Get security paramators
- * responses:
- * 200:
- * description: params of security
- * content:
- * application/json:
- * schema:
- * properties:
- * securityParams:
- * type: object
- * description: security params
- * properties:
- * generalSetting:
- * $ref: '#/components/schemas/GeneralSetting'
- * shareLinkSetting:
- * $ref: '#/components/schemas/ShareLinkSetting'
- * localSetting:
- * $ref: '#/components/schemas/LocalSetting'
- * generalAuth:
- * $ref: '#/components/schemas/GeneralAuthSetting'
- * ldapAuth:
- * $ref: '#/components/schemas/LdapAuthSetting'
- * samlAuth:
- * $ref: '#/components/schemas/SamlAuthSetting'
- * oidcAuth:
- * $ref: '#/components/schemas/OidcAuthSetting'
- * googleOAuth:
- * $ref: '#/components/schemas/GoogleOAuthSetting'
- * githubOAuth:
- * $ref: '#/components/schemas/GitHubOAuthSetting'
- */
- router.get(
- '/',
- accessTokenParser([SCOPE.READ.ADMIN.SECURITY]),
- loginRequiredStrictly,
- adminRequired,
- async (req, res) => {
- const securityParams = {
- generalSetting: {
- restrictGuestMode: crowi.aclService.getGuestModeValue(),
- 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',
- ),
- 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',
- ),
- isRomUserAllowedToComment: await configManager.getConfig(
- 'security:isRomUserAllowedToComment',
- ),
- wikiMode: await configManager.getConfig('security:wikiMode'),
- sessionMaxAge: await configManager.getConfig(
- 'security:sessionMaxAge',
- ),
- },
- shareLinkSetting: {
- disableLinkSharing: await configManager.getConfig(
- 'security:disableLinkSharing',
- ),
- },
- localSetting: {
- useOnlyEnvVarsForSomeOptions: await configManager.getConfig(
- 'env:useOnlyEnvVars:security:passport-local',
- ),
- 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',
- ),
- },
- generalAuth: {
- isLocalEnabled: await configManager.getConfig(
- 'security:passport-local:isEnabled',
- ),
- isLdapEnabled: await configManager.getConfig(
- 'security:passport-ldap:isEnabled',
- ),
- isSamlEnabled: await configManager.getConfig(
- 'security:passport-saml:isEnabled',
- ),
- isOidcEnabled: await configManager.getConfig(
- 'security:passport-oidc:isEnabled',
- ),
- isGoogleEnabled: await configManager.getConfig(
- 'security:passport-google:isEnabled',
- ),
- isGitHubEnabled: await configManager.getConfig(
- 'security:passport-github:isEnabled',
- ),
- },
- ldapAuth: {
- 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',
- ),
- },
- samlAuth: {
- missingMandatoryConfigKeys:
- await crowi.passportService.getSamlMissingMandatoryConfigKeys(),
- useOnlyEnvVarsForSomeOptions: await configManager.getConfig(
- 'env:useOnlyEnvVars:security:passport-saml',
- ConfigSource.env,
- ),
- samlEntryPoint: await configManager.getConfig(
- 'security:passport-saml:entryPoint',
- ConfigSource.db,
- ),
- samlEnvVarEntryPoint: await configManager.getConfig(
- 'security:passport-saml:entryPoint',
- ConfigSource.env,
- ),
- samlIssuer: await configManager.getConfig(
- 'security:passport-saml:issuer',
- ConfigSource.db,
- ),
- samlEnvVarIssuer: await configManager.getConfig(
- 'security:passport-saml:issuer',
- ConfigSource.env,
- ),
- samlCert: await configManager.getConfig(
- 'security:passport-saml:cert',
- ConfigSource.db,
- ),
- samlEnvVarCert: await configManager.getConfig(
- 'security:passport-saml:cert',
- ConfigSource.env,
- ),
- samlAttrMapId: await configManager.getConfig(
- 'security:passport-saml:attrMapId',
- ConfigSource.db,
- ),
- samlEnvVarAttrMapId: await configManager.getConfig(
- 'security:passport-saml:attrMapId',
- ConfigSource.env,
- ),
- samlAttrMapUsername: await configManager.getConfig(
- 'security:passport-saml:attrMapUsername',
- ConfigSource.db,
- ),
- samlEnvVarAttrMapUsername: await configManager.getConfig(
- 'security:passport-saml:attrMapUsername',
- ConfigSource.env,
- ),
- samlAttrMapMail: await configManager.getConfig(
- 'security:passport-saml:attrMapMail',
- ConfigSource.db,
- ),
- samlEnvVarAttrMapMail: await configManager.getConfig(
- 'security:passport-saml:attrMapMail',
- ConfigSource.env,
- ),
- samlAttrMapFirstName: await configManager.getConfig(
- 'security:passport-saml:attrMapFirstName',
- ConfigSource.db,
- ),
- samlEnvVarAttrMapFirstName: await configManager.getConfig(
- 'security:passport-saml:attrMapFirstName',
- ConfigSource.env,
- ),
- samlAttrMapLastName: await configManager.getConfig(
- 'security:passport-saml:attrMapLastName',
- ConfigSource.db,
- ),
- samlEnvVarAttrMapLastName: await configManager.getConfig(
- 'security:passport-saml:attrMapLastName',
- ConfigSource.env,
- ),
- isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig(
- 'security:passport-saml:isSameUsernameTreatedAsIdenticalUser',
- ),
- isSameEmailTreatedAsIdenticalUser: await configManager.getConfig(
- 'security:passport-saml:isSameEmailTreatedAsIdenticalUser',
- ),
- samlABLCRule: await configManager.getConfig(
- 'security:passport-saml:ABLCRule',
- ConfigSource.db,
- ),
- samlEnvVarABLCRule: await configManager.getConfig(
- 'security:passport-saml:ABLCRule',
- ConfigSource.env,
- ),
- },
- oidcAuth: {
- 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',
- ),
- },
- googleOAuth: {
- googleClientId: await configManager.getConfig(
- 'security:passport-google:clientId',
- ),
- googleClientSecret: await configManager.getConfig(
- 'security:passport-google:clientSecret',
- ),
- isSameEmailTreatedAsIdenticalUser: await configManager.getConfig(
- 'security:passport-google:isSameEmailTreatedAsIdenticalUser',
- ),
- },
- githubOAuth: {
- githubClientId: await configManager.getConfig(
- 'security:passport-github:clientId',
- ),
- githubClientSecret: await configManager.getConfig(
- 'security:passport-github:clientSecret',
- ),
- isSameUsernameTreatedAsIdenticalUser: await configManager.getConfig(
- 'security:passport-github:isSameUsernameTreatedAsIdenticalUser',
- ),
- },
- };
- return res.apiv3({ securityParams });
- },
- );
- /**
- * @swagger
- *
- * /security-setting/authentication/enabled:
- * put:
- * tags: [SecuritySetting]
- * description: Update authentication isEnabled
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * type: object
- * properties:
- * isEnabled:
- * type: boolean
- * authId:
- * type: string
- * responses:
- * 200:
- * description: Succeeded to enable authentication
- * content:
- * application/json:
- * schema:
- * type: object
- * description: updated param
- */
- // eslint-disable-next-line max-len
- router.put(
- '/authentication/enabled',
- accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]),
- loginRequiredStrictly,
- adminRequired,
- addActivity,
- validator.authenticationSetting,
- apiV3FormValidator,
- async (req, res) => {
- const { isEnabled, authId } = req.body;
- let setupStrategies = await crowi.passportService.getSetupStrategies();
- const parameters = {};
- // Reflect request param
- setupStrategies = setupStrategies.filter(
- (strategy) => strategy !== authId,
- );
- if (setupStrategies.length === 0) {
- return res.apiv3Err(new ErrorV3('Can not turn everything off'), 405);
- }
- if (!isEnabled) {
- const isSetupStrategiesHasAdmin =
- await checkSetupStrategiesHasAdmin(setupStrategies);
- // Return an error when disabling an strategy when there are no setup strategies with admin-enabled login
- if (!isSetupStrategiesHasAdmin) {
- return res.apiv3Err(
- new ErrorV3('Must have admin enabled authentication method'),
- 405,
- );
- }
- }
- const enableParams = {
- [`security:passport-${authId}:isEnabled`]: isEnabled,
- };
- try {
- await updateAndReloadStrategySettings(authId, enableParams);
- const responseParams = {
- [`security:passport-${authId}:isEnabled`]:
- await configManager.getConfig(
- `security:passport-${authId}:isEnabled`,
- ),
- };
- switch (authId) {
- case 'local':
- if (isEnabled) {
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_ID_PASS_ENABLED;
- break;
- }
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_ID_PASS_DISABLED;
- break;
- case 'ldap':
- if (isEnabled) {
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_LDAP_ENABLED;
- break;
- }
- parameters.action = SupportedAction.ACTION_ADMIN_AUTH_LDAP_DISABLED;
- break;
- case 'saml':
- if (isEnabled) {
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_SAML_ENABLED;
- break;
- }
- parameters.action = SupportedAction.ACTION_ADMIN_AUTH_SAML_DISABLED;
- break;
- case 'oidc':
- if (isEnabled) {
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_OIDC_ENABLED;
- break;
- }
- parameters.action = SupportedAction.ACTION_ADMIN_AUTH_OIDC_DISABLED;
- break;
- case 'google':
- if (isEnabled) {
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_GOOGLE_ENABLED;
- break;
- }
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_GOOGLE_DISABLED;
- break;
- case 'github':
- if (isEnabled) {
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_GITHUB_ENABLED;
- break;
- }
- parameters.action =
- SupportedAction.ACTION_ADMIN_AUTH_GITHUB_DISABLED;
- break;
- }
- activityEvent.emit('update', res.locals.activity._id, parameters);
- return res.apiv3({ responseParams });
- } catch (err) {
- const msg = 'Error occurred in updating enable setting';
- logger.error('Error', err);
- return res.apiv3Err(new ErrorV3(msg, 'update-enable-setting failed'));
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/authentication:
- * get:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/authentication
- * description: Get setup strategies for passport
- * responses:
- * 200:
- * description: params of setup strategies
- * content:
- * application/json:
- * schema:
- * properties:
- * setupStrategies:
- * type: array
- * description: setup strategies list
- * items:
- * type: string
- * description: setup strategie
- * example: ["local"]
- */
- router.get(
- '/authentication/',
- accessTokenParser([SCOPE.READ.ADMIN.SECURITY]),
- loginRequiredStrictly,
- adminRequired,
- async (req, res) => {
- const setupStrategies = await crowi.passportService.getSetupStrategies();
- return res.apiv3({ setupStrategies });
- },
- );
- /**
- * @swagger
- *
- * /security-setting/general-setting:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/general-setting
- * description: Update GeneralSetting
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/GeneralSetting'
- * responses:
- * 200:
- * description: Succeeded to update general Setting
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/GeneralSetting'
- */
- 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) &&
- validateDeleteConfigs(singleAuthority2, recursiveAuthority2);
- 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:
- 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:
- await configManager.getConfig(
- 'security:user-homepage-deletion:isForceDeleteUserHomepageOnUserDeletion',
- ),
- isRomUserAllowedToComment: await configManager.getConfig(
- 'security:isRomUserAllowedToComment',
- ),
- };
- 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'));
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/share-link-setting:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/share-link-setting
- * description: Update ShareLink Setting
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/ShareLinkSetting'
- * responses:
- * 200:
- * description: Succeeded to update ShareLink Setting
- * content:
- * application/json:
- * schema:
- * properties:
- * securitySettingParams:
- * $ref: '#/components/schemas/ShareLinkSetting'
- */
- 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,
- };
- 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'));
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/all-share-links:
- * get:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/all-share-links
- * description: Get All ShareLinks at Share Link Setting
- * responses:
- * 200:
- * description: all share links
- * content:
- * application/json:
- * schema:
- * properties:
- * securityParams:
- * type: object
- * description: suceed to get all share links
- */
- router.get(
- '/all-share-links/',
- accessTokenParser([SCOPE.READ.ADMIN.SECURITY]),
- loginRequiredStrictly,
- adminRequired,
- async (req, res) => {
- const page = parseInt(req.query.page) || 1;
- const limit = 10;
- const linkQuery = {};
- try {
- const paginateResult = await ShareLink.paginate(linkQuery, {
- page,
- limit,
- populate: {
- path: 'relatedPage',
- select: 'path',
- },
- });
- return res.apiv3({ paginateResult });
- } catch (err) {
- const msg = 'Error occured in get share link';
- logger.error('Error', err);
- return res.apiv3Err(new ErrorV3(msg, 'get-all-share-links-failed'));
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/all-share-links:
- * delete:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/all-share-links
- * description: Delete All ShareLinks at Share Link Setting
- * responses:
- * 200:
- * description: succeed to delete all share links
- * content:
- * application/json:
- * schema:
- * properties:
- * removeTotal:
- * type: number
- * description: total number of removed share links
- */
- router.delete(
- '/all-share-links/',
- accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]),
- loginRequiredStrictly,
- adminRequired,
- async (req, res) => {
- try {
- const removedAct = await ShareLink.remove({});
- const removeTotal = await removedAct.n;
- return res.apiv3({ removeTotal });
- } catch (err) {
- const msg = 'Error occured in delete all share links';
- logger.error('Error', err);
- return res.apiv3Err(
- new ErrorV3(msg, 'failed-to-delete-all-share-links'),
- );
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/local-setting:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/local-setting
- * description: Update LocalSetting
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/LocalSetting'
- * responses:
- * 200:
- * description: Succeeded to update local Setting
- * content:
- * application/json:
- * schema:
- * properties:
- * localSettingParams:
- * $ref: '#/components/schemas/LocalSetting'
- */
- 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,
- };
- 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'));
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/ldap:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/ldap
- * description: Update LDAP setting
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/LdapAuthSetting'
- * responses:
- * 200:
- * description: Succeeded to update LDAP setting
- * content:
- * application/json:
- * schema:
- * properties:
- * securitySettingParams:
- * $ref: '#/components/schemas/LdapAuthSetting'
- */
- 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);
- 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
- *
- * /security-setting/saml:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/saml
- * description: Update SAML setting
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/SamlAuthSetting'
- * responses:
- * 200:
- * description: Succeeded to update SAML setting
- * content:
- * application/json:
- * schema:
- * properties:
- * securitySettingParams:
- * $ref: '#/components/schemas/SamlAuthSetting'
- */
- router.put(
- '/saml',
- accessTokenParser([SCOPE.WRITE.ADMIN.SECURITY]),
- loginRequiredStrictly,
- adminRequired,
- addActivity,
- samlAuthValidator,
- apiV3FormValidator,
- handleSamlUpdate(crowi, activityEvent, updateAndReloadStrategySettings),
- );
- /**
- * @swagger
- *
- * /security-setting/oidc:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/oidc
- * description: Update OpenID Connect setting
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/OidcAuthSetting'
- * responses:
- * 200:
- * description: Succeeded to update OpenID Connect setting
- * content:
- * application/json:
- * schema:
- * properties:
- * securitySettingParams:
- * $ref: '#/components/schemas/OidcAuthSetting'
- */
- 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);
- 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
- *
- * /security-setting/google-oauth:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/google-oauth
- * description: Update google OAuth
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/GoogleOAuthSetting'
- * responses:
- * 200:
- * description: Succeeded to google OAuth
- * content:
- * application/json:
- * schema:
- * properties:
- * securitySettingParams:
- * $ref: '#/components/schemas/GoogleOAuthSetting'
- */
- 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'));
- }
- },
- );
- /**
- * @swagger
- *
- * /security-setting/github-oauth:
- * put:
- * tags: [SecuritySetting]
- * security:
- * - cookieAuth: []
- * summary: /security-setting/github-oauth
- * description: Update github OAuth
- * requestBody:
- * required: true
- * content:
- * application/json:
- * schema:
- * $ref: '#/components/schemas/GitHubOAuthSetting'
- * responses:
- * 200:
- * description: Succeeded to github OAuth
- * content:
- * application/json:
- * schema:
- * properties:
- * securitySettingParams:
- * $ref: '#/components/schemas/GitHubOAuthSetting'
- */
- 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);
- 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
- 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;
- };
|