0
|
1 <?php
|
|
2
|
|
3 /**
|
|
4 * Identicon
|
|
5 *
|
|
6 * Plugin to display a unique github-like identification icons
|
|
7 * for contacts/addresses that do not have a photo image.
|
|
8 *
|
|
9 * @todo: Make it optional and configurable via user preferences
|
|
10 * @todo: Make color palettes match the curren skin
|
|
11 * @todo: Implement optional SVG generator
|
|
12 *
|
|
13 * @license GNU GPLv3+
|
|
14 * @author Aleksander Machniak <alec@alec.pl>
|
|
15 * @website http://roundcube.net
|
|
16 */
|
|
17 class identicon extends rcube_plugin
|
|
18 {
|
|
19 public $task = 'addressbook';
|
|
20
|
|
21
|
|
22 /**
|
|
23 * Plugin initilization.
|
|
24 */
|
|
25 function init()
|
|
26 {
|
|
27 $this->add_hook('contact_photo', array($this, 'contact_photo'));
|
|
28 }
|
|
29
|
|
30 /**
|
|
31 * 'contact_photo' hook handler to inject an identicon image
|
|
32 */
|
|
33 function contact_photo($args)
|
|
34 {
|
|
35 // pre-conditions, exit if photo already exists or invalid input
|
|
36 if (!empty($args['url']) || !empty($args['data'])
|
|
37 || (empty($args['record']) && empty($args['email']))
|
|
38 ) {
|
|
39 return $args;
|
|
40 }
|
|
41
|
|
42 $rcmail = rcmail::get_instance();
|
|
43
|
|
44 // supporting edit/add action may be tricky, let's not do this
|
|
45 if ($rcmail->action == 'show' || $rcmail->action == 'photo') {
|
|
46 $email = $args['email'];
|
|
47 if (!$email && $args['record']) {
|
|
48 $addresses = rcube_addressbook::get_col_values('email', $args['record'], true);
|
|
49 if (!empty($addresses)) {
|
|
50 $email = $addresses[0];
|
|
51 }
|
|
52 }
|
|
53
|
|
54 if ($email) {
|
|
55 require_once __DIR__ . '/identicon_engine.php';
|
|
56
|
|
57 $identicon = new identicon_engine($email);
|
|
58
|
|
59 if ($rcmail->action == 'show') {
|
|
60 // set photo URL using data-uri
|
|
61 if (($icon = $identicon->getBinary()) && ($icon = base64_encode($icon))) {
|
|
62 $mimetype =$identicon->getMimetype();
|
|
63 $args['url'] = sprintf('data:%s;base64,%s', $mimetype, $icon);
|
|
64 }
|
|
65 }
|
|
66 else {
|
|
67 // send the icon to the browser
|
|
68 $identicon = new identicon_engine($email);
|
|
69 if ($identicon->sendOutput()) {
|
|
70 exit;
|
|
71 }
|
|
72 }
|
|
73 }
|
|
74 }
|
|
75
|
|
76 return $args;
|
|
77 }
|
|
78 }
|