Browse Source

refactor: actions associer / dissocier

* On n'accepte que le slash comme séparateur des params
* Log en cas d'erreur
* Toujours faire appel à l'autorisation d'associer / dissocier (pour chaque album si on en dissocie plusieurs)
* On déporte le test d'id négatif dans les autorisations (commit suivant)
pull/21/head
tcharlss 5 days ago
parent
commit
3c60f20cb3
  1. 38
      action/associer_album.php
  2. 84
      action/dissocier_album.php

38
action/associer_album.php

@ -23,14 +23,14 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* #URL_ACTION_AUTEUR{associer_album, #ID_ALBUM/#OBJET/#ID_OBJET, #SELF}
* ```
*
* @param string $arg
* Arguments séparés par un charactère non alphanumérique
* sous la forme `$id_album/$objet/$id_objet`
* @param string|null $arg
* Arguments séparés par un slash `/`
* sous la forme `id_album/objet/id_objet`
*
* - id_album : identifiant de l'album
* - objet : type d'objet à associer
* - objet : type d'objet à associer
* - id_objet : identifiant de l'objet à associer
* @return void
* @return bool
*/
function action_associer_album_dist($arg = null) {
@ -39,10 +39,30 @@ function action_associer_album_dist($arg = null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
[$id_album, $objet, $id_objet] = preg_split('/\W/', $arg);
$ok = false;
if ($id_album = intval($id_album)) {
include_spip('action/editer_liens');
objet_associer(['album' => $id_album], [$objet => $id_objet]);
// Éviter les notices si arg mal formaté
if (substr_count($arg, '/') === 2) {
[$id_album, $objet, $id_objet] = explode('/', $arg);
$id_album = (int) $id_album;
$id_objet = (int) $id_objet; // peut être négatif
// Il faut avoir le droit
if (
$id_album
and $objet
and autoriser('associer', 'album', $id_album, '', ['objet' => $objet, 'id_objet' => $id_objet])
) {
include_spip('action/editer_liens');
// objet_associer retourne le nombre de liens traités en cas de succès, sinon false
$associer = objet_associer(['album' => $id_album], [$objet => $id_objet]);
$ok = ($associer > 0 ? true : false);
}
}
if (!$ok) {
spip_log("associer_album : erreur, ou action pas autorisée, ou arg pas compris : $arg", 'albums');
}
return $ok;
}

84
action/dissocier_album.php

@ -24,15 +24,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* #URL_ACTION_AUTEUR{dissocier_album, tous/#OBJET/#ID_OBJET, #SELF}
* ```
*
* @param string $arg
* Arguments séparés par un slash «/»
* sous la forme `$album/$objet/$id_objet`
* @param string|null $arg
* Arguments séparés par un slash `/`,
* sous la forme `id_album_ou_tous/objet/id_objet`
*
* - album : identifiant d'un album pour dissocier un album unique
* «tous» pour dissocier tous les albums
* - objet : type d'objet à dissocier
* - id_objet : identifiant de l'objet à dissocier
* @return void
* - id_album_ou_tous : soit l'identifiant d'un album
* soit le mot-clé `tous` pour dissocier en masse
* - objet : type d'objet à dissocier
* - id_objet : identifiant de l'objet à dissocier
* @return bool
*/
function action_dissocier_album_dist($arg = null) {
@ -41,41 +41,43 @@ function action_dissocier_album_dist($arg = null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
[$album, $objet, $id_objet] = explode('/', $arg);
$ok = false;
// si l'identifiant de l'objet est négatif, vérifier qu'il correspondant à celui du visiteur,
// (cas d'un album lié à un objet pas encore enregistré en base).
if (
$id_objet = intval($id_objet)
and (
($id_objet < 0 and $id_objet == -$GLOBALS['visiteur_session']['id_auteur'])
or autoriser('modifier', $objet, $id_objet)
)
) {
// Éviter les notices si arg mal formaté
if (substr_count($arg, '/') === 2) {
[$id_album_ou_tous, $objet, $id_objet] = explode('/', $arg);
$id_objet = (int) $id_objet;
include_spip('action/editer_liens');
switch ($album) {
case 'tous':
// Ne dissocier que les albums non insérés dans le texte.
// = autorisation à dissocier un album d'un objet,
// sauf qu'on économise des requêtes.
if (is_array($liens = objet_trouver_liens(['album' => '*'], [$objet => $id_objet]))) {
$ids_albums = [];
foreach ($liens as $lien) {
if ($lien['vu'] == 'non') {
$ids_albums[] = $lien['id_album'];
}
}
objet_dissocier(['album' => $ids_albums], [$objet => $id_objet]);
}
break;
default:
if (
$id_album = intval($album)
and autoriser('dissocier', 'album', $id_album, '', ['objet' => $objet, 'id_objet' => $id_objet])
) {
objet_dissocier(['album' => $id_album], [$objet => $id_objet]);
}
break;
// On liste tous les albums à dissocier
$ids_albums = [];
if ($id_album_ou_tous === 'tous') {
$liens = objet_trouver_liens(['album' => '*'], [$objet => $id_objet]);
$ids_albums = array_column($liens, 'id_album');
$ids_albums = array_map('intval', $ids_albums);
} else {
$ids_albums = [(int) $id_album_ou_tous];
}
// On ne garde que ceux qu'on a le droit de dissocier
$ids_albums_autorises = [];
foreach ($ids_albums as $id_album) {
if (autoriser('dissocier', 'album', $id_album, '', ['objet' => $objet, 'id_objet' => $id_objet])) {
$ids_albums_autorises[] = $id_album;
}
}
// Il faut qu'il reste au moins 1 autorisé à être dissocié
if (count($ids_albums_autorises) > 0) {
// objet_dissocier retourne le nombre de liens traités en cas de succès, sinon false
$dissocier = objet_dissocier(['album' => $ids_albums_autorises], [$objet => $id_objet]);
$ok = ($dissocier === count($ids_albums_autorises) ? true : false);
}
}
if (!$ok) {
spip_log("dissocier_album : erreur, ou action pas autorisée, ou arg pas compris : $arg", 'albums');
}
return $ok;
}

Loading…
Cancel
Save