From b2ba018dedaa5812ef7bd60be207895b7722b379 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 29 Sep 2022 13:02:46 -0700 Subject: [PATCH] UI Fixes for OIDC --- .../metadata-sources-ui-schema-oidc.json | 20 +++------- .../metadata-sources-ui-schema-saml.json | 13 ++++--- .../schema/source/metadata-source-saml.json | 37 +++++++------------ ui/src/app/dashboard/view/SourcesTab.js | 2 +- .../form/component/widgets/SelectWidget.js | 5 ++- .../domain/source/component/SourceList.js | 4 ++ .../source/definition/OidcSourceDefinition.js | 30 +++++++++------ .../source/definition/SamlSourceDefinition.js | 4 +- .../wizard/MetadataSourceProtocolSelector.js | 2 +- 9 files changed, 56 insertions(+), 61 deletions(-) diff --git a/backend/src/main/resources/metadata-sources-ui-schema-oidc.json b/backend/src/main/resources/metadata-sources-ui-schema-oidc.json index de0fb8009..109742cd5 100644 --- a/backend/src/main/resources/metadata-sources-ui-schema-oidc.json +++ b/backend/src/main/resources/metadata-sources-ui-schema-oidc.json @@ -5,6 +5,11 @@ "entityId" ], "properties": { + "protocol": { + "title": "label.source-protocol", + "description": "tooltip.source-protocol", + "type": "string" + }, "serviceProviderName": { "title": "label.service-provider-name", "description": "tooltip.service-provider-name", @@ -111,20 +116,7 @@ "widget": { "id": "select" }, - "oneOf": [ - { - "enum": ["SAML 2"], - "description": "SAML 2" - }, - { - "enum": ["SAML 1.1"], - "description": "SAML 1.1" - }, - { - "enum": ["http://openid.net/specs/openid-connect-core-1_0.html"], - "description": "OIDC" - } - ] + "default": "http://openid.net/specs/openid-connect-core-1_0.html" }, "nameIdFormats": { "$ref": "#/definitions/nameIdFormats" diff --git a/backend/src/main/resources/metadata-sources-ui-schema-saml.json b/backend/src/main/resources/metadata-sources-ui-schema-saml.json index 28398dae4..73bb04aec 100644 --- a/backend/src/main/resources/metadata-sources-ui-schema-saml.json +++ b/backend/src/main/resources/metadata-sources-ui-schema-saml.json @@ -5,6 +5,11 @@ "entityId" ], "properties": { + "protocol": { + "title": "label.source-protocol", + "description": "tooltip.source-protocol", + "type": "string" + }, "serviceProviderName": { "title": "label.service-provider-name", "description": "tooltip.service-provider-name", @@ -110,15 +115,11 @@ }, "oneOf": [ { - "enum": [ - "SAML 2" - ], + "enum": ["SAML 2"], "description": "SAML 2" }, { - "enum": [ - "SAML 1.1" - ], + "enum": ["SAML 1.1"], "description": "SAML 1.1" } ] diff --git a/ui/public/assets/schema/source/metadata-source-saml.json b/ui/public/assets/schema/source/metadata-source-saml.json index 44bc9b963..005c2830b 100644 --- a/ui/public/assets/schema/source/metadata-source-saml.json +++ b/ui/public/assets/schema/source/metadata-source-saml.json @@ -34,23 +34,9 @@ "items": { "$ref": "#/definitions/Contact" } }, "mdui": { "$ref": "#/definitions/MDUI" }, - "dependencies": { - "securityInfo": { - "oneOf": [ - { - "properties": { - "@type": { - "enum": [ - "OIDC" - ] - } - } - } - ] - } - }, "securityInfo": { "type": "object", + "widget": { "id": "fieldset" }, "dependencies": { "authenticationRequestsSigned": { "oneOf": [ @@ -59,7 +45,7 @@ "authenticationRequestsSigned": { "enum": [true] }, - "keyDescriptors": { "minItems": 1 } + "x509Certificates": { "minItems": 1 } } }, { @@ -67,7 +53,7 @@ "authenticationRequestsSigned": { "enum": [false] }, - "keyDescriptors": { "minItems": 0 } + "x509Certificates": { "minItems": 0 } } } ] @@ -265,7 +251,7 @@ }, "Certificate": { "type": "object", - "required": ["type", "value"], + "required": ["type", "value", "elementType"], "properties": { "name": { "title": "label.certificate-name-display-only", @@ -354,6 +340,12 @@ "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" ], "description": "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" + }, + { + "enum": [ + "https://tools.ietf.org/html/rfc6749#section-3.1.2" + ], + "description": "OIDC / OAUTH Binding" } ] }, @@ -487,28 +479,25 @@ "title": "label.organization-name", "description": "tooltip.organization-name", "type": "string", - "minLength": 1, "maxLength": 255 }, "displayName": { "title": "label.organization-display-name", "description": "tooltip.organization-display-name", "type": "string", - "minLength": 1, "maxLength": 255 }, "url": { "title": "label.organization-url", "description": "tooltip.organization-url", "type": "string", - "minLength": 1, "maxLength": 255 } }, "dependencies": { - "name": { "required": ["displayName", "url"] }, - "displayName": { "required": ["name", "url"] }, - "url": { "required": ["name", "displayName"] } + "url": ["name", "displayName"], + "name": ["displayName", "url"], + "displayName": ["name", "url"] } }, "nameIdFormats": { diff --git a/ui/src/app/dashboard/view/SourcesTab.js b/ui/src/app/dashboard/view/SourcesTab.js index b0d1352d3..dbeeb0a06 100644 --- a/ui/src/app/dashboard/view/SourcesTab.js +++ b/ui/src/app/dashboard/view/SourcesTab.js @@ -10,7 +10,7 @@ import { Spinner } from '../../core/components/Spinner'; import { NotificationContext, createNotificationAction, NotificationTypes } from '../../notifications/hoc/Notifications'; -const searchProps = ['serviceProviderName', 'entityId', 'createdBy']; +const searchProps = ['serviceProviderName', 'entityId', 'createdBy', 'protocol']; export function SourcesTab () { diff --git a/ui/src/app/form/component/widgets/SelectWidget.js b/ui/src/app/form/component/widgets/SelectWidget.js index 57f18b532..38c4374d8 100644 --- a/ui/src/app/form/component/widgets/SelectWidget.js +++ b/ui/src/app/form/component/widgets/SelectWidget.js @@ -94,13 +94,15 @@ const SelectWidget = ({ {schema.description && } + {readonly ? + + : 0 ? "is-invalid" : ""} onBlur={ @@ -134,6 +136,7 @@ const SelectWidget = ({ )} + } {rawErrors?.length > 0 && touched && ( {rawErrors.map((error, i) => { diff --git a/ui/src/app/metadata/domain/source/component/SourceList.js b/ui/src/app/metadata/domain/source/component/SourceList.js index 8e8a10825..d462528a1 100644 --- a/ui/src/app/metadata/domain/source/component/SourceList.js +++ b/ui/src/app/metadata/domain/source/component/SourceList.js @@ -32,6 +32,7 @@ export default function SourceList({ entities, onDelete, onEnable, onChangeGroup Title Entity ID + Protocol Author Created Date Enabled @@ -55,6 +56,9 @@ export default function SourceList({ entities, onDelete, onEnable, onChangeGroup {source.entityId} + + {source.protocol} + {source.createdBy} diff --git a/ui/src/app/metadata/domain/source/definition/OidcSourceDefinition.js b/ui/src/app/metadata/domain/source/definition/OidcSourceDefinition.js index 9719feb28..15d4bc257 100644 --- a/ui/src/app/metadata/domain/source/definition/OidcSourceDefinition.js +++ b/ui/src/app/metadata/domain/source/definition/OidcSourceDefinition.js @@ -31,11 +31,21 @@ export const OidcSourceEditor = defaultsDeep({ } ] }, + protocolSupportEnum: { + "ui:readonly": true + }, extensions: { OAuthRPExtensions: { layout: { groups: [ { + classNames: 'col-md-6 col-xs-12', + fields: [ + 'attributes' + ], + }, + { + classNames: 'border-start col-md-6 col-xs-12', fields: [ 'postLogoutRedirectUris', 'defaultAcrValues', @@ -43,11 +53,6 @@ export const OidcSourceEditor = defaultsDeep({ 'audience' ], }, - { - fields: [ - 'attributes' - ], - } ] }, postLogoutRedirectUris: { @@ -99,12 +104,21 @@ export const OidcSourceWizard = defaultsDeep({ } ] }, + protocolSupportEnum: { + "ui:readonly": true + }, extensions: { OAuthRPExtensions: { layout: { groups: [ { classNames: 'col-md-6 col-xs-12', + fields: [ + 'attributes' + ], + }, + { + classNames: 'border-start col-md-6 col-xs-12', fields: [ 'postLogoutRedirectUris', 'defaultAcrValues', @@ -112,12 +126,6 @@ export const OidcSourceWizard = defaultsDeep({ 'audience' ], }, - { - classNames: 'col-md-6 col-xs-12', - fields: [ - 'attributes' - ], - } ] }, postLogoutRedirectUris: { diff --git a/ui/src/app/metadata/domain/source/definition/SamlSourceDefinition.js b/ui/src/app/metadata/domain/source/definition/SamlSourceDefinition.js index 03630ef92..4de3041a4 100644 --- a/ui/src/app/metadata/domain/source/definition/SamlSourceDefinition.js +++ b/ui/src/app/metadata/domain/source/definition/SamlSourceDefinition.js @@ -1,5 +1,5 @@ import defaultsDeep from 'lodash/defaultsDeep'; -import API_BASE_PATH from '../../../../App.constant'; +import {API_BASE_PATH} from '../../../../App.constant'; import { SourceBase, SourceEditor, SourceWizard } from './SourceDefinition'; export const SamlSourceBase = defaultsDeep({ @@ -19,8 +19,6 @@ export const SamlSourceBase = defaultsDeep({ }, SourceBase.uiSchema) }, SourceBase); -console.log(SamlSourceBase); - export const SamlSourceEditor = defaultsDeep({ ...SourceEditor, }, SamlSourceBase); diff --git a/ui/src/app/metadata/wizard/MetadataSourceProtocolSelector.js b/ui/src/app/metadata/wizard/MetadataSourceProtocolSelector.js index c84b4b410..ee7b55cfb 100644 --- a/ui/src/app/metadata/wizard/MetadataSourceProtocolSelector.js +++ b/ui/src/app/metadata/wizard/MetadataSourceProtocolSelector.js @@ -26,7 +26,7 @@ export function MetadataSourceProtocolSelector({ types = [], loading, children}) reValidateMode: 'onChange', defaultValues: { serviceProviderName: null, - protocol: null, + protocol: 'SAML', entityID: null, }, resolver: undefined,