@@ -161,7 +161,7 @@ function validateCreateOrgParameters () {
161161
162162function validateUserIdOrUsername ( ) {
163163 return async ( req , res , next ) => {
164- const useRegistry = req . query . registry === 'true'
164+ const useRegistry = req . useRegistry === 'true'
165165 const validations = [ ]
166166 if ( useRegistry ) {
167167 validations . push (
@@ -188,18 +188,15 @@ function validateUserIdOrUsername () {
188188
189189function validateUpdateOrgParameters ( ) {
190190 return async ( req , res , next ) => {
191- const useRegistry = req . query . registry === 'true'
192-
193- const legacyParametersOnly = [ 'id_quota' , 'name' ]
194- const registryParametersOnly = [ 'hard_quota' , 'long_name' , 'cve_program_org_function' , 'oversees' , 'root_or_tlr' , 'charter_or_scope' , 'disclosure_policy' , 'product_list' , 'cna_role_type' , 'cna_country' , 'vulnerability_advisory_locations' , 'advisory_location_require_credentials' , 'industry' , 'tl_root_start_date' , 'is_cna_discussion_list' ]
195- const sharedParameters = [ 'new_short_name' , 'active_roles.add' , 'active_roles.remove' , 'registry' ]
191+ const useRegistry = req . query === 'true'
192+ const allowedParams = [ ...QUERY_PARAMETERS . shared ]
193+ const registryParametersOnly = [ ...QUERY_PARAMETERS . registryOnly ]
196194
197- const allParameters = [
198- ...legacyParametersOnly , ...registryParametersOnly , ...sharedParameters
199- ]
200-
201- const validations = [ query ( ) . custom ( ( query ) => { return mw . validateQueryParameterNames ( query , allParameters ) } ) ,
202- query ( allParameters ) . custom ( ( val ) => { return mw . containsNoInvalidCharacters ( val ) } ) ,
195+ const validations = [ query ( ) . custom ( ( query ) => { return mw . validateQueryParameterNames ( query , allowedParams ) } ) ,
196+ query ( allowedParams ) . custom ( ( val ) => { return mw . containsNoInvalidCharacters ( val ) } ) ,
197+ query ( [ 'id_quota' ] ) . optional ( ) . not ( ) . isArray ( ) . isInt ( { min : CONSTANTS . MONGOOSE_VALIDATION . Org_policies_id_quota_min , max : CONSTANTS . MONGOOSE_VALIDATION . Org_policies_id_quota_max } ) . withMessage ( errorMsgs . ID_QUOTA ) ,
198+ query ( [ 'name' ] ) . optional ( ) . isString ( ) . trim ( ) . notEmpty ( ) ,
199+ // Shared parameter validations
203200 query ( [ 'new_short_name' ] ) . optional ( ) . isString ( ) . trim ( ) . notEmpty ( ) . isLength ( { min : CONSTANTS . MIN_SHORTNAME_LENGTH , max : CONSTANTS . MAX_SHORTNAME_LENGTH } ) ,
204201 query ( [ 'active_roles.add' ] ) . optional ( ) . toArray ( )
205202 . custom ( isFlatStringArray )
@@ -209,27 +206,17 @@ function validateUpdateOrgParameters () {
209206 . custom ( isFlatStringArray )
210207 . customSanitizer ( toUpperCaseArray )
211208 . custom ( isOrgRole ) . withMessage ( errorMsgs . ORG_ROLES ) ,
209+ // Path parameter validation
212210 param ( [ 'shortname' ] ) . isString ( ) . trim ( ) . isLength ( { min : CONSTANTS . MIN_SHORTNAME_LENGTH , max : CONSTANTS . MAX_SHORTNAME_LENGTH } ) ]
213-
214211 if ( useRegistry ) {
215212 validations . push (
216- query ( [ 'hard_quota' ] )
217- . optional ( )
218- . not ( )
219- . isArray ( )
220- . isInt ( {
221- min : CONSTANTS . MONGOOSE_VALIDATION . Org_policies_id_quota_min ,
222- max : CONSTANTS . MONGOOSE_VALIDATION . Org_policies_id_quota_max
223- } )
224- . withMessage ( errorMsgs . ID_QUOTA ) ,
225- query ( [ 'long_name' ] ) . optional ( ) . isString ( ) . trim ( ) . notEmpty ( ) ,
226213 query ( [ 'oversees' ] ) . optional ( ) . isArray ( ) ,
227214 query ( [ 'root_or_tlr' ] ) . optional ( ) . isBoolean ( ) ,
228215 query ( [
229- 'cve_program_org_function' ,
230216 'charter_or_scope' ,
231217 'disclosure_policy' ,
232218 'product_list' ,
219+ 'reports_to' ,
233220 'contact_info.poc' ,
234221 'contact_info.poc_email' ,
235222 'contact_info.poc_phone' ,
@@ -244,17 +231,13 @@ function validateUpdateOrgParameters () {
244231 'is_cna_discussion_list'
245232 ] )
246233 . optional ( )
247- . isString ( ) ,
248- ...isNotAllowedQuery ( ...legacyParametersOnly )
249- // if we decide that we want to allow more, we can add them here.
234+ . isString ( )
235+ . trim ( )
250236 )
251237 } else {
252238 validations . push (
253-
254- query ( [ 'id_quota' ] ) . optional ( ) . not ( ) . isArray ( ) . isInt ( { min : CONSTANTS . MONGOOSE_VALIDATION . Org_policies_id_quota_min , max : CONSTANTS . MONGOOSE_VALIDATION . Org_policies_id_quota_max } ) . withMessage ( errorMsgs . ID_QUOTA ) ,
255- query ( [ 'name' ] ) . optional ( ) . isString ( ) . trim ( ) . notEmpty ( ) ,
239+ // Block registry-only parameters
256240 ...isNotAllowedQuery ( ...registryParametersOnly )
257-
258241 )
259242 }
260243
@@ -304,49 +287,76 @@ function isUserRole (val) {
304287 return true
305288}
306289
307- function parsePostParams ( req , res , next ) {
308- utils . reqCtxMapping ( req , 'body' , [ ] )
309- utils . reqCtxMapping ( req , 'query' , [
290+ const QUERY_PARAMETERS = {
291+ // Parameters that apply to BOTH systems
292+ shared : [
310293 'new_short_name' ,
311- 'name' ,
312- 'id_quota' ,
313- 'active' ,
294+ 'name' , // Updates 'name' in legacy, 'long_name' in registry
295+ 'active_roles' ,
314296 'active_roles.add' ,
315297 'active_roles.remove' ,
316- 'new_username' ,
317- 'org_short_name' ,
318- 'name.first' ,
319- 'name.last' ,
320- 'name.middle' ,
321- 'name.suffix' ,
322- 'long_name' ,
323- 'cve_program_org_function' ,
298+ 'id_quota' // For registry, maps to 'hard_quota' for CNAOrg
299+ ] ,
300+ // Registry-only parameters
301+ registryOnly : [
302+ 'root_or_tlr' ,
324303 'charter_or_scope' ,
325304 'disclosure_policy' ,
326305 'product_list' ,
306+ 'oversees' ,
307+ 'reports_to' ,
308+ 'contact_info' ,
327309 'contact_info.poc' ,
328310 'contact_info.poc_email' ,
329311 'contact_info.poc_phone' ,
330312 'contact_info.org_email' ,
331- 'hard_quota' ,
332313 'contact_info.website' ,
333- 'root_or_tlr' ,
334- 'oversees' ,
335314 'cna_role_type' ,
336315 'cna_country' ,
337316 'vulnerability_advisory_locations' ,
338317 'advisory_location_require_credentials' ,
339318 'industry' ,
340319 'tl_root_start_date' ,
341- 'is_cna_discussion_list'
342- ] )
343- utils . reqCtxMapping ( req , 'params' , [ 'shortname' , 'username' ] )
320+ 'is_cna_discussion_list' ,
321+ 'hard_quota' // not directly used in query parameters
322+ ] ,
323+ // User-related parameters
324+ userParams : [
325+ 'active' ,
326+ 'new_username' ,
327+ 'org_short_name' ,
328+ 'name.first' ,
329+ 'name.last' ,
330+ 'name.middle' ,
331+ 'name.suffix' ,
332+ 'active_roles.add' , // For user roles
333+ 'active_roles.remove' // For user roles
334+ ]
335+ }
336+
337+ function parsePutParams ( req , res , next ) {
338+ utils . reqCtxMapping ( req , 'body' , [ ] )
339+ // Extract all possible query parameters
340+ const allQueryParams = [
341+ ...QUERY_PARAMETERS . shared ,
342+ ...QUERY_PARAMETERS . registryOnly ,
343+ ...QUERY_PARAMETERS . userParams
344+ ]
345+ utils . reqCtxMapping ( req , 'query' , allQueryParams )
346+ utils . reqCtxMapping ( req , 'params' , [ 'shortname' , 'username' , 'identifier' ] )
347+ next ( )
348+ }
349+
350+ function parsePostParams ( req , res , next ) {
351+ utils . reqCtxMapping ( req , 'body' , [ ] )
352+ utils . reqCtxMapping ( req , 'query' , [ ] )
353+ utils . reqCtxMapping ( req , 'params' , [ 'shortname' , 'username' , 'identifier' ] )
344354 next ( )
345355}
346356
347357function parseGetParams ( req , res , next ) {
348- utils . reqCtxMapping ( req , 'params' , [ 'shortname' , 'username' , 'identifier' , 'registry' ] )
349- utils . reqCtxMapping ( req , 'query' , [ 'page' , 'registry' ] )
358+ utils . reqCtxMapping ( req , 'params' , [ 'shortname' , 'username' , 'identifier' ] )
359+ utils . reqCtxMapping ( req , 'query' , [ 'page' ] )
350360 next ( )
351361}
352362
@@ -369,6 +379,7 @@ function isValidUsername (val) {
369379}
370380
371381module . exports = {
382+ parsePutParams,
372383 parsePostParams,
373384 parseGetParams,
374385 parseError,
0 commit comments