Skip to content
This repository has been archived by the owner on Jul 10, 2019. It is now read-only.

Commit

Permalink
[WO-1026] Fix broken key upload after mail server error
Browse files Browse the repository at this point in the history
  • Loading branch information
felixhammerl committed Aug 19, 2015
1 parent e0663ab commit ad3691f
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 12 deletions.
37 changes: 26 additions & 11 deletions src/js/service/privatekey.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,24 +102,39 @@ 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() {
// create imap folder
return self._imap.createFolder({
path: IMAP_KEYS_FOLDER
}).then(function(fullPath) {

// 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;
self._axe.debug('Successfully created imap folder ' + path);
}).catch(function(err) {
var prettyErr = new Error('Creating imap folder ' + IMAP_KEYS_FOLDER + ' failed: ' + err.message);
self._axe.error(prettyErr);
throw prettyErr;
}).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) {
path = fullPath;
self._axe.debug('Successfully created imap folder ' + path);
}).catch(function(err) {
var prettyErr = new Error('Creating imap folder ' + IMAP_KEYS_FOLDER + ' failed: ' + err.message);
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
Expand Down Expand Up @@ -380,4 +395,4 @@ function filterBodyParts(bodyParts, type, result) {
}
});
return result;
}
}
37 changes: 36 additions & 1 deletion test/unit/service/privatekey-dao-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,26 @@ 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/);
done();
});
});

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));
Expand All @@ -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() {
Expand Down

0 comments on commit ad3691f

Please sign in to comment.