2017-04-28 19:34:27 +02:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
class RestQuery{
|
2017-05-11 23:10:01 +02:00
|
|
|
|
protected $response_code;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
public $response_message; //array
|
2017-05-11 23:10:01 +02:00
|
|
|
|
protected $blog_id;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
protected $required_perms = 'admin'; //must be changed by the childs class
|
|
|
|
|
/*
|
|
|
|
|
should be:
|
2017-06-20 19:40:56 +02:00
|
|
|
|
'admin' administrateur
|
|
|
|
|
'usage' gérer ses propres billets et commentaires
|
|
|
|
|
'publish' publier des billets et des commentaires
|
|
|
|
|
'delete' supprimer des billets et des commentaires
|
|
|
|
|
'contentadmin' gérer tous les billets et commentaires
|
|
|
|
|
'categories' gérer les catégories
|
|
|
|
|
'media' gérer ses propres médias
|
|
|
|
|
'media_admin' gérer tous les médias
|
|
|
|
|
'none' //must have an account (without any rights)
|
2017-05-05 21:46:14 +02:00
|
|
|
|
'unauth' //Open to the world
|
|
|
|
|
*/
|
|
|
|
|
|
2017-06-20 19:40:56 +02:00
|
|
|
|
|
2017-05-05 21:46:14 +02:00
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
|
2017-09-08 09:18:48 +02:00
|
|
|
|
$this->response_code = 404;
|
|
|
|
|
$this->response_message = array(
|
|
|
|
|
"error" => "Method not found",
|
|
|
|
|
"code" => 404
|
|
|
|
|
);
|
2017-05-05 21:46:14 +02:00
|
|
|
|
}
|
2017-05-18 21:49:46 +02:00
|
|
|
|
|
2017-09-08 09:18:48 +02:00
|
|
|
|
protected function is404($customMessage = '')
|
|
|
|
|
{
|
|
|
|
|
$this->response_code = 404;
|
|
|
|
|
if (empty($customMessage))
|
|
|
|
|
$this->response_message = array('code' => 404, 'error' => 'Resource not found');
|
|
|
|
|
else
|
|
|
|
|
$this->response_message = array('code' => 404, 'error' => $customMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-05 21:46:14 +02:00
|
|
|
|
/**
|
|
|
|
|
* Check if required fields are set
|
|
|
|
|
* $strict => Go on error if a additionnal field is given
|
|
|
|
|
*/
|
|
|
|
|
protected function check_for_required_fields($arrayToCheck,$fieldsRequired,$fieldsOptionals = '')
|
|
|
|
|
{
|
|
|
|
|
if ($fieldsOptionals == ''){
|
|
|
|
|
$fieldsOptionals == array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$fieldsSetted = array_keys($arrayToCheck);
|
|
|
|
|
|
|
|
|
|
if($fieldsOptionals == ''){
|
|
|
|
|
if(empty(array_diff($fieldsSetted,$fieldsRequired))){
|
|
|
|
|
return true;
|
|
|
|
|
}else{
|
2017-05-11 23:10:01 +02:00
|
|
|
|
$this->response_code = 400;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
$this->response_message = array(
|
|
|
|
|
"error" => "Only and each of following parameters ".
|
|
|
|
|
implode(", ",$fieldsRequired)." are required",
|
|
|
|
|
"code" => 400
|
|
|
|
|
);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
//check if all required fields are set
|
|
|
|
|
foreach($fieldsRequired as $key){
|
|
|
|
|
if(!isset($arrayToCheck[$key])){
|
2017-05-11 23:10:01 +02:00
|
|
|
|
$this->response_code = 400;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
$this->response_message = array(
|
|
|
|
|
"error" => "field ".$key." is needed",
|
|
|
|
|
"code" => 400
|
|
|
|
|
);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//check if a field is not in required and in fieldsOptionals
|
|
|
|
|
foreach($fieldsSetted as $keyToTest){
|
|
|
|
|
if((!in_array($keyToTest,$fieldsRequired)) && (!in_array($keyToTest,$fieldsOptionals))){
|
2017-06-20 19:40:56 +02:00
|
|
|
|
$this->response_code = 400;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
$this->response_message = array(
|
|
|
|
|
"error" => "Unwanted field '".$keyToTest."'",
|
|
|
|
|
"code" => 400
|
|
|
|
|
);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2017-09-08 09:18:48 +02:00
|
|
|
|
/*
|
|
|
|
|
* IN $RawFilters string urlencoded corresponding to $_GET['filters']
|
|
|
|
|
* IN $permittedKeys array listing the keys the filter can Used
|
|
|
|
|
* OUT array ('KeyName' => 'expectedValue')
|
|
|
|
|
*/
|
|
|
|
|
protected function getFilters($rawFilters,$permittedKeys)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$subject = urldecode($rawFilters);
|
|
|
|
|
$matchExpr = '/(?<=^|\\s)([^=\\s]+)="((?:[^\\\\"]|\\\\.)*)"/';
|
|
|
|
|
$replaceExpr = '/\\\\./';
|
|
|
|
|
|
|
|
|
|
$replaceCallback = function($match) {
|
|
|
|
|
switch ($match[0][1]) {
|
|
|
|
|
case 'r': return "\r";
|
|
|
|
|
case 'n': return "\n";
|
|
|
|
|
default: return $match[0][1];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
preg_match_all($matchExpr, $subject, $matches);
|
|
|
|
|
|
|
|
|
|
$result = array();
|
|
|
|
|
foreach ($matches[1] as $i => $key) {
|
|
|
|
|
if(!in_array($key,$permittedKeys)){
|
|
|
|
|
$this->response_code = 400;
|
|
|
|
|
$this->response_message = array("code" => 400,
|
|
|
|
|
"message" => "UnAllowed filter ".$key);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$result[$key] = preg_replace_callback($replaceExpr, $replaceCallback, $matches[2][$i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-05 21:46:14 +02:00
|
|
|
|
protected function body_to_array($body){
|
|
|
|
|
if($ret = json_decode($body,true)){
|
|
|
|
|
return $ret;
|
|
|
|
|
}else{
|
2017-05-18 21:49:46 +02:00
|
|
|
|
$this->response_code = 400;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
$this->response_message = array(
|
|
|
|
|
'error' => 'Can\'t parse input JSON',
|
|
|
|
|
'code' => 400
|
|
|
|
|
);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
protected function is_allowed()
|
|
|
|
|
{
|
|
|
|
|
global $core;
|
|
|
|
|
if($core->auth){
|
|
|
|
|
$perms = $core->auth->getAllPermissions();
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 21:49:46 +02:00
|
|
|
|
$is_allowed = false;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
switch($this->required_perms){
|
2017-05-18 21:49:46 +02:00
|
|
|
|
|
2017-05-05 21:46:14 +02:00
|
|
|
|
case 'unauth':
|
|
|
|
|
//on verifie quand même que l'API est ouverte
|
2017-05-18 21:49:46 +02:00
|
|
|
|
if(
|
|
|
|
|
(($core->blog->settings->rest->rest_is_open) && ($core->auth === false))
|
|
|
|
|
||($core->auth !== false)
|
|
|
|
|
){
|
|
|
|
|
$is_allowed = true;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
}
|
2017-05-11 23:10:01 +02:00
|
|
|
|
|
2017-05-18 21:49:46 +02:00
|
|
|
|
break;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
case 'none':
|
|
|
|
|
//user must be valid
|
2017-05-18 21:49:46 +02:00
|
|
|
|
if($core->auth){
|
|
|
|
|
$is_allowed = true;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'media_admin':
|
|
|
|
|
break;
|
|
|
|
|
case 'media':
|
|
|
|
|
break;
|
|
|
|
|
case 'categories':
|
|
|
|
|
break;
|
|
|
|
|
case 'contentadmin':
|
|
|
|
|
break;
|
|
|
|
|
case 'delete':
|
|
|
|
|
break;
|
|
|
|
|
case 'publish':
|
|
|
|
|
break;
|
|
|
|
|
case 'usage':
|
|
|
|
|
break;
|
|
|
|
|
case 'admin':
|
2017-05-18 21:49:46 +02:00
|
|
|
|
if (($core->auth !== false) && $core->auth->isSuperAdmin()){
|
|
|
|
|
$is_allowed = true;
|
2017-05-05 21:46:14 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2017-05-18 21:49:46 +02:00
|
|
|
|
if($is_allowed){
|
|
|
|
|
return true;
|
|
|
|
|
}else{
|
|
|
|
|
$this->response_code = 403;
|
|
|
|
|
$this->response_message = array('code' => 403, 'error' => 'Unauthorized');
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2017-05-05 21:46:14 +02:00
|
|
|
|
}
|
2017-06-20 19:40:56 +02:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Quand l'API permet à la fois une structure
|
|
|
|
|
* {
|
|
|
|
|
* key1 : value1,
|
|
|
|
|
* key2 : value2
|
|
|
|
|
* }
|
|
|
|
|
*
|
|
|
|
|
* et une structure avec plusieurs enregistrements
|
|
|
|
|
* [
|
|
|
|
|
* {
|
|
|
|
|
* key1 : value1.1,
|
|
|
|
|
* key2 : value2.1
|
|
|
|
|
* },
|
|
|
|
|
* {
|
|
|
|
|
* key1 : value1.2,
|
|
|
|
|
* key2 : value2.2
|
|
|
|
|
* }
|
|
|
|
|
*]
|
|
|
|
|
*
|
|
|
|
|
* Cette function permet de tester quelle structure a un array, et retourne un array sous la deuxième
|
|
|
|
|
* structure
|
|
|
|
|
*
|
|
|
|
|
* IN: $arr L'array à tester
|
|
|
|
|
* $keyToTest: string Un nom de clef obligatoire qui servira à tester le type de structrure
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
public function arrayOfObjetsOrNot($arr,$keyToTest){
|
|
|
|
|
|
|
|
|
|
try{
|
|
|
|
|
if(isset($arr[$keyToTest])){
|
|
|
|
|
return array($arr);
|
|
|
|
|
}elseif(isset($arr[0][$keyToTest])){
|
|
|
|
|
return $arr;
|
|
|
|
|
}
|
|
|
|
|
}catch (Exception $e){
|
|
|
|
|
//parfois ça déconne
|
|
|
|
|
if(isset($arr[0][$keyToTest])){
|
|
|
|
|
return $arr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2017-05-11 23:10:01 +02:00
|
|
|
|
public function get_full_code_header($code=''){
|
|
|
|
|
if($code == ''){
|
|
|
|
|
$code = $this->response_code;
|
|
|
|
|
}
|
2017-05-05 21:46:14 +02:00
|
|
|
|
static $codes = array(
|
|
|
|
|
100 =>"Continue",
|
|
|
|
|
101 =>"Switching Protocols",
|
|
|
|
|
102 =>"Processing",
|
|
|
|
|
200 =>"OK",
|
|
|
|
|
201 =>"Created",
|
|
|
|
|
202 =>"Accepted",
|
|
|
|
|
203 =>"Non-Authoritative Information",
|
|
|
|
|
204 =>"No Content",
|
|
|
|
|
205 =>"Reset Content",
|
|
|
|
|
206 =>"Partial Content",
|
|
|
|
|
207 =>"Multi-Status",
|
|
|
|
|
210 =>"Content Different",
|
|
|
|
|
226 =>"IM Used",
|
|
|
|
|
300 =>"Multiple Choices",
|
|
|
|
|
301 =>"Moved Permanently",
|
|
|
|
|
302 =>"Moved Temporarily",
|
|
|
|
|
303 =>"See Other",
|
|
|
|
|
304 =>"Not Modified",
|
|
|
|
|
305 =>"Use Proxy",
|
|
|
|
|
306 =>"(aucun)",
|
|
|
|
|
307 =>"Temporary Redirect",
|
|
|
|
|
308 =>"Permanent Redirect",
|
|
|
|
|
310 =>"Too many Redirects",
|
|
|
|
|
400 =>"Bad Request",
|
|
|
|
|
401 =>"Unauthorized",
|
|
|
|
|
402 =>"Payment Required",
|
|
|
|
|
403 =>"Forbidden",
|
|
|
|
|
404 =>"Not Found",
|
|
|
|
|
405 =>"Method Not Allowed",
|
|
|
|
|
406 =>"Not Acceptable",
|
|
|
|
|
407 =>"Proxy Authentication Required",
|
|
|
|
|
408 =>"Request Time-out",
|
|
|
|
|
409 =>"Conflict",
|
|
|
|
|
410 =>"Gone",
|
|
|
|
|
411 =>"Length Required",
|
|
|
|
|
412 =>"Precondition Failed",
|
|
|
|
|
413 =>"Request Entity Too Large",
|
|
|
|
|
414 =>"Request-URI Too Long",
|
|
|
|
|
415 =>"Unsupported Media Type",
|
|
|
|
|
416 =>"Requested range unsatisfiable",
|
|
|
|
|
417 =>"Expectation failed",
|
|
|
|
|
418 =>"I’m a teapot",
|
|
|
|
|
421 =>"Bad mapping / Misdirected Request",
|
|
|
|
|
422 =>"Unprocessable entity",
|
|
|
|
|
423 =>"Locked",
|
|
|
|
|
424 =>"Method failure",
|
|
|
|
|
425 =>"Unordered Collection",
|
|
|
|
|
426 =>"Upgrade Required",
|
|
|
|
|
428 =>"Precondition Required",
|
|
|
|
|
429 =>"Too Many Requests",
|
|
|
|
|
431 =>"Request Header Fields Too Large",
|
|
|
|
|
449 =>"Retry With",
|
|
|
|
|
450 =>"Blocked by Windows Parental Controls",
|
|
|
|
|
451 =>"Unavailable For Legal Reasons",
|
|
|
|
|
456 =>"Unrecoverable Error"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if(isset($codes[$code])){
|
|
|
|
|
return "HTTP/1.0 ".$code." ".$codes[$code];
|
|
|
|
|
}else{
|
|
|
|
|
return "HTTP/1.0 ".$code." Something wrong happened";
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-08 09:18:48 +02:00
|
|
|
|
|
|
|
|
|
function rs_to_array($rs){
|
|
|
|
|
|
|
|
|
|
$arr = array();
|
|
|
|
|
|
|
|
|
|
while($rs->fetch()){
|
|
|
|
|
$r = array();
|
|
|
|
|
$columns = $rs->columns();
|
|
|
|
|
foreach($columns as $key){
|
|
|
|
|
$r[$key] = $rs->$key;
|
|
|
|
|
}
|
|
|
|
|
$arr[] = $r;
|
|
|
|
|
}
|
|
|
|
|
return $arr;
|
|
|
|
|
}
|
2017-04-28 19:34:27 +02:00
|
|
|
|
}
|