From 9d77dcb467c5fe56e1192ac68d56d794b7baf0f2 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:39:28 +0200 Subject: [PATCH] feat(saml): option to create minimal SAML metadata file (#6671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: initial look and feel * feat: initial textarea * feat: app details and i18n * fix: add @peintnermax suggestions * fix: detail component move code to valueChanges.subscribe and clear inputs if metadataurl set --------- Co-authored-by: Max Peintner Co-authored-by: Elio Bischof Co-authored-by: Fabi Co-authored-by: Tim Möhlmann --- .../apps/app-create/app-create.component.html | 132 +++++++++++++----- .../apps/app-create/app-create.component.scss | 21 +++ .../apps/app-create/app-create.component.ts | 27 ++++ .../apps/app-detail/app-detail.component.html | 41 ++++-- .../apps/app-detail/app-detail.component.scss | 21 +++ .../apps/app-detail/app-detail.component.ts | 37 ++++- console/src/assets/i18n/bg.json | 13 +- console/src/assets/i18n/de.json | 13 +- console/src/assets/i18n/en.json | 13 +- console/src/assets/i18n/es.json | 13 +- console/src/assets/i18n/fr.json | 17 +++ console/src/assets/i18n/it.json | 13 +- console/src/assets/i18n/ja.json | 13 +- console/src/assets/i18n/mk.json | 15 +- console/src/assets/i18n/pl.json | 13 +- console/src/assets/i18n/pt.json | 13 +- console/src/assets/i18n/zh.json | 17 +++ 17 files changed, 349 insertions(+), 83 deletions(-) diff --git a/console/src/app/pages/projects/apps/app-create/app-create.component.html b/console/src/app/pages/projects/apps/app-create/app-create.component.html index 1603c8f271..04a1da6d5a 100644 --- a/console/src/app/pages/projects/apps/app-create/app-create.component.html +++ b/console/src/app/pages/projects/apps/app-create/app-create.component.html @@ -170,26 +170,56 @@ {{ 'APP.SAML.CONFIGSECTION' | translate }} -
- - {{ 'APP.SAML.URL' | translate }} - - -
+

+ {{ 'APP.SAML.CHOOSEMETADATASOURCE' | translate }} +

- {{ 'APP.SAML.OR' | translate }} + - - + + +
PREVIEW

-->
- - {{ 'APP.SAML.URL' | translate }} - - +

+ {{ 'APP.SAML.CHOOSEMETADATASOURCE' | translate }} +

+ - {{ 'APP.SAML.OR' | translate }} + + +
+ + + + +` + : ''; + if (form.metadataUrl && form.metadataUrl.length > 0) { this.samlAppRequest.setMetadataUrl(form.metadataUrl); } + + if (this.samlAppRequest) { + const base64 = Buffer.from(minimalMetadata, 'utf-8').toString('base64'); + this.samlAppRequest.setMetadataXml(base64); + } }); } @@ -352,6 +369,8 @@ export class AppCreateComponent implements OnInit, OnDestroy { public onDropXML(filelist: FileList): void { const file = filelist.item(0); this.metadataUrl?.setValue(''); + this.entityId?.setValue(''); + this.acsURL?.setValue(''); if (file) { if (file.size > MAX_ALLOWED_SIZE) { this.toast.showInfo('POLICY.PRIVATELABELING.MAXSIZEEXCEEDED', true); @@ -547,4 +566,12 @@ export class AppCreateComponent implements OnInit, OnDestroy { public get metadataUrl(): AbstractControl | null { return this.samlConfigForm.get('metadataUrl'); } + + public get entityId(): AbstractControl | null { + return this.samlConfigForm.get('entityId'); + } + + public get acsURL(): AbstractControl | null { + return this.samlConfigForm.get('acsURL'); + } } diff --git a/console/src/app/pages/projects/apps/app-detail/app-detail.component.html b/console/src/app/pages/projects/apps/app-detail/app-detail.component.html index 18eff90897..e3884b6166 100644 --- a/console/src/app/pages/projects/apps/app-detail/app-detail.component.html +++ b/console/src/app/pages/projects/apps/app-detail/app-detail.component.html @@ -157,17 +157,22 @@ - -
- - {{ 'APP.SAML.URL' | translate }} - - -
+ +

+ {{ 'APP.SAML.CHOOSEMETADATASOURCE' | translate }} +

-
- {{ 'APP.SAML.OR' | translate }} + + + +
{ + let minimalMetadata = + this.entityId?.value && this.acsURL?.value + ? ` + + + + +` + : ''; + + if (this.metadataUrl && this.metadataUrl.value.length > 0) { + if (this.app && this.app.samlConfig && this.app.samlConfig.metadataXml) { + this.app.samlConfig.metadataXml = ''; + } + } + + if (this.app && this.app.samlConfig && this.app.samlConfig.metadataXml && minimalMetadata) { + const base64 = Buffer.from(minimalMetadata, 'utf-8').toString('base64'); + this.app.samlConfig.metadataXml = base64; + } + }); } public formatClockSkewLabel(seconds: number): string { @@ -406,6 +431,8 @@ export class AppDetailComponent implements OnInit, OnDestroy { this.toast.showInfo('POLICY.PRIVATELABELING.MAXSIZEEXCEEDED', true); } else { this.metadataUrl?.setValue(''); + this.entityId?.setValue(''); + this.acsURL?.setValue(''); const reader = new FileReader(); reader.onload = ((aXML) => { return (e) => { @@ -779,6 +806,14 @@ export class AppDetailComponent implements OnInit, OnDestroy { return this.samlForm.get('metadataUrl'); } + public get entityId(): AbstractControl | null { + return this.samlForm.get('entityId'); + } + + public get acsURL(): AbstractControl | null { + return this.samlForm.get('acsURL'); + } + get decodedBase64(): string { if ( this.app && diff --git a/console/src/assets/i18n/bg.json b/console/src/assets/i18n/bg.json index 482a479a17..87141b3896 100644 --- a/console/src/assets/i18n/bg.json +++ b/console/src/assets/i18n/bg.json @@ -2071,11 +2071,16 @@ "DESCRIPTION": "SAML приложения" }, "CONFIGSECTION": "SAML конфигурация", - "URL": "Url, където се намира файлът с метаданни", - "OR": "или", - "XML": "Качете XML метаданни", + "CHOOSEMETADATASOURCE": "Предоставете вашата SAML конфигурация, като използвате една от следните опции:", + "METADATAOPT1": "Опция 1. Посочете URL адреса, където се намира файлът с метаданни", + "METADATAOPT2": "Опция 2. Качете файл, съдържащ вашите XML метаданни", + "METADATAOPT3": "Опция 3. Създайте минимален файл с метаданни в движение, предоставяйки ENTITYID и ACS URL", + "UPLOAD": "Качете XML файл", "METADATA": "Метаданни", - "METADATAFROMFILE": "Метаданни от файл" + "METADATAFROMFILE": "Метаданни от файл", + "CREATEMETADATA": "Създайте метаданни", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json index fec4423585..0c67a27ba3 100644 --- a/console/src/assets/i18n/de.json +++ b/console/src/assets/i18n/de.json @@ -2080,11 +2080,16 @@ "DESCRIPTION": "SAML Applikationen" }, "CONFIGSECTION": "SAML Konfiguration", - "URL": "Url der Metadaten-Datei", - "OR": "oder", - "XML": "Metadaten XML hochladen", + "CHOOSEMETADATASOURCE": "Stellen Sie Ihre SAML-Konfiguration mit einer der folgenden Optionen bereit:", + "METADATAOPT1": "Option 1: Geben Sie die URL an, unter der sich die Metadatendatei befindet", + "METADATAOPT2": "Option 2: Laden Sie eine Datei hoch, die Ihre XML-Metadaten enthält", + "METADATAOPT3": "Option 3: Erstellen Sie spontan eine minimale Metadatendatei mit ENTITYID und ACS-URL", + "UPLOAD": "XML-Datei hochladen", "METADATA": "Metadaten", - "METADATAFROMFILE": "Metadata aus Datei" + "METADATAFROMFILE": "Metadata aus Datei", + "CREATEMETADATA": "Create metadata", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json index dbcff16583..354b272115 100644 --- a/console/src/assets/i18n/en.json +++ b/console/src/assets/i18n/en.json @@ -2089,11 +2089,16 @@ "DESCRIPTION": "SAML Applications" }, "CONFIGSECTION": "SAML Configuration", - "URL": "Url where Metadata file is located", - "OR": "or", - "XML": "Upload Metadata XML", + "CHOOSEMETADATASOURCE": "Provide your SAML configuration using one of the following options:", + "METADATAOPT1": "Option 1. Specify the url where metadata file is located", + "METADATAOPT2": "Option 2. Upload a file containing your metadata XML", + "METADATAOPT3": "Option 3. Create a minimal metadata file on the fly providing ENTITYID and ACS URL", + "UPLOAD": "Upload XML file", "METADATA": "Metadata", - "METADATAFROMFILE": "Metadata from File" + "METADATAFROMFILE": "Metadata from file", + "CREATEMETADATA": "Create metadata", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/es.json b/console/src/assets/i18n/es.json index cae80d082c..8475622457 100644 --- a/console/src/assets/i18n/es.json +++ b/console/src/assets/i18n/es.json @@ -2077,11 +2077,16 @@ "DESCRIPTION": "Aplicaciones SAML" }, "CONFIGSECTION": "Configuración SAML", - "URL": "URL donde está ubicado el fichero de metadatos", - "OR": "o", - "XML": "Sube un fichero XML de metadatos", + "CHOOSEMETADATASOURCE": "Proporciona tu configuración SAML usando una de las siguientes opciones:", + "METADATAOPT1": "Opción 1. Especifica la URL donde se encuentra el fichero de metadatos", + "METADATAOPT2": "Opción 2. Sube un fichero que contenga tus metadatos XML", + "METADATAOPT3": "Opción 3. Crea, al vuelo, un fichero de metadatos mínimo proporcionando el ENTITYID y la ACS URL", + "UPLOAD": "Subir fichero XML", "METADATA": "Metadatos", - "METADATAFROMFILE": "Metadatos desde un fichero" + "METADATAFROMFILE": "Metadatos desde un fichero", + "CREATEMETADATA": "Crear metadatos", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/fr.json b/console/src/assets/i18n/fr.json index 87f94c74c1..0ec28c504d 100644 --- a/console/src/assets/i18n/fr.json +++ b/console/src/assets/i18n/fr.json @@ -2075,6 +2075,23 @@ "1": "Clé privée JWT" } }, + "SAML": { + "SELECTION": { + "TITLE": "SAML", + "DESCRIPTION": "Applications SAML" + }, + "CONFIGSECTION": "Configuration SAML", + "CHOOSEMETADATASOURCE": "Fournissez votre configuration SAML à l'aide de l'une des options suivantes :", + "METADATAOPT1": "Option 1. Spécifiez l'URL où se trouve le fichier de métadonnées", + "METADATAOPT2": "Option 2. Téléchargez un fichier contenant vos métadonnées XML", + "METADATAOPT3": "Option 3. Créer un fichier de métadonnées minimal à la volée fournissant l'ENTITYID et l'URL ACS", + "UPLOAD": "Télécharger le fichier XML", + "METADATA": "Métadonnées", + "METADATAFROMFILE": "Métadonnées du fichier", + "CREATEMETADATA": "Créer des métadonnées", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" + }, "AUTHMETHODS": { "CODE": { "TITLE": "Code", diff --git a/console/src/assets/i18n/it.json b/console/src/assets/i18n/it.json index 998ea6a662..11150dc8dd 100644 --- a/console/src/assets/i18n/it.json +++ b/console/src/assets/i18n/it.json @@ -2081,11 +2081,16 @@ "DESCRIPTION": "Applicazioni SAMML" }, "CONFIGSECTION": "Configurazione SAML", - "URL": "URL in cui si trova il file di metadati", - "OR": "o", - "XML": "Carica Metadata XML", + "CHOOSEMETADATASOURCE": "Fornisci la tua configurazione SAML utilizzando una delle seguenti opzioni:", + "METADATAOPT1": "Opzione 1. Specificare l'URL in cui si trova il file di metadati", + "METADATAOPT2": "Opzione 2. Carica un file contenente il tuo XML di metadati", + "METADATAOPT3": "Opzione 3. Crea al volo un file di metadati minimo fornendo ENTITYID e URL ACS", + "UPLOAD": "Carica il file XML", "METADATA": "Metadata", - "METADATAFROMFILE": "Metadati dal file" + "METADATAFROMFILE": "Metadati dal file", + "CREATEMETADATA": "Crea metadati", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/ja.json b/console/src/assets/i18n/ja.json index 69f1d9c1fb..bd5ddecb8d 100644 --- a/console/src/assets/i18n/ja.json +++ b/console/src/assets/i18n/ja.json @@ -2072,11 +2072,16 @@ "DESCRIPTION": "SAMLアプリケーション" }, "CONFIGSECTION": "SAML構成", - "URL": "メタデータファイルが配置されているURL", - "OR": "または", - "XML": "メタデータXMLをアップロードする", + "CHOOSEMETADATASOURCE": "次のオプションのいずれかを使用して SAML 構成を指定します。", + "METADATAOPT1": "オプション 1. メタデータ ファイルが存在する URL を指定する", + "METADATAOPT2": "オプション 2. メタデータ XML を含むファイルをアップロードする", + "METADATAOPT3": "オプション 3. ENTITYID と ACS URL を指定して最小限のメタデータ ファイルをオンザフライで作成する", + "UPLOAD": "XMLファイルをアップロードする", "METADATA": "メタデータ", - "METADATAFROMFILE": "ファイルからのメタデータ" + "METADATAFROMFILE": "ファイルからのメタデータ", + "CREATEMETADATA": "メタデータの作成", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/mk.json b/console/src/assets/i18n/mk.json index c152cb14b5..8ce464ddf3 100644 --- a/console/src/assets/i18n/mk.json +++ b/console/src/assets/i18n/mk.json @@ -2078,11 +2078,16 @@ "DESCRIPTION": "SAML Апликации" }, "CONFIGSECTION": "SAML Конфигурација", - "URL": "URL каде што се наоѓа Metadata датотеката", - "OR": "или", - "XML": "Подигни Metadata XML", - "METADATA": "Metadata", - "METADATAFROMFILE": "Metadata од датотека" + "CHOOSEMETADATASOURCE": "Обезбедете ја вашата SAML конфигурација користејќи една од следниве опции:", + "METADATAOPT1": "Опција 1. Наведете ја адресата каде што се наоѓа датотеката со метаподатоци", + "METADATAOPT2": "Опција 2. Поставете датотека што ги содржи вашите метаподатоци XML", + "METADATAOPT3": "Опција 3. Создадете датотека со минимални метаподатоци во лет, обезбедувајќи ENTITYID и ACS URL", + "UPLOAD": "Поставете XML датотека", + "METADATA": "Метаподатоци", + "METADATAFROMFILE": "Метаподатоци од датотека", + "CREATEMETADATA": "Креирајте метаподатоци", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/pl.json b/console/src/assets/i18n/pl.json index 02c10021ce..c622e94bd2 100644 --- a/console/src/assets/i18n/pl.json +++ b/console/src/assets/i18n/pl.json @@ -2081,11 +2081,16 @@ "DESCRIPTION": "Aplikacje SAML" }, "CONFIGSECTION": "Konfiguracja SAML", - "URL": "Adres URL, gdzie znajduje się plik metadanych", - "OR": "lub", - "XML": "Prześlij plik XML metadanych", + "CHOOSEMETADATASOURCE": "Podaj konfigurację SAML, korzystając z jednej z następujących opcji:", + "METADATAOPT1": "Opcja 1. Podaj adres URL, pod którym znajduje się plik metadanych", + "METADATAOPT2": "Opcja 2. Prześlij plik zawierający metadane XML", + "METADATAOPT3": "Opcja 3. Utwórz na bieżąco minimalny plik metadanych, podając ENTITYID i adres URL ACS", + "UPLOAD": "Prześlij plik XML", "METADATA": "Metadane", - "METADATAFROMFILE": "Metadane z pliku" + "METADATAFROMFILE": "Metadane z pliku", + "CREATEMETADATA": "Utwórz metadane", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/pt.json b/console/src/assets/i18n/pt.json index 07deb19921..47f98ea910 100644 --- a/console/src/assets/i18n/pt.json +++ b/console/src/assets/i18n/pt.json @@ -2076,11 +2076,16 @@ "DESCRIPTION": "Aplicativos SAML" }, "CONFIGSECTION": "Configuração SAML", - "URL": "URL onde o arquivo de Metadados está localizado", - "OR": "ou", - "XML": "Carregar XML de Metadados", + "CHOOSEMETADATASOURCE": "Forneça sua configuração SAML usando uma das seguintes opções:", + "METADATAOPT1": "Opção 1. Especifique o URL onde o arquivo de metadados está localizado", + "METADATAOPT2": "Opção 2. Faça upload de um arquivo contendo seu XML de metadados", + "METADATAOPT3": "Opção 3. Crie um arquivo mínimo de metadados instantaneamente fornecendo ENTITYID e URL ACS", + "UPLOAD": "Prześlij plik XML", "METADATA": "Metadados", - "METADATAFROMFILE": "Metadados do Arquivo" + "METADATAFROMFILE": "Metadados do Arquivo", + "CREATEMETADATA": "Criar metadados", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" }, "AUTHMETHODS": { "CODE": { diff --git a/console/src/assets/i18n/zh.json b/console/src/assets/i18n/zh.json index 626dae19aa..9fac71e227 100644 --- a/console/src/assets/i18n/zh.json +++ b/console/src/assets/i18n/zh.json @@ -2074,6 +2074,23 @@ "1": "Private Key JWT" } }, + "SAML": { + "SELECTION": { + "TITLE": "SAML", + "DESCRIPTION": "SAML 应用" + }, + "CONFIGSECTION": "SAML 配置", + "CHOOSEMETADATASOURCE": "使用以下选项之一提供您的 SAML 配置:", + "METADATAOPT1": "选项 1.指定元数据文件所在的 url", + "METADATAOPT2": "选项 2. 上传包含元数据 XML 的文件", + "METADATAOPT3": "选项 3. 动态创建最小元数据文件,提供 ENTITYID 和 ACS URL", + "UPLOAD": "上传 XML 文件", + "METADATA": "元数据", + "METADATAFROMFILE": "文件中的元数据", + "CREATEMETADATA": "创建元数据", + "ENTITYID": "Entity ID", + "ACSURL": "ACS endpoint URL" + }, "AUTHMETHODS": { "CODE": { "TITLE": "Code",