diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index 7e363315bc4206db21018877603467aae71b98d6..fe4096c6b610577d5fe47a880b1443b629493cb2 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -246,43 +246,34 @@ const handleIdentityLogin = (identity, uuid, token) => { setKeyForUUID(uuid, publicKey); }; -function executeRestfulFunction(type, that, fn, config, ...args) { +async function executeRestfulFunction(type, that, fn, config, ...args) { const { currentlyAuthenticatedIdentity, viamApi, currentlyLoadedIdentity } = window; + const response = await fn.apply(that, [config, ...args]); - return new Penpal.Promise(executeResult => { - fn.apply(that, [config, ...args]).then(async (response) => { - const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity; + const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity; + const { code, status } = response.data; - const { code, status } = response.data; + const deviceRevoked = type === "private" && code === "401" && status === STATUS_DEVICE_REVOKED; + if (deviceRevoked) { + destroyIdentity(); - // Destroy local storage in case device was revoked - if (type === "private" && code === "401" && status === STATUS_DEVICE_REVOKED) { - destroyIdentity(); + const event = createEvent("", "DeviceRevoked"); + iframeParent.onEvent(event); - const event = createEvent("", "DeviceRevoked"); - iframeParent.onEvent(event); + return response.data; + } - return executeResult(response.data); - } + const badSession = type === "private" && identity && code === "400" && status === "Bad session"; + if (!badSession) return response.data; - if (type === "private" && identity && code === "400" && status === "Bad session") { - viamApi.identityLogin(null, "previousaddeddevice") - .then((response) => { - if (response.data.code === "200") { - const uuid = response.data.data["Uuid"]; - const token = response.data.data["Session"]; - handleIdentityLogin(identity, uuid, token); - fn.apply(that, [config, ...args]).then(({data}) => executeResult(data)); - } else { - executeResult(response.data); - } - }) - .catch(console.warn); - } else { - executeResult(response.data); - } - }); - }); + const loginResponse = await viamApi.identityLogin("previousaddeddevice"); + if (loginResponse.data.code !== "200") return loginResponse.data; + + const uuid = loginResponse.data.data["Uuid"]; + const token = loginResponse.data.data["Session"]; + handleIdentityLogin(identity, uuid, token); + const { data } = await fn.apply(that, [config, ...args]); + return data; } window.executeRestfulFunction = executeRestfulFunction; @@ -1215,17 +1206,17 @@ connection.promise.then(parent => { } } - var anynomousDeviceKeyEventsProcessing = false; - var maxDeviceKeyAnonymousEventTime = 0; + let anynomousDeviceKeyEventsProcessing = false; + let maxDeviceKeyAnonymousEventTime = 0; - var eventsDeviceEventsProcessing = false; - var maxDeviceKeyEventTime = 0; + let eventsDeviceEventsProcessing = false; + let maxDeviceKeyEventTime = 0; - var eventsEntityEventsProcessing = false; - var maxEntityEventTime = 0; + let eventsEntityEventsProcessing = false; + let maxEntityEventTime = 0; - var identityLoadedEvent = false; - var identityAuthenticatedEvent = false; + let identityLoadedEvent = false; + let identityAuthenticatedEvent = false; setInterval(async function () { if (window.currentlyAuthenticatedIdentity) { @@ -1264,7 +1255,7 @@ connection.promise.then(parent => { if (!pinCode) { if (!identityLoadedEvent) { const result = await loadIdentityInternal(window.currentlyLoadedIdentity.authentication.publicKey, "00000000"); - if (result.code !== "200") { + if (window.currentlyLoadedIdentity && result.code !== "200") { const event = createEvent("CanNotLoadPincodeForLoadedIdentity", "IdentityNotLoaded", [window.currentlyLoadedIdentity.authentication.publicKey]); parent.onEvent(event); identityLoadedEvent = true; @@ -1284,15 +1275,16 @@ connection.promise.then(parent => { } }, 50); - setInterval(function() { + setInterval(async () => { if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) { anynomousDeviceKeyEventsProcessing = true; - executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey").then(async executeResult => { + try { + const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey"); if(executeResult.code === "200") { - var eventsLen = executeResult.data.length; + const eventsLen = executeResult.data.length; let changedMaxDeviceKeyAnonymousEventTime = false; - for (var i = 0; i < eventsLen; i++) { - var event = executeResult.data[i]; + for (let i = 0; i < eventsLen; i++) { + const event = executeResult.data[i]; switch (event.type) { case "Authenticated" : { const uuid = event.payloads[0]; @@ -1300,25 +1292,23 @@ connection.promise.then(parent => { handleIdentityLogin(window.currentlyLoadedIdentity, uuid, token); const identityToStore = window.currentlyAuthenticatedIdentity; event.payloads = [{fromQRCode: true}]; - setIdentityInLocalStorage(identityToStore).then(() => { - getProfileData(identityToStore).then(() => { - parent.onEvent(event); - }); - }); + await setIdentityInLocalStorage(identityToStore); + await getProfileData(identityToStore); + parent.onEvent(event); break; } case "QRCodeUpdated" : { - var actionID = event["actionID"]; - var QrCode = event["payloads"][1]; + const actionID = event["actionID"]; + const QrCode = event["payloads"][1]; - var eventCopy = JSON.parse(JSON.stringify(event)); + const eventCopy = JSON.parse(JSON.stringify(event)); QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { eventCopy["payloads"].push(url); - parent.onEvent(eventCopy) + parent.onEvent(eventCopy); }); - break + break; } case "KeyDeleted" : { @@ -1333,106 +1323,100 @@ connection.promise.then(parent => { window.lastTimeGetProfile = 0; destroyIdentityFromLocalStorage(authenticationPublicKey); - break + break; } default : { - parent.onEvent(event) + parent.onEvent(event); } } changedMaxDeviceKeyAnonymousEventTime = true; - maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp) + maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp); } if(changedMaxDeviceKeyAnonymousEventTime) { - executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession, - null, "devicekey", maxDeviceKeyAnonymousEventTime.toString()).then(() => { - anynomousDeviceKeyEventsProcessing = false; - }); - } else { - anynomousDeviceKeyEventsProcessing = false; + await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession, + null, "devicekey", maxDeviceKeyAnonymousEventTime.toString()); } - } else { - anynomousDeviceKeyEventsProcessing = false; } - }); + } catch (e) { + console.warn(e); + } + anynomousDeviceKeyEventsProcessing = false; } if (window.currentlyAuthenticatedIdentity != null && eventsDeviceEventsProcessing === false) { eventsDeviceEventsProcessing = true; - executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey").then(executeResult => { - if(executeResult.code === "200") { - var eventsLen = executeResult.data.length; + try { + const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey"); + if (executeResult.code === "200") { + const eventsLen = executeResult.data.length; const changedMaxDeviceKeyEventTime = false; - for(var i = 0; i < eventsLen; i++) { - var event = executeResult.data[i]; - if(event.type === "QRCodeUpdated") { - var actionID = event["actionID"]; - var QrCode = event["payloads"][1]; + for (let i = 0; i < eventsLen; i++) { + const event = executeResult.data[i]; + if (event.type === "QRCodeUpdated") { + const actionID = event["actionID"]; + const QrCode = event["payloads"][1]; - var eventCopy = JSON.parse(JSON.stringify(event)); + const eventCopy = JSON.parse(JSON.stringify(event)); QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { eventCopy["payloads"].push(url); - parent.onEvent(eventCopy) - }) + parent.onEvent(eventCopy); + }); } else { - parent.onEvent(event) + parent.onEvent(event); } - maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp) + maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp); } if(changedMaxDeviceKeyEventTime) { - executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey", - maxDeviceKeyEventTime.toString()).then(executeResult1 => { - eventsDeviceEventsProcessing = false - }) - } else { - eventsDeviceEventsProcessing = false + await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey", + maxDeviceKeyEventTime.toString()); } - } else { - eventsDeviceEventsProcessing = false } - }); + } catch (e) { + console.warn(e); + } + eventsDeviceEventsProcessing = false; } if (window.currentlyAuthenticatedIdentity != null && eventsEntityEventsProcessing === false) { eventsEntityEventsProcessing = true; - executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity").then(executeResult => { - if(executeResult.code === "200") { - var eventsLen = executeResult.data.length; + try { + const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity"); + + if (executeResult.code === "200") { + const eventsLen = executeResult.data.length; let changedMaxEntityEventTime = false; - for(var i = 0; i < eventsLen; i++) { - event = executeResult.data[i]; - if(event.type === "QRCodeUpdated") { - var actionID = event["actionID"]; - var QrCode = event["payloads"][1]; + for (let i = 0; i < eventsLen; i++) { + const event = executeResult.data[i]; + if (event.type === "QRCodeUpdated") { + const actionID = event["actionID"]; + const QrCode = event["payloads"][1]; - var eventCopy = JSON.parse(JSON.stringify(event)); + const eventCopy = JSON.parse(JSON.stringify(event)); QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { eventCopy["payloads"].push(url); - parent.onEvent(eventCopy) + parent.onEvent(eventCopy); }); - continue + continue; } parent.onEvent(event); changedMaxEntityEventTime = true; - maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp) + maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp); } if(changedMaxEntityEventTime) { - executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity", - maxEntityEventTime.toString()).then(executeResult1 => { - eventsEntityEventsProcessing = false - }) - } else { - eventsEntityEventsProcessing = false + await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity", + maxEntityEventTime.toString()); } - } else { - eventsEntityEventsProcessing = false } - }); + } catch (e) { + console.warn(e); + } + eventsEntityEventsProcessing = false; } }, 1000); }); diff --git a/javascript/src/iframe/wopiapi-iframe.js b/javascript/src/iframe/wopiapi-iframe.js index c009f9ed020171a5bafc2a4ff4b97c60aff11f9f..24283fc69c29dd844caf10569679733d18def100 100644 --- a/javascript/src/iframe/wopiapi-iframe.js +++ b/javascript/src/iframe/wopiapi-iframe.js @@ -12,7 +12,7 @@ WopiAPI.prototype.getPassports = function (fileID) { uuid, token, deviceHash, - fileID + fileID: encodeURI(fileID) } }; @@ -22,6 +22,7 @@ WopiAPI.prototype.getPassports = function (fileID) { WopiAPI.prototype.putDocument = function (path, accessToken, file) { const { publicKey, uuid, token, deviceHash } = window.viamApi.getConfig().headers; path = path[0] === "/" ? path : `/${path}`; + path = encodeURI(path); const requestConfig = { url: `${window.WOPI_URL}files${path}/contents`, method: 'POST',