diff --git a/src/app/users/users-achievements/users-achievements-update.component.ts b/src/app/users/users-achievements/users-achievements-update.component.ts index b994f5542d..0b6c8fd501 100644 --- a/src/app/users/users-achievements/users-achievements-update.component.ts +++ b/src/app/users/users-achievements/users-achievements-update.component.ts @@ -133,7 +133,7 @@ export class UsersAchievementsUpdateComponent implements OnInit, OnDestroy { ...achievement, title: [ achievement.title, CustomValidators.required ], description: [ achievement.description ], - link: [ achievement.link ], + link: [ achievement.link, [], CustomValidators.validLink ], date: [ achievement.date, null, ac => this.validatorService.notDateInFuture$(ac) ] }), { onSubmit: (formValue, formGroup) => { diff --git a/src/app/validators/custom-validators.ts b/src/app/validators/custom-validators.ts index da950a37c8..22788b8c7e 100755 --- a/src/app/validators/custom-validators.ts +++ b/src/app/validators/custom-validators.ts @@ -246,11 +246,25 @@ export class CustomValidators { static validLink(ac: AbstractControl): Promise | Observable { return new Promise((resolve, reject) => { - try { - const url = new URL(ac.value); + if (!ac.value) { resolve(null); - } catch (_) { - resolve({ 'invalidLink': true }); + } else { + const trimmedValue = ac.value.trim(); + if (/\s/.test(trimmedValue)) { + resolve({ 'invalidLink': true }); + } else { + const domainRegex = /^(https?:\/\/)([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(\.[a-zA-Z]{2,})*(\/.*)?$/; + if (!domainRegex.test(trimmedValue)) { + resolve({ 'invalidLink': true }); + } else { + try { + const url = new URL(trimmedValue); + resolve(null); + } catch (_) { + resolve({ 'invalidLink': true }); + } + } + } } }); }