43 lines
1.3 KiB
PHP
43 lines
1.3 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\UI\Security;
|
||
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Cache;
|
||
use Illuminate\Support\Facades\Response;
|
||
|
||
class RecoveryCodeDownloadController
|
||
{
|
||
public function download(Request $request)
|
||
{
|
||
$token = (string) $request->query('token');
|
||
$payload = Cache::pull("recovery:$token"); // pull = get + forget
|
||
|
||
abort_unless($payload, 410); // Gone / abgelaufen
|
||
abort_unless($payload['user_id'] === $request->user()->id, 403);
|
||
|
||
$email = (string) $request->user()->email;
|
||
$now = now()->toDateTimeString();
|
||
|
||
$lines = [];
|
||
$lines[] = 'MailWolt – Recovery-Codes';
|
||
$lines[] = "Account: $email";
|
||
$lines[] = "Erzeugt: $now";
|
||
$lines[] = str_repeat('-', 34);
|
||
foreach ($payload['codes'] as $code) {
|
||
$lines[] = $code;
|
||
}
|
||
$lines[] = str_repeat('-', 34);
|
||
$lines[] = 'Bewahre diese Codes sicher offline auf. Jeder Code ist nur einmal gültig.';
|
||
|
||
$content = implode("\n", $lines);
|
||
$filename = 'mailwolt_recovery_codes_' . now()->format('Ymd_His') . '.txt';
|
||
|
||
return Response::streamDownload(
|
||
fn () => print($content),
|
||
$filename,
|
||
['Content-Type' => 'text/plain; charset=UTF-8']
|
||
);
|
||
}
|
||
}
|