Classes

File io/http/HTTPRequestCustom.class.php

File io/http/HTTPRequestCustom.class.php

  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: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 
<?php
/**
 * Provides access to the HTTP request parameters
 * @package     IO
 * @subpackage  HTTP
 * @copyright   &copy; 2005-2019 PHPBoost
 * @license     https://www.gnu.org/licenses/gpl-3.0.html GNU/GPL-3.0
 * @author      Loic ROUCHON <horn@phpboost.com>
 * @version     PHPBoost 5.2 - last update: 2018 11 09
 * @since       PHPBoost 3.0 - 2009 10 17
 * @contributor Julien BRISWALTER <j1.seth@phpboost.com>
 * @contributor janus57 <janus57@janus57.fr>
 * @contributor Arnaud GENET <elenwii@phpboost.com>
 * @contributor mipel <mipel@phpboost.com>
*/

class HTTPRequestCustom
{
    const bool = 0x00;
    const int = 0x01;
    const float = 0x02;
    const string = 0x03;
    const t_array = 0x04;
    const none = 0x05;

    private $_request;
    private $_get;
    private $_post;

    public function __construct()
    {
        $this->_request = self::sanitize_html($_REQUEST);
        $this->_get = self::sanitize_html($_GET);
        $this->_post = self::sanitize_html($_POST);
    }

    public function is_post_method()
    {
        return $_SERVER['REQUEST_METHOD'] == 'POST';
    }

    public function is_get_method()
    {
        return $_SERVER['REQUEST_METHOD'] == 'GET';
    }

    public function has_parameter($parameter)
    {
        return $this->has_rawparameter($parameter, $this->_request);
    }

    public function has_getparameter($parameter)
    {
        return $this->has_rawparameter($parameter, $this->_get);
    }

    public function has_postparameter($parameter)
    {
        return $this->has_rawparameter($parameter, $this->_post);
    }

    public function has_cookieparameter($parameter)
    {
        return $this->has_rawparameter($parameter, $_COOKIE);
    }

    private function has_rawparameter($parameter, &$array)
    {
        return isset($array[$parameter]);
    }

    public function set_value($varname, $value)
    {
        $this->set_rawvalue($varname, $value, $this->_get);
        $this->set_rawvalue($varname, $value, $this->_post);
        $this->set_rawvalue($varname, $value, $this->_request);
    }

    public function set_getvalue($varname, $value)
    {
        $this->set_rawvalue($varname, $value, $this->_get);
        $this->set_rawvalue($varname, $value, $this->_request);
    }

    public function set_postvalue($varname, $value)
    {
        $this->set_rawvalue($varname, $value, $this->_post);
        $this->set_rawvalue($varname, $value, $this->_request);
    }

    private function set_rawvalue($varname, $value, &$array)
    {
        $array[$varname] = $value;
    }

    public function get_value($varname, $default_value = null)
    {
        return $this->get_var($this->_request, self::none, $varname, $default_value);
    }

    public function get_bool($varname, $default_value = null)
    {
        return $this->get_var($this->_request, self::bool, $varname, $default_value);
    }

    public function get_int($varname, $default_value = null)
    {
        return $this->get_var($this->_request, self::int, $varname, $default_value);
    }

    public function get_float($varname, $default_value = null)
    {
        return $this->get_var($this->_request, self::float, $varname, $default_value);
    }

    public function get_string($varname, $default_value = null)
    {
        return $this->get_var($this->_request, self::string, $varname, $default_value);
    }

    public function get_array($varname, $default_value = array())
    {
        return $this->get_var($this->_request, self::t_array, $varname, $default_value);
    }

    public function get_cookie($varname, $default_value = null)
    {
        return $this->get_var($_COOKIE, self::string, $varname, $default_value);
    }

    public function _get_parameters_array($varname, $default_value = array())
    {
        return $this->get_var($this->_request, self::t_array, $varname, $default_value);
    }

