mail/src/js/controller/app/read.js

173 lines
4.3 KiB
JavaScript

'use strict';
//
// Controller
//
var ReadCtrl = function($scope, $location, $q, email, invitation, outbox, pgp, keychain, appConfig, download, auth, dialog) {
var str = appConfig.string;
//
// scope state
//
$scope.state.read = {
open: false,
toggle: function(to) {
this.open = to;
}
};
$scope.$on('read', function(e, state) {
$scope.state.read.toggle(state);
});
// set default value so that the popover height is correct on init
$scope.keyId = 'No key found.';
//
// url/history handling
//
// read state url watcher
$scope.loc = $location;
$scope.$watch('(loc.search()).uid', function(uid) {
// synchronize the url to the scope state
$scope.state.read.toggle(!!uid);
});
$scope.$watch('state.read.open', function(value) {
// close read mode by navigating to folder view
if (!value) {
$location.search('uid', null);
}
});
//
// scope functions
//
$scope.getKeyId = function(address) {
if ($location.search().dev || !address) {
return;
}
return $q(function(resolve) {
$scope.keyId = 'Searching...';
resolve();
}).then(function() {
return keychain.getReceiverPublicKey(address);
}).then(function(pubkey) {
if (!pubkey) {
$scope.keyId = 'User has no key. Click to invite.';
return;
}
var fpr = pgp.getFingerprint(pubkey.publicKey);
var formatted = fpr.slice(32);
$scope.keyId = 'PGP key: ' + formatted;
}).catch(dialog.error);
};
$scope.$watch('state.mailList.selected', function(mail) {
if ($location.search().dev || !mail) {
return;
}
// display sender security status
mail.from.forEach(checkPublicKey);
// display recipient security status
mail.to.forEach(checkPublicKey);
// display recipient security status
Array.isArray(mail.cc) && mail.cc.forEach(checkPublicKey);
});
function checkPublicKey(user) {
user.secure = undefined;
return $q(function(resolve) {
resolve();
}).then(function() {
return keychain.getReceiverPublicKey(user.address);
}).then(function(pubkey) {
if (pubkey && pubkey.publicKey) {
user.secure = true;
} else {
user.secure = false;
}
}).catch(dialog.error);
}
$scope.download = function(attachment) {
// download file to disk if content is available
if (attachment.content) {
download.createDownload({
content: attachment.content,
filename: attachment.filename,
contentType: attachment.mimeType
});
return;
}
var folder = $scope.state.nav.currentFolder;
var message = $scope.state.mailList.selected;
return $q(function(resolve) {
resolve();
}).then(function() {
return email.getAttachment({
folder: folder,
uid: message.uid,
attachment: attachment
});
}).catch(dialog.error);
};
$scope.invite = function(user) {
// only invite non-pgp users
if (user.secure) {
return;
}
var sender = auth.emailAddress,
recipient = user.address;
return $q(function(resolve) {
$scope.keyId = 'Sending invitation...';
resolve();
}).then(function() {
return invitation.invite({
recipient: recipient,
sender: sender
});
}).then(function() {
var invitationMail = {
from: [{
address: sender
}],
to: [{
address: recipient
}],
cc: [],
bcc: [],
subject: str.invitationSubject,
body: str.invitationMessage
};
// send invitation mail
return outbox.put(invitationMail);
}).catch(dialog.error);
};
};
module.exports = ReadCtrl;