feat(mail): initial support for ms-tnef (winmail.dat) body part

Fixes #2242
Fixes #4503
This commit is contained in:
Francis Lachapelle
2021-08-13 11:12:37 -04:00
committed by GitHub
parent 98dad1d2dc
commit 045f134321
36 changed files with 3639 additions and 34 deletions
@@ -361,9 +361,23 @@
};
}
}
_.forEach(part.content, function(mixedPart) {
_visit(mixedPart);
var winmail = _.find(part.content, function(mixedPart) {
// Ignore empty content -- that could mean a decoding error server-side.
return mixedPart.type == 'UIxMailPartTnefViewer' && mixedPart.content.length > 0;
});
if (winmail && !_.find(part.content, function(mixedPart) {
return mixedPart.type == 'UIxMailPartAlternativeViewer';
})) {
// If there's no alternate part in the message, show the winmail.dat attachment only.
// Otherwise, show all parts.
_visit(winmail);
}
else {
_.forEach(part.content, function(mixedPart) {
_visit(mixedPart);
});
}
}
else {
if (angular.isUndefined(part.safeContent)) {
@@ -80,12 +80,21 @@
$mdPanel = ImageGallery.$mdPanel,
partSrc = angular.element(this.message.$content()[partIndex].content).find('img')[0].src;
var images = _.filter(this.message.attachmentAttrs, function(attrs) {
return attrs.mimetype.indexOf('image/') === 0 && attrs.mimetype.indexOf('svg+xml') < 0;
});
var _findImages = function (parts, images) {
_.forEach(parts, function (part) {
if (part.type == 'UIxMailPartImageViewer') {
images.push(part);
}
else if (typeof part.content != 'string') {
_findImages(part.content, images);
}
});
};
var images = [];
_findImages(this.message.$content(), images);
var selectedIndex = _.findIndex(images, function(image) {
return image.url.indexOf(partSrc) >= 0;
return partSrc.indexOf(image.viewURL) >= 0;
});
// Add a class to the body in order to modify the panel backdrop opacity
@@ -128,7 +137,7 @@
' <div md-truncate class="md-flex" ng-bind="$panelCtrl.selectedImage.filename"></div>',
' <md-button class="md-icon-button"',
' aria-label="' + l('Save Attachment') + '"',
' ng-href="{{$panelCtrl.selectedImage.urlAsAttachment}}">',
' ng-href="{{$panelCtrl.selectedImage.downloadURL}}">',
' <md-icon>file_download</md-icon>',
' </md-button>',
' </div>',
@@ -137,7 +146,7 @@
' ng-disabled="$panelCtrl.selectedIndex == 0">',
' <md-icon>navigate_before</md-icon>',
' </md-button>',
' <img class="sg-image" ng-src="{{$panelCtrl.selectedImage.url}}">',
' <img class="sg-image" ng-src="{{$panelCtrl.selectedImage.viewURL}}">',
' <md-button class="md-icon-button" ng-click="$panelCtrl.nextImage()"',
' ng-disabled="$panelCtrl.selectedIndex == $panelCtrl.lastIndex">',
' <md-icon>navigate_next</md-icon>',
@@ -145,7 +154,7 @@
' </div>',
' <div class="sg-image-thumbnails">',
' <div class="sg-image-thumbnail" ng-repeat="image in ::$panelCtrl.images">',
' <img class="sg-hide" ng-src="{{::image.url}}" ng-click="$panelCtrl.selectImage($index)">',
' <img class="sg-hide" ng-src="{{::image.viewURL}}" ng-click="$panelCtrl.selectImage($index)">',
' </div>',
' </div>',
'</sg-image-gallery>'