From 4a4afa7ae60af7df3ffab46dbb40b64ffc92c0c0 Mon Sep 17 00:00:00 2001 From: BrettonYe Date: Sat, 8 Jul 2023 14:26:17 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Fixed=20bugs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed Set null to User on ProxyService initial; - Fixed some WebApis have 'prefix' parameter that cause function calls not work as expect; --- .env.example | 2 +- app/Http/Controllers/Admin/UserController.php | 3 +- .../Controllers/User/SubscribeController.php | 8 +- app/Http/Middleware/WebApi.php | 2 + app/Models/User.php | 3 +- app/Services/ProxyService.php | 82 +++++++------------ app/Utils/Clients/URLSchemes.php | 13 --- 7 files changed, 38 insertions(+), 75 deletions(-) diff --git a/.env.example b/.env.example index bcef85c1..0572bc1e 100644 --- a/.env.example +++ b/.env.example @@ -42,7 +42,7 @@ MAIL_ENCRYPTION=ssl # 发信方信息 MAIL_FROM_ADDRESS=admin@proxypanel.demo MAIL_FROM_NAME=ProxyPanel - +# 强制HTTPS (默认 true) SESSION_SECURE_COOKIE= #IP查询相关 BAIDU_APP_AK= diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index fe8b582f..3c86289b 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -289,8 +289,7 @@ class UserController extends Controller public function exportProxyConfig(Request $request, User $user): JsonResponse { - $proxyServer = new ProxyService; - $proxyServer->setUser($user); + $proxyServer = new ProxyService($user); $server = $proxyServer->getProxyConfig(Node::findOrFail($request->input('id'))); return Response::json(['status' => 'success', 'data' => $proxyServer->getUserProxyConfig($server, $request->input('type') !== 'text'), 'title' => $server['type']]); diff --git a/app/Http/Controllers/User/SubscribeController.php b/app/Http/Controllers/User/SubscribeController.php index 1fbd7c7c..eeb8a819 100644 --- a/app/Http/Controllers/User/SubscribeController.php +++ b/app/Http/Controllers/User/SubscribeController.php @@ -7,6 +7,7 @@ use App\Models\UserSubscribe; use App\Models\UserSubscribeLog; use App\Services\ProxyService; use App\Utils\IP; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Redirect; use Response; @@ -18,7 +19,7 @@ class SubscribeController extends Controller private ProxyService $proxyServer; // 通过订阅码获取订阅信息 - public function getSubscribeByCode(Request $request, string $code) + public function getSubscribeByCode(Request $request, string $code): RedirectResponse|Response|string { preg_match('/[0-9A-Za-z]+/', $code, $matches, PREG_UNMATCHED_AS_NULL); @@ -26,7 +27,6 @@ class SubscribeController extends Controller return Redirect::route('login'); } $code = $matches[0]; - $this->proxyServer = new ProxyService; self::$subType = is_numeric($request->input('type')) ? $request->input('type') : null; // 检查订阅码是否有效 @@ -65,7 +65,7 @@ class SubscribeController extends Controller return $this->failed(trans('errors.subscribe.question')); } - $this->proxyServer->setUser($user); + $this->proxyServer = new ProxyService($user); $subscribe->increment('times'); // 更新访问次数 $this->subscribeLog($subscribe->id, IP::getClientIp(), json_encode(['Host' => $request->getHost(), 'User-Agent' => $request->userAgent()])); // 记录每次请求 @@ -77,7 +77,7 @@ class SubscribeController extends Controller return Response::make(base64url_encode($this->proxyServer->failedProxyReturn($text, self::$subType ?? 1))); } - private function subscribeLog($subscribeId, $ip, $headers): void + private function subscribeLog(int $subscribeId, ?string $ip, string $headers): void { // 写入订阅访问日志 $log = new UserSubscribeLog(); $log->user_subscribe_id = $subscribeId; diff --git a/app/Http/Middleware/WebApi.php b/app/Http/Middleware/WebApi.php index c3add2ab..584ed531 100644 --- a/app/Http/Middleware/WebApi.php +++ b/app/Http/Middleware/WebApi.php @@ -36,6 +36,8 @@ class WebApi return $this->failed(ResponseEnum::CLIENT_HTTP_UNSYNCHRONIZE_TIMER); } + $request->route()->forgetParameter('prefix'); + return $next($request); } } diff --git a/app/Models/User.php b/app/Models/User.php index 71868448..b4645313 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -10,6 +10,7 @@ use Hash; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\Relations\HasOne; @@ -222,7 +223,7 @@ class User extends Authenticatable return $query->where('status', '<>', -1)->whereEnable(0); } - public function nodes(?int $userLevel = null, int $userGroupId = 0): Node|Builder + public function nodes(?int $userLevel = null, int $userGroupId = 0): Node|Builder|BelongsToMany { if ($userGroupId === 0 && $this->user_group_id) { // 使用默认的用户分组 $query = $this->userGroup->nodes(); diff --git a/app/Services/ProxyService.php b/app/Services/ProxyService.php index a20c65af..80e3f607 100644 --- a/app/Services/ProxyService.php +++ b/app/Services/ProxyService.php @@ -17,9 +17,9 @@ class ProxyService private static array $servers; - public function __construct() + public function __construct(?User $user) { - self::$user = auth()->user(); + self::$user = $user ?? auth()->user(); } public function getUser(): User @@ -27,17 +27,12 @@ class ProxyService return self::$user; } - public function setUser(User $user): void - { - self::$user = $user; - } - public function getServers(): array { return self::$servers; } - public function getProxyText(string $target, int $type = null) + public function getProxyText(string $target, ?int $type = null): string { $servers = $this->getNodeList($type); if (empty($servers)) { @@ -58,14 +53,14 @@ class ProxyService return $this->clientConfig($target); } - public function getNodeList(int $type = null, bool $isConfig = true): array + public function getNodeList(?int $type = null, bool $isConfig = true): array { $query = self::$user->nodes()->whereIn('is_display', [2, 3]); // 获取这个账号可用节点 - if (isset($type)) { + if ($type) { if ($type === 1) { $query = $query->whereIn('type', [1, 4]); - } elseif ($type) { + } else { $query = $query->whereType($type); } } @@ -84,16 +79,16 @@ class ProxyService return $nodes; } - public function getProxyConfig(Node $node) // 提取节点信息 - { + public function getProxyConfig(Node $node): array + { // 提取节点信息 $user = self::$user; $config = [ - 'id' => $node->id, - 'name' => $node->name, - 'area' => $node->country->name, - 'host' => $node->host, + 'id' => $node->id, + 'name' => $node->name, + 'area' => $node->country->name, + 'host' => $node->host, 'group' => sysConfig('website_name'), - 'udp' => $node->is_udp, + 'udp' => $node->is_udp, ]; if ($node->relay_node_id) { @@ -107,7 +102,7 @@ class ProxyService switch ($node->type) { case 0: $config = array_merge($config, [ - 'type' => 'shadowsocks', + 'type' => 'shadowsocks', 'passwd' => $user->passwd, ], $node->profile); if ($node->port && $node->port !== 0) { @@ -125,10 +120,10 @@ class ProxyService break; case 3: $config = array_merge($config, [ - 'type' => 'trojan', - 'port' => $node->port, + 'type' => 'trojan', + 'port' => $node->port, 'passwd' => $user->passwd, - 'sni' => '', + 'sni' => '', ], $node->profile); break; case 1: @@ -155,36 +150,15 @@ class ProxyService return $config; } - public function failedProxyReturn(string $text, $type = 1): string + public function failedProxyReturn(string $text, int $type = 1): string { - switch ($type) { - case 2: - $url = sysConfig('website_url'); - $result = 'vmess://'.base64url_encode(json_encode([ - 'v' => '2', - 'ps' => $text, - 'add' => $url, - 'port' => 0, - 'id' => 0, - 'aid' => 0, - 'net' => 'tcp', - 'type' => 'none', - 'host' => $url, - 'path' => '/', - 'tls' => 'tls', - ], JSON_PRETTY_PRINT)); - break; - case 3: - $result = 'trojan://0@0.0.0.0:0?peer=0.0.0.0#'.rawurlencode($text); - break; - case 1: - case 4: - default: - $result = 'ssr://'.base64url_encode('0.0.0.0:0:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode($text).'&group='.base64url_encode(sysConfig('website_name')).'&udpport=0&uot=0'); - break; - } + $url = sysConfig('website_url'); - return $result.PHP_EOL; + return match ($type) { + 1 => 'vmess://'.base64url_encode(json_encode(['v' => '2', 'ps' => $text, 'add' => $url, 'port' => 0, 'id' => 0, 'aid' => 0, 'net' => 'tcp', 'type' => 'none', 'host' => $url, 'path' => '/', 'tls' => 'tls'], JSON_PRETTY_PRINT)), + 2 => 'trojan://0@0.0.0.0:0?peer=0.0.0.0#'.rawurlencode($text), + default => 'ssr://'.base64url_encode('0.0.0.0:0:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode($text).'&group='.base64url_encode(sysConfig('website_name')).'&udpport=0&uot=0'), + }.PHP_EOL; } private function setServers(array $servers): void @@ -192,8 +166,8 @@ class ProxyService self::$servers = $servers; } - public function getProxyCode($target, $type = null) // 客户端用代理信息 - { + public function getProxyCode(string $target, ?int $type = null): ?string + {// 客户端用代理信息 $servers = $this->getNodeList($type); if (empty($servers)) { return null; @@ -204,8 +178,8 @@ class ProxyService return $this->clientConfig($target); } - public function getUserProxyConfig(array $server, bool $is_url): ?string // 用户显示用代理信息 - { + public function getUserProxyConfig(array $server, bool $is_url): string + { // 用户显示用代理信息 $type = $is_url ? new URLSchemes() : new Text(); return match ($server['type']) { diff --git a/app/Utils/Clients/URLSchemes.php b/app/Utils/Clients/URLSchemes.php index 968ef54f..bdf23a4e 100644 --- a/app/Utils/Clients/URLSchemes.php +++ b/app/Utils/Clients/URLSchemes.php @@ -21,19 +21,6 @@ class URLSchemes implements Client return 'ssr://'.base64url_encode($setting.base64url_encode($server['passwd']).'/?obfsparam='.base64url_encode($server['obfs_param']).'&protoparam='.base64url_encode($server['protocol_param']).'&remarks='.base64url_encode($server['name']).'&group='.base64url_encode($server['group']).'&udpport='.$server['udp'].'&uot=0').PHP_EOL; } - // TODO: More study required about id usage https://shadowsocks.org/en/wiki/SIP008-Online-Configuration-Delivery.html - public static function buildShadowsocksSIP008(array $server): array - { - return [ - 'id' => $server['id'], - 'remark' => $server['name'], - 'server' => $server['host'], - 'server_port' => $server['port'], - 'password' => $server['passwd'], - 'method' => $server['method'], - ]; - } - public static function buildVmess(array $server): string { $config = [