Overview
Comment: | Implement file removal from accounting |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | dev |
Files: | files | file ages | folders |
SHA1: |
0e3b549c27831f36afbfb11ebd7f5752 |
User & Date: | bohwaz on 2020-11-11 17:01:01 |
Other Links: | branch diff | manifest | tags |
Context
2020-11-11
| ||
19:08 | Improve handling of cases where URI or HOST cannot be found check-in: 2dd6d2e7ce user: bohwaz tags: dev | |
17:01 | Implement file removal from accounting check-in: 0e3b549c27 user: bohwaz tags: dev | |
16:30 | Fix width of lines in advanced form (thanks @Fred) check-in: 27cde33216 user: bohwaz tags: dev, 1.0.0-alpha6 | |
Changes
Modified src/include/lib/Garradin/Fichiers.php from [76e676e125] to [650d45f7ef].
︙ | ︙ | |||
141 142 143 144 145 146 147 148 149 150 151 152 153 | { throw new \LogicException('Ce fichier est déjà lié à un autre contenu : ' . $check_type); } return $db->preparedQuery('INSERT OR IGNORE INTO fichiers_' . $type . ' (fichier, id) VALUES (?, ?);', [(int)$this->id, (int)$foreign_id]); } /** * Vérifie que l'utilisateur a bien le droit d'accéder à ce fichier * @param mixed $user Tableau contenant les infos sur l'utilisateur connecté, provenant de Session::getUser, ou false * @return boolean TRUE si l'utilisateur a le droit d'accéder au fichier, sinon FALSE */ | > > > > > > > > > > > > > | > | | | | | | | | | | | > | > > | | > > > > | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 | { throw new \LogicException('Ce fichier est déjà lié à un autre contenu : ' . $check_type); } return $db->preparedQuery('INSERT OR IGNORE INTO fichiers_' . $type . ' (fichier, id) VALUES (?, ?);', [(int)$this->id, (int)$foreign_id]); } public function getLinkedId(string $type) { $check = [self::LIEN_MEMBRES, self::LIEN_WIKI, self::LIEN_COMPTA]; if (!in_array($type, $check)) { throw new \LogicException('Type de lien de fichier inconnu.'); } return DB::getInstance()->firstColumn(sprintf('SELECT id FROM fichiers_%s WHERE fichier = %d;', $type, $this->id)); } /** * Vérifie que l'utilisateur a bien le droit d'accéder à ce fichier * @param mixed $user Tableau contenant les infos sur l'utilisateur connecté, provenant de Session::getUser, ou false * @return boolean TRUE si l'utilisateur a le droit d'accéder au fichier, sinon FALSE */ public function checkAccess(Session $session, bool $require_admin = false) { $config = Config::getInstance(); if ($config->get('image_fond') == $this->id) { return true; } $db = DB::getInstance(); if (!$require_admin) { // On regarde déjà si le fichier n'est pas lié au wiki $query = sprintf('SELECT wp.droit_lecture FROM fichiers_%s AS link INNER JOIN wiki_pages AS wp ON wp.id = link.id WHERE link.fichier = ? LIMIT 1;', self::LIEN_WIKI); $wiki = $db->firstColumn($query, (int)$this->id); // Page wiki publique, aucune vérification à faire, seul cas d'accès à un fichier en dehors de l'espace admin if ($wiki !== false && $wiki == Wiki::LECTURE_PUBLIC) { return true; } } // Pas d'utilisateur connecté, pas d'accès aux fichiers de l'espace admin if (!$session->isLogged()) { return false; } $user = $session->getUser(); if ($wiki !== false) { // S'il n'a même pas droit à accéder au wiki c'est mort if (!$session->canAccess('wiki', Membres::DROIT_ACCES)) { return false; } // On renvoie à l'objet Wiki pour savoir si l'utilisateur a le droit de lire ce fichier $_w = new Wiki; $_w->setRestrictionCategorie($user->id_categorie, $user->droit_wiki); return $require_admin ? $_w->canWritePage($wiki) : $_w->canReadPage($wiki); } $level = $require_admin ? Membres::DROIT_ADMIN : Membres::DROIT_ACCES; // On regarde maintenant si le fichier est lié à la compta $query = sprintf('SELECT 1 FROM fichiers_%s WHERE fichier = ? LIMIT 1;', self::LIEN_COMPTA); $compta = $db->firstColumn($query, (int)$this->id); if ($compta) { // OK si accès à la compta return $session->canAccess('compta', $level); } // Enfin, si le fichier est lié à un membre $query = sprintf('SELECT id FROM fichiers_%s WHERE fichier = ? LIMIT 1;', self::LIEN_MEMBRES); $membre = $db->firstColumn($query, (int)$this->id); if ($membre !== false) { // De manière évidente, l'utilisateur a le droit d'accéder aux fichiers liés à son profil if ((int)$membre == $user->id) { return true; } // Pour voir les fichiers des membres il faut pouvoir les gérer if ($level == Membres::DROIT_ACCES) { $level = Membres::DROIT_ECRITURE; } if ($session->canAccess('membres', $level)) { return true; } } return false; } |
︙ | ︙ |
Modified src/templates/acc/transactions/details.tpl from [680b63f47f] to [ab7dede30e].
︙ | ︙ | |||
72 73 74 75 76 77 78 79 80 81 82 83 84 85 | <dt>Fichiers joints</dt> {foreach from=$files item="file"} <dd> <aside class="file"> <a target="_blank" href="{$file.url}">{$file.nom}</a> <small>({$file.type}, {$file.taille|format_bytes})</small> </aside> </dd> {foreachelse} <dd>-</dd> {/foreach} </dl> | > > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | <dt>Fichiers joints</dt> {foreach from=$files item="file"} <dd> <aside class="file"> <a target="_blank" href="{$file.url}">{$file.nom}</a> <small>({$file.type}, {$file.taille|format_bytes})</small> {linkbutton shape="download" href=$file.url target="_blank" label="Télécharger"} {linkbutton shape="delete" href="acc/transactions/delete_file.php?id=%d&from=%d"|args:$file.id,$transaction.id label="Supprimer"} </aside> </dd> {foreachelse} <dd>-</dd> {/foreach} </dl> |
︙ | ︙ |
Added src/templates/common/delete_file.tpl version [42a5f97ba7].
> > > > > > > > | 1 2 3 4 5 6 7 8 | {include file="admin/_head.tpl" title="Supprimer un fichier" current=null} {include file="common/delete_form.tpl" legend="Supprimer ce fichier ?" warning="Êtes-vous sûr de vouloir supprimer le fichier « %s » ?"|args:$file.nom } {include file="admin/_foot.tpl"} |
Added src/www/admin/acc/transactions/delete_file.php version [19275e53c5].
> > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php namespace Garradin; use Garradin\Accounting\Transactions; require_once __DIR__ . '/../_inc.php'; $session->requireAccess('compta', Membres::DROIT_ADMIN); $csrf_key = sprintf('acc_delete_file_%d', qg('id')); $redirect = sprintf(ADMIN_URL . 'acc/transactions/details.php?id=%d', qg('from')); require __DIR__ . '/../../common/delete_file.php'; |
Added src/www/admin/common/delete_file.php version [f9d6581182].
> > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php namespace Garradin; use Garradin\Services\Services; if (!defined('Garradin\ROOT')) { die('Access denied.'); } if (!isset($csrf_key, $redirect)) { throw new \InvalidArgumentException('Missing params'); } $file = new Fichiers(qg('id')); if (!$file->checkAccess($session)) { throw new UserException('Vous n\'avez pas accès à ce fichier.'); } $form->runIf('delete', function () use ($file) { $file->remove(); }, $csrf_key, $redirect); $tpl->assign(compact('file', 'csrf_key')); $tpl->display('common/delete_file.tpl'); |
Modified src/www/admin/wiki/_fichiers.php from [abf2d3676b] to [aec8dcbc2d].
︙ | ︙ | |||
22 23 24 25 26 27 28 | elseif (f('delete')) { if ($form->check($csrf_id)) { try { $fichier = new Fichiers(f('delete')); | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | elseif (f('delete')) { if ($form->check($csrf_id)) { try { $fichier = new Fichiers(f('delete')); if (!$fichier->checkAccess($session, true)) { throw new UserException('Vous n\'avez pas accès à ce fichier.'); } $fichier->remove(); Utils::redirect(ADMIN_URL . 'wiki/_fichiers.php?page=' . $page->id); } |
︙ | ︙ |