2017-11-17 11:17:20 +01:00
'use strict' ;
/ * *
* An asynchronous bootstrap function that runs before
* your application gets started .
*
* This gives you an opportunity to set up your data model ,
* run jobs , or perform some special logic .
* /
2022-01-24 18:13:27 +01:00
const crypto = require ( 'crypto' ) ;
2018-04-30 18:26:56 +02:00
const _ = require ( 'lodash' ) ;
2022-02-09 10:36:41 +08:00
const urljoin = require ( 'url-join' ) ;
2021-08-19 16:49:33 +02:00
const { getService } = require ( '../utils' ) ;
2022-01-13 16:17:04 +01:00
const getGrantConfig = require ( './grant-config' ) ;
2017-12-04 16:43:24 +01:00
2021-08-19 16:49:33 +02:00
const usersPermissionsActions = require ( './users-permissions-actions' ) ;
2020-06-04 18:30:26 +02:00
2021-09-28 16:54:07 +02:00
module . exports = async ( { strapi } ) => {
2021-09-13 12:03:12 +02:00
const pluginStore = strapi . store ( { type : 'plugin' , name : 'users-permissions' } ) ;
2018-02-06 13:10:43 +01:00
2021-06-29 16:27:35 +02:00
await initGrant ( pluginStore ) ;
await initEmails ( pluginStore ) ;
await initAdvancedOptions ( pluginStore ) ;
await strapi . admin . services . permission . actionProvider . registerMany (
usersPermissionsActions . actions
) ;
2021-07-08 21:53:30 +02:00
await getService ( 'users-permissions' ) . initialize ( ) ;
2021-06-29 16:27:35 +02:00
2021-08-17 19:28:10 +02:00
if ( ! strapi . config . get ( 'plugin.users-permissions.jwtSecret' ) ) {
2022-01-24 18:13:27 +01:00
const jwtSecret = crypto . randomBytes ( 16 ) . toString ( 'base64' ) ;
if ( process . env . NODE _ENV === 'production' ) {
throw new Error (
2022-03-04 15:48:49 +01:00
` Missing jwtSecret. Please, set jwtSecret for the users-permissions plugin in config/plugins.js or set environment variable JWT_SECRET (ex: ${ jwtSecret } ).
For security reasons , prefer storing the secret in an environment variable . See https : //docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`
2022-01-24 18:13:27 +01:00
) ;
}
2021-08-20 15:23:02 +02:00
strapi . config . set ( 'plugin.users-permissions.jwtSecret' , jwtSecret ) ;
2021-06-29 16:27:35 +02:00
2021-08-13 15:35:19 +02:00
if ( ! process . env . JWT _SECRET ) {
2021-12-22 10:15:15 +01:00
strapi . fs . appendFile ( process . env . ENV _PATH || '.env' , ` JWT_SECRET= ${ jwtSecret } \n ` ) ;
2021-12-20 18:00:02 +01:00
strapi . log . info (
'The Users & Permissions plugin automatically generated a jwt secret and stored it in your .env file under the name JWT_SECRET.'
2021-12-06 16:13:10 +01:00
) ;
2021-08-13 15:35:19 +02:00
}
2021-06-29 16:27:35 +02:00
}
} ;
const initGrant = async pluginStore => {
2021-10-26 16:51:29 +02:00
const apiPrefix = strapi . config . get ( 'api.rest.prefix' ) ;
2022-02-11 18:51:01 +08:00
const baseURL = urljoin ( strapi . config . server . url , apiPrefix , 'auth' ) ;
2021-10-26 16:51:29 +02:00
2022-01-13 16:17:04 +01:00
const grantConfig = getGrantConfig ( baseURL ) ;
2021-06-29 16:27:35 +02:00
2019-04-10 18:11:55 +02:00
const prevGrantConfig = ( await pluginStore . get ( { key : 'grant' } ) ) || { } ;
2018-04-21 12:29:00 +08:00
// store grant auth config to db
// when plugin_users-permissions_grant is not existed in db
// or we have added/deleted provider here.
2020-03-02 15:18:08 +01:00
if ( ! prevGrantConfig || ! _ . isEqual ( _ . keys ( prevGrantConfig ) , _ . keys ( grantConfig ) ) ) {
2018-04-24 22:18:21 +08:00
// merge with the previous provider config.
2019-04-10 18:11:55 +02:00
_ . keys ( grantConfig ) . forEach ( key => {
2018-04-24 22:18:21 +08:00
if ( key in prevGrantConfig ) {
grantConfig [ key ] = _ . merge ( grantConfig [ key ] , prevGrantConfig [ key ] ) ;
}
} ) ;
2019-04-10 18:11:55 +02:00
await pluginStore . set ( { key : 'grant' , value : grantConfig } ) ;
2018-01-12 15:20:13 +01:00
}
2021-06-29 16:27:35 +02:00
} ;
2018-01-12 15:20:13 +01:00
2021-06-29 16:27:35 +02:00
const initEmails = async pluginStore => {
2019-04-10 18:11:55 +02:00
if ( ! ( await pluginStore . get ( { key : 'email' } ) ) ) {
2018-02-06 13:10:43 +01:00
const value = {
2019-04-10 18:11:55 +02:00
reset _password : {
2018-02-01 18:12:38 +01:00
display : 'Email.template.reset_password' ,
2019-11-19 16:17:15 +01:00
icon : 'sync' ,
2018-02-01 18:12:38 +01:00
options : {
from : {
name : 'Administration Panel' ,
2019-04-10 18:11:55 +02:00
email : 'no-reply@strapi.io' ,
2018-02-01 18:12:38 +01:00
} ,
response _email : '' ,
2020-01-11 11:29:24 -05:00
object : 'Reset password' ,
2018-02-01 18:12:38 +01:00
message : ` <p>We heard that you lost your password. Sorry about that!</p>
2018-01-15 14:50:53 +01:00
2018-01-26 17:31:52 +01:00
< p > But don ’ t worry ! You can use the following link to reset your password : < / p >
2018-01-26 17:37:01 +01:00
< p > < %= URL % > ? code = < %= TOKEN % > < / p >
2018-01-15 14:50:53 +01:00
2019-04-10 18:11:55 +02:00
< p > Thanks . < / p > ` ,
} ,
2018-08-08 17:57:02 +02:00
} ,
2019-04-10 18:11:55 +02:00
email _confirmation : {
2018-08-08 17:57:02 +02:00
display : 'Email.template.email_confirmation' ,
2019-11-19 16:17:15 +01:00
icon : 'check-square' ,
2018-08-08 17:57:02 +02:00
options : {
from : {
name : 'Administration Panel' ,
2019-04-10 18:11:55 +02:00
email : 'no-reply@strapi.io' ,
2018-08-08 17:57:02 +02:00
} ,
response _email : '' ,
object : 'Account confirmation' ,
2018-08-27 08:11:23 -07:00
message : ` <p>Thank you for registering!</p>
2018-08-08 17:57:02 +02:00
2018-08-23 12:00:46 +02:00
< p > You have to confirm your email address . Please click on the link below . < / p >
2018-08-08 17:57:02 +02:00
< p > < %= URL % > ? confirmation = < %= CODE % > < / p >
2019-04-10 18:11:55 +02:00
< p > Thanks . < / p > ` ,
} ,
} ,
2018-02-01 18:12:38 +01:00
} ;
2018-01-15 11:29:38 +01:00
2019-04-10 18:11:55 +02:00
await pluginStore . set ( { key : 'email' , value } ) ;
2018-01-15 11:29:38 +01:00
}
2021-06-29 16:27:35 +02:00
} ;
2018-01-15 11:29:38 +01:00
2021-06-29 16:27:35 +02:00
const initAdvancedOptions = async pluginStore => {
2019-04-10 18:11:55 +02:00
if ( ! ( await pluginStore . get ( { key : 'advanced' } ) ) ) {
2018-02-06 13:10:43 +01:00
const value = {
2018-02-01 18:12:38 +01:00
unique _email : true ,
2018-03-12 15:56:25 +01:00
allow _register : true ,
2018-08-08 17:57:02 +02:00
email _confirmation : false ,
2020-07-17 14:24:31 +02:00
email _reset _password : null ,
email _confirmation _redirection : null ,
2019-04-10 18:11:55 +02:00
default _role : 'authenticated' ,
2018-02-01 18:12:38 +01:00
} ;
2018-01-15 15:01:21 +01:00
2019-04-10 18:11:55 +02:00
await pluginStore . set ( { key : 'advanced' , value } ) ;
2018-01-15 15:01:21 +01:00
}
2017-11-17 11:17:20 +01:00
} ;