aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/functions.php6
-rw-r--r--phpBB/phpbb/path_helper.php13
-rw-r--r--phpBB/phpbb/session.php15
-rw-r--r--tests/session/extract_page_test.php16
4 files changed, 44 insertions, 6 deletions
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index 6c15c14300..6a36210dca 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -1839,7 +1839,7 @@ function redirect($url, $return = false, $disable_cd_check = false)
/**
* Re-Apply session id after page reloads
*/
-function reapply_sid($url)
+function reapply_sid($url, $is_route = false)
{
global $phpEx, $phpbb_root_path;
@@ -1861,7 +1861,7 @@ function reapply_sid($url)
$url = preg_replace("/$phpEx(&|&)+?/", "$phpEx?", $url);
}
- return append_sid($url);
+ return append_sid($url, false, true, false, $is_route);
}
/**
@@ -2184,7 +2184,7 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
// re-add sid / transform & to & for user->page (user->page is always using &)
$use_page = ($u_action) ? $u_action : str_replace('&', '&', $user->page['page']);
- $u_action = reapply_sid($phpbb_path_helper->get_valid_page($use_page, $config['enable_mod_rewrite']));
+ $u_action = reapply_sid($phpbb_path_helper->get_valid_page($use_page, $config['enable_mod_rewrite']), $phpbb_path_helper->is_router_used());
$u_action .= ((strpos($u_action, '?') === false) ? '?' : '&') . 'confirm_key=' . $confirm_key;
$template->assign_vars(array(
diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php
index 154361ef64..5b6db35f23 100644
--- a/phpBB/phpbb/path_helper.php
+++ b/phpBB/phpbb/path_helper.php
@@ -496,4 +496,17 @@ class path_helper
return $page;
}
+
+ /**
+ * Tells if the router is currently in use (if the current page is a route or not)
+ *
+ * @return bool
+ */
+ public function is_router_used()
+ {
+ // Script name URI (e.g. phpBB/app.php)
+ $script_name = $this->symfony_request->getScriptName();
+
+ return basename($script_name) === 'app.' . $this->php_ext;
+ }
}
diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php
index c5b50c2b07..6b5b8f2625 100644
--- a/phpBB/phpbb/session.php
+++ b/phpBB/phpbb/session.php
@@ -91,9 +91,18 @@ class session
$page_name .= str_replace('%2F', '/', urlencode($symfony_request_path));
}
- // current directory within the phpBB root (for example: adm)
- $root_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath($root_path)));
- $page_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath('./')));
+ if (substr($root_path, 0, 2) === './' && strpos($root_path, '..') === false)
+ {
+ $root_dirs = explode('/', str_replace('\\', '/', rtrim($root_path, '/')));
+ $page_dirs = explode('/', str_replace('\\', '/', '.'));
+ }
+ else
+ {
+ // current directory within the phpBB root (for example: adm)
+ $root_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath($root_path)));
+ $page_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath('./')));
+ }
+
$intersection = array_intersect_assoc($root_dirs, $page_dirs);
$root_dirs = array_diff_assoc($root_dirs, $intersection);
diff --git a/tests/session/extract_page_test.php b/tests/session/extract_page_test.php
index 88eb7b2c1a..f8aa3d27a5 100644
--- a/tests/session/extract_page_test.php
+++ b/tests/session/extract_page_test.php
@@ -136,6 +136,22 @@ class phpbb_session_extract_page_test extends phpbb_session_test_case
'forum' => 0,
),
),
+ array(
+ './community',
+ '/app.php',
+ '',
+ '/',
+ '/kb',
+ array(
+ 'page_name' => 'app.php/kb',
+ 'page_dir' => '..',
+ 'query_string' => '',
+ 'script_path' => '/',
+ 'root_script_path' => '/community/',
+ 'page' => '../app.php/kb',
+ 'forum' => 0,
+ ),
+ ),
);
}