| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | namespace Tests\Uploads; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2020-11-06 20:54:39 +08:00
										 |  |  | use BookStack\Entities\Repos\PageRepo; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | use BookStack\Entities\Tools\TrashCan; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Uploads\Attachment; | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  | use BookStack\Uploads\AttachmentService; | 
					
						
							|  |  |  | use Illuminate\Http\UploadedFile; | 
					
						
							| 
									
										
										
										
											2020-04-04 08:16:05 +08:00
										 |  |  | use Tests\TestCase; | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class AttachmentTest extends TestCase | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Get a test file that can be uploaded. | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |     protected function getTestFile(string $fileName): UploadedFile | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |         return new UploadedFile(base_path('tests/test-data/test-file.txt'), $fileName, 'text/plain', 55, null, true); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Uploads a file with the given name. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |     protected function uploadFile(string $name, int $uploadedTo = 0): \Illuminate\Foundation\Testing\TestResponse | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $file = $this->getTestFile($name); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-12 22:12:26 +08:00
										 |  |  |         return $this->call('POST', '/attachments/upload', ['uploaded_to' => $uploadedTo], [], ['file' => $file], []); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Create a new attachment. | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     protected function createAttachment(Page $page): Attachment | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->post('attachments/link', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'attachment_link_url'         => 'https://example.com', | 
					
						
							|  |  |  |             'attachment_link_name'        => 'Example Attachment Link', | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |             'attachment_link_uploaded_to' => $page->id, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return Attachment::query()->latest()->first(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Delete all uploaded files. | 
					
						
							|  |  |  |      * To assist with cleanup. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function deleteUploads() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |         $fileService = $this->app->make(AttachmentService::class); | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |         foreach (Attachment::all() as $file) { | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |             $fileService->deleteFile($file); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_file_upload() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $fileName = 'upload_test_file.txt'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $expectedResp = [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'name'       => $fileName, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |             'uploaded_to'=> $page->id, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'extension'  => 'txt', | 
					
						
							|  |  |  |             'order'      => 1, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |             'created_by' => $admin->id, | 
					
						
							|  |  |  |             'updated_by' => $admin->id, | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $upload = $this->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $attachment = Attachment::query()->orderBy('id', 'desc')->first(); | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $upload->assertJson($expectedResp); | 
					
						
							| 
									
										
										
										
											2021-10-20 07:58:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $expectedResp['path'] = $attachment->path; | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $this->assertDatabaseHas('attachments', $expectedResp); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |     public function test_file_upload_does_not_use_filename() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |         $fileName = 'upload_test_file.txt'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $upload = $this->asAdmin()->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $attachment = Attachment::query()->orderBy('id', 'desc')->first(); | 
					
						
							| 
									
										
										
										
											2019-09-14 21:12:39 +08:00
										 |  |  |         $this->assertStringNotContainsString($fileName, $attachment->path); | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |         $this->assertStringEndsWith('.txt', $attachment->path); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |     public function test_file_display_and_access() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  |         $fileName = 'upload_test_file.txt'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $upload = $this->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  |         $attachment = Attachment::orderBy('id', 'desc')->take(1)->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pageGet = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageGet->assertSeeText($fileName); | 
					
						
							|  |  |  |         $pageGet->assertSee($attachment->getUrl()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $attachmentGet = $this->get($attachment->getUrl()); | 
					
						
							|  |  |  |         $attachmentGet->assertSee('Hi, This is a test file for testing the upload process.'); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_attaching_link_to_page() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $linkReq = $this->call('POST', 'attachments/link', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'attachment_link_url'         => 'https://example.com', | 
					
						
							|  |  |  |             'attachment_link_name'        => 'Example Attachment Link', | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |             'attachment_link_uploaded_to' => $page->id, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |         $expectedData = [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'path'        => 'https://example.com', | 
					
						
							|  |  |  |             'name'        => 'Example Attachment Link', | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |             'uploaded_to' => $page->id, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'created_by'  => $admin->id, | 
					
						
							|  |  |  |             'updated_by'  => $admin->id, | 
					
						
							|  |  |  |             'external'    => true, | 
					
						
							|  |  |  |             'order'       => 1, | 
					
						
							|  |  |  |             'extension'   => '', | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $linkReq->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |         $this->assertDatabaseHas('attachments', $expectedData); | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $attachment = Attachment::orderBy('id', 'desc')->take(1)->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $pageGet = $this->get($page->getUrl()); | 
					
						
							|  |  |  |         $pageGet->assertSeeText('Example Attachment Link'); | 
					
						
							|  |  |  |         $pageGet->assertSee($attachment->getUrl()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $attachmentGet = $this->get($attachment->getUrl()); | 
					
						
							|  |  |  |         $attachmentGet->assertRedirect('https://example.com'); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_attachment_updating() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |         $attachment = $this->createAttachment($page); | 
					
						
							|  |  |  |         $update = $this->call('PUT', 'attachments/' . $attachment->id, [ | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |             'attachment_edit_name' => 'My new attachment name', | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'attachment_edit_url'  => 'https://test.example.com', | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |         $expectedData = [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'id'          => $attachment->id, | 
					
						
							|  |  |  |             'path'        => 'https://test.example.com', | 
					
						
							|  |  |  |             'name'        => 'My new attachment name', | 
					
						
							|  |  |  |             'uploaded_to' => $page->id, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $update->assertStatus(200); | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |         $this->assertDatabaseHas('attachments', $expectedData); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_file_deletion() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  |         $fileName = 'deletion_test.txt'; | 
					
						
							|  |  |  |         $this->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |         $attachment = Attachment::query()->orderBy('id', 'desc')->first(); | 
					
						
							|  |  |  |         $filePath = storage_path($attachment->path); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $this->assertTrue(file_exists($filePath), 'File at path ' . $filePath . ' does not exist'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 00:04:26 +08:00
										 |  |  |         $attachment = Attachment::first(); | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $this->delete($attachment->getUrl()); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $this->assertDatabaseMissing('attachments', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'name' => $fileName, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |         $this->assertFalse(file_exists($filePath), 'File at path ' . $filePath . ' was not deleted as expected'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_attachment_deletion_on_page_deletion() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  |         $fileName = 'deletion_test.txt'; | 
					
						
							|  |  |  |         $this->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 03:07:18 +08:00
										 |  |  |         $attachment = Attachment::query()->orderBy('id', 'desc')->first(); | 
					
						
							|  |  |  |         $filePath = storage_path($attachment->path); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->assertTrue(file_exists($filePath), 'File at path ' . $filePath . ' does not exist'); | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $this->assertDatabaseHas('attachments', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'name' => $fileName, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 20:54:39 +08:00
										 |  |  |         app(PageRepo::class)->destroy($page); | 
					
						
							|  |  |  |         app(TrashCan::class)->empty(); | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $this->assertDatabaseMissing('attachments', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'name' => $fileName, | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |         $this->assertFalse(file_exists($filePath), 'File at path ' . $filePath . ' was not deleted as expected'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_attachment_access_without_permission_shows_404() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $admin = $this->getAdmin(); | 
					
						
							|  |  |  |         $viewer = $this->getViewer(); | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); /** @var Page $page */ | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $this->actingAs($admin); | 
					
						
							|  |  |  |         $fileName = 'permission_test.txt'; | 
					
						
							|  |  |  |         $this->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  |         $attachment = Attachment::orderBy('id', 'desc')->take(1)->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $page->restricted = true; | 
					
						
							|  |  |  |         $page->permissions()->delete(); | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page->rebuildPermissions(); | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  |         $page->load('jointPermissions'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->actingAs($viewer); | 
					
						
							|  |  |  |         $attachmentGet = $this->get($attachment->getUrl()); | 
					
						
							|  |  |  |         $attachmentGet->assertStatus(404); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |         $attachmentGet->assertSee('Attachment not found'); | 
					
						
							| 
									
										
										
										
											2018-02-11 20:37:02 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_data_and_js_links_cannot_be_attached_to_a_page() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  |         $page = Page::query()->first(); | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $badLinks = [ | 
					
						
							|  |  |  |             'javascript:alert("bunny")', | 
					
						
							|  |  |  |             ' javascript:alert("bunny")', | 
					
						
							|  |  |  |             'JavaScript:alert("bunny")', | 
					
						
							|  |  |  |             "\t\n\t\nJavaScript:alert(\"bunny\")", | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'data:text/html;<a></a>', | 
					
						
							|  |  |  |             'Data:text/html;<a></a>', | 
					
						
							|  |  |  |             'Data:text/html;<a></a>', | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($badLinks as $badLink) { | 
					
						
							|  |  |  |             $linkReq = $this->post('attachments/link', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |                 'attachment_link_url'         => $badLink, | 
					
						
							|  |  |  |                 'attachment_link_name'        => 'Example Attachment Link', | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |                 'attachment_link_uploaded_to' => $page->id, | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |             $linkReq->assertStatus(422); | 
					
						
							|  |  |  |             $this->assertDatabaseMissing('attachments', [ | 
					
						
							|  |  |  |                 'path' => $badLink, | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $attachment = $this->createAttachment($page); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($badLinks as $badLink) { | 
					
						
							|  |  |  |             $linkReq = $this->put('attachments/' . $attachment->id, [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |                 'attachment_edit_url'  => $badLink, | 
					
						
							| 
									
										
										
										
											2020-10-31 23:01:52 +08:00
										 |  |  |                 'attachment_edit_name' => 'Example Attachment Link', | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |             $linkReq->assertStatus(422); | 
					
						
							|  |  |  |             $this->assertDatabaseMissing('attachments', [ | 
					
						
							|  |  |  |                 'path' => $badLink, | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_file_access_with_open_query_param_provides_inline_response_with_correct_content_type() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::query()->first(); | 
					
						
							|  |  |  |         $this->asAdmin(); | 
					
						
							|  |  |  |         $fileName = 'upload_test_file.txt'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $upload = $this->uploadFile($fileName, $page->id); | 
					
						
							|  |  |  |         $upload->assertStatus(200); | 
					
						
							|  |  |  |         $attachment = Attachment::query()->orderBy('id', 'desc')->take(1)->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $attachmentGet = $this->get($attachment->getUrl(true)); | 
					
						
							|  |  |  |         // http-foundation/Response does some 'fixing' of responses to add charsets to text responses.
 | 
					
						
							|  |  |  |         $attachmentGet->assertHeader('Content-Type', 'text/plain; charset=UTF-8'); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |         $attachmentGet->assertHeader('Content-Disposition', 'inline; filename="upload_test_file.txt"'); | 
					
						
							| 
									
										
										
										
											2021-06-06 20:55:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->deleteUploads(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-23 22:25:04 +08:00
										 |  |  | } |