api.php 2.8 KB

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