mirror of
https://github.com/abraunegg/onedrive
synced 2024-05-09 09:16:42 +02:00
Add Microsoft naming conventions and namespace validation for items that will be uploaded
* Add Pull #104 (@JunpeiAnzai) to ensure that uploaded files conform to Windows naming conventions and namespaces. Refer to https://msdn.microsoft.com/en-us/library/aa365247 for further details regarding Windows naming conventions and namespaces.
This commit is contained in:
parent
21f4d8e858
commit
0febd67bd3
14
src/sync.d
14
src/sync.d
|
@ -599,6 +599,12 @@ final class SyncEngine
|
|||
log.vlog("Filtered out");
|
||||
return;
|
||||
}
|
||||
|
||||
// Restriction and limitations about windows naming files
|
||||
if (!isValidName(path)) {
|
||||
log.vlog("Skipping item - invalid name (Microsoft Naming Convention): ", path);
|
||||
return;
|
||||
}
|
||||
|
||||
final switch (item.type) {
|
||||
case ItemType.dir:
|
||||
|
@ -718,11 +724,17 @@ final class SyncEngine
|
|||
log.vlog("Skipping item - symbolic link: ", path);
|
||||
return;
|
||||
}
|
||||
|
||||
// Restriction and limitations about windows naming files
|
||||
if (!isValidName(path)) {
|
||||
log.vlog("Skipping item - invalid name (Microsoft Naming Convention): ", path);
|
||||
return;
|
||||
}
|
||||
|
||||
// skip filtered items
|
||||
if (path != ".") {
|
||||
if (selectiveSync.isNameExcluded(baseName(path))) {
|
||||
log.vlog("Skipping item - invalid name: ", path);
|
||||
log.vlog("Skipping item - name excluded: ", path);
|
||||
return;
|
||||
}
|
||||
if (selectiveSync.isPathExcluded(path)) {
|
||||
|
|
75
src/util.d
75
src/util.d
|
@ -128,3 +128,78 @@ unittest
|
|||
assert(multiGlobMatch(".hidden", "file|.*"));
|
||||
assert(!multiGlobMatch("foo.bar", "foo|bar"));
|
||||
}
|
||||
|
||||
bool isValidName(string path)
|
||||
{
|
||||
// allow root item
|
||||
if (path == ".") {
|
||||
return true;
|
||||
}
|
||||
|
||||
string itemName = baseName(path);
|
||||
|
||||
// Restriction and limitations about windows naming files
|
||||
// https://msdn.microsoft.com/en-us/library/aa365247
|
||||
auto invalidNameReg =
|
||||
ctRegex!(
|
||||
// leading whitespace and trailing whitespace/dot
|
||||
`^\s.*|^.*[\s\.]$|` ~
|
||||
// invalid character
|
||||
`.*[#%<>:"\|\?*/\\].*|` ~
|
||||
// reserved device name and trailing .~
|
||||
`(?:CON|PRN|AUX|NUL|COM[0-9]|LPT[0-9])(?:[.].+)?$`
|
||||
);
|
||||
auto m = match(itemName, invalidNameReg);
|
||||
|
||||
return m.empty;
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
// that should detect invalid file/directory name.
|
||||
assert(isValidName("."));
|
||||
assert(isValidName("./general.file"));
|
||||
assert(!isValidName("./ leading_white_space"));
|
||||
assert(!isValidName("./trailing_white_space "));
|
||||
assert(!isValidName("./trailing_dot."));
|
||||
assert(!isValidName("./includes#in the path"));
|
||||
assert(!isValidName("./includes%in the path"));
|
||||
assert(!isValidName("./includes<in the path"));
|
||||
assert(!isValidName("./includes>in the path"));
|
||||
assert(!isValidName("./includes:in the path"));
|
||||
assert(!isValidName(`./includes"in the path`));
|
||||
assert(!isValidName("./includes|in the path"));
|
||||
assert(!isValidName("./includes?in the path"));
|
||||
assert(!isValidName("./includes*in the path"));
|
||||
assert(!isValidName("./includes / in the path"));
|
||||
assert(!isValidName(`./includes\ in the path`));
|
||||
assert(!isValidName(`./includes\\ in the path`));
|
||||
assert(!isValidName(`./includes\\\\ in the path`));
|
||||
assert(!isValidName("./includes\\ in the path"));
|
||||
assert(!isValidName("./includes\\\\ in the path"));
|
||||
assert(!isValidName("./CON"));
|
||||
assert(!isValidName("./CON.text"));
|
||||
assert(!isValidName("./PRN"));
|
||||
assert(!isValidName("./AUX"));
|
||||
assert(!isValidName("./NUL"));
|
||||
assert(!isValidName("./COM0"));
|
||||
assert(!isValidName("./COM1"));
|
||||
assert(!isValidName("./COM2"));
|
||||
assert(!isValidName("./COM3"));
|
||||
assert(!isValidName("./COM4"));
|
||||
assert(!isValidName("./COM5"));
|
||||
assert(!isValidName("./COM6"));
|
||||
assert(!isValidName("./COM7"));
|
||||
assert(!isValidName("./COM8"));
|
||||
assert(!isValidName("./COM9"));
|
||||
assert(!isValidName("./LPT0"));
|
||||
assert(!isValidName("./LPT1"));
|
||||
assert(!isValidName("./LPT2"));
|
||||
assert(!isValidName("./LPT3"));
|
||||
assert(!isValidName("./LPT4"));
|
||||
assert(!isValidName("./LPT5"));
|
||||
assert(!isValidName("./LPT6"));
|
||||
assert(!isValidName("./LPT7"));
|
||||
assert(!isValidName("./LPT8"));
|
||||
assert(!isValidName("./LPT9"));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue