diff options
author | Harsh Shandilya <msfjarvis@gmail.com> | 2020-09-05 22:48:42 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-05 22:48:42 +0530 |
commit | 3ac9c7d8e70e9102dba19526ee48ab7597e954b3 (patch) | |
tree | 123a4ca4e760ed7209fe83bdd7d28fb8534ff682 /app/src/main/java | |
parent | 6713d489746830d83437e6a8f6eb88624070b7c5 (diff) |
PasswordRepository: add custom FS factory for symlink capabilities (#1081)
Co-authored-by: Fabian Henneke <fabian@henneke.me>
Diffstat (limited to 'app/src/main/java')
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt index 662210b2..fe79a8ea 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt @@ -6,10 +6,14 @@ package com.zeapo.pwdstore.utils import android.content.Context import android.content.SharedPreferences +import android.os.Build +import androidx.annotation.RequiresApi import androidx.core.content.edit import com.zeapo.pwdstore.Application import java.io.File import java.io.FileFilter +import java.nio.file.Files +import java.nio.file.LinkOption import java.util.Comparator import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.Repository @@ -17,9 +21,37 @@ import org.eclipse.jgit.storage.file.FileRepositoryBuilder import org.eclipse.jgit.transport.RefSpec import org.eclipse.jgit.transport.RemoteConfig import org.eclipse.jgit.transport.URIish +import org.eclipse.jgit.util.FS +import org.eclipse.jgit.util.FS_POSIX_Java6 open class PasswordRepository protected constructor() { + private class FS_POSIX_Java6_with_optional_symlinks : FS_POSIX_Java6() { + + override fun supportsSymlinks() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + + @RequiresApi(Build.VERSION_CODES.O) + override fun isSymLink(file: File) = Files.isSymbolicLink(file.toPath()) + + @RequiresApi(Build.VERSION_CODES.O) + override fun readSymLink(file: File) = Files.readSymbolicLink(file.toPath()).toString() + + @RequiresApi(Build.VERSION_CODES.O) + override fun createSymLink(source: File, target: String) { + val sourcePath = source.toPath() + if (Files.exists(sourcePath, LinkOption.NOFOLLOW_LINKS)) + Files.delete(sourcePath) + Files.createSymbolicLink(sourcePath, File(target).toPath()) + } + } + + private class Java7FSFactory : FS.FSFactory() { + + override fun detect(cygwinUsed: Boolean?): FS { + return FS_POSIX_Java6_with_optional_symlinks() + } + } + enum class PasswordSortOrder(val comparator: Comparator<PasswordItem>) { FOLDER_FIRST(Comparator { p1: PasswordItem, p2: PasswordItem -> @@ -75,6 +107,7 @@ open class PasswordRepository protected constructor() { val builder = FileRepositoryBuilder() try { repository = builder.setGitDir(localDir) + .setFS(Java7FSFactory().detect(null)) .readEnvironment() .build() } catch (e: Exception) { |