Browse Source

Allow 4byte unicode filenames on supported platforms

Signed-off-by: Robin Appelman <robin@icewind.nl>
tags/v11.0RC2
Robin Appelman 7 years ago
parent
commit
3a8e75a814
No account linked to committer's email address
3 changed files with 24 additions and 3 deletions
  1. 11
    0
      lib/private/DB/Connection.php
  2. 5
    3
      lib/private/Files/View.php
  3. 8
    0
      lib/public/IDBConnection.php

+ 11
- 0
lib/private/DB/Connection.php View File

@@ -33,6 +33,7 @@ use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Platforms\MySqlPlatform;
use OC\DB\QueryBuilder\QueryBuilder;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
@@ -402,4 +403,14 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
public function escapeLikeParameter($param) {
return addcslashes($param, '\\_%');
}

/**
* Check whether or not the current database support 4byte wide unicode
*
* @return bool
* @since 9.2.0
*/
public function supports4ByteText() {
return ! ($this->getDatabasePlatform() instanceof MySqlPlatform && $this->getParams()['charset'] !== 'utf8mb4');
}
}

+ 5
- 3
lib/private/Files/View.php View File

@@ -1806,13 +1806,15 @@ class View {
throw new InvalidPathException($l10n->t('Dot files are not allowed'));
}

// verify database - e.g. mysql only 3-byte chars
if (preg_match('%(?:
if (!\OC::$server->getDatabaseConnection()->supports4ByteText()) {
// verify database - e.g. mysql only 3-byte chars
if (preg_match('%(?:
\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)%xs', $fileName)) {
throw new InvalidPathException($l10n->t('4-byte characters are not supported in file names'));
throw new InvalidPathException($l10n->t('4-byte characters are not supported in file names'));
}
}

try {

+ 8
- 0
lib/public/IDBConnection.php View File

@@ -251,4 +251,12 @@ interface IDBConnection {
* @since 9.0.0
*/
public function escapeLikeParameter($param);

/**
* Check whether or not the current database support 4byte wide unicode
*
* @return bool
* @since 9.2.0
*/
public function supports4ByteText();
}

Loading…
Cancel
Save