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; } }