summaryrefslogtreecommitdiff
path: root/mnv/src/testdir/test_plugin_tar.mnv
diff options
context:
space:
mode:
Diffstat (limited to 'mnv/src/testdir/test_plugin_tar.mnv')
-rw-r--r--mnv/src/testdir/test_plugin_tar.mnv149
1 files changed, 149 insertions, 0 deletions
diff --git a/mnv/src/testdir/test_plugin_tar.mnv b/mnv/src/testdir/test_plugin_tar.mnv
new file mode 100644
index 0000000000..ce7c4fed6e
--- /dev/null
+++ b/mnv/src/testdir/test_plugin_tar.mnv
@@ -0,0 +1,149 @@
+mnv9script
+
+CheckExecutable tar
+CheckNotMSWindows
+
+runtime plugin/tarPlugin.mnv
+
+def CopyFile(source: string)
+ if !filecopy($"samples/{source}", "X.tar")
+ assert_report($"Can't copy samples/{source}")
+ endif
+enddef
+
+def g:Test_tar_basic()
+ CopyFile("sample.tar")
+ defer delete("X.tar")
+ defer delete("./testtar", 'rf')
+ e X.tar
+
+ ### Check header
+ assert_match('^" tar\.mnv version v\d\+', getline(1))
+ assert_match('^" Browsing tarfile .*/X.tar', getline(2))
+ assert_match('^" Select a file with cursor and press ENTER, "x" to extract a file', getline(3))
+ assert_match('^$', getline(4))
+ assert_match('testtar/', getline(5))
+ assert_match('testtar/file1.txt', getline(6))
+
+ ### Check ENTER on header
+ :1
+ exe ":normal \<cr>"
+ assert_equal("X.tar", @%)
+
+ ### Check ENTER on file
+ :6
+ exe ":normal \<cr>"
+ assert_equal("tarfile::testtar/file1.txt", @%)
+
+
+ ### Check editing file
+ ### Note: deleting entries not supported on BSD
+ if has("mac")
+ return
+ endif
+ if has("bsd")
+ return
+ endif
+ s/.*/some-content/
+ assert_equal("some-content", getline(1))
+ w!
+ assert_equal("tarfile::testtar/file1.txt", @%)
+ bw!
+ close
+ bw!
+
+ e X.tar
+ :6
+ exe "normal \<cr>"
+ assert_equal("some-content", getline(1))
+ bw!
+ close
+
+ ### Check extracting file
+ :5
+ normal x
+ assert_true(filereadable("./testtar/file1.txt"))
+ bw!
+enddef
+
+def g:Test_tar_evil()
+ CopyFile("evil.tar")
+ defer delete("X.tar")
+ defer delete("./etc", 'rf')
+ e X.tar
+
+ ### Check header
+ assert_match('^" tar\.mnv version v\d\+', getline(1))
+ assert_match('^" Browsing tarfile .*/X.tar', getline(2))
+ assert_match('^" Select a file with cursor and press ENTER, "x" to extract a file', getline(3))
+ assert_match('^" Note: Path Traversal Attack detected', getline(4))
+ assert_match('^$', getline(5))
+ assert_match('/etc/ax-pwn', getline(6))
+
+ ### Check ENTER on header
+ :1
+ exe ":normal \<cr>"
+ assert_equal("X.tar", @%)
+ assert_equal(1, b:leading_slash)
+
+ ### Check ENTER on file
+ :6
+ exe ":normal \<cr>"
+ assert_equal(1, b:leading_slash)
+ assert_equal("tarfile::/etc/ax-pwn", @%)
+
+
+ ### Check editing file
+ ### Note: deleting entries not supported on BSD
+ if has("mac")
+ return
+ endif
+ if has("bsd")
+ return
+ endif
+ s/.*/none/
+ assert_equal("none", getline(1))
+ w!
+ assert_equal(1, b:leading_slash)
+ assert_equal("tarfile::/etc/ax-pwn", @%)
+ bw!
+ close
+ bw!
+
+ # Writing was aborted
+ e X.tar
+ assert_match('^" Note: Path Traversal Attack detected', getline(4))
+ :6
+ exe "normal \<cr>"
+ assert_equal("something", getline(1))
+ bw!
+ close
+
+ ### Check extracting file
+ :5
+ normal x
+ assert_true(filereadable("./etc/ax-pwn"))
+
+ bw!
+enddef
+
+def g:Test_tar_path_traversal_with_nowrapscan()
+ CopyFile("evil.tar")
+ defer delete("X.tar")
+ # Make sure we still find the tar warning (or leading slashes) even when
+ # wrapscan is off
+ set nowrapscan
+ e X.tar
+
+ ### Check header
+ assert_match('^" tar\.mnv version v\d\+', getline(1))
+ assert_match('^" Browsing tarfile .*/X.tar', getline(2))
+ assert_match('^" Select a file with cursor and press ENTER, "x" to extract a file', getline(3))
+ assert_match('^" Note: Path Traversal Attack detected', getline(4))
+ assert_match('^$', getline(5))
+ assert_match('/etc/ax-pwn', getline(6))
+
+ assert_equal(1, b:leading_slash)
+
+ bw!
+enddef