From 5668016ef55f31225fa14d191c0b40761cd0dbff Mon Sep 17 00:00:00 2001
From: piotrpekala7 <31202938+piotrpekala7@users.noreply.github.com>
Date: Wed, 2 Dec 2020 03:53:06 +0100
Subject: [PATCH] Fix for https://github.com/GNS3/gns3-web-ui/issues/983
---
package.json | 1 +
.../new-template-dialog.component.html | 8 +--
.../new-template-dialog.component.ts | 55 ++++++++++++++++++-
yarn.lock | 5 ++
4 files changed, 64 insertions(+), 5 deletions(-)
diff --git a/package.json b/package.json
index d0de5008..2d5430bd 100644
--- a/package.json
+++ b/package.json
@@ -80,6 +80,7 @@
"save-svg-as-png": "^1.4.14",
"schematics-scss-migrate": "^1.2.10",
"snyk": "^1.413.3",
+ "spark-md5": "^3.0.1",
"svg-crowbar": "^0.6.1",
"tree-kill": "^1.2.1",
"tslib": "^2.0.0",
diff --git a/src/app/components/project-map/new-template-dialog/new-template-dialog.component.html b/src/app/components/project-map/new-template-dialog/new-template-dialog.component.html
index c4794b79..dd72bc12 100644
--- a/src/app/components/project-map/new-template-dialog/new-template-dialog.component.html
+++ b/src/app/components/project-map/new-template-dialog/new-template-dialog.component.html
@@ -167,7 +167,7 @@
type="file"
class="non-visible"
#file2
- (change)="importImage($event)"
+ (change)="importImage($event, version.images.hda_disk_image)"
ng2FileSelect
[uploader]="uploaderImage"/>
@@ -188,7 +188,7 @@
type="file"
class="non-visible"
#file3
- (change)="importImage($event)"
+ (change)="importImage($event, version.images.hdb_disk_image)"
ng2FileSelect
[uploader]="uploaderImage"/>
@@ -235,7 +235,7 @@
type="file"
class="non-visible"
#file2
- (change)="importImage($event)"
+ (change)="importImage($event, image.filename)"
ng2FileSelect
[uploader]="uploaderImage"/>
@@ -271,7 +271,7 @@
type="file"
class="non-visible"
#file2
- (change)="importImage($event)"
+ (change)="importImage($, image.filename)"
ng2FileSelect
[uploader]="uploaderImage"/>
diff --git a/src/app/components/project-map/new-template-dialog/new-template-dialog.component.ts b/src/app/components/project-map/new-template-dialog/new-template-dialog.component.ts
index c56a8482..f352b0fb 100644
--- a/src/app/components/project-map/new-template-dialog/new-template-dialog.component.ts
+++ b/src/app/components/project-map/new-template-dialog/new-template-dialog.component.ts
@@ -30,6 +30,7 @@ import { ComputeService } from '../../../services/compute.service';
import { InformationDialogComponent } from '../../../components/dialogs/information-dialog.component';
import { ProgressService } from '../../../common/progress/progress.service';
import { TemplateNameDialogComponent } from './template-name-dialog/template-name-dialog.component';
+import * as SparkMD5 from 'spark-md5';
@Component({
selector: 'app-new-template-dialog',
@@ -334,7 +335,29 @@ export class NewTemplateDialogComponent implements OnInit {
dialogRef.componentInstance.appliance = object;
}
- importImage(event) {
+ importImage(event, imageName) {
+ this.computeChecksumMd5(event.target.files[0], false).then((output) => {
+ let imageToInstall = this.applianceToInstall.images.filter(n => n.filename === imageName)[0];
+
+ if (imageToInstall.md5sum !== output) {
+ const dialogRef = this.dialog.open(InformationDialogComponent, {
+ width: '400px',
+ height: '200px',
+ autoFocus: false,
+ disableClose: true
+ });
+ dialogRef.componentInstance.confirmationMessage = `This is not the correct file.
+ The MD5 sum is ${output} and should be ${imageToInstall.md5sum}. Do you want to accept it at your own risks?`;
+ dialogRef.afterClosed().subscribe((answer: boolean) => {
+ if (answer) this.importImageFile(event);
+ });
+ } else {
+ this.importImageFile(event);
+ }
+ });
+ }
+
+ importImageFile(event) {
let name = event.target.files[0].name.split('-')[0];
let fileName = event.target.files[0].name;
let file = event.target.files[0];
@@ -613,6 +636,36 @@ export class NewTemplateDialogComponent implements OnInit {
}
});
}
+
+ private computeChecksumMd5(file: File, encode = false): Promise {
+ return new Promise((resolve, reject) => {
+ const chunkSize = 2097152;
+ const spark = new SparkMD5.ArrayBuffer();
+ const fileReader = new FileReader();
+ let cursor = 0;
+
+ fileReader.onerror = function(): void {
+ reject('MD5 computation failed - error reading the file');
+ };
+
+ function processChunk(chunkStart: number): void {
+ const chunkEnd = Math.min(file.size, chunkStart + chunkSize);
+ fileReader.readAsArrayBuffer(file.slice(chunkStart, chunkEnd));
+ }
+
+ fileReader.onload = function(e: any): void {
+ spark.append(e.target.result);
+ cursor += chunkSize;
+ if (cursor < file.size) {
+ processChunk(cursor);
+ } else {
+ resolve(spark.end(encode));
+ }
+ };
+
+ processChunk(0);
+ });
+ }
}
function compareNames(a: string, b: string, isAsc: boolean) {
diff --git a/yarn.lock b/yarn.lock
index 1cbf751e..e3ce432f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -11148,6 +11148,11 @@ sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8:
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+spark-md5@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d"
+ integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==
+
spdx-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7"