Overview
Comment:Accept more unicode in filenames
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA3-256: 176bbe63cdcd3735999c20470c6ed93c304dea359352b98db3de38ef2da95e9b
User & Date: bohwaz on 2021-03-15 02:55:13
Other Links: branch diff | manifest | tags
Context
2021-03-15
03:19
Fix storage migration check-in: d51394747f user: bohwaz tags: dev
02:55
Accept more unicode in filenames check-in: 176bbe63cd user: bohwaz tags: dev
02:54
Use realpath() to make sure file exists check-in: 512b22edcb user: bohwaz tags: dev
Changes

Modified src/include/lib/Garradin/Entities/Files/File.php from [ba040a35ea] to [67fb91f85e].

140
141
142
143
144
145
146
147






148
149
150
151
152
153
154
	public function context(): string
	{
		return strtok($this->path, '/');
	}

	public function fullpath(): string
	{
		return Files::callStorage('getFullPath', $this);






	}

	public function canPreview(): bool
	{
		return in_array($this->mime, self::PREVIEW_TYPES);
	}








|
>
>
>
>
>
>







140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
	public function context(): string
	{
		return strtok($this->path, '/');
	}

	public function fullpath(): string
	{
		$path = Files::callStorage('getFullPath', $this);

		if (null === $path) {
			throw new \RuntimeException('File does not exist: ' . $this->path);
		}

		return $path;
	}

	public function canPreview(): bool
	{
		return in_array($this->mime, self::PREVIEW_TYPES);
	}

