OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

IntunePermissionsTest.php

4 KB
<?php

declare(strict_types=1);

/**
 * Hält die genannten Graph-Berechtigungen an dem, was der Abgleich tut.
 *
 * Die Liste auf der Einstellungsseite ist die einzige Stelle, an der jemand
 * nachsieht, bevor er die App-Registrierung einrichtet. Kommt ein Aufruf dazu,
 * ohne dass die Liste folgt, scheitert der Abgleich später mit „Forbidden" –
 * und niemand weiß, warum.
 */
return static function (): void {

    $wurzel  = dirname(__DIR__);
    $dienst  = (string)file_get_contents($wurzel . '/src/Services/IntuneSyncService.php');
    $seite   = (string)file_get_contents($wurzel . '/templates/admin/inventory/intune.php');

    test('Jeder Graph-Bereich, den der Abgleich anspricht, hat seine Berechtigung', function () use ($dienst, $seite) {
        // Aufruf-Bereich => Berechtigung, die ihn abdeckt.
        $erwartet = [
            'deviceManagement/managedDevices' => 'DeviceManagementManagedDevices.Read.All',
            'users'                           => 'User.Read.All',
        ];

        foreach ($erwartet as $bereich => $recht) {
            assertTrue(
                str_contains($dienst, $bereich),
                "Der Abgleich spricht {$bereich} nicht mehr an – die Liste braucht eine Durchsicht"
            );
            assertTrue(
                str_contains($seite, $recht),
                "Die Einstellungsseite nennt {$recht} nicht"
            );
        }
    });

    test('Schreibende und privilegierte Aktionen sind als solche benannt', function () use ($dienst, $seite) {
        // Wer die Zuordnung zurückschreibt oder ein Gerät aus der Verwaltung
        // nimmt, braucht mehr als Lesen.
        assertTrue(str_contains($dienst, 'users/$ref'), 'Das Zurückschreiben der Person fehlt im Dienst');
        assertTrue(
            str_contains($seite, 'DeviceManagementManagedDevices.ReadWrite.All'),
            'Die schreibende Berechtigung wird nicht genannt'
        );

        // retire, wipe und setDeviceName sind privilegierte Fernaktionen.
        foreach (['/retire', '/wipe', 'setDeviceName'] as $aktion) {
            assertTrue(str_contains($dienst, $aktion), "Die Aktion {$aktion} fehlt im Dienst");
        }
        assertTrue(
            str_contains($seite, 'DeviceManagementManagedDevices.PrivilegedOperations.All'),
            'Die Berechtigung für die privilegierten Fernaktionen wird nicht genannt'
        );
    });

    test('Die Liste richtet sich nach den eingeschalteten Funktionen', function () use ($seite) {
        // Eine Berechtigung, die nur eine abgeschaltete Funktion braucht, soll
        // nicht als Pflicht erscheinen – sonst holt sich jeder mehr Rechte als
        // nötig.
        assertTrue(str_contains($seite, "'noetig' => true"), 'Keine Pflicht-Berechtigung markiert');
        assertTrue(
            str_contains($seite, "!empty(\$cfg['writeback_user'])"),
            'Das Zurückschreiben entscheidet nicht über seine Berechtigung'
        );
        assertTrue(
            str_contains($seite, "'retire', 'wipe'"),
            'Die privilegierten Aktionen entscheiden nicht über ihre Berechtigung'
        );
    });

    test('Die Karte sagt, welche Art von Berechtigung gemeint ist', function () use ($seite) {
        // Anwendungs- statt delegierte Berechtigung, und ohne Zustimmung des
        // Administrators wirkt keine davon.
        assertTrue(str_contains($seite, 'Anwendungsberechtigungen'), 'Die Art der Berechtigung fehlt');
        assertTrue(str_contains($seite, 'Administratorzustimmung'), 'Der Hinweis auf die Zustimmung fehlt');
    });
};