| import unittest |
| import app as app_module |
| from app import app |
| import io |
| import time |
|
|
| class SecurityTestCase(unittest.TestCase): |
| def setUp(self): |
| app.config['TESTING'] = True |
| self.client = app.test_client() |
| |
| app_module.upload_counts.clear() |
| |
| app_module.model_loaded = True |
|
|
| def test_download_valid_filename(self): |
| |
| valid_uuid = "a" * 32 |
| response = self.client.get(f'/download/colorized_{valid_uuid}.png') |
| self.assertEqual(response.status_code, 404) |
|
|
| def test_download_invalid_format(self): |
| |
| response = self.client.get('/download/colorized_abc123.png') |
| self.assertEqual(response.status_code, 400) |
| self.assertIn(b'Invalid filename format', response.data) |
|
|
| |
| valid_uuid = "a" * 32 |
| response = self.client.get(f'/download/{valid_uuid}.png') |
| self.assertEqual(response.status_code, 400) |
|
|
| |
| response = self.client.get(f'/download/colorized_{valid_uuid}.exe') |
| self.assertEqual(response.status_code, 400) |
|
|
| def test_path_traversal_prevention(self): |
| |
| response = self.client.get('/download/..%2f..%2fapp.py') |
| |
| self.assertIn(response.status_code, [400, 404]) |
|
|
| |
| response = self.client.get('/download/colorized_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png%00') |
| self.assertEqual(response.status_code, 400) |
|
|
| def test_rate_limiting(self): |
| |
| for _ in range(10): |
| data = {'file': (io.BytesIO(b"fake image data"), 'test.png')} |
| response = self.client.post('/upload', data=data, content_type='multipart/form-data') |
| |
| self.assertNotEqual(response.status_code, 429) |
|
|
| |
| data = {'file': (io.BytesIO(b"fake image data"), 'test.png')} |
| response = self.client.post('/upload', data=data, content_type='multipart/form-data') |
| self.assertEqual(response.status_code, 429) |
| self.assertIn(b'Rate limit exceeded', response.data) |
|
|
| def test_upload_invalid_magic_bytes(self): |
| |
| data = {'file': (io.BytesIO(b"this is not a jpeg"), 'test.jpg')} |
| response = self.client.post('/upload', data=data, content_type='multipart/form-data') |
| self.assertEqual(response.status_code, 400) |
| self.assertIn(b'Invalid image content', response.data) |
|
|
| |
| data = {'file': (io.BytesIO(b"this is not a png"), 'test.png')} |
| response = self.client.post('/upload', data=data, content_type='multipart/form-data') |
| self.assertEqual(response.status_code, 400) |
| self.assertIn(b'Invalid image content', response.data) |
|
|
| if __name__ == '__main__': |
| unittest.main() |
|
|