mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-01-19 14:13:34 +01:00
ImportEtherpad: Enforce single-pad records
This commit is contained in:
parent
33778281b9
commit
a2e77a7128
2 changed files with 52 additions and 0 deletions
|
@ -41,6 +41,12 @@ exports.setPadRaw = async (padId, r) => {
|
||||||
'pad',
|
'pad',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
let originalPadId = null;
|
||||||
|
const checkOriginalPadId = (padId) => {
|
||||||
|
if (originalPadId == null) originalPadId = padId;
|
||||||
|
if (originalPadId !== padId) throw new Error('unexpected pad ID in record');
|
||||||
|
};
|
||||||
|
|
||||||
await Promise.all(Object.entries(records).map(async ([key, value]) => {
|
await Promise.all(Object.entries(records).map(async ([key, value]) => {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return;
|
return;
|
||||||
|
@ -48,12 +54,20 @@ exports.setPadRaw = async (padId, r) => {
|
||||||
const keyParts = key.split(':');
|
const keyParts = key.split(':');
|
||||||
const [prefix, id] = keyParts;
|
const [prefix, id] = keyParts;
|
||||||
if (prefix === 'globalAuthor' && keyParts.length === 2) {
|
if (prefix === 'globalAuthor' && keyParts.length === 2) {
|
||||||
|
// In the database, the padIDs subkey is an object (which is used as a set) that records every
|
||||||
|
// pad the author has worked on. When exported, that object becomes a single string containing
|
||||||
|
// the exported pad's ID.
|
||||||
|
if (typeof value.padIDs !== 'string') {
|
||||||
|
throw new TypeError('globalAuthor padIDs subkey is not a string');
|
||||||
|
}
|
||||||
|
checkOriginalPadId(value.padIDs);
|
||||||
if (await authorManager.doesAuthorExist(id)) {
|
if (await authorManager.doesAuthorExist(id)) {
|
||||||
await authorManager.addPad(id, padId);
|
await authorManager.addPad(id, padId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
value.padIDs = {[padId]: 1};
|
value.padIDs = {[padId]: 1};
|
||||||
} else if (padKeyPrefixes.includes(prefix)) {
|
} else if (padKeyPrefixes.includes(prefix)) {
|
||||||
|
checkOriginalPadId(id);
|
||||||
if (prefix === 'pad' && keyParts.length === 2 && value.pool) {
|
if (prefix === 'pad' && keyParts.length === 2 && value.pool) {
|
||||||
for (const [k] of Object.values(value.pool.numToAttrib)) {
|
for (const [k] of Object.values(value.pool.numToAttrib)) {
|
||||||
if (!supportedElems.has(k)) unsupportedElements.add(k);
|
if (!supportedElems.has(k)) unsupportedElements.add(k);
|
||||||
|
|
|
@ -119,4 +119,42 @@ describe(__filename, function () {
|
||||||
assert.deepEqual((await authorManager.listPadsOfAuthor(newAuthorId)).padIDs, [padId]);
|
assert.deepEqual((await authorManager.listPadsOfAuthor(newAuthorId)).padIDs, [padId]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('enforces consistent pad ID', function () {
|
||||||
|
it('pad record has different pad ID', async function () {
|
||||||
|
const data = makeExport(makeAuthorId());
|
||||||
|
data['pad:differentPadId'] = data['pad:testing'];
|
||||||
|
delete data['pad:testing'];
|
||||||
|
assert.rejects(importEtherpad.setPadRaw(padId, JSON.stringify(data)), /unexpected pad ID/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('globalAuthor record has different pad ID', async function () {
|
||||||
|
const authorId = makeAuthorId();
|
||||||
|
const data = makeExport(authorId);
|
||||||
|
data[`globalAuthor:${authorId}`].padIDs = 'differentPadId';
|
||||||
|
assert.rejects(importEtherpad.setPadRaw(padId, JSON.stringify(data)), /unexpected pad ID/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('pad rev record has different pad ID', async function () {
|
||||||
|
const data = makeExport(makeAuthorId());
|
||||||
|
data['pad:differentPadId:revs:0'] = data['pad:testing:revs:0'];
|
||||||
|
delete data['pad:testing:revs:0'];
|
||||||
|
assert.rejects(importEtherpad.setPadRaw(padId, JSON.stringify(data)), /unexpected pad ID/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('order of records does not matter', function () {
|
||||||
|
for (const perm of [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]) {
|
||||||
|
it(JSON.stringify(perm), async function () {
|
||||||
|
const authorId = makeAuthorId();
|
||||||
|
const records = Object.entries(makeExport(authorId));
|
||||||
|
assert.equal(records.length, 3);
|
||||||
|
await importEtherpad.setPadRaw(
|
||||||
|
padId, JSON.stringify(Object.fromEntries(perm.map((i) => records[i]))));
|
||||||
|
assert.deepEqual((await authorManager.listPadsOfAuthor(authorId)).padIDs, [padId]);
|
||||||
|
const pad = await padManager.getPad(padId);
|
||||||
|
assert.equal(pad.text(), 'foo\n');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue