cloud-ide-auth 1.0.44 → 1.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,16 +31,41 @@ class CideAuthResetPasswordComponent {
31
31
  }, { validators: passwordMatchValidator });
32
32
  }
33
33
  ngOnInit() {
34
- // Extract the reset token from route parameters
34
+ // Extract the reset token from route parameters using snapshot for immediate access
35
+ const routeParams = this.activatedRoute.snapshot.params;
36
+ this.resetToken = routeParams['rout_token'] || '';
37
+ // If token not found in route params (might be due to dots in JWT), try extracting from URL directly
38
+ if (!this.resetToken && typeof window !== 'undefined') {
39
+ const url = window.location.href;
40
+ const resetPasswordMatch = url.match(/\/reset-password\/(.+)$/);
41
+ if (resetPasswordMatch && resetPasswordMatch[1]) {
42
+ // Extract token from URL, handling potential hash fragments
43
+ this.resetToken = resetPasswordMatch[1].split('#')[0].split('?')[0];
44
+ console.log('Reset Password: Token extracted from URL directly');
45
+ }
46
+ }
47
+ // Debug logging to help diagnose route parameter issues
48
+ console.log('Reset Password Component - Route Params:', routeParams);
49
+ console.log('Reset Password Component - Extracted Token:', this.resetToken ? 'Token found' : 'No token');
50
+ console.log('Reset Password Component - Current URL:', typeof window !== 'undefined' ? window.location.href : 'N/A');
51
+ // Also subscribe to handle route parameter changes (for navigation within the same component)
35
52
  this.activatedRoute.params.subscribe(params => {
36
- this.resetToken = params['rout_token'] || '';
37
- if (!this.resetToken) {
38
- this.erro_message.set('Invalid reset password link. Please request a new one.');
39
- setTimeout(() => {
40
- this.route.navigate(['auth', 'forgot-password']);
41
- }, 3000);
53
+ const token = params['rout_token'] || '';
54
+ if (token && token !== this.resetToken) {
55
+ this.resetToken = token;
56
+ this.erro_message.set(''); // Clear any previous error
42
57
  }
43
58
  });
59
+ // Validate token exists and is not empty
60
+ if (!this.resetToken || this.resetToken.trim() === '') {
61
+ this.erro_message.set('Invalid reset password link. Missing token. Please request a new one.');
62
+ console.error('Reset Password: No token found in route parameters or URL');
63
+ }
64
+ else {
65
+ // Token is present, clear any error messages
66
+ this.erro_message.set('');
67
+ console.log('Reset Password: Token successfully extracted');
68
+ }
44
69
  }
45
70
  onForgotPasssword() {
46
71
  // Mark all fields as touched to show validation errors
@@ -116,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
116
141
  }], ctorParameters: () => [] });
117
142
 
118
143
  export { CideAuthResetPasswordComponent };
