Aleksander Machniak
2013-10-14 c1bc8f6c827a27540b5510b42dcc65b39d38f2c1
program/lib/Roundcube/rcube_config.php
@@ -119,8 +119,7 @@
        }
        // load host-specific configuration
        if (!empty($_SERVER['HTTP_HOST']))
            $this->load_host_config();
        $this->load_host_config();
        // set skin (with fallback to old 'skin_path' property)
        if (empty($this->prop['skin'])) {
@@ -176,20 +175,30 @@
     */
    private function load_host_config()
    {
        $fname = null;
        if (is_array($this->prop['include_host_config'])) {
            $fname = $this->prop['include_host_config'][$_SERVER['HTTP_HOST']];
        }
        else if (!empty($this->prop['include_host_config'])) {
            $fname = preg_replace('/[^a-z0-9\.\-_]/i', '', $_SERVER['HTTP_HOST']) . '.inc.php';
        if (empty($this->prop['include_host_config'])) {
            return;
        }
        if ($fname) {
            $this->load_from_file($fname);
        foreach (array('HTTP_HOST', 'SERVER_NAME', 'SERVER_ADDR') as $key) {
            $fname = null;
            $name  = $_SERVER[$key];
            if (!$name) {
                continue;
            }
            if (is_array($this->prop['include_host_config'])) {
                $fname = $this->prop['include_host_config'][$name];
            }
            else {
                $fname = preg_replace('/[^a-z0-9\.\-_]/i', '', $name) . '.inc.php';
            }
            if ($fname && $this->load_from_file($fname)) {
                return;
            }
        }
    }
    /**
     * Read configuration from a file
@@ -214,7 +223,7 @@
                    $success = true;
                }
                // deprecated name of config variable
                else if (is_array($rcmail_config)) {
                if (is_array($rcmail_config)) {
                    $this->merge($rcmail_config);
                    $success = true;
                }
@@ -529,7 +538,7 @@
        // convert deprecated numeric timezone value
        if (isset($props['timezone']) && is_numeric($props['timezone'])) {
            if ($tz = timezone_name_from_abbr("", $props['timezone'] * 3600, 0)) {
            if ($tz = self::timezone_name_from_abbr($props['timezone'])) {
                $props['timezone'] = $tz;
            }
            else {
@@ -539,4 +548,65 @@
        return $props;
    }
    /**
     * timezone_name_from_abbr() replacement. Converts timezone offset
     * into timezone name abbreviation.
     *
     * @param float $offset Timezone offset (in hours)
     *
     * @return string Timezone abbreviation
     */
    static public function timezone_name_from_abbr($offset)
    {
        // List of timezones here is not complete - https://bugs.php.net/bug.php?id=44780
        if ($tz = timezone_name_from_abbr('', $offset * 3600, 0)) {
            return $tz;
        }
        // try with more complete list (#1489261)
        $timezones = array(
            '-660' => "Pacific/Apia",
            '-600' => "Pacific/Honolulu",
            '-570' => "Pacific/Marquesas",
            '-540' => "America/Anchorage",
            '-480' => "America/Los_Angeles",
            '-420' => "America/Denver",
            '-360' => "America/Chicago",
            '-300' => "America/New_York",
            '-270' => "America/Caracas",
            '-240' => "America/Halifax",
            '-210' => "Canada/Newfoundland",
            '-180' => "America/Sao_Paulo",
             '-60' => "Atlantic/Azores",
               '0' => "Europe/London",
              '60' => "Europe/Paris",
             '120' => "Europe/Helsinki",
             '180' => "Europe/Moscow",
             '210' => "Asia/Tehran",
             '240' => "Asia/Dubai",
             '300' => "Asia/Karachi",
             '270' => "Asia/Kabul",
             '300' => "Asia/Karachi",
             '330' => "Asia/Kolkata",
             '345' => "Asia/Katmandu",
             '360' => "Asia/Yekaterinburg",
             '390' => "Asia/Rangoon",
             '420' => "Asia/Krasnoyarsk",
             '480' => "Asia/Shanghai",
             '525' => "Australia/Eucla",
             '540' => "Asia/Tokyo",
             '570' => "Australia/Adelaide",
             '600' => "Australia/Melbourne",
             '630' => "Australia/Lord_Howe",
             '660' => "Asia/Vladivostok",
             '690' => "Pacific/Norfolk",
             '720' => "Pacific/Auckland",
             '765' => "Pacific/Chatham",
             '780' => "Pacific/Enderbury",
             '840' => "Pacific/Kiritimati",
        );
        return $timezones[(string) intval($offset * 60)];
    }
}