Newer
Older
ubFramework / Source / include / core / http / Request.php
<?php

class Sphere_Request {

  // Datastore
  private $valuemap;

  private $rawvaluemap;

  private $defaultmap = array ();

  /**
   * Default constructor
   */
  function __construct($values, $rawvalues = array(), $stripifgpc = true) {

    $this->valuemap = $values;
    $this->rawvaluemap = $rawvalues;
    if ($stripifgpc && ! empty ( $this->valuemap ) && get_magic_quotes_gpc ()) {
      $this->valuemap = $this->stripslashes_recursive ( $this->valuemap );
      $this->rawvaluemap = $this->stripslashes_recursive ( $this->rawvaluemap );
    }

  }

  /**
   * Strip the slashes recursively on the values.
   */
  function stripslashes_recursive($value) {

    $value = is_array ( $value ) ? array_map ( array (
        $this,
        'stripslashes_recursive'
    ), $value ) : stripslashes ( $value );
    return $value;

  }

  /**
   * Get key value (otherwise default value)
   */
  function get($key, $defvalue = '') {

    $value = $defvalue;
    if (isset ( $this->valuemap [$key] )) {
      $value = $this->valuemap [$key];
    }
    if ($value === '' && isset ( $this->defaultmap [$key] )) {
      $value = $this->defaultmap [$key];
    }

    $isJSON = false;
    if (is_string ( $value )) {
      // NOTE: Zend_Json or json_decode gets confused with big-integers (when passed as string)
      // and convert them to ugly exponential format - to overcome this we are performin a pre-check
      if (strpos ( $value, "[" ) === 0 || strpos ( $value, "{" ) === 0) {
        $isJSON = true;
      }
    }
    if ($isJSON) {
      $oldValue = Zend_Json::$useBuiltinEncoderDecoder;
      Zend_Json::$useBuiltinEncoderDecoder = false;
      $decodeValue = Zend_Json::decode ( $value );
      if (isset ( $decodeValue )) {
        $value = $decodeValue;
      }
      Zend_Json::$useBuiltinEncoderDecoder = $oldValue;
    }

    // Handled for null because vtlib_purify returns empty string
    if (! empty ( $value )) {
      $value = spherelib_purify ( $value );
    }
    return $value;

  }

  /**
   * Get value for key as boolean
   */
  function getBoolean($key, $defvalue = '') {

    return strcasecmp ( 'true', $this->get ( $key, $defvalue ) . '' ) === 0;

  }

  /**
   * Function to get the value if its safe to use for SQL Query (column).
   *
   * @param <String> $key
   * @param <Boolean> $skipEmpty
   *          - Skip the check if string is empty
   * @return Value for the given key
   */
  public function getForSql($key, $skipEmtpy = true) {

    return Vtiger_Util_Helper::validateStringForSql ( $this->get ( $key ), $skipEmtpy );

  }

  /**
   * Get data map
   */
  function getAll() {

    return $this->valuemap;

  }

  /**
   * Check for existence of key
   */
  function has($key) {

    return isset ( $this->valuemap [$key] );

  }

  /**
   * Is the value (linked to key) empty?
   */
  function isEmpty($key) {

    $value = $this->get ( $key );
    return empty ( $value );

  }

  /**
   * Get the raw value (if present) ignoring primary value.
   */
  function getRaw($key, $defvalue = '') {

    if (isset ( $this->rawvaluemap [$key] )) {
      return $this->rawvaluemap [$key];
    }
    return $this->get ( $key, $defvalue );

  }

  /**
   * Set the value for key
   */
  function set($key, $newvalue) {

    $this->valuemap [$key] = $newvalue;

  }

  /**
   * Set the value for key, both in the object as well as global $_REQUEST variable
   */
  function setGlobal($key, $newvalue) {

    $this->set ( $key, $newvalue );
    // TODO - This needs to be cleaned up once core apis are made independent of REQUEST variable.
    // This is added just for backward compatibility
    $_REQUEST [$key] = $newvalue;

  }

  /**
   * Set default value for key
   */
  function setDefault($key, $defvalue) {

    $this->defaultmap [$key] = $defvalue;

  }

  /**
   * Shorthand function to get value for (key=_operation|operation)
   */
  function getOperation() {

    return $this->get ( '_operation', $this->get ( 'operation' ) );

  }

  /**
   * Shorthand function to get value for (key=_session)
   */
  function getSession() {

    return $this->get ( '_session', $this->get ( 'session' ) );

  }

  /**
   * Shorthand function to get value for (key=mode)
   */
  function getMode() {

    return $this->get ( 'mode' );

  }

  function getModule($raw = true) {

    $moduleName = $this->get ( 'module' );
    if (! $raw) {
      $parentModule = $this->get ( 'parent' );
      if (! empty ( $parentModule )) {
        $moduleName = $parentModule . ':' . $moduleName;
      }
    }
    return $moduleName;

  }

  function isAjax() {

    if (! empty ( $_SERVER ['HTTP_X_PJAX'] ) && $_SERVER ['HTTP_X_PJAX'] == true) {
      return true;
    }
    elseif (! empty ( $_SERVER ['HTTP_X_REQUESTED_WITH'] )) {
      return true;
    }
    return false;

  }

  /**
   * Validating incoming request.
   */
  function validateReadAccess() {

    $this->validateReferer ();
    // TODO validateIP restriction?
    return true;

  }

  function validateWriteAccess($skipRequestTypeCheck = false) {

    if (! $skipRequestTypeCheck) {
      if ($_SERVER ['REQUEST_METHOD'] != 'POST')
        throw new Exception ( 'Invalid request' );
    }
    $this->validateReadAccess ();
    $this->validateCSRF ();
    return true;

  }

  protected function validateReferer() {

    $user = sphere_global ( 'current_user' );
    // Referer check if present - to over come
    if (isset ( $_SERVER ['HTTP_REFERER'] ) && $user) { // Check for user post authentication.
      global $site_URL;
      if ((stripos ( $_SERVER ['HTTP_REFERER'], $site_URL ) !== 0) && ($this->get ( 'module' ) != 'Install')) {
        throw new Exception ( 'Illegal request' );
      }
    }
    return true;

  }

  protected function validateCSRF() {

    if (! csrf_check ( false )) {
      throw new Exception ( 'Unsupported request' );
    }

  }

}