fuc-new/src/Controllers/User/InfoController.php
hellcat 1fe8673f62 1
2025-10-01 13:34:29 +08:00

346 lines
10 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace App\Controllers\User;
use App\Controllers\BaseController;
use App\Models\Config;
use App\Models\User;
use App\Services\Auth;
use App\Services\Cache;
use App\Services\Filter;
use App\Services\MFA;
use App\Utils\Hash;
use App\Utils\ResponseHelper;
use App\Utils\Tools;
use Exception;
use Psr\Http\Message\ResponseInterface;
use Ramsey\Uuid\Uuid;
use RedisException;
use Slim\Http\Response;
use Slim\Http\ServerRequest;
use function in_array;
use function strlen;
use function strtolower;
use const BASE_PATH;
final class InfoController extends BaseController
{
/**
* @throws Exception
*/
public function index(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$themes = Tools::getDir(BASE_PATH . '/resources/views');
$methods = Tools::getSsMethod('method');
$ga_url = MFA::getGaUrl($this->user);
return $response->write($this->view()
->assign('user', $this->user)
->assign('themes', $themes)
->assign('methods', $methods)
->assign('ga_url', $ga_url)
->fetch('user/edit.tpl'));
}
/**
* @throws RedisException
*/
public function updateEmail(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$new_email = $this->antiXss->xss_clean($request->getParam('newemail'));
$user = $this->user;
$old_email = $user->email;
if (! $_ENV['enable_change_email'] || $user->is_shadow_banned) {
return ResponseHelper::error($response, '修改失败');
}
if ($new_email === '') {
return ResponseHelper::error($response, '未填写邮箱');
}
$email_check = Filter::checkEmailFilter($email);
if (! $email_check) {
return ResponseHelper::error($response, '无效的邮箱');
}
$exist_user = (new User())->where('email', $new_email)->first();
if ($exist_user !== null) {
return ResponseHelper::error($response, '邮箱已经被使用了');
}
if ($new_email === $old_email) {
return ResponseHelper::error($response, '新邮箱不能和旧邮箱一样');
}
if (Config::obtain('reg_email_verify')) {
$redis = (new Cache())->initRedis();
$email_verify_code = $request->getParam('emailcode');
$email_verify = $redis->get('email_verify:' . $email_verify_code);
if (! $email_verify) {
return ResponseHelper::error($response, '你的邮箱验证码不正确');
}
$redis->del('email_verify:' . $email_verify_code);
}
$user->email = $new_email;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return $response->withJson([
'ret' => 1,
'msg' => '修改成功',
'data' => [
'email' => $user->email,
],
]);
}
public function updateUsername(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$newusername = $this->antiXss->xss_clean($request->getParam('newusername'));
$user = $this->user;
if ($user->is_shadow_banned) {
return ResponseHelper::error($response, '修改失败');
}
$user->user_name = $newusername;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return $response->withJson([
'ret' => 1,
'msg' => '修改成功',
'data' => [
'username' => $user->user_name,
],
]);
}
public function unbindIM(ServerRequest $request, Response $response, array $args): ResponseInterface
{
if (! $this->user->unbindIM()) {
return ResponseHelper::error($response, '解绑失败');
}
return $response->withHeader('HX-Refresh', 'true')->withJson([
'ret' => 1,
'msg' => '解绑成功',
]);
}
public function updatePassword(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$password = $request->getParam('password');
$new_password = $request->getParam('new_password');
$confirm_new_password = $request->getParam('confirm_new_password');
$user = $this->user;
if ($password === '' || $new_password === '' || $confirm_new_password === '') {
return ResponseHelper::error($response, '密码不能为空');
}
if (! Hash::checkPassword($user->pass, $password)) {
return ResponseHelper::error($response, '旧密码错误');
}
if ($new_password !== $confirm_new_password) {
return ResponseHelper::error($response, '两次输入不符合');
}
if (strlen($new_password) < 8) {
return ResponseHelper::error($response, '密码太短啦');
}
$user->pass = Hash::passwordHash($new_password);
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
if (Config::obtain('enable_forced_replacement')) {
$user->removeLink();
}
return ResponseHelper::success($response, '修改成功');
}
public function resetPasswd(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$user = $this->user;
$user->passwd = Tools::genRandomChar(16);
$user->uuid = Uuid::uuid4();
if (! $user->save()) {
return ResponseHelper::error($response, '重置失败');
}
return $response->withJson([
'ret' => 1,
'msg' => '重置成功',
'data' => [
'passwd' => $user->passwd,
'uuid' => $user->uuid,
],
]);
}
public function resetApiToken(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$user = $this->user;
$user->api_token = Tools::genRandomChar(32);
if (! $user->save()) {
return ResponseHelper::error($response, '重置失败');
}
return ResponseHelper::success($response, '重置成功');
}
public function updateMethod(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$user = $this->user;
$method = strtolower($this->antiXss->xss_clean($request->getParam('method')));
if ($method === '') {
ResponseHelper::error($response, '非法输入');
}
if (! Tools::isParamValidate('method', $method)) {
ResponseHelper::error($response, '加密无效');
}
$user->method = $method;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return ResponseHelper::success($response, '修改成功');
}
public function resetURL(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$this->user->removeLink();
// cool面板同时重置密钥
$user = $this->user;
$user->passwd = Tools::genRandomChar(16);
$user->uuid = Uuid::uuid4();
if (! $user->save()) {
return ResponseHelper::error($response, '重置失败');
}
// end
return ResponseHelper::success($response, '重置成功');
}
public function updateDailyMail(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$value = (int) $request->getParam('mail');
if (! in_array($value, [0, 1, 2])) {
return ResponseHelper::error($response, '参数错误');
}
$user = $this->user;
$user->mail_level = $value;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return ResponseHelper::success($response, '修改成功');
}
public function updateDailyMail_old(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$value = (int) $request->getParam('mail');
if (! in_array($value, [0, 1, 2])) {
return ResponseHelper::error($response, '参数错误');
}
$user = $this->user;
$user->daily_mail_enable = $value;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return ResponseHelper::success($response, '修改成功');
}
public function updateContactMethod(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$value = (int) $request->getParam('contact');
if (! in_array($value, [1, 2])) {
return ResponseHelper::error($response, '参数错误');
}
$user = $this->user;
$user->contact_method = $value;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return ResponseHelper::success($response, '修改成功');
}
public function updateTheme(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$theme = $this->antiXss->xss_clean($request->getParam('theme'));
$user = $this->user;
if ($theme === '') {
return ResponseHelper::error($response, '主题不能为空');
}
$user->theme = $theme;
if (! $user->save()) {
return ResponseHelper::error($response, '修改失败');
}
return $response->withHeader('HX-Refresh', 'true')->withJson([
'ret' => 1,
'msg' => '修改成功',
]);
}
public function sendToGulag(ServerRequest $request, Response $response, array $args): ResponseInterface
{
$user = $this->user;
$password = $request->getParam('password');
if ($password === '' || ! Hash::checkPassword($user->pass, $password)) {
return ResponseHelper::error($response, '密码错误');
}
if ($_ENV['enable_kill']) {
Auth::logout();
$user->kill();
return $response->withHeader('HX-Refresh', 'true')->withJson([
'ret' => 1,
'msg' => '账号删除成功,感谢使用。',
]);
}
return ResponseHelper::error($response, '自助账号删除未启用');
}
}