aboutsummaryrefslogblamecommitdiffstats
path: root/tests/unit/includes/AuthTest.php
blob: fa9726fe8526e7e089dcaa071fe58db91edb552b (plain) (tree)
















































































                                                                                                         
<?php
/**
 * Tests for the authentication code used in Hubzilla.
 *
 * SPDX-FileCopyrightText: 2024 Hubzilla Community
 * SPDX-FileContributor: Harald Eilertsen
 *
 * SPDX-License-Identifier: MIT
 */

namespace Zotlabs\Tests\Unit\Includes;

use App;
use Zotlabs\Lib\AConfig;
use Zotlabs\Tests\Unit\UnitTestCase;
use PHPUnit\Framework\Attributes\{DataProvider, RunTestsInSeparateProcesses};

/**
 * Test class containing the test for the Hubzilla authentication code.
 *
 * Since the main authentication code is executed in the global scope on
 * inclusion of the `includes/auth.php` file, we need to run each test in a
 * separate process to make sure we can excersize the code as we need.
 */
#[RunTestsInSeparateProcesses]
class AuthTest extends UnitTestCase {

	/**
	 * Check that mfa status is not checked for certain modules.
	 *
	 * This causes issues with things like WebDAV and CardDAV, as there's
	 * currently no way for these modules to signal that a TOTP code is needed
	 * back to the connecting client.
	 */
	#[DataProvider('modules_excluded_from_mfa')]
	public function test_mfa_is_not_checked_for_excluded_modules(string $module, array $args): void {
		$account_id = $this->fixtures['account']['0']['account_id'];

		$_SESSION = [
			'authenticated' => true,
			'account_id' => $account_id,

			// Trick the code to not warn that $_SESSION['uid'] is not set,
			// but also not trigger the code that tries to change to the
			// given channel. *Remove when code is fixed!*
			'uid' => 0,
		];

		$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

		App::$session = $this->create_session_stub();
		App::$module = $module;
		App::$argv = $args;
		App::$argc = count($args);

		// Enable multi factor authentication for this account
		AConfig::Set($account_id, 'system', 'mfa_enabled', true);

		require 'include/auth.php';

		$this->assertEquals(1, $_SESSION['authenticated']);
	}

	/**
	 * Data provider for testing modules excluded from mfa
	 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
	 */
	public static function modules_excluded_from_mfa(): array {
		return [
			['totp_check', []],
			['cdav', []],
			['cdav', ['calendar']],
			['cdav', ['addressbook']],
			['dav', []],
		];
	}

	private function create_session_stub(): \Zotlabs\Web\Session {
		return $this->createStub('Zotlabs\Web\Session');
	}
}