aboutsummaryrefslogtreecommitdiffstats
path: root/tests/session/testable_facade.php
blob: 05858c8a63857a14f68a8bf42b1ee2a0b52e0675 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

require_once dirname(__FILE__) . '/testable_factory.php';
require_once dirname(__FILE__) . '/../../phpBB/phpbb/session.php';

/**
 * This class exists to expose session.php's functions in a more testable way.
 *
 * Since many functions in session.php have global variables inside the function,
 * this exposes those functions through a testable facade that uses
 * testable_factory's mock global variables to modify global variables used in
 * the functions.
 *
 * This is using the facade pattern to provide a testable "front" to the
 * functions in sessions.php.
 *
 */
class phpbb_session_testable_facade
{
	protected $db;
	protected $session_factory;

	function __construct($db, $session_factory)
	{
		$this->db = $db;
		$this->session_factory = $session_factory;
	}

	function extract_current_hostname(
		$host,
		$server_name_config,
		$cookie_domain_config
	)
	{
		$session = $this->session_factory->get_session($this->db);
		global $config, $request;
		$config['server_name'] = $server_name_config;
		$config['cookie_domain'] = $cookie_domain_config;
		$request->overwrite('SERVER_NAME', $host, \phpbb\request\request_interface::SERVER);
		$request->overwrite('Host', $host, \phpbb\request\request_interface::SERVER);
		// Note: There is a php_uname function used as a fallthrough
		//       that this function doesn't override
		return $session->extract_current_hostname();
	}

	/**
	 *
	 * This function has a lot of dependencies, so instead of naming them all,
	 * just ask for overrides
	 *
	 * @param update_session_page Boolean of whether to set page of the session
	 * @param config_overrides An array of overrides for the global config object
	 * @param request_overrides An array of overrides for the global request object
	 * @return boolean False if the user is identified, otherwise true.
	 */
	function session_begin(
		$update_session_page = true,
		$config_overrides = array(),
		$request_overrides = array(),
		$cookies_overrides = array()
	)
	{
		$this->session_factory->merge_config_data($config_overrides);
		$this->session_factory->merge_server_data($request_overrides);
		$this->session_factory->set_cookies($cookies_overrides);
		$session = $this->session_factory->get_session($this->db);
		$session->session_begin($update_session_page);
		return $session;
	}

	function session_create(
		$user_id = false,
		$set_admin = false,
		$persist_login = false,
		$viewonline = true,
		array $config_overrides = array(),
		$user_agent = 'user agent',
		$ip_address = '127.0.0.1',
		array $bot_overrides = array(),
		$uri_sid = ""
	)
	{
		$this->session_factory->merge_config_data($config_overrides);
		// Bots
		$this->session_factory->merge_cache_data(array('_bots' => $bot_overrides));
		global $request;
		$session = $this->session_factory->get_session($this->db);
		$session->browser = $user_agent;
		$session->ip = $ip_address;
		// Uri sid
		if ($uri_sid)
		{
			$_GET['sid'] = $uri_sid;
		}
		$session->session_create($user_id, $set_admin, $persist_login, $viewonline);
		return $session;
	}

	function validate_referer(
		$check_script_path,
		$referer,
		$host,
		$force_server_vars,
		$server_port,
		$server_name,
		$root_script_path
	)
	{
		$session = $this->session_factory->get_session($this->db);
		global $config, $request;
		$session->referer = $referer;
		$session->page['root_script_path'] = $root_script_path;
		$session->host = $host;
		$config['force_server_vars'] = $force_server_vars;
		$config['server_name'] = $server_name;
		$request->overwrite('SERVER_PORT', $server_port, \phpbb\request\request_interface::SERVER);
		return $session->validate_referer($check_script_path);
	}
}