119
- //# sourceMappingURL=cloud-ide-auth-reset-password.component-CJMdi-sj.mjs.map
144
+ //# sourceMappingURL=cloud-ide-auth-reset-password.component-Bzzm6JA2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-auth-reset-password.component-Bzzm6JA2.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.html"],"sourcesContent":["import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } from 'cloud-ide-element';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { MResetPassword, controllerResponse } from 'cloud-ide-lms-model';\n\n// Custom validator for password matching\nfunction passwordMatchValidator(control: AbstractControl): ValidationErrors | null {\n const password = control.get('new_password');\n const confirmPassword = control.get('confirm_password');\n \n if (!password || !confirmPassword) {\n return null;\n }\n \n return password.value === confirmPassword.value ? null : { passwordMismatch: true };\n}\n\n@Component({\n selector: 'cide-auth-reset-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent],\n templateUrl: './reset-password.component.html',\n styleUrl: './reset-password.component.css'\n})\nexport class CideAuthResetPasswordComponent implements OnInit {\n public resetPassswordForm: FormGroupModel<{new_password: string, confirm_password: string}>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n public resetToken: string = '';\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n\n constructor() {\n this.resetPassswordForm = new FormGroup({\n new_password: new FormControl('', [Validators.required, Validators.minLength(6)]),\n confirm_password: new FormControl('', [Validators.required])\n }, { validators: passwordMatchValidator }) as unknown as FormGroupModel<{new_password: string, confirm_password: string}>;\n }\n\n ngOnInit(): void {\n // Extract the reset token from route parameters using snapshot for immediate access\n const routeParams = this.activatedRoute.snapshot.params;\n this.resetToken = routeParams['rout_token'] || '';\n \n // If token not found in route params (might be due to dots in JWT), try extracting from URL directly\n if (!this.resetToken && typeof window !== 'undefined') {\n const url = window.location.href;\n const resetPasswordMatch = url.match(/\\/reset-password\\/(.+)$/);\n if (resetPasswordMatch && resetPasswordMatch[1]) {\n // Extract token from URL, handling potential hash fragments\n this.resetToken = resetPasswordMatch[1].split('#')[0].split('?')[0];\n console.log('Reset Password: Token extracted from URL directly');\n }\n }\n \n // Debug logging to help diagnose route parameter issues\n console.log('Reset Password Component - Route Params:', routeParams);\n console.log('Reset Password Component - Extracted Token:', this.resetToken ? 'Token found' : 'No token');\n console.log('Reset Password Component - Current URL:', typeof window !== 'undefined' ? window.location.href : 'N/A');\n \n // Also subscribe to handle route parameter changes (for navigation within the same component)\n this.activatedRoute.params.subscribe(params => {\n const token = params['rout_token'] || '';\n if (token && token !== this.resetToken) {\n this.resetToken = token;\n this.erro_message.set(''); // Clear any previous error\n }\n });\n \n // Validate token exists and is not empty\n if (!this.resetToken || this.resetToken.trim() === '') {\n this.erro_message.set('Invalid reset password link. Missing token. Please request a new one.');\n console.error('Reset Password: No token found in route parameters or URL');\n } else {\n // Token is present, clear any error messages\n this.erro_message.set('');\n console.log('Reset Password: Token successfully extracted');\n }\n }\n\n onForgotPasssword() {\n // Mark all fields as touched to show validation errors\n this.resetPassswordForm.markAllAsTouched();\n \n if (this.resetPassswordForm.valid && this.resetToken) {\n this.loading.set(true);\n this.erro_message.set('');\n \n const newPassword = this.resetPassswordForm?.get('new_password')?.value || '';\n const confirmPassword = this.resetPassswordForm?.get('confirm_password')?.value || '';\n \n // Double check password match\n if (newPassword !== confirmPassword) {\n this.loading.set(false);\n this.erro_message.set('Passwords do not match. Please try again.');\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n const resetPasssword: MResetPassword = {\n user_password: newPassword,\n user_username: \"\",\n sylog_config_data: {\n reset_password_link: \"\",\n reset_password_secret: this.resetToken,\n request_timestamp: new Date()\n }\n };\n \n this.authService.resetPassword(resetPasssword)?.subscribe({\n next: (response) => {\n if (response?.success === true) {\n this.loading.set(false);\n this.erro_message.set('');\n this.route.navigate(['auth', 'sign-in']);\n } else {\n this.loading.set(false);\n const errorMessage = response?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n const errorMessage = response?.error?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Reset password error:', response);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n });\n } else {\n if (!this.resetToken) {\n this.erro_message.set('Invalid reset password link. Please request a new one.');\n } else if (!this.resetPassswordForm.valid) {\n this.erro_message.set('Please fill in all required fields correctly.');\n }\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n }\n}\n\n","<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\n \n <!-- section for controls -->\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- New Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"new_password\" \n formControlName=\"new_password\"\n type=\"password\"\n placeholder=\"Enter new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('new_password')?.invalid && resetPassswordForm.get('new_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('new_password')?.errors?.['required']) {\n Password is required\n } @else if (resetPassswordForm.get('new_password')?.errors?.['minlength']) {\n Password must be at least 6 characters\n }\n </div>\n }\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"confirm_password\" \n formControlName=\"confirm_password\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('confirm_password')?.invalid && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('confirm_password')?.errors?.['required']) {\n Please confirm your password\n }\n </div>\n }\n @if (resetPassswordForm.errors?.['passwordMismatch'] && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Passwords do not match\n </div>\n }\n </div>\n <!-- Reset Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\" class=\"tw-w-full\"\n cideEleButton \n id=\"reset_password_button\" \n [loading]=\"loading()\" \n [disabled]=\"!resetPassswordForm.valid || loading() || !resetToken\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>"],"names":[],"mappings":"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"}
@@ -675,7 +675,7 @@ const authRoutes = {
675
675
  },
