From 06fdaf88cb1a355e445294beba4a89d0209ac71e Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 13 Aug 2014 13:15:12 -0400
Subject: [PATCH] Extend rcmail::url() to produce absolute and fully qualified URLs

---
 program/include/rcmail.php |   45 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index ceb369a..bb2346f 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -789,11 +789,13 @@
     /**
      * 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 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)
+    public function url($p, $absolute = false, $full = false)
     {
         if (!is_array($p)) {
             if (strpos($p, 'http') === 0) {
@@ -803,14 +805,15 @@
             $p = array('_action' => @func_get_arg(0));
         }
 
-        $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task);
-        $p['_task'] = $task;
-        unset($p['task']);
+        $pre = array();
+        $task = $p['_task'] ?: ($p['task'] ?: $this->task);
+        $pre['_task'] = $task;
+        unset($p['task'], $p['_task']);
 
-        $url  = './' . $this->filename;
+        $url  = $this->filename;
         $delm = '?';
 
-        foreach (array_reverse($p) as $key => $val) {
+        foreach (array_merge($pre, $p) as $key => $val) {
             if ($val !== '' && $val !== null) {
                 $par  = $key[0] == '_' ? $key : '_'.$key;
                 $url .= $delm.urlencode($par).'='.urlencode($val);
@@ -818,7 +821,33 @@
             }
         }
 
-        return $url;
+        if ($absolute || $full) {
+            $prefix = '';
+
+            // prepend protocol://hostname:port
+            if ($full) {
+                $schema = 'http';
+                $default_port = 80;
+                if (rcube_utils::https_check()) {
+                    $schema = 'https';
+                    $default_port = 443;
+                }
+                $prefix = $schema . '://' . preg_replace('/:\d+$/', '', $_SERVER['HTTP_HOST']);
+                if ($_SERVER['SERVER_PORT'] != $default_port) {
+                  $prefix .= ':' . $_SERVER['SERVER_PORT'];
+                }
+            }
+
+            // add base path to this Roundcube installation
+            $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME']));
+            if ($base_path == '') $base_path = '/';
+            $prefix .= $base_path;
+        }
+        else {
+            $prefix = './';
+        }
+
+        return $prefix . $url;
     }
 
     /**

--
Gitblit v1.9.1