mirror of https://github.com/goharbor/harbor.git
				
				
				
			Merge pull request #9413 from jwangyangls/reset-oidc-cli-secret
Add new cli secret ui in profile
This commit is contained in:
		
						commit
						12b8cfef61
					
				|  | @ -10,8 +10,8 @@ import { throwError as observableThrowError, Observable } from 'rxjs'; | ||||||
| export class AccountSettingsModalService { | export class AccountSettingsModalService { | ||||||
| 
 | 
 | ||||||
|   constructor(private http: HttpClient) { } |   constructor(private http: HttpClient) { } | ||||||
|   generateCli(userId): Observable<any> { |   saveNewCli(userId, secretObj): Observable<any> { | ||||||
|     return this.http.post(`/api/users/${userId}/gen_cli_secret`, {}).pipe( map(response => response) |     return this.http.put(`/api/users/${userId}/cli_secret`, secretObj).pipe( map(response => response) | ||||||
|     , catchError(error => observableThrowError(error))); |     , catchError(error => observableThrowError(error))); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,10 +4,11 @@ | ||||||
|         <inline-alert (confirmEvt)="confirmYes($event)" (closeEvt)="confirmNo($event)"></inline-alert> |         <inline-alert (confirmEvt)="confirmYes($event)" (closeEvt)="confirmNo($event)"></inline-alert> | ||||||
|         <form #accountSettingsFrom="ngForm" class="clr-form clr-form-horizontal"> |         <form #accountSettingsFrom="ngForm" class="clr-form clr-form-horizontal"> | ||||||
|             <div class="clr-form-control"> |             <div class="clr-form-control"> | ||||||
|                 <label for="account_settings_username" aria-haspopup="true" class="clr-control-label">{{'PROFILE.USER_NAME' | translate}}</label> |                 <label for="account_settings_username" aria-haspopup="true" | ||||||
|  |                     class="clr-control-label">{{'PROFILE.USER_NAME' | translate}}</label> | ||||||
|                 <div class="clr-control-container display-flex"> |                 <div class="clr-control-container display-flex"> | ||||||
|                     <input class="clr-input" type="text" name="account_settings_username" [(ngModel)]="account.username" disabled id="account_settings_username" |                     <input class="clr-input" type="text" name="account_settings_username" [(ngModel)]="account.username" | ||||||
|                         size="30"> |                         disabled id="account_settings_username" size="30"> | ||||||
|                     <div *ngIf="canRename" class="rename-tool"> |                     <div *ngIf="canRename" class="rename-tool"> | ||||||
|                         <button [disabled]="RenameOnGoing" (click)="onRename()" class="btn btn-outline btn-sm"> |                         <button [disabled]="RenameOnGoing" (click)="onRename()" class="btn btn-outline btn-sm"> | ||||||
|                             {{'PROFILE.ADMIN_RENAME_BUTTON' | translate}} |                             {{'PROFILE.ADMIN_RENAME_BUTTON' | translate}} | ||||||
|  | @ -22,11 +23,13 @@ | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|             <div class="clr-form-control"> |             <div class="clr-form-control"> | ||||||
|                 <label for="account_settings_email" class="required clr-control-label">{{'PROFILE.EMAIL' | translate}}</label> |                 <label for="account_settings_email" | ||||||
|  |                     class="required clr-control-label">{{'PROFILE.EMAIL' | translate}}</label> | ||||||
|                 <div class="clr-control-container" [class.clr-error]="!getValidationState('account_settings_email')"> |                 <div class="clr-control-container" [class.clr-error]="!getValidationState('account_settings_email')"> | ||||||
|                     <div class="clr-input-wrapper"> |                     <div class="clr-input-wrapper"> | ||||||
|                         <input name="account_settings_email" type="text" #eamilInput="ngModel" class="clr-input" [(ngModel)]="account.email" required |                         <input name="account_settings_email" type="text" #eamilInput="ngModel" class="clr-input" | ||||||
|                             email id="account_settings_email" size="30" (input)='handleValidation("account_settings_email", false)' |                             [(ngModel)]="account.email" required email id="account_settings_email" size="30" | ||||||
|  |                             (input)='handleValidation("account_settings_email", false)' | ||||||
|                             (blur)='handleValidation("account_settings_email", true)'> |                             (blur)='handleValidation("account_settings_email", true)'> | ||||||
|                         <clr-icon class="clr-validate-icon" shape="exclamation-circle"></clr-icon> |                         <clr-icon class="clr-validate-icon" shape="exclamation-circle"></clr-icon> | ||||||
|                         <span class="spinner spinner-inline" [hidden]="!checkProgress"></span> |                         <span class="spinner spinner-inline" [hidden]="!checkProgress"></span> | ||||||
|  | @ -38,8 +41,10 @@ | ||||||
|             </div> |             </div> | ||||||
|             <clr-input-container> |             <clr-input-container> | ||||||
|                 <label [class.required]="!account.oidc_user_meta">{{'PROFILE.FULL_NAME' | translate}}</label> |                 <label [class.required]="!account.oidc_user_meta">{{'PROFILE.FULL_NAME' | translate}}</label> | ||||||
|                 <input clrInput type="text" name="account_settings_full_name" #fullNameInput="ngModel" [(ngModel)]="account.realname" [required]="!account.oidc_user_meta" |                 <input clrInput type="text" name="account_settings_full_name" #fullNameInput="ngModel" | ||||||
|                     maxLengthExt="20" id="account_settings_full_name" size="30" (input)='handleValidation("account_settings_full_name", false)' |                     [(ngModel)]="account.realname" [required]="!account.oidc_user_meta" maxLengthExt="20" | ||||||
|  |                     id="account_settings_full_name" size="30" | ||||||
|  |                     (input)='handleValidation("account_settings_full_name", false)' | ||||||
|                     (blur)='handleValidation("account_settings_full_name", true)'> |                     (blur)='handleValidation("account_settings_full_name", true)'> | ||||||
|                 <clr-control-error *ngIf="!getValidationState('account_settings_full_name')"> |                 <clr-control-error *ngIf="!getValidationState('account_settings_full_name')"> | ||||||
|                     {{'TOOLTIP.FULL_NAME' | translate}} |                     {{'TOOLTIP.FULL_NAME' | translate}} | ||||||
|  | @ -47,14 +52,14 @@ | ||||||
|             </clr-input-container> |             </clr-input-container> | ||||||
|             <clr-input-container> |             <clr-input-container> | ||||||
|                 <label>{{'PROFILE.COMMENT' | translate}}</label> |                 <label>{{'PROFILE.COMMENT' | translate}}</label> | ||||||
|                 <input clrInput type="text" #commentInput="ngModel" maxlength="30" size="30" name="account_settings_comments" [(ngModel)]="account.comment" |                 <input clrInput type="text" #commentInput="ngModel" maxlength="30" size="30" | ||||||
|                     id="account_settings_comments"> |                     name="account_settings_comments" [(ngModel)]="account.comment" id="account_settings_comments"> | ||||||
|                 <clr-control-error *ngIf="commentInput.invalid && (commentInput.dirty || commentInput.touched)"> |                 <clr-control-error *ngIf="commentInput.invalid && (commentInput.dirty || commentInput.touched)"> | ||||||
|                     {{'TOOLTIP.COMMENT' | translate}} |                     {{'TOOLTIP.COMMENT' | translate}} | ||||||
|                 </clr-control-error> |                 </clr-control-error> | ||||||
|             </clr-input-container> |             </clr-input-container> | ||||||
| 
 | 
 | ||||||
|             <div class="clr-form-control cli-secret" *ngIf="account.oidc_user_meta"> |                 <div class="clr-form-control cli-secret" *ngIf="account.oidc_user_meta"> | ||||||
|                 <label class="clr-control-label">{{'PROFILE.CLI_PASSWORD' | translate}} |                 <label class="clr-control-label">{{'PROFILE.CLI_PASSWORD' | translate}} | ||||||
|                     <clr-tooltip> |                     <clr-tooltip> | ||||||
|                         <clr-icon clrTooltipTrigger shape="info-circle" size="20"></clr-icon> |                         <clr-icon clrTooltipTrigger shape="info-circle" size="20"></clr-icon> | ||||||
|  | @ -63,21 +68,59 @@ | ||||||
|                         </clr-tooltip-content> |                         </clr-tooltip-content> | ||||||
|                     </clr-tooltip> |                     </clr-tooltip> | ||||||
|                 </label> |                 </label> | ||||||
|                 <input class="clr-input" type="password" name="cli_password" disabled [ngModel]="'account.oidc_user_meta.secret'" size="33"> |                 <input class="clr-input input-cli" type="password" name="cli_password" disabled | ||||||
|                 <button (click)="generateCli(account.user_id)" id="generate-cli-btn" class="btn btn-outline btn-sm btn-padding-less" *ngIf="showGenerateCli"> |                     [ngModel]="'account.oidc_user_meta.secret'" size="33"> | ||||||
|  | 
 | ||||||
|  |                 <button (click)="generateCli(account.user_id)" id="generate-cli-btn" | ||||||
|  |                     class="btn btn-outline btn-sm btn-padding-less" *ngIf="showGenerateCli"> | ||||||
|                     {{'PROFILE.ADMIN_CIL_SECRET_BUTTON' | translate}} |                     {{'PROFILE.ADMIN_CIL_SECRET_BUTTON' | translate}} | ||||||
|                 </button> |                 </button> | ||||||
|  |                 <button (click)="showSecretDetail=true" id="reset-cli-btn" class="btn btn-outline btn-sm btn-padding-less" | ||||||
|  |                     *ngIf="showGenerateCli"> | ||||||
|  |                     {{'PROFILE.ADMIN_CIL_SECRET_RESET_BUTTON' | translate}} | ||||||
|  |                 </button> | ||||||
|                 <div class="rename-tool reset-cli"> |                 <div class="rename-tool reset-cli"> | ||||||
|                     <hbr-copy-input #copyInput (onCopySuccess)="onSuccess($event)" (onCopyError)="onError($event)" iconMode="true" [defaultValue]="account.oidc_user_meta.secret"></hbr-copy-input> |                     <hbr-copy-input #copyInput (onCopySuccess)="onSuccess($event)" (onCopyError)="onError($event)" | ||||||
|  |                         iconMode="true" [defaultValue]="account.oidc_user_meta.secret"></hbr-copy-input> | ||||||
|                 </div> |                 </div> | ||||||
|                 <div (click)="showGenerateCliFn()" *ngIf="!showGenerateCli" id="hidden-generate-cli" class="hidden-generate-cli">···</div> |                 <div (click)="showGenerateCliFn()" *ngIf="!showGenerateCli" id="hidden-generate-cli" | ||||||
|  |                     class="hidden-generate-cli">···</div> | ||||||
|  |                      | ||||||
|             </div> |             </div> | ||||||
|         </form> |         </form> | ||||||
|     </div> |     </div> | ||||||
|     <div class="modal-footer"> |     <div class="modal-footer"> | ||||||
|         <span class="spinner spinner-inline loading-top" [hidden]="showProgress === false"></span> |         <span class="spinner spinner-inline loading-top" [hidden]="showProgress === false"></span> | ||||||
|         <button type="button" class="btn btn-outline" (click)="close()">{{'BUTTON.CANCEL' | translate}}</button> |         <button type="button" class="btn btn-outline" (click)="close()">{{'BUTTON.CANCEL' | translate}}</button> | ||||||
|         <button type="button" class="btn btn-primary" [disabled]="!isValid || showProgress" (click)="submit()">{{'BUTTON.OK' | translate}}</button> | 
 | ||||||
|  |         <button type="button" class="btn btn-primary" [disabled]="!isValid || showProgress" | ||||||
|  |             (click)="submit()">{{'BUTTON.OK' | translate}}</button> | ||||||
|  |     </div> | ||||||
|  | </clr-modal> | ||||||
|  | <clr-modal [(clrModalOpen)]="showSecretDetail" [clrModalSize]="'sm'" [clrModalStaticBackdrop]="staticBackdrop" | ||||||
|  | [clrModalClosable]="false"> | ||||||
|  | 
 | ||||||
|  |     <h3 class="modal-title">{{'PROFILE.ADMIN_CIL_SECRET_RESET_BUTTON' | translate}}</h3> | ||||||
|  |     <div class="modal-body"> | ||||||
|  |         <form #resetSecretFrom="ngForm" class="clr-form reset-cli-form clr-form-horizontal"> | ||||||
|  |             <clr-input-container> | ||||||
|  |                 <label>{{'PROFILE.NEW_SECRET' | translate}}</label> | ||||||
|  |                 <input clrInput type="password" maxlength="30" size="30" required pattern="^(?=.*\d)(?=.*[a-zA-Z]).{8,}$" | ||||||
|  |                     name="input_secret" [(ngModel)]="resetForms.input_secret" id="input-secret"> | ||||||
|  |                 <clr-control-error> | ||||||
|  |                     {{'TOOLTIP.NEW_SECRET' | translate}} | ||||||
|  |                 </clr-control-error> | ||||||
|  |             </clr-input-container> | ||||||
|  |             <clr-input-container> | ||||||
|  |                 <label>{{'PROFILE.CONFIRM_SECRET' | translate}}</label> | ||||||
|  |                 <input clrInput type="password" maxlength="30" size="30" | ||||||
|  |                     [(ngModel)]="resetForms.confirm_secret" name="confirm_secret" id="confirm-secret"> | ||||||
|  |             </clr-input-container> | ||||||
|  |         </form> | ||||||
|  |     </div> | ||||||
|  |     <div class="modal-footer"> | ||||||
|  |         <button type="button" class="btn btn-outline" (click)="closeReset()">{{'BUTTON.CANCEL' | translate}}</button> | ||||||
|  |         <button type="button" class="btn btn-primary" [disabled]="disableChangeCliSecret()" (click)="resetCliSecret(resetSecretFrom.value.input_secret)">{{'BUTTON.CONFIRM' | translate}}</button> | ||||||
|     </div> |     </div> | ||||||
| </clr-modal> | </clr-modal> | ||||||
| <confirmation-dialog #confirmationDialog (confirmAction)="confirmGenerate($event)"></confirmation-dialog> | <confirmation-dialog #confirmationDialog (confirmAction)="confirmGenerate($event)"></confirmation-dialog> | ||||||
|  | @ -5,6 +5,7 @@ clr-modal { | ||||||
|     .rename-tool { |     .rename-tool { | ||||||
|         .btn { |         .btn { | ||||||
|             margin-right: 6px; |             margin-right: 6px; | ||||||
|  |             margin-left: 5px; | ||||||
|             padding-left: 3px; |             padding-left: 3px; | ||||||
|             padding-right: 3px; |             padding-right: 3px; | ||||||
|         } |         } | ||||||
|  | @ -18,10 +19,15 @@ clr-modal { | ||||||
|         align-items: center; |         align-items: center; | ||||||
|         .reset-cli { |         .reset-cli { | ||||||
|             height: 30px; |             height: 30px; | ||||||
|  |             padding-top: 8px; | ||||||
|         } |         } | ||||||
|         .btn-padding-less { |         .btn-padding-less { | ||||||
|             padding-left: 5px; |             padding-left: 5px; | ||||||
|             padding-right: 5px; |             padding-right: 5px; | ||||||
|  |             margin-left: 5px; | ||||||
|  |         } | ||||||
|  |         .input-cli { | ||||||
|  |             width: 9.5rem; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     .hidden-generate-cli { |     .hidden-generate-cli { | ||||||
|  | @ -32,7 +38,12 @@ clr-modal { | ||||||
|         line-height: 30px; |         line-height: 30px; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | .reset-cli-form { | ||||||
|  |     width: 19.5rem; | ||||||
|  | } | ||||||
| .display-flex { | .display-flex { | ||||||
|     display: flex; |     display: flex; | ||||||
|  | } | ||||||
|  | .set-btns { | ||||||
|  |     display: flex; | ||||||
| } | } | ||||||
|  | @ -29,6 +29,8 @@ import { | ||||||
|   ConfirmationTargets, |   ConfirmationTargets, | ||||||
|   ConfirmationButtons |   ConfirmationButtons | ||||||
| } from "../../shared/shared.const"; | } from "../../shared/shared.const"; | ||||||
|  | import { randomWord } from '../../shared/shared.utils'; | ||||||
|  | import { ResetSecret } from './account'; | ||||||
| @Component({ | @Component({ | ||||||
|   selector: "account-settings-modal", |   selector: "account-settings-modal", | ||||||
|   templateUrl: "account-settings-modal.component.html", |   templateUrl: "account-settings-modal.component.html", | ||||||
|  | @ -49,13 +51,15 @@ export class AccountSettingsModalComponent implements OnInit, AfterViewChecked { | ||||||
|   originAdminName = "admin"; |   originAdminName = "admin"; | ||||||
|   newAdminName = "admin@harbor.local"; |   newAdminName = "admin@harbor.local"; | ||||||
|   renameConfirmation = false; |   renameConfirmation = false; | ||||||
| //   confirmRename = false;
 |   showSecretDetail = false; | ||||||
|  |   resetForms = new ResetSecret(); | ||||||
|   showGenerateCli: boolean = false; |   showGenerateCli: boolean = false; | ||||||
|   @ViewChild("confirmationDialog", {static: false}) |   @ViewChild("confirmationDialog", {static: false}) | ||||||
|   confirmationDialogComponent: ConfirmationDialogComponent; |   confirmationDialogComponent: ConfirmationDialogComponent; | ||||||
| 
 | 
 | ||||||
|   accountFormRef: NgForm; |   accountFormRef: NgForm; | ||||||
|   @ViewChild("accountSettingsFrom", {static: true}) accountForm: NgForm; |   @ViewChild("accountSettingsFrom", {static: true}) accountForm: NgForm; | ||||||
|  |   @ViewChild("resetSecretFrom", {static: true}) resetSecretFrom: NgForm; | ||||||
|   @ViewChild(InlineAlertComponent, {static: false}) inlineAlert: InlineAlertComponent; |   @ViewChild(InlineAlertComponent, {static: false}) inlineAlert: InlineAlertComponent; | ||||||
|   @ViewChild("copyInput", {static: false}) copyInput: CopyInputComponent; |   @ViewChild("copyInput", {static: false}) copyInput: CopyInputComponent; | ||||||
| 
 | 
 | ||||||
|  | @ -350,13 +354,26 @@ export class AccountSettingsModalComponent implements OnInit, AfterViewChecked { | ||||||
|   showGenerateCliFn() { |   showGenerateCliFn() { | ||||||
|     this.showGenerateCli = !this.showGenerateCli; |     this.showGenerateCli = !this.showGenerateCli; | ||||||
|   } |   } | ||||||
|   confirmGenerate(confirmData): void { |   confirmGenerate(event): void { | ||||||
|     let userId = confirmData.data; |     this.account.oidc_user_meta.secret = randomWord(9); | ||||||
|     this.accountSettingsService.generateCli(userId).subscribe(cliSecret => { |     this.resetCliSecret(this.account.oidc_user_meta.secret); | ||||||
|       this.account.oidc_user_meta.secret = cliSecret.secret; |   } | ||||||
|  | 
 | ||||||
|  |   resetCliSecret(secret) { | ||||||
|  |     let userId = this.account.user_id; | ||||||
|  |     this.accountSettingsService.saveNewCli(userId, {secret: secret}).subscribe(cliSecret => { | ||||||
|  |       this.account.oidc_user_meta.secret = secret; | ||||||
|  |       this.closeReset(); | ||||||
|       this.inlineAlert.showInlineSuccess({message: 'PROFILE.GENERATE_SUCCESS'}); |       this.inlineAlert.showInlineSuccess({message: 'PROFILE.GENERATE_SUCCESS'}); | ||||||
|     }, error => { |     }, error => { | ||||||
|       this.inlineAlert.showInlineError({message: 'PROFILE.GENERATE_ERROR'}); |       this.inlineAlert.showInlineError({message: 'PROFILE.GENERATE_ERROR'}); | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |   disableChangeCliSecret() { | ||||||
|  |     return this.resetSecretFrom.invalid || (this.resetSecretFrom.value.input_secret !== this.resetSecretFrom.value.confirm_secret); | ||||||
|  |   } | ||||||
|  |   closeReset() { | ||||||
|  |     this.showSecretDetail = false; | ||||||
|  |     this.resetSecretFrom.resetForm(new ResetSecret()); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | export class ResetSecret { | ||||||
|  |     input_secret: string; | ||||||
|  |     confirm_secret: string; | ||||||
|  |     constructor() { | ||||||
|  |         this.confirm_secret = ""; | ||||||
|  |         this.input_secret = ""; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -75,4 +75,39 @@ export const maintainUrlQueryParmas = function (uri: string, key: string, value: | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  | /** | ||||||
|  |   * the password or secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number | ||||||
|  |   * @param randomFlag | ||||||
|  |   * @param min | ||||||
|  |   * @param max | ||||||
|  |   * @returns {string} | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  |  export function randomWord(max) { | ||||||
|  |     let str = ""; | ||||||
|  | 
 | ||||||
|  |      let contentArray = [['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], | ||||||
|  |     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l' | ||||||
|  |     , 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x' | ||||||
|  |     , 'y', 'z'], | ||||||
|  |     ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' | ||||||
|  |     , 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']]; | ||||||
|  |     for (let i = 0; i < max; i++) { | ||||||
|  |         let randomNumber = getRandomInt(contentArray.length); | ||||||
|  |         str += contentArray[randomNumber][getRandomInt(contentArray[randomNumber].length)]; | ||||||
|  |     } | ||||||
|  |     if (!str.match(/\d+/g)) { | ||||||
|  |         str += contentArray[0][getRandomInt(contentArray[0].length)]; | ||||||
|  |     } | ||||||
|  |     if (!str.match(/[a-z]+/g)) { | ||||||
|  |         str += contentArray[1][getRandomInt(contentArray[1].length)]; | ||||||
|  |     } | ||||||
|  |     if (!str.match(/[A-Z]+/g)) { | ||||||
|  |         str += contentArray[1][getRandomInt(contentArray[1].length)]; | ||||||
|  |     } | ||||||
|  |     return str; | ||||||
|  |   } | ||||||
|  |   function getRandomInt(max) { | ||||||
|  |     return Math.floor(Math.random() * Math.floor(max)); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -99,7 +99,8 @@ | ||||||
|         "OIDC_SCOPE": "The scope sent to OIDC server during authentication.  It has to contain “openid”, and “offline_access”.  If you are using google, please remove “offline_access” from this field.", |         "OIDC_SCOPE": "The scope sent to OIDC server during authentication.  It has to contain “openid”, and “offline_access”.  If you are using google, please remove “offline_access” from this field.", | ||||||
|         "OIDC_VERIFYCERT": "Uncheck this box if your OIDC server is hosted via self-signed certificate.", |         "OIDC_VERIFYCERT": "Uncheck this box if your OIDC server is hosted via self-signed certificate.", | ||||||
|         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", |         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", | ||||||
|         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters." |         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters.", | ||||||
|  |         "NEW_SECRET": "The secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number" | ||||||
|     }, |     }, | ||||||
|     "PLACEHOLDER": { |     "PLACEHOLDER": { | ||||||
|         "CURRENT_PWD": "Enter current password", |         "CURRENT_PWD": "Enter current password", | ||||||
|  | @ -128,8 +129,11 @@ | ||||||
|         "COPY_SUCCESS": "copy success", |         "COPY_SUCCESS": "copy success", | ||||||
|         "COPY_ERROR": "copy failed", |         "COPY_ERROR": "copy failed", | ||||||
|         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", |         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", | ||||||
|         "GENERATE_SUCCESS": "generate CLI secret success", |         "ADMIN_CIL_SECRET_RESET_BUTTON": "Upload Your Own Secret", | ||||||
|         "GENERATE_ERROR": "generate CLI secret failed", |         "NEW_SECRET": "Secret", | ||||||
|  |         "CONFIRM_SECRET": "Re-enter Secret", | ||||||
|  |         "GENERATE_SUCCESS": "Cli secret setting is successful", | ||||||
|  |         "GENERATE_ERROR": "Cli secret setting is failed", | ||||||
|         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", |         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", | ||||||
|         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" |         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -99,7 +99,8 @@ | ||||||
|         "OIDC_SCOPE": "El ámbito de aplicación enviada a OIDC Server durante la autenticación.Tiene que contener 'Openid', y 'offline_access'.Si usted esta usando Google, por favor quitar 'offline_access' de este campo", |         "OIDC_SCOPE": "El ámbito de aplicación enviada a OIDC Server durante la autenticación.Tiene que contener 'Openid', y 'offline_access'.Si usted esta usando Google, por favor quitar 'offline_access' de este campo", | ||||||
|         "OIDC_VERIFYCERT": "Desmarque esta casilla si tu OIDC servidor está alojado a través de certificado autofirmado.", |         "OIDC_VERIFYCERT": "Desmarque esta casilla si tu OIDC servidor está alojado a través de certificado autofirmado.", | ||||||
|         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", |         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", | ||||||
|         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters." |         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters.", | ||||||
|  |         "NEW_SECRET": "The secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number." | ||||||
|     }, |     }, | ||||||
|     "PLACEHOLDER": { |     "PLACEHOLDER": { | ||||||
|         "CURRENT_PWD": "Introduzca la contraseña actual", |         "CURRENT_PWD": "Introduzca la contraseña actual", | ||||||
|  | @ -128,8 +129,11 @@ | ||||||
|         "COPY_SUCCESS": "Copiar el éxito", |         "COPY_SUCCESS": "Copiar el éxito", | ||||||
|         "COPY_ERROR": "Copia no", |         "COPY_ERROR": "Copia no", | ||||||
|         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", |         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", | ||||||
|         "GENERATE_SUCCESS": "generate CLI secret success", |         "ADMIN_CIL_SECRET_RESET_BUTTON": "Upload Your Own Secret", | ||||||
|         "GENERATE_ERROR": "generate CLI secret failed", |         "NEW_SECRET": "Secret", | ||||||
|  |         "CONFIRM_SECRET": "Re-enter Secret", | ||||||
|  |         "GENERATE_SUCCESS": "Cli secret setting is successful", | ||||||
|  |         "GENERATE_ERROR": "Cli secret setting is failed", | ||||||
|         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", |         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", | ||||||
|         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" |         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -94,7 +94,8 @@ | ||||||
|         "OIDC_SCOPE": "le champ envoyés au serveur au cours oidc l'authentification.il doit contenir 'openid', et 'offline_access'.si vous utilisez google, veuillez supprimer 'offline_access' dans ce domaine", |         "OIDC_SCOPE": "le champ envoyés au serveur au cours oidc l'authentification.il doit contenir 'openid', et 'offline_access'.si vous utilisez google, veuillez supprimer 'offline_access' dans ce domaine", | ||||||
|         "OIDC_VERIFYCERT": "décocher cette case si votre oidc serveur est accueilli par auto - certificat signé.", |         "OIDC_VERIFYCERT": "décocher cette case si votre oidc serveur est accueilli par auto - certificat signé.", | ||||||
|         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", |         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", | ||||||
|         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters." |         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters.", | ||||||
|  |         "NEW_SECRET": "The secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number." | ||||||
|     }, |     }, | ||||||
|     "PLACEHOLDER": { |     "PLACEHOLDER": { | ||||||
|         "CURRENT_PWD": "Entrez le mot de passe actuel", |         "CURRENT_PWD": "Entrez le mot de passe actuel", | ||||||
|  | @ -123,8 +124,11 @@ | ||||||
|         "COPY_SUCCESS": "copie de succès", |         "COPY_SUCCESS": "copie de succès", | ||||||
|         "COPY_ERROR": "copie a échoué", |         "COPY_ERROR": "copie a échoué", | ||||||
|         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", |         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", | ||||||
|         "GENERATE_SUCCESS": "generate CLI secret success", |         "ADMIN_CIL_SECRET_RESET_BUTTON": "Upload Your Own Secret", | ||||||
|         "GENERATE_ERROR": "generate CLI secret failed", |         "NEW_SECRET": "Secret", | ||||||
|  |         "CONFIRM_SECRET": "Re-enter Secret", | ||||||
|  |         "GENERATE_SUCCESS": "Cli secret setting is successful", | ||||||
|  |         "GENERATE_ERROR": "Cli secret setting is failed", | ||||||
|         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", |         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", | ||||||
|         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" |         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -97,7 +97,8 @@ | ||||||
|         "OIDC_SCOPE": "O âmbito de aplicação enviada Ao servidor oidc Durante a autenticação.TEM que conter 'openid' e 'offline_access'.Se você está usando o Google, por favor remova 'offline_access' desse Campo.", |         "OIDC_SCOPE": "O âmbito de aplicação enviada Ao servidor oidc Durante a autenticação.TEM que conter 'openid' e 'offline_access'.Se você está usando o Google, por favor remova 'offline_access' desse Campo.", | ||||||
|         "OIDC_VERIFYCERT": "Desmarque esta opção se o SEU servidor está hospedado oidc via self - signed certificate.", |         "OIDC_VERIFYCERT": "Desmarque esta opção se o SEU servidor está hospedado oidc via self - signed certificate.", | ||||||
|         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", |         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", | ||||||
|         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters." |         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters.", | ||||||
|  |         "NEW_SECRET": "The secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number." | ||||||
|     }, |     }, | ||||||
|     "PLACEHOLDER": { |     "PLACEHOLDER": { | ||||||
|         "CURRENT_PWD": "Insira a senha atual", |         "CURRENT_PWD": "Insira a senha atual", | ||||||
|  | @ -126,8 +127,11 @@ | ||||||
|         "COPY_SUCCESS": "SUCESSO de cópia", |         "COPY_SUCCESS": "SUCESSO de cópia", | ||||||
|         "COPY_ERROR": "Cópia falhou", |         "COPY_ERROR": "Cópia falhou", | ||||||
|         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", |         "ADMIN_CIL_SECRET_BUTTON": "GENERATE SECRET", | ||||||
|         "GENERATE_SUCCESS": "generate CLI secret success", |         "ADMIN_CIL_SECRET_RESET_BUTTON": "Upload Your Own Secret", | ||||||
|         "GENERATE_ERROR": "generate CLI secret failed", |         "NEW_SECRET": "Secret", | ||||||
|  |         "CONFIRM_SECRET": "Re-enter Secret", | ||||||
|  |         "GENERATE_SUCCESS": "Cli secret setting is successful", | ||||||
|  |         "GENERATE_ERROR": "Cli secret setting is failed", | ||||||
|         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", |         "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", | ||||||
|         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" |         "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -99,7 +99,8 @@ | ||||||
|         "OIDC_SCOPE": "Kapsam, kimlik doğrulama sırasında OIDC sunucusuna gönderildi. “Openid” ve “offline_access” içermelidir. Google kullanıyorsanız, lütfen “offline_access“'i bu alandan kaldırın.", |         "OIDC_SCOPE": "Kapsam, kimlik doğrulama sırasında OIDC sunucusuna gönderildi. “Openid” ve “offline_access” içermelidir. Google kullanıyorsanız, lütfen “offline_access“'i bu alandan kaldırın.", | ||||||
|         "OIDC_VERIFYCERT": "OIDC sunucunuz kendinden imzalı sertifika ile barındırılıyorsa bu kutunun işaretini kaldırın.", |         "OIDC_VERIFYCERT": "OIDC sunucunuz kendinden imzalı sertifika ile barındırılıyorsa bu kutunun işaretini kaldırın.", | ||||||
|         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", |         "OIDC_GROUP_CLAIM": "The name of Claim in the ID token whose value is the list of group names.", | ||||||
|         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters." |         "OIDC_GROUP_CLAIM_WARNING": "It can only contain letters, numbers, underscores, and the input length is no more than 256 characters.", | ||||||
|  |         "NEW_SECRET": "The secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number." | ||||||
|     }, |     }, | ||||||
|     "PLACEHOLDER": { |     "PLACEHOLDER": { | ||||||
|         "CURRENT_PWD": "Güncel şifrenizi giriniz", |         "CURRENT_PWD": "Güncel şifrenizi giriniz", | ||||||
|  | @ -128,8 +129,11 @@ | ||||||
|         "COPY_SUCCESS": "kopyalama başarılı", |         "COPY_SUCCESS": "kopyalama başarılı", | ||||||
|         "COPY_ERROR": "kopyalama başarısız", |         "COPY_ERROR": "kopyalama başarısız", | ||||||
|         "ADMIN_CIL_SECRET_BUTTON": "ŞİFRE OLUŞTUR", |         "ADMIN_CIL_SECRET_BUTTON": "ŞİFRE OLUŞTUR", | ||||||
|         "GENERATE_SUCCESS": "CLI şifresi oluşturma başarılı", |         "ADMIN_CIL_SECRET_RESET_BUTTON": "Upload Your Own Secret", | ||||||
|         "GENERATE_ERROR": "CLI şifresi oluşturma başarısız", |         "NEW_SECRET": "Secret", | ||||||
|  |         "CONFIRM_SECRET": "Re-enter Secret", | ||||||
|  |         "GENERATE_SUCCESS": "Cli secret setting is successful", | ||||||
|  |         "GENERATE_ERROR": "Cli secret setting is failed", | ||||||
|         "CONFIRM_TITLE_CLI_GENERATE": "Şifreyi yeniden oluşturabileceğine emin misin?", |         "CONFIRM_TITLE_CLI_GENERATE": "Şifreyi yeniden oluşturabileceğine emin misin?", | ||||||
|         "CONFIRM_BODY_CLI_GENERATE": "Eğer cli şifresini yeniden oluşturursanız, eski cli şifresi atılır" |         "CONFIRM_BODY_CLI_GENERATE": "Eğer cli şifresini yeniden oluşturursanız, eski cli şifresi atılır" | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -98,7 +98,8 @@ | ||||||
|         "OIDC_SCOPE": "在身份验证期间发送到OIDC服务器的scope。它必须包含“openid”和“offline_access”。如果您使用Google,请从此字段中删除“脱机访问”。", |         "OIDC_SCOPE": "在身份验证期间发送到OIDC服务器的scope。它必须包含“openid”和“offline_access”。如果您使用Google,请从此字段中删除“脱机访问”。", | ||||||
|         "OIDC_VERIFYCERT": "如果您的OIDC服务器是通过自签名证书托管的,请取消选中此框。", |         "OIDC_VERIFYCERT": "如果您的OIDC服务器是通过自签名证书托管的,请取消选中此框。", | ||||||
|         "OIDC_GROUP_CLAIM": "ID和token中的Claim名称,在组的名称列表中。", |         "OIDC_GROUP_CLAIM": "ID和token中的Claim名称,在组的名称列表中。", | ||||||
|         "OIDC_GROUP_CLAIM_WARNING": "它只能包含字母、数字、下划线,且输入长度不超过256字符。" |         "OIDC_GROUP_CLAIM_WARNING": "它只能包含字母、数字、下划线,且输入长度不超过256字符。", | ||||||
|  |         "NEW_SECRET": "Cli secret 必须超过8个字符,并至少包含1个大写字母,1个小写字母和1个数字。" | ||||||
|     }, |     }, | ||||||
|     "PLACEHOLDER": { |     "PLACEHOLDER": { | ||||||
|         "CURRENT_PWD": "输入当前密码", |         "CURRENT_PWD": "输入当前密码", | ||||||
|  | @ -127,8 +128,11 @@ | ||||||
|         "COPY_SUCCESS": "复制成功", |         "COPY_SUCCESS": "复制成功", | ||||||
|         "COPY_ERROR": "复制失败", |         "COPY_ERROR": "复制失败", | ||||||
|         "ADMIN_CIL_SECRET_BUTTON": "生成新的CLI密码", |         "ADMIN_CIL_SECRET_BUTTON": "生成新的CLI密码", | ||||||
|         "GENERATE_SUCCESS": "成功生成新的CLI密码", |         "ADMIN_CIL_SECRET_RESET_BUTTON": "输入你自己的CLI密码", | ||||||
|         "GENERATE_ERROR": "生成新的CLI密码失败", |         "NEW_SECRET": "密码", | ||||||
|  |         "CONFIRM_SECRET": "重复出入密码", | ||||||
|  |         "GENERATE_SUCCESS": "成功设置新的CLI密码", | ||||||
|  |         "GENERATE_ERROR": "设置新的CLI密码失败", | ||||||
|         "CONFIRM_TITLE_CLI_GENERATE": "您确定需要重新生成cli secret吗?", |         "CONFIRM_TITLE_CLI_GENERATE": "您确定需要重新生成cli secret吗?", | ||||||
|         "CONFIRM_BODY_CLI_GENERATE": "如果您重新生成cli secret,那么旧的cli secret将会被弃用" |         "CONFIRM_BODY_CLI_GENERATE": "如果您重新生成cli secret,那么旧的cli secret将会被弃用" | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue