Clean story reply screenshot data

This commit is contained in:
trevor-signal 2023-08-21 15:36:58 -04:00 committed by GitHub
parent e5a9bf0f7c
commit bddf1f432d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 155 additions and 1 deletions

View file

@ -393,7 +393,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
strictAssert(isAciString(authorAci), 'Story message from pni');
this.set({
storyReplyContext: {
attachment,
attachment: omit(attachment, 'screenshotData'),
authorAci,
messageId: message.id,
},

View file

@ -0,0 +1,45 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/better-sqlite3';
import type { LoggerType } from '../../types/Logging';
import { sql } from '../util';
export default function updateToSchemaVersion90(
currentVersion: number,
db: Database,
logger: LoggerType
): void {
if (currentVersion >= 90) {
return;
}
let numChanges = 0;
db.transaction(() => {
const [updateQuery, updateParams] = sql`
UPDATE messages
SET json = json_remove(json, '$.storyReplyContext.attachment.screenshotData')
WHERE isStory = 0
/* we want to find all messages with a non-null storyId, but using string
comparison (instead of a non-null check) here causes Sqlite to use the
storyId index */
AND storyId > '0'
AND json->'storyReplyContext.attachment.screenshotData' IS NOT NULL;
`;
const info = db.prepare(updateQuery).run(updateParams);
numChanges = info.changes;
db.pragma('user_version = 90');
})();
logger.info(
`updateToSchemaVersion90: removed screenshotData from ${numChanges} ` +
`message${numChanges > 1 ? 's' : ''}`
);
logger.info('updateToSchemaVersion90: success!');
}

View file

@ -64,6 +64,7 @@ import updateToSchemaVersion85 from './85-add-kyber-keys';
import updateToSchemaVersion86 from './86-story-replies-index';
import updateToSchemaVersion88 from './88-service-ids';
import updateToSchemaVersion89 from './89-call-history';
import updateToSchemaVersion90 from './90-delete-story-reply-screenshot';
function updateToSchemaVersion1(
currentVersion: number,
@ -1999,6 +2000,7 @@ export const SCHEMA_VERSIONS = [
(_v: number, _i: Database, _l: LoggerType): void => undefined, // version 87 was dropped
updateToSchemaVersion88,
updateToSchemaVersion89,
updateToSchemaVersion90,
];
export function updateSchema(db: Database, logger: LoggerType): void {

View file

@ -0,0 +1,107 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Database } from '@signalapp/better-sqlite3';
import SQL from '@signalapp/better-sqlite3';
import { assert } from 'chai';
import { updateToVersion, insertData, getTableData } from './helpers';
describe('SQL/updateToSchemaVersion90', () => {
let db: Database;
beforeEach(() => {
db = new SQL(':memory:');
});
afterEach(() => {
db.close();
});
it('should delete screenshot.data but leave remainder', () => {
updateToVersion(db, 89);
insertData(db, 'messages', [
{
id: 'message_with_screenshot_data',
json: {
id: 'message_with_screenshot_data',
storyReplyContext: {
attachment: {
contentType: 'video/mp4',
filename: 'filename',
path: 'path',
screenshot: {
contentType: 'image/png',
path: 'screenshotPath',
width: 1920,
height: 1080,
},
screenshotData: {
'4389410': 144,
'4389411': 255,
'4389412': 75,
'4389413': 168,
'4389414': 81,
'4389415': 142,
'4389416': 120,
'4389417': 150,
'4389418': 14,
},
size: 100,
},
messageId: 'story_id',
},
},
storyId: 'story_id',
},
]);
updateToVersion(db, 90);
assert.deepStrictEqual(
getTableData(db, 'messages').map(msg => msg.json),
[
{
id: 'message_with_screenshot_data',
storyReplyContext: {
attachment: {
contentType: 'video/mp4',
filename: 'filename',
path: 'path',
screenshot: {
contentType: 'image/png',
path: 'screenshotPath',
width: 1920,
height: 1080,
},
size: 100,
},
messageId: 'story_id',
},
},
]
);
});
it('should use storyId index', () => {
updateToVersion(db, 90);
const details = db
.prepare(
`
EXPLAIN QUERY PLAN
UPDATE messages
SET json = json_remove(json, '$.storyReplyContext.attachment.screenshotData')
WHERE isStory = 0
AND storyId > '0'
AND json->'storyReplyContext.attachment.screenshotData' IS NOT NULL;
`
)
.all()
.map(({ detail }) => detail)
.join('\n');
assert.include(details, 'USING INDEX messages_by_storyId');
assert.notInclude(details, 'SCAN');
});
});