[WO-1026] Fix broken key upload after mail server error

This commit is contained in:
Felix Hammerl 2015-07-27 17:45:23 +02:00
parent e0663ab8d8
commit ad3691fae9
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) {
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();
}).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
self._axe.debug('Folder not found, creating imap folder.');
return self._imap.createFolder({
path: IMAP_KEYS_FOLDER
}).then(function(fullPath) {
@ -118,8 +129,12 @@ PrivateKey.prototype.upload = function(options) {
self._axe.error(prettyErr);
throw prettyErr;
});
});
}).then(createMessage).then(function(message) {
// upload to imap folder
self._axe.debug('Uploading key...');
return self._imap.uploadMessage({
path: path,
message: message

View File

@ -68,6 +68,14 @@ describe('Private Key DAO unit tests', function() {
});
describe('upload', function() {
beforeEach(function() {
sinon.stub(privkeyDao, '_getFolder');
});
afterEach(function() {
privkeyDao._getFolder.restore();
});
it('should fail due to invalid args', function(done) {
privkeyDao.upload({}).catch(function(err) {
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 fullPath = 'INBOX.' + IMAP_KEYS_FOLDER;
privkeyDao._getFolder.returns(rejects(new Error()));
imapClientStub.createFolder.withArgs({
path: IMAP_KEYS_FOLDER
}).returns(resolves(fullPath));
@ -95,11 +104,37 @@ describe('Private Key DAO unit tests', function() {
salt: salt,
iv: iv
}).then(function() {
expect(privkeyDao._getFolder.calledOnce).to.be.true;
expect(imapClientStub.createFolder.calledOnce).to.be.true;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
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() {