@@ -231,6 +231,67 @@ void main() {
231231 );
232232 });
233233
234+ test ('install aborts when SHA256 checksum is missing' , () async {
235+ final archive = Archive ();
236+ archive.addFile (ArchiveFile ('test.txt' , 4 , utf8.encode ('good' )));
237+ final zipBytes = ZipEncoder ().encode (archive);
238+
239+ final mockClient = MockClient ((request) async {
240+ return http.Response .bytes (zipBytes, 200 );
241+ });
242+
243+ final repo = HttpMarketplaceRepository (client: mockClient);
244+ const manifest = ExtensionManifest (
245+ id: 'test.no-sha256' ,
246+ name: 'No SHA256' ,
247+ version: '1.0.0' ,
248+ publisher: 'Test' ,
249+ type: ExtensionType .theme,
250+ engines: {'querya_desktop' : '*' },
251+ downloadUrl: 'http://localhost:8000/test.zip' ,
252+ );
253+
254+ expect (
255+ () => repo.install (manifest),
256+ throwsA (isA <MarketplaceException >().having (
257+ (e) => e.message,
258+ 'message' ,
259+ contains ('missing SHA256 checksum' ),
260+ )),
261+ );
262+ });
263+
264+ test ('install aborts when SHA256 checksum is empty' , () async {
265+ final archive = Archive ();
266+ archive.addFile (ArchiveFile ('test.txt' , 4 , utf8.encode ('good' )));
267+ final zipBytes = ZipEncoder ().encode (archive);
268+
269+ final mockClient = MockClient ((request) async {
270+ return http.Response .bytes (zipBytes, 200 );
271+ });
272+
273+ final repo = HttpMarketplaceRepository (client: mockClient);
274+ const manifest = ExtensionManifest (
275+ id: 'test.empty-sha256' ,
276+ name: 'Empty SHA256' ,
277+ version: '1.0.0' ,
278+ publisher: 'Test' ,
279+ type: ExtensionType .theme,
280+ engines: {'querya_desktop' : '*' },
281+ downloadUrl: 'http://localhost:8000/test.zip' ,
282+ sha256Checksum: ' ' ,
283+ );
284+
285+ expect (
286+ () => repo.install (manifest),
287+ throwsA (isA <MarketplaceException >().having (
288+ (e) => e.message,
289+ 'message' ,
290+ contains ('missing SHA256 checksum' ),
291+ )),
292+ );
293+ });
294+
234295 test ('install prevents Path Traversal during archive unpacking (Issue #242)' , () async {
235296 final archive = Archive ();
236297 archive.addFile (ArchiveFile ('../evil.txt' , 4 , utf8.encode ('evil' )));
0 commit comments