alecpl
2009-06-22 ecb9fb058da8d0f5a8e59402c1c1ced21122cbc5
program/steps/mail/attachments.inc
@@ -5,7 +5,7 @@
 | program/steps/mail/attachments.inc                                    |
 |                                                                       |
 | This file is part of the RoundCube Webmail client                     |
 | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
 | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
@@ -28,40 +28,44 @@
// remove an attachment
if ($RCMAIL->action=='remove-attachment')
{
  if (preg_match('/^rcmfile([0-9]+)$/', $_POST['_file'], $regs))
  {
  $id = 'undefined';
  if (preg_match('/^rcmfile(\w+)$/', $_POST['_file'], $regs))
    $id = $regs[1];
    if (is_array($_SESSION['compose']['attachments'][$id]))
    {
      @unlink($_SESSION['compose']['attachments'][$id]['path']);
  if ($attachment = $_SESSION['compose']['attachments'][$id])
    $attachment = $RCMAIL->plugins->exec_hook('remove_attachment', $attachment);
  if ($attachment['status']) {
    if (is_array($_SESSION['compose']['attachments'][$id])) {
      unset($_SESSION['compose']['attachments'][$id]);
      $OUTPUT->command('remove_from_attachment_list', "rcmfile$id");
      $OUTPUT->send();
    }
  }
  $OUTPUT->send();
  exit;
}
if ($RCMAIL->action=='display-attachment')
{
  if (preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs))
  {
  $id = 'undefined';
  if (preg_match('/^rcmfile(\w+)$/', $_GET['_file'], $regs))
    $id = $regs[1];
    if (is_array($_SESSION['compose']['attachments'][$id]))
    {
      $apath = $_SESSION['compose']['attachments'][$id]['path'];
      header('Content-Type: ' . $_SESSION['compose']['attachments'][$id]['mimetype']);
      header('Content-Length: ' . filesize($apath));
      readfile($apath);
    }
  if ($attachment = $_SESSION['compose']['attachments'][$id])
    $attachment = $RCMAIL->plugins->exec_hook('display_attachment', $attachment);
  if ($attachment['status']) {
    $size = $attachment['data'] ? strlen($attachment['data']) : @filesize($attachment['path']);
    header('Content-Type: ' . $attachment['mimetype']);
    header('Content-Length: ' . $size);
    if ($attachment['data'])
      echo $attachment['data'];
    else if ($attachment['path'])
      readfile($attachment['path']);
  }
  exit;
}
// attachment upload action
// use common temp dir for file uploads
$temp_dir = unslashify($CONFIG['temp_dir']);
if (!is_array($_SESSION['compose']['attachments'])) {
  $_SESSION['compose']['attachments'] = array();
@@ -72,20 +76,25 @@
if (is_array($_FILES['_attachments']['tmp_name'])) {
  foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath) {
    $tmpfname = tempnam($temp_dir, 'rcmAttmnt');
    if (move_uploaded_file($filepath, $tmpfname)) {
      $id = count($_SESSION['compose']['attachments']);
      $_SESSION['compose']['attachments'][] = array(
        'name' => $_FILES['_attachments']['name'][$i],
        'mimetype' => rc_mime_content_type($tmpfname, $_FILES['_attachments']['type'][$i]),
        'path' => $tmpfname,
      );
    $attachment = array(
      'path' => $filepath,
      'name' => $_FILES['_attachments']['name'][$i],
      'mimetype' => rc_mime_content_type($filepath, $_FILES['_attachments']['type'][$i])
    );
      if (is_file($icon = $CONFIG['skin_path'] . '/images/icons/remove-attachment.png')) {
    $attachment = $RCMAIL->plugins->exec_hook('upload_attachment', $attachment);
    if ($attachment['status']) {
      $id = $attachment['id'];
      // store new attachment in session
      unset($attachment['status']);
      $_SESSION['compose']['attachments'][$id] = $attachment;
      if (($icon = $_SESSION['compose']['deleteicon']) && is_file($icon)) {
        $button = html::img(array(
          'src' => $icon,
          'alt' => rcube_label('delete'),
          'style' => "padding-right:2px;vertical-align:middle",
          'alt' => rcube_label('delete')
        ));
      }
      else {
@@ -94,11 +103,11 @@
      $content = html::a(array(
        'href' => "#delete",
        'onclick' => sprintf("return %s.command('remove-attachment','rcmfile%d', this)", JS_OBJECT_NAME, $id),
        'onclick' => sprintf("return %s.command('remove-attachment','rcmfile%s', this)", JS_OBJECT_NAME, $id),
        'title' => rcube_label('delete'),
      ), $button);
      $content .= Q($_FILES['_attachments']['name'][$i]);
      $content .= Q($attachment['name']);
      
      $OUTPUT->command('add2attachment_list', "rcmfile$id", $content);
    }