Skip to content

Commit b02fa87

Browse files
authored
Merge pull request #13 from nutgram/webapp-middleware
2 parents 984513d + 710545f commit b02fa87

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Nutgram\Laravel\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
use SergiX44\Nutgram\Exception\InvalidDataException;
8+
use SergiX44\Nutgram\Nutgram;
9+
10+
class ValidateWebAppData
11+
{
12+
public function __construct(protected Nutgram $bot)
13+
{
14+
}
15+
16+
public function handle(Request $request, Closure $next): mixed
17+
{
18+
try {
19+
$initData = $request->input('initData', '');
20+
$data = $this->bot->validateWebAppData($initData);
21+
22+
$request->attributes->add(['webAppData' => $data]);
23+
return $next($request);
24+
} catch (InvalidDataException) {
25+
return $this->handleInvalidData($request, $next);
26+
}
27+
}
28+
29+
protected function handleInvalidData(Request $request, Closure $next): mixed
30+
{
31+
abort(403);
32+
}
33+
}

tests/Feature/MiddlewareTest.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
use Illuminate\Http\Request;
4+
use Nutgram\Laravel\Middleware\ValidateWebAppData;
5+
use SergiX44\Nutgram\Nutgram;
6+
use SergiX44\Nutgram\Telegram\Web\WebAppData;
7+
use SergiX44\Nutgram\Testing\FakeNutgram;
8+
use Symfony\Component\HttpKernel\Exception\HttpException;
9+
10+
beforeEach(function () {
11+
/** @var FakeNutgram $bot */
12+
$this->bot = app(Nutgram::class);
13+
$this->request = new Request();
14+
});
15+
16+
it('validates web app data', function () {
17+
$this->request->merge([
18+
'initData' => $this->bot->generateWebAppData([
19+
'foo' => 'bar',
20+
'auth_date' => time(),
21+
])
22+
]);
23+
24+
$middleware = new ValidateWebAppData($this->bot);
25+
$middleware->handle($this->request, function ($request) {
26+
expect($request->get('webAppData'))->toBeInstanceOf(WebAppData::class);
27+
});
28+
});
29+
30+
it('fails to validate web app data', function () {
31+
$middleware = new ValidateWebAppData($this->bot);
32+
$middleware->handle($this->request, function ($request) {
33+
});
34+
})->throws(HttpException::class);
35+
36+
it('fails to validate web app data + custom action', function () {
37+
$middleware = new class($this->bot) extends ValidateWebAppData {
38+
protected function handleInvalidData(Request $request, Closure $next): mixed
39+
{
40+
$request->attributes->add(['webAppData' => null]);
41+
return $next($request);
42+
}
43+
};
44+
45+
$middleware->handle($this->request, function ($request) {
46+
expect($request->get('webAppData'))->toBeNull();
47+
});
48+
});

0 commit comments

Comments
 (0)