<?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' );
}
}
}