PEEL Shopping
Open source ecommerce : PEEL Shopping
user.php
Go to the documentation of this file.
1 <?php
2 // This file should be in UTF8 without BOM - Accents examples: éèê
3 // +----------------------------------------------------------------------+
4 // | Copyright (c) 2004-2015 Advisto SAS, service PEEL - contact@peel.fr |
5 // +----------------------------------------------------------------------+
6 // | This file is part of PEEL Shopping 8.0.0, which is subject to an |
7 // | opensource GPL license: you are allowed to customize the code |
8 // | for your own needs, but must keep your changes under GPL |
9 // | More information: https://www.peel.fr/lire/licence-gpl-70.html |
10 // +----------------------------------------------------------------------+
11 // | Author: Advisto SAS, RCS 479 205 452, France, https://www.peel.fr/ |
12 // +----------------------------------------------------------------------+
13 // $Id: user.php 47366 2015-10-13 11:34:11Z gboussin $
14 if (!defined('IN_PEEL')) {
15  die();
16 }
17 
23 function est_identifie()
24 {
25  return isset($_SESSION) && isset($_SESSION['session_utilisateur']) && !empty($_SESSION['session_utilisateur']['id_utilisateur']);
26 }
27 
34 function get_profil_select_options($selected_priv = null)
35 {
36  $output = '';
37  $sql_profil = "SELECT id, name_".$_SESSION['session_langue']." AS name, priv
38  FROM peel_profil
39  WHERE " . get_filter_site_cond('profil') . "
40  ORDER BY name DESC";
41  $res_profil = query($sql_profil);
42  while ($tab_profil = fetch_assoc($res_profil)) {
43  $output .= '<option value="' . String::str_form_value($tab_profil['priv']) . '" ' . frmvalide($selected_priv == $tab_profil['priv'], ' selected="selected"') . '>' . $tab_profil['name'] . '</option>';
44  }
45  return $output;
46 }
47 
63 function a_priv($requested_priv, $demo_allowed = false, $site_configuration_modification = false, $user_id = null)
64 {
65  if(empty($user_id)) {
66  if (isset($_SESSION) && isset($_SESSION['session_utilisateur']) && !empty($_SESSION['session_utilisateur']['priv'])) {
67  $user_priv = $_SESSION['session_utilisateur']['priv'];
68  }
69  } else {
70  $user_infos = get_user_information($user_id);
71  $user_priv = vb($user_infos['priv']);
72  }
73  if (!empty($user_priv)) {
74  if($site_configuration_modification && !empty($GLOBALS['site_parameters']['admin_configuration_only_by_user_ids']) && !in_array(vn($_SESSION['session_utilisateur']['id_utilisateur']), $GLOBALS['site_parameters']['admin_configuration_only_by_user_ids'])) {
75  // Des droits de modification de la configuration du site sont nécessaires et définis par une variable de configuration qui ne comprends pas dans sa liste l'id de l'utilisateur
76  return false;
77  }
78  if (strpos($requested_priv, ',') !== false) {
79  // On autorise plusieurs droits différents => récursif
80  $requested_priv_array = explode(',', $requested_priv);
81  $allowed = false;
82  foreach($requested_priv_array as $this_requested_priv) {
83  if (a_priv(trim($this_requested_priv), $demo_allowed)) {
84  $allowed = true;
85  }
86  }
87  return $allowed;
88  } elseif (strpos($requested_priv, '+') !== false) {
89  // On demande plusieurs droits => récursif
90  $requested_priv_array = explode('+', $requested_priv);
91  $not_allowed = false;
92  foreach($requested_priv_array as $this_requested_priv) {
93  if (!a_priv(trim($this_requested_priv), $demo_allowed)) {
94  $not_allowed = true;
95  }
96  }
97  return !$not_allowed;
98  } else {
99  $user_priv_array = explode('+', $user_priv);
100  foreach($user_priv_array as $this_user_priv) {
101  if (substr($requested_priv, 0, 5) == 'admin' && $this_user_priv == 'admin') {
102  // admin est un administrateur global qui a tous les droits de type admin*
103  return true;
104  } elseif ($demo_allowed && $this_user_priv == 'demo') {
105  // On a les droits demo qui sont autorisés
106  return true;
107  }
108  if (strpos($requested_priv, '*') !== false) {
109  // Pour admin*, tout droit du type admin ou admin_.... est autorisé
110  if (strpos($requested_priv, substr($this_user_priv, 0, strpos($requested_priv, '*'))) === 0) {
111  return true;
112  }
113  } elseif ($this_user_priv == $requested_priv) {
114  return true;
115  }
116  }
117  return false;
118  }
119  } else {
120  return null;
121  }
122 }
123 
134 function insere_utilisateur(&$frm, $password_already_encoded = false, $send_user_confirmation = false, $warn_admin_if_template_active = true, $skip_existing_account_tests = false)
135 {
136  $sql_condition_array = array();
137  // Si un compte a un privilège ci-dessous, et qu'un utilisateur veut créer un nouveau compte avec le même email, alors il est remplacé automatiquement par le nouveau compte
138  // Sinon, tout autre compte empêche la création d'un compte avec le même email, et la fonction renvoie l'id du compte déjà existant.
139  $user_low_priviledges_array = vb($GLOBALS['site_parameters']['user_low_priviledges_array'], array('load', 'newsletter'));
140  // L'inscription de certains utilisateurs nécessite d'être validée manuellement par l'administrateur. Le compte est désactivé en attendant la validation manuelle du compte.
141  $manual_validation_registration = vb($GLOBALS['site_parameters']['manual_validation_registration'], array());
142 
143  if (!empty($frm['priv'])) {
144  if(is_array($frm['priv'])) {
145  $frm['priv'] = implode('+', $frm['priv']);
146  }
147  } else {
148  if(!empty($GLOBALS['site_parameters']['user_creation_default_profile'])) {
149  // ce paramètre permet de définir un privilège utilisateur dès l'inscription en front-office, ou lorsqu'aucun privilège n'est demandé explicitement via l'administration
150  $allowed_profil = array();
151  $query = query("SELECT priv FROM peel_profil WHERE priv NOT LIKE 'admin%' AND " . get_filter_site_cond('profil') . "");
152  while($result = fetch_assoc($query)) {
153  // Création du tableau des privilèges provenant de la BDD, sans les privilèges admin pour éviter la création non controllée d'administrateur sur la boutique
154  $allowed_profil[] = $result['priv'];
155  }
156  if (in_array($GLOBALS['site_parameters']['user_creation_default_profile'], $allowed_profil)) {
157  $frm['priv'] = $GLOBALS['site_parameters']['user_creation_default_profile'];
158  } else {
159  // privilège par défaut
160  $frm['priv'] = 'util';
161  }
162  } else {
163  // privilège par défaut
164  $frm['priv'] = 'util';
165  }
166  }
167  if (!empty($frm['email'])) {
168  $sql_condition_array[] = "email='" . word_real_escape_string(vb($frm['email'])) . "'";
169  }
170  if (empty($GLOBALS['site_parameters']['pseudo_is_not_used']) && !empty($frm['pseudo'])) {
171  $sql_condition_array[] = "pseudo='" . nohtml_real_escape_string(vb($frm['pseudo'])) . "'";
172  }
173  if (!empty($sql_condition_array)) {
174  if (!empty($frm['priv']) && !in_array($frm['priv'], $user_low_priviledges_array)) {
175  // On veut créer un vrai compte
176  // Si cet utilisateur est déjà inscrit pour un téléchargement ou une newsletter, il faut supprimer l'enregistrement correspondant à son email pour permettre la création du nouveau compte
177  $sql = "SELECT id_utilisateur, priv
178  FROM peel_utilisateurs
179  WHERE (" . implode(' OR ', $sql_condition_array).") AND priv IN ('" . implode("', '", real_escape_string($user_low_priviledges_array)) . "') AND " . get_filter_site_cond('utilisateurs') . '';
180  $result = query($sql);
181  if ($user_already_exists_infos = fetch_assoc($result)) {
182  query("DELETE FROM peel_utilisateurs
183  WHERE id_utilisateur='" . intval($user_already_exists_infos['id_utilisateur']) . "' AND " . get_filter_site_cond('utilisateurs') . "");
184  }
185  }
186  if (!$skip_existing_account_tests) {
187  // On veut créer un compte normal, ou même newsletter ou load : n'importe quel type de compte
188  // On teste si l'utilisateur existe déjà (si ses droits étaient inférieurs, le compte existant déjà vient d'être supprimé ci-dessus)
189  $sql = "SELECT id_utilisateur
190  FROM peel_utilisateurs
191  WHERE (" . implode(' OR ', $sql_condition_array).") AND " . get_filter_site_cond('utilisateurs') . "";
192  $result = query($sql);
193  if ($user_already_exists_infos = fetch_assoc($result)) {
194  // L'utilisateur existe déjà, on donne son id
195  return $user_already_exists_infos['id_utilisateur'];
196  }
197  }
198  }
199  if (!isset($frm['remise_percent'])) {
200  $remise_percent = 0;
201  } else {
202  $remise_percent = (float)$frm['remise_percent'];
203  }
204  if (!empty($frm['mot_passe']) && $password_already_encoded) {
205  $password_hash = trim($frm['mot_passe']);
206  } elseif (!empty($frm['mot_passe'])) {
207  $password_hash = get_user_password_hash(trim($frm['mot_passe']));
208  } elseif(empty($frm['mot_passe']) && !empty($GLOBALS['site_parameters']['register_during_order_process'])) {
209  // Création d'un utilisateur lors du process de commande. Le mot de passe est envoyé à l'utilisateur
210  $frm['mot_passe'] = MDP();
211  $password_hash = get_user_password_hash($frm['mot_passe']);
212  } else {
213  // On crée un utilisateur qui ne pourra pas se connecter avant de demander un mot de passe
214  $password_hash = get_user_password_hash(MDP());
215  }
216  if (!empty($frm['date_insert'])) {
217  $date_insert = $frm['date_insert'];
218  } else {
219  $date_insert = date('Y-m-d H:i:s', time());
220  }
221  if (!empty($frm['date_update'])) {
222  $date_update = $frm['date_update'];
223  } else {
224  $date_update = date('Y-m-d H:i:s', time());
225  }
226  if (isset($frm['points'])) {
227  $points = $frm['points'];
228  } else {
229  $points = 0;
230  }
231 
232  if (in_array($frm['priv'], $manual_validation_registration)) {
233  // L'état d'activation par défaut lors de l'inscription d'un utilisateur dépend du statut. Pour les utilisateurs revendeur en attente, ou les affiliés en attente on ne souhaite pas qu'ils puissent se connecter à leur compte pendant le délai de validation. L'utilisateur est informé de ce fonctionnement via l'email qui a pour code technique "send_mail_for_account_creation_" . $priv (cf. à la fin de cette fonction)
234  $frm['etat'] = 0;
235  } elseif (!isset($frm['etat'])) {
236  // Par sécurité on fait ce test. On ne peut pas laisser le champs etat sans valeur.
237  $frm['etat'] = 1;
238  }
239  if(defined('IN_REGISTER')) {
240  $form_usage = 'user';
241  } elseif(check_if_module_active('reseller') && defined('IN_RETAILER')) {
242  $form_usage = 'reseller';
243  }
244  if(!empty($form_usage)) {
245  handle_specific_fields($frm, $form_usage);
246  }
247 
248  if(empty($frm['lang'])) {
249  $frm['lang'] = $_SESSION['session_langue'];
250  }
251  if(!isset($frm['site_id'])) {
252  $frm['site_id'] = $GLOBALS['site_id'];
253  }
254  if(!defined('PEEL_ADMIN')) {
255  if(!empty($GLOBALS['site_parameters']['devise_force_user_choices']) && check_if_module_active('devises')) {
256  $frm['devise'] = $_SESSION['session_devise'];
257  }
258  if(!empty($GLOBALS['site_parameters']['site_country_forced_by_user']) && !empty($GLOBALS['site_parameters']['site_country_allowed_array'])) {
259  if(in_array(strval(vb($frm['pays'])), $GLOBALS['site_parameters']['site_country_allowed_array'])) {
260  $frm['site_country'] = $frm['pays'];
261  } else {
262  $frm['site_country'] = $_SESSION['session_site_country'];
263  }
264  }
265  }
266  $sql = "INSERT INTO peel_utilisateurs (
267  date_insert
268  , date_update
269  , email
270  , mot_passe
271  , priv
272  , civilite
273  , prenom
274  , pseudo
275  , nom_famille
276  , telephone
277  , fax
278  , portable
279  , adresse
280  , code_postal
281  , ville
282  , pays
283  , newsletter
284  , commercial
285  , remise_percent
286  , points
287  , format
288  , societe
289  , intracom_for_billing
290  , siret
291  , ape
292  , code_banque
293  , code_guichet
294  , numero_compte
295  , cle_rib
296  , domiciliation
297  , iban
298  , bic
299  , url
300  , description
301  , avoir
302  , naissance
303  , id_groupe
304  , origin
305  , origin_other
306  , lang
307  , on_vacances
308  , on_vacances_date
309  , promo
310  " . (!empty($frm['id_categories'])?', id_categories':'') . "
311  " . (!empty($frm['id_cat_1'])?', id_cat_1':'') . "
312  " . (!empty($frm['id_cat_2'])?', id_cat_2':'') . "
313  " . (!empty($frm['id_cat_3'])?', id_cat_3':'') . "
314  , activity
315  , seg_who
316  , seg_want
317  , seg_think
318  , seg_followed
319  , seg_buy
320  , project_product_proposed
321  , project_date_forecasted
322  , commercial_contact_id
323  , type
324  , on_client_module
325  , on_photodesk
326  , site_id
327  , fonction
328  , etat
329  " . (!empty($frm['id_utilisateur'])?', id_utilisateur':'') . "
330  " . (!empty($frm['control_plus'])?', control_plus':'') . "
331  " . (!empty($frm['note_administrateur'])?', note_administrateur':'') . "
332  " . (isset($frm['logo'])?', logo':'') . "
333  " . (isset($frm['devise'])? ", devise":'') . "
334  " . (isset($frm['site_country'])? ", site_country":'') . "
335  , description_document
336  " . (!empty($frm['document'])? ", document " : "") . "
337  " . (!empty($frm['specific_field_values'])? ',' . implode(',', word_real_escape_string(array_keys($frm['specific_field_values']))) : "") . "
338  , message
339  , alerte
340  , address_bill_default
341  , address_ship_default
342  ) VALUES (
343  '" . nohtml_real_escape_string($date_insert) . "'
344  , '" . nohtml_real_escape_string($date_update) . "'
345  , '" . nohtml_real_escape_string(trim($frm['email'])) . "'
346  , '" . nohtml_real_escape_string($password_hash) . "'
347  , '" . nohtml_real_escape_string(vb($frm['priv'])) . "'
348  , '" . nohtml_real_escape_string(vb($frm['civilite'])) . "'
349  , '" . nohtml_real_escape_string(vb($frm['prenom'])) . "'
350  , '" . nohtml_real_escape_string(vb($frm['pseudo'])) . "'
351  , '" . nohtml_real_escape_string(vb($frm['nom_famille'])) . "'
352  , '" . nohtml_real_escape_string(vb($frm['telephone'])) . "'
353  , '" . nohtml_real_escape_string(vb($frm['fax'])) . "'
354  , '" . nohtml_real_escape_string(vb($frm['portable'])) . "'
355  , '" . nohtml_real_escape_string(vb($frm['adresse'])) . "'
356  , '" . nohtml_real_escape_string(vb($frm['code_postal'])) . "'
357  , '" . nohtml_real_escape_string(vb($frm['ville'])) . "'
358  , '" . intval(vn($frm['pays'])) . "'
359  , '" . intval(vn($frm['newsletter'])) . "'
360  , '" . intval(vn($frm['commercial'])) . "'
361  , '" . nohtml_real_escape_string(vb($remise_percent)) . "'
362  , '" . intval(vb($points)) . "'
363  , '" . nohtml_real_escape_string(vb($GLOBALS['site_parameters']['email_sending_format_default'], 'html')) . "'
364  , '" . nohtml_real_escape_string(vb($frm['societe'])) . "'
365  , '" . nohtml_real_escape_string(String::strtoupper(vb($frm['intracom_for_billing']))) . "'
366  , '" . nohtml_real_escape_string(vb($frm['siret'])) . "'
367  , '" . nohtml_real_escape_string(vb($frm['ape'])) . "'
368  , '" . nohtml_real_escape_string(vb($frm['code_banque'])) . "'
369  , '" . nohtml_real_escape_string(vb($frm['code_guichet'])) . "'
370  , '" . nohtml_real_escape_string(vb($frm['numero_compte'])) . "'
371  , '" . nohtml_real_escape_string(vb($frm['cle_rib'])) . "'
372  , '" . nohtml_real_escape_string(vb($frm['domiciliation'])) . "'
373  , '" . nohtml_real_escape_string(vb($frm['iban'])) . "'
374  , '" . nohtml_real_escape_string(vb($frm['bic'])) . "'
375  , '" . nohtml_real_escape_string(vb($frm['url'])) . "'
376  , '" . real_escape_string(vb($frm['description'])) . "'
377  , '" . nohtml_real_escape_string(vn($frm['avoir'])) . "'
379  , '" . nohtml_real_escape_string(vn($frm['id_groupe'])) . "'
380  , '" . nohtml_real_escape_string(vn($frm['origin'])) . "'
381  , '" . nohtml_real_escape_string(vb($frm['origin_other'])) . "'
382  , '" . nohtml_real_escape_string(vb($frm['lang'])) . "'
383  , '" . intval(vn($frm['on_vacances'])) . "'
384  , '" . nohtml_real_escape_string(get_mysql_date_from_user_input(vb($frm['on_vacances_date']))) . "'
385  , '" . nohtml_real_escape_string(vb($frm['promo_code'])) . "'
386  " . (!empty($frm['id_categories'])? ",'" . implode("','", $frm['id_categories']) : "") . "
387  " . (!empty($frm['id_cat_1'])? ', ' . intval(vn($frm['id_cat_1'])):'') . "
388  " . (!empty($frm['id_cat_2'])? ', ' . intval(vn($frm['id_cat_2'])):'') . "
389  " . (!empty($frm['id_cat_3'])? ', ' . intval(vn($frm['id_cat_3'])):'') . "
390  , '" . nohtml_real_escape_string(vb($frm['activity'])) . "'
391  , '" . nohtml_real_escape_string(vb($frm['seg_who'], 'no_info')) . "'
392  , '" . nohtml_real_escape_string(vb($frm['seg_want'], 'no_info')) . "'
393  , '" . nohtml_real_escape_string(vb($frm['seg_think'], 'no_info')) . "'
394  , '" . nohtml_real_escape_string(vb($frm['seg_followed'], 'no_info')) . "'
395  , '" . nohtml_real_escape_string(vb($frm['seg_buy'], 'no_info')) . "'
396  , '" . nohtml_real_escape_string(vb($frm['project_product_proposed'])) . "'
397  , '" . nohtml_real_escape_string(get_mysql_date_from_user_input(vb($frm['project_date_forecasted']))) . "'
398  , '" . intval(vn($frm['commercial_contact_id'])) . "'
399  , '" . nohtml_real_escape_string(vb($frm['type'])) . "'
400  , '" . intval(vn($frm['on_client_module'])) . "'
401  , '" . intval(vn($frm['on_photodesk'])) . "'
403  , '" . nohtml_real_escape_string(vb($frm['fonction'])) . "'
404  , '" . intval($frm['etat']) . "'
405  " . (!empty($frm['id_utilisateur'])?', ' . intval($frm['id_utilisateur']):'') . "
406  " . (!empty($frm['control_plus'])?', ' . intval($frm['control_plus']):'') . "
407  " . (!empty($frm['note_administrateur'])?', ' . intval($frm['note_administrateur']):'') . "
408  " . (isset($frm['logo'])?', "' . nohtml_real_escape_string(vb($frm['logo'])).'"':'') . "
409  " . (isset($frm['devise'])? ", '" . nohtml_real_escape_string($frm['devise']) . "'" : "") . "
410  " . (isset($frm['site_country'])? ", '" . nohtml_real_escape_string($frm['site_country']) . "'" : "") . "
411  , '" . nohtml_real_escape_string(vb($frm['description_document'])) . "'
412  " . (!empty($frm['document'])? ", '" . nohtml_real_escape_string(vb($frm['document'])) . "'" : "") . "
413  " . (!empty($frm['specific_field_values'])? ", '" . implode("','", real_escape_string($frm['specific_field_values'])) . "'" : "") . "
414  , ''
415  , ''
416  , 'original_address'
417  , 'original_address'
418  )";
419  $qid = query($sql);
420 
421  $frm['id'] = insert_id();
422  $code_client = "CLT" . date("Y") . $frm['id'];
423 
424  query("UPDATE peel_utilisateurs
425  SET code_client = '" . nohtml_real_escape_string($code_client) . "'
426  WHERE id_utilisateur = '" . intval($frm['id']) . "' AND " . get_filter_site_cond('utilisateurs') . "");
427 
428  if ($send_user_confirmation) {
429  // Envoi de l'email qui contient le mot de passe qui a été demandé ou créé automatiquement suivant que $frm['mot_passe'] était vide ou déjà rempli
430  send_mail_for_account_creation($frm['email'], $frm['mot_passe'], vb($frm['priv']));
431  }
432  if ($warn_admin_if_template_active) {
433  // Prévenir l'administrateur d'une création d'utilisateur
434  $qid = query("SELECT name_".$_SESSION['session_langue']." AS name
435  FROM `peel_profil`
436  WHERE priv = '" . nohtml_real_escape_string(vb($frm['priv'])) . "' AND " . get_filter_site_cond('profil') . "
437  LIMIT 0 , 30");
438  $qid = fetch_assoc($qid);
439  $custom_template_tags['PRIV'] = $qid['name'];
440  $custom_template_tags['CIVILITE'] = $frm['civilite'];
441  $custom_template_tags['PRENOM'] = $frm['prenom'];
442  $custom_template_tags['NOM_FAMILLE'] = $frm['nom_famille'];
443  $custom_template_tags['EMAIL'] = $frm['email'];
444  $custom_template_tags['DATE'] = get_formatted_date(time(), 'short', 'long');
445  $custom_template_tags['SOCIETE'] = $frm['societe'];
446  $custom_template_tags['TELEPHONE'] = $frm['telephone'];
447  $custom_template_tags['ADMIN_URL'] = $GLOBALS['administrer_url'] . '/utilisateurs.php?mode=modif&id_utilisateur=' . $frm['id'] . '&start=0';
448 
449  if ($frm['priv'] == 'stop') {
450  $template_technical_code = 'warn_admin_reve_subscription';
451  } else {
452  $template_technical_code = 'warn_admin_user_subscription';
453  }
454  send_email($GLOBALS['support_sav_client'], '', '', $template_technical_code, $custom_template_tags, null, $GLOBALS['support_sav_client']);
455  }
456  call_module_hook('user_create', $frm);
457  return $frm['id'];
458 }
459 
467 function maj_utilisateur(&$frm, $update_current_session = false)
468 {
469  if (empty($frm['id_utilisateur'])) {
470  return false;
471  }
472  if (isset($frm['priv'])) {
473  if(is_array($frm['priv'])) {
474  $priv = implode('+', $frm['priv']);
475  } else {
476  $priv = $frm['priv'];
477  }
478  }
479  if(!$update_current_session && !a_priv('admin', false, true)) {
480  if(a_priv('admin*', false, false, $frm['id_utilisateur'])) {
481  // L'utilisateur qu'on veut modifier est un administrateur et l'utilisateur loggué n'a pas le droit de le faire
482  return false;
483  } elseif(!empty($priv) && String::strpos($priv, 'admin') === 0) {
484  unset($priv);
485  }
486  }
487  if(check_if_module_active('reseller') && $frm['priv'] == 'reve') {
488  $form_usage = 'reseller';
489  }else{
490  $form_usage = 'user';
491  }
492  handle_specific_fields($frm, $form_usage);
493 
494  if(empty($frm['lang'])) {
495  $frm['lang'] = $_SESSION['session_langue'];
496  }
497  if(!isset($frm['site_id'])) {
498  // Si site_id n'est pas défini dans le formulaire, le site_id défini pour l'utilisateur est celui du site en cours de consultation, sauf pour les administrateurs multisite.
499  $this_user = get_user_information($frm['id_utilisateur']);
500  if (empty($this_user) || $this_user['site_id']>0) {
501  // si l'utilisateur est multisite, le champ site_id resera à 0 avec la fonction vn()
502  $frm['site_id'] = $GLOBALS['site_id'];
503  }
504  }
505  // MAJ du pseudo interdite pour les sites d'annonces en front office, pour éviter problèmes de traçabilité d'utilisateurs
506  $sql = "UPDATE peel_utilisateurs SET
507  civilite = '" . nohtml_real_escape_string(vb($frm['civilite'])) . "'
508  , prenom = '" . nohtml_real_escape_string($frm['prenom']) . "'
509  " . (isset($frm['pseudo']) && (!check_if_module_active('annonces') || (check_if_module_active('annonces') && !defined('IN_PEEL_ADMIN')))?", pseudo = '" . nohtml_real_escape_string($frm['pseudo']) . "'":"") . "
510  , nom_famille = '" . nohtml_real_escape_string($frm['nom_famille']) . "'
511  " . (isset($frm['societe'])?", societe = '" . nohtml_real_escape_string($frm['societe']) . "'":"") . "
512  , intracom_for_billing = '" . nohtml_real_escape_string(String::strtoupper(vb($frm['intracom_for_billing']))) . "'
513  " . (isset($frm['telephone'])?", telephone = '" . nohtml_real_escape_string(vb($frm['telephone'])) . "'":"") . "
514  " . (isset($frm['fax'])?", fax = '" . nohtml_real_escape_string(vb($frm['fax'])) . "'":"") . "
515  " . (isset($frm['portable'])?", portable = '" . nohtml_real_escape_string(vb($frm['portable'])) . "'":"") . "
516  " . (isset($frm['adresse'])?", adresse = '" . nohtml_real_escape_string($frm['adresse']) . "'":"") . "
517  " . (isset($frm['code_postal'])?", code_postal = '" . nohtml_real_escape_string($frm['code_postal']) . "'":"") . "
518  , ville = '" . nohtml_real_escape_string($frm['ville']) . "'
519  , pays = '" . intval($frm['pays']) . "'
520  , newsletter = '" . intval(vn($frm['newsletter'])) . "'
521  , commercial = '" . intval(vn($frm['commercial'])) . "'
522  , format = '" . nohtml_real_escape_string(vb($GLOBALS['site_parameters']['email_sending_format_default'], 'html')) . "'
523  , date_update = '" . date('Y-m-d H:i:s', time()) . "'
524  " . (!empty($frm['email'])?", email = '" . nohtml_real_escape_string($frm['email']) . "'":"") . "
525  " . (!empty($frm['email'])?", email_bounce = ''":"") . "
526  " . (!empty($frm['activity'])?", activity = '" . nohtml_real_escape_string($frm['activity']) . "'":"") . "
527  " . (isset($frm['etat'])?", etat = '" . nohtml_real_escape_string($frm['etat']) . "'":"") . "
528  " . (isset($frm['type'])?", type = '" . nohtml_real_escape_string($frm['type']) . "'":"") . "
529  " . (isset($frm['note_administrateur'])?", note_administrateur = '" . intval($frm['note_administrateur']) . "'":"") . "
530  " . (isset($frm['control_plus'])?", control_plus = '" . intval($frm['control_plus']) . "'":"") . "
531  " . (isset($frm['fonction'])?", fonction = '" . nohtml_real_escape_string($frm['fonction']) . "'":"") . "
532  " . (isset($frm['code_client'])?", code_client = '" . nohtml_real_escape_string($frm['code_client']) . "'":"") . "
533  " . (isset($priv)?", priv = '" . nohtml_real_escape_string($priv) . "'":"") . "
534  " . (isset($frm['remise_percent'])?", remise_percent = '" . nohtml_real_escape_string(floatval($frm['remise_percent'])) . "'":"") . "
535  " . (isset($frm['points'])?", points = '" . intval($frm['points']) . "'":"") . "
536  " . (isset($frm['siret'])?", siret = '" . nohtml_real_escape_string($frm['siret']) . "'":"") . "
537  " . (isset($frm['ape'])?", ape = '" . nohtml_real_escape_string($frm['ape']) . "'":"") . "
538  " . (isset($frm['code_banque'])?", code_banque = '" . nohtml_real_escape_string($frm['code_banque']) . "'":"") . "
539  " . (isset($frm['code_guichet'])?", code_guichet = '" . nohtml_real_escape_string($frm['code_guichet']) . "'":"") . "
540  " . (isset($frm['numero_compte'])?", numero_compte = '" . nohtml_real_escape_string($frm['numero_compte']) . "'":"") . "
541  " . (isset($frm['cle_rib'])?", cle_rib = '" . nohtml_real_escape_string($frm['cle_rib']) . "'":"") . "
542  " . (isset($frm['domiciliation'])?", domiciliation = '" . nohtml_real_escape_string($frm['domiciliation']) . "'":"") . "
543  " . (isset($frm['iban'])?", iban = '" . nohtml_real_escape_string($frm['iban']) . "'":"") . "
544  " . (isset($frm['bic'])?", bic = '" . nohtml_real_escape_string($frm['bic']) . "'":"") . "
545  " . (isset($frm['url'])?", url = '" . nohtml_real_escape_string($frm['url']) . "'":"") . "
546  " . (isset($frm['description'])?", description = '" . real_escape_string($frm['description']) . "'":"") . "
547  " . (isset($frm['avoir'])?", avoir = '" . nohtml_real_escape_string(vn($frm['avoir'])) . "'":"") . "
548  " . (isset($frm['naissance'])?", naissance = '" . nohtml_real_escape_string(get_mysql_date_from_user_input(vb($frm['naissance']))) . "'":"") . "
549  " . (isset($frm['on_vacances_date'])?", on_vacances_date = '" . nohtml_real_escape_string(get_mysql_date_from_user_input($frm['on_vacances_date'])) . "'":"") . "
550  , on_vacances = '" . intval(vn($frm['on_vacances'])) . "'
551  " . (isset($frm['id_groupe'])?", id_groupe = '" . intval(vn($frm['id_groupe'])) . "'":"") . "
552  , origin = '" . nohtml_real_escape_string(vb($frm['origin'])) . "'
553  , origin_other = '" . nohtml_real_escape_string(vb($frm['origin_other'])) . "'
554  , lang = '" . nohtml_real_escape_string(vb($frm['lang'])) . "'
555  , project_budget_ht = '" . nohtml_real_escape_string(vb($frm['project_budget_ht'])) . "'
556  , project_chances_estimated = '" . nohtml_real_escape_string(vb($frm['project_chances_estimated'])) . "'
557  " . (isset($frm['type'])?", type = '" . nohtml_real_escape_string(vb($frm['type'])) . "'":"") . "
558  , seg_who = '" . nohtml_real_escape_string(vb($frm['seg_who'])) . "'
559  , seg_want = '" . nohtml_real_escape_string(vb($frm['seg_want'])) . "'
560  , seg_think = '" . nohtml_real_escape_string(vb($frm['seg_think'])) . "'
561  , seg_followed = '" . nohtml_real_escape_string(vb($frm['seg_followed'])) . "'
562  , seg_buy = '" . nohtml_real_escape_string(vb($frm['seg_buy'])) . "'
563  , project_product_proposed = '" . nohtml_real_escape_string(vb($frm['project_product_proposed'])) . "'
564  , project_date_forecasted = '" . nohtml_real_escape_string(get_mysql_date_from_user_input(vb($frm['project_date_forecasted']))) . "'
565  " . (isset($frm['url'])?", url = '" . nohtml_real_escape_string(vb($frm['url'])) . "'":"") . "
566  " . (isset($frm['id_categories'])?", id_categories = '" . implode(',', nohtml_real_escape_string($frm['id_categories'])) . "'":"") . "
567  " . (isset($frm['id_cat_1'])?", id_cat_1 = '" . nohtml_real_escape_string(vb($frm['id_cat_1'])) . "'":"") . "
568  " . (isset($frm['id_cat_2'])?", id_cat_2 = '" . nohtml_real_escape_string(vb($frm['id_cat_2'])) . "'":"") . "
569  " . (isset($frm['id_cat_3'])?", id_cat_3 = '" . nohtml_real_escape_string(vb($frm['id_cat_3'])) . "'":"") . "
570  " . (isset($frm['commercial_contact_id'])?", commercial_contact_id = '" . intval(vn($frm['commercial_contact_id'])) . "'":"") . "
571  , on_client_module = '" . intval(vn($frm['on_client_module'])) . "'
572  , on_photodesk = '" . intval(vn($frm['on_photodesk'])) . "'
573  , site_id = '" . nohtml_real_escape_string(get_site_id_sql_set_value(vb($frm['site_id']))) . "'
574  , description_document = '" . nohtml_real_escape_string(vb($frm['description_document'])) . "'
575  " . (!empty($frm['document'])? ", document = '" . nohtml_real_escape_string($frm['document']) . "'" : "") . "
576  " . (isset($frm['logo'])? ", logo = '" . nohtml_real_escape_string($frm['logo']) . "'" : "") . "
577  " . (isset($frm['devise'])? ", devise = '" . nohtml_real_escape_string($frm['devise']) . "'" : "") . "
578  " . (isset($frm['site_country'])? ", site_country = '" . nohtml_real_escape_string($frm['site_country']) . "'" : "") . "
579  " . (check_if_module_active('maps')?", address_hash = ''" : "") . "
580  " . (!empty($frm['specific_field_sql_set'])? "," . implode(',', $frm['specific_field_sql_set']) : "") . "
581  WHERE id_utilisateur = '" . intval($frm['id_utilisateur']) . "'";
582  query($sql);
583 
584  if ($update_current_session) {
585  // Mise à jour de la session en cours
586  $requete = "SELECT *
587  FROM peel_utilisateurs
588  WHERE id_utilisateur = '" . intval($frm['id_utilisateur']) . "' AND " . get_filter_site_cond('utilisateurs') . "";
589  $qid = query($requete);
590  if($user_infos = fetch_assoc($qid)) {
591  $_SESSION['session_utilisateur']['pays'] = $user_infos['pays'];
592  $_SESSION['session_utilisateur']['civilite'] = vb($user_infos['civilite']);
593  $_SESSION['session_utilisateur']['prenom'] = $user_infos['prenom'];
594  $_SESSION['session_utilisateur']['pseudo'] = $user_infos['pseudo'];
595  $_SESSION['session_utilisateur']['nom_famille'] = $user_infos['nom_famille'];
596  $_SESSION['session_utilisateur']['societe'] = $user_infos['societe'];
597  $_SESSION['session_utilisateur']['intracom_for_billing'] = String::strtoupper(vb($user_infos['intracom_for_billing']));
598  $_SESSION['session_utilisateur']['telephone'] = $user_infos['telephone'];
599  $_SESSION['session_utilisateur']['fax'] = $user_infos['fax'];
600  $_SESSION['session_utilisateur']['portable'] = $user_infos['portable'];
601  $_SESSION['session_utilisateur']['adresse'] = $user_infos['adresse'];
602  $_SESSION['session_utilisateur']['code_postal'] = $user_infos['code_postal'];
603  $_SESSION['session_utilisateur']['ville'] = $user_infos['ville'];
604  $_SESSION['session_utilisateur']['newsletter'] = intval(vn($user_infos['newsletter']));
605  $_SESSION['session_utilisateur']['commercial'] = intval(vn($user_infos['commercial']));
606  $_SESSION['session_utilisateur']['format'] = vb($GLOBALS['site_parameters']['email_sending_format_default'], 'html');
607  }
608  }
609  if (!empty($frm['email'])) {
610  if (check_if_module_active('bounces')) {
611  include_once($GLOBALS['dirroot'] . "/modules/bounces/bounce_driver.php");
612  resolve_bounce($frm['id_utilisateur'], $frm['email']);
613  }
614  }
615  if (!empty($frm['comments'])) {
617  }
618  call_module_hook('user_update', $frm);
619  if (affected_rows()) {
620  return true;
621  } else {
622  return false;
623  }
624 }
625 
633 {
634  query("DELETE FROM peel_utilisateurs
635  WHERE id_utilisateur = '" . intval($id_utilisateur) . "' AND " . get_filter_site_cond('utilisateurs') . "");
636  call_module_hook('user_delete', array('id' => $id_utilisateur));
637 }
638 
645 function initialise_mot_passe($email)
646 {
647  // Chargement des infos de l'utilisateur
648  $qid = query("SELECT id_utilisateur, mot_passe
649  FROM peel_utilisateurs
650  WHERE email='" . nohtml_real_escape_string($email) . "' AND " . get_filter_site_cond('utilisateurs') . "");
651 
652  if ($utilisateur = fetch_assoc($qid)) {
653  $timestamp = time();
654  $hash = sha256($email . $timestamp . $utilisateur['id_utilisateur'] . $utilisateur['mot_passe']);
655 
656  $custom_template_tags['LINK'] = get_url('/utilisateurs/oubli_mot_passe.php', array('hash' => $hash, 'time' => $timestamp, 'email' => $email));
657  $custom_template_tags['SITE'] = $GLOBALS['site'];
658  $result = send_email($email, '', '', 'initialise_mot_passe', $custom_template_tags, null, $GLOBALS['support_sav_client']);
659  } else {
660  $result = null;
661  }
662  return $result;
663 }
664 
672 function maj_mot_passe($user_id, $nouveau_mot_passe)
673 {
674  query("UPDATE peel_utilisateurs
675  SET mot_passe = '" . get_user_password_hash($nouveau_mot_passe) . "', date_update='" . date('Y-m-d H:i:s', time()) . "'
676  WHERE id_utilisateur = '" . intval($user_id) . "' AND " . get_filter_site_cond('utilisateurs') . "");
677  if (affected_rows()) {
678  return true;
679  } else {
680  return false;
681  }
682 }
683 
694 function user_login_now($email_or_pseudo, $mot_passe, $check_password = true, $password_given_as_first_password_hash = false, $password_length_if_given_as_first_password_hash = null)
695 {
696  if (empty($_SESSION['session_login_tried'])) {
697  $_SESSION['session_login_tried'] = 0;
698  }
699  $_SESSION['session_login_tried']++;
700  if ($_SESSION['session_login_tried'] < 30) {
701  // Limitation à 30 tentatives de login dans la même session
702  $utilisateur = verifier_authentification(trim($email_or_pseudo), trim($mot_passe), null, $check_password, $password_given_as_first_password_hash, $password_length_if_given_as_first_password_hash);
703  if ($utilisateur) {
704  // On force la prochaine mise à jour des informations du compte utilisateur
705  unset($_SESSION['session_update_account']);
706 
707  $_SESSION['session_utilisateur'] = $utilisateur;
708  $_SESSION['session_ip'] = vb($_SERVER['REMOTE_ADDR']);
709  $_SESSION['session_url'] = $_SERVER['HTTP_HOST'];
710  if (!empty($_SESSION['session_caddie'])) {
711  $_SESSION['session_caddie']->update(get_current_user_promotion_percentage());
712  }
713  if (!empty($_SESSION['session_utilisateur']['pays'])) {
714  // Enregistrer la zone d'expedition de l'utilisateur
715  $sqlUserZone = 'SELECT zone
716  FROM peel_pays
717  WHERE id="' . intval($_SESSION['session_utilisateur']['pays']) . '" AND ' . get_filter_site_cond('pays') . '
718  LIMIT 1';
719  $resUserZone = query($sqlUserZone);
720  if ($Zone = fetch_assoc($resUserZone)) {
721  $_SESSION['session_utilisateur']['zoneId'] = $Zone['zone'];
722  }
723  }
724  if(a_priv('admin') && count(get_all_sites_name_array(false, false, true)) == 1) {
725  // Si l'utilisateur est un administrateur et qu'un seul site est configuré, on lui attribue les droits pour toutes les sites (0 et 1 dans ce cas)
726  $_SESSION['session_utilisateur']['site_id'] = 0;
727  }
728  if (!empty($_SESSION['session_utilisateur']['devise'])) {
729  set_current_devise($_SESSION['session_utilisateur']['devise']);
730  }
731  if (!empty($_SESSION['session_utilisateur']['site_country'])) {
732  // Définition de session_site_country à partir de l'information de la table utilisateurs, et non pas à partir de la géolocalisation IP
733  $_SESSION['session_site_country'] = intval($_SESSION['session_utilisateur']['site_country']);
734  }
735  if (a_priv('admin*')) {
736  // On met à jour les appels de clients dont l'heure de cloture n'est pas précisée
737  // NB : On pourrait faire cela par cron plutôt qu'ici, mais sans cron c'est plus facilement gérable
739  // On avertit le contact boutique du login d'un administrateur
740  $custom_template_tags['USER'] = $email_or_pseudo;
741  $custom_template_tags['REVERSE_DNS'] = gethostbyaddr(vb($_SERVER['REMOTE_ADDR']));
742  send_email($GLOBALS['support_sav_client'], '', '', 'admin_login', $custom_template_tags, null, $GLOBALS['support'], true, false, true, $GLOBALS['support']);
743  }
744  // On enregistre la connexion de l'utilisateur
745  if (!empty($_SESSION['session_utilisateur']['pseudo'])) {
746  $user_pseudo = $_SESSION['session_utilisateur']['pseudo'];
747  } else {
748  $user_pseudo = $_SESSION['session_utilisateur']['email'];
749  }
750 
751  query('INSERT INTO peel_utilisateur_connexions (user_id, user_login, user_ip, date, site_id)
752  VALUES (' . intval($_SESSION['session_utilisateur']['id_utilisateur']) . ', "' . nohtml_real_escape_string($user_pseudo) . '", "' . ip2long(ipget()) . '", "' . date('Y-m-d H:i:s', time()) . '", "' . nohtml_real_escape_string(get_site_id_sql_set_value($GLOBALS['site_id'])) . '")');
753 
754  $_SESSION['session_login_tried'] = 0;
755  }
756  if (!empty($GLOBALS['site_parameters']['redirect_user_after_login_by_priv'][$utilisateur['priv']])) {
757  // Redirection vers une url administrable après la connexion réussie d'un utilisateur.
758  redirect_and_die($GLOBALS['site_parameters']['redirect_user_after_login_by_priv'][$utilisateur['priv']]);
759  } else {
760  return $utilisateur;
761  }
762  } else {
763  return null;
764  }
765 }
766 
779 function verifier_authentification($email_or_pseudo, $mot_passe, $user_id = null, $check_password = true, $password_given_as_first_password_hash = false, $password_length_if_given_as_first_password_hash = null)
780 {
781  $get_table_field_names = get_table_field_names('peel_configuration');
782  if (!in_array('site_id', $get_table_field_names)) {
783  $GLOBALS['site_parameters']['multisite_disable'] = true;
784  $skip_state_test = true;
785  }
786 
787  $requete = "SELECT *
788  FROM peel_utilisateurs
789  WHERE " . (empty($skip_state_test)? "etat=1":"") . " AND " . get_filter_site_cond('utilisateurs') . " AND priv NOT IN ('".implode("','", $GLOBALS['disable_login_by_privilege'])."') AND ";
790  if (!empty($email_or_pseudo)) {
791  $requete .= "(email='" . nohtml_real_escape_string($email_or_pseudo) . "' OR pseudo ='" . nohtml_real_escape_string($email_or_pseudo) . "')";
792  } else {
793  $requete .= "id_utilisateur='" . intval($user_id) . "'";
794  }
795  $qid = query($requete);
796  $user_infos = fetch_assoc($qid);
797  if (!empty($user_infos) && (!$check_password || get_user_password_hash($mot_passe, $user_infos['mot_passe'], $password_given_as_first_password_hash, $password_length_if_given_as_first_password_hash))) {
798  if(!$check_password && String::strpos($user_infos['priv'], 'admin') === 0) {
799  // Utilisateur avec droits d'administration, loggué via processus simplifié => on désactive les droits d'administration
800  $user_infos['priv'] = 'util';
801  }
802  return $user_infos;
803  } else {
804  return false;
805  }
806 }
807 
817 function get_user_password_hash($password, $tested_hash = null, $password_given_as_first_password_hash = false, $password_length_if_given_as_first_password_hash = null)
818 {
819  if ($tested_hash == md5($password)) {
820  // Pour des raisons de compatibilité avec les données d'anciens sites PEEL dont version < 6.0, on teste aussi si le md5 fonctionne
821  // En termes de sécurité, cette compatibilité n'induit pas de faille particulière sur les nouveaux comptes, mais bien évidemment
822  // continuer à utiliser d'anciens mots de passe encodés ne permet pas de bénéficier de la sécurité accrue dans les version >=6.0.
823  return $tested_hash;
824  }
825  if (!$password_given_as_first_password_hash) {
826  // Création d'un premier hash du mot de passe
827  $first_password_hash = sha256(vb($GLOBALS['site_parameters']['sha256_encoding_salt']) . $password);
828  // set where salt will appear in hash
829  $salt_start = String::strlen($password);
830  } else {
831  $first_password_hash = $password;
832  $salt_start = $password_length_if_given_as_first_password_hash;
833  }
834  // if no salt given create random one
835  if ($tested_hash == null) {
836  $salt_hash = String::substr(sha256(vb($GLOBALS['site_parameters']['sha256_encoding_salt']) . uniqid(mt_rand(), true)), 0, 6);
837  } else {
838  $salt_hash = String::substr($tested_hash, 0, 6);
839  }
840  // add salt into text hash at pass length position and hash it
841  if ($salt_start > 0 && $salt_start < String::strlen($salt_hash)) {
842  $first_password_hash_start = String::substr($first_password_hash, 0, $salt_start);
843  $first_password_hash_end = String::substr($first_password_hash, $salt_start, strlen($salt_hash));
844  $hash_rough = sha256(vb($GLOBALS['site_parameters']['sha256_encoding_salt']) . $first_password_hash_end . $salt_hash . $first_password_hash_start);
845  } elseif ($salt_start > (strlen($salt_hash) - 1)) {
846  $hash_rough = sha256(vb($GLOBALS['site_parameters']['sha256_encoding_salt']) . $first_password_hash . $salt_hash);
847  } else {
848  $hash_rough = sha256(vb($GLOBALS['site_parameters']['sha256_encoding_salt']) . $salt_hash . $first_password_hash);
849  }
850  // put salt at front of hash
851  $password_hash = $salt_hash . String::substr($hash_rough, 0, 26);
852  if (empty($tested_hash) || $tested_hash == $password_hash) {
853  return $password_hash;
854  } else {
855  return false;
856  }
857 }
858 
867 function send_mail_for_account_creation($email, $mot_passe, $priv)
868 {
869  $custom_template_tags['EMAIL'] = $email;
870  $custom_template_tags['MOT_PASSE'] = $mot_passe;
871 
872  // Template d'email spécifique pour le profil d'utilisateur. Cet email est envoyé en plus de l'email d'inscription. L'email d'inscription contient les identifiants du compte.
873  $template_infos = getTextAndTitleFromEmailTemplateLang('send_mail_for_account_creation_'.$priv, $_SESSION['session_langue']);
874  if (!empty($template_infos) && (!empty($template_infos['subject']) || !empty($template_infos['text']))) {
875  // Le template d'email existe, il faut l'utiliser
876  send_email($email, $template_infos['subject'], $template_infos['text'], "", $custom_template_tags, null, $GLOBALS['support_sav_client']);
877  }
878 
879  // Il faut utiliser le template de création de compte standard.
880  $result = send_email($email, "", "", 'send_mail_for_account_creation', $custom_template_tags, null, $GLOBALS['support_sav_client']);
881  return $result;
882 }
883 
890 function getUsername($user_id)
891 {
892  if ($user_infos = get_user_information($user_id)) {
893  return $user_infos['prenom'] . ' ' . $user_infos['nom_famille'];
894  } else {
895  return null;
896  }
897 }
898 
906 function get_user_information($user_id = null, $get_full_infos = false)
907 {
908  static $result_array;
909  $sql_cond = '';
910  if ($user_id === null && est_identifie()) {
911  $user_id = $_SESSION['session_utilisateur']['id_utilisateur'];
912  } elseif (est_identifie() && a_priv('demo')) {
913  // Pas les droits pour voir les informations sur les administrateurs et les revendeurs
914  $sql_cond .= " AND priv NOT LIKE '%admin%' AND priv NOT LIKE '%reve%'";
915  }
916  $cache_id = md5($user_id.$sql_cond.($get_full_infos?'full':''));
917  if (!empty($user_id)) {
918  if (!isset($result_array[$cache_id])) {
919  $qid = query("SELECT *
920  FROM peel_utilisateurs
921  WHERE id_utilisateur = '" . intval($user_id) . "' AND " . get_filter_site_cond('utilisateurs') . "" . $sql_cond);
922  $result_array[$cache_id] = fetch_assoc($qid);
923  if(!empty($result_array[$cache_id]) && $get_full_infos) {
924  $hook_result = call_module_hook('user_get_information_full', array('id' => $user_id, 'etat' => $result_array[$cache_id]['etat']), 'array');
925  $result_array[$cache_id] = array_merge_recursive($result_array[$cache_id], $hook_result);
926  }
927  }
928  return $result_array[$cache_id];
929  } else {
930  return null;
931  }
932 }
933 
940 {
941  if(empty($_SESSION['session_utilisateur']['calculated_promotion_percentage'])) {
942  $hook_result_percent = call_module_hook('user_promotion_percentage', vb($_SESSION['session_utilisateur'], array()), 'max');
943  $user_specific_discount = vn($_SESSION['session_utilisateur']['remise_percent']);
944  if(!empty($GLOBALS['site_parameters']['group_and_user_discount_cumulate_disable'])) {
945  $_SESSION['session_utilisateur']['calculated_promotion_percentage'] = max($user_specific_discount, $hook_result_percent);
946  } else {
947  $_SESSION['session_utilisateur']['calculated_promotion_percentage'] = (1 - (1 - $user_specific_discount / 100) * (1 - $hook_result_percent / 100)) * 100;
948  }
949  }
950  return $_SESSION['session_utilisateur']['calculated_promotion_percentage'];
951 }
952 
959 function is_user_tva_intracom_for_no_vat($user_id = null)
960 {
961  if (empty($user_id) && est_identifie()) {
962  $user_id = $_SESSION['session_utilisateur']['id_utilisateur'];
963  }
964  if (!empty($user_id)) {
965  if ($user_infos = get_user_information($user_id)) {
966  // Pas de vérification trop stricte du numéro de TVA intracommunautaire pour éviter les problèmes liés à des formats différents
967  if (!empty($GLOBALS['site_parameters']['pays_exoneration_tva']) && String::strlen($GLOBALS['site_parameters']['pays_exoneration_tva'])==2 && !is_numeric(String::substr($user_infos['intracom_for_billing'], 0, 2)) && String::substr(String::strtoupper($user_infos['intracom_for_billing']), 0, 2) != $GLOBALS['site_parameters']['pays_exoneration_tva'] && String::strlen($user_infos['intracom_for_billing']) >= 7 && String::strlen(str_replace(' ', '', $user_infos['intracom_for_billing'])) <= 14) {
968  // Utilisateur avec un n° de TVA intracom, en Europe mais pas dans le pays de référence de la boutique dont le code ISO sur 2 chiffres est dans "pays_exoneration_tva"
969  return true;
970  }
971  }
972  }
973  return false;
974 }
975 
983 function get_priv_options($preselectionne, $return_mode = false)
984 {
985  $output = '';
986  $resProfil = query("SELECT *, name_".$_SESSION['session_langue']." AS name
987  FROM peel_profil
988  WHERE " . get_filter_site_cond('profil') . "");
989  $tpl = $GLOBALS['tplEngine']->createTemplate('priv_options.tpl');
990  $tpl_options = array();
991  if (num_rows($resProfil)) {
992  while ($Profil = fetch_assoc($resProfil)) {
993  $tpl_options[] = array(
994  'value' => $Profil['priv'],
995  'issel' => ($Profil['priv'] == $preselectionne),
996  'name' => $Profil['name']
997  );
998  }
999  }
1000  $tpl->assign('options', $tpl_options);
1001  $output .= $tpl->fetch();
1002 
1003  if ($return_mode) {
1004  return $output;
1005  } else {
1006  echo $output;
1007  }
1008 }
1009 
1016 function get_user_id_from_email($email)
1017 {
1018  // si la valeur est un bien un email, ont recherche l'id a partir de cet email
1019  if (EmailOK($email)) {
1020  $q = query('SELECT id_utilisateur
1021  FROM peel_utilisateurs
1022  WHERE email = "' . word_real_escape_string($email) . '" AND ' . get_filter_site_cond('utilisateurs') . '');
1023  if ($user = fetch_assoc($q)) {
1024  return $user['id_utilisateur'];
1025  } else {
1026  return false;
1027  }
1028  } else {
1029  return false;
1030  }
1031 }
1032 
1039 {
1040  // Returns an int on 4 bytes
1041  if (!empty($_SERVER['HTTP_USER_AGENT'])) {
1042  return base_convert(String::substr(md5($_SERVER['HTTP_USER_AGENT']), 9, 8), 16, 10);
1043  } else {
1044  return 0;
1045  }
1046 }
1047 
1058 function get_trader_select_options($selected_trader_name = null, $selected_trader_id = null, $option_value = 'name', $is_admin_mode = false, $display_inactive_trader = false)
1059 {
1060  $tpl = $GLOBALS['tplEngine']->createTemplate('trader_select_options.tpl');
1061  $tpl->assign('STR_NOT_ATTRIBUED', $GLOBALS['STR_NOT_ATTRIBUED']);
1062  $tpl->assign('is_admin_mode', $is_admin_mode);
1063  $sql_condition = '';
1064  if (empty($selected_trader_name) && empty($selected_trader_id)) {
1065  $selected_country_id = 0;
1066  }
1067  if (!$display_inactive_trader) {
1068  $sql_condition .= ' AND u.etat = "1"';
1069  }
1070  $sql_trader = 'SELECT u.id_utilisateur, u.nom_famille , u.prenom
1071  FROM peel_utilisateurs u
1072  WHERE u.priv LIKE "admin%" AND ' . get_filter_site_cond('utilisateurs', 'u') . ' ' . $sql_condition . '
1073  ORDER BY u.id_utilisateur';
1074  $res_trader = query($sql_trader);
1075  $tpl_options = array();
1076  while ($tab_trader = fetch_assoc($res_trader)) {
1077  if ($option_value == 'name') {
1078  $value = $tab_trader['prenom'] . ' ' . $tab_trader['nom_famille'];
1079  } elseif ($option_value == 'id') {
1080  $value = $tab_trader['id_utilisateur'];
1081  }
1082  $trader_name = $tab_trader['prenom'] . ' ' . $tab_trader['nom_famille'];
1083  $tpl_options[] = array(
1084  'value' => $value,
1085  'issel' => (vb($selected_trader_name) == $trader_name || vb($selected_trader_id) == $tab_trader['id_utilisateur']),
1086  'name' => $trader_name
1087  );
1088  }
1089  $tpl->assign('options', $tpl_options);
1090  return $tpl->fetch();
1091 }
1092 
1098 function account_update() {
1099  if ((!isset($_SESSION['session_update_account']) || $_SESSION['session_update_account'] < time()) || defined('IN_MESSAGING')) {
1100  // On met à jour les informations du compte toutes les minutes
1101  call_module_hook('account_update', array());
1102  $_SESSION['session_update_account'] = time() + vb($GLOBALS['site_parameters']['account_update_interval'], 60);
1103  }
1104 }
1105 
1116 function get_personal_address_form($id_utilisateur, $address_type = 'bill', $selected = null, $add_manage_choice = true, $css_style = null) {
1117  if(empty($id_utilisateur)) {
1118  return false;
1119  } else {
1120  $sql = 'SELECT id, nom
1121  FROM peel_adresses
1122  WHERE id_utilisateur="' . intval($id_utilisateur) . '" AND address_type IN ("","'.real_escape_string($address_type).'")';
1123  $q = query($sql);
1124  $output = '
1125  <select class="form-control" onchange="if(this.value){this.form.submit()}" name="personal_address_' . String::str_form_value($address_type) . '" style="' . $css_style. '">
1126  <option value="">' . $GLOBALS['STR_ADDRESS'] . '....</option>
1127  <option value="original_address"' . frmvalide($selected == 'original_address', ' selected="selected"') . '>' . $GLOBALS['STR_DEFAULT_ADDRESS'] . '</option>';
1128  while($result = fetch_assoc($q)) {
1129  $output .= '
1130  <option value="' . intval($result['id']) . '"' . frmvalide($selected == $result['id'], ' selected="selected"') . '>' . $result['nom'] . '</option>';
1131  }
1132  if($add_manage_choice) {
1133  $output .= '
1134  <option value="">-----</option>
1135  <option value="manage">' . $GLOBALS['STR_ADDRESS_TEXT'] . '</option>';
1136  }
1137  $output .= '
1138  </select>
1139 ';
1140 
1141  return $output;
1142  }
1143 }
1144 
1152  if(empty($_SESSION['session_utilisateur']['id_utilisateur'])) {
1153  return false;
1154  }
1155  if(!empty($frm['portable'])) {
1156  $tel = $frm['portable'];
1157  } elseif(!empty($frm['contact1'])) {
1158  $tel = $frm['contact1'];
1159  } else {
1160  $tel = null;
1161  }
1162  $set_sql = "civilite = '" . nohtml_real_escape_string(vb($frm['civilite'])) . "'
1163  , email = '" . nohtml_real_escape_string($frm['email']) . "'
1164  , nom = '" . nohtml_real_escape_string($frm['name_adresse']) . "'
1165  , prenom = '" . nohtml_real_escape_string($frm['prenom']) . "'
1166  , nom_famille = '" . nohtml_real_escape_string($frm['nom_famille']) . "'
1167  , societe = '" . nohtml_real_escape_string($frm['societe']) . "'
1168  , telephone = '" . nohtml_real_escape_string($tel) . "'
1169  , portable = '" . nohtml_real_escape_string($frm['portable']) . "'
1170  , adresse = '" . nohtml_real_escape_string($frm['adresse']) . "'
1171  , code_postal = '" . nohtml_real_escape_string($frm['code_postal']) . "'
1172  , ville = '" . nohtml_real_escape_string($frm['ville']) . "'
1173  ".(isset($frm['address_type'])?", address_type = '" . nohtml_real_escape_string($frm['address_type']) . "'":'')."
1174  , pays = '" . intval($frm['pays']) . "'
1175  , id_utilisateur = '" . intval($_SESSION['session_utilisateur']['id_utilisateur']) . "'";
1176  if (!empty($frm['id'])) {
1177  return query("UPDATE peel_adresses SET
1178  ".$set_sql."
1179  WHERE id = '" . intval(vn($frm['id'])) . "'");
1180  } else {
1181  return query("INSERT INTO peel_adresses SET
1182  ".$set_sql."");
1183  }
1184 }
get_profil_select_options($selected_priv=null)
get_profil_select_options()
Definition: user.php:34
static strtoupper($string)
Returns string with all alphabetic characters converted to uppercase.
Definition: String.php:154
getUserAgentHash()
Renvoie une trace du navigateur utilisé par un utilisateur pour faciliter les rapprochements entre co...
Definition: user.php:1038
if(!empty($GLOBALS['site_parameters']['order_specific_field_titles'])) if(check_if_module_active('socolissimo')&&!empty($_REQUEST)&&!empty($_REQUEST['PUDOFOID'])&&!empty($_REQUEST['CEEMAIL'])&&!empty($_REQUEST['SIGNATURE'])&&!empty($_REQUEST['ORDERID'])) elseif(!empty($_POST)) elseif(check_if_module_active('socolissimo')&&!empty($_SESSION['session_commande']['is_socolissimo_order'])) foreach(array('bill'=> 1, 'ship'=> 2) as $address_type=> $session_commande_address_id) $frm['societe1']
$result
get_trader_select_options($selected_trader_name=null, $selected_trader_id=null, $option_value= 'name', $is_admin_mode=false, $display_inactive_trader=false)
get_trader_select_options()
Definition: user.php:1058
get_user_information($user_id=null, $get_full_infos=false)
Chargement des détails de l'utilisateur.
Definition: user.php:906
get_personal_address_form($id_utilisateur, $address_type= 'bill', $selected=null, $add_manage_choice=true, $css_style=null)
Retourne le menu déroulant avec la lsite des adresses disponibles par utilisateur.
Definition: user.php:1116
static strpos($haystack, $needle, $offset=0)
Returns the numeric position of the first occurrence of needle in the haystack string.
Definition: String.php:54
is_user_tva_intracom_for_no_vat($user_id=null)
is_user_tva_intracom_for_no_vat()
Definition: user.php:959
get_priv_options($preselectionne, $return_mode=false)
get_priv_options()
Definition: user.php:983
initialise_mot_passe($email)
Initialise le renouvellement de mot de passe.
Definition: user.php:645
insere_utilisateur(&$frm, $password_already_encoded=false, $send_user_confirmation=false, $warn_admin_if_template_active=true, $skip_existing_account_tests=false)
Ajout d'un utilisateur.
Definition: user.php:134
redirect_and_die($url, $permanent_redirection=false, $avoid_loop=false)
Redirige vers l'URL demandée et arrête le programme.
Definition: fonctions.php:1551
handle_specific_fields(&$frm, $form_usage= 'user')
Traite la réception de champs spécifiques venant d'un formulaire, et l'identification de tous les cha...
Definition: fonctions.php:5286
affected_rows($database_object=null)
affected_rows()
Definition: database.php:356
word_real_escape_string($value)
Applique real_escape_string dans le cas où on n'insère qu'un seul mot, de moins de 30 caractères...
Definition: database.php:424
efface_utilisateur($id_utilisateur)
efface_utilisateur()
Definition: user.php:632
insert_id($database_object=null)
insert_id()
Definition: database.php:339
static strlen($string)
Returns the length of the given string.
Definition: String.php:36
nohtml_real_escape_string($value, $allowed_tags=null)
Protège les données pour insertion dans MySQL ET supprime les tags HTML pour protéger de toute sorte ...
Definition: database.php:400
if(!empty($_GET['id'])) if(isset($_POST['form_name'], $_POST['form_subject'], $_POST['form_text'], $_POST['form_lang'])&&empty($_GET['id'])) if(empty($_GET['id'])) $tpl
get_current_user_promotion_percentage()
Calcule la réduction générale applicable à un utilisateur et garde la valeur en session pour accélére...
Definition: user.php:939
real_escape_string($value)
real_escape_string()
Definition: database.php:374
$tpl_options
get_filter_site_cond($table_technical_code, $table_alias=null, $use_strict_rights_if_in_admin=false, $specific_site_id=null, $exclude_public_items=false, $admin_force_multisite_if_allowed=false)
Retourne la condition SQL permettant de filtrer les données pour une table.
Definition: fonctions.php:4643
get_user_id_from_email($email)
Fonction de recherche d'id utilisateur par l'email.
Definition: user.php:1016
query($query, $die_if_error=false, $database_object=null, $silent_if_error=false, $security_sql_filter=true)
The query() function is meant to be called anywhere you want to make a query.
Definition: database.php:158
if(!defined('IN_PEEL')) est_identifie()
Retourne true si l'utilisateur est identifié
Definition: user.php:23
static str_form_value($value, $flags=ENT_COMPAT)
Encode une chaine de caractères pour affichage dans un value="".
Definition: String.php:480
vb(&$var, $default=null)
Variable blanche if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:97
if(strlen($date2)== '10') if($type== 'users-by-age'&&a_priv('admin_users', true)) elseif($type== 'forums-count'&&a_priv('admin_content', true)) elseif($type== 'forums-categories'&&a_priv('admin_content', true)) elseif($type== 'users-count'&&a_priv('admin_users', true)) elseif($type== 'product-categories'&&a_priv('admin_products', true)) elseif($type== 'users-by-sex'&&a_priv('admin_users', true)) elseif($type== 'users-by-country'&&a_priv('admin_users', true)) elseif($type== 'sales'&&a_priv('admin_sales', true))
Definition: chart-data.php:160
get_user_password_hash($password, $tested_hash=null, $password_given_as_first_password_hash=false, $password_length_if_given_as_first_password_hash=null)
get_user_password_hash()
Definition: user.php:817
num_rows($query_result)
num_rows()
Definition: database.php:321
EmailOK($email)
Vérification du format d'adresse email trouvée sur http://www.phpinfo.net/?p=trucs&rub=astuces.
Definition: emails.php:282
if(!defined('IN_PEEL')) send_email($to, $mail_subject= '', $mail_content= '', $template_technical_code=null, $template_tags=null, $format=null, $sender=null, $html_add_structure=true, $html_correct_conformity=false, $html_convert_url_to_links=true, $reply_to=null, $attached_files_infos_array=null, $lang=null, $additional_infos_array=array(), $attachment_not_sent_by_email=false)
Envoi d'un email à un utilisateur.
Definition: emails.php:38
$priv
get_table_field_names($table_name, $link_identifier=null, $silent_if_error=false)
get_table_field_names()
Definition: database.php:495
updateTelContactNotClosed()
updateTelContactNotClosed()
Definition: fonctions.php:3756
fetch_assoc($query_result)
fetch_assoc()
Definition: database.php:283
call_module_hook($hook, $params, $mode= 'boolean')
Appelle la fonction correspondant au $hook pour chaque module installé La fonction doit s'appeler : [...
get_formatted_date($datetime_or_timestamp=null, $mode= 'short', $hour_minute=false)
Afficher une date formatée, en évitant les problèmes liés aux noms de mois sur les serveurs qui ne so...
Definition: format.php:440
create_or_update_comments($frm)
$id_utilisateur
Definition: rpc.php:32
set_current_devise($currency_id_or_code, $reference_country_id=null)
set_current_devise()
Definition: fonctions.php:50
$GLOBALS['page_columns_count']
get_mysql_date_from_user_input($string, $use_current_hour_min_sec_if_missing=false)
Transforme une date formattée par get_formatted_date() en date MySQL Si la date est vide...
Definition: format.php:496
get_all_sites_name_array($admin_force_multisite_if_allowed=false, $allow_null_site_id=false, $skip_rights_check=false)
Retourne un tableau des noms des sites configurés en fonction des droits de l'administrateur.
Definition: fonctions.php:4792
getTextAndTitleFromEmailTemplateLang($template_technical_code, $template_lang, $template_technical_id=null)
getTextAndTitleFromEmailTemplateLang()
Definition: emails.php:331
send_mail_for_account_creation($email, $mot_passe, $priv)
Envoi d'email lors de la création d'un utilisateur.
Definition: user.php:867
account_update()
Met à jour les informations de l'utilisateur connecté, telles que pour de la messagerie interne...
Definition: user.php:1098
vn(&$var, $default=0)
Variable nulle if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:110
getUsername($user_id)
getUsername()
Definition: user.php:890
get_site_id_sql_set_value($site_ids)
Retourne la valeur SQL d'un champ INT ou SET suivant que ce soit un entier ou un tableau.
Definition: fonctions.php:4747
a_priv($requested_priv, $demo_allowed=false, $site_configuration_modification=false, $user_id=null)
Renvoie true si l'utilisateur de la session a le privilège $requested_priv ou un droit supérieur Des ...
Definition: user.php:63
$hook_result
maj_utilisateur(&$frm, $update_current_session=false)
Mise à jour d'un enregistrement d'utilisateur.
Definition: user.php:467
MDP($chrs=8)
Fonction utilisée pour générer un mot aléatoire (sert par exemple pour le renommage des fichiers imag...
Definition: fonctions.php:49
verifier_authentification($email_or_pseudo, $mot_passe, $user_id=null, $check_password=true, $password_given_as_first_password_hash=false, $password_length_if_given_as_first_password_hash=null)
On renvoie un tableau contenant les informations utilisateur si l'email et le mot de passe sont bons...
Definition: user.php:779
user_login_now($email_or_pseudo, $mot_passe, $check_password=true, $password_given_as_first_password_hash=false, $password_length_if_given_as_first_password_hash=null)
user_login_now()
Definition: user.php:694
frmvalide($variable_to_test, $true_value= 'checked="checked"', $false_value="")
Affiche le mot "checked" si la variable est vraie sinon rien.
Definition: format.php:80
static substr($string, $start, $length=null)
Returns the portion of string specified by the start and length parameters.
Definition: String.php:112
maj_mot_passe($user_id, $nouveau_mot_passe)
Enregistre le nouveau mot de passe.
Definition: user.php:672
check_if_module_active($module_name, $specific_file_name=null)
Renvoie si un module est présent et activé ou non - Peut être appelé avant ou après le chargement d'u...
insert_or_update_address($frm)
Met à jour l'adresse en base de données.
Definition: user.php:1151
if(defined('IN_PEEL_ADMIN')||IN_INSTALLATION) $_SESSION['session_langue']

This documentation for Open ecommerce PEEL Shopping and PEEL.fr has been generated by Doxygen on Thu Oct 15 2015 14:31:25 - Peel ecommerce is a product of Agence web Advisto SAS. All rights reserved.