Migrate sessions table to BLOB column

Co-authored-by: Scott Nonnenberg <scott@signal.org>
This commit is contained in:
Fedor Indutny 2024-10-02 17:23:00 -07:00 committed by GitHub
parent a4d8ba4899
commit 091580825a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 582 additions and 275 deletions

View file

@ -12,6 +12,185 @@ import { sessionRecordToProtobuf } from '../../util/sessionTranslation';
const getRecordCopy = (record: any): any => JSON.parse(JSON.stringify(record));
export const SESSION_V1_RECORD = {
sessions: {
'\u0005W‡¿“\u0000lÈ\nyª\u000eümB0\u0017j„.Û£³-s\u0016č(O_M': {
registrationId: 4243,
currentRatchet: {
rootKey:
'Ë\u00035/üœÚšg\u0003Xeûú\u0010—\u0000ü\u0002¶»o5\u001cƒ—­¥\u0004Ðÿ«',
lastRemoteEphemeralKey:
'\u0005\n7\u001cmT…b!è\u000eÍ\u0007\u0016m4g³\u0005‘üœIYŒê\b\u0011ÏÎPs',
previousCounter: 2,
ephemeralKeyPair: {
privKey: 'ä—ãÅ«ªŠàøí)ˆá\u0005Á"ŒsJM.¨¡\u0012r(N\f9Ô\b',
pubKey: '\u0005+\u00134–«1\u0000\u0013l *ãKçnºÖó³íTSŸ&Œ{ù ͂>1',
},
},
indexInfo: {
remoteIdentityKey: '\u0005¨¨©üÏäúo፩êO¢çúxr»Æ¿rœ²GžùiT@',
closed: -1,
baseKey: '\u0005W‡¿“\u0000lÈ\nyª\u000eümB0\u0017j„.Û£³-s\u0016č(O_M',
baseKeyType: 2,
},
oldRatchetList: [
{
added: 1605579954962,
ephemeralKey:
'\u00050»­\n¨ÊA‘ä\u0006¢Ç´d\u0002\u00129}%î}ΩTc}8€¼\u0011n\\',
},
{
added: 1605580408250,
ephemeralKey:
'\u0005^Ä\nò›À¢\u0000\u000f­A\\6+Ó\u001a÷&×$¸¬ÑÔ|<qSÖ\u001aÙh',
},
{
added: 1605581155167,
ephemeralKey: '\u0005<\u0017å)œQàFîl29Øƒ\u001c— Ý$·;„udß\u0005I|f\u0006',
},
{
added: 1605638524556,
ephemeralKey: '\u0005¯jõ±ã0wÛPÐÂSÏ´;·&\u0011Â%º¯°“ÝÙþêù8F',
},
{
added: 1606761719753,
ephemeralKey: '\u0005›Î(ð>‘x‚ƒÄÈ?þv~íkx â¬.ðo™òDg\u001eß.\r',
},
{
added: 1606766530935,
ephemeralKey:
'\u0005\u0014@ž½M†,à\bóó™…}¨`i¿\u0000©I\u0001ôG\u001f”:Ù{ó\u0005 ',
},
{
added: 1608326293655,
ephemeralKey: '\u0005µÒ\u0014?È¢+ÑR÷ç?3šƒ\\@0‹†\u0004®+-\bŽr\t',
},
{
added: 1609871105317,
ephemeralKey:
'\u0005„±@íN"Í\u0019HS{$ï\u0017”[Ñ\\\u001a*;>P\u0000\u001f\u000eHNaù)',
},
{
added: 1611707063523,
ephemeralKey: '\u0005Þg”Åkéƒ\u0001\u0013—¡ÿûNXÈ(9\u0006¤’w˜®/عRi‹JI',
},
{
added: 1612211156372,
ephemeralKey: '\u0005:[ÛOˆ–pd¯ ÂÙç\u0010Oއw{}ý\bw–9Àߝ=“\u0014Z',
},
],
'\u00050»­\n¨ÊA‘ä\u0006¢Ç´d\u0002\u00129}%î}ΩTc}8€¼\u0011n\\': {
messageKeys: {},
chainKey: {
counter: 0,
},
chainType: 2,
},
'\u0005^Ä\nò›À¢\u0000\u000f­A\\6+Ó\u001a÷&×$¸¬ÑÔ|<qSÖ\u001aÙh': {
messageKeys: {},
chainKey: {
counter: 2,
},
chainType: 2,
},
'\u0005<\u0017å)œQàFîl29Øƒ\u001c— Ý$·;„udß\u0005I|f\u0006': {
messageKeys: {},
chainKey: {
counter: 1,
},
chainType: 2,
},
'\u0005¯jõ±ã0wÛPÐÂSÏ´;·&\u0011Â%º¯°“ÝÙþêù8F': {
messageKeys: {
'0': 'A/{´{×f(èaøy\\D¾\u0000ÃHÀÁâô$ãŸ\u001d3’Äö°Ù',
'1': ‚ŒFT}dw8Æýª7»ÚÓ\u000f*'Ԛ»7Š£\u0018\u0012ñDá‚",
'2': 'Îï\u0013¨ÁÕÎk\u000eýèȈ÷,¼îû5%ÓUœ¤6_õ¢\u0019ä]',
},
chainKey: {
counter: 3,
},
chainType: 2,
},
'\u0005›Î(ð>‘x‚ƒÄÈ?þv~íkx â¬.ðo™òDg\u001eß.\r': {
messageKeys: {
'4': '©}j›¿Š¼\u0014q\tŠ¥”Á”ñ\u0003: ÷ÞrƒñûÔµ%Æ\u001a',
},
chainKey: {
counter: 6,
},
chainType: 2,
},
'\u0005\u0014@ž½M†,à\bóó™…}¨`i¿\u0000©I\u0001ôG\u001f”:Ù{ó\u0005 ': {
messageKeys: {},
chainKey: {
counter: 0,
},
chainType: 2,
},
'\u0005µÒ\u0014?È¢+ÑR÷ç?3šƒ\\@0‹†\u0004®+-\bŽr\t': {
messageKeys: {},
chainKey: {
counter: 2,
},
chainType: 2,
},
'\u0005„±@íN"Í\u0019HS{$ï\u0017”[Ñ\\\u001a*;>P\u0000\u001f\u000eHNaù)': {
messageKeys: {
'0': "1kÏ\u001cí+«<º‚\b'VÌ!×¼«PÃ[üáy;l'ƒ€€Ž",
'2': 'ö\u00047%L-…Wm)†›\u001d£ääíNô.Ô8…ÃÉ4r´ó^2',
'3': '¨¿¦›7T]\u001c\u001c“à4:x\u0019¿\u0002YÉÀ\u001bâjr¸»¤¢0,*',
'5': '™¥\u0006·q“gó4þ\u0011®ˆU4F\u001cl©\bŒäô…»ÊÇÆŽ[',
},
chainKey: {
counter: 5,
},
chainType: 2,
},
'\u0005Þg”Åkéƒ\u0001\u0013—¡ÿûNXÈ(9\u0006¤’w˜®/عRi‹JI': {
messageKeys: {
'0': "]'8ŽWÄ\u0007…n˜º­Ö{ÿ7]ôäÄ!é\u000btA@°b¢)\u001ar",
'2': '­ÄfGÇjÖxÅö:×RÔi)M\u0019©IE+¨`þKá—;£Û½',
'3': '¦Õhýø`€Ö“PéPs;\u001e\u000bE}¨¿–õ\u0003uªøå\u00062(×G',
'9': 'Ï^—<‘Õú̃\u0001i´;ït¼\u001aÑ?ï\u0014lãàÆ¸ƒ\u001a8“/m',
},
chainKey: {
counter: 11,
},
chainType: 2,
},
'\u0005:[ÛOˆ–pd¯ ÂÙç\u0010Oއw{}ý\bw–9Àߝ=“\u0014Z': {
messageKeys: {
'0': '!\u00115\\W~|¯oa2\u001e\u0004Vž8Ï¡d}\u001b\u001a8^QÖfvÕ"‹',
},
chainKey: {
counter: 1,
},
chainType: 2,
},
'\u0005\n7\u001cmT…b!è\u000eÍ\u0007\u0016m4g³\u0005‘üœIYŒê\b\u0011ÏÎPs': {
messageKeys: {
'0': 'Îgó¯‘2àvñ‘X_õ\u0014–Ç\u0000öl\u001f4J>ŒÐÏ{`-Ü5¦',
'4': 'c¿<µâ¼Xµƒ!Ù¯µ®[—n<žìîúcoå©n\u0013"l]Ð',
},
chainKey: {
counter: 5,
key: 'Z{òÙ8سAÝdSZ†k\n×\u001cô¡\u001b[YÒ¶ƒ\u0016a°\u0004<',
},
chainType: 2,
},
'\u0005+\u00134–«1\u0000\u0013l *ãKçnºÖó³íTSŸ&Œ{ù ͂>1': {
messageKeys: {},
chainKey: {
counter: -1,
key: "èB?7\u000f¯\u001e\u0010¨\u0007}:“?¹\u0010$\\ë~ª\u0000gM0՘'£\u0005",
},
chainType: 1,
},
},
},
version: 'v1',
} as any;
function protoToJSON(value: unknown): unknown {
if (value == null) {
return value;
@ -169,186 +348,7 @@ describe('sessionTranslation', () => {
});
it('Generates expected protobuf with many old receiver chains', () => {
const record: any = {
sessions: {
'\u0005W‡¿“\u0000lÈ\nyª\u000eümB0\u0017j„.Û£³-s\u0016č(O_M': {
registrationId: 4243,
currentRatchet: {
rootKey:
'Ë\u00035/üœÚšg\u0003Xeûú\u0010—\u0000ü\u0002¶»o5\u001cƒ—­¥\u0004Ðÿ«',
lastRemoteEphemeralKey:
'\u0005\n7\u001cmT…b!è\u000eÍ\u0007\u0016m4g³\u0005‘üœIYŒê\b\u0011ÏÎPs',
previousCounter: 2,
ephemeralKeyPair: {
privKey: 'ä—ãÅ«ªŠàøí)ˆá\u0005Á"ŒsJM.¨¡\u0012r(N\f9Ô\b',
pubKey: '\u0005+\u00134–«1\u0000\u0013l *ãKçnºÖó³íTSŸ&Œ{ù ͂>1',
},
},
indexInfo: {
remoteIdentityKey: '\u0005¨¨©üÏäúo፩êO¢çúxr»Æ¿rœ²GžùiT@',
closed: -1,
baseKey: '\u0005W‡¿“\u0000lÈ\nyª\u000eümB0\u0017j„.Û£³-s\u0016č(O_M',
baseKeyType: 2,
},
oldRatchetList: [
{
added: 1605579954962,
ephemeralKey:
'\u00050»­\n¨ÊA‘ä\u0006¢Ç´d\u0002\u00129}%î}ΩTc}8€¼\u0011n\\',
},
{
added: 1605580408250,
ephemeralKey:
'\u0005^Ä\nò›À¢\u0000\u000f­A\\6+Ó\u001a÷&×$¸¬ÑÔ|<qSÖ\u001aÙh',
},
{
added: 1605581155167,
ephemeralKey:
'\u0005<\u0017å)œQàFîl29Øƒ\u001c— Ý$·;„udß\u0005I|f\u0006',
},
{
added: 1605638524556,
ephemeralKey: '\u0005¯jõ±ã0wÛPÐÂSÏ´;·&\u0011Â%º¯°“ÝÙþêù8F',
},
{
added: 1606761719753,
ephemeralKey: '\u0005›Î(ð>‘x‚ƒÄÈ?þv~íkx â¬.ðo™òDg\u001eß.\r',
},
{
added: 1606766530935,
ephemeralKey:
'\u0005\u0014@ž½M†,à\bóó™…}¨`i¿\u0000©I\u0001ôG\u001f”:Ù{ó\u0005 ',
},
{
added: 1608326293655,
ephemeralKey: '\u0005µÒ\u0014?È¢+ÑR÷ç?3šƒ\\@0‹†\u0004®+-\bŽr\t',
},
{
added: 1609871105317,
ephemeralKey:
'\u0005„±@íN"Í\u0019HS{$ï\u0017”[Ñ\\\u001a*;>P\u0000\u001f\u000eHNaù)',
},
{
added: 1611707063523,
ephemeralKey: '\u0005Þg”Åkéƒ\u0001\u0013—¡ÿûNXÈ(9\u0006¤’w˜®/عRi‹JI',
},
{
added: 1612211156372,
ephemeralKey: '\u0005:[ÛOˆ–pd¯ ÂÙç\u0010Oއw{}ý\bw–9Àߝ=“\u0014Z',
},
],
'\u00050»­\n¨ÊA‘ä\u0006¢Ç´d\u0002\u00129}%î}ΩTc}8€¼\u0011n\\': {
messageKeys: {},
chainKey: {
counter: 0,
},
chainType: 2,
},
'\u0005^Ä\nò›À¢\u0000\u000f­A\\6+Ó\u001a÷&×$¸¬ÑÔ|<qSÖ\u001aÙh': {
messageKeys: {},
chainKey: {
counter: 2,
},
chainType: 2,
},
'\u0005<\u0017å)œQàFîl29Øƒ\u001c— Ý$·;„udß\u0005I|f\u0006': {
messageKeys: {},
chainKey: {
counter: 1,
},
chainType: 2,
},
'\u0005¯jõ±ã0wÛPÐÂSÏ´;·&\u0011Â%º¯°“ÝÙþêù8F': {
messageKeys: {
'0': 'A/{´{×f(èaøy\\D¾\u0000ÃHÀÁâô$ãŸ\u001d3’Äö°Ù',
'1': ‚ŒFT}dw8Æýª7»ÚÓ\u000f*'Ԛ»7Š£\u0018\u0012ñDá‚",
'2': 'Îï\u0013¨ÁÕÎk\u000eýèȈ÷,¼îû5%ÓUœ¤6_õ¢\u0019ä]',
},
chainKey: {
counter: 3,
},
chainType: 2,
},
'\u0005›Î(ð>‘x‚ƒÄÈ?þv~íkx â¬.ðo™òDg\u001eß.\r': {
messageKeys: {
'4': '©}j›¿Š¼\u0014q\tŠ¥”Á”ñ\u0003: ÷ÞrƒñûÔµ%Æ\u001a',
},
chainKey: {
counter: 6,
},
chainType: 2,
},
'\u0005\u0014@ž½M†,à\bóó™…}¨`i¿\u0000©I\u0001ôG\u001f”:Ù{ó\u0005 ': {
messageKeys: {},
chainKey: {
counter: 0,
},
chainType: 2,
},
'\u0005µÒ\u0014?È¢+ÑR÷ç?3šƒ\\@0‹†\u0004®+-\bŽr\t': {
messageKeys: {},
chainKey: {
counter: 2,
},
chainType: 2,
},
'\u0005„±@íN"Í\u0019HS{$ï\u0017”[Ñ\\\u001a*;>P\u0000\u001f\u000eHNaù)':
{
messageKeys: {
'0': "1kÏ\u001cí+«<º‚\b'VÌ!×¼«PÃ[üáy;l'ƒ€€Ž",
'2': 'ö\u00047%L-…Wm)†›\u001d£ääíNô.Ô8…ÃÉ4r´ó^2',
'3': '¨¿¦›7T]\u001c\u001c“à4:x\u0019¿\u0002YÉÀ\u001bâjr¸»¤¢0,*',
'5': '™¥\u0006·q“gó4þ\u0011®ˆU4F\u001cl©\bŒäô…»ÊÇÆŽ[',
},
chainKey: {
counter: 5,
},
chainType: 2,
},
'\u0005Þg”Åkéƒ\u0001\u0013—¡ÿûNXÈ(9\u0006¤’w˜®/عRi‹JI': {
messageKeys: {
'0': "]'8ŽWÄ\u0007…n˜º­Ö{ÿ7]ôäÄ!é\u000btA@°b¢)\u001ar",
'2': '­ÄfGÇjÖxÅö:×RÔi)M\u0019©IE+¨`þKá—;£Û½',
'3': '¦Õhýø`€Ö“PéPs;\u001e\u000bE}¨¿–õ\u0003uªøå\u00062(×G',
'9': 'Ï^—<‘Õú̃\u0001i´;ït¼\u001aÑ?ï\u0014lãàÆ¸ƒ\u001a8“/m',
},
chainKey: {
counter: 11,
},
chainType: 2,
},
'\u0005:[ÛOˆ–pd¯ ÂÙç\u0010Oއw{}ý\bw–9Àߝ=“\u0014Z': {
messageKeys: {
'0': '!\u00115\\W~|¯oa2\u001e\u0004Vž8Ï¡d}\u001b\u001a8^QÖfvÕ"‹',
},
chainKey: {
counter: 1,
},
chainType: 2,
},
'\u0005\n7\u001cmT…b!è\u000eÍ\u0007\u0016m4g³\u0005‘üœIYŒê\b\u0011ÏÎPs': {
messageKeys: {
'0': 'Îgó¯‘2àvñ‘X_õ\u0014–Ç\u0000öl\u001f4J>ŒÐÏ{`-Ü5¦',
'4': 'c¿<µâ¼Xµƒ!Ù¯µ®[—n<žìîúcoå©n\u0013"l]Ð',
},
chainKey: {
counter: 5,
key: 'Z{òÙ8سAÝdSZ†k\n×\u001cô¡\u001b[YÒ¶ƒ\u0016a°\u0004<',
},
chainType: 2,
},
'\u0005+\u00134–«1\u0000\u0013l *ãKçnºÖó³íTSŸ&Œ{ù ͂>1': {
messageKeys: {},
chainKey: {
counter: -1,
key: "èB?7\u000f¯\u001e\u0010¨\u0007}:“?¹\u0010$\\ë~ª\u0000gM0՘'£\u0005",
},
chainType: 1,
},
},
},
version: 'v1',
};
const record: any = SESSION_V1_RECORD;
const expected = {
currentSession: {