Skip to content

Commit 6cdb3cb

Browse files
committed
Refactor LimitWikiAccess middleware
1 parent 993d322 commit 6cdb3cb

4 files changed

Lines changed: 100 additions & 28 deletions

File tree

app/Http/Controllers/WikiEntityImportController.php

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,14 @@ public function __construct(CollectorRegistry $registry)
3232
}
3333
public function get(Request $request): \Illuminate\Http\JsonResponse
3434
{
35-
$validatedInput = $request->validate([
36-
'wiki' => ['required', 'integer'],
37-
]);
38-
$wiki = Wiki::find($validatedInput['wiki']);
39-
if (!$wiki) {
40-
abort(404, 'No such wiki');
41-
}
42-
35+
$wiki = $request->attributes->get('wiki');
4336
$imports = $wiki->wikiEntityImports()->get();
4437
return response()->json(['data' => $imports]);
4538
}
4639

4740
public function create(Request $request): \Illuminate\Http\JsonResponse
4841
{
4942
$validatedInput = $request->validate([
50-
'wiki' => ['required', 'integer'],
5143
'source_wiki_url' => ['required', 'url'],
5244
'entity_ids' => ['required', 'string', function (string $attr, mixed $value, \Closure $fail) {
5345
$chunks = explode(',', $value);
@@ -59,11 +51,7 @@ public function create(Request $request): \Illuminate\Http\JsonResponse
5951
}],
6052
]);
6153

62-
$wiki = Wiki::find($validatedInput['wiki']);
63-
if (!$wiki) {
64-
abort(404, 'No such wiki');
65-
}
66-
54+
$wiki = $request->attributes->get('wiki');
6755
$imports = $wiki->wikiEntityImports()->get();
6856
foreach ($imports as $import) {
6957
if ($import->status === WikiEntityImportStatus::Success) {

app/Http/Controllers/WikiProfileController.php

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use App\Helper\ProfileValidator;
66
use App\Rules\NonEmptyJsonRule;
7-
use App\Wiki;
87
use App\WikiProfile;
98
use Illuminate\Http\Request;
109

@@ -19,16 +18,11 @@ public function __construct(ProfileValidator $profileValidator)
1918

2019
public function create(Request $request): \Illuminate\Http\JsonResponse
2120
{
21+
$wiki = $request->attributes->get('wiki');
2222
$validatedInput = $request->validate([
23-
'wiki' => ['required', 'integer'],
2423
'profile' => ['required', 'json', new NonEmptyJsonRule]
2524
]);
2625

27-
$wiki = Wiki::find($validatedInput['wiki']);
28-
if (!$wiki) {
29-
abort(404, 'No such wiki');
30-
}
31-
3226
$rawProfile = json_decode($validatedInput['profile'], true);
3327
$profileValidator = $this->profileValidator->validate($rawProfile);
3428
$profileValidator->validateWithBag('post');

app/Http/Middleware/LimitWikiAccess.php

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,32 @@
1010
class LimitWikiAccess
1111
{
1212
/**
13-
* Handle an incoming request.
14-
*
15-
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
13+
* Reject any incoming request unless the user is a manager of the
14+
* requested wiki. If the user is authorized, inject the wiki
15+
* object into the request context.
1616
*/
1717
public function handle(Request $request, Closure $next): Response
1818
{
19-
$userHasAccess = WikiManager::where([
19+
$validatedInput = $request->validate([
20+
'wiki' => ['required', 'integer']
21+
]);
22+
23+
$wikiManager = WikiManager::where([
2024
'user_id' => $request->user()?->id,
21-
'wiki_id' => $request->input('wiki'),
22-
])->exists();
25+
'wiki_id' => $validatedInput['wiki'],
26+
])
27+
->with('wiki')
28+
->first();
2329

24-
if (!$userHasAccess) {
30+
if (!$wikiManager) {
2531
abort(403);
2632
}
2733

34+
if (!$wikiManager->wiki) {
35+
abort(404, 'No such wiki');
36+
}
37+
38+
$request->attributes->set('wiki', $wikiManager->wiki);
2839
return $next($request);
2940
}
3041
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
namespace Tests\Jobs;
4+
5+
use App\User;
6+
use App\Wiki;
7+
use App\WikiManager;
8+
use Illuminate\Http\Request;
9+
use Tests\TestCase;
10+
use Illuminate\Support\Facades\Route;
11+
12+
class LimitWikiAccessText extends TestCase
13+
{
14+
public function setUp(): void
15+
{
16+
parent::setUp();
17+
Route::middleware('limit_wiki_access')->get('/endpoint', function (Request $request) {
18+
return response()->json([
19+
'wiki_id' => $request->attributes->get('wiki')->id
20+
]);
21+
});
22+
}
23+
24+
public function tearDown(): void
25+
{
26+
parent::tearDown();
27+
}
28+
29+
private function createWikiAndUser(): array
30+
{
31+
$wiki = Wiki::factory()->create();
32+
$user = User::factory()->create(['verified' => true]);
33+
WikiManager::factory()->create(['wiki_id' => $wiki->id, 'user_id' => $user->id]);
34+
return array($wiki, $user);
35+
}
36+
37+
private function getURI(Wiki $wiki): string
38+
{
39+
return "/endpoint?wiki={$wiki->id}";
40+
}
41+
42+
public function testSuccess(): void
43+
{
44+
[$wiki, $user] = $this->createWikiAndUser();
45+
46+
$this->actingAs($user)
47+
->json('GET', $this->getURI($wiki))
48+
->assertStatus(200)
49+
->assertJson(['wiki_id' => $wiki->id]);
50+
}
51+
52+
public function testFailOnWrongWikiManager(): void
53+
{
54+
$userWiki = Wiki::factory()->create();
55+
$otherWiki = Wiki::factory()->create();
56+
$user = User::factory()->create(['verified' => true]);
57+
WikiManager::factory()->create(['wiki_id' => $userWiki->id, 'user_id' => $user->id]);
58+
$this->actingAs($user)->json('GET', $this->getURI($otherWiki))->assertStatus(403);
59+
}
60+
61+
public function testFailOnDeletedWiki(): void
62+
{
63+
[$wiki, $user] = $this->createWikiAndUser();
64+
$wiki->delete();
65+
$this->actingAs($user)->json('GET', $this->getURI($wiki))->assertStatus(404);
66+
}
67+
68+
public function testFailOnMissingWiki(): void
69+
{
70+
[$wiki, $user] = $this->createWikiAndUser();
71+
$this->actingAs($user)->json('GET', '/endpoint')->assertStatus(422);
72+
}
73+
74+
public function testFailOnMissingUser(): void
75+
{
76+
[$wiki, $user] = $this->createWikiAndUser();
77+
$this->json('GET', $this->getURI($wiki))->assertStatus(403);
78+
}
79+
}

0 commit comments

Comments
 (0)