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 @@ + | + | Author: Aleksander Machniak | + +-----------------------------------------------------------------------+ +*/ + +// 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) {