Skip to content

Commit 25852a8

Browse files
authored
feat: Send images with flag "eternal" if team content (WEBAPP-4840) (#2842)
1 parent 38edc41 commit 25852a8

File tree

2 files changed

+65
-46
lines changed

2 files changed

+65
-46
lines changed

app/script/assets/AssetService.js

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ z.assets.AssetService = class AssetService {
4242
return Promise.all([this._compressProfileImage(image), this._compressImage(image)])
4343
.then(([{compressedBytes: smallImageBytes}, {compressedBytes: mediumImageBytes}]) => {
4444
return Promise.all([
45-
this.postAsset(smallImageBytes, {public: true}),
46-
this.postAsset(mediumImageBytes, {public: true}),
45+
this.postAsset(smallImageBytes, {public: true, retention: z.assets.AssetRetentionPolicy.ETERNAL}),
46+
this.postAsset(mediumImageBytes, {public: true, retention: z.assets.AssetRetentionPolicy.ETERNAL}),
4747
]);
4848
})
4949
.then(([smallCredentials, mediumCredentials]) => [smallCredentials.key, mediumCredentials.key]);
@@ -173,36 +173,43 @@ z.assets.AssetService = class AssetService {
173173
});
174174
}
175175

176+
getAssetRetention(userEntity, conversationEntity) {
177+
const isTeamMember = userEntity.is_team_member();
178+
const isTeamConversation = conversationEntity.inTeam();
179+
const isEternal = isTeamMember || isTeamConversation;
180+
return isEternal ? z.assets.AssetRetentionPolicy.ETERNAL : z.assets.AssetRetentionPolicy.PERSISTENT;
181+
}
182+
176183
/**
177184
* Post assets.
178185
*
179186
* @param {Uint8Array} assetData - Asset data
180-
* @param {Object} metadata - Asset metadata
181-
* @param {boolean} [metadata.public] - Flag whether asset is public
182-
* @param {z.assets.AssetRetentionPolicy} [metadata.retention] - Retention duration policy for asset
187+
* @param {Object} options - Asset metadata
188+
* @param {boolean} options.public - Flag whether asset is public
189+
* @param {z.assets.AssetRetentionPolicy} options.retention - Retention duration policy for asset
183190
* @param {Function} [xhrAccessorFunction] - Function will get a reference to the underlying XMLHTTPRequest
184191
* @returns {Promise} Resolves when asset has been uploaded
185192
*/
186-
postAsset(assetData, metadata, xhrAccessorFunction) {
193+
postAsset(assetData, options, xhrAccessorFunction) {
187194
return new Promise((resolve, reject) => {
188195
const BOUNDARY = 'frontier';
189196

190-
metadata = Object.assign(
197+
options = Object.assign(
191198
{
192199
public: false,
193200
retention: z.assets.AssetRetentionPolicy.PERSISTENT,
194201
},
195-
metadata
202+
options
196203
);
197204

198-
metadata = JSON.stringify(metadata);
205+
options = JSON.stringify(options);
199206

200207
let body = '';
201208
body += `--${BOUNDARY}\r\n`;
202209
body += 'Content-Type: application/json; charset=utf-8\r\n';
203-
body += `Content-length: ${metadata.length}\r\n`;
210+
body += `Content-length: ${options.length}\r\n`;
204211
body += '\r\n';
205-
body += `${metadata}\r\n`;
212+
body += `${options}\r\n`;
206213
body += `--${BOUNDARY}\r\n`;
207214
body += 'Content-Type: application/octet-stream\r\n';
208215
body += `Content-length: ${assetData.length}\r\n`;

app/script/conversation/ConversationRepository.js

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,47 +1497,50 @@ z.conversation.ConversationRepository = class ConversationRepository {
14971497
// Send encrypted events
14981498
//##############################################################################
14991499

1500-
send_asset_remotedata(conversation_et, file, message_id) {
1501-
let generic_message;
1500+
send_asset_remotedata(conversationEntity, file, messageId) {
1501+
let genericMessage;
15021502

1503-
return this.get_message_in_conversation_by_id(conversation_et, message_id)
1504-
.then(message_et => {
1505-
const asset_et = message_et.get_first_asset();
1503+
return this.get_message_in_conversation_by_id(conversationEntity, messageId)
1504+
.then(messageEntity => {
1505+
const assetEntity = messageEntity.get_first_asset();
1506+
const options = {
1507+
retention: this.asset_service.getAssetRetention(this.selfUser(), conversationEntity),
1508+
};
15061509

1507-
asset_et.uploaded_on_this_client(true);
1508-
return this.asset_service.uploadAsset(file, null, xhr => {
1509-
xhr.upload.onprogress = event => asset_et.upload_progress(Math.round(event.loaded / event.total * 100));
1510-
asset_et.upload_cancel = () => xhr.abort();
1510+
assetEntity.uploaded_on_this_client(true);
1511+
return this.asset_service.uploadAsset(file, options, xhr => {
1512+
xhr.upload.onprogress = event => assetEntity.upload_progress(Math.round(event.loaded / event.total * 100));
1513+
assetEntity.upload_cancel = () => xhr.abort();
15111514
});
15121515
})
15131516
.then(asset => {
1514-
generic_message = new z.proto.GenericMessage(message_id);
1515-
generic_message.set(z.cryptography.GENERIC_MESSAGE_TYPE.ASSET, asset);
1517+
genericMessage = new z.proto.GenericMessage(messageId);
1518+
genericMessage.set(z.cryptography.GENERIC_MESSAGE_TYPE.ASSET, asset);
15161519

1517-
if (conversation_et.ephemeral_timer()) {
1518-
generic_message = this._wrap_in_ephemeral_message(generic_message, conversation_et.ephemeral_timer());
1520+
if (conversationEntity.ephemeral_timer()) {
1521+
genericMessage = this._wrap_in_ephemeral_message(genericMessage, conversationEntity.ephemeral_timer());
15191522
}
15201523

1521-
return this.send_generic_message_to_conversation(conversation_et.id, generic_message);
1524+
return this.send_generic_message_to_conversation(conversationEntity.id, genericMessage);
15221525
})
15231526
.then(payload => {
1524-
const {uploaded: asset_data} = conversation_et.ephemeral_timer()
1525-
? generic_message.ephemeral.asset
1526-
: generic_message.asset;
1527+
const {uploaded: assetData} = conversationEntity.ephemeral_timer()
1528+
? genericMessage.ephemeral.asset
1529+
: genericMessage.asset;
15271530

15281531
const data = {
1529-
key: asset_data.asset_id,
1530-
otr_key: asset_data.otr_key,
1531-
sha256: asset_data.sha256,
1532-
token: asset_data.asset_token,
1532+
key: assetData.asset_id,
1533+
otr_key: assetData.otr_key,
1534+
sha256: assetData.sha256,
1535+
token: assetData.asset_token,
15331536
};
15341537

1535-
const asset_add_event = z.conversation.EventBuilder.buildAssetAdd(conversation_et, data, this.timeOffset);
1538+
const assetAddEvent = z.conversation.EventBuilder.buildAssetAdd(conversationEntity, data, this.timeOffset);
15361539

1537-
asset_add_event.id = message_id;
1538-
asset_add_event.time = payload.time;
1540+
assetAddEvent.id = messageId;
1541+
assetAddEvent.time = payload.time;
15391542

1540-
return this._on_asset_upload_complete(conversation_et, asset_add_event);
1543+
return this._on_asset_upload_complete(conversationEntity, assetAddEvent);
15411544
});
15421545
}
15431546

@@ -1609,7 +1612,11 @@ z.conversation.ConversationRepository = class ConversationRepository {
16091612
throw Error('No image available');
16101613
}
16111614

1612-
return this.asset_service.uploadAsset(imageBlob).then(uploadedImageAsset => {
1615+
const options = {
1616+
retention: this.asset_service.getAssetRetention(this.selfUser(), conversationEntity),
1617+
};
1618+
1619+
return this.asset_service.uploadAsset(imageBlob, options).then(uploadedImageAsset => {
16131620
const asset = new z.proto.Asset();
16141621
const assetPreview = new z.proto.Asset.Preview(imageBlob.type, imageBlob.size, uploadedImageAsset.uploaded);
16151622
asset.set('preview', assetPreview);
@@ -1727,25 +1734,30 @@ z.conversation.ConversationRepository = class ConversationRepository {
17271734
/**
17281735
* Sends image asset in specified conversation using v3 api.
17291736
*
1730-
* @param {Conversation} conversation_et - Conversation to send image in
1737+
* @param {Conversation} conversationEntity - Conversation to send image in
17311738
* @param {File|Blob} image - Image
17321739
* @returns {Promise} Resolves when the image was sent
17331740
*/
1734-
send_image_asset(conversation_et, image) {
1741+
send_image_asset(conversationEntity, image) {
1742+
const options = {
1743+
retention: this.asset_service.getAssetRetention(this.selfUser(), conversationEntity),
1744+
};
1745+
17351746
return this.asset_service
1736-
.uploadImageAsset(image)
1747+
.uploadImageAsset(image, options)
17371748
.then(asset => {
1738-
let generic_message = new z.proto.GenericMessage(z.util.create_random_uuid());
1739-
generic_message.set(z.cryptography.GENERIC_MESSAGE_TYPE.ASSET, asset);
1749+
let genericMessage = new z.proto.GenericMessage(z.util.create_random_uuid());
1750+
genericMessage.set(z.cryptography.GENERIC_MESSAGE_TYPE.ASSET, asset);
17401751

1741-
if (conversation_et.ephemeral_timer()) {
1742-
generic_message = this._wrap_in_ephemeral_message(generic_message, conversation_et.ephemeral_timer());
1752+
if (conversationEntity.ephemeral_timer()) {
1753+
genericMessage = this._wrap_in_ephemeral_message(genericMessage, conversationEntity.ephemeral_timer());
17431754
}
17441755

1745-
return this._send_and_inject_generic_message(conversation_et, generic_message);
1756+
return this._send_and_inject_generic_message(conversationEntity, genericMessage);
17461757
})
17471758
.catch(error => {
1748-
this.logger.error(`Failed to upload otr asset for conversation ${conversation_et.id}: ${error.message}`, error);
1759+
const message = `Failed to upload otr asset for conversation ${conversationEntity.id}: ${error.message}`;
1760+
this.logger.error(message, error);
17491761
throw error;
17501762
});
17511763
}

0 commit comments

Comments
 (0)