4
4
*/
5
5
6
6
const Boom = require ( '@hapi/boom' ) ;
7
+ const RE2 = require ( 're2' ) ;
8
+ const bytes = require ( '@forwardemail/bytes' ) ;
7
9
const isSANB = require ( 'is-string-and-not-blank' ) ;
8
10
const paginate = require ( 'koa-ctx-paginate' ) ;
9
11
const parser = require ( 'mongodb-query-parser' ) ;
@@ -13,6 +15,8 @@ const _ = require('#helpers/lodash');
13
15
const { Users } = require ( '#models' ) ;
14
16
const config = require ( '#config' ) ;
15
17
18
+ const REGEX_BYTES = new RE2 ( / ^ ( ( - | \+ ) ? ( \d + (?: \. \d + ) ? ) ) * ( k b | m b | g b | t b | p b ) $ / i) ;
19
+
16
20
const USER_SEARCH_PATHS = [
17
21
'email' ,
18
22
config . passport . fields . givenName ,
@@ -91,18 +95,57 @@ async function update(ctx) {
91
95
if ( ! user ) throw Boom . notFound ( ctx . translateError ( 'INVALID_USER' ) ) ;
92
96
const { body } = ctx . request ;
93
97
94
- user [ config . passport . fields . givenName ] =
95
- body [ config . passport . fields . givenName ] ;
96
- user [ config . passport . fields . familyName ] =
97
- body [ config . passport . fields . familyName ] ;
98
- user [ config . passport . fields . otpEnabled ] =
99
- body [ config . passport . fields . otpEnabled ] ;
100
- user . email = body . email ;
101
- user . group = body . group ;
98
+ if ( body [ config . passport . fields . givenName ] )
99
+ user [ config . passport . fields . givenName ] =
100
+ body [ config . passport . fields . givenName ] ;
101
+
102
+ if ( body [ config . passport . fields . familyName ] )
103
+ user [ config . passport . fields . familyName ] =
104
+ body [ config . passport . fields . familyName ] ;
102
105
103
- if ( boolean ( ! body [ config . passport . fields . otpEnabled ] ) )
106
+ if ( body [ config . passport . fields . otpEnabled ] )
107
+ user [ config . passport . fields . otpEnabled ] =
108
+ body [ config . passport . fields . otpEnabled ] ;
109
+
110
+ if (
111
+ body [ config . passport . fields . otpEnabled ] &&
112
+ boolean ( ! body [ config . passport . fields . otpEnabled ] )
113
+ )
104
114
user [ config . userFields . pendingRecovery ] = false ;
105
115
116
+ if ( body . email ) user . email = body . email ;
117
+
118
+ if ( body . group ) user . group = body . group ;
119
+
120
+ if ( isSANB ( body . has_passed_kyc ) )
121
+ user . has_passed_kyc = boolean ( body . has_passed_kyc ) ;
122
+
123
+ if ( body . max_quota_per_alias ) {
124
+ // validate `body.max_quota_per_alias_per_alias` if a value was passed
125
+ if (
126
+ typeof body . max_quota_per_alias !== 'undefined' &&
127
+ typeof body . max_quota_per_alias !== 'string'
128
+ )
129
+ throw Boom . badRequest ( ctx . translateError ( 'INVALID_BYTES' ) ) ;
130
+
131
+ // indicates reset of the value
132
+ if ( body . max_quota_per_alias === '' ) {
133
+ user . max_quota_per_alias = Number . isFinite (
134
+ ctx . state . domain . max_quota_per_alias
135
+ )
136
+ ? ctx . state . domain . max_quota_per_alias
137
+ : config . maxQuotaPerAlias ;
138
+ } else if ( typeof body . max_quota_per_alias === 'string' ) {
139
+ // test against bytes regex
140
+ if ( ! REGEX_BYTES . test ( body . max_quota_per_alias ) )
141
+ throw Boom . badRequest ( ctx . translateError ( 'INVALID_BYTES' ) ) ;
142
+ // otherwise convert the value
143
+ user . max_quota_per_alias = bytes ( body . max_quota_per_alias ) ;
144
+ }
145
+ }
146
+
147
+ if ( body . smtp_limit ) user . smtp_limit = body . smtp_limit ;
148
+
106
149
await user . save ( ) ;
107
150
108
151
if ( user . id === ctx . state . user . id ) await ctx . login ( user ) ;
0 commit comments