From 8799df8ccdb09114b14742e0493a8ba401688fdf Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Thu, 08 Aug 2013 08:15:30 -0400 Subject: [PATCH] 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. --- program/steps/addressbook/photo.inc | 91 ++++++++++++++++++++++++++++++ program/steps/addressbook/func.inc | 1 program/steps/addressbook/show.inc | 52 ----------------- program/js/app.js | 2 4 files changed, 92 insertions(+), 54 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 45a17d6..6f5bfbc 100644 --- a/program/js/app.js +++ b/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); diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index 8ec581f..034f033 100644 --- a/program/steps/addressbook/func.inc +++ b/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', diff --git a/program/steps/addressbook/photo.inc b/program/steps/addressbook/photo.inc new file mode 100644 index 0000000..658027d --- /dev/null +++ b/program/steps/addressbook/photo.inc @@ -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; diff --git a/program/steps/addressbook/show.inc b/program/steps/addressbook/show.inc index 950764b..efab5e9 100644 --- a/program/steps/addressbook/show.inc +++ b/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) { -- Gitblit v1.9.1