index.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. const IN_API = true;
  3. const IN_RESTFUL = true;
  4. const IN_MOBILE_API = true;
  5. if(!empty($_POST['debug'])) {
  6. define('IN_RESTFUL_DEBUG', true);
  7. }
  8. require_once 'class_restful.php';
  9. $_ENV['restful'] = new _dzRestful($_POST);
  10. [$api, $ver] = $_ENV['restful']->parseQuery();
  11. if($api[0] == 'token') {
  12. $_COOKIE = [];
  13. require_once '../../source/class/class_core.php';
  14. $discuz = C::app();
  15. $discuz->init_cron = false;
  16. $discuz->init_session = false;
  17. $discuz->init();
  18. //检测 appid 的有效性
  19. $_ENV['restful']->checkSign();
  20. //生成 token
  21. $token = strtoupper(random(16));
  22. $tokenData = $_ENV['restful']->isRefreshToken() ?
  23. $_ENV['restful']->refreshTokenData() :
  24. $_ENV['restful']->newTokenData();
  25. $_ENV['restful']->setToken($token, $tokenData);
  26. if($_ENV['restful']->isRefreshToken()) {
  27. $_ENV['restful']->delTokenData();
  28. }
  29. $_ENV['restful']->output([
  30. 'ret' => 0,
  31. 'token' => $token,
  32. 'expires_in' => TIMESTAMP + $_ENV['restful']::TokenTTL,
  33. ]);
  34. } elseif($api[0] == 'callback') {
  35. $_ENV['authtoken'] = $api[1];
  36. $_ENV['returntype'] = !empty($api[2]) ? $api[2] : '';
  37. require_once '../../source/class/class_core.php';
  38. $discuz = C::app();
  39. $discuz->init_cron = false;
  40. $discuz->init_session = false;
  41. $discuz->init();
  42. if(!$_G['uid']) {
  43. $authed = false;
  44. } else {
  45. $authed = $_ENV['restful']->setAuthToken($_ENV['authtoken'], [$_G['uid'], time()]);
  46. }
  47. if($authed) {
  48. require_once libfile('function/member');
  49. clearcookies();
  50. }
  51. if($_ENV['returntype'] == 'json') {
  52. if($authed) {
  53. $_ENV['restful']->error(0);
  54. } else {
  55. $_ENV['restful']->error(-119);
  56. }
  57. } elseif($_ENV['returntype'] == 'html') {
  58. $message = $authed ? lang('core', 'restful_auth_success') : lang('core', 'restful_auth_error');
  59. include template('common/header_common');
  60. include template('common/restful_auth');
  61. } else {
  62. if($authed) {
  63. echo lang('core', 'restful_auth_success');
  64. } else {
  65. echo lang('core', 'restful_auth_error');
  66. }
  67. }
  68. } elseif($api[0] == 'authtoken') {
  69. require_once '../../source/class/class_core.php';
  70. $discuz = C::app();
  71. $discuz->init_cron = false;
  72. $discuz->init_session = false;
  73. $discuz->init();
  74. $data = $_ENV['restful']->getAuthToken($_GET['authtoken']);
  75. if(!$data) {
  76. $_ENV['restful']->error(-119);
  77. } else {
  78. // token校验
  79. $_ENV['restful']->checkToken();
  80. require_once libfile('function/member');
  81. $member = getuserbyuid($data[0]);
  82. if(!$member) {
  83. $_ENV['restful']->error(-119);
  84. }
  85. setloginstatus($member, 2592000);
  86. $_ENV['restful']->convertOutput(['member/uid' => 'uid']);
  87. }
  88. } elseif($api[0] == 'deltoken') {
  89. $_ENV['restful']->delTokenData();
  90. $_ENV['restful']->output([
  91. 'ret' => 0,
  92. 'token' => '',
  93. 'data' => [
  94. 'msg' => 'ok'
  95. ]
  96. ]);
  97. } else {
  98. define('IN_RESTFUL_API', true);
  99. //检测 appid 的有效性
  100. $_ENV['restful']->checkSign();
  101. // token校验
  102. $_ENV['restful']->checkToken();
  103. // 初始化接口参数
  104. $_ENV['restful']->initParam($api, $ver);
  105. // 接口频率控制
  106. $_ENV['restful']->apiFreqCheck();
  107. // 接口权限校验
  108. $_ENV['restful']->apiPermCheck();
  109. // script校验
  110. $script = $_ENV['restful']->scriptCheck();
  111. // 释放 GPC
  112. $_GET = $_ENV['restful']->paramDecode('get');
  113. $_POST = $_ENV['restful']->paramDecode('post');
  114. $_COOKIE = $_ENV['restful']->sessionDecode();
  115. $requestParams = $_ENV['restful']->getRequestParam();
  116. if($requestParams) {
  117. if(!empty($requestParams['GET']) && is_array($requestParams['GET'])) {
  118. foreach($requestParams['GET'] as $k => $v) {
  119. $_GET[$k] = $v;
  120. }
  121. }
  122. if(!empty($_GET)) {
  123. $_SERVER['QUERY_STRING'] = http_build_query($_GET);
  124. }
  125. if(!empty($requestParams['POST']) && is_array($requestParams['POST'])) {
  126. foreach($requestParams['POST'] as $k => $v) {
  127. $_POST[$k] = $v;
  128. }
  129. }
  130. if(!empty($requestParams['COOKIE']) && is_array($requestParams['COOKIE'])) {
  131. foreach($requestParams['COOKIE'] as $k => $v) {
  132. $_COOKIE[$k] = $v;
  133. }
  134. }
  135. }
  136. foreach($_COOKIE as $k => $v) {
  137. !empty($v) && setcookie($k, $v);
  138. }
  139. if(!defined('IN_RESTFUL_DEBUG')) {
  140. // 准备输出
  141. [$shutdownFunc, $output] = $_ENV['restful']->getShutdownFunc();
  142. // 运行 script
  143. register_shutdown_function([$_ENV['restful'], $shutdownFunc], $output);
  144. }
  145. $empty = [];
  146. $_ENV['restful']->plugin('before', $empty);
  147. try {
  148. $_GET['index'] = $script;
  149. chdir('../../');
  150. require './index.php';
  151. } catch (Exception $e) {
  152. $_ENV['restful']->error(-100);
  153. }
  154. }