source: extensions/Subscribe_to_comments/include/functions.inc.php @ 12620

Last change on this file since 12620 was 12620, checked in by mistic100, 9 years ago

fix key generation function when mcrypt is disabled, fix display on some themes

File size: 10.8 KB
Line 
1<?php
2if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
3
4/**
5 * Send comment to subscribers
6 * @param array comm
7 */
8function send_comment_to_subscribers($comm)
9{
10  global $conf, $page, $user;
11 
12  if ( empty($comm) or !is_array($comm) )
13  {
14    trigger_error('send_comment_to_subscribers: undefinided comm', E_USER_WARNING);
15    return false;
16  }
17 
18  $type= isset($comm['category_id']) ? 'category' : 'image';
19 
20  // exclude current user
21  $exclude = null;
22  if (!empty($_POST['stc_mail'])) $exclude = pwg_db_real_escape_string($_POST['stc_mail']);
23  else if (!is_a_guest()) $exclude = $user['email'];
24 
25  // get subscribers emails
26  $query = '
27SELECT
28    email
29  FROM '.SUBSCRIBE_TO_TABLE.'
30  WHERE
31    '.$type.'_id = '.$comm[$type.'_id'].'
32    AND validated = true
33    AND email != "'.$exclude.'"
34';
35  $emails = array_from_query($query, 'email');
36 
37  set_make_full_url();
38  if ($type == 'image')
39  {
40    $element = get_picture_infos($comm['image_id']);
41  }
42  else if ($type == 'category')
43  {
44    $element = get_category_infos($comm['category_id']);
45  }
46 
47  // get author name
48  if ($comm['author'] == 'guest')
49  {
50    $comm['author'] = l10n('guest');
51  }
52 
53  // mail content
54  $mail_args = array(
55    'subject' => '['.strip_tags($conf['gallery_title']).'] Re:'.$element['name'],
56    'content_format' => 'text/html',
57    );
58   
59  $generic_content = '
60<a href="'.$element['url'].'"><img src="'.$element['thumbnail'].'" alt="'.$element['name'].'"></a>
61<br>
62<b>.'.trigger_event('render_comment_author', $comm['author']).'</b> wrote :
63
64<blockquote>'.trigger_event('render_comment_content', $comm['content']).'</blockquote>
65
66<a href="'.$element['url'].'#comment-'.$comm['id'].'">Link to comment</a>
67<br><br>
68================================
69<br><br>';
70
71  foreach ($emails as $email)
72  {
73    $mail_args['content'] = $generic_content.'
74<a href="'.make_stc_url('unsubscribe-'.$type, $email, $element['id']).'">Stop receiving notifications</a><br>
75<a href="'.make_stc_url('manage', $email).'">Manage my subscribtions</a>';
76    pwg_mail($email, $mail_args);
77  }
78 
79  unset_make_full_url();
80}
81
82
83/**
84 * add an email to subscribers list
85 * @param int (image|category)_id
86 * @param string email
87 * @param string type (image|category)
88 */
89function subscribe_to_comments($element_id, $email, $type='image')
90{
91  global $page, $conf, $user, $template, $picture;
92 
93  if ( empty($element_id) or empty($type) )
94  {
95    trigger_error('subscribe_to_comment: missing element_id and/or type', E_USER_WARNING);
96    return false;
97  }
98 
99  // check email
100  if ( ( is_a_guest() or empty($user['email']) ) and empty($email) )
101  {
102    return false;
103  }
104  else if (!is_a_guest())
105  {
106    $email = $user['email'];
107  }
108 
109  // don't care if already registered
110  $query = '
111INSERT INTO '.SUBSCRIBE_TO_TABLE.'(
112    email,
113    '.$type.'_id,
114    registration_date,
115    validated
116  )
117  VALUES(
118    "'.pwg_db_real_escape_string($email).'",
119    '.$element_id.',
120    NOW(),
121    "'.(is_a_guest() ? "false" : "true").'"
122  )
123  ON DUPLICATE KEY UPDATE
124    registration_date = IF(validated="true", registration_date, NOW()),
125    validated = IF(validated="true", validated, "'.(is_a_guest() ? "false" : "true").'")
126;';
127  pwg_query($query);
128 
129  // send validation mail
130  if ( is_a_guest() and pwg_db_changes(null) != 0 )
131  {
132    $element_name = ($type == 'image') ? $picture['current']['name'] : $page['category']['name'];
133   
134    $mail_args = array(
135      'subject' => '['.strip_tags($conf['gallery_title']).'] Please confirm your subscribtion to comments',
136      'content_format' => 'text/html',
137      );
138     
139    $mail_args['content'] = '
140You requested to subscribe by email to comments on <b>'.$element_name.'</b>.<br>
141<br>
142We care about your inbox, so we want to confirm this request. Please click the confirm link to activate the subscription.<br>
143<br>
144<a href="'.make_stc_url('validate-'.$type, $email, $element_id).'">Confirm subscription</a><br>
145<br>
146If you did not request this action please disregard this message.
147';
148
149    pwg_mail($email, $mail_args);
150    return 'confirm_mail';
151  }
152  // just display confirmation message
153  else if (pwg_db_changes(null) != 0)
154  {
155    return true;
156  }
157}
158
159
160/**
161 * remove an email from subscribers list
162 * @param int (image|category)_id
163 * @param string email
164 * @param string type (image|category)
165 */
166function un_subscribe_to_comments($element_id, $email, $type='image')
167{
168  global $template, $user;
169 
170  if ( empty($element_id) or empty($type) )
171  {
172    trigger_error('un_subscribe_to_comment: missing element_id and/or type', E_USER_WARNING);
173    return false;
174  }
175 
176  // check email
177  if ( ( is_a_guest() or empty($user['email']) ) and empty($email) )
178  {
179    return false;
180  }
181  else if (!is_a_guest())
182  {
183    $email = $user['email'];
184  }
185 
186  // delete subscription
187  switch ($type)
188  {
189    case 'image' :
190    case 'category' :
191      $where_clause = $type.'_id = '.pwg_db_real_escape_string($element_id);
192    case 'all' :
193    {
194      $query = '
195DELETE FROM '.SUBSCRIBE_TO_TABLE.'
196  WHERE
197    email = "'.pwg_db_real_escape_string($email).'"
198    '.(!empty($where_clause) ? 'AND '.$where_clause : null).'
199;';
200      pwg_query($query);
201     
202      return true;
203      break;
204    }
205  }
206 
207  return false;
208}
209
210
211/**
212 * validate a subscription
213 * @param int (image|category)_id
214 * @param string email
215 * @param string type (image|category)
216 */
217function validate_subscriptions($element_id, $email, $type='image')
218{
219  if ( empty($element_id) or empty($email) or empty($type) )
220  {
221    trigger_error('validate_subscriptions: missing element_id and/or email and/or type', E_USER_WARNING);
222    return false;
223  }
224 
225  switch ($type)
226  {
227    case 'image' :
228    case 'category':
229      $where_clause = $type.'_id = '.pwg_db_real_escape_string($element_id);
230    case 'all' :
231    {
232       $query = '
233UPDATE '.SUBSCRIBE_TO_TABLE.'
234  SET validated = "true"
235  WHERE
236    email = "'.pwg_db_real_escape_string($email).'"
237    '.(!empty($where_clause) ? 'AND '.$where_clause : null).'
238;';
239      pwg_query($query);
240     
241      if (pwg_db_changes(null) != 0) return true;
242      break;
243    }
244  }
245 
246  return false;
247}
248
249
250/**
251 * create absolute url to subscriptions section
252 * @param string action
253 * @param string email
254 * @return string
255 */
256function make_stc_url($action, $email)
257{
258  if ( empty($action) or empty($email) )
259  {
260    trigger_error('make_stc_url: missing action and/or mail', E_USER_WARNING);
261    return null;
262  }
263 
264  global $conf;
265  set_make_full_url();
266 
267  $url_params = array(
268    'action' => $action,
269    'email' => $email,
270    );
271 
272  if (func_num_args() > 2)
273  {
274    $url_params['id'] = func_get_arg(2);
275  }
276 
277  $url_params['key'] = crypt_value(
278    $action.$email.(isset($url_params['id'])?$url_params['id']:null), 
279    $conf['secret_key']
280    );
281 
282  $url = add_url_params(
283    make_index_url( array('section' => 'subscriptions') ),
284    $url_params
285    );
286   
287  unset_make_full_url();
288  return $url;
289}
290
291
292/**
293 * get name and url of a picture
294 * @param int image_id
295 * @return array
296 */
297function get_picture_infos($image_id, $absolute=false)
298{
299  global $page;
300 
301  $query = '
302SELECT
303    id,
304    name,
305    file,
306    path,
307    tn_ext
308  FROM '.IMAGES_TABLE.'
309  WHERE id = '.$image_id.'
310;';
311  $element = pwg_db_fetch_assoc(pwg_query($query));
312   
313  if (empty($element['name']))
314  {
315    $element['name'] = get_name_from_file($element['file']);
316  }
317 
318  $url_params = array('image_id' => $element['id']);
319  if ( !empty($page['category']) and !$absolute )
320  {
321    $url_params['section'] = 'categories';
322    $url_params['category'] = $page['category'];
323  }
324  $element['url'] = make_picture_url($url_params);
325 
326  $element['thumbnail'] = get_thumbnail_url($element);
327 
328  return $element;
329}
330
331/**
332 * get name and url of a category
333 * @param int cat_id
334 * @return array
335 */
336function get_category_infos($cat_id)
337{
338  global $conf;
339 
340  $query = '
341SELECT
342    cat.id,
343    cat.name,
344    cat.permalink,
345    img.id AS image_id,
346    img.path,
347    img.tn_ext
348  FROM '.CATEGORIES_TABLE.' AS cat
349    LEFT JOIN '.USER_CACHE_CATEGORIES_TABLE.' AS ucc
350      ON ucc.cat_id = cat.id AND ucc.user_id = '.$conf['guest_id'].'
351    LEFT JOIN '.IMAGES_TABLE.' AS img
352      ON img.id = ucc.user_representative_picture_id
353  WHERE cat.id = '.$cat_id.'
354;';
355  $element = pwg_db_fetch_assoc(pwg_query($query));
356  // we use guest_id for user_cache beacause we don't know the status of recipient
357 
358  $url_params['section'] = 'categories';
359  $url_params['category'] = $element;
360  $element['url'] = make_index_url($url_params);
361 
362  $element['thumbnail'] = get_thumbnail_url(array(
363    'id' => $element['image_id'],
364    'path' => $element['path'],
365    'tn_ext' => $element['tn_ext'],
366    ));
367 
368  return $element;
369}
370
371
372/**
373 * crypt a string using mcrypt extension or
374 * http://stackoverflow.com/questions/800922/how-to-encrypt-string-without-mcrypt-library-in-php/802957#802957
375 * @param string value to crypt
376 * @param string key
377 * @return string
378 */
379function crypt_value($value, $key)
380{ 
381  if (extension_loaded('mcrypt'))
382  {
383    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
384    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
385    $result = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $value, MCRYPT_MODE_ECB, $iv);
386  }
387  else
388  {
389    $result = null;
390    for($i = 0; $i < strlen($value); $i++)
391    {
392      $char = substr($value, $i, 1);
393      $keychar = substr($key, ($i % strlen($key))-1, 1);
394      $char = chr(ord($char) + ord($keychar));
395      $result .= $char;
396    }
397  }
398 
399  $result = base64url_encode($result);
400  return trim($result); 
401}
402
403/**
404 * decrypt a string crypted with previous function
405 * @param string value to decrypt
406 * @param string key
407 * @return string
408 */
409function decrypt_value($value, $key)
410{
411  $value = base64url_decode($value); 
412 
413  if (extension_loaded('mcrypt'))
414  {
415    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
416    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
417    $result = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $value, MCRYPT_MODE_ECB, $iv);
418  }
419  else
420  {
421    $result = null;
422    for($i = 0; $i < strlen($value); $i++)
423    {
424      $char = substr($value, $i, 1);
425      $keychar = substr($key, ($i % strlen($key))-1, 1);
426      $char = chr(ord($char) - ord($keychar));
427      $result .= $char;
428    }
429  }
430 
431  return trim($result);
432}
433
434/**
435 * variant of base64 functions usable into url
436 * http://fr.php.net/manual/fr/function.base64-encode.php#103849
437 */
438function base64url_encode($data)
439{
440  return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
441}
442function base64url_decode($data)
443{
444  return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
445} 
446
447?>
Note: See TracBrowser for help on using the repository browser.