    /**
     * @param string $varname
     * @return UploadedFile The uploaded file
     * @throws UnexistingHTTPParameterException if the file was not found in the request
     * @throws UploadedFileTooLargeException if the uploaded file is too large
     * @throws Exception if any other error occurs
     */
    public function get_file($varname)
    {
        if (isset($_FILES[$varname]))
        {
            return FileUploadService::retrieve_file($varname);
        }
        else
        {
            throw new UnexistingHTTPParameterException($varname);
        }
    }

    public function get_getvalue($varname, $default_value = null)
    {
        return $this->get_var($this->_get, self::none, $varname, $default_value);
    }

    public function get_getbool($varname, $default_value = null)
    {
        return $this->get_var($this->_get, self::bool, $varname, $default_value);
    }

    public function get_getint($varname, $default_value = null)
    {
        return $this->get_var($this->_get, self::int, $varname, $default_value);
    }

    public function get_getfloat($varname, $default_value = null)
    {
        return $this->get_var($this->_get, self::float, $varname, $default_value);
    }

    public function get_getstring($varname, $default_value = null)
    {
        return $this->get_var($this->_get, self::string, $varname, $default_value);
    }

    public function get_getarray($varname, $default_value = array())
    {
        return $this->get_var($this->_get, self::t_array, $varname, $default_value);
    }

    public function get_postvalue($varname, $default_value = null)
    {
        return $this->get_var($this->_post, self::none, $varname, $default_value);
    }

    public function get_postbool($varname, $default_value = null)
    {
        return $this->get_var($this->_post, self::bool, $varname, $default_value);
    }

    public function get_postint($varname, $default_value = null)
    {
        return $this->get_var($this->_post, self::int, $varname, $default_value);
    }

    public function get_postfloat($varname, $default_value = null)
    {
        return $this->get_var($this->_post, self::float, $varname, $default_value);
    }

    public function get_poststring($varname, $default_value = null)
    {
        return $this->get_var($this->_post, self::string, $varname, $default_value);
    }

    public function get_postarray($varname, $default_value = array())
    {
        return $this->get_var($this->_post, self::t_array, $varname, $default_value);
    }

    private function get_var($mode, $type, $varname, $default_value)
    {
        if (!isset($mode[$varname]) && $default_value === null)
        {
            throw new UnexistingHTTPParameterException($varname);
        }
        else if (empty($mode[$varname]) && $default_value !== null)
        {
            return $default_value;
        }
        else
        {
            return $this->get_raw_var($mode, $type, $varname, $default_value);
        }
    }

    private function get_raw_var($mode, $type, $varname, $default_value)
    {
        $value = $mode[$varname];

        switch ($type)
        {
            case self::bool:
                return $this->get_raw_bool($value);
            case self::int:
                return $this->get_raw_int($value, $varname, $default_value);
            case self::float:
                return $this->get_raw_float($value, $varname, $default_value);
            case self::string:
                return $this->get_raw_string($value);
            case self::t_array:
                return $this->get_raw_array($value, $default_value);
            case self::none:
            default:
                return $this->get_raw_string($value);
        }
    }

    private function get_raw_bool($value)
    {
        return $value === 'true' || $value === '1' || $value === 'on' || $value === true;
    }

    private function get_raw_int($value, $varname, $default_value)
    {
        if (is_numeric($value))
        {
            return NumberHelper::numeric($value, 'int');
        }
        if ($default_value !== null)
        {
            return $default_value;
        }
        else
        {
            throw new ParameterTypeMismatchException($varname, 'int', $value);
        }
    }

    private function get_raw_float($value, $varname, $default_value)
    {
        if (is_float($value))
        {
            return NumberHelper::numeric($value, 'float');
        }
        if ($default_value !== null)
        {
            return $default_value;
        }
        else
        {
            throw new ParameterTypeMismatchException($varname, 'float', $value);
        }
    }

    private function get_raw_string($value)
    {
        if (is_array($value))
            $value = implode(',', $value);

        $value = self::sanitize($value);
        return (string) $value;
    }

    private static function sanitize($value)
    {
        return str_replace(array("\r\n", "\r"), "\n", $value);
    }

