e71a02e498
Закрывает CV.11 audit WARN #4 (placeholder secret '__SET_ON_DEPLOY__' = silent 404 на production через verifySecret в SupplierWebhookController). Console command для deploy-script: SELECT system_settings.supplier_webhook_secret → exit 1 если placeholder OR len < 32 OR row отсутствует. Иначе exit 0. Использование: deploy-script вызывает `php artisan supplier:check-webhook-secret` перед запуском приложения; non-zero exit прерывает deploy fail-fast. TDD: 4 теста (placeholder rejected / short rejected / missing rejected / valid accepted). phpstan-baseline +1 entry: Pest TestCall::artisan() PhpDoc-quirk (как ResetDeliveredTodayCommandTest). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
60 lines
2.3 KiB
PHP
60 lines
2.3 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use Illuminate\Console\Command;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
/**
|
||
* Deploy-time validator для supplier_webhook_secret.
|
||
*
|
||
* Spec: docs/superpowers/specs/2026-05-10-supplier-integration-design.md §5.1.
|
||
* Plan 2.6 fix #i: closes CV.11 audit WARN #4 (placeholder seed на production
|
||
* → endpoint silent 404 на ВСЕ запросы из-за verifySecret в SupplierWebhookController).
|
||
*
|
||
* Использование в deploy-script: `php artisan supplier:check-webhook-secret`
|
||
* exit code 0 = OK, exit code 1 = блокирующая ошибка (deploy не должен продолжаться).
|
||
*
|
||
* Проверки:
|
||
* 1. system_settings row существует с key='supplier_webhook_secret'.
|
||
* 2. value !== '__SET_ON_DEPLOY__' (placeholder из schema seed).
|
||
* 3. strlen(value) >= 32 chars (требование verifySecret в SupplierWebhookController).
|
||
*/
|
||
class CheckSupplierWebhookSecretCommand extends Command
|
||
{
|
||
protected $signature = 'supplier:check-webhook-secret';
|
||
|
||
protected $description = 'Deploy-time validator: проверка supplier_webhook_secret seed (Plan 2.6 fix #i)';
|
||
|
||
public function handle(): int
|
||
{
|
||
$row = DB::table('system_settings')->where('key', 'supplier_webhook_secret')->first();
|
||
|
||
if ($row === null) {
|
||
$this->error('FAIL: system_settings row для key=supplier_webhook_secret не найдена. Schema seed повреждён или БД не мигрирована.');
|
||
|
||
return self::FAILURE;
|
||
}
|
||
|
||
$value = (string) $row->value;
|
||
|
||
if ($value === '__SET_ON_DEPLOY__') {
|
||
$this->error('FAIL: supplier_webhook_secret = "__SET_ON_DEPLOY__" (placeholder из schema seed). Override через UPDATE system_settings перед deploy.');
|
||
|
||
return self::FAILURE;
|
||
}
|
||
|
||
if (strlen($value) < 32) {
|
||
$this->error('FAIL: supplier_webhook_secret слишком короткий (length='.strlen($value).', нужно >=32 chars для совместимости с verifySecret в SupplierWebhookController).');
|
||
|
||
return self::FAILURE;
|
||
}
|
||
|
||
$this->info('OK: supplier_webhook_secret valid (length='.strlen($value).' chars, не placeholder).');
|
||
|
||
return self::SUCCESS;
|
||
}
|
||
}
|