diff --git a/keyserver/src/fetchers/upload-fetchers.js b/keyserver/src/fetchers/upload-fetchers.js --- a/keyserver/src/fetchers/upload-fetchers.js +++ b/keyserver/src/fetchers/upload-fetchers.js @@ -139,7 +139,7 @@ return { id, type: 'encrypted_photo', - holder: uri, + blobURI: uri, dimensions, thumbHash, encryptionKey: uploadExtra.encryptionKey, @@ -223,7 +223,7 @@ return { type: 'encrypted_photo', id: uploadID.toString(), - holder: uri, + blobURI: uri, encryptionKey, dimensions, thumbHash, @@ -254,11 +254,11 @@ return { type: 'encrypted_video', id: uploadID.toString(), - holder: uri, + blobURI: uri, encryptionKey, dimensions, thumbnailID, - thumbnailHolder: thumbnailURI, + thumbnailBlobURI: thumbnailURI, thumbnailEncryptionKey, thumbnailThumbHash, }; @@ -334,7 +334,7 @@ media.push({ type: 'encrypted_photo', id: primaryUploadID, - holder: primaryUploadURI, + blobURI: primaryUploadURI, encryptionKey, dimensions, thumbHash, @@ -367,11 +367,11 @@ const video = { type: 'encrypted_video', id: primaryUploadID, - holder: primaryUploadURI, + blobURI: primaryUploadURI, encryptionKey, dimensions, thumbnailID: thumbnailUploadID, - thumbnailHolder: thumbnailUploadURI, + thumbnailBlobURI: thumbnailUploadURI, thumbnailEncryptionKey: thumbnailUploadExtra.encryptionKey, thumbnailThumbHash, }; diff --git a/lib/media/media-utils.js b/lib/media/media-utils.js --- a/lib/media/media-utils.js +++ b/lib/media/media-utils.js @@ -2,6 +2,11 @@ import invariant from 'invariant'; +import { + FUTURE_CODE_VERSION, + hasMinCodeVersion, +} from '../shared/version-utils.js'; +import type { PlatformDetails } from '../types/device-types.js'; import type { EncryptedImage, EncryptedVideo, @@ -11,6 +16,7 @@ MultimediaMessageInfo, RawMultimediaMessageInfo, } from '../types/message-types.js'; +import type { RawMediaMessageInfo } from '../types/messages/media.js'; import { isBlobServiceURI, getBlobFetchableURL, @@ -56,6 +62,53 @@ ); } +/** Clients before FUTURE_CODE_VERSION understand only `holder` + * and `thumbnailHolder` fields, while newer clients understand `blobURI` + * and `thumbnailBlobURI`. This function formats the multimedia message + * to be understandable by clients based on their version + */ +function versionSpecificMediaMessageFormat( + rawMessageInfo: RawMediaMessageInfo, + platformDetails: ?PlatformDetails, +): RawMediaMessageInfo { + const isBlobURISupported = hasMinCodeVersion(platformDetails, { + native: FUTURE_CODE_VERSION, + }); + const media = rawMessageInfo.media.map(singleMedia => { + if (singleMedia.type === 'photo' || singleMedia.type === 'video') { + return singleMedia; + } + + if (singleMedia.type === 'encrypted_photo') { + const { blobURI, holder, ...photoMedia } = singleMedia; + const mediaURI = encryptedMediaBlobURI(singleMedia); + return isBlobURISupported + ? { ...photoMedia, blobURI: mediaURI } + : { ...photoMedia, holder: mediaURI }; + } + + // encrypted_video + const { + blobURI, + holder, + thumbnailBlobURI, + thumbnailHolder, + ...videoMedia + } = singleMedia; + const mediaURI = encryptedMediaBlobURI(singleMedia); + const thumbnailURI = encryptedVideoThumbnailBlobURI(singleMedia); + + return isBlobURISupported + ? { ...videoMedia, blobURI: mediaURI, thumbnailBlobURI: thumbnailURI } + : { ...videoMedia, holder: mediaURI, thumbnailHolder: thumbnailURI }; + }); + + return { + ...rawMessageInfo, + media, + }; +} + function fetchableMediaURI(uri: string): string { if (isBlobServiceURI(uri)) { const blobHash = blobHashFromBlobServiceURI(uri); @@ -107,6 +160,7 @@ multimediaMessagePreview, isLocalUploadID, isMediaBlobServiceHosted, + versionSpecificMediaMessageFormat, getNextLocalUploadID, fetchableMediaURI, encryptedMediaBlobURI, diff --git a/lib/shared/messages/multimedia-message-spec.js b/lib/shared/messages/multimedia-message-spec.js --- a/lib/shared/messages/multimedia-message-spec.js +++ b/lib/shared/messages/multimedia-message-spec.js @@ -10,6 +10,7 @@ } from './message-spec.js'; import { joinResult } from './utils.js'; import { + versionSpecificMediaMessageFormat, isMediaBlobServiceHosted, contentStringForMediaArray, multimediaMessagePreview, @@ -214,10 +215,15 @@ return rawMessageInfo; } - const containsBlobServiceMedia = rawMessageInfo.media.some( + const messageInfo = versionSpecificMediaMessageFormat( + rawMessageInfo, + platformDetails, + ); + + const containsBlobServiceMedia = messageInfo.media.some( isMediaBlobServiceHosted, ); - const containsEncryptedMedia = rawMessageInfo.media.some( + const containsEncryptedMedia = messageInfo.media.some( media => media.type === 'encrypted_photo' || media.type === 'encrypted_video', ); @@ -226,28 +232,28 @@ !containsEncryptedMedia && hasMinCodeVersion(platformDetails, { native: 158 }) ) { - return rawMessageInfo; + return messageInfo; } if ( !containsBlobServiceMedia && hasMinCodeVersion(platformDetails, { native: 205 }) ) { - return rawMessageInfo; + return messageInfo; } if (hasMinCodeVersion(platformDetails, { native: FUTURE_CODE_VERSION })) { - return rawMessageInfo; + return messageInfo; } - const { id } = rawMessageInfo; + const { id } = messageInfo; invariant(id !== null && id !== undefined, 'id should be set on server'); return { type: messageTypes.UNSUPPORTED, id, - threadID: rawMessageInfo.threadID, - creatorID: rawMessageInfo.creatorID, - time: rawMessageInfo.time, - robotext: multimediaMessagePreview(rawMessageInfo), - unsupportedMessageInfo: rawMessageInfo, + threadID: messageInfo.threadID, + creatorID: messageInfo.creatorID, + time: messageInfo.time, + robotext: multimediaMessagePreview(messageInfo), + unsupportedMessageInfo: messageInfo, }; },