Artifact a70c8a8c5138bd07444b63a1ba0f5919e0b4fe88:


0000: 3c 3f 70 68 70 0a 0a 6e 61 6d 65 73 70 61 63 65  <?php..namespace
0010: 20 47 61 72 72 61 64 69 6e 5c 4d 65 6d 62 72 65   Garradin\Membre
0020: 73 3b 0a 0a 75 73 65 20 47 61 72 72 61 64 69 6e  s;..use Garradin
0030: 5c 43 6f 6e 66 69 67 3b 0a 75 73 65 20 47 61 72  \Config;.use Gar
0040: 72 61 64 69 6e 5c 44 42 3b 0a 75 73 65 20 47 61  radin\DB;.use Ga
0050: 72 72 61 64 69 6e 5c 55 74 69 6c 73 3b 0a 75 73  rradin\Utils;.us
0060: 65 20 47 61 72 72 61 64 69 6e 5c 4d 65 6d 62 72  e Garradin\Membr
0070: 65 73 3b 0a 75 73 65 20 47 61 72 72 61 64 69 6e  es;.use Garradin
0080: 5c 55 73 65 72 45 78 63 65 70 74 69 6f 6e 3b 0a  \UserException;.
0090: 0a 75 73 65 20 63 6f 6e 73 74 20 47 61 72 72 61  .use const Garra
00a0: 64 69 6e 5c 53 45 43 52 45 54 5f 4b 45 59 3b 0a  din\SECRET_KEY;.
00b0: 75 73 65 20 63 6f 6e 73 74 20 47 61 72 72 61 64  use const Garrad
00c0: 69 6e 5c 57 57 57 5f 55 52 4c 3b 0a 75 73 65 20  in\WWW_URL;.use 
00d0: 63 6f 6e 73 74 20 47 61 72 72 61 64 69 6e 5c 41  const Garradin\A
00e0: 44 4d 49 4e 5f 55 52 4c 3b 0a 0a 75 73 65 20 4b  DMIN_URL;..use K
00f0: 44 32 5c 53 65 63 75 72 69 74 79 3b 0a 75 73 65  D2\Security;.use
0100: 20 4b 44 32 5c 53 65 63 75 72 69 74 79 5f 4f 54   KD2\Security_OT
0110: 50 3b 0a 75 73 65 20 4b 44 32 5c 51 52 43 6f 64  P;.use KD2\QRCod
0120: 65 3b 0a 0a 63 6c 61 73 73 20 53 65 73 73 69 6f  e;..class Sessio
0130: 6e 20 65 78 74 65 6e 64 73 20 5c 4b 44 32 5c 55  n extends \KD2\U
0140: 73 65 72 53 65 73 73 69 6f 6e 0a 7b 0a 09 2f 2f  serSession.{..//
0150: 20 50 65 72 73 6f 6e 61 6c 69 73 61 74 69 6f 6e   Personalisation
0160: 20 64 65 20 6c 61 20 63 6f 6e 66 69 67 20 64 65   de la config de
0170: 20 55 73 65 72 53 65 73 73 69 6f 6e 0a 09 70 72   UserSession..pr
0180: 6f 74 65 63 74 65 64 20 24 63 6f 6f 6b 69 65 5f  otected $cookie_
0190: 6e 61 6d 65 20 3d 20 27 67 64 69 6e 27 3b 0a 09  name = 'gdin';..
01a0: 70 72 6f 74 65 63 74 65 64 20 24 72 65 6d 65 6d  protected $remem
01b0: 62 65 72 5f 6d 65 5f 63 6f 6f 6b 69 65 5f 6e 61  ber_me_cookie_na
01c0: 6d 65 20 3d 20 27 67 64 69 6e 70 27 3b 0a 09 70  me = 'gdinp';..p
01d0: 72 6f 74 65 63 74 65 64 20 24 72 65 6d 65 6d 62  rotected $rememb
01e0: 65 72 5f 6d 65 5f 65 78 70 69 72 79 20 3d 20 27  er_me_expiry = '
01f0: 2b 33 20 6d 6f 6e 74 68 73 27 3b 0a 0a 09 2f 2f  +3 months';...//
0200: 20 45 78 74 65 6e 73 69 6f 6e 20 64 65 73 20 6d   Extension des m
0210: c3 a9 74 68 6f 64 65 73 20 64 65 20 55 73 65 72  ..thodes de User
0220: 53 65 73 73 69 6f 6e 0a 09 70 75 62 6c 69 63 20  Session..public 
0230: 66 75 6e 63 74 69 6f 6e 20 5f 5f 63 6f 6e 73 74  function __const
0240: 72 75 63 74 28 29 0a 09 7b 0a 09 09 24 75 72 6c  ruct()..{...$url
0250: 20 3d 20 70 61 72 73 65 5f 75 72 6c 28 41 44 4d   = parse_url(ADM
0260: 49 4e 5f 55 52 4c 29 3b 0a 0a 09 09 70 61 72 65  IN_URL);....pare
0270: 6e 74 3a 3a 5f 5f 63 6f 6e 73 74 72 75 63 74 28  nt::__construct(
0280: 44 42 3a 3a 67 65 74 49 6e 73 74 61 6e 63 65 28  DB::getInstance(
0290: 29 2c 20 5b 0a 09 09 09 27 63 6f 6f 6b 69 65 5f  ), [....'cookie_
02a0: 64 6f 6d 61 69 6e 27 20 3d 3e 20 24 75 72 6c 5b  domain' => $url[
02b0: 27 68 6f 73 74 27 5d 2c 0a 09 09 09 27 63 6f 6f  'host'],....'coo
02c0: 6b 69 65 5f 70 61 74 68 27 20 20 20 3d 3e 20 70  kie_path'   => p
02d0: 72 65 67 5f 72 65 70 6c 61 63 65 28 27 21 2f 61  reg_replace('!/a
02e0: 64 6d 69 6e 2f 24 21 27 2c 20 27 2f 27 2c 20 24  dmin/$!', '/', $
02f0: 75 72 6c 5b 27 70 61 74 68 27 5d 29 2c 0a 09 09  url['path']),...
0300: 09 27 63 6f 6f 6b 69 65 5f 73 65 63 75 72 65 27  .'cookie_secure'
0310: 20 3d 3e 20 28 5c 47 61 72 72 61 64 69 6e 5c 50   => (\Garradin\P
0320: 52 45 46 45 52 5f 48 54 54 50 53 20 3e 3d 20 32  REFER_HTTPS >= 2
0330: 29 20 3f 20 74 72 75 65 20 3a 20 66 61 6c 73 65  ) ? true : false
0340: 2c 0a 09 09 5d 29 3b 0a 09 7d 0a 0a 09 70 72 6f  ,...]);..}...pro
0350: 74 65 63 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  tected function 
0360: 67 65 74 55 73 65 72 46 6f 72 4c 6f 67 69 6e 28  getUserForLogin(
0370: 24 6c 6f 67 69 6e 29 0a 09 7b 0a 09 09 24 63 68  $login)..{...$ch
0380: 61 6d 70 5f 69 64 20 3d 20 43 6f 6e 66 69 67 3a  amp_id = Config:
0390: 3a 67 65 74 49 6e 73 74 61 6e 63 65 28 29 2d 3e  :getInstance()->
03a0: 67 65 74 28 27 63 68 61 6d 70 5f 69 64 65 6e 74  get('champ_ident
03b0: 69 66 69 61 6e 74 27 29 3b 0a 0a 09 09 2f 2f 20  ifiant');....// 
03c0: 4e 65 20 72 65 6e 76 6f 69 65 20 75 6e 20 6d 65  Ne renvoie un me
03d0: 6d 62 72 65 20 71 75 65 20 73 69 20 63 65 6c 75  mbre que si celu
03e0: 69 2d 63 69 20 61 20 6c 65 20 64 72 6f 69 74 20  i-ci a le droit 
03f0: 64 65 20 73 65 20 63 6f 6e 6e 65 63 74 65 72 0a  de se connecter.
0400: 09 09 24 71 75 65 72 79 20 3d 20 27 53 45 4c 45  ..$query = 'SELE
0410: 43 54 20 6d 2e 69 64 2c 20 6d 2e 25 31 24 73 20  CT m.id, m.%1$s 
0420: 41 53 20 6c 6f 67 69 6e 2c 20 6d 2e 70 61 73 73  AS login, m.pass
0430: 65 20 41 53 20 70 61 73 73 77 6f 72 64 2c 20 6d  e AS password, m
0440: 2e 73 65 63 72 65 74 5f 6f 74 70 20 41 53 20 6f  .secret_otp AS o
0450: 74 70 5f 73 65 63 72 65 74 0a 09 09 09 46 52 4f  tp_secret....FRO
0460: 4d 20 6d 65 6d 62 72 65 73 20 41 53 20 6d 0a 09  M membres AS m..
0470: 09 09 49 4e 4e 45 52 20 4a 4f 49 4e 20 6d 65 6d  ..INNER JOIN mem
0480: 62 72 65 73 5f 63 61 74 65 67 6f 72 69 65 73 20  bres_categories 
0490: 41 53 20 6d 63 20 4f 4e 20 6d 63 2e 69 64 20 3d  AS mc ON mc.id =
04a0: 20 6d 2e 69 64 5f 63 61 74 65 67 6f 72 69 65 0a   m.id_categorie.
04b0: 09 09 09 57 48 45 52 45 20 6d 2e 25 31 24 73 20  ...WHERE m.%1$s 
04c0: 3d 20 3f 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41  = ? COLLATE NOCA
04d0: 53 45 20 41 4e 44 20 6d 63 2e 64 72 6f 69 74 5f  SE AND mc.droit_
04e0: 63 6f 6e 6e 65 78 69 6f 6e 20 3e 3d 20 25 32 24  connexion >= %2$
04f0: 64 0a 09 09 09 4c 49 4d 49 54 20 31 3b 27 3b 0a  d....LIMIT 1;';.
0500: 0a 09 09 24 71 75 65 72 79 20 3d 20 73 70 72 69  ...$query = spri
0510: 6e 74 66 28 24 71 75 65 72 79 2c 20 24 63 68 61  ntf($query, $cha
0520: 6d 70 5f 69 64 2c 20 4d 65 6d 62 72 65 73 3a 3a  mp_id, Membres::
0530: 44 52 4f 49 54 5f 41 43 43 45 53 29 3b 0a 0a 09  DROIT_ACCES);...
0540: 09 72 65 74 75 72 6e 20 24 74 68 69 73 2d 3e 64  .return $this->d
0550: 62 2d 3e 66 69 72 73 74 28 24 71 75 65 72 79 2c  b->first($query,
0560: 20 24 6c 6f 67 69 6e 29 3b 0a 09 7d 0a 0a 09 70   $login);..}...p
0570: 72 6f 74 65 63 74 65 64 20 66 75 6e 63 74 69 6f  rotected functio
0580: 6e 20 67 65 74 55 73 65 72 44 61 74 61 46 6f 72  n getUserDataFor
0590: 53 65 73 73 69 6f 6e 28 24 69 64 29 0a 09 7b 0a  Session($id)..{.
05a0: 09 09 2f 2f 20 4d 65 74 74 72 65 20 c3 a0 20 6a  ..// Mettre .. j
05b0: 6f 75 72 20 6c 61 20 64 61 74 65 20 64 65 20 63  our la date de c
05c0: 6f 6e 6e 65 78 69 6f 6e 0a 09 09 24 74 68 69 73  onnexion...$this
05d0: 2d 3e 64 62 2d 3e 70 72 65 70 61 72 65 64 51 75  ->db->preparedQu
05e0: 65 72 79 28 27 55 50 44 41 54 45 20 6d 65 6d 62  ery('UPDATE memb
05f0: 72 65 73 20 53 45 54 20 64 61 74 65 5f 63 6f 6e  res SET date_con
0600: 6e 65 78 69 6f 6e 20 3d 20 64 61 74 65 74 69 6d  nexion = datetim
0610: 65 28 29 20 57 48 45 52 45 20 69 64 20 3d 20 3f  e() WHERE id = ?
0620: 3b 27 2c 20 5b 24 69 64 5d 29 3b 0a 0a 09 09 72  ;', [$id]);....r
0630: 65 74 75 72 6e 20 24 74 68 69 73 2d 3e 64 62 2d  eturn $this->db-
0640: 3e 66 69 72 73 74 28 27 53 45 4c 45 43 54 20 6d  >first('SELECT m
0650: 2e 2a 2c 20 63 2e 64 72 6f 69 74 5f 63 6f 6e 6e  .*, c.droit_conn
0660: 65 78 69 6f 6e 2c 20 63 2e 64 72 6f 69 74 5f 77  exion, c.droit_w
0670: 69 6b 69 2c 20 0a 09 09 09 63 2e 64 72 6f 69 74  iki, ....c.droit
0680: 5f 6d 65 6d 62 72 65 73 2c 20 63 2e 64 72 6f 69  _membres, c.droi
0690: 74 5f 63 6f 6d 70 74 61 2c 20 63 2e 64 72 6f 69  t_compta, c.droi
06a0: 74 5f 63 6f 6e 66 69 67 2c 20 63 2e 64 72 6f 69  t_config, c.droi
06b0: 74 5f 6d 65 6d 62 72 65 73 0a 09 09 09 46 52 4f  t_membres....FRO
06c0: 4d 20 6d 65 6d 62 72 65 73 20 41 53 20 6d 0a 09  M membres AS m..
06d0: 09 09 49 4e 4e 45 52 20 4a 4f 49 4e 20 6d 65 6d  ..INNER JOIN mem
06e0: 62 72 65 73 5f 63 61 74 65 67 6f 72 69 65 73 20  bres_categories 
06f0: 41 53 20 63 20 4f 4e 20 6d 2e 69 64 5f 63 61 74  AS c ON m.id_cat
0700: 65 67 6f 72 69 65 20 3d 20 63 2e 69 64 0a 09 09  egorie = c.id...
0710: 09 57 48 45 52 45 20 6d 2e 69 64 20 3d 20 3f 20  .WHERE m.id = ? 
0720: 4c 49 4d 49 54 20 31 3b 27 2c 20 24 69 64 29 3b  LIMIT 1;', $id);
0730: 0a 09 7d 0a 0a 09 70 72 6f 74 65 63 74 65 64 20  ..}...protected 
0740: 66 75 6e 63 74 69 6f 6e 20 73 74 6f 72 65 52 65  function storeRe
0750: 6d 65 6d 62 65 72 4d 65 53 65 6c 65 63 74 6f 72  memberMeSelector
0760: 28 24 73 65 6c 65 63 74 6f 72 2c 20 24 68 61 73  ($selector, $has
0770: 68 2c 20 24 65 78 70 69 72 79 2c 20 24 75 73 65  h, $expiry, $use
0780: 72 5f 69 64 29 0a 09 7b 0a 09 09 72 65 74 75 72  r_id)..{...retur
0790: 6e 20 24 74 68 69 73 2d 3e 64 62 2d 3e 69 6e 73  n $this->db->ins
07a0: 65 72 74 28 27 6d 65 6d 62 72 65 73 5f 73 65 73  ert('membres_ses
07b0: 73 69 6f 6e 73 27 2c 20 5b 0a 09 09 09 27 73 65  sions', [....'se
07c0: 6c 65 63 74 65 75 72 27 20 3d 3e 20 24 73 65 6c  lecteur' => $sel
07d0: 65 63 74 6f 72 2c 0a 09 09 09 27 68 61 73 68 27  ector,....'hash'
07e0: 20 20 20 20 20 20 3d 3e 20 24 68 61 73 68 2c 0a        => $hash,.
07f0: 09 09 09 27 65 78 70 69 72 65 27 20 20 20 20 3d  ...'expire'    =
0800: 3e 20 24 65 78 70 69 72 79 2c 0a 09 09 09 27 69  > $expiry,....'i
0810: 64 5f 6d 65 6d 62 72 65 27 20 3d 3e 20 24 75 73  d_membre' => $us
0820: 65 72 5f 69 64 2c 0a 09 09 5d 29 3b 0a 09 7d 0a  er_id,...]);..}.
0830: 0a 09 70 72 6f 74 65 63 74 65 64 20 66 75 6e 63  ..protected func
0840: 74 69 6f 6e 20 65 78 70 69 72 65 52 65 6d 65 6d  tion expireRemem
0850: 62 65 72 4d 65 53 65 6c 65 63 74 6f 72 73 28 29  berMeSelectors()
0860: 0a 09 7b 0a 09 09 72 65 74 75 72 6e 20 24 74 68  ..{...return $th
0870: 69 73 2d 3e 64 62 2d 3e 64 65 6c 65 74 65 28 27  is->db->delete('
0880: 6d 65 6d 62 72 65 73 5f 73 65 73 73 69 6f 6e 73  membres_sessions
0890: 27 2c 20 24 74 68 69 73 2d 3e 64 62 2d 3e 77 68  ', $this->db->wh
08a0: 65 72 65 28 27 65 78 70 69 72 65 27 2c 20 27 3c  ere('expire', '<
08b0: 27 2c 20 74 69 6d 65 28 29 29 29 3b 0a 09 7d 0a  ', time()));..}.
08c0: 0a 09 70 72 6f 74 65 63 74 65 64 20 66 75 6e 63  ..protected func
08d0: 74 69 6f 6e 20 67 65 74 52 65 6d 65 6d 62 65 72  tion getRemember
08e0: 4d 65 53 65 6c 65 63 74 6f 72 28 24 73 65 6c 65  MeSelector($sele
08f0: 63 74 6f 72 29 0a 09 7b 0a 09 09 72 65 74 75 72  ctor)..{...retur
0900: 6e 20 24 74 68 69 73 2d 3e 64 62 2d 3e 66 69 72  n $this->db->fir
0910: 73 74 28 27 53 45 4c 45 43 54 20 73 65 6c 65 63  st('SELECT selec
0920: 74 65 75 72 20 41 53 20 73 65 6c 65 63 74 6f 72  teur AS selector
0930: 2c 20 68 61 73 68 2c 0a 09 09 09 69 64 5f 6d 65  , hash,....id_me
0940: 6d 62 72 65 20 41 53 20 75 73 65 72 5f 69 64 2c  mbre AS user_id,
0950: 20 6d 2e 70 61 73 73 65 20 41 53 20 75 73 65 72   m.passe AS user
0960: 5f 70 61 73 73 77 6f 72 64 2c 20 65 78 70 69 72  _password, expir
0970: 65 20 41 53 20 65 78 70 69 72 79 0a 09 09 09 46  e AS expiry....F
0980: 52 4f 4d 20 6d 65 6d 62 72 65 73 5f 73 65 73 73  ROM membres_sess
0990: 69 6f 6e 73 20 41 53 20 73 0a 09 09 09 49 4e 4e  ions AS s....INN
09a0: 45 52 20 4a 4f 49 4e 20 6d 65 6d 62 72 65 73 20  ER JOIN membres 
09b0: 41 53 20 6d 20 4f 4e 20 6d 2e 69 64 20 3d 20 73  AS m ON m.id = s
09c0: 2e 69 64 5f 6d 65 6d 62 72 65 0a 09 09 09 57 48  .id_membre....WH
09d0: 45 52 45 20 73 2e 73 65 6c 65 63 74 65 75 72 20  ERE s.selecteur 
09e0: 3d 20 3f 20 4c 49 4d 49 54 20 31 3b 27 2c 20 24  = ? LIMIT 1;', $
09f0: 73 65 6c 65 63 74 6f 72 29 3b 0a 09 7d 0a 0a 09  selector);..}...
0a00: 70 72 6f 74 65 63 74 65 64 20 66 75 6e 63 74 69  protected functi
0a10: 6f 6e 20 64 65 6c 65 74 65 52 65 6d 65 6d 62 65  on deleteRemembe
0a20: 72 4d 65 53 65 6c 65 63 74 6f 72 28 24 73 65 6c  rMeSelector($sel
0a30: 65 63 74 6f 72 29 0a 09 7b 0a 09 09 72 65 74 75  ector)..{...retu
0a40: 72 6e 20 24 74 68 69 73 2d 3e 64 62 2d 3e 64 65  rn $this->db->de
0a50: 6c 65 74 65 28 27 6d 65 6d 62 72 65 73 5f 73 65  lete('membres_se
0a60: 73 73 69 6f 6e 73 27 2c 20 24 74 68 69 73 2d 3e  ssions', $this->
0a70: 64 62 2d 3e 77 68 65 72 65 28 27 73 65 6c 65 63  db->where('selec
0a80: 74 65 75 72 27 2c 20 24 73 65 6c 65 63 74 6f 72  teur', $selector
0a90: 29 29 3b 0a 09 7d 0a 0a 09 70 72 6f 74 65 63 74  ));..}...protect
0aa0: 65 64 20 66 75 6e 63 74 69 6f 6e 20 64 65 6c 65  ed function dele
0ab0: 74 65 41 6c 6c 52 65 6d 65 6d 62 65 72 4d 65 53  teAllRememberMeS
0ac0: 65 6c 65 63 74 6f 72 73 28 24 75 73 65 72 5f 69  electors($user_i
0ad0: 64 29 0a 09 7b 0a 09 09 72 65 74 75 72 6e 20 24  d)..{...return $
0ae0: 74 68 69 73 2d 3e 64 62 2d 3e 64 65 6c 65 74 65  this->db->delete
0af0: 28 27 6d 65 6d 62 72 65 73 5f 73 65 73 73 69 6f  ('membres_sessio
0b00: 6e 73 27 2c 20 24 74 68 69 73 2d 3e 64 62 2d 3e  ns', $this->db->
0b10: 77 68 65 72 65 28 27 69 64 5f 6d 65 6d 62 72 65  where('id_membre
0b20: 27 2c 20 24 75 73 65 72 5f 69 64 29 29 3b 0a 09  ', $user_id));..
0b30: 7d 0a 0a 09 2f 2f 20 41 6a 6f 75 74 20 64 65 20  }...// Ajout de 
0b40: 6c 61 20 67 65 73 74 69 6f 6e 20 64 65 20 4c 4f  la gestion de LO
0b50: 43 41 4c 5f 4c 4f 47 49 4e 0a 09 70 75 62 6c 69  CAL_LOGIN..publi
0b60: 63 20 66 75 6e 63 74 69 6f 6e 20 69 73 4c 6f 67  c function isLog
0b70: 67 65 64 28 29 0a 09 7b 0a 09 09 69 66 20 28 65  ged()..{...if (e
0b80: 6d 70 74 79 28 24 5f 53 45 53 53 49 4f 4e 5b 27  mpty($_SESSION['
0b90: 75 73 65 72 27 5d 29 20 26 26 20 64 65 66 69 6e  user']) && defin
0ba0: 65 64 28 27 5c 47 61 72 72 61 64 69 6e 5c 4c 4f  ed('\Garradin\LO
0bb0: 43 41 4c 5f 4c 4f 47 49 4e 27 29 0a 09 09 09 26  CAL_LOGIN')....&
0bc0: 26 20 69 73 5f 69 6e 74 28 5c 47 61 72 72 61 64  & is_int(\Garrad
0bd0: 69 6e 5c 4c 4f 43 41 4c 5f 4c 4f 47 49 4e 29 20  in\LOCAL_LOGIN) 
0be0: 26 26 20 5c 47 61 72 72 61 64 69 6e 5c 4c 4f 43  && \Garradin\LOC
0bf0: 41 4c 5f 4c 4f 47 49 4e 20 3e 20 30 29 0a 09 09  AL_LOGIN > 0)...
0c00: 7b 0a 09 09 09 24 74 68 69 73 2d 3e 63 72 65 61  {....$this->crea
0c10: 74 65 28 5c 47 61 72 72 61 64 69 6e 5c 4c 4f 43  te(\Garradin\LOC
0c20: 41 4c 5f 4c 4f 47 49 4e 29 3b 0a 09 09 7d 0a 0a  AL_LOGIN);...}..
0c30: 09 09 72 65 74 75 72 6e 20 70 61 72 65 6e 74 3a  ..return parent:
0c40: 3a 69 73 4c 6f 67 67 65 64 28 29 3b 0a 09 7d 0a  :isLogged();..}.
0c50: 0a 09 2f 2f 20 49 63 69 20 63 68 65 63 6b 4f 54  ..// Ici checkOT
0c60: 50 20 75 74 69 6c 69 73 65 20 4e 54 50 20 65 6e  P utilise NTP en
0c70: 20 73 65 63 6f 6e 64 20 72 65 63 6f 75 72 73 0a   second recours.
0c80: 09 70 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e  .public function
0c90: 20 63 68 65 63 6b 4f 54 50 28 24 73 65 63 72 65   checkOTP($secre
0ca0: 74 2c 20 24 63 6f 64 65 29 0a 09 7b 0a 09 09 69  t, $code)..{...i
0cb0: 66 20 28 21 53 65 63 75 72 69 74 79 5f 4f 54 50  f (!Security_OTP
0cc0: 3a 3a 54 4f 54 50 28 24 73 65 63 72 65 74 2c 20  ::TOTP($secret, 
0cd0: 24 63 6f 64 65 29 29 0a 09 09 7b 0a 09 09 09 2f  $code))...{..../
0ce0: 2f 20 56 c3 a9 72 69 66 69 65 72 20 65 6e 63 6f  / V..rifier enco
0cf0: 72 65 2c 20 6d 61 69 73 20 61 76 65 63 20 6c 65  re, mais avec le
0d00: 20 74 65 6d 70 73 20 4e 54 50 0a 09 09 09 2f 2f   temps NTP....//
0d10: 20 61 75 20 63 61 73 20 6f c3 b9 20 6c 27 68 6f   au cas o.. l'ho
0d20: 72 6c 6f 67 65 20 64 75 20 73 65 72 76 65 75 72  rloge du serveur
0d30: 20 6e 27 65 73 74 20 70 61 73 20 c3 a0 20 6c 27   n'est pas .. l'
0d40: 68 65 75 72 65 0a 09 09 09 24 74 69 6d 65 20 3d  heure....$time =
0d50: 20 53 65 63 75 72 69 74 79 5f 4f 54 50 3a 3a 67   Security_OTP::g
0d60: 65 74 54 69 6d 65 46 72 6f 6d 4e 54 50 28 5c 47  etTimeFromNTP(\G
0d70: 61 72 72 61 64 69 6e 5c 4e 54 50 5f 53 45 52 56  arradin\NTP_SERV
0d80: 45 52 29 3b 0a 0a 09 09 09 69 66 20 28 21 53 65  ER);.....if (!Se
0d90: 63 75 72 69 74 79 5f 4f 54 50 3a 3a 54 4f 54 50  curity_OTP::TOTP
0da0: 28 24 73 65 63 72 65 74 2c 20 24 63 6f 64 65 2c  ($secret, $code,
0db0: 20 24 74 69 6d 65 29 29 0a 09 09 09 7b 0a 09 09   $time))....{...
0dc0: 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a  ..return false;.
0dd0: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
0de0: 72 6e 20 74 72 75 65 3b 0a 09 7d 0a 0a 09 70 75  rn true;..}...pu
0df0: 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20 67 65  blic function ge
0e00: 74 4f 54 50 53 65 63 72 65 74 28 24 73 65 63 72  tOTPSecret($secr
0e10: 65 74 20 3d 20 6e 75 6c 6c 29 0a 09 7b 0a 09 09  et = null)..{...
0e20: 69 66 20 28 21 24 73 65 63 72 65 74 29 0a 09 09  if (!$secret)...
0e30: 7b 0a 09 09 09 24 73 65 63 72 65 74 20 3d 20 53  {....$secret = S
0e40: 65 63 75 72 69 74 79 5f 4f 54 50 3a 3a 67 65 74  ecurity_OTP::get
0e50: 52 61 6e 64 6f 6d 53 65 63 72 65 74 28 29 3b 0a  RandomSecret();.
0e60: 09 09 7d 0a 0a 09 09 24 6f 75 74 20 3d 20 5b 5d  ..}....$out = []
0e70: 3b 0a 09 09 24 6f 75 74 5b 27 73 65 63 72 65 74  ;...$out['secret
0e80: 27 5d 20 3d 20 24 73 65 63 72 65 74 3b 0a 09 09  '] = $secret;...
0e90: 24 6f 75 74 5b 27 73 65 63 72 65 74 5f 64 69 73  $out['secret_dis
0ea0: 70 6c 61 79 27 5d 20 3d 20 69 6d 70 6c 6f 64 65  play'] = implode
0eb0: 28 27 20 27 2c 20 73 74 72 5f 73 70 6c 69 74 28  (' ', str_split(
0ec0: 24 73 65 63 72 65 74 2c 20 34 29 29 3b 0a 09 09  $secret, 4));...
0ed0: 24 6f 75 74 5b 27 75 72 6c 27 5d 20 3d 20 53 65  $out['url'] = Se
0ee0: 63 75 72 69 74 79 5f 4f 54 50 3a 3a 67 65 74 4f  curity_OTP::getO
0ef0: 54 50 41 75 74 68 55 52 4c 28 43 6f 6e 66 69 67  TPAuthURL(Config
0f00: 3a 3a 67 65 74 49 6e 73 74 61 6e 63 65 28 29 2d  ::getInstance()-
0f10: 3e 67 65 74 28 27 6e 6f 6d 5f 61 73 73 6f 27 29  >get('nom_asso')
0f20: 2c 20 24 73 65 63 72 65 74 29 3b 0a 09 0a 09 09  , $secret);.....
0f30: 24 71 72 63 6f 64 65 20 3d 20 6e 65 77 20 51 52  $qrcode = new QR
0f40: 43 6f 64 65 28 24 6f 75 74 5b 27 75 72 6c 27 5d  Code($out['url']
0f50: 29 3b 0a 09 09 24 6f 75 74 5b 27 71 72 63 6f 64  );...$out['qrcod
0f60: 65 27 5d 20 3d 20 27 64 61 74 61 3a 69 6d 61 67  e'] = 'data:imag
0f70: 65 2f 73 76 67 2b 78 6d 6c 3b 62 61 73 65 36 34  e/svg+xml;base64
0f80: 2c 27 20 2e 20 62 61 73 65 36 34 5f 65 6e 63 6f  ,' . base64_enco
0f90: 64 65 28 24 71 72 63 6f 64 65 2d 3e 74 6f 53 56  de($qrcode->toSV
0fa0: 47 28 29 29 3b 0a 0a 09 09 72 65 74 75 72 6e 20  G());....return 
0fb0: 24 6f 75 74 3b 0a 09 7d 0a 0a 09 73 74 61 74 69  $out;..}...stati
0fc0: 63 20 70 75 62 6c 69 63 20 66 75 6e 63 74 69 6f  c public functio
0fd0: 6e 20 72 65 63 6f 76 65 72 50 61 73 73 77 6f 72  n recoverPasswor
0fe0: 64 43 68 65 63 6b 28 24 69 64 29 0a 09 7b 0a 09  dCheck($id)..{..
0ff0: 09 24 64 62 20 3d 20 44 42 3a 3a 67 65 74 49 6e  .$db = DB::getIn
1000: 73 74 61 6e 63 65 28 29 3b 0a 09 09 24 63 6f 6e  stance();...$con
1010: 66 69 67 20 3d 20 43 6f 6e 66 69 67 3a 3a 67 65  fig = Config::ge
1020: 74 49 6e 73 74 61 6e 63 65 28 29 3b 0a 0a 09 09  tInstance();....
1030: 24 63 68 61 6d 70 5f 69 64 20 3d 20 24 63 6f 6e  $champ_id = $con
1040: 66 69 67 2d 3e 67 65 74 28 27 63 68 61 6d 70 5f  fig->get('champ_
1050: 69 64 65 6e 74 69 66 69 61 6e 74 27 29 3b 0a 0a  identifiant');..
1060: 09 09 24 6d 65 6d 62 72 65 20 3d 20 24 64 62 2d  ..$membre = $db-
1070: 3e 66 69 72 73 74 28 27 53 45 4c 45 43 54 20 69  >first('SELECT i
1080: 64 2c 20 65 6d 61 69 6c 2c 20 70 61 73 73 65 2c  d, email, passe,
1090: 20 63 6c 65 66 5f 70 67 70 20 46 52 4f 4d 20 6d   clef_pgp FROM m
10a0: 65 6d 62 72 65 73 20 57 48 45 52 45 20 27 2e 24  embres WHERE '.$
10b0: 63 68 61 6d 70 5f 69 64 2e 27 20 3d 20 3f 20 4c  champ_id.' = ? L
10c0: 49 4d 49 54 20 31 3b 27 2c 20 74 72 69 6d 28 24  IMIT 1;', trim($
10d0: 69 64 29 29 3b 0a 0a 09 09 69 66 20 28 21 24 6d  id));....if (!$m
10e0: 65 6d 62 72 65 20 7c 7c 20 74 72 69 6d 28 24 6d  embre || trim($m
10f0: 65 6d 62 72 65 2d 3e 65 6d 61 69 6c 29 20 3d 3d  embre->email) ==
1100: 20 27 27 29 0a 09 09 7b 0a 09 09 09 72 65 74 75   '')...{....retu
1110: 72 6e 20 66 61 6c 73 65 3b 0a 09 09 7d 0a 0a 09  rn false;...}...
1120: 09 2f 2f 20 76 61 6c 69 64 65 20 70 6f 75 72 20  .// valide pour 
1130: 31 20 68 65 75 72 65 20 6d 69 6e 69 6d 75 6d 0a  1 heure minimum.
1140: 09 09 24 65 78 70 69 72 65 20 3d 20 63 65 69 6c  ..$expire = ceil
1150: 28 28 74 69 6d 65 28 29 20 2d 20 73 74 72 74 6f  ((time() - strto
1160: 74 69 6d 65 28 27 32 30 31 37 2d 30 31 2d 30 31  time('2017-01-01
1170: 27 29 29 20 2f 20 33 36 30 30 29 20 2b 20 31 3b  ')) / 3600) + 1;
1180: 0a 0a 09 09 24 68 61 73 68 20 3d 20 68 61 73 68  ....$hash = hash
1190: 5f 68 6d 61 63 28 27 73 68 61 32 35 36 27 2c 20  _hmac('sha256', 
11a0: 24 6d 65 6d 62 72 65 2d 3e 65 6d 61 69 6c 20 2e  $membre->email .
11b0: 20 24 6d 65 6d 62 72 65 2d 3e 69 64 20 2e 20 24   $membre->id . $
11c0: 6d 65 6d 62 72 65 2d 3e 70 61 73 73 65 20 2e 20  membre->passe . 
11d0: 24 65 78 70 69 72 65 2c 20 53 45 43 52 45 54 5f  $expire, SECRET_
11e0: 4b 45 59 2c 20 74 72 75 65 29 3b 0a 09 09 24 68  KEY, true);...$h
11f0: 61 73 68 20 3d 20 73 75 62 73 74 72 28 53 65 63  ash = substr(Sec
1200: 75 72 69 74 79 3a 3a 62 61 73 65 36 34 5f 65 6e  urity::base64_en
1210: 63 6f 64 65 5f 75 72 6c 5f 73 61 66 65 28 24 68  code_url_safe($h
1220: 61 73 68 29 2c 20 30 2c 20 31 36 29 3b 0a 09 09  ash), 0, 16);...
1230: 0a 09 09 24 69 64 20 3d 20 62 61 73 65 5f 63 6f  ...$id = base_co
1240: 6e 76 65 72 74 28 24 6d 65 6d 62 72 65 2d 3e 69  nvert($membre->i
1250: 64 2c 20 31 30 2c 20 33 36 29 3b 0a 09 09 24 65  d, 10, 36);...$e
1260: 78 70 69 72 65 20 3d 20 62 61 73 65 5f 63 6f 6e  xpire = base_con
1270: 76 65 72 74 28 24 65 78 70 69 72 65 2c 20 31 30  vert($expire, 10
1280: 2c 20 33 36 29 3b 0a 0a 09 09 24 71 75 65 72 79  , 36);....$query
1290: 20 3d 20 73 70 72 69 6e 74 66 28 27 25 73 2e 25   = sprintf('%s.%
12a0: 73 2e 25 73 27 2c 20 24 69 64 2c 20 24 65 78 70  s.%s', $id, $exp
12b0: 69 72 65 2c 20 24 68 61 73 68 29 3b 0a 0a 09 09  ire, $hash);....
12c0: 24 6d 65 73 73 61 67 65 20 3d 20 22 42 6f 6e 6a  $message = "Bonj
12d0: 6f 75 72 2c 5c 6e 5c 6e 56 6f 75 73 20 61 76 65  our,\n\nVous ave
12e0: 7a 20 6f 75 62 6c 69 c3 a9 20 76 6f 74 72 65 20  z oubli.. votre 
12f0: 6d 6f 74 20 64 65 20 70 61 73 73 65 20 3f 20 50  mot de passe ? P
1300: 61 73 20 64 65 20 70 61 6e 69 71 75 65 20 21 5c  as de panique !\
1310: 6e 5c 6e 22 3b 0a 09 09 24 6d 65 73 73 61 67 65  n\n";...$message
1320: 2e 3d 20 22 49 6c 20 76 6f 75 73 20 73 75 66 66  .= "Il vous suff
1330: 69 74 20 64 65 20 63 6c 69 71 75 65 72 20 73 75  it de cliquer su
1340: 72 20 6c 65 20 6c 69 65 6e 20 63 69 2d 64 65 73  r le lien ci-des
1350: 73 6f 75 73 20 70 6f 75 72 20 72 65 63 65 76 6f  sous pour recevo
1360: 69 72 20 75 6e 20 6e 6f 75 76 65 61 75 20 6d 6f  ir un nouveau mo
1370: 74 20 64 65 20 70 61 73 73 65 2e 5c 6e 5c 6e 22  t de passe.\n\n"
1380: 3b 0a 09 09 24 6d 65 73 73 61 67 65 2e 3d 20 41  ;...$message.= A
1390: 44 4d 49 4e 5f 55 52 4c 20 2e 20 27 70 61 73 73  DMIN_URL . 'pass
13a0: 77 6f 72 64 2e 70 68 70 3f 63 3d 27 20 2e 20 24  word.php?c=' . $
13b0: 71 75 65 72 79 3b 0a 09 09 24 6d 65 73 73 61 67  query;...$messag
13c0: 65 2e 3d 20 22 5c 6e 5c 6e 53 69 20 76 6f 75 73  e.= "\n\nSi vous
13d0: 20 6e 27 61 76 65 7a 20 70 61 73 20 64 65 6d 61   n'avez pas dema
13e0: 6e 64 c3 a9 20 c3 a0 20 72 65 63 65 76 6f 69 72  nd.. .. recevoir
13f0: 20 63 65 20 6d 65 73 73 61 67 65 2c 20 69 67 6e   ce message, ign
1400: 6f 72 65 7a 2d 6c 65 2c 20 76 6f 74 72 65 20 6d  orez-le, votre m
1410: 6f 74 20 64 65 20 70 61 73 73 65 20 72 65 73 74  ot de passe rest
1420: 65 72 61 20 69 6e 63 68 61 6e 67 c3 a9 2e 22 3b  era inchang...";
1430: 0a 0a 09 09 55 74 69 6c 73 3a 3a 6d 61 69 6c 28  ....Utils::mail(
1440: 24 6d 65 6d 62 72 65 2d 3e 65 6d 61 69 6c 2c 20  $membre->email, 
1450: 27 5b 27 2e 24 63 6f 6e 66 69 67 2d 3e 67 65 74  '['.$config->get
1460: 28 27 6e 6f 6d 5f 61 73 73 6f 27 29 2e 27 5d 20  ('nom_asso').'] 
1470: 4d 6f 74 20 64 65 20 70 61 73 73 65 20 70 65 72  Mot de passe per
1480: 64 75 20 3f 27 2c 20 24 6d 65 73 73 61 67 65 2c  du ?', $message,
1490: 20 5b 5d 2c 20 24 6d 65 6d 62 72 65 2d 3e 63 6c   [], $membre->cl
14a0: 65 66 5f 70 67 70 29 3b 0a 09 09 72 65 74 75 72  ef_pgp);...retur
14b0: 6e 20 74 72 75 65 3b 0a 09 7d 0a 0a 09 73 74 61  n true;..}...sta
14c0: 74 69 63 20 70 75 62 6c 69 63 20 66 75 6e 63 74  tic public funct
14d0: 69 6f 6e 20 72 65 63 6f 76 65 72 50 61 73 73 77  ion recoverPassw
14e0: 6f 72 64 43 6f 6e 66 69 72 6d 28 24 63 6f 64 65  ordConfirm($code
14f0: 29 0a 09 7b 0a 09 09 69 66 20 28 73 75 62 73 74  )..{...if (subst
1500: 72 5f 63 6f 75 6e 74 28 24 63 6f 64 65 2c 20 27  r_count($code, '
1510: 2e 27 29 20 21 3d 3d 20 32 29 0a 09 09 7b 0a 09  .') !== 2)...{..
1520: 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a  ..return false;.
1530: 09 09 7d 0a 0a 09 09 6c 69 73 74 28 24 69 64 2c  ..}....list($id,
1540: 20 24 65 78 70 69 72 65 2c 20 24 65 6d 61 69 6c   $expire, $email
1550: 5f 68 61 73 68 29 20 3d 20 65 78 70 6c 6f 64 65  _hash) = explode
1560: 28 27 2e 27 2c 20 24 63 6f 64 65 29 3b 0a 0a 09  ('.', $code);...
1570: 09 24 63 6f 6e 66 69 67 20 3d 20 43 6f 6e 66 69  .$config = Confi
1580: 67 3a 3a 67 65 74 49 6e 73 74 61 6e 63 65 28 29  g::getInstance()
1590: 3b 0a 09 09 24 64 62 20 3d 20 44 42 3a 3a 67 65  ;...$db = DB::ge
15a0: 74 49 6e 73 74 61 6e 63 65 28 29 3b 0a 0a 09 09  tInstance();....
15b0: 24 69 64 20 3d 20 62 61 73 65 5f 63 6f 6e 76 65  $id = base_conve
15c0: 72 74 28 24 69 64 2c 20 33 36 2c 20 31 30 29 3b  rt($id, 36, 10);
15d0: 0a 09 09 24 65 78 70 69 72 65 20 3d 20 62 61 73  ...$expire = bas
15e0: 65 5f 63 6f 6e 76 65 72 74 28 24 65 78 70 69 72  e_convert($expir
15f0: 65 2c 20 33 36 2c 20 31 30 29 3b 0a 0a 09 09 24  e, 36, 10);....$
1600: 65 78 70 69 72 65 5f 74 69 6d 65 73 74 61 6d 70  expire_timestamp
1610: 20 3d 20 28 24 65 78 70 69 72 65 20 2a 20 33 36   = ($expire * 36
1620: 30 30 29 20 2b 20 73 74 72 74 6f 74 69 6d 65 28  00) + strtotime(
1630: 27 32 30 31 37 2d 30 31 2d 30 31 27 29 3b 0a 0a  '2017-01-01');..
1640: 09 09 69 66 20 28 74 69 6d 65 28 29 20 2f 20 33  ..if (time() / 3
1650: 36 30 30 20 3e 20 24 65 78 70 69 72 65 5f 74 69  600 > $expire_ti
1660: 6d 65 73 74 61 6d 70 29 0a 09 09 7b 0a 09 09 09  mestamp)...{....
1670: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 09  return false;...
1680: 7d 0a 0a 09 09 24 6d 65 6d 62 72 65 20 3d 20 24  }....$membre = $
1690: 64 62 2d 3e 66 69 72 73 74 28 27 53 45 4c 45 43  db->first('SELEC
16a0: 54 20 69 64 2c 20 65 6d 61 69 6c 2c 20 70 61 73  T id, email, pas
16b0: 73 65 2c 20 63 6c 65 66 5f 70 67 70 20 46 52 4f  se, clef_pgp FRO
16c0: 4d 20 6d 65 6d 62 72 65 73 20 57 48 45 52 45 20  M membres WHERE 
16d0: 69 64 20 3d 20 3f 20 4c 49 4d 49 54 20 31 3b 27  id = ? LIMIT 1;'
16e0: 2c 20 28 69 6e 74 29 24 69 64 29 3b 0a 0a 09 09  , (int)$id);....
16f0: 69 66 20 28 21 24 6d 65 6d 62 72 65 20 7c 7c 20  if (!$membre || 
1700: 74 72 69 6d 28 24 6d 65 6d 62 72 65 2d 3e 65 6d  trim($membre->em
1710: 61 69 6c 29 20 3d 3d 20 27 27 29 0a 09 09 7b 0a  ail) == '')...{.
1720: 09 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b  ...return false;
1730: 0a 09 09 7d 0a 0a 09 09 24 68 61 73 68 20 3d 20  ...}....$hash = 
1740: 68 61 73 68 5f 68 6d 61 63 28 27 73 68 61 32 35  hash_hmac('sha25
1750: 36 27 2c 20 24 6d 65 6d 62 72 65 2d 3e 65 6d 61  6', $membre->ema
1760: 69 6c 20 2e 20 24 6d 65 6d 62 72 65 2d 3e 69 64  il . $membre->id
1770: 20 2e 20 24 6d 65 6d 62 72 65 2d 3e 70 61 73 73   . $membre->pass
1780: 65 20 2e 20 24 65 78 70 69 72 65 2c 20 53 45 43  e . $expire, SEC
1790: 52 45 54 5f 4b 45 59 2c 20 74 72 75 65 29 3b 0a  RET_KEY, true);.
17a0: 09 09 24 68 61 73 68 20 3d 20 73 75 62 73 74 72  ..$hash = substr
17b0: 28 53 65 63 75 72 69 74 79 3a 3a 62 61 73 65 36  (Security::base6
17c0: 34 5f 65 6e 63 6f 64 65 5f 75 72 6c 5f 73 61 66  4_encode_url_saf
17d0: 65 28 24 68 61 73 68 29 2c 20 30 2c 20 31 36 29  e($hash), 0, 16)
17e0: 3b 0a 0a 09 09 69 66 20 28 21 68 61 73 68 5f 65  ;....if (!hash_e
17f0: 71 75 61 6c 73 28 24 68 61 73 68 2c 20 24 65 6d  quals($hash, $em
1800: 61 69 6c 5f 68 61 73 68 29 29 0a 09 09 7b 0a 09  ail_hash))...{..
1810: 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a  ..return false;.
1820: 09 09 7d 0a 0a 09 09 24 70 61 73 73 77 6f 72 64  ..}....$password
1830: 20 3d 20 55 74 69 6c 73 3a 3a 73 75 67 67 65 73   = Utils::sugges
1840: 74 50 61 73 73 77 6f 72 64 28 29 3b 0a 0a 09 09  tPassword();....
1850: 24 6d 65 73 73 61 67 65 20 3d 20 22 42 6f 6e 6a  $message = "Bonj
1860: 6f 75 72 2c 5c 6e 5c 6e 56 6f 75 73 20 61 76 65  our,\n\nVous ave
1870: 7a 20 64 65 6d 61 6e 64 c3 a9 20 75 6e 20 6e 6f  z demand.. un no
1880: 75 76 65 61 75 20 6d 6f 74 20 64 65 20 70 61 73  uveau mot de pas
1890: 73 65 20 70 6f 75 72 20 76 6f 74 72 65 20 63 6f  se pour votre co
18a0: 6d 70 74 65 2e 5c 6e 5c 6e 22 3b 0a 09 09 24 6d  mpte.\n\n";...$m
18b0: 65 73 73 61 67 65 2e 3d 20 22 56 6f 74 72 65 20  essage.= "Votre 
18c0: 61 64 72 65 73 73 65 20 65 6d 61 69 6c 20 3a 20  adresse email : 
18d0: 22 2e 24 6d 65 6d 62 72 65 2d 3e 65 6d 61 69 6c  ".$membre->email
18e0: 2e 22 5c 6e 22 3b 0a 09 09 24 6d 65 73 73 61 67  ."\n";...$messag
18f0: 65 2e 3d 20 22 56 6f 74 72 65 20 6e 6f 75 76 65  e.= "Votre nouve
1900: 61 75 20 6d 6f 74 20 64 65 20 70 61 73 73 65 20  au mot de passe 
1910: 3a 20 22 2e 24 70 61 73 73 77 6f 72 64 2e 22 5c  : ".$password."\
1920: 6e 5c 6e 22 3b 0a 09 09 24 6d 65 73 73 61 67 65  n\n";...$message
1930: 2e 3d 20 22 53 69 20 76 6f 75 73 20 6e 27 61 76  .= "Si vous n'av
1940: 65 7a 20 70 61 73 20 64 65 6d 61 6e 64 c3 a9 20  ez pas demand.. 
1950: c3 a0 20 72 65 63 65 76 6f 69 72 20 63 65 20 6d  .. recevoir ce m
1960: 65 73 73 61 67 65 2c 20 6d 65 72 63 69 20 64 65  essage, merci de
1970: 20 6e 6f 75 73 20 6c 65 20 73 69 67 6e 61 6c 65   nous le signale
1980: 72 2e 22 3b 0a 0a 09 09 24 70 61 73 73 77 6f 72  r.";....$passwor
1990: 64 20 3d 20 4d 65 6d 62 72 65 73 3a 3a 68 61 73  d = Membres::has
19a0: 68 50 61 73 73 77 6f 72 64 28 24 70 61 73 73 77  hPassword($passw
19b0: 6f 72 64 29 3b 0a 0a 09 09 24 64 62 2d 3e 75 70  ord);....$db->up
19c0: 64 61 74 65 28 27 6d 65 6d 62 72 65 73 27 2c 20  date('membres', 
19d0: 5b 27 70 61 73 73 65 27 20 3d 3e 20 24 70 61 73  ['passe' => $pas
19e0: 73 77 6f 72 64 5d 2c 20 27 69 64 20 3d 20 3a 69  sword], 'id = :i
19f0: 64 27 2c 20 5b 27 69 64 27 20 3d 3e 20 28 69 6e  d', ['id' => (in
1a00: 74 29 24 69 64 5d 29 3b 0a 0a 09 09 72 65 74 75  t)$id]);....retu
1a10: 72 6e 20 55 74 69 6c 73 3a 3a 6d 61 69 6c 28 24  rn Utils::mail($
1a20: 6d 65 6d 62 72 65 2d 3e 65 6d 61 69 6c 2c 20 27  membre->email, '
1a30: 5b 27 2e 24 63 6f 6e 66 69 67 2d 3e 67 65 74 28  ['.$config->get(
1a40: 27 6e 6f 6d 5f 61 73 73 6f 27 29 2e 27 5d 20 4e  'nom_asso').'] N
1a50: 6f 75 76 65 61 75 20 6d 6f 74 20 64 65 20 70 61  ouveau mot de pa
1a60: 73 73 65 27 2c 20 24 6d 65 73 73 61 67 65 2c 20  sse', $message, 
1a70: 5b 5d 2c 20 24 6d 65 6d 62 72 65 2d 3e 63 6c 65  [], $membre->cle
1a80: 66 5f 70 67 70 29 3b 0a 09 7d 0a 0a 09 70 75 62  f_pgp);..}...pub
1a90: 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20 65 64 69  lic function edi
1aa0: 74 55 73 65 72 28 24 64 61 74 61 29 0a 09 7b 0a  tUser($data)..{.
1ab0: 09 09 28 6e 65 77 20 4d 65 6d 62 72 65 73 29 2d  ..(new Membres)-
1ac0: 3e 65 64 69 74 28 24 74 68 69 73 2d 3e 75 73 65  >edit($this->use
1ad0: 72 2d 3e 69 64 2c 20 24 64 61 74 61 2c 20 66 61  r->id, $data, fa
1ae0: 6c 73 65 29 3b 0a 09 09 24 74 68 69 73 2d 3e 72  lse);...$this->r
1af0: 65 66 72 65 73 68 28 29 3b 0a 0a 09 09 72 65 74  efresh();....ret
1b00: 75 72 6e 20 74 72 75 65 3b 0a 09 7d 0a 0a 09 70  urn true;..}...p
1b10: 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20 63  ublic function c
1b20: 61 6e 41 63 63 65 73 73 28 24 63 61 74 65 67 6f  anAccess($catego
1b30: 72 79 2c 20 24 70 65 72 6d 69 73 73 69 6f 6e 29  ry, $permission)
1b40: 0a 09 7b 0a 09 09 69 66 20 28 21 24 74 68 69 73  ..{...if (!$this
1b50: 2d 3e 75 73 65 72 29 0a 09 09 7b 0a 09 09 09 72  ->user)...{....r
1b60: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 09 7d  eturn false;...}
1b70: 0a 0a 09 09 72 65 74 75 72 6e 20 28 24 74 68 69  ....return ($thi
1b80: 73 2d 3e 75 73 65 72 2d 3e 7b 27 64 72 6f 69 74  s->user->{'droit
1b90: 5f 27 20 2e 20 24 63 61 74 65 67 6f 72 79 7d 20  _' . $category} 
1ba0: 3e 3d 20 24 70 65 72 6d 69 73 73 69 6f 6e 29 3b  >= $permission);
1bb0: 0a 09 7d 0a 0a 09 70 75 62 6c 69 63 20 66 75 6e  ..}...public fun
1bc0: 63 74 69 6f 6e 20 72 65 71 75 69 72 65 41 63 63  ction requireAcc
1bd0: 65 73 73 28 24 63 61 74 65 67 6f 72 79 2c 20 24  ess($category, $
1be0: 70 65 72 6d 69 73 73 69 6f 6e 29 0a 09 7b 0a 09  permission)..{..
1bf0: 09 69 66 20 28 21 24 74 68 69 73 2d 3e 63 61 6e  .if (!$this->can
1c00: 41 63 63 65 73 73 28 24 63 61 74 65 67 6f 72 79  Access($category
1c10: 2c 20 24 70 65 72 6d 69 73 73 69 6f 6e 29 29 0a  , $permission)).
1c20: 09 09 7b 0a 09 09 09 74 68 72 6f 77 20 6e 65 77  ..{....throw new
1c30: 20 55 73 65 72 45 78 63 65 70 74 69 6f 6e 28 27   UserException('
1c40: 56 6f 75 73 20 6e 5c 27 61 76 65 7a 20 70 61 73  Vous n\'avez pas
1c50: 20 6c 65 20 64 72 6f 69 74 20 64 5c 27 61 63 63   le droit d\'acc
1c60: c3 a9 64 65 72 20 c3 a0 20 63 65 74 74 65 20 70  ..der .. cette p
1c70: 61 67 65 2e 27 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  age.');...}..}..
1c80: 09 70 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e  .public function
1c90: 20 67 65 74 4e 65 77 4f 54 50 53 65 63 72 65 74   getNewOTPSecret
1ca0: 28 29 0a 09 7b 0a 09 09 24 6f 75 74 20 3d 20 5b  ()..{...$out = [
1cb0: 5d 3b 0a 09 09 24 6f 75 74 5b 27 73 65 63 72 65  ];...$out['secre
1cc0: 74 27 5d 20 3d 20 53 65 63 75 72 69 74 79 5f 4f  t'] = Security_O
1cd0: 54 50 3a 3a 67 65 74 52 61 6e 64 6f 6d 53 65 63  TP::getRandomSec
1ce0: 72 65 74 28 29 3b 0a 09 09 24 6f 75 74 5b 27 73  ret();...$out['s
1cf0: 65 63 72 65 74 5f 64 69 73 70 6c 61 79 27 5d 20  ecret_display'] 
1d00: 3d 20 69 6d 70 6c 6f 64 65 28 27 20 27 2c 20 73  = implode(' ', s
1d10: 74 72 5f 73 70 6c 69 74 28 24 6f 75 74 5b 27 73  tr_split($out['s
1d20: 65 63 72 65 74 27 5d 2c 20 34 29 29 3b 0a 09 09  ecret'], 4));...
1d30: 24 6f 75 74 5b 27 75 72 6c 27 5d 20 3d 20 53 65  $out['url'] = Se
1d40: 63 75 72 69 74 79 5f 4f 54 50 3a 3a 67 65 74 4f  curity_OTP::getO
1d50: 54 50 41 75 74 68 55 52 4c 28 43 6f 6e 66 69 67  TPAuthURL(Config
1d60: 3a 3a 67 65 74 49 6e 73 74 61 6e 63 65 28 29 2d  ::getInstance()-
1d70: 3e 67 65 74 28 27 6e 6f 6d 5f 61 73 73 6f 27 29  >get('nom_asso')
1d80: 2c 20 24 6f 75 74 5b 27 73 65 63 72 65 74 27 5d  , $out['secret']
1d90: 29 3b 0a 09 0a 09 09 24 71 72 63 6f 64 65 20 3d  );.....$qrcode =
1da0: 20 6e 65 77 20 51 52 43 6f 64 65 28 24 6f 75 74   new QRCode($out
1db0: 5b 27 75 72 6c 27 5d 29 3b 0a 09 09 24 6f 75 74  ['url']);...$out
1dc0: 5b 27 71 72 63 6f 64 65 27 5d 20 3d 20 27 64 61  ['qrcode'] = 'da
1dd0: 74 61 3a 69 6d 61 67 65 2f 73 76 67 2b 78 6d 6c  ta:image/svg+xml
1de0: 3b 62 61 73 65 36 34 2c 27 20 2e 20 62 61 73 65  ;base64,' . base
1df0: 36 34 5f 65 6e 63 6f 64 65 28 24 71 72 63 6f 64  64_encode($qrcod
1e00: 65 2d 3e 74 6f 53 56 47 28 29 29 3b 0a 0a 09 09  e->toSVG());....
1e10: 72 65 74 75 72 6e 20 24 6f 75 74 3b 0a 09 7d 0a  return $out;..}.
1e20: 0a 09 70 75 62 6c 69 63 20 66 75 6e 63 74 69 6f  ..public functio
1e30: 6e 20 73 65 6e 64 4d 65 73 73 61 67 65 28 24 64  n sendMessage($d
1e40: 65 73 74 2c 20 24 73 75 6a 65 74 2c 20 24 6d 65  est, $sujet, $me
1e50: 73 73 61 67 65 2c 20 24 63 6f 70 69 65 20 3d 20  ssage, $copie = 
1e60: 66 61 6c 73 65 29 0a 09 7b 0a 09 09 24 66 72 6f  false)..{...$fro
1e70: 6d 20 3d 20 24 74 68 69 73 2d 3e 67 65 74 55 73  m = $this->getUs
1e80: 65 72 28 29 3b 0a 09 09 24 66 72 6f 6d 20 3d 20  er();...$from = 
1e90: 24 66 72 6f 6d 2d 3e 65 6d 61 69 6c 3b 0a 09 09  $from->email;...
1ea0: 2f 2f 20 55 6e 69 71 75 65 6d 65 6e 74 20 61 64  // Uniquement ad
1eb0: 72 65 73 73 65 20 65 6d 61 69 6c 20 70 6f 75 72  resse email pour
1ec0: 20 6c 65 20 6d 6f 6d 65 6e 74 20 63 61 72 20 66   le moment car f
1ed0: 61 75 64 72 61 69 74 20 74 72 6f 75 76 65 72 20  audrait trouver 
1ee0: 63 6f 6d 6d 65 6e 74 0a 09 09 2f 2f 20 69 6e 64  comment...// ind
1ef0: 69 71 75 65 72 20 6c 65 20 6e 6f 6d 20 6d 61 69  iquer le nom mai
1f00: 73 20 71 75 27 69 6c 20 73 6f 69 74 20 63 6f 72  s qu'il soit cor
1f10: 72 65 63 74 65 6d 65 6e 74 20 c3 a9 63 68 61 70  rectement ..chap
1f20: 70 c3 a9 20 46 49 58 4d 45 0a 0a 09 09 24 63 6f  p.. FIXME....$co
1f30: 6e 66 69 67 20 3d 20 43 6f 6e 66 69 67 3a 3a 67  nfig = Config::g
1f40: 65 74 49 6e 73 74 61 6e 63 65 28 29 3b 0a 0a 09  etInstance();...
1f50: 09 24 6d 65 73 73 61 67 65 20 2e 3d 20 22 5c 6e  .$message .= "\n
1f60: 5c 6e 2d 2d 5c 6e 43 65 20 6d 65 73 73 61 67 65  \n--\nCe message
1f70: 20 61 20 c3 a9 74 c3 a9 20 65 6e 76 6f 79 c3 a9   a ..t.. envoy..
1f80: 20 70 61 72 20 75 6e 20 6d 65 6d 62 72 65 20 64   par un membre d
1f90: 65 20 22 2e 24 63 6f 6e 66 69 67 2d 3e 67 65 74  e ".$config->get
1fa0: 28 27 6e 6f 6d 5f 61 73 73 6f 27 29 3b 0a 09 09  ('nom_asso');...
1fb0: 24 6d 65 73 73 61 67 65 20 2e 3d 20 22 2c 20 6d  $message .= ", m
1fc0: 65 72 63 69 20 64 65 20 63 6f 6e 74 61 63 74 65  erci de contacte
1fd0: 72 20 22 2e 24 63 6f 6e 66 69 67 2d 3e 67 65 74  r ".$config->get
1fe0: 28 27 65 6d 61 69 6c 5f 61 73 73 6f 27 29 2e 22  ('email_asso')."
1ff0: 20 65 6e 20 63 61 73 20 64 27 61 62 75 73 2e 22   en cas d'abus."
2000: 3b 0a 0a 09 09 69 66 20 28 24 63 6f 70 69 65 29  ;....if ($copie)
2010: 0a 09 09 7b 0a 09 09 09 55 74 69 6c 73 3a 3a 6d  ...{....Utils::m
2020: 61 69 6c 28 24 66 72 6f 6d 2c 20 24 73 75 6a 65  ail($from, $suje
2030: 74 2c 20 24 6d 65 73 73 61 67 65 29 3b 0a 09 09  t, $message);...
2040: 7d 0a 0a 09 09 72 65 74 75 72 6e 20 55 74 69 6c  }....return Util
2050: 73 3a 3a 6d 61 69 6c 28 24 64 65 73 74 2c 20 24  s::mail($dest, $
2060: 73 75 6a 65 74 2c 20 24 6d 65 73 73 61 67 65 2c  sujet, $message,
2070: 20 5b 27 46 72 6f 6d 27 20 3d 3e 20 24 66 72 6f   ['From' => $fro
2080: 6d 5d 29 3b 0a 09 7d 0a 0a 09 70 75 62 6c 69 63  m]);..}...public
2090: 20 66 75 6e 63 74 69 6f 6e 20 65 64 69 74 53 65   function editSe
20a0: 63 75 72 69 74 79 28 41 72 72 61 79 20 24 64 61  curity(Array $da
20b0: 74 61 20 3d 20 5b 5d 29 0a 09 7b 0a 09 09 24 61  ta = [])..{...$a
20c0: 6c 6c 6f 77 65 64 5f 66 69 65 6c 64 73 20 3d 20  llowed_fields = 
20d0: 5b 27 70 61 73 73 65 27 2c 20 27 63 6c 65 66 5f  ['passe', 'clef_
20e0: 70 67 70 27 2c 20 27 73 65 63 72 65 74 5f 6f 74  pgp', 'secret_ot
20f0: 70 27 5d 3b 0a 0a 09 09 66 6f 72 65 61 63 68 20  p'];....foreach 
2100: 28 24 64 61 74 61 20 61 73 20 24 6b 65 79 3d 3e  ($data as $key=>
2110: 24 76 61 6c 75 65 29 0a 09 09 7b 0a 09 09 09 69  $value)...{....i
2120: 66 20 28 21 69 6e 5f 61 72 72 61 79 28 24 6b 65  f (!in_array($ke
2130: 79 2c 20 24 61 6c 6c 6f 77 65 64 5f 66 69 65 6c  y, $allowed_fiel
2140: 64 73 29 29 0a 09 09 09 7b 0a 09 09 09 09 74 68  ds))....{.....th
2150: 72 6f 77 20 6e 65 77 20 5c 52 75 6e 74 69 6d 65  row new \Runtime
2160: 45 78 63 65 70 74 69 6f 6e 28 73 70 72 69 6e 74  Exception(sprint
2170: 66 28 27 4c 65 20 63 68 61 6d 70 20 25 73 20 6e  f('Le champ %s n
2180: 5c 27 65 73 74 20 70 61 73 20 61 75 74 6f 72 69  \'est pas autori
2190: 73 c3 a9 20 64 61 6e 73 20 63 65 74 74 65 20 6d  s.. dans cette m
21a0: c3 a9 74 68 6f 64 65 2e 27 2c 20 24 6b 65 79 29  ..thode.', $key)
21b0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
21c0: 66 20 28 69 73 73 65 74 28 24 64 61 74 61 5b 27  f (isset($data['
21d0: 70 61 73 73 65 27 5d 29 20 26 26 20 74 72 69 6d  passe']) && trim
21e0: 28 24 64 61 74 61 5b 27 70 61 73 73 65 27 5d 29  ($data['passe'])
21f0: 20 21 3d 3d 20 27 27 29 0a 09 09 7b 0a 09 09 09   !== '')...{....
2200: 69 66 20 28 73 74 72 6c 65 6e 28 24 64 61 74 61  if (strlen($data
2210: 5b 27 70 61 73 73 65 27 5d 29 20 3c 20 35 29 0a  ['passe']) < 5).
2220: 09 09 09 7b 0a 09 09 09 09 74 68 72 6f 77 20 6e  ...{.....throw n
2230: 65 77 20 55 73 65 72 45 78 63 65 70 74 69 6f 6e  ew UserException
2240: 28 27 4c 65 20 6d 6f 74 20 64 65 20 70 61 73 73  ('Le mot de pass
2250: 65 20 64 6f 69 74 20 66 61 69 72 65 20 61 75 20  e doit faire au 
2260: 6d 6f 69 6e 73 20 35 20 63 61 72 61 63 74 c3 a8  moins 5 caract..
2270: 72 65 73 2e 27 29 3b 0a 09 09 09 7d 0a 0a 09 09  res.');....}....
2280: 09 24 64 61 74 61 5b 27 70 61 73 73 65 27 5d 20  .$data['passe'] 
2290: 3d 20 4d 65 6d 62 72 65 73 3a 3a 68 61 73 68 50  = Membres::hashP
22a0: 61 73 73 77 6f 72 64 28 74 72 69 6d 28 24 64 61  assword(trim($da
22b0: 74 61 5b 27 70 61 73 73 65 27 5d 29 29 3b 0a 09  ta['passe']));..
22c0: 09 7d 0a 09 09 65 6c 73 65 0a 09 09 7b 0a 09 09  .}...else...{...
22d0: 09 75 6e 73 65 74 28 24 64 61 74 61 5b 27 70 61  .unset($data['pa
22e0: 73 73 65 27 5d 29 3b 0a 09 09 7d 0a 0a 09 09 69  sse']);...}....i
22f0: 66 20 28 69 73 73 65 74 28 24 64 61 74 61 5b 27  f (isset($data['
2300: 63 6c 65 66 5f 70 67 70 27 5d 29 20 26 26 20 74  clef_pgp']) && t
2310: 72 69 6d 28 24 64 61 74 61 5b 27 63 6c 65 66 5f  rim($data['clef_
2320: 70 67 70 27 5d 29 20 21 3d 3d 20 27 27 29 0a 09  pgp']) !== '')..
2330: 09 7b 0a 09 09 09 24 64 61 74 61 5b 27 63 6c 65  .{....$data['cle
2340: 66 5f 70 67 70 27 5d 20 3d 20 74 72 69 6d 28 24  f_pgp'] = trim($
2350: 64 61 74 61 5b 27 63 6c 65 66 5f 70 67 70 27 5d  data['clef_pgp']
2360: 29 3b 0a 0a 09 09 09 69 66 20 28 21 24 74 68 69  );.....if (!$thi
2370: 73 2d 3e 67 65 74 50 47 50 46 69 6e 67 65 72 70  s->getPGPFingerp
2380: 72 69 6e 74 28 24 64 61 74 61 5b 27 63 6c 65 66  rint($data['clef
2390: 5f 70 67 70 27 5d 29 29 0a 09 09 09 7b 0a 09 09  _pgp']))....{...
23a0: 09 09 74 68 72 6f 77 20 6e 65 77 20 55 73 65 72  ..throw new User
23b0: 45 78 63 65 70 74 69 6f 6e 28 27 43 6c c3 a9 20  Exception('Cl.. 
23c0: 50 47 50 20 69 6e 76 61 6c 69 64 65 20 3a 20 69  PGP invalide : i
23d0: 6d 70 6f 73 73 69 62 6c 65 20 64 5c 27 65 78 74  mpossible d\'ext
23e0: 72 61 69 72 65 20 6c 5c 27 65 6d 70 72 65 69 6e  raire l\'emprein
23f0: 74 65 2e 27 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  te.');....}...}.
2400: 0a 09 09 24 64 62 20 3d 20 44 42 3a 3a 67 65 74  ...$db = DB::get
2410: 49 6e 73 74 61 6e 63 65 28 29 3b 0a 09 09 24 64  Instance();...$d
2420: 62 2d 3e 75 70 64 61 74 65 28 27 6d 65 6d 62 72  b->update('membr
2430: 65 73 27 2c 20 24 64 61 74 61 2c 20 24 64 62 2d  es', $data, $db-
2440: 3e 77 68 65 72 65 28 27 69 64 27 2c 20 28 69 6e  >where('id', (in
2450: 74 29 24 74 68 69 73 2d 3e 75 73 65 72 2d 3e 69  t)$this->user->i
2460: 64 29 29 3b 0a 09 09 24 74 68 69 73 2d 3e 72 65  d));...$this->re
2470: 66 72 65 73 68 28 29 3b 0a 0a 09 09 72 65 74 75  fresh();....retu
2480: 72 6e 20 74 72 75 65 3b 0a 09 7d 0a 7d 0a        rn true;..}.}.