Aleksander Machniak
2013-08-08 8799df8ccdb09114b14742e0493a8ba401688fdf
Fix redundant SQL query on contact photo request after photo upload.
The query was also invalid in case of uploading photo in contact create form.
Move contact photo handling from show.inc into a separate file.
1 files added
3 files modified
146 ■■■■■ changed files
program/js/app.js 2 ●●● patch | view | raw | blame | history
program/steps/addressbook/func.inc 1 ●●●● patch | view | raw | blame | history
program/steps/addressbook/photo.inc 91 ●●●●● patch | view | raw | blame | history
program/steps/addressbook/show.inc 52 ●●●●● patch | view | raw | blame | history
program/js/app.js
@@ -4995,7 +4995,7 @@
  this.replace_contact_photo = function(id)
  {
    var img_src = id == '-del-' ? this.env.photo_placeholder :
      this.env.comm_path + '&_action=photo&_source=' + this.env.source + '&_cid=' + this.env.cid + '&_photo=' + id;
      this.env.comm_path + '&_action=photo&_source=' + this.env.source + '&_cid=' + (this.env.cid || 0) + '&_photo=' + id;
    this.set_photo_actions(id);
    $(this.gui_objects.contactphoto).children('img').attr('src', img_src);
program/steps/addressbook/func.inc
@@ -893,7 +893,6 @@
// register action aliases
$RCMAIL->register_action_map(array(
    'add' => 'edit.inc',
    'photo' => 'show.inc',
    'group-create' => 'groups.inc',
    'group-rename' => 'groups.inc',
    'group-delete' => 'groups.inc',
program/steps/addressbook/photo.inc
New file
@@ -0,0 +1,91 @@
<?php
/*
 +-----------------------------------------------------------------------+
 | program/steps/addressbook/photo.inc                                   |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2005-2013, The Roundcube Dev Team                       |
 |                                                                       |
 | Licensed under the GNU General Public License version 3 or            |
 | any later version with exceptions for skins & plugins.                |
 | See the README file for a full license statement.                     |
 |                                                                       |
 | PURPOSE:                                                              |
 |   Show contact photo                                                  |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 | Author: Aleksander Machniak <alec@alec.pl>                            |
 +-----------------------------------------------------------------------+
*/
// Get contact ID and source ID from request
$cids   = rcmail_get_cids();
$source = key($cids);
$cid    = $cids ? array_shift($cids[$source]) : null;
// read the referenced file
if (($file_id = get_input_value('_photo', RCUBE_INPUT_GPC)) && ($tempfile = $_SESSION['contacts']['files'][$file_id])) {
    $tempfile = $RCMAIL->plugins->exec_hook('attachment_display', $tempfile);
    if ($tempfile['status']) {
        if ($tempfile['data'])
            $data = $tempfile['data'];
        else if ($tempfile['path'])
            $data = file_get_contents($tempfile['path']);
    }
}
else {
    // by email, search for contact first
    if ($email = get_input_value('_email', RCUBE_INPUT_GPC)) {
        foreach ($RCMAIL->get_address_sources() as $s) {
            $abook = $RCMAIL->get_address_book($s['id']);
            $result = $abook->search(array('email'), $email, 1, true, true, 'photo');
            while ($result && ($record = $result->iterate())) {
                if ($record['photo'])
                    break 2;
            }
        }
    }
    // by contact id
    if (!$record && $cid) {
        // Initialize addressbook source
        $CONTACTS  = rcmail_contact_source($source, true);
        $SOURCE_ID = $source;
        // read contact record
        $record = $CONTACTS->get_record($cid, true);
    }
    if ($record['photo']) {
        $data = is_array($record['photo']) ? $record['photo'][0] : $record['photo'];
        if (!preg_match('![^a-z0-9/=+-]!i', $data))
            $data = base64_decode($data, true);
    }
}
// let plugins do fancy things with contact photos
$plugin = $RCMAIL->plugins->exec_hook('contact_photo',
    array('record' => $record, 'email' => $email, 'data' => $data));
// redirect to url provided by a plugin
if ($plugin['url']) {
    $RCMAIL->output->redirect($plugin['url']);
}
else {
    $data = $plugin['data'];
}
// deliver alt image
if (!$data && ($alt_img = get_input_value('_alt', RCUBE_INPUT_GPC)) && is_file($alt_img)) {
    $data = file_get_contents($alt_img);
}
// cache for one day if requested by email
if (!$cid && $email) {
    $RCMAIL->output->future_expire_header(86400);
}
header('Content-Type: ' . rc_image_content_type($data));
echo $data ? $data : file_get_contents('program/resources/blank.gif');
exit;
program/steps/addressbook/show.inc
@@ -38,58 +38,6 @@
// get address book name (for display)
rcmail_set_sourcename($CONTACTS);
// return raw photo of the given contact
if ($RCMAIL->action == 'photo') {
    // search for contact first
    if (!$record && ($email = get_input_value('_email', RCUBE_INPUT_GPC))) {
        foreach ($RCMAIL->get_address_sources() as $s) {
            $abook = $RCMAIL->get_address_book($s['id']);
            $result = $abook->search(array('email'), $email, 1, true, true, 'photo');
            while ($result && ($record = $result->iterate())) {
                if ($record['photo'])
                    break 2;
            }
        }
    }
    // read the referenced file
    if (($file_id = get_input_value('_photo', RCUBE_INPUT_GPC)) && ($tempfile = $_SESSION['contacts']['files'][$file_id])) {
        $tempfile = $RCMAIL->plugins->exec_hook('attachment_display', $tempfile);
        if ($tempfile['status']) {
            if ($tempfile['data'])
                $data = $tempfile['data'];
            else if ($tempfile['path'])
                $data = file_get_contents($tempfile['path']);
        }
    }
    else if ($record['photo']) {
        $data = is_array($record['photo']) ? $record['photo'][0] : $record['photo'];
        if (!preg_match('![^a-z0-9/=+-]!i', $data))
            $data = base64_decode($data, true);
    }
    // let plugins do fancy things with contact photos
    $plugin = $RCMAIL->plugins->exec_hook('contact_photo', array('record' => $record, 'email' => $email, 'data' => $data));
    // redirect to url provided by a plugin
    if ($plugin['url'])
        $RCMAIL->output->redirect($plugin['url']);
    else
        $data = $plugin['data'];
    // deliver alt image
    if (!$data && ($alt_img = get_input_value('_alt', RCUBE_INPUT_GPC)) && is_file($alt_img))
        $data = file_get_contents($alt_img);
    // cache for one day if requested by email
    if (!$cid && $email)
        $RCMAIL->output->future_expire_header(86400);
    header('Content-Type: ' . rc_image_content_type($data));
    echo $data ? $data : file_get_contents('program/resources/blank.gif');
    exit;
}
function rcmail_contact_head($attrib)
{