Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/SHIBUI-906' into SHIBUI-906
Browse files Browse the repository at this point in the history
  • Loading branch information
Bill Smith committed Nov 8, 2018
2 parents 313d859 + 96c53cc commit c2f3a50
Show file tree
Hide file tree
Showing 18 changed files with 146 additions and 75 deletions.
2 changes: 2 additions & 0 deletions backend/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ spring.jpa.properties.hibernate.format_sql=false

spring.jpa.hibernate.use-new-id-generator-mappings=true

# Set the following property to periodically write out the generated metadata files. There is no default value; the following is just an example
# shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated
shibui.logout-url=/dashboard

Expand All @@ -59,5 +60,6 @@ shibui.entity-attributes-filters-ui-schema-location=classpath:entity-attributes-
###
# metadata-providers.xml write configuration

# Set the following property to periodically write out metadata providers configuration. There is no default value; the following is just an example
# shibui.metadataProviders.target=file:/opt/shibboleth-idp/conf/shibui-metadata-providers.xml
# shibui.metadataProviders.taskRunRate=30000
1 change: 1 addition & 0 deletions backend/src/main/resources/i18n/messages_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ label.entity-id=Entity ID
label.service-provider-name=Service Provider Name
label.organization=Organization
label.contacts=Contacts
label.contact=Contact
label.mdui=MDUI Information
label.service-provider-sso-descriptor=Service Provider Sso Descriptor
label.service-enabled=Service Enabled
Expand Down
1 change: 1 addition & 0 deletions backend/src/main/resources/metadata-sources-ui-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@
},
"definitions": {
"Contact": {
"title": "label.contact",
"type": "object",
"required": [
"name",
Expand Down
72 changes: 72 additions & 0 deletions docs/DEFAULTPROPERTIES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Default properties

This is a reflection of the default `application.properties` file included in the distribution. Note that lines
beginning with `#` are commented out.

Please refer to the Spring Boot documentation [https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html]
for more information.

```properties
# Server Configuration
#server.port=8080

# Logging Configuration
#logging.config=classpath:log4j2.xml

logging.level.org.springframework=INFO
logging.level.edu.internet2.tier.shibboleth.admin.ui=INFO

# Database Credentials
spring.datasource.username=shibui
spring.datasource.password=shibui

# Database Configuration H2
spring.datasource.url=jdbc:h2:mem:shibui;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.platform=h2
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true


# Database Configuration PostgreSQL
#spring.datasource.url=jdbc:postgresql://localhost:5432/shibui
#spring.datasource.driverClassName=org.postgresql.Driver
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

#Maria/MySQL DB
#spring.datasource.url=jdbc:mariadb://localhost:3306/shibui
#spring.datasource.driverClassName=org.mariadb.jdbc.Driver
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect

# Liquibase properties
spring.liquibase.enabled=false
#spring.liquibase.change-log=classpath:edu/internet2/tier/shibboleth/admin/ui/database/masterchangelog.xml

# Hibernate properties
# for production never ever use create, create-drop. It's BEST to use validate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=false

spring.jpa.hibernate.use-new-id-generator-mappings=true

# Set the following property to periodically write out the generated metadata files. There is no default value; the following is just an example
# shibui.metadata-dir=/opt/shibboleth-idp/metadata/generated
shibui.logout-url=/dashboard

# spring.profiles.active=default

#shibui.default-password=

#Actuator endpoints (info)
# Un-comment to get full git details exposed like author, abbreviated SHA-1, commit message
#management.info.git.mode=full

###
# metadata-providers.xml write configuration

# Set the following property to periodically write out metadata providers configuration. There is no default value; the following is just an example
# shibui.metadataProviders.target=file:/opt/shibboleth-idp/conf/shibui-metadata-providers.xml
# shibui.metadataProviders.taskRunRate=30000
```
22 changes: 22 additions & 0 deletions docs/METADATAPROVIDERS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Metadata providers

The application can generate a `metadata-providers.xml` configuration appropriate for use in the Shibboleth IdP.
There are 2 ways to access this configuration: through a web endpoint or a file.

1. Web endpoint

A request can be made to the `${ui.baseUrl}/api/MetadataResolvers` to get the
current configuration

2. File export

A file can be periodically written to disk. Set the application property `shibui.metadataProviders.target`,
pointing to a spring file resource. Note that there is no value set by default, and nothing will be written
out by default. A file, once defined, will be written every 30 seconds by default. To change the rate, set the
`shibui.metadataProviders.taskRunRate` application property, in milliseconds.

## Docker considerations

If writing the file out, one should use a mount in the docker container for the destination. While a bind mount
might be easiest, if running on a Windows host, one might run into problems. This is easily avoided by using a
volume instead. Refer to [https://docs.docker.com/storage/] for more information.
21 changes: 21 additions & 0 deletions docs/METADATASOURCES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Metdata Sources

Metadata sources in the UI are individual metadata artifacts describing single entities, typically
relying parties. There are 2 ways to access these artifacts.

1. MDQ

_To be written_

2. File export

Files can be periodically written to disk. Define the application property `shibui.metadata-dir`,
and the files will be written out by default every 30 seconds. Note that there is no default value
set for this property and no file will be written by default. To change the run rate, set the
`shibui.taskRunRate` application property, in milliseconds.

## Docker considerations

If writing the files out, one should use a mount in the docker container for the destination. While a bind mount
might be easiest, if running on a Windows host, one might run into problems. This is easily avoided by using a
volume instead. Refer to [https://docs.docker.com/storage/] for more information.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { UpdateFilterRequest } from '../action/collection.action';
import { CancelCreateFilter, UpdateFilterChanges } from '../action/filter.action';
import { PreviewEntity } from '../../domain/action/entity.action';
import { EntityAttributesFilterEntity } from '../../domain/entity';
import { shareReplay } from 'rxjs/operators';

@Component({
selector: 'edit-filter-page',
Expand Down Expand Up @@ -40,7 +41,7 @@ export class EditFilterComponent {
) {
this.definition = MetadataFilterTypes.EntityAttributesFilter;

this.schema$ = this.schemaService.get(this.definition.schema);
this.schema$ = this.schemaService.get(this.definition.schema).pipe(shareReplay());
this.isSaving$ = this.store.select(fromFilter.getCollectionSaving);
this.model$ = this.store.select(fromFilter.getSelectedFilter);

Expand Down
5 changes: 3 additions & 2 deletions ui/src/app/metadata/filter/container/new-filter.component.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';
import { Subject, Observable, of } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { takeUntil, shareReplay } from 'rxjs/operators';

import * as fromFilter from '../reducer';
import { MetadataFilterTypes } from '../model';
Expand Down Expand Up @@ -39,7 +39,7 @@ export class NewFilterComponent implements OnDestroy, OnInit {
) {
this.definition = MetadataFilterTypes.EntityAttributesFilter;

this.schema$ = this.schemaService.get(this.definition.schema);
this.schema$ = this.schemaService.get(this.definition.schema).pipe(shareReplay());
this.isSaving$ = this.store.select(fromFilter.getCollectionSaving);
this.model$ = of(<MetadataFilter>{});
}
Expand All @@ -51,6 +51,7 @@ export class NewFilterComponent implements OnDestroy, OnInit {
this.statusChangeEmitted$
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe(valid => {
console.log(valid);
this.isValid = valid.value ? valid.value.length === 0 : true;
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MetadataFilter } from '../../domain/model';
export const EntityAttributesFilter: FormDefinition<MetadataFilter> = {
label: 'EntityAttributes',
type: 'EntityAttributes',
schema: 'assets/schema/filter/entity-attributes.schema.json',
schema: '/api/ui/EntityAttributesFilters',
getValidators(): any {
const validators = {};
return validators;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ describe('Dashboard Resolvers List Page', () => {
it('should route to the wizard page', () => {
spyOn(router, 'navigate');
instance.edit(draft);
expect(router.navigate).toHaveBeenCalledWith(['metadata', 'resolver', 'new'], {
expect(router.navigate).toHaveBeenCalledWith(['metadata', 'resolver', 'new', 'blank', 'org-info'], {
queryParams: { id: '1' }
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export class DashboardResolversListComponent implements OnInit {

edit(entity: MetadataEntity): void {
if (entity.isDraft()) {
this.router.navigate(['metadata', 'resolver', 'new'], {
this.router.navigate(['metadata', 'resolver', 'new', 'blank', 'org-info'], {
queryParams: {
id: entity.getId()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Component, OnDestroy } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { withLatestFrom, map, distinctUntilChanged, skipWhile } from 'rxjs/operators';
import { withLatestFrom, map, distinctUntilChanged, skipWhile, filter } from 'rxjs/operators';
import { Store } from '@ngrx/store';

import * as fromResolver from '../reducer';
Expand Down Expand Up @@ -60,7 +60,7 @@ export class ResolverWizardStepComponent implements OnDestroy {
},
definition
})),
skipWhile(({ model, definition }) => !definition || !model),
filter(({ model, definition }) => (definition && model)),
map(({ model, definition }) => definition.formatter(model))
);

Expand All @@ -76,7 +76,7 @@ export class ResolverWizardStepComponent implements OnDestroy {

this.valueChangeEmitted$.pipe(
withLatestFrom(this.definition$),
skipWhile(([ changes, definition ]) => !definition || !changes),
filter(([ changes, definition ]) => (!!definition && !!changes)),
map(([ changes, definition ]) => definition.parser(changes.value)),
withLatestFrom(this.store.select(fromResolver.getSelectedDraft)),
map(([changes, original]) => ({ ...original, ...changes }))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { METADATA_SOURCE_WIZARD } from '../wizard-definition';
import { MetadataSourceWizard } from '../../domain/model/wizards/metadata-source-wizard';
import { initialState } from '../reducer/entity.reducer';
import { MockWizardModule } from '../../../../testing/wizard.stub';
import { RouterStateSnapshot } from '@angular/router';
import { RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router';
import { NgbModalStub } from '../../../../testing/modal.stub';
import { of } from 'rxjs';
import { MetadataResolver } from '../../domain/model';
Expand Down Expand Up @@ -115,9 +115,12 @@ describe('Resolver Wizard Component', () => {
}));

describe('canDeactivate method', () => {
it('should return true if moving to another edit page', async(() => {
it('should return true if moving to another page', async(() => {
app.canDeactivate(null, null, {
url: 'wizard'
url: 'blank',
root: <any>{
queryParams: { id: 'foo' }
}
} as RouterStateSnapshot).subscribe((can) => {
expect(can).toBe(true);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@ import { SetDefinition, SetIndex, SetDisabled, ClearWizard } from '../../../wiza
import * as fromWizard from '../../../wizard/reducer';
import { LoadSchemaRequest } from '../../../wizard/action/wizard.action';
import { UnsavedEntityComponent } from '../../domain/component/unsaved-entity.dialog';
import { ModalService } from '../../../core/service/modal.service';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { UpdateChanges, Clear } from '../action/entity.action';
import { Clear } from '../action/entity.action';

@Component({
selector: 'resolver-wizard-page',
Expand Down Expand Up @@ -172,7 +171,7 @@ export class ResolverWizardComponent implements OnDestroy, CanComponentDeactivat
currentState: RouterStateSnapshot,
nextState: RouterStateSnapshot
): Observable<boolean> {
if (nextState.url.match('blank')) { return of(true); }
if (nextState.url.match('blank') && !!nextState.root.queryParams.id) { return of(true); }
if (Object.keys(this.changes).length > 0) {
let modal = this.modalService.open(UnsavedEntityComponent);
modal.componentInstance.message = 'resolver';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ export class DraftCollectionEffects {
)
),
tap(() => {
this.store.dispatch(new ClearWizard());
// this.store.dispatch(new ClearWizard());
this.store.dispatch(new Clear());
})
);
Expand Down
2 changes: 1 addition & 1 deletion ui/src/app/wizard/component/wizard.component.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<nav *ngIf="index$ | async">
<nav *ngIf="(current$ | async) && (index$ | async)">
<ul class="nav nav-wizard">
<li class="nav-item" *ngIf="(previous$ | async)">
<button class="nav-link previous btn clearfix" (click)="onPrevious.emit(previousPage.index)" [disabled]="disabled$ | async"
Expand Down
48 changes: 0 additions & 48 deletions ui/src/assets/schema/filter/metadata-filter.schema.json

This file was deleted.

16 changes: 6 additions & 10 deletions ui/src/assets/schema/provider/filebacked-http-filters.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,10 @@
"id": "datalist",
"data": [
"PT0S",
"PT30S",
"PT1M",
"PT10M",
"PT30M",
"PT1H",
"PT4H",
"PT12H",
"PT24H"
"P14D",
"P7D",
"P1D",
"PT12H"
]
},
"default": null,
Expand All @@ -54,7 +50,7 @@
"title": "label.certificate-file",
"description": "tooltip.certificate-file",
"type": "string",
"widget": "textarea",
"widget": "textline",
"default": ""
}
},
Expand Down Expand Up @@ -127,4 +123,4 @@
}
}
}
}
}

0 comments on commit c2f3a50

Please sign in to comment.