Clean up UUID-handling to prepare for future

This commit is contained in:
Scott Nonnenberg 2020-12-09 14:26:37 -08:00 committed by GitHub
parent 5369950c1d
commit 3f58a9b762
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 55 additions and 31 deletions

View file

@ -65,6 +65,32 @@ function initialize({ events, storage, navigator, logger }) {
// Keeping this entrypoint around so more inialize() calls just kick the timing
scheduleNext = scheduleNextRotation;
async function saveCert({ certificate, key }) {
const arrayBuffer = window.Signal.Crypto.base64ToArrayBuffer(certificate);
const decodedContainer = textsecure.protobuf.SenderCertificate.decode(
arrayBuffer
);
const decodedCert = textsecure.protobuf.SenderCertificate.Certificate.decode(
decodedContainer.certificate
);
// We don't want to send a protobuf-generated object across IPC, so we make
// our own object.
const toSave = {
expires: decodedCert.expires.toNumber(),
serialized: arrayBuffer,
};
await storage.put(key, toSave);
}
async function removeOldKey() {
const oldCertKey = 'senderCertificateWithUuid';
const oldUuidCert = storage.get(oldCertKey);
if (oldUuidCert) {
await storage.remove(oldCertKey);
}
}
async function run() {
logger.info('refreshSenderCertificate: Getting new certificate...');
try {
@ -76,29 +102,23 @@ function initialize({ events, storage, navigator, logger }) {
password: PASSWORD,
});
const { certificate } = await server.getSenderCertificate();
const arrayBuffer = window.Signal.Crypto.base64ToArrayBuffer(certificate);
const decodedContainer = textsecure.protobuf.SenderCertificate.decode(
arrayBuffer
);
const decodedCert = textsecure.protobuf.SenderCertificate.Certificate.decode(
decodedContainer.certificate
);
const omitE164 = true;
const [
{ certificate },
{ certificate: certificateWithNoE164 },
] = await Promise.all([
server.getSenderCertificate(),
server.getSenderCertificate(omitE164),
]);
// We don't want to send a protobuf-generated object across IPC, so we make
// our own object.
const toSave = {
expires: decodedCert.expires.toNumber(),
serialized: arrayBuffer,
};
storage.put('senderCertificate', toSave);
const oldCertKey = 'senderCertificateWithUuid';
const oldUuidCert = storage.get(oldCertKey);
if (oldUuidCert) {
await storage.remove(oldCertKey);
}
await Promise.all([
saveCert({ certificate, key: 'senderCertificate' }),
saveCert({
certificate: certificateWithNoE164,
key: 'senderCertificateNoE164',
}),
removeOldKey(),
]);
scheduledTime = null;
scheduleNextRotation();

View file

@ -1810,11 +1810,12 @@ type WhatIsThis = import('./window.d').WhatIsThis;
!c.isEverUnregistered()
)
)
.map(c => c.get('e164'));
.map(c => c.get('e164'))
.filter(Boolean) as Array<string>;
if (lonelyE164s.length > 0) {
const lookup = await window.textsecure.messaging.getUuidsForE164s(
lonelyE164s as WhatIsThis
lonelyE164s
);
const e164s = Object.keys(lookup);
e164s.forEach(e164 => {

View file

@ -2428,7 +2428,6 @@ export class ConversationModel extends window.Backbone.Model<
: '';
return {
author: contact.get('e164'),
authorUuid: contact.get('uuid'),
bodyRanges: quotedMessage.get('bodyRanges'),
id: quotedMessage.get('sent_at'),
@ -2594,7 +2593,6 @@ export class ConversationModel extends window.Backbone.Model<
async sendReactionMessage(
reaction: { emoji: string; remove: boolean },
target: {
targetAuthorE164: string;
targetAuthorUuid: string;
targetTimestamp: number;
}

View file

@ -628,6 +628,7 @@ async function removeAllSignedPreKeys() {
const ITEM_KEYS: { [key: string]: Array<string> | undefined } = {
identityKey: ['value.pubKey', 'value.privKey'],
senderCertificate: ['value.serialized'],
senderCertificateNoE164: ['value.serialized'],
signaling_key: ['value'],
profileKey: ['value'],
};

View file

@ -1083,13 +1083,18 @@ export function initialize({
);
}
async function getSenderCertificate() {
async function getSenderCertificate(omitE164?: boolean) {
const baseParameters = '?includeUuid=true';
const urlParameters = `${baseParameters}${
omitE164 ? '&includeE164=false' : ''
}`;
return _ajax({
call: 'deliveryCert',
httpType: 'GET',
responseType: 'json',
validateResponse: { certificate: 'string' },
urlParameters: '?includeUuid=true',
urlParameters,
});
}

View file

@ -15173,7 +15173,7 @@
"rule": "jQuery-wrap(",
"path": "ts/textsecure/WebAPI.js",
"line": " const byteBuffer = window.dcodeIO.ByteBuffer.wrap(quote, 'binary', window.dcodeIO.ByteBuffer.LITTLE_ENDIAN);",
"lineNumber": 1263,
"lineNumber": 1265,
"reasonCategory": "falseMatch",
"updated": "2020-09-08T23:07:22.682Z"
},
@ -15181,7 +15181,7 @@
"rule": "jQuery-wrap(",
"path": "ts/textsecure/WebAPI.ts",
"line": " const byteBuffer = window.dcodeIO.ByteBuffer.wrap(",
"lineNumber": 2172,
"lineNumber": 2177,
"reasonCategory": "falseMatch",
"updated": "2020-09-08T23:07:22.682Z"
}

View file

@ -2931,7 +2931,6 @@ Whisper.ConversationView = Whisper.View.extend({
try {
await this.model.sendReactionMessage(reaction, {
targetAuthorE164: messageModel.getSource(),
targetAuthorUuid: messageModel.getSourceUuid(),
targetTimestamp: messageModel.get('sent_at'),
});