1
0

api.php 3.1 KB

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