diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php
index 5620044945..114dd5b780 100644
--- a/mail/inc/class.mail_ui.inc.php
+++ b/mail/inc/class.mail_ui.inc.php
@@ -2328,6 +2328,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
* mailbox => (string) // the mailbox where message is stored
* passphrase => (string) // smime private key passphrase
* certAttachedPartID => (int) // partID of attached smime certificate
+ * fetchAttachmentWithPartID => (int) // PartID of requested attachment to be fetched
* )
*
* @return array
@@ -2365,8 +2366,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
// passphrase is required to decrypt the message
if (isset($_message['password_required']))
{
- $data = $_message;
- return $data;
+ return $_message;
}
}
@@ -2390,6 +2390,21 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
if (!Mail\Smime::isSmimeSignatureOnly($params['mimeType']))
{
$dec_attachments = $this->mail_bo->getMessageAttachments($params['uid'],$params['partID'],$message_parts,true,false,true,$params['mailbox']);
+ // mark attachments as smime encrypted
+ array_walk ($dec_attachments,function (&$_attachment, $_index, $_mimeType){
+ $_attachment['smime_type'] = $_mimeType;
+ },$params['mimeType']);
+
+ // fetch requested attachment's content
+ if (!empty($params['fetchAttachmentWithPartID']) && is_array($dec_attachments))
+ {
+ return array(
+ 'type' => $message_parts[$params['fetchAttachmentWithPartID']]->getType(),
+ 'charset' => $message_parts[$params['fetchAttachmentWithPartID']]->getContentTypeParameter('charset'),
+ 'filename' => $message_parts[$params['fetchAttachmentWithPartID']]->getName(),
+ 'attachment' => $message_parts[$params['fetchAttachmentWithPartID']]->getContents()
+ );
+ }
}
$result = array(
@@ -2495,6 +2510,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
$attachmentHTML[$key]['mail_id'] = $rowID;
$attachmentHTML[$key]['winmailFlag']=$value['is_winmail'];
$attachmentHTML[$key]['classSaveAllPossiblyDisabled'] = "mail_DisplayNone";
+ $attachmentHTML[$key]['smime_type'] = $value['smime_type'];
// reset mode array as it should be considered differently for
// each attachment
$mode = array();
@@ -2544,8 +2560,9 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
'menuaction' => 'mail.mail_ui.getAttachment',
'id' => $rowID,
'part' => $value['partID'],
- 'is_winmail' => $value['is_winmail'],
+ 'is_winmail'=> $value['is_winmail'],
'mailbox' => base64_encode($mailbox),
+ 'smime_type' => $value['smime_type']
) , $mode);
$windowName = 'displayAttachment_'. $uid;
$reg = '800x600';
@@ -2574,6 +2591,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
'part' => $value['partID'],
'is_winmail' => $value['is_winmail'],
'mailbox' => base64_encode($mailbox),
+ 'smime_type' => $value['smime_type']
);
$linkView = "window.location.href = '".Egw::link('/index.php',$linkData)."';";
break;
@@ -2599,6 +2617,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
'part' => $value['partID'],
'is_winmail' => $value['is_winmail'],
'mailbox' => base64_encode($mailbox),
+ 'smime_type' => $value['smime_type']
);
$attachmentHTML[$key]['link_save'] ="".Api\Html::image('mail','fileexport')."";
@@ -2783,6 +2802,7 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
$uid = $hA['msgUID'];
$mailbox = $hA['folder'];
$icServerID = $hA['profileID'];
+ $smime_type = $_GET['smime_type'];
$rememberServerID = $this->mail_bo->profileID;
if ($icServerID && $icServerID != $this->mail_bo->profileID)
{
@@ -2793,7 +2813,24 @@ $filter['before']= date("d-M-Y", $cutoffdate2);
$is_winmail = $_GET['is_winmail'] ? $_GET['is_winmail'] : 0;
$this->mail_bo->reopen($mailbox);
- $attachment = $this->mail_bo->getAttachment($uid,$part,$is_winmail,false);
+ if ($smime_type)
+ {
+ $attachment = $this->resolveSmimeMessage(
+ $this->mail_bo->getMessageRawBody($uid, null, $mailbox),
+ array(
+ 'mimeType' => $smime_type,
+ 'uid' => $uid,
+ 'partID' => 0,
+ 'mailbox' => $mailbox,
+ 'fetchAttachmentWithPartID' => $part
+ )
+ );
+
+ }
+ else
+ {
+ $attachment = $this->mail_bo->getAttachment($uid,$part,$is_winmail,false);
+ }
$this->mail_bo->closeConnection();
if ($rememberServerID != $this->mail_bo->profileID)
{
diff --git a/mail/js/app.js b/mail/js/app.js
index cc9d8d1d30..92d3792df7 100644
--- a/mail/js/app.js
+++ b/mail/js/app.js
@@ -2878,6 +2878,7 @@ app.classes.mail = AppJS.extend(
url += '&id='+mailid;
url += '&part='+attgrid.partID;
url += '&is_winmail='+attgrid.winmailFlag;
+ url += '&smime_type='+ (attgrid.smime_type?attgrid.smime_type:'');
this.et2._inst.download(url);
},
@@ -2890,7 +2891,7 @@ app.classes.mail = AppJS.extend(
mailid = this.mail_currentlyFocussed;//this.et2.getArrayMgr("content").getEntry('mail_id');
var p = widget.getParent();
var cont = p.getArrayMgr("content").data;
- attgrid = cont[widget.id.replace(/\[save\]/,'')];
+ attgrid = cont[widget.id.replace(/\[save_zip\]/,'')];
}
else
{
@@ -2901,6 +2902,7 @@ app.classes.mail = AppJS.extend(
url += 'menuaction=mail.mail_ui.download_zip'; // todo compose for Draft folder
url += '&mode=save';
url += '&id='+mailid;
+ url += '&smime_type='+ (attgrid.smime_type?attgrid.smime_type:'');
this.et2._inst.download(url);
},
@@ -2931,6 +2933,7 @@ app.classes.mail = AppJS.extend(
url += '&type='+attgrid.type.toLowerCase();
url += '&method=mail.mail_ui.vfsSaveAttachment';
url += '&label='+egw.lang('Save');
+ url += '&smime_type='+ (attgrid.smime_type?attgrid.smime_type:'');
egw_openWindowCentered(url,windowName,width,height);
},
@@ -2957,6 +2960,7 @@ app.classes.mail = AppJS.extend(
url += '&mode=select-dir';
url += '&method=mail.mail_ui.vfsSaveAttachment';
url += '&label='+egw.lang('Save all');
+ url += '&smime_type='+ (attgrid.smime_type?attgrid.smime_type:'');
for (var i=0;i 0)
{
+ content.data[attachmentArea.id] = _attachments;
+ this.et2.setArrayMgr('contnet', content);
attachmentArea.set_value({content:_attachments});
}
},