RelayController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <?php
  2. namespace App\Controllers;
  3. use App\Models\Relay;
  4. use App\Models\Node;
  5. use App\Models\User;
  6. use App\Services\Auth;
  7. use App\Controllers\UserController;
  8. use App\Utils\Tools;
  9. use App\Services\Config;
  10. class RelayController extends UserController
  11. {
  12. public function index($request, $response, $args)
  13. {
  14. $pageNum = 1;
  15. $user = Auth::getUser();
  16. if (isset($request->getQueryParams()["page"])) {
  17. $pageNum = $request->getQueryParams()["page"];
  18. }
  19. $logs = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->paginate(15, ['*'], 'page', $pageNum);
  20. $logs->setPath('/user/relay');
  21. $is_relay_able = Tools::is_protocol_relay($user);
  22. //链路表部分
  23. $nodes = Node::where(
  24. function ($query) use ($user) {
  25. $query->Where("node_group", "=", $user->node_group)
  26. ->orWhere("node_group", "=", 0);
  27. }
  28. )->where('type', 1)->where("sort", "=", 10)->where("node_class", "<=", $user->class)->orderBy('name')->get();
  29. $pathset = new \ArrayObject();
  30. $relay_rules = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
  31. $mu_nodes = Node::where('sort', 9)->where('node_class', '<=', $user->class)->where("type", "1")->where(
  32. function ($query) use ($user) {
  33. $query->where("node_group", "=", $user->node_group)
  34. ->orWhere("node_group", "=", 0);
  35. }
  36. )->get();
  37. foreach ($nodes as $node) {
  38. if ($node->mu_only == 0) {
  39. $relay_rule = Tools::pick_out_relay_rule($node->id, $user->port, $relay_rules);
  40. if ($relay_rule != null) {
  41. $pathset = Tools::insertPathRule($relay_rule, $pathset, $user->port);
  42. }
  43. }
  44. if ($node->custom_rss == 1) {
  45. foreach ($mu_nodes as $mu_node) {
  46. $mu_user = User::where('port', '=', $mu_node->server)->first();
  47. if ($mu_user == null) {
  48. continue;
  49. }
  50. if (!($mu_user->class >= $node->node_class && ($node->node_group == 0 || $node->node_group == $mu_user->node_group))) {
  51. continue;
  52. }
  53. if ($mu_user->is_multi_user != 2) {
  54. $relay_rule = Tools::pick_out_relay_rule($node->id, $mu_user->port, $relay_rules);
  55. if ($relay_rule != null) {
  56. $pathset = Tools::insertPathRule($relay_rule, $pathset, $mu_user->port);
  57. }
  58. }
  59. }
  60. }
  61. }
  62. foreach ($pathset as $path) {
  63. foreach ($pathset as $index => $single_path) {
  64. if ($path != $single_path && $path->port == $single_path->port) {
  65. if ($single_path->end_node->id == $path->begin_node->id) {
  66. $path->begin_node = $single_path->begin_node;
  67. if ($path->begin_node->isNodeAccessable() == false) {
  68. $path->path = '<font color="#FF0000">'.$single_path->begin_node->name.'</font>'." → ".$path->path;
  69. $path->status = "阻断";
  70. } else {
  71. $path->path = $single_path->begin_node->name." → ".$path->path;
  72. $path->status = "通畅";
  73. }
  74. $pathset->offsetUnset($index);
  75. continue;
  76. }
  77. if ($path->end_node->id == $single_path->begin_node->id) {
  78. $path->end_node = $single_path->end_node;
  79. if ($single_path->end_node->isNodeAccessable() == false) {
  80. $path->path = $path->path." → ".'<font color="#FF0000">'.$single_path->end_node->name.'</font>';
  81. $path->status = "阻断";
  82. } else {
  83. $path->path = $path->path." → ".$single_path->end_node->name;
  84. }
  85. $pathset->offsetUnset($index);
  86. continue;
  87. }
  88. }
  89. }
  90. }
  91. return $this->view()->assign('rules', $logs)->assign('relay_able_protocol_list', Config::getSupportParam('relay_able_protocol'))->assign('is_relay_able', $is_relay_able)->assign('pathset', $pathset)->display('user/relay/index.tpl');
  92. }
  93. public function create($request, $response, $args)
  94. {
  95. $user = Auth::getUser();
  96. $source_nodes = Node::where(
  97. function ($query) use ($user) {
  98. $query->Where("node_group", "=", $user->node_group)
  99. ->orWhere("node_group", "=", 0);
  100. }
  101. )->where('type', 1)->where('sort', 10)->where("node_class", "<=", $user->class)->orderBy('name')->get();
  102. $dist_nodes = Node::where(
  103. function ($query) use ($user) {
  104. $query->Where("node_group", "=", $user->node_group)
  105. ->orWhere("node_group", "=", 0);
  106. }
  107. )->where('type', 1)->where(
  108. function ($query) {
  109. $query->Where('sort', 0)
  110. ->orWhere('sort', 10);
  111. }
  112. )->where("node_class", "<=", $user->class)->orderBy('name')->get();
  113. $ports_raw = Node::where(
  114. function ($query) use ($user) {
  115. $query->Where("node_group", "=", $user->node_group)
  116. ->orWhere("node_group", "=", 0);
  117. }
  118. )->where('type', 1)->where('sort', 9)->where("node_class", "<=", $user->class)->orderBy('name')->get();
  119. $ports = array();
  120. foreach ($ports_raw as $port_raw) {
  121. $mu_user = User::where('port', $port_raw->server)->first();
  122. if ($mu_user->is_multi_user == 1) {
  123. array_push($ports, $port_raw->server);
  124. }
  125. }
  126. array_push($ports, $user->port);
  127. return $this->view()->assign('source_nodes', $source_nodes)->assign('dist_nodes', $dist_nodes)->assign('ports', $ports)->display('user/relay/add.tpl');
  128. }
  129. public function add($request, $response, $args)
  130. {
  131. $user = Auth::getUser();
  132. $dist_node_id = $request->getParam('dist_node');
  133. $source_node_id = $request->getParam('source_node');
  134. $port = $request->getParam('port');
  135. $priority = $request->getParam('priority');
  136. $source_node = Node::where('id', $source_node_id)->where(
  137. function ($query) use ($user) {
  138. $query->Where("node_group", "=", $user->node_group)
  139. ->orWhere("node_group", "=", 0);
  140. }
  141. )->where('type', 1)->where('sort', 10)->where("node_class", "<=", $user->class)->first();
  142. if ($source_node == null) {
  143. $rs['ret'] = 0;
  144. $rs['msg'] = "美国的华莱士";
  145. return $response->getBody()->write(json_encode($rs));
  146. }
  147. $dist_node = Node::where('id', $dist_node_id)->where(
  148. function ($query) use ($user) {
  149. $query->Where("node_group", "=", $user->node_group)
  150. ->orWhere("node_group", "=", 0);
  151. }
  152. )->where('type', 1)->where(
  153. function ($query) {
  154. $query->Where('sort', 0)
  155. ->orWhere('sort', 10);
  156. }
  157. )->where("node_class", "<=", $user->class)->first();
  158. if ($dist_node_id == -1) {
  159. $dist_node = new Node();
  160. $dist_node->id = -1;
  161. $dist_node->node_ip = "0.0.0.0";
  162. $dist_node->sort = 10;
  163. }
  164. if ($dist_node == null) {
  165. $rs['ret'] = 0;
  166. $rs['msg'] = "不知道比你们高到哪里去了";
  167. return $response->getBody()->write(json_encode($rs));
  168. }
  169. $port_raw = Node::where('server', $port)->where(
  170. function ($query) use ($user) {
  171. $query->Where("node_group", "=", $user->node_group)
  172. ->orWhere("node_group", "=", 0);
  173. }
  174. )->where('type', 1)->where('sort', 9)->where("node_class", "<=", $user->class)->first();
  175. if ($port_raw == null && $port != $user->port) {
  176. $rs['ret'] = 0;
  177. $rs['msg'] = "我和他谈笑风生";
  178. return $response->getBody()->write(json_encode($rs));
  179. }
  180. if (!Tools::is_protocol_relay($user)) {
  181. $rs['ret'] = 0;
  182. $rs['msg'] = "为了中转的稳定,您需要在<a href='/user/edit'>资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!";
  183. return $response->getBody()->write(json_encode($rs));
  184. }
  185. $rule = new Relay();
  186. $rule->user_id = $user->id;
  187. $rule->dist_node_id = $dist_node_id;
  188. $dist_node_ip = Tools::getRelayNodeIp($source_node, $dist_node);
  189. $rule->dist_ip = $dist_node_ip;
  190. $rule->source_node_id = $source_node_id;
  191. $rule->port = $port;
  192. $rule->priority = min($priority, 99998);
  193. $ruleset = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
  194. $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, 0, $rule->source_node_id);
  195. if ($maybe_rule_id != 0) {
  196. $rs['ret'] = 0;
  197. $rs['msg'] = "您即将添加的规则与规则 ID:".$maybe_rule_id." 冲突!";
  198. if ($maybe_rule_id == -1) {
  199. $rs['msg'] = "您即将添加的规则可能会造成冲突!";
  200. }
  201. return $response->getBody()->write(json_encode($rs));
  202. }
  203. if (!$rule->save()) {
  204. $rs['ret'] = 0;
  205. $rs['msg'] = "添加失败";
  206. return $response->getBody()->write(json_encode($rs));
  207. }
  208. $rs['ret'] = 1;
  209. $rs['msg'] = "添加成功";
  210. return $response->getBody()->write(json_encode($rs));
  211. }
  212. public function edit($request, $response, $args)
  213. {
  214. $id = $args['id'];
  215. $user = Auth::getUser();
  216. $rule = Relay::where('id', $id)->where('user_id', $user->id)->first();
  217. if ($rule == null) {
  218. exit(0);
  219. }
  220. $user = Auth::getUser();
  221. $source_nodes = Node::where(
  222. function ($query) use ($user) {
  223. $query->Where("node_group", "=", $user->node_group)
  224. ->orWhere("node_group", "=", 0);
  225. }
  226. )->where('type', 1)->where('sort', 10)->where("node_class", "<=", $user->class)->orderBy('name')->get();
  227. $dist_nodes = Node::where(
  228. function ($query) use ($user) {
  229. $query->Where("node_group", "=", $user->node_group)
  230. ->orWhere("node_group", "=", 0);
  231. }
  232. )->where('type', 1)->where(
  233. function ($query) {
  234. $query->Where('sort', 0)
  235. ->orWhere('sort', 10);
  236. }
  237. )->where("node_class", "<=", $user->class)->orderBy('name')->get();
  238. $ports_raw = Node::where(
  239. function ($query) use ($user) {
  240. $query->Where("node_group", "=", $user->node_group)
  241. ->orWhere("node_group", "=", 0);
  242. }
  243. )->where('type', 1)->where('sort', 9)->where("node_class", "<=", $user->class)->orderBy('name')->get();
  244. $ports = array();
  245. foreach ($ports_raw as $port_raw) {
  246. $mu_user = User::where('port', $port_raw->server)->first();
  247. if ($mu_user->is_multi_user == 1) {
  248. array_push($ports, $port_raw->server);
  249. }
  250. }
  251. array_push($ports, $user->port);
  252. return $this->view()->assign('rule', $rule)->assign('source_nodes', $source_nodes)->assign('dist_nodes', $dist_nodes)->assign('ports', $ports)->display('user/relay/edit.tpl');
  253. }
  254. public function update($request, $response, $args)
  255. {
  256. $id = $args['id'];
  257. $user = Auth::getUser();
  258. $rule = Relay::where('id', $id)->where('user_id', $user->id)->first();
  259. if ($rule == null) {
  260. exit(0);
  261. }
  262. $dist_node_id = $request->getParam('dist_node');
  263. $source_node_id = $request->getParam('source_node');
  264. $port = $request->getParam('port');
  265. $priority = $request->getParam('priority');
  266. $source_node = Node::where('id', $source_node_id)->where(
  267. function ($query) use ($user) {
  268. $query->Where("node_group", "=", $user->node_group)
  269. ->orWhere("node_group", "=", 0);
  270. }
  271. )->where('type', 1)->where('sort', 10)->where("node_class", "<=", $user->class)->first();
  272. if ($source_node == null) {
  273. $rs['ret'] = 0;
  274. $rs['msg'] = "我告诉你们我是身经百战了";
  275. return $response->getBody()->write(json_encode($rs));
  276. }
  277. $dist_node = Node::where('id', $dist_node_id)->where(
  278. function ($query) use ($user) {
  279. $query->Where("node_group", "=", $user->node_group)
  280. ->orWhere("node_group", "=", 0);
  281. }
  282. )->where('type', 1)->where(
  283. function ($query) {
  284. $query->Where('sort', 0)
  285. ->orWhere('sort', 10);
  286. }
  287. )->where("node_class", "<=", $user->class)->first();
  288. if ($dist_node_id == -1) {
  289. $dist_node = new Node();
  290. $dist_node->id = -1;
  291. $dist_node->node_ip = "0.0.0.0";
  292. $dist_node->sort = 10;
  293. }
  294. if ($dist_node == null) {
  295. $rs['ret'] = 0;
  296. $rs['msg'] = "见得多了";
  297. return $response->getBody()->write(json_encode($rs));
  298. }
  299. $port_raw = Node::where('server', $port)->where(
  300. function ($query) use ($user) {
  301. $query->Where("node_group", "=", $user->node_group)
  302. ->orWhere("node_group", "=", 0);
  303. }
  304. )->where('type', 1)->where('sort', 9)->where("node_class", "<=", $user->class)->first();
  305. if ($port_raw == null && $port != $user->port) {
  306. $rs['ret'] = 0;
  307. $rs['msg'] = "西方的哪个国家我没去过";
  308. return $response->getBody()->write(json_encode($rs));
  309. }
  310. if (!Tools::is_protocol_relay($user)) {
  311. $rs['ret'] = 0;
  312. $rs['msg'] = "为了中转的稳定,您需要在<a href='/user/edit'>资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!";
  313. return $response->getBody()->write(json_encode($rs));
  314. }
  315. $rule->user_id = $user->id;
  316. $rule->dist_node_id = $dist_node_id;
  317. $dist_node_ip = Tools::getRelayNodeIp($source_node, $dist_node);
  318. $rule->dist_ip = $dist_node_ip;
  319. $rule->source_node_id = $source_node_id;
  320. $rule->port = $port;
  321. $rule->priority = min($priority, 99998);
  322. $ruleset = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
  323. $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, $rule->id, $rule->source_node_id);
  324. if ($maybe_rule_id != 0) {
  325. $rs['ret'] = 0;
  326. $rs['msg'] = "您即将添加的规则与规则 ID:".$maybe_rule_id." 冲突!";
  327. if ($maybe_rule_id == -1) {
  328. $rs['msg'] = "您即将添加的规则可能会造成冲突!";
  329. }
  330. return $response->getBody()->write(json_encode($rs));
  331. }
  332. if (!$rule->save()) {
  333. $rs['ret'] = 0;
  334. $rs['msg'] = "修改失败";
  335. return $response->getBody()->write(json_encode($rs));
  336. }
  337. $rs['ret'] = 1;
  338. $rs['msg'] = "修改成功";
  339. return $response->getBody()->write(json_encode($rs));
  340. }
  341. public function delete($request, $response, $args)
  342. {
  343. $id = $request->getParam('id');
  344. $user = Auth::getUser();
  345. $rule = Relay::where('id', $id)->where('user_id', $user->id)->first();
  346. if ($rule == null) {
  347. exit(0);
  348. }
  349. if (!$rule->delete()) {
  350. $rs['ret'] = 0;
  351. $rs['msg'] = "删除失败";
  352. return $response->getBody()->write(json_encode($rs));
  353. }
  354. $rs['ret'] = 1;
  355. $rs['msg'] = "删除成功";
  356. return $response->getBody()->write(json_encode($rs));
  357. }
  358. }