Account Lock
- {{ choice.title }}
+ @for (choice of accountLockChoices; track choice.value) {
+ {{ choice.title }}
+ }
MAGE can lock user accounts after a number of invalid login attempts for a certain amount of time.
-
+@if (strategy.settings.accountLock.enabled) {
Account Lockout Threshold
Account Lock
Max Lockout
- {{ choice.title }}
+ @for (choice of maxLockChoices; track choice.value) {
+ {{ choice.title }}
+ }
MAGE can disable user accounts if a user locks their account a certain number of times.
-
+ @if (maxLock.enabled) {
Max Lockout Threshold
Number of times a user account can be locked before it is disabled. Disabled accounts must be re-enabled by an admin.
-
-
+ }
+}
\ No newline at end of file
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts
index dd640ba40..2b4d20b55 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-local/account-lock/account-lock.component.ts
@@ -1,13 +1,23 @@
import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';
import { Strategy, AdminChoice } from '../../../admin-authentication/admin-settings.model';
import { MaxLock } from './account-lock.model';
+import { FormsModule } from '@angular/forms';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatSelectModule } from '@angular/material/select';
+import { MatInputModule } from '@angular/material/input';
@Component({
selector: 'account-lock',
templateUrl: 'account-lock.component.html',
styleUrls: ['./account-lock.component.scss'],
- standalone: false
+ standalone: true,
+ imports: [
+ FormsModule,
+ MatFormFieldModule,
+ MatSelectModule,
+ MatInputModule
+ ]
})
export class AccountLockComponent implements OnInit {
@Input() strategy: Strategy;
@@ -22,6 +32,7 @@ export class AccountLockComponent implements OnInit {
description: 'Lock MAGE user accounts for defined time \n after defined number of invalid login attempts.',
value: true
}];
+ // no signal - set once
maxLock: MaxLock = {
enabled: false
};
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts
index b15b68a9d..ed7c13dff 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.spec.ts
@@ -8,7 +8,7 @@ describe('AdminAuthenticationLocalComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [AdminAuthenticationLocalComponent],
+ imports: [AdminAuthenticationLocalComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]
}).compileComponents();
}));
@@ -16,6 +16,17 @@ describe('AdminAuthenticationLocalComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(AdminAuthenticationLocalComponent);
component = fixture.componentInstance;
+ component.strategy = {
+ enabled: true,
+ name: 'local',
+ type: 'local',
+ textColor: '#000000',
+ buttonColor: '#ffffff',
+ settings: {
+ accountLock: { enabled: false },
+ passwordPolicy: {}
+ }
+ };
fixture.detectChanges();
});
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts
index 5cf756c44..40229055c 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-local/admin-authentication-local.component.ts
@@ -1,11 +1,17 @@
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { Strategy } from '../../admin-authentication/admin-settings.model';
+import { AccountLockComponent } from './account-lock/account-lock.component';
+import { PasswordPolicyComponent } from './password-policy/password-policy.component';
@Component({
selector: 'admin-authentication-local',
templateUrl: './admin-authentication-local.component.html',
styleUrls: ['./admin-authentication-local.component.scss'],
- standalone: false
+ standalone: true,
+ imports: [
+ AccountLockComponent,
+ PasswordPolicyComponent
+ ]
})
export class AdminAuthenticationLocalComponent {
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts
index 49c6a44d6..f40a1f179 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-local/password-policy/password-policy.component.ts
@@ -1,13 +1,28 @@
import { Component, Input, EventEmitter, Output } from '@angular/core';
import { Strategy } from '../../../admin-authentication/admin-settings.model';
+import { MatSlideToggleModule } from '@angular/material/slide-toggle';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+import { MatTooltipModule } from '@angular/material/tooltip';
+import { MatIconModule } from '@angular/material/icon';
+import { FormsModule } from '@angular/forms';
@Component({
selector: 'password-policy',
templateUrl: 'password-policy.component.html',
styleUrls: ['./password-policy.component.scss'],
- standalone: false
+ standalone: true,
+ imports: [
+ FormsModule,
+ MatSlideToggleModule,
+ MatIconModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatTooltipModule
+ ]
})
export class PasswordPolicyComponent {
+ // No signal needed - strategy is never reassigned
@Input() strategy: Strategy;
@Output() strategyDirty = new EventEmitter();
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts
index 883d41e57..ab9e983cc 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.spec.ts
@@ -9,7 +9,7 @@ describe('AdminAuthenticationOAuth2Component', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [AdminAuthenticationOAuth2Component],
+ imports: [AdminAuthenticationOAuth2Component],
schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]
})
.compileComponents();
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts
index ebaf37d5f..9af5559e6 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-oauth2/admin-authentication-oauth2.component.ts
@@ -1,11 +1,23 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Strategy } from '../../admin-authentication/admin-settings.model';
+import { FormsModule } from '@angular/forms';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+import { MatSlideToggleModule } from '@angular/material/slide-toggle';
+import { MatExpansionModule } from '@angular/material/expansion';
@Component({
selector: 'admin-authentication-oauth2',
templateUrl: './admin-authentication-oauth2.component.html',
styleUrls: ['./admin-authentication-oauth2.component.scss'],
- standalone: false
+ standalone: true,
+ imports: [
+ FormsModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatSlideToggleModule,
+ MatExpansionModule
+ ]
})
export class AdminAuthenticationOAuth2Component implements OnInit {
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts
index a559992cf..131804974 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.spec.ts
@@ -9,8 +9,7 @@ describe('AdminAuthenticationOidcComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [ AdminAuthenticationOidcComponent ],
- imports: [],
+ imports: [ AdminAuthenticationOidcComponent ],
schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA]
})
.compileComponents();
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts b/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts
index e5ad32df3..f0b536075 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-oidc/admin-authentication-oidc.component.ts
@@ -1,11 +1,21 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Strategy } from '../../admin-authentication/admin-settings.model';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { FormsModule } from '@angular/forms';
+import { MatInputModule } from '@angular/material/input';
+import { MatExpansionModule } from '@angular/material/expansion';
@Component({
selector: 'admin-authentication-oidc',
templateUrl: './admin-authentication-oidc.component.html',
styleUrls: ['./admin-authentication-oidc.component.scss'],
- standalone: false
+ standalone: true,
+ imports: [
+ MatFormFieldModule,
+ FormsModule,
+ MatInputModule,
+ MatExpansionModule
+ ]
})
export class AdminAuthenticationOidcComponent implements OnInit {
diff --git a/web-app/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.html b/web-app/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.html
index 4d6e066e4..4efe7a56a 100644
--- a/web-app/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.html
+++ b/web-app/src/app/admin/admin-authentication/admin-authentication-saml/admin-authentication-saml.component.html
@@ -49,9 +49,11 @@