fix(auth): enforce password and agent role boundaries

This commit is contained in:
wchino
2026-07-21 23:41:18 +08:00
parent fb15c64d9b
commit 457d2cc9e5
7 changed files with 135 additions and 19 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api\V1\Player;
use App\Support\ApiResponse;
use App\Services\AuditLogger;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use App\Services\Player\PlayerPasswordService;
use App\Http\Requests\Player\PlayerPasswordUpdateRequest;
@@ -19,22 +20,26 @@ final class PlayerPasswordUpdateController extends Controller
$player = $request->lotteryPlayer();
abort_if($player === null, 500, 'lottery_player missing');
$updated = $passwords->change(
$player,
(string) $request->validated('current_password'),
(string) $request->validated('password'),
);
$updated = DB::transaction(function () use ($passwords, $player, $request) {
$updated = $passwords->change(
$player,
(string) $request->validated('current_password'),
(string) $request->validated('password'),
);
AuditLogger::recordForPlayer(
$updated,
$request,
'player_account',
'change_password',
'player',
(string) $updated->id,
null,
['native_token_version' => (int) $updated->native_token_version],
);
AuditLogger::recordForPlayer(
$updated,
$request,
'player_account',
'change_password',
'player',
(string) $updated->id,
null,
['native_token_version' => (int) $updated->native_token_version],
);
return $updated;
});
return ApiResponse::success(['password_changed' => true], request: $request);
}

View File

@@ -10,7 +10,6 @@ use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
use App\Services\Wallet\MainSiteWalletGateway;
use App\Services\Wallet\HttpMainSiteWalletGateway;
use App\Services\Wallet\StubMainSiteWalletGateway;
final class AppServiceProvider extends ServiceProvider
{
@@ -81,5 +80,15 @@ final class AppServiceProvider extends ServiceProvider
return Limit::perMinute(15)->by($request->ip());
});
RateLimiter::for('player-password-change', function (Request $request) {
if ((bool) env('LOTTERY_E2E', false)) {
return Limit::none();
}
$playerId = $request->lotteryPlayer()?->getKey();
return Limit::perMinute(5)->by(($playerId ?? 'guest').'|'.$request->ip());
});
}
}

View File

@@ -23,7 +23,9 @@ final class InvalidPlatformAgentRoleCleanup
->whereNotExists(static function ($query): void {
$query->selectRaw('1')
->from('admin_user_agents as cleanup_uag')
->whereColumn('cleanup_uag.admin_user_id', 'admin_user_site_roles.admin_user_id');
->join('agent_nodes as cleanup_node', 'cleanup_node.id', '=', 'cleanup_uag.agent_node_id')
->whereColumn('cleanup_uag.admin_user_id', 'admin_user_site_roles.admin_user_id')
->whereColumn('cleanup_node.admin_site_id', 'admin_user_site_roles.site_id');
})
->delete();
}