From 3ac3efe92c892e7144a7490bcc11d5cdfea54898 Mon Sep 17 00:00:00 2001 From: Edontin <1924446+Edontin@users.noreply.github.com> Date: Sat, 22 Feb 2020 18:47:01 +1000 Subject: [PATCH] Fix playlist path resolution for symlinked paths. (#1016) Change path resolution to remove parent directories without following symbolic links. When resolving relative paths such as `../../storage/emulated/0/` the symlinks will be read and parent paths removed, in that order. This results in paths from an `/sdcard` symlink producing unexpected relative paths e.g.`/sdcard/../storage/emulated/0/test.mp3` resolves to `/storage/emulated/storage/emulated/0/test.mp3` instead of `/storage/emulated/0/test.mp3`. --- .../android/vanilla/FileUtils.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/FileUtils.java b/app/src/main/java/ch/blinkenlights/android/vanilla/FileUtils.java index a6812bb5..c2cf644f 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/FileUtils.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/FileUtils.java @@ -20,10 +20,11 @@ package ch.blinkenlights.android.vanilla; import ch.blinkenlights.android.medialibrary.MediaLibrary; import java.io.File; -import java.io.IOException; import java.net.URI; import java.net.URLConnection; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.StringTokenizer; import android.content.Context; import android.content.Intent; @@ -31,6 +32,7 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.text.TextUtils; import android.util.Log; @@ -144,12 +146,28 @@ public class FileUtils { try { if (!destination.isAbsolute()) { - path = new File(base, path).getCanonicalPath(); + path = new File(base, path).getAbsolutePath(); + final ArrayList pathComponents = new ArrayList<>(); + final StringTokenizer pathTokenizer = new StringTokenizer(path, File.separator); + + while (pathTokenizer.hasMoreTokens()) { + final String pathComponent = pathTokenizer.nextToken(); + + if (NAME_PARENT_FOLDER.equals(pathComponent)) { + final int lastComponentPosition = pathComponents.size() - 1; + + if (lastComponentPosition >= 0 + && !NAME_PARENT_FOLDER.equals(pathComponents.get(lastComponentPosition))) { + pathComponents.remove(lastComponentPosition); + } + } else { + pathComponents.add(pathComponent); + } + } + path = File.separator + TextUtils.join(File.separator, pathComponents); } } catch (SecurityException ex) { // Ignore. - }catch (IOException ex){ - // Ignore } return path; }