    private static function sanitize_html(Array $array)
    {
        $proper_array = array();

        foreach ($array as $key => $value)
        {
            if (is_array($value))
                $proper_array[$key] = self::sanitize_html($value);
            else
                $proper_array[$key] = TextHelper::htmlspecialchars($value);
        }

        return $proper_array;
    }

    private function get_raw_array(array $array, array $default_value)
    {
        if (!is_array($array))
        {
            return $default_value;
        }
        foreach ($array as &$item)
        {
            $item = self::sanitize($item);
        }
        return $array;
    }


    public function get_is_ajax_request()
    {
        return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && TextHelper::strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
    }

    private static function get_http_host()
    {
        return (isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : getenv('HTTP_HOST');
    }

    public function get_is_https()
    {
        if ((!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (!empty($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == '443' ))
            return true;
        else if ((isset ($_SERVER['HTTPS'] ) || isset($_SERVER['HTTP_HTTPS']) || isset($_SERVER['HTTP_X_SECURE'])) && (!empty ($_SERVER['HTTPS'] ) || !empty($_SERVER['HTTP_HTTPS']) || !empty($_SERVER['HTTP_X_SECURE'])) && ((TextHelper::strtolower($_SERVER['HTTPS']) || TextHelper::strtolower($_SERVER['HTTP_HTTPS']) || TextHelper::strtolower($_SERVER['HTTP_X_SECURE'])) !== 'off'))
            return true;
        else
            return false;
    }

    public function get_is_localhost()
    {
        $patterns = array('localhost', 'local.dev', '127.0.0.1', '::1');

        foreach ($patterns as $value)
        {
            if (TextHelper::strpos(self::get_http_host(), $value) !== false)
                return true;
        }

        return false;
    }

    public function get_site_url()
    {
        return 'http' . ($this->get_is_https() ? 's' : '') . '://' . self::get_http_host();
    }

    // get full site domain url
    public function get_site_domain_name()
    {
        return self::get_http_host();
    }

    // get site domain name (without host)
    public function get_domain_name()
    {
        $pieces = parse_url(self::get_site_url());
        $domain = isset($pieces['host']) ? $pieces['host'] : '';
        if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/iu', $domain, $regs))
            return $regs['domain'];

        return false;
    }

    public function get_is_subdomain()
    {
        return $this->get_site_domain_name() != $this->get_domain_name() && !preg_match('/www./u', $this->get_site_domain_name());
    }

    public function get_user_agent()
    {
        return isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    }

    public function get_url_referrer()
    {
        return isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
    }

    public function is_mobile_device()
    {
        return isset($_SERVER['HTTP_USER_AGENT']) ? preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', substr($_SERVER['HTTP_USER_AGENT'], 0, 4)) : false;
    }

    public function is_search_engine_robot()
    {
        return Robots::is_robot();
    }

    public function get_ip_address()
    {
        if ($_SERVER)
        {
            if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE))
            {
                if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false)
                {
                    $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                    $ip=$iplist[0]; // we keep only the first, "normally" it's the client IP if the header was not forged
                }
                else {
                    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
                }
            }
            elseif (isset($_SERVER['HTTP_CLIENT_IP']))
            {
                $ip = $_SERVER['HTTP_CLIENT_IP'];
            }
            elseif(isset($_SERVER['HTTP_REMOTE_IP']))
            {
                $ip=$_SERVER['HTTP_REMOTE_IP'];
            }
            else
            {
                $ip = $_SERVER['REMOTE_ADDR'];
            }
        }
        else
        {
            if (getenv('HTTP_X_FORWARDED_FOR'))
            {
                $ip = getenv('HTTP_X_FORWARDED_FOR');
            }
            elseif (getenv('HTTP_CLIENT_IP'))
            {
                $ip = getenv('HTTP_CLIENT_IP');
            }
            elseif(getenv('HTTP_REMOTE_IP'))
            {
                $ip=getenv('HTTP_REMOTE_IP');
            }
            else
            {
                $ip = getenv('REMOTE_ADDR');
            }
        }

        if (filter_var($ip, FILTER_VALIDATE_IP))
        {
            return $ip;
        }
        else
        {
            return '0.0.0.0';
        }
    }
}
?>