From ab3e09615474be60b3d2c7552eace45e82766c0b Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 14:29:45 +0200 Subject: [PATCH 01/15] Removed unneeded comments Moved from information events to log lines during export Added an option to include security settings or not. By default it will be excluded and it will trim any security settings unless opted in explicitly Exclude DevPack references from the package. Fixed version history --- .../Low Code App Editor Package.cs | 2 - .../Controllers/ExportController.cs | 71 +++++++++++++++---- Low Code App Editor/Low Code App Editor.cs | 9 +-- Low Code App Editor/Low Code App Editor.xml | 2 +- Low Code App Editor/UI/ExportDialog.cs | 12 ++-- 5 files changed, 70 insertions(+), 26 deletions(-) diff --git a/Low Code App Editor Package/Low Code App Editor Package.cs b/Low Code App Editor Package/Low Code App Editor Package.cs index c9b70d8..e09898a 100644 --- a/Low Code App Editor Package/Low Code App Editor Package.cs +++ b/Low Code App Editor Package/Low Code App Editor Package.cs @@ -83,8 +83,6 @@ public void Install(Engine engine, AppInstallContext context) var installer = new AppInstaller(Engine.SLNetRaw, context); installer.InstallDefaultContent(); - // Custom installation logic can be added here for each individual install package. - // Create a symbolic link to the WebApiLib.dll Action logger = installer.Log; Engine.SLNetRaw.CreateSymbolicLink(WebApiLib_ProtocolScripts_Path, WebApiLib_WebPages_Path, logger); diff --git a/Low Code App Editor/Controllers/ExportController.cs b/Low Code App Editor/Controllers/ExportController.cs index b6caf21..93633f9 100644 --- a/Low Code App Editor/Controllers/ExportController.cs +++ b/Low Code App Editor/Controllers/ExportController.cs @@ -27,6 +27,7 @@ public class ExportController { public static readonly string ScriptPath = @"C:\Skyline DataMiner\Scripts"; public static readonly string DllImportPath = @"C:\Skyline DataMiner\ProtocolScripts\DllImport"; + public static readonly string SolutionLibrariesPath = @"C:\Skyline DataMiner\ProtocolScripts\DllImport\SolutionLibraries"; public static readonly string LowCodeAppEditorPath = @"C:\Skyline DataMiner\Documents\Low Code App Editor"; public static readonly string LowCodeAppEditorExportPath = @"C:\Skyline DataMiner\Documents\DMA_COMMON_DOCUMENTS\Low Code Apps Exports"; public static readonly string ThemesPath = @"C:\Skyline DataMiner\dashboards\Themes.json"; @@ -47,7 +48,7 @@ private static string ExportPackage(IEngine engine, IEnumerable apps, Expor exportPath = Path.Combine(LowCodeAppEditorExportPath, $"{apps.First().Name}_{now.ToString("yyyy-MM-dd HH-mm-ss")}_App_Export.zip"); } - engine.GenerateInformation($"Export Path: {exportPath}"); + engine.Log($"Export Path: {exportPath}"); if (!Directory.Exists(Path.GetDirectoryName(exportPath))) { @@ -57,7 +58,7 @@ private static string ExportPackage(IEngine engine, IEnumerable apps, Expor using (var fs = new FileStream(exportPath, FileMode.Create)) using (var zip = new ZipArchive(fs, ZipArchiveMode.Create)) { - engine.GenerateInformation($"Adding Package Information"); + engine.Log($"Adding Package Information"); // Package Information var info = apps.Count() == 1 ? PackageInfo.FromApp(apps.First()) : PackageInfo.FromApp(); @@ -85,25 +86,25 @@ private static string ExportPackage(IEngine engine, IEnumerable apps, Expor var themes = new List(); foreach (var app in apps) { - engine.GenerateInformation($"Adding App"); + engine.Log($"Adding App"); // Add the app as CompanionFiles AddAppToArchive(zip, app, options); - if (options.ExcludeScripts) + if (!options.ExcludeScripts) { - engine.GenerateInformation("Skipping Automation Scripts"); + engine.Log($"Adding Scripts"); + AddScriptsToArchive(zip, app); } else { - engine.GenerateInformation($"Adding Scripts"); - AddScriptsToArchive(zip, app); + engine.Log("Skipping Automation Scripts"); } if (!options.ExcludeDom) { // Add Dom definitions - engine.GenerateInformation($"Adding DOM modules, for app '{app.Name}'"); + engine.Log($"Adding DOM modules, for app '{app.Name}'"); domModuleIds.AddRangeUnique(app.LatestVersion.GetUsedDomModules()); AddDomToArchive(engine, zip, domModuleIds, options); } @@ -111,7 +112,7 @@ private static string ExportPackage(IEngine engine, IEnumerable apps, Expor if (!options.ExcludeImages) { // Add Images to companion files - engine.GenerateInformation($"Adding Images, for app '{app.Name}'"); + engine.Log($"Adding Images, for app '{app.Name}'"); images.AddRangeUnique(app.LatestVersion.GetUsedImages()); AddImagesToArchive(zip, images); } @@ -119,13 +120,13 @@ private static string ExportPackage(IEngine engine, IEnumerable apps, Expor if (!options.ExcludeThemes) { // Add Theme - engine.GenerateInformation($"Adding Themes, for app '{app.Name}'"); + engine.Log($"Adding Themes, for app '{app.Name}'"); themes.AddRangeUnique(app.LatestVersion.GetUsedThemes()); AddThemesToArchive(zip, themes); } } - engine.GenerateInformation($"Adding Installer code"); + engine.Log($"Adding Installer code"); // Add custom Low Code App Installer Code zip.CreateEntryFromDirectory(LowCodeAppEditorPath, "Scripts"); @@ -148,7 +149,7 @@ private static string ExportPackage(IEngine engine, IEnumerable apps, Expor sb.AppendLine($"Script\\{Path.GetDirectoryName(file.FullName)}"); } - foreach(var dependency in zip.GetEntries("AppInstallContent\\Assemblies").Where(x => !x.FullName.EndsWith("\\"))) + foreach (var dependency in zip.GetEntries("AppInstallContent\\Assemblies").Where(x => !x.FullName.EndsWith("\\"))) { sb.AppendLine(dependency.FullName); } @@ -178,10 +179,36 @@ private static void AddAppToArchive(ZipArchive zip, App app, ExportOptions optio app = app ?? throw new ArgumentNullException(nameof(app)); options = options ?? throw new ArgumentNullException(nameof(options)); + if (!options.IncludeSecuritySettings) + { + // Strip the security settings from the app settings file before adding to the archive + var appSettingsPath = Path.Combine(app.Path, "App.info.json"); + var appSettings = JObject.Parse(File.ReadAllText(appSettingsPath)); + if (appSettings.ContainsKey("Security")) + { + var securitySettings = appSettings["Security"] as JObject; + if (securitySettings.ContainsKey("AllowEdit") && (securitySettings["AllowEdit"] as JArray).Count > 0) + { + (securitySettings["AllowEdit"] as JArray).Clear(); + } + + if (securitySettings.ContainsKey("AllowView") && (securitySettings["AllowView"] as JArray).Count > 0) + { + (securitySettings["AllowView"] as JArray).Clear(); + } + } + + zip.CreateEntryFromText(Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, "App.info.json"), appSettings.ToString(Formatting.None)); + } + else + { + zip.CreateEntryFromFile(app.PathSettings, Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, "App.info.json")); + } + + // TODO: Don't auto include the App.info.json file. Just the version folders if (!options.IncludeVersions) { // Just include the general .json file and the latest version - zip.CreateEntryFromDirectory(app.Path, Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID), false); zip.CreateEntryFromDirectory(Path.Combine(app.Path, $"version_{app.LatestVersion.Version} "), Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, $"version_{app.LatestVersion.Version}"), true); if (app.LatestDraftVersion != null) zip.CreateEntryFromDirectory(Path.Combine(app.Path, $"version_{app.LatestDraftVersion.Version} "), Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestDraftVersion.ID, $"version_{app.LatestDraftVersion.Version}"), true); @@ -189,7 +216,10 @@ private static void AddAppToArchive(ZipArchive zip, App app, ExportOptions optio else { // Include everything - zip.CreateEntryFromDirectory(app.Path, Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID)); + foreach (var version in app.Versions) + { + zip.CreateEntryFromDirectory(Path.Combine(app.Path, $"version_{version.Version} "), Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, $"version_{version.Version}"), true); + } } } @@ -209,7 +239,7 @@ private static void AddScriptToArchive(ZipArchive zip, App app, string script, L var scriptPath = Path.Combine(ScriptPath, scriptName); if (File.Exists(scriptPath)) { - if(addedFiles.Exists(x => x == $"AppInstallContent\\Scripts\\{script}\\Script_{script}.xml")) + if (addedFiles.Exists(x => x == $"AppInstallContent\\Scripts\\{script}\\Script_{script}.xml")) { return; } @@ -262,6 +292,12 @@ private static void AddDependenciesToArchive(ZipArchive zip, App app, string scr var refParams = doc.Descendants(ns + "Param").Where(param => (string)param.Attribute("type") == "ref"); foreach (var reference in refParams.Select(refParam => refParam.Value)) { + if (reference.StartsWith(SolutionLibrariesPath)) + { + // DevPacks should be exlcluded + continue; + } + if (addedFiles.Exists(x => x == reference.Replace(@"C:\Skyline DataMiner", "AppInstallContent\\Assemblies"))) { continue; @@ -347,6 +383,8 @@ public class ExportOptions public bool OverwriteThemes { get; set; } + public bool IncludeSecuritySettings { get; set; } + public static ExportOptions FromDialog(ExportDialog dialog) { return new ExportOptions @@ -361,6 +399,9 @@ public static ExportOptions FromDialog(ExportDialog dialog) SyncImages = dialog.SyncImages.IsChecked, ExcludeThemes = dialog.ExcludeThemes.IsChecked, SyncThemes = dialog.SyncThemes.IsChecked, + OverrideImages = dialog.OverwriteImages.IsChecked, + OverwriteThemes = dialog.OverwriteThemes.IsChecked, + IncludeSecuritySettings = dialog.IncludeSecuritySettings.IsChecked, }; } } diff --git a/Low Code App Editor/Low Code App Editor.cs b/Low Code App Editor/Low Code App Editor.cs index 8c60a7f..1f9506c 100644 --- a/Low Code App Editor/Low Code App Editor.cs +++ b/Low Code App Editor/Low Code App Editor.cs @@ -45,10 +45,11 @@ Ambachtenstraat 33 DATE VERSION AUTHOR COMMENTS -02/12/2024 1.0.0.16 AMA, Skyline Changed some of the names of the Export Dialog to be more readable. -27/12/2024 1.0.0.17 AMA, Skyline Added extra check before casting to DMADashboardQueryData when exporting apps. -10/04/2025 1.0.0.18 AMA, Skyline Fixed bug where you could import pages/panels from your own app. Added duplicate functionality for pages/panels. -10/04/2025 1.0.0.19 AMA, Skyline Fixed bug when deserializing to dynamic properties. Expanded the DOM module search in queries to also look in joins +05/12/2024 1.0.1-CU15 AMA, Skyline Changed some of the names of the Export Dialog to be more readable. +27/12/2024 1.0.1-CU16 AMA, Skyline Added extra check before casting to DMADashboardQueryData when exporting apps. +10/04/2025 1.0.1-CU17 AMA, Skyline Fixed bug where you could import pages/panels from your own app. Added duplicate functionality for pages/panels. +6/05/2025 1.0.1-CU18 AMA, Skyline Fixed bug when deserializing to dynamic properties. Expanded the DOM module search in queries to also look in joins +14/05/2025 1.0.1-CU19 AMA, Skyline Installer will now create a symbolic link to the WebApiLib.dll **************************************************************************** */ diff --git a/Low Code App Editor/Low Code App Editor.xml b/Low Code App Editor/Low Code App Editor.xml index 2107e78..9634474 100644 --- a/Low Code App Editor/Low Code App Editor.xml +++ b/Low Code App Editor/Low Code App Editor.xml @@ -23,7 +23,7 @@ System.Xml.Linq.dll System.IO.Compression.dll System.IO.Compression.FileSystem.dll - C:\Skyline DataMiner\Webpages\API\bin\WebApiLib.dll + C:\Skyline DataMiner\ProtocolScripts\WebApiLib.dll \ No newline at end of file diff --git a/Low Code App Editor/UI/ExportDialog.cs b/Low Code App Editor/UI/ExportDialog.cs index b1972d9..c1329d7 100644 --- a/Low Code App Editor/UI/ExportDialog.cs +++ b/Low Code App Editor/UI/ExportDialog.cs @@ -38,10 +38,12 @@ public ExportDialog(IEngine engine) : base(engine) Panel.Add(SyncThemes, 11, 1); Panel.Add(new Label("Overwrite Themes:"), 12, 0); Panel.Add(OverwriteThemes, 12, 1); - Panel.Add(new WhiteSpace(), 13, 0); - Panel.Add(BackButton, 14, 0); - Panel.Add(ExportButton, 14, 1); - Panel.Add(Status, 15, 0, 1, 3); + Panel.Add(new Label("Include Security Settings"), 13, 0); + Panel.Add(IncludeSecuritySettings, 13, 1); + Panel.Add(new WhiteSpace(), 14, 0); + Panel.Add(BackButton, 15, 0); + Panel.Add(ExportButton, 15, 1); + Panel.Add(Status, 16, 0, 1, 3); } public ICheckBoxList Apps { get; } = new CheckBoxList(); @@ -70,6 +72,8 @@ public ExportDialog(IEngine engine) : base(engine) public ICheckBox OverwriteThemes { get; } = new CheckBox { IsChecked = true }; + public ICheckBox IncludeSecuritySettings { get; } = new CheckBox(); + public IButton BackButton { get; } = new Button("Back"); public IButton ExportButton { get; } = new Button("Export"); From 38109117941ed0809100d62e8c70033185b116b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 12:39:17 +0000 Subject: [PATCH 02/15] Bump the all-dependencies group with 6 updates Bumps coverlet.collector from 8.0.0 to 10.0.1 Bumps Microsoft.NET.Test.Sdk from 18.3.0 to 18.5.1 Bumps MSTest.TestAdapter from 4.1.0 to 4.2.3 Bumps MSTest.TestFramework from 4.1.0 to 4.2.3 Bumps Skyline.DataMiner.Sdk from 2.4.6 to 2.5.2 Bumps Skyline.DataMiner.Utils.SecureCoding.Analyzers from 2.2.1 to 2.2.3 --- updated-dependencies: - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Utils.SecureCoding.Analyzers dependency-version: 2.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Utils.SecureCoding.Analyzers dependency-version: 2.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Utils.SecureCoding.Analyzers dependency-version: 2.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-dependencies - dependency-name: coverlet.collector dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-dependencies - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.5.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: MSTest.TestAdapter dependency-version: 4.2.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: MSTest.TestFramework dependency-version: 4.2.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Sdk dependency-version: 2.5.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all-dependencies - dependency-name: Skyline.DataMiner.Utils.SecureCoding.Analyzers dependency-version: 2.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-dependencies ... Signed-off-by: dependabot[bot] --- .../Low Code App Editor Installer.csproj | 2 +- .../Low Code App Editor Package.csproj | 2 +- Low Code App Editor/Low Code App Editor.csproj | 2 +- Low Code App EditorTests/Low Code App EditorTests.csproj | 8 ++++---- global.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Low Code App Editor Installer/Low Code App Editor Installer.csproj b/Low Code App Editor Installer/Low Code App Editor Installer.csproj index ca84057..3afeaea 100644 --- a/Low Code App Editor Installer/Low Code App Editor Installer.csproj +++ b/Low Code App Editor Installer/Low Code App Editor Installer.csproj @@ -15,7 +15,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Low Code App Editor Package/Low Code App Editor Package.csproj b/Low Code App Editor Package/Low Code App Editor Package.csproj index 55191d4..cc48be4 100644 --- a/Low Code App Editor Package/Low Code App Editor Package.csproj +++ b/Low Code App Editor Package/Low Code App Editor Package.csproj @@ -16,7 +16,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Low Code App Editor/Low Code App Editor.csproj b/Low Code App Editor/Low Code App Editor.csproj index dcb6a86..e989bce 100644 --- a/Low Code App Editor/Low Code App Editor.csproj +++ b/Low Code App Editor/Low Code App Editor.csproj @@ -16,7 +16,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Low Code App EditorTests/Low Code App EditorTests.csproj b/Low Code App EditorTests/Low Code App EditorTests.csproj index 547b4c0..f83de98 100644 --- a/Low Code App EditorTests/Low Code App EditorTests.csproj +++ b/Low Code App EditorTests/Low Code App EditorTests.csproj @@ -11,10 +11,10 @@ - - - - + + + + diff --git a/global.json b/global.json index 628c869..6e740d6 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "msbuild-sdks": { - "Skyline.DataMiner.Sdk": "2.4.6" + "Skyline.DataMiner.Sdk": "2.5.2" } } \ No newline at end of file From 79bb94c128250bdfce67656b704da2357435697b Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 14:44:42 +0200 Subject: [PATCH 03/15] Added changelog --- Documentation/CHANGELOG_1.0.1-CU20.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Documentation/CHANGELOG_1.0.1-CU20.md diff --git a/Documentation/CHANGELOG_1.0.1-CU20.md b/Documentation/CHANGELOG_1.0.1-CU20.md new file mode 100644 index 0000000..a010152 --- /dev/null +++ b/Documentation/CHANGELOG_1.0.1-CU20.md @@ -0,0 +1,2 @@ +**New Feature** +- New option to include or exclude the security config from the export. (not included by default) \ No newline at end of file From 65bb6d0e8880dbbfff81ee7c0b221e652d823281 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 14:52:42 +0200 Subject: [PATCH 04/15] github workflow update --- ...er App Packages Master Workflow Custom.yml | 424 ------------------ .github/workflows/complete.yml | 21 +- 2 files changed, 8 insertions(+), 437 deletions(-) delete mode 100644 .github/workflows/DataMiner App Packages Master Workflow Custom.yml diff --git a/.github/workflows/DataMiner App Packages Master Workflow Custom.yml b/.github/workflows/DataMiner App Packages Master Workflow Custom.yml deleted file mode 100644 index 2fd0491..0000000 --- a/.github/workflows/DataMiner App Packages Master Workflow Custom.yml +++ /dev/null @@ -1,424 +0,0 @@ -name: DataMiner App Packages (Custom) - -# Controls when the workflow will run -on: - # Allows you to run this workflow from another workflow - workflow_call: - inputs: - referenceName: - required: true - type: string - runNumber: - required: true - type: string - referenceType: - required: true - type: string - repository: - required: true - type: string - owner: - required: true - type: string - sonarCloudProjectName: - required: true - type: string - configuration: - required: true - type: string - solutionFilterName: - required: false - type: string - debug: - required: false - type: boolean - secrets: - sonarCloudToken: - required: true - dataminerToken: - required: false - azureToken: - required: false - overrideCatalogDownloadToken: - required: false - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - skyline_cicd: - name: Skyline CICD - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup .NET Core - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '8.0.x' - - - name: Cache and Install Mono - uses: awalsh128/cache-apt-pkgs-action@v1.5.0 - with: - packages: mono-complete - - - name: Validate SonarCloud Project Name - id: validate-sonar-name - run: | - if [[ -z "${{ inputs.sonarCloudProjectName }}" ]]; then - echo "Error: sonarCloudProjectName is not set." - echo "Please create a SonarCloud project by visiting: https://sonarcloud.io/projects/create and copy the id of the project as mentioned in the sonarcloud project url." - repo_url="https://github.com/${{ github.repository }}/settings/variables/actions" - echo "Then set a SONAR_NAME variable in your repository settings: $repo_url" - echo "Alternatively, if you do not wish to use the Skyline Quality Gate but intend to publish your results to the catalog, you may create your workflow to include the equivalent of a dotnet publish step as shown below (remove the \\):" - echo " - name: Publish" - echo " env:" - echo " api-key: $\{{ secrets.DATAMINER_TOKEN }}" - echo " run: dotnet publish -p:Version=\"0.0.$\{{ github.run_number }}\" -p:VersionComment=\"Iterative Development\" -p:CatalogPublishKeyName=api-key" - exit 1 - fi - - - name: Validate SonarCloud Secret Token - id: validate-sonar-token - run: | - if [[ -z "${{ secrets.sonarCloudToken }}" ]]; then - echo "Error: sonarCloudToken is not set." - echo "Please create a SonarCloud token by visiting: https://sonarcloud.io/account/security and copy the value of the created token." - repo_url="https://github.com/${{ github.repository }}/settings/secrets/actions" - echo "Then set a SONAR_TOKEN secret in your repository settings: $repo_url" - echo "Alternatively, if you do not wish to use the Skyline Quality Gate but intend to publish your results to the catalog, you may create your workflow to include the equivalent of a dotnet publish step as shown below (remove the \\):" - echo " - name: Publish" - echo " env:" - echo " api-key: $\{{ secrets.DATAMINER_TOKEN }}" - echo " run: dotnet publish -p:Version=\"0.0.$\{{ github.run_number }}\" -p:VersionComment=\"Iterative Development\" -p:CatalogPublishKeyName=api-key" - exit 1 - fi - - - name: Validate DataMiner Secret Token - id: validate-dataminer-token - if: inputs.referenceType == 'tag' - run: | - if [[ -z "${{ secrets.dataminerToken }}" ]]; then - echo "Error: dataminerToken is not set. Release not possible!" - echo "Please create or re-use an admin.dataminer.services token by visiting: https://admin.dataminer.services/." - echo "Navigate to the right organization, then go to Keys and create or find a key with the permissions Register catalog items, Download catalog versions, and Read catalog items." - echo "Copy the value of the token." - repo_url="https://github.com/${{ github.repository }}/settings/secrets/actions" - echo "Then set a DATAMINER_TOKEN secret in your repository settings: $repo_url" - exit 1 - fi - - - name: Find .sln file - id: findSlnFile - run: | - if [[ -z "${{ inputs.solutionFilterName }}" ]]; then - echo solutionFilePath=$(find . -type f -name '*.sln') >> $GITHUB_OUTPUT - else - echo solutionFilePath=$(find . -type f -name '${{ inputs.solutionFilterName }}') >> $GITHUB_OUTPUT - fi - shell: bash - - - name: Enable Skyline NuGet Registries - if: inputs.owner == 'SkylineCommunications' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AZURE_TOKEN: ${{ secrets.azureToken }} - run: | - $sources = @( - @{ Name = "PrivateGitHubNugets"; URL = "https://nuget.pkg.github.com/SkylineCommunications/index.json"; Username = "USERNAME"; Password = "${{ secrets.GITHUB_TOKEN }}" }, - @{ Name = "CloudNuGets"; URL = "https://pkgs.dev.azure.com/skyline-cloud/Cloud_NuGets/_packaging/CloudNuGet/nuget/v3/index.json"; Username = "az"; Password = "${{ secrets.azureToken }}" }, - @{ Name = "PrivateAzureNuGets"; URL = "https://pkgs.dev.azure.com/skyline-cloud/_packaging/skyline-private-nugets/nuget/v3/index.json"; Username = "az"; Password = "${{ secrets.azureToken }}" } - ) - - foreach ($source in $sources) { - if ($source.Password -ne "") { - Write-Host "Checking source $($source.Name)..." - - if (dotnet nuget list source | Select-String -Pattern $source.Name) { - Write-Host "Updating existing source $($source.Name)." - dotnet nuget update source $source.Name --source $source.URL --username $source.Username --password $source.Password --store-password-in-clear-text - } else { - Write-Host "Adding new source $($source.Name)." - dotnet nuget add source $source.URL --name $source.Name --username $source.Username --password $source.Password --store-password-in-clear-text - } - } else { - Write-Host "Skipping $($source.Name) because the password is not set." - } - } - shell: pwsh - - - name: Install Tools - run: | - dotnet tool install dotnet-sonarscanner --global - dotnet tool install Skyline.DataMiner.CICD.Tools.Sbom --global --version 1.0.* - dotnet tool install -g Skyline.DataMiner.CICD.Tools.CatalogUpload --version 3.0.* - - - name: Prepare SonarCloud Variables - id: prepSonarCloudVar - run: | - import os - env_file = os.getenv('GITHUB_ENV') - with open(env_file, "a") as myfile: - myfile.write("lowerCaseOwner=" + str.lower("${{ inputs.owner }}")) - shell: python - - - name: Get SonarCloud Status - id: get-sonarcloud-status - run: | - sonarCloudProjectStatus=$(curl -s -u "${{ secrets.sonarCloudToken }}:" "https://sonarcloud.io/api/qualitygates/project_status?projectKey=${{ inputs.sonarCloudProjectName }}") - - # Check if the response is empty or not valid JSON - if [ -z "$sonarCloudProjectStatus" ] || ! echo "$sonarCloudProjectStatus" | jq . > /dev/null 2>&1; then - echo "Error: The SONAR_TOKEN is invalid, expired, or the response is empty. Please check: https://sonarcloud.io/account/security and update your token: https://github.com/${{ github.repository }}/settings/secrets/actions" >&2 - echo "Returned response: $sonarCloudProjectStatus" >&2 - exit 1 - fi - - # Output the JSON response if valid - echo "Returned response: $sonarCloudProjectStatus" - echo "sonarCloudProjectStatus=$sonarCloudProjectStatus" >> $GITHUB_OUTPUT - continue-on-error: false - shell: bash - - - name: Trigger Initial Analysis - if: ${{ fromJson(steps.get-sonarcloud-status.outputs.sonarCloudProjectStatus).projectStatus.status == 'NONE' }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.sonarCloudToken }} - run: | - dotnet sonarscanner begin /k:"${{ inputs.sonarCloudProjectName }}" /o:"${{ env.lowerCaseOwner }}" /d:sonar.token="${{ secrets.sonarCloudToken }}" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.cs.opencover.reportsPaths="**/TestResults/**/coverage.opencover.xml" /d:sonar.cs.vstest.reportsPaths="**/TestResults/**.trx" - dotnet build "${{ steps.findSlnFile.outputs.solutionFilePath }}" ` - -p:GenerateDataMinerPackage=false ` - --configuration ${{ inputs.configuration }} ` - -nodeReuse:false - dotnet sonarscanner end /d:sonar.token="${{ secrets.sonarCloudToken }}" - continue-on-error: true - shell: pwsh - - - name: Start Analysis - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.sonarCloudToken }} - run: | - dotnet sonarscanner begin /k:"${{ inputs.sonarCloudProjectName }}" /o:"${{ env.lowerCaseOwner }}" /d:sonar.token="${{ secrets.sonarCloudToken }}" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.cs.opencover.reportsPaths="**/TestResults/**/coverage.opencover.xml" /d:sonar.cs.vstest.reportsPaths="**/TestResults/**.trx" - continue-on-error: true - - - name: Build for pre-release - if: inputs.referenceType == 'branch' - env: - DATAMINER_TOKEN: ${{ secrets.dataminerToken }} - OVERRIDE_CATALOG_DOWNLOAD_TOKEN: ${{ secrets.overrideCatalogDownloadToken }} - run: | - dotnet build "${{ steps.findSlnFile.outputs.solutionFilePath }}" ` - -p:Version="0.0.${{ inputs.runNumber }}" ` - --configuration ${{ inputs.configuration }} ` - -p:CatalogPublishKeyName="DATAMINER_TOKEN" ` - -p:CatalogDefaultDownloadKeyName="OVERRIDE_CATALOG_DOWNLOAD_TOKEN" ` - -p:SkylineDataMinerSdkDebug="${{ inputs.debug }}" ` - -nodeReuse:false - shell: pwsh - - - name: Build for release - if: inputs.referenceType == 'tag' - env: - DATAMINER_TOKEN: ${{ secrets.dataminerToken }} - OVERRIDE_CATALOG_DOWNLOAD_TOKEN: ${{ secrets.overrideCatalogDownloadToken }} - run: | - dotnet build "${{ steps.findSlnFile.outputs.solutionFilePath }}" ` - -p:Version="${{ inputs.referenceName }}" ` - --configuration ${{ inputs.configuration }} ` - -p:CatalogPublishKeyName="DATAMINER_TOKEN" ` - -p:CatalogDefaultDownloadKeyName="OVERRIDE_CATALOG_DOWNLOAD_TOKEN" ` - -p:SkylineDataMinerSdkDebug="${{ inputs.debug }}" ` - -nodeReuse:false - shell: pwsh - - - name: Unit Tests - # when not using MSTest you'll need to install coverlet.collector nuget in your test solutions - id: unit-tests - run: dotnet test "${{ steps.findSlnFile.outputs.solutionFilePath }}" --no-build --configuration ${{ inputs.configuration }} --filter TestCategory!=IntegrationTest --logger "trx;logfilename=unitTestResults.trx" --collect "XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura,opencover - - - name: Stop Analysis - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.sonarCloudToken }} - run: | - dotnet sonarscanner end /d:sonar.token="${{ secrets.sonarCloudToken }}" - continue-on-error: true - - - name: SonarCloud Quality Gate check - if: inputs.referenceType == 'branch' - id: sonarcloud-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master - with: - scanMetadataReportFile: .sonarqube/out/.sonar/report-task.txt - timeout-minutes: 5 - env: - SONAR_TOKEN: ${{ secrets.sonarCloudToken }} - - - name: Create package name - if: inputs.referenceType == 'tag' - id: packageName - run: | - $tempName = "${{ inputs.repository }}" - $safeName = $tempName -replace '[\"\/\\<>|:*?]', '_' - echo "name=$safeName" >> $env:GITHUB_OUTPUT - shell: pwsh - - - name: Generate SBOM file - if: inputs.referenceType == 'tag' - run: | - find . -type f -name "*.dmapp" -print0 | while IFS= read -r -d '' file; do - echo "Generating SBOM for $file" - dataminer-sbom generate-and-add \ - --solution-path "${{ steps.findSlnFile.outputs.solutionFilePath }}" \ - --package-file "$file" \ - --package-name "${{ steps.packageName.outputs.name }}" \ - --package-version "${{ inputs.referenceName }}" \ - --package-supplier "Skyline Communications" \ - --debug "${{ inputs.debug }}" - done - - - name: Remove WebApiLib dll - run: | - find . -type f -name "*.dmapp" -print0 | while IFS= read -r -d '' file; do - echo "Updating $file" - - # Create a temp directory - temp_dir=$(mktemp -d) - - # Unzip the .dmapp file into the temp dir - unzip -q "$file" -d "$temp_dir" - - echo "📂 Files before removal:" - find "$temp_dir" -type f - - # Remove the specific line from Description.txt (if it exists) - desc_file=$(find "$temp_dir" -type f -name "Description.txt") - if [[ -f "$desc_file" ]]; then - echo "📝 Cleaning Description.txt at $desc_file" - sed -i '/ProtocolScripts\\DllImport\\WebApiLib\.dll/d' "$desc_file" - fi - - # Find and delete all files ending in WebApiLib.dll - find "$temp_dir" -type f -name "*WebApiLib.dll" -exec rm -f {} \; - - echo "📂 Files after removal:" - find "$temp_dir" -type f - - # Recreate the .dmapp file - (cd "$temp_dir" && zip -qr "../temp.dmapp" .) - - # Move the new archive back to the original file - mv -f "$temp_dir/../temp.dmapp" "$file" - - # Cleanup - rm -rf "$temp_dir" - - echo "Cleaned $file" - - done - - - uses: actions/upload-artifact@v4 - with: - name: DataMiner Installation Packages (${{ inputs.configuration }} ${{ inputs.solutionFilterName }}) - path: | - **/bin/${{ inputs.configuration }}/*.dmapp - **/bin/${{ inputs.configuration }}/*.zip - **/bin/${{ inputs.configuration }}/**/*.dmapp - **/bin/${{ inputs.configuration }}/**/*.zip - continue-on-error: true - - - name: Authenticate with GitHub CLI - if: inputs.referenceType == 'tag' - run: gh auth login --with-token <<< "${{ secrets.GITHUB_TOKEN }}" - - - name: Find Version Comment - if: inputs.referenceType == 'tag' - id: findVersionComment - run: | - echo "Checking for release notes associated with the reference: '${{ inputs.referenceName }}'" - - # Retrieve the release note body - RELEASE_NOTE=$(gh release view "${{ inputs.referenceName }}" --json body -q '.body' 2>/dev/null || echo "") - - escape_special_chars() { - echo "$1" | sed -e 's/,/%2c/g' -e 's/"/%22/g' -e 's/;/%3b/g' - } - - if [[ -n "$RELEASE_NOTE" ]]; then - ESCAPED_RELEASE_NOTE=$(escape_special_chars "$RELEASE_NOTE") - echo "Release note found for '${{ inputs.referenceName }}': $ESCAPED_RELEASE_NOTE" - # Escape multiline string for GITHUB_OUTPUT - echo "versionComment<> $GITHUB_OUTPUT - echo "$ESCAPED_RELEASE_NOTE" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - else - echo "No release note found for '${{ inputs.referenceName }}'. Falling back to tag or commit message." - VERSION_COMMENT=$(git describe --tags --exact-match 2>/dev/null || git log -1 --pretty=format:%s) - ESCAPED_VERSION_COMMENT=$(escape_special_chars "$VERSION_COMMENT") - echo "Fallback version comment: $ESCAPED_VERSION_COMMENT" - # Escape fallback as well - echo "versionComment=$ESCAPED_VERSION_COMMENT" >> $GITHUB_OUTPUT - fi - shell: bash - - - name: Find branch - if: inputs.referenceType == 'tag' - id: findBranch - run: | - #!/bin/bash - set -e # Exit immediately if a command exits with a non-zero status. - - # Capture the branches containing the tag and process them - branches="$(git branch --contains tags/${{ inputs.referenceName }} -r | grep 'origin/' | grep -vE '.*/.*/' | sed 's#origin/##' | paste -sd ",")" - - # Append to GitHub Actions output - echo "branch=${branches}" >> $GITHUB_OUTPUT - shell: bash - - - name: Target Branch - if: inputs.referenceType == 'tag' - id: showResultBranch - run: echo "${{ steps.findBranch.outputs.branch }}" - - - name: Find Installation package - if: inputs.referenceType == 'tag' - id: findInstallationPackage - run: | - IFS=$'\n' - echo dmappPackageName=$(find '${{ github.workspace }}/Low Code App Editor Package' -type f -name '*.dmapp') >> $GITHUB_OUTPUT - unset IFS - shell: bash - - - name: Target Installation Package - if: inputs.referenceType == 'tag' - id: showResultPackage - run: echo "${{ steps.findInstallationPackage.outputs.dmappPackageName }}" - - - name: Publish To Catalog (Metadata Only) - if: inputs.referenceType == 'branch' && inputs.referenceName == 'main' - shell: pwsh - run: | - dataminer-catalog-upload update-catalog-details ` - --path-to-catalog-yml "${{ github.workspace }}/Low Code App Editor Package/CatalogInformation/manifest.yml" ` - --path-to-readme "${{ github.workspace }}/Low Code App Editor Package/CatalogInformation/README.md" ` - --path-to-images "${{ github.workspace }}/Low Code App Editor Package/CatalogInformation/Images" ` - --dm-catalog-token "${{ secrets.dataminerToken }}" ` - --debug "${{ inputs.debug }}" - - - name: Publish To Catalog - if: inputs.referenceType == 'tag' - env: - DATAMINER_TOKEN: ${{ secrets.dataminerToken }} - shell: pwsh - run: | - dataminer-catalog-upload with-registration ` - --path-to-catalog-yml "${{ github.workspace }}/Low Code App Editor Package/CatalogInformation/manifest.yml" ` - --path-to-readme "${{ github.workspace }}/Low Code App Editor Package/CatalogInformation/README.md" ` - --path-to-images "${{ github.workspace }}/Low Code App Editor Package/CatalogInformation/Images" ` - --dm-catalog-token "${{ secrets.dataminerToken }}" ` - --path-to-artifact "${{ steps.findInstallationPackage.outputs.dmappPackageName }}" ` - --artifact-version ${{ inputs.referenceName }} ` - --branch "${{ steps.findBranch.outputs.branch }}" ` - --debug "${{ inputs.debug }}" \ No newline at end of file diff --git a/.github/workflows/complete.yml b/.github/workflows/complete.yml index e186a6c..9607516 100644 --- a/.github/workflows/complete.yml +++ b/.github/workflows/complete.yml @@ -4,7 +4,8 @@ name: Skyline Reusable Quality Workflow on: # Triggers the workflow on push or pull request events but only for the master branch push: - branches: [] + branches: + - '**' tags: - "[0-9]+.[0-9]+.[0-9]+.[0-9]+" - "[0-9]+.[0-9]+.[0-9]+.[0-9]+-**" @@ -18,17 +19,11 @@ on: jobs: CI: - uses: SkylineCommunications/Low-Code-App-Editor/.github/workflows/DataMiner App Packages Master Workflow Custom.yml@main + uses: SkylineCommunications/_ReusableWorkflows/.github/workflows/Master Workflow.yml@main with: - configuration: Release - referenceName: ${{ github.ref_name }} - runNumber: ${{ github.run_number }} - referenceType: ${{ github.ref_type }} - repository: ${{ github.repository }} - owner: ${{ github.repository_owner }} - sonarCloudProjectName: ${{ vars.SONAR_NAME }} # Go to 'https://sonarcloud.io/projects/create' and create a project. Then create a SONAR_NAME variable with the ID of the project as mentioned in the SonarCloud project URL. - # solutionFilterName: "MySolutionFilter.slnf" + sonarcloud-project-name: ${{ vars.SONAR_NAME }} # Go to 'https://sonarcloud.io/projects/create' and create a project. Then create a SONAR_NAME variable with the ID of the project as mentioned in the SonarCloud project URL. + # solution-filter-name: "MySolutionFilter.slnf" secrets: - dataminerToken: ${{ secrets.DATAMINER_TOKEN }} # The API key: generated in the DCP Admin app (https://admin.dataminer.services/) as authentication for a certain organization. - sonarCloudToken: ${{ secrets.SONAR_TOKEN }} # The API key for access to SonarCloud. - # overrideCatalogDownloadToken: ${{ secrets.OVERRIDE_DATAMINER_TOKEN }} # Override on the dataminerToken for downloading Catalog items: generated in the DCP Admin app (https://admin.dataminer.services/) as authentication for a certain organization. \ No newline at end of file + DATAMINER_TOKEN: ${{ secrets.DATAMINER_TOKEN }} # The API key: generated in the DCP Admin app (https://admin.dataminer.services/) as authentication for a certain organization. + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # The API key for access to SonarCloud. + # OVERRIDE_CATALOG_DOWNLOAD_TOKEN: ${{ secrets.OVERRIDE_DATAMINER_TOKEN }} # Override on the dataminerToken for downloading Catalog items: generated in the DCP Admin app (https://admin.dataminer.services/) as authentication for a certain organization. \ No newline at end of file From 6127719970f23b2bcb924fa0a789d569731b9bb6 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 14:54:54 +0200 Subject: [PATCH 05/15] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- Low Code App Editor/Low Code App Editor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Low Code App Editor/Low Code App Editor.cs b/Low Code App Editor/Low Code App Editor.cs index 1f9506c..0afa5cb 100644 --- a/Low Code App Editor/Low Code App Editor.cs +++ b/Low Code App Editor/Low Code App Editor.cs @@ -48,7 +48,7 @@ DATE VERSION AUTHOR COMMENTS 05/12/2024 1.0.1-CU15 AMA, Skyline Changed some of the names of the Export Dialog to be more readable. 27/12/2024 1.0.1-CU16 AMA, Skyline Added extra check before casting to DMADashboardQueryData when exporting apps. 10/04/2025 1.0.1-CU17 AMA, Skyline Fixed bug where you could import pages/panels from your own app. Added duplicate functionality for pages/panels. -6/05/2025 1.0.1-CU18 AMA, Skyline Fixed bug when deserializing to dynamic properties. Expanded the DOM module search in queries to also look in joins +06/05/2025 1.0.1-CU18 AMA, Skyline Fixed bug when deserializing to dynamic properties. Expanded the DOM module search in queries to also look in joins 14/05/2025 1.0.1-CU19 AMA, Skyline Installer will now create a symbolic link to the WebApiLib.dll **************************************************************************** */ From 2587491fd645621547a533994c3d1de5cb9b2c5b Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 14:55:07 +0200 Subject: [PATCH 06/15] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- Low Code App Editor/UI/ExportDialog.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Low Code App Editor/UI/ExportDialog.cs b/Low Code App Editor/UI/ExportDialog.cs index c1329d7..529ea1f 100644 --- a/Low Code App Editor/UI/ExportDialog.cs +++ b/Low Code App Editor/UI/ExportDialog.cs @@ -38,7 +38,7 @@ public ExportDialog(IEngine engine) : base(engine) Panel.Add(SyncThemes, 11, 1); Panel.Add(new Label("Overwrite Themes:"), 12, 0); Panel.Add(OverwriteThemes, 12, 1); - Panel.Add(new Label("Include Security Settings"), 13, 0); + Panel.Add(new Label("Include Security Settings:"), 13, 0); Panel.Add(IncludeSecuritySettings, 13, 1); Panel.Add(new WhiteSpace(), 14, 0); Panel.Add(BackButton, 15, 0); From 5ae3f941c1e1cc708a271e3dd37304eca9a3e0bd Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 14:55:18 +0200 Subject: [PATCH 07/15] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- Low Code App Editor/Controllers/ExportController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Low Code App Editor/Controllers/ExportController.cs b/Low Code App Editor/Controllers/ExportController.cs index 93633f9..ca543a0 100644 --- a/Low Code App Editor/Controllers/ExportController.cs +++ b/Low Code App Editor/Controllers/ExportController.cs @@ -294,7 +294,7 @@ private static void AddDependenciesToArchive(ZipArchive zip, App app, string scr { if (reference.StartsWith(SolutionLibrariesPath)) { - // DevPacks should be exlcluded + // DevPacks should be excluded continue; } From fb3f592c1271fdc1bb6f0e41755522936fda2003 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 15:21:01 +0200 Subject: [PATCH 08/15] Code review remarks from copilot --- .../Controllers/ExportController.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Low Code App Editor/Controllers/ExportController.cs b/Low Code App Editor/Controllers/ExportController.cs index 93633f9..1176388 100644 --- a/Low Code App Editor/Controllers/ExportController.cs +++ b/Low Code App Editor/Controllers/ExportController.cs @@ -184,17 +184,21 @@ private static void AddAppToArchive(ZipArchive zip, App app, ExportOptions optio // Strip the security settings from the app settings file before adding to the archive var appSettingsPath = Path.Combine(app.Path, "App.info.json"); var appSettings = JObject.Parse(File.ReadAllText(appSettingsPath)); - if (appSettings.ContainsKey("Security")) + if (appSettings.TryGetValue("Security", out var securityToken) && + securityToken is JObject securitySettings) { - var securitySettings = appSettings["Security"] as JObject; - if (securitySettings.ContainsKey("AllowEdit") && (securitySettings["AllowEdit"] as JArray).Count > 0) + if (securitySettings.TryGetValue("AllowEdit", out var allowEditToken) && + allowEditToken is JArray allowEdits && + allowEdits.Count > 0) { - (securitySettings["AllowEdit"] as JArray).Clear(); + allowEdits.Clear(); } - if (securitySettings.ContainsKey("AllowView") && (securitySettings["AllowView"] as JArray).Count > 0) + if (securitySettings.TryGetValue("AllowView", out var allowViewToken) && + allowViewToken is JArray allowViews && + allowViews.Count > 0) { - (securitySettings["AllowView"] as JArray).Clear(); + allowViews.Clear(); } } @@ -216,9 +220,9 @@ private static void AddAppToArchive(ZipArchive zip, App app, ExportOptions optio else { // Include everything - foreach (var version in app.Versions) + foreach (var directory in Directory.GetDirectories(app.Path, "version_*")) { - zip.CreateEntryFromDirectory(Path.Combine(app.Path, $"version_{version.Version} "), Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, $"version_{version.Version}"), true); + zip.CreateEntryFromDirectory(directory, Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, Path.GetFileNameWithoutExtension(directory), true)); } } } From d15cdefc67321e9fe9851c9eaa855b5b707133c8 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 15:29:29 +0200 Subject: [PATCH 09/15] Removed unneeded comment --- Low Code App Editor/Controllers/ExportController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Low Code App Editor/Controllers/ExportController.cs b/Low Code App Editor/Controllers/ExportController.cs index c426525..68671e9 100644 --- a/Low Code App Editor/Controllers/ExportController.cs +++ b/Low Code App Editor/Controllers/ExportController.cs @@ -209,7 +209,6 @@ allowViewToken is JArray allowViews && zip.CreateEntryFromFile(app.PathSettings, Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, "App.info.json")); } - // TODO: Don't auto include the App.info.json file. Just the version folders if (!options.IncludeVersions) { // Just include the general .json file and the latest version From 6f869853b75d0bfdf8fff414b62f69d5c04377a0 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 15:34:25 +0200 Subject: [PATCH 10/15] dll path checking improvement --- Low Code App Editor/Controllers/ExportController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Low Code App Editor/Controllers/ExportController.cs b/Low Code App Editor/Controllers/ExportController.cs index 68671e9..4ef52fc 100644 --- a/Low Code App Editor/Controllers/ExportController.cs +++ b/Low Code App Editor/Controllers/ExportController.cs @@ -295,7 +295,7 @@ private static void AddDependenciesToArchive(ZipArchive zip, App app, string scr var refParams = doc.Descendants(ns + "Param").Where(param => (string)param.Attribute("type") == "ref"); foreach (var reference in refParams.Select(refParam => refParam.Value)) { - if (reference.StartsWith(SolutionLibrariesPath)) + if (reference.StartsWith(SolutionLibrariesPath, StringComparison.InvariantCultureIgnoreCase)) { // DevPacks should be excluded continue; @@ -306,7 +306,7 @@ private static void AddDependenciesToArchive(ZipArchive zip, App app, string scr continue; } - if (reference.StartsWith(DllImportPath)) + if (reference.StartsWith(DllImportPath, StringComparison.InvariantCultureIgnoreCase)) { zip.CreateEntryFromFile(reference, reference.Replace(@"C:\Skyline DataMiner", "AppInstallContent\\Assemblies")); addedFiles.Add(reference.Replace(@"C:\Skyline DataMiner", "AppInstallContent\\Assemblies")); From 06c9f6e41859087d3d0913dd895b745867b5ff71 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 15:39:17 +0200 Subject: [PATCH 11/15] Exclude the install project in analysis --- .editorconfig | 5 ++++- .../Low Code App Editor Installer.csproj | 1 + Low Code App Editor/LCA/App.cs | 11 +++++++---- Low Code App Editor/Low Code App Editor.csproj | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.editorconfig b/.editorconfig index a612a7a..df87dec 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,4 +8,7 @@ end_of_line = crlf trim_trailing_whitespace = true [*.cs] -dotnet_sort_system_directives_first = true \ No newline at end of file +dotnet_sort_system_directives_first = true + +# Skyline ignores +# dotnet_diagnostic.SLC_SC0002.severity = none \ No newline at end of file diff --git a/Low Code App Editor Installer/Low Code App Editor Installer.csproj b/Low Code App Editor Installer/Low Code App Editor Installer.csproj index 3afeaea..d0c628b 100644 --- a/Low Code App Editor Installer/Low Code App Editor Installer.csproj +++ b/Low Code App Editor Installer/Low Code App Editor Installer.csproj @@ -3,6 +3,7 @@ net48 true Install_1 + true AutomationScript diff --git a/Low Code App Editor/LCA/App.cs b/Low Code App Editor/LCA/App.cs index a0eb0df..1081f84 100644 --- a/Low Code App Editor/LCA/App.cs +++ b/Low Code App Editor/LCA/App.cs @@ -1,4 +1,7 @@ -// Ignore Spelling: App LCA +using Skyline.DataMiner.Utils.SecureCoding.SecureSerialization.Json.Newtonsoft; + +using System.Collections.Generic; +// Ignore Spelling: App LCA namespace Low_Code_App_Editor.LCA { @@ -31,7 +34,7 @@ public App(string path) // Load general settings file var settingsFile = File.ReadAllText(System.IO.Path.Combine(path, "App.info.json")); - Settings = JsonConvert.DeserializeObject(settingsFile); + Settings = SecureNewtonsoftDeserialization.DeserializeObject(settingsFile); // Load version history var versions = new string[0]; @@ -49,7 +52,7 @@ public App(string path) var versionPath = System.IO.Path.Combine(versionDirectory, "App.config.json"); if (File.Exists(versionPath)) { - var version = JsonConvert.DeserializeObject(File.ReadAllText(versionPath), settings); + var version = SecureNewtonsoftDeserialization.DeserializeObject(File.ReadAllText(versionPath), settings); version.Path = versionPath; Versions.Add(version); } @@ -65,7 +68,7 @@ public App(string path) var versionPath = System.IO.Path.Combine(versionDirectory, "App.config.json"); if (File.Exists(versionPath)) { - var version = JsonConvert.DeserializeObject(File.ReadAllText(versionPath), settings); + var version = SecureNewtonsoftDeserialization.DeserializeObject(File.ReadAllText(versionPath), settings); version.Path = versionPath; Versions.Add(version); } diff --git a/Low Code App Editor/Low Code App Editor.csproj b/Low Code App Editor/Low Code App Editor.csproj index e989bce..f30dffc 100644 --- a/Low Code App Editor/Low Code App Editor.csproj +++ b/Low Code App Editor/Low Code App Editor.csproj @@ -16,6 +16,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive From 4a630a11433d3bf02c156774a7ec985b1e0d388d Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 15:50:55 +0200 Subject: [PATCH 12/15] Secure coding --- .editorconfig | 3 ++- Low Code App Editor/LCA/App.cs | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.editorconfig b/.editorconfig index df87dec..202ea4a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,4 +11,5 @@ trim_trailing_whitespace = true dotnet_sort_system_directives_first = true # Skyline ignores -# dotnet_diagnostic.SLC_SC0002.severity = none \ No newline at end of file +dotnet_diagnostic.SLC_SC0001.severity = none +dotnet_diagnostic.SLC_SC0002.severity = none \ No newline at end of file diff --git a/Low Code App Editor/LCA/App.cs b/Low Code App Editor/LCA/App.cs index 1081f84..33bc493 100644 --- a/Low Code App Editor/LCA/App.cs +++ b/Low Code App Editor/LCA/App.cs @@ -1,7 +1,4 @@ -using Skyline.DataMiner.Utils.SecureCoding.SecureSerialization.Json.Newtonsoft; - -using System.Collections.Generic; -// Ignore Spelling: App LCA +// Ignore Spelling: App LCA namespace Low_Code_App_Editor.LCA { @@ -14,6 +11,7 @@ namespace Low_Code_App_Editor.LCA using Newtonsoft.Json; + using Skyline.DataMiner.Utils.SecureCoding.SecureSerialization.Json.Newtonsoft; using Skyline.DataMiner.Web.Common.v1; public class App @@ -27,7 +25,6 @@ public class App }, }; - public App(string path) { Path = path; From c6edc974cf40e32d130454dc65232901bc349469 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 16:10:44 +0200 Subject: [PATCH 13/15] Remove the WebApiLib from the install package after build --- .../Low Code App Editor Package.csproj | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Low Code App Editor Package/Low Code App Editor Package.csproj b/Low Code App Editor Package/Low Code App Editor Package.csproj index cc48be4..3c8d28e 100644 --- a/Low Code App Editor Package/Low Code App Editor Package.csproj +++ b/Low Code App Editor Package/Low Code App Editor Package.csproj @@ -25,4 +25,46 @@ true + + + + + + + + + + + + string.Equals(e.FullName.Replace('\\', '/'), normalizedEntry, System.StringComparison.OrdinalIgnoreCase)); + if (entry != null) + { + entry.Delete(); + Log.LogMessage(MessageImportance.High, "Removed '" + entry.FullName + "' from " + ZipFilePath); + } + else + { + Log.LogMessage(MessageImportance.High, "Entry '" + EntryPath + "' not found in zip, nothing to remove."); + } + } + ]]> + + + + + + + $(MSBuildProjectDirectory)\$(OutputPath)DataMinerBuild\$(AssemblyName).$(Version).dmapp + + + \ No newline at end of file From de9c764413d48702f51d112806d54f2382016232 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 16:22:24 +0200 Subject: [PATCH 14/15] Fix for the newtonsoft version conflict --- Low Code App Editor/Controllers/ExportController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Low Code App Editor/Controllers/ExportController.cs b/Low Code App Editor/Controllers/ExportController.cs index 4ef52fc..78462a9 100644 --- a/Low Code App Editor/Controllers/ExportController.cs +++ b/Low Code App Editor/Controllers/ExportController.cs @@ -202,7 +202,7 @@ allowViewToken is JArray allowViews && } } - zip.CreateEntryFromText(Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, "App.info.json"), appSettings.ToString(Formatting.None)); + zip.CreateEntryFromText(Path.Combine("AppInstallContent", "CompanionFiles", "LCA", app.LatestVersion.ID, "App.info.json"), appSettings.ToString(Formatting.None, Array.Empty())); } else { From a9375a7cc2d2f4d77419a830e348a6e1c7318392 Mon Sep 17 00:00:00 2001 From: Arne Maes Date: Mon, 18 May 2026 16:30:19 +0200 Subject: [PATCH 15/15] readme update --- .../Images/ExportDialog.png | Bin 51650 -> 46285 bytes README.md | 3 +++ 2 files changed, 3 insertions(+) diff --git a/Low Code App Editor Package/CatalogInformation/Images/ExportDialog.png b/Low Code App Editor Package/CatalogInformation/Images/ExportDialog.png index dc668da1ed459077c4b4db1c04f638d4f91d2c62..7d32f5d4777f9573b3e537b862a46da762f66427 100644 GIT binary patch literal 46285 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%0DN{dy>>D}WCp%iodf>H0kB+Rt7Mr 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 VbmC|r4@?jOHN1MEM&ISmKLA=I=4t={ literal 51650 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

yR~Dp%m3B7fcnM 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 diff --git a/README.md b/README.md index 80fa654..b9942b1 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,9 @@ This options will sync the themes.json file across the DMS This options will overwrite the existing themes if there are already matching themes found. The matching is based on the theme name. +##### 13. Include Security Settings + +When enabled this will keep the Security settings of the app. By default it is disabled because the editor cannot be sure the exact users and groups exists on the importing system. In case you know that both systems match, then you can enable it and the exporter will keep the settings as they are. #### Overview of included items - Custom operators