Browse Source

Rector sur Bigup pour PHP 7.4+, avec différentes corrections a posteriori

remotes/checkIfPRContentChanged-1642770535206401406/master
Matthieu Marcillaud 1 week ago
parent
commit
efa7f17ad5
  1. 2
      bigup_pipelines.php
  2. 10
      inc/Bigup.php
  3. 23
      inc/Bigup/Cache.php
  4. 23
      inc/Bigup/CacheFichiers.php
  5. 21
      inc/Bigup/CacheRepertoire.php
  6. 4
      inc/Bigup/Files.php
  7. 32
      inc/Bigup/Flow.php
  8. 12
      inc/Bigup/Formulaire.php
  9. 50
      inc/Bigup/Identifier.php
  10. 37
      inc/Bigup/Repondre.php

2
bigup_pipelines.php

@ -59,7 +59,7 @@ function bigup_insert_head($flux) {
function bigup_header_prive($flux) {
include_spip('inc/config');
$maxFileSize = intval(lire_config('bigup/max_file_size', 0));
$formatLogos = json_encode($GLOBALS['formats_logos']);
$formatLogos = json_encode($GLOBALS['formats_logos'], JSON_THROW_ON_ERROR);
$flux .= <<<EOS
<script type='text/javascript'>jQuery.bigup_config = {maxFileSize: $maxFileSize, formatsLogos: $formatLogos}</script>
EOS;

10
inc/Bigup.php

@ -35,15 +35,13 @@ class Bigup {
/**
* Identification du formulaire, auteur, champ, tokem
* @var Identifier
*/
private $identifier = null;
private ?\Spip\Bigup\Identifier $identifier = null;
/**
* Gestion du cache Bigup
* @var Identifier
*/
private $cache = null;
private ?\Spip\Bigup\Cache $cache = null;
/**
* Constructeur
@ -146,7 +144,7 @@ class Bigup {
unset($surveiller[$champ][$i]);
}
}
if (!count($surveiller[$champ])) {
if (!(is_countable($surveiller[$champ]) ? count($surveiller[$champ]) : 0)) {
unset($surveiller[$champ]);
}
}
@ -165,7 +163,7 @@ class Bigup {
*/
public function supprimer_fichiers($identifiants = []) {
if (!$identifiants) {
$this->debug('Suppression des fichiers');
static::debug('Suppression des fichiers');
$this->cache->supprimer_repertoires();
} else {
$this->cache->final->supprimer_fichiers($identifiants);

23
inc/Bigup/Cache.php

@ -2,6 +2,9 @@
namespace Spip\Bigup;
use \Spip\Bigup\CacheRepertoire;
use \Spip\Bigup\Identifier;
/**
* Gère le cache des fichiers dans tmp/bigupload
*
@ -21,24 +24,20 @@ class Cache {
/**
* Identification du formulaire, auteur, champ, tokem
* @var Identifier
*/
private $identifier = null;
private ?Identifier $identifier = null;
/**
* Nom du répertoire, dans _DIR_TMP, qui va stocker les fichiers et morceaux de fichiers
* @var string */
private $cache_dir = 'bigupload';
* Nom du répertoire, dans _DIR_TMP, qui va stocker les fichiers et morceaux de fichiers */
private string $cache_dir = 'bigupload';
/**
* Cache des morceaux de fichiers
* @var string */
private $parts = '';
* Cache des morceaux de fichiers */
private CacheRepertoire $parts;
/**
* Cache des fichiers complets
* @var string */
private $final = '';
* Cache des fichiers complets */
private CacheRepertoire $final;
/**
* Constructeur
@ -59,7 +58,7 @@ class Cache {
if (property_exists($this, $property)) {
return $this->$property;
}
$this->debug("Propriété `$property` demandée mais inexistante.");
static::debug("Propriété `$property` demandée mais inexistante.");
return null;
}

23
inc/Bigup/CacheFichiers.php

@ -2,6 +2,10 @@
namespace Spip\Bigup;
use \Spip\Bigup\CacheRepertoire;
use \Spip\Bigup\Identifier;
/**
* Gère le cache des fichiers dans tmp/bigupload
*
@ -21,19 +25,16 @@ class CacheFichiers {
use LogTrait;
/**
* Cache racine du stockage
* @var CacheRepertoire */
private $cache = null;
* Cache racine du stockage */
private ?CacheRepertoire $cache = null;
/**
* Identification du formulaire
* @var Identifier */
private $identifier = null;
* Identification du formulaire */
private ?Identifier $identifier = null;
/**
* Nom du champ
* @var string */
private $champ = null;
* Nom du champ */
private ?string $champ = null;
/**
@ -67,7 +68,7 @@ class CacheFichiers {
public function dir_identifiant($identifiant) {
return $this->dir_champ()
. DIRECTORY_SEPARATOR
. $this->hash_identifiant($identifiant);
. static::hash_identifiant($identifiant);
}
/**
@ -300,6 +301,7 @@ class CacheFichiers {
* @return array|bool
*/
public static function lire_description_fichier($chemin) {
$json = null;
$cache = self::chemin_description($chemin);
if (!lire_fichier($cache, $json)) {
return false;
@ -323,6 +325,7 @@ class CacheFichiers {
* False si vignette non calculée, tableau avec clés : 'width', 'height', 'data'
*/
public static function creer_vignette($desc, $width, $height) {
$vignette = null;
// description de fichier bigup / files
if (
!is_array($desc)

21
inc/Bigup/CacheRepertoire.php

@ -2,6 +2,10 @@
namespace Spip\Bigup;
use Spip\Bigup\Cache;
use Spip\Bigup\CacheFichiers;
use Spip\Bigup\GestionRepertoires;
/**
* Gère le cache des fichiers dans tmp/bigupload
*
@ -21,19 +25,16 @@ class CacheRepertoire {
/**
* Gestion générale du cache
* @var Cache
*/
private $cache = null;
private ?Cache $cache = null;
/**
* Chemin du répertoire temporaire pour ce formulaire
* @var string */
private $dir = '';
* Chemin du répertoire temporaire pour ce formulaire */
private string $dir = '';
/**
* Chemin du répertoire temporaire pour un champ de formulaire
* @var string */
private $fichiers = null;
* Chemin du répertoire temporaire pour un champ de formulaire */
private ?CacheFichiers $fichiers = null;
/**
* Constructeur
@ -65,7 +66,7 @@ class CacheRepertoire {
if (property_exists($this, $property)) {
return $this->$property;
}
$this->debug("Propriété `$property` demandée mais inexistante.");
static::debug("Propriété `$property` demandée mais inexistante.");
return null;
}
@ -185,7 +186,7 @@ class CacheRepertoire {
$identifiants = array_map('Spip\\Bigup\\CacheFichiers::hash_identifiant', $identifiants); // PHP 5.4
#$identifiants = array_map(CacheFichiers::class . '::hash_identifiant', $identifiants); // PHP >= 5.5
$this->debug('Demande de suppression de fichiers : ' . implode(', ', $identifiants));
static::debug('Demande de suppression de fichiers : ' . implode(', ', $identifiants));
foreach ($liste as $champ => $fichiers) {
foreach ($fichiers as $description) {
if (in_array($description['bigup']['identifiant'], $identifiants)) {

4
inc/Bigup/Files.php

@ -82,7 +82,7 @@ class Files {
return false;
}
// si c'était le dernier []
if (!count($arborescence)) {
if (!(is_countable($arborescence) ? count($arborescence) : 0)) {
return (false !== array_search($valeur, $tableau));
} else {
// champ[][truc]
@ -150,7 +150,7 @@ class Files {
}
$me = &$me[$a];
} else {
$i = count($me);
$i = is_countable($me) ? count($me) : 0;
$me[$i] = [];
$me = &$me[$i];
}

32
inc/Bigup/Flow.php

@ -2,6 +2,8 @@
namespace Spip\Bigup;
use \Spip\Bigup\Cache;
/**
* Intégration de flow.js (ou resumable.js) côté PHP
*
@ -42,19 +44,17 @@ class Flow {
/**
* Gestion du cache Bigup
* @var Cache
*/
private $cache = null;
private ?Cache $cache = null;
/**
* Préfixe utilisé par la librairie JS lors d'une requête
* @var string */
private $prefixe = 'flow';
* Préfixe utilisé par la librairie JS lors d'une requête */
private string $prefixe = 'flow';
/**
* Taille de fichier maximum
*/
private $maxSizeFile = 0;
private int $maxSizeFile = 0;
/**
* Constructeur
@ -168,7 +168,7 @@ class Flow {
$filename = $this->_request('filename');
$chunkNumber = (int) $this->_request('chunkNumber');
$this->info("Test chunk $identifier$chunkNumber");
static::info("Test chunk $identifier$chunkNumber");
if (!$this->isChunkUploaded($identifier, $filename, $chunkNumber)) {
return $this->response(204);
@ -192,10 +192,10 @@ class Flow {
$totalSize = (int) $this->_request('totalSize');
$maxSize = $this->maxSizeFile * 1024 * 1024;
$this->info("Réception chunk $identifier$chunkNumber");
static::info("Réception chunk $identifier$chunkNumber");
if ($maxSize and $totalSize > $maxSize) {
$this->info('Fichier reçu supérieur à taille autorisée');
static::info('Fichier reçu supérieur à taille autorisée');
return $this->responseError(_T('bigup:erreur_taille_max', ['taille' => taille_en_octets($maxSize)]));
}
@ -214,14 +214,14 @@ class Flow {
// tous les morceaux recus ?
if ($this->isFileUploadComplete($filename, $identifier, $totalSize, $totalChunks)) {
$this->info("Chunks complets de $identifier");
static::info("Chunks complets de $identifier");
$chemin_parts = $this->cache->parts->fichiers->dir_fichier($identifier, $filename);
$chemin_final = $this->cache->final->fichiers->path_fichier($identifier, $filename);
$eviter_concurrence = $chemin_parts . DIRECTORY_SEPARATOR . '.done';
if (file_exists($eviter_concurrence)) {
$this->debug("Chunks de $identifier déjà en traitement");
static::debug("Chunks de $identifier déjà en traitement");
return $this->response(200);
}
touch($eviter_concurrence);
@ -230,7 +230,7 @@ class Flow {
$fullFile = $this->createFileFromChunks($this->getChunkFiles($chemin_parts), $chemin_final);
if (!$fullFile) {
// on ne devrait jamais arriver là !
$this->error('! Création du fichier complet en échec (' . $chemin_final . ').');
static::error('! Création du fichier complet en échec (' . $chemin_final . ').');
return $this->response(415);
}
@ -294,7 +294,7 @@ class Flow {
}
$chunkTotalSize = $this->getChunkTotalSize($filename, $identifier);
if ($totalSize < $chunkTotalSize) {
$this->error("Taille incorrecte des morceaux pour $identifier : $totalSize attendu, $chunkTotalSize present");
static::error("Taille incorrecte des morceaux pour $identifier : $totalSize attendu, $chunkTotalSize present");
return false;
}
return true;
@ -372,7 +372,7 @@ class Flow {
// on le déplace simplement au bon endroit
if (count($chunkFiles) == 1) {
if (@rename($chunkFiles[0], $destFile)) {
$this->info('Fichier complet déplacé : ' . $destFile);
static::info('Fichier complet déplacé : ' . $destFile);
return $destFile;
}
}
@ -387,8 +387,8 @@ class Flow {
return false;
}
$this->info('Fichier complet recréé : ' . $destFile);
$this->debug('Suppression des morceaux.');
static::info('Fichier complet recréé : ' . $destFile);
static::debug('Suppression des morceaux.');
foreach ($chunkFiles as $f) {
@unlink($f);
}

12
inc/Bigup/Formulaire.php

@ -2,6 +2,9 @@
namespace Spip\Bigup;
use \Spip\Bigup\Identifier;
/**
* Gère les modifications du html d'un formulaire existant
*
@ -24,21 +27,18 @@ class Formulaire
/**
* Identification du formulaire, auteur, champ, tokem
* @var Identifier
*/
private $identifier = null;
private ?Identifier $identifier = null;
/**
* Code HTML du formulaire
* @var string
*/
private $formulaire = '';
private string $formulaire = '';
/**
* Contexte d'environnement du formulaire
* @var string
*/
private $contexte = [];
private array $contexte = [];
/**
* Constructeur

50
inc/Bigup/Identifier.php

@ -21,35 +21,29 @@ class Identifier {
use LogTrait;
/**
* Login ou identifiant de l'auteur qui intéragit
* @var string */
private $auteur = '';
* Login ou identifiant de l'auteur qui intéragit */
private string $auteur = '';
/**
* Nom du formulaire qui utilise flow
* @var string */
private $formulaire = '';
* Nom du formulaire qui utilise flow */
private string $formulaire = '';
/**
* Hash des arguments du formulaire
* @var string */
private $formulaire_args = '';
* Hash des arguments du formulaire */
private string $formulaire_args = '';
/**
* Identifie un formulaire par rapport à un autre identique sur la même page ayant un appel différent.
* @var string */
private $formulaire_identifiant = '';
* Identifie un formulaire par rapport à un autre identique sur la même page ayant un appel différent. */
private string $formulaire_identifiant = '';
/**
* Nom du champ dans le formulaire qui utilise flow
* @var string */
private $champ = '';
* Nom du champ dans le formulaire qui utilise flow */
private string $champ = '';
/**
* Token de la forme `champ:time:cle`
* @var string
**/
private $token = '';
private string $token = '';
/**
* Expiration du token (en secondes)
@ -57,13 +51,13 @@ class Identifier {
* @todo À définir en configuration
* @var int En secondes
**/
private $token_expiration = 86400;
private int $token_expiration = 86400;
/**
* Taille du fichier maximum
* @var int En Mo
*/
private $max_size_file = 0;
private int $max_size_file = 0;
/**
* Constructeur
@ -133,7 +127,7 @@ class Identifier {
if (property_exists($this, $property)) {
return $this->$property;
}
$this->debug("Propriété `$property` demandée mais inexistante.");
static::debug("Propriété `$property` demandée mais inexistante.");
return null;
}
@ -261,46 +255,46 @@ class Identifier {
**/
public function verifier_token() {
if (!$this->token) {
$this->debug('Aucun token');
static::debug('Aucun token');
return false;
}
$_token = explode(':', $this->token);
if (count($_token) != 3) {
$this->debug('Token mal formé');
static::debug('Token mal formé');
return false;
}
list($champ, $time, $cle) = $_token;
[$champ, $time, $cle] = $_token;
$time = intval($time);
$now = time();
if (($now - $time) > $this->token_expiration) {
$this->log('Token expiré');
static::log('Token expiré');
return false;
}
if (!$this->formulaire) {
$this->log('Vérifier token : nom du formulaire absent');
static::log('Vérifier token : nom du formulaire absent');
return false;
}
if (!$this->formulaire_args) {
$this->log('Vérifier token : hash du formulaire absent');
static::log('Vérifier token : hash du formulaire absent');
return false;
}
include_spip('inc/securiser_action');
if (!verifier_action_auteur("bigup/$this->formulaire/$this->formulaire_args/$champ/$time", $cle)) {
$this->error('Token invalide');
static::error('Token invalide');
return false;
}
$this->champ = $champ;
$this->debug("Token OK : formulaire $this->formulaire, champ $champ, identifiant $this->formulaire_identifiant");
static::debug("Token OK : formulaire $this->formulaire, champ $champ, identifiant $this->formulaire_identifiant");
return true;
}

37
inc/Bigup/Repondre.php

@ -2,6 +2,9 @@
namespace Spip\Bigup;
use \Spip\Bigup\Identifier;
use \Spip\Bigup\Cache;
/**
* Gère la réception d'actions ajax
*
@ -26,19 +29,16 @@ class Repondre {
/**
* Identification du formulaire, auteur, champ, tokem
* @var Identifier
*/
private $identifier = null;
private ?Identifier $identifier = null;
/**
* Nom d'une action demandée
*
* Si pas de précision => gestion par Flow
*
* @var string
**/
private $action = '';
private string $action = '';
/**
* Identifiant d'un fichier (en cas de suppression demandée)
@ -49,16 +49,13 @@ class Repondre {
* Soit un identifiant (uniqueIdentifier) qui sert au rangement du fichier, calculé
* par Flow.js ou Resumable.js à partir du nom et de la taille du fichier.
* Cet identifiant est envoyé si on annule un fichier en cours de téléversement.
*
* @var string
**/
private $identifiant = '';
private string $identifiant = '';
/**
* Gestion du cache Bigup
* @var Identifier
*/
private $cache = null;
private ?Cache $cache = null;
/**
* Constructeur
@ -76,8 +73,8 @@ class Repondre {
*/
public static function depuisRequest() {
$repondre = new self(Identifier::depuisRequest());
$repondre->action = _request('bigup_action');
$repondre->identifiant = _request('identifiant');
$repondre->action = _request('bigup_action') ?? '';
$repondre->identifiant = _request('identifiant') ?? '';
return $repondre;
}
@ -94,7 +91,7 @@ class Repondre {
**/
public function repondre() {
if (!$this->identifier->verifier_token()) {
return $this->send(403);
return static::send(403);
}
if ($this->action) {
@ -103,7 +100,7 @@ class Repondre {
return $this->$repondre_action();
}
// Action inconnue.
return $this->send(403);
return static::send(403);
}
return $this->repondre_flow();
@ -117,14 +114,14 @@ class Repondre {
**/
public function repondre_effacer() {
if (!$this->identifiant) {
return $this->send(404);
return static::send(404);
}
// Soit c'est l'identifiant d'origine de Flow,
// Soit c'est l'identifiant du répertoire de ce fichier dans le cache
if ($this->cache->supprimer_fichier($this->identifiant)) {
return $this->send(201);
return static::send(201);
}
return $this->send(404);
return static::send(404);
}
@ -147,11 +144,11 @@ class Repondre {
$desc = CacheFichiers::obtenir_description_fichier($res)
and $desc = self::nettoyer_description_fichier_retour_ajax($desc)
) {
$this->send(200, $desc);
static::send(200, $desc);
}
}
$this->send($res->code, $res->data);
static::send($res->code, $res->data);
}
/**
@ -166,7 +163,7 @@ class Repondre {
http_response_code($code);
if ($data) {
header('Content-Type: application/json; charset=' . $GLOBALS['meta']['charset']);
echo json_encode($data);
echo json_encode($data, JSON_THROW_ON_ERROR);
}
exit;
}

Loading…
Cancel
Save