aboutsummaryrefslogtreecommitdiffstats
path: root/tests/session/testable_facade.php
blob: 2600a46cc491777fe42f7e7f223781647d223c0d (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
<?php
/**
 *
 * @package testing
 * @copyright (c) 2013 phpBB Group
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
 *
 */

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);
	}
}