2020-08-06 13:58:12 +02:00
import Joi from 'joi' ;
2020-04-23 13:59:45 +02:00
import globals from '../../globals' ;
2020-04-22 17:24:15 +02:00
2020-04-29 12:10:27 +02:00
import IdValidate from './id' ;
2020-04-22 17:24:15 +02:00
export default class UserValidate { // validate input for user
2020-04-24 17:36:39 +02:00
private static user = {
2020-05-14 16:54:58 +02:00
name : Joi.string ( )
2020-04-29 12:10:27 +02:00
. lowercase ( )
2020-05-14 16:54:58 +02:00
. pattern ( new RegExp ( '^[a-z0-9-_.]+$' ) )
2020-07-15 13:11:33 +02:00
. max ( 128 )
. messages ( { 'string.pattern.base' : 'name must only contain a-z0-9_.' } ) ,
2020-04-24 17:36:39 +02:00
2020-05-07 21:55:29 +02:00
email : Joi.string ( )
2020-04-24 17:36:39 +02:00
. email ( { minDomainSegments : 2 } )
2020-04-29 12:10:27 +02:00
. lowercase ( )
. max ( 128 ) ,
2020-04-24 17:36:39 +02:00
2020-05-07 21:55:29 +02:00
pass : Joi.string ( )
2020-05-26 09:07:01 +02:00
. pattern ( /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!"#%&'()*+,-.\/:;<=>?@[\]^_`{|}~])(?=\S+$)[a-zA-Z0-9!"#%&'()*+,\-.\/:;<=>?@[\]^_`{|}~]{8,}$/ )
2020-07-15 13:11:33 +02:00
. max ( 128 )
. messages ( { 'string.pattern.base' : 'password must have at least 8 characters, one uppercase and one lowercase character, one number and at least one of the following characters: !"\\#%&\'()*+,-.\\/:;<=>?@[]^_`\\{|}~' } ) ,
2020-04-24 17:36:39 +02:00
2020-05-07 21:55:29 +02:00
level : Joi.string ( )
2020-04-24 17:36:39 +02:00
. valid ( . . . globals . levels ) ,
2020-05-07 21:55:29 +02:00
location : Joi.string ( )
2020-04-29 12:10:27 +02:00
. alphanum ( )
. max ( 128 ) ,
2020-04-24 17:36:39 +02:00
2020-08-06 13:58:12 +02:00
devices : Joi.array ( )
. items ( Joi . string ( )
. allow ( '' )
. max ( 128 )
)
2020-04-24 17:36:39 +02:00
} ;
2020-08-06 13:58:12 +02:00
private static specialUsernames : string [ ] = [ 'admin' , 'user' , 'key' , 'new' , 'passreset' ] ; // names a user cannot take
2020-04-27 15:10:14 +02:00
2020-05-18 14:47:22 +02:00
static input ( data , param ) { // validate input, set param to 'new' to make all attributes required
2020-04-24 17:36:39 +02:00
if ( param === 'new' ) {
2020-05-07 21:55:29 +02:00
return Joi . object ( {
2020-04-24 17:36:39 +02:00
name : this.user.name.required ( ) ,
email : this.user.email.required ( ) ,
pass : this.user.pass.required ( ) ,
level : this.user.level.required ( ) ,
location : this.user.location.required ( ) ,
2020-08-06 13:58:12 +02:00
devices : this.user.devices.required ( )
2020-04-24 17:36:39 +02:00
} ) . validate ( data ) ;
}
else if ( param === 'change' ) {
2020-05-07 21:55:29 +02:00
return Joi . object ( {
2020-04-24 17:36:39 +02:00
name : this.user.name ,
email : this.user.email ,
pass : this.user.pass ,
location : this.user.location ,
2020-08-06 13:58:12 +02:00
devices : this.user.devices
2020-04-24 17:36:39 +02:00
} ) . validate ( data ) ;
}
else if ( param === 'changeadmin' ) {
2020-05-07 21:55:29 +02:00
return Joi . object ( {
2020-04-24 17:36:39 +02:00
name : this.user.name ,
email : this.user.email ,
pass : this.user.pass ,
level : this.user.level ,
location : this.user.location ,
2020-08-06 13:58:12 +02:00
devices : this.user.devices
2020-04-24 17:36:39 +02:00
} ) . validate ( data ) ;
}
else {
return { error : 'No parameter specified!' , value : { } } ;
}
2020-04-22 17:24:15 +02:00
}
2020-05-18 14:47:22 +02:00
static output ( data ) { // validate output and strip unwanted properties, returns null if not valid
2020-05-06 14:39:04 +02:00
data = IdValidate . stringify ( data ) ;
2020-05-07 21:55:29 +02:00
const { value , error } = Joi . object ( {
2020-04-29 12:10:27 +02:00
_id : IdValidate.get ( ) ,
name : this.user.name ,
email : this.user.email ,
level : this.user.level ,
location : this.user.location ,
2020-08-06 13:58:12 +02:00
devices : this.user.devices
2020-04-29 12:10:27 +02:00
} ) . validate ( data , { stripUnknown : true } ) ;
2020-04-24 12:25:32 +02:00
return error !== undefined ? null : value ;
2020-04-22 17:24:15 +02:00
}
2020-04-27 15:10:14 +02:00
static isSpecialName ( name ) { // true if name belongs to special names
return this . specialUsernames . indexOf ( name ) > - 1 ;
}
2020-05-27 14:31:17 +02:00
static username() {
return this . user . name ;
}
2020-04-22 17:24:15 +02:00
}