diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php
index d6fe0ffd..667e616c 100644
--- a/app/Console/Commands/Test.php
+++ b/app/Console/Commands/Test.php
@@ -2,15 +2,7 @@
namespace App\Console\Commands;
-use App\Models\Order;
-use App\Models\User;
-use App\Utils\CacheKey;
-use App\Utils\Helper;
use Illuminate\Console\Command;
-use Illuminate\Filesystem\Filesystem;
-use Illuminate\Foundation\Console\ConfigCacheCommand;
-use Illuminate\Support\Facades\Cache;
-use Matriphe\Larinfo;
class Test extends Command
{
diff --git a/app/Http/Controllers/Passport/AuthController.php b/app/Http/Controllers/Passport/AuthController.php
index 9a0fff6d..22b6b224 100644
--- a/app/Http/Controllers/Passport/AuthController.php
+++ b/app/Http/Controllers/Passport/AuthController.php
@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Http\Requests\Passport\AuthRegister;
use App\Http\Requests\Passport\AuthForget;
use App\Http\Requests\Passport\AuthLogin;
+use App\Jobs\SendEmailJob;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use App\Models\Plan;
@@ -18,6 +19,59 @@ use ReCaptcha\ReCaptcha;
class AuthController extends Controller
{
+ public function loginWithMailLink(Request $request)
+ {
+ if (!(int)config('v2board.login_with_mail_link_enable')) {
+ abort(404);
+ }
+ $params = $request->validate([
+ 'email' => 'required|email',
+ 'redirect' => 'nullable'
+ ]);
+
+ if (Cache::get(CacheKey::get('LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP', $params['email']))) {
+ abort(500, __('Sending frequently, please try again later'));
+ }
+
+ $user = User::where('email', $params['email'])->first();
+ if (!$user) {
+ return response([
+ 'data' => true
+ ]);
+ }
+
+ $code = Helper::guid();
+ $key = CacheKey::get('TEMP_TOKEN', $code);
+ Cache::put($key, $user->id, 300);
+ Cache::put(CacheKey::get('LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP', $params['email']), time(), 60);
+
+
+ $redirect = '/#/login?verify=' . $code . '&redirect=' . ($request->input('redirect') ? $request->input('redirect') : 'dashboard');
+ if (config('v2board.app_url')) {
+ $link = config('v2board.app_url') . $redirect;
+ } else {
+ $link = url($redirect);
+ }
+
+ SendEmailJob::dispatch([
+ 'email' => $user->email,
+ 'subject' => __('Login to :name', [
+ 'name' => config('v2board.app_name', 'V2Board')
+ ]),
+ 'template_name' => 'login',
+ 'template_value' => [
+ 'name' => config('v2board.app_name', 'V2Board'),
+ 'link' => $link,
+ 'url' => config('v2board.app_url')
+ ]
+ ]);
+
+ return response([
+ 'data' => $link
+ ]);
+
+ }
+
public function register(AuthRegister $request)
{
if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
diff --git a/app/Http/Routes/PassportRoute.php b/app/Http/Routes/PassportRoute.php
index 2dba8fcc..76c8cfd2 100644
--- a/app/Http/Routes/PassportRoute.php
+++ b/app/Http/Routes/PassportRoute.php
@@ -18,6 +18,7 @@ class PassportRoute
$router->post('/auth/forget', 'Passport\\AuthController@forget');
$router->post('/auth/getTempToken', 'Passport\\AuthController@getTempToken');
$router->post('/auth/getQuickLoginUrl', 'Passport\\AuthController@getQuickLoginUrl');
+ $router->post('/auth/loginWithMailLink', 'Passport\\AuthController@loginWithMailLink');
// Comm
$router->get ('/comm/config', 'Passport\\CommController@config');
$router->post('/comm/sendEmailVerify', 'Passport\\CommController@sendEmailVerify');
diff --git a/app/Utils/CacheKey.php b/app/Utils/CacheKey.php
index 8babf579..de7cb593 100644
--- a/app/Utils/CacheKey.php
+++ b/app/Utils/CacheKey.php
@@ -19,7 +19,8 @@ class CacheKey
'TEMP_TOKEN' => '临时令牌',
'LAST_SEND_EMAIL_REMIND_TRAFFIC' => '最后发送流量邮件提醒',
'SCHEDULE_LAST_CHECK_AT' => '计划任务最后检查时间',
- 'REGISTER_IP_RATE_LIMIT' => '注册频率限制'
+ 'REGISTER_IP_RATE_LIMIT' => '注册频率限制',
+ 'LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP' => '最后一次发送登入链接时间'
];
public static function get(string $key, $uniqueValue)
diff --git a/resources/lang/en-US.json b/resources/lang/en-US.json
index 1cbe6bb6..387f5519 100644
--- a/resources/lang/en-US.json
+++ b/resources/lang/en-US.json
@@ -90,5 +90,7 @@
"Request failed, please try again later": "Request failed, please try again later",
"Register frequently, please try again after 1 hour": "Register frequently, please try again after 1 hour",
"Uh-oh, we've had some problems, we're working on it.": "Uh-oh, we've had some problems, we're working on it",
- "This subscription reset package does not apply to your subscription": "This subscription reset package does not apply to your subscription"
+ "This subscription reset package does not apply to your subscription": "This subscription reset package does not apply to your subscription",
+ "Login to :name": "Login to :name",
+ "Sending frequently, please try again later": "Sending frequently, please try again later"
}
diff --git a/resources/lang/zh-CN.json b/resources/lang/zh-CN.json
index c80d2f8b..239a0e3e 100644
--- a/resources/lang/zh-CN.json
+++ b/resources/lang/zh-CN.json
@@ -90,5 +90,7 @@
"Request failed, please try again later": "请求失败,请稍后再试",
"Register frequently, please try again after 1 hour": "注册频繁,请等待1小时后再次尝试",
"Uh-oh, we've had some problems, we're working on it.": "遇到了些问题,我们正在进行处理",
- "This subscription reset package does not apply to your subscription": "该订阅重置包不适用于你的订阅"
+ "This subscription reset package does not apply to your subscription": "该订阅重置包不适用于你的订阅",
+ "Login to :name": "登入到 :name",
+ "Sending frequently, please try again later": "发送频繁,请稍后再试"
}
diff --git a/resources/views/mail/classic/login.blade.php b/resources/views/mail/classic/login.blade.php
new file mode 100644
index 00000000..91f916b5
--- /dev/null
+++ b/resources/views/mail/classic/login.blade.php
@@ -0,0 +1,195 @@
+
+
+
+
+
+ 邮箱验证码
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+ {{$name}}
+ |
+
+
+
+
+
+
+ Dear Customer
+ |
+
+
+
+ 您正在登入到{{$name}}, 请在 5 分钟内点击下方链接进行登入。如果您未授权该登入请求,请无视。
+ |
+
+
+
+ {{$link}}
+ |
+
+
+
+ (本邮件由系统自动发出,请勿直接回复)
+ |
+
+
+
+ 登录 {{$name}}
+ |
+
+
+ |
+
+
+
+
+ |
+
+ |
+
+
+
+
+
diff --git a/resources/views/mail/default/login.blade.php b/resources/views/mail/default/login.blade.php
new file mode 100644
index 00000000..5047acde
--- /dev/null
+++ b/resources/views/mail/default/login.blade.php
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ {{$name}} |
+
+
+
+
+ 登入到{{$name}} |
+
+
+
+ 尊敬的用户您好!
+
+
+ 您正在登入到{{$name}}, 请在 5 分钟内点击下方链接进行登入。如果您未授权该登入请求,请无视。
+ {{$link}}
+ |
+
+
+
+
+
+
+ |
+
+
+
+