This commit is contained in:
Andris Reinman 2018-11-30 11:16:14 +02:00
parent 5d58504a09
commit 40f3b5fa06
3 changed files with 90 additions and 11 deletions

View file

@ -162,13 +162,17 @@ module.exports = (server, messageHandler) => (mailbox, update, session, callback
time: new Date()
});
db.database.collection('messages').insertOne(message, { w: 'majority' }, err => {
db.database.collection('messages').insertOne(message, { w: 'majority' }, (err, r) => {
if (err) {
return cursor.close(() => {
updateQuota(() => callback(err));
});
}
if (!r || !r.insertedCount) {
return processNext();
}
copiedMessages++;
copiedStorage += Number(message.size) || 0;

View file

@ -264,7 +264,7 @@ class MessageHandler {
.filter(html => html);
}
this.users.collection('users').updateOne(
this.users.collection('users').findOneAndUpdate(
{
_id: mailboxData.user
},
@ -273,13 +273,29 @@ class MessageHandler {
storageUsed: size
}
},
err => {
{
returnOriginal: false,
projection: {
storageUsed: true
}
},
(err, r) => {
if (err) {
return cleanup(err);
}
if (r && r.value) {
this.loggelf({
short_message: '[QUOTA CHANGE]',
_user: mailboxData.user,
_inc: size,
_storageUsed: r.value.storageUsed,
_session: options.session && options.session.id
});
}
let rollback = err => {
this.users.collection('users').updateOne(
this.users.collection('users').findOneAndUpdate(
{
_id: mailboxData.user
},
@ -288,7 +304,28 @@ class MessageHandler {
storageUsed: -size
}
},
() => {
{
returnOriginal: false,
projection: {
storageUsed: true
}
},
(...args) => {
let r = args && args[1];
if (r && r.value) {
this.loggelf({
short_message: '[QUOTA CHANGE]',
_user: mailboxData.user,
_inc: -size,
_storageUsed: r.value.storageUsed,
_session: options.session && options.session.id,
_rollback: 'yes',
_error: err.message,
_code: err.code
});
}
cleanup(err);
}
);
@ -346,11 +383,17 @@ class MessageHandler {
messageData.thread = thread;
this.database.collection('messages').insertOne(messageData, { w: 'majority' }, err => {
this.database.collection('messages').insertOne(messageData, { w: 'majority' }, (err, r) => {
if (err) {
return rollback(err);
}
if (!r || !r.insertedCount) {
let err = new Error('Failed to store message');
err.code = 'StoreError';
return rollback(err);
}
let logTime = messageData.meta.time || new Date();
if (typeof logTime === 'number') {
logTime = new Date(logTime);
@ -400,10 +443,10 @@ class MessageHandler {
});
}
updateQuota(user, inc, callback) {
updateQuota(user, inc, options, callback) {
inc = inc || {};
this.users.collection('users').updateOne(
this.users.collection('users').findOneAndUpdate(
{
_id: user
},
@ -412,7 +455,26 @@ class MessageHandler {
storageUsed: Number(inc.storageUsed) || 0
}
},
callback
{
returnOriginal: false,
projection: {
storageUsed: true
}
},
(...args) => {
let r = args && args[1];
if (r && r.value) {
this.loggelf({
short_message: '[QUOTA CHANGE]',
_user: user,
_inc: inc.storageUsed,
_storageUsed: r.value.storageUsed,
_session: options.session && options.session.id
});
}
callback(...args);
}
);
}
@ -476,6 +538,7 @@ class MessageHandler {
{
storageUsed: -messageData.size
},
options,
() => {
if (!mailboxData) {
// deleted an orphan message
@ -769,6 +832,12 @@ class MessageHandler {
return cursor.close(() => done(err));
}
if (!r || !r.insertedCount) {
let err = new Error('Failed to store message');
err.code = 'StoreError';
return cursor.close(() => done(err));
}
let insertId = r.insertedId;
// delete old message
@ -932,6 +1001,12 @@ class MessageHandler {
return callback(err);
}
if (!r || !r.insertedCount) {
let err = new Error('Failed to store message');
err.code = 'StoreError';
return callback(err);
}
let insertId = r.insertedId;
let entry = {

View file

@ -1,6 +1,6 @@
{
"name": "wildduck",
"version": "1.11.0",
"version": "1.11.1",
"description": "IMAP/POP3 server built with Node.js and MongoDB",
"main": "server.js",
"scripts": {
@ -16,7 +16,7 @@
"author": "Andris Reinman",
"license": "EUPL-1.1+",
"devDependencies": {
"ajv": "6.5.5",
"ajv": "6.6.1",
"apidoc": "0.17.7",
"browserbox": "0.9.1",
"chai": "4.2.0",