summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2013-08-08 14:15:30 +0200
committerAleksander Machniak <alec@alec.pl>2013-08-08 14:15:30 +0200
commit8799df8ccdb09114b14742e0493a8ba401688fdf (patch)
tree409a1ab486023d2c23807a1b37be11ed809a3ff7
parentbc94e296e74ab4a3313a3f807b0a5cc40f264879 (diff)
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.
-rw-r--r--program/js/app.js2
-rw-r--r--program/steps/addressbook/func.inc1
-rw-r--r--program/steps/addressbook/photo.inc91
-rw-r--r--program/steps/addressbook/show.inc52
4 files changed, 92 insertions, 54 deletions
diff --git a/program/js/app.js b/program/js/app.js
index 45a17d640..6f5bfbced 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -4995,7 +4995,7 @@ function rcube_webmail()
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 8ec581f9a..034f033c9 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -893,7 +893,6 @@ $OUTPUT->add_handlers(array(
// 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 000000000..658027de4
--- /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 950764bb1..efab5e9e5 100644
--- a/program/steps/addressbook/show.inc
+++ b/program/steps/addressbook/show.inc
@@ -38,58 +38,6 @@ if ($cid && ($record = $CONTACTS->get_record($cid, true))) {
// 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)
{