api.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. define('BX_API', true);
  3. require_once('./inc/header.inc.php');
  4. if (bx_get('ses_sync') ){
  5. $aData = (new BxDolSessionQuery())->getCookie(bx_get('ses_sync'));
  6. if ($aData){
  7. $aCookies = json_decode($aData, true);
  8. foreach ($aCookies as $i => $aCookie){
  9. //unset($_COOKIE[$aCookie[0]]);
  10. //setcookie($aCookie[0], '', -1, '/');
  11. // $aCookie[2]['domain']='';
  12. setcookie($aCookie[0], $aCookie[1], $aCookie[2]);
  13. }
  14. }
  15. echo json_encode([$aData]);
  16. exit();
  17. }
  18. require_once(BX_DIRECTORY_PATH_INC . "profiles.inc.php");
  19. require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
  20. header('Content-Type: application/json');
  21. bx_api_check_access();
  22. // prepare params
  23. $aRequest = isset($_GET['r']) ? explode('/', $_GET['r']) : [];
  24. $a = ['sModule', 'sMethod', 'sClass'];
  25. foreach ($aRequest as $i => $v)
  26. if (isset($a[$i]) && preg_match('/^[A-Za-z0-9_-]+$/', $v))
  27. ${$a[$i]} = $v;
  28. if (!isset($sClass))
  29. $sClass = 'Module';
  30. foreach ($a as $v) {
  31. if (!isset($$v)) {
  32. header('HTTP/1.0 404 Not Found');
  33. header('Status: 404 Not Found');
  34. echo json_encode(['status' => 404, 'error' => _t("_sys_request_page_not_found_cpt")]);
  35. exit;
  36. }
  37. }
  38. // check if service exists
  39. if (!BxDolRequest::serviceExists($sModule, $sMethod, $sClass)) {
  40. header('HTTP/1.0 404 Not Found');
  41. header('Status: 404 Not Found');
  42. echo json_encode(['status' => 404, 'error' => _t("_sys_request_page_not_found_cpt")]);
  43. exit;
  44. }
  45. // check if service is safe
  46. if (!getParam('sys_api_access_unsafe_services')) {
  47. $b = BxDolRequest::serviceExists($sModule, 'is_safe_service', 'system' == $sModule ? 'TemplServices' : 'Module');
  48. $bSafe = $b ? BxDolService::call($sModule, 'is_safe_service', array($sMethod), 'system' == $sModule ? 'TemplServices' : 'Module') : false;
  49. $bPublic = false;
  50. if (!$bSafe) {
  51. $b = BxDolRequest::serviceExists($sModule, 'is_public_service', 'system' == $sModule ? 'TemplServices' : 'Module');
  52. $bPublic = $b ? BxDolService::call($sModule, 'is_public_service', array($sMethod), 'system' == $sModule ? 'TemplServices' : 'Module') : false;
  53. }
  54. if (!$bPublic && !$bSafe) {
  55. header('HTTP/1.0 403 Forbidden');
  56. header('Status: 403 Forbidden');
  57. echo json_encode(['status' => 403, 'error' => _t("_Access denied")]);
  58. exit;
  59. }
  60. }
  61. // call service
  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. // check output and return JSON
  70. if (is_array($mixedRet) && isset($mixedRet['error'])) {
  71. header('HTTP/1.0 500 Internal Server Error');
  72. header('Status: 500 Internal Server Error');
  73. $a = [
  74. 'status' => isset($mixedRet['code']) ? $mixedRet['code'] : 500,
  75. 'error' => isset($mixedRet['desc']) ? $mixedRet['desc'] : $mixedRet['error'],
  76. ];
  77. if (isset($mixedRet['code']))
  78. $a['code'] = $mixedRet['code'];
  79. echo json_encode($a);
  80. exit;
  81. }
  82. $aRv = [
  83. 'status' => 200,
  84. 'module' => $sModule,
  85. 'method' => $sMethod,
  86. 'params' => $aParams,
  87. 'data' => $mixedRet,
  88. ];
  89. if (isset($GLOBALS['session_key'])){
  90. $sKey = (new BxDolSessionQuery())->addCookie(json_encode($GLOBALS['session_key']));
  91. $aRv['session_key'] = $sKey;
  92. }
  93. echo json_encode($aRv);