| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- <?php
- namespace App\Utils;
- use App\Models\User;
- use App\Models\Node;
- use App\Models\Relay;
- use App\Services\Config;
- class URL
- {
- /*
- * 1 SSR can
- * 2 SS can
- * 3 Both can
- */
- public static function CanMethodConnect($method) {
- $ss_aead_method_list = Config::getSupportParam('ss_aead_method');
- if(in_array($method, $ss_aead_method_list)) {
- return 2;
- }
- return 3;
- }
- /*
- * 1 SSR can
- * 2 SS can
- * 3 Both can
- */
- public static function CanProtocolConnect($protocol) {
- if($protocol != 'origin') {
- if(strpos($protocol, '_compatible') === FALSE) {
- return 1;
- }else{
- return 3;
- }
- }
- return 3;
- }
- /*
- * 1 SSR can
- * 2 SS can
- * 3 Both can
- * 4 Both can, But ssr need set obfs to plain
- * 5 Both can, But ss need set obfs to plain
- */
- public static function CanObfsConnect($obfs) {
- if($obfs != 'plain') {
- //SS obfs only
- $ss_obfs = Config::getSupportParam('ss_obfs');
- if(in_array($obfs, $ss_obfs)) {
- if(strpos($obfs, '_compatible') === FALSE) {
- return 2;
- }else{
- return 4;//SSR need origin plain
- }
- }else{
- //SSR obfs only
- if(strpos($obfs, '_compatible') === FALSE) {
- return 1;
- }else{
- return 5;//SS need plain
- }
- }
- }else{
- return 3;
- }
- }
- public static function SSCanConnect($user, $mu_port = 0) {
- if($mu_port != 0) {
- $mu_user = User::where('port', '=', $mu_port)->where("is_multi_user", "<>", 0)->first();
- if ($mu_user == null) {
- return;
- }
- return URL::SSCanConnect($mu_user);
- }
- if(URL::CanMethodConnect($user->method) >= 2 && URL::CanProtocolConnect($user->protocol) >= 2 && URL::CanObfsConnect($user->obfs) >= 2) {
- return true;
- }else{
- return false;
- }
- }
- public static function SSRCanConnect($user, $mu_port = 0) {
- if($mu_port != 0) {
- $mu_user = User::where('port', '=', $mu_port)->where("is_multi_user", "<>", 0)->first();
- if ($mu_user == null) {
- return;
- }
- return URL::SSRCanConnect($mu_user);
- }
- if(URL::CanMethodConnect($user->method) != 2 && URL::CanProtocolConnect($user->protocol) != 2 && URL::CanObfsConnect($user->obfs) != 2) {
- return true;
- }else{
- return false;
- }
- }
- public static function getSSConnectInfo($user) {
- $new_user = clone $user;
- if(URL::CanObfsConnect($new_user->obfs) == 5) {
- $new_user->obfs = 'plain';
- $new_user->obfs_param = '';
- }
- if(URL::CanProtocolConnect($new_user->protocol) == 3) {
- $new_user->protocol = 'origin';
- $new_user->protocol_param = '';
- }
- $new_user->obfs = str_replace("_compatible", "", $new_user->obfs);
- $new_user->protocol = str_replace("_compatible", "", $new_user->protocol);
- return $new_user;
- }
- public static function getSSRConnectInfo($user) {
- $new_user = clone $user;
- if(URL::CanObfsConnect($new_user->obfs) == 4) {
- $new_user->obfs = 'plain';
- $new_user->obfs_param = '';
- }
- $new_user->obfs = str_replace("_compatible", "", $new_user->obfs);
- $new_user->protocol = str_replace("_compatible", "", $new_user->protocol);
- return $new_user;
- }
- public static function getAllItems($user, $is_mu = 0, $is_ss = 0) {
- $return_array = array();
- if ($user->is_admin) {
- $nodes=Node::where(
- function ($query) {
- $query->where('sort', 0)
- ->orwhere('sort', 10);
- }
- )->where("type", "1")->orderBy("name")->get();
- } else {
- $nodes=Node::where(
- function ($query) {
- $query->where('sort', 0)
- ->orwhere('sort', 10);
- }
- )->where(
- function ($query) use ($user){
- $query->where("node_group", "=", $user->node_group)
- ->orWhere("node_group", "=", 0);
- }
- )->where("type", "1")->where("node_class", "<=", $user->class)->orderBy("name")->get();
- }
- if($is_mu) {
- if ($user->is_admin) {
- $mu_nodes = Node::where('sort', 9)->where("type", "1")->get();
- } else {
- $mu_nodes = Node::where('sort', 9)->where('node_class', '<=', $user->class)->where("type", "1")->where(
- function ($query) use ($user) {
- $query->where("node_group", "=", $user->node_group)
- ->orWhere("node_group", "=", 0);
- }
- )->get();
- }
- }
- $relay_rules = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->orderBy('id', 'asc')->get();
- if (!Tools::is_protocol_relay($user)) {
- $relay_rules = array();
- }
- foreach ($nodes as $node) {
- if ($node->mu_only != 1 && $is_mu == 0) {
- if ($node->sort == 10) {
- $relay_rule_id = 0;
- $relay_rule = Tools::pick_out_relay_rule($node->id, $user->port, $relay_rules);
- if ($relay_rule != null) {
- if ($relay_rule->dist_node() != null) {
- $relay_rule_id = $relay_rule->id;
- }
- }
- $item = URL::getItem($user, $node, 0, $relay_rule_id, $is_ss);
- if($item != null) {
- array_push($return_array, $item);
- }
- }else{
- $item = URL::getItem($user, $node, 0, 0, $is_ss);
- if($item != null) {
- array_push($return_array, $item);
- }
- }
- }
- if ($node->custom_rss == 1 && $node->mu_only != -1 && $is_mu == 1) {
- foreach ($mu_nodes as $mu_node) {
- if ($node->sort == 10) {
- $relay_rule_id = 0;
- $relay_rule = Tools::pick_out_relay_rule($node->id, $mu_node->server, $relay_rules);
- if ($relay_rule != null) {
- if ($relay_rule->dist_node() != null) {
- $relay_rule_id = $relay_rule->id;
- }
- }
- $item = URL::getItem($user, $node, $mu_node->server, $relay_rule_id, $is_ss);
- if($item != null) {
- array_push($return_array, $item);
- }
- }else{
- $item = URL::getItem($user, $node, $mu_node->server, 0, $is_ss);
- if($item != null) {
- array_push($return_array, $item);
- }
- }
- }
- }
- }
- return $return_array;
- }
- public static function getAllUrl($user, $is_mu, $is_ss = 0, $enter = 0) {
- $items = URL::getAllItems($user, $is_mu, $is_ss);
- $return_url = '';
- foreach($items as $item) {
- $return_url .= URL::getItemUrl($item, $is_ss).($enter == 0 ? ' ' : "\n");
- }
- return $return_url;
- }
- public static function getItemUrl($item, $is_ss) {
- $ss_obfs_list = Config::getSupportParam('ss_obfs');
- if(!$is_ss) {
- $ssurl = $item['address'].":".$item['port'].":".$item['protocol'].":".$item['method'].":".$item['obfs'].":".Tools::base64_url_encode($item['passwd'])."/?obfsparam=".Tools::base64_url_encode($item['obfs_param'])."&protoparam=".Tools::base64_url_encode($item['protocol_param'])."&remarks=".Tools::base64_url_encode($item['remark'])."&group=".Tools::base64_url_encode(Config::get('appName'));
- return "ssr://".Tools::base64_url_encode($ssurl);
- } else {
- if($is_ss == 2) {
- $personal_info = $item['method'].':'.$item['passwd']."@".$item['address'].":".$item['port'];
- $ssurl = "ss://".Tools::base64_url_encode($personal_info);
- $ssurl .= "#".rawurlencode(Config::get('appName')." - ".$item['remark']);
- }else{
- $personal_info = $item['method'].':'.$item['passwd'];
- $ssurl = "ss://".Tools::base64_url_encode($personal_info)."@".$item['address'].":".$item['port'];
- $plugin = '';
- if(in_array($item['obfs'], $ss_obfs_list)) {
- if(strpos($item['obfs'], 'http') !== FALSE) {
- $plugin .= "obfs-local;obfs=http";
- } else {
- $plugin .= "obfs-local;obfs=tls";
- }
- if($item['obfs_param'] != '') {
- $plugin .= ";obfs-host=".$item['obfs_param'];
- }
- $ssurl .= "?plugin=".rawurlencode($plugin);
- }
- $ssurl .= "#".rawurlencode(Config::get('appName')." - ".$item['remark']);
- }
- return $ssurl;
- }
- }
- public static function getJsonObfs($item) {
- $ss_obfs_list = Config::getSupportParam('ss_obfs');
- $plugin = "";
- if(in_array($item['obfs'], $ss_obfs_list)) {
- if(strpos($item['obfs'], 'http') !== FALSE) {
- $plugin .= "obfs-local --obfs http";
- } else {
- $plugin .= "obfs-local --obfs tls";
- }
- if($item['obfs_param'] != '') {
- $plugin .= "--obfs-host ".$item['obfs_param'];
- }
- }
- return $plugin;
- }
- public static function getSurgeObfs($item) {
- $ss_obfs_list = Config::getSupportParam('ss_obfs');
- $plugin = "";
- if(in_array($item['obfs'], $ss_obfs_list)) {
- if(strpos($item['obfs'], 'http') !== FALSE) {
- $plugin .= ",obfs=http";
- } else {
- $plugin .= ",obfs=tls";
- }
- if($item['obfs_param'] != '') {
- $plugin .= ",obfs-host=".$item['obfs_param'];
- }
- }
- return $plugin;
- }
- /*
- * Conn info
- * address
- * port
- * passwd
- * method
- * remark
- * protocol
- * protocol_param
- * obfs
- * obfs_param
- */
- public static function getItem($user, $node, $mu_port = 0, $relay_rule_id = 0, $is_ss = 0) {
- $relay_rule = Relay::where('id', $relay_rule_id)->where(
- function ($query) use ($user) {
- $query->Where("user_id", "=", $user->id)
- ->orWhere("user_id", "=", 0);
- }
- )->first();
- $node_name = $node->name;
- if ($relay_rule != null) {
- $node_name .= " - ".$relay_rule->dist_node()->name;
- }
- if($mu_port != 0) {
- $mu_user = User::where('port', '=', $mu_port)->where("is_multi_user", "<>", 0)->first();
- if ($mu_user == null) {
- return;
- }
- $mu_user->obfs_param = $user->getMuMd5();
- $mu_user->protocol_param = $user->id.":".$user->passwd;
- $user = $mu_user;
- $node_name .= " - ".$mu_port." 端口单端口多用户";
- }
- if($is_ss) {
- if(!URL::SSCanConnect($user)) {
- return;
- }
- $user = URL::getSSConnectInfo($user);
- }else{
- if(!URL::SSRCanConnect($user)) {
- return;
- }
- $user = URL::getSSRConnectInfo($user);
- }
- $return_array['address'] = $node->server;
- $return_array['port'] = $user->port;
- $return_array['passwd'] = $user->passwd;
- $return_array['method'] = $user->method;
- $return_array['remark'] = $node_name;
- $return_array['protocol'] = $user->protocol;
- $return_array['protocol_param'] = $user->protocol_param;
- $return_array['obfs'] = $user->obfs;
- $return_array['obfs_param'] = $user->obfs_param;
- return $return_array;
- }
- public static function cloneUser($user) {
- $new_user = clone $user;
- return $new_user;
- }
- }
|