From 7286f43ee6970309f567d23638bab6b868ed8c26 Mon Sep 17 00:00:00 2001 From: vidmarian Date: Thu, 23 Dec 2021 10:26:02 +0200 Subject: [PATCH] SVYX-344 Certificate error with corporate certificate when downloading/writing a file in NG Desktop --- ngdesktopfile/ngdesktopfile/ngdesktopfile.js | 32 +++++++++-------- .../src/lib/ngdesktopfile.service.ts | 34 +++++++++---------- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/ngdesktopfile/ngdesktopfile/ngdesktopfile.js b/ngdesktopfile/ngdesktopfile/ngdesktopfile.js index 670f68a..4e90118 100644 --- a/ngdesktopfile/ngdesktopfile/ngdesktopfile.js +++ b/ngdesktopfile/ngdesktopfile/ngdesktopfile.js @@ -79,6 +79,13 @@ angular.module('ngdesktopfile',['servoy']) } else func(); } + function invokeCallback(callback, callbackAlreadyCalled, message) { + if (callback && callbackAlreadyCalled === false) { + $window.executeInlineScript(callback.formname, callback.script, [message]); + return true + } + return callbackAlreadyCalled; + } return { waitForDefered: function(func) { waitForDefered(func); @@ -217,7 +224,7 @@ angular.module('ngdesktopfile',['servoy']) var firstWrite = true; var fileSize = 0; var writeSize = 0; - var errorReceived = false; + var callbackAlreadyCalled = false; //first callback call will set this flag to true const request = net.request( { url: getFullUrl(url), @@ -233,9 +240,8 @@ angular.module('ngdesktopfile',['servoy']) firstWrite = false; fs.writeFile(realPath, chunk, function(err) { if (err) { - if (callback) - $window.executeInlineScript(callback.formname, callback.script, ['error']); - defer.resolve(false); //global defer + callbackAlreadyCalled = invokeCallback(callback, callbackAlreadyCalled, 'error'); + defer.resolve(false); defer = null; throw err; } @@ -243,9 +249,8 @@ angular.module('ngdesktopfile',['servoy']) } else { fs.appendFile(realPath, chunk, function(err) { if (err) { - if (callback) - $window.executeInlineScript(callback.formname, callback.script, ['error']); - defer.resolve(false); //global defer + callbackAlreadyCalled = invokeCallback(callback, callbackAlreadyCalled, 'error'); + defer.resolve(false); defer = null; throw err; } @@ -254,6 +259,7 @@ angular.module('ngdesktopfile',['servoy']) writeSize = writeSize + chunk.length; if (writeSize === fileSize) { + callbackAlreadyCalled = invokeCallback(callback, callbackAlreadyCalled, 'close'); defer.resolve(true); defer = null; } @@ -261,11 +267,9 @@ angular.module('ngdesktopfile',['servoy']) }); request.on('error', (err) => {//called only for network error - if (callback) { - $window.executeInlineScript(callback.formname, callback.script, ['error']); - } + callbackAlreadyCalled = invokeCallback(callback, callbackAlreadyCalled, 'error'); if (defer != null) { - defer.resolve(false); //global defer + defer.resolve(false); defer = null; } if (err) { @@ -274,10 +278,8 @@ angular.module('ngdesktopfile',['servoy']) } }); - request.on('close', () => {//close may be emitted due to a previous error event. In this case the callback was already called; - if ((callback) && (errorReceived === false)) { - $window.executeInlineScript(callback.formname, callback.script, ['close']); - } + request.on('close', () => { + callbackAlreadyCalled = invokeCallback(callback, callbackAlreadyCalled, 'close'); }); request.setHeader('Content-Type', 'application/json'); diff --git a/ngdesktopfile/projects/ngdesktopfile/src/lib/ngdesktopfile.service.ts b/ngdesktopfile/projects/ngdesktopfile/src/lib/ngdesktopfile.service.ts index c952c57..dae6b4b 100644 --- a/ngdesktopfile/projects/ngdesktopfile/src/lib/ngdesktopfile.service.ts +++ b/ngdesktopfile/projects/ngdesktopfile/src/lib/ngdesktopfile.service.ts @@ -757,8 +757,8 @@ export class NGDesktopFileService { let firstWrite = true; let fileSize = 0; let writeSize = 0; - let errorReceived = false; - + let callbackAlreadyCalled = false; + const request = this.net.request({ url: this.getFullUrl(url), session: this.remote.getCurrentWebContents().session, @@ -773,10 +773,8 @@ export class NGDesktopFileService { this.fs.writeFile(realPath, chunk, (error) => { if (error) { - if (callback) { - this.servoyService.executeInlineScript(callback.formname, callback.script, ['error']); - } - this.defer.resolve(false); //global defer + callbackAlreadyCalled = this.invokeCallback(callback, callbackAlreadyCalled, 'error'); + this.defer.resolve(false); this.defer = null; throw error; } @@ -784,10 +782,8 @@ export class NGDesktopFileService { } else { this.fs.appendFile(realPath, chunk, (error) => { if (error) { - if (callback) { - this.servoyService.executeInlineScript(callback.formname, callback.script, ['error']); - } - this.defer.resolve(false); //global defer + callbackAlreadyCalled = this.invokeCallback(callback, callbackAlreadyCalled, 'error'); + this.defer.resolve(false); this.defer = null; throw error; } @@ -796,6 +792,7 @@ export class NGDesktopFileService { writeSize = writeSize + chunk.length; if (writeSize === fileSize) { + callbackAlreadyCalled = this.invokeCallback(callback, callbackAlreadyCalled, 'close'); this.defer.resolve(true); this.defer = null; } @@ -804,23 +801,18 @@ export class NGDesktopFileService { request.on('error', (error) => { if (error) { - if (callback) { - this.servoyService.executeInlineScript(callback.formname, callback.script, ['error']); - } + callbackAlreadyCalled = this.invokeCallback(callback, callbackAlreadyCalled, 'error'); if (this.defer != null) { this.defer.resolve(false); //global defer this.defer = null; } if (error) { - errorReceived = true; throw error; } } }); request.on('close', () => {//close may be emitted due to a previous error event. In this case the callback was already called; - if ((callback) && (errorReceived === false)) { - this.servoyService.executeInlineScript(callback.formname, callback.script, ['close']); - } + callbackAlreadyCalled = this.invokeCallback(callback, callbackAlreadyCalled, 'close'); }); request.setHeader('Content-Type', 'application/json'); @@ -910,5 +902,13 @@ export class NGDesktopFileService { } } + private invokeCallback(callback: { formname: string; script: string }, callbackAlreadyCalled: boolean, message: string) { + if (callback && callbackAlreadyCalled === false) { + this.servoyService.executeInlineScript(callback.formname, callback.script, [message]); + return true; + } + return callbackAlreadyCalled; + } + }