Skip to content

Commit 59bb1bf

Browse files
committed
Detect corrupt files from browser cache to avoid freezing when restoring database
1 parent ae21f60 commit 59bb1bf

3 files changed

Lines changed: 59 additions & 24 deletions

File tree

src/client/communication/NetworkManager.ts

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { CacheManager } from "./CacheManager.js";
99
import { NotifierClient } from "./NotifierClient.js";
1010
import { TemplateUploader } from "../tools/TemplateUploader.js";
1111
import jQuery from "jquery";
12+
import { FileTool } from "../tools/FileTool.js";
1213

1314

1415
export class NetworkManager {
@@ -69,7 +70,7 @@ export class NetworkManager {
6970

7071
}
7172

72-
initializeNotifierClient(){
73+
initializeNotifierClient() {
7374
this.notifierClient = new NotifierClient(this.main, this);
7475
}
7576

@@ -239,19 +240,19 @@ export class NetworkManager {
239240
(response) => {
240241

241242
this.sendUpdates(() => {
242-
243-
let request: DistributeWorkspaceRequest = {
244-
workspace_id: ws.id,
245-
database_as_template_id: response.newTemplateId,
246-
class_id: klasse?.id,
247-
student_ids: student_ids
248-
}
249-
250-
ajax("distributeWorkspace", request, (response: DistributeWorkspaceResponse) => {
251-
callback(response.message)
252-
}, callback);
253-
254-
}, false);
243+
244+
let request: DistributeWorkspaceRequest = {
245+
workspace_id: ws.id,
246+
database_as_template_id: response.newTemplateId,
247+
class_id: klasse?.id,
248+
student_ids: student_ids
249+
}
250+
251+
ajax("distributeWorkspace", request, (response: DistributeWorkspaceResponse) => {
252+
callback(response.message)
253+
}, callback);
254+
255+
}, false);
255256
});
256257

257258
}
@@ -338,24 +339,31 @@ export class NetworkManager {
338339
if (response.success) {
339340

340341
workspace.database = WDatabase.fromDatabaseData(response.database, response.version)
342+
343+
if (workspace.database.based_on_template_id == null) {
344+
callback(null);
345+
return
346+
}
347+
341348
cacheManager.fetchTemplateFromCache(workspace.database.based_on_template_id, (templateDump: Uint8Array) => {
342349

343-
if (templateDump != null) {
344-
try{
350+
if (FileTool.isZipfile(templateDump)) {
351+
try {
345352
// @ts-ignore
346353
workspace.database.templateDump = pako.inflate(templateDump);
347-
} catch(err){
354+
} catch (err) {
348355
console.log(err);
349356
console.log("Dump seems not to be compressed...");
350357
workspace.database.templateDump = templateDump;
351358
}
359+
} else {
360+
workspace.database.templateDump = templateDump;
361+
}
362+
363+
if (FileTool.isSqLiteFile(workspace.database.templateDump)) {
352364
callback(null);
353365
return;
354366
} else {
355-
if (workspace.database.based_on_template_id == null) {
356-
callback(null);
357-
return
358-
}
359367
this.fetchTemplate(workspace.id, (template) => {
360368
if (template != null) {
361369
cacheManager.saveTemplateToCache(workspace.database.based_on_template_id, template);
@@ -557,7 +565,7 @@ export class NetworkManager {
557565

558566
ajax("rollback", request, (response: RollbackResponse) => {
559567
if (response.success) {
560-
568+
561569
callback(null, workspace.database.version > response.new_version);
562570
} else {
563571
alert(response.message);

src/client/compiler/parser/Parser.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,9 +1772,7 @@ export class Parser {
17721772
node.union = this.parseSelect();
17731773
}
17741774
} else {
1775-
console.log("union?");
17761775
if (hasFrom && node.fromNode != null) {
1777-
console.log("yes!");
17781776
fromListKeywordArray.push("union");
17791777
}
17801778
}

src/client/tools/FileTool.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
export class FileTool {
2+
static zipSignature: number[] = [0x78, 0x9c];
3+
static sqLiteSignature: number[] = [0x53, 0x51, 0x4C, 0x69, 0x74, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x20, 0x33, 0x00];
4+
5+
static isZipfile(fileData: Uint8Array): boolean {
6+
7+
return FileTool.checkSignature(fileData, this.zipSignature);
8+
9+
}
10+
11+
static isSqLiteFile(fileData: Uint8Array): boolean {
12+
13+
return FileTool.checkSignature(fileData, this.sqLiteSignature);
14+
15+
}
16+
17+
static checkSignature(fileData: Uint8Array, signature: number[]): boolean {
18+
19+
if(fileData == null) return false;
20+
if(fileData.byteLength < signature.length) return false;
21+
22+
for(let i = 0; i < signature.length; i++){
23+
if(fileData[i] != signature[i]) return false;
24+
}
25+
26+
return true;
27+
}
28+
29+
}

0 commit comments

Comments
 (0)