Artifact ad60ab4d6d5c3c77234296c54c020c5805126c98:


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 3b 0a 0a 63 6c 61 73   Garradin;..clas
0020: 73 20 46 69 63 68 69 65 72 73 0a 7b 0a 09 70 75  s Fichiers.{..pu
0030: 62 6c 69 63 20 24 74 79 70 65 3b 0a 09 70 75 62  blic $type;..pub
0040: 6c 69 63 20 24 6e 6f 6d 3b 0a 09 70 75 62 6c 69  lic $nom;..publi
0050: 63 20 24 64 61 74 65 74 69 6d 65 3b 0a 09 70 75  c $datetime;..pu
0060: 62 6c 69 63 20 24 68 61 73 68 3b 0a 09 70 75 62  blic $hash;..pub
0070: 6c 69 63 20 24 74 61 69 6c 6c 65 3b 0a 09 70 75  lic $taille;..pu
0080: 62 6c 69 63 20 24 69 64 3b 0a 0a 09 63 6f 6e 73  blic $id;...cons
0090: 74 20 4c 49 45 4e 5f 43 4f 4d 50 54 41 20 3d 20  t LIEN_COMPTA = 
00a0: 27 63 6f 6d 70 74 61 5f 6a 6f 75 72 6e 61 6c 27  'compta_journal'
00b0: 3b 0a 09 63 6f 6e 73 74 20 4c 49 45 4e 5f 57 49  ;..const LIEN_WI
00c0: 4b 49 20 3d 20 27 77 69 6b 69 5f 70 61 67 65 73  KI = 'wiki_pages
00d0: 27 3b 0a 09 63 6f 6e 73 74 20 4c 49 45 4e 5f 4d  ';..const LIEN_M
00e0: 45 4d 42 52 45 53 20 3d 20 27 6d 65 6d 62 72 65  EMBRES = 'membre
00f0: 73 27 3b 0a 0a 09 70 75 62 6c 69 63 20 66 75 6e  s';...public fun
0100: 63 74 69 6f 6e 20 5f 5f 63 6f 6e 73 74 72 75 63  ction __construc
0110: 74 28 24 69 64 29 0a 09 7b 0a 09 09 24 64 61 74  t($id)..{...$dat
0120: 61 20 3d 20 44 42 3a 3a 67 65 74 49 6e 73 74 61  a = DB::getInsta
0130: 6e 63 65 28 29 2d 3e 73 69 6d 70 6c 65 51 75 65  nce()->simpleQue
0140: 72 79 53 69 6e 67 6c 65 28 27 53 45 4c 45 43 54  rySingle('SELECT
0150: 20 2a 2c 20 73 74 72 66 74 69 6d 65 28 5c 27 25   *, strftime(\'%
0160: 73 5c 27 2c 20 64 61 74 65 74 69 6d 65 29 20 41  s\', datetime) A
0170: 53 20 64 61 74 65 74 69 6d 65 0a 09 09 09 46 52  S datetime....FR
0180: 4f 4d 20 66 69 63 68 69 65 72 73 20 57 48 45 52  OM fichiers WHER
0190: 45 20 69 64 20 3d 20 3f 3b 27 2c 20 74 72 75 65  E id = ?;', true
01a0: 2c 20 28 69 6e 74 29 24 69 64 29 3b 0a 0a 09 09  , (int)$id);....
01b0: 66 6f 72 65 61 63 68 20 28 24 64 61 74 61 20 61  foreach ($data a
01c0: 73 20 24 6b 65 79 3d 3e 24 76 61 6c 75 65 29 0a  s $key=>$value).
01d0: 09 09 7b 0a 09 09 09 24 74 68 69 73 2d 3e 24 6b  ..{....$this->$k
01e0: 65 79 20 3d 20 24 76 61 6c 75 65 3b 0a 09 09 7d  ey = $value;...}
01f0: 0a 09 7d 09 0a 0a 09 2f 2a 2a 0a 09 20 2a 20 45  ..}..../**.. * E
0200: 6e 76 6f 69 65 20 75 6e 65 20 6d 69 6e 69 61 74  nvoie une miniat
0210: 75 72 65 20 c3 a0 20 6c 61 20 74 61 69 6c 6c 65  ure .. la taille
0220: 20 69 6e 64 69 71 75 c3 a9 65 20 61 75 20 63 6c   indiqu..e au cl
0230: 69 65 6e 74 20 48 54 54 50 0a 09 20 2a 20 40 70  ient HTTP.. * @p
0240: 61 72 61 6d 20 20 69 6e 74 65 67 65 72 20 24 77  aram  integer $w
0250: 69 64 74 68 20 20 4c 61 72 67 65 75 72 0a 09 20  idth  Largeur.. 
0260: 2a 20 40 70 61 72 61 6d 20 20 69 6e 74 65 67 65  * @param  intege
0270: 72 20 24 68 65 69 67 68 74 20 48 61 75 74 65 75  r $height Hauteu
0280: 72 0a 09 20 2a 20 40 70 61 72 61 6d 20 20 62 6f  r.. * @param  bo
0290: 6f 6c 65 61 6e 20 24 63 72 6f 70 20 20 20 54 52  olean $crop   TR
02a0: 55 45 20 73 69 20 6f 6e 20 64 6f 69 74 20 63 72  UE si on doit cr
02b0: 6f 70 70 65 72 20 61 75 78 20 64 69 6d 65 6e 73  opper aux dimens
02c0: 69 6f 6e 73 20 69 6e 64 69 71 75 c3 a9 65 73 0a  ions indiqu..es.
02d0: 09 20 2a 20 40 72 65 74 75 72 6e 20 76 6f 69 64  . * @return void
02e0: 0a 09 20 2a 2f 0a 09 70 75 62 6c 69 63 20 66 75  .. */..public fu
02f0: 6e 63 74 69 6f 6e 20 67 65 74 54 68 75 6d 62 6e  nction getThumbn
0300: 61 69 6c 28 24 77 69 64 74 68 2c 20 24 68 65 69  ail($width, $hei
0310: 67 68 74 2c 20 24 63 72 6f 70 20 3d 20 66 61 6c  ght, $crop = fal
0320: 73 65 29 0a 09 7b 0a 09 7d 0a 0a 09 70 75 62 6c  se)..{..}...publ
0330: 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6e 6b  ic function link
0340: 54 6f 28 24 74 79 70 65 2c 20 24 66 6f 72 65 69  To($type, $forei
0350: 67 6e 5f 69 64 29 0a 09 7b 0a 09 09 24 64 62 20  gn_id)..{...$db 
0360: 3d 20 44 42 3a 3a 67 65 74 49 6e 73 74 61 6e 63  = DB::getInstanc
0370: 65 28 29 3b 0a 09 09 24 63 68 65 63 6b 20 3d 20  e();...$check = 
0380: 5b 73 65 6c 66 3a 3a 4c 49 45 4e 5f 4d 45 4d 42  [self::LIEN_MEMB
0390: 52 45 53 2c 20 73 65 6c 66 3a 3a 4c 49 45 4e 5f  RES, self::LIEN_
03a0: 57 49 4b 49 2c 20 73 65 6c 66 3a 3a 4c 49 45 4e  WIKI, self::LIEN
03b0: 5f 43 4f 4d 50 54 41 5d 3b 0a 0a 09 09 69 66 20  _COMPTA];....if 
03c0: 28 21 69 6e 5f 61 72 72 61 79 28 24 74 79 70 65  (!in_array($type
03d0: 2c 20 24 63 68 65 63 6b 29 29 0a 09 09 7b 0a 09  , $check))...{..
03e0: 09 09 74 68 72 6f 77 20 6e 65 77 20 5c 4c 6f 67  ..throw new \Log
03f0: 69 63 45 78 63 65 70 74 69 6f 6e 28 27 54 79 70  icException('Typ
0400: 65 20 64 65 20 6c 69 65 6e 20 64 65 20 66 69 63  e de lien de fic
0410: 68 69 65 72 20 69 6e 63 6f 6e 6e 75 2e 27 29 3b  hier inconnu.');
0420: 0a 09 09 7d 0a 0a 09 09 75 6e 73 65 74 28 24 63  ...}....unset($c
0430: 68 65 63 6b 5b 61 72 72 61 79 5f 73 65 61 72 63  heck[array_searc
0440: 68 28 24 74 79 70 65 2c 20 24 63 68 65 63 6b 29  h($type, $check)
0450: 5d 29 3b 0a 09 09 0a 09 09 66 6f 72 65 61 63 68  ]);......foreach
0460: 20 28 24 63 68 65 63 6b 20 61 73 20 24 63 68 65   ($check as $che
0470: 63 6b 5f 74 79 70 65 29 0a 09 09 7b 0a 09 09 09  ck_type)...{....
0480: 69 66 20 28 24 64 62 2d 3e 73 69 6d 70 6c 65 51  if ($db->simpleQ
0490: 75 65 72 79 53 69 6e 67 6c 65 28 27 53 45 4c 45  uerySingle('SELE
04a0: 43 54 20 31 20 46 52 4f 4d 20 66 69 63 68 69 65  CT 1 FROM fichie
04b0: 72 73 5f 27 20 2e 20 24 63 68 65 63 6b 5f 74 79  rs_' . $check_ty
04c0: 70 65 20 2e 20 27 20 57 48 45 52 45 20 66 69 63  pe . ' WHERE fic
04d0: 68 69 65 72 20 3d 20 3f 3b 27 2c 20 66 61 6c 73  hier = ?;', fals
04e0: 65 2c 20 28 69 6e 74 29 24 74 68 69 73 2d 3e 69  e, (int)$this->i
04f0: 64 29 29 0a 09 09 09 7b 0a 09 09 09 09 74 68 72  d))....{.....thr
0500: 6f 77 20 6e 65 77 20 5c 4c 6f 67 69 63 45 78 63  ow new \LogicExc
0510: 65 70 74 69 6f 6e 28 27 43 65 20 66 69 63 68 69  eption('Ce fichi
0520: 65 72 20 65 73 74 20 64 c3 a9 6a c3 a0 20 6c 69  er est d..j.. li
0530: c3 a9 20 c3 a0 20 75 6e 20 61 75 74 72 65 20 63  .. .. un autre c
0540: 6f 6e 74 65 6e 75 20 3a 20 27 20 2e 20 24 63 68  ontenu : ' . $ch
0550: 65 63 6b 5f 74 79 70 65 29 3b 0a 09 09 09 7d 0a  eck_type);....}.
0560: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 20 24 64  ..}....return $d
0570: 62 2d 3e 73 69 6d 70 6c 65 45 78 65 63 28 27 49  b->simpleExec('I
0580: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
0590: 49 4e 54 4f 20 66 69 63 68 69 65 72 73 5f 27 20  INTO fichiers_' 
05a0: 2e 20 24 74 79 70 65 20 2e 20 27 20 28 66 69 63  . $type . ' (fic
05b0: 68 69 65 72 2c 20 69 64 29 20 56 41 4c 55 45 53  hier, id) VALUES
05c0: 20 28 3f 2c 20 3f 29 3b 27 2c 0a 09 09 09 28 69   (?, ?);',....(i
05d0: 6e 74 29 24 74 68 69 73 2d 3e 69 64 2c 20 28 69  nt)$this->id, (i
05e0: 6e 74 29 24 66 6f 72 65 69 67 6e 5f 69 64 29 3b  nt)$foreign_id);
05f0: 0a 09 7d 0a 0a 09 2f 2a 2a 0a 09 20 2a 20 53 75  ..}.../**.. * Su
0600: 70 70 72 69 6d 65 20 6c 65 20 66 69 63 68 69 65  pprime le fichie
0610: 72 0a 09 20 2a 20 40 72 65 74 75 72 6e 20 62 6f  r.. * @return bo
0620: 6f 6c 65 61 6e 20 54 52 55 45 20 65 6e 20 63 61  olean TRUE en ca
0630: 73 20 64 65 20 73 75 63 63 c3 a8 73 0a 09 20 2a  s de succ..s.. *
0640: 2f 0a 09 70 75 62 6c 69 63 20 66 75 6e 63 74 69  /..public functi
0650: 6f 6e 20 72 65 6d 6f 76 65 28 29 0a 09 7b 0a 09  on remove()..{..
0660: 09 24 64 62 20 3d 20 44 42 3a 3a 67 65 74 49 6e  .$db = DB::getIn
0670: 73 74 61 6e 63 65 28 29 3b 0a 09 09 24 64 62 2d  stance();...$db-
0680: 3e 65 78 65 63 28 27 42 45 47 49 4e 3b 27 29 3b  >exec('BEGIN;');
0690: 0a 09 09 24 64 62 2d 3e 73 69 6d 70 6c 65 45 78  ...$db->simpleEx
06a0: 65 63 28 27 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec('DELETE FROM 
06b0: 66 69 63 68 69 65 72 73 5f 63 6f 6d 70 74 61 5f  fichiers_compta_
06c0: 6a 6f 75 72 6e 61 6c 20 57 48 45 52 45 20 66 69  journal WHERE fi
06d0: 63 68 69 65 72 20 3d 20 3f 3b 27 2c 20 28 69 6e  chier = ?;', (in
06e0: 74 29 24 74 68 69 73 2d 3e 69 64 29 3b 0a 09 09  t)$this->id);...
06f0: 24 64 62 2d 3e 73 69 6d 70 6c 65 45 78 65 63 28  $db->simpleExec(
0700: 27 44 45 4c 45 54 45 20 46 52 4f 4d 20 66 69 63  'DELETE FROM fic
0710: 68 69 65 72 73 5f 77 69 6b 69 5f 70 61 67 65 73  hiers_wiki_pages
0720: 20 57 48 45 52 45 20 66 69 63 68 69 65 72 20 3d   WHERE fichier =
0730: 20 3f 3b 27 2c 20 28 69 6e 74 29 24 74 68 69 73   ?;', (int)$this
0740: 2d 3e 69 64 29 3b 0a 09 09 24 64 62 2d 3e 73 69  ->id);...$db->si
0750: 6d 70 6c 65 45 78 65 63 28 27 44 45 4c 45 54 45  mpleExec('DELETE
0760: 20 46 52 4f 4d 20 66 69 63 68 69 65 72 73 5f 6d   FROM fichiers_m
0770: 65 6d 62 72 65 73 20 57 48 45 52 45 20 66 69 63  embres WHERE fic
0780: 68 69 65 72 20 3d 20 3f 3b 27 2c 20 28 69 6e 74  hier = ?;', (int
0790: 29 24 74 68 69 73 2d 3e 69 64 29 3b 0a 0a 09 09  )$this->id);....
07a0: 2f 2f 20 53 75 70 70 72 65 73 73 69 6f 6e 20 64  // Suppression d
07b0: 75 20 63 6f 6e 74 65 6e 75 20 73 27 69 6c 20 6e  u contenu s'il n
07c0: 27 65 73 74 20 70 61 73 20 75 74 69 6c 69 73 c3  'est pas utilis.
07d0: a9 20 70 61 72 20 75 6e 20 61 75 74 72 65 20 66  . par un autre f
07e0: 69 63 68 69 65 72 0a 09 09 69 66 20 28 21 28 24  ichier...if (!($
07f0: 69 64 5f 63 6f 6e 74 65 6e 75 20 3d 20 24 64 62  id_contenu = $db
0800: 2d 3e 73 69 6d 70 6c 65 51 75 65 72 79 53 69 6e  ->simpleQuerySin
0810: 67 6c 65 28 27 53 45 4c 45 43 54 20 69 64 5f 63  gle('SELECT id_c
0820: 6f 6e 74 65 6e 75 20 46 52 4f 4d 20 66 69 63 68  ontenu FROM fich
0830: 69 65 72 73 20 41 53 20 66 31 20 49 4e 4e 45 52  iers AS f1 INNER
0840: 20 4a 4f 49 4e 20 66 69 63 68 69 65 72 73 20 41   JOIN fichiers A
0850: 53 20 66 32 20 0a 09 09 09 4f 4e 20 66 31 2e 69  S f2 ....ON f1.i
0860: 64 5f 63 6f 6e 74 65 6e 75 20 3d 20 66 32 2e 69  d_contenu = f2.i
0870: 64 5f 63 6f 6e 74 65 6e 75 20 41 4e 44 20 66 31  d_contenu AND f1
0880: 2e 69 64 20 21 3d 20 66 32 2e 69 64 20 57 48 45  .id != f2.id WHE
0890: 52 45 20 66 32 2e 69 64 20 3d 20 3f 3b 27 2c 20  RE f2.id = ?;', 
08a0: 66 61 6c 73 65 2c 20 28 69 6e 74 29 24 74 68 69  false, (int)$thi
08b0: 73 2d 3e 69 64 29 29 29 0a 09 09 7b 0a 09 09 09  s->id)))...{....
08c0: 24 64 62 2d 3e 73 69 6d 70 6c 65 45 78 65 63 28  $db->simpleExec(
08d0: 27 44 45 4c 45 54 45 20 46 52 4f 4d 20 66 69 63  'DELETE FROM fic
08e0: 68 69 65 72 73 5f 63 6f 6e 74 65 6e 75 20 57 48  hiers_contenu WH
08f0: 45 52 45 20 69 64 20 3d 20 3f 3b 27 2c 20 28 69  ERE id = ?;', (i
0900: 6e 74 29 24 69 64 5f 63 6f 6e 74 65 6e 75 29 3b  nt)$id_contenu);
0910: 0a 09 09 7d 0a 0a 09 09 24 64 62 2d 3e 73 69 6d  ...}....$db->sim
0920: 70 6c 65 45 78 65 63 28 27 44 45 4c 45 54 45 20  pleExec('DELETE 
0930: 46 52 4f 4d 20 66 69 63 68 69 65 72 73 20 57 48  FROM fichiers WH
0940: 45 52 45 20 69 64 20 3d 20 3f 3b 27 2c 20 28 69  ERE id = ?;', (i
0950: 6e 74 29 24 74 68 69 73 2d 3e 69 64 29 3b 0a 0a  nt)$this->id);..
0960: 09 09 72 65 74 75 72 6e 20 24 64 62 2d 3e 65 78  ..return $db->ex
0970: 65 63 28 27 45 4e 44 3b 27 29 3b 0a 09 7d 0a 0a  ec('END;');..}..
0980: 09 2f 2a 2a 0a 09 20 2a 20 4d 6f 64 69 66 69 65  ./**.. * Modifie
0990: 20 6c 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   les information
09a0: 73 20 64 75 20 66 69 63 68 69 65 72 0a 09 20 2a  s du fichier.. *
09b0: 20 40 70 61 72 61 6d 20 20 73 74 72 69 6e 67 20   @param  string 
09c0: 24 6e 6f 6d 20 20 20 4c 65 20 6e 6f 6d 20 64 75  $nom   Le nom du
09d0: 20 66 69 63 68 69 65 72 20 28 61 76 65 63 20 65   fichier (avec e
09e0: 78 74 65 6e 73 69 6f 6e 29 0a 09 20 2a 20 40 72  xtension).. * @r
09f0: 65 74 75 72 6e 20 62 6f 6f 6c 65 61 6e 20 54 52  eturn boolean TR
0a00: 55 45 20 65 6e 20 63 61 73 20 64 65 20 73 75 63  UE en cas de suc
0a10: 63 c3 a8 73 0a 09 20 2a 2f 0a 09 70 75 62 6c 69  c..s.. */..publi
0a20: 63 20 66 75 6e 63 74 69 6f 6e 20 65 64 69 74 28  c function edit(
0a30: 24 6e 6f 6d 29 0a 09 7b 0a 0a 09 7d 0a 0a 09 2f  $nom)..{...}.../
0a40: 2a 2a 0a 09 20 2a 20 45 6e 76 6f 69 65 20 6c 65  **.. * Envoie le
0a50: 20 66 69 63 68 69 65 72 20 61 75 20 63 6c 69 65   fichier au clie
0a60: 6e 74 20 48 54 54 50 0a 09 20 2a 20 40 72 65 74  nt HTTP.. * @ret
0a70: 75 72 6e 20 76 6f 69 64 0a 09 20 2a 2f 0a 09 70  urn void.. */..p
0a80: 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20 73  ublic function s
0a90: 65 72 76 65 28 29 0a 09 7b 0a 09 09 2f 2f 20 4c  erve()..{...// L
0aa0: 65 20 63 61 63 68 65 20 65 73 74 20 67 c3 a9 72  e cache est g..r
0ab0: c3 a9 20 70 61 72 20 49 44 20 63 6f 6e 74 65 6e  .. par ID conten
0ac0: 75 2c 20 70 61 73 20 49 44 20 66 69 63 68 69 65  u, pas ID fichie
0ad0: 72 2c 20 70 6f 75 72 20 6d 69 6e 69 6d 69 73 65  r, pour minimise
0ae0: 72 20 6c 27 65 73 70 61 63 65 20 64 69 73 71 75  r l'espace disqu
0af0: 65 20 75 74 69 6c 69 73 c3 a9 0a 09 09 24 63 61  e utilis.....$ca
0b00: 63 68 65 5f 69 64 20 3d 20 27 66 69 63 68 69 65  che_id = 'fichie
0b10: 72 73 2e 27 20 2e 20 24 74 68 69 73 2d 3e 69 64  rs.' . $this->id
0b20: 5f 63 6f 6e 74 65 6e 75 3b 0a 0a 09 09 2f 2f 20  _contenu;....// 
0b30: 4c 65 20 66 69 63 68 69 65 72 20 6e 27 65 78 69  Le fichier n'exi
0b40: 73 74 65 20 70 61 73 20 64 61 6e 73 20 6c 65 20  ste pas dans le 
0b50: 63 61 63 68 65 20 73 74 61 74 69 71 75 65 2c 20  cache statique, 
0b60: 6f 6e 20 6c 27 65 6e 72 65 67 69 73 74 72 65 0a  on l'enregistre.
0b70: 09 09 69 66 20 28 21 53 74 61 74 69 63 5f 43 61  ..if (!Static_Ca
0b80: 63 68 65 3a 3a 65 78 69 73 74 73 28 24 63 61 63  che::exists($cac
0b90: 68 65 5f 69 64 29 29 0a 09 09 7b 0a 09 09 09 24  he_id))...{....$
0ba0: 62 6c 6f 62 20 3d 20 44 42 3a 3a 67 65 74 49 6e  blob = DB::getIn
0bb0: 73 74 61 6e 63 65 28 29 2d 3e 6f 70 65 6e 42 6c  stance()->openBl
0bc0: 6f 62 28 27 66 69 63 68 69 65 72 73 5f 63 6f 6e  ob('fichiers_con
0bd0: 74 65 6e 75 27 2c 20 27 63 6f 6e 74 65 6e 75 27  tenu', 'contenu'
0be0: 2c 20 28 69 6e 74 29 24 74 68 69 73 2d 3e 69 64  , (int)$this->id
0bf0: 5f 63 6f 6e 74 65 6e 75 29 3b 0a 09 09 09 53 74  _contenu);....St
0c00: 61 74 69 63 5f 43 61 63 68 65 3a 3a 73 74 6f 72  atic_Cache::stor
0c10: 65 46 72 6f 6d 50 6f 69 6e 74 65 72 28 24 63 61  eFromPointer($ca
0c20: 63 68 65 5f 69 64 2c 20 24 62 6c 6f 62 29 3b 0a  che_id, $blob);.
0c30: 09 09 09 66 63 6c 6f 73 65 28 24 62 6c 6f 62 29  ...fclose($blob)
0c40: 3b 0a 09 09 7d 0a 0a 09 09 24 70 61 74 68 20 3d  ;...}....$path =
0c50: 20 53 74 61 74 69 63 5f 43 61 63 68 65 3a 3a 67   Static_Cache::g
0c60: 65 74 50 61 74 68 28 24 63 61 63 68 65 5f 69 64  etPath($cache_id
0c70: 29 3b 0a 0a 09 09 2f 2f 20 44 c3 a9 73 61 63 74  );....// D..sact
0c80: 69 76 65 72 20 6c 65 20 63 61 63 68 65 0a 09 09  iver le cache...
0c90: 68 65 61 64 65 72 28 27 50 72 61 67 6d 61 3a 20  header('Pragma: 
0ca0: 70 75 62 6c 69 63 27 29 3b 0a 09 09 68 65 61 64  public');...head
0cb0: 65 72 28 27 45 78 70 69 72 65 73 3a 20 2d 31 27  er('Expires: -1'
0cc0: 29 3b 0a 09 09 68 65 61 64 65 72 28 27 43 61 63  );...header('Cac
0cd0: 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 70 75 62 6c  he-Control: publ
0ce0: 69 63 2c 20 6d 75 73 74 2d 72 65 76 61 6c 69 64  ic, must-revalid
0cf0: 61 74 65 2c 20 70 6f 73 74 2d 63 68 65 63 6b 3d  ate, post-check=
0d00: 30 2c 20 70 72 65 2d 63 68 65 63 6b 3d 30 27 29  0, pre-check=0')
0d10: 3b 0a 0a 09 09 68 65 61 64 65 72 28 27 43 6f 6e  ;....header('Con
0d20: 74 65 6e 74 2d 44 69 73 70 6f 73 69 74 69 6f 6e  tent-Disposition
0d30: 3a 20 61 74 74 61 63 68 6d 65 6e 74 3b 20 66 69  : attachment; fi
0d40: 6c 65 6e 61 6d 65 3d 22 27 20 2e 20 24 74 68 69  lename="' . $thi
0d50: 73 2d 3e 6e 6f 6d 20 2e 20 27 22 27 29 3b 0a 09  s->nom . '"');..
0d60: 09 0a 09 09 2f 2f 20 55 74 69 6c 69 73 61 74 69  ....// Utilisati
0d70: 6f 6e 20 64 65 20 58 53 65 6e 64 46 69 6c 65 20  on de XSendFile 
0d80: 73 69 20 64 69 73 70 6f 6e 69 62 6c 65 0a 09 09  si disponible...
0d90: 69 66 20 28 45 4e 41 42 4c 45 5f 58 53 45 4e 44  if (ENABLE_XSEND
0da0: 46 49 4c 45 20 26 26 20 69 73 73 65 74 28 24 5f  FILE && isset($_
0db0: 53 45 52 56 45 52 5b 27 53 45 52 56 45 52 5f 53  SERVER['SERVER_S
0dc0: 4f 46 54 57 41 52 45 27 5d 29 29 0a 09 09 7b 0a  OFTWARE']))...{.
0dd0: 09 09 09 69 66 20 28 73 74 72 69 73 74 72 28 24  ...if (stristr($
0de0: 5f 53 45 52 56 45 52 5b 27 53 45 52 56 45 52 5f  _SERVER['SERVER_
0df0: 53 4f 46 54 57 41 52 45 27 5d 2c 20 27 61 70 61  SOFTWARE'], 'apa
0e00: 63 68 65 27 29 20 0a 09 09 09 09 26 26 20 66 75  che') .....&& fu
0e10: 6e 63 74 69 6f 6e 5f 65 78 69 73 74 73 28 27 61  nction_exists('a
0e20: 70 61 63 68 65 5f 67 65 74 5f 6d 6f 64 75 6c 65  pache_get_module
0e30: 73 27 29 20 0a 09 09 09 09 26 26 20 69 6e 5f 61  s') .....&& in_a
0e40: 72 72 61 79 28 27 6d 6f 64 5f 78 73 65 6e 64 66  rray('mod_xsendf
0e50: 69 6c 65 27 2c 20 61 70 61 63 68 65 5f 67 65 74  ile', apache_get
0e60: 5f 6d 6f 64 75 6c 65 73 28 29 29 29 0a 09 09 09  _modules()))....
0e70: 7b 0a 09 09 09 09 68 65 61 64 65 72 28 27 58 2d  {.....header('X-
0e80: 53 65 6e 64 66 69 6c 65 3a 20 27 20 2e 20 24 70  Sendfile: ' . $p
0e90: 61 74 68 29 3b 0a 09 09 09 09 72 65 74 75 72 6e  ath);.....return
0ea0: 20 74 72 75 65 3b 0a 09 09 09 7d 0a 09 09 09 65   true;....}....e
0eb0: 6c 73 65 20 69 66 20 28 73 74 72 69 73 74 72 28  lse if (stristr(
0ec0: 24 5f 53 45 52 56 45 52 5b 27 53 45 52 56 45 52  $_SERVER['SERVER
0ed0: 5f 53 4f 46 54 57 41 52 45 27 5d 2c 20 27 6c 69  _SOFTWARE'], 'li
0ee0: 67 68 74 74 70 64 27 29 29 0a 09 09 09 7b 0a 09  ghttpd'))....{..
0ef0: 09 09 09 68 65 61 64 65 72 28 27 58 2d 53 65 6e  ...header('X-Sen
0f00: 64 66 69 6c 65 3a 20 27 20 2e 20 24 70 61 74 68  dfile: ' . $path
0f10: 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 20 74 72  );.....return tr
0f20: 75 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ue;....}...}....
0f30: 2f 2f 20 44 c3 a9 73 61 63 74 69 76 65 72 20 67  // D..sactiver g
0f40: 7a 69 70 0a 09 09 69 66 20 28 66 75 6e 63 74 69  zip...if (functi
0f50: 6f 6e 5f 65 78 69 73 74 73 28 27 61 70 61 63 68  on_exists('apach
0f60: 65 5f 73 65 74 65 6e 76 27 29 29 0a 09 09 7b 0a  e_setenv'))...{.
0f70: 09 09 09 40 61 70 61 63 68 65 5f 73 65 74 65 6e  ...@apache_seten
0f80: 76 28 27 6e 6f 2d 67 7a 69 70 27 2c 20 31 29 3b  v('no-gzip', 1);
0f90: 0a 09 09 7d 0a 0a 09 09 40 69 6e 69 5f 73 65 74  ...}....@ini_set
0fa0: 28 27 7a 6c 69 62 2e 6f 75 74 70 75 74 5f 63 6f  ('zlib.output_co
0fb0: 6d 70 72 65 73 73 69 6f 6e 27 2c 20 27 4f 66 66  mpression', 'Off
0fc0: 27 29 3b 0a 0a 09 09 68 65 61 64 65 72 28 27 43  ');....header('C
0fd0: 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 27  ontent-Length: '
0fe0: 2e 20 28 69 6e 74 29 24 74 68 69 73 2d 3e 74 61  . (int)$this->ta
0ff0: 69 6c 6c 65 29 3b 0a 0a 09 09 6f 62 5f 63 6c 65  ille);....ob_cle
1000: 61 6e 28 29 3b 0a 09 09 66 6c 75 73 68 28 29 3b  an();...flush();
1010: 0a 0a 09 09 2f 2f 20 53 69 6e 6f 6e 20 6f 6e 20  ....// Sinon on 
1020: 65 6e 76 6f 69 65 20 6c 65 20 66 69 63 68 69 65  envoie le fichie
1030: 72 20 c3 a0 20 6c 61 20 6d 61 6e 6f 0a 09 09 72  r .. la mano...r
1040: 65 61 64 66 69 6c 65 28 24 70 61 74 68 29 3b 0a  eadfile($path);.
1050: 09 7d 0a 0a 09 2f 2a 2a 0a 09 20 2a 20 56 c3 a9  .}.../**.. * V..
1060: 72 69 66 69 65 20 73 69 20 6c 65 20 68 61 73 68  rifie si le hash
1070: 20 66 6f 75 72 6e 69 20 6e 27 65 73 74 20 70 61   fourni n'est pa
1080: 73 20 64 c3 a9 6a c3 a0 20 73 74 6f 63 6b c3 a9  s d..j.. stock..
1090: 0a 09 20 2a 20 55 74 69 6c 65 20 70 6f 75 72 20  .. * Utile pour 
10a0: 70 61 72 20 65 78 65 6d 70 6c 65 20 72 65 63 6f  par exemple reco
10b0: 6e 6e 61 c3 ae 74 72 65 20 75 6e 20 66 69 63 68  nna..tre un fich
10c0: 65 72 20 64 6f 6e 74 20 6c 65 20 63 6f 6e 74 65  er dont le conte
10d0: 6e 75 20 65 73 74 20 64 c3 a9 6a c3 a0 20 73 74  nu est d..j.. st
10e0: 6f 63 6b c3 a9 2c 20 65 74 20 c3 a9 76 69 74 65  ock.., et ..vite
10f0: 72 20 75 6e 20 6e 6f 75 76 65 6c 20 75 70 6c 6f  r un nouvel uplo
1100: 61 64 0a 09 20 2a 20 40 70 61 72 61 6d 20 20 73  ad.. * @param  s
1110: 74 72 69 6e 67 20 24 68 61 73 68 20 48 61 73 68  tring $hash Hash
1120: 20 53 48 41 31 0a 09 20 2a 20 40 72 65 74 75 72   SHA1.. * @retur
1130: 6e 20 62 6f 6f 6c 65 61 6e 20 20 20 20 20 20 54  n boolean      T
1140: 52 55 45 20 73 69 20 6c 65 20 68 61 73 68 20 65  RUE si le hash e
1150: 73 74 20 64 c3 a9 6a c3 a0 20 70 72 c3 a9 73 65  st d..j.. pr..se
1160: 6e 74 20 64 61 6e 73 20 66 69 63 68 69 65 72 73  nt dans fichiers
1170: 5f 63 6f 6e 74 65 6e 75 2c 20 46 41 4c 53 45 20  _contenu, FALSE 
1180: 73 69 6e 6f 6e 0a 09 20 2a 2f 0a 09 73 74 61 74  sinon.. */..stat
1190: 69 63 20 70 75 62 6c 69 63 20 66 75 6e 63 74 69  ic public functi
11a0: 6f 6e 20 63 68 65 63 6b 48 61 73 68 28 24 68 61  on checkHash($ha
11b0: 73 68 29 0a 09 7b 0a 09 09 72 65 74 75 72 6e 20  sh)..{...return 
11c0: 28 62 6f 6f 6c 65 61 6e 29 20 44 42 3a 3a 67 65  (boolean) DB::ge
11d0: 74 49 6e 73 74 61 6e 63 65 28 29 2d 3e 73 69 6d  tInstance()->sim
11e0: 70 6c 65 51 75 65 72 79 53 69 6e 67 6c 65 28 0a  pleQuerySingle(.
11f0: 09 09 09 27 53 45 4c 45 43 54 20 31 20 46 52 4f  ...'SELECT 1 FRO
1200: 4d 20 66 69 63 68 69 65 72 73 5f 63 6f 6e 74 65  M fichiers_conte
1210: 6e 75 20 57 48 45 52 45 20 68 61 73 68 20 3d 20  nu WHERE hash = 
1220: 3f 3b 27 2c 20 0a 09 09 09 66 61 6c 73 65 2c 20  ?;', ....false, 
1230: 0a 09 09 09 74 72 69 6d 28 73 74 72 74 6f 6c 6f  ....trim(strtolo
1240: 77 65 72 28 24 68 61 73 68 29 29 0a 09 09 29 3b  wer($hash))...);
1250: 0a 09 7d 0a 0a 09 2f 2a 2a 0a 09 20 2a 20 52 65  ..}.../**.. * Re
1260: 74 6f 75 72 6e 65 20 75 6e 20 74 61 62 6c 65 61  tourne un tablea
1270: 75 20 64 65 20 68 61 73 68 20 74 72 6f 75 76 c3  u de hash trouv.
1280: a9 73 20 64 61 6e 73 20 6c 61 20 44 42 20 70 61  .s dans la DB pa
1290: 72 6d 69 20 75 6e 65 20 6c 69 73 74 65 20 64 65  rmi une liste de
12a0: 20 68 61 73 68 20 66 6f 75 72 6e 69 73 0a 09 20   hash fournis.. 
12b0: 2a 20 40 70 61 72 61 6d 20 20 61 72 72 61 79 20  * @param  array 
12c0: 20 24 6c 69 73 74 20 4c 69 73 74 65 20 64 65 20   $list Liste de 
12d0: 68 61 73 68 20 c3 a0 20 76 c3 a9 72 69 66 69 65  hash .. v..rifie
12e0: 72 0a 09 20 2a 20 40 72 65 74 75 72 6e 20 61 72  r.. * @return ar
12f0: 72 61 79 20 20 20 20 20 20 20 20 4c 69 73 74 65  ray        Liste
1300: 20 64 65 73 20 68 61 73 68 20 74 72 6f 75 76 c3   des hash trouv.
1310: a9 73 0a 09 20 2a 2f 0a 09 73 74 61 74 69 63 20  .s.. */..static 
1320: 70 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20  public function 
1330: 63 68 65 63 6b 48 61 73 68 4c 69 73 74 28 24 6c  checkHashList($l
1340: 69 73 74 29 0a 09 7b 0a 09 09 24 68 61 73 68 5f  ist)..{...$hash_
1350: 6c 69 73 74 20 3d 20 27 27 3b 0a 09 09 24 64 62  list = '';...$db
1360: 20 3d 20 44 42 3a 3a 67 65 74 49 6e 73 74 61 6e   = DB::getInstan
1370: 63 65 28 29 3b 0a 0a 09 09 66 6f 72 65 61 63 68  ce();....foreach
1380: 20 28 24 6c 69 73 74 20 61 73 20 24 68 61 73 68   ($list as $hash
1390: 29 0a 09 09 7b 0a 09 09 09 24 68 61 73 68 5f 6c  )...{....$hash_l
13a0: 69 73 74 20 2e 3d 20 27 5c 27 27 20 2e 20 24 64  ist .= '\'' . $d
13b0: 62 2d 3e 65 73 63 61 70 65 53 74 72 69 6e 67 28  b->escapeString(
13c0: 24 68 61 73 68 29 20 2e 20 27 5c 27 2c 27 3b 0a  $hash) . '\',';.
13d0: 09 09 7d 0a 0a 09 09 24 68 61 73 68 5f 6c 69 73  ..}....$hash_lis
13e0: 74 20 3d 20 73 75 62 73 74 72 28 24 68 61 73 68  t = substr($hash
13f0: 5f 6c 69 73 74 2c 20 30 2c 20 2d 31 29 3b 0a 0a  _list, 0, -1);..
1400: 09 09 72 65 74 75 72 6e 20 24 64 62 2d 3e 71 75  ..return $db->qu
1410: 65 72 79 46 65 74 63 68 41 73 73 6f 63 28 27 53  eryFetchAssoc('S
1420: 45 4c 45 43 54 20 68 61 73 68 2c 20 31 0a 09 09  ELECT hash, 1...
1430: 09 46 52 4f 4d 20 66 69 63 68 69 65 72 73 5f 63  .FROM fichiers_c
1440: 6f 6e 74 65 6e 75 20 57 48 45 52 45 20 68 61 73  ontenu WHERE has
1450: 68 20 49 4e 20 28 27 20 2e 20 24 68 61 73 68 5f  h IN (' . $hash_
1460: 6c 69 73 74 20 2e 20 27 29 3b 27 29 3b 0a 09 7d  list . ');');..}
1470: 0a 0a 09 2f 2a 2a 0a 09 20 2a 20 52 c3 a9 63 75  .../**.. * R..cu
1480: 70 c3 a9 72 61 74 69 6f 6e 20 64 75 20 6d 65 73  p..ration du mes
1490: 73 61 67 65 20 64 27 65 72 72 65 75 72 0a 09 20  sage d'erreur.. 
14a0: 2a 20 40 70 61 72 61 6d 20 20 69 6e 74 65 67 65  * @param  intege
14b0: 72 20 24 65 72 72 6f 72 20 43 6f 64 65 20 65 72  r $error Code er
14c0: 72 65 75 72 20 64 75 20 24 5f 46 49 4c 45 0a 09  reur du $_FILE..
14d0: 20 2a 20 40 72 65 74 75 72 6e 20 73 74 72 69 6e   * @return strin
14e0: 67 20 4d 65 73 73 61 67 65 20 64 27 65 72 72 65  g Message d'erre
14f0: 75 72 0a 09 20 2a 2f 0a 09 73 74 61 74 69 63 20  ur.. */..static 
1500: 70 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20  public function 
1510: 67 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65 28  getErrorMessage(
1520: 24 65 72 72 6f 72 29 0a 09 7b 0a 09 09 73 77 69  $error)..{...swi
1530: 74 63 68 20 28 24 65 72 72 6f 72 29 0a 09 09 7b  tch ($error)...{
1540: 0a 09 09 09 63 61 73 65 20 55 50 4c 4f 41 44 5f  ....case UPLOAD_
1550: 45 52 52 5f 49 4e 49 5f 53 49 5a 45 3a 0a 09 09  ERR_INI_SIZE:...
1560: 09 09 72 65 74 75 72 6e 20 27 4c 65 20 66 69 63  ..return 'Le fic
1570: 68 69 65 72 20 65 78 63 c3 a8 64 65 20 6c 61 20  hier exc..de la 
1580: 74 61 69 6c 6c 65 20 70 65 72 6d 69 73 65 20 70  taille permise p
1590: 61 72 20 6c 61 20 63 6f 6e 66 69 67 75 72 61 74  ar la configurat
15a0: 69 6f 6e 20 64 75 20 73 65 72 76 65 75 72 2e 27  ion du serveur.'
15b0: 3b 0a 09 09 09 63 61 73 65 20 55 50 4c 4f 41 44  ;....case UPLOAD
15c0: 5f 45 52 52 5f 46 4f 52 4d 5f 53 49 5a 45 3a 0a  _ERR_FORM_SIZE:.
15d0: 09 09 09 09 72 65 74 75 72 6e 20 27 4c 65 20 66  ....return 'Le f
15e0: 69 63 68 69 65 72 20 65 78 63 c3 a8 64 65 20 6c  ichier exc..de l
15f0: 61 20 74 61 69 6c 6c 65 20 70 65 72 6d 69 73 65  a taille permise
1600: 20 70 61 72 20 6c 65 20 66 6f 72 6d 75 6c 61 69   par le formulai
1610: 72 65 2e 27 3b 0a 09 09 09 63 61 73 65 20 55 50  re.';....case UP
1620: 4c 4f 41 44 5f 45 52 52 5f 50 41 52 54 49 41 4c  LOAD_ERR_PARTIAL
1630: 3a 0a 09 09 09 09 72 65 74 75 72 6e 20 27 4c 5c  :.....return 'L\
1640: 27 65 6e 76 6f 69 20 64 75 20 66 69 63 68 69 65  'envoi du fichie
1650: 72 20 61 20 c3 a9 74 c3 a9 20 69 6e 74 65 72 72  r a ..t.. interr
1660: 6f 6d 70 75 2e 27 3b 0a 09 09 09 63 61 73 65 20  ompu.';....case 
1670: 55 50 4c 4f 41 44 5f 45 52 52 5f 4e 4f 5f 46 49  UPLOAD_ERR_NO_FI
1680: 4c 45 3a 0a 09 09 09 09 72 65 74 75 72 6e 20 27  LE:.....return '
1690: 41 75 63 75 6e 20 66 69 63 68 69 65 72 20 6e 5c  Aucun fichier n\
16a0: 27 61 20 c3 a9 74 c3 a9 20 72 65 c3 a7 75 2e 27  'a ..t.. re..u.'
16b0: 3b 0a 09 09 09 63 61 73 65 20 55 50 4c 4f 41 44  ;....case UPLOAD
16c0: 5f 45 52 52 5f 4e 4f 5f 54 4d 50 5f 44 49 52 3a  _ERR_NO_TMP_DIR:
16d0: 0a 09 09 09 09 72 65 74 75 72 6e 20 27 50 61 73  .....return 'Pas
16e0: 20 64 65 20 72 c3 a9 70 65 72 74 6f 69 72 65 20   de r..pertoire 
16f0: 74 65 6d 70 6f 72 61 69 72 65 20 70 6f 75 72 20  temporaire pour 
1700: 73 74 6f 63 6b 65 72 20 6c 65 20 66 69 63 68 69  stocker le fichi
1710: 65 72 2e 27 3b 0a 09 09 09 63 61 73 65 20 55 50  er.';....case UP
1720: 4c 4f 41 44 5f 45 52 52 5f 43 41 4e 54 5f 57 52  LOAD_ERR_CANT_WR
1730: 49 54 45 3a 0a 09 09 09 09 72 65 74 75 72 6e 20  ITE:.....return 
1740: 27 49 6d 70 6f 73 73 69 62 6c 65 20 64 5c 27 c3  'Impossible d\'.
1750: a9 63 72 69 72 65 20 6c 65 20 66 69 63 68 69 65  .crire le fichie
1760: 72 20 73 75 72 20 6c 65 20 64 69 73 71 75 65 20  r sur le disque 
1770: 64 75 20 73 65 72 76 65 75 72 2e 27 3b 0a 09 09  du serveur.';...
1780: 09 63 61 73 65 20 55 50 4c 4f 41 44 5f 45 52 52  .case UPLOAD_ERR
1790: 5f 45 58 54 45 4e 53 49 4f 4e 3a 0a 09 09 09 09  _EXTENSION:.....
17a0: 72 65 74 75 72 6e 20 27 55 6e 65 20 65 78 74 65  return 'Une exte
17b0: 6e 73 69 6f 6e 20 64 75 20 73 65 72 76 65 75 72  nsion du serveur
17c0: 20 61 20 69 6e 74 65 72 72 6f 6d 70 75 20 6c 5c   a interrompu l\
17d0: 27 65 6e 76 6f 69 20 64 75 20 66 69 63 68 69 65  'envoi du fichie
17e0: 72 2e 27 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  r.';....default:
17f0: 0a 09 09 09 09 72 65 74 75 72 6e 20 27 45 72 72  .....return 'Err
1800: 65 75 72 20 69 6e 63 6f 6e 6e 75 65 3a 20 27 20  eur inconnue: ' 
1810: 2e 20 24 65 72 72 6f 72 3b 0a 09 09 7d 0a 09 7d  . $error;...}..}
1820: 0a 0a 09 2f 2a 2a 0a 09 20 2a 20 55 70 6c 6f 61  .../**.. * Uploa
1830: 64 20 64 75 20 66 69 63 68 69 65 72 20 70 61 72  d du fichier par
1840: 20 50 4f 53 54 0a 09 20 2a 20 40 70 61 72 61 6d   POST.. * @param
1850: 20 20 61 72 72 61 79 20 20 24 66 69 6c 65 20 20    array  $file  
1860: 43 61 72 61 63 74 c3 a9 72 69 73 74 69 71 75 65  Caract..ristique
1870: 73 20 64 75 20 66 69 63 68 69 65 72 20 65 6e 76  s du fichier env
1880: 6f 79 c3 a9 0a 09 20 2a 20 40 72 65 74 75 72 6e  oy.... * @return
1890: 20 62 6f 6f 6c 65 61 6e 20 54 52 55 45 20 65 6e   boolean TRUE en
18a0: 20 63 61 73 20 64 65 20 73 75 63 63 c3 a8 73 0a   cas de succ..s.
18b0: 09 20 2a 2f 0a 09 73 74 61 74 69 63 20 70 75 62  . */..static pub
18c0: 6c 69 63 20 66 75 6e 63 74 69 6f 6e 20 75 70 6c  lic function upl
18d0: 6f 61 64 28 24 66 69 6c 65 29 0a 09 7b 0a 09 09  oad($file)..{...
18e0: 69 66 20 28 21 65 6d 70 74 79 28 24 66 69 6c 65  if (!empty($file
18f0: 5b 27 65 72 72 6f 72 27 5d 29 29 0a 09 09 7b 0a  ['error']))...{.
1900: 09 09 09 74 68 72 6f 77 20 6e 65 77 20 55 73 65  ...throw new Use
1910: 72 45 78 63 65 70 74 69 6f 6e 28 73 65 6c 66 3a  rException(self:
1920: 3a 67 65 74 45 72 72 6f 72 4d 65 73 73 61 67 65  :getErrorMessage
1930: 28 24 66 69 6c 65 5b 27 65 72 72 6f 72 27 5d 29  ($file['error'])
1940: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 65 6d  );...}....if (em
1950: 70 74 79 28 24 66 69 6c 65 5b 27 73 69 7a 65 27  pty($file['size'
1960: 5d 29 20 7c 7c 20 65 6d 70 74 79 28 24 66 69 6c  ]) || empty($fil
1970: 65 5b 27 6e 61 6d 65 27 5d 29 29 0a 09 09 7b 0a  e['name']))...{.
1980: 09 09 09 74 68 72 6f 77 20 6e 65 77 20 55 73 65  ...throw new Use
1990: 72 45 78 63 65 70 74 69 6f 6e 28 27 46 69 63 68  rException('Fich
19a0: 69 65 72 20 72 65 c3 a7 75 20 69 6e 76 61 6c 69  ier re..u invali
19b0: 64 65 20 3a 20 76 69 64 65 20 6f 75 20 73 61 6e  de : vide ou san
19c0: 73 20 6e 6f 6d 20 64 65 20 66 69 63 68 69 65 72  s nom de fichier
19d0: 2e 27 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  .');...}....if (
19e0: 21 69 73 5f 75 70 6c 6f 61 64 65 64 5f 66 69 6c  !is_uploaded_fil
19f0: 65 28 24 66 69 6c 65 5b 27 74 6d 70 5f 6e 61 6d  e($file['tmp_nam
1a00: 65 27 5d 29 29 0a 09 09 7b 0a 09 09 09 74 68 72  e']))...{....thr
1a10: 6f 77 20 6e 65 77 20 5c 52 75 6e 74 69 6d 65 45  ow new \RuntimeE
1a20: 78 63 65 70 74 69 6f 6e 28 27 4c 65 20 66 69 63  xception('Le fic
1a30: 68 69 65 72 20 6e 5c 27 61 20 70 61 73 20 c3 a9  hier n\'a pas ..
1a40: 74 c3 a9 20 65 6e 76 6f 79 c3 a9 20 64 65 20 6d  t.. envoy.. de m
1a50: 61 6e 69 c3 a8 72 65 20 63 6f 6e 76 65 6e 74 69  ani..re conventi
1a60: 6f 6e 6e 65 6c 6c 65 2e 27 29 3b 0a 09 09 7d 0a  onnelle.');...}.
1a70: 0a 09 09 24 6e 61 6d 65 20 3d 20 70 72 65 67 5f  ...$name = preg_
1a80: 72 65 70 6c 61 63 65 28 27 2f 5b 5e 5c 64 5c 77  replace('/[^\d\w
1a90: 2e 5f 2d 5d 2f 75 69 27 2c 20 27 27 2c 20 24 66  ._-]/ui', '', $f
1aa0: 69 6c 65 5b 27 6e 61 6d 65 27 5d 29 3b 0a 0a 09  ile['name']);...
1ab0: 09 24 62 79 74 65 73 20 3d 20 66 69 6c 65 5f 67  .$bytes = file_g
1ac0: 65 74 5f 63 6f 6e 74 65 6e 74 73 28 24 66 69 6c  et_contents($fil
1ad0: 65 5b 27 74 6d 70 5f 6e 61 6d 65 27 5d 2c 20 66  e['tmp_name'], f
1ae0: 61 6c 73 65 2c 20 6e 75 6c 6c 2c 20 2d 31 2c 20  alse, null, -1, 
1af0: 31 30 32 34 29 3b 0a 09 09 24 74 79 70 65 20 3d  1024);...$type =
1b00: 20 5c 4b 44 32 5c 46 69 6c 65 49 6e 66 6f 3a 3a   \KD2\FileInfo::
1b10: 67 75 65 73 73 4d 69 6d 65 54 79 70 65 28 24 62  guessMimeType($b
1b20: 79 74 65 73 29 3b 0a 0a 09 09 69 66 20 28 21 24  ytes);....if (!$
1b30: 74 79 70 65 29 0a 09 09 7b 0a 09 09 09 24 65 78  type)...{....$ex
1b40: 74 20 3d 20 73 75 62 73 74 72 28 24 6e 61 6d 65  t = substr($name
1b50: 2c 20 73 74 72 72 70 6f 73 28 24 6e 61 6d 65 2c  , strrpos($name,
1b60: 20 27 2e 27 29 2b 31 29 3b 0a 09 09 09 24 65 78   '.')+1);....$ex
1b70: 74 20 3d 20 73 74 72 74 6f 6c 6f 77 65 72 28 24  t = strtolower($
1b80: 65 78 74 29 3b 0a 0a 09 09 09 24 74 79 70 65 20  ext);.....$type 
1b90: 3d 20 5c 4b 44 32 5c 46 69 6c 65 49 6e 66 6f 3a  = \KD2\FileInfo:
1ba0: 3a 67 65 74 4d 69 6d 65 54 79 70 65 46 72 6f 6d  :getMimeTypeFrom
1bb0: 46 69 6c 65 45 78 74 65 6e 73 69 6f 6e 28 24 65  FileExtension($e
1bc0: 78 74 29 3b 0a 09 09 7d 0a 0a 09 09 24 69 73 5f  xt);...}....$is_
1bd0: 69 6d 61 67 65 20 3d 20 70 72 65 67 5f 6d 61 74  image = preg_mat
1be0: 63 68 28 27 2f 5e 69 6d 61 67 65 5c 2f 2f 27 2c  ch('/^image\//',
1bf0: 20 24 74 79 70 65 29 3b 0a 0a 09 09 24 68 61 73   $type);....$has
1c00: 68 20 3d 20 73 68 61 31 5f 66 69 6c 65 28 24 66  h = sha1_file($f
1c10: 69 6c 65 5b 27 74 6d 70 5f 6e 61 6d 65 27 5d 29  ile['tmp_name'])
1c20: 3b 0a 09 09 24 73 69 7a 65 20 3d 20 66 69 6c 65  ;...$size = file
1c30: 73 69 7a 65 28 24 66 69 6c 65 5b 27 74 6d 70 5f  size($file['tmp_
1c40: 6e 61 6d 65 27 5d 29 3b 0a 0a 09 09 24 64 62 20  name']);....$db 
1c50: 3d 20 44 42 3a 3a 67 65 74 49 6e 73 74 61 6e 63  = DB::getInstanc
1c60: 65 28 29 3b 0a 09 09 24 64 62 2d 3e 65 78 65 63  e();...$db->exec
1c70: 28 27 42 45 47 49 4e 3b 27 29 3b 0a 0a 09 09 24  ('BEGIN;');....$
1c80: 64 62 2d 3e 73 69 6d 70 6c 65 49 6e 73 65 72 74  db->simpleInsert
1c90: 28 27 66 69 63 68 69 65 72 73 5f 63 6f 6e 74 65  ('fichiers_conte
1ca0: 6e 75 27 2c 20 5b 0a 09 09 09 27 68 61 73 68 27  nu', [....'hash'
1cb0: 09 09 3d 3e 09 24 68 61 73 68 2c 0a 09 09 09 27  ..=>.$hash,....'
1cc0: 74 61 69 6c 6c 65 27 09 3d 3e 09 28 69 6e 74 29  taille'.=>.(int)
1cd0: 24 73 69 7a 65 2c 0a 09 09 09 27 63 6f 6e 74 65  $size,....'conte
1ce0: 6e 75 27 09 3d 3e 09 5b 5c 53 51 4c 49 54 45 33  nu'.=>.[\SQLITE3
1cf0: 5f 42 4c 4f 42 2c 20 66 69 6c 65 5f 67 65 74 5f  _BLOB, file_get_
1d00: 63 6f 6e 74 65 6e 74 73 28 24 66 69 6c 65 5b 27  contents($file['
1d10: 74 6d 70 5f 6e 61 6d 65 27 5d 29 5d 2c 0a 09 09  tmp_name'])],...
1d20: 5d 29 3b 0a 0a 09 09 24 69 64 5f 63 6f 6e 74 65  ]);....$id_conte
1d30: 6e 75 20 3d 20 24 64 62 2d 3e 6c 61 73 74 49 6e  nu = $db->lastIn
1d40: 73 65 72 74 52 6f 77 49 44 28 29 3b 0a 0a 09 09  sertRowID();....
1d50: 24 64 62 2d 3e 73 69 6d 70 6c 65 49 6e 73 65 72  $db->simpleInser
1d60: 74 28 27 66 69 63 68 69 65 72 73 27 2c 20 5b 0a  t('fichiers', [.
1d70: 09 09 09 27 69 64 5f 63 6f 6e 74 65 6e 75 27 09  ...'id_contenu'.
1d80: 3d 3e 09 28 69 6e 74 29 24 69 64 5f 63 6f 6e 74  =>.(int)$id_cont
1d90: 65 6e 75 2c 0a 09 09 09 27 6e 6f 6d 27 09 09 09  enu,....'nom'...
1da0: 3d 3e 09 24 6e 61 6d 65 2c 0a 09 09 09 27 74 79  =>.$name,....'ty
1db0: 70 65 27 09 09 09 3d 3e 09 24 74 79 70 65 2c 0a  pe'...=>.$type,.
1dc0: 09 09 09 27 69 6d 61 67 65 27 09 09 09 3d 3e 09  ...'image'...=>.
1dd0: 28 69 6e 74 29 24 69 73 5f 69 6d 61 67 65 2c 0a  (int)$is_image,.
1de0: 09 09 5d 29 3b 0a 0a 09 09 24 64 62 2d 3e 65 78  ..]);....$db->ex
1df0: 65 63 28 27 45 4e 44 3b 27 29 3b 0a 0a 09 09 72  ec('END;');....r
1e00: 65 74 75 72 6e 20 6e 65 77 20 46 69 63 68 69 65  eturn new Fichie
1e10: 72 73 28 24 64 62 2d 3e 6c 61 73 74 49 6e 73 65  rs($db->lastInse
1e20: 72 74 52 6f 77 49 44 28 29 29 3b 0a 09 7d 0a 0a  rtRowID());..}..
1e30: 09 73 74 61 74 69 63 20 70 75 62 6c 69 63 20 66  .static public f
1e40: 75 6e 63 74 69 6f 6e 20 75 70 6c 6f 61 64 45 78  unction uploadEx
1e50: 69 73 74 69 6e 67 48 61 73 68 28 24 6e 61 6d 65  istingHash($name
1e60: 2c 20 24 68 61 73 68 29 0a 09 7b 0a 09 09 24 64  , $hash)..{...$d
1e70: 62 20 3d 20 44 42 3a 3a 67 65 74 49 6e 73 74 61  b = DB::getInsta
1e80: 6e 63 65 28 29 3b 0a 09 09 24 6e 61 6d 65 20 3d  nce();...$name =
1e90: 20 70 72 65 67 5f 72 65 70 6c 61 63 65 28 27 2f   preg_replace('/
1ea0: 5b 5e 5c 64 5c 77 2e 5f 2d 5d 2f 75 69 27 2c 20  [^\d\w._-]/ui', 
1eb0: 27 27 2c 20 24 6e 61 6d 65 29 3b 0a 0a 09 09 24  '', $name);....$
1ec0: 66 69 6c 65 20 3d 20 24 64 62 2d 3e 73 69 6d 70  file = $db->simp
1ed0: 6c 65 51 75 65 72 79 53 69 6e 67 6c 65 28 27 53  leQuerySingle('S
1ee0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66 69 63  ELECT * FROM fic
1ef0: 68 69 65 72 73 20 0a 09 09 09 49 4e 4e 45 52 20  hiers ....INNER 
1f00: 4a 4f 49 4e 20 66 69 63 68 69 65 72 73 5f 63 6f  JOIN fichiers_co
1f10: 6e 74 65 6e 75 20 41 53 20 66 63 20 4f 4e 20 66  ntenu AS fc ON f
1f20: 63 2e 69 64 20 3d 20 66 69 63 68 69 65 72 73 2e  c.id = fichiers.
1f30: 69 64 5f 63 6f 6e 74 65 6e 75 20 41 4e 44 20 66  id_contenu AND f
1f40: 63 2e 68 61 73 68 20 3d 20 3f 3b 27 2c 20 74 72  c.hash = ?;', tr
1f50: 75 65 2c 20 74 72 69 6d 28 24 68 61 73 68 29 29  ue, trim($hash))
1f60: 3b 0a 0a 09 09 69 66 20 28 21 24 66 69 6c 65 29  ;....if (!$file)
1f70: 0a 09 09 7b 0a 09 09 09 74 68 72 6f 77 20 6e 65  ...{....throw ne
1f80: 77 20 55 73 65 72 45 78 63 65 70 74 69 6f 6e 28  w UserException(
1f90: 27 4c 65 20 66 69 63 68 69 65 72 20 c3 a0 20 63  'Le fichier .. c
1fa0: 6f 70 69 65 72 20 6e 5c 27 65 78 69 73 74 65 20  opier n\'existe 
1fb0: 70 61 73 20 28 61 75 63 75 6e 20 68 61 73 68 20  pas (aucun hash 
1fc0: 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 20 c3 a0  ne correspond ..
1fd0: 20 27 2e 24 68 61 73 68 2e 27 29 2e 27 29 3b 0a   '.$hash.').');.
1fe0: 09 09 7d 0a 0a 09 09 24 64 62 2d 3e 73 69 6d 70  ..}....$db->simp
1ff0: 6c 65 49 6e 73 65 72 74 28 27 66 69 63 68 69 65  leInsert('fichie
2000: 72 73 27 2c 20 5b 0a 09 09 09 27 69 64 5f 63 6f  rs', [....'id_co
2010: 6e 74 65 6e 75 27 09 3d 3e 09 28 69 6e 74 29 24  ntenu'.=>.(int)$
2020: 66 69 6c 65 5b 27 69 64 5f 63 6f 6e 74 65 6e 75  file['id_contenu
2030: 27 5d 2c 0a 09 09 09 27 6e 6f 6d 27 09 09 09 3d  '],....'nom'...=
2040: 3e 09 24 6e 61 6d 65 2c 0a 09 09 09 27 74 79 70  >.$name,....'typ
2050: 65 27 09 09 09 3d 3e 09 24 66 69 6c 65 5b 27 74  e'...=>.$file['t
2060: 79 70 65 27 5d 2c 0a 09 09 09 27 69 6d 61 67 65  ype'],....'image
2070: 27 09 09 09 3d 3e 09 28 69 6e 74 29 24 66 69 6c  '...=>.(int)$fil
2080: 65 5b 27 69 6d 61 67 65 27 5d 2c 0a 09 09 5d 29  e['image'],...])
2090: 3b 0a 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 20  ;....return new 
20a0: 46 69 63 68 69 65 72 73 28 24 64 62 2d 3e 6c 61  Fichiers($db->la
20b0: 73 74 49 6e 73 65 72 74 52 6f 77 49 44 28 29 29  stInsertRowID())
20c0: 3b 0a 09 7d 0a 7d                                ;..}.}