Skip to content

Instantly share code, notes, and snippets.

@neoneye
Last active January 20, 2018 21:35
Show Gist options
  • Save neoneye/6684c309a5292137b665d76b0fb69711 to your computer and use it in GitHub Desktop.
Save neoneye/6684c309a5292137b665d76b0fb69711 to your computer and use it in GitHub Desktop.
import XCTest
class URLRelativePathFromTests: XCTestCase {
func process(_ p1: String, _ p2: String) -> String? {
let u1 = URL(fileURLWithPath: p1)
let u2 = URL(fileURLWithPath: p2)
return u1.relativePath(from: u2)
}
func testNormal() {
XCTAssertEqual(process("/usr/X11/agent/47.gz", "/usr/X11"), "agent/47.gz")
XCTAssertEqual(process("/usr/share/man/meltdown.1", "/usr/share/cups"), "../man/meltdown.1")
XCTAssertEqual(process("/var/logs/x/y/z/log.txt", "/var/logs"), "x/y/z/log.txt")
XCTAssertEqual(process("/tmp/president.sock", "/"), "tmp/president.sock")
XCTAssertEqual(process("/Users/johndoe/../janedoe/.Trash/bitcoin.wallet", "/Users/janedoe"), ".Trash/bitcoin.wallet")
XCTAssertEqual(process("/server/farbrausch/demo.exe", "/server/loonies"), "../farbrausch/demo.exe")
XCTAssertEqual(process("/home/martinr/backup2019.tgz", "/home/martinr"), "backup2019.tgz")
XCTAssertEqual(process("/proc/x/y", "/proc/x/y/a"), "..")
XCTAssertEqual(process("/proc/x/y", "/proc/x/y/a/b/c"), "../../..")
XCTAssertEqual(process("/proc/x/y/z/w/gpu", "/proc/x/y/a/b/c"), "../../../z/w/gpu")
XCTAssertEqual(process("/admin/.profile", "/admin"), ".profile")
}
func testEmpty() {
XCTAssertEqual(process("", ""), "")
XCTAssertEqual(process("/./././root", "/root/../root"), "")
XCTAssertEqual(process("/./././root/./.", "/root"), "")
}
func testMaliciousAndGarbage() {
// These asserts are currently failing
XCTAssertNil(process("/../../boom.txt", "/"))
XCTAssertNil(process("/var/../../boom.txt", "/var/logs"))
XCTAssertNil(process("../../boom.txt", "/var/logs"))
XCTAssertNil(process(".../...", "/"))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment