Merge pull request #441 from nodemailer/zms-61

Include BIMI in search results
This commit is contained in:
Andris Reinman 2022-12-22 09:43:05 +02:00 committed by GitHub
commit fd8b65b11f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -96,6 +96,45 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
});
};
const applyBimiToListing = async messages => {
let bimiList = new Set();
for (let messageData of messages) {
if (
messageData.verificationResults &&
messageData.verificationResults.bimi &&
typeof messageData.verificationResults.bimi.toHexString === 'function'
) {
let bimiId = messageData.verificationResults.bimi.toString();
bimiList.add(bimiId);
}
}
if (bimiList.size) {
try {
let bimiEntries = await db.database
.collection('bimi')
.find({ _id: { $in: Array.from(bimiList).map(id => new ObjectId(id)) } })
.toArray();
for (let messageData of messages) {
if (messageData.verificationResults && messageData.verificationResults.bimi) {
let bimiData = bimiEntries.find(entry => entry._id.equals(messageData.verificationResults.bimi));
if (bimiData?.content && !bimiData?.error) {
messageData.bimi = {
certified: bimiData.type === 'authority',
url: bimiData.url,
image: `data:image/svg+xml;base64,${bimiData.content.toString('base64')}`
};
}
delete messageData.verificationResults.bimi;
}
}
} catch (err) {
log.error('BIMI', 'messages=%s error=%s', Array.from(bimiList).join(','), err.message);
}
}
};
const putMessageHandler = async (req, res) => {
res.charSet('utf-8');
@ -449,42 +488,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
listing.results = await addThreadCountersToMessageList(user, listing.results);
}
let bimiList = new Set();
for (let messageData of listing.results) {
if (
messageData.verificationResults &&
messageData.verificationResults.bimi &&
typeof messageData.verificationResults.bimi.toHexString === 'function'
) {
let bimiId = messageData.verificationResults.bimi.toString();
bimiList.add(bimiId);
}
}
if (bimiList.size) {
try {
let bimiEntries = await db.database
.collection('bimi')
.find({ _id: { $in: Array.from(bimiList).map(id => new ObjectId(id)) } })
.toArray();
for (let messageData of listing.results) {
if (messageData.verificationResults && messageData.verificationResults.bimi) {
let bimiData = bimiEntries.find(entry => entry._id.equals(messageData.verificationResults.bimi));
if (bimiData?.content && !bimiData?.error) {
messageData.bimi = {
certified: bimiData.type === 'authority',
url: bimiData.url,
image: `data:image/svg+xml;base64,${bimiData.content.toString('base64')}`
};
}
delete messageData.verificationResults.bimi;
}
}
} catch (err) {
log.error('BIMI', 'messages=%s error=%s', Array.from(bimiList).join(','), err.message);
}
}
await applyBimiToListing(listing.results);
let response = {
success: true,
@ -608,10 +612,11 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
flagged: true,
draft: true,
thread: true,
flags: true
flags: true,
verificationResults: true
}
},
paginatedField: order !== undefined ? 'idate' : "_id",
paginatedField: order !== undefined ? 'idate' : '_id',
sortAscending: order === 'asc' ? true : undefined
};
@ -640,6 +645,8 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
listing.results = await addThreadCountersToMessageList(user, listing.results);
}
await applyBimiToListing(listing.results);
let response = {
success: true,
query,