diff --git a/Gopkg.toml b/Gopkg.toml index 349b503370d11addf17bca0a46703d4e5aa98825..6f91ea14aafc20ad5c61798af9f5b81bb3ec204a 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -25,7 +25,7 @@ # unused-packages = true [[constraint]] - branch = "master" + branch = "19-get-access-token-for-specific-resource-and-passport" name = "code.vereign.com/code/restful-api" [prune] diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index 8a67381fb7b4cbce471db29d48b063a62bae6c85..b8ca39f3c408d09753cb95862e499f86e9101139 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -1623,7 +1623,7 @@ const connection = Penpal.connectToParent({ return response.data; }, - wopiCreateDocument: async (passportUUID, path, contentType, title) => { + wopiCreateDocument: async (passportUUID, path, title) => { const authenticationPublicKey = localStorage.getItem( "authenticatedIdentity" ); @@ -1639,23 +1639,56 @@ const connection = Penpal.connectToParent({ headers: { path, passportuuid: passportUUID, - contentType, title } }; - const executeResult = await executeRestfulFunction( + const createDocumentResult = await executeRestfulFunction( "private", window.viamApi, window.viamApi.documentCreateDocument, config ); - if (executeResult.code !== "200") return executeResult; - const resourceID = executeResult.data; - const passports = await wopiAPI.getPassports(resourceID, contentType); - return passports; + + if (createDocumentResult.code !== "200") { + return createDocumentResult; + } + + const resourceID = createDocumentResult.data; + + const accessTokenResponse = await wopiAPI.getAccessToken(passportUUID, resourceID); + + if (accessTokenResponse.data.code !== "200") { + return accessTokenResponse.data; + } + + const accessToken = accessTokenResponse.data.data; + + const result = { + resourceID, + accessToken + }; + + return encodeResponse("200", result, "ok"); + }, + + wopiGetAccessToken: async (passportUUID, resourceID, contentType) => { + const authenticationPublicKey = localStorage.getItem( + "authenticatedIdentity" + ); + + if ( + !authenticationPublicKey || + !window.loadedIdentities[authenticationPublicKey] || + !extendPinCodeTtl(authenticationPublicKey) + ) { + return encodeResponse("400", "", "Identity not authenticated"); + } + + const response = await wopiAPI.getAccessToken(passportUUID, resourceID, contentType); + return response.data; }, - wopiPutFile: async (path, accessToken, file) => { + wopiPutFile: async (resourceID, accessToken, file) => { const authenticationPublicKey = localStorage.getItem( "authenticatedIdentity" ); @@ -1668,7 +1701,7 @@ const connection = Penpal.connectToParent({ return encodeResponse("400", "", "Identity not authenticated"); } - const response = await wopiAPI.putDocument(path, accessToken, file); + const response = await wopiAPI.putDocument(resourceID, accessToken, file); return response.data; } } diff --git a/javascript/src/iframe/wopiapi-iframe.js b/javascript/src/iframe/wopiapi-iframe.js index 9de61de7ce47792039a5944cd2e76ae4c68aa7f1..1cde86a87053d5fa061c45179ea632014bc893e6 100644 --- a/javascript/src/iframe/wopiapi-iframe.js +++ b/javascript/src/iframe/wopiapi-iframe.js @@ -47,6 +47,38 @@ WopiAPI.prototype.getPassports = function(fileID) { return axios(requestConfig); }; +// contentType is optional. +// When not specified, function returns token, which can write multiple files and only read the last one. +// When specified, function returns read-write token for the specified contentType. +WopiAPI.prototype.getAccessToken = function(passportUUID, resourceID, contentType = "") { + const { + publicKey, + uuid, + token, + deviceHash + } = window.viamApi.getConfig().headers; + + if (!contentType) { + contentType = ""; + } + + const requestConfig = { + url: `${window.WOPI_URL}getAccessToken`, + method: "POST", + headers: { + publicKey, + uuid, + token, + deviceHash, + passportUUID: encodeURI(passportUUID), + resourceID: encodeURI(resourceID), + contentType: encodeURI(contentType) + } + }; + + return axios(requestConfig); +} + WopiAPI.prototype.putDocument = function(resourceID, accessToken, file) { const { publicKey,