/scripts/json.php

https://github.com/ciniki/core · PHP · 161 lines · 108 code · 12 blank · 41 comment · 51 complexity · 53b502e0138f8c945ed44331a8b0e58b MD5 · raw file

  1. <?php
  2. //
  3. // Description
  4. // -----------
  5. // The json.php file is the entry point for the API through the REST protocol.
  6. //
  7. //
  8. // Initialize Ciniki by including the ciniki_api.php
  9. //
  10. $start_time = microtime(true);
  11. global $ciniki_root;
  12. $ciniki_root = dirname(__FILE__);
  13. if( !file_exists($ciniki_root . '/ciniki-api.ini') ) {
  14. $ciniki_root = dirname(dirname(dirname(dirname(__FILE__))));
  15. }
  16. ini_set('display_errors', 'off');
  17. // loadMethod is required by all function to ensure the functions are dynamically loaded
  18. require_once($ciniki_root . '/ciniki-mods/core/private/loadMethod.php');
  19. require_once($ciniki_root . '/ciniki-mods/core/private/init.php');
  20. require_once($ciniki_root . '/ciniki-mods/core/private/checkSecureConnection.php');
  21. require_once($ciniki_root . '/ciniki-mods/core/private/callPublicMethod.php');
  22. require_once($ciniki_root . '/ciniki-mods/core/private/printHashToJSON.php');
  23. require_once($ciniki_root . '/ciniki-mods/core/private/printResponse.php');
  24. require_once($ciniki_root . '/ciniki-mods/core/private/syncQueueProcess.php');
  25. $rc = ciniki_core_init($ciniki_root, 'rest');
  26. if( $rc['stat'] != 'ok' ) {
  27. header("Content-Type: text/xml; charset=utf-8");
  28. ciniki_core_printHashToJSON($rc);
  29. exit;
  30. }
  31. //
  32. // Setup the $ciniki variable to hold all things ciniki.
  33. //
  34. $ciniki = $rc['ciniki'];
  35. //
  36. // Ensure the connection is over SSL
  37. //
  38. $rc = ciniki_core_checkSecureConnection($ciniki);
  39. if( $rc['stat'] != 'ok' ) {
  40. ciniki_core_printResponse($ciniki, $rc);
  41. exit;
  42. }
  43. //
  44. // Parse arguments
  45. //
  46. require_once($ciniki_root . '/ciniki-mods/core/private/parseRestArguments.php');
  47. $rc = ciniki_core_parseRestArguments($ciniki);
  48. if( $rc['stat'] != 'ok' ) {
  49. ciniki_core_printResponse($ciniki, $rc);
  50. exit;
  51. }
  52. //
  53. // Check if maintanence mode
  54. //
  55. if( isset($ciniki['config']['ciniki.core']['maintenance']) && $ciniki['config']['ciniki.core']['maintenance'] == 'on' ) {
  56. if( isset($ciniki['config']['ciniki.core']['maintenance.message']) && $ciniki['config']['ciniki.core']['maintenance.message'] != '' ) {
  57. $msg = $ciniki['config']['ciniki.core']['maintenance.message'];
  58. } else {
  59. $msg = "We are currently doing maintenance on the system and will be back soon.";
  60. }
  61. ciniki_core_printResponse($ciniki, array('stat'=>'fail', 'err'=>array('code'=>'', 'msg'=>$msg)));
  62. exit;
  63. }
  64. //
  65. // Once the REST specific stuff is done, pass the control to
  66. // ciniki.core.callPublicMethod()
  67. //
  68. $rc = ciniki_core_callPublicMethod($ciniki);
  69. if( isset($ciniki['config']['ciniki.core']['api.log.errors'])
  70. && $ciniki['config']['ciniki.core']['api.log.errors'] == 1
  71. && $rc['stat'] != 'ok' && isset($rc['err'])
  72. ) {
  73. error_log(print_r($rc['err'], true));
  74. }
  75. //
  76. // Check if there is a sync queue to process or email queue to process
  77. //
  78. if( (isset($ciniki['syncqueue']) && count($ciniki['syncqueue']) > 0)
  79. || (isset($ciniki['fbrefreshqueue']) && count($ciniki['fbrefreshqueue']) > 0)
  80. || (isset($ciniki['smsqueue']) && count($ciniki['smsqueue']) > 0)
  81. || (isset($ciniki['emailqueue']) && count($ciniki['emailqueue']) > 0)
  82. ) {
  83. if( $rc['stat'] != 'exit' ) {
  84. ob_start();
  85. if(isset($_SERVER['HTTP_ACCEPT_ENCODING'])
  86. && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
  87. ob_start("ob_gzhandler"); // Inner buffer when output is apache mod-deflate is enabled
  88. ciniki_core_printResponse($ciniki, $rc);
  89. ob_end_flush();
  90. } else {
  91. ciniki_core_printResponse($ciniki, $rc);
  92. }
  93. header("Connection: close");
  94. $contentlength = ob_get_length();
  95. header("Content-Length: $contentlength");
  96. ob_end_flush();
  97. ob_end_flush();
  98. flush();
  99. session_write_close();
  100. while(ob_get_level()>0) ob_end_clean();
  101. }
  102. // Run sms queue
  103. if( isset($ciniki['smsqueue']) && count($ciniki['smsqueue']) > 0 ) {
  104. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'smsQueueProcess');
  105. ciniki_core_smsQueueProcess($ciniki);
  106. }
  107. // Run email queue
  108. if( isset($ciniki['emailqueue']) && count($ciniki['emailqueue']) > 0 ) {
  109. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'emailQueueProcess');
  110. ciniki_core_emailQueueProcess($ciniki);
  111. }
  112. // Run facebook refresh queue
  113. if( isset($ciniki['fbrefreshqueue']) && count($ciniki['fbrefreshqueue']) > 0 ) {
  114. // FIXME: Facebook is blocking requests direct to this script
  115. // ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'fbRefreshQueueProcess');
  116. // ciniki_core_fbRefreshQueueProcess($ciniki);
  117. }
  118. // Run sync queue
  119. if( isset($ciniki['syncqueue']) && count($ciniki['syncqueue']) > 0 ) {
  120. if( isset($ciniki['synctenants']) && count($ciniki['synctenants']) > 0 ) {
  121. foreach($ciniki['synctenants'] as $tnid) {
  122. ciniki_core_syncQueueProcess($ciniki, $tnid);
  123. }
  124. } elseif( isset($ciniki['request']['args']['tnid']) ) {
  125. ciniki_core_syncQueueProcess($ciniki, $ciniki['request']['args']['tnid']);
  126. }
  127. }
  128. } else {
  129. //
  130. // Output the result in requested format
  131. //
  132. if( $rc['stat'] != 'exit' ) {
  133. ciniki_core_printResponse($ciniki, $rc);
  134. }
  135. }
  136. //
  137. // Capture errors in the database for easy review
  138. //
  139. if( $rc['stat'] == 'fail' ) {
  140. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'dbLogError');
  141. ciniki_core_dbLogError($ciniki, $rc['err']);
  142. }
  143. if( isset($ciniki['config']['ciniki.core']['microtime'])
  144. && $ciniki['config']['ciniki.core']['microtime'] == 'yes') {
  145. $end_time = microtime(true);
  146. error_log("PROF: microtime $end_time - $start_time = " . ($end_time - $start_time));
  147. }
  148. exit;
  149. ?>