api.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. require_once('./inc/header.inc.php');
  3. require_once(BX_DIRECTORY_PATH_INC . "profiles.inc.php");
  4. require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
  5. define('BX_API', true);
  6. header('Content-Type: application/json');
  7. if (!getParam('sys_api_enable')) {
  8. header('HTTP/1.0 403 Forbidden');
  9. echo json_encode(['status' => 403, 'error' => _t("_Access denied")]);
  10. exit;
  11. }
  12. $sOriginHeader = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : false;
  13. $sAuthHeader = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : false;
  14. if (getParam('sys_api_access_by_origin') && $sOriginHeader) {
  15. if (parse_url($sOriginHeader, PHP_URL_HOST) != parse_url(BX_DOL_URL_ROOT, PHP_URL_HOST)) {
  16. if (!BxDolApiQuery::getInstance()->getOrigin($sOriginHeader)) {
  17. header('HTTP/1.0 403 Forbidden');
  18. echo json_encode(['status' => 403, 'error' => _t("_Access denied")]);
  19. exit;
  20. }
  21. header('Access-Control-Allow-Origin: ' . $sOriginHeader);
  22. if ('OPTIONS' == $_SERVER['REQUEST_METHOD']) {
  23. header('Access-Control-Allow-Methods: POST, GET');
  24. header('Access-Control-Allow-Headers: Accept-Encoding, Authorization, Cache-Control, Connection, Host, Origin, Pragma, Referer, User-Agent, X-Custom-Header, X-Requested-With');
  25. exit;
  26. }
  27. }
  28. }
  29. elseif ($sAuthHeader && getParam('sys_api_access_by_key')) {
  30. if (!BxDolApiQuery::getInstance()->getKey($sAuthHeader)) {
  31. header('HTTP/1.0 403 Forbidden');
  32. echo json_encode(['status' => 403, 'error' => _t("_Access denied")]);
  33. exit;
  34. }
  35. }
  36. else {
  37. header('HTTP/1.0 403 Forbidden');
  38. echo json_encode(['status' => 403, 'error' => _t("_Access denied")]);
  39. exit;
  40. }
  41. $aRequest = isset($_GET['r']) ? explode('/', $_GET['r']) : [];
  42. $a = ['sModule', 'sMethod', 'sClass'];
  43. foreach ($aRequest as $i => $v)
  44. if (isset($a[$i]) && preg_match('/^[A-Za-z0-9_-]+$/', $v))
  45. ${$a[$i]} = $v;
  46. if (!isset($sClass))
  47. $sClass = 'Module';
  48. foreach ($a as $v) {
  49. if (!isset($$v)) {
  50. header('HTTP/1.0 404 Not Found');
  51. header('Status: 404 Not Found');
  52. echo json_encode(['status' => 404, 'error' => _t("_sys_request_page_not_found_cpt")]);
  53. exit;
  54. }
  55. }
  56. if (!BxDolRequest::serviceExists($sModule, $sMethod, $sClass)) {
  57. header('HTTP/1.0 404 Not Found');
  58. header('Status: 404 Not Found');
  59. echo json_encode(['status' => 404, 'error' => _t("_sys_request_page_not_found_cpt")]);
  60. exit;
  61. }
  62. if (!($aParams = bx_get('params')))
  63. $aParams = array();
  64. elseif (is_string($aParams) && preg_match('/^\[.*\]$/', $aParams))
  65. $aParams = @json_decode($aParams);
  66. if (!is_array($aParams))
  67. $aParams = array($aParams);
  68. $mixedRet = BxDolService::call($sModule, $sMethod, $aParams, $sClass);
  69. if (is_array($mixedRet) && isset($mixedRet['error'])) {
  70. header('HTTP/1.0 500 Internal Server Error');
  71. header('Status: 500 Internal Server Error');
  72. $a = [
  73. 'status' => 500,
  74. 'error' => isset($mixedRet['desc']) ? $mixedRet['desc'] : $mixedRet['error']
  75. ];
  76. if (isset($mixedRet['code']))
  77. $a['code'] = $mixedRet['code'];
  78. echo json_encode($a);
  79. exit;
  80. }
  81. echo json_encode([
  82. 'status' => 200,
  83. 'module' => $sModule,
  84. 'method' => $sMethod,
  85. 'params' => $aParams,
  86. 'data' => $mixedRet,
  87. ]);