@@ -19,6 +19,7 @@ export default function CloudResources({ params }) {
19
19
const [ allocation , setAllocation ] = useState ( "" ) ;
20
20
const [ alert , setAlert ] = useState ( "" ) ;
21
21
const [ availableVM , setAvailableVM ] = useState ( [ ] ) ;
22
+ const [ warning , setWarning ] = useState ( "" ) ;
22
23
const [ projectName , setProjectName ] = useState ( "" ) ;
23
24
const [ projectDescription , setProjectDescription ] = useState ( "" ) ;
24
25
const [ pathWithNamespace , setPathWithNamespace ] = useState ( "" ) ;
@@ -247,10 +248,117 @@ export default function CloudResources({ params }) {
247
248
} ,
248
249
] ;
249
250
251
+ const [ usernameWarning , setUsernameWarning ] = useState ( "" ) ;
252
+ const [ passwordWarning , setPasswordWarning ] = useState ( "" ) ;
253
+
254
+ const disallowedUsernames = [
255
+ "administrator" ,
256
+ "admin" ,
257
+ "user" ,
258
+ "user1" ,
259
+ "test" ,
260
+ "user2" ,
261
+ "test1" ,
262
+ "user3" ,
263
+ "admin1" ,
264
+ "1" ,
265
+ "123" ,
266
+ "a" ,
267
+ "actuser" ,
268
+ "adm" ,
269
+ "admin2" ,
270
+ "aspnet" ,
271
+ "backup" ,
272
+ "console" ,
273
+ "david" ,
274
+ "guest" ,
275
+ "john" ,
276
+ "owner" ,
277
+ "root" ,
278
+ "server" ,
279
+ "sql" ,
280
+ "support" ,
281
+ "support_388945a0" ,
282
+ "sys" ,
283
+ "test2" ,
284
+ "test3" ,
285
+ "user4" ,
286
+ "user5" ,
287
+ ] ;
288
+
289
+ const disallowedPasswords = [
290
+ "abc@123" ,
291
+ "P@$$w0rd" ,
292
+ "P@ssw0rd" ,
293
+ "P@ssword123" ,
294
+ "Pa$$word" ,
295
+ "pass@word1" ,
296
+ "Password!" ,
297
+ "Password1" ,
298
+ "Password22" ,
299
+ "iloveyou!" ,
300
+ ] ;
301
+
302
+ const validateUsername = ( username ) => {
303
+ if ( username . length < 1 ) return "Username must be at least 1 character." ;
304
+ if ( username . length > 64 ) return "Username cannot exceed 64 characters." ;
305
+ if ( disallowedUsernames . includes ( username . toLowerCase ( ) ) )
306
+ return "This username is not allowed." ;
307
+ if ( username . endsWith ( "." ) )
308
+ return "Windows username cannot end with a dot." ;
309
+ return "" ;
310
+ } ;
311
+
312
+ const validatePassword = ( password ) => {
313
+ const lower = / [ a - z ] / ;
314
+ const upper = / [ A - Z ] / ;
315
+ const digit = / \d / ;
316
+ const special = / [ \W _ ] / ;
317
+
318
+ let complexityCount = 0 ;
319
+ if ( lower . test ( password ) ) complexityCount ++ ;
320
+ if ( upper . test ( password ) ) complexityCount ++ ;
321
+ if ( digit . test ( password ) ) complexityCount ++ ;
322
+ if ( special . test ( password ) ) complexityCount ++ ;
323
+
324
+ if ( password . length < 6 ) return "Password must be at least 6 characters." ;
325
+ if ( password . length > 72 ) return "Password cannot exceed 72 characters." ;
326
+ if ( disallowedPasswords . includes ( password ) )
327
+ return "This password is not allowed." ;
328
+ if ( complexityCount < 3 ) {
329
+ return "Password must have at least 3 of: Uppercase, Lowercase, Digit, Special Character" ;
330
+ }
331
+ return "" ;
332
+ } ;
333
+
334
+ const handleUsernameChange = ( e ) => {
335
+ const username = e . target . value ;
336
+ setAdminUser ( username ) ;
337
+ const warning = validateUsername ( username ) ;
338
+ setUsernameWarning ( warning ) ;
339
+ } ;
340
+
341
+ const handlePasswordChange = ( e ) => {
342
+ const password = e . target . value ;
343
+ setAdminPassword ( password ) ;
344
+ const warning = validatePassword ( password ) ;
345
+ setPasswordWarning ( warning ) ;
346
+ } ;
347
+
250
348
const handleSave = async ( ) => {
251
349
setAlert ( "" ) ;
252
- if ( ! resourceName || ! adminUser || ! adminPassword || ! allocation ) {
253
- setAlert ( "Please fill out the request form" ) ;
350
+
351
+ // Ensure all required fields are filled
352
+ if (
353
+ ! resourceName ||
354
+ ! adminUser ||
355
+ ! adminPassword ||
356
+ ! allocation ||
357
+ ! vmSize ||
358
+ ! userID ||
359
+ ! projectID
360
+ ) {
361
+ setAlert ( "Please fill out all required fields" ) ;
254
362
return ;
255
363
}
256
364
@@ -274,13 +382,17 @@ export default function CloudResources({ params }) {
274
382
} ) ,
275
383
} ) ;
276
384
385
+ const data = await res . json ( ) ;
386
+ console . log ( data ) ;
387
+
277
388
if ( ! res . ok ) {
278
- throw new Error ( `Failed to save: ${ res . statusText } ` ) ;
279
- } else {
280
- router . push ( "/requestresource" ) ;
389
+ throw new Error ( data . message || `Failed to save: ${ res . statusText } ` ) ;
281
390
}
391
+
392
+ router . push ( "/requestresource" ) ;
282
393
} catch ( error ) {
283
- console . log ( "Error while saving resource:" , error ) ;
394
+ setAlert ( error . message || "An error occurred while saving the resource." ) ;
395
+ console . error ( "Error while saving resource:" , error ) ;
284
396
}
285
397
} ;
286
398
@@ -526,7 +638,6 @@ export default function CloudResources({ params }) {
526
638
id = "vmSize"
527
639
name = "vmSize"
528
640
className = "border border-slate-300 rounded w-full px-4 py-2 text-base"
529
- defaultValue = "Standard_A1_v2"
530
641
onChange = { ( e ) => setVMSize ( e . target . value ) }
531
642
>
532
643
< option value = "" disabled >
@@ -567,13 +678,17 @@ export default function CloudResources({ params }) {
567
678
name = "adminUsername"
568
679
className = "border border-slate-300 rounded w-full px-4 py-2 text-base"
569
680
placeholder = "Enter username"
570
- defaultValue = "Admin"
571
- onChange = { ( e ) => setAdminUser ( e . target . value ) }
681
+ onChange = { handleUsernameChange }
572
682
/>
683
+ { usernameWarning && (
684
+ < span className = "text-red-500 text-sm mt-2 block" >
685
+ { usernameWarning }
686
+ </ span >
687
+ ) }
573
688
</ div >
574
689
575
690
{ /* Admin Password */ }
576
- < div >
691
+ < div className = "mt-4" >
577
692
< label htmlFor = "adminPassword" className = "font-medium block mb-2" >
578
693
Admin Password
579
694
</ label >
@@ -583,8 +698,13 @@ export default function CloudResources({ params }) {
583
698
name = "adminPassword"
584
699
className = "border border-slate-300 rounded w-full px-4 py-2 text-base"
585
700
placeholder = "Enter password"
586
- onChange = { ( e ) => setAdminPassword ( e . target . value ) }
701
+ onChange = { handlePasswordChange }
587
702
/>
703
+ { passwordWarning && (
704
+ < span className = "text-red-500 text-sm mt-2 block" >
705
+ { passwordWarning }
706
+ </ span >
707
+ ) }
588
708
</ div >
589
709
590
710
{ /* Network Interface
0 commit comments