/** * Build a valid URL to this instance of Roundcube * * @param mixed Either a string with the action or url parameters as key-value pairs * @param boolean Build an URL absolute to document root * @param boolean Create fully qualified URL including http(s):// and hostname * @param bool Return absolute URL in secure location * * @return string Valid application URL */ public function url($p, $absolute = false, $full = false, $secure = false) { if (!is_array($p)) { if (strpos($p, 'http') === 0) { return $p; } $p = array('_action' => @func_get_arg(0)); } $pre = array(); $task = $p['_task'] ?: ($p['task'] ?: $this->task); $pre['_task'] = $task; unset($p['task'], $p['_task']); $url = $this->filename; $delm = '?'; foreach (array_merge($pre, $p) as $key => $val) { if ($val !== '' && $val !== null) { $par = $key[0] == '_' ? $key : '_' . $key; $url .= $delm . urlencode($par) . '=' . urlencode($val); $delm = '&'; } } $base_path = strval($_SERVER['REDIRECT_SCRIPT_URL'] ?: $_SERVER['SCRIPT_NAME']); $base_path = preg_replace('![^/]+$!', '', $base_path); if ($secure && ($token = $this->get_secure_url_token(true))) { // add token to the url $url = $token . '/' . $url; // remove old token from the path $base_path = rtrim($base_path, '/'); $base_path = preg_replace('/\\/[a-f0-9]{' . strlen($token) . '}$/', '', $base_path); // this need to be full url to make redirects work $absolute = true; } if ($absolute || $full) { // add base path to this Roundcube installation if ($base_path == '') { $base_path = '/'; } $prefix = $base_path; // prepend protocol://hostname:port if ($full) { $prefix = rcube_utils::resolve_url($prefix); } $prefix = rtrim($prefix, '/') . '/'; } else { $prefix = './'; } return $prefix . $url; }
/** * Build a valid URL to this instance of Roundcube * * @param mixed Either a string with the action or url parameters as key-value pairs * @param boolean Build an URL absolute to document root * @param boolean Create fully qualified URL including http(s):// and hostname * * @return string Valid application URL */ public function url($p, $absolute = false, $full = false) { if (!is_array($p)) { if (strpos($p, 'http') === 0) { return $p; } $p = array('_action' => @func_get_arg(0)); } $pre = array(); $task = $p['_task'] ?: ($p['task'] ?: $this->task); $pre['_task'] = $task; unset($p['task'], $p['_task']); $url = $this->filename; $delm = '?'; foreach (array_merge($pre, $p) as $key => $val) { if ($val !== '' && $val !== null) { $par = $key[0] == '_' ? $key : '_' . $key; $url .= $delm . urlencode($par) . '=' . urlencode($val); $delm = '&'; } } if ($absolute || $full) { // add base path to this Roundcube installation $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME'])); if ($base_path == '') { $base_path = '/'; } $prefix = $base_path; // prepend protocol://hostname:port if ($full) { $prefix = rcube_utils::resolve_url($prefix); } $prefix = rtrim($prefix, '/') . '/'; } else { $prefix = './'; } return $prefix . $url; }