1
0
mirror of https://github.com/moparisthebest/mail synced 2024-11-28 11:52:16 -05:00

Merge pull request #394 from whiteout-io/dev/WO-1026

[WO-1026] Fix broken key upload after mail server error
This commit is contained in:
Felix Hammerl 2015-08-19 12:36:59 +02:00
commit e56f8c2c28
2 changed files with 62 additions and 12 deletions

View File

@ -102,12 +102,23 @@ PrivateKey.prototype.upload = function(options) {
return new Promise(function(resolve) { return new Promise(function(resolve) {
if (!options._id || !options.userId || !options.encryptedPrivateKey || !options.salt || !options.iv) { if (!options._id || !options.userId || !options.encryptedPrivateKey || !options.salt || !options.iv) {
throw new Error('Incomplete arguments!'); throw new Error('Incomplete arguments for key upload!');
} }
resolve(); resolve();
}).then(function() { }).then(function() {
// Some servers (Exchange, Cyrus) error when creating an existing IMAP mailbox instead of
// responding with ALREADYEXISTS. Hence we search for the folder before uploading.
self._axe.debug('Searching imap folder for key upload...');
return self._getFolder().then(function(fullPath) {
path = fullPath;
}).catch(function() {
// create imap folder // create imap folder
self._axe.debug('Folder not found, creating imap folder.');
return self._imap.createFolder({ return self._imap.createFolder({
path: IMAP_KEYS_FOLDER path: IMAP_KEYS_FOLDER
}).then(function(fullPath) { }).then(function(fullPath) {
@ -118,8 +129,12 @@ PrivateKey.prototype.upload = function(options) {
self._axe.error(prettyErr); self._axe.error(prettyErr);
throw prettyErr; throw prettyErr;
}); });
});
}).then(createMessage).then(function(message) { }).then(createMessage).then(function(message) {
// upload to imap folder // upload to imap folder
self._axe.debug('Uploading key...');
return self._imap.uploadMessage({ return self._imap.uploadMessage({
path: path, path: path,
message: message message: message

View File

@ -68,6 +68,14 @@ describe('Private Key DAO unit tests', function() {
}); });
describe('upload', function() { describe('upload', function() {
beforeEach(function() {
sinon.stub(privkeyDao, '_getFolder');
});
afterEach(function() {
privkeyDao._getFolder.restore();
});
it('should fail due to invalid args', function(done) { it('should fail due to invalid args', function(done) {
privkeyDao.upload({}).catch(function(err) { privkeyDao.upload({}).catch(function(err) {
expect(err.message).to.match(/Incomplete/); expect(err.message).to.match(/Incomplete/);
@ -75,10 +83,11 @@ describe('Private Key DAO unit tests', function() {
}); });
}); });
it('should work', function(done) { it('should work without existing folder', function(done) {
var IMAP_KEYS_FOLDER = 'openpgp_keys'; var IMAP_KEYS_FOLDER = 'openpgp_keys';
var fullPath = 'INBOX.' + IMAP_KEYS_FOLDER; var fullPath = 'INBOX.' + IMAP_KEYS_FOLDER;
privkeyDao._getFolder.returns(rejects(new Error()));
imapClientStub.createFolder.withArgs({ imapClientStub.createFolder.withArgs({
path: IMAP_KEYS_FOLDER path: IMAP_KEYS_FOLDER
}).returns(resolves(fullPath)); }).returns(resolves(fullPath));
@ -95,11 +104,37 @@ describe('Private Key DAO unit tests', function() {
salt: salt, salt: salt,
iv: iv iv: iv
}).then(function() { }).then(function() {
expect(privkeyDao._getFolder.calledOnce).to.be.true;
expect(imapClientStub.createFolder.calledOnce).to.be.true; expect(imapClientStub.createFolder.calledOnce).to.be.true;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true; expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
done(); done();
}); });
}); });
it('should work with existing folder', function(done) {
var IMAP_KEYS_FOLDER = 'openpgp_keys';
var fullPath = 'INBOX.' + IMAP_KEYS_FOLDER;
privkeyDao._getFolder.returns(resolves(fullPath));
imapClientStub.uploadMessage.withArgs(sinon.match(function(arg) {
expect(arg.path).to.equal(fullPath);
expect(arg.message).to.exist;
return true;
})).returns(resolves());
privkeyDao.upload({
_id: keyId,
userId: emailAddress,
encryptedPrivateKey: encryptedPrivateKey,
salt: salt,
iv: iv
}).then(function() {
expect(privkeyDao._getFolder.calledOnce).to.be.true;
expect(imapClientStub.createFolder.called).to.be.false;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
done();
});
});
}); });
describe('isSynced', function() { describe('isSynced', function() {