2385 Only allow very limited set of characters in file names

This commit is contained in:
Martin Fietz 2017-10-08 15:54:12 +02:00
parent 5310264961
commit 1972c2d44e
3 changed files with 27 additions and 16 deletions

View File

@ -34,6 +34,16 @@ public class FilenameGeneratorTest extends AndroidTestCase {
createFiles(result); createFiles(result);
} }
public void testFeedTitleContainsApostrophe() {
String result = FileNameGenerator.generateFileName("Feed's Title ...");
assertEquals("Feeds Title", result);
}
public void testFeedTitleContainsDash() {
String result = FileNameGenerator.generateFileName("Left - Right");
assertEquals("Left Right", result);
}
/** /**
* Tests if files can be created. * Tests if files can be created.
* *

View File

@ -345,9 +345,7 @@ public class DownloadRequester {
// Try to generate the filename by the item title // Try to generate the filename by the item title
if (media.getItem() != null && media.getItem().getTitle() != null) { if (media.getItem() != null && media.getItem().getTitle() != null) {
String title = media.getItem().getTitle(); String title = media.getItem().getTitle();
// Delete reserved characters titleBaseFilename = FileNameGenerator.generateFileName(title);
titleBaseFilename = title.replaceAll("[^a-zA-Z0-9 ._()-]", "");
titleBaseFilename = titleBaseFilename.trim();
} }
String URLBaseFilename = URLUtil.guessFileName(media.getDownload_url(), String URLBaseFilename = URLUtil.guessFileName(media.getDownload_url(),

View File

@ -1,18 +1,21 @@
package de.danoeh.antennapod.core.util; package de.danoeh.antennapod.core.util;
import org.apache.commons.lang3.ArrayUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** Generates valid filenames for a given string. */ /** Generates valid filenames for a given string. */
public class FileNameGenerator { public class FileNameGenerator {
private static final char[] ILLEGAL_CHARACTERS = { '/', '\\', '?', '%', private static final char[] validChars = (
'*', ':', '|', '"', '<', '>', '\n' }; "abcdefghijklmnopqrstuvwxyz" +
static { "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
Arrays.sort(ILLEGAL_CHARACTERS); "0123456789" +
} " _-").toCharArray();
private FileNameGenerator() { private FileNameGenerator() {
} }
/** /**
@ -20,17 +23,17 @@ public class FileNameGenerator {
* characters of the given string. * characters of the given string.
*/ */
public static String generateFileName(String string) { public static String generateFileName(String string) {
StringBuilder builder = new StringBuilder(); StringBuilder buf = new StringBuilder();
for (int i = 0; i < string.length(); i++) { for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i); char c = string.charAt(i);
if (Arrays.binarySearch(ILLEGAL_CHARACTERS, c) < 0) { if(Character.isSpaceChar(c) && (buf.length() == 0 || Character.isSpaceChar(buf.charAt(buf.length()-1)))) {
builder.append(c); continue;
}
if (ArrayUtils.contains(validChars, c)) {
buf.append(c);
} }
} }
return builder.toString().replaceFirst(" *$",""); return buf.toString().trim();
} }
public static long generateLong(final String str) {
return str.hashCode();
}
} }