378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393

	static public function create(string $path, string $name, ?string $source_path, ?string $source_content): self
	{
		if (!isset($source_path) && !isset($source_content)) {
			throw new \InvalidArgumentException('Either source path or source content should be set but not both');
		}

		$name = self::filterName($name);

		self::ensureDirectoryExists($path);

		$finfo = \finfo_open(\FILEINFO_MIME_TYPE);
		$file = new self;
		$file->set('path', $path . '/' . $name);
		$file->set('parent', $path);
		$file->set('name', $name);







<
<







384
385
386
387
388
389
390


391
392
393
394
395
396
397

	static public function create(string $path, string $name, ?string $source_path, ?string $source_content): self
	{
		if (!isset($source_path) && !isset($source_content)) {
			throw new \InvalidArgumentException('Either source path or source content should be set but not both');
		}



		self::ensureDirectoryExists($path);

		$finfo = \finfo_open(\FILEINFO_MIME_TYPE);
		$file = new self;
		$file->set('path', $path . '/' . $name);
		$file->set('parent', $path);
		$file->set('name', $name);
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
		}

		if (!is_uploaded_file($file['tmp_name'])) {
			throw new \RuntimeException('Le fichier n\'a pas été envoyé de manière conventionnelle.');
		}

		$name = preg_replace('/\s+/', '_', $file['name']);
		$name = preg_replace('/[^\d\w._-]/ui', '', $name);

		return self::createAndStore($path, $name, $file['tmp_name'], null);
	}


	/**
	 * Récupération du message d'erreur







|







448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
		}

		if (!is_uploaded_file($file['tmp_name'])) {
			throw new \RuntimeException('Le fichier n\'a pas été envoyé de manière conventionnelle.');
		}

		$name = preg_replace('/\s+/', '_', $file['name']);
		$name = self::filterName($name);

		return self::createAndStore($path, $name, $file['tmp_name'], null);
	}


	/**
	 * Récupération du message d'erreur
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
		if (!array_key_exists($path[0], self::CONTEXTS_NAMES)) {
			throw new ValidationException('Chemin invalide');
		}

		$context = array_shift($path);

		foreach ($path as $part) {
			if (!preg_match('!^[\w\d\p{L} _-]+(?:\.[\w\d\p{L} _-]+)*$!iu', $part)) {
				throw new ValidationException('Chemin invalide');
			}
		}

		$name = array_pop($path);
		$ref = implode('/', $path);
		return [$context, $ref ?: null, $name];







|







859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
		if (!array_key_exists($path[0], self::CONTEXTS_NAMES)) {
			throw new ValidationException('Chemin invalide');
		}

		$context = array_shift($path);

		foreach ($path as $part) {
			if (substr($part, 0, 1) == '.') {
				throw new ValidationException('Chemin invalide');
			}
		}

		$name = array_pop($path);
		$ref = implode('/', $path);
		return [$context, $ref ?: null, $name];

Modified src/templates/admin/config/advanced/index.tpl from [472b663153] to [fc7d4690cb].

43
44
45
46
47
48
49



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
	<h2 class="ruler">Stockage des fichiers</h2>
	{if !$quota_used}
	<fieldset>
		<legend>Migration de stockage de fichiers</legend>
		<p class="alert block">
			Les fichiers seront <strong>supprimés</strong> de la base de données après avoir été recopiés vers '{$storage_backend}'.
		</p>



		<p class="help">Cette opération peut prendre quelques minutes.</p>
		<p>
			{csrf_field key="migrate_backend"}
			{button type="submit" name="migrate_backend_ok" label="Copier tous les fichiers vers %s"|args:$storage_backend shape="right"}
		</p>
	</fieldset>
	{else}
	<fieldset>
		<legend>Recopier les fichiers dans la base de données</legend>
		<p class="alert block">
			Les fichiers ne seront pas effacés de {$storage_backend} mais simplement recopiés dans la base de données.
		</p>
		<p class="help">Cette opération peut prendre quelques minutes.</p>
		<p>
			{csrf_field key="migrate_back"}
			{button type="submit" name="migrate_back_ok" label="Copier tous les fichiers de %s vers la base de données"|args:$storage_backend shape="right"}
		</p>
	</fieldset>
	{/if}
{/if}







>
>
>



|








|







43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
	<h2 class="ruler">Stockage des fichiers</h2>
	{if !$quota_used}
	<fieldset>
		<legend>Migration de stockage de fichiers</legend>
		<p class="alert block">
			Les fichiers seront <strong>supprimés</strong> de la base de données après avoir été recopiés vers '{$storage_backend}'.
		</p>
		<p class="error block">
			Sauvegarde fortement recommandée avant de procéder à cette opération !
		</p>
		<p class="help">Cette opération peut prendre quelques minutes.</p>
		<p>
			{csrf_field key="migrate_backend"}
			{button type="submit" name="migrate_backend_ok" label="Copier tous les fichiers vers %s et les supprimer de la base de données"|args:$storage_backend shape="right"}
		</p>
	</fieldset>
	{else}
	<fieldset>
		<legend>Recopier les fichiers dans la base de données</legend>
		<p class="alert block">
			Les fichiers ne seront pas effacés de {$storage_backend} mais simplement recopiés dans la base de données.
		</p>
		<p class="help">Cette opération peut prendre quelques minutes. Elle est utile pour migrer entre deux systèmes de fichiers différents.</p>
		<p>
			{csrf_field key="migrate_back"}
			{button type="submit" name="migrate_back_ok" label="Copier tous les fichiers de %s vers la base de données"|args:$storage_backend shape="right"}
		</p>
	</fieldset>
	{/if}
{/if}

Modified src/www/admin/config/donnees/index.php from [899143cff3] to [9a9d510a5b].

1
2


3
4
5
6
7
8
9
<?php
namespace Garradin;



require_once __DIR__ . '/../_inc.php';

$s = new Sauvegarde;

$tpl->assign('code', null);



>
>







1
2
3
4
5
6
7
8
9
10
11
<?php
namespace Garradin;

use Garradin\Files\Files;

require_once __DIR__ . '/../_inc.php';

$s = new Sauvegarde;

$tpl->assign('code', null);

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        Utils::redirect(ADMIN_URL . 'config/donnees/?ok=restore&code=' . (int)$r);
    } catch (UserException $e) {
        $tpl->assign('code', $e->getCode());
    }
}, 'backup_restore');

$tpl->assign('db_size', $s->getDBSize());
$tpl->assign('files_size', $s->getDBFilesSize());

$tpl->assign('ok_code', qg('code'));
$tpl->assign('ok', qg('ok'));
$tpl->assign('now_date', date('Y-m-d'));

$tpl->assign('max_file_size', Utils::getMaxUploadSize());

$tpl->display('admin/config/donnees/index.tpl');







|








28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        Utils::redirect(ADMIN_URL . 'config/donnees/?ok=restore&code=' . (int)$r);
    } catch (UserException $e) {
        $tpl->assign('code', $e->getCode());
    }
}, 'backup_restore');

$tpl->assign('db_size', $s->getDBSize());
$tpl->assign('files_size', Files::getUsedQuota());

$tpl->assign('ok_code', qg('code'));
$tpl->assign('ok', qg('ok'));
$tpl->assign('now_date', date('Y-m-d'));

$tpl->assign('max_file_size', Utils::getMaxUploadSize());

$tpl->display('admin/config/donnees/index.tpl');

Modified src/www/admin/docs/new_file.php from [b3c87b98b2] to [7f74958ac9].

19
20
21
22
23
24
25

26
27
28
29
30
31
32
33
34
	$name = trim(f('name'));

	if (!strpos($name, '.')) {
		$name .= '.txt';
	}

	File::validatePath($parent . '/' . $name);


	$file = File::createAndStore($parent, $name, null, '');
	$file->set('mime', 'text/plain');
	$file->save();
}, $csrf_key, '!docs/?p=' . $parent);

$tpl->assign(compact('csrf_key'));

$tpl->display('docs/new_file.tpl');







>









19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	$name = trim(f('name'));

	if (!strpos($name, '.')) {
		$name .= '.txt';
	}

	File::validatePath($parent . '/' . $name);
	$name = File::filterName($name);

	$file = File::createAndStore($parent, $name, null, '');
	$file->set('mime', 'text/plain');
	$file->save();
}, $csrf_key, '!docs/?p=' . $parent);

$tpl->assign(compact('csrf_key'));

$tpl->display('docs/new_file.tpl');