1
0
mirror of https://github.com/bitwarden/directory-connector synced 2025-12-05 23:53:21 +00:00

[deps]: Update bootstrap to v5 [SECURITY] (#585)

* [deps]: Update bootstrap to v5 [SECURITY]

* Use the color-contrast method instead of the deprecated color-yiq method

* Update settings component for bootstrap 5

* Update ApiKey component for bootstrap 5

* Update environment component for bootstrap 5

* Run prettier

* Revert back to data-dismiss

* Update modal close button attribute to use data-bs-dismiss instead of data-dismiss

* Run npm prettier

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Rui Tome <rtome@bitwarden.com>
This commit is contained in:
renovate[bot]
2024-09-17 10:53:56 +01:00
committed by GitHub
parent f52af53dad
commit 6b1b6bf1c4
10 changed files with 294 additions and 309 deletions

View File

@@ -38,8 +38,12 @@ import { StateMigrationService } from "@/jslib/common/src/services/stateMigratio
import { TokenService } from "@/jslib/common/src/services/token.service"; import { TokenService } from "@/jslib/common/src/services/token.service";
import { TwoFactorService } from "@/jslib/common/src/services/twoFactor.service"; import { TwoFactorService } from "@/jslib/common/src/services/twoFactor.service";
import { SafeInjectionToken, SECURE_STORAGE, WINDOW } from '../../../../src/app/services/injection-tokens'; import {
import { SafeProvider, safeProvider } from '../../../../src/app/services/safe-provider'; SafeInjectionToken,
SECURE_STORAGE,
WINDOW,
} from "../../../../src/app/services/injection-tokens";
import { SafeProvider, safeProvider } from "../../../../src/app/services/safe-provider";
import { BroadcasterService } from "./broadcaster.service"; import { BroadcasterService } from "./broadcaster.service";
import { ModalService } from "./modal.service"; import { ModalService } from "./modal.service";
@@ -85,7 +89,11 @@ import { ValidationService } from "./validation.service";
useClass: EnvironmentService, useClass: EnvironmentService,
deps: [StateServiceAbstraction], deps: [StateServiceAbstraction],
}), }),
safeProvider({ provide: TokenServiceAbstraction, useClass: TokenService, deps: [StateServiceAbstraction] }), safeProvider({
provide: TokenServiceAbstraction,
useClass: TokenService,
deps: [StateServiceAbstraction],
}),
safeProvider({ safeProvider({
provide: CryptoServiceAbstraction, provide: CryptoServiceAbstraction,
useClass: CryptoService, useClass: CryptoService,
@@ -125,7 +133,11 @@ import { ValidationService } from "./validation.service";
AppIdServiceAbstraction, AppIdServiceAbstraction,
], ],
}), }),
safeProvider({ provide: BroadcasterServiceAbstraction, useClass: BroadcasterService, useAngularDecorators: true }), safeProvider({
provide: BroadcasterServiceAbstraction,
useClass: BroadcasterService,
useAngularDecorators: true,
}),
safeProvider({ safeProvider({
provide: StateServiceAbstraction, provide: StateServiceAbstraction,
useFactory: ( useFactory: (

View File

@@ -143,7 +143,7 @@ export class ModalService {
dialogEl.style.zIndex = `${this.modalCount}050`; dialogEl.style.zIndex = `${this.modalCount}050`;
const modals = Array.from( const modals = Array.from(
el.querySelectorAll('.modal-backdrop, .modal *[data-dismiss="modal"]'), el.querySelectorAll('.modal-backdrop, .modal *[data-bs-dismiss="modal"]'),
); );
for (const closeElement of modals) { for (const closeElement of modals) {
closeElement.addEventListener("click", () => { closeElement.addEventListener("click", () => {

View File

@@ -131,8 +131,7 @@ export class LoginCommand {
let response: AuthResult = null; let response: AuthResult = null;
if (clientId != null && clientSecret != null) { if (clientId != null && clientSecret != null) {
response = await this.authService.logIn(new ApiLogInCredentials(clientId, clientSecret)); response = await this.authService.logIn(new ApiLogInCredentials(clientId, clientSecret));
} } else {
else {
response = await this.authService.logIn( response = await this.authService.logIn(
new PasswordLogInCredentials(email, password, null, twoFactor), new PasswordLogInCredentials(email, password, null, twoFactor),
); );

View File

@@ -77,7 +77,7 @@ export class CliPlatformUtilsService implements PlatformUtilsService {
launchUri(_uri: string, _options?: any): void { launchUri(_uri: string, _options?: any): void {
throw new Error("Not implemented."); throw new Error("Not implemented.");
}; }
saveFile(win: Window, blobData: any, blobOptions: any, fileName: string): void { saveFile(win: Window, blobData: any, blobOptions: any, fileName: string): void {
throw new Error("Not implemented."); throw new Error("Not implemented.");

54
package-lock.json generated
View File

@@ -21,7 +21,7 @@
"@angular/router": "16.2.12", "@angular/router": "16.2.12",
"@microsoft/microsoft-graph-client": "3.0.7", "@microsoft/microsoft-graph-client": "3.0.7",
"big-integer": "1.6.52", "big-integer": "1.6.52",
"bootstrap": "4.6.2", "bootstrap": "5.0.0",
"browser-hrtime": "1.1.8", "browser-hrtime": "1.1.8",
"chalk": "4.1.2", "chalk": "4.1.2",
"commander": "12.1.0", "commander": "12.1.0",
@@ -4676,6 +4676,17 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@sinclair/typebox": { "node_modules/@sinclair/typebox": {
"version": "0.27.8", "version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
@@ -7156,22 +7167,16 @@
"optional": true "optional": true
}, },
"node_modules/bootstrap": { "node_modules/bootstrap": {
"version": "4.6.2", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz",
"integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", "integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==",
"funding": [ "license": "MIT",
{ "funding": {
"type": "github", "type": "opencollective",
"url": "https://github.com/sponsors/twbs" "url": "https://opencollective.com/bootstrap"
}, },
{
"type": "opencollective",
"url": "https://opencollective.com/bootstrap"
}
],
"peerDependencies": { "peerDependencies": {
"jquery": "1.9.1 - 3", "@popperjs/core": "^2.9.2"
"popper.js": "^1.16.1"
} }
}, },
"node_modules/brace-expansion": { "node_modules/brace-expansion": {
@@ -14108,12 +14113,6 @@
"jiti": "bin/jiti.js" "jiti": "bin/jiti.js"
} }
}, },
"node_modules/jquery": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
"integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
"peer": true
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -17142,17 +17141,6 @@
"node": ">=10.4.0" "node": ">=10.4.0"
} }
}, },
"node_modules/popper.js": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
"deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/possible-typed-array-names": { "node_modules/possible-typed-array-names": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",

View File

@@ -148,7 +148,7 @@
"@angular/router": "16.2.12", "@angular/router": "16.2.12",
"@microsoft/microsoft-graph-client": "3.0.7", "@microsoft/microsoft-graph-client": "3.0.7",
"big-integer": "1.6.52", "big-integer": "1.6.52",
"bootstrap": "4.6.2", "bootstrap": "5.0.0",
"browser-hrtime": "1.1.8", "browser-hrtime": "1.1.8",
"chalk": "4.1.2", "chalk": "4.1.2",
"commander": "12.1.0", "commander": "12.1.0",

View File

@@ -2,41 +2,33 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-8 col-lg-6"> <div class="col-md-8 col-lg-6">
<p class="text-center font-weight-bold">{{ "welcome" | i18n }}</p> <p class="text-center fw-bold">{{ "welcome" | i18n }}</p>
<p class="text-center">{{ "logInDesc" | i18n }}</p> <p class="text-center">{{ "logInDesc" | i18n }}</p>
<div class="card"> <div class="card">
<h5 class="card-header">{{ "logIn" | i18n }}</h5> <h5 class="card-header">{{ "logIn" | i18n }}</h5>
<div class="card-body"> <div class="card-body">
<div class="form-group"> <div class="mb-3">
<label for="client_id">{{ "clientId" | i18n }}</label> <label for="client_id" class="form-label">{{ "clientId" | i18n }}</label>
<input id="client_id" name="ClientId" [(ngModel)]="clientId" class="form-control" /> <input id="client_id" name="ClientId" [(ngModel)]="clientId" class="form-control" />
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="row-main"> <label for="client_secret" class="form-label">{{ "clientSecret" | i18n }}</label>
<label for="client_secret">{{ "clientSecret" | i18n }}</label> <div class="input-group">
<div class="input-group"> <input
<input type="{{ showSecret ? 'text' : 'password' }}"
type="{{ showSecret ? 'text' : 'password' }}" id="client_secret"
id="client_secret" name="ClientSecret"
name="ClientSecret" [(ngModel)]="clientSecret"
[(ngModel)]="clientSecret" class="form-control"
class="form-control" />
/> <button
<div class="input-group-append"> type="button"
<button class="btn btn-outline-secondary"
type="button" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
class="ml-1 btn btn-link" (click)="toggleSecret()"
appA11yTitle="{{ 'toggleVisibility' | i18n }}" >
(click)="toggleSecret()" <i class="bwi" [ngClass]="showSecret ? 'bwi-eye-slash' : 'bwi-eye'"></i>
> </button>
<i
class="bwi bwi-lg"
aria-hidden="true"
[ngClass]="showSecret ? 'bwi-eye-slash' : 'bwi-eye'"
></i>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="d-flex"> <div class="d-flex">
@@ -47,7 +39,7 @@
{{ "logIn" | i18n }} {{ "logIn" | i18n }}
</button> </button>
</div> </div>
<button type="button" class="btn btn-link ml-auto" (click)="settings()"> <button type="button" class="btn btn-link ms-auto" (click)="settings()">
{{ "settings" | i18n }} {{ "settings" | i18n }}
</button> </button>
</div> </div>

View File

@@ -3,15 +3,13 @@
<form class="modal-content" (ngSubmit)="submit()"> <form class="modal-content" (ngSubmit)="submit()">
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">{{ "settings" | i18n }}</h3> <h3 class="modal-title">{{ "settings" | i18n }}</h3>
<button type="button" class="close" data-dismiss="modal" title="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<span aria-hidden="true">&times;</span>
</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<h4>{{ "selfHostedEnvironment" | i18n }}</h4> <h4>{{ "selfHostedEnvironment" | i18n }}</h4>
<p>{{ "selfHostedEnvironmentFooter" | i18n }}</p> <p>{{ "selfHostedEnvironmentFooter" | i18n }}</p>
<div class="form-group"> <div class="mb-3">
<label for="baseUrl">{{ "baseUrl" | i18n }}</label> <label for="baseUrl" class="form-label">{{ "baseUrl" | i18n }}</label>
<input <input
id="baseUrl" id="baseUrl"
type="text" type="text"
@@ -19,14 +17,12 @@
[(ngModel)]="baseUrl" [(ngModel)]="baseUrl"
class="form-control" class="form-control"
/> />
<small class="text-muted form-text" <div class="form-text">{{ "ex" | i18n }} https://bitwarden.company.com</div>
>{{ "ex" | i18n }} https://bitwarden.company.com</small
>
</div> </div>
<h4>{{ "customEnvironment" | i18n }}</h4> <h4>{{ "customEnvironment" | i18n }}</h4>
<p>{{ "customEnvironmentFooter" | i18n }}</p> <p>{{ "customEnvironmentFooter" | i18n }}</p>
<div class="form-group"> <div class="mb-3">
<label for="webVaultUrl">{{ "webVaultUrl" | i18n }}</label> <label for="webVaultUrl" class="form-label">{{ "webVaultUrl" | i18n }}</label>
<input <input
id="webVaultUrl" id="webVaultUrl"
type="text" type="text"
@@ -35,12 +31,12 @@
class="form-control" class="form-control"
/> />
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="apiUrl">{{ "apiUrl" | i18n }}</label> <label for="apiUrl" class="form-label">{{ "apiUrl" | i18n }}</label>
<input id="apiUrl" type="text" name="ApiUrl" [(ngModel)]="apiUrl" class="form-control" /> <input id="apiUrl" type="text" name="ApiUrl" [(ngModel)]="apiUrl" class="form-control" />
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="identityUrl">{{ "identityUrl" | i18n }}</label> <label for="identityUrl" class="form-label">{{ "identityUrl" | i18n }}</label>
<input <input
id="identityUrl" id="identityUrl"
type="text" type="text"

View File

@@ -1,19 +1,19 @@
<div class="row"> <div class="row g-3">
<div class="col-sm"> <div class="col-sm">
<div class="card mb-3"> <div class="card mb-3">
<h3 class="card-header">{{ "directory" | i18n }}</h3> <h3 class="card-header">{{ "directory" | i18n }}</h3>
<div class="card-body"> <div class="card-body">
<div class="form-group"> <div class="mb-3">
<label for="directory">{{ "type" | i18n }}</label> <label for="directory" class="form-label">{{ "type" | i18n }}</label>
<select class="form-control" id="directory" name="Directory" [(ngModel)]="directory"> <select class="form-select" id="directory" name="Directory" [(ngModel)]="directory">
<option *ngFor="let o of directoryOptions" [ngValue]="o.value"> <option *ngFor="let o of directoryOptions" [ngValue]="o.value">
{{ o.name }} {{ o.name }}
</option> </option>
</select> </select>
</div> </div>
<div [hidden]="directory != directoryType.Ldap"> <div [hidden]="directory != directoryType.Ldap">
<div class="form-group"> <div class="mb-3">
<label for="hostname">{{ "serverHostname" | i18n }}</label> <label for="hostname" class="form-label">{{ "serverHostname" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -21,15 +21,15 @@
name="Hostname" name="Hostname"
[(ngModel)]="ldap.hostname" [(ngModel)]="ldap.hostname"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} ad.company.com</small> <div class="form-text">{{ "ex" | i18n }} ad.company.com</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="port">{{ "port" | i18n }}</label> <label for="port" class="form-label">{{ "port" | i18n }}</label>
<input type="text" class="form-control" id="port" name="Port" [(ngModel)]="ldap.port" /> <input type="text" class="form-control" id="port" name="Port" [(ngModel)]="ldap.port" />
<small class="text-muted form-text">{{ "ex" | i18n }} 389</small> <div class="form-text">{{ "ex" | i18n }} 389</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="rootPath">{{ "rootPath" | i18n }}</label> <label for="rootPath" class="form-label">{{ "rootPath" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -37,9 +37,9 @@
name="RootPath" name="RootPath"
[(ngModel)]="ldap.rootPath" [(ngModel)]="ldap.rootPath"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} dc=company,dc=com</small> <div class="form-text">{{ "ex" | i18n }} dc=company,dc=com</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -51,7 +51,7 @@
<label class="form-check-label" for="ad">{{ "ldapAd" | i18n }}</label> <label class="form-check-label" for="ad">{{ "ldapAd" | i18n }}</label>
</div> </div>
</div> </div>
<div class="form-group" *ngIf="!ldap.ad"> <div class="mb-3" *ngIf="!ldap.ad">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -65,7 +65,7 @@
}}</label> }}</label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -79,38 +79,38 @@
}}</label> }}</label>
</div> </div>
</div> </div>
<div class="ml-4" *ngIf="ldap.ssl"> <div class="ms-4" *ngIf="ldap.ssl">
<div class="form-group"> <div class="mb-3">
<div class="form-radio"> <div class="form-check">
<input <input
class="form-radio-input" class="form-check-input"
type="radio" type="radio"
[value]="false" [value]="false"
id="ssl" id="ssl"
[(ngModel)]="ldap.startTls" [(ngModel)]="ldap.startTls"
name="SSL" name="SSL"
/> />
<label class="form-radio-label" for="ssl">{{ "ldapSsl" | i18n }}</label> <label class="form-check-label" for="ssl">{{ "ldapSsl" | i18n }}</label>
</div> </div>
<div class="form-radio"> <div class="form-check">
<input <input
class="form-radio-input" class="form-check-input"
type="radio" type="radio"
[value]="true" [value]="true"
id="startTls" id="startTls"
[(ngModel)]="ldap.startTls" [(ngModel)]="ldap.startTls"
name="StartTLS" name="StartTLS"
/> />
<label class="form-radio-label" for="startTls">{{ "ldapTls" | i18n }}</label> <label class="form-check-label" for="startTls">{{ "ldapTls" | i18n }}</label>
</div> </div>
</div> </div>
<div class="ml-4" *ngIf="ldap.startTls"> <div class="ms-4" *ngIf="ldap.startTls">
<p>{{ "ldapTlsUntrustedDesc" | i18n }}</p> <p>{{ "ldapTlsUntrustedDesc" | i18n }}</p>
<div class="form-group"> <div class="mb-3">
<label for="tlsCaPath">{{ "ldapTlsCa" | i18n }}</label> <label for="tlsCaPath" class="form-label">{{ "ldapTlsCa" | i18n }}</label>
<input <input
type="file" type="file"
class="form-control-file mb-2" class="form-control mb-2"
id="tlsCaPath_file" id="tlsCaPath_file"
(change)="setSslPath('tlsCaPath')" (change)="setSslPath('tlsCaPath')"
/> />
@@ -123,13 +123,13 @@
/> />
</div> </div>
</div> </div>
<div class="ml-4" *ngIf="!ldap.startTls"> <div class="ms-4" *ngIf="!ldap.startTls">
<p>{{ "ldapSslUntrustedDesc" | i18n }}</p> <p>{{ "ldapSslUntrustedDesc" | i18n }}</p>
<div class="form-group"> <div class="mb-3">
<label for="sslCertPath">{{ "ldapSslCert" | i18n }}</label> <label for="sslCertPath" class="form-label">{{ "ldapSslCert" | i18n }}</label>
<input <input
type="file" type="file"
class="form-control-file mb-2" class="form-control mb-2"
id="sslCertPath_file" id="sslCertPath_file"
(change)="setSslPath('sslCertPath')" (change)="setSslPath('sslCertPath')"
/> />
@@ -141,11 +141,11 @@
[(ngModel)]="ldap.sslCertPath" [(ngModel)]="ldap.sslCertPath"
/> />
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="sslKeyPath">{{ "ldapSslKey" | i18n }}</label> <label for="sslKeyPath" class="form-label">{{ "ldapSslKey" | i18n }}</label>
<input <input
type="file" type="file"
class="form-control-file mb-2" class="form-control mb-2"
id="sslKeyPath_file" id="sslKeyPath_file"
(change)="setSslPath('sslKeyPath')" (change)="setSslPath('sslKeyPath')"
/> />
@@ -157,11 +157,11 @@
[(ngModel)]="ldap.sslKeyPath" [(ngModel)]="ldap.sslKeyPath"
/> />
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="sslCaPath">{{ "ldapSslCa" | i18n }}</label> <label for="sslCaPath" class="form-label">{{ "ldapSslCa" | i18n }}</label>
<input <input
type="file" type="file"
class="form-control-file mb-2" class="form-control mb-2"
id="sslCaPath_file" id="sslCaPath_file"
(change)="setSslPath('sslCaPath')" (change)="setSslPath('sslCaPath')"
/> />
@@ -174,7 +174,7 @@
/> />
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -189,7 +189,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="form-group" [hidden]="true"> <div class="mb-3" [hidden]="true">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -202,8 +202,8 @@
</div> </div>
</div> </div>
<div [hidden]="ldap.currentUser"> <div [hidden]="ldap.currentUser">
<div class="form-group"> <div class="mb-3">
<label for="username">{{ "username" | i18n }}</label> <label for="username" class="form-label">{{ "username" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -211,15 +211,13 @@
name="Username" name="Username"
[(ngModel)]="ldap.username" [(ngModel)]="ldap.username"
/> />
<small class="text-muted form-text" *ngIf="ldap.ad" <div class="form-text" *ngIf="ldap.ad">{{ "ex" | i18n }} company\admin</div>
>{{ "ex" | i18n }} company\admin</small <div class="form-text" *ngIf="!ldap.ad">
> {{ "ex" | i18n }} cn=admin,dc=company,dc=com
<small class="text-muted form-text" *ngIf="!ldap.ad" </div>
>{{ "ex" | i18n }} cn=admin,dc=company,dc=com</small
>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="password">{{ "password" | i18n }}</label> <label for="password" class="form-label">{{ "password" | i18n }}</label>
<div class="input-group"> <div class="input-group">
<input <input
type="{{ showLdapPassword ? 'text' : 'password' }}" type="{{ showLdapPassword ? 'text' : 'password' }}"
@@ -228,29 +226,29 @@
name="Password" name="Password"
[(ngModel)]="ldap.password" [(ngModel)]="ldap.password"
/> />
<div class="input-group-append"> <button
<button type="button"
type="button" class="btn btn-outline-secondary"
class="btn btn-outline-secondary" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
appA11yTitle="{{ 'toggleVisibility' | i18n }}" (click)="toggleLdapPassword()"
(click)="toggleLdapPassword()" >
> <i
<i class="bwi bwi-lg"
class="bwi bwi-lg" aria-hidden="true"
aria-hidden="true" [ngClass]="showLdapPassword ? 'bwi-eye-slash' : 'bwi-eye'"
[ngClass]="showLdapPassword ? 'bwi-eye-slash' : 'bwi-eye'" ></i>
></i> </button>
</button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div [hidden]="directory != directoryType.AzureActiveDirectory"> <div [hidden]="directory != directoryType.AzureActiveDirectory">
<div class="form-group"> <div class="mb-3">
<label for="identityAuthority">{{ "identityAuthority" | i18n }}</label> <label for="identityAuthority" class="form-label">{{
"identityAuthority" | i18n
}}</label>
<select <select
class="form-control" class="form-select"
id="identityAuthority" id="identityAuthority"
name="IdentityAuthority" name="IdentityAuthority"
[(ngModel)]="azure.identityAuthority" [(ngModel)]="azure.identityAuthority"
@@ -259,8 +257,8 @@
<option value="login.microsoftonline.us">Azure AD Government</option> <option value="login.microsoftonline.us">Azure AD Government</option>
</select> </select>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="tenant">{{ "tenant" | i18n }}</label> <label for="tenant" class="form-label">{{ "tenant" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -268,10 +266,10 @@
name="Tenant" name="Tenant"
[(ngModel)]="azure.tenant" [(ngModel)]="azure.tenant"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} companyad.onmicrosoft.com</small> <div class="form-text">{{ "ex" | i18n }} companyad.onmicrosoft.com</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="applicationId">{{ "applicationId" | i18n }}</label> <label for="applicationId" class="form-label">{{ "applicationId" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -280,8 +278,8 @@
[(ngModel)]="azure.applicationId" [(ngModel)]="azure.applicationId"
/> />
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="secretKey">{{ "secretKey" | i18n }}</label> <label for="secretKey" class="form-label">{{ "secretKey" | i18n }}</label>
<div class="input-group"> <div class="input-group">
<input <input
type="{{ showAzureKey ? 'text' : 'password' }}" type="{{ showAzureKey ? 'text' : 'password' }}"
@@ -290,26 +288,24 @@
name="SecretKey" name="SecretKey"
[(ngModel)]="azure.key" [(ngModel)]="azure.key"
/> />
<div class="input-group-append"> <button
<button type="button"
type="button" class="btn btn-outline-secondary"
class="btn btn-outline-secondary" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
appA11yTitle="{{ 'toggleVisibility' | i18n }}" (click)="toggleAzureKey()"
(click)="toggleAzureKey()" >
> <i
<i class="bwi bwi-lg"
class="bwi bwi-lg" aria-hidden="true"
aria-hidden="true" [ngClass]="showAzureKey ? 'bwi-eye-slash' : 'bwi-eye'"
[ngClass]="showAzureKey ? 'bwi-eye-slash' : 'bwi-eye'" ></i>
></i> </button>
</button>
</div>
</div> </div>
</div> </div>
</div> </div>
<div [hidden]="directory != directoryType.Okta"> <div [hidden]="directory != directoryType.Okta">
<div class="form-group"> <div class="mb-3">
<label for="orgUrl">{{ "organizationUrl" | i18n }}</label> <label for="orgUrl" class="form-label">{{ "organizationUrl" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -317,12 +313,10 @@
name="OrgUrl" name="OrgUrl"
[(ngModel)]="okta.orgUrl" [(ngModel)]="okta.orgUrl"
/> />
<small class="text-muted form-text" <div class="form-text">{{ "ex" | i18n }} https://mycompany.okta.com/</div>
>{{ "ex" | i18n }} https://mycompany.okta.com/</small
>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="oktaToken">{{ "token" | i18n }}</label> <label for="oktaToken" class="form-label">{{ "token" | i18n }}</label>
<div class="input-group"> <div class="input-group">
<input <input
type="{{ showOktaKey ? 'text' : 'password' }}" type="{{ showOktaKey ? 'text' : 'password' }}"
@@ -331,26 +325,24 @@
name="OktaToken" name="OktaToken"
[(ngModel)]="okta.token" [(ngModel)]="okta.token"
/> />
<div class="input-group-append"> <button
<button type="button"
type="button" class="btn btn-outline-secondary"
class="btn btn-outline-secondary" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
appA11yTitle="{{ 'toggleVisibility' | i18n }}" (click)="toggleOktaKey()"
(click)="toggleOktaKey()" >
> <i
<i class="bwi bwi-lg"
class="bwi bwi-lg" aria-hidden="true"
aria-hidden="true" [ngClass]="showOktaKey ? 'bwi-eye-slash' : 'bwi-eye'"
[ngClass]="showOktaKey ? 'bwi-eye-slash' : 'bwi-eye'" ></i>
></i> </button>
</button>
</div>
</div> </div>
</div> </div>
</div> </div>
<div [hidden]="directory != directoryType.OneLogin"> <div [hidden]="directory != directoryType.OneLogin">
<div class="form-group"> <div class="mb-3">
<label for="oneLoginClientId">{{ "clientId" | i18n }}</label> <label for="oneLoginClientId" class="form-label">{{ "clientId" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -359,8 +351,8 @@
[(ngModel)]="oneLogin.clientId" [(ngModel)]="oneLogin.clientId"
/> />
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="oneLoginClientSecret">{{ "clientSecret" | i18n }}</label> <label for="oneLoginClientSecret" class="form-label">{{ "clientSecret" | i18n }}</label>
<div class="input-group"> <div class="input-group">
<input <input
type="{{ showOneLoginSecret ? 'text' : 'password' }}" type="{{ showOneLoginSecret ? 'text' : 'password' }}"
@@ -369,26 +361,24 @@
name="OneLoginClientSecret" name="OneLoginClientSecret"
[(ngModel)]="oneLogin.clientSecret" [(ngModel)]="oneLogin.clientSecret"
/> />
<div class="input-group-append"> <button
<button type="button"
type="button" class="btn btn-outline-secondary"
class="btn btn-outline-secondary" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
appA11yTitle="{{ 'toggleVisibility' | i18n }}" (click)="toggleOneLoginSecret()"
(click)="toggleOneLoginSecret()" >
> <i
<i class="bwi bwi-lg"
class="bwi bwi-lg" aria-hidden="true"
aria-hidden="true" [ngClass]="showOneLoginSecret ? 'bwi-eye-slash' : 'bwi-eye'"
[ngClass]="showOneLoginSecret ? 'bwi-eye-slash' : 'bwi-eye'" ></i>
></i> </button>
</button>
</div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="oneLoginRegion">{{ "region" | i18n }}</label> <label for="oneLoginRegion" class="form-label">{{ "region" | i18n }}</label>
<select <select
class="form-control" class="form-select"
id="oneLoginRegion" id="oneLoginRegion"
name="OneLoginRegion" name="OneLoginRegion"
[(ngModel)]="oneLogin.region" [(ngModel)]="oneLogin.region"
@@ -399,8 +389,8 @@
</div> </div>
</div> </div>
<div [hidden]="directory != directoryType.GSuite"> <div [hidden]="directory != directoryType.GSuite">
<div class="form-group"> <div class="mb-3">
<label for="domain">{{ "domain" | i18n }}</label> <label for="domain" class="form-label">{{ "domain" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -408,10 +398,10 @@
name="Domain" name="Domain"
[(ngModel)]="gsuite.domain" [(ngModel)]="gsuite.domain"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} company.com</small> <div class="form-text">{{ "ex" | i18n }} company.com</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="adminUser">{{ "adminUser" | i18n }}</label> <label for="adminUser" class="form-label">{{ "adminUser" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -419,10 +409,10 @@
name="AdminUser" name="AdminUser"
[(ngModel)]="gsuite.adminUser" [(ngModel)]="gsuite.adminUser"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} admin&#64;company.com</small> <div class="form-text">{{ "ex" | i18n }} admin&#64;company.com</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="customerId">{{ "customerId" | i18n }}</label> <label for="customerId" class="form-label">{{ "customerId" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -430,21 +420,21 @@
name="CustomerId" name="CustomerId"
[(ngModel)]="gsuite.customer" [(ngModel)]="gsuite.customer"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} 39204722352</small> <div class="form-text">{{ "ex" | i18n }} 39204722352</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="keyFile">{{ "jsonKeyFile" | i18n }}</label> <label for="keyFile" class="form-label">{{ "jsonKeyFile" | i18n }}</label>
<input <input
type="file" type="file"
class="form-control-file" class="form-control"
id="keyFile" id="keyFile"
accept=".json" accept=".json"
(change)="parseKeyFile()" (change)="parseKeyFile()"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} My Project-jksd3jd223.json</small> <div class="form-text">{{ "ex" | i18n }} My Project-jksd3jd223.json</div>
</div> </div>
<div class="form-group" [hidden]="!gsuite.clientEmail"> <div class="mb-3" [hidden]="!gsuite.clientEmail">
<label for="clientEmail">{{ "clientEmail" | i18n }}</label> <label for="clientEmail" class="form-label">{{ "clientEmail" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -453,8 +443,8 @@
[(ngModel)]="gsuite.clientEmail" [(ngModel)]="gsuite.clientEmail"
/> />
</div> </div>
<div class="form-group" [hidden]="!gsuite.privateKey"> <div class="mb-3" [hidden]="!gsuite.privateKey">
<label for="privateKey">{{ "privateKey" | i18n }}</label> <label for="privateKey" class="form-label">{{ "privateKey" | i18n }}</label>
<textarea <textarea
class="form-control text-monospace" class="form-control text-monospace"
id="privateKey" id="privateKey"
@@ -471,8 +461,8 @@
<div class="card"> <div class="card">
<h3 class="card-header">{{ "sync" | i18n }}</h3> <h3 class="card-header">{{ "sync" | i18n }}</h3>
<div class="card-body"> <div class="card-body">
<div class="form-group"> <div class="mb-3">
<label for="interval">{{ "interval" | i18n }}</label> <label for="interval" class="form-label">{{ "interval" | i18n }}</label>
<input <input
type="number" type="number"
min="5" min="5"
@@ -481,9 +471,9 @@
name="Interval" name="Interval"
[(ngModel)]="sync.interval" [(ngModel)]="sync.interval"
/> />
<small class="text-muted form-text">{{ "intervalMin" | i18n }}</small> <div class="form-text">{{ "intervalMin" | i18n }}</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -497,7 +487,7 @@
}}</label> }}</label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -511,7 +501,7 @@
}}</label> }}</label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -525,8 +515,8 @@
</div> </div>
<div [hidden]="directory != directoryType.Ldap"> <div [hidden]="directory != directoryType.Ldap">
<div [hidden]="ldap.ad"> <div [hidden]="ldap.ad">
<div class="form-group"> <div class="mb-3">
<label for="memberAttribute">{{ "memberAttribute" | i18n }}</label> <label for="memberAttribute" class="form-label">{{ "memberAttribute" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -534,10 +524,12 @@
name="MemberAttribute" name="MemberAttribute"
[(ngModel)]="sync.memberAttribute" [(ngModel)]="sync.memberAttribute"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} uniqueMember</small> <div class="form-text">{{ "ex" | i18n }} uniqueMember</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="creationDateAttribute">{{ "creationDateAttribute" | i18n }}</label> <label for="creationDateAttribute" class="form-label">{{
"creationDateAttribute" | i18n
}}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -545,10 +537,12 @@
name="CreationDateAttribute" name="CreationDateAttribute"
[(ngModel)]="sync.creationDateAttribute" [(ngModel)]="sync.creationDateAttribute"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} whenCreated</small> <div class="form-text">{{ "ex" | i18n }} whenCreated</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="revisionDateAttribute">{{ "revisionDateAttribute" | i18n }}</label> <label for="revisionDateAttribute" class="form-label">{{
"revisionDateAttribute" | i18n
}}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -556,12 +550,12 @@
name="RevisionDateAttribute" name="RevisionDateAttribute"
[(ngModel)]="sync.revisionDateAttribute" [(ngModel)]="sync.revisionDateAttribute"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} whenChanged</small> <div class="form-text">{{ "ex" | i18n }} whenChanged</div>
</div> </div>
</div> </div>
</div> </div>
<div [hidden]="directory != directoryType.Ldap && directory != directoryType.OneLogin"> <div [hidden]="directory != directoryType.Ldap && directory != directoryType.OneLogin">
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -576,8 +570,10 @@
</div> </div>
</div> </div>
<div [hidden]="!sync.useEmailPrefixSuffix"> <div [hidden]="!sync.useEmailPrefixSuffix">
<div class="form-group" [hidden]="ldap.ad || directory != directoryType.Ldap"> <div class="mb-3" [hidden]="ldap.ad || directory != directoryType.Ldap">
<label for="emailPrefixAttribute">{{ "emailPrefixAttribute" | i18n }}</label> <label for="emailPrefixAttribute" class="form-label">{{
"emailPrefixAttribute" | i18n
}}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -585,10 +581,10 @@
name="EmailPrefixAttribute" name="EmailPrefixAttribute"
[(ngModel)]="sync.emailPrefixAttribute" [(ngModel)]="sync.emailPrefixAttribute"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} accountName</small> <div class="form-text">{{ "ex" | i18n }} accountName</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="emailSuffix">{{ "emailSuffix" | i18n }}</label> <label for="emailSuffix" class="form-label">{{ "emailSuffix" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -596,12 +592,12 @@
name="EmailSuffix" name="EmailSuffix"
[(ngModel)]="sync.emailSuffix" [(ngModel)]="sync.emailSuffix"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} &#64;company.com</small> <div class="form-text">{{ "ex" | i18n }} &#64;company.com</div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -614,31 +610,29 @@
</div> </div>
</div> </div>
<div [hidden]="!sync.users"> <div [hidden]="!sync.users">
<div class="form-group"> <div class="mb-3">
<label for="userFilter">{{ "userFilter" | i18n }}</label> <label for="userFilter" class="form-label">{{ "userFilter" | i18n }}</label>
<textarea <textarea
class="form-control" class="form-control"
id="userFilter" id="userFilter"
name="UserFilter" name="UserFilter"
[(ngModel)]="sync.userFilter" [(ngModel)]="sync.userFilter"
></textarea> ></textarea>
<small class="text-muted form-text" *ngIf="directory === directoryType.Ldap" <div class="form-text" *ngIf="directory === directoryType.Ldap">
>{{ "ex" | i18n }} (&amp;(givenName=John)(|(l=Dallas)(l=Austin)))</small {{ "ex" | i18n }} (&amp;(givenName=John)(|(l=Dallas)(l=Austin)))
> </div>
<small <div class="form-text" *ngIf="directory === directoryType.AzureActiveDirectory">
class="text-muted form-text" {{ "ex" | i18n }} exclude:joe&#64;company.com
*ngIf="directory === directoryType.AzureActiveDirectory" </div>
>{{ "ex" | i18n }} exclude:joe&#64;company.com</small <div class="form-text" *ngIf="directory === directoryType.Okta">
> {{ "ex" | i18n }} exclude:joe&#64;company.com | profile.firstName eq "John"
<small class="text-muted form-text" *ngIf="directory === directoryType.Okta" </div>
>{{ "ex" | i18n }} exclude:joe&#64;company.com | profile.firstName eq "John"</small <div class="form-text" *ngIf="directory === directoryType.GSuite">
> {{ "ex" | i18n }} exclude:joe&#64;company.com | orgName=Engineering
<small class="text-muted form-text" *ngIf="directory === directoryType.GSuite" </div>
>{{ "ex" | i18n }} exclude:joe&#64;company.com | orgName=Engineering</small
>
</div> </div>
<div class="form-group" [hidden]="directory != directoryType.Ldap"> <div class="mb-3" [hidden]="directory != directoryType.Ldap">
<label for="userPath">{{ "userPath" | i18n }}</label> <label for="userPath" class="form-label">{{ "userPath" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -646,11 +640,11 @@
name="UserPath" name="UserPath"
[(ngModel)]="sync.userPath" [(ngModel)]="sync.userPath"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} CN=Users</small> <div class="form-text">{{ "ex" | i18n }} CN=Users</div>
</div> </div>
<div [hidden]="directory != directoryType.Ldap || ldap.ad"> <div [hidden]="directory != directoryType.Ldap || ldap.ad">
<div class="form-group"> <div class="mb-3">
<label for="userObjectClass">{{ "userObjectClass" | i18n }}</label> <label for="userObjectClass" class="form-label">{{ "userObjectClass" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -658,10 +652,12 @@
name="UserObjectClass" name="UserObjectClass"
[(ngModel)]="sync.userObjectClass" [(ngModel)]="sync.userObjectClass"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} inetOrgPerson</small> <div class="form-text">{{ "ex" | i18n }} inetOrgPerson</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="userEmailAttribute">{{ "userEmailAttribute" | i18n }}</label> <label for="userEmailAttribute" class="form-label">{{
"userEmailAttribute" | i18n
}}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -669,12 +665,12 @@
name="UserEmailAttribute" name="UserEmailAttribute"
[(ngModel)]="sync.userEmailAttribute" [(ngModel)]="sync.userEmailAttribute"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} mail</small> <div class="form-text">{{ "ex" | i18n }} mail</div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<div class="form-check"> <div class="form-check">
<input <input
class="form-check-input" class="form-check-input"
@@ -689,8 +685,8 @@
</div> </div>
</div> </div>
<div [hidden]="!sync.groups"> <div [hidden]="!sync.groups">
<div class="form-group"> <div class="mb-3">
<label for="groupFilter">{{ <label for="groupFilter" class="form-label">{{
(directory !== directoryType.OneLogin ? "groupFilter" : "groupFilterOneLogin") | i18n (directory !== directoryType.OneLogin ? "groupFilter" : "groupFilterOneLogin") | i18n
}}</label> }}</label>
<textarea <textarea
@@ -699,23 +695,21 @@
name="GroupFilter" name="GroupFilter"
[(ngModel)]="sync.groupFilter" [(ngModel)]="sync.groupFilter"
></textarea> ></textarea>
<small class="text-muted form-text" *ngIf="directory === directoryType.Ldap" <div class="form-text" *ngIf="directory === directoryType.Ldap">
>{{ "ex" | i18n }} (&amp;(objectClass=group)(!(cn=Sales*))(!(cn=IT*)))</small {{ "ex" | i18n }} (&amp;(objectClass=group)(!(cn=Sales*))(!(cn=IT*)))
> </div>
<small <div class="form-text" *ngIf="directory === directoryType.AzureActiveDirectory">
class="text-muted form-text" {{ "ex" | i18n }} include:Sales,IT
*ngIf="directory === directoryType.AzureActiveDirectory" </div>
>{{ "ex" | i18n }} include:Sales,IT</small <div class="form-text" *ngIf="directory === directoryType.Okta">
> {{ "ex" | i18n }} include:Sales,IT | type eq "APP_GROUP"
<small class="text-muted form-text" *ngIf="directory === directoryType.Okta" </div>
>{{ "ex" | i18n }} include:Sales,IT | type eq "APP_GROUP"</small <div class="form-text" *ngIf="directory === directoryType.GSuite">
> {{ "ex" | i18n }} include:Sales,IT
<small class="text-muted form-text" *ngIf="directory === directoryType.GSuite" </div>
>{{ "ex" | i18n }} include:Sales,IT</small
>
</div> </div>
<div class="form-group" [hidden]="directory != directoryType.Ldap"> <div class="mb-3" [hidden]="directory != directoryType.Ldap">
<label for="groupPath">{{ "groupPath" | i18n }}</label> <label for="groupPath" class="form-label">{{ "groupPath" | i18n }}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -723,12 +717,14 @@
name="GroupPath" name="GroupPath"
[(ngModel)]="sync.groupPath" [(ngModel)]="sync.groupPath"
/> />
<small class="text-muted form-text" *ngIf="!ldap.ad">{{ "ex" | i18n }} CN=Groups</small> <div class="form-text" *ngIf="!ldap.ad">{{ "ex" | i18n }} CN=Groups</div>
<small class="text-muted form-text" *ngIf="ldap.ad">{{ "ex" | i18n }} CN=Users</small> <div class="form-text" *ngIf="ldap.ad">{{ "ex" | i18n }} CN=Users</div>
</div> </div>
<div [hidden]="directory != directoryType.Ldap || ldap.ad"> <div [hidden]="directory != directoryType.Ldap || ldap.ad">
<div class="form-group"> <div class="mb-3">
<label for="groupObjectClass">{{ "groupObjectClass" | i18n }}</label> <label for="groupObjectClass" class="form-label">{{
"groupObjectClass" | i18n
}}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -736,10 +732,12 @@
name="GroupObjectClass" name="GroupObjectClass"
[(ngModel)]="sync.groupObjectClass" [(ngModel)]="sync.groupObjectClass"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} groupOfUniqueNames</small> <div class="form-text">{{ "ex" | i18n }} groupOfUniqueNames</div>
</div> </div>
<div class="form-group"> <div class="mb-3">
<label for="groupNameAttribute">{{ "groupNameAttribute" | i18n }}</label> <label for="groupNameAttribute" class="form-label">{{
"groupNameAttribute" | i18n
}}</label>
<input <input
type="text" type="text"
class="form-control" class="form-control"
@@ -747,7 +745,7 @@
name="GroupNameAttribute" name="GroupNameAttribute"
[(ngModel)]="sync.groupNameAttribute" [(ngModel)]="sync.groupNameAttribute"
/> />
<small class="text-muted form-text">{{ "ex" | i18n }} name</small> <div class="form-text">{{ "ex" | i18n }} name</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -138,6 +138,6 @@ ul.testing-list {
&:focus, &:focus,
&.focus { &.focus {
box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($primary), $primary, 15%), 0.5); box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-contrast($primary), $primary, 15%), 0.5);
} }
} }