api.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. define('BX_API', true);
  3. require_once('./inc/header.inc.php');
  4. require_once(BX_DIRECTORY_PATH_INC . "profiles.inc.php");
  5. require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
  6. header('Content-Type: application/json');
  7. bx_api_check_access();
  8. if (bx_get('cnf') ){
  9. echo getParam('sys_api_config');
  10. exit();
  11. }
  12. // prepare params
  13. $aRequest = isset($_GET['r']) ? explode('/', $_GET['r']) : [];
  14. $a = ['sModule', 'sMethod', 'sClass'];
  15. foreach ($aRequest as $i => $v)
  16. if (isset($a[$i]) && preg_match('/^[A-Za-z0-9_-]+$/', $v))
  17. ${$a[$i]} = $v;
  18. if (!isset($sClass))
  19. $sClass = 'Module';
  20. foreach ($a as $v) {
  21. if (!isset($$v)) {
  22. header('HTTP/1.0 404 Not Found');
  23. header('Status: 404 Not Found');
  24. echo json_encode(['status' => 404, 'error' => _t("_sys_request_page_not_found_cpt")]);
  25. exit;
  26. }
  27. }
  28. // check if service exists
  29. if (!BxDolRequest::serviceExists($sModule, $sMethod, $sClass)) {
  30. header('HTTP/1.0 404 Not Found');
  31. header('Status: 404 Not Found');
  32. echo json_encode(['status' => 404, 'error' => _t("_sys_request_page_not_found_cpt")]);
  33. exit;
  34. }
  35. // check if service is safe
  36. if (!getParam('sys_api_access_unsafe_services')) {
  37. $b = BxDolRequest::serviceExists($sModule, 'is_safe_service', 'system' == $sModule ? 'TemplServices' : 'Module');
  38. $bSafe = $b ? BxDolService::call($sModule, 'is_safe_service', array($sMethod), 'system' == $sModule ? 'TemplServices' : 'Module') : false;
  39. $bPublic = false;
  40. if (!$bSafe) {
  41. $b = BxDolRequest::serviceExists($sModule, 'is_public_service', 'system' == $sModule ? 'TemplServices' : 'Module');
  42. $bPublic = $b ? BxDolService::call($sModule, 'is_public_service', array($sMethod), 'system' == $sModule ? 'TemplServices' : 'Module') : false;
  43. }
  44. if (!$bPublic && !$bSafe) {
  45. header('HTTP/1.0 403 Forbidden');
  46. header('Status: 403 Forbidden');
  47. echo json_encode(['status' => 403, 'error' => _t("_Access denied")]);
  48. exit;
  49. }
  50. }
  51. // call service
  52. if (!($aParams = bx_get('params')))
  53. $aParams = array();
  54. elseif (is_string($aParams) && preg_match('/^\[.*\]$/', $aParams))
  55. $aParams = @json_decode($aParams);
  56. if (!is_array($aParams))
  57. $aParams = array($aParams);
  58. $mixedRet = BxDolService::call($sModule, $sMethod, $aParams, $sClass);
  59. // check output and return JSON
  60. if (is_array($mixedRet) && isset($mixedRet['error'])) {
  61. header('HTTP/1.0 500 Internal Server Error');
  62. header('Status: 500 Internal Server Error');
  63. $a = [
  64. 'status' => isset($mixedRet['code']) ? $mixedRet['code'] : 500,
  65. 'error' => isset($mixedRet['desc']) ? $mixedRet['desc'] : $mixedRet['error'],
  66. ];
  67. if (isset($mixedRet['code']))
  68. $a['code'] = $mixedRet['code'];
  69. echo json_encode($a);
  70. exit;
  71. }
  72. $aRv = [
  73. 'status' => 200,
  74. 'module' => $sModule,
  75. 'method' => $sMethod,
  76. 'params' => $aParams,
  77. 'data' => $mixedRet,
  78. ];
  79. echo json_encode($aRv);