merge: agent session work
This commit is contained in:
commit
3b538c23a6
@ -3,7 +3,6 @@
|
|||||||
namespace App\Services\Intune;
|
namespace App\Services\Intune;
|
||||||
|
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Str;
|
|
||||||
|
|
||||||
class GroupPolicyConfigurationNormalizer implements PolicyTypeNormalizer
|
class GroupPolicyConfigurationNormalizer implements PolicyTypeNormalizer
|
||||||
{
|
{
|
||||||
@ -47,7 +46,12 @@ public function normalize(?array $snapshot, string $policyType, ?string $platfor
|
|||||||
$definitionId = $definitionValue['#Definition_Id'] ?? null;
|
$definitionId = $definitionValue['#Definition_Id'] ?? null;
|
||||||
$category = $definitionValue['#Definition_categoryPath'] ?? '-';
|
$category = $definitionValue['#Definition_categoryPath'] ?? '-';
|
||||||
$enabled = (bool) ($definitionValue['enabled'] ?? false);
|
$enabled = (bool) ($definitionValue['enabled'] ?? false);
|
||||||
$path = $definitionValue['definition@odata.bind'] ?? (is_string($definitionId) ? $definitionId : "definitionValues[{$index}]");
|
$path = $this->buildDiffPath(
|
||||||
|
definition: $definition,
|
||||||
|
definitionId: $definitionId,
|
||||||
|
categoryPath: $category,
|
||||||
|
index: $index,
|
||||||
|
);
|
||||||
|
|
||||||
$value = $this->formatGroupPolicyValue($definitionValue, $enabled);
|
$value = $this->formatGroupPolicyValue($definitionValue, $enabled);
|
||||||
$dataType = $this->inferGroupPolicyDataType($definitionValue);
|
$dataType = $this->inferGroupPolicyDataType($definitionValue);
|
||||||
@ -59,7 +63,7 @@ public function normalize(?array $snapshot, string $policyType, ?string $platfor
|
|||||||
'data_type' => $dataType,
|
'data_type' => $dataType,
|
||||||
'value' => $value,
|
'value' => $value,
|
||||||
'description' => '-',
|
'description' => '-',
|
||||||
'path' => is_string($path) ? Str::limit($path, 200) : "definitionValues[{$index}]",
|
'path' => $path,
|
||||||
'raw' => $definitionValue,
|
'raw' => $definitionValue,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -159,4 +163,19 @@ private function formatGroupPolicyValue(array $definitionValue, bool $enabled):
|
|||||||
|
|
||||||
return implode(' | ', array_values(array_filter($parts, static fn ($part) => $part !== '')));
|
return implode(' | ', array_values(array_filter($parts, static fn ($part) => $part !== '')));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function buildDiffPath(mixed $definition, mixed $definitionId, mixed $categoryPath, int $index): string
|
||||||
|
{
|
||||||
|
$label = is_string($definition) && $definition !== '' ? $definition : "definitionValues[{$index}]";
|
||||||
|
|
||||||
|
if (is_string($definitionId) && $definitionId !== '') {
|
||||||
|
$label .= " ({$definitionId})";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($categoryPath) && $categoryPath !== '' && $categoryPath !== '-') {
|
||||||
|
return $categoryPath.' > '.$label;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $label;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,121 @@ public function normalize(?array $snapshot, string $policyType, ?string $platfor
|
|||||||
*/
|
*/
|
||||||
public function flattenForDiff(?array $snapshot, string $policyType, ?string $platform = null): array
|
public function flattenForDiff(?array $snapshot, string $policyType, ?string $platform = null): array
|
||||||
{
|
{
|
||||||
return $this->defaultNormalizer->flattenForDiff($snapshot, $policyType, $platform);
|
$normalized = $this->normalize($snapshot ?? [], $policyType, $platform);
|
||||||
|
|
||||||
|
$map = [];
|
||||||
|
|
||||||
|
if (isset($normalized['settings_table']['rows']) && is_array($normalized['settings_table']['rows'])) {
|
||||||
|
$title = $normalized['settings_table']['title'] ?? 'Settings';
|
||||||
|
$prefix = is_string($title) && $title !== '' ? $title.' > ' : '';
|
||||||
|
$rows = $normalized['settings_table']['rows'];
|
||||||
|
|
||||||
|
$baseLabels = array_values(array_filter(array_map(function (mixed $row): ?string {
|
||||||
|
if (! is_array($row)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->buildSettingsCatalogDiffLabel($row, includePath: false);
|
||||||
|
}, $rows)));
|
||||||
|
|
||||||
|
$labelCounts = array_count_values($baseLabels);
|
||||||
|
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
if (! is_array($row)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$baseLabel = $this->buildSettingsCatalogDiffLabel($row, includePath: false);
|
||||||
|
$label = $baseLabel;
|
||||||
|
|
||||||
|
if (($labelCounts[$baseLabel] ?? 0) > 1) {
|
||||||
|
$path = $row['path'] ?? null;
|
||||||
|
$pathLabel = is_string($path) && $path !== '' ? $path : null;
|
||||||
|
|
||||||
|
$label = $this->buildSettingsCatalogDiffLabel($row, includePath: true);
|
||||||
|
|
||||||
|
if ($pathLabel !== null) {
|
||||||
|
$label .= ' @ '.$pathLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $prefix.$label;
|
||||||
|
$map[$key] = $row['value'] ?? null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($normalized['settings'] ?? [] as $block) {
|
||||||
|
if (! is_array($block)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$title = $block['title'] ?? null;
|
||||||
|
$prefix = is_string($title) && $title !== '' ? $title.' > ' : '';
|
||||||
|
|
||||||
|
if (($block['type'] ?? null) === 'table') {
|
||||||
|
foreach ($block['rows'] ?? [] as $row) {
|
||||||
|
if (! is_array($row)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $prefix.($row['path'] ?? $row['label'] ?? 'entry');
|
||||||
|
$map[$key] = $row['value'] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($block['entries'] ?? [] as $entry) {
|
||||||
|
if (! is_array($entry)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $prefix.($entry['key'] ?? 'entry');
|
||||||
|
$map[$key] = $entry['value'] ?? null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $row
|
||||||
|
*/
|
||||||
|
private function buildSettingsCatalogDiffLabel(array $row, bool $includePath): string
|
||||||
|
{
|
||||||
|
$category = $row['category'] ?? null;
|
||||||
|
$definition = $row['definition'] ?? null;
|
||||||
|
$definitionId = $row['definition_id'] ?? null;
|
||||||
|
|
||||||
|
$label = is_string($definition) && $definition !== '' ? $definition : 'Setting';
|
||||||
|
|
||||||
|
if ($includePath) {
|
||||||
|
$path = $row['path'] ?? null;
|
||||||
|
|
||||||
|
if (is_string($path) && $path !== '') {
|
||||||
|
$label = $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
is_string($label)
|
||||||
|
&& is_string($definitionId)
|
||||||
|
&& $definitionId !== ''
|
||||||
|
&& is_string($definition)
|
||||||
|
&& $definition !== ''
|
||||||
|
) {
|
||||||
|
$parts = explode(' > ', $label);
|
||||||
|
|
||||||
|
if ($parts !== [] && end($parts) === $definitionId) {
|
||||||
|
$parts[count($parts) - 1] = $definition;
|
||||||
|
$label = implode(' > ', $parts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($category) && $category !== '' && $category !== '-') {
|
||||||
|
$label = $category.' > '.$label;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $label;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Services\Intune\PolicyNormalizer;
|
||||||
|
|
||||||
|
test('group policy configuration normalized diff keys use definition display names', function () {
|
||||||
|
$flat = app(PolicyNormalizer::class)->flattenForDiff(
|
||||||
|
snapshot: [
|
||||||
|
'id' => 'gpo-1',
|
||||||
|
'displayName' => 'Admin Templates Alpha',
|
||||||
|
'@odata.type' => '#microsoft.graph.groupPolicyConfiguration',
|
||||||
|
'definitionValues' => [
|
||||||
|
[
|
||||||
|
'enabled' => true,
|
||||||
|
'definition@odata.bind' => 'https://graph.microsoft.com/beta/deviceManagement/groupPolicyDefinitions(\'def-1\')',
|
||||||
|
'#Definition_Id' => 'def-1',
|
||||||
|
'#Definition_displayName' => 'Block legacy auth',
|
||||||
|
'#Definition_categoryPath' => 'Windows Components\\Security Options',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
policyType: 'groupPolicyConfiguration',
|
||||||
|
platform: 'windows',
|
||||||
|
);
|
||||||
|
|
||||||
|
$keys = array_keys($flat);
|
||||||
|
|
||||||
|
expect($keys)->toContain('Administrative Template settings > Windows Components\\Security Options > Block legacy auth (def-1)');
|
||||||
|
expect(implode("\n", $keys))->not->toContain('graph.microsoft.com');
|
||||||
|
});
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Models\SettingsCatalogCategory;
|
||||||
|
use App\Models\SettingsCatalogDefinition;
|
||||||
|
use App\Services\Intune\PolicyNormalizer;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
|
||||||
|
uses(RefreshDatabase::class);
|
||||||
|
|
||||||
|
test('settings catalog normalized diff keys use definition display names', function () {
|
||||||
|
SettingsCatalogCategory::create([
|
||||||
|
'category_id' => 'cat-1',
|
||||||
|
'display_name' => 'Account Management',
|
||||||
|
'description' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
SettingsCatalogDefinition::create([
|
||||||
|
'definition_id' => 'device_vendor_msft_accountmanagement_userprofilemanagement_deletionpolicy',
|
||||||
|
'display_name' => 'Deletion Policy',
|
||||||
|
'description' => null,
|
||||||
|
'help_text' => null,
|
||||||
|
'category_id' => 'cat-1',
|
||||||
|
'ux_behavior' => null,
|
||||||
|
'raw' => [],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$flat = app(PolicyNormalizer::class)->flattenForDiff(
|
||||||
|
snapshot: [
|
||||||
|
'@odata.type' => '#microsoft.graph.deviceManagementConfigurationPolicy',
|
||||||
|
'id' => 'scp-policy-1',
|
||||||
|
'name' => 'Settings Catalog Policy',
|
||||||
|
'platforms' => 'windows10',
|
||||||
|
'technologies' => 'mdm',
|
||||||
|
'settings' => [
|
||||||
|
[
|
||||||
|
'id' => 's1',
|
||||||
|
'settingInstance' => [
|
||||||
|
'@odata.type' => '#microsoft.graph.deviceManagementConfigurationChoiceSettingInstance',
|
||||||
|
'settingDefinitionId' => 'device_vendor_msft_accountmanagement_userprofilemanagement_deletionpolicy',
|
||||||
|
'choiceSettingValue' => [
|
||||||
|
'value' => 'enabled',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
policyType: 'settingsCatalogPolicy',
|
||||||
|
platform: 'windows',
|
||||||
|
);
|
||||||
|
|
||||||
|
$keys = array_keys($flat);
|
||||||
|
|
||||||
|
expect($keys)->toContain('Settings > Account Management > Deletion Policy');
|
||||||
|
expect(implode("\n", $keys))->not->toContain('device_vendor_msft_accountmanagement_userprofilemanagement_deletionpolicy');
|
||||||
|
});
|
||||||
Loading…
Reference in New Issue
Block a user