676
676
  {
677
677
  path: "reset-password/:rout_token",
678
- loadComponent: () => import('./cloud-ide-auth-reset-password.component-CJMdi-sj.mjs').then(c => c.CideAuthResetPasswordComponent)
678
+ loadComponent: () => import('./cloud-ide-auth-reset-password.component-Bzzm6JA2.mjs').then(c => c.CideAuthResetPasswordComponent)
679
679
  }
680
680
  ]
681
681
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloud-ide-auth",
3
- "version": "1.0.44",
3
+ "version": "1.0.47",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.1.0",
6
6
  "@angular/core": "^20.1.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-ide-auth-reset-password.component-CJMdi-sj.mjs","sources":["../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.ts","../../../projects/cloud-ide-auth/src/lib/auth/reset-password/reset-password.component.html"],"sourcesContent":["import { Component, inject, signal, OnInit } from '@angular/core';\nimport { CideEleButtonComponent, CideInputComponent, CideEleThemeToggleComponent } from 'cloud-ide-element';\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport { FormGroupModel } from '../sign-in/sign-in.component';\nimport { CloudIdeAuthService } from '../../cloud-ide-auth.service';\nimport { MResetPassword, controllerResponse } from 'cloud-ide-lms-model';\n\n// Custom validator for password matching\nfunction passwordMatchValidator(control: AbstractControl): ValidationErrors | null {\n const password = control.get('new_password');\n const confirmPassword = control.get('confirm_password');\n \n if (!password || !confirmPassword) {\n return null;\n }\n \n return password.value === confirmPassword.value ? null : { passwordMismatch: true };\n}\n\n@Component({\n selector: 'cide-auth-reset-password',\n standalone: true,\n imports: [CideInputComponent, ReactiveFormsModule, CommonModule, CideEleButtonComponent, CideEleThemeToggleComponent],\n templateUrl: './reset-password.component.html',\n styleUrl: './reset-password.component.css'\n})\nexport class CideAuthResetPasswordComponent implements OnInit {\n public resetPassswordForm: FormGroupModel<{new_password: string, confirm_password: string}>;\n public erro_message = signal<string>('');\n public loading = signal<boolean>(false);\n public resetToken: string = '';\n\n private authService = inject(CloudIdeAuthService);\n private route = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n\n constructor() {\n this.resetPassswordForm = new FormGroup({\n new_password: new FormControl('', [Validators.required, Validators.minLength(6)]),\n confirm_password: new FormControl('', [Validators.required])\n }, { validators: passwordMatchValidator }) as unknown as FormGroupModel<{new_password: string, confirm_password: string}>;\n }\n\n ngOnInit(): void {\n // Extract the reset token from route parameters\n this.activatedRoute.params.subscribe(params => {\n this.resetToken = params['rout_token'] || '';\n if (!this.resetToken) {\n this.erro_message.set('Invalid reset password link. Please request a new one.');\n setTimeout(() => {\n this.route.navigate(['auth', 'forgot-password']);\n }, 3000);\n }\n });\n }\n\n onForgotPasssword() {\n // Mark all fields as touched to show validation errors\n this.resetPassswordForm.markAllAsTouched();\n \n if (this.resetPassswordForm.valid && this.resetToken) {\n this.loading.set(true);\n this.erro_message.set('');\n \n const newPassword = this.resetPassswordForm?.get('new_password')?.value || '';\n const confirmPassword = this.resetPassswordForm?.get('confirm_password')?.value || '';\n \n // Double check password match\n if (newPassword !== confirmPassword) {\n this.loading.set(false);\n this.erro_message.set('Passwords do not match. Please try again.');\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n return;\n }\n\n const resetPasssword: MResetPassword = {\n user_password: newPassword,\n user_username: \"\",\n sylog_config_data: {\n reset_password_link: \"\",\n reset_password_secret: this.resetToken,\n request_timestamp: new Date()\n }\n };\n \n this.authService.resetPassword(resetPasssword)?.subscribe({\n next: (response) => {\n if (response?.success === true) {\n this.loading.set(false);\n this.erro_message.set('');\n this.route.navigate(['auth', 'sign-in']);\n } else {\n this.loading.set(false);\n const errorMessage = response?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n const errorMessage = response?.error?.message || 'Failed to reset password. Please try again.';\n this.erro_message.set(errorMessage);\n console.error('Reset password error:', response);\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n });\n } else {\n if (!this.resetToken) {\n this.erro_message.set('Invalid reset password link. Please request a new one.');\n } else if (!this.resetPassswordForm.valid) {\n this.erro_message.set('Please fill in all required fields correctly.');\n }\n setTimeout(() => {\n this.erro_message.set('');\n }, 3000);\n }\n }\n}\n\n","<!-- https://play.tailwindcss.com/lfO85drpUy -->\n<!-- Main Div Outer Div-->\n<div class=\"cide-font-poppins tw-flex tw-min-h-screen tw-w-full tw-bg-gray-50 tw-py-3 tw-relative\">\n <!-- Theme Toggle - Top Right Corner -->\n <div class=\"tw-absolute tw-top-4 tw-right-4 tw-z-50\">\n <cide-ele-theme-toggle size=\"small\"></cide-ele-theme-toggle>\n </div>\n <!-- Forrm Wrapper -->\n <div class=\"tw-m-auto tw-w-96 tw-rounded-2xl tw-bg-white tw-py-6 tw-shadow-xl\">\n <!-- Logo Wrapper -->\n <div class=\"tw-m-auto tw-h-32 tw-w-64 tw-text-center\">\n <img src=\"https://console.cloudidesys.com/assets/Cloud%20IDE%20Logo%20Dark.png\" class=\"tw-m-auto tw-h-full\"\n alt=\"Cloud IDE Logo\" />\n </div> <!-- Entity name here -->\n <div class=\"tw-my-2 tw-text-center tw-text-xl tw-font-semibold\">Reset Password</div>\n <!-- Error Logger -->\n @if (erro_message()) {\n <div class=\"tw-w-full tw-select-none tw-py-1 tw-mx-auto tw-mb-2 tw-max-w-80 tw-text-center tw-text-sm tw-text-red-600 dark:tw-text-red-400\">\n {{erro_message()}}\n </div>\n }\n \n <!-- section for controls -->\n <form [formGroup]=\"resetPassswordForm\" (ngSubmit)=\"onForgotPasssword()\" novalidate>\n <div class=\"tw-m-auto tw-pb-3 tw-pt-3\">\n <!-- New Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"new_password\" \n formControlName=\"new_password\"\n type=\"password\"\n placeholder=\"Enter new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('new_password')?.invalid && resetPassswordForm.get('new_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('new_password')?.errors?.['required']) {\n Password is required\n } @else if (resetPassswordForm.get('new_password')?.errors?.['minlength']) {\n Password must be at least 6 characters\n }\n </div>\n }\n </div>\n <!-- Confirm Password -->\n <div class=\"tw-m-auto tw-w-80 tw-mb-4\">\n <cide-ele-input \n id=\"confirm_password\" \n formControlName=\"confirm_password\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n [required]=\"true\">\n </cide-ele-input>\n @if (resetPassswordForm.get('confirm_password')?.invalid && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n @if (resetPassswordForm.get('confirm_password')?.errors?.['required']) {\n Please confirm your password\n }\n </div>\n }\n @if (resetPassswordForm.errors?.['passwordMismatch'] && resetPassswordForm.get('confirm_password')?.touched) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Passwords do not match\n </div>\n }\n </div>\n <!-- Reset Password button -->\n <div class=\"tw-w-80 tw-m-auto tw-mt-3\">\n <button \n type=\"submit\" class=\"tw-w-full\"\n cideEleButton \n id=\"reset_password_button\" \n [loading]=\"loading()\" \n [disabled]=\"!resetPassswordForm.valid || loading() || !resetToken\">\n Reset Password\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>"],"names":[],"mappings":"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"}