From 42c29f72134917bb6133ff875e6620067f99d410 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Fri, 2 Oct 2026 15:18:50 +0200 Subject: [PATCH 01/57] fix(cmdb-import): store End-of-Life Functioneel as the file has it The CMDB sheets write 2036-01-01 (serial 49675) when TOPdesk has no end-of-life date. The import read that value as empty; the municipality wants the date kept as the export has it. "NB" in BNN Classificatie stays empty, since bbnLevel only takes BBN1-3. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/features/cmdb-import.md | 9 +++++---- lib/Settings/cmdb-import/topdesk-profile.json | 3 +-- openspec/changes/cmdb-export-import/design.md | 7 +++---- .../specs/cmdb-export-import/spec.md | 5 +++-- openspec/changes/cmdb-export-import/tasks.md | 2 +- tests/Unit/Service/Cmdb/CmdbImportProfileTest.php | 2 +- tests/Unit/Service/CmdbExportImportServiceTest.php | 10 +++++----- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 5167ccda..7c8bfa64 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -117,9 +117,10 @@ External data connections, Power Query queries and links in the workbook are never opened. Macro-enabled workbooks (`.xlsm`), old Excel files (`.xls`) and CSV files are not accepted. -**Placeholder values.** The CMDB sheets fill some empty cells with a -placeholder. These are read as empty: `NB` in `BNN Classificatie`, and the -date 2036-01-01 (Excel serial 49675) in `End-of-Life Functioneel`. +**Placeholder values.** The CMDB sheets fill an empty `BNN Classificatie` +with `NB` ("niet bekend"); that is read as empty. Dates are stored as the +file has them: the CMDB's 2036-01-01 in `End-of-Life Functioneel` is imported +as 2036-01-01. ### Columns and where they go @@ -137,7 +138,7 @@ date 2036-01-01 (Excel serial 49675) in `End-of-Life Functioneel`. | Vendor | Supplier organisation, set as provider on the module and the usage | one organisation per name, see below | | Applicatie Status | usage status | In productie → In production, In voorraad → Planned, In ontwikkeling → Acquisition, Uit te faseren → To be phased out, Uitgefaseerd → Phased out; another value is dropped with a warning | | Classificatie | usage TIME classification | Tolereren/Tolerate, Investeren/Invest, Migreren/Migrate, Elimineren/Eliminate | -| End-of-Life Functioneel | usage phase-out date | Excel date; 2036-01-01 is empty | +| End-of-Life Functioneel | usage phase-out date | Excel date, stored as is | | (the sheet), Cluster, Applicatie Eigenaar (Afdeling) | usage internal annotation | `Beheer geregeld: ja` or `nee`, the cluster and the department, joined with ` / `; written only when the usage is new or the note is empty | | Applicatie Eigenaar (Persoon), Applicatie Eigenaar (Functie) | usage business owner (contact person) | see [Owners](#owners) | diff --git a/lib/Settings/cmdb-import/topdesk-profile.json b/lib/Settings/cmdb-import/topdesk-profile.json index 88ddf79d..cc18881d 100644 --- a/lib/Settings/cmdb-import/topdesk-profile.json +++ b/lib/Settings/cmdb-import/topdesk-profile.json @@ -22,8 +22,7 @@ "dateColumns": ["Datum", "Referentie datum wijziging", "End-of-Life Functioneel"], "idColumns": ["APPID"], "emptyValues": { - "BNN Classificatie": ["NB"], - "End-of-Life Functioneel": ["49675"] + "BNN Classificatie": ["NB"] }, "externalKeyPrefix": "topdesk", "packs": { diff --git a/openspec/changes/cmdb-export-import/design.md b/openspec/changes/cmdb-export-import/design.md index 5d620080..e5cd34d8 100644 --- a/openspec/changes/cmdb-export-import/design.md +++ b/openspec/changes/cmdb-export-import/design.md @@ -107,7 +107,7 @@ External connections, the Power Query package and hyperlinks are never resolved: `CmdbRowNormaliser` turns reader output into the flat `column => string` row the engine expects: -- Values listed in the profile's `emptyValues` for their column become empty, compared case-insensitively before any conversion: `NB` in "BNN Classificatie" (the CMDB sheet's "niet bekend") and `49675` (2036-01-01) in "End-of-Life Functioneel" (the CMDB sheet's placeholder for "no end-of-life date"; its formula turns an empty date, or TOPdesk's 2099-12-31, into 49675). +- Values listed in the profile's `emptyValues` for their column become empty, compared case-insensitively before any conversion: `NB` in "BNN Classificatie" (the CMDB sheet's "niet bekend"). Dates are stored as the file has them: "End-of-Life Functioneel" `49675` (2036-01-01) is imported as that date, even though the CMDB sheet's formula writes it for an empty date or TOPdesk's 2099-12-31; the municipality decided to keep the file's value (2026-10-02). - Columns listed in the profile's `dateColumns` ("Datum", "Referentie datum wijziging", "End-of-Life Functioneel"): a numeric value is converted with `PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject()` in UTC and written as `Y-m-d`. For example, `45111.38…` becomes `2023-07-04` and `53359` becomes `2046-02-01`. A non-numeric value stays as it is, so the pack's `date` transform (`sourceFormat: Y-m-d`) either accepts it or reports a warning. - Columns listed in `idColumns` ("APPID"): a whole number becomes a string without a decimal part (`1234.0` becomes `"1234"`). - The constants of the row's sheet are added before mapping (`Beheer` = `Beheer geregeld: nee` on "Onbeh", `ja` on "Beheerde"), so the usage pack can map the sheet like a column. @@ -213,7 +213,7 @@ Source columns of "Onbeh Applicaties CMDB" and "Beheerde Applicaties CMDB" and w | Vendor | both | organization (Supplier) via module.provider and usage.provider | dedup on normalised name (D7) | | Applicatie Status | both | usage.status | lookup: In productie → In production, In voorraad → Planned, In ontwikkeling → Acquisition, Uit te faseren → To be phased out, Uitgefaseerd → Phased out; unknown value: warning | | Classificatie | both | usage.timeClassification | lookup Tolereren/Tolerate, Investeren/Invest, Migreren/Migrate, Elimineren/Eliminate | -| End-of-Life Functioneel | both | usage.startDateOutPhased | `49675` (2036-01-01) is empty; Excel serial to date | +| End-of-Life Functioneel | both | usage.startDateOutPhased | Excel serial to date, stored as is (2036-01-01 included) | | (sheet constant `Beheer`), Cluster, Applicatie Eigenaar (Afdeling) | both | usage.interneAnnotation | concat with " / ", empty parts dropped, create-only; `Beheer geregeld: nee` (Onbeh) or `ja` (Beheerde) | | Applicatie Eigenaar (Persoon), Applicatie Eigenaar (Functie) | both | usage.businessOwner (contactPerson + Nextcloud contact; role = Functie) | D8; the person column may hold a function | | Hostingpartij | both | not mapped | follow-up; "Leverancier" (where the municipality buys the software) is not on the CMDB sheets | @@ -415,7 +415,7 @@ The seeds show the new properties in a fresh install. They carry no `publication - [Long synchronous request] → Per-row progress, cancel, and "unchanged" rows skip the save. About 1,100 rows is expected to fit. A background job is a follow-up if it does not. - [OpenRegister internals (`MappingEngine`, `PackDefinitionValidator`, PhpSpreadsheet) change shape] → Guarded resolution with 503, and a contract test that maps the fixture through the real engine in the dev environment. - [Provisional lookups for Applicatiesoort and BNN Classificatie] → The values of the first real import were not kept (the report lives in the progress cache for an hour). The maps hold the values the anonymised export and the CMDB formulas show (`Saas`, `Webapplicatie`, `NB`) plus the usual spellings. An unknown value is a warning, never a wrong value; once the municipality lists its values, the maps in the JSON are extended, with no code change. -- [CMDB placeholders] → "End-of-Life Functioneel" `2036-01-01` and "BNN Classificatie" `NB` are read as empty. A real end-of-life date of exactly 2036-01-01 would be lost; the municipality confirms. "Classificatie" defaults to `Tolereren` on "Beheerde" when TOPdesk has none; that cannot be told apart from a real `Tolereren` and is imported as Tolerate. +- [CMDB placeholders] → "BNN Classificatie" `NB` is read as empty. "End-of-Life Functioneel" and "Classificatie" are stored as the file has them: the sheet's 2036-01-01 (written for an empty date) is imported as that date, and the `Tolereren` the "Beheerde" formula writes when TOPdesk has none is imported as Tolerate. - [An application moves between the sheets] → Same APPID, so the same module and usage; the usage note (create-only) keeps its old `Beheer geregeld` line when it is not empty. - [An unknown status on create falls back to the usage schema's default "In production"] → Accepted. The warning in the report makes it visible. - [The fragment version is overwritten by merge order] → Filename ordering plus a unit test on the merged version (Mixed-spec rationale). @@ -427,6 +427,5 @@ No data migration. The register fragment deploys with the existing repair-step r ## Open Questions - Which "Applicatiesoort" and "BNN Classificatie" values occur in the municipality's real export, and which hosting model does each mean (lookup maps)? -- Is 2036-01-01 in "End-of-Life Functioneel" always the placeholder, and should a "Beheerde" row without a TIME class really be Tolerate? - Should the maintenance status update the usage note on re-import (it is create-only today), or get a field of its own? - Should OpenRegister promote `MigrationPack\MappingEngine` to its `Contract` namespace? diff --git a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md index 92ccf2d7..e15e3fe7 100644 --- a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md +++ b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md @@ -133,7 +133,7 @@ The request SHALL carry either `municipalityUuid`, the uuid of an existing stack ### Requirement: REQ-CMDB-005 Field mapping SHALL be declarative and executed by OpenRegister's mapping engine -The service SHALL map each normalised row with OpenRegister's `MigrationPack\MappingEngine::mapRow()`, once per target pack: module, manufacturer, municipality, usage, business owner. The packs and the import profile SHALL ship as JSON under `lib/Settings/cmdb-import/`. Each pack SHALL pass OpenRegister's `PackDefinitionValidator` when the import starts; an invalid pack, or a missing `MappingEngine`, SHALL stop the import with 503 `MAPPING_UNAVAILABLE` before any row is read. Before mapping, the service SHALL convert the cells of the profile's date columns from Excel serial numbers to `Y-m-d`, SHALL turn numeric id cells into strings without a decimal part, SHALL read a value the profile lists as empty for its column (`NB` in "BNN Classificatie", serial `49675` in "End-of-Life Functioneel") as empty, and SHALL add the constants of the row's sheet (`Beheer` = `Beheer geregeld: nee` or `ja`). A mapping error on a mapping marked `required` in the module pack SHALL skip the row. In the manufacturer and owner packs it SHALL mean the row has no manufacturer or no such owner, without a warning. A mapping error on any other mapping SHALL drop only that field and add a row warning naming the column and the value. The reader SHALL keep only the columns that the profile or a pack references, and SHALL discard every other cell when it reads the row. +The service SHALL map each normalised row with OpenRegister's `MigrationPack\MappingEngine::mapRow()`, once per target pack: module, manufacturer, municipality, usage, business owner. The packs and the import profile SHALL ship as JSON under `lib/Settings/cmdb-import/`. Each pack SHALL pass OpenRegister's `PackDefinitionValidator` when the import starts; an invalid pack, or a missing `MappingEngine`, SHALL stop the import with 503 `MAPPING_UNAVAILABLE` before any row is read. Before mapping, the service SHALL convert the cells of the profile's date columns from Excel serial numbers to `Y-m-d`, SHALL turn numeric id cells into strings without a decimal part, SHALL read a value the profile lists as empty for its column (`NB` in "BNN Classificatie"; dates, "End-of-Life Functioneel" included, are kept as the file has them) as empty, and SHALL add the constants of the row's sheet (`Beheer` = `Beheer geregeld: nee` or `ja`). A mapping error on a mapping marked `required` in the module pack SHALL skip the row. In the manufacturer and owner packs it SHALL mean the row has no manufacturer or no such owner, without a warning. A mapping error on any other mapping SHALL drop only that field and add a row warning naming the column and the value. The reader SHALL keep only the columns that the profile or a pack references, and SHALL discard every other cell when it reads the row. #### Scenario: Excel serial dates are converted before mapping @e2e exclude Pure transformation; tests/Unit/Service/Cmdb/CmdbRowNormaliserTest.php asserts the conversions below. @@ -142,7 +142,8 @@ The service SHALL map each normalised row with OpenRegister's `MigrationPack\Map - **WHEN** the rows are normalised - **THEN** "Datum" SHALL be `2023-07-04`, "Referentie datum wijziging" SHALL be `2026-07-29`, and "End-of-Life Functioneel" SHALL be `2046-02-01` - **AND** "APPID" `1234` SHALL be the string `"1234"` -- **AND** "End-of-Life Functioneel" `49675` and "BNN Classificatie" `NB` SHALL be empty +- **AND** "BNN Classificatie" `NB` SHALL be empty +- **AND** "End-of-Life Functioneel" `49675` SHALL be `2036-01-01` #### Scenario: Changing a pack changes the mapping without code @e2e exclude Configuration behaviour; tests/Unit/Service/CmdbExportImportServiceTest.php loads an alternate module pack that maps "Software Suite" to licentietype and asserts the mapped module. diff --git a/openspec/changes/cmdb-export-import/tasks.md b/openspec/changes/cmdb-export-import/tasks.md index a04d3196..8e0c3c39 100644 --- a/openspec/changes/cmdb-export-import/tasks.md +++ b/openspec/changes/cmdb-export-import/tasks.md @@ -42,7 +42,7 @@ Spec: `openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md` (`S - GIVEN the formula/connection fixture WHEN it is read THEN "Applicatie Naam" is `Rekenmodel`, "Roepnaam" is empty and listed in the row's `uncached`, `getCalculatedValue()` is never called, and no HTTP client is involved - GIVEN the shuffled fixture WHEN it is read THEN rows equal those of the original; GIVEN the missing-column fixture THEN `MISSING_COLUMN` names `APPID` and `Beheerde Applicaties CMDB`; GIVEN only "Blad1" THEN `NO_SOURCE_SHEET`; GIVEN more than `maxRowsPerSheet` rows THEN `TOO_MANY_ROWS` - GIVEN a text file named `.xlsx`, or a `.xlsm` WHEN checked THEN `NOT_XLSX` before PhpSpreadsheet is touched; GIVEN PhpSpreadsheet absent THEN `READER_UNAVAILABLE` - - GIVEN serials `45111.380322627316`, `46232.552113113423`, `53359` and id `1234.0` WHEN normalised THEN `2023-07-04`, `2026-07-29`, `2046-02-01` and `"1234"`; GIVEN "BNN Classificatie" `NB` and "End-of-Life Functioneel" `49675` THEN both are empty + - GIVEN serials `45111.380322627316`, `46232.552113113423`, `53359` and id `1234.0` WHEN normalised THEN `2023-07-04`, `2026-07-29`, `2046-02-01` and `"1234"`; GIVEN "BNN Classificatie" `NB` THEN it is empty; GIVEN "End-of-Life Functioneel" `49675` THEN it is `2036-01-01` - [x] Implement - [x] Test diff --git a/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php b/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php index fe36e789..b5bd4e44 100644 --- a/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php +++ b/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php @@ -146,7 +146,7 @@ public function testThePacksImplementTheColumnTable(): void { $this->assertSame(['Beheer' => 'Beheer geregeld: ja'], $profile->sheetConstants(sheetName: 'Beheerde Applicaties CMDB')); $this->assertSame(['Nickname'], $profile->absentColumns(sheetName: 'Onbeh Applicaties CMDB')); $this->assertSame([], $profile->absentColumns(sheetName: 'Beheerde Applicaties CMDB')); - $this->assertSame(['BNN Classificatie' => ['NB'], 'End-of-Life Functioneel' => ['49675']], $profile->emptyValues()); + $this->assertSame(['BNN Classificatie' => ['NB']], $profile->emptyValues()); $this->assertSame(10485760, $profile->maxFileBytes()); $this->assertSame(10000, $profile->maxRowsPerSheet()); }//end testThePacksImplementTheColumnTable() diff --git a/tests/Unit/Service/CmdbExportImportServiceTest.php b/tests/Unit/Service/CmdbExportImportServiceTest.php index cde666c2..291063e2 100644 --- a/tests/Unit/Service/CmdbExportImportServiceTest.php +++ b/tests/Unit/Service/CmdbExportImportServiceTest.php @@ -576,7 +576,7 @@ public function testTheFixtureCreatesModulesUsagesAndSuppliers(): void { $this->assertSame($municipality, $aia['consumer']); $this->assertSame('Planned', $aia['status']); $this->assertSame('Beheer geregeld: nee / H10 / H10 Accounting', $aia['interneAnnotation']); - $this->assertArrayNotHasKey('startDateOutPhased', $aia, 'the CMDB placeholder 2036-01-01 means no date'); + $this->assertSame('2036-01-01', $aia['startDateOutPhased'], 'the end-of-life date is stored as the file has it'); $this->assertArrayNotHasKey('timeClassification', $aia); $this->assertSame($supplierByName['Aangetekend B.V.'], $aia['provider']); $app = $usageByModule[$beheerd['id']]; @@ -821,11 +821,11 @@ public function testTheSheetRecordsWhetherMaintenanceIsArranged(): void { }//end testTheSheetRecordsWhetherMaintenanceIsArranged() /** - * "NB" in BNN Classificatie and the CMDB end-of-life placeholder (serial 49675) mean empty: no field, no warning. + * "NB" in BNN Classificatie means empty (no field, no warning); an end-of-life date is stored as the file has it, 2036-01-01 included. * * @return void */ - public function testTheCmdbPlaceholdersMeanEmpty(): void { + public function testNbMeansEmptyAndEndOfLifeIsStoredAsIs(): void { $this->seedOrganisation(uuid: 'muni-1', name: 'Gemeente Voorbeeldstad', type: 'Municipality'); $rows = [ $this->row(appId: '1', cells: ['BNN Classificatie' => 'NB', 'End-of-Life Functioneel' => 49675]), @@ -839,10 +839,10 @@ public function testTheCmdbPlaceholdersMeanEmpty(): void { $this->assertArrayNotHasKey('bbnLevel', $modules[1]); $this->assertSame('BBN3', $modules[2]['bbnLevel']); $usages = array_column($this->objects(self::USAGE), null, 'module'); - $this->assertArrayNotHasKey('startDateOutPhased', $usages[$modules[1]['id']]); + $this->assertSame('2036-01-01', $usages[$modules[1]['id']]['startDateOutPhased']); $this->assertSame('2046-02-01', $usages[$modules[2]['id']]['startDateOutPhased']); $this->assertSame('Migrate', $usages[$modules[2]['id']]['timeClassification']); - }//end testTheCmdbPlaceholdersMeanEmpty() + }//end testNbMeansEmptyAndEndOfLifeIsStoredAsIs() /** * A formula without a cached value reads as empty and warns on its row; the row is still imported. From a9f5672670a98c5fe6602e5f4034e25a59da9c39 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Fri, 2 Oct 2026 16:17:47 +0200 Subject: [PATCH 02/57] fix(cmdb-import): map the values the municipality's export holds The first full import of the Rotterdam export raised 466 warnings, all from lookups that did not know a value: - Applicatiesoort is an application kind (Webapplicatie, Client/server, Saas, ...), not a hosting model. It is now kept as is in the new module property applicationType; only SaaS/PaaS/IaaS/on-premises also set cloudDienstverleningsmodel, and any other kind leaves it empty without a warning (lookup default null, left out by the service). - BNN Classificatie holds 1, 2 and 2+; they map to BBN1, BBN2 and BBN2+. The register fragment adds BBN2+ to the bbnLevel enum (module 0.3.7). - Applicatie Status had five unmapped statuses, which fell back to the schema default In production; they now map to the lifecycle they mean. - Classificatie "1. Tolereren (wordt ingelezen)" maps to Tolerate. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/features/cmdb-import.md | 8 ++-- lib/Service/CmdbExportImportService.php | 5 ++- lib/Settings/cmdb-import/topdesk-module.json | 10 +++-- lib/Settings/cmdb-import/topdesk-usage.json | 10 ++++- .../register.d/topdesk-cmdb-import.json | 14 ++++++- openspec/changes/cmdb-export-import/design.md | 11 +++--- .../specs/cmdb-export-import/spec.md | 5 ++- .../Service/Cmdb/CmdbImportProfileTest.php | 5 ++- .../Service/CmdbExportImportServiceTest.php | 38 +++++++++++++++++-- .../Unit/Settings/TopdeskCmdbFragmentTest.php | 14 ++++--- 10 files changed, 90 insertions(+), 30 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 7c8bfa64..4109558a 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -131,13 +131,13 @@ as 2036-01-01. | Applicatie Code | module external id | reference only; it can change in TOPdesk, so it is not the match key | | Roepnaam, Nickname | module short description | Roepnaam when filled, otherwise Nickname (only on `Beheerde Applicaties CMDB`) | | Functionele Omschrijving | module long description | | -| Applicatiesoort | module hosting model (`cloudDienstverleningsmodel`) | `Saas` → SaaS, `PaaS` → PaaS, `IaaS` → IaaS, `On-premise(s)` → On-premises (self-managed); another value is dropped with a warning | -| BNN Classificatie | module BBN level | `BBN1`/`BBN 1`/`BNN1` etc. become `BBN1`, `BBN2`, `BBN3`; `NB` is empty; another value is dropped with a warning | +| Applicatiesoort | module application type (`applicationType`) and hosting model (`cloudDienstverleningsmodel`) | stored as is as the application type (Webapplicatie, Client/server, Saas, …); `Saas` → SaaS, `PaaS` → PaaS, `IaaS` → IaaS, `On-premise(s)` → On-premises (self-managed) also set the hosting model, any other kind leaves it empty | +| BNN Classificatie | module BBN level | `1`, `2`, `2+`, `3` (and `BBN1`/`BBN 1`/`BNN1` etc.) become `BBN1`, `BBN2`, `BBN2+`, `BBN3`; `NB` is empty; another value is dropped with a warning | | Datum | module external creation date | Excel date | | Referentie datum wijziging | module external modification date | Excel date | | Vendor | Supplier organisation, set as provider on the module and the usage | one organisation per name, see below | -| Applicatie Status | usage status | In productie → In production, In voorraad → Planned, In ontwikkeling → Acquisition, Uit te faseren → To be phased out, Uitgefaseerd → Phased out; another value is dropped with a warning | -| Classificatie | usage TIME classification | Tolereren/Tolerate, Investeren/Invest, Migreren/Migrate, Elimineren/Eliminate | +| Applicatie Status | usage status | In productie → In production, In voorraad → Planned, In ontwikkeling → Acquisition, Uit te faseren and Moet verwijderd worden → To be phased out, Uitgefaseerd and Verwijderd → Phased out, Besteld and Wordt getest → Acquisition, Stand-by voor continuïteit → In production; another value is dropped with a warning | +| Classificatie | usage TIME classification | Tolereren/Tolerate (also `1. Tolereren (wordt ingelezen)`), Investeren/Invest, Migreren/Migrate, Elimineren/Eliminate | | End-of-Life Functioneel | usage phase-out date | Excel date, stored as is | | (the sheet), Cluster, Applicatie Eigenaar (Afdeling) | usage internal annotation | `Beheer geregeld: ja` or `nee`, the cluster and the department, joined with ` / `; written only when the usage is new or the note is empty | | Applicatie Eigenaar (Persoon), Applicatie Eigenaar (Functie) | usage business owner (contact person) | see [Owners](#owners) | diff --git a/lib/Service/CmdbExportImportService.php b/lib/Service/CmdbExportImportService.php index 793e9b83..e97ef326 100644 --- a/lib/Service/CmdbExportImportService.php +++ b/lib/Service/CmdbExportImportService.php @@ -624,7 +624,10 @@ private function map(string $target, array $values, int $rowNumber, array &$warn } } - $data = ($result['data'] ?? []); + // A lookup whose default is null maps a known "no value" (an Applicatiesoort + // that is not a hosting model) to null; that field is left out, as an empty + // cell is, so an update never blanks what the field already holds. + $data = array_filter(($result['data'] ?? []), static fn ($value): bool => $value !== null); unset($data['id']); return ['data' => $data, 'missing' => array_values(array_unique($missing))]; diff --git a/lib/Settings/cmdb-import/topdesk-module.json b/lib/Settings/cmdb-import/topdesk-module.json index e5580d97..3a7ca749 100644 --- a/lib/Settings/cmdb-import/topdesk-module.json +++ b/lib/Settings/cmdb-import/topdesk-module.json @@ -1,7 +1,7 @@ { "id": "stackiq-topdesk-module", "name": "TOPdesk CMDB export to stackiq module", - "description": "One application row of a CMDB sheet becomes a stackiq module. A mapping marked required that fails skips the row; any other failing mapping drops that field with a warning. Nickname and Roepnaam both feed shortDescription; Roepnaam wins when both are filled.", + "description": "One application row of a CMDB sheet becomes a stackiq module. A mapping marked required that fails skips the row; any other failing mapping drops that field with a warning. Nickname and Roepnaam both feed shortDescription; Roepnaam wins when both are filled. Applicatiesoort is kept as is in applicationType; only its SaaS/PaaS/IaaS/on-premises values also set the hosting model, every other kind leaves that empty without a warning.", "sourceFormat": "excel", "version": "2.0.0", "fieldMappings": [ @@ -11,6 +11,7 @@ { "source": "Nickname", "target": "shortDescription", "transform": { "type": "trim" } }, { "source": "Roepnaam", "target": "shortDescription", "transform": { "type": "trim" } }, { "source": "Functionele Omschrijving", "target": "longDescription", "transform": { "type": "trim" } }, + { "source": "Applicatiesoort", "target": "applicationType", "transform": { "type": "trim" } }, { "source": "Applicatiesoort", "target": "cloudDienstverleningsmodel", @@ -21,7 +22,8 @@ "Paas": ["PaaS"], "PaaS": ["PaaS"], "PAAS": ["PaaS"], "Iaas": ["IaaS"], "IaaS": ["IaaS"], "IAAS": ["IaaS"], "On-premise": ["On-premises (self-managed)"], "On-premises": ["On-premises (self-managed)"], "On premise": ["On-premises (self-managed)"] - } + }, + "default": null } }, { @@ -32,7 +34,9 @@ "map": { "BBN1": "BBN1", "BBN 1": "BBN1", "bbn1": "BBN1", "bbn 1": "BBN1", "BNN1": "BBN1", "BNN 1": "BBN1", "BBN2": "BBN2", "BBN 2": "BBN2", "bbn2": "BBN2", "bbn 2": "BBN2", "BNN2": "BBN2", "BNN 2": "BBN2", - "BBN3": "BBN3", "BBN 3": "BBN3", "bbn3": "BBN3", "bbn 3": "BBN3", "BNN3": "BBN3", "BNN 3": "BBN3" + "BBN3": "BBN3", "BBN 3": "BBN3", "bbn3": "BBN3", "bbn 3": "BBN3", "BNN3": "BBN3", "BNN 3": "BBN3", + "1": "BBN1", "2": "BBN2", "2+": "BBN2+", "3": "BBN3", + "BBN2+": "BBN2+", "BBN 2+": "BBN2+", "BNN2+": "BBN2+", "BNN 2+": "BBN2+" } } }, diff --git a/lib/Settings/cmdb-import/topdesk-usage.json b/lib/Settings/cmdb-import/topdesk-usage.json index 12ae459f..0038df19 100644 --- a/lib/Settings/cmdb-import/topdesk-usage.json +++ b/lib/Settings/cmdb-import/topdesk-usage.json @@ -15,7 +15,12 @@ "In voorraad": "Planned", "In ontwikkeling": "Acquisition", "Uit te faseren": "To be phased out", - "Uitgefaseerd": "Phased out" + "Uitgefaseerd": "Phased out", + "Moet verwijderd worden": "To be phased out", + "Verwijderd": "Phased out", + "Besteld": "Acquisition", + "Wordt getest": "Acquisition", + "Stand-by voor continuïteit": "In production" } } }, @@ -28,7 +33,8 @@ "Tolerate": "Tolerate", "Tolereren": "Tolerate", "Invest": "Invest", "Investeren": "Invest", "Migrate": "Migrate", "Migreren": "Migrate", - "Eliminate": "Eliminate", "Elimineren": "Eliminate" + "Eliminate": "Eliminate", "Elimineren": "Eliminate", + "1. Tolereren (wordt ingelezen)": "Tolerate" } } }, diff --git a/lib/Settings/register.d/topdesk-cmdb-import.json b/lib/Settings/register.d/topdesk-cmdb-import.json index 1f226ed5..2bd310c3 100644 --- a/lib/Settings/register.d/topdesk-cmdb-import.json +++ b/lib/Settings/register.d/topdesk-cmdb-import.json @@ -2,7 +2,7 @@ "components": { "schemas": { "module": { - "version": "0.3.5", + "version": "0.3.7", "properties": { "externalId": { "type": "string", @@ -51,6 +51,18 @@ "visible": true, "facetable": false, "order": 64 + }, + "applicationType": { + "type": "string", + "title": "Application type", + "description": "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.", + "maxLength": 100, + "visible": true, + "facetable": true, + "order": 65 + }, + "bbnLevel": { + "enum": ["BBN2+"] } } } diff --git a/openspec/changes/cmdb-export-import/design.md b/openspec/changes/cmdb-export-import/design.md index e5cd34d8..1994c055 100644 --- a/openspec/changes/cmdb-export-import/design.md +++ b/openspec/changes/cmdb-export-import/design.md @@ -206,13 +206,13 @@ Source columns of "Onbeh Applicaties CMDB" and "Beheerde Applicaties CMDB" and w | Roepnaam | both | module.shortDescription | trim; wins over Nickname | | Nickname | Beheerde | module.shortDescription | trim; used when Roepnaam is empty; listed as absent on Onbeh | | Functionele Omschrijving | both | module.longDescription | trim | -| Applicatiesoort | both | module.cloudDienstverleningsmodel | lookup: `Saas`/`SaaS` → `["SaaS"]`, `PaaS` → `["PaaS"]`, `IaaS` → `["IaaS"]`, `On-premise(s)` → `["On-premises (self-managed)"]`; another value (such as `Webapplicatie`): warning, field dropped | -| BNN Classificatie | both | module.bbnLevel | `NB` is empty; lookup "BBN1"/"BBN 1"/"BNN1" etc. to `BBN1`/`BBN2`/`BBN3`; unknown value: warning | +| Applicatiesoort | both | module.applicationType and module.cloudDienstverleningsmodel | applicationType: as is; hosting model lookup: `Saas`/`SaaS` → `["SaaS"]`, `PaaS` → `["PaaS"]`, `IaaS` → `["IaaS"]`, `On-premise(s)` → `["On-premises (self-managed)"]`; any other kind (`Webapplicatie`, `Client/server`, …) has default `null`: no hosting model, no warning | +| BNN Classificatie | both | module.bbnLevel | `NB` is empty; lookup `1`/`2`/`2+`/`3` and "BBN1"/"BBN 1"/"BNN1" etc. to `BBN1`/`BBN2`/`BBN2+`/`BBN3` (the fragment adds `BBN2+` to the enum); unknown value: warning | | Datum | both | module.externalCreatedAt | Excel serial to date | | Referentie datum wijziging | both | module.externalModifiedAt | Excel serial to date | | Vendor | both | organization (Supplier) via module.provider and usage.provider | dedup on normalised name (D7) | -| Applicatie Status | both | usage.status | lookup: In productie → In production, In voorraad → Planned, In ontwikkeling → Acquisition, Uit te faseren → To be phased out, Uitgefaseerd → Phased out; unknown value: warning | -| Classificatie | both | usage.timeClassification | lookup Tolereren/Tolerate, Investeren/Invest, Migreren/Migrate, Elimineren/Eliminate | +| Applicatie Status | both | usage.status | lookup: In productie → In production, In voorraad → Planned, In ontwikkeling → Acquisition, Uit te faseren and Moet verwijderd worden → To be phased out, Uitgefaseerd and Verwijderd → Phased out, Besteld and Wordt getest → Acquisition, Stand-by voor continuïteit → In production; unknown value: warning | +| Classificatie | both | usage.timeClassification | lookup Tolereren/Tolerate (also `1. Tolereren (wordt ingelezen)`), Investeren/Invest, Migreren/Migrate, Elimineren/Eliminate | | End-of-Life Functioneel | both | usage.startDateOutPhased | Excel serial to date, stored as is (2036-01-01 included) | | (sheet constant `Beheer`), Cluster, Applicatie Eigenaar (Afdeling) | both | usage.interneAnnotation | concat with " / ", empty parts dropped, create-only; `Beheer geregeld: nee` (Onbeh) or `ja` (Beheerde) | | Applicatie Eigenaar (Persoon), Applicatie Eigenaar (Functie) | both | usage.businessOwner (contactPerson + Nextcloud contact; role = Functie) | D8; the person column may hold a function | @@ -414,7 +414,7 @@ The seeds show the new properties in a fresh install. They carry no `publication - [Owner contacts land in the importing admin's address book] → `StackiqContactSyncService` writes to the first writable address book of the acting user, the same as every other stackiq contact path. The docs say so. A dedicated system address book is a follow-up. - [Long synchronous request] → Per-row progress, cancel, and "unchanged" rows skip the save. About 1,100 rows is expected to fit. A background job is a follow-up if it does not. - [OpenRegister internals (`MappingEngine`, `PackDefinitionValidator`, PhpSpreadsheet) change shape] → Guarded resolution with 503, and a contract test that maps the fixture through the real engine in the dev environment. -- [Provisional lookups for Applicatiesoort and BNN Classificatie] → The values of the first real import were not kept (the report lives in the progress cache for an hour). The maps hold the values the anonymised export and the CMDB formulas show (`Saas`, `Webapplicatie`, `NB`) plus the usual spellings. An unknown value is a warning, never a wrong value; once the municipality lists its values, the maps in the JSON are extended, with no code change. +- [Lookups from the real export] → The maps hold the values the municipality's export of 2026-09-22 contains (2026-10-02 import report): "Applicatiesoort" is an application kind, kept as is in `applicationType`; "BNN Classificatie" holds `NB`, `1`, `2` and `2+`; "Applicatie Status" adds five Dutch statuses; "Classificatie" one numbered form. A new value is a warning, never a wrong value, and is added to the JSON map with no code change. A lookup `default` of `null` means "known, no value": the service leaves the field out. - [CMDB placeholders] → "BNN Classificatie" `NB` is read as empty. "End-of-Life Functioneel" and "Classificatie" are stored as the file has them: the sheet's 2036-01-01 (written for an empty date) is imported as that date, and the `Tolereren` the "Beheerde" formula writes when TOPdesk has none is imported as Tolerate. - [An application moves between the sheets] → Same APPID, so the same module and usage; the usage note (create-only) keeps its old `Beheer geregeld` line when it is not empty. - [An unknown status on create falls back to the usage schema's default "In production"] → Accepted. The warning in the report makes it visible. @@ -426,6 +426,5 @@ No data migration. The register fragment deploys with the existing repair-step r ## Open Questions -- Which "Applicatiesoort" and "BNN Classificatie" values occur in the municipality's real export, and which hosting model does each mean (lookup maps)? - Should the maintenance status update the usage note on re-import (it is create-only today), or get a field of its own? - Should OpenRegister promote `MigrationPack\MappingEngine` to its `Contract` namespace? diff --git a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md index e15e3fe7..96e818c0 100644 --- a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md +++ b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md @@ -166,9 +166,10 @@ The service SHALL map each normalised row with OpenRegister's `MigrationPack\Map - **GIVEN** the "Beheerde" row of the anonymised export with "Applicatiesoort" `Saas`, "BNN Classificatie" `BBN2`, "Classificatie" `Tolereren` and "End-of-Life Functioneel" `53359` - **WHEN** it is imported -- **THEN** the module SHALL have `cloudDienstverleningsmodel` = `["SaaS"]` and `bbnLevel` = `BBN2` +- **THEN** the module SHALL have `applicationType` = `Saas`, `cloudDienstverleningsmodel` = `["SaaS"]` and `bbnLevel` = `BBN2` - **AND** the usage SHALL have `timeClassification` = `Tolerate` and `startDateOutPhased` = `2046-02-01` -- **AND** the "Onbeh" row's "Applicatiesoort" `Webapplicatie`, which is not a hosting model, SHALL be dropped with a warning +- **AND** the "Onbeh" row's "Applicatiesoort" `Webapplicatie`, which is not a hosting model, SHALL be stored as `applicationType` and SHALL leave `cloudDienstverleningsmodel` empty without a warning +- **AND** "BNN Classificatie" `1`, `2`, `2+` SHALL be `BBN1`, `BBN2`, `BBN2+` ### Requirement: REQ-CMDB-006 A module SHALL be matched on its TOPdesk APPID, so a re-import updates instead of duplicating diff --git a/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php b/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php index b5bd4e44..7f231a1e 100644 --- a/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php +++ b/tests/Unit/Service/Cmdb/CmdbImportProfileTest.php @@ -198,8 +198,9 @@ public function testTheLookupsMapThroughTheEngine(): void { $this->assertStringContainsString('Onbekende status', $unknown['errors'][0]['message']); $soort = $engine->mapRow($profile->pack(target: 'module'), ['Applicatie Naam' => 'X', 'APPID' => '1', 'Applicatiesoort' => 'Webapplicatie'], 3); - $this->assertArrayNotHasKey('cloudDienstverleningsmodel', $soort['data'], 'an application kind is not a hosting model'); - $this->assertSame('Applicatiesoort', $soort['errors'][0]['source']); + $this->assertNull($soort['data']['cloudDienstverleningsmodel'], 'an application kind is not a hosting model; the service leaves the null out'); + $this->assertSame('Webapplicatie', $soort['data']['applicationType']); + $this->assertSame([], $soort['errors']); }//end testTheLookupsMapThroughTheEngine() /** diff --git a/tests/Unit/Service/CmdbExportImportServiceTest.php b/tests/Unit/Service/CmdbExportImportServiceTest.php index 291063e2..f483fe35 100644 --- a/tests/Unit/Service/CmdbExportImportServiceTest.php +++ b/tests/Unit/Service/CmdbExportImportServiceTest.php @@ -520,12 +520,12 @@ public function testTheFixtureCreatesModulesUsagesAndSuppliers(): void { $this->assertTrue($report['success']); $this->assertFalse($report['cancelled']); $this->assertSame('cmdb-test-0001', $report['operationId']); - $this->assertSame(['rowsRead' => 2, 'processed' => 2, 'created' => 2, 'updated' => 0, 'unchanged' => 0, 'skipped' => 0, 'failed' => 0, 'warnings' => 1], $report['summary']); + $this->assertSame(['rowsRead' => 2, 'processed' => 2, 'created' => 2, 'updated' => 0, 'unchanged' => 0, 'skipped' => 0, 'failed' => 0, 'warnings' => 0], $report['summary']); $this->assertSame('Gemeente Voorbeeldstad', $report['municipality']['name']); $this->assertTrue($report['municipality']['created']); $this->assertSame([], $report['importWarnings']); - // "Webapplicatie" is an application kind, not a hosting model: the field is dropped with a warning. - $this->assertSame(['Column "Applicatiesoort": Value "Webapplicatie" has no mapping and no default is configured'], $report['rows'][0]['warnings']); + // "Webapplicatie" is an application kind, not a hosting model: kept as the kind, no hosting model, no warning. + $this->assertSame([], $report['rows'][0]['warnings']); $municipality = $report['municipality']['uuid']; $this->assertSame('Municipality', $this->store[self::ORGANIZATION][$municipality]['type']); @@ -551,6 +551,7 @@ public function testTheFixtureCreatesModulesUsagesAndSuppliers(): void { $this->assertSame('Functionele omschrijving test123', $onbeh['longDescription']); $this->assertArrayNotHasKey('bbnLevel', $onbeh, '"NB" means unknown'); $this->assertArrayNotHasKey('cloudDienstverleningsmodel', $onbeh); + $this->assertSame('Webapplicatie', $onbeh['applicationType']); $publication = new \DateTimeImmutable($onbeh['publicationDate']); $this->assertGreaterThanOrEqual($before, $publication); $this->assertLessThanOrEqual(new \DateTimeImmutable('now'), $publication); @@ -563,6 +564,7 @@ public function testTheFixtureCreatesModulesUsagesAndSuppliers(): void { $this->assertSame('Naamtest', $beheerd['shortDescription'], 'Roepnaam wins over Nickname'); $this->assertSame('Accomodatieplanning.', $beheerd['longDescription']); $this->assertSame(['SaaS'], $beheerd['cloudDienstverleningsmodel']); + $this->assertSame('Saas', $beheerd['applicationType']); $this->assertSame('BBN2', $beheerd['bbnLevel']); $supplierByName = array_column($suppliers, 'id', 'name'); @@ -844,6 +846,36 @@ public function testNbMeansEmptyAndEndOfLifeIsStoredAsIs(): void { $this->assertSame('Migrate', $usages[$modules[2]['id']]['timeClassification']); }//end testNbMeansEmptyAndEndOfLifeIsStoredAsIs() + /** + * The values the municipality's real export holds map without a warning: BNN 1/2/2+, the extra + * statuses, the numbered TIME class, and application kinds that are not a hosting model. + * + * @return void + */ + public function testTheValuesOfTheRealExportMapWithoutWarnings(): void { + $this->seedOrganisation(uuid: 'muni-1', name: 'Gemeente Voorbeeldstad', type: 'Municipality'); + $rows = [ + $this->row(appId: '1', cells: ['BNN Classificatie' => '1', 'Applicatiesoort' => 'Client/server', 'Applicatie Status' => 'Moet verwijderd worden', 'Classificatie' => '1. Tolereren (wordt ingelezen)']), + $this->row(appId: '2', cells: ['BNN Classificatie' => '2', 'Applicatiesoort' => 'Saas', 'Applicatie Status' => 'Wordt getest'], row: 3), + $this->row(appId: '3', cells: ['BNN Classificatie' => '2+', 'Applicatiesoort' => 'Beheertool', 'Applicatie Status' => 'Stand-by voor continuïteit'], row: 4), + $this->row(appId: '4', cells: ['Applicatie Status' => 'Besteld'], row: 5), + $this->row(appId: '5', cells: ['Applicatie Status' => 'Verwijderd'], row: 6), + ]; + + $report = $this->service(reader: $this->rowsReader(rows: $rows))->import(path: '', options: ['municipalityUuid' => 'muni-1']); + + $this->assertSame(0, $report['summary']['warnings']); + $modules = array_column($this->objects(self::MODULE), null, 'externalNumber'); + $this->assertSame(['BBN1', 'BBN2', 'BBN2+'], [$modules[1]['bbnLevel'], $modules[2]['bbnLevel'], $modules[3]['bbnLevel']]); + $this->assertSame(['Client/server', 'Saas', 'Beheertool'], [$modules[1]['applicationType'], $modules[2]['applicationType'], $modules[3]['applicationType']]); + $this->assertArrayNotHasKey('cloudDienstverleningsmodel', $modules[1], 'Client/server is no hosting model'); + $this->assertSame(['SaaS'], $modules[2]['cloudDienstverleningsmodel']); + $usages = array_column($this->objects(self::USAGE), null, 'module'); + $status = array_map(fn (int $appId): string => $usages[$modules[$appId]['id']]['status'], [1, 2, 3, 4, 5]); + $this->assertSame(['To be phased out', 'Acquisition', 'In production', 'Acquisition', 'Phased out'], $status); + $this->assertSame('Tolerate', $usages[$modules[1]['id']]['timeClassification']); + }//end testTheValuesOfTheRealExportMapWithoutWarnings() + /** * A formula without a cached value reads as empty and warns on its row; the row is still imported. * diff --git a/tests/Unit/Settings/TopdeskCmdbFragmentTest.php b/tests/Unit/Settings/TopdeskCmdbFragmentTest.php index 71badecf..13e592f3 100644 --- a/tests/Unit/Settings/TopdeskCmdbFragmentTest.php +++ b/tests/Unit/Settings/TopdeskCmdbFragmentTest.php @@ -30,11 +30,11 @@ */ class TopdeskCmdbFragmentTest extends TestCase { /** - * The external-id properties the fragment adds. + * The properties the fragment adds. * * @var array */ - private const PROPERTIES = ['externalId', 'externalNumber', 'externalKey', 'externalCreatedAt', 'externalModifiedAt']; + private const PROPERTIES = ['externalId', 'externalNumber', 'externalKey', 'externalCreatedAt', 'externalModifiedAt', 'applicationType']; /** * The register after merging every fragment in sorted filename order. @@ -56,14 +56,14 @@ private function mergedRegister(): array { }//end mergedRegister() /** - * The merged module is 0.3.5 and carries the five optional, titled properties. + * The merged module is 0.3.7, carries the six optional, titled properties and allows BBN2+. * * @return void */ - public function testTheMergedModuleIsVersion035WithTheExternalIds(): void { + public function testTheMergedModuleIsVersion037WithTheExternalIds(): void { $module = $this->mergedRegister()['components']['schemas']['module']; - $this->assertSame('0.3.5', $module['version'], 'a fragment sorting after topdesk-cmdb-import.json overwrote the bump'); + $this->assertSame('0.3.7', $module['version'], 'a fragment sorting after topdesk-cmdb-import.json overwrote the bump'); foreach (self::PROPERTIES as $property) { $this->assertArrayHasKey($property, $module['properties']); $this->assertNotEmpty($module['properties'][$property]['title'] ?? '', $property); @@ -79,9 +79,11 @@ public function testTheMergedModuleIsVersion035WithTheExternalIds(): void { $this->assertSame(['default' => false], $module['properties']['externalKey']['table']); $this->assertSame('date', $module['properties']['externalCreatedAt']['format']); $this->assertSame('date', $module['properties']['externalModifiedAt']['format']); + $this->assertSame(100, $module['properties']['applicationType']['maxLength']); + $this->assertSame(['BBN1', 'BBN2', 'BBN3', 'BBN2+'], $module['properties']['bbnLevel']['enum'], 'the fragment adds BBN2+ to the BIO levels'); $this->assertArrayHasKey('roadmapStatement', $module['properties'], 'the 0.3.4 fragment still applies'); $this->assertSame(['name'], $module['required']); - }//end testTheMergedModuleIsVersion035WithTheExternalIds() + }//end testTheMergedModuleIsVersion037WithTheExternalIds() /** * The fragment sorts after the fragment that set module 0.3.4. From 3dd75bbdf419f5e99ca1426cf3e3094ca844b813 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Fri, 2 Oct 2026 17:00:32 +0200 Subject: [PATCH 03/57] =?UTF-8?q?docs(review):=20#1219=20f1=20=E2=80=94=20?= =?UTF-8?q?Docs=20do=20not=20say=202036-01-01=20is=20a=20no-date=20sentine?= =?UTF-8?q?l=20that=20will=20be=20displayed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thread: https://github.com/ConductionNL/stackiq/pull/1219#discussion_r4166848301 The Placeholder values paragraph in docs/features/cmdb-import.md now says 2036-01-01 is the CMDB's stand-in for no end-of-life date, that it is stored as the usage phase-out date and shown like a real one (an application reads as "Phased out" once it is reached), and that a re-import with Update existing records fills it where it was empty before. Class sweep: git grep -n 'End-of-Life Functioneel' -- docs/ found only cmdb-import.md (the paragraph and the column table). No Dutch or other copy documents the placeholder, so nothing else changed. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 7c8bfa64..f52ce366 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -120,7 +120,11 @@ CSV files are not accepted. **Placeholder values.** The CMDB sheets fill an empty `BNN Classificatie` with `NB` ("niet bekend"); that is read as empty. Dates are stored as the file has them: the CMDB's 2036-01-01 in `End-of-Life Functioneel` is imported -as 2036-01-01. +as 2036-01-01. The CMDB writes that date when TOPdesk has no end-of-life date, +so it is a stand-in for "no date". It is stored as the phase-out date of the +usage and shown like any real one, and an application reads as "Phased out" +once that date is reached. A re-import with **Update existing records** on +fills the date where it was left empty before. ### Columns and where they go From 0160aed4fd390d379053d3a2a8763697b090f9e7 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Fri, 2 Oct 2026 17:06:28 +0200 Subject: [PATCH 04/57] =?UTF-8?q?docs(review):=20#1219=20f1=20=E2=80=94=20?= =?UTF-8?q?pre-push:=20an=20update=20replaces=20a=20stored=20date;=20the?= =?UTF-8?q?=20phase=20is=20per=20usage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thread: https://github.com/ConductionNL/stackiq/pull/1219#discussion_r4166848301 In the Placeholder values paragraph of docs/features/cmdb-import.md: - an update with Update existing records on also replaces a different stored phase-out date, including one set by hand (merge() skips only createOnly fields, and the usage profile lists only interneAnnotation); - the "Phased out" phase belongs to the usage, not the application (derivePhase works per gebruik). Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index f52ce366..bf8f9527 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -122,9 +122,10 @@ with `NB` ("niet bekend"); that is read as empty. Dates are stored as the file has them: the CMDB's 2036-01-01 in `End-of-Life Functioneel` is imported as 2036-01-01. The CMDB writes that date when TOPdesk has no end-of-life date, so it is a stand-in for "no date". It is stored as the phase-out date of the -usage and shown like any real one, and an application reads as "Phased out" +usage and shown like any real one, and the usage reads as "Phased out" once that date is reached. A re-import with **Update existing records** on -fills the date where it was left empty before. +fills the date where it was left empty before. It also replaces a different +date stored there, including one set by hand. ### Columns and where they go From 350f7e9705cb3a6303cb7156ad105e9bbfb65b8e Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:20:29 +0200 Subject: [PATCH 05/57] fix(cmdb-import): give applicationType and the bbnLevel overlay titles and translations The register fragment added `module.applicationType` with no l10n key, so `check:schema-l10n` counted two new uncovered strings, and its `bbnLevel` entry extends the enum without a title or description, which gate 51 (schema-property-titles) refuses because an enum declares. The overlay now states both, and en/nl carry keys for the three strings. Co-Authored-By: Claude Opus 5.5 --- l10n/en.js | 5 ++++- l10n/en.json | 5 ++++- l10n/nl.js | 5 ++++- l10n/nl.json | 5 ++++- lib/Settings/register.d/topdesk-cmdb-import.json | 2 ++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/l10n/en.js b/l10n/en.js index 1f8c6f9a..e270e22a 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1077,7 +1077,10 @@ OC.L10N.register( "The file could not be sent. Check your connection and try again.": "The file could not be sent. Check your connection and try again.", "The organisation register is not configured, so there are no organisations to choose from.": "The organisation register is not configured, so there are no organisations to choose from.", "The organisations could not be loaded. Reload the page to try again.": "The organisations could not be loaded. Reload the page to try again.", - "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Whether a service desk is connected could not be loaded. Reload the page to try again." + "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Whether a service desk is connected could not be loaded. Reload the page to try again.", + "Application type": "Application type", + "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.", + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/en.json b/l10n/en.json index 800f5f8b..ec6a4221 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1076,6 +1076,9 @@ "The file could not be sent. Check your connection and try again.": "The file could not be sent. Check your connection and try again.", "The organisation register is not configured, so there are no organisations to choose from.": "The organisation register is not configured, so there are no organisations to choose from.", "The organisations could not be loaded. Reload the page to try again.": "The organisations could not be loaded. Reload the page to try again.", - "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Whether a service desk is connected could not be loaded. Reload the page to try again." + "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Whether a service desk is connected could not be loaded. Reload the page to try again.", + "Application type": "Application type", + "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.", + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses." } } diff --git a/l10n/nl.js b/l10n/nl.js index 5b3007be..9c84debc 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1147,7 +1147,10 @@ OC.L10N.register( "The file could not be sent. Check your connection and try again.": "Het bestand kon niet worden verstuurd. Controleer uw verbinding en probeer het opnieuw.", "The organisation register is not configured, so there are no organisations to choose from.": "Het organisatieregister is niet ingesteld, dus er zijn geen organisaties om uit te kiezen.", "The organisations could not be loaded. Reload the page to try again.": "De organisaties konden niet worden geladen. Herlaad de pagina om het opnieuw te proberen.", - "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Kon niet worden geladen of er een servicedesk is gekoppeld. Herlaad de pagina om het opnieuw te proberen." + "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Kon niet worden geladen of er een servicedesk is gekoppeld. Herlaad de pagina om het opnieuw te proberen.", + "Application type": "Applicatiesoort", + "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "Het soort applicatie zoals het bronsysteem het vastlegt, zoals de TOPdesk-Applicatiesoort (Webapplicatie, Client/server, Saas). Overgenomen zoals de bron het heeft.", + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "Het BBN-niveau (Baseline Informatiebeveiliging Overheid) waarop deze applicatie is geclassificeerd. BBN2+ is een niveau dat de TOPdesk-CMDB-export gebruikt." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index 23f291cf..7bfc33c8 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1146,6 +1146,9 @@ "The file could not be sent. Check your connection and try again.": "Het bestand kon niet worden verstuurd. Controleer uw verbinding en probeer het opnieuw.", "The organisation register is not configured, so there are no organisations to choose from.": "Het organisatieregister is niet ingesteld, dus er zijn geen organisaties om uit te kiezen.", "The organisations could not be loaded. Reload the page to try again.": "De organisaties konden niet worden geladen. Herlaad de pagina om het opnieuw te proberen.", - "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Kon niet worden geladen of er een servicedesk is gekoppeld. Herlaad de pagina om het opnieuw te proberen." + "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Kon niet worden geladen of er een servicedesk is gekoppeld. Herlaad de pagina om het opnieuw te proberen.", + "Application type": "Applicatiesoort", + "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "Het soort applicatie zoals het bronsysteem het vastlegt, zoals de TOPdesk-Applicatiesoort (Webapplicatie, Client/server, Saas). Overgenomen zoals de bron het heeft.", + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "Het BBN-niveau (Baseline Informatiebeveiliging Overheid) waarop deze applicatie is geclassificeerd. BBN2+ is een niveau dat de TOPdesk-CMDB-export gebruikt." } } diff --git a/lib/Settings/register.d/topdesk-cmdb-import.json b/lib/Settings/register.d/topdesk-cmdb-import.json index 2bd310c3..9674345e 100644 --- a/lib/Settings/register.d/topdesk-cmdb-import.json +++ b/lib/Settings/register.d/topdesk-cmdb-import.json @@ -62,6 +62,8 @@ "order": 65 }, "bbnLevel": { + "title": "BBN level", + "description": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.", "enum": ["BBN2+"] } } From 7ca11fefcb4953985ce98aa46e27e0aff2a341fe Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Fri, 2 Oct 2026 17:00:32 +0200 Subject: [PATCH 06/57] =?UTF-8?q?docs(review):=20#1219=20f1=20=E2=80=94=20?= =?UTF-8?q?Docs=20do=20not=20say=202036-01-01=20is=20a=20no-date=20sentine?= =?UTF-8?q?l=20that=20will=20be=20displayed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thread: https://github.com/ConductionNL/stackiq/pull/1219#discussion_r4166848301 The Placeholder values paragraph in docs/features/cmdb-import.md now says 2036-01-01 is the CMDB's stand-in for no end-of-life date, that it is stored as the usage phase-out date and shown like a real one (an application reads as "Phased out" once it is reached), and that a re-import with Update existing records fills it where it was empty before. Class sweep: git grep -n 'End-of-Life Functioneel' -- docs/ found only cmdb-import.md (the paragraph and the column table). No Dutch or other copy documents the placeholder, so nothing else changed. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 4109558a..20f717f0 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -120,7 +120,11 @@ CSV files are not accepted. **Placeholder values.** The CMDB sheets fill an empty `BNN Classificatie` with `NB` ("niet bekend"); that is read as empty. Dates are stored as the file has them: the CMDB's 2036-01-01 in `End-of-Life Functioneel` is imported -as 2036-01-01. +as 2036-01-01. The CMDB writes that date when TOPdesk has no end-of-life date, +so it is a stand-in for "no date". It is stored as the phase-out date of the +usage and shown like any real one, and an application reads as "Phased out" +once that date is reached. A re-import with **Update existing records** on +fills the date where it was left empty before. ### Columns and where they go From 225b4124817a5960494271e90c7b8005ffb0aba3 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Fri, 2 Oct 2026 17:06:28 +0200 Subject: [PATCH 07/57] =?UTF-8?q?docs(review):=20#1219=20f1=20=E2=80=94=20?= =?UTF-8?q?pre-push:=20an=20update=20replaces=20a=20stored=20date;=20the?= =?UTF-8?q?=20phase=20is=20per=20usage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thread: https://github.com/ConductionNL/stackiq/pull/1219#discussion_r4166848301 In the Placeholder values paragraph of docs/features/cmdb-import.md: - an update with Update existing records on also replaces a different stored phase-out date, including one set by hand (merge() skips only createOnly fields, and the usage profile lists only interneAnnotation); - the "Phased out" phase belongs to the usage, not the application (derivePhase works per gebruik). Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 20f717f0..323f3009 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -122,9 +122,10 @@ with `NB` ("niet bekend"); that is read as empty. Dates are stored as the file has them: the CMDB's 2036-01-01 in `End-of-Life Functioneel` is imported as 2036-01-01. The CMDB writes that date when TOPdesk has no end-of-life date, so it is a stand-in for "no date". It is stored as the phase-out date of the -usage and shown like any real one, and an application reads as "Phased out" +usage and shown like any real one, and the usage reads as "Phased out" once that date is reached. A re-import with **Update existing records** on -fills the date where it was left empty before. +fills the date where it was left empty before. It also replaces a different +date stored there, including one set by hand. ### Columns and where they go From 87eed0d16d7f368bc00aa5aa1f1c7d1d48413711 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:33:29 +0200 Subject: [PATCH 08/57] fix(cmdb-import): the import and cancel routes declare AuthorizedAdminSetting for StackiqAdmin Both routes relied on Nextcloud's default (admin plus CSRF) without declaring it, which the route-auth gate rejects. They now carry #[AuthorizedAdminSetting(settings: StackiqAdmin::class)] and the matching docblock tag, like ItsmExchangeController's file import. A group an admin delegated the stackiq settings to can now run and cancel an import as well; the contract says so. CSRF stays required. The unit test that pinned "no attributes at all" now asserts the attribute and its settings class, and that neither the class nor a method declares NoAdminRequired, NoCSRFRequired or PublicPage, as attribute or as an annotation Nextcloud's regex would read. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 25 ++++++--- .../changes/cmdb-export-import/contract.md | 8 +-- .../Controller/CmdbImportControllerTest.php | 54 ++++++++++++++++--- 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index a8425feb..9acffd40 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -6,11 +6,14 @@ * Upload endpoint for a TOPdesk CMDB export (xlsx) and the cancel endpoint * of a running import (openspec/changes/cmdb-export-import/contract.md). * - * AUTH: both methods carry neither `NoAdminRequired` nor `NoCSRFRequired`, so - * Nextcloud's middleware lets only a Nextcloud admin with a valid CSRF token - * reach them (403 / 412 before the body runs). The import writes into the + * AUTH (ADR-005): both methods are `#[AuthorizedAdminSetting(StackiqAdmin::class)]` + * and carry neither `NoAdminRequired` nor `NoCSRFRequired`, so Nextcloud's + * middleware lets only a Nextcloud admin, or a member of a group an admin + * delegated the stackiq admin settings to, reach them, and only with a valid + * CSRF token (403 / 412 before the body runs). The import writes into the * catalogue for a whole municipality, which is an administrative action, so - * a member of the app's own manager groups is refused as well. + * a member of the app's own manager groups is refused unless the stackiq + * settings were delegated to that group. * * The upload is checked before it is parsed, in the order of design D10: * present, size, xlsx, `missingRecords`, municipality. Every expected service @@ -37,15 +40,17 @@ use OCA\Stackiq\AppInfo\Application; use OCA\Stackiq\Exception\CmdbImportException; use OCA\Stackiq\Service\CmdbExportImportService; +use OCA\Stackiq\Settings\StackiqAdmin; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; use OCP\AppFramework\Http\JSONResponse; use OCP\IL10N; use OCP\IRequest; use Psr\Log\LoggerInterface; /** - * CMDB import and cancel, admin-only and CSRF-protected. + * CMDB import and cancel, for (delegated) stackiq admins and CSRF-protected. * * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 */ @@ -81,12 +86,15 @@ public function __construct( * `updateExisting` (default true), `missingRecords` (only `keep`) and * `operationId` (pattern `cmdb-` plus 8 to 64 letters, digits or hyphens). * + * @AuthorizedAdminSetting(settings=OCA\Stackiq\Settings\StackiqAdmin) + * * @return JSONResponse The report (200), or an error envelope with the contract code. * - * @auth admin-only importing a CMDB export rewrites the catalogue of a whole municipality, so only a Nextcloud admin runs it. + * @auth admin-only importing a CMDB export rewrites the catalogue of a whole municipality, so only a (delegated) stackiq admin runs it. * * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 */ + #[AuthorizedAdminSetting(settings: StackiqAdmin::class)] public function import(): JSONResponse { $validated = $this->validateRequest(); if ($validated instanceof JSONResponse) { @@ -162,12 +170,15 @@ private function validateRequest(): array|JSONResponse { * * @param string $operationId The operation id. * + * @AuthorizedAdminSetting(settings=OCA\Stackiq\Settings\StackiqAdmin) + * * @return JSONResponse `{success, cancelRequested}`, or 404 OPERATION_NOT_FOUND. * - * @auth admin-only cancelling an import is part of running it, so only a Nextcloud admin may do it (no NoAdminRequired, CSRF checked). + * @auth admin-only cancelling an import is part of running it, so only a (delegated) stackiq admin may do it (CSRF checked). * * @spec openspec/changes/cmdb-export-import/tasks.md#task-7 */ + #[AuthorizedAdminSetting(settings: StackiqAdmin::class)] public function cancel(string $operationId): JSONResponse { if ($this->importService->requestCancel(operationId: $operationId) === false) { return $this->error(code: 'OPERATION_NOT_FOUND', status: Http::STATUS_NOT_FOUND); diff --git a/openspec/changes/cmdb-export-import/contract.md b/openspec/changes/cmdb-export-import/contract.md index 628cc39a..081ceb6b 100644 --- a/openspec/changes/cmdb-export-import/contract.md +++ b/openspec/changes/cmdb-export-import/contract.md @@ -10,7 +10,7 @@ Paths are relative to `/index.php/apps/stackiq`. ## Endpoints ### `POST /api/cmdb-import` -**Auth**: Nextcloud session of a Nextcloud admin, plus CSRF `requesttoken` (header or form field). No `NoAdminRequired`, no `NoCSRFRequired`. +**Auth**: Nextcloud session of a Nextcloud admin, or of a member of a group an admin delegated the stackiq admin settings to (`#[AuthorizedAdminSetting(settings: StackiqAdmin::class)]`), plus CSRF `requesttoken` (header or form field). No `NoAdminRequired`, no `NoCSRFRequired`. **Request:** `multipart/form-data` @@ -55,7 +55,7 @@ Paths are relative to `/index.php/apps/stackiq`. |------|-----------| | 400 | `NO_FILE_UPLOADED`, `NOT_XLSX` | | 401 | not signed in (Nextcloud) | -| 403 | not a Nextcloud admin (Nextcloud) | +| 403 | neither a Nextcloud admin nor a delegated stackiq admin (Nextcloud) | | 412 | missing or invalid CSRF token (Nextcloud) | | 413 | `FILE_TOO_LARGE` | | 422 | `MISSING_RECORDS_UNSUPPORTED`, `MUNICIPALITY_REQUIRED`, `MUNICIPALITY_INVALID`, `NO_SOURCE_SHEET`, `MISSING_COLUMN`, `TOO_MANY_ROWS` | @@ -65,7 +65,7 @@ Paths are relative to `/index.php/apps/stackiq`. Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. ### `POST /api/cmdb-import/{operationId}/cancel` -**Auth**: Nextcloud admin session plus CSRF token. +**Auth**: the same as the import: a Nextcloud admin or delegated stackiq admin session, plus CSRF token. **Request:** no body. @@ -77,7 +77,7 @@ Error body: `{"success": false, "error": "", "message": " **Errors:** | Code | Condition | |------|-----------| -| 403 | not a Nextcloud admin | +| 403 | neither a Nextcloud admin nor a delegated stackiq admin | | 404 | `OPERATION_NOT_FOUND`: no `cmdb_import` operation with this id | | 412 | missing or invalid CSRF token | diff --git a/tests/Unit/Controller/CmdbImportControllerTest.php b/tests/Unit/Controller/CmdbImportControllerTest.php index d190d803..23bf80c9 100644 --- a/tests/Unit/Controller/CmdbImportControllerTest.php +++ b/tests/Unit/Controller/CmdbImportControllerTest.php @@ -24,12 +24,18 @@ use OCA\Stackiq\Controller\CmdbImportController; use OCA\Stackiq\Exception\CmdbImportException; use OCA\Stackiq\Service\CmdbExportImportService; +use OCA\Stackiq\Settings\StackiqAdmin; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\PublicPage; use OCP\IL10N; use OCP\IRequest; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; +use ReflectionClass; use ReflectionMethod; use RuntimeException; @@ -128,26 +134,62 @@ private function file(string $path, string $name = 'export.xlsx', int $size = 4) }//end file() /** - * Neither method declares NoAdminRequired or NoCSRFRequired, as attribute or annotation. + * Both methods declare AuthorizedAdminSetting for StackiqAdmin, as attribute and annotation. * * @return void */ - public function testBothRoutesAreAdminOnlyWithCsrf(): void { + public function testBothRoutesRequireTheStackiqAdminSetting(): void { foreach (['import', 'cancel'] as $method) { $reflection = new ReflectionMethod(CmdbImportController::class, $method); - $this->assertSame([], $reflection->getAttributes(), $method); + + $attributes = $reflection->getAttributes(AuthorizedAdminSetting::class); + $this->assertCount(1, $attributes, $method); + $this->assertSame(['settings' => StackiqAdmin::class], $attributes[0]->getArguments(), $method); + + preg_match_all(self::ANNOTATION, (string)$reflection->getDocComment(), $matches); + $byName = array_combine($matches['annotation'], array_map('trim', $matches['parameter'])); + $this->assertArrayHasKey('AuthorizedAdminSetting', $byName, $method); + $this->assertSame('(settings=' . StackiqAdmin::class . ')', $byName['AuthorizedAdminSetting'], $method); + } + }//end testBothRoutesRequireTheStackiqAdminSetting() + + /** + * Neither method opens itself to every user, to anonymous users or to requests without CSRF. + * + * Checked as attribute and as the annotation Nextcloud's regex reads, so a + * comment line that starts with one of these tokens fails too. + * + * @return void + */ + public function testNeitherRouteDeclaresAnExemption(): void { + $exemptions = [ + 'NoAdminRequired' => NoAdminRequired::class, + 'NoCSRFRequired' => NoCSRFRequired::class, + 'PublicPage' => PublicPage::class, + ]; + + foreach ([CmdbImportController::class, 'import', 'cancel'] as $target) { + $reflection = $target === CmdbImportController::class ? new ReflectionClass($target) : new ReflectionMethod(CmdbImportController::class, $target); preg_match_all(self::ANNOTATION, (string)$reflection->getDocComment(), $matches); - foreach (['NoAdminRequired', 'NoCSRFRequired', 'PublicPage'] as $annotation) { - $this->assertNotContains($annotation, $matches['annotation'], $method); + foreach ($exemptions as $annotation => $attribute) { + $this->assertSame([], $reflection->getAttributes($attribute), $target . ' ' . $annotation); + $this->assertNotContains($annotation, $matches['annotation'], $target . ' ' . $annotation); } } + }//end testNeitherRouteDeclaresAnExemption() + /** + * The two routes keep their paths and verbs. + * + * @return void + */ + public function testTheRoutesAreRegistered(): void { $routes = require __DIR__ . '/../../../appinfo/routes.php'; $byName = array_column($routes['routes'], null, 'name'); $this->assertSame(['name' => 'cmdbImport#import', 'url' => '/api/cmdb-import', 'verb' => 'POST'], $byName['cmdbImport#import']); $this->assertSame(['name' => 'cmdbImport#cancel', 'url' => '/api/cmdb-import/{operationId}/cancel', 'verb' => 'POST'], $byName['cmdbImport#cancel']); - }//end testBothRoutesAreAdminOnlyWithCsrf() + }//end testTheRoutesAreRegistered() /** * No file is 400 NO_FILE_UPLOADED; a failed upload too. From c74f4921d8e244b848f617a5aa91c0a7080d8765 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:35:05 +0200 Subject: [PATCH 09/57] fix(cmdb-import): an unexpected error while the upload is checked answers IMPORT_FAILED c215ea42 widened the catch around the service's import() to Throwable, but the upload checks ran before that try, so an Error from the ZIP check (assertXlsx) still escaped the error envelope as Nextcloud's own 500 page. The checks now run inside the same boundary. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 12 +++++++----- .../Controller/CmdbImportControllerTest.php | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index 9acffd40..4f7db60c 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -96,12 +96,14 @@ public function __construct( */ #[AuthorizedAdminSetting(settings: StackiqAdmin::class)] public function import(): JSONResponse { - $validated = $this->validateRequest(); - if ($validated instanceof JSONResponse) { - return $validated; - } - try { + // The upload checks run inside the same boundary, so an unexpected + // error from the ZIP check is IMPORT_FAILED too, not a bare 500. + $validated = $this->validateRequest(); + if ($validated instanceof JSONResponse) { + return $validated; + } + $report = $this->importService->import(path: $validated['path'], options: $validated['options']); } catch (CmdbImportException $e) { $this->logger->info( diff --git a/tests/Unit/Controller/CmdbImportControllerTest.php b/tests/Unit/Controller/CmdbImportControllerTest.php index 23bf80c9..bef994c2 100644 --- a/tests/Unit/Controller/CmdbImportControllerTest.php +++ b/tests/Unit/Controller/CmdbImportControllerTest.php @@ -346,6 +346,23 @@ public function testAnUnexpectedPhpErrorIsAGeneric500(): void { $this->assertSame('IMPORT_FAILED', $response->getData()['error']); }//end testAnUnexpectedPhpErrorIsAGeneric500() + /** + * A PHP Error while the upload is checked is the same generic 500, and nothing is imported. + * + * @return void + */ + public function testAnUnexpectedErrorWhileCheckingTheUploadIsAGeneric500(): void { + $service = $this->service(); + $service->method('assertXlsx')->willThrowException(new \ValueError('zip internals')); + $service->expects($this->never())->method('import'); + + $response = $this->controller(file: $this->file(path: $this->upload()), params: ['municipalityName' => 'Gemeente Voorbeeldstad'], service: $service)->import(); + + $this->assertSame(500, $response->getStatus()); + $this->assertSame('IMPORT_FAILED', $response->getData()['error']); + $this->assertStringNotContainsString('zip internals', $response->getData()['message']); + }//end testAnUnexpectedErrorWhileCheckingTheUploadIsAGeneric500() + /** * A valid upload passes the options through and answers 200 with the report. * From b3d07b1883a48a71d95eea90d70ca4154a633669 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:36:35 +0200 Subject: [PATCH 10/57] fix(cmdb-import): an unrecognised updateExisting value is refused instead of read as true booleanParam() treated every value outside false/0/no/off as true, so a typo such as `flase` selected the mode that overwrites existing modules and usages. Only true/false and 1/0 (trimmed, in any case) are accepted now; anything else, an array included, answers 400 FIELD_INVALID with the field and the accepted values, and nothing is imported. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 32 ++++++++-- .../changes/cmdb-export-import/contract.md | 7 ++- .../Controller/CmdbImportControllerTest.php | 62 +++++++++++++++++++ 3 files changed, 92 insertions(+), 9 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index 4f7db60c..01dff5be 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -150,6 +150,16 @@ private function validateRequest(): array|JSONResponse { return $this->error(code: 'MISSING_RECORDS_UNSUPPORTED', status: Http::STATUS_UNPROCESSABLE_ENTITY, details: ['accepted' => ['keep']]); } + // An unrecognised value is refused rather than read as true: true is the mode that overwrites. + $updateExisting = $this->booleanParam(name: 'updateExisting', default: true); + if ($updateExisting === null) { + return $this->error( + code: 'FIELD_INVALID', + status: Http::STATUS_BAD_REQUEST, + details: ['field' => 'updateExisting', 'accepted' => ['true', 'false']] + ); + } + $municipalityUuid = trim((string)$this->request->getParam('municipalityUuid', '')); $municipalityName = trim((string)$this->request->getParam('municipalityName', '')); if ($municipalityUuid === '' && $municipalityName === '') { @@ -161,7 +171,7 @@ private function validateRequest(): array|JSONResponse { 'options' => [ 'municipalityUuid' => $municipalityUuid, 'municipalityName' => $municipalityName, - 'updateExisting' => $this->booleanParam(name: 'updateExisting', default: true), + 'updateExisting' => $updateExisting, 'operationId' => $this->request->getParam('operationId'), ], ]; @@ -234,12 +244,14 @@ private function error(string $code, int $status, array $details = []): JSONResp private function message(string $code, array $details): string { $megabytes = (string)intdiv($this->importService->maxFileBytes(), 1048576); $expected = implode(', ', array_map('strval', ($details['expected'] ?? []))); + $accepted = implode(', ', array_map('strval', ($details['accepted'] ?? []))); return match ($code) { 'NO_FILE_UPLOADED' => $this->l10n->t('No file was uploaded.'), 'NOT_XLSX' => $this->l10n->t('The file is not an Excel workbook (.xlsx).'), 'FILE_TOO_LARGE' => $this->l10n->t('The file is larger than the maximum of %s MB.', [$megabytes]), 'MISSING_RECORDS_UNSUPPORTED' => $this->l10n->t('Only keeping records that are missing from the export is supported.'), + 'FIELD_INVALID' => $this->l10n->t('Field "%1$s" must be one of: %2$s.', [(string)($details['field'] ?? ''), $accepted]), 'MUNICIPALITY_REQUIRED' => $this->l10n->t('Choose a municipality or enter the name of a new one.'), 'MUNICIPALITY_INVALID' => $this->l10n->t('The chosen organisation is not a municipality.'), 'NO_SOURCE_SHEET' => $this->l10n->t('The workbook has neither of the sheets %s.', [$expected]), @@ -254,14 +266,14 @@ private function message(string $code, array $details): string { }//end message() /** - * A boolean form field (`true`/`false`, `1`/`0`). + * A boolean form field: `true`/`false` or `1`/`0`, trimmed and in any case. * * @param string $name The field. - * @param bool $default The value when absent. + * @param bool $default The value when absent or empty. * - * @return bool + * @return bool|null Null for any other value, which the caller refuses. */ - private function booleanParam(string $name, bool $default): bool { + private function booleanParam(string $name, bool $default): ?bool { $value = $this->request->getParam($name); if ($value === null || $value === '') { return $default; @@ -271,7 +283,15 @@ private function booleanParam(string $name, bool $default): bool { return $value; } - return in_array(strtolower((string)$value), ['false', '0', 'no', 'off'], true) === false; + if (is_string($value) === false && is_int($value) === false) { + return null; + } + + return match (strtolower(trim((string)$value))) { + 'true', '1' => true, + 'false', '0' => false, + default => null, + }; }//end booleanParam() /** diff --git a/openspec/changes/cmdb-export-import/contract.md b/openspec/changes/cmdb-export-import/contract.md index 081ceb6b..bf431535 100644 --- a/openspec/changes/cmdb-export-import/contract.md +++ b/openspec/changes/cmdb-export-import/contract.md @@ -19,7 +19,7 @@ Paths are relative to `/index.php/apps/stackiq`. | `cmdbFile` | file | yes | | the TOPdesk export, `.xlsx`, at most 10 MB | | `municipalityUuid` | string (uuid) | one of the two | | an existing `organization` of type Municipality | | `municipalityName` | string | one of the two | | name of a Municipality to reuse (same normalised name) or create | -| `updateExisting` | `true`/`false` | no | `true` | `false` reports matched rows as skipped (`exists`) | +| `updateExisting` | `true`/`false` | no | `true` | `false` reports matched rows as skipped (`exists`). `1`/`0` are accepted too, trimmed and in any case; any other value is refused with 400 `FIELD_INVALID` | | `missingRecords` | string | no | `keep` | only `keep` is accepted; `mark` and `remove` are reserved | | `operationId` | string | no | generated | progress operation id, readable through `GET /api/progress/{operationId}`; `cmdb-` followed by 8 to 64 letters, digits or hyphens (for example `cmdb-` plus a uuid v4). Any other value is replaced by a generated id, returned as `operationId` | @@ -53,7 +53,7 @@ Paths are relative to `/index.php/apps/stackiq`. **Errors:** | Code | Condition | |------|-----------| -| 400 | `NO_FILE_UPLOADED`, `NOT_XLSX` | +| 400 | `NO_FILE_UPLOADED`, `NOT_XLSX`, `FIELD_INVALID` | | 401 | not signed in (Nextcloud) | | 403 | neither a Nextcloud admin nor a delegated stackiq admin (Nextcloud) | | 412 | missing or invalid CSRF token (Nextcloud) | @@ -62,7 +62,7 @@ Paths are relative to `/index.php/apps/stackiq`. | 500 | `IMPORT_FAILED` (unexpected; generic message, details only in the log) | | 503 | `MAPPING_UNAVAILABLE`, `READER_UNAVAILABLE`, `NOT_CONFIGURED` | -Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. +Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. For `FIELD_INVALID`, it is `{"field": "updateExisting", "accepted": ["true", "false"]}`. ### `POST /api/cmdb-import/{operationId}/cancel` **Auth**: the same as the import: a Nextcloud admin or delegated stackiq admin session, plus CSRF token. @@ -92,6 +92,7 @@ Returns the `ProgressTracker` snapshot for the `cmdb_import` operation: `progres | `NOT_XLSX` | not an xlsx workbook | extension is not `.xlsx`, no ZIP signature, or no `xl/workbook.xml` | | `FILE_TOO_LARGE` | too large | larger than the profile's `maxFileBytes` (10 MB) | | `MISSING_RECORDS_UNSUPPORTED` | option not supported | `missingRecords` is not `keep` | +| `FIELD_INVALID` | malformed field (400) | `updateExisting` is not `true`, `false`, `1` or `0` | | `MUNICIPALITY_REQUIRED` | no consumer | neither `municipalityUuid` nor `municipalityName` given | | `MUNICIPALITY_INVALID` | wrong consumer | uuid unknown, or the organisation is not of type Municipality | | `NO_SOURCE_SHEET` | nothing to read | neither "Onbeh Applicaties CMDB" nor "Beheerde Applicaties CMDB" present | diff --git a/tests/Unit/Controller/CmdbImportControllerTest.php b/tests/Unit/Controller/CmdbImportControllerTest.php index bef994c2..aef18d83 100644 --- a/tests/Unit/Controller/CmdbImportControllerTest.php +++ b/tests/Unit/Controller/CmdbImportControllerTest.php @@ -394,6 +394,68 @@ public function testAValidUploadReturnsTheReport(): void { $this->assertSame(['success' => true, 'summary' => ['created' => 2]], $response->getData()); }//end testAValidUploadReturnsTheReport() + /** + * The spellings of updateExisting and what each one means; null is refused. + * + * @return array + */ + public static function updateExistingValues(): array { + return [ + 'absent' => [null, true], + 'empty' => ['', true], + 'true' => ['true', true], + 'TRUE' => ['TRUE', true], + 'one' => ['1', true], + 'false' => ['false', false], + 'padded false' => [' false', false], + 'False' => ['False ', false], + 'zero' => ['0', false], + 'typo' => ['flase', null], + 'off' => ['off', null], + 'no' => ['no', null], + 'yes' => ['yes', null], + 'blank' => [' ', null], + 'array' => [['false'], null], + ]; + }//end updateExistingValues() + + /** + * Only true/false and 1/0 select a mode; anything else is 400 FIELD_INVALID and nothing is imported. + * + * @param mixed $value The form value, or null for an absent field. + * @param bool|null $expected The mode passed to the import, or null for a refusal. + * + * @return void + */ + #[DataProvider('updateExistingValues')] + public function testUpdateExistingAcceptsOnlyExplicitValues(mixed $value, ?bool $expected): void { + $service = $this->service(); + $params = ['municipalityName' => 'Gemeente Voorbeeldstad']; + if ($value !== null) { + $params['updateExisting'] = $value; + } + + if ($expected === null) { + $service->expects($this->never())->method('import'); + } else { + $service->expects($this->once())->method('import') + ->with($this->anything(), $this->callback(fn (array $options): bool => $options['updateExisting'] === $expected)) + ->willReturn(['success' => true]); + } + + $response = $this->controller(file: $this->file(path: $this->upload()), params: $params, service: $service)->import(); + + if ($expected === null) { + $this->assertSame(400, $response->getStatus()); + $this->assertSame('FIELD_INVALID', $response->getData()['error']); + $this->assertEquals((object)['field' => 'updateExisting', 'accepted' => ['true', 'false']], $response->getData()['details']); + $this->assertSame('Field "updateExisting" must be one of: true, false.', $response->getData()['message']); + return; + } + + $this->assertSame(200, $response->getStatus()); + }//end testUpdateExistingAcceptsOnlyExplicitValues() + /** * Cancel answers 200 for a running import and 404 OPERATION_NOT_FOUND otherwise. * From e05fe9ecc9222969484ddf4b9735946017042e3d Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:38:36 +0200 Subject: [PATCH 11/57] fix(cmdb-import): a form field sent as an array is refused instead of read as "Array" The text fields were read with (string) casts, so `municipalityName[]=x` became the string "Array" (plus a warning), passed the not-empty check and could create a municipality of that name. missingRecords, municipalityUuid and municipalityName are now accepted only as single values; an array answers 400 FIELD_INVALID naming the field. An upload sent as `cmdbFile[]` carries arrays for every key, which the integer cast of `error` turned into UPLOAD_ERR_INI_SIZE (413); it is now no upload (400 NO_FILE_UPLOADED). The field checks move from validateRequest() into readOptions() to keep each method's branching small. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 121 +++++++++++++++--- .../changes/cmdb-export-import/contract.md | 4 +- .../Controller/CmdbImportControllerTest.php | 50 ++++++++ 3 files changed, 158 insertions(+), 17 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index 01dff5be..7fc02f9d 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -145,7 +145,27 @@ private function validateRequest(): array|JSONResponse { return $this->fromException(e: $e); } - $missingRecords = (string)$this->request->getParam('missingRecords', 'keep'); + return $this->readOptions(path: $upload['tmpName']); + }//end validateRequest() + + /** + * Read and check the form fields, after the upload itself was checked. + * + * A field sent as an array (`municipalityName[]=x`) is refused instead of + * being cast to the string "Array". + * + * @param string $path The checked upload. + * + * @return array{path: string, options: array}|JSONResponse The import input, or the first error. + * + * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 + */ + private function readOptions(string $path): array|JSONResponse { + $missingRecords = $this->stringParam(name: 'missingRecords', default: 'keep'); + if ($missingRecords === null) { + return $this->invalidField(field: 'missingRecords'); + } + if ($this->importService->supportsMissingRecords(mode: $missingRecords) === false) { return $this->error(code: 'MISSING_RECORDS_UNSUPPORTED', status: Http::STATUS_UNPROCESSABLE_ENTITY, details: ['accepted' => ['keep']]); } @@ -153,21 +173,27 @@ private function validateRequest(): array|JSONResponse { // An unrecognised value is refused rather than read as true: true is the mode that overwrites. $updateExisting = $this->booleanParam(name: 'updateExisting', default: true); if ($updateExisting === null) { - return $this->error( - code: 'FIELD_INVALID', - status: Http::STATUS_BAD_REQUEST, - details: ['field' => 'updateExisting', 'accepted' => ['true', 'false']] - ); + return $this->invalidField(field: 'updateExisting', accepted: ['true', 'false']); } - $municipalityUuid = trim((string)$this->request->getParam('municipalityUuid', '')); - $municipalityName = trim((string)$this->request->getParam('municipalityName', '')); + $municipalityUuid = $this->stringParam(name: 'municipalityUuid', default: ''); + $municipalityName = $this->stringParam(name: 'municipalityName', default: ''); + if ($municipalityUuid === null) { + return $this->invalidField(field: 'municipalityUuid'); + } + + if ($municipalityName === null) { + return $this->invalidField(field: 'municipalityName'); + } + + $municipalityUuid = trim($municipalityUuid); + $municipalityName = trim($municipalityName); if ($municipalityUuid === '' && $municipalityName === '') { return $this->error(code: CmdbImportException::MUNICIPALITY_REQUIRED, status: Http::STATUS_UNPROCESSABLE_ENTITY); } return [ - 'path' => $upload['tmpName'], + 'path' => $path, 'options' => [ 'municipalityUuid' => $municipalityUuid, 'municipalityName' => $municipalityName, @@ -175,7 +201,8 @@ private function validateRequest(): array|JSONResponse { 'operationId' => $this->request->getParam('operationId'), ], ]; - }//end validateRequest() + }//end readOptions() + /** * Ask a running CMDB import to stop between rows. @@ -199,6 +226,23 @@ public function cancel(string $operationId): JSONResponse { return new JSONResponse(data: ['success' => true, 'cancelRequested' => true], statusCode: Http::STATUS_OK); }//end cancel() + /** + * The 400 FIELD_INVALID response for a malformed form field. + * + * @param string $field The field. + * @param array $accepted The values the field accepts, when it has a fixed set. + * + * @return JSONResponse + */ + private function invalidField(string $field, array $accepted = []): JSONResponse { + $details = ['field' => $field]; + if ($accepted !== []) { + $details['accepted'] = $accepted; + } + + return $this->error(code: 'FIELD_INVALID', status: Http::STATUS_BAD_REQUEST, details: $details); + }//end invalidField() + /** * Translate a CmdbImportException into its contract response. * @@ -251,7 +295,7 @@ private function message(string $code, array $details): string { 'NOT_XLSX' => $this->l10n->t('The file is not an Excel workbook (.xlsx).'), 'FILE_TOO_LARGE' => $this->l10n->t('The file is larger than the maximum of %s MB.', [$megabytes]), 'MISSING_RECORDS_UNSUPPORTED' => $this->l10n->t('Only keeping records that are missing from the export is supported.'), - 'FIELD_INVALID' => $this->l10n->t('Field "%1$s" must be one of: %2$s.', [(string)($details['field'] ?? ''), $accepted]), + 'FIELD_INVALID' => $this->fieldMessage(field: (string)($details['field'] ?? ''), accepted: $accepted), 'MUNICIPALITY_REQUIRED' => $this->l10n->t('Choose a municipality or enter the name of a new one.'), 'MUNICIPALITY_INVALID' => $this->l10n->t('The chosen organisation is not a municipality.'), 'NO_SOURCE_SHEET' => $this->l10n->t('The workbook has neither of the sheets %s.', [$expected]), @@ -265,6 +309,22 @@ private function message(string $code, array $details): string { }; }//end message() + /** + * The message of FIELD_INVALID, naming the accepted values when the field has a fixed set. + * + * @param string $field The field. + * @param string $accepted The accepted values, comma-separated, or ''. + * + * @return string + */ + private function fieldMessage(string $field, string $accepted): string { + if ($accepted === '') { + return $this->l10n->t('Field "%s" has an invalid value.', [$field]); + } + + return $this->l10n->t('Field "%1$s" must be one of: %2$s.', [$field, $accepted]); + }//end fieldMessage() + /** * A boolean form field: `true`/`false` or `1`/`0`, trimmed and in any case. * @@ -294,6 +354,27 @@ private function booleanParam(string $name, bool $default): ?bool { }; }//end booleanParam() + /** + * A text form field. + * + * @param string $name The field. + * @param string $default The value when absent. + * + * @return string|null Null when the field is not a single value, such as `name[]=x`. + */ + private function stringParam(string $name, string $default): ?string { + $value = $this->request->getParam($name, $default); + if (is_string($value) === true) { + return $value; + } + + if (is_int($value) === true || is_float($value) === true) { + return (string)$value; + } + + return null; + }//end stringParam() + /** * The uploaded export, or null when none was sent. * @@ -305,13 +386,18 @@ private function uploadedFile(): ?array { return null; } - $error = (int)($file['error'] ?? UPLOAD_ERR_OK); + // `cmdbFile[]` gives arrays for every key; that is no usable upload. + $error = $file['error'] ?? UPLOAD_ERR_OK; + if (is_int($error) === false) { + return null; + } + if ($error === UPLOAD_ERR_INI_SIZE || $error === UPLOAD_ERR_FORM_SIZE) { return ['tmpName' => '', 'name' => (string)($file['name'] ?? ''), 'size' => 0, 'tooLarge' => true]; } - $tmpName = (string)($file['tmp_name'] ?? ''); - if ($error !== UPLOAD_ERR_OK || $tmpName === '') { + $tmpName = $file['tmp_name'] ?? ''; + if ($error !== UPLOAD_ERR_OK || is_string($tmpName) === false || $tmpName === '') { return null; } @@ -320,6 +406,11 @@ private function uploadedFile(): ?array { $size = (int)filesize($tmpName); } - return ['tmpName' => $tmpName, 'name' => (string)($file['name'] ?? ''), 'size' => $size, 'tooLarge' => false]; + $name = $file['name'] ?? ''; + if (is_string($name) === false) { + $name = ''; + } + + return ['tmpName' => $tmpName, 'name' => $name, 'size' => $size, 'tooLarge' => false]; }//end uploadedFile() }//end class diff --git a/openspec/changes/cmdb-export-import/contract.md b/openspec/changes/cmdb-export-import/contract.md index bf431535..1316cfb2 100644 --- a/openspec/changes/cmdb-export-import/contract.md +++ b/openspec/changes/cmdb-export-import/contract.md @@ -62,7 +62,7 @@ Paths are relative to `/index.php/apps/stackiq`. | 500 | `IMPORT_FAILED` (unexpected; generic message, details only in the log) | | 503 | `MAPPING_UNAVAILABLE`, `READER_UNAVAILABLE`, `NOT_CONFIGURED` | -Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. For `FIELD_INVALID`, it is `{"field": "updateExisting", "accepted": ["true", "false"]}`. +Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. For `FIELD_INVALID`, it names the field, plus the accepted values when the field has a fixed set: `{"field": "updateExisting", "accepted": ["true", "false"]}`, or `{"field": "municipalityName"}`. ### `POST /api/cmdb-import/{operationId}/cancel` **Auth**: the same as the import: a Nextcloud admin or delegated stackiq admin session, plus CSRF token. @@ -92,7 +92,7 @@ Returns the `ProgressTracker` snapshot for the `cmdb_import` operation: `progres | `NOT_XLSX` | not an xlsx workbook | extension is not `.xlsx`, no ZIP signature, or no `xl/workbook.xml` | | `FILE_TOO_LARGE` | too large | larger than the profile's `maxFileBytes` (10 MB) | | `MISSING_RECORDS_UNSUPPORTED` | option not supported | `missingRecords` is not `keep` | -| `FIELD_INVALID` | malformed field (400) | `updateExisting` is not `true`, `false`, `1` or `0` | +| `FIELD_INVALID` | malformed field (400) | `updateExisting` is not `true`, `false`, `1` or `0`, or `missingRecords`, `municipalityUuid` or `municipalityName` is sent as an array (`name[]=…`) | | `MUNICIPALITY_REQUIRED` | no consumer | neither `municipalityUuid` nor `municipalityName` given | | `MUNICIPALITY_INVALID` | wrong consumer | uuid unknown, or the organisation is not of type Municipality | | `NO_SOURCE_SHEET` | nothing to read | neither "Onbeh Applicaties CMDB" nor "Beheerde Applicaties CMDB" present | diff --git a/tests/Unit/Controller/CmdbImportControllerTest.php b/tests/Unit/Controller/CmdbImportControllerTest.php index aef18d83..aaf71269 100644 --- a/tests/Unit/Controller/CmdbImportControllerTest.php +++ b/tests/Unit/Controller/CmdbImportControllerTest.php @@ -456,6 +456,56 @@ public function testUpdateExistingAcceptsOnlyExplicitValues(mixed $value, ?bool $this->assertSame(200, $response->getStatus()); }//end testUpdateExistingAcceptsOnlyExplicitValues() + /** + * A text field sent as an array is 400 FIELD_INVALID naming it, not the string "Array". + * + * @return array + */ + public static function textFields(): array { + return [ + 'missingRecords' => ['missingRecords'], + 'municipalityUuid' => ['municipalityUuid'], + 'municipalityName' => ['municipalityName'], + ]; + }//end textFields() + + /** + * An array-valued text field is refused and nothing is imported. + * + * @param string $field The field sent as an array. + * + * @return void + */ + #[DataProvider('textFields')] + public function testAnArrayValuedFieldIsRefused(string $field): void { + $service = $this->service(); + $service->expects($this->never())->method('import'); + $params = ['municipalityName' => 'Gemeente Voorbeeldstad', $field => ['x']]; + + $response = $this->controller(file: $this->file(path: $this->upload()), params: $params, service: $service)->import(); + + $this->assertSame(400, $response->getStatus()); + $this->assertSame('FIELD_INVALID', $response->getData()['error']); + $this->assertEquals((object)['field' => $field], $response->getData()['details']); + $this->assertSame('Field "' . $field . '" has an invalid value.', $response->getData()['message']); + }//end testAnArrayValuedFieldIsRefused() + + /** + * An upload field sent as `cmdbFile[]` is no upload: 400 NO_FILE_UPLOADED, and the ZIP check never runs. + * + * @return void + */ + public function testAnArrayValuedUploadIsNoUpload(): void { + $service = $this->service(); + $service->expects($this->never())->method('assertXlsx'); + $file = ['tmp_name' => [$this->upload()], 'name' => ['export.xlsx'], 'size' => [4], 'error' => [UPLOAD_ERR_OK]]; + + $response = $this->controller(file: $file, params: ['municipalityName' => 'Gemeente Voorbeeldstad'], service: $service)->import(); + + $this->assertSame(400, $response->getStatus()); + $this->assertSame('NO_FILE_UPLOADED', $response->getData()['error']); + }//end testAnArrayValuedUploadIsNoUpload() + /** * Cancel answers 200 for a running import and 404 OPERATION_NOT_FOUND otherwise. * From 5ffb1ad29103be20081722e23ba78005d7dd3fd9 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:40:25 +0200 Subject: [PATCH 12/57] fix(cmdb-import): a server-side upload failure answers UPLOAD_FAILED instead of "no file uploaded" Every PHP upload error other than the two size errors became 400 NO_FILE_UPLOADED, so a missing tmp dir or a full disk told the admin no file was sent and left nothing in the log. UPLOAD_ERR_NO_TMP_DIR, CANT_WRITE and EXTENSION now answer 500 UPLOAD_FAILED and log the PHP error code. FILE_TOO_LARGE also reports the limit that fired: PHP's upload_max_filesize when it is lower than the profile's maximum, and a body over post_max_size (which PHP empties, files and fields alike) answers 413 instead of NO_FILE_UPLOADED. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 80 ++++++++++-- .../changes/cmdb-export-import/contract.md | 7 +- .../Controller/CmdbImportControllerTest.php | 115 +++++++++++++++++- 3 files changed, 190 insertions(+), 12 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index 7fc02f9d..e407cd4e 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -129,13 +129,25 @@ public function import(): JSONResponse { * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 */ private function validateRequest(): array|JSONResponse { + $maxBytes = $this->importService->maxFileBytes(); $upload = $this->uploadedFile(); if ($upload === null) { - return $this->error(code: 'NO_FILE_UPLOADED', status: Http::STATUS_BAD_REQUEST); + return $this->missingUpload(maxBytes: $maxBytes); } - $maxBytes = $this->importService->maxFileBytes(); - if ($upload['tooLarge'] === true || $upload['size'] > $maxBytes) { + if ($upload['serverError'] !== null) { + // The upload reached PHP but could not be stored: a server problem, not the admin's. + $this->logger->error('CmdbImportController: the upload could not be stored', ['uploadError' => $upload['serverError']]); + return $this->error(code: 'UPLOAD_FAILED', status: Http::STATUS_INTERNAL_SERVER_ERROR); + } + + if ($upload['tooLarge'] === true) { + // PHP's upload_max_filesize fired; it can be lower than the profile's maximum. + $limit = min($maxBytes, ($this->iniBytes(name: 'upload_max_filesize') ?? $maxBytes)); + return $this->error(code: 'FILE_TOO_LARGE', status: Http::STATUS_REQUEST_ENTITY_TOO_LARGE, details: ['maxBytes' => $limit]); + } + + if ($upload['size'] > $maxBytes) { return $this->error(code: 'FILE_TOO_LARGE', status: Http::STATUS_REQUEST_ENTITY_TOO_LARGE, details: ['maxBytes' => $maxBytes]); } @@ -148,6 +160,52 @@ private function validateRequest(): array|JSONResponse { return $this->readOptions(path: $upload['tmpName']); }//end validateRequest() + /** + * The answer when no upload arrived: 413 when the body was over post_max_size, else 400. + * + * PHP drops the whole body, files and fields alike, when it is larger than + * post_max_size, so such a request looks like one without a file. + * + * @param int $maxBytes The profile's maximum. + * + * @return JSONResponse + * + * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 + */ + private function missingUpload(int $maxBytes): JSONResponse { + $postLimit = $this->iniBytes(name: 'post_max_size'); + $length = (int)$this->request->getHeader('Content-Length'); + if ($postLimit !== null && $postLimit > 0 && $length > $postLimit) { + return $this->error( + code: 'FILE_TOO_LARGE', + status: Http::STATUS_REQUEST_ENTITY_TOO_LARGE, + details: ['maxBytes' => min($maxBytes, $postLimit)] + ); + } + + return $this->error(code: 'NO_FILE_UPLOADED', status: Http::STATUS_BAD_REQUEST); + }//end missingUpload() + + /** + * A PHP size setting such as `10M`, in bytes. + * + * @param string $name The ini setting. + * + * Protected so a test can stand in for php.ini, whose size settings cannot + * be changed at run time. + * + * @return int|null Null when it is unset or not a size; 0 means no limit. + */ + protected function iniBytes(string $name): ?int { + $value = trim((string)ini_get($name)); + if (preg_match('/^(\d+)\s*([KMG]?)$/i', $value, $matches) !== 1) { + return null; + } + + $exponent = ['' => 0, 'K' => 1, 'M' => 2, 'G' => 3][strtoupper($matches[2])]; + return ((int)$matches[1] * (1024 ** $exponent)); + }//end iniBytes() + /** * Read and check the form fields, after the upload itself was checked. * @@ -286,7 +344,7 @@ private function error(string $code, int $status, array $details = []): JSONResp * @SuppressWarnings(PHPMD.CyclomaticComplexity) One branch per contract error code. */ private function message(string $code, array $details): string { - $megabytes = (string)intdiv($this->importService->maxFileBytes(), 1048576); + $megabytes = (string)round((int)($details['maxBytes'] ?? $this->importService->maxFileBytes()) / 1048576, 1); $expected = implode(', ', array_map('strval', ($details['expected'] ?? []))); $accepted = implode(', ', array_map('strval', ($details['accepted'] ?? []))); @@ -305,6 +363,7 @@ private function message(string $code, array $details): string { 'READER_UNAVAILABLE' => $this->l10n->t('The Excel reader is not available: OpenRegister is missing or incomplete.'), 'NOT_CONFIGURED' => $this->l10n->t('Stackiq is not configured: the register or its schemas cannot be found.'), 'OPERATION_NOT_FOUND' => $this->l10n->t('No running CMDB import has this id.'), + 'UPLOAD_FAILED' => $this->l10n->t('The server could not store the uploaded file. The details are in the Nextcloud log.'), default => $this->l10n->t('The import failed. The details are in the Nextcloud log.'), }; }//end message() @@ -378,7 +437,10 @@ private function stringParam(string $name, string $default): ?string { /** * The uploaded export, or null when none was sent. * - * @return array{tmpName: string, name: string, size: int, tooLarge: bool}|null + * `serverError` is the PHP upload error when the file reached the server + * but could not be stored (no tmp dir, disk full, an extension stopped it). + * + * @return array{tmpName: string, name: string, size: int, tooLarge: bool, serverError: int|null}|null */ private function uploadedFile(): ?array { $file = $this->request->getUploadedFile(self::FILE_FIELD); @@ -393,7 +455,11 @@ private function uploadedFile(): ?array { } if ($error === UPLOAD_ERR_INI_SIZE || $error === UPLOAD_ERR_FORM_SIZE) { - return ['tmpName' => '', 'name' => (string)($file['name'] ?? ''), 'size' => 0, 'tooLarge' => true]; + return ['tmpName' => '', 'name' => '', 'size' => 0, 'tooLarge' => true, 'serverError' => null]; + } + + if (in_array($error, [UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE, UPLOAD_ERR_EXTENSION], true) === true) { + return ['tmpName' => '', 'name' => '', 'size' => 0, 'tooLarge' => false, 'serverError' => $error]; } $tmpName = $file['tmp_name'] ?? ''; @@ -411,6 +477,6 @@ private function uploadedFile(): ?array { $name = ''; } - return ['tmpName' => $tmpName, 'name' => $name, 'size' => $size, 'tooLarge' => false]; + return ['tmpName' => $tmpName, 'name' => $name, 'size' => $size, 'tooLarge' => false, 'serverError' => null]; }//end uploadedFile() }//end class diff --git a/openspec/changes/cmdb-export-import/contract.md b/openspec/changes/cmdb-export-import/contract.md index 1316cfb2..796ad297 100644 --- a/openspec/changes/cmdb-export-import/contract.md +++ b/openspec/changes/cmdb-export-import/contract.md @@ -59,10 +59,10 @@ Paths are relative to `/index.php/apps/stackiq`. | 412 | missing or invalid CSRF token (Nextcloud) | | 413 | `FILE_TOO_LARGE` | | 422 | `MISSING_RECORDS_UNSUPPORTED`, `MUNICIPALITY_REQUIRED`, `MUNICIPALITY_INVALID`, `NO_SOURCE_SHEET`, `MISSING_COLUMN`, `TOO_MANY_ROWS` | -| 500 | `IMPORT_FAILED` (unexpected; generic message, details only in the log) | +| 500 | `UPLOAD_FAILED` (PHP could not store the upload), `IMPORT_FAILED` (unexpected; generic message, details only in the log) | | 503 | `MAPPING_UNAVAILABLE`, `READER_UNAVAILABLE`, `NOT_CONFIGURED` | -Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. For `FIELD_INVALID`, it names the field, plus the accepted values when the field has a fixed set: `{"field": "updateExisting", "accepted": ["true", "false"]}`, or `{"field": "municipalityName"}`. +Error body: `{"success": false, "error": "", "message": "", "details": {...}}`. `details` is always an object, empty when the code has none. For `MISSING_COLUMN`, `details` is `{"sheet": "...", "column": "..."}`. For `NO_SOURCE_SHEET`, it is `{"expected": ["Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"]}`. For `TOO_MANY_ROWS`, it is `{"sheet": "...", "limit": 10000}`. For `FILE_TOO_LARGE`, it is `{"maxBytes": 10485760}`: the profile's maximum, or PHP's `upload_max_filesize` / `post_max_size` when that is the lower limit that stopped the upload. For `MISSING_RECORDS_UNSUPPORTED`, it is `{"accepted": ["keep"]}`. For `FIELD_INVALID`, it names the field, plus the accepted values when the field has a fixed set: `{"field": "updateExisting", "accepted": ["true", "false"]}`, or `{"field": "municipalityName"}`. ### `POST /api/cmdb-import/{operationId}/cancel` **Auth**: the same as the import: a Nextcloud admin or delegated stackiq admin session, plus CSRF token. @@ -90,7 +90,8 @@ Returns the `ProgressTracker` snapshot for the `cmdb_import` operation: `progres |------|---------|-----------| | `NO_FILE_UPLOADED` | no file | `cmdbFile` missing | | `NOT_XLSX` | not an xlsx workbook | extension is not `.xlsx`, no ZIP signature, or no `xl/workbook.xml` | -| `FILE_TOO_LARGE` | too large | larger than the profile's `maxFileBytes` (10 MB) | +| `FILE_TOO_LARGE` | too large | larger than the profile's `maxFileBytes` (10 MB), or stopped by PHP's `upload_max_filesize` or `post_max_size` | +| `UPLOAD_FAILED` | upload not stored (500) | PHP reported `UPLOAD_ERR_NO_TMP_DIR`, `UPLOAD_ERR_CANT_WRITE` or `UPLOAD_ERR_EXTENSION`; logged | | `MISSING_RECORDS_UNSUPPORTED` | option not supported | `missingRecords` is not `keep` | | `FIELD_INVALID` | malformed field (400) | `updateExisting` is not `true`, `false`, `1` or `0`, or `missingRecords`, `municipalityUuid` or `municipalityName` is sent as an array (`name[]=…`) | | `MUNICIPALITY_REQUIRED` | no consumer | neither `municipalityUuid` nor `municipalityName` given | diff --git a/tests/Unit/Controller/CmdbImportControllerTest.php b/tests/Unit/Controller/CmdbImportControllerTest.php index aaf71269..6e9fb049 100644 --- a/tests/Unit/Controller/CmdbImportControllerTest.php +++ b/tests/Unit/Controller/CmdbImportControllerTest.php @@ -88,13 +88,24 @@ private function upload(string $content = "PK\x03\x04"): string { * @param array|null $file The uploaded file entry, or null. * @param array $params Form fields. * @param CmdbExportImportService|MockObject|null $service The service. + * @param LoggerInterface|MockObject|null $logger The logger. + * @param array $headers Request headers. + * @param array|null $ini PHP size settings in bytes, standing in for php.ini; null reads php.ini. * * @return CmdbImportController */ - private function controller(?array $file, array $params, CmdbExportImportService|MockObject|null $service = null): CmdbImportController { + private function controller( + ?array $file, + array $params, + CmdbExportImportService|MockObject|null $service = null, + LoggerInterface|MockObject|null $logger = null, + array $headers = [], + ?array $ini = null, + ): CmdbImportController { $request = $this->createMock(IRequest::class); $request->method('getUploadedFile')->willReturnCallback(fn (string $key) => $key === 'cmdbFile' ? $file : null); $request->method('getParam')->willReturnCallback(fn (string $key, $default = null) => ($params[$key] ?? $default)); + $request->method('getHeader')->willReturnCallback(fn (string $name): string => ($headers[$name] ?? '')); $l10n = $this->createMock(IL10N::class); $l10n->method('t')->willReturnCallback(fn (string $text, $parameters = []): string => vsprintf($text, (array)$parameters)); @@ -105,7 +116,36 @@ private function controller(?array $file, array $params, CmdbExportImportService $service->method('supportsMissingRecords')->willReturnCallback(fn (string $mode): bool => $mode === 'keep'); } - return new CmdbImportController(request: $request, importService: $service, l10n: $l10n, logger: $this->createMock(LoggerInterface::class)); + $logger = ($logger ?? $this->createMock(LoggerInterface::class)); + if ($ini === null) { + return new CmdbImportController(request: $request, importService: $service, l10n: $l10n, logger: $logger); + } + + return new class($request, $service, $l10n, $logger, $ini) extends CmdbImportController { + /** + * Constructor. + * + * @param IRequest $request The request. + * @param CmdbExportImportService $service The service. + * @param IL10N $l10n Translations. + * @param LoggerInterface $logger Logger. + * @param array $ini The size settings. + */ + public function __construct(IRequest $request, CmdbExportImportService $service, IL10N $l10n, LoggerInterface $logger, private array $ini) { + parent::__construct(request: $request, importService: $service, l10n: $l10n, logger: $logger); + } + + /** + * The stand-in setting. + * + * @param string $name The ini setting. + * + * @return int|null + */ + protected function iniBytes(string $name): ?int { + return ($this->ini[$name] ?? null); + } + }; }//end controller() /** @@ -225,6 +265,77 @@ public function testAnOversizedFileIsRefusedBeforeReading(): void { $this->assertSame(413, $this->controller(file: $tooBig, params: [], service: $service)->import()->getStatus()); }//end testAnOversizedFileIsRefusedBeforeReading() + /** + * An upload stopped by upload_max_filesize reports that limit when it is lower than the profile's. + * + * @return void + */ + public function testAnUploadOverPhpsLimitReportsThatLimit(): void { + $service = $this->service(); + $service->expects($this->never())->method('import'); + $tooBig = ['tmp_name' => '', 'name' => 'export.xlsx', 'size' => 0, 'error' => UPLOAD_ERR_INI_SIZE]; + + $response = $this->controller(file: $tooBig, params: [], service: $service, ini: ['upload_max_filesize' => 2097152])->import(); + + $this->assertSame(413, $response->getStatus()); + $this->assertEquals((object)['maxBytes' => 2097152], $response->getData()['details']); + $this->assertSame('The file is larger than the maximum of 2 MB.', $response->getData()['message']); + + $higher = $this->controller(file: $tooBig, params: [], service: $service, ini: ['upload_max_filesize' => 52428800])->import(); + $this->assertEquals((object)['maxBytes' => 10485760], $higher->getData()['details']); + }//end testAnUploadOverPhpsLimitReportsThatLimit() + + /** + * A body over post_max_size arrives without files or fields; it is 413, not "no file". + * + * @return void + */ + public function testABodyOverPostMaxSizeIsTooLarge(): void { + $ini = ['post_max_size' => 8388608]; + + $over = $this->controller(file: null, params: [], headers: ['Content-Length' => '9000000'], ini: $ini)->import(); + $this->assertSame(413, $over->getStatus()); + $this->assertSame('FILE_TOO_LARGE', $over->getData()['error']); + $this->assertEquals((object)['maxBytes' => 8388608], $over->getData()['details']); + + $under = $this->controller(file: null, params: [], headers: ['Content-Length' => '1000'], ini: $ini)->import(); + $this->assertSame('NO_FILE_UPLOADED', $under->getData()['error']); + }//end testABodyOverPostMaxSizeIsTooLarge() + + /** + * A server-side upload failure is 500 UPLOAD_FAILED and logged, not "no file was uploaded". + * + * @return array + */ + public static function serverUploadErrors(): array { + return [ + 'no tmp dir' => [UPLOAD_ERR_NO_TMP_DIR], + 'cannot write' => [UPLOAD_ERR_CANT_WRITE], + 'extension' => [UPLOAD_ERR_EXTENSION], + ]; + }//end serverUploadErrors() + + /** + * A server-side upload error answers 500 UPLOAD_FAILED and logs the PHP error. + * + * @param int $error The PHP upload error. + * + * @return void + */ + #[DataProvider('serverUploadErrors')] + public function testAServerSideUploadErrorIsUploadFailed(int $error): void { + $service = $this->service(); + $service->expects($this->never())->method('assertXlsx'); + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('error')->with($this->anything(), ['uploadError' => $error]); + $file = ['tmp_name' => '', 'name' => 'export.xlsx', 'size' => 0, 'error' => $error]; + + $response = $this->controller(file: $file, params: ['municipalityName' => 'Gemeente Voorbeeldstad'], service: $service, logger: $logger)->import(); + + $this->assertSame(500, $response->getStatus()); + $this->assertSame('UPLOAD_FAILED', $response->getData()['error']); + }//end testAServerSideUploadErrorIsUploadFailed() + /** * A file that is not xlsx is 400 NOT_XLSX, checked before missingRecords and the municipality. * From 0acd6aafab4a8fd52111b912f13a94ad06137492 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:48:04 +0200 Subject: [PATCH 13/57] fix(cmdb-import): no cancel flag outlives the run it was meant for, and the id pattern ends at \z c215ea42 made cancel refuse an import that is no longer running, but a cancel that arrives after the last row's check still left `cancel_` in the cache for an hour, and a later run that reused the id stopped before row 1. A completed run now drops its flag, and a run that takes a client-chosen id drops any flag left for it (new ProgressTracker::clearCancelRequested(); startOperation() is left alone because the ArchiMate cancel may set the flag before its run starts). OPERATION_ID_PATTERN ended in `$`, which also matches before a trailing newline, so "cmdb-12345678\n" became a cache key; it ends in `\z` now. Co-Authored-By: Claude Opus 5.5 --- lib/Service/CmdbExportImportService.php | 18 +++++- lib/Service/ProgressTracker.php | 18 +++++- .../Service/CmdbExportImportServiceTest.php | 57 +++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/lib/Service/CmdbExportImportService.php b/lib/Service/CmdbExportImportService.php index a95b3e65..fa696dcc 100644 --- a/lib/Service/CmdbExportImportService.php +++ b/lib/Service/CmdbExportImportService.php @@ -84,8 +84,11 @@ class CmdbExportImportService { /** * Operation ids a client may choose; anything else gets a generated id. + * + * `\z`, not `$`: `$` also matches before a trailing newline, which would + * let "cmdb-12345678\n" through as a cache key. */ - public const OPERATION_ID_PATTERN = '/^cmdb-[A-Za-z0-9-]{8,64}$/'; + public const OPERATION_ID_PATTERN = '/^cmdb-[A-Za-z0-9-]{8,64}\z/'; /** * OpenRegister's migration-pack mapping engine (not a public contract). @@ -528,6 +531,8 @@ private function finishOperation(array $report): void { } $this->progressTracker->completeOperation(finalStatistics: ['report' => $report]); + // A cancel that came in after the last row's check has nothing left to stop. + $this->progressTracker->clearCancelRequested(operationId: (string)$report['operationId']); }//end finishOperation() /** @@ -1279,13 +1284,22 @@ private function coordinates(): array { /** * The operation id the client chose, or a new one. * + * The client's id is replaced when it does not match the pattern. An id + * that is taken drops any cancel request left over from an earlier run + * with the same id, so the new run is not stopped before row 1. + * * @param array $options The import options. * * @return string + * + * @spec openspec/changes/cmdb-export-import/tasks.md#task-7 */ private function operationIdFrom(array $options): string { $operationId = $options['operationId'] ?? null; - if (is_string($operationId) === true && preg_match(self::OPERATION_ID_PATTERN, $operationId) === 1) { + if (is_string($operationId) === true + && preg_match(self::OPERATION_ID_PATTERN, $operationId) === 1 + ) { + $this->progressTracker->clearCancelRequested(operationId: $operationId); return $operationId; } diff --git a/lib/Service/ProgressTracker.php b/lib/Service/ProgressTracker.php index a2b90aa7..0bf2806e 100644 --- a/lib/Service/ProgressTracker.php +++ b/lib/Service/ProgressTracker.php @@ -34,7 +34,7 @@ * * @SuppressWarnings(PHPMD.TooManyPublicMethods) Each public method is one step of an * operation's life (start, phase, progress, warning, error, statistics, complete, fail, - * cancel) that an import calls on the same snapshot; splitting them would hand that + * cancel, clear a cancel) that an import calls on the same snapshot; splitting them would hand that * snapshot from class to class. * * @category Service @@ -432,6 +432,22 @@ public function isCancelRequested(string $operationId): bool { return $this->store->get(key: 'cancel_' . $operationId) === true; }//end isCancelRequested() + /** + * Drop a cancel request for an operation, from any request. + * + * For a caller that reuses an id: a cancel that arrived after the previous + * run's last check would otherwise stop the next run before its first item. + * + * @param string $operationId The operation whose cancel request goes + * + * @return void + * + * @spec openspec/changes/cmdb-export-import/tasks.md#task-7 + */ + public function clearCancelRequested(string $operationId): void { + $this->store->remove(key: 'cancel_' . $operationId); + }//end clearCancelRequested() + /** * Mark the current operation as stopped on a cancel, keeping the counts it reached. * diff --git a/tests/Unit/Service/CmdbExportImportServiceTest.php b/tests/Unit/Service/CmdbExportImportServiceTest.php index 4a9db49c..c47ae184 100644 --- a/tests/Unit/Service/CmdbExportImportServiceTest.php +++ b/tests/Unit/Service/CmdbExportImportServiceTest.php @@ -1220,6 +1220,63 @@ public function testCancelNeedsARunningImport(): void { $this->assertArrayNotHasKey('cancel_cmdb-finished-1', $this->cache); }//end testCancelNeedsARunningImport() + /** + * A cancel that arrives after the last row's check leaves no flag that a later run with the same id would inherit. + * + * @return void + */ + public function testACancelAfterTheLastCheckLeavesNoFlag(): void { + $this->seedOrganisation(uuid: 'muni-1', name: 'Gemeente Voorbeeldstad', type: 'Municipality'); + $service = null; + $this->beforeSave = function (int $schema) use (&$service): void { + if ($schema === self::USAGE) { + $this->assertTrue($service->requestCancel(operationId: 'cmdb-late-cancel-1')); + } + }; + $service = $this->service(reader: $this->rowsReader(rows: [$this->row(appId: '1', row: 2)])); + + $report = $service->import(path: '', options: ['municipalityUuid' => 'muni-1', 'operationId' => 'cmdb-late-cancel-1']); + + $this->assertFalse($report['cancelled'], 'the only row was already done'); + $this->assertSame('completed', $this->cache['progress_cmdb-late-cancel-1']['status']); + $this->assertArrayNotHasKey('cancel_cmdb-late-cancel-1', $this->cache); + }//end testACancelAfterTheLastCheckLeavesNoFlag() + + /** + * A run that reuses an id is not stopped by a cancel flag an earlier run left behind. + * + * @return void + */ + public function testAReusedIdIgnoresALeftoverCancel(): void { + $this->seedOrganisation(uuid: 'muni-1', name: 'Gemeente Voorbeeldstad', type: 'Municipality'); + $this->cache['cancel_cmdb-reused-0001'] = true; + $service = $this->service(reader: $this->rowsReader(rows: [$this->row(appId: '1', row: 2), $this->row(appId: '2', row: 3)])); + + $report = $service->import(path: '', options: ['municipalityUuid' => 'muni-1', 'operationId' => 'cmdb-reused-0001']); + + $this->assertSame('cmdb-reused-0001', $report['operationId']); + $this->assertFalse($report['cancelled']); + $this->assertSame(2, $report['summary']['processed']); + $this->assertArrayNotHasKey('cancel_cmdb-reused-0001', $this->cache); + }//end testAReusedIdIgnoresALeftoverCancel() + + /** + * An id with a trailing newline does not match the pattern: it is replaced, and cancel refuses it. + * + * @return void + */ + public function testAnIdWithATrailingNewlineIsRefused(): void { + $this->assertSame(0, preg_match(CmdbExportImportService::OPERATION_ID_PATTERN, "cmdb-12345678\n")); + $this->seedOrganisation(uuid: 'muni-1', name: 'Gemeente Voorbeeldstad', type: 'Municipality'); + $service = $this->service(reader: $this->rowsReader(rows: [$this->row(appId: '1', row: 2)])); + + $report = $service->import(path: '', options: ['municipalityUuid' => 'muni-1', 'operationId' => "cmdb-12345678\n"]); + + $this->assertNotSame("cmdb-12345678\n", $report['operationId']); + $this->assertFalse($service->requestCancel(operationId: "cmdb-12345678\n")); + $this->assertArrayNotHasKey("cancel_cmdb-12345678\n", $this->cache); + }//end testAnIdWithATrailingNewlineIsRefused() + /** * A failure outside a row stops the operation as failed instead of leaving it running. * From 1a9e5d860f65b5bb9c15ddc89e4018952dba8c48 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:48:18 +0200 Subject: [PATCH 14/57] fix(cmdb-import): a client-chosen operationId that is still running gets a generated id instead startOperation() overwrites `progress_`, owner included, so a double submit or a second admin reusing a live id mixed two runs' counters on one record, and one cancel stopped both. An id whose operation is still running is now treated like a malformed one: replaced by a generated id, which the report returns as operationId, as the contract already promises for ids it does not accept. Co-Authored-By: Claude Opus 5.5 --- lib/Service/CmdbExportImportService.php | 9 +++++--- .../changes/cmdb-export-import/contract.md | 2 +- .../Service/CmdbExportImportServiceTest.php | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/Service/CmdbExportImportService.php b/lib/Service/CmdbExportImportService.php index fa696dcc..ee2513ed 100644 --- a/lib/Service/CmdbExportImportService.php +++ b/lib/Service/CmdbExportImportService.php @@ -1284,9 +1284,11 @@ private function coordinates(): array { /** * The operation id the client chose, or a new one. * - * The client's id is replaced when it does not match the pattern. An id - * that is taken drops any cancel request left over from an earlier run - * with the same id, so the new run is not stopped before row 1. + * The client's id is replaced when it does not match the pattern, and + * also when an operation with that id is still running: reusing it would + * overwrite that run's progress and owner, and a cancel would stop both. + * An id that is taken drops any cancel request left over from an earlier + * run with the same id, so the new run is not stopped before row 1. * * @param array $options The import options. * @@ -1298,6 +1300,7 @@ private function operationIdFrom(array $options): string { $operationId = $options['operationId'] ?? null; if (is_string($operationId) === true && preg_match(self::OPERATION_ID_PATTERN, $operationId) === 1 + && ($this->progressTracker->getProgress(operationId: $operationId)['status'] ?? null) !== 'running' ) { $this->progressTracker->clearCancelRequested(operationId: $operationId); return $operationId; diff --git a/openspec/changes/cmdb-export-import/contract.md b/openspec/changes/cmdb-export-import/contract.md index 796ad297..1c64c181 100644 --- a/openspec/changes/cmdb-export-import/contract.md +++ b/openspec/changes/cmdb-export-import/contract.md @@ -21,7 +21,7 @@ Paths are relative to `/index.php/apps/stackiq`. | `municipalityName` | string | one of the two | | name of a Municipality to reuse (same normalised name) or create | | `updateExisting` | `true`/`false` | no | `true` | `false` reports matched rows as skipped (`exists`). `1`/`0` are accepted too, trimmed and in any case; any other value is refused with 400 `FIELD_INVALID` | | `missingRecords` | string | no | `keep` | only `keep` is accepted; `mark` and `remove` are reserved | -| `operationId` | string | no | generated | progress operation id, readable through `GET /api/progress/{operationId}`; `cmdb-` followed by 8 to 64 letters, digits or hyphens (for example `cmdb-` plus a uuid v4). Any other value is replaced by a generated id, returned as `operationId` | +| `operationId` | string | no | generated | progress operation id, readable through `GET /api/progress/{operationId}`; `cmdb-` followed by 8 to 64 letters, digits or hyphens (for example `cmdb-` plus a uuid v4). Any other value, and the id of a `cmdb_import` that is still running, is replaced by a generated id, returned as `operationId` | **Response (200):** ```json diff --git a/tests/Unit/Service/CmdbExportImportServiceTest.php b/tests/Unit/Service/CmdbExportImportServiceTest.php index c47ae184..a27779e6 100644 --- a/tests/Unit/Service/CmdbExportImportServiceTest.php +++ b/tests/Unit/Service/CmdbExportImportServiceTest.php @@ -1260,6 +1260,27 @@ public function testAReusedIdIgnoresALeftoverCancel(): void { $this->assertArrayNotHasKey('cancel_cmdb-reused-0001', $this->cache); }//end testAReusedIdIgnoresALeftoverCancel() + /** + * An id whose operation is still running is replaced, so the live run keeps its record and owner. + * + * @return void + */ + public function testTheIdOfARunningOperationIsReplaced(): void { + $this->seedOrganisation(uuid: 'muni-1', name: 'Gemeente Voorbeeldstad', type: 'Municipality'); + $service = $this->service(reader: $this->rowsReader(rows: [$this->row(appId: '1', row: 2)])); + $this->tracker->startOperation(operationType: 'cmdb_import', options: ['total_items' => 7], ownerUid: 'other-admin', operationId: 'cmdb-live-00001'); + + $report = $service->import(path: '', options: ['municipalityUuid' => 'muni-1', 'operationId' => 'cmdb-live-00001']); + + $this->assertNotSame('cmdb-live-00001', $report['operationId']); + $this->assertMatchesRegularExpression(CmdbExportImportService::OPERATION_ID_PATTERN, $report['operationId']); + $live = $this->cache['progress_cmdb-live-00001']; + $this->assertSame('running', $live['status']); + $this->assertSame('other-admin', $live['owner_uid']); + $this->assertSame(7, $live['total_items']); + $this->assertSame('completed', $this->cache['progress_' . $report['operationId']]['status']); + }//end testTheIdOfARunningOperationIsReplaced() + /** * An id with a trailing newline does not match the pattern: it is replaced, and cancel refuses it. * From 404d83344fdd9d511beda552b507f94239911374 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:49:42 +0200 Subject: [PATCH 15/57] test(cmdb-import): pin the controller's logging, field passthrough and malformed cancel ids The logger was an unconfigured mock, so dropping either log call went unnoticed. The tests now assert that a service refusal is logged at info with its code, details and reason, and an unexpected error at error with the exception; that both municipality fields arrive trimmed and an operationId outside the pattern arrives unchanged (the service decides); and that cancel passes a malformed id through and answers 404 OPERATION_NOT_FOUND. tearDown() now calls parent::tearDown(). The parser, \Error and upload cases are covered by the commits that changed that behaviour. Co-Authored-By: Claude Opus 5.5 --- .../Controller/CmdbImportControllerTest.php | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/Unit/Controller/CmdbImportControllerTest.php b/tests/Unit/Controller/CmdbImportControllerTest.php index 6e9fb049..981a5be4 100644 --- a/tests/Unit/Controller/CmdbImportControllerTest.php +++ b/tests/Unit/Controller/CmdbImportControllerTest.php @@ -66,6 +66,8 @@ protected function tearDown(): void { unlink($file); } } + + parent::tearDown(); }//end tearDown() /** @@ -505,6 +507,63 @@ public function testAValidUploadReturnsTheReport(): void { $this->assertSame(['success' => true, 'summary' => ['created' => 2]], $response->getData()); }//end testAValidUploadReturnsTheReport() + /** + * Both municipality fields, trimmed, and an operationId outside the pattern reach the service unchanged. + * + * The service decides: the uuid wins over the name, and an id outside the + * pattern is replaced by a generated one. + * + * @return void + */ + public function testTheFieldsReachTheServiceAsSent(): void { + $service = $this->service(); + $service->expects($this->once())->method('import') + ->with( + $this->anything(), + [ + 'municipalityUuid' => '00000000-0000-0000-0000-000000000001', + 'municipalityName' => 'Gemeente Voorbeeldstad', + 'updateExisting' => true, + 'operationId' => 'not-a-cmdb-id', + ] + ) + ->willReturn(['success' => true]); + + $params = [ + 'municipalityUuid' => ' 00000000-0000-0000-0000-000000000001 ', + 'municipalityName' => ' Gemeente Voorbeeldstad', + 'operationId' => 'not-a-cmdb-id', + ]; + $response = $this->controller(file: $this->file(path: $this->upload()), params: $params, service: $service)->import(); + + $this->assertSame(200, $response->getStatus()); + }//end testTheFieldsReachTheServiceAsSent() + + /** + * A refusal from the service is logged at info with its code; an unexpected error at error with the exception. + * + * @return void + */ + public function testRefusalsAndFailuresAreLogged(): void { + $refusal = new CmdbImportException(errorCode: CmdbImportException::MISSING_COLUMN, message: 'no APPID', details: ['sheet' => 'S', 'column' => 'APPID']); + $service = $this->service(); + $service->method('import')->willThrowException($refusal); + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->never())->method('error'); + $logger->expects($this->once())->method('info') + ->with($this->anything(), ['error' => 'MISSING_COLUMN', 'details' => ['sheet' => 'S', 'column' => 'APPID'], 'reason' => 'no APPID']); + + $this->controller(file: $this->file(path: $this->upload()), params: ['municipalityName' => 'X'], service: $service, logger: $logger)->import(); + + $failure = new \TypeError('internal detail'); + $service = $this->service(); + $service->method('import')->willThrowException($failure); + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('error')->with($this->anything(), ['exception' => $failure]); + + $this->controller(file: $this->file(path: $this->upload()), params: ['municipalityName' => 'X'], service: $service, logger: $logger)->import(); + }//end testRefusalsAndFailuresAreLogged() + /** * The spellings of updateExisting and what each one means; null is refused. * @@ -635,4 +694,20 @@ public function testCancel(): void { $this->assertSame(404, $missing->getStatus()); $this->assertSame('OPERATION_NOT_FOUND', $missing->getData()['error']); }//end testCancel() + + /** + * A malformed id is passed to the service as sent, which refuses it: 404 with the generic envelope. + * + * @return void + */ + public function testCancelWithAMalformedIdIsNotFound(): void { + $service = $this->service(); + $service->expects($this->once())->method('requestCancel')->with("../cmdb-x\n")->willReturn(false); + + $response = $this->controller(file: null, params: [], service: $service)->cancel(operationId: "../cmdb-x\n"); + + $this->assertSame(404, $response->getStatus()); + $this->assertSame('OPERATION_NOT_FOUND', $response->getData()['error']); + $this->assertEquals((object)[], $response->getData()['details']); + }//end testCancelWithAMalformedIdIsNotFound() }//end class From c9159e1c3347d81cbc7e5656a3bd310e84afd4be Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:50:23 +0200 Subject: [PATCH 16/57] docs(openapi): document the CMDB import's auth, operationId replacement, new codes and cancel's 401 The two CMDB routes now describe their auth the way the ITSM exchange routes do (Nextcloud admins and users delegated the stackiq admin settings, CSRF-protected), and cancel lists 401 like import does, in openapi.json and in contract.md. The operationId field says that a value outside the pattern, or the id of a running import, is replaced by a generated id, and cancel's path parameter carries the pattern. updateExisting, 400 FIELD_INVALID, 413's maxBytes and 500 UPLOAD_FAILED follow the controller. No securitySchemes block is added: openapi.json declares none for any route and states the Nextcloud session requirement per operation. Co-Authored-By: Claude Opus 5.5 --- openapi.json | 29 +++++++++++-------- .../changes/cmdb-export-import/contract.md | 5 ++-- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/openapi.json b/openapi.json index ed08dd11..51a48e6b 100644 --- a/openapi.json +++ b/openapi.json @@ -13,7 +13,7 @@ "post": { "operationId": "cmdbImport-import", "summary": "Import a TOPdesk CMDB export (xlsx) for one municipality", - "description": "Admin-only, CSRF-protected (requesttoken header or OCS-APIRequest: true). Creates or updates modules, supplier organisations, usages and owner contact persons, matched on topdesk::. See openspec/changes/cmdb-export-import/contract.md.", + "description": "Nextcloud admins and users delegated the stackiq admin settings, CSRF-protected (requesttoken header or OCS-APIRequest: true). Creates or updates modules, supplier organisations, usages and owner contact persons, matched on topdesk::. See openspec/changes/cmdb-export-import/contract.md.", "tags": [ "cmdb-import" ], @@ -48,7 +48,7 @@ "false" ], "default": "true", - "description": "false reports matched rows as skipped (exists)" + "description": "false reports matched rows as skipped (exists). 1 and 0 are accepted too, trimmed and in any case; any other value is refused with 400 FIELD_INVALID" }, "missingRecords": { "type": "string", @@ -61,7 +61,7 @@ "operationId": { "type": "string", "pattern": "^cmdb-[A-Za-z0-9-]{8,64}$", - "description": "Progress operation id, readable through GET /api/progress/{operationId}" + "description": "Progress operation id, readable through GET /api/progress/{operationId}. A value that does not match the pattern, or the id of a CMDB import that is still running, is replaced by a generated id; the response's operationId is the id the import used" } } } @@ -80,7 +80,7 @@ } }, "400": { - "description": "NO_FILE_UPLOADED or NOT_XLSX", + "description": "NO_FILE_UPLOADED, NOT_XLSX, or FIELD_INVALID (updateExisting not true/false/1/0, or a text field sent as an array; details.field names it)", "content": { "application/json": { "schema": { @@ -93,13 +93,13 @@ "description": "Not signed in" }, "403": { - "description": "Not a Nextcloud admin" + "description": "Not an admin of the stackiq settings" }, "412": { "description": "Missing or invalid CSRF token" }, "413": { - "description": "FILE_TOO_LARGE", + "description": "FILE_TOO_LARGE; details.maxBytes is the limit that fired: the profile's maximum, or PHP's upload_max_filesize or post_max_size when lower", "content": { "application/json": { "schema": { @@ -119,7 +119,7 @@ } }, "500": { - "description": "IMPORT_FAILED", + "description": "UPLOAD_FAILED (PHP could not store the upload) or IMPORT_FAILED (unexpected; the detail is in the log)", "content": { "application/json": { "schema": { @@ -145,7 +145,7 @@ "post": { "operationId": "cmdbImport-cancel", "summary": "Ask a running CMDB import to stop between rows", - "description": "Admin-only, CSRF-protected. No body.", + "description": "Nextcloud admins and users delegated the stackiq admin settings, CSRF-protected (requesttoken header or OCS-APIRequest: true). No body.", "tags": [ "cmdb-import" ], @@ -155,8 +155,10 @@ "in": "path", "required": true, "schema": { - "type": "string" - } + "type": "string", + "pattern": "^cmdb-[A-Za-z0-9-]{8,64}$" + }, + "description": "The operationId of the import; any other value answers 404 OPERATION_NOT_FOUND" } ], "responses": { @@ -182,11 +184,14 @@ } } }, + "401": { + "description": "Not signed in" + }, "403": { - "description": "Not a Nextcloud admin" + "description": "Not an admin of the stackiq settings" }, "404": { - "description": "OPERATION_NOT_FOUND", + "description": "OPERATION_NOT_FOUND: no CMDB import with this id is running", "content": { "application/json": { "schema": { diff --git a/openspec/changes/cmdb-export-import/contract.md b/openspec/changes/cmdb-export-import/contract.md index 1c64c181..ff575316 100644 --- a/openspec/changes/cmdb-export-import/contract.md +++ b/openspec/changes/cmdb-export-import/contract.md @@ -77,8 +77,9 @@ Error body: `{"success": false, "error": "", "message": " **Errors:** | Code | Condition | |------|-----------| +| 401 | not signed in | | 403 | neither a Nextcloud admin nor a delegated stackiq admin | -| 404 | `OPERATION_NOT_FOUND`: no `cmdb_import` operation with this id | +| 404 | `OPERATION_NOT_FOUND`: no running `cmdb_import` operation with this id | | 412 | missing or invalid CSRF token | ### `GET /api/progress/{operationId}` (existing, unchanged) @@ -102,7 +103,7 @@ Returns the `ProgressTracker` snapshot for the `cmdb_import` operation: `progres | `MAPPING_UNAVAILABLE` | mapping cannot run | OpenRegister's `MappingEngine`/`PackDefinitionValidator` missing, or a shipped pack is invalid | | `READER_UNAVAILABLE` | xlsx reader missing | PhpSpreadsheet's Xlsx reader cannot be loaded | | `NOT_CONFIGURED` | stackiq not configured (503) | OpenRegister's object service, the stackiq register, or the `module`, `organization`, `usage` or `contactPerson` schema cannot be resolved; checked before the file is read | -| `OPERATION_NOT_FOUND` | unknown operation | cancel for an id without a `cmdb_import` operation | +| `OPERATION_NOT_FOUND` | unknown operation | cancel for an id without a running `cmdb_import` operation | | `IMPORT_FAILED` | unexpected error | anything not listed above | ## Versioning From 1dba1605b380de54299fa0cb406de984e031ce9e Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:52:18 +0200 Subject: [PATCH 17/57] test(newman): cover the CMDB import's 401, 400 and 422 refusals and cancel's auth and finished-import cases Folder "12 - CMDB import" now also checks 401 when not signed in, 400 NO_FILE_UPLOADED, 400 NOT_XLSX, 400 FIELD_INVALID for a mistyped updateExisting and 422 MUNICIPALITY_REQUIRED, and for cancel 401, 403 for a non-admin and 412 without a CSRF token. The operationId the 200 request stores was never read; a cancel on it now asserts 404, since a finished import cannot be cancelled, and fails with a message when the variable is unset. A sequential collection cannot keep an import running while it cancels, so cancel's 200 stays with the unit tests. The 413 request no longer skips itself when cmdb_oversized_file is unset: it runs and fails, naming the variable, so a run without the oversized file cannot pass the check silently. Co-Authored-By: Claude Opus 5.5 --- postman/stackiq-tests.json | 539 ++++++++++++++++++++++++++++++++++++- 1 file changed, 534 insertions(+), 5 deletions(-) diff --git a/postman/stackiq-tests.json b/postman/stackiq-tests.json index f5544dc6..0b747d06 100644 --- a/postman/stackiq-tests.json +++ b/postman/stackiq-tests.json @@ -22552,6 +22552,60 @@ "name": "12 - CMDB import", "description": "openspec/changes/cmdb-export-import (contract.md). Run newman from the app root so the fixture path tests/fixtures/cmdb/ resolves.", "item": [ + { + "name": "CMDB import: 401 when not signed in", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import" + ] + }, + "auth": { + "type": "noauth" + }, + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "cmdbFile", + "type": "file", + "src": "tests/fixtures/cmdb/topdesk-export-anonymised.xlsx" + }, + { + "key": "municipalityName", + "value": "Gemeente Voorbeeldstad", + "type": "text" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"An anonymous request cannot import\", function () {", + " pm.response.to.have.status(401);", + "});" + ], + "type": "text/javascript" + } + } + ] + }, { "name": "CMDB import: 403 for a user who is not a Nextcloud admin", "request": { @@ -22754,6 +22808,131 @@ } ] }, + { + "name": "CMDB import: 400 NO_FILE_UPLOADED without cmdbFile", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{admin_user}}" + }, + { + "key": "password", + "value": "{{admin_pass}}" + } + ] + }, + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "municipalityName", + "value": "Gemeente Voorbeeldstad", + "type": "text" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"A request without the file is refused\", function () {", + " pm.response.to.have.status(400);", + " pm.expect(pm.response.json().error).to.eql(\"NO_FILE_UPLOADED\");", + "});" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "CMDB import: 400 NOT_XLSX for a file that is not a workbook", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{admin_user}}" + }, + { + "key": "password", + "value": "{{admin_pass}}" + } + ] + }, + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "cmdbFile", + "type": "file", + "src": "appinfo/info.xml" + }, + { + "key": "municipalityName", + "value": "Gemeente Voorbeeldstad", + "type": "text" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"A file that is not .xlsx is refused before it is read\", function () {", + " pm.response.to.have.status(400);", + " pm.expect(pm.response.json().error).to.eql(\"NOT_XLSX\");", + "});" + ], + "type": "text/javascript" + } + } + ] + }, { "name": "CMDB import: 413 for a file over 10 MB", "request": { @@ -22802,7 +22981,7 @@ } ] }, - "description": "Set cmdb_oversized_file to a file of 10485761 bytes; the request is skipped when it is not set." + "description": "Set cmdb_oversized_file to a file of 10485761 bytes. When it is not set the request still runs and fails with that message, so a run without it cannot pass this check silently." }, "response": [], "event": [ @@ -22811,10 +22990,8 @@ "script": { "exec": [ "// Needs a file of 10 MB plus one byte, e.g. `head -c 10485761 /dev/zero > /tmp/cmdb-oversized.xlsx`,", - "// passed as --env-var cmdb_oversized_file=/tmp/cmdb-oversized.xlsx. Without it the request is skipped, not passed.", - "if (!pm.variables.get(\"cmdb_oversized_file\")) {", - " pm.execution.skipRequest();", - "}" + "// passed as --env-var cmdb_oversized_file=/tmp/cmdb-oversized.xlsx. Without it the request runs without a file", + "// and the first test below fails, naming the missing variable." ], "type": "text/javascript" } @@ -22823,6 +23000,9 @@ "listen": "test", "script": { "exec": [ + "pm.test(\"cmdb_oversized_file is set\", function () {", + " pm.expect(pm.variables.get(\"cmdb_oversized_file\") || \"\", \"set --env-var cmdb_oversized_file to a file of 10485761 bytes\").to.not.eql(\"\");", + "});", "pm.test(\"An oversized upload is refused before it is read\", function () {", " pm.response.to.have.status(413);", " pm.expect(pm.response.json().error).to.eql(\"FILE_TOO_LARGE\");", @@ -22903,6 +23083,146 @@ } ] }, + { + "name": "CMDB import: 400 FIELD_INVALID for updateExisting=flase", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{admin_user}}" + }, + { + "key": "password", + "value": "{{admin_pass}}" + } + ] + }, + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "cmdbFile", + "type": "file", + "src": "tests/fixtures/cmdb/topdesk-export-anonymised.xlsx" + }, + { + "key": "municipalityName", + "value": "Gemeente Voorbeeldstad", + "type": "text" + }, + { + "key": "updateExisting", + "value": "flase", + "type": "text" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"An unrecognised updateExisting is refused, not read as true\", function () {", + " pm.response.to.have.status(400);", + " pm.expect(pm.response.json().error).to.eql(\"FIELD_INVALID\");", + "});", + "pm.test(\"The refusal names the field and the accepted values\", function () {", + " var details = pm.response.json().details;", + " pm.expect(details.field).to.eql(\"updateExisting\");", + " pm.expect(details.accepted).to.eql([\"true\", \"false\"]);", + "});" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "CMDB import: 422 MUNICIPALITY_REQUIRED without a municipality", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{admin_user}}" + }, + { + "key": "password", + "value": "{{admin_pass}}" + } + ] + }, + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "cmdbFile", + "type": "file", + "src": "tests/fixtures/cmdb/topdesk-export-anonymised.xlsx" + }, + { + "key": "municipalityName", + "value": " ", + "type": "text" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"A municipality is required\", function () {", + " pm.response.to.have.status(422);", + " pm.expect(pm.response.json().error).to.eql(\"MUNICIPALITY_REQUIRED\");", + "});" + ], + "type": "text/javascript" + } + } + ] + }, { "name": "CMDB import: 200 with the report for the anonymised export", "request": { @@ -22986,6 +23306,215 @@ } ] }, + { + "name": "CMDB import: cancel answers 401 when not signed in", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import/cmdb-00000000-0000-4000-8000-000000000000/cancel", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import", + "cmdb-00000000-0000-4000-8000-000000000000", + "cancel" + ] + }, + "auth": { + "type": "noauth" + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"An anonymous request cannot cancel\", function () {", + " pm.response.to.have.status(401);", + "});" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "CMDB import: cancel answers 403 for a user who is not a Nextcloud admin", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import/cmdb-00000000-0000-4000-8000-000000000000/cancel", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import", + "cmdb-00000000-0000-4000-8000-000000000000", + "cancel" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "mark.jansen@test.nl" + }, + { + "key": "password", + "value": "{{test_password}}" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"A non-admin cannot cancel an import\", function () {", + " pm.response.to.have.status(403);", + "});" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "CMDB import: cancel answers 412 without a CSRF token", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import/cmdb-00000000-0000-4000-8000-000000000000/cancel", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import", + "cmdb-00000000-0000-4000-8000-000000000000", + "cancel" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{admin_user}}" + }, + { + "key": "password", + "value": "{{admin_pass}}" + } + ] + } + }, + "response": [], + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "// The collection adds OCS-APIRequest, which satisfies the CSRF check; this request must go without it.", + "pm.request.headers.remove(\"OCS-APIRequest\");" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Nextcloud refuses the cancel without a CSRF token\", function () {", + " pm.response.to.have.status(412);", + "});" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "CMDB import: cancel answers 404 for the import that already finished", + "request": { + "method": "POST", + "header": [ + { + "key": "OCS-APIRequest", + "value": "true", + "type": "text" + } + ], + "url": { + "raw": "{{stackiq_api}}/cmdb-import/{{cmdb_operation_id}}/cancel", + "host": [ + "{{stackiq_api}}" + ], + "path": [ + "cmdb-import", + "{{cmdb_operation_id}}", + "cancel" + ] + }, + "auth": { + "type": "basic", + "basic": [ + { + "key": "username", + "value": "{{admin_user}}" + }, + { + "key": "password", + "value": "{{admin_pass}}" + } + ] + }, + "description": "Uses the operationId the 200 request stored. A sequential collection cannot hold an import running while it cancels, so the cancel 200 is covered by the unit tests (CmdbImportControllerTest::testCancel, CmdbExportImportServiceTest::testACancelStopsBetweenRows)." + }, + "response": [], + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"The 200 request stored its operationId\", function () {", + " pm.expect(pm.environment.get(\"cmdb_operation_id\"), \"cmdb_operation_id is unset: the 200 import request did not run or failed\").to.match(/^cmdb-[A-Za-z0-9-]{8,64}$/);", + "});", + "pm.test(\"A finished import cannot be cancelled\", function () {", + " pm.response.to.have.status(404);", + " pm.expect(pm.response.json().error).to.eql(\"OPERATION_NOT_FOUND\");", + "});" + ], + "type": "text/javascript" + } + } + ] + }, { "name": "CMDB import: 404 OPERATION_NOT_FOUND when cancelling an unknown import", "request": { From c252039511a8fe40915459435677764fa4732c3d Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:53:35 +0200 Subject: [PATCH 18/57] docs(cmdb-import): give the controller's iniBytes() seam its @spec tag iniBytes() is protected so a test can stand in for php.ini, which makes it a method the spec-coverage gate checks; it belongs to the upload checks of task 8. The note on why it is protected moves above @param. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index e407cd4e..1fce717f 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -189,12 +189,14 @@ private function missingUpload(int $maxBytes): JSONResponse { /** * A PHP size setting such as `10M`, in bytes. * - * @param string $name The ini setting. - * * Protected so a test can stand in for php.ini, whose size settings cannot * be changed at run time. * + * @param string $name The ini setting. + * * @return int|null Null when it is unset or not a size; 0 means no limit. + * + * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 */ protected function iniBytes(string $name): ?int { $value = trim((string)ini_get($name)); From b05040f537276965072d8b5e4c7dd43698ab5e05 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:55:50 +0200 Subject: [PATCH 19/57] refactor(cmdb-import): keep the controller's upload parsing within the PHPMD limits The upload and field checks added for FIELD_INVALID and UPLOAD_FAILED took uploadedFile() over the cyclomatic and NPath thresholds and the class over the class-complexity threshold. The file name and size reads move into two small helpers, and the class carries a justified ExcessiveClassComplexity suppression like the other classes in this app: the complexity is one branch per contract code and refused state. No behaviour changes. Co-Authored-By: Claude Opus 5.5 --- lib/Controller/CmdbImportController.php | 49 +++++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/lib/Controller/CmdbImportController.php b/lib/Controller/CmdbImportController.php index 1fce717f..d11507f4 100644 --- a/lib/Controller/CmdbImportController.php +++ b/lib/Controller/CmdbImportController.php @@ -52,6 +52,10 @@ /** * CMDB import and cancel, for (delegated) stackiq admins and CSRF-protected. * + * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) The complexity is one branch per + * contract error code (message()) and per refused upload or field state, checked in + * the order of design D10; spreading those checks over classes would hide that order. + * * @spec openspec/changes/cmdb-export-import/tasks.md#task-8 */ class CmdbImportController extends Controller { @@ -456,7 +460,7 @@ private function uploadedFile(): ?array { return null; } - if ($error === UPLOAD_ERR_INI_SIZE || $error === UPLOAD_ERR_FORM_SIZE) { + if (in_array($error, [UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE], true) === true) { return ['tmpName' => '', 'name' => '', 'size' => 0, 'tooLarge' => true, 'serverError' => null]; } @@ -469,16 +473,45 @@ private function uploadedFile(): ?array { return null; } - $size = (int)($file['size'] ?? 0); - if ($size === 0 && is_file($tmpName) === true) { - $size = (int)filesize($tmpName); - } + return [ + 'tmpName' => $tmpName, + 'name' => self::uploadName(file: $file), + 'size' => self::uploadSize(file: $file, tmpName: $tmpName), + 'tooLarge' => false, + 'serverError' => null, + ]; + }//end uploadedFile() + /** + * The client's file name of an upload, or '' when it is not a single name. + * + * @param array $file The upload entry. + * + * @return string + */ + private static function uploadName(array $file): string { $name = $file['name'] ?? ''; if (is_string($name) === false) { - $name = ''; + return ''; } - return ['tmpName' => $tmpName, 'name' => $name, 'size' => $size, 'tooLarge' => false, 'serverError' => null]; - }//end uploadedFile() + return $name; + }//end uploadName() + + /** + * The size of an upload: the size PHP reported, or the stored file's when that is 0. + * + * @param array $file The upload entry. + * @param string $tmpName The stored file. + * + * @return int + */ + private static function uploadSize(array $file, string $tmpName): int { + $size = (int)($file['size'] ?? 0); + if ($size === 0 && is_file($tmpName) === true) { + $size = (int)filesize($tmpName); + } + + return $size; + }//end uploadSize() }//end class From 46fd875f4868a3f5ab855dcfb059d040c08ba119 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 11:15:22 +0200 Subject: [PATCH 20/57] fix(l10n): translate the CMDB import's FIELD_INVALID and UPLOAD_FAILED messages The controller's new refusals for an invalid field value and a server-side upload failure had no catalogue key, so Dutch admins saw them in English. Co-Authored-By: Claude Opus 5.5 --- l10n/en.js | 5 ++++- l10n/en.json | 5 ++++- l10n/nl.js | 5 ++++- l10n/nl.json | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/l10n/en.js b/l10n/en.js index e270e22a..a0f4a86f 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1080,7 +1080,10 @@ OC.L10N.register( "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Whether a service desk is connected could not be loaded. Reload the page to try again.", "Application type": "Application type", "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.", - "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses." + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.", + "Field \"%1$s\" must be one of: %2$s.": "Field \"%1$s\" must be one of: %2$s.", + "Field \"%s\" has an invalid value.": "Field \"%s\" has an invalid value.", + "The server could not store the uploaded file. The details are in the Nextcloud log.": "The server could not store the uploaded file. The details are in the Nextcloud log." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/en.json b/l10n/en.json index ec6a4221..51d90b72 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1079,6 +1079,9 @@ "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Whether a service desk is connected could not be loaded. Reload the page to try again.", "Application type": "Application type", "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.", - "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses." + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.", + "Field \"%1$s\" must be one of: %2$s.": "Field \"%1$s\" must be one of: %2$s.", + "Field \"%s\" has an invalid value.": "Field \"%s\" has an invalid value.", + "The server could not store the uploaded file. The details are in the Nextcloud log.": "The server could not store the uploaded file. The details are in the Nextcloud log." } } diff --git a/l10n/nl.js b/l10n/nl.js index 9c84debc..febe9c5d 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1150,7 +1150,10 @@ OC.L10N.register( "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Kon niet worden geladen of er een servicedesk is gekoppeld. Herlaad de pagina om het opnieuw te proberen.", "Application type": "Applicatiesoort", "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "Het soort applicatie zoals het bronsysteem het vastlegt, zoals de TOPdesk-Applicatiesoort (Webapplicatie, Client/server, Saas). Overgenomen zoals de bron het heeft.", - "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "Het BBN-niveau (Baseline Informatiebeveiliging Overheid) waarop deze applicatie is geclassificeerd. BBN2+ is een niveau dat de TOPdesk-CMDB-export gebruikt." + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "Het BBN-niveau (Baseline Informatiebeveiliging Overheid) waarop deze applicatie is geclassificeerd. BBN2+ is een niveau dat de TOPdesk-CMDB-export gebruikt.", + "Field \"%1$s\" must be one of: %2$s.": "Veld \"%1$s\" moet een van deze waarden hebben: %2$s.", + "Field \"%s\" has an invalid value.": "Veld \"%s\" heeft een ongeldige waarde.", + "The server could not store the uploaded file. The details are in the Nextcloud log.": "De server kon het geüploade bestand niet opslaan. De details staan in het Nextcloud-logboek." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index 7bfc33c8..2cce615f 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1149,6 +1149,9 @@ "Whether a service desk is connected could not be loaded. Reload the page to try again.": "Kon niet worden geladen of er een servicedesk is gekoppeld. Herlaad de pagina om het opnieuw te proberen.", "Application type": "Applicatiesoort", "The kind of application as the source system records it, such as the TOPdesk Applicatiesoort (Webapplicatie, Client/server, Saas). Kept as the source has it.": "Het soort applicatie zoals het bronsysteem het vastlegt, zoals de TOPdesk-Applicatiesoort (Webapplicatie, Client/server, Saas). Overgenomen zoals de bron het heeft.", - "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "Het BBN-niveau (Baseline Informatiebeveiliging Overheid) waarop deze applicatie is geclassificeerd. BBN2+ is een niveau dat de TOPdesk-CMDB-export gebruikt." + "The BBN level (Baseline Informatiebeveiliging Overheid) this application is classified at. BBN2+ is a level the TOPdesk CMDB export uses.": "Het BBN-niveau (Baseline Informatiebeveiliging Overheid) waarop deze applicatie is geclassificeerd. BBN2+ is een niveau dat de TOPdesk-CMDB-export gebruikt.", + "Field \"%1$s\" must be one of: %2$s.": "Veld \"%1$s\" moet een van deze waarden hebben: %2$s.", + "Field \"%s\" has an invalid value.": "Veld \"%s\" heeft een ongeldige waarde.", + "The server could not store the uploaded file. The details are in the Nextcloud log.": "De server kon het geüploade bestand niet opslaan. De details staan in het Nextcloud-logboek." } } From 2cdc31d0e39ef4238abf9de73272ce7441e95c6d Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:32:59 +0200 Subject: [PATCH 21/57] fix(cmdb-import): strip printer settings, dates and revision ids from the fixtures Four of the five CMDB fixtures still carried the printer settings of every sheet (naming the printers of the machine the export was handled on), the creation date of the original export, the workbook's revision GUID and the filter ranges and sort orders that record the size of the original data. build-fixtures.py now always sanitises the committed export (idempotent): it drops xl/printerSettings/ with its relationships, pageSetup links and content type, empties the document properties in core.xml and app.xml, sets both dates to a fixed neutral date, removes the revision pointer and the xr uid attributes, the _FilterDatabase names and sort states, and narrows auto filters to the header row. The five fixtures are regenerated. Co-Authored-By: Claude Opus 5.5 --- tests/fixtures/cmdb/README.md | 4 +- tests/fixtures/cmdb/build-fixtures.py | 125 ++++++++++++++---- .../cmdb/topdesk-export-anonymised.xlsx | Bin 160560 -> 153327 bytes .../cmdb/topdesk-formula-and-connection.xlsx | Bin 160968 -> 153734 bytes .../fixtures/cmdb/topdesk-missing-appid.xlsx | Bin 160578 -> 153343 bytes .../cmdb/topdesk-shuffled-columns.xlsx | Bin 156723 -> 149622 bytes 6 files changed, 100 insertions(+), 29 deletions(-) diff --git a/tests/fixtures/cmdb/README.md b/tests/fixtures/cmdb/README.md index c9483030..b7e4843d 100644 --- a/tests/fixtures/cmdb/README.md +++ b/tests/fixtures/cmdb/README.md @@ -14,7 +14,7 @@ in the script. The "Invoer" sheets are not read and stay as they are. | File | What it is | |---|---| -| `topdesk-export-anonymised.xlsx` | An anonymised TOPdesk export with one fake data row per CMDB sheet (APPID 1234 on "Onbeh", APPID 2 on "Beheerde"), formatted but empty rows below them, and on "Beheerde" ten formula rows whose cached value is `0` (Excel's result for a reference to an empty cell). Document metadata, custom properties, `customXml/`, the workbook's absolute save path and `xl/connections.xml` are removed. | +| `topdesk-export-anonymised.xlsx` | An anonymised TOPdesk export with one fake data row per CMDB sheet (APPID 1234 on "Onbeh", APPID 2 on "Beheerde"), formatted but empty rows below them, and on "Beheerde" ten formula rows whose cached value is `0` (Excel's result for a reference to an empty cell). Removed: custom properties, `customXml/`, the workbook's absolute save path, `xl/connections.xml` and the printer settings of every sheet; the author, company and other document properties are empty, the creation and modification dates are `2026-01-01T00:00:00Z`, and the revision GUIDs, the hidden filter ranges and saved sort orders of the original data are gone. | | `topdesk-missing-appid.xlsx` | The same, but the "APPID" header of "Beheerde Applicaties CMDB" is renamed, so the required column is missing there. | | `topdesk-shuffled-columns.xlsx` | The same rows with the columns of both CMDB sheets in reverse order, and the header "Vendor" written as `Vendor⚡`. Reads to the same rows as the original. | | `topdesk-formula-and-connection.xlsx` | On "Beheerde", "Applicatie Naam" is a formula that would evaluate to `Evaluated` with the cached value `Rekenmodel`, "Roepnaam" is a formula without any cached value, and the package declares a synthetic external web connection to `https://example.invalid/`. | @@ -35,7 +35,7 @@ own export, not even temporarily. `build-fixtures.py` uses the Python standard library only: ```bash -# Write the cached values into the committed export (idempotent) and derive the variants +# Sanitise the committed export again, write the cached values (both idempotent) and derive the variants python3 tests/fixtures/cmdb/build-fixtures.py # Sanitise a new anonymised export first, then write the cached values and derive the variants diff --git a/tests/fixtures/cmdb/build-fixtures.py b/tests/fixtures/cmdb/build-fixtures.py index 8536f73e..84a4f72a 100644 --- a/tests/fixtures/cmdb/build-fixtures.py +++ b/tests/fixtures/cmdb/build-fixtures.py @@ -11,14 +11,22 @@ Usage: python3 build-fixtures.py --source - Sanitise an already anonymised export into topdesk-export-anonymised.xlsx - (strip document metadata, custom properties, customXml, the workbook's - absolute path and xl/connections.xml), write the placeholder cached - values into the CMDB sheets, then derive the variants. + Sanitise an already anonymised export into topdesk-export-anonymised.xlsx, + write the placeholder cached values into the CMDB sheets, then derive + the variants. python3 build-fixtures.py - Write the placeholder cached values into the committed - topdesk-export-anonymised.xlsx (idempotent) and derive the variants. + Sanitise the committed topdesk-export-anonymised.xlsx again, write the + placeholder cached values into it (both idempotent) and derive the + variants. + +Sanitising removes document metadata and everything that describes the +workbook's origin rather than its content: custom properties, customXml, the +workbook's absolute save path, xl/connections.xml, the printer settings of +every sheet (they name the printers of the machine the export was handled on), +the author, company and other document properties, the creation and +modification dates (set to FIXED_DATE), the revision and object GUIDs, and the +filter ranges and sheet dimensions that record the size of the original data. The import reads the two CMDB sheets ("Onbeh Applicaties CMDB", "Beheerde Applicaties CMDB"). Their cells are formulas that read the "Invoer" @@ -44,7 +52,16 @@ # Parts that never belong in a fixture. DROP_PARTS = ('docProps/custom.xml', 'xl/connections.xml') -DROP_PREFIXES = ('customXml/',) +DROP_PREFIXES = ('customXml/', 'xl/printerSettings/') + +# The creation and modification date of every fixture: neutral, not the date of +# any real export or save. +FIXED_DATE = '2026-01-01T00:00:00Z' + +# Document properties that are emptied (core.xml and app.xml). +EMPTIED_CORE = ('dc:title', 'dc:subject', 'dc:creator', 'cp:keywords', 'dc:description', + 'cp:lastModifiedBy', 'cp:revision', 'cp:category', 'cp:contentStatus') +EMPTIED_APP = ('Manager', 'Company', 'HyperlinkBase') ONBEH_SHEET = 'xl/worksheets/sheet2.xml' # "Onbeh Applicaties CMDB" (from AIA) BEHEERDE_SHEET = 'xl/worksheets/sheet4.xml' # "Beheerde Applicaties CMDB" (from APP) @@ -93,37 +110,94 @@ def text(data): return data.decode('utf-8') +def empty_element(xml, tag): + """Empty `` (any content, or self-closing) without dropping it.""" + return re.sub(r'<%s(?: [^>]*)?(?:/>|>.*?)' % (tag, tag), '<%s>' % (tag, tag), xml, flags=re.S) + + +def drop_guids(xml): + """Remove the revision pointer and every revision/object GUID attribute (xr:uid, xr10:uidLastSave, ...).""" + xml = re.sub(r']*/>', '', xml) + return re.sub(r' xr\d*:uid(?:LastSave)?="\{[^"]*\}"', '', xml) + + +def used_range(xml): + """The range the cells of a worksheet span ("A1:AP2"), or None for an empty sheet.""" + refs = re.findall(r']*?) r:id="[^"]*"', r'\1', xml) + xml = drop_guids(xml) + extent = used_range(xml) + if extent is not None: + xml = re.sub(r'', '' % extent, xml) + + # An auto filter covers the header row only; its original range recorded how many rows the real data had. + def header_only(match): + first, last_col = match.group(1), match.group(2) + row = re.match(r'[A-Z]+(\d+)$', first).group(1) + return '].*?|]*/>', '', xml, flags=re.S) + + def sanitise(parts): - """Remove metadata parts and every reference to them.""" + """Remove metadata parts and every reference to them; idempotent.""" kept = [] for name, data in parts: if name in DROP_PARTS or name.startswith(DROP_PREFIXES): continue if name == 'docProps/core.xml': xml = text(data) - xml = re.sub(r'.*?', '', xml) - xml = re.sub(r'.*?', '', xml) + for tag in EMPTIED_CORE: + xml = empty_element(xml, tag) + for tag in ('dcterms:created', 'dcterms:modified'): + xml = re.sub(r'(<%s [^>]*>)[^<]*()' % (tag, tag), r'\g<1>%s\g<2>' % FIXED_DATE, xml) + data = xml.encode('utf-8') + elif name == 'docProps/app.xml': + xml = text(data) + for tag in EMPTIED_APP: + xml = empty_element(xml, tag) data = xml.encode('utf-8') elif name == 'xl/workbook.xml': # The absolute path of the last save names a user profile directory. xml = re.sub(r']*>.*?x15ac:absPath.*?', '', text(data)) + xml = drop_guids(xml) + # Hidden filter ranges of the original data; Excel rebuilds them from the sheets' auto filters. + xml = re.sub(r']*>[^<]*', '', xml) + xml = xml.replace('', '') data = xml.encode('utf-8') - elif name == '[Content_Types].xml': - xml = text(data) - xml = re.sub(r']*/>', '', xml) - xml = re.sub(r']*/>', '', xml) - xml = re.sub(r']*/>', '', xml) - data = xml.encode('utf-8') - elif name == '_rels/.rels': + elif re.match(r'xl/worksheets/sheet\d+\.xml$', name): + data = sanitise_sheet(text(data)).encode('utf-8') + elif name.endswith('.rels'): xml = re.sub(r']*Target="docProps/custom\.xml"[^>]*/>', '', text(data)) - xml = re.sub(r']*Target="\.\./customXml/[^"]*"[^>]*/>', '', xml) - data = xml.encode('utf-8') - elif name == 'xl/_rels/workbook.xml.rels': - xml = re.sub(r']*Target="connections\.xml"[^>]*/>', '', text(data)) - xml = re.sub(r']*Target="\.\./customXml/[^"]*"[^>]*/>', '', xml) + xml = re.sub(r']*Target="(?:\.\./)?customXml/[^"]*"[^>]*/>', '', xml) + xml = re.sub(r']*Target="connections\.xml"[^>]*/>', '', xml) + xml = re.sub(r']*Type="[^"]*/printerSettings"[^>]*/>', '', xml) data = xml.encode('utf-8') kept.append((name, data)) - return kept + + # Content types: no override for a dropped part, no default for an extension no part has left. + names = {name for name, _ in kept} + + def content_types(data): + xml = text(data) + for part in re.findall(r']*/>', xml): + if part not in names: + xml = re.sub(r']*/>' % re.escape(part), '', xml) + for ext in re.findall(r']*/>', xml): + if ext not in ('rels', 'xml') and not any(n.endswith('.' + ext) for n in names): + xml = re.sub(r']*/>' % re.escape(ext), '', xml) + return xml.encode('utf-8') + return replace_part(kept, '[Content_Types].xml', content_types) def replace_part(parts, name, transform): @@ -332,10 +406,7 @@ def main(): parser.add_argument('--source', help='anonymised export to sanitise into topdesk-export-anonymised.xlsx') args = parser.parse_args() - source = args.source or SANITISED - parts = read_package(source) - if args.source: - parts = sanitise(parts) + parts = sanitise(read_package(args.source or SANITISED)) write_package(SANITISED, cache_values(parts)) print('wrote', os.path.relpath(SANITISED, HERE)) diff --git a/tests/fixtures/cmdb/topdesk-export-anonymised.xlsx b/tests/fixtures/cmdb/topdesk-export-anonymised.xlsx index d8aac05354753e1986a7ac0b712f846a10b5345a..91478f031a07eaf7fa8f8cc3bc25a264d3a114d6 100644 GIT binary patch literal 153327 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 Q$X5nrW#^NJOtmoo2U=r8WNfEPU zPxdV_nC$Bq!)#`KN0;u)T+8$P|L^;}_y4)C`g~4i9Ow7^&T$^caUSO}zs1kSe7=Od zn3ⅈg7QY6Yr(^Y2spH^^3*C z%x6pA&EEeijo6-juW4U?XWj~Drr4{}QWHnBWo_I1I1N@Sm+W7&!TIj=g(BH$0Z{W} zAI-mo)g!gDVAbYbn<_Fto=drL{>V!d6LJulx&H3CqKcbOPH%WQ+E$4f=Iv2l5xMTg z(OsT}jd2!XOKn!mE!2;#=n$)Nbr_PkECpzG>ZKO!*51BQ>3UZ3<)%8lkb`w)$R}>l zLrV5GWi@Kq?=$7o`Vz&TUgXJ-?Tk8-P?xxOP0hs(n^d1aJooZIUpaD9E*QY4G1=hv?VN)}%?UKak~mb<-laBmY> zPpwxVQQWxo`cxo?@Gfdtd!s`@+C^rB)w{ZayAK)RoDq`m_5Jbf8%BlBw3sI*1`xhNJTAF;YHgeO{W`MdO3C&mHz~Jqw;OOr+KX1D zT4`OZC$4In@0>TePqymoH6)&gE%`d{?C|-6RgD?eCd5v|u#r#7j2@j=4`k&HHstxd zzMIeXql;};^LTpT`m65J<=!pi8pe}@hYK{kaS@ws?VIbL_W_ru4*RB@yyt{OC`!pa z=PuFo-!cFF!}zz@iivpfmY|o66Z^gr4Q%L@Q@h+;;<_fHVoFN4CA!=)RQG;L{v2Wt zJc`OVvg^*%sD)bwR6{mIGWQ>tpQPJv52Z2R>0MVbzh8goTa__nH8S{%pdjT^c|?t2 zPe^e0Sx1(4QQ6XCC{df3uX%@AEFmW5wNy+@MradXH!UBihwB9>)O9AvU)!C5rs~PV zAufXX4^(R87I?Y_#XVe)OnlWI`+}So@p!(~g%#U(SjAmw7T_y3E<4m1`(jOVoRViP zGjWY1b6`~M{*ztZ`j=en_S@afe5B*J+*08zomBDo%ZVrU-*k$#&CTp!8w%L(nS(%G z^g}}Rs(>S6>uWG0NAFcP(GBe*B?j%bZrEfPyEEyWxC&&*uUsm8QdL>y{*9*X_C`fI z$MY8{fh2F&4C-v0zcO1kGE{Ssy7tO%aD3V+hZNOreRrt=tt<<`sYvnChvmnxE1qRW z26y>B-VyGk9gN!>{8We zmztflJyl{9%`w}WU+lp=_lZSv{`9pZ7G>(WS;v;#S?ywxl=nL8+g47v+^Lr*k6%c5 zaNcym{lbx5_r{)#>AD^7&f0piVU5uf*yKz>Msm*v}}45;LL6s;p_vxKl{3ub0{|q|9pBMv2|g% zt4z&D=G6*cyGtQ{$|YNJI*yn-yR+G)sRr0hsP!dh8k{NR))#$T)SpiJBfCF6LuvTc zF!dj$y!A_WDRsbP-X7a+N^1nD!4k zFL@M{u{JPz#e${71)J7^+-#g8{?_-s?zZyb}Ji@8=cuV9WVFCH3lXv^N@6P{T$9F!icGkFv$ndu8heiz*5C0dq+Zuu^)0%zn z?`nFbwoZU7FYo$<5Bz!(;$6y5yR)Pfx5N*#`sG#&vnG?voE;mjb{5NU@*cW(yw&9F zXg(0dK35zayx0BZg}97q?~>Vmb}qc!IxhLqPH?R$OboaE}u+T))NbPS|?*s{f{ zJ4#WH{PE46^vemDn>$3gKJN(-X z_{URLhZDA*UVO@{DIK`|lN_=1=|de@A7xAAZka{56->5hw+?lcya%6t1&`Y^Z8Ew! zb!P+Rxys(x77oKIa=>_GNbI4tw`!AjEAGrWsD7e~gDG3{1q_eclJ!NkYd^*!+LW9c zZS~~q&C%GE?*(sn<%v(GYB~b0NG|xiH_j>zM_X34rOq+YsW{scMQF?aT1Irse^Ts} zYP_b|Yl8`V4aQSd#n1N5f}?6ykx?O+zD#ACbln}6+1IGo-ioi4`+R+1@^-n8#>G!X z78^<|^keoq#)t=4s42V1H;=pwK8$j)k~Lpm5NRwa_wKRucDcORXDyFN51b-PeC68? zls{gxIyX$>xqcr`Wv{e^Q_6t#`Mr%_Gj{j8A9(C?U~RSGj_L&7k-b^hRZmuvD%n02 z{b9bF1Wli^GAbq&L>=(L^@-KEw3yhimzdb9-}APo^QB8(o?72uv}Y3d^Tacr!~?Q- zNcmTU8Jr?}UD4-B|JF-p_oG;{2KN)O4f2jT)elS>^E=xG`1P9}#l&9Q8e!XCD!WE+ z)e`o6jp?lJR0_U29cSI*vFlWI9Y-&Wjk{v(&|xt^spAlM{;;F8fGoN*d}rLYffhf3 z>-!M|lZ6ua()@C`Zwj+AZ=kJW(6t<&Q97^f+#5yG@!WB%PoT@JFSec(6b^S)cDn!EZDf%|YQC!o8|e~(acsSM?^ zqFKtST^Z~369ykESMEFHv8dAe`Ju;`QqNnM zy~A3ZC;yEno}|Bbv@hIZlhV;p*x|3;G%kytlH^*vtF;azJuc-LJH<+@67wfnN@ z!N#j~UWe?Xm{r$pjT_(BIKI+f&$3SW>cwfF!c~?eW!JN4s9s6>g2(wzp#*nJxt{tv zDx^obl#;hbz1($MuUtF-8on)pgd29cel2b64w4r}tFJvY9h08eUtcQ~@j<6^tJ#`u z@N4njPxl#Q=nDcLrH80;0$K})&sUz&ub_0j%U*k0H*ALC68v9!33Wo2*X2`x692qmrboNHKC} z_&fW+an1ZQ=<$Q`z*Fu|L+MXnDOFtVJ&(J=Ys}>Hn=YD8rxs;c()Q7dU#dCK@7wP0 zJE5i9`<2dyr@r;dFF2Yf{_UDqr?Ev`VHt&3X6XF@q&L4BdmD5kvp|;%?99|nM|EU= zXh8|zWja~yqN~yUFe72CJ3G$$^<0~3j9muJgI|{%AhSQe_UGWevtrNiT3-9B)8o%* zc8pN2wHOTR)=K&9zGC9IRHYOJnWR{%WyqLf(*W}nTzTi&6 z=NmYS@lOecpUMpGdV$jBNQT+SC|+06>Dq;TL{7Xqb6|D>p`TpAFjLGitFLRPuaYDIH~st%8vgf>_om-n*#MwA+|01#WX&3nm&g zUjD%k^PY4-MXOs~9Wg!(aeSqb$M?uQp- z>~+7g!0DL#N(rYE?p6y1_qtzOpm5B6xrD+Ace4e^z3wgxpm3taMyRe&Y9g}3ZA6j* zSYLfN))IFRb2GT@!e!4TD#6Rt?tI&B`bpVhS<&Nr%l5}?4Z6KtIc)p&(pv}h9|)jc zpEg*mKVs9M{CN9gQ?vac7RA9wRn$(KsFgV$1@8|z6nZ~x(Ta7lo75i5+BPUZx-f5( z)QWYJ8fp=dM;nyGFZ5`vUa_uGLoLjtK|?w0LZgO!nCzTCSJ~>6D~IKnU9@Oe6{1tF z7N))b;@ZYl@jB)5VL6jZEos{6&JXt~UW_V_Nzs;ed1$G4F|=GSO?$V?!%d34kIKLP z86X#0zA;T(+r>gdG3rryX_|JjvxSMGTvT~*inf%Cg@vLJU^*S!@RuEbJu*5)d#Q_s zrJ`+UxlWq)E*FbUicOEoo71$PJ6r5iw2dnN4M2u;+vuc!rnp=D?~s;?J44I2rfKhV zsn$@;eNHgT&gVttnIsLqNJWa>>hzh^OqZ;mUu zZR-bVu`W^L7MY#<=%QW1bzcs?{2b8e#4?X zS&3SyAe9A0c|jjt_S#_Af4#6wZ|9;=MG4~4dFqmTb8ep--TRHZUL$Ck+rC8!DiUSO zgEXaX6>{zZNgkySONHhXir;JoTk} zbMBsV-S-WvtkJW~&2v%09*MGbL7FnRazmaC?R&#hcAvLg{`R6g6Ny^oAeH4sdG|iL znA#Ysd{tSl7quw#umn+cp1R!LocrfSO}_=IXqYT_OI?(3RHAHCkmib8xuMUT_rJlZ zxL;TJet9e4xV;9k63zIRccheWM@kjlEEyzq}M2W_w$zVN$T?kckKa#DGr61Dq- zR5ldlJ^na+$R=>(R})#i4N{?z5=66k>Z*HlBG0*+eZy|lxFGAcQz{`&qRcW#Q~g$M z)UzS8H@uDRL9+7ur1DZEYL5h|Y%0o&{^)Yp#!&TZimaZkRA{CI@%TLTEqimGoEts- zEl^dXSk~>LRKi<{vQt5tnzwSFK65sIgH!Fssvg0r=KOo#h*xZuKXE?yv!8j2ula=l z^Wy*Vo5mdevI4QkdGn4`$eQ*knzpN$p3PeJxN4cp=(4s~kz1C#m@mKaYQO2W18J`h zH0P{cKB#%WN3#I!H@r5hJxZPA>gv%FyU<2=2`WKF5> z;QRkUZ+bMBo(3B3WPfn5w@x3uQXtq`@}TCR<0I7llTIWU4*j&Ll3S8Vr*HGh9cNCu z$>j(7+lG)VPB5DqTBrDK$AJFVcfbBZ7qdFpi(#Xuopm^^oGT|<)K4bXX1vac_E0?) zsHuK0WoV;W6t^$s-ei>PMg==$r2R^}ui=;Km8y9|FuL2jKu|2&ziGtVz?Ht>?6~o? zJBRLnoxr;?RcZ8q?yv2N$7CJQZSj~oYsATaP*ym7`Arq<>}yaLbNnE^!NHn;_9{}_ zVXHd5J|D>O>moq5wpKMbcE;W8tk4?=rO~JYG12eH1aGMMMd1PbroDgr9eKz1gPa{_ zY>9_fN=`6ew^P2glvJlJcBA9U#B3MtbD!tvp^Wrvll5M6EJqW)@zC2doX&jJGjBVM z*9A_T=ntY&378gMlp;ir+skq6@Ygw&l-87b^IgfaOX;`0Vk{`(LGdz!oITF{`wiEX z_j+9k4+5&m@b&l{k~HCYTPwFKCgqY``t%WZh!ng zMZ2#@>2cWGiNLg|*su?l#Y;~|73~#Vi@QuEe+}mtbW@+vjdBq$cvT~pGbzw_ zI%W$`#bu(ew&6&< zs${3JRLL{Xz?1K(+S;VaC+IW%p;*f%bblEB>ZW(f1*_xt7VJKq!=p4L#8Fuqdi~x< z1X-c)A?+WnqTaG^B*GmuV?eoI>L2!mT&Hg1d7qEOaEgPLdpq{a>aF4r#Ri^hO}qNR za)0ceLlu5>sB2{Ohq1U&f}H?iez%Nw1e}_;GRXY3>C3T$1@-q9pUzj)s*Ot7yw0$1 z|DI_bgxIOl+WEsOk9OaBTl3N;uHLCXXTOr`2Zv1h@#G%pHIzy< zuH5Wcw-#;RSJ@vtktqG_v_z)bBhzz|h{$Ax)&8-`-f_Xs%U5Y0G$S569sCy_39fCD{ax|-r5(NzFQ%+fq}h!a75MOsq2Ta-kp&nE#^r3@dqznI;^`5DvPVb$_W%~mIW1f>vpK3W| z{GbZh_(^4rR({xl9-KMQA8+6DI_GZVh7@g$GqrA^hn!h!P!XKP1!sLkA=}1 z>H}+EEFV?Xx+PoS;35A0okJredgzHP&S7%#p6$iM6RvMQt)5mrS=#y_` zc;M(iXwS$qv`5F&w=2fwgjG_Sy!zI1s{BqCgxDv2y&vG$0so3<_;REwTdiC?j%>&o8jpv6Q8F|OJ^!|P3xN&Xu_88FB zvt0)F2G2~S`CG9|;vJY((6AF`oi*iS@da>(x-wuaxBzEFG%mnJ=Cy(PE0Pc1;FsN6ok16J97DZ7B{=1^3K z%dmddnN_yfZmYbqyHf4~`n@b!pNqNV81yLIA!h8$SJw)z;lTLKq?6B`yb4TLT?Oow zI?s^FScBOZJlQm|S=Jr}cJc{;?(A0|S92vc5HdNu&E7uehzGDQH#o#S8D+LF3_HKu zIpb9q$ty0kZX}g-JyL&jEL6=C@)oT6pvJM={OJqFg4nIF%EeD!?T&h)bt*NIe)%m! z_27#>=bieKsz|i&`jjjW^#H1o##*{g%_e2A9`$Z2JVjqseo;o3d%}Tv?i(EZH%eYrh4Eg->b4=07)-dEo<5CV)19CTcYp2 za9_OWxkGaFw_@?+<}J}j?e*42``7Dr| zFYPqSq@I5lUpLwG9i3qFon(o6w75yEokoe&rJFVbD?YoMtX?1OcV|a}&BCiLIFr>@ z8uNp9pl$BTeHKfu-V)s%yaTK;wfK@=@{(nrv486B4fX(QFck`z)T^A+S}q(g=Z%)BdJ^OY|RxFR*$c7Q7g3b4zZsSaR`}W8Z=ogI`Q6UZIyf zZ`o$7$#2~P+kL{n{XIVYP5 zM7nu(B;nsftL^`$A7`?{>cza^&1joDa+zYupSK+A4&DrYF}e7-Uh?8)nb^PSCVUE# z%Y24B_2>TH;49!4jKwW_$%@M|aVER0UMvj0g0=~h%M?#;-*W7K*)2G%VfEs!1AzXo z;Tsa_7cEotyK_JeYEDFP#{6;WM%DyS5xEFeoRcWx&-E@$?hH~nwY5S?^7&ER-+F<2} z?QN5}?F#)j9|PHW-MOq<`?9vPJ8I5c+?iSEl%X1r=qO|t9&&22^G@tc-~ZTZ`ByV_L(@)OkTIc;&JPbd6}RG4f_xtC_FLj9 z#7UTv`X+?T&DBYlPQ~?)>Ww7#@|Fs zomLOtV};yPgTAQ82Z|P^VkZn1fv<~+NtsIg-N~DsGlgkF$C;?hb~m1la@OStZksR< z?TXkECAOzr+&O}=+HK5F{XwzDR^`0IH`f`k2|mNeoMBUmE(d(Ph!cSu4i02iTklFa zPUjCHxPwk8JhP$|f}QT0BJo(f$)YSKDS(HG014>o1P&8O5LgqqZ8Aw+2uckS$Qy43 z!r0Rk2LX#G@aGNi1k@-2Q!w3tG8XiJy0{Gbs1_*z)9nL=bNNsLcajO>PL${Z1q`|q z5I6m8ibUXd67Aqq(+VgUt)D1hmk|)G0VV{?A8Lgl>YY&VlMq}S5YA{&Cj5KOd#{ky;K2b^{Vh;Oi22eM~5x$Y`rTR2J45vwJ}N2@Wuj zJMBb3V0uW#)3hip!RY973W3>H0peyM1f7GBKpGTB919^a=>i9m{MW3g{KB40e+>X{7 z5y7BaSCbIbE;K|ikO~T9KZo&$(ZE5;O?{d6fhKqbi@0 zp3kP&RmdQC5I(!60*W|Cf*%25*TFffL40nLE<{krH0Jb?4Jc%Ey%Uf(*ec*y6Gw!; z8mOuRaTvBwp&)jA#3%{g@hl=>sviNP=bk|;*hSls#x>fk9q^nn2rmQ*nk<0VkA6t{ zj9}i0fP(S_)88*AD`l&^dszR)CL%kOI+o z{*j3YJae1=Ye2~ zv7k1@ns1kHhYryKjiZeNEd`_eD>wqXm1zgWXA-9QS#>gXQ~CKa>tqN$2%iA@boT=` zhr{d@zJw4na0EsKGa`@`gt*SxHO^E(_ythAUHHR%x^dusK_G(Ooy#BLkCbHaken;hEB`QN|S*tGtS=NoBo$LOgT9Fz~oXfO&NY`Y@M~BSV@$JT_lC6?hI=vc|g$3$N93BH*ugV$yB>B1t#iag*C5=a}WgA9fyW7SXq-3XUco+-~yvm z&^7`=zrB|^${!etsDmLqX(6Zu7|78GpU_V0mxC1%@DI9qgEVG>u(Tc!p4Ou^qAS?wLZ)t;?q`C=sP{M-gg$fr zAg8XYBoqRhigkMVI%1l|nIJS1RPr+|{5l%L+t+Yn92!yq$wGWU9FHJ0YVmic5PYdE5Ik$- z0Y#EGr~u)$JV4`F@OlN347-O@)K_LlFSCOL>c)@=OA&m@I`TQUm$!3ZOqmH8LO>y- z^9C!C>lS}1{uBO?mpZZ1CzR4eZu1{$V>8@f0eM$1Usd6#G$gvIlQyx3+YXGhl{4Hf ziptA}+b)l^4KUn1Mdbs-ZQ0GaXNfcI>P}a=Hii4+jt0|K*AtV-o9J%V#9X7Rb$Km3!}(=24zjdZArFu46G4xis44AZZ~D@Pcdk-!rL06lE_(zhNsia{ph?5PB@GF2&ocjzfisl82$hBf4 z4K96#S4Hz;MC8!8NP{b%;Vsd;S0ZwB{3LHGy+**;#N?!pN!A*__m(}Ww)pZn>6QJy zgV7lsw&O^vHtRJpV67V^~}*KYkx?b%dUkkJ86dJ8m~GrQrNB zaz!p@GfUyb1oYJq0TcEu8h-)GIZ_>QVb?j6Fnv>6v3}r18m4tz@;T)Q%*@6H6%O7K4<#5hJ zkfA>7b7mh@e>hqA4n4bpg?7EWhrnh&#&v&&gwj z{Nwp`9U}Y#RL1|LyqNSYh)}!$5%Pd9tH9IT#&)%*F+U7xc?efuECx0J=TwWjNtjgr zyYekQ9D5Gglbl~SCo8s683i8sb?-^Wt#HoRoE$Fv;Q!eH3lI_O_$mfmOK*187|o|` zSSz=QbUA}i3&+B;JHF3DsP&wLZC^ng{Mw-%1r z|!W%yDBq?sS|VS7Kl0^AjjzCk)g2 zly}Q$``>HXSFLn`IkDC_@CoK2J{A$^;0zr11XwsHYa}nt@J*GCVwQ^3MUt2{9%AFj>4y*cc- zOZDN4cI@YGye9FRqo1bd>6AUs*%s#KGG>19oFbrUkdwKQvL)2Q_EOxArmwN(^*T?} zwReTR9#*)}r0NGbaxKokNj{;xM@KCqM?b8=<&_oTQQ|h?hZHv*OG>Bd+_Y%bnYG;h{Qdtp9_Pg%9A<;A9hVMbS$9KHBh zF{=4%8eI8s;_IWfPvZ)k<`H%`V;Oe+$}3yKql{X{%S|?xcdi^hb}?0PL(9pR zR6d$w0vyXa|GWDQhVSFy(6!y9JauK>ZX0MW1J!lh3m9UBV4jfLPQ5%{|sW_hmx zrLO_aujj(U?U9cCh2Q~pVrP=V_?FFQsV{hid!_Olfmtw%u7_iKmxw>!lHuKH_1m^&vbLPUO9g&X87_bTkyg>wh z%-byQEui!*p!w}wc=% zsQY_>>3dQe*{>U)lD#|mU(xOd+3SD-Lqy=!Lf!KK!Fhn_JQ4P5NXP3Kum=Y0DFUYn zbW%|Q-~saZxo~M1(s39A9>IV|Mc{ox-3b6w0^k^7 zE<7B8bmU>cd<6{1FiSaV}gs28OeYt6{ElOFu+9p2vbOV8Itf;LSqa%K@e3fadbK@bGY? z;|(m>8w>UkfpdkrR{$hF0pvf;g-bt1I^M^EL$TloBJhoVX1gl^rj>wWm2=_YQAo!` zEI0`ZMv1^J{LH*R1A;#TqCd}tOFu@7)!R=TuQ3PHp)V&s9S_?Q1C^ViLd8F_!Rym~-sJ)pUME<8L1>9_(1UWo%M zh`;iAI2Y<6OA(bEM-Y9C$MhyhQ}==x?^W31Hd;IMy^59-e`8G{S+6abS=L z{Gq>@cQYWk84%q(7cQNNbUcCsAH{)fMd0s*y0-vITL8^1bK&8ykdBvd;LA9$lL)*+ zsQVXyL@PkPbuL^Qjdb+Gf&Fpd01>!EfZ6V^0MoC4V_)aOw+Z1hSR6P|1imo9?7$2b z;3xvm&OthcL(@FNlUwg9ucZGh-DKw6s!`#Yp#3J#o#1E-0=PXw5iw*#8n0e$Ur z;n{ge$2=T39|!&*0*41!GKgDfGi?sse>}g{k$^LqX>;H&2LGAxNGy7BhuwnltUpwS zllUMw#{grb)nV5RRX;XUT72j&nNp){8OpaC$}j1dCwE%ouye50DtZSLT?r4kGt&&J z|5ZjFspB!?#%8cT5uA`qoGOOx=Xsm_tHho$@b_DhA;OQj}q$eL|XX#GqJ`Tf{hdjY8{at8Y| z!F{{~96q35kgQ((IPUn}kUx=Se#Oks6z{(>!B4cbe@*qLUfM=&P)hwwo3qKYg`0d7 zk0CwN=GFu#4*8!57oHj0><(G+0nPZm&Y3xfSjkz;CR4^3Sa-+~LZZz~S=1XYQx}g# zKO=P|lcaw?A4u~g;M6(fb?lk;`{}>~ASN;3?F{xOg7a&y)d83*=tQX}KTgJeH{?%b znO`yU6UF{*F{7muw z6D{rkxv9?G&&vy@j3X17;xkQT*D|1NX!8Ts&oq%;>lggLX_=pD`~PoNIy>9EQ1vry zPKXT%3nO8LDK*pPMr2a__&*W;zc|1YH~x3qfAZYIs9IPUsl|`W#m%%ib(EoQr<1Ub zN}g%bo^u!dfN;@AB{HREnuv)FC_CHyQ1vrS#3TPn@Y&N*dnh8OF#nNL{W~|!o|Bvs zJtz4e?bW}V>OU}me@*rO>a_IF+=hOl9rr(Ys&Li#aRr@DE$6~H*D19Y4F7cUCw;Kv z-)7Ftk$*qYHgl7p@U||U&e?mN(hWrJb!y@TrO&zQ>w04RxZT@f_}>4roI|#IOM>qu z@Pg)EJ$7AqG1Naq{@Y!0Bl#kC$$FaO_5Smy~?d3x2^U*caj`4teqR>MCw6`+L)FBBfI zf3AyXZV>x9#ONw!3xJZP&}E0J)ja8Z-m80Ay1Vgp409582hOo(d{Cflp%d?X-v+EZ z#&Lm=WRgPzw4x*E&dLJ{(&raD88L~Ymk79&pIgk2G8!-A92WjF@)@HH%H;=Wk%af( z*wKjE`R9`FG~C%2Q+!Hzf1!UH6#b7A3mhW?sQ9CVvtMVXIbBNbs$#BSlUMM(tN#^K zUxXLNIS6lF{U!colkZ99S3vw)4ZkwPk1hA#w;Fg#dFPT5hi2Dc6YlKp&NXr4OD%nV z&r5lpKZ_W*jbx{VMLYOHV0-?xPtR^(apR!2UI#3?*-OEDPF0j1u&-&(cVlvg7Zhp9 zy!&&DXDh{Bog$Uua96$8oJ!F^x086O377m&6VKLumOgW9Kj%VSozCBDzqVRSrgxhc z^q2UTO}>8__!SVpR>Q9h@#CxU|Hx|KFF^?O$BP(LNt8W*ILh)5ljxkC1a|Hu$dgrvxD~)Lk~t=k7i`epp=<{jTllr1l>s5E9>+{*Cyt-(2E%1HTdX4~P&a&Jrhy5F=)Z zgMJWuPhYyn@0DRxJx*yAvEYo#!?P+6i!f)*GQSXE&X{G+{J{*L7OGsv{!Qfue-V{O zXH^~*A~80?wuv>6Cp;<632-U-{Jp8{1`r$_#JyzWA-eu(0vCu-`&>+|C9R&v&_XJ%&LOl zn6(jenRR%xD)U5CX3nb25>a_@mUu*jxNMfVL4^37U{+-wGqV6r!7Bg1>TKSbPkCO}aO>;Jd_12=s89!O12^IptJ8WZn-urCo|_nAM-zUK$~ zcPB!Y`F_tawB_P+O%iB6OFk$eLVo<#tm-R8$e9af$uEeKE6$SVh?0B$&|GqsTiyZJqd!!a7GZDs!EP+V&Xk#DpLc6+ zDuI~Hs;(^|Vi&pY*?3tlLVhE7R`o+7q|zEXWsiC)xwM%E0p*9e;pv+56CWe zl$A(X$GO{7u?Ai&^k50KcWL9lJVvJLapn z>icJFLSO~C#0uiYl0qTY`hTT9kpA6XKyP+Ri8;jU5B8EVfHibK*V-c*dPHIT4^1>G ztlK^v&@H=AU^ZJc^DC}%+MAq|9N5(&!MBaTt1dA|`S}j-lo1V9#`}yqLo6*;@(;HB zD;6yRj4UM3f(^{I<%|^=wAc`&@swy_3l}l_`=|bSN(0^MGmCf~XllK15!YA>ynE5Y zf|La3?1N90=n7aU{PdIzNidEPKEjS10tsX>AbgKc(1UyyiXfnO=Og&zC_y(;;1gYE z?utT8w;>5@&~fza6T@jh?GTVD(fTy)yb7KHYkUz@8R# zfM8Q-5+4aQ=8pOZ_&@@yH(xN>ipU4y1;&9)G=jx}2qt(aKHCn&2MrJqf)e56BM5>{ zAf7jXBJd`V1P&FnUNFfMK1PrSh12tK0vcHc!Ee&y(`q6F?-1;9K_Ewlz@-{dc_9=y z7g4VZ3S{yKf)XtOjTZtm4xH+g0bz#FAbyL0%P%1aZO{zjBSfFND676=!HElEVz&14 z|L&=aIx|mQeARg-%D(k6iWhK@W$^Js%JO=*g-+A1H5-h*Pl; zvz)(7^-c+?)8JP2yenvR<&FAqUVHDsu;SXw;)0Yzd{&iUnpqJs&h_Qd+DhWpfn7@} zXFG77ygq)-ZQ-NkCc8U9fxKx9Z#>bd4xME9!QX4Dk6nThe1Lm15pWtwK-3a=PtiC| zq_YqZAs1I1wFk$fYRp zC&pM;A}EBKDkHotpgT3BPC)J1PwDat6x^Ohs_R;#@qX_*dCW)X zandxWiHxWq3#=dY2(=}|PQ6RMvt7>CoUBxUkJ#q8S@LmZz`fD2My|=a8?hSIEbMq}g(s&{E3Xyi%^PCl@n^^FuL@ct zTJs_Ne(#A~!PI0%JAaU@?kAvqMhogHP}C^}N(wru%g>!hZh-)e1bqVyC?#WGerJe} zrym*_=?d*1r-FE$H6-a)8Np=d6uI^52?*BJ*mokr8jb2Cb(Iru;}jn76PQpXqW~&G z_=GhZgwZu?5=KOT4(digQEDCd zu_}d!`C6;2wN@2d`z3mD_Ds|E=wlTEq@I^gNd}ZWh$bp*LMsjQ;MSUtD)ZAuN63IL zO@MF|z4J;wy44D;kjnWC=cw@BL#G3tpG`yg_I-fis3Y{r08RUcw5ISS3KhC-W$|@m zP(fq{lk5uZm~i-{z@ZR{_-|C$nnsXckuL6#G5%AQ&s7c3=oz0t$&gl3F=+TnIJ9$O z1h=NW&M!W=H(vK$E2M!lzO*7A>PzR>lviQNQR_%W=dpbAo!~%IbOn9B>^(G3c0%xUWdw!88i4@~ z5Ev3|M};oz6&hFF2GxVI8!B{t-B_uD$~sseq=FA&s2SqXy;;l~g)DsnA+49V2j_n# z1I5gr|L&%27_TCo{~){I_^0gf>~KAwMU4<6T)m7k9{BTXIzl3It~lkQ+pX2D)aZom+!6CSdyHpz(zCS)kI^TauE z!oGuJGPGS7kRt*Mdp5ydbAxG!2x?u8L75M^dV^X~-Ghr2Fccc13w~q|C#5r=Jt+&h z!mPoULS6{vef{dR1BG94kGBmYT^C(s9?vISpx;pK$>oS)eDXu$u+H{%IO=J*@kxHrw2tf>_-nz#qn^kE{tark+X{aK@OBzvsid>FL`OMSjgD?*FjPc|nX zSPpc7TaoDdI_{2+j2mbPBDBzGiW1=>QGi|3n2)1n_4d}N`@ntur@o%kN(%=x>-p2#^Fr0TV-8s&9IaX$4|dbobOkv$K;x7(r)? z3`m$XSp)(BKSflp6EG$?lzc&J6k*Ib659`CLx2Py2n1pT_u@_5;%5k-3_R4$%OYz| z)X*8-wBd2jY9fRS)asI?MVW9T>?k4muxKq3|Hw8OYHf%Q?d)`a$><=_iA_PH3_oyc zp#vG*GD@`1h3T?kyD!3B69b)qt^+ZFM#3K-5VL#WGSe2(&w9?7gRvNbEC$(q&DGzz8XKkI~66MVR@ z2mwSC-6sP@kI;=!>TrX2!v={5TM-CW4L!9p<8py|4XTmQr2W?x2MHks1&J?Y8b|@L3Uy6l!%m6Y8Y#%QTBB# zV+jdaBVxubWEuOujQ{)2lvAp6>U_WFT<7=yp6hZw!~5Rv=lR_Cb8qi6?--=a#I#pw zghcyX*T8^~J&{n}K)?<*hn2opE?Djz80Z&5aLu+Oij^1^<{HG>rCn#28i@Wq5nc1B zYs*I0u3=aPYpw+chnmKY^fby*zpz|3ooSw|iD7Y?FmQLB&$_k@RN;^f^RU(}{)yqo zn%(5xEoY3_l4S6A)Ru-#7WUZB^ymQ5IZ14&SRU`_yi?#YH)Sc4w>VJ{mftNhyv+Xb zq0C0NvF5%>iBWAA?mSUoFUrn3_mWJj;fa`F>Egu!lVzi$mUE@c<6AP@%V%nc0w1T8 zpH$2Y^|&uyD7eZMCOt%0en&`iCvNTP?jErck~!1C!oJ02Y~O-RffIgawx3|146!_9Hf?r5N@dVl#r*}B4Mxpr_R7L~on>Ol zpp?rrkR;tFd)^D>&(2Mkupwob&V|b`EeLSPbmzM-zQZyql#W!VEIRTA&NSLW>s_S6 zr0ft|;?SM0y zZLoSh#WW4&R!!wrWQ?|NI&kKiqoty^NR^?KoxPNu4sdDRZ=l$zcg0ih41i0^pevy4 zjh6~$VQg*06djkjIh!N}i~2$3d~}6#?dIBE^`q`i?{yG!0-jU-fqOIihx!B4rIv7? z&$zFhRreXJ7g9K>8R4dYuTLUSn1^Rf#LV~^Le*>(w>7qE)=y6+ht?V%%sevt`bhj> z_I~O?x5TT?PS6X+M}l^+x$I$UWYP-ow3C0IE+r+vo4&nLkS_la-C%H{LQzhPDK4Co znF+V47kx`DT0{CwZ~LgD)4Uzz{a(G+1`%`REfqB8>uq4NGg3=AiKY*ehX;c(G2UKY zqBpZs^k&1|w36u1W8C#fd%8${> zL?~{1pP&U2&ZspM&J>kvuTO$u_un3D1PM237#|6S?Fbm@2ZRD%*_ncb%>>i8S0(s0 z&rAYB3SBuFAYlwM?rv}6>n`VcKxnUZD-I+IqcxYaF*TS1h-R2R1StSS6TC#Dvoqdi zW`IHpng9cUXyeI{w=KAjc-(J1`#;f~G&cu@zNR^c5lsMSDgX@n$2rs2rlTqo6!Q}l zK}K~ejL!Eq?r(2IgN&}OFxqcp8enP4u$WmmsHX+U;Hd1eMUxq`-ursXZT4|p6Xv=>kUO(1D{#ln2r+*}(FdI&B^ zkCgES<0AkgS6B#W`wzb{s!FKJPpASl9beJ3vbWK&y|EY6)Nw^q!-b@Rd5mbW&JC}E zb+qnuNaAjRB?xrBBKf=0Hl}HorV}9l+!g+5*%{5586czrNR7Nw%`LbgJPs7v3;4<> z{$^kECp(mACT13ci3e7ScV(s2D-#6s69hs2Z&vsV^fofLHzGm)@D={dHl}whO)Ee~ zsVj``WM`CQW`IHp>MM*&T5w%>9HskvhDCGb(HW_??X#!c`xurIl>ZyJ;N(vMB|d4Y zZ(%-VZmtDPesN``(t=?yR~QUjsdp}=OlWu{6ElawfPr=uP=cHf(oitG3k(lNN&1SW&6Nq}`3dHrrnnVN&3YR} z+Z!>UrsgY}irSclSeoKNO~J{?`5+`aqbf546jFe#Xj;{R0~oDew%xMWEj3y*Q!CRU zyX?7TX^-@;;I?LFxPrJ~rVE^T!ttca!oqyU+#LM74qQI6ql#r>7BCnv^Y#CxX$TDO z3d4hII{BNXRSAUr1Olk({EDVSy^VSQjTTfQu~WRUR#TyIO$QV=%;^^^^;uc&d9tZw? zmhk@lHYubA-6ETZHfFZekMN^v~*ijeQQE*M~u4pPznZS{szyWId zdPP(A-p0-CjrTxJ4OTSWY-9Q*Bl4PhXJ-^=W`IKFAOo_dWSVPysSYxCKvbMyL(_U@%^<2;Ukt7OY7vMvRO!0k)YwJ*RT*JRD-Y0o?G0j%~%klS9oNgL0 zh2lAMvF}NI&BZ<|kr{G|e|JJz`pI`R5dJF(X7BmL_2MW}nS`lzVJ9wC-p7PE#OW@m z7E)_c(I-Appy;Lv);@t(tb`;4He5JP0~e+}D|ozx4P-hZhQ(Pph-V;(jtP z3oR{a7IxKSsrZg{DU?1?V3ym!EKdmgnfaRzsQOeB?j^UH1{fSI@WAZoxswU?FkZF`Y>Hs8)3@OUrWT9$R zq`u~Zfbq7M)gEZIS_DG`lbH;^_?iR?4-nHBz`Wos$BApR;C{+ zYmLI`bPtAiG&@aBkokmM7WADsHk=47X_*EvO9FWoZT_ZwRVzx^8c#uBmL~EnX-sBD z{Nj-b6m{S%=49r08cZfrXoo6=HNgB}CfSk}RQOgJB?tcNxu7LswT!7Tg#B*(O+)}w zbIrN~0A>dnvzW=un_qlaBE>cq0MnX`*-e8fWeVM?M)3f|%qC-Aqr&&lC0bI1}*kbkIMRXfO**p`&UPbD)0|kS*d) zgHsaGepD393hq zj3N($7Zo=v^YKl$&sUUZ^Z|qHTd$b((!G8+F^-u)KzQh{IdurI2;)tXck?rwsR@YdrBI}@0v5SL zwg?L?Mu<7|C6q!Boo?2XH1%@=P+!X6^#wYf>pFw*xcXC(pEt79-0XO0Q0F8<;7%j6Bl= zD*PT=rTYTc&j2$8T_M}P+=K9tiu*kC@%?~B%np-mKX#>Xy4-_-hj!;9z#?+nh4Uzv z&C6$#&S5fve}YYQ{|#W0II>AJ)syp5JJwZD`oIC6>SUf6fhG%et0MTC4~GGs2X3O5 zDNTX2RN+Agq~g|PK7J6GYSR(2-y0SpDm@qu)9yq8Qz3z=0KXSc({(m1qzOhNxku7qR z7GuvG+M!M{2HL)cY>{v(ycDg{tiW{_z#>gXWFM*VAVdJ!llk~@kft!1rg0&n)`Q_B z?aoMmCNo<)fu^pOr&`z9xR5%EivBG?lYx%pBLW)9TIn60Zz;=+0h)efnw)}7(i&Ej zSJ!w712oT&X$CNxaSMt^rc+#G186=Y(>zCu31kk{)u1>;2hgl1(?nC@6={{k1+RyK zG_R6r)_V|QsJNdnAHM+76d}_zDMY;UV7N%T^95*4HnKG{be&BKsbi_=8vvS@$TZ^t zni(H$8+K=z)b90&TTdA01Sy5LJ4$MTz=et+!X!)wI{;V! zh?+-<3F*3viDM2+)BwRw0jT{<$*qh=>0i-NOu9}$i$@b;PshYD17Q0>R3|Dkv7e!c zLr`U#e2WMKkec9Xjgf*&k?Sd7wr3w(hBxB#L?tj2 zzzyLpP9DM+JJ_p60qPgOPUuUduqXM{<10CT%kKMnPCh1mAGvg;{nqxhHHvY(uQp`Vv z=BHbopP>0~2(2oozg}1Vf<;fQhg5)xd{ZJ@dWAFN7DgkCR>qKR!(p%<-~3#U(+II} zpk)AW;kU1}48Z;NQLPN%LgDh2mca~b(%c^l2U`a4?vd0o7~&xnK+6DvfvDtN27ICh zBF6*-d$_X8(2QvKf)2T5s03;Nu*(2~T_KfDaF^jHD3Y7&)rh1@wVESo9ack<>icSv zq*S(AZLm^RtY!&TD)?%>!8Rn75ZlwyGEDJ|BfXO)p830kz^(3I zT*fa6{e!*jOPb_cxj(QQ7`T6nyOEQ@r=a*#G=Fo#uQJwmVwb!dg8GkR_b;YN-ey4l z1Wod8$Tz9=@3H33(PNBSRxkadm;6_Cg;0=M-DM}OcQ zWC2W^DzKxl2B^o3EA==z})B8StTCG=1BwqLdz7`T6jyOEQ@ z=b-pgG=Fo#uQJwmqJq2|@=eP6<=Fj;X_9wCej>$u+70CNMjseaId&nm0nrd!4~YZoG0o?C91m0h;1-?=DDIb6T80d*i~-vQ z@WQ7c0%_Mjjt~n0S_W{JfoY{>Fjq?e-WdeJUaYhXCRme({#XduGJvS0mO&K{`H~K~ zWdNQNu*)$4!7i@sGW-NZa&!F+B3P+nS91h&#A--VeP2zIl*(4CO{!F@S&}N%YQ4cW zBo447@Kog5AJkLOn&cF*iY2+8{S5JRPh+IzrLMFBr_MQao5O(|=@V+Ve@lf#j z#+9Z0j@3Tpf?u-QSN;bU0LW^0S+%&}^Qz#|etzKc_Xv^qKokBfp?|Ws{j%M_So=HN zjhqZV2gRSFx#EOhWvuVS?x)?5|2%g8TAH73<$i)Dc{fD;M=9o?Li5wD&QH+%H-uJ| z(_gPEf5D&3$Ak{Z5p^pM3REE)g6kosV9T)nbIV|c ziE9LUcHqKbVE}>rpg@{dMz3uH8`v_eJSY%Ch!u&6YXo;0KvdE$Lo;v(54=+Xf?Zu{ z84R%|U(g}945E05DbT@yU?3{FW%y%?pPK8{h@?ujnj>i)RzrgIy>T^3FqN6ERvWBT zBCA<~l`43(-e9c)EU95-VSoJx^%S%w_^E_MjjvgLs;7S~%kS0G9})UgPXR)Ae((W? zm8JcT)yTQvo3;Htt9|8vqyq2vgS zvF6XyB;V@%C=-5R&3{AaKdviZSo7y2{SQJ2cz9qlkT?5*8ja1B2c9}d;30!RJqEXi zC0FV(@E*KLG(*%K##fcKwF{9f2NZ15o5_S6YTlt&CyY1`zD& z%CihuLaZIoGJv}bAS$_K0D8f4X}`7Fr(Ez$R{P5TNCn^z z7MHx60Y2UR$AmtG)1M{uPxiK7wi_6@e}}t~lfmbp_)|20bHcAO)_0%Nubh?;0QSi2YEl{HaXLx|8&h@Y+ z#r?5#K#nM<_*{=S;~_hg)Xc#L1=fFV8El#oaaK7d;Dv`*b{UEh4Y%qcJHVD<&F7YZ z9TO)Snur6zHhpdx`hX8qcG@<8U{_Y2W$-4%eo2SaGDw)InFG%MU`gQLCan2EJq4{v zP7zT9)6dr#~X}sh$Fa_DE(PE&Be4G|5Z*9jlRZ!8dFByH@+k|G)xpYqh(q zTHNn^Nb`q;$a|o_wv1m8`X_ta7c|MYa(`quAlCjCcOxf*&q48LX#VDeUuCTC#4dR^ z#_US(j?!?{Y;7>?}mJnTK^tv{ya_coy89`;TP8YH-uJ|(|?3-T6KChSh&BO z<6!Jz)G6@n>XC}y5O1S4^L|!tae9Nm`}iYnzF1S;vJ}qbYOPkC?i~|&u4K)$>N(!w z#2Y6{onA`X+qwH$zO!_Hd96xvFeVGT{uamJn!%QaC6RpVf~7STB7?aRUBhgw4lBS! zGO#-c{BZ?%fegF^0vE0TPm+NbNWfg5fycD^$&6?O4jytZp=HY=tvrakU1-mcE3Sd ztU$J|Ko+e)K3aiXH!qMZN1ljcfNVt&Gk*os6~wgnV{pR)|CZPEy4%r`3Db@4#h=yz zV87Ao^Hdi*R;Jp<{+Ye7_zL@t@}Jo=ZC+ttyfTyb3j2-LE0A3)kQY}V(|?0xU4ax? zfqWoM8~tE2kwu1Qq#MJ8c`~dhNk?qL`rLje}q7TWR91gI3)XG$sC05uAtW2e~ zGS$w?751nV_GfH9&s5jD!oF(-^4)Kc$5tR+e}k-DfsFhO(sl*%;|k<%j?Xr}ED5l* ze?O}$nGGzG(cWvD$sTtkUt>0?eR$W^EQLqp6AKf?Qo3Q-9QU#hZfAnk z$2-W%%UnUo>`madwuEkh_9YH;rDkzGlzSj7Mh>Jc>aAN8VDiu%jcXgT;}*QlhP|Is z@455IyJZnGvUP{IX51pj#xC!LU01EnTqI8m{73hzCYE#eJD#e%^WMu#@?F^+mJO`J zzCxVaSiJY9YqiQeb+$e(5k1?r%i4OQB)(w@6revs7GO^!3%ukZ3;6JU64-c{EWnuh z34!$!!gf#~Un7)$c}~{NdSMSH$pW@89qk^b?3SDD=F~SHmoyCgmwdOWq~(H#6a6YX z)Wd%DCXjuZ*8 zw|Vyw_n_1cq)pV-6+c8C%B0_!%ClzoczjIi`wL9F zoC5QwBYZ4&8807aTu?oAif;#GXlu5o(<#wsoLe6c%Bf}o6HwjUN@a2C2FKQ(OFnzW zdYLItG4DHmYMz}>WHaPYl-0qgT0frjJyDw5wlb8qoV;EZwa({E;OWzKk$iH(9CwWe z*&$aAM`GzkE+Ccy`BK<6b%8v^`PmySG}cob^`l>Icp;(#bJqZ#|7T^+;x4 z-9!*l4fR_MrWe zlWUj7nek1umUXGoGyX8NPka#_7^d zkzB`|&N4!lrKpoGo)>kF^fGJv5Pp+!vtrPMGJo&_s+}*h8$+bv7ZJebCZg_3bP{?JS zH5KDxUw;>c6I-aTI1L4bl_74>mF3a8t*zBj8=vvrhKsy4rf6?(jVhXG&redjndAsz z=`obt+pQ~JCRQlxt76%<|`M4Mkef3{VUA#-y-p;8b*G^jGT~nc)l77#LdPyYC6h8>P97oSu<9u zQ)4P^ZOj!est33l=g`eZUyMT~vO#UvlTJHd594==5^|e7eblJ)cJ-^b>R7FYW?Aba97Hic6r%v0+=Sz9If1+7 zJP!|ZQVA#;7Mh`h&Mt4)4sBLv_HPRv(q3}ytAnIoWtlg&OCZi*cYa+{=T=#fa5=~oxdNt*HYN3?EAc!z%M%ta@X zb&(&>w|q>&zkhnK=8M9|h^)Hj%T~p_1o5dd_jjWTb4iccWqFty`IMT@-{d1)fDd>& zY>G=aczlcdl>zkG11&3;XAEqH#V^|omxIlM=x%e|E8r?NJ3}ChA+I@@Z4+=nEl;!h z$kKLQ(qNXgF@Ae~sh^szDl)lytm3a%ZIvp_FC2;YLG_LcvN`?;TdChP{(XCx)8dABNSmwWf4Fw#&W6opmVdu=QDL zz4e#&6G|K+d?FvI6K=S(ly6FikA6HC!)RgE!;$E@j>vm&hj#YkYkQU*HYK%mJ&vHi zwU~9ip%X0*pw3`D|Rf>e(NnwJvffYdy!S&t98#Lm&I|WMmo=0XJxO>%TUy`r-csd zMXv_7$qnb(Eg7NLr!B|5Ixm$47>c>j)K)o-JnOu43c)wA{v6x!XOFin% zu6yHGC&LbJx}>_}%_9H3!{sXKVsXcY+qU0&{Fr?ygagj1swy%PVet5bntJ(|=h4G& zp2W>6=&@dbcnh$!ec+dkAMklhbbT(_rVc517r-MM?>n?-dg%V{V$&;3HoZc9Wut6% zxxNfp{+qHMJa&;?-oNkg2RYSgLVJzUw2sSA{!tWM5n-+UxP5)Y@PJcDh7RAuw8p8L z0*SXb(pgI9O_o#>+?SnBP&!J_;c}#*47%{LU`l@KCw7gmQwnJ9a(R3^L?$9MWjEen z5gfWI?)};bqjIZu_UOh7Ps$_K#+~XcxUR}rf6n+>?L3W!%HguT~JjiW)x}LZu!MIH(5^{V{ z=jGYAg{8;0%^Dl*q`nvBdt>i9U%v1gDIYg=NgQ+Xs-!i39UXC^aV+XO<2r4|M;=8t zBbgbC4&2i3Xxh}UGkH!#xV!er&UGGpZ~4-n5ju3=^A!85wmyY=Sf;{M~?S#Pf6k&U!DubZ;*?X7)BjOC6Z zDa?7&_fg+pUwxSR^7<0PC!0bqGCbK7U%qamY-H>CCkNI=39ZR_*(`J;^};OA69L9) zI{1k(1f_b%?f?pP`p{7ZsDRZQ<;2MC^3$BbV=WihplZ|t+o4eE`0dK9o?Q+eTNz6O zx;?utWNr5dyX@nMDpKV;75eM~=O#gc)8of!&*}AVd|Px8D!H3of^lPUwH^yol(~W) zLD!)*8FA3|32!XNMl@sNy^a32cJC4w=Go>ECi~!d_1r1@x>7{2Q${^wdOfQS{;YLG z2u{`I)e#fPp2jy0wQVVzPqUtRCeuPK{FYsdqu)RM*cA^stjxyiUQ&nTH_UE2<+Z~s zSrZuE*Rm|o<1KBlg4DIAg>Ja#zEQK)*+osaokd(N_g0AC^h8zLyra?SbNNFIxCXsD zdk)g(d=$L9W^At7uH*gWeJnmB61l^vM9MzmqYUSP-HEf(g^m{(-Ls;W>*0$P@Vf>v zA`)g50h;t{=Q{jj$13~nhSLv(HX11njwtb8*oahKq>SG#D-3EgIM|T-J9GuFLY>j$j31GP-dp2Tw+YQ#FTQ0Sz%L&&%*x8 z8djawjmTHL_tyFBImsPPVO>ixQ=??J7x<|OYh+Q1yTnn>p9RbE^L)0pedn3b`7@gH zXA(7^i8>D24hgW7XVlNPU9}t7Wj(NK?nAod)O~T%k7UKEVDSVck*B~<^~DF0=S~kW z%6|1D!1N;R@>3<=r-93*IU`BjjR}K8k-RJ=vE}@Oj#OPsEyX~Yb=I*MM?dr ze0t=NL8r`4YI!? zf^?0=cuLk@pmifr8>t`VYHJQLx(# zYc*HiaW%MPY=)m;uj_c^NF8Nr6bNn2~4;eNe|?#S~a^dP#v&reSH(Kccz@BVCD9nEu=p#nr(?zDX^Cg(=lsTa=aL%#DL=Yn&L#|_v6hAbLGV8cK^fq zHqhM7D5Nk$WyBdUYiIa9RQe9G{!MT9t3 zQd{TYAa~nod#Nc0YlPjza>B%%9c=KN$$WqBjQ>PH19pipWFIZJ@QMka@&PY;A`zqI2cd@6-*Dk)svf96uh(Tn99Cism+{U3VtkB(acf{~+0eiXb7E}uz z>KOa@j#DE$IPM_D!Za%^OCym>!gXvZL?(|oHdEkiGp2V4W|0@B7+5;esB_)0 zBA~f(a(sNqetCM^GOI z7QP`|`>>8oe@BN!U0ZS78}WxD!~P%on#a2r-IW{h;hMJ`Y@bQxZB7!3ntCRzDO2A# zHknhxB10_gEOcKc5{K0MW7I}Myty*QX0=28TLH; z(6#mLLrV_h(cYZ?2%@;NYuZe}+g3MYn4G}|_!5g;v*h6@>ON~%fzlKI=>g!aKc+BgEB1niqh6pk~ zC7vxVA!V{)TLRmi#iJ^}D|N*W-T*cC+h;ly&xXakR%&cg7eSc&g~g|&nGE6Bj;b3N zH8f?2AW~mf$EKK?4ozm7$Fm(B_uH}h#1+3Vh{5~DrgFBUajz2-QUXM#RsCFH212Go z32Y0P*V>IuFp+6|2D@vzIQPr&{1 zAO`J?O%-e#;$BB4Sl<`ftm-EV>)vU~9?#~Dd3~Z$94fNe-0x<*b+QRNj%|Z_w{C-Y zy2$3#*M+gx#-{9(TSVj8HjGEptv+$Z&miu#HLM%jD2_2<&lI@_|Mde?%4`X2r5}v^ zQeUS)y0a3j1x!PsB1$+m?$p<}A>B_Ctatwh2j=CMRs9&oiyLd*ILhFglmg$)lS_&FGKq@6@|xw6^OI(-wnc zxG~QSjvi;iYaekRt6*3+;n{es(>i=-IJfXeYURmwyQCr&l^vdQ`wUQ5IThJRozSi6 zE)73Fqp=UeEj&!^kl>L{(;B=2*L}$vAod$oX2M~P1Vh!i4!NTUohUq z$hnn9-}B_2$k9g^==U??sJ%9Ld7O!?z07lrpK%?nSL4Y}>&TtjJi@Fr%A2Tm$wpRP za4_caVWX+KRb(T3qT_AxGi2Ad^|Qr)q3(AlVx1D)l2nM z=b@;b_jrW&(kO4EiaZr5sNxXBUPn@sT0Rlj8zypd1>^0PewW6-bmv&q&U_x>gEY#lRJ-IN{Zt&vczh1iRNXDIkvs83#rP^C zrwEO{-${e$(R3Ah3r5@yuMPJ+e4=YV@Eo&YT*u+1D&LtBy>pmH_!x~cCsm|;BtgYt zmd8h$rpmu)LjDBBMdKTcoF{1X@1NZBbd>QT{Vhh^F0Ty_JkC6=W#m0}hjHB=uf{W- z)=zhG@(Q1!QQk|nOCeJ6q5}`F&smzPheb9DCv-0wqZm0AY4ih5c0V1py+|LrjE2^SrpygsTlRga4%&YpOA(Kv;X zQ=LX1c{2Lh=(~&b7)G36q0PCS7S#XL*B!$$SK6-owB9f-7WAofrcVi>H_xGc;J9Nq zf@^nctRwes1b-CW%x54V~=ZVfOlR=nMjK~u+P8`tZ1 zyD99pXiIQeuGm(r!~?{+(UxsKFpqy<|Fy%<`9Xj7v%MC)8L+c8g8Qt`y=cAYWWjqI zc9wvwvpJ{Ga?vF7Q8?^u7xE(Z*<{PbZJCd7g3tPp53`=Vv*4A=eDq528RFbO5#m#@ zka%{IW94f-cBn#*1VRi3W6hz^Dou4i!32z+xrmLm2qp)I?rEr;YG|S~&4Jk57Qwv6 z-8$V^32AIPY`UXS{RoSO0e^xy)TBz&)K3tD(aR9A$ri!1;cijAuVi}P^w9MGh>8Bc zS?hm{B90a>d|-S8&bq$+u}t!jITzJ$@<*0){Fl@h`LX$8;R$q*6shI9{;cf0URMO&OWVqz$zy= z-$B~7K!d%iMm4Rc@fsqhz?HtnV!3+x>fF%M;uZIW5&7-yS9F_r**OT8-NlF4Hwozw z*r$aUid9rOIEdX&vpti9A))#n{9H*xWAo5t@5e@7p+3v@)`C0@&9>YOw~_(@)wq(m zCFc>t`he!~`MfFaaoZGVYk`f}jCb?EQcq*gB|qgH`H|WA0z? z2L@TBoM7KfLD2;N;eMbPc|TCyhOK$cttb`?Hg`8mA;Y6rQpZtI8K$;6Q4K zikzfBuKnHU!I&PcVcDGK1FAEDb6pkDE(h`o zv|9y++qHVVZ_btsx>#UC+S@BfRA>6(M4OzdWv8k41)46J=5F|W<$A3HA)Ri{DE9(< zLJh4KVQRrvqCHF2oyn>#KYsTb@EY3FPdN>r<`6D`4)wCc~y z9lR=?nJb-?ht)CfwH!%ZSbE`bxS-k%V8A7|o9nm){AO1PrZnfey*s(23z&D$iDm=;Lz@8=6&CLQEfPCfb@;b1{nr z&biBTclMi>IBk6#9nHd>R6Tj}t@UgaRNB?`nx-T_RY{loxEhPtouMPS?Gl*^mO>MJ z;c+5T)hvkzHlMr8++Ru%3$$^*Z>bj7KCNcbd{Vxd9Y1*>udTkUDs2l_-N8I;1zNKF z{PKi#W5AN9SD$)*-lDLx%V=He2a7uVTybk+!8}xvWu$E+H7T%u=pKP8wB6-i9l=iS zFl-jyZ!0r6HDKX9E0(D_RDd~raYEVKpNmBd3#?-Ika!y!ua(=xaVv=ngKfCB=wL8b z!RUW9Fn>tXsV#eUKE_^}m^v}`K1^9BJYQ1sfZ>Mu0)zl(p0u;%KygXTS|Q>jt|VG4 zDLkf0$0fLHsAsUgJ|OLVlG1X!rdKJ0v2S5Ss$`<;?bwc) z?6S>91=-VhBfO!J6c!#r=bpvKTyubiYuePMnP)cjZL`=84k^ovWvXu4`I8$0g`}!o z=3B>;+%jGI#~NGrA7!Xm(#p-rYW1%a3z_R%><&D60q4&9Xk6`PK29Ms;L$Si+^73Jw!C5^;QKv4?+o2!fQv^BF=8#ramb&p;uSvHGe^ zX|cZ@RsY>X5Gce8@_8sZ=KC_1FFv;DSB5vSvGK9L4JMqS`VfdJ1pd>5h$_SY^3`y} z-!V0oEiN|YCx^6H$+*~6Lx^{sIwTCz@KeK0hzJz&?NDiH{Jq29JEjf^fQWo=s1hPV ze{}9k`8$vdDC7r2L-S(OUJ)2RTR5T^>K2nCuCndpB{ud?kp7Y z{X-L#`rit!k2iT4`_n@&_24)1WwE#7O@3iO-_(W3s)}4$8T280R7HMiIP6Fl$CeVi z_0y0Rdnk_W7l)J=7-&Nf#7`X<6rl~Ce`YwpsVsJXyh%|kI^N{XpBqfrE~$#ZAxBh2 z4F2>GZ~%*FepQjEjhIUv4Ago#L}M6u5PPfnbY-GGVtd+PkXG5yS;N4?SY&faWuhTM zB5e?*RXgNs7$}TIH=nLTn;^@B;W>t=WOcL|QXvG6Gel*nqb-o-A@F%a)Jt`=6;dG- z&Sr!vQ%7GzmWRS6jZn4fXj`O07+k{$)ufI_Aj`wxPDZE>b+iLgAsilTg!-tCc0!hi z!*h&Kqv~iEq(TH7XM~znN4p`*BjEE!C<+bqb)>=*IGZtQqXyaoS^fkrX^f)RKzkw; zBHaTREUBH8>4tM(7wp>D0q%B>YxVtE>a;Hjx$DyYoPBT z%cJ4*#;D^O==(^8r*O8bs52Vqhsg4$aLKEv3mWK0NQGx`jjJfA1{#She+GBDiqh3U z2O$;E@ZhT`V-0jLvK$T1xr(yVK!+j~V&J%|C;^Pmu~Q;2I{VAPqDcS^fgW0B>t@Ej9V zvIaUHsSpRpnV_;X(22ZJxc8L1EtXEQ~WX`oY)223 ziUNjyiBw32vzehb!q7#?@?^NA8Hyf;euY#>foqtdSYhbb$nq4plNo9!3|)p)NQDQR zp?F~EH^}l-c#awBAPilJR7iv4%uwPmbTzU(4L)y%Iu1kEA{El%Z04vlFmxTVJRL4+ zj=BItze6fyz%|TKP#C%qS)KuRGDqpc&`n4M3_REzWeh{(kmVS7jycK-hHgPBWWsUg zCyzUyannd3_Xfe$c3|6 zqRL?Cab$TeT+$L%3qwyL74qO3mZ&BedKy`t2Y0eWb->WGNQHcOuqEmv3_Xu5&xhw& zqDEopMWjLj9A}A|g`tVa@&fq0C5l25O%bT@63%9Y+Ng=93@m>Mm$X9BYogZ$Dip#s ztd>}By3Z8NmAa35P52kMmMnJHkFe0@=Ve^xBU+RfiCOMA=-!mjRnmH()y0)#$#wIb ze0xZgm0e1B!8zDO6}Dta)IP9{^WH2(I@8ew=2P6$YT}xe?(TlG!6H*bTFW`2+On>S zsDb#H8P_n}|0d8ez;-6NI-zgSHb8**Si3ikAsr`>I&sY*FrZ@5DWloE_l_2(ZH|~M zmJw1acGkg785y@s`Sl&8=zH5PBMu6RP@y$HdY)OFd`AhhWLHD>jLoc>KT7X1;C6qz z^|ZvoZYW=t0PUrhn{wVZNZoXMTK?$tqvx0R)dvR4xzAAVhx76zTN_ z7m9oQEs=do_!gn0YPX{T?&&?s3rl)ReGyW1gsKKT_e^)YMMKmgFpN9 zD{-;Fq_QQDr6Vw8!Lp-Ng-{@2>Jro-y*X{U_u%ruA!3i@v8B1*`Q|zI{6)Rtxw?Gk zIx}DHR&SZPZsGCrjmw=2BlWQ9*`$fScI|e7_Ra+%>7zs1Qb(69+~)PeO+s~!El*Ff zF83ME47Lt*r!AZ!X0X{eB!K=ed zr4?m&w%9asElV%=@E%^iCXQ{(%UPVO8q=96Al9^2DJS`#gTEec8I~QLoVOH0*sGo6 z3-l(U!z?CEmV1XM->2b27MuiM4JNeVh zuNQ8l!KMrBcd%?pD(-*gV(pmgLL}%d4>osBvf7Uv7;&EtikMD#Z|(SQ!L$HdFx$x) z$dwJd=kBQ8jlZKa+*eT0>)#b@=ASgDT{TwvK9~M|rHxzGNB!*OEy__3xZgH15bE)k z{+!be&;!nP^P^KediJiwTF-ijSd5E%=CMq*ndtll;*fjmq8)FO#oV-}j?fGDh4M6u z2$|@ya{h^~B@te(X`+160j_)_u^D$~qUG{p7j}8J)ZNLQwiQ1BcbTNw?&vl22zWfG zX=KJ`to)_Y`f2~Q3ym*NtiR{KwzTm$_u8fIEOVzo-5|-7cWY!9(xra838bwuC#?@7ZB%oBxdm)y+Rb7?O zB_?7eCk*WkFNZreggd559~r30<*UtYezF~6tZir9Ch+#IhH#RJu;ujgNX`t1KhDsf zZ9oM!_1t{=d5ZhPM5lM6&hIYx<6`B_)8y%j;y9ZP{WndOsY<0*ac&=Y zkl=JBMC$OgY1Wibm#FiV=kl0=2j#|Mhncuuqk#NsU)= zN(?+ma{3S=b?x0AovAW0=MT^2^9LSSPM4|pyEN=+A9@hYITtIRzr@Mm9AL3@pw-a- zM^`dFmrof`F`MSO;IH2h-87`~gtH`89^idk$`|6VpC*69i7}3|#L%B|ibqw-w~CW$ zKqcOZ5pQXqHiLa{>0tTom8YcMK>V+z$=`N*6vx?P=)Y}>M@{NY73aPIl|-jUAyQ}G zMQcv+h&excE}uQ1VlmC5;(x6nx@AZuinAwHK3h=!?!86?VC>I0UQUlg#zN+phWl(0 zajoWchx9dLUQ8Ra){YrdchSP=t?0Vma=v0=-qo@HRW!thpyh)Sl&u^z_i=RQ&^KJ5 zpK#ix-`3_6)O_|;3nziuJoB#k>B_+j;Ixpw;hn7$PDk|HwEcpbEnekn-wVpj++&F0 zJd`xEr_{fc`}M}GM2t?^P@7U(1H>MA-y-Dj_?Gc75`6m#!^uH{7TkltQc zXE6}+=HXIu&S-i5-g9Hc=px{pJ{L0sc&_=hWOHL-3ot$eM=kDrV z-C;MM+4$IQMpo~tlYmNke>zxQ*S|aLmxjW+?YqN%X(+El?GF2;p`=cIci1ls5ix0s zJYnYZ$HL4{_M6rB^_wxAH42edHVU~QiJx?o#Cz5?qigD$_dlu@bq%i;jkLw|PuOCp zpQR~&x^&y}*=9g!|AT7OGaKgqP<2V8pZfI@kv3Z(EbWYuLBHAVFu!MMw{1m{)%)w3 zp^_ngc#!Q}%x&AxLvoa%Kvr6bgHG392#( zUZi2vw?h)G26w4b^P!@s}&gdJYTmw7U6PutC)dZp6$JoLdK{=<5w|EmXy^4#i@ zUVrTze+BRVK}FCME}Q7z$5<3DgFj6{%5D4GdwK|eXFY~?8)?3 z{<>7tjAEkGJAG6AExoF6(7(U_AG1Sse3=)MMA~i^)en`vn$QPF_^;`m{`cVjra=nh zc|4h@(xQOpohyA$LRAj()99W4_u&7gLCWKKyqNZ-MKP*As`R}GRXNOmR`2w`2mdz> zQWF2%lZh!UYMbiiO5d|kl|%e|dZ+(A_`hk8iC4)VZSz7RpwtnWZUMiY?f<_wVOZ4&Nj5`kzCw^L=})$sv9 zZAu3I^CUq&l3*Z7@H~kCnq+}XAnxc35O-q(hPi{8SS9=3)WU@X=j{gAh*53wa}hZp{O7hb4c z2rf)Yyz84(m{iu7R@wNy<3XT?RGXq*xwxZuTLKYxi$DNR}8aVQ}rnR~dG^w8C@Xop$I*Ke(vtLdK~{_<{n zGQ;d^VzOsYLz`WU-8t3H2T}(*lG=v0exL@N*H|7`#bhLPS+%7oj?*Z6lC16;=X%7& zIUr2pfQJjaGd-Q1l)pBkmi4jQ37lPZ7uQxgICytv2iSE-vAf$lrNzb_;yh9B?)q9+ zR+&`xAzPJW*H-6NliB@ioSW$UhK9!Cj-<+)V*^#wD;uwsr-XZJ?9dqAT*&^Q7%9!_ z;tWF%XXWH)gsBXpP?$gU+wQ9d4`(9+Z0$-Gj8A9kmpFolmr6ynZHBHJzw5X`q7Hpa z^f=dg>e#J%6>n5>4wN`Di=B_&-Mm)a$NNx4XBj6e@Wdk`bC;^=*KTTKBXP7c?_%I zvhnSRNv{?@JpQ^=uVB5_rXdxls2eZ$=yss+lRNfT!^K#+O&)k;#dW6=@sr>c%i{gv&zPY2% zXA9d$icWujIqvF`Sc&{|s+#XEr%gTCc=Y<#tO@y3#(KplsPA%?ysBPiSqpzsY1G^NZfYl?CHdj*V9T$%i$h zHEiXtOXpb5SSj?(%yWvk>8rEr z4;XGzdevBTSrJ^x`6Yo68m$~xLbk%_a^T)gvKb2g&_QuZkUsKad=+D?T zkArqxGs|91yUH-FXcJXcT5ebGr8+J-%ewCU0_A5O4_QLrh)g<$xD;;s(*C!azEN^ccHcR0T$;?N(v?VpejKA-_dfY7UPqm-- zy>9vNG~r&|Nt=B~ll2cQxmA7IJ=8vJedQ9SdEQgqOh_Zsh|r(E8lJ=WX8vu@9pV>0U=opRcn)`u+j?K^x(5&NHo3!t-wmu>U=bm~ZK zO{Y%~=jr?8)t`;FMO^3_VRI+AXwwMkU)OH-Pm7h=ukGUN)6tN>SM}*o$u}0yZp0=m zb(WjHqiTz4%WXqe8HbhK(A`y>;@OmXp6S5}WO{nEX9k9Nwr0{8-QDAu-IX*CPDiPA zmt!{g@}oYDT{(`%?&wT$YwFDA)Y7FiI5ba=XSY;J=lKTD_ChI6bEc|>d+P^@?(ZKP zG&uSC8tj$_G`Gf&g`TX>NiiN>nQflz&x%rJ9Ut2?+}aBCrMfG}alWUW_hf&d$8>+o z5OQy;QanfV=x9!Jq`7wnW@|7~?L6B}%RhE%bT^j9qzI>QSWHIeXGINnH$N#xN0YIJ zyHht9xSr;DrMx~Vh7<6h^J|n;cMG$dqbrs3IHW#`F?p_Ml`WivWi4~kQ| zDm$eZtSSx9c4to2hpvLc5O&o#sqTjM4;=mcaZSEWv)$Y33pLz0AKN^;YE-4lJMxt} z^F2E%Dt%)Z*O;$DILu}h?_G^x@!ZVDmpEgz)1+4S@IWgl1{vN$m`kMIyqhqu&6-;T3PPE(E0 z8Bet^mUnjdw@j%N)&mVr^LZwxBZR?D)%RqvtI|_DR0C@RBU3>VZQkF>_6%pbbt-zY zYElD>gxHmq9-ZEtQ7Ijbwd0JtK0Nbi+SQ(VzN4khv%4`cg;SSg=h8eKV$>~r6hGVscLjj^z6)6RP>QU9Ye0Y|5g*dobjqLpDtddswUa} zdE9b$*8BXfXMy>4W2+QH&UtnYyP}bt?(A{C>LU|;tuN)a&FvfK^RR2n-Jj-n4T)6r zY;t>aCFGi;Ti)G}@=8{%bbS}SsnOnjd0l(3hNnwlRmYC8ib-v4-)r>D%2Qr7cGy3x z+xGlJMoj>tt0l5Io+ElF$nJaL4Yws-F5f(BOLdK%og4#b-Qzq=@{dV+B zF6}Ma=hKtDJ%Y})e5*~6yqhHE5wxNGTkV*Tm`=|P`D3K+HfW?Jg_tj?NR2UebL%eE za9hGmt?+2;-g_>;Lo&sUGwD&M?akU{lI85ZttpvZ)?X@IsvdMSMsipkF;g9$d^r3f zJ#8w7C6d+ccx67Ty>_+K{02sOTgu17W$Cn-&Pq<<^bL+4T`gJTXj!zwolLtW?H`j) zXhbs`QkIn|F7KvxWi)*M034*HEv55AC#Sv6n|9N)tJYY96Y=!}*zNJ9DZZXg*F(HH zA5xozSdFPE-EAo;S3KL&QaD{%A!c3aX}*z_z8@;mGQOudHCE(*PutsAainASW2Z*v zj@^k)jr%$(>e;^fwE46rie^jYX>Y_7B?A>F`-&NdoV0JO_>ym|V7A@;)R#2hsO*h# zP6u12?iW+MyL?qyMOuMHbqm|K5d06ggLlE&Rt>2F#kJkF=`qWFq`Ggn1qN5upI}v_ z9?6n+d3Px6Sz}U>KNE|=Kg~c=@%p0gdVZ#y7OPW{1Vp*Z{Xk!F12ucH$^Qb<)KE_lP4jM zY&;K!IJh4S@o;8->}=an|4C~3xhpCucU70WCB*!?XKzA`<+P67tR>~`K?Ora*KUX! zadZ0YsH$w0HAW&&+{M*AyOwCUJ8$D;B{oiu8c_xQzY${KKZ+stK=$^2@Sk%o@IU5z z_O=w;NvOpvS1g0`0a4IxKeL-&*m*vN#!)TpjO2KH`tZ`3z52<*``xq3r+n~j|M=!Z zhJMOreNS~8&zT{P?lVJ-X{$KDb~o=+f2MI)`uSol>)#45+?ly!RpP1Aj{FJI4`Zai zFP>;EQ@AlY)NEDUDTgs-)65F>S&65*yR2S`cI8i#w4U;I!QGkd@sGz@G^TwSIzMUt z`}>Te8LXjiML$dnTl}ZB_S*}0XPTzggKt~37^ilRshoCu@n6=KZ*%U3ny&KP*5Eki z{NmBpQwqnsnY?-75#mtaW|hp0Z1E^0-2i;s#|=2~AXFW>%}bhj<(+RMU?cS5(XN;u^*CUaWJ;=|TXJ2Yxar?G0mguiV~jXia6 z%(KV>+wD)A?us~>(VjN-UWl{%kXj$NF=^9YFWzGPM`6yL&>gEDoGNVbV?>8~0ug*R zkI#xY6(1R*SS#YRjrP=K*7jBLr<}&TnwGbCul2*^JBmA(U5p9cy6VxX{bO3DU0xh- zUH$gkV~@NCi<^PS*3>;?Qm4IGJUqnc!NDOKoV8Z!8{P*trj2p?-Er+x-QTpd&&<(2 zz4v9k-xKwb=Jw$$biy_Fhp#jVUuEX}8NB{zPQ%z?&NGHBn)NLHujtyMmJqSw-opwH zzF+cIY378P3xA&>`}@oX`ro_3XElQva}8!L&YPi-H#25w)AT&g-`fiB1qdygF?)jU z`m)F8+`)ULJ}o)7J>7+>HEYhA33FC2`qa9voCZFx9Tl!67rtg%`06E}E?Ic2Vqv%Z zzGCEFt>ad=ObhSDv`D_a+9EYp`tF`(qO*RUFkATdSyS!RuRJ{0qI+(lw$B#rv&!1O zhhNUi?mE@%EsBmiq;bW{r5DBr3t#-n=i=~n7e_ym(Dr%rN&A?;w%1?UC*rlen}vR# z$s28#DV-@ccAS6eu$l|O<9#knS$ARLs|%&aPQD}#r0qF_I&0kC6>H`MO-@Yca9`KB zV)N4RlZZq7=8FvRtAhnt&74Z0oMCb8O$7VUtSht9^oWu2qVtMGyxMJFL zzF6&&)`VBHZNF>N_u~8O0Pf*8dxXKPNd~jWI3!bBEU=cF3Bo_cPA|W1}-0tWU4KTygQ{OM>ZYZ{FM6fN&{j zw}lhWE2quYyGYnjc#mF|v-a_9qS3*rfv*VKo?Uhk)wZ@{j{=~!AAh{~)hS#ZQJVy! z?V9t-s|gz#BP(eIRy2z^1ehkWq1u~?L%`KLh07vCOhks@?F@fnN5IY;NuOQTsO^aC zj5=v&tWNWH#-=+yM)sQJX=!9;qNJG_U+WlCqt9QD!GpVdXq%VjP6S_>YtGT!J!hrC zoK*+lJ&3V^?Q`?Dr5A=wy|~k)=C3;xXdICVb(J#xRjRXqRHR1 z6p^KfAxrs>3}JbUxC)V_xkL5iR}fcWG6Pu!7Oe5LM;zFm?hF>6FOrQc-h#Avu2@Zv z$|4TzNN1Qi-4wf4<3(_1@C-5P&PvJS3GQ6$W#RH6*o^4Tx4ohzW zd%lkcT`NUDj46}b;9vbfCtU0r+vqnBMXi*nVazcHKbFqy_H2FL^aIPpvZqG=#EXRV zr`M>vd1?McLXNmB_wJEqfrYiQfkZf=KA;4KLpfR`bRhlsqbPtjINpVy z5EO#v-=Y_vV*t{*^wlYXh;)+jP^80EpAHEi&a?flg8;+`6d-aP`;vzb4V>~ zUh;T_yMzR?Ps!h<#V&U1RE1Q{NI; zZS`LxL5hb;R~v$ncnCkC>qsR=&}rpLV;X`_5mFA~Uo{~$hj@sx#ip)fA1%Z+G&?z` zDhRKq;U}Vz)X=JXL|~cMhs11R$YhHw9?Nr)YthRZq7Ewl^-yfTI38pj=MY`cGcl0s_D81uOM2Vhm<2JlN(*dPD>E0yQ1Wcb!IXS1iylxh|!fBD>Vyx zlm#m(!(_4BBF0LrE~3eJ@|1=l8W3-MBaEz#P|Xzg}Vv)MS> zcphz9R5%m>DFir?3|O;+H#5wDUo%B28@#^vyN$GJH~u!(JJYIMLz|LwI*7aY&7uX_ zMs5iATGE5fzPvah&UhCnq>-igbx)Y1P{kIR)duo&4dnLa*@iiKS8SO-$w1c7Kw+`L zydwr0xk-mENaoErYp_7kzKPoEm3qD@iatYP$t0bN6W9Cr>jWRBTOJhMvijBqom;=} zzje{%mYZl0q(-B%a5xS4{;vb4H ziP)kYv1MJtU)s@stz&EX(ywpTIialc?8(badQqT)Mpn#$~0r^C1Egl~BrUJ4g-RL5(J&ZRBu&;F%z^)LPShr&xD zm9=k7eB=A>iI4lerjK1;s4uT>@G_W_W-u$lfLca1c{hCS7P)YP+uvijBv$ z7MyUuL|j#a-SJ!72{SYf>DK!q?c%AHvuaxSrcs}d*qLQzjdG2BE_o+bm$$+;x_5>AYM*_2jo6f;1l9Nt z+=Ag2@6z?+Z?V!%$uqZv_Q-7xow)9vzxFNvbq}~#jJoA7cPn7ptxHRw!Hd4wVhIgi z?2)sm`kpV(f?O8dT!cExi!J|`hM^Kx<0tthTu4clv>K`xX*K2syww~LO}`r4Y)M^q zd0jBUeVeeDUaZx@hIp#WHXMl~L95Rt$3DCxaRIuGKgEp>9 zUz`6qH~tl}JMaqJ&}+tyzy702~C&jAQ`FF#Je)QxB7aky0J5-&xs~AQxy) za8xsClPj+-0}Hj-UC*811G>fiI0wn-t81;LkqM?e-KtJjT!JXBxDw}hC`M2m+@Azd z(*A&(V3GCHTfHj|Z?pUon)cT3#beO?N<#c;5lz;hRL>lfCo`hyt;)Ea79~rARrGJ_ z-PDx*eYfmI16jYX255e%pwtEB!2Duo+eC42c;hG0v^Tx~+bfKHYAKB0K7Q#`1^qSa z1>OEk0Dk*58GgCn_r?pny(Z!Ip-Z>P=ug(cZ+}2EnWH*Vm$+npBH^tACXydohd5!N zb4!C~>wnh92kNb+(P!~>oO9$GwMymzgUiUZN?Q1Dn>Y^3J zC!JJg_Gg1EpK>Wm^99U3tm#6rN;9wN{bnIL3%5Q;*+A4aC{!)X#2+L&QwF~MWTBm! zT;u*PxqZM2eD>?#7f*0X9Nxcj!0d(b*~bmPrf|$+{R~0M`A^;c2qp09+;6*upKKjU zh~(=ZAt0<_9K}T&17Qi7!-}>IRSbCQJNE*P1CspLBgp0#%K8}?vN0`PdUW91`woj8 zt|{R5rCJRfnV&bKbMmDx7|Rucz;LRN;)`d#2m6~-^OD?7jrAj2L>03BJjwNf1FG43 zEi|75jaQ^<;a+e+RKcSrR!$RH&O_m-S$v>&)v$55;ghYC`qvg%jvQe*lN628d<`!O z(iZRbn701O+b=m938w$*cKcq#{sRRmTpPOGms`GV5X%j@a~cUOFhDw<>N`Nbxrl`r zEI@vKDShaZpW5$&6jeGKH>>)_SFP=PUHe-|@`m{KBhTR#C%M&1gF}<9Lt?sg=|{hM zfxEGaFi2?QtDN=$!fFm7tXjG)QU>jl1mn<)Z@1PholWqknB{Cbg#Y3qbFtObmOr_2 z)$98!&5pgH{jCOA?%1bD9&)?CarrhG!ayXS1y;C`XNA$j9)6YgHx{WZ&_pm!TZ-d? zONi$J0C(LRH}%}_`{SQXQxG)B0u$WSrz*s($%x7w#18IveNrMxxIIwTj%VV+c)6Ju zrO%;)#m`UY<@m>{iWU}dQZd9F58QTs`nf*k&T(@pCYS!CWMPbhF7EEVb1Diwq9mI3 z3x*!N+hfS4*X?06X^7oJjwZZ)hh-nw_x+(yOo;mkieTXzbNjNFd@61)R!#d$o?KQT z=&slPFRoRV&NTp&KJdJRYnroE?RHy09V|Ch7r38@s{tKk6J4OU zDf3}&Eyc`XO@`QwN?!rK+1yRxxjvSLyuPPtcI*}$j}W-(ws0*YXf|Q~dd=N2BEh7+ ze|OT0P^ZBW-0p1@xc8w1+_aIgRfZ<-Pbg22Erf;rlxcWfH~OsNsTX3aW+UdCGOtLI zPy+GUBJeGrEwVYUn3yhBiV6nqaV6V*;#%D9OF#P7H>S0|MC;VP$J#1`k0tM~IQg}h z2wF%&%f-<$ZqFrLWnlJf%Lr1T>Cy!$gI7nFm%JDvp7JhG1rU5=cLIX%Jw8d2bGkTE z^0>?mbWTQm$3c%HlyJRB0mYg&9pjZ?vDO-q33#PpGi(XG5>l!HrxaR|&SlD=H^=M& zOqm2lg20sZ#*#~JVy*?v(p>_wWR&V40!!A*1acN)3>n7l)CK{D3=B!&{YcfR!q}tY zvi!P;cCPD}lqD4VaNK5k7cTK@F%}aRE}bPG0gE{#N0P{59`^7QjbBTs&>?%Y(hw&I zW8^S`&@fjJ)~UFTFZOjz4iR^F@$AIGZ#%^aA&9hW63P=_Iz?#Q zit3;*8R z*Bl8;qse|-I}GKvTSBWoKFcA55&^fDczV#na_O{b=TEJ{caNM5I)@$Qf?$kN zIrZX3XrrZIuE2}{Y8983h@5ZL?Em(FvGKyGh}P#flD}Ch_HTOt%KpQ*pFo(s@KTeZ z=L1#DNLBX3aA|qJS821R8Y^Hz=Yr-2ynL>2ftYo-3?~^Ixj-T z=aWKrPUAI?QQ8f|MoR(37*JIYYm+$keSDnUwL7P!1-MT&d&r7${OF_}Rq^V!(|w|M z(yQ4G5=b$IK@naJgFz9?rBkQr3$msP%3zr%q(l;U`@C9E?AH$i_0cb)hvr}rFsW>* z-&M8mdm$r6z!$yo?pnMQf!x{40g6f9?J>AB!0qh-kT+hiR+Fn*jLkpv>6N(iqP0IB z_y*WH%Yzht;5$O80(H8L;ZjopbvKEWnUrmm7AKfy5aqHM*n)){Z8VqC#|zZwOoBeg zXH)--6BbxE5BByv`UX-;Q-!i$Jd5j>zJb<2`ADFY4t}!{Upie#;Oqx^dz7)V5ngI4 zfDj`yR@nhh<9?73TXHlbYl73g;b!v3`p*Y#LKJQphNT<%V`A&yr%e!;59W@?vKf|c z2E2XRkgY>;nEdbGp6bF``=&S4KggXEb|mwQ)55W4XHN9DBs@-LXe?&j4H-~Xu2($xja~4T!|IK<4UneNS&AdV6cU>>jyu^U1Dhy#9T` zU_4*o?SYqh#w_^*986PNH8BkDnB+`Vcl}Uc=9C~NFqJ71Fua&qy_d1;OhF|Q@Aepm z|9|TCutZ2P-ntp|f#~x5roo|B_nM33-3K3WAhWrLUJjDxWv~AEpcc z;py9)$EOe3I{|xuK?i=8`{ihUVCU_M^p3P4y3JoHSMY`wk|8#XT|qboEffL0Xk(9> zRrgD#nTS*7Zsfx<#)NiArunbvhfIT&&+&VhVYr0y3m^AnNd4$mdkLa`azqG>mlwu( zDGFq~%w%xJOA%wdTtfSC4cNv+Y1ZV|l$|agFvd%Sz<81LVCEQ^qwvCX|&EU@#LTdJ6J;6_bP9* z9!Hg$y)=XkmLov7WX=3#;by>SE{AV32{$a6un!)NZz_qXa7xG@vR(cdIC~dcKf@Td zNKOm~{f%nQh zpYnR&cpcL)8_J87GCE0H#A6(m9Q8f;E$x@~-Qu5a!#26&pvm)aprnB!utvQ+d4)VV zTc7(wrU-??$v-Knq5PwhAM?Hi%zp7$#xw!5PZ@TUt4rQ=0Njfjj4scfh#8D72bhfw zC13@v%emhQCbaJt7Nkp1=kawJ@DzZ_sJQ|SK^QlLtwU)F$6^9j2r`7Z1Va#ZOBl{D z87jyS{zH?u81`_7{4v$_?=vU#?^kRIO7pzcR)MEK7Hkmu_1^GuDAAu^S*`aU^K`;b z|9g3_i1W{CrY5+$!E?tb5CxU)iE*P~Xs)s(&)qWSWhI9BDf@U+{T(tYF-QOCNHnkqANC8>Ke0MxoDlt;&(G&&dnE<;r z>v5?aVRzOPFAPOeA04!?V5#qAoZb@vU>hdCb`+V5Z#t6utkyR>QgUJ@M(mI~XRI#q zG%ct7fTf$Nvb`bfxnBty=pU~qnn$8mG2pQ``a9hE#jO4?MQqi_q|nB)oc<%mzF`ZL z@k~7WY{RJ+j;m((I~x!&a`1?;P?<4(8gtCq?bzc67eIsf*Su9PT=qy2#KS`MUOa^^CQ|~uHlm9papZqWF2gKb}#|qNC{4t*9 zZ75QJ-SnROEp-sV+GFcb4f$h&rn8MZv1BLR*GHmVuGv<91QZqj_ZfWJm~L68ljwLVuIjJ5rp8oK6lpDEieHLvTwoMwsv zG&*bzQ5AuPjTyHEoz<{#>4t$&7z;Yg@lTxBj_vgScN-StsnaNX-Y-QSqhKkWvQPd(`4Q;7NWv6d%CW8`*H=}+(3gqQhxeXM%^rbOXYv(aK(l&XcH z*Ky8|eSF~(+HEy)^!nG_*DAXVPvV3DfbX`?dAgdZuhQ6>Vr|&SbWilr@>KcIFDJpC zdX!K*May+3ak43YoHpZQo5xyqo~kP?{n3Gr=g43c)J%QVg9^$}i2Bo6qEIo_@;pig z=;cWAnT)#$>7H$z;^FnVd}wMAC{sFI%>cnsiNf~bSTy!tTJ~pxct=CG27Sg_7d{I7 zGGQP6`bHgu0a00b&L3kyE=1BF2F&J^aV$hXX~*y>kR4$*q7!upwFL+YR2hHFp`g7K zj;c)QUWqSErKJ@1To20i0CF?sSq9 zq?4WCoG{-uu}RVDf{3dxrq%^*M0hGVQCKu#BpaL*Sic`)nP9CX%T%ZGEfbp*SU(;k zp<#k%anvw(rE`lWXqZI{!K4%&bcsciji`g}A9&3R?Gj8B2Ks+#Q*0|*z^)|hVU!@d z(tY4~6w2zQ(0RNVZ~4aRpQ8r3{QYpC!7aZ&2(<4HYWbjpzhICy*=zL!+GLEw8{`rYYIiWl0UDo&xl|AG*})eY3^G=6*mPHzsS2Ia)6 z>Yp#q zyX)QJ92n>*19|@2EHDf`ffV=>$brvV8V`IW9p-Q#lIJ^+17AHJ__nGu?_9Ney8-q5 zw;Kq7k4yHw4%j2=g(dQLkr|JQw3s$wb}E|?F*TJ<1Th#dZNl()Nw22sHD^*^qe+Z9 zij>6kCgMp<)IH9JQLKe-O_7$st+9h@L-${Jfc?*eY9l4FdU6uu85smv_ux(fwV_E2 zJcNQKFGk_XC@-29;b#x(woM z!gLvev+1XFuLUGQ#=R?Cv9I}++vOu00`eU*WDzm(3|WF0INA~o*o^yVWpkN5>wsD% zg0pt1d7&Wqx&0^{Xu!2F6(Z3+l8+?s(FPo7z)964Rr;eqqjDkvXhhODvjM4FS!B!= zYpb!J-&)|<`6bEy5>d?bockn#m;wNjopL-kE&Ve+jltSQW5>o2{ghoc9HH0~0V*8A z<8Lr{7A4hMFs@S$(Hgj`K&_?Pvvv)rH7Y@CJ|0C{8a835)_@nImJN)F56@I`$I+|3 z^+;ONBWevUAB|GG>bqhG7o{}rT$K_SrC_)LF35*x)>YmKO{oHdbbbuyA`r9ZMX76@ zhtaYiEmE&JU!c}{lnq=E?h&T!jGD;G z=6ri3B`BoZlT!jON?|ckjU9i*!vu{|dPtPw2RHXgSSG=O8;uqHNpe45G4o_UKM5zDM)w0w=X*jLP7rZM2KR zg$hoe?AePR5jilw+Q3&W8K3Z>P#NG3!(w@=#yT$|X#x3)L{;}@jdi&}3LYpg^z#T_ zm+~eY4^rrPk40FW*eH5+px#8D!r-Y`kyeUL7!3t1b&g>OV&MZFH5}+{g}Xxw*o-PV zU^7Y4JgdeE!;G51%H|Bzs%=4TA^{z~Rohl{?p9+bUhzPaFBu+kQz?7LSROxw!Cfen zLdtUXNS5QHWCmA*m{^QQsc}ku6t2O?APfRyLBl+7D}I;{$hXU=c|cB%3&~kdNfrmA zx-45NTg8u<G>Y_MM*RRhPO%MRqSj_303PoZZQvxm)#8*{ z(6yT_M2W;5APY&{P>7y3&J7jrufpiD5)wUDLZ-(gHuG_{NjgT4PZDuora|%8BofMC8EdzT|vxIqNV??(!d~+~q&| zlDmS-&5Ok3Uf)9HcHbt*L3H`&7Jiv+y|4wN@pM}dc)5~x35S<8HH92)Ag8uvD<+ri z{`iXZq*fpou*wUO1E2p+xp))ac!^g6eWP2`j5>Em5n(Xs!MIE8^5VLCv!fahI#ey+ zk(CzKxjWbWUNz#08TYCQp4i-6>lqGkns|~T=D?WP*UsH-?)N%LVx4`7)h@urK$o0^ z$Gx$Kh_rCVy|JrE>{}Z*$YSi9JFSkP=s-h)tf&Kx;P?F4%oD?k(7wdf{#G%GQ~Z>> z)th!FRq^dEWRhxccM&ED(NrA+4^Bx9zGZD`U-8@tnd|3YMF^RoC*|_QFj&-=m_j-t z79dl4az+`}FgZ*FI6ss?pb$;rF`5bFACodc(SAG=B$gPP)<;DL5bK@N zlhKn&_0BwbJQIxS-0$U{@EkEDdhGMQ49QdhHzcFZ{ZZ}-1&CP2y#j(5=zUSy<%Jv4 z)?Kvd*chX&$R3FrZ6)s!0*j*DTMB*%7V*#&wnv>`dW$KfBWMcl5f6i6(3R$%5W^s0 zP(1{L_6=S85Q7CM8mnVtcy)Q4-aAl|(%oCkX=t1f9ym@gT;gKN>jc39KAIRMf|c4B zns{D*CsuWyJQ{K5$rB=OPi6p{haK#}%wUtCYFeLZggA#nx=~-wVUvL4Q7GdYC&(!H zvCMZqZcAaVanMKE~Bq*GtVU|5g1!8nR77WDgxt$3d-T46c9xSn=16B zh-zFB@{d)0zh;J!6cI*L1T>}S$@~PqJ1V(&zg?mUYUYV1Bs1r!P4c^qsGXQ;Jw3V= zRW~Rwkz-M=`BgXA^Ehaj-uN@nbN^IAnL{In}`l;hFQu_dKF}gL3yu;Qiec5>Lz+`5xXl1$ z#;yitLISD0BM%IuLSj^kRMUz60D+((A1Or)AH7vDgiFI?Dxk0z9QBy80ta%vANshd zhcV;WLmyU6sqr1VO7PQ*-Vc574%45M6jPRiBYu7L&ymPUTy=w;q~L>y^se|l9_X?4 zefXYW6oP>F)nUmUvS()kLe^yH-yk#;!)6MknShT8cqeNR6ZFB0f|_K2== zpL=ZE)t|{_Yk67>we{)F8cyKTrkJOUj-#F0)}Lo9ZBh~CjL26sRp8N8w)z(K_X<3U z_ovt-5H;`VX`F!)9KcY};$a`0Af64dW)5QU(7Osqxf4qxRsp?T?iH6D##|24mma~} z@%4jV8L3g=CFN-I2TD5yE^Nsl&`wxo7ewUvdMZ1f7*;jx`O;fVAsrEeP%oHp21;cw zf_x`3xqb+5WS8YpW8fhGH(GCQZ2o|U5>%G0C_B*y-5fx;;bD}I z#(C5r#w_$j4Q4FtQ*00S+zb;7V%h4lRc<1qWh}f&7!5N8UA!QivN`4KE#`|Y{h29z zBnLhd%6 zReUUNj$`pt#bWSQ2+L)94iST8ODcioTF|*W$bI1(Bs$R-ydg&?Uf6(;GH5$Z_pTx- zY=|OZgRh4mTn|&sd#}kx?bJ3>zT!DDb|wYa(wepa;TUY6FCcRay9gWuTnl50IT8x> zrkIm6$Rj@Q^u$c}ZVa{1*l!-eTnEe`L9G3{?u*fwPG3Nb>HG|Wrh?vL8TVqy%0>>C zXbO=rL?8}~4s@B2w1&1UMd>vcpvT&_&wDikpe;)YK8zBy`9|+Ynr{-WFi6MR12x~o zsN@>|3(Yq%0r|$nvsM7i(dHXIFy~Q<5SZ6R#k3X}le$mDk?s?|*mEAW6<7IgzEKf< zQmeTakwp8U6AMW30Wu8-iYWSpkM#M?!`MCSdBjgHN{`BQ?+Ut{*MEau-izn#eRrO% zVV4KFDBUbSb4$?Oc@z_NxxGu=m2%>de($>vlfmasaZx&2KAONU^uC$tB<*klr+$J)@GB&O*a##B1it?hkSr=TSW!VZ@zukc;49e=8A4bB2ulIcfqe?9f!XKwSH9?lM{6; zN|F2MvaC*2{5n_Q_f)Ow3ma}dmc0Mar}xChfL{5nlR~*KijaxUqq5sufDrZ68ce7> z@fSaOXyYzRw<*)`)c~Pj@Fr7S$h{LZ=UoHMd0rE+`BlxIUu7QZwpB)IvJP>6HfrFP zY_JEb`LkQI9-m$A_g(RBQxuSaV1qn9P(8P`f7OzRFD@@Ds0SS00IFseXn_uxCJTS+ zD_MCCV6IC}a^GYT7Oz8(m&U#rTjPJbcBU`=VX%tS%}hw5fFHw}0e-KmCGP?#L%_Sl zu}5ezMLz(oZ(tzUNQe#ewZi^@N-k)Y+9g^^94KH9)r&L`)r&jOdb(3`@H$#%c#OFL zQ2|WQ22I@42ecGv)-uuR^M|z~x9qSpz49tkm$jejz8LfptUo&u{#=*YH2B>56;0fH zN<^{d0?cqOr0Knr2eBRtbl~UCR)XIy`w}q|KU+2e{?Jt5DNr(>xs`*xL&Lz|$jYx3obky==FGfmaAeuu zgQBV#HBpt#1%R~eF;FXQaK>jpiu+QJ)mE2Otn|SbRPG?FCaWFy?@Tfy`kBeax8zTyYXNaf*!54f5@=s(4bAz-!VM%aqyg{&C z>T3{qzS++pdDL<{e(x+kN_89cA?tTy1Yso$^FqP6ZSVffC9a>s*es(Zd9Eo>Fx#O-j|T*85dUDquHoxn@^2!NI|vz2K2Y(00VO^}vr1qGkua;M+E} za2y=y64CEUPrf4C_Cl@$VYaQyUU1W6%4T#BK&PRDfG_xiy!dO}o-f`DNrNmT4}v&1 zJNAml)(z+&AYh<_^h6Mt=>zh|Wz=}15d;Pdl9%dD#3P6(I~F#1ql18?jt|0*AiTL@ zxJ9jxxxoSj7sF5p4;;X`@f*W&-v$8#35qa+B#83nW?KOs!~qS?9wzF<$$8ivN5C5s zzIsNQl`PJS3E4ZgXJt}ZR-){9KtmE@LdHEGqTjWG1}EUIpwz+K6%&Kqx}cw!Bt~@C z-l&4t6^w)u5~}Dcl!UYv=#wH)?@-byhldgd%L=mj$lL}BbL2rd;Y8TW^trFGq08cr z5UMc|T76cEpXek((idBBNV>2kKZs?ei{L&L@Ee}Qs0{$7E)VwsfH`%u z#@SmTfQKdEavS&)o;dF1ZY=06u;+?B63KApFq1#A+LoJc2%}{*5>O^9K|F@RdyyN& z=k-1wwwkQjd|;w@vpX3)XZ+`u82)&ibu{jq&@dFo5M{G!E`YG5D-)Rq!xoIhZLe#X zou1~JYAuAJUVAJ7m*9aFMo69vjF4Ozm6ZgU=8)#Oc%TD8c+63X95%J6NkYFW9)(k* z4Bv=PZB)NlY@YcJ2_EwayH;Isd^f|v8Jbbavjp#zy^6 zZQUW27uF>cu?+YefrgavDENUn zpC0Dq4me)8b5;LsmNa-e195WjGep>n_ps6dCVp#a+*?aJ_SU=I2M=cu0uUV>IirJs zFZiHj^mTo>8X0tuVKSsa@~QYB@f~|h+!ooQgMjBs&_Tc#{6YS%mHZups1sIlu48Yy z+kNl^DN$YE0d3Ms_V88`p|_M-7nJSr#sWMFjBiSA19)TxaWzm$7 zTd|rS59xi70KEqphy?f_I!J&@odI_KoG@wU&k;zIJW^vC}lgn+{a4qt;(SA^aZ zfc6?3-Z&zg@&jnE>|Doz!J$27Js4uJQ_fvYHv4SNc39L!z=WJrm~Wb z1E3X>aPAYZr=9?J`C=-Ya525+GAio;`4mT#T+NH()qJrQ(-yq@VH1v$(drsxBg*LO zT!z!+AVn2+H8+=mZd*Kt`?F<0>oZ#FfiHSWz2%_P8wZA2Od_%OCI2AO2i|qe`#_MEbz}{z!4VzRSAUcu?0V&OTsY7!4I#2oTvdR z*m9I7;n@JjB=bA2kwGYZQNle0w4;?;2w=w}gPZd~cRwySASFy?EBkp|UPq)6LBH}k zlDUB|_-w6to<1CiXl)?f2NQ|Zo&(Sx{uLg8!Z!qfcNidIrssO`ufY>>{`J3UZaqut zIrxD~f;{DyNbo2Qo^-(xHgfROBer!HSAkH>s7QZaUF4(yRBX~@0u$XM1|BBF^bW-m zOY}|aBf-Oj$Y{|-F^Ib+P39@krsAV#n_L~U(?%3fe$NSF)rHh2q;sPL;TrA{GCZ3} z9@Po>CcTZj5WWd~Ch<++iyo`^YFL!g23|cls+M4USnC|_8GNelk64_lgA?RF7)*@B z;K5*&AYJKoiBCKj@8Xn$*AL3wL7iRh4yi1VyTj*$eso1S#`ua_3a}M1zMv~&kU2qn zE{_N~!I&!;m+HS6=Mm9p&j2qwub<-wUId{@X}|gR6aOr zunEh?21b2|P9~P=J&FT^P+2x`YNSDWQRM%?AOP-=@DDe@Y$8MhNEPz{I@V~G z&;;J%v>OHJD!WJky#e%*^&sKW3S9t%#fDY;B0w0p%8BWH8^?}@b=?=Bj|AA7l!<9Y@{$mI+J<=I!7cG%+plST zQgmw>czX#>OMr79BN4nZ#7_K1iST<;;+`{1cQK=5(Nml|u>{V9e;UaX!%idn60=9d zu*07y{1gkmj{JAl>V%XezUI)P! z>-Iz2a_$f5!6XS46o5$_VM8G?7Rz+jAQ+I<6CrsZ7>kg)tOHbcRTKon$3@WyiBe|` za4)_^8UDhtNL{ZsA ztXBC^h}WrwMWKZ)z2_FNM=&z^o96Zd5i%9N2bUDHh!GO=R5e2I*}!|30x^p8#y|m^ zalKVG^WK4rgahK-ut9pr?e+BbC&gMCwqYSecDr}G0XZDdt9dU#MO=>9pwB0YdLABt zeX{%)p!SH7N`3fr3$G}~o^I)jJnW-@9DRXh7gBlu z_#n18gwdsk+|1O^C!K=llTX3X_9v^7E@e{t(*j#^6!wwCh(0OM@MB;0r!LofqlZ0DexU@-G5G3m&7c+|maf+(S=-qV+3A zPs)3v^rV6}k)GuH(I5#|et3*G!IlQYqib|4*tLw%0%U36Ghu1`gmn5YZ`Vw+@-xFa z_vX6a2X9owu_xPX?7&P@S=+0xoqO9zF|Un`PI3t`?{J9xWBtiH5ac8}c}HK!i6;h0 z$8CLysUc#$k<%-q&b{DGUr4Cz7dZhItayKjO@clOoFEz_% z`t<5JD2l){_=<57bVQyQ1FT`lfKQB}XL@l7O~uG#Rsf$0KGR!nsvh#=4|8D$hyVT{ zeIQ2Ob6gNH-psVf{~U)t$JM!MfS{iZr3RN-Y)afzemJv$O7fj9UGZk77&6L$4GOv6 z(=0o7$0O(SD!bwd=kpjAiO1Vfr@~)~QUt%{iU6Jg9vA(8XpjLKYk9veg~TJl-MhSB zaYEGfcMbx|#lBkp$Q^0iqyd=56`tYzv(C3!;1>yYq3rJuwP*BZ@!(UqD81VAST6U; zn}3j8Lyy0`E1TgDOb~V`U{5b_jUafbfc$|USVEqP>Vu9P2=nh!1476#3w&h~s?BBajm}e$C7~c!aFt8}K-H zo-wJ^7DvQjxqu#O^?sV0j?e%QP@?rbc@Xs3CV&7aJnGvl`j?|1Hy2P@`w6+Z_p>rj zDO@50K9r+$lre1u4ZPcpkEVO4CGf~S=E@0ql)hRMJ@Wzy6z8(sh9Nz^5A)cX4AmQz z^xWTZJWRSCywIX_HU=9Na5^%VG>Og^l?bK1@*O%?oBDWBWzy$ie-D`2}I z+?aW?-5mT#W>0)TcA=YAT$b?VVyX2sj@-;D`m4CN-(7_L#tgl5`!7R-yb^LxezI(KM=9+sIK(X=6x5-&DtUqsm6FHs*T zOW^g-E$Y4O_gxw}H&R(nPshy4$i)A+!4{KCDiJ$sHtOg!G&HjnSBPA7+;1LcxJhQ- zq`8}!0p{QHwoRhN%P}ks{pUp~%cw=}v-;Iv57L4UC#H+po>wf9tb8puMrVW7mdpN6^6tdTjEMLnUd~o0DKFID zKTCb_u$)#I|4XNTzZG+8ShWqjo)*9C^(Dh;{#Ww;P?mL$*k-k9l+GqA!xDdoh*h$( zV1gsB*K;RG8zYoc46kQcx(b-zl7_!VuUK_sqmi5rcw@rY>q^QDOG~%h92sLHtBv+L zH}b+iT{4eYEi1D+!q94S$)&Lo;fKp_O+9L~I`qyKfAGE^@f8+^Zn?MHfnx67$-Dl^ ze@(=?SMxG;d<{09)``ly89z@#hr6}Wr}3?Y*Eg{q z3$ITTi#{!2Ypbqa9%5-Y5!)E!)FFql>lIBV4YV<4yp35i%&ET4E2cz*mLMi@XILH- zO(}oAq0aqgxc+@qz>0xZGaO$Hy#A@N!m)u?BaE*GyFSKb=s>HPfSZ~8F>pOCVYtA> z05hAr5%U9RX4~NPjQzp`nc4d5d^3xK*Si%=Aex!SKwzcwli8+N(s{Kz;t#(qP$g4@Jl2e$5l z+wHf1+`5&IKFGS=e$%i~ZvgXd5Sr1vQWgdiOo@}2AeLAOiY1t@@>Ti!7dCP+?x+3@B(aM-vrHu)erLxR=}(VeWuHu5cbE7rvD!H`Qi{$j+Z_MwC8v zh#e+>>}o;DKJC=u89PV3*?#_2Mzu&Vb9wv0slPA!AV`7ri{>0SzAtvD`Q7wS`Vk19Clq!Lkv|^2b9&KOhof_2<4lr9zY5(s_0G}Y z+J(+j-SwJFg*4``x-Ii=TkMcG$Ik8)4HBY1n;c7-{LCnJjE#``(+NeL`Xe{DqlqT{B%vM@S78vJ4Loqe0R<(8ku-PVyAH3owxF<2xeio zIe8`gyCisrkKUBy?{MiByBzpeDOh*cZ=L4rPNiVFGWaumBv=jAk-K};kj!o#3IDbT zT*~}mCb#$&ZZ|J^CHxy`DMo~)=-B1Jzk!x=313QL-t>6zXE4B0EFT6D)H)qB9MXY^9*6lsWByjmB;ocTXpzRh*i!)6=pHoKp^ z$@*!4Fh%lh_mf7fp9bec|AR%gzu0Uy&;7U&Yxn>vLzBS|h`1-*{LKgC(-A8-PvYj& zERip^xAk+jgj~P%nvnDRNWm-S@kBrhwvEuw(FwVJ>3>D|DCuw3m`{dNVW|#t^cEqIZluY;7I&3 z*Id{6Y!6M<9W5xxg`n1pxhNi|q;o5^x$^Ey8 zfTYFFp8c(@G)2>5QctaQRqU_QZM4uhhNi_pYvSb)NTvJ-L_p#Awsad4q^gyIXGSU< ze?$c2Q)DqeFiNi!eEkw*uvz=RNCc^ynb(goP`IOEXzdX}`-)OKuI$`D;g z0E&V+NT@tGk#!jl*`aZlJlNNFyeMPPPL=o1J#DM+-1mn&h0mqgM9?$vMP18&uF zUV&idEobCyK3`M3BE zqT5at3B~rPt$d`*3HUb<-W|h@@{nDAaIE|~{2QnO97ZS_ud77bIrubY;A3Ga(|~>-2od!0U2(A>tGNRc+LO*HtI8*ZJ`7%`Qpv z^@&Z(_0oyW>D=Xo;^`c4PUvQ$1$b2#v9LPeb@@%`X4Cm*f4}S|dDO<}@~U?Z=y`L^ zobGu&zI%OQkO1t=V>S@HF1w5X0{2&2Jg%+=NCbdDXRqs{_1D{uiH%>n;LX9bix=>qH}B?Zco!sa-n*Lab$&42GD~uEo_9TY^X;T8 zeeVW%bnXS*%)8vZAyJZrzJ~*`zWzRVf#g(!>VP>zS7o}6J;+ddERw6^U=Pq|oulVcjjzvBXvZ6;H zWSj6NSm2Nc4?rjTF>WffI2V|c6}-TB@(FXOl3Gk#!+F+g7hzT%Js2M9Ld<$89-A)C zdb;+=5WlyVp9;Phxjv}EH{<@c@I2-`0egdfk<|oiZm>TFA@uZg8`&}Z#wvrMBc`4& zNuKGp9E>BL2bGK|rXZ%ICrXJD^AHRL&1Dqkq#+cM(O9Lh=Lf}$WuHp4HkFTn-okGr zy|eXC2Z9o{MT)*0A1F#|VBE`cQ=n=67&^FKuan}=4m|d~VJn^9c6#3*YJl>g8C9K6 zRMF$lyErTMLFDAYE2!wT#tH=xNh;G2ON(XH`}m8$3BylrFq?K zoU0yfoW~3Y4k(ZS9WK_sthbRM`;FUTZ1^#^TyG7O2}yYIU$1;yV*cz>u;g{U5Ce*X zuSjZ-_Bs+2J>5^1J2cXPz!@WG4~=;rl-=P(DTmjoZ$*h;S;0aYllDt~iC`&Fn!g_j z`$R(=d%gtTlv+1M?TxdBFe?jWS=g?IgFr~TrZV)N1eS*PWoi}I0||R;<4OnnPts;M zOrIX@pe-52Z1n@o8kVq}I5{h}#IiG2AYYj+MN*1oScXO1XN{c6s$Lv_xq--Zu9V@9 zRl~~pK3fs4N6z8RC$xlMX_5Pm9o(1B$|>xamjZUW;sC%C)2Gs!9bw~pnhO*8tl>%F zjlqwNRSwL^uR_{#e5C^YY)6oTVyTm-pQJ$P|1js62w!3aIl3g&pN{H&*~*e1 zGOKitwn4!Nt9(EGbSPlPQ=>L-PmiZvuDeRJSYrVgNacna5d#gSwOo0C}bAWG@__CF6bvgb@DbCU(4_0J0O5F7(IEb%`}MV>c3VL|To50sMNAvFml z%py}TlCR@5*yWU;QeW!JF2SVKOKkw8IzuWKGKzQWD@ewxNv_?iKG;a}_eiZRCOb0N z!_E7kXljC3#bU12OfTAYH$AAo`l>o^XPh@<3Qil3szX% z!Y^*x9LfDH`Tk9~+H8av1|^9}sJ)zm>SBcAAK~%KD|p)9*6D1Oddu)|Z4CQ(BRTel zY4lyOA>tUo#ZCHX;V)EDbJk2e*t>Gg6%`yBsnS>ja?6|RzNMR;wvef{&zQ8jcg~5V z4dtU;E2)F?fPPWQe<GyCOH^mU zosj<3t&=BAT>^^Ci_gUk_z-Gm<^1i5YaFXO9BsCU)lbnbl#gD2*9K_Kf+V2&KUn1ADv6>IebnSIimlq;i(-^^up zM$txi+4pM(q8xsBtl^A8sd~h6`A7!;RHAs!i!qjXj071I_UKLqQOeRdLCT1nTyrJ# zK4LhP!`yoHbw21R%-jhl{GnPM?+GG`>j0vQS^W3NE2EeRh!54|;t_Lb=yQk@AL0)S zi@%CptvU1{Ghlf2o`Ls9w!0!ax~lPJ=+I0LURFboR+_^IIdqL1+O-fjdP}f@1fU_l zgF?c%L$fs5!lh0#H`)yS>!|63)db6fR!e6p2nggKqh{~mYH4EseUL`A=WG^v&^(3K zfq}HU=AMyC!XKXdNYo9@n&;RJ2^@7$qG*O0EhjQ; zPufp%Z%o2OzabCdMwz`$Mhz(Z&_y8_vI2d)TTtYvMrBHRARJ8k@hU*uJnHOYPRW+ZH1!>^`(sYmgB9{SNPa>NlJF(SZ3*0DRzk6I?4IXsiM{ z0IIvZFw5JrqMQ}<#(PM8NjXsg5iBRnnWElucKHdPSK`7i@ z3?sBmJn>9+2weY^>S+uj=`A+i&@&||+#H-CuV)vAIu3#a`K1<=Ei15y6XTz@zsiyp zmMbcnaTf3ME-mBNs&m#VNQpL8Ag){`RxFc;Kp?a=-mf01em1e%ks^X$-)9IyUkPsw$k=t9@MEMe`{@BoOwzKTt-(4mTGXs{?Bh|_Zm=YDUZ^a7D9QRT zbzEVLjJ@w5R@cQb6@BBd`h9<& zl7Qj@%FRQc9vmqKq+vEx^-$w7CcXP6Yc-X@YJd#&*j`Jmv7X$g&n}`nT%XDjr>9B~ z$8kQtqJKEzsxfA^k>wd$&)-iubfL@ylVdTIpHPB0t);dZwE^4S>F@Zu8X}16O;}vz zw=Rtk;`<&sTdW3^1p4LtxB&xD>*;UH`*h)k!oQ$hc9=Q$%IZ0#v}PkWX&0y#WP5*O z`+8N=$}TlyESr290+muH5v)E7#Lsl~Go+-udg~_=K}ADiE@-l=VnD^MQ&M%MHYQTi zW?E|1J!M+@=3FY;#Nnfn{eV%`R>g$rD=Sqkv=C2Q(hAE{7r5*~9;l~XF>Yc!V_p5hwD&65n3cUQZ=h*PMM;Rb<}j7~_&}nj_@Q?Xu+Cno%6sY} z`+_ds{n)%H+iH%+YIVhogvmCSuF6_t^xaE|obIRTuk_Jl0=Q7ewT2(<4EAAZU!w5x zown9ze%5#7@3DXD`c^QXDHTU>GH%6wlUgrIV%O-fay;m;0&?){n0w|}Ig)|3<34=N zbr+=c^Zll&Fpa~RT=W_0-Dpj!csD0wiZ`m*3I$G0A!n%lJ{O&)@a9388r_GJ2>wXo z=5LQG`|S@nk={19%M4BONiC{fIeG@f@|!GP#**`fFSJ1v1Gr`c2=mXc(+4FVew~rN z7Pj#-Q8~YMuFzqbZiSu0_lVH4d#sLyJmQru5i!#pV_{BYH1cH&$Dz8EJ=rW=fLNZ| zdb~Vz-)l&NZTC!q`n=qKb+X#swkyYM#Zm&uySudTnSkz^(lfR8bCX3)SXsEanRPD< zX9Myh?YtQ~j&ar!>1kpC-ckx%=l-ksPlNL8G`mN*t&tHZn%P2e?yk`;he4PZT$paa zj*&gDU*}!2f(2+H(1GPKF$Bc-vkT~yVsB<>XJV}CU}tXq>~{K%)6%nB;==HpEBp$X z6Bw(CEmOPnIh(rn8P((gt%XiVPH52yGIY|tfaez$X9r6b@s(6&6tRuZ-_$7TAQ|VAlf@K`kqnFM$-c(xHECC+S|~im zmfKu9cJ`|0_{66BuMfdV*m)H9f6) z(^$6)2k|l4_T$Z&^-G+G*=H)kEf;p4o?qTKb1YsA={q0tW0TcE0ph-y1ym;xxxbvW zU99PG;cp}(soT^v5FaGU%vXpS9ZQz`{w=&vmypR>rpmkAmvM;T^q;OuaRyFkMks%5GHrpu+ zm83;CwTtHUjHak5BK5Uht_DY~ocC3#EK6 z{Y_GKzu6=6o?-IdeCS;!$}@WMJ%msA>>D*KpC1xA?9$Y6SZS6%R`W~qNGrtR0Cqu( zJQHFbP?&_4=F`3iJ5Q36< zHcRb?MK%ia(Q6{%DtTgJgk4^mPx9$N(teM7i*0i}TAKDcyKFX)=@cz<5LLE z;>kEBG6$(&P)%vD-DAYwc;5q9%OP_Kz?;iW>)d|0?^`5*+ZG>WnQTwq8XEB-l2#yy z))&iIn9O4$y;5&}Kj-FNkpfeFO&Z_3V^iqm96bgmWo(Q@_+&y)Vdn<9K-9Wo^vP2z zE5Ip6pqoEB1}(!?l?4)M_!wy;-#6TzEE(t_zWoE-DUwIC4YCv)c?9jJ!p%Bg?_VmA zol~zlC%d5n<=KI#XL7G$@{V_%LN@&r5$x6t;b(Xb79XT_seRr_A#d8=rDKURl&W#j zay!94ilmY56-~)vkB#2ide>9G>*o9cu_!Vg{*@9=1z_S{o7fZ6x$CXOn-)e?{x>cC z(}IF4C~n%K&d`_+&n4?W;~^&2wWVf#7&rNP`bmL(LL8ggRm};(L84!EV=gN7Ba~0_ zL82IL(dMAZffuRPw^CDWjvjP{2Z^>Lt=2)r>QOqWdAjd`gSp1`;U~f&I7wngK4>u6 z_WZwA50A@-{)cH$W2^jQTq_o0V@(Qv`=rA$z*0D+&W0^ zOaxn&|IlYNGIIYFg}i1;#_=#(UJc6oeaR*U!+v>A8@?A4wfhl*pH`lu1sW>KI0eo? z^pZpBw01#1AgWf~{ks@k0?GtRDmIf3)=ZZQ>($L9Yg|KFYA2kC zoK#G>3^!&3F*6DheQVHiAit&8v~#v)T&5j-JiXGLyaHH! zy&~_7P|5M8go}2$L9DRQ^&K}MjJi+G{QlX5+}Q4%Q{n|zzA46lSf!(iyyf+JT}tJf zD1~=epPr5N?KhmdNtV_g>X*AxKcyi^ld=Dj*JR2*m)ppMkeN#AO_79NmARbkh(aM& z1IP23j7NQ~`2*Rfrd9}F*W+wWc2{ilN^do)8qcK#a#}kai!+tjq_J%OwLm?X$TmFY zj;+nI`p3a5tQUZ9)H!WJ$^_j6nbe90s=LK#6E7eYq5wAD8>;|YQ19Ttyt z9}Zw0EXR&I>=G-CK2)pfH)1|`C7Cf`o2xz*!y|A4AI#DJg5#+G*BJf1;qqO~MDiNK z7=7IIt4U?gL8fp||H7x4oUDh{{$V}Ru< zQwp4~-**F^U$Nq9H2JxvE2LF0`58v_Zc-QpE5rQRn3VHOHq+5qr!e*dgKGyzv_ka!Gy+lMfPYLPir3Al;H`n!3Vz{#prxGkHUtOQvZSc++*`|^=VkA z5BurXRi3Ca0#0v3Ut2u^8H={O#)fr`Cqt(TNhsaGh#KHTpL|LB0ZS}*As{)Ll!105z1f}`c(rrQoYtl8Lsi|`fc}cfdY6g~EUw=9*h5(lb0|KHIC&`LBlAa zBO&(atHai8LMavl2g4O{xc6+9a=vG*DIBNs-jxVIlFC~TlduvQf!RQM}Xl7!tVpBJi@ zLKZhE9Y&S7bu|OS5t!@B^{ozard4fx7EpiUu2d)a>1M(lH?!0JARVOqe(N%Zba`Wj z6j4{46V-R+XG#uZfI;_iE&86io`PjWj&Z%;po6TAe(%2t6wZGsKN|B<2AUNuVAppS z&5nCg{h`Wx9aQ?GdGSr?(1xmpjBZLw<>@--7wFR}A|fI-Nq9hJ0{~k}*&FNu+?ai} zo+$ck;lh_j`47Lf9jq(^LSlXJ%hSqZ3FPebiAef(1_3Kd8}d@Vbg?p%tAx4QdG96R zq|d$EW5y)ml6oiBA&wCqjVxvIjN7J=6%plXa^!@*UQrAAMm?`F(QG9jrqS$aCw2Y- z=lwI4>Hu{l{|Q6l^5A-AQxmm76yA`K;@U)ZiM}u%hGF-$G43t~pF7ph99Hjn0+>QMFtmcF#Gr(I>+1_cl;3T*CgDw52~Y!94l2D@<_B`r^;H>)=t zMipuN>P~Xn^lrc9PF(*QQSexLl=wZCe2V2SAPWBxOMoA-M06WVD`$x`j-8*$qWxc$ z3X`2rz~D1@=qX-uD=~yW;uZ%WBC-)q&&VDI$HdsR8%Y(104xo$q<24+lh`^H8v*F$ zNe;KN+xZihuObKr8`U3M9oRrm#TE3w@%Pw4d0Q&mdNWb6`>Hcy&F0pfZevO5=UB2Y zX@T}JCjiBgAmp#gTL__E{+9CG|5bT`e@rCRRGR%5P+HSRkZR`)uP10S8sb;Biz>K? z9s#euI$!-?jwQCg97|RIE|xMm@Ns`jd7l5OeAD3fS+tVxo+^Vo$nv0B^k0@gIQcT+ zhw{VnwJp{~@1LxobpuKsDoF{3`A?jKegp}&xxV^j!bl}sku7+-6J~5M!)t# z+IAeAs3U8nOBn9XN7UIva;!EAGM}rY`)}Ui_31p`mIqo1pFSyEG9x4D#2i zpt^U4e(fq6Eu^0q3k|=535ri$vxH|@h}uHV1NC3#d_FjoxN6SMfLUH_B;e+|@}i*0 zg!0D`|Bn;WtSmoiFMm6Y&cA#MnnufvozVg1Tk>?qDe2Jp2NO6Ik^pwP?(HlSjLNlx z{X`oVd1pP-j#6Emtd=D> zyM%R%Mwf6iF;a%Ty^)8GHG-Pg%ZVbntWZ1U%1rpuxKPiAZ1)0xWIujS$cZpuexL86 z*O$`fhxX7vw3h^F-{MqOUwULi%3@`dmRslitKa)83nl%Q>3M%r{vQkIKm9(I>wn_+ zX(Io#HRP}R{p)|{_mL3D<%uA(&wy$Xs6R|^W#V9HZ0KP4U0V}nJ;fy!G!LQRnDm z^6=U_ew8WlKsW8j_A*bQ9t!ilW+Y-6+T7XFF=FxYzDJ2UF)?H%ps7ROcOc9MdZTe(rnHgr!P?h)t}&Z2Ev9Tbf_dha{@HOzIb3+r?Q&O(W7NeO;oJ2 z>_sJHjh#-m5to-5(nvH&oD`tCc)j~v@G%Q_j9KqhgTn(=*BHV4c%a_vW4C^oGD^9M z3r|NM?9X1h>g<9sRmtP48XhOiimRfGvrq;*&|de?C&&s2YZ{3*#fv|uah?Tb<~T;B zIEM{XCT*LPtM=*HmunJw3=#6+L3;?W;DjtiWhuSC`PGA;e>xP30U2=wv=N~BVZ;}p z+?<1novMk0!}lZ|GuV4prl;oC+o~TGriIa7I?>-NEF|wIBu7(W7J(&%>ZG*5r|5LD zg0tl`7J==o<>De&i#rSVgy#lkJQK|3cG-ca)GqMFd@51JerUSVXIKq=#xj_DQeefg z4+H&F{=Sr)Z8-Zy^f|HI81nO&cYXlIslZQPi9ES4>IOL(=2s={J&};pZSyye0^MHO zBvh5rOi`2#$K!rgZJt_);cRu1eE4o`2ftTSr|JBdxnD8DWmD?XeY2ra`8++vpo*7J z;?l7(2yhvW;?>DiTM>7iOEZjOW1|CspDUw_ueJI=ORNucANYzFz{@3pHoy1e zg9IkdqqWQsd}_6VEb%OnEE)P>q>wSZlYLnAA#URG!DDwbB$KaJcqytZEL>kWLNMiN z;-qKB;ZB&Im+c3?*a|}J)C}jI6%Cu&z-AyGaBkVu0*<7YXqxMd13O9JF10EFVePHR z3JA?%L{4Fl^~*v0BQ%|fJe0dgL6aPtN0$w2QFR-!yV05XTnY6!Q?l|APIYu%-UJ(K z?d$wPDy*`^FHw(o3lLdT@t> z1wl0l-jT`>e~m^ty1rYjxjf!BJ{KmeRoB=3#Wywok0$hFP{UPnbH1F46t0jF?k6^L z)qum1@~>sHCwRZcUHih8?O(GG`_J|n2D6VjO`KE=oishjK5N2KfMnmtU(c~iFKB>4 zbMwq=@}rsLA%p&i11$Ear)l-8~-ted#zXUq25-71yUE4z=2Xaq0xL|BRi?- zQ1O@D-M6x{h04vMA&pa--;&KrIP|7wGOy6B^Ruw24vX{1k^C&&pKhJVzsv0m6b+?_ z>(S~LD>ROUNeZC|_1kO+_|_Iz#gkfQN8T-3q}NF+WxP@F5MESL2xVy`oaVrv^Y}Go zw>hpcMyn4a4gKDOV82xY6mDGKlSGBUI@5;Ze4xBh(-q_F`Qzc_=aGWmj#H%=Da9HlJs*u3bI;aOSdKqmr`ne*J`vtg9>+iRqNr(Q z(DBt8jD$h2dLoM>CihBS9)mIw#!(B66;a(pq@6)C=KDYC;fQ_qMgIOFmx+k)c|bt| zpH*xwwmUtg`wa;pDH8gp`T=#W`py+xs<)dU6hJwXqDkQ|D z6mjS_u5k4_FB~gHsn*dea+hfpgF=Imf|1r}M6v@bMO;KRDT>kb(e=^N(9_W3?<4y0 zLam35NN5v~MdC;Yzr3fiu;w5zy71|mGy%PJs|QLZur0UKzw2FO?}IL(#G#W1n}L*C z*;J^}&^1j%{nxIUi?MlaPkNs3OHQ7{{JP=m@GFL@0U4A59s+{)_YT4=w-Ki{^L#`Y z3mA=E5Jang`c(Ozdj+Re)y#=q1LjPuB}Po~5f|4mTe5tsWo329;Od@q;~`PwPQzM4 z$7=-oE(G5#XC8at03L3CD0(X(orC=NONVOc`X)g5X?UHBsMfG2N{a34ksJd+mcMP0 z{U!dwr?o0W{CBS+oVUY}V0V_aR&*i}kW74GEX);DfpJ3Pt=Qw2Lj?Udh@%oF`Ww`-dN`Og60{81;1w;&E0{bpiCHOZ_A}VfO0Gjb ztTyE%$>g^(t<1kR@A#5gVCM=cv`3__q0+hW#&4A}7?W%;B-p&92g(qQ>dT-!kA?n9 z-w+MJd9ISFE3r#1r`v?e&}vsRzR3y|b}YoEM%vTlb@#w5L(2YGyNiE|JR^H;JSU=Y zb)92DKy&YLdh;jxGuU5E|JU~_yg$#ifA1y#m-mw0T;X+|pwPsD1{JJ8p=oSm zq-1CF!k*d4#?IvXWcxDuqXH<^7_cjKi4wJ2@TOY4coY_1Jr&2C>OItU--IYDWvz)K z{L9NX)aFx}A=96)Zaj!1n%)5|H@2XkR?aeNv7$3T=QUMWHyL|rIGh@6rn4-%D%DQJ%> z9(?i}yF!^BlZ=t#?d~!qT{nXsS~`A717kN%zaY@G@*2jzY8&3bLM>#^P!*N8JHYB> z$-CPOv2t!w-!*j>s6A6rh-H%W+Lg()C^L4rKD7_HP5o$H2qITtQ!X4+X_d*+yg5A*cUy%s-bshn`N5OjjaIP|!_CUs}2PK}qFO2^( zmf?#R-);3qP0wPQ1?wfrmJn_ex80Pogp%$-MTx(EGWB+v&9a4#T9jXQvT=)NWf+lr zAMEt>HP0i#=2NMy9hXRD|1tQI72`+2(taVEa`{gc(wq&-1Y^2fmGGoWUMMK6b?F`K zL(7(MnKcPNfI;}Sl6^G$nbxtf9r~TLSOCq;!%!?jkF#E5ig%+5tAZDH%d~hzTw0`4CuT_40~z`DNCVjqhC36t<`_nLEp&8AuX2G{PqmnuFPt=eSoFb0%QB5A>%Uz`f{jP z8pdMzWKH~4s{`omO?^N>$d~2`KhZ4~ob+h(ucQDDi6MRIpiX?}R#}G#SA;QxNdB1iaWiuxHUH|3k{{r4n!o z1`Rfh`cnu9Rb6N>%1F!~Qf~Vxz$tF{sT@2Yjb3npYxLyg4=J~e3E&hTS30pN(0xeO zYH&(F1mqu$?rkw1oRVl=AwmeU(S!*&WftoXDYsQ^a0=JB!{Rd{2#8c>NU(8Xq4-0} zZFv}+LeD^&$pu>X=0M)@tH1OK{~_hJ(g;pD)OGQN+Jb;!)P{$^`^D>c#r}};qgo4& z0l#(nPm(vJ9ShX=;RU~g3Jw6jzH|q8&UFj;;9Krn;N3kRa8dB) z^gB^pfghsat?J+e@NTm^La_LsXmi(l1`Y)8$GQW)llT+hU3V5Z5WL6f4p<}kC&0Uo zCvYHm-_RYfQtD5DcU?r_K=8JiJK#N;KLOq~(SQTNTT$+Skg|UQylYGW2ZFbE+yQ}q z2E1$b00)A%Oxyu4L2KHtOTbSz`hIGl04IXCA>0wq<^P0u*OUMb1TXF10Z$Zefj<}e z!G*y~%6GyIO1Hvb1?4|1FoQ$E^I><;7?t0F-c~okq2LFO!u8eAOwM0Y2SWb%{vKhAebvM{jUe}WG5XAiVLr+)_8TtoaH&y!qk diff --git a/tests/fixtures/cmdb/topdesk-formula-and-connection.xlsx b/tests/fixtures/cmdb/topdesk-formula-and-connection.xlsx index 6189ace83a501c4656baa692782102268bb47daf..389158c6afb7edd7a34c8ec05b848154623df4a6 100644 GIT binary patch literal 153734 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 G%zpsHh90Q^ literal 160968 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 diff --git a/tests/fixtures/cmdb/topdesk-missing-appid.xlsx b/tests/fixtures/cmdb/topdesk-missing-appid.xlsx index a88486e5c9d6d904e1a3c8b4bfff281d1bbf3567..eade6d70f5ffe5d1ffbb57cf815d8d87369220d3 100644 GIT binary patch literal 153343 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 Zi(K=*F|u{MBw+d{ZB8tLSZ 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

w7ZLlz{E1ue-0&}0i}gSa(`Ac3j+ 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 iPCoCj-r|47z4~$CRnpc4 zw@0P9^0%}0zDgyvX5DGnlh>ZR#FZ`es-(os*^K^h8^q6Gd`Y4zIOJ|OEep@ACyJ*ZemUGyfu#s`X)K9S zdvSP&cR_ueRro@?spZz{< zy7jPLC-CBg&l5^+#^G()Wf`ZF?dAMSlS~5I&&0F$WUV&3SGw6*C?9T4dDKii=VV&) zVH5k_O0HYMd-spG8W5r_Pki#MA{M-D06pk&U$t^nwupXq)k>gjk*DdRh-mXZR9e?q)2xO?ktnfm@Zs`^s#)&v8nljs0swS4Xk;?vsA1-|7gRV81i))U>=?d!Vz@6tWx@@>P_de4#9| z+PFJ3r0cXZ$G5O_;Ssc?O)OWu!_JqHlJZ$7C8Z#?iNCv!AJpseIVkkUk;ADzY3N3sx|fnH8=91w9UCCTesQ7U1}5&%GWG9P#^nZMPr=0 z_ZN2J3R!ml@VdK?c61qDaC6w}a699Hp7UaBmD5ae`NOZr9yxaE73o@9IKWrubKkQE zfclvG#HwXMhon|jV}}mkscK*vJ4VS2IBZ(I-Z*yq(=)R)A%g*BauMTeH8k&DYuM^& zQmA({Z=O0x_Ga~f-WutpS&C6%o9AiiF6~4RQcpM~ukAAQkn7jUv;v%nnpJYY>1;crYq`$f$NW+4gPerw(k0;01k*6!@?B=(%I*=~ z9_mpGEsootC^m`VS!~KH@?xL)#38$W`c@o^Huv73XHRXfaW#5km>cTB_kG(9=fa$=8y*C?avO$tdw}mxzwY53$O$JrpWH)g zo*Qvlq532HO1Zzoh0p+v;*HsDhb&z^xZIKyBiwrQs^U|1uA^nP=l$HY9*+m2x;{Na zYX?-b4Id=G4M=k` z-q)G5TPn?s4T`!Sxq3~~&_z)F@)H{nk4yDrkQP}JqjPsx7o5)7sqosezM}U*eNw@gdB`soUVZYF|6=ts)!?8z9*`=? zVVRn@Px=5~=2f+-e!NyKwCsITJP6e8lv#5b9;i4p{v{g5g%M4%eZ@UNsh9A7MRr`*XXr=CO^;wxgjg^OcUmrLlyZoXq?bE)t{^SoE zH`;VXs~S*0zS)&_F|zhR&Y|+!;E(TjxNLo!a9M9qA+av#ns)RZhV9eJ*1)sYZ;pF% zygq8Yd|;9v;frnRx4D8Un|s3#q#bdb=m5Kpv^(dOHa z2FqW|-};ud_r%1wPZLi;GHsao2Wnf0*T-Vu<7Ld6Fv=Tz^$K@NF|T&>%n_RH%9GLn0HgfY@=@TU`O$L@X1$*xLuQG z!y8hz*Nr~c-2K|hiK3|lj7NpW9$0zfOVUo&?b-Xaj#cuor7OOI5z!knzpm}ri?xa| zr>4Z%JoRu@|tKH2U3WLA*XIt@4F#-W!X2hnaeik6G>qfBL$-aVAxs+1f1tmy&yo=a4* zzjDjIvWF{{=Y-2VH|)i0?v|HvN$$5jySx5d`p!O&eGlFCt*kQMR+S()v^&#t?eQvd z1=p{H=x!pePT4uT>YiDBUVE#EuxkB-C$U#IMcVh3 zD6TMAwty?GJ(<~+GD@gQ!`n7_?Kn|Y!!roy;xCyxwORF#*6@geK=|Q_piHJKVtd?{ z{-yxY<@ZBKHU};8p9sk2zbVMfxQ4NLg89Pp8)gbx&b(12AI+&7^6`XJ4}YefGhFd{ z7>XK|&E#F!QP4uuiKyp}L{z5c$uAt~lHIHKG^G)-YvYaqe3>H4YMVH@3S} zXlxRey>SQT#%A@klvh*-h(ImT-P}O`M~MecIBQj0b4-W{h(#ZW`+W4NB?4~9hl=Pa z@fPq~`bO->P1FG7ot!RoRE(goXFusY-}I#^<|KsuHN_8;>9)hkfqAxe^vbS@_H*>J z_OO#g<))-e>fHF+LxSe?A&VV}Ut5?JS;AJeeLH2Bjo6bQ`unjRJ8LU1jHVT+!4tC3 zo6?}`^oOwwf_b`O^0qGx2z%Ij4u8*%0AyZP`4M6P6_pc@K{Z`+)b}vSu(!|;U8$3n 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

$xOUX+CO(#oIfp zJsxUPKOMU>@rmvuwfy)7@%-Amy9-Z;n5;=C{{2&Xli{S%H;!zX_xRD-qNcmsDMuCh ze;*%^zg6Aha_{w7Gl7TMf(9!#8)cRssM>a2^yZ-*pKIa{FU|BT?@|i-vAxBmx;p;- z^!*R+dpo^Vd{=X1OzZ2m+B^L%HCwE29Pj+xbxzXFY5(3QNgwy?JhhQGQL}Ely54H+ zG-sEZaZaNiDA$no2PCzm9aq`=Ze62p5q@ir`D2< zwoAph-CYuxx4uMViT=WGPbRN@`${7Dy63>x?rrT~yZuW~6>bslKR|6PZh9g@LIg!taxKt;jnlde>YHSIaHt zNG@^y;~qswlEyzvG@e2lhYPWHV*av*q6>)?4^DzgDxkUq9Jp z>C)TH>!Kn*bDglMzc_bYg#Eb-T%slQ4s1`<-B9Pn%XX_-J6VZ&z1i$`cQFG?tJL^2fq4ybbs2+?)7^T zeO&#N_r5n1P6v>$RPWZ^+Bx=Q{2u-u70OfnD4hd))M}qz{q|y&%GY(vwwzmDI=AGu z_=~^nx1JUFM_&3-!nDihBm|ZjPy2p9;O4LB-!nuve4cPQ>8y{G#$4jzs`w| zyfH3zR!N?u_nkd6Gyyl_=W59Ot)+d(%aZLI_>Az>ppH* zGZH1*&3;UceW-0^$(Op=);L>Q>#&2otf+l$&=!a2N5X%_U9=O-zZw2AI40Tl^47jj7{9?+Y z4y-%Bo&So%%Uf$IdIVinzWcrY(%i9Y(Ti2uvLEf%o2?k1QLE{*e`fl@)ZBwkEjJW> z7Vy2y4*z@G2L<_WPCdO7BQIFZkUW0wP@Hj0oxL+@xzf^ld4mD_=}QII>|g&t_D=Vk zt2IU+np1Q8+^vs}H9Km3zshvW*6sJ-e7X^>`k?E*%8S|)_e(;gj31mhLK1oNy1kY6 zy+z?B*Zxsx+%LRn-CqIXJ=Z7_X$~#!yE-}V-EU)Qd0@Y+nX{$+ep&1f1(*UB!M_VG z-L~VF<3HJ{R`Y-X)}zD2FEJXSER z=9;cvnBMjm_Pdsz4L|L0oqGj$>#5-TJUUtztg z+@?|XX^wBVJy!gr_HN$hTfEVkWlhIBPM>c-BG!7aufVJ6cw9&7v3p_V;R0XOJk7sY z@&;YM)2IH_xxu^Rnx4gbi&MJ~&K*1Hg*!iW zx6kkmPoAFKpME?0(7X0AsA9ICOZU|R3DH%OM4CWT%>Dz1?Jf61J(QW$IelC<(L=SV z|J3|eTaSx6s~_4O+mKmOYa8ucvZ_6Iu7J@wi%%honw$DNQ~g(qsi}t-jS5t}t?;Wr zNulFuN6dibxwQ=wN~T`23BMwEGXCLsAHuAM^ZI{*FKUd>DbD zx9TO^@0_@_ag*k#j)(gWP8$8-8$Z7IA`yDt(P&IvdAsJ^?Xf>5__oJA z@ko2T$m;gTOZrd8#;1SNEy-63`|^)Nf`(|3T-)KRZUgI|OwF;OoQoIN``d5)^nM{} zSy97li>9nPdvss#&xy~~%nH@{d$@d^7m>w{H#Hwk{;PZ1-H+2+^|#$NSM85}aO`4d z$f&1tBqGMwAM;XEFB&y9W|GCk$Z6{%6-ZNkC~4J`W^8JfS3cXNqdqlyN{Od6)qMK_ zmFYKc?VX$Rc`RQ=`LmXHn`gzRXlvUnO>9%H|0J4Wury?>>mw(^*<@`RMevPE9}m7iH>&QWYUVr8^|Z561GwJ{n~lELdh>a^GIe^~0US1smlSTrJ=7RzjiRXTXj_2e1D1^;d3ZhKfpj^(}K% zZ?5{UlM6&XzI>r;ByqMa_kBw1oW=A08s~E?>11Nu+;6{*y_}*h!(S>dXmEB<@}iyN zEF07B`0A-e7zE_o8^3)Sv)h__Irs2x&6#0WH_QxNYS$~h;LTyfw>DpIc$~ev^7Y&j z>efYLqW6~E3{K*!HrD%g>Fe01&wUP_Nh6(Byml_|PQwdBznSCQqMPN+?o2mLSvmD& z;i#st@RWibJSFFgC-&spxaM!(=|XuNH6hC+Zd+WGSA+b!-t@-`>NR^dU+MH4MakUY zYf#%S8hO~;e6Cb)xc8b1lJmrERV-V<4oTuuf4wgRP5QEa+ZGH6s=ib`pG&yZ|7YM zh=0x(6Tjax?rZJlzLfj(vaSjQU+7z6wegY2hV;Y*UN8GI_v@s3RZ*j;Qb9+5+a^Rg z)Xj7F^4Ugw(Y_d|R7b)9}ZW!x#;Q?mCC@+`@fNQUfR%V@#{|c>0h_Gir&3F8u>Pb-^}q~8*h5w3$9Ie zZCO?441d+c{8dA4y=){Ibi`%PoNL>Jx5T+*`E?1tK1O|R#cO*y(lGB=<#-?d^|s;d zcV6%Rxs*RV`>94ra zwUf7{Zg-#S?d^-JACIjQb-Q5ftZy)R!W+-94Hs(i{P)_p#4jF4Z^J<7&pMti9>ylF!@P zIOZ>2dVj)llh_*PCFOESo2qB7Qoc23pX=-1pl3x|3iDdqr#`-TLBJ?VHSp-+%ZGlQ z7NRN&9qG?~^TQL3yFV`dZMz!OBt|nyBv_t+LS(;R&~XGpr>mf6m{#-7orVLWkgN%4C^I?@8gGDy#gP>r8jcrYKeV zN3GGg6E!xj^5=yDN7A|P<;nLy27-WsV&dF_rLhZHbHEz#_nhZ$2RS22Q+UT z+h`@QD>ZGu#}Vo+|9ukMW%PW~43k`ATel}({J5E`?`wW{_xf+tlGEQdAFV0)rRV)_ z{5buf8`DZmU7CMeKKCt`u5bHs((T}~{*MeYV}4gdJw^y$N~KKu)xjhQ8BH=E1%*$j_Xt_^Estma=iF)Kze+Giaf z-*K_tX=!EgMr))^r(~x)oymaP4>zZRYyr+?0H+m|va@BLCmT1z!zUhL=B%&N7% zc&TKdr#we+%!S!I)URK9HB(x8-- zgaQtYq?B}X=oF+GN?PO&cs(5F$B%oS``5XfXNKq5GwU;Jzw3SXUf;Fe$75I>@=gk3 zp+`ulVS|C86jH*s<61+`=qA6Ckbb9m<>J^;xIfic$Vte=ylLzpT@dw2PRag=dwTOB zvA|S`gyU>wdDxsR{ThyhRC?KVUlEI+nzraJIL<^YlK!sgR!f&jknhUVEvAT;H?~r< z%_p`FlzY6vi^*fN7Hf5P43lI(`Sq1)+9#dc=2j^jWs@bQNn{X8>i=lE_xky`w`z7J zl>kD{L)3g+X4yXdK#~fX!QK9)71Xx?Ufv={aLo+yb`$+ZcaSjs3r%wC03!;v(k&m? z?(^Aa@QOPh_9{M5IU({F=GSE0cea$Ae9ejrv_{Kjk1Dkc*)k-jfq zNhyRUBSyb+(ldbOv}fllMI?T3WstRxxTJjo+3O*-iUkF?z0SZiPHR?zrNku!@QY6w zAjl6RY(_}oYcCcx&*8XGfs&|Azt1I6clY$4Ok(7gqgC%n*2x+5%CkH2I*ujmMApCT z`AXK?Od{nPG7U3C0jo3E4v$At38n?L0$Jj zMb-qL1c8qAdoY-U zVf&L`I+B(|zPwnHcf%@SOD*JJSga9y_s+eFlL$e>|Lx+=(b!bMY{MpS-$tnikQQdT zo}DyyGGB=@-YZ3;duM@led%c0vySr7q&xFiEp~CN{2Q6#l_7mM*4dm|g*%xkWd0_s zl#j*7twy-R+1~MgGD7PpHaHU^aFen26P)tH- zg%e;gc8Dw&t^G0`?=y|BE2E$}o@9eaJj*~e%U)b?M5pxag!4K4gj%k6%3}pdqM;10 zOk*92uDPid@tuS5;Tj)3Q*!nn_~Gxhn`#wl`d;BRf!gO!+Q;TS%6Tg2NGT-yHb|^u zoK_C`x_r&Drrm%%dUnhLJ94Nl zxLLTA=%bb#BpTu^luW7Px;1-PbJiK1iF(d+m}jO|3X=ot2KTH#5!+7201gqH`rd7b z?e0(6ydu=n>ykr}=KjbV&WjM9&<=_(AG0wTX{dYry&V8x(vT&3;m_L%v|fUH(X*^$ zmQ!xWhnDj3$+95va~06585@$`X(ayv%W4(3_xmQ?pHI!bK0PTuH*2vN)pQ7DI z_Hpe6>>cD+ickj5kcmHyaGN=+vv2-B8rC|zFSs#>yS|SXVtnW;wU;rZ6&7s1Rn?%1 zkQ+$qy#HWz-<5LrBQ-@0`Yj~k4YnyIRSqPS&Xe4&lrX^t&+`{FCF+LKlM6God@sk{ zv*`Ntb^=T9Gtp0C9}ICD6%B?Th8P$mr-`^4P-xv9c8!?0=N4W(>I)@-5#3pl1|gY- zBJ6*Vz?W6fO9>p&-zam71r?^hW==3}Dz(=GLo27$Q^^Qj-}KC{zoX1-vaC$m^?Zf` ziRtM!wn$83l!cpuvbTy2d8vO7Fo2@M9eD$_mec@DBFrwV4}44wk7o%=wzJFOd`|0~ zcdV4O_EP|t{}R9ttRMn7_d);%z5I5@C9rZb>37_z7Sbxj&p@cuCYy0S=B^j`HrHAZ ztN44d$SKnw_(#La1ut8KnlPyBD8rP9`%g&lSvHBO)==*f`Boe34WhdX_*RPb?`40O z0s6xJo`m&p5wH0|h9nj8y0I$o@XxA%dN&Ii963ht{7egP)T&;86MiWu6%pv+hs@jb z*^CU8#lw@X-0OI+-oYbRy)LgaX1vJ%k#hKGg=uIvKek|Ed)w|ZQ%P43@e!?_Tz zVSNU0pv$aoGA6Ik=+%A^8K?A2H`LR8F$uJ<709&m249LaoO|uW%8ziLbglls^q=jY z>3^>KF~b35?5*Md!}zoR>HiwlJ2!k9EYeoh$kC`UCOu(SfE<+?uIl zslqC}Ptlk}Q21Ab`*n8F&l8zLw2BU9^3k7n+%7WIh)WNZH)n9eskM1yM3x9IndjwV_ zTrVZgkNhvg&hh84{clcN&i`@$x&Hb710c%}qCKxKhOz+v`4@2GeVhBA>31xtS2y6GGR_6NaY&Tu3 z=9$OQMpvBA&vZjXP?)73bMo@CPU>!jQ-8qEbgXzgBrT7u4GtocV=OKeDTs;WCHSmQ(4zk-bZaSPcX1*a=>f0#C21u~CC+e&`3HT(M^z2j*4)TR} zr8vHwf?bcdW3jR}Ot$J!kX!dWNwmyTDd&69J#T*@r`EMRgH01Y#7E)4=g_Rr9HlQ* zgLEK}!F>@!kvde8-RvTo5d&V>wka&;v-B8Q6Jy1z!0qV7tdYa8fQFJ_gI0vgdch@_C0zLJ^<&#S6OA*pEUp-?~I6yG8VsyxueesrKkOfi#J{28p=t z!+Y@qai1?lXDL;m|9%%vOIth7f&|e95e5e1XAn({tW8ACjVx?0qUiF6j$Htd2x0q> z>J%+|>)tkpu2|qxw>73}`B@}aDpUXrMR&v23v(83S#+;+o zWZ-`HS&9=#(NGAiJW6orOIhB;pcA0gABBKfYAA~(-YPB0TQqNkwpe#00SIl;o#%c(#o$4K8DId zMsc)-{wc&{APWay&S<9Ck>>Z6XndAPnB1?Uq!UZ;W_EF*JHp2!!K>g?JQ{ffhkU~B zCSu!4a0Hb8TnmRSlRhWeJhuO`pj54-(wWzQ?&)5UrF~8#rK9alNSmAAmdEaX9Tje)Zd9zuw4yi$%^F< z{ft+I)Atz%;0g9{(aQJfF`R;>a>%4U5DzYwyF5ZxNu-!d@o{=9%uk{n(!ed_KDOSU zq?=)zWW$?Ikt8zGyU|h`nUDndH2Iw)8+7da>um4jJd#a``f{>^YZSE?J!NS+{2>4(;up>Un0|Ed>O+o4` z)r7r)1@?$WVrHW8O((=+cf31nlxf3I9vHZpQ#8m8S-m_BrEdG)D!o@+d3_aUHX~0wFcOLGKu3gbw1Plxih5#D)W?BdksG{ z+9Ms2DRMS>9sgbOdoH#4$`b3b={_oxOj;$uei5n2?;9Tgqlqor(px8jS4v4&3@Qj5 z*#g`;a1TCu7YLXwl$l`=Jak_U+U{SF5RaJ8(DaXd!Vo!BzdVAl{;`&`T>OpPR<1M} z=7|RHH^T}|Dm_mN^`)-X4TgO{rS_SY?K7OrzMVJNvbUHYsFNzfrSf(C;7H#WuunJ( zt){DREga&Ao5>_ZE3iwRL0@ZdG@p62?75o7P{#%PvfFgI}tPlG*vyv<<95(#bmY#w81ssu(*`a&q=awGG%Dp`NAm?CU zbVTiJoy}~W4bOm_F;WtB?00h4*A^-hgM+(+48Q0tC|_zJZH{Yvx$L$>Q%v@qHTKkCU?Q;Lp(w7A*HSLkEi{FI zNo6|$83sm-9r}viEM7~w)R@qeP~<9gPsm2G=2B>i75G}prR0L9NU}r?EkL^K)@INY zA~@LV#^qA@KvQBCsO}~b!N9y>f`u9vc8qH&m+}LeLUAO5JPw(jvyj>G`+R|8yq0pA zLqk)7Cp&(;gDjdxEo7Mczs)*K;I)*WQUV$Sy&dlt$q#my5bk1Npf~411EBYHTmja| zF9FvJo2y+O&_L+@5LZBW%1hwY?g(g8=$77N9aPdlRLj$1|?-lSV z*Cp_;`WM<5T4`Mw^YdI9|E9a3t)bKUD{C}9xc{5vLz_bEoGRLJwRSrBroh4~k$^e4Xn literal 156723 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 Date: Mon, 5 Oct 2026 10:35:09 +0200 Subject: [PATCH 22/57] test(cmdb-import): check every fixture part against an allow-list The hygiene test only scanned .xml and .rels parts and two core.xml fields, so binary parts such as printer settings and the other document properties passed unnoticed. testNoDocumentMetadata now fails on any package part a plain workbook does not need, on a non-empty core.xml or app.xml property (title, company, ...), on a creation or modification date other than the fixed one, and on revision GUIDs, filter ranges and saved sort ranges. The contact-data scan reads every part. Co-Authored-By: Claude Opus 5.5 --- .../Unit/Fixtures/CmdbFixtureHygieneTest.php | 133 +++++++++++++++--- 1 file changed, 113 insertions(+), 20 deletions(-) diff --git a/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php b/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php index b7d1c898..ccd262eb 100644 --- a/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php +++ b/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php @@ -4,11 +4,13 @@ * Hygiene of the CMDB import fixtures. * * The fixtures are derived from an anonymised TOPdesk export. This test fails - * when one carries document metadata (author, custom properties such as a - * sensitivity label, customXml with a Power Query package, the absolute path - * of the last save) or any person data that is not one of the known - * placeholders. Plain zip and XML parsing only, so it needs no spreadsheet - * library and always runs. + * when one carries a package part outside the list a plain workbook needs + * (printer settings, embeddings, comments, customXml, custom properties, ...), + * document metadata (author, company, title and the other document properties, + * a creation or modification date other than the fixed one, the absolute path + * of the last save, revision GUIDs, the filter ranges of the original data) or + * any person data that is not one of the known placeholders. Plain zip and XML + * parsing only, so it needs no spreadsheet library and always runs. * * @category Test * @package OCA\Stackiq\Tests\Unit\Fixtures @@ -80,6 +82,49 @@ class CmdbFixtureHygieneTest extends TestCase { '|Asset eigenaar', ]; + /** + * The only parts a fixture package may hold (xl/connections.xml only in the + * fixture that tests the synthetic connection). Anything else, such as + * xl/printerSettings/*.bin, embeddings, comments or customXml, fails. + * + * @var array + */ + private const ALLOWED_PARTS = [ + '#^\[Content_Types\]\.xml$#', + '#^_rels/\.rels$#', + '#^docProps/(core|app)\.xml$#', + '#^xl/workbook\.xml$#', + '#^xl/_rels/workbook\.xml\.rels$#', + '#^xl/worksheets/sheet\d+\.xml$#', + '#^xl/worksheets/_rels/sheet\d+\.xml\.rels$#', + '#^xl/theme/theme\d+\.xml$#', + '#^xl/(styles|sharedStrings|calcChain|metadata)\.xml$#', + ]; + + /** + * The creation and modification date of every fixture (build-fixtures.py FIXED_DATE). + * + * @var string + */ + private const FIXED_DATE = '2026-01-01T00:00:00Z'; + + /** + * Document properties that must be empty, per part. + * + * @var array> + */ + private const EMPTY_PROPERTIES = [ + 'docProps/core.xml' => ['dc:title', 'dc:subject', 'dc:creator', 'cp:keywords', 'dc:description', 'cp:lastModifiedBy', 'cp:revision', 'cp:category', 'cp:contentStatus'], + 'docProps/app.xml' => ['Manager', 'Company', 'HyperlinkBase'], + ]; + + /** + * The placeholder person names; a column that holds one is a name column. + * + * @var array + */ + private const PLACEHOLDER_PERSONS = ['Achternaam, Voornaam', 'Achternaam, voornaam']; + /** * Hosts of XML namespaces and schemas, which are not content. * @@ -134,7 +179,8 @@ public function testTheFixturesExist(): void { }//end testTheFixturesExist() /** - * No author, no custom properties, no customXml, no absolute save path; connections only the synthetic one. + * Only the parts a plain workbook needs, no document metadata, no revision ids; + * connections only the synthetic one. * * @param string $path The fixture. * @@ -145,21 +191,27 @@ public function testNoDocumentMetadata(string $path): void { $parts = $this->parts(path: $path); $name = basename($path); - $this->assertArrayNotHasKey('docProps/custom.xml', $parts, $name); foreach (array_keys($parts) as $part) { - $this->assertStringStartsNotWith('customXml/', $part, $name); - } + if ($part === 'xl/connections.xml' && $name === 'topdesk-formula-and-connection.xlsx') { + continue; + } - if (isset($parts['docProps/core.xml']) === true) { - $core = $parts['docProps/core.xml']; - $this->assertDoesNotMatchRegularExpression('#[^<]+#', $core, $name); - $this->assertDoesNotMatchRegularExpression('#[^<]+#', $core, $name); + $this->assertTrue($this->isAllowedPart(part: $part), $name . ': unexpected package part ' . $part); } + $this->assertDocumentProperties(parts: $parts, name: $name); + $this->assertStringNotContainsString('absPath', ($parts['xl/workbook.xml'] ?? ''), $name); - foreach (['[Content_Types].xml', '_rels/.rels', 'xl/_rels/workbook.xml.rels'] as $index) { - $this->assertStringNotContainsString('custom.xml', ($parts[$index] ?? ''), $name . ' ' . $index); - $this->assertStringNotContainsString('customXml', ($parts[$index] ?? ''), $name . ' ' . $index); + $this->assertStringNotContainsString('revisionPtr', ($parts['xl/workbook.xml'] ?? ''), $name); + $this->assertStringNotContainsString('_xlnm._FilterDatabase', ($parts['xl/workbook.xml'] ?? ''), $name); + foreach ($parts as $part => $content) { + $this->assertDoesNotMatchRegularExpression('/ xr\d*:uid(LastSave)?="/', $content, $name . ' ' . $part . ': revision GUID'); + $this->assertStringNotContainsString('assertStringNotContainsString('printerSettings', $content, $name . ' ' . $part); + $this->assertStringNotContainsString('custom.xml', $content, $name . ' ' . $part); + $this->assertStringNotContainsString('customXml', $content, $name . ' ' . $part); + } } if ($name === 'topdesk-formula-and-connection.xlsx') { @@ -172,6 +224,50 @@ public function testNoDocumentMetadata(string $path): void { $this->assertStringNotContainsString('connections.xml', ($parts['xl/_rels/workbook.xml.rels'] ?? ''), $name); }//end testNoDocumentMetadata() + /** + * Whether a part is on the allow-list. + * + * @param string $part The part name. + * + * @return bool + */ + private function isAllowedPart(string $part): bool { + foreach (self::ALLOWED_PARTS as $pattern) { + if (preg_match($pattern, $part) === 1) { + return true; + } + } + + return false; + }//end isAllowedPart() + + /** + * The document properties are empty and both dates are the fixed date. + * + * @param array $parts The package parts. + * @param string $name The fixture name. + * + * @return void + */ + private function assertDocumentProperties(array $parts, string $name): void { + foreach (self::EMPTY_PROPERTIES as $part => $elements) { + if (isset($parts[$part]) === false) { + continue; + } + + foreach ($elements as $element) { + $this->assertDoesNotMatchRegularExpression('#<' . preg_quote($element, '#') . '(?: [^>]*)?>[^<]+]*>([^<]*)assertSame(self::FIXED_DATE, $date[2], $name . ' dcterms:' . $date[1]); + } + } + }//end assertDocumentProperties() + /** * Every e-mail address, linked host and long digit run is a known placeholder. * @@ -182,11 +278,8 @@ public function testNoDocumentMetadata(string $path): void { #[DataProvider('fixtures')] public function testOnlyPlaceholderContactData(string $path): void { $name = basename($path); + // Every part: the allow-list of testNoDocumentMetadata keeps binary parts out. foreach ($this->parts(path: $path) as $part => $content) { - if (preg_match('/\.(xml|rels)$/', $part) !== 1) { - continue; - } - preg_match_all('/[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+/', $content, $emails); foreach (array_unique($emails[0]) as $email) { $this->assertContains(strtolower($email), self::PLACEHOLDER_EMAILS, $name . ' ' . $part); From ffa95bfa389273316cf35a9cb68a03e2b27c6832 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:37:54 +0200 Subject: [PATCH 23/57] test(cmdb-import): name-check every sheet of every fixture The person-name check left a sheet as soon as its header row held neither Middel-ID nor APPID, so the "Beheerde Applicaties CMDB" sheet of topdesk-missing-appid.xlsx (whose APPID header is renamed on purpose) and the sheets without a header row were never name-checked. A name column is now one whose header (row 1, or row 2 on a two-row header) is a known person column, whatever the other headers are, or one that holds a placeholder name anywhere, which covers Blad3. Owner columns may hold a department the workbook lists. A new test fails on any text in the "Surname, Firstname" shape that is not a placeholder. Co-Authored-By: Claude Opus 5.5 --- .../Unit/Fixtures/CmdbFixtureHygieneTest.php | 146 +++++++++++++++--- 1 file changed, 124 insertions(+), 22 deletions(-) diff --git a/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php b/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php index ccd262eb..3da15838 100644 --- a/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php +++ b/tests/Unit/Fixtures/CmdbFixtureHygieneTest.php @@ -118,6 +118,21 @@ class CmdbFixtureHygieneTest extends TestCase { 'docProps/app.xml' => ['Manager', 'Company', 'HyperlinkBase'], ]; + /** + * Owner columns: TOPdesk lets an asset's owner be a department, so these may + * also hold a value the workbook lists in one of DEPARTMENT_COLUMNS. + * + * @var array + */ + private const OWNER_COLUMNS = ['Eigenaar', '|Asset eigenaar']; + + /** + * Columns that hold a department. + * + * @var array + */ + private const DEPARTMENT_COLUMNS = ['Afdeling', 'Eigenaar afdeling', 'Eigenaar cluster', 'Applicatie Eigenaar (Afdeling)']; + /** * The placeholder person names; a column that holds one is a name column. * @@ -305,7 +320,11 @@ public function testOnlyPlaceholderContactData(string $path): void { }//end testOnlyPlaceholderContactData() /** - * Every person-name cell of the raw TOPdesk sheets and the CMDB sheets holds a placeholder. + * Every person-name cell of every sheet holds a placeholder. + * + * A name column is one whose header (row 1, or row 2 on sheets with a two-row + * header) is one of NAME_COLUMNS, whatever the other headers are, or one that + * holds a placeholder name anywhere (sheets without a header row, such as Blad3). * * @param string $path The fixture. * @@ -315,40 +334,123 @@ public function testOnlyPlaceholderContactData(string $path): void { public function testPersonNameColumnsHoldPlaceholders(string $path): void { $parts = $this->parts(path: $path); $strings = $this->sharedStrings(xml: ($parts['xl/sharedStrings.xml'] ?? '')); + $allowed = array_merge(self::PLACEHOLDER_NAMES, self::PLACEHOLDER_EMAILS); + $sheets = []; foreach ($parts as $part => $content) { - if (preg_match('#^xl/worksheets/sheet\d+\.xml$#', $part) !== 1) { - continue; + if (preg_match('#^xl/worksheets/sheet\d+\.xml$#', $part) === 1) { + $sheets[$part] = $this->sheetRows(content: $content, strings: $strings, part: $part); } + } - $sheet = simplexml_load_string($content); - $this->assertNotFalse($sheet, $part); - $headers = []; - foreach ($sheet->sheetData->row as $row) { - foreach ($row->c as $cell) { - preg_match('/^([A-Z]+)(\d+)$/', (string)$cell['r'], $ref); - $value = $this->cellText(cell: $cell, strings: $strings); - if ($ref[2] === '1') { - $headers[$ref[1]] = $value; - continue; - } + $departments = $this->departments(sheets: $sheets); + foreach ($sheets as $part => $rows) { + $firstDataRow = 1; + $nameColumns = []; + foreach ([1, 2] as $headerRow) { + $names = array_intersect(($rows[$headerRow] ?? []), self::NAME_COLUMNS); + if ($names !== []) { + $firstDataRow = ($headerRow + 1); + $nameColumns = array_merge($nameColumns, $names); + } + } - // The raw TOPdesk sheets (Middel-ID) and the CMDB sheets (APPID) - // have their headers in row 1; the other sheets are covered by - // the e-mail and number scan. - if (in_array('Middel-ID', $headers, true) === false && in_array('APPID', $headers, true) === false) { - break 2; + foreach ($rows as $number => $cells) { + foreach ($cells as $column => $value) { + if ($number >= $firstDataRow && isset($nameColumns[$column]) === false && in_array(trim($value), self::PLACEHOLDER_PERSONS, true) === true) { + $nameColumns[$column] = ''; } + } + } - $header = ($headers[$ref[1]] ?? ''); - if (in_array($header, self::NAME_COLUMNS, true) === true) { - $this->assertContains(trim($value), array_merge(self::PLACEHOLDER_NAMES, self::PLACEHOLDER_EMAILS), basename($path) . ' ' . $part . ' ' . $cell['r']); + foreach ($rows as $number => $cells) { + if ($number < $firstDataRow) { + continue; + } + + foreach (array_intersect_key($cells, $nameColumns) as $column => $value) { + $expected = $allowed; + if (in_array($nameColumns[$column], self::OWNER_COLUMNS, true) === true) { + $expected = array_merge($allowed, $departments); } + + $this->assertContains(trim($value), $expected, basename($path) . ' ' . $part . ' ' . $column . $number); } } }//end foreach }//end testPersonNameColumnsHoldPlaceholders() + /** + * No text anywhere in a fixture has the "Surname, Firstname" shape unless it is a placeholder. + * + * @param string $path The fixture. + * + * @return void + */ + #[DataProvider('fixtures')] + public function testNoSurnameFirstnameText(string $path): void { + $parts = $this->parts(path: $path); + $texts = $this->sharedStrings(xml: ($parts['xl/sharedStrings.xml'] ?? '')); + foreach ($parts as $part => $content) { + if (preg_match('#^xl/worksheets/sheet\d+\.xml$#', $part) === 1) { + preg_match_all('#]*)?>([^<]*)#', $content, $inline); + $texts = array_merge($texts, $inline[1]); + } + } + + $shape = "/^\\p{Lu}[\\p{L}'-]+(?: \\p{Ll}+)*(?: \\p{Lu}[\\p{L}'-]+)*, \\p{Lu}[\\p{L}.'-]*$/u"; + foreach (array_unique($texts) as $text) { + $text = html_entity_decode(trim($text), ENT_QUOTES | ENT_XML1); + if (preg_match($shape, $text) === 1) { + $this->assertContains($text, self::PLACEHOLDER_PERSONS, basename($path) . ': a name that is not a placeholder'); + } + } + }//end testNoSurnameFirstnameText() + + /** + * Every value of a department column (header in row 1) in the workbook. + * + * @param array>> $sheets The rows of every sheet. + * + * @return array + */ + private function departments(array $sheets): array { + $departments = []; + foreach ($sheets as $rows) { + $columns = array_intersect(($rows[1] ?? []), self::DEPARTMENT_COLUMNS); + foreach ($rows as $number => $cells) { + if ($number > 1) { + $departments = array_merge($departments, array_map('trim', array_values(array_intersect_key($cells, $columns)))); + } + } + } + + return array_values(array_diff(array_unique($departments), [''])); + }//end departments() + + /** + * The cell texts of a worksheet, by row number and column. + * + * @param string $content The worksheet part. + * @param array $strings The shared strings. + * @param string $part The part name, for the failure message. + * + * @return array> + */ + private function sheetRows(string $content, array $strings, string $part): array { + $sheet = simplexml_load_string($content); + $this->assertNotFalse($sheet, $part); + $rows = []; + foreach ($sheet->sheetData->row as $row) { + foreach ($row->c as $cell) { + preg_match('/^([A-Z]+)(\d+)$/', (string)$cell['r'], $ref); + $rows[(int)$ref[2]][$ref[1]] = $this->cellText(cell: $cell, strings: $strings); + } + } + + return $rows; + }//end sheetRows() + /** * The shared strings table as a list. * From b6c6848e7f3c3ec207512e1552774d4c9598475d Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:43:15 +0200 Subject: [PATCH 24/57] fix(cmdb-import): show the limits the server applies, not hard-coded ones The page rejected files over 10 MB before uploading them and its texts named 10 MB, 10,000 rows and the two sheet names as literals, while the server reads all of them from the import profile and sends the values in force with its error. An instance with a raised limit could not upload a larger file, and a lowered one showed the wrong number. The page no longer checks the size itself. FILE_TOO_LARGE and TOO_MANY_ROWS take the limit from the error details, and the help texts read one PROFILE_DEFAULTS constant documented as the profile's defaults. The admin docs gain a Limits section naming the two profile settings. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 26 ++++++-- src/utils/cmdbImport.js | 74 ++++++++++++++++------ src/views/settings/sections/CmdbImport.vue | 17 ++++- 3 files changed, 93 insertions(+), 24 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 323f3009..876c5f4d 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -58,7 +58,8 @@ page in stackiq. matches an existing municipality (ignoring case and extra spaces) uses that municipality; otherwise a new organisation of type Municipality with status Active is created during the import. -3. **File.** Choose the TOPdesk export (`.xlsx`, at most 10 MB). +3. **File.** Choose the TOPdesk export (`.xlsx`, at most 10 MB by default; see + [Limits](#limits)). 4. **Update existing records.** On by default. Turn it off to import only applications that are new for this municipality; rows that match an existing application are then reported as *skipped* with reason `exists` @@ -100,7 +101,8 @@ surrounding spaces and a trailing `:` or `⚡` do not matter, and the order of the columns does not matter. A column that one sheet has and the other has not (such as `Nickname`, only on `Beheerde Applicaties CMDB`) is optional on the sheet that lacks it. Empty rows, including formatted rows below the data, -are ignored and not counted. A sheet may hold at most 10,000 rows with data. +are ignored and not counted. A sheet may hold at most 10,000 rows with data +by default (see [Limits](#limits)). Two columns are **required** on every CMDB sheet that is present: `APPID` and `Applicatie Naam`. Every other column is optional; when one is missing, @@ -230,13 +232,13 @@ and the section shows the reason and the error code. | Error code | What it means | What to do | |---|---|---| | `NOT_XLSX` | The file is not an Excel workbook: wrong extension, or the content is not an `.xlsx` package. | Save the export as Excel workbook (`.xlsx`). | -| `FILE_TOO_LARGE` | The file is larger than 10 MB. | Remove sheets the import does not read, or split the export. | +| `FILE_TOO_LARGE` | The file is larger than the upload limit (10 MB by default). The message names the limit in force. | Remove sheets the import does not read, or split the export. | | `NO_FILE_UPLOADED` | No file arrived. | Choose the file again. | | `MUNICIPALITY_REQUIRED` | No municipality was chosen. | Pick or type a municipality. | | `MUNICIPALITY_INVALID` | The chosen organisation does not exist or is not of type Municipality. | Pick an organisation of type Municipality, or type a new name. | | `NO_SOURCE_SHEET` | Neither `Onbeh Applicaties CMDB` nor `Beheerde Applicaties CMDB` is in the workbook. | Check the sheet names; they must match exactly. | | `MISSING_COLUMN` | A present CMDB sheet has no `APPID` or `Applicatie Naam` column. The message names the sheet and the column. | Add the column to that sheet. | -| `TOO_MANY_ROWS` | A CMDB sheet has more than 10,000 rows with data. | Split the export and import the parts one after the other. | +| `TOO_MANY_ROWS` | A CMDB sheet has more rows with data than the row limit (10,000 by default). The message names the sheet and the limit. | Split the export and import the parts one after the other. | | `MISSING_RECORDS_UNSUPPORTED` | The request asked to mark or remove records missing from the export. Only keeping them is supported. | Not reachable from the section; reported for API callers. | | `MAPPING_UNAVAILABLE` | OpenRegister's mapping engine is missing, or one of the mapping files is invalid. | Update OpenRegister. If you changed a mapping file, check it against the Nextcloud log. | | `READER_UNAVAILABLE` | The Excel reader that ships with OpenRegister cannot be loaded. | Make sure OpenRegister is installed and enabled. | @@ -247,6 +249,22 @@ A message that you are not signed in, not an administrator, or that your session expired comes from Nextcloud itself: sign in again, use an administrator account, or reload the page. +## Limits + +Two limits are read from `lib/Settings/cmdb-import/topdesk-profile.json` on +every import: + +| Setting | Default | What it limits | +|---|---|---| +| `maxFileBytes` | `10485760` (10 MB) | the size of the uploaded file | +| `maxRowsPerSheet` | `10000` | the rows with data on one CMDB sheet | + +The section's help text shows the defaults; when the server refuses a file, +the message shows the limit the server applied. A larger file also has to +pass PHP's `upload_max_filesize` and `post_max_size` and the web server's +request size limit. Like the mapping files, the profile is part of the app: +a change made on the server is overwritten by the next app update. + ## Adjusting the mapping The mapping from columns to fields is not in code. It is a set of JSON files diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index f53a930f..304fdc4d 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -15,11 +15,22 @@ import { translate as t } from '@nextcloud/l10n' import { generateUrl } from '@nextcloud/router' -/** Largest upload the import accepts (contract: profile `maxFileBytes`). */ -export const MAX_FILE_BYTES = 10 * 1024 * 1024 - -/** The two sheets the import reads (contract: NO_SOURCE_SHEET details). */ -export const SOURCE_SHEETS = ['Onbeh Applicaties CMDB', 'Beheerde Applicaties CMDB'] +/** + * The limits and sheet names the import profile ships with + * (lib/Settings/cmdb-import/topdesk-profile.json: `maxFileBytes`, + * `maxRowsPerSheet` and `sheets`). + * + * These are defaults, used only where the page has no answer from the server + * yet (the help text). The server reads the profile itself, and when it + * refuses a file its error `details` (`maxBytes`, `limit`, `expected`) carry + * the values in force, which the error texts show instead. The page makes no + * size check of its own, so a changed limit needs no change here. + */ +export const PROFILE_DEFAULTS = Object.freeze({ + maxFileBytes: 10 * 1024 * 1024, + maxRowsPerSheet: 10000, + sheets: Object.freeze(['Onbeh Applicaties CMDB', 'Beheerde Applicaties CMDB']), +}) /** Every row outcome the report can carry, in display order. */ export const OUTCOMES = ['created', 'updated', 'unchanged', 'skipped', 'failed'] @@ -79,11 +90,24 @@ export function makeCmdbOperationId() { ) } +/** + * A size in bytes as megabytes, for the texts ("10 MB", "12.5 MB"). + * + * @param {number} bytes The size + * @return {string} The size with its unit + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-001-the-import-endpoint-shall-accept-only-a-bounded-xlsx-upload-from-a-nextcloud-admin + */ +export function formatMegabytes(bytes) { + const megabytes = Math.round((Number(bytes) / (1024 * 1024)) * 10) / 10 + return t('stackiq', '{size} MB', { size: String(megabytes) }) +} + /** * The check the page makes on a chosen file before it uploads it. * - * Only the name and size are checked here; the content check (ZIP signature, - * `xl/workbook.xml`) is the server's. + * Only the name is checked here. The size limit is the server's (it can be + * changed in the import profile), and so is the content check (ZIP + * signature, `xl/workbook.xml`). * * @param {File|null} file The chosen file * @return {{error: string, details: object}|null} An error in the server's shape, or null when the file may be sent @@ -96,9 +120,6 @@ export function checkFile(file) { if (!/\.xlsx$/i.test(file.name || '')) { return { error: 'NOT_XLSX', details: {} } } - if (file.size > MAX_FILE_BYTES) { - return { error: 'FILE_TOO_LARGE', details: {} } - } return null } @@ -283,7 +304,17 @@ export function errorText(error) { } case 'FILE_TOO_LARGE': return { - title: t('stackiq', 'The file is larger than 10 MB.'), + title: + Number(details.maxBytes) > 0 + ? t( + 'stackiq', + 'The file is larger than {size}, the most the import accepts.', + { size: formatMegabytes(details.maxBytes) }, + ) + : t( + 'stackiq', + 'The file is larger than the server accepts.', + ), hint: t( 'stackiq', 'Remove sheets the import does not read, or split the export, and try again.', @@ -320,7 +351,7 @@ export function errorText(error) { const expected = Array.isArray(details.expected) && details.expected.length > 0 ? details.expected - : SOURCE_SHEETS + : PROFILE_DEFAULTS.sheets return { title: t( 'stackiq', @@ -330,8 +361,8 @@ export function errorText(error) { 'stackiq', 'Expected a sheet named "{first}" or "{second}". Sheet names must match exactly.', { - first: String(expected[0] ?? SOURCE_SHEETS[0]), - second: String(expected[1] ?? SOURCE_SHEETS[1]), + first: String(expected[0] ?? PROFILE_DEFAULTS.sheets[0]), + second: String(expected[1] ?? PROFILE_DEFAULTS.sheets[1]), }, ), } @@ -363,10 +394,17 @@ export function errorText(error) { 'stackiq', 'A sheet has more rows than the import can process.', ), - hint: t( - 'stackiq', - 'A source sheet may hold at most 10,000 rows. Split the export and import the parts one after the other.', - ), + hint: + Number(details.limit) > 0 + ? t( + 'stackiq', + 'A source sheet may hold at most {limit} rows. Split the export and import the parts one after the other.', + { limit: Number(details.limit).toLocaleString() }, + ) + : t( + 'stackiq', + 'Split the export and import the parts one after the other.', + ), } case 'MAPPING_UNAVAILABLE': return { diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index aa8718d9..bea8314b 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -86,7 +86,12 @@ {{ t( 'stackiq', - 'Excel workbook (.xlsx), at most 10 MB, with the sheet "Onbeh Applicaties CMDB" or "Beheerde Applicaties CMDB".', + 'Excel workbook (.xlsx) with the sheet "{first}" or "{second}". By default the file may be at most {size}.', + { + first: profileDefaults.sheets[0], + second: profileDefaults.sheets[1], + size: formatMegabytes(profileDefaults.maxFileBytes), + }, ) }}

@@ -291,7 +296,11 @@ {{ t( 'stackiq', - 'The sheets "Onbeh Applicaties CMDB" (applications without arranged maintenance) and "Beheerde Applicaties CMDB" (with arranged maintenance) are read; other sheets, including the "Invoer" sheets, are ignored.', + 'The sheets "{first}" (applications without arranged maintenance) and "{second}" (with arranged maintenance) are read; other sheets, including the "Invoer" sheets, are ignored.', + { + first: profileDefaults.sheets[0], + second: profileDefaults.sheets[1], + }, ) }} @@ -349,6 +358,7 @@ import { checkFile, cmdbProgressView, errorText, + formatMegabytes, importUrl, isKnownError, makeCmdbOperationId, @@ -356,6 +366,7 @@ import { normaliseError, outcomeLabel, OUTCOMES, + PROFILE_DEFAULTS, reportRows, } from '../../../utils/cmdbImport.js' @@ -401,6 +412,7 @@ export default { report: null, error: null, outcomeFilter: null, + profileDefaults: PROFILE_DEFAULTS, outcomeColors: { created: 'success', updated: 'info', @@ -605,6 +617,7 @@ export default { methods: { t, + formatMegabytes, moduleUrl, outcomeLabel, From 26133018552cd2705ef54a07fc67aaaa44b00c3c Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:48:32 +0200 Subject: [PATCH 25/57] fix(cmdb-import): recover the report when the import request is cut off The import is one long request. When it ended without an answer from the import (no response, or a 502/503/504 from a proxy), the page showed IMPORT_FAILED, although the server may still be importing or may have finished and kept the report with the operation's progress. On such an interruption the page now keeps reading the operation's progress and shows statistics.report once the operation is completed or cancelled. When the operation cannot be found or is still running when the page stops waiting, it shows IMPORT_INTERRUPTED ("the import may still be running") instead of a failure. An answer that carries a CMDB error code, such as a 503 MAPPING_UNAVAILABLE, is shown as before. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 9 ++ src/utils/cmdbImport.js | 117 ++++++++++++++++++++- src/views/settings/sections/CmdbImport.vue | 82 +++++++++++---- 3 files changed, 189 insertions(+), 19 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 876c5f4d..049eafaf 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -245,6 +245,15 @@ and the section shows the reason and the error code. | `NOT_CONFIGURED` | The stackiq register or its schemas cannot be found. | Run **Auto Configure** at the top of the stackiq admin settings. | | `IMPORT_FAILED` | Something unexpected went wrong. | The Nextcloud log has the details. | +**The connection was cut off.** The import runs in one request. When that +request ends without an answer from the import (the connection drops, or a +proxy gives up waiting with a 502, 503 or 504), the import may still be +running on the server. The section then keeps following the import's +progress and shows its report when it finishes. When it cannot find out, +it shows `IMPORT_INTERRUPTED`: wait a few minutes and check the +municipality's applications before importing again. Importing the same file +again creates no duplicates. + A message that you are not signed in, not an administrator, or that your session expired comes from Nextcloud itself: sign in again, use an administrator account, or reload the page. diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index 304fdc4d..4bcb582e 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -194,14 +194,24 @@ export function moduleUrl(uuid) { return generateUrl('/apps/stackiq/modules/{id}', { id: uuid }) } +/** + * HTTP statuses that mean the request was cut off before the import + * answered: no answer at all, or a proxy or gateway that gave up waiting. + * The import itself may still be running on the server. + */ +const INTERRUPTED_STATUSES = new Set([0, 502, 503, 504]) + /** * Turn a failed request into the server's error shape. * * Errors raised by Nextcloud itself (not signed in, not an admin, CSRF) come * without a CMDB error code, so they get one here from the HTTP status. + * `interrupted` is true when the request was cut off without an answer from + * the import (see INTERRUPTED_STATUSES); an answer with a CMDB error code, + * such as a 503 MAPPING_UNAVAILABLE, is the import's own and never counts. * * @param {object} error The axios error - * @return {{error: string, message: string, details: object, status: number}} The error + * @return {{error: string, message: string, details: object, status: number, interrupted: boolean}} The error * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-001-the-import-endpoint-shall-accept-only-a-bounded-xlsx-upload-from-a-nextcloud-admin */ export function normaliseError(error) { @@ -241,6 +251,102 @@ export function normaliseError(error) { ? body.details : {}, status, + interrupted: fromBody === '' && INTERRUPTED_STATUSES.has(status), + } +} + +/** + * Find out what became of an import whose request was cut off. + * + * The server keeps the operation's progress, and the finished report in its + * `statistics.report`, for an hour. This reads the operation until it is no + * longer running, waiting `intervalMs` between reads. + * + * @param {object} options The options + * @param {string} options.operationId The operation of the import + * @param {object} options.http An axios-like client with get + * @param {(progress: object) => void} [options.onProgress] Called with each snapshot + * @param {() => boolean} [options.shouldStop] Returns true when the page no longer waits + * @param {(ms: number) => Promise} [options.wait] Waits the given milliseconds, for tests + * @param {number} [options.intervalMs] Time between two reads + * @param {number} [options.timeoutMs] How long to wait for a running import + * @return {Promise<{state: string, report?: object, status?: number}>} `finished` with the report, `failed`, `unknown` (not found, or still running when the page stopped waiting) or `unreachable` (the progress could not be read either) + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-013-a-running-import-shall-report-its-progress-and-shall-stop-when-cancelled + */ +export async function followInterruptedImport({ + operationId, + http, + onProgress = () => {}, + shouldStop = () => false, + wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), + intervalMs = 2000, + timeoutMs = 30 * 60 * 1000, +}) { + const url = generateUrl('/apps/stackiq/api/progress/{operationId}', { + operationId, + }) + let waited = 0 + for (;;) { + let progress = null + try { + const response = await http.get(url) + progress = response?.data?.progress ?? null + } catch (error) { + if (!error?.response) { + return { state: 'unreachable' } + } + } + if (!progress || typeof progress !== 'object') { + return { state: 'unknown' } + } + onProgress(progress) + const report = progress.statistics?.report + if ( + (progress.status === 'completed' || progress.status === 'cancelled') + && report + && typeof report === 'object' + ) { + return { state: 'finished', report } + } + if (progress.status === 'failed') { + return { state: 'failed' } + } + if (progress.status !== 'running' || waited >= timeoutMs || shouldStop()) { + return { state: 'unknown' } + } + await wait(intervalMs) + waited += intervalMs + } +} + +/** + * The error the page shows for an interrupted import, once + * followInterruptedImport() has an outcome; null when the report was found. + * + * @param {{state: string}} outcome What followInterruptedImport() found + * @param {{error: string, status: number}} error The normalised error of the cut-off request + * @return {object|null} The error in the server's shape, or null + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-013-a-running-import-shall-report-its-progress-and-shall-stop-when-cancelled + */ +export function interruptedImportError(outcome, error) { + const base = { + message: '', + details: {}, + status: error?.status ?? 0, + interrupted: true, + } + switch (outcome?.state) { + case 'finished': + return null + case 'failed': + return { ...base, error: 'IMPORT_FAILED' } + case 'unreachable': + if ((error?.status ?? 0) === 0) { + return { ...base, error: 'NETWORK_ERROR' } + } + return { ...base, error: 'IMPORT_INTERRUPTED' } + default: + return { ...base, error: 'IMPORT_INTERRUPTED' } } } @@ -259,6 +365,7 @@ const KNOWN_ERRORS = new Set([ 'READER_UNAVAILABLE', 'NOT_CONFIGURED', 'OPERATION_NOT_FOUND', + 'IMPORT_INTERRUPTED', 'NOT_SIGNED_IN', 'NOT_ADMIN', 'CSRF_FAILED', @@ -458,6 +565,14 @@ export function errorText(error) { title: t('stackiq', 'The server could not be reached.'), hint: t('stackiq', 'Check the connection and try again.'), } + case 'IMPORT_INTERRUPTED': + return { + title: t('stackiq', 'The page got no answer from the import.'), + hint: t( + 'stackiq', + 'The connection was cut off before the import answered, so it may still be running or may have finished. Wait a few minutes and check the applications of the municipality before you import again. Importing the same file again creates no duplicates.', + ), + } case 'IMPORT_FAILED': default: return { diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index bea8314b..7e670133 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -358,8 +358,10 @@ import { checkFile, cmdbProgressView, errorText, + followInterruptedImport, formatMegabytes, importUrl, + interruptedImportError, isKnownError, makeCmdbOperationId, moduleUrl, @@ -409,6 +411,7 @@ export default { operationId: null, progress: null, stopProgressPolling: null, + unmounted: false, report: null, error: null, outcomeFilter: null, @@ -612,6 +615,7 @@ export default { * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-013-a-running-import-shall-report-its-progress-and-shall-stop-when-cancelled */ beforeUnmount() { + this.unmounted = true this.stopPolling() }, @@ -774,25 +778,14 @@ export default { operationId: this.operationId, }) const response = await axios.post(importUrl(), form) - this.report = response.data - this.outcomeFilter = this.outcomeFilterOptions[0] - // A created municipality is an existing one from now on: select it, - // so a second import goes to the same organisation (WCAG 3.3.7). - const imported = response.data?.municipality - if (imported?.uuid && this.municipality.isNew) { - const option = { - id: imported.uuid, - label: String(imported.name || this.municipality.label), - isNew: false, - } - this.municipalityOptions = [ - ...this.municipalityOptions, - option, - ].sort((a, b) => a.label.localeCompare(b.label)) - this.municipality = option - } + this.showReport(response.data) } catch (error) { - this.error = normaliseError(error) + const normalised = normaliseError(error) + if (normalised.interrupted) { + await this.recoverInterruptedImport(normalised) + } else { + this.error = normalised + } } finally { this.stopPolling() this.importing = false @@ -801,6 +794,59 @@ export default { } }, + /** + * Show a finished import's report. + * + * @param {object} report The report + * @return {void} + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-011-each-row-shall-be-processed-in-isolation-and-reported-with-its-outcome + */ + showReport(report) { + this.report = report + this.outcomeFilter = this.outcomeFilterOptions[0] + // A created municipality is an existing one from now on: select it, + // so a second import goes to the same organisation (WCAG 3.3.7). + const imported = report?.municipality + if (imported?.uuid && this.municipality?.isNew) { + const option = { + id: imported.uuid, + label: String(imported.name || this.municipality.label), + isNew: false, + } + this.municipalityOptions = [ + ...this.municipalityOptions, + option, + ].sort((a, b) => a.label.localeCompare(b.label)) + this.municipality = option + } + }, + + /** + * The request was cut off (no answer, or a gateway error) while the + * import may still be running: follow the operation on the server and + * show its report when it has one, or say that the outcome is unknown. + * + * @param {object} normalised The normalised error of the request + * @return {Promise} + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-013-a-running-import-shall-report-its-progress-and-shall-stop-when-cancelled + */ + async recoverInterruptedImport(normalised) { + this.stopPolling() + const outcome = await followInterruptedImport({ + operationId: this.operationId, + http: axios, + onProgress: (progress) => { + this.progress = progress + }, + shouldStop: () => this.unmounted, + }) + if (outcome.state === 'finished') { + this.showReport(outcome.report) + return + } + this.error = interruptedImportError(outcome, normalised) + }, + /** * Ask the server to stop the running import before its next row. * From 5c29d3a846461459626b76c1faf8b11fa74c478c Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:49:37 +0200 Subject: [PATCH 26/57] fix(cmdb-import): tell the admin whether Cancel import worked cancelImport() swallowed every error in an empty catch, and a successful cancel request changed nothing on the page but a disabled button. A Cancel pressed before the server registered the operation got a 404 and the import ran to the end without a word. A successful request now puts "Cancelling the import..." in the live region; a refused one re-enables the button and says why there, with its own sentence for OPERATION_NOT_FOUND. Co-Authored-By: Claude Opus 5.5 --- src/utils/cmdbImport.js | 19 +++++++++++++++++++ src/views/settings/sections/CmdbImport.vue | 17 +++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index 4bcb582e..c30175a9 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -585,6 +585,25 @@ export function errorText(error) { } } +/** + * What the page says when its request to cancel the import was refused. + * + * @param {{error: string, details?: object}} error The normalised error of the cancel request + * @return {string} The sentence + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-013-a-running-import-shall-report-its-progress-and-shall-stop-when-cancelled + */ +export function cancelFailureText(error) { + if (error?.error === 'OPERATION_NOT_FOUND') { + return t( + 'stackiq', + 'The import cannot be cancelled now: the server has not started its rows yet, or has already finished them. If the import keeps running, press Cancel import again in a moment.', + ) + } + return t('stackiq', 'The import could not be cancelled: {reason}', { + reason: errorText(error).title, + }) +} + /** * What the page shows for a progress snapshot of the running import. * diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index 7e670133..13a8ad4a 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -160,6 +160,9 @@

{{ progressView.detail }}

+

+ {{ cancelStatus }} +

Date: Mon, 5 Oct 2026 10:51:18 +0200 Subject: [PATCH 27/57] fix(cmdb-import): show the report rows a hundred at a time The report table rendered every row of the report, up to two full sheets of 10,000 rows, on the settings page. It now shows the first 100 rows with a "Show 100 more rows" button and a "Showing n of m rows" line; a new outcome filter or report starts at the first page again. The table leaves sorting to the page and only emits the sort the admin asked for, which nothing handled, so the sortable headers did not sort. The page now sorts the whole filtered row set on that event before it cuts it into pages. Co-Authored-By: Claude Opus 5.5 --- src/utils/cmdbImport.js | 40 ++++++++ src/views/settings/sections/CmdbImport.vue | 101 ++++++++++++++++++++- 2 files changed, 139 insertions(+), 2 deletions(-) diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index c30175a9..f5384e7a 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -637,6 +637,46 @@ export function cmdbProgressView(progress) { } } +/** + * How many report rows the table shows at first, and how many more each + * "Show more" adds. A report can hold up to two full sheets of rows. + */ +export const REPORT_PAGE_SIZE = 100 + +/** + * The report rows in the order of one column: numbers by value, text in the + * locale's order. Rows that tie keep their order in the report. + * + * The table emits the sort the admin asked for and leaves the sorting to the + * page, so the whole row set is sorted before it is cut into pages. + * + * @param {Array} rows The table rows + * @param {string|null} key The column key + * @param {string|null} order 'asc', 'desc', or null for the report's order + * @return {Array} The rows, sorted (a new array when sorted) + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ +export function sortReportRows(rows, key, order) { + if (!key || (order !== 'asc' && order !== 'desc')) { + return rows + } + const direction = order === 'desc' ? -1 : 1 + const collator = new Intl.Collator(undefined, { + numeric: true, + sensitivity: 'base', + }) + return rows + .map((row, index) => ({ row, index })) + .sort((a, b) => { + const compared = collator.compare( + String(a.row[key] ?? ''), + String(b.row[key] ?? ''), + ) + return compared !== 0 ? compared * direction : a.index - b.index + }) + .map((entry) => entry.row) +} + /** * The rows of the report as the table shows them. * diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index 13a8ad4a..9f6b1bbd 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -252,11 +252,14 @@ data-testid="cmdb-import-outcome-filter" /> + data-testid="cmdb-import-rows" + @sort="onSort"> +
+

+ {{ + t('stackiq', 'Showing {shown} of {total} rows.', { + shown: visibleRows.length, + total: sortedRows.length, + }) + }} +

+ + {{ + t('stackiq', 'Show {count} more rows', { + count: Math.min( + reportPageSize, + sortedRows.length - visibleRows.length, + ), + }) + }} + +
@@ -373,7 +402,9 @@ import { outcomeLabel, OUTCOMES, PROFILE_DEFAULTS, + REPORT_PAGE_SIZE, reportRows, + sortReportRows, } from '../../../utils/cmdbImport.js' /** @@ -420,6 +451,10 @@ export default { report: null, error: null, outcomeFilter: null, + sortKey: null, + sortOrder: null, + reportPageSize: REPORT_PAGE_SIZE, + visibleRowCount: REPORT_PAGE_SIZE, profileDefaults: PROFILE_DEFAULTS, outcomeColors: { created: 'success', @@ -582,6 +617,26 @@ export default { return rows.filter((row) => row.outcome === wanted) }, + /** + * The filtered rows in the order of the column the admin sorted on. + * + * @return {Array} The rows + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ + sortedRows() { + return sortReportRows(this.filteredRows, this.sortKey, this.sortOrder) + }, + + /** + * The rows the table renders: the first visibleRowCount sorted rows. + * + * @return {Array} The rows + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ + visibleRows() { + return this.sortedRows.slice(0, this.visibleRowCount) + }, + /** * The report table's columns. * @@ -604,6 +659,17 @@ export default { }, }, + watch: { + /** + * Another outcome filter starts at the first page again. + * + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ + outcomeFilter() { + this.visibleRowCount = REPORT_PAGE_SIZE + }, + }, + /** * Load the municipalities for the chooser. * @@ -811,6 +877,7 @@ export default { showReport(report) { this.report = report this.outcomeFilter = this.outcomeFilterOptions[0] + this.visibleRowCount = REPORT_PAGE_SIZE // A created municipality is an existing one from now on: select it, // so a second import goes to the same organisation (WCAG 3.3.7). const imported = report?.municipality @@ -882,6 +949,28 @@ export default { } }, + /** + * Keep the sort the admin chose on a column header. + * + * @param {{key: string|null, order: string|null}} sort The table's sort event + * @return {void} + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ + onSort({ key, order }) { + this.sortKey = key + this.sortOrder = order + }, + + /** + * Show the next page of report rows below the ones already shown. + * + * @return {void} + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ + showMoreRows() { + this.visibleRowCount += REPORT_PAGE_SIZE + }, + /** * Stop following the progress of the import. * @@ -1056,6 +1145,14 @@ export default { margin-bottom: 0.5rem; } +.cmdb-import__more { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem 1rem; + margin-top: 0.5rem; +} + .cmdb-import__module-link { color: var(--color-primary-element); text-decoration: underline; From eec4598a991ea5bb2e54e4e5558183ffda0926e3 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:52:09 +0200 Subject: [PATCH 28/57] fix(cmdb-import): fix the report heading levels and the file control's look The report's "Summary" and "Rows" headings were h4 directly under the settings section's h2; they are h3 now. The file control was styled as a large dashed drop zone, but the input takes no dropped files; it now looks like a plain button-like control. Co-Authored-By: Claude Opus 5.5 --- src/views/settings/sections/CmdbImport.vue | 29 +++++++++++----------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index 9f6b1bbd..ef52c983 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -72,7 +72,7 @@ for="cmdb-import-file" class="cmdb-import__file-label" :class="{ 'cmdb-import__file-label--disabled': importing }"> - + {{ selectedFile ? selectedFile.name @@ -209,9 +209,9 @@ }} -

+

{{ t('stackiq', 'Summary') }} -

+
  • -

    +

    {{ t('stackiq', 'Rows') }} -

    +
    Date: Mon, 5 Oct 2026 10:54:49 +0200 Subject: [PATCH 29/57] fix(cmdb-import): stop escaping placeholder values twice in the import texts translate() escapes placeholder values for HTML and sanitises the result by default, and Vue escapes the text it renders again, so a municipality or sheet name with an ampersand showed as "&" in the section. The CMDB import section and its helper build every translation with placeholders with AS_TEXT ({ escape: false, sanitize: false }); all of them are rendered as text, none through v-html. Co-Authored-By: Claude Opus 5.5 --- src/utils/cmdbImport.js | 43 ++++++++++--- src/views/settings/sections/CmdbImport.vue | 71 ++++++++++++++++------ 2 files changed, 87 insertions(+), 27 deletions(-) diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index f5384e7a..155dea7a 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -7,7 +7,8 @@ * * The routes, field names, report shape and error codes are fixed by * openspec/changes/cmdb-export-import/contract.md. The server stays the - * authority: every check here is repeated there. + * authority: every check here is repeated there. The texts are rendered by + * CmdbImport.vue as text, so translations with placeholders use AS_TEXT. * * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section */ @@ -32,6 +33,15 @@ export const PROFILE_DEFAULTS = Object.freeze({ sheets: Object.freeze(['Onbeh Applicaties CMDB', 'Beheerde Applicaties CMDB']), }) +/** + * The l10n options for a translation with placeholders that is rendered as + * text, through `{{ }}` or a text prop. By default translate() escapes the + * placeholder values for HTML and sanitises the result, and Vue escapes the + * text again, so a name like "Berkel & Rodenrijs" showed as + * "Berkel & Rodenrijs". Never use it for a string that goes into v-html. + */ +export const AS_TEXT = Object.freeze({ escape: false, sanitize: false }) + /** Every row outcome the report can carry, in display order. */ export const OUTCOMES = ['created', 'updated', 'unchanged', 'skipped', 'failed'] @@ -99,7 +109,7 @@ export function makeCmdbOperationId() { */ export function formatMegabytes(bytes) { const megabytes = Math.round((Number(bytes) / (1024 * 1024)) * 10) / 10 - return t('stackiq', '{size} MB', { size: String(megabytes) }) + return t('stackiq', '{size} MB', { size: String(megabytes) }, AS_TEXT) } /** @@ -417,6 +427,7 @@ export function errorText(error) { 'stackiq', 'The file is larger than {size}, the most the import accepts.', { size: formatMegabytes(details.maxBytes) }, + AS_TEXT, ) : t( 'stackiq', @@ -471,6 +482,7 @@ export function errorText(error) { first: String(expected[0] ?? PROFILE_DEFAULTS.sheets[0]), second: String(expected[1] ?? PROFILE_DEFAULTS.sheets[1]), }, + AS_TEXT, ), } } @@ -483,6 +495,7 @@ export function errorText(error) { sheet: String(details.sheet ?? ''), column: String(details.column ?? ''), }, + AS_TEXT, ), hint: t( 'stackiq', @@ -496,6 +509,7 @@ export function errorText(error) { 'stackiq', 'The sheet "{sheet}" has more rows than the import can process.', { sheet: String(details.sheet) }, + AS_TEXT, ) : t( 'stackiq', @@ -507,6 +521,7 @@ export function errorText(error) { 'stackiq', 'A source sheet may hold at most {limit} rows. Split the export and import the parts one after the other.', { limit: Number(details.limit).toLocaleString() }, + AS_TEXT, ) : t( 'stackiq', @@ -599,9 +614,14 @@ export function cancelFailureText(error) { 'The import cannot be cancelled now: the server has not started its rows yet, or has already finished them. If the import keeps running, press Cancel import again in a moment.', ) } - return t('stackiq', 'The import could not be cancelled: {reason}', { - reason: errorText(error).title, - }) + return t( + 'stackiq', + 'The import could not be cancelled: {reason}', + { + reason: errorText(error).title, + }, + AS_TEXT, + ) } /** @@ -629,10 +649,15 @@ export function cmdbProgressView(progress) { percentage, detail: total > 0 - ? t('stackiq', '{processed} of {total} rows processed', { - processed, - total, - }) + ? t( + 'stackiq', + '{processed} of {total} rows processed', + { + processed, + total, + }, + AS_TEXT, + ) : '', } } diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index ef52c983..412df999 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -39,6 +39,7 @@ 'stackiq', 'A new municipality "{name}" is created, unless one with this name already exists.', { name: municipality.label }, + asText, ) }}

    @@ -92,6 +93,7 @@ second: profileDefaults.sheets[1], size: formatMegabytes(profileDefaults.maxFileBytes), }, + asText, ) }}

    @@ -187,7 +189,12 @@

    {{ - t('stackiq', 'Error code: {code}', { code: errorView.code }) + t( + 'stackiq', + 'Error code: {code}', + { code: errorView.code }, + asText, + ) }}

    @@ -288,10 +295,15 @@ data-testid="cmdb-import-more">

    {{ - t('stackiq', 'Showing {shown} of {total} rows.', { - shown: visibleRows.length, - total: sortedRows.length, - }) + t( + 'stackiq', + 'Showing {shown} of {total} rows.', + { + shown: visibleRows.length, + total: sortedRows.length, + }, + asText, + ) }}

    {{ - t('stackiq', 'Show {count} more rows', { - count: Math.min( - reportPageSize, - sortedRows.length - visibleRows.length, - ), - }) + t( + 'stackiq', + 'Show {count} more rows', + { + count: Math.min( + reportPageSize, + sortedRows.length - visibleRows.length, + ), + }, + asText, + ) }}
    @@ -333,6 +350,7 @@ first: profileDefaults.sheets[0], second: profileDefaults.sheets[1], }, + asText, ) }}
  • @@ -385,6 +403,7 @@ import TrayArrowUp from 'vue-material-design-icons/TrayArrowUp.vue' import AlwaysVisibleSection from '../../../components/AlwaysVisibleSection.vue' import { startProgressPolling } from '../../../utils/archiMateImportProgress.js' import { + AS_TEXT, buildImportForm, cancelCmdbImport, cancelFailureText, @@ -411,7 +430,9 @@ import { * The "CMDB import" section of stackiq's admin settings. * * Rendered by the settings page (src/settings.js), never by the app's router. - * Every value from the report is rendered as text. + * Every value from the report is rendered as text. Translations with + * placeholders are built with AS_TEXT (no HTML escaping), because Vue escapes + * the text it renders; none of them may go into v-html. * * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section */ @@ -456,6 +477,7 @@ export default { reportPageSize: REPORT_PAGE_SIZE, visibleRowCount: REPORT_PAGE_SIZE, profileDefaults: PROFILE_DEFAULTS, + asText: AS_TEXT, outcomeColors: { created: 'success', updated: 'info', @@ -552,6 +574,7 @@ export default { 'stackiq', 'Import for {name} cancelled after {read} rows.', counts, + AS_TEXT, ) } if (this.report?.municipality?.created) { @@ -559,12 +582,14 @@ export default { 'stackiq', 'Import finished. The municipality {name} was created. {read} rows read: {created} created, {updated} updated, {unchanged} unchanged.', counts, + AS_TEXT, ) } return t( 'stackiq', 'Import for {name} finished. {read} rows read: {created} created, {updated} updated, {unchanged} unchanged.', counts, + AS_TEXT, ) }, @@ -798,13 +823,23 @@ export default { */ formatFileSize(bytes) { if (bytes < 1024 * 1024) { - return t('stackiq', '{size} KB', { - size: Math.max(1, Math.round((bytes || 0) / 1024)), - }) + return t( + 'stackiq', + '{size} KB', + { + size: Math.max(1, Math.round((bytes || 0) / 1024)), + }, + AS_TEXT, + ) } - return t('stackiq', '{size} MB', { - size: (bytes / (1024 * 1024)).toFixed(1), - }) + return t( + 'stackiq', + '{size} MB', + { + size: (bytes / (1024 * 1024)).toFixed(1), + }, + AS_TEXT, + ) }, /** From 5fd493285657df74d38a77b48e3379e7914fbb6d Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:56:08 +0200 Subject: [PATCH 30/57] feat(cmdb-import): give UPDATE_EXISTING_INVALID its own words on the page The import endpoint refuses an updateExisting value that is not an explicit true or false with 400 UPDATE_EXISTING_INVALID. The section now has a title and hint for that code instead of the generic failure text, and the admin docs list it with the other error codes. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 1 + src/utils/cmdbImport.js | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 049eafaf..cfc4a426 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -239,6 +239,7 @@ and the section shows the reason and the error code. | `NO_SOURCE_SHEET` | Neither `Onbeh Applicaties CMDB` nor `Beheerde Applicaties CMDB` is in the workbook. | Check the sheet names; they must match exactly. | | `MISSING_COLUMN` | A present CMDB sheet has no `APPID` or `Applicatie Naam` column. The message names the sheet and the column. | Add the column to that sheet. | | `TOO_MANY_ROWS` | A CMDB sheet has more rows with data than the row limit (10,000 by default). The message names the sheet and the limit. | Split the export and import the parts one after the other. | +| `UPDATE_EXISTING_INVALID` | The request's `updateExisting` was neither `true` nor `false`. | Not reachable from the section; reported for API callers. | | `MISSING_RECORDS_UNSUPPORTED` | The request asked to mark or remove records missing from the export. Only keeping them is supported. | Not reachable from the section; reported for API callers. | | `MAPPING_UNAVAILABLE` | OpenRegister's mapping engine is missing, or one of the mapping files is invalid. | Update OpenRegister. If you changed a mapping file, check it against the Nextcloud log. | | `READER_UNAVAILABLE` | The Excel reader that ships with OpenRegister cannot be loaded. | Make sure OpenRegister is installed and enabled. | diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index 155dea7a..a31e41ee 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -366,6 +366,7 @@ const KNOWN_ERRORS = new Set([ 'NOT_XLSX', 'FILE_TOO_LARGE', 'MISSING_RECORDS_UNSUPPORTED', + 'UPDATE_EXISTING_INVALID', 'MUNICIPALITY_REQUIRED', 'MUNICIPALITY_INVALID', 'NO_SOURCE_SHEET', @@ -446,6 +447,17 @@ export function errorText(error) { ), hint: '', } + case 'UPDATE_EXISTING_INVALID': + return { + title: t( + 'stackiq', + 'The choice for "Update existing records" was not understood.', + ), + hint: t( + 'stackiq', + 'It must be true or false. Reload the page and try again.', + ), + } case 'MUNICIPALITY_REQUIRED': return { title: t('stackiq', 'Choose a municipality first.'), From 3e03f28b38f03c616406e398012554ef1f8f8706 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 10:59:12 +0200 Subject: [PATCH 31/57] test(cmdb-import): unit-test the client side of the CMDB import cmdbImport.js had no unit tests, unlike the ArchiMate progress helper next to it. The new jest spec pins the operation id against the pattern the controller accepts, the name-only file check, the multipart body (existing and typed municipality, an explicit updateExisting), both endpoint URLs, the mapping of every HTTP status and server code in normaliseError and errorText (a code that loses its own words fails), the limits taken from the error details, unescaped placeholder values, the cancel failure texts, following an interrupted import to its report, and the report rows and their sort. Co-Authored-By: Claude Opus 5.5 --- src/utils/cmdbImport.spec.js | 489 +++++++++++++++++++++++++++++++++++ 1 file changed, 489 insertions(+) create mode 100644 src/utils/cmdbImport.spec.js diff --git a/src/utils/cmdbImport.spec.js b/src/utils/cmdbImport.spec.js new file mode 100644 index 00000000..685954e1 --- /dev/null +++ b/src/utils/cmdbImport.spec.js @@ -0,0 +1,489 @@ +// SPDX-License-Identifier: EUPL-1.2 +// SPDX-FileCopyrightText: 2026 Conduction B.V. + +/** + * Unit tests for the client side of the CMDB import: request building, the + * error codes the server can send and the words for each, and following an + * import whose request was cut off. + * + * @spec openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md#requirement-req-cmdb-014-the-admin-settings-shall-offer-a-cmdb-import-section + */ + +import { + buildImportForm, + cancelCmdbImport, + cancelFailureText, + checkFile, + cmdbProgressView, + errorText, + followInterruptedImport, + formatMegabytes, + importUrl, + interruptedImportError, + isKnownError, + makeCmdbOperationId, + normaliseError, + outcomeLabel, + OUTCOMES, + PROFILE_DEFAULTS, + reportRows, + sortReportRows, +} from './cmdbImport.js' + +/** The operation ids CmdbImportController accepts. */ +const SERVER_OPERATION_ID = /^cmdb-[A-Za-z0-9-]{8,64}$/ + +/** + * Every code the import endpoint, the cancel endpoint and Nextcloud can + * answer with, plus the ones the page derives itself. + */ +const SERVER_CODES = [ + 'NO_FILE_UPLOADED', + 'NOT_XLSX', + 'FILE_TOO_LARGE', + 'MISSING_RECORDS_UNSUPPORTED', + 'UPDATE_EXISTING_INVALID', + 'MUNICIPALITY_REQUIRED', + 'MUNICIPALITY_INVALID', + 'NO_SOURCE_SHEET', + 'MISSING_COLUMN', + 'TOO_MANY_ROWS', + 'MAPPING_UNAVAILABLE', + 'READER_UNAVAILABLE', + 'NOT_CONFIGURED', + 'OPERATION_NOT_FOUND', + 'IMPORT_INTERRUPTED', + 'NOT_SIGNED_IN', + 'NOT_ADMIN', + 'CSRF_FAILED', + 'NETWORK_ERROR', +] + +const GENERIC_TITLE = errorText({ error: 'SOMETHING_ELSE' }).title + +/** + * An axios error with a response. + * + * @param {number} status The HTTP status + * @param {*} data The response body + * @return {object} The error + */ +function httpError(status, data = '') { + return { response: { status, data } } +} + +describe('makeCmdbOperationId', () => { + it('makes an id the server accepts, different each time', () => { + const a = makeCmdbOperationId() + const b = makeCmdbOperationId() + expect(a).toMatch(SERVER_OPERATION_ID) + expect(b).toMatch(SERVER_OPERATION_ID) + expect(a).not.toBe(b) + }) +}) + +describe('checkFile', () => { + it('asks for a file when none is chosen', () => { + expect(checkFile(null)).toEqual({ error: 'NO_FILE_UPLOADED', details: {} }) + }) + + it('refuses a file that is not named .xlsx', () => { + expect(checkFile({ name: 'export.csv', size: 10 }).error).toBe('NOT_XLSX') + expect(checkFile({ name: 'export.xlsm', size: 10 }).error).toBe('NOT_XLSX') + }) + + it('leaves the size limit to the server, which may allow more than the default', () => { + expect( + checkFile({ + name: 'Export.XLSX', + size: PROFILE_DEFAULTS.maxFileBytes * 3, + }), + ).toBeNull() + }) +}) + +describe('buildImportForm', () => { + const file = new File(['x'], 'export.xlsx') + + it('sends an existing municipality by uuid', () => { + const form = buildImportForm({ + file, + municipality: { uuid: 'uuid-1', name: 'Tilburg' }, + updateExisting: true, + operationId: 'cmdb-abcdefgh', + }) + expect(form.get('cmdbFile')).toBeInstanceOf(File) + expect(form.get('municipalityUuid')).toBe('uuid-1') + expect(form.has('municipalityName')).toBe(false) + expect(form.get('updateExisting')).toBe('true') + expect(form.get('missingRecords')).toBe('keep') + expect(form.get('operationId')).toBe('cmdb-abcdefgh') + }) + + it('sends a typed new municipality by name, and updateExisting as an explicit false', () => { + const form = buildImportForm({ + file, + municipality: { uuid: null, name: 'Berkel & Rodenrijs' }, + updateExisting: false, + operationId: 'cmdb-abcdefgh', + }) + expect(form.has('municipalityUuid')).toBe(false) + expect(form.get('municipalityName')).toBe('Berkel & Rodenrijs') + expect(form.get('updateExisting')).toBe('false') + }) +}) + +describe('the endpoints', () => { + it('posts the import to the CMDB import route', () => { + expect(importUrl()).toContain('/apps/stackiq/api/cmdb-import') + }) + + it('posts a cancel to the route of the operation', async () => { + const post = jest.fn().mockResolvedValue({ data: { cancelled: true } }) + await expect( + cancelCmdbImport({ operationId: 'cmdb-abcdefgh', http: { post } }), + ).resolves.toEqual({ cancelled: true }) + expect(post.mock.calls[0][0]).toContain( + '/apps/stackiq/api/cmdb-import/cmdb-abcdefgh/cancel', + ) + }) +}) + +describe('normaliseError', () => { + it('keeps the code, message and details the server sent', () => { + const error = normaliseError( + httpError(422, { + error: 'MISSING_COLUMN', + message: 'Sheet "X" has no column "APPID".', + details: { sheet: 'X', column: 'APPID' }, + }), + ) + expect(error).toEqual({ + error: 'MISSING_COLUMN', + message: 'Sheet "X" has no column "APPID".', + details: { sheet: 'X', column: 'APPID' }, + status: 422, + interrupted: false, + }) + }) + + it.each([ + [401, 'NOT_SIGNED_IN'], + [403, 'NOT_ADMIN'], + [412, 'CSRF_FAILED'], + [413, 'FILE_TOO_LARGE'], + [500, 'IMPORT_FAILED'], + ])('gives a %i without a CMDB code the code %s', (status, code) => { + const error = normaliseError(httpError(status, 'Error')) + expect(error.error).toBe(code) + expect(error.details).toEqual({}) + expect(error.interrupted).toBe(false) + }) + + it('marks a request that got no answer at all as interrupted', () => { + const error = normaliseError({ message: 'Network Error' }) + expect(error.error).toBe('NETWORK_ERROR') + expect(error.status).toBe(0) + expect(error.interrupted).toBe(true) + }) + + it.each([502, 503, 504])( + 'marks a %i from a gateway, without a CMDB code, as interrupted', + (status) => { + expect( + normaliseError(httpError(status, 'Gateway')) + .interrupted, + ).toBe(true) + }, + ) + + it("never counts the import's own 503 answer as interrupted", () => { + const error = normaliseError( + httpError(503, { error: 'MAPPING_UNAVAILABLE', message: '' }), + ) + expect(error.error).toBe('MAPPING_UNAVAILABLE') + expect(error.interrupted).toBe(false) + }) +}) + +describe('errorText', () => { + it.each(SERVER_CODES)('has its own words for %s', (code) => { + expect(isKnownError(code)).toBe(true) + const words = errorText({ error: code, details: {} }) + expect(words.title).not.toBe('') + expect(words.title).not.toBe(GENERIC_TITLE) + }) + + it('falls back to the generic text, and shows the server message, for an unknown code', () => { + expect(isKnownError('IMPORT_FAILED')).toBe(false) + expect(isKnownError('SOMETHING_NEW')).toBe(false) + expect(errorText({ error: 'IMPORT_FAILED' }).title).toBe(GENERIC_TITLE) + }) + + it('names the upload limit the server applied', () => { + expect( + errorText({ + error: 'FILE_TOO_LARGE', + details: { maxBytes: 20 * 1024 * 1024 }, + }).title, + ).toContain('20 MB') + expect(errorText({ error: 'FILE_TOO_LARGE', details: {} }).title).toBe( + 'The file is larger than the server accepts.', + ) + }) + + it('names the row limit the server applied', () => { + const words = errorText({ + error: 'TOO_MANY_ROWS', + details: { sheet: 'Beheerde Applicaties CMDB', limit: 2500 }, + }) + expect(words.title).toContain('Beheerde Applicaties CMDB') + expect(words.hint).toMatch(/at most 2[,.]?500 rows/) + expect(errorText({ error: 'TOO_MANY_ROWS', details: {} }).hint).not.toMatch( + /\d/, + ) + }) + + it('names the sheets the server expected, and the defaults without them', () => { + expect( + errorText({ + error: 'NO_SOURCE_SHEET', + details: { expected: ['Blad A', 'Blad B'] }, + }).hint, + ).toContain('"Blad A" or "Blad B"') + expect(errorText({ error: 'NO_SOURCE_SHEET', details: {} }).hint).toContain( + PROFILE_DEFAULTS.sheets[1], + ) + }) + + it('puts names from the details in as they are, for Vue to escape once', () => { + const words = errorText({ + error: 'MISSING_COLUMN', + details: { sheet: 'Apps & Co ', column: 'APPID' }, + }) + expect(words.title).toBe('The sheet "Apps & Co " has no column "APPID".') + }) +}) + +describe('formatMegabytes', () => { + it('shows whole and fractional megabytes', () => { + expect(formatMegabytes(10 * 1024 * 1024)).toBe('10 MB') + expect(formatMegabytes(12.5 * 1024 * 1024)).toBe('12.5 MB') + }) +}) + +describe('cancelFailureText', () => { + it('explains a cancel the server cannot match to a running import', () => { + const error = normaliseError( + httpError(404, { error: 'OPERATION_NOT_FOUND', message: '' }), + ) + expect(cancelFailureText(error)).toContain( + 'The import cannot be cancelled now', + ) + }) + + it('names the reason for any other refusal', () => { + expect(cancelFailureText(normaliseError(httpError(403, '')))).toBe( + 'The import could not be cancelled: Only Nextcloud administrators can import a CMDB export.', + ) + }) +}) + +describe('followInterruptedImport', () => { + const report = { summary: { rowsRead: 2 }, rows: [], cancelled: false } + + it('returns the report a completed operation kept', async () => { + const get = jest.fn().mockResolvedValue({ + data: { progress: { status: 'completed', statistics: { report } } }, + }) + const outcome = await followInterruptedImport({ + operationId: 'cmdb-abcdefgh', + http: { get }, + }) + expect(outcome).toEqual({ state: 'finished', report }) + expect(get.mock.calls[0][0]).toContain( + '/apps/stackiq/api/progress/cmdb-abcdefgh', + ) + }) + + it('waits while the operation runs, then returns its report', async () => { + const get = jest + .fn() + .mockResolvedValueOnce({ + data: { progress: { status: 'running', processed_items: 1 } }, + }) + .mockResolvedValueOnce({ + data: { progress: { status: 'cancelled', statistics: { report } } }, + }) + const wait = jest.fn().mockResolvedValue() + const seen = [] + const outcome = await followInterruptedImport({ + operationId: 'cmdb-abcdefgh', + http: { get }, + wait, + onProgress: (progress) => seen.push(progress.status), + }) + expect(outcome.state).toBe('finished') + expect(seen).toEqual(['running', 'cancelled']) + expect(wait).toHaveBeenCalledWith(2000) + }) + + it('reports a failed operation as failed', async () => { + const get = jest + .fn() + .mockResolvedValue({ data: { progress: { status: 'failed' } } }) + await expect( + followInterruptedImport({ operationId: 'cmdb-abcdefgh', http: { get } }), + ).resolves.toEqual({ state: 'failed' }) + }) + + it('does not know the outcome when the operation cannot be found', async () => { + const get = jest + .fn() + .mockRejectedValue(httpError(404, { error: 'OPERATION_NOT_FOUND' })) + await expect( + followInterruptedImport({ operationId: 'cmdb-abcdefgh', http: { get } }), + ).resolves.toEqual({ state: 'unknown' }) + }) + + it('says when the progress cannot be read either', async () => { + const get = jest.fn().mockRejectedValue({ message: 'Network Error' }) + await expect( + followInterruptedImport({ operationId: 'cmdb-abcdefgh', http: { get } }), + ).resolves.toEqual({ state: 'unreachable' }) + }) + + it('stops waiting for a running import after the timeout', async () => { + const get = jest + .fn() + .mockResolvedValue({ data: { progress: { status: 'running' } } }) + const outcome = await followInterruptedImport({ + operationId: 'cmdb-abcdefgh', + http: { get }, + wait: () => Promise.resolve(), + intervalMs: 10, + timeoutMs: 30, + }) + expect(outcome).toEqual({ state: 'unknown' }) + expect(get).toHaveBeenCalledTimes(4) + }) + + it('stops waiting when the page is left', async () => { + const get = jest + .fn() + .mockResolvedValue({ data: { progress: { status: 'running' } } }) + const outcome = await followInterruptedImport({ + operationId: 'cmdb-abcdefgh', + http: { get }, + shouldStop: () => true, + }) + expect(outcome).toEqual({ state: 'unknown' }) + expect(get).toHaveBeenCalledTimes(1) + }) +}) + +describe('interruptedImportError', () => { + const gateway = { error: 'IMPORT_FAILED', status: 504 } + const offline = { error: 'NETWORK_ERROR', status: 0 } + + it('shows the report, not an error, when it was found', () => { + expect(interruptedImportError({ state: 'finished' }, gateway)).toBeNull() + }) + + it('says the import may still be running when its outcome is unknown', () => { + expect(interruptedImportError({ state: 'unknown' }, gateway).error).toBe( + 'IMPORT_INTERRUPTED', + ) + expect(interruptedImportError({ state: 'unknown' }, offline).error).toBe( + 'IMPORT_INTERRUPTED', + ) + expect(interruptedImportError({ state: 'unreachable' }, gateway).error).toBe( + 'IMPORT_INTERRUPTED', + ) + }) + + it('keeps "server not reached" when nothing reached the server', () => { + expect(interruptedImportError({ state: 'unreachable' }, offline).error).toBe( + 'NETWORK_ERROR', + ) + }) + + it('reports a failed operation as a failed import', () => { + expect(interruptedImportError({ state: 'failed' }, gateway).error).toBe( + 'IMPORT_FAILED', + ) + }) +}) + +describe('cmdbProgressView', () => { + it('computes the percentage from the row counts', () => { + expect( + cmdbProgressView({ processed_items: 1, total_items: 4, percentage: 90 }), + ).toEqual({ percentage: 25, detail: '1 of 4 rows processed' }) + }) + + it('shows nothing before any progress', () => { + expect(cmdbProgressView(null)).toBeNull() + }) +}) + +describe('the report table', () => { + it('has words for every outcome', () => { + for (const outcome of OUTCOMES) { + expect(outcomeLabel(outcome)).not.toBe(outcome) + } + }) + + it('turns report rows into table rows with their reasons and warnings', () => { + expect( + reportRows([ + { + sheet: 'Beheerde Applicaties CMDB', + row: 2, + appId: 2, + name: 'Mailen', + outcome: 'skipped', + reasons: ['exists'], + warnings: ['Column "Vendor": empty'], + moduleUuid: 'm-1', + }, + ]), + ).toEqual([ + { + key: 'Beheerde Applicaties CMDB:2:0', + sheet: 'Beheerde Applicaties CMDB', + row: 2, + appId: '2', + name: 'Mailen', + outcome: 'skipped', + notes: 'exists; Column "Vendor": empty', + moduleUuid: 'm-1', + }, + ]) + expect(reportRows(null)).toEqual([]) + }) + + it('sorts numbers by value and keeps the report order for ties', () => { + const rows = [ + { key: 'a', row: 10, sheet: 'B' }, + { key: 'b', row: 9, sheet: 'A' }, + { key: 'c', row: 100, sheet: 'B' }, + ] + expect(sortReportRows(rows, 'row', 'asc').map((r) => r.key)).toEqual([ + 'b', + 'a', + 'c', + ]) + expect(sortReportRows(rows, 'row', 'desc').map((r) => r.key)).toEqual([ + 'c', + 'a', + 'b', + ]) + expect(sortReportRows(rows, 'sheet', 'asc').map((r) => r.key)).toEqual([ + 'b', + 'a', + 'c', + ]) + expect(sortReportRows(rows, null, null)).toBe(rows) + }) +}) From 6741b9875345a51c548d56a58b023302d7b50147 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 11:04:16 +0200 Subject: [PATCH 32/57] fix(cmdb-import): map FIELD_INVALID and UPLOAD_FAILED instead of UPDATE_EXISTING_INVALID The import endpoint answers a malformed form field with 400 FIELD_INVALID (details: the field, and the accepted values where the field has a fixed set, such as updateExisting) and a file it could not store with 500 UPLOAD_FAILED; there is no UPDATE_EXISTING_INVALID code. The section now has its own words for both, naming the field and the accepted values, and the admin docs list them. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 3 ++- src/utils/cmdbImport.js | 28 ++++++++++++++++++++++++---- src/utils/cmdbImport.spec.js | 18 +++++++++++++++++- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index cfc4a426..6c5a16e2 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -239,7 +239,8 @@ and the section shows the reason and the error code. | `NO_SOURCE_SHEET` | Neither `Onbeh Applicaties CMDB` nor `Beheerde Applicaties CMDB` is in the workbook. | Check the sheet names; they must match exactly. | | `MISSING_COLUMN` | A present CMDB sheet has no `APPID` or `Applicatie Naam` column. The message names the sheet and the column. | Add the column to that sheet. | | `TOO_MANY_ROWS` | A CMDB sheet has more rows with data than the row limit (10,000 by default). The message names the sheet and the limit. | Split the export and import the parts one after the other. | -| `UPDATE_EXISTING_INVALID` | The request's `updateExisting` was neither `true` nor `false`. | Not reachable from the section; reported for API callers. | +| `FIELD_INVALID` | A form field of the request has a value the import does not accept, for example an `updateExisting` that is neither `true` nor `false`. The message names the field. | Not reachable from the section; reported for API callers. | +| `UPLOAD_FAILED` | The file reached the server but could not be stored there. | Try again; the Nextcloud log has the details. | | `MISSING_RECORDS_UNSUPPORTED` | The request asked to mark or remove records missing from the export. Only keeping them is supported. | Not reachable from the section; reported for API callers. | | `MAPPING_UNAVAILABLE` | OpenRegister's mapping engine is missing, or one of the mapping files is invalid. | Update OpenRegister. If you changed a mapping file, check it against the Nextcloud log. | | `READER_UNAVAILABLE` | The Excel reader that ships with OpenRegister cannot be loaded. | Make sure OpenRegister is installed and enabled. | diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index a31e41ee..0a24aed1 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -366,7 +366,8 @@ const KNOWN_ERRORS = new Set([ 'NOT_XLSX', 'FILE_TOO_LARGE', 'MISSING_RECORDS_UNSUPPORTED', - 'UPDATE_EXISTING_INVALID', + 'FIELD_INVALID', + 'UPLOAD_FAILED', 'MUNICIPALITY_REQUIRED', 'MUNICIPALITY_INVALID', 'NO_SOURCE_SHEET', @@ -447,15 +448,34 @@ export function errorText(error) { ), hint: '', } - case 'UPDATE_EXISTING_INVALID': + case 'FIELD_INVALID': { + const accepted = Array.isArray(details.accepted) + ? details.accepted.map((value) => String(value)) + : [] return { title: t( 'stackiq', - 'The choice for "Update existing records" was not understood.', + 'The request field "{field}" has a value the import does not accept.', + { field: String(details.field ?? '') }, + AS_TEXT, ), + hint: + accepted.length > 0 + ? t( + 'stackiq', + 'Accepted values: {accepted}. Reload the page and try again.', + { accepted: accepted.join(', ') }, + AS_TEXT, + ) + : t('stackiq', 'Reload the page and try again.'), + } + } + case 'UPLOAD_FAILED': + return { + title: t('stackiq', 'The server could not store the uploaded file.'), hint: t( 'stackiq', - 'It must be true or false. Reload the page and try again.', + 'Try again. If it keeps failing, the Nextcloud log has the details; check the free space and the upload settings of the server.', ), } case 'MUNICIPALITY_REQUIRED': diff --git a/src/utils/cmdbImport.spec.js b/src/utils/cmdbImport.spec.js index 685954e1..bccfece0 100644 --- a/src/utils/cmdbImport.spec.js +++ b/src/utils/cmdbImport.spec.js @@ -42,7 +42,8 @@ const SERVER_CODES = [ 'NOT_XLSX', 'FILE_TOO_LARGE', 'MISSING_RECORDS_UNSUPPORTED', - 'UPDATE_EXISTING_INVALID', + 'FIELD_INVALID', + 'UPLOAD_FAILED', 'MUNICIPALITY_REQUIRED', 'MUNICIPALITY_INVALID', 'NO_SOURCE_SHEET', @@ -220,6 +221,21 @@ describe('errorText', () => { expect(errorText({ error: 'IMPORT_FAILED' }).title).toBe(GENERIC_TITLE) }) + it('names the field and the values it accepts', () => { + const words = errorText({ + error: 'FIELD_INVALID', + details: { field: 'updateExisting', accepted: ['true', 'false'] }, + }) + expect(words.title).toContain('"updateExisting"') + expect(words.hint).toContain('Accepted values: true, false.') + expect( + errorText({ + error: 'FIELD_INVALID', + details: { field: 'municipalityUuid' }, + }).hint, + ).toBe('Reload the page and try again.') + }) + it('names the upload limit the server applied', () => { expect( errorText({ From 4bc205a3f34c84237a29089c32790db885c4e317 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 11:05:31 +0200 Subject: [PATCH 33/57] docs(cmdb-import): the groups delegated stackiq's admin settings may import too Both CMDB import routes now require the stackiq admin setting (AuthorizedAdminSetting) rather than Nextcloud admin rights alone, so members of a group an admin delegated those settings to can import and cancel as well. REQ-CMDB-001 and REQ-CMDB-013 in the change's delta spec, the capability spec, the admin docs and the NOT_ADMIN text on the page now say so; the non-admin scenario names the controller tests and the Newman requests that pin the rule. Co-Authored-By: Claude Opus 5.5 --- docs/features/cmdb-import.md | 16 +++++++++------- .../specs/cmdb-export-import/spec.md | 12 ++++++------ openspec/specs/cmdb-export-import/spec.md | 6 ++++-- src/utils/cmdbImport.js | 7 +++++-- src/utils/cmdbImport.spec.js | 2 +- 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/docs/features/cmdb-import.md b/docs/features/cmdb-import.md index 6c5a16e2..9dc94ffa 100644 --- a/docs/features/cmdb-import.md +++ b/docs/features/cmdb-import.md @@ -23,10 +23,11 @@ Specification: [`openspec/changes/cmdb-export-import/`](https://github.com/Condu ## Who can import -Only Nextcloud administrators. Members of the `software-catalog-admins` group -who are not Nextcloud administrators cannot import. The section is part of -stackiq's admin settings, under **Administration settings → Stackiq → -CMDB import**. +Nextcloud administrators, and members of the groups an administrator +delegated stackiq's admin settings to (**Administration settings → +Administration privileges**). Membership of `software-catalog-admins` alone +is not enough. The section is part of stackiq's admin settings, under +**Administration settings → Stackiq → CMDB import**. ## Before you start @@ -256,9 +257,10 @@ it shows `IMPORT_INTERRUPTED`: wait a few minutes and check the municipality's applications before importing again. Importing the same file again creates no duplicates. -A message that you are not signed in, not an administrator, or that your -session expired comes from Nextcloud itself: sign in again, use an -administrator account, or reload the page. +A message that you are not signed in, may not use stackiq's admin settings, +or that your session expired comes from Nextcloud itself: sign in again, use +an account that may (see [Who can import](#who-can-import)), or reload the +page. ## Limits diff --git a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md index 96e818c0..4bed7dd7 100644 --- a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md +++ b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md @@ -7,7 +7,7 @@ ## Purpose -A Nextcloud admin imports a TOPdesk CMDB export (xlsx) into stackiq for one municipality. Every application row of the export's two CMDB sheets ("Onbeh Applicaties CMDB", applications without arranged maintenance, and "Beheerde Applicaties CMDB", with arranged maintenance) becomes, or updates, a `module` (schema:SoftwareApplication) with its vendor `organization` (schema:Organization), a `usage` that links the application to the municipality, and a `contactPerson` (schema:Person) for its owner, which is never publicly readable. All data is stored as OpenRegister objects (ADR-001). The column-to-field mapping is declarative JSON executed by OpenRegister's mapping engine (ADR-011, ADR-031), so the import can be repeated with a newer export without creating duplicates. OpenCatalogi lists the imported applications, and Portaliq shows them to the municipality. +A Nextcloud admin, or a member of a group an admin delegated stackiq's admin settings to, imports a TOPdesk CMDB export (xlsx) into stackiq for one municipality. Every application row of the export's two CMDB sheets ("Onbeh Applicaties CMDB", applications without arranged maintenance, and "Beheerde Applicaties CMDB", with arranged maintenance) becomes, or updates, a `module` (schema:SoftwareApplication) with its vendor `organization` (schema:Organization), a `usage` that links the application to the municipality, and a `contactPerson` (schema:Person) for its owner, which is never publicly readable. All data is stored as OpenRegister objects (ADR-001). The column-to-field mapping is declarative JSON executed by OpenRegister's mapping engine (ADR-011, ADR-031), so the import can be repeated with a newer export without creating duplicates. OpenCatalogi lists the imported applications, and Portaliq shows them to the municipality. Nextcloud OCP interfaces used: `OCP\IRequest` (multipart upload), `OCP\IUserSession` and `OCP\IGroupManager` (admin check), `OCP\Contacts\IManager` (owner identity, through `StackiqContactSyncService`), `OCP\ICacheFactory` (progress, through `ProgressTracker`), `OCP\IL10N` (messages). OpenRegister: `OCA\OpenRegister\Contract\ObjectServiceInterface` for every read and write. @@ -15,7 +15,7 @@ Nextcloud OCP interfaces used: `OCP\IRequest` (multipart upload), `OCP\IUserSess ### Requirement: REQ-CMDB-001 The import endpoint SHALL accept only a bounded xlsx upload from a Nextcloud admin -`POST /api/cmdb-import` SHALL be reachable only by Nextcloud admins and SHALL require Nextcloud's CSRF token. The endpoint SHALL NOT carry `#[NoAdminRequired]` or `#[NoCSRFRequired]`. It SHALL reject the upload before any parsing when the file is larger than the configured maximum (default 10 MB), when its name does not end in `.xlsx`, or when its content is not a ZIP package containing `xl/workbook.xml`. Macro-enabled (`.xlsm`), legacy (`.xls`) and CSV files SHALL be rejected. No object SHALL be written in any of these cases. +`POST /api/cmdb-import` SHALL be reachable only by Nextcloud admins and by members of the groups an admin delegated stackiq's admin settings to (`#[AuthorizedAdminSetting(StackiqAdmin)]`), and SHALL require Nextcloud's CSRF token. The endpoint SHALL NOT carry `#[NoAdminRequired]` or `#[NoCSRFRequired]`. It SHALL reject the upload before any parsing when the file is larger than the configured maximum (default 10 MB), when its name does not end in `.xlsx`, or when its content is not a ZIP package containing `xl/workbook.xml`. Macro-enabled (`.xlsm`), legacy (`.xls`) and CSV files SHALL be rejected. No object SHALL be written in any of these cases. #### Scenario: A file that is not xlsx is rejected @e2e tests/e2e/spec-coverage/cmdb-import.spec.ts @@ -33,10 +33,10 @@ Nextcloud OCP interfaces used: `OCP\IRequest` (multipart upload), `OCP\IUserSess - **THEN** the endpoint SHALL answer 413 with error `FILE_TOO_LARGE` - **AND** the workbook reader SHALL NOT be invoked -#### Scenario: A user who is not a Nextcloud admin cannot import -@e2e exclude Authorisation rule; tests/Unit/Controller/CmdbImportControllerTest.php asserts the method has no NoAdminRequired attribute, and the Newman collection asserts 403 for a non-admin user. +#### Scenario: A user without the stackiq admin settings cannot import +@e2e exclude Authorisation rule enforced by Nextcloud's middleware; tests/Unit/Controller/CmdbImportControllerTest.php (testBothRoutesRequireTheStackiqAdminSetting, testNeitherRouteDeclaresAnExemption) asserts both routes require the StackiqAdmin setting and declare no exemption, and the Newman collection asserts 403 for a user who is not an admin and for a software-catalog-admins member. -- **GIVEN** a signed-in user who is not a Nextcloud admin, including a member of `software-catalog-admins` +- **GIVEN** a signed-in user who is neither a Nextcloud admin nor a member of a group delegated stackiq's admin settings, for example a member of `software-catalog-admins` only - **WHEN** they post an export to `POST /api/cmdb-import` - **THEN** Nextcloud SHALL answer 403 - **AND** no object SHALL be written @@ -360,7 +360,7 @@ The import SHALL accept `missingRecords` with the value `keep`, which is also th ### Requirement: REQ-CMDB-013 A running import SHALL report its progress and SHALL stop when cancelled -The import SHALL run as a `ProgressTracker` operation of type `cmdb_import` under the `operationId` the client sends, and SHALL update the processed row count after every row, readable through the existing `GET /api/progress/{operationId}`. `POST /api/cmdb-import/{operationId}/cancel`, admin-only and CSRF-protected, SHALL request cancellation. The service SHALL check for cancellation between rows, SHALL keep the rows already processed, and SHALL return the report with `cancelled: true`. The final report SHALL also be stored with the operation, so it can be read again within the tracker's lifetime. +The import SHALL run as a `ProgressTracker` operation of type `cmdb_import` under the `operationId` the client sends, and SHALL update the processed row count after every row, readable through the existing `GET /api/progress/{operationId}`. `POST /api/cmdb-import/{operationId}/cancel`, open to the same users as the import and CSRF-protected, SHALL request cancellation. The service SHALL check for cancellation between rows, SHALL keep the rows already processed, and SHALL return the report with `cancelled: true`. The final report SHALL also be stored with the operation, so it can be read again within the tracker's lifetime. #### Scenario: The admin follows and cancels a running import @e2e exclude Timing-dependent with a two-row fixture; tests/Unit/Service/CmdbExportImportServiceTest.php requests cancellation after row 1 of three and asserts one processed row and cancelled true. diff --git a/openspec/specs/cmdb-export-import/spec.md b/openspec/specs/cmdb-export-import/spec.md index 0ccc1f53..8b23410f 100644 --- a/openspec/specs/cmdb-export-import/spec.md +++ b/openspec/specs/cmdb-export-import/spec.md @@ -13,7 +13,8 @@ built_by: openspec/changes/cmdb-export-import ## Purpose -A Nextcloud admin imports a TOPdesk CMDB export (xlsx) into stackiq for one +A Nextcloud admin, or a member of a group an admin delegated stackiq's admin +settings to, imports a TOPdesk CMDB export (xlsx) into stackiq for one municipality. Every application row becomes, or updates, a `module` with its manufacturer `organization`, a `usage` that links it to the municipality, and `contactPerson` objects for its owners, all stored as OpenRegister objects @@ -31,7 +32,8 @@ umbrella requirement below anchors the capability until then. ### Requirement: Stackiq imports a TOPdesk CMDB export into OpenRegister objects (REQ-CMDB-000) -Stackiq MUST offer Nextcloud admins one import path for a TOPdesk CMDB export +Stackiq MUST offer Nextcloud admins, and the groups delegated stackiq's admin +settings, one import path for a TOPdesk CMDB export (xlsx) that writes only OpenRegister objects in the `stackiq` register (`module`, `organization`, `usage`, `contactPerson`), with no app-local table, and that matches rows on the TOPdesk APPID so that a repeated import diff --git a/src/utils/cmdbImport.js b/src/utils/cmdbImport.js index 0a24aed1..c144deca 100644 --- a/src/utils/cmdbImport.js +++ b/src/utils/cmdbImport.js @@ -598,9 +598,12 @@ export function errorText(error) { return { title: t( 'stackiq', - 'Only Nextcloud administrators can import a CMDB export.', + "You may not use stackiq's admin settings, so you cannot import a CMDB export.", + ), + hint: t( + 'stackiq', + "Ask a Nextcloud administrator to run the import, or to delegate stackiq's admin settings to your group.", ), - hint: '', } case 'CSRF_FAILED': return { diff --git a/src/utils/cmdbImport.spec.js b/src/utils/cmdbImport.spec.js index bccfece0..8f2a9590 100644 --- a/src/utils/cmdbImport.spec.js +++ b/src/utils/cmdbImport.spec.js @@ -300,7 +300,7 @@ describe('cancelFailureText', () => { it('names the reason for any other refusal', () => { expect(cancelFailureText(normaliseError(httpError(403, '')))).toBe( - 'The import could not be cancelled: Only Nextcloud administrators can import a CMDB export.', + "The import could not be cancelled: You may not use stackiq's admin settings, so you cannot import a CMDB export.", ) }) }) From a15a6b384f23df8f37623ffdf2522396cebc3110 Mon Sep 17 00:00:00 2001 From: WilcoLouwerse Date: Mon, 5 Oct 2026 11:10:38 +0200 Subject: [PATCH 34/57] test(cmdb-import): cover the typed municipality, cancel and refusal in e2e The Playwright file asserted the chosen municipality through vue-select's .vs__selected class and the report cells by position, and turned a missing fixture or an empty first run into a skip, which reads as no evidence rather than a pass. It now uses the section's own data-testid hooks (new for the row number and APPID cells) and fails instead. Three scenarios that were excluded get browser coverage: a typed new municipality is created once, also when the same name is imported again; a cancel the server cannot match yet is reported and the import still finishes, and the admin follows and cancels a running import (stubbed server answers, since a two-row import finishes before a cancel lands; the server half stays pinned by the service test); and a signed-in user without the stackiq admin settings gets 403 on both routes. The remaining excludes that only said "Covered by the service test" name the test. Co-Authored-By: Claude Opus 5.5 --- .../specs/cmdb-export-import/spec.md | 18 +- src/views/settings/sections/CmdbImport.vue | 8 + tests/e2e/spec-coverage/cmdb-import.spec.ts | 390 +++++++++++++++--- 3 files changed, 361 insertions(+), 55 deletions(-) diff --git a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md index 4bed7dd7..66da6f4a 100644 --- a/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md +++ b/openspec/changes/cmdb-export-import/specs/cmdb-export-import/spec.md @@ -34,7 +34,7 @@ Nextcloud OCP interfaces used: `OCP\IRequest` (multipart upload), `OCP\IUserSess - **AND** the workbook reader SHALL NOT be invoked #### Scenario: A user without the stackiq admin settings cannot import -@e2e exclude Authorisation rule enforced by Nextcloud's middleware; tests/Unit/Controller/CmdbImportControllerTest.php (testBothRoutesRequireTheStackiqAdminSetting, testNeitherRouteDeclaresAnExemption) asserts both routes require the StackiqAdmin setting and declare no exemption, and the Newman collection asserts 403 for a user who is not an admin and for a software-catalog-admins member. +@e2e tests/e2e/spec-coverage/cmdb-import.spec.ts asserts 403 on both routes for a signed-in user without the setting. tests/Unit/Controller/CmdbImportControllerTest.php (testBothRoutesRequireTheStackiqAdminSetting, testNeitherRouteDeclaresAnExemption) asserts both routes require the StackiqAdmin setting and declare no exemption, and the Newman collection asserts 403 for a software-catalog-admins member. - **GIVEN** a signed-in user who is neither a Nextcloud admin nor a member of a group delegated stackiq's admin settings, for example a member of `software-catalog-admins` only - **WHEN** they post an export to `POST /api/cmdb-import` @@ -117,7 +117,7 @@ The request SHALL carry either `municipalityUuid`, the uuid of an existing stack - **AND** no new organisation of type `Municipality` SHALL be created #### Scenario: A new municipality is created once from a typed name -@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php imports twice with municipalityName "Gemeente Voorbeeldstad" and asserts one organisation of type Municipality. +@e2e tests/e2e/spec-coverage/cmdb-import.spec.ts - **GIVEN** no organisation named "Gemeente Voorbeeldstad" - **WHEN** a Nextcloud admin imports with `municipalityName` "Gemeente Voorbeeldstad", and later imports again with the same name @@ -220,7 +220,7 @@ When the service creates a `module` it SHALL set `publicationDate` to the time t - **AND** a search in OpenCatalogi for `Aangetekend Mailen` SHALL find the module #### Scenario: Re-import preserves publicationDate -@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php asserts both cases. +@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php testTheFixtureCreatesModulesUsagesAndSuppliers asserts publicationDate on created modules, and testAnUpdateNeverWritesPublicationDate asserts an update leaves it as it was. - **GIVEN** the module with APPID `1234` was imported with `publicationDate` 2026-10-01T09:00:00+00:00, and the module with APPID `2` was later depublished by an admin - **WHEN** a newer export is imported that changes both modules' names @@ -240,7 +240,7 @@ The service SHALL map "Vendor" (the maker of the software) through the manufactu - **AND** all three modules SHALL have `provider` = its uuid #### Scenario: An existing supplier is reused -@e2e exclude Covered by the service test. +@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php testAVendorIsOneSupplier seeds the Supplier "Aangetekend B.V." and asserts that the module of its row gets it as provider and no second supplier is created. - **GIVEN** an existing organisation `Aangetekend B.V.` of type `Supplier` - **WHEN** the "Onbeh" row with "Vendor" `Aangetekend B.V.` is imported @@ -268,7 +268,7 @@ For each imported module the service SHALL keep exactly one `usage` with `consum - **AND** that account SHALL see `Aangetekend Mailen` and `naamtest123` under "Software we use" #### Scenario: A re-import does not add a second usage -@e2e exclude Covered by the re-import scenario of REQ-CMDB-006 and the service test. +@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php testReimportingTheSameExportChangesNothing imports twice and asserts unchanged object counts, usages included. - **GIVEN** the module with APPID `2` already has a usage for "Gemeente Voorbeeldstad" - **WHEN** a newer export is imported for the same municipality @@ -296,7 +296,7 @@ The business owner pack SHALL map "Applicatie Eigenaar (Persoon)" (the display n - **AND** the OpenCatalogi search hit SHALL carry no owner name, and its `contactPerson` and `usages` SHALL be empty or ids only #### Scenario: The same owner on two rows is one contact person -@e2e exclude Covered by the service test. +@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php testTheSameOwnerOnTwoRowsIsOneContactPerson. - **GIVEN** two rows with the same "Applicatie Eigenaar (Persoon)" - **WHEN** they are imported @@ -333,7 +333,7 @@ The service SHALL process every non-empty row in its own error boundary. An exce - **AND** the response SHALL be 200 with that summary #### Scenario: A row without a name is skipped with its reason -@e2e exclude Covered by the service test. +@e2e exclude Covered by the service test; tests/Unit/Service/CmdbExportImportServiceTest.php testRowsAreSkippedWithTheirReasons asserts the row is skipped with `missing Applicatie Naam`. - **GIVEN** a row on "Beheerde Applicaties CMDB" with an APPID but an empty "Applicatie Naam" - **WHEN** it is imported @@ -351,7 +351,7 @@ The import SHALL accept `missingRecords` with the value `keep`, which is also th - **THEN** the module with APPID `7` and its usage SHALL be unchanged #### Scenario: A reserved value is refused -@e2e exclude Validation; tests/Unit/Controller/CmdbImportControllerTest.php. +@e2e exclude Validation; tests/Unit/Controller/CmdbImportControllerTest.php testAReservedMissingRecordsValueIsRefused. - **GIVEN** a valid export - **WHEN** a Nextcloud admin posts it with `missingRecords=remove` @@ -363,7 +363,7 @@ The import SHALL accept `missingRecords` with the value `keep`, which is also th The import SHALL run as a `ProgressTracker` operation of type `cmdb_import` under the `operationId` the client sends, and SHALL update the processed row count after every row, readable through the existing `GET /api/progress/{operationId}`. `POST /api/cmdb-import/{operationId}/cancel`, open to the same users as the import and CSRF-protected, SHALL request cancellation. The service SHALL check for cancellation between rows, SHALL keep the rows already processed, and SHALL return the report with `cancelled: true`. The final report SHALL also be stored with the operation, so it can be read again within the tracker's lifetime. #### Scenario: The admin follows and cancels a running import -@e2e exclude Timing-dependent with a two-row fixture; tests/Unit/Service/CmdbExportImportServiceTest.php requests cancellation after row 1 of three and asserts one processed row and cancelled true. +@e2e tests/e2e/spec-coverage/cmdb-import.spec.ts covers the section: the progress, the cancel request for the page's operation and the cancelled report. A two-row import finishes before a cancel can land between rows, so the server's stop before the next row is asserted by tests/Unit/Service/CmdbExportImportServiceTest.php testACancelStopsBetweenRows (cancel after row 1 of three: one processed row, cancelled true). - **GIVEN** an import of three rows that is running - **WHEN** the admin presses Cancel after the first row is done diff --git a/src/views/settings/sections/CmdbImport.vue b/src/views/settings/sections/CmdbImport.vue index 412df999..bbcbc4a0 100644 --- a/src/views/settings/sections/CmdbImport.vue +++ b/src/views/settings/sections/CmdbImport.vue @@ -267,6 +267,14 @@ :emptyText="t('stackiq', 'No rows with this outcome')" data-testid="cmdb-import-rows" @sort="onSort"> + +