|
@@ -0,0 +1,289 @@
|
|
|
|
+<?php
|
|
|
|
+
|
|
|
|
+namespace App\Http\Controllers\Client;
|
|
|
|
+
|
|
|
|
+use App\Http\Controllers\Controller;
|
|
|
|
+use App\Http\Requests\Passport\AuthLogin;
|
|
|
|
+use App\Models\Plan;
|
|
|
|
+use App\Models\User;
|
|
|
|
+use App\Services\ServerService;
|
|
|
|
+use App\Services\UserService;
|
|
|
|
+use App\Utils\ApiResponse;
|
|
|
|
+use App\Utils\CacheKey;
|
|
|
|
+use App\Utils\Helper;
|
|
|
|
+use Facade\FlareClient\Api;
|
|
|
|
+use Illuminate\Contracts\Foundation\Application;
|
|
|
|
+use Illuminate\Http\Request;
|
|
|
|
+use Illuminate\Support\Facades\Cache;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class ManageController extends Controller
|
|
|
|
+{
|
|
|
|
+ /**
|
|
|
|
+ * 登录接口
|
|
|
|
+ * @param AuthLogin $request
|
|
|
|
+ * @return false|string
|
|
|
|
+ */
|
|
|
|
+ function login(Request $request)
|
|
|
|
+ {
|
|
|
|
+ $email = $request->input('email');
|
|
|
|
+ $password = $request->input('password');
|
|
|
|
+
|
|
|
|
+ if (empty($email)){
|
|
|
|
+ return ApiResponse::apiResponse(400,"邮箱不能为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (empty($password)){
|
|
|
|
+ return ApiResponse::apiResponse(400,"密码不能为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $user = User::where('email', $email)->first();
|
|
|
|
+ if (!$user) {
|
|
|
|
+ //abort(200, __('Incorrect email or password'));
|
|
|
|
+ return ApiResponse::apiResponse(400,"账号或者密码错误");
|
|
|
|
+ }
|
|
|
|
+ if (!Helper::multiPasswordVerify(
|
|
|
|
+ $user->password_algo,
|
|
|
|
+ $user->password_salt,
|
|
|
|
+ $password,
|
|
|
|
+ $user->password)
|
|
|
|
+ ) {
|
|
|
|
+ return ApiResponse::apiResponse(400,"账号或者密码错误");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ($user->banned) {
|
|
|
|
+// abort(500, __('Your account has been suspended'));
|
|
|
|
+ return ApiResponse::apiResponse(300,"账户已经被禁用");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $data = [
|
|
|
|
+ 'token' => $user->token,
|
|
|
|
+ 'auth_data' => base64_encode("{$user->email}:{$user->password}")
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ if ($user->is_admin) $data['is_admin'] = true;
|
|
|
|
+// return response([
|
|
|
|
+// 'data' => $data
|
|
|
|
+// ]);
|
|
|
|
+ return ApiResponse::apiResponse(0,"",$data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 注册接口
|
|
|
|
+ * @return \Illuminate\Http\JsonResponse
|
|
|
|
+ */
|
|
|
|
+ function register(Request $request)
|
|
|
|
+ {
|
|
|
|
+ if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
|
|
|
|
+ $registerCountByIP = Cache::get(CacheKey::get('REGISTER_IP_RATE_LIMIT', $request->ip())) ?? 0;
|
|
|
|
+ if ((int)$registerCountByIP >= (int)config('v2board.register_limit_count', 3)) {
|
|
|
|
+ abort(500, __('Register frequently, please try again after 1 hour'));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $email = $request->input('email');
|
|
|
|
+ $password = $request->input('password');
|
|
|
|
+ $exist = User::where('email', $email)->first();
|
|
|
|
+ if ($exist) {
|
|
|
|
+ return ApiResponse::apiResponse(400,"账号已经存在");
|
|
|
|
+ }
|
|
|
|
+ $user = new User();
|
|
|
|
+ $user->email = $email;
|
|
|
|
+ $user->password = password_hash($password, PASSWORD_DEFAULT);
|
|
|
|
+ $user->uuid = Helper::guid(true);
|
|
|
|
+ $user->token = Helper::guid();
|
|
|
|
+ // try out
|
|
|
|
+ if ((int)config('v2board.try_out_plan_id', 0)) {
|
|
|
|
+ $plan = Plan::find(config('v2board.try_out_plan_id'));
|
|
|
|
+ if ($plan) {
|
|
|
|
+ $user->transfer_enable = $plan->transfer_enable * 1073741824;
|
|
|
|
+ $user->plan_id = $plan->id;
|
|
|
|
+ $user->group_id = $plan->group_id;
|
|
|
|
+ $user->expired_at = time() + (config('v2board.try_out_hour', 1) * 3600);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!$user->save()) {
|
|
|
|
+ return ApiResponse::apiResponse(400,"注册失败");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $data = [
|
|
|
|
+ 'token' => $user->token,
|
|
|
|
+ 'auth_data' => base64_encode("{$user->email}:{$user->password}")
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ $user->last_login_at = time();
|
|
|
|
+ $user->save();
|
|
|
|
+
|
|
|
|
+ if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
|
|
|
|
+ Cache::put(
|
|
|
|
+ CacheKey::get('REGISTER_IP_RATE_LIMIT', $request->ip()),
|
|
|
|
+ (int)$registerCountByIP + 1,
|
|
|
|
+ (int)config('v2board.register_limit_expire', 60) * 60
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ return ApiResponse::apiResponse(0,"注册成功",$data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取我的订阅
|
|
|
|
+ * @param Request $request
|
|
|
|
+ * @return \Illuminate\Http\JsonResponse
|
|
|
|
+ */
|
|
|
|
+ public function getSubscribe(Request $request)
|
|
|
|
+ {
|
|
|
|
+ $user = User::where('id', $request->user['id'])
|
|
|
|
+ ->select([
|
|
|
|
+ 'plan_id',
|
|
|
|
+ 'token',
|
|
|
|
+ 'expired_at',
|
|
|
|
+ 'u',
|
|
|
|
+ 'd',
|
|
|
|
+ 'transfer_enable',
|
|
|
|
+ 'email'
|
|
|
|
+ ])
|
|
|
|
+ ->first();
|
|
|
|
+ if (!$user) {
|
|
|
|
+ abort(500, __('The user does not exist'));
|
|
|
|
+ }
|
|
|
|
+ if ($user->plan_id) {
|
|
|
|
+ $user['plan'] = Plan::find($user->plan_id);
|
|
|
|
+ if (!$user['plan']) {
|
|
|
|
+ abort(500, __('Subscription plan does not exist'));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ $user['subscribe_url'] = Helper::getSubscribeUrl("/api/v1/client/subscribe?token={$user['token']}");
|
|
|
|
+ $userService = new UserService();
|
|
|
|
+ $user['reset_day'] = $userService->getResetDay($user);
|
|
|
|
+ return ApiResponse::apiResponse(0,"",$user);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取订阅套餐
|
|
|
|
+ * @param Request $request
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public function fetch(Request $request)
|
|
|
|
+ {
|
|
|
|
+ $plan = Plan::where('show', 1)->get();
|
|
|
|
+ return ApiResponse::apiResponse(0,"",$plan);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取线路
|
|
|
|
+ * @param Request $request
|
|
|
|
+ * @return \Illuminate\Http\JsonResponse
|
|
|
|
+ */
|
|
|
|
+ public function server(Request $request){
|
|
|
|
+ $user = User::find($request->user['id']);
|
|
|
|
+ $servers = [];
|
|
|
|
+ $userService = new UserService();
|
|
|
|
+ if ($userService->isAvailable($user)) {
|
|
|
|
+ $serverService = new ServerService();
|
|
|
|
+ $servers = $serverService->getAvailableServers($user);
|
|
|
|
+ }
|
|
|
|
+ if (empty($servers)){
|
|
|
|
+ return ApiResponse::apiResponse(400,"获取线路失败");
|
|
|
|
+ }
|
|
|
|
+ return ApiResponse::apiResponse(0,"",$servers);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public function getQuickLoginUrl(Request $request)
|
|
|
|
+ {
|
|
|
|
+ $authorization = $request->input('auth_data') ?? $request->header('authorization');
|
|
|
|
+ if (!$authorization)
|
|
|
|
+ return ApiResponse::apiResponse(403,"未登录或者登录已经过期");
|
|
|
|
+
|
|
|
|
+ $authData = explode(':', base64_decode($authorization));
|
|
|
|
+ if (!isset($authData[0]) || !isset($authData[1]))
|
|
|
|
+ return ApiResponse::apiResponse(403,"请求异常");
|
|
|
|
+ $user = User::where('email', $authData[0])
|
|
|
|
+ ->where('password', $authData[1])
|
|
|
|
+ ->first();
|
|
|
|
+ if (!$user) {
|
|
|
|
+ //abort(500, __('Token error'));
|
|
|
|
+ return ApiResponse::apiResponse(500,"请求异常");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $code = Helper::guid();
|
|
|
|
+ $key = CacheKey::get('TEMP_TOKEN', $code);
|
|
|
|
+ Cache::put($key, $user->id, 60);
|
|
|
|
+ $redirect = '/#/login?verify=' . $code . '&redirect=' . ($request->input('redirect') ? $request->input('redirect') : 'dashboard');
|
|
|
|
+ if (config('v2board.app_url')) {
|
|
|
|
+ $url = config('v2board.app_url') . $redirect;
|
|
|
|
+ } else {
|
|
|
|
+ $url = url($redirect);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return ApiResponse::apiResponse(0,"",$url);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public function getVersion(Request $request)
|
|
|
|
+ {
|
|
|
|
+ $from = $request->input("from");
|
|
|
|
+ $version = $request->input("version");
|
|
|
|
+
|
|
|
|
+ $versionData = [
|
|
|
|
+ 'windows_version' => config('v2board.windows_version'),
|
|
|
|
+ 'windows_download_url' => config('v2board.windows_download_url'),
|
|
|
|
+ 'macos_version' => config('v2board.macos_version'),
|
|
|
|
+ 'macos_download_url' => config('v2board.macos_download_url'),
|
|
|
|
+ 'android_version' => config('v2board.android_version'),
|
|
|
|
+ 'android_download_url' => config('v2board.android_download_url')
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ $sVersion = "";
|
|
|
|
+ $sDownloadUrl = "";
|
|
|
|
+ if ($from == "android")
|
|
|
|
+ {
|
|
|
|
+ $sVersion = $versionData["android_version"];
|
|
|
|
+ $sDownloadUrl = $versionData["android_download_url"];
|
|
|
|
+
|
|
|
|
+ } else if ($from == "win"){
|
|
|
|
+ $sVersion = $versionData["windows_version"];
|
|
|
|
+ $sDownloadUrl = $versionData["windows_download_url"];
|
|
|
|
+ }
|
|
|
|
+ else if ($from == "macos")
|
|
|
|
+ {
|
|
|
|
+ $sVersion = $versionData["macos_version"];
|
|
|
|
+ $sDownloadUrl = $versionData["macos_download_url"];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ $data = [
|
|
|
|
+ 'version' => $sVersion,
|
|
|
|
+ 'download_url' => $sDownloadUrl,
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ if (version_compare($sVersion,$version,">")){
|
|
|
|
+ //服务器大于客户端
|
|
|
|
+ $data["isUpdate"] = 1;
|
|
|
|
+ return ApiResponse::apiResponse(0,"服务器有更新",$data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $data["isUpdate"] = 0;
|
|
|
|
+ return ApiResponse::apiResponse(0,"服务器没有更新",$data);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+// private function Token(Request $request){
|
|
|
|
+// $authorization = $request->input('auth_data') ?? $request->header('authorization');
|
|
|
|
+// if (!$authorization)
|
|
|
|
+// return 402;
|
|
|
|
+//
|
|
|
|
+// $authData = explode(':', base64_decode($authorization));
|
|
|
|
+// if (!isset($authData[0]) || !isset($authData[1]))
|
|
|
|
+// return 403;
|
|
|
|
+// $user = User::where('email', $authData[0])
|
|
|
|
+// ->where('password', $authData[1])
|
|
|
|
+// ->first();
|
|
|
|
+// if (!$user) {
|
|
|
|
+// //abort(500, __('Token error'));
|
|
|
|
+// //return ApiResponse::apiResponse(500,"请求异常");
|
|
|
|
+// return 404;
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// return $user;
|
|
|
|
+// }
|
|
|
|
+}
|