mirror of
https://github.com/goharbor/harbor.git
synced 2025-03-28 06:15:56 +01:00
Merge changes of rel 1.1.0 back to master
This commit is contained in:
commit
0ae0c31168
src
ui/auth/ldap
ui_ng/src
@ -59,7 +59,8 @@ func (l *Auth) Authenticate(m models.AuthModel) (*models.User, error) {
|
||||
ldapUsers, err := ldapUtils.SearchUser(ldapConfs)
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ldap search fail: %v", err)
|
||||
log.Warningf("ldap search fail: %v", err)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if len(ldapUsers) == 0 {
|
||||
|
@ -61,7 +61,7 @@ export class RepositoryService {
|
||||
tags.forEach(t=>{
|
||||
for(let i = 0; i < signatures.length; i++) {
|
||||
if(signatures[i].tag === t.tag) {
|
||||
t.signed = true;
|
||||
t.signed = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -69,7 +69,7 @@ export class RepositoryService {
|
||||
return tags;
|
||||
})
|
||||
.catch(error=>{
|
||||
return tags;
|
||||
return Observable.of(tags);
|
||||
})
|
||||
})
|
||||
.catch(error=>Observable.throw(error));
|
||||
|
@ -25,22 +25,26 @@
|
||||
<clr-dg-column>{{'REPOSITORY.ARCHITECTURE' | translate}}</clr-dg-column>
|
||||
<clr-dg-column>{{'REPOSITORY.OS' | translate}}</clr-dg-column>
|
||||
<clr-dg-row *clrDgItems="let t of tags" [clrDgItem]='t'>
|
||||
<clr-dg-action-overflow>
|
||||
<button class="action-item" (click)="showTagID('tag', t)">{{'REPOSITORY.COPY_ID' | translate}}</button>
|
||||
<button class="action-item" (click)="showTagID('parent', t)">{{'REPOSITORY.COPY_PARENT_ID' | translate}}</button>
|
||||
<button class="action-item" [hidden]="!hasProjectAdminRole" (click)="deleteTag(t)">{{'REPOSITORY.DELETE' | translate}}</button>
|
||||
</clr-dg-action-overflow>
|
||||
<clr-dg-cell>{{t.tag}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.pullCommand}}</clr-dg-cell>
|
||||
<clr-dg-cell *ngIf="withNotary">
|
||||
<clr-icon shape="check" *ngIf="t.signed" style="color: #1D5100;"></clr-icon>
|
||||
<clr-icon shape="close" *ngIf="!t.signed" style="color: #C92100;"></clr-icon>
|
||||
</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.author}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.created | date: 'short'}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.dockerVersion}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.architecture}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.os}}</clr-dg-cell>
|
||||
<clr-dg-action-overflow>
|
||||
<button class="action-item" (click)="showTagID('tag', t)">{{'REPOSITORY.COPY_ID' | translate}}</button>
|
||||
<button class="action-item" (click)="showTagID('parent', t)">{{'REPOSITORY.COPY_PARENT_ID' | translate}}</button>
|
||||
<button class="action-item" [hidden]="!hasProjectAdminRole" (click)="deleteTag(t)">{{'REPOSITORY.DELETE' | translate}}</button>
|
||||
</clr-dg-action-overflow>
|
||||
<clr-dg-cell>{{t.tag}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.pullCommand}}</clr-dg-cell>
|
||||
<clr-dg-cell *ngIf="withNotary" [ngSwitch]="t.signed">
|
||||
<clr-icon shape="check" *ngSwitchCase="1" style="color: #1D5100;"></clr-icon>
|
||||
<clr-icon shape="close" *ngSwitchCase="0" style="color: #C92100;"></clr-icon>
|
||||
<a href="javascript:void(0)" *ngSwitchDefault role="tooltip" aria-haspopup="true" class="tooltip tooltip-top-right">
|
||||
<clr-icon shape="help" style="color: #565656;" size="16"></clr-icon>
|
||||
<span class="tooltip-content">{{'REPOSITORY.NOTARY_IS_UNDETERMINED' | translate}}</span>
|
||||
</a>
|
||||
</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.author}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.created | date: 'short'}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.dockerVersion}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.architecture}}</clr-dg-cell>
|
||||
<clr-dg-cell>{{t.os}}</clr-dg-cell>
|
||||
</clr-dg-row>
|
||||
<clr-dg-footer>{{tags ? tags.length : 0}} {{'REPOSITORY.ITEMS' | translate}}</clr-dg-footer>
|
||||
</clr-datagrid>
|
@ -69,7 +69,6 @@ export class TagRepositoryComponent implements OnInit, OnDestroy {
|
||||
private appConfigService: AppConfigService,
|
||||
private session: SessionService,
|
||||
private ref: ChangeDetectorRef){
|
||||
|
||||
this.subscription = this.deletionDialogService.confirmationConfirm$.subscribe(
|
||||
message => {
|
||||
if (message &&
|
||||
@ -118,19 +117,31 @@ export class TagRepositoryComponent implements OnInit, OnDestroy {
|
||||
|
||||
retrieve() {
|
||||
this.tags = [];
|
||||
this.repositoryService
|
||||
.listTags(this.repoName)
|
||||
.subscribe(
|
||||
items => this.listTags(items),
|
||||
error => this.messageHandlerService.handleError(error));
|
||||
|
||||
if(this.withNotary) {
|
||||
this.repositoryService
|
||||
.listTagsWithVerifiedSignatures(this.repoName)
|
||||
.listNotarySignatures(this.repoName)
|
||||
.subscribe(
|
||||
items => this.listTags(items),
|
||||
error => this.messageHandlerService.handleError(error));
|
||||
} else {
|
||||
this.repositoryService
|
||||
.listTags(this.repoName)
|
||||
.subscribe(
|
||||
items => this.listTags(items),
|
||||
error => this.messageHandlerService.handleError(error));
|
||||
}
|
||||
signatures => {
|
||||
this.tags.forEach((t, n)=>{
|
||||
let signed = false;
|
||||
for(let i = 0; i < signatures.length; i++) {
|
||||
if (signatures[i].tag === t.tag) {
|
||||
signed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.tags[n].signed = (signed) ? 1 : 0;
|
||||
this.ref.markForCheck();
|
||||
});
|
||||
},
|
||||
error => console.error('Cannot determine the signature of this tag.'));
|
||||
}
|
||||
}
|
||||
|
||||
listTags(tags: Tag[]): void {
|
||||
|
@ -14,7 +14,7 @@
|
||||
export class TagView {
|
||||
tag: string;
|
||||
pullCommand: string;
|
||||
signed: boolean;
|
||||
signed: number = -1;
|
||||
author: string;
|
||||
created: Date;
|
||||
dockerVersion: string;
|
||||
|
@ -36,5 +36,5 @@ export class Tag {
|
||||
}
|
||||
];
|
||||
};
|
||||
signed: boolean;
|
||||
signed: number;
|
||||
}
|
@ -68,12 +68,11 @@ export class SessionService {
|
||||
//Submit signin form to backend (NOT restful service)
|
||||
signIn(signInCredential: SignInCredential): Promise<any> {
|
||||
//Build the form package
|
||||
const body = new URLSearchParams();
|
||||
body.set('principal', signInCredential.principal);
|
||||
body.set('password', signInCredential.password);
|
||||
let queryParam:string = 'principal=' + encodeURIComponent(signInCredential.principal) +
|
||||
'&password=' + encodeURIComponent(signInCredential.password);
|
||||
|
||||
//Trigger Http
|
||||
return this.http.post(signInUrl, body.toString(), { headers: this.formHeaders })
|
||||
return this.http.post(signInUrl, queryParam, { headers: this.formHeaders })
|
||||
.toPromise()
|
||||
.then(() => null)
|
||||
.catch(error => this.handleError(error));
|
||||
|
@ -327,7 +327,8 @@
|
||||
"POP_REPOS": "Popular Repositories",
|
||||
"DELETED_REPO_SUCCESS": "Deleted repository successfully.",
|
||||
"DELETED_TAG_SUCCESS": "Deleted tag successfully.",
|
||||
"COPY": "Copy"
|
||||
"COPY": "Copy",
|
||||
"NOTARY_IS_UNDETERMINED": "Cannot determine the signature of this tag."
|
||||
},
|
||||
"ALERT": {
|
||||
"FORM_CHANGE_CONFIRMATION": "Some changes are not saved yet. Do you want to cancel?"
|
||||
|
@ -327,7 +327,8 @@
|
||||
"POP_REPOS": "受欢迎的镜像仓库",
|
||||
"DELETED_REPO_SUCCESS": "成功删除镜像仓库。",
|
||||
"DELETED_TAG_SUCCESS": "成功删除镜像标签。",
|
||||
"COPY": "复制"
|
||||
"COPY": "复制",
|
||||
"NOTARY_IS_UNDETERMINED": "无法确定镜像标签签名。"
|
||||
},
|
||||
"ALERT": {
|
||||
"FORM_CHANGE_CONFIRMATION": "表单内容改变,确认是否取消?"
|
||||
|
Loading…
Reference in New Issue
Block a user