aboutsummaryrefslogtreecommitdiff
path: root/app/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/test')
-rw-r--r--app/src/test/java/invalid/lena/rsend/ConfigTest.kt57
1 files changed, 57 insertions, 0 deletions
diff --git a/app/src/test/java/invalid/lena/rsend/ConfigTest.kt b/app/src/test/java/invalid/lena/rsend/ConfigTest.kt
index 6b6dfdc..e289afd 100644
--- a/app/src/test/java/invalid/lena/rsend/ConfigTest.kt
+++ b/app/src/test/java/invalid/lena/rsend/ConfigTest.kt
@@ -308,6 +308,30 @@ class ConfigTest {
assertFalse(RemoteRules.hostKeyAllowed(Remote("nas", "home", 22, "backup", "home ssh-ed25519 not-base64")))
}
+ // The address field of a pin must be exactly what rsh writes, which is
+ // knownhosts.Normalize: the bare host on port 22 (an IPv6 literal included),
+ // "[host]:port" otherwise. Bracketing IPv6 on port 22 looks right and would
+ // make every IPv6 pin fail to validate.
+ @Test
+ fun hostPinAddressMatchesTheKnownHostsForm() {
+ val key = "ssh-ed25519 AAAA"
+ val cases = listOf(
+ "home.example.net" to 22,
+ "home.example.net" to 2222,
+ "2001:db8::1" to 22,
+ "2001:db8::1" to 2222,
+ "fe80::1%wlan0" to 22,
+ )
+ for ((host, port) in cases) {
+ val address = if (port == 22) host else "[$host]:$port"
+ assertTrue(
+ "$host:$port",
+ RemoteRules.hostKeyAllowed(Remote("nas", host, port, "backup", "$address $key")),
+ )
+ }
+ assertFalse(RemoteRules.hostKeyAllowed(Remote("nas", "2001:db8::1", 22, "backup", "[2001:db8::1] $key")))
+ }
+
@Test
fun configRejectsCoercedAndUnknownFields() {
val badRemotes = Config().toJson().put("remotes", "not an array")
@@ -370,4 +394,37 @@ class ConfigTest {
} catch (_: IllegalArgumentException) {
}
}
+
+ // The editors ask before adding an entry, because these three limits are
+ // the ones a form cannot see. Reporting them is what keeps save from
+ // throwing at a user who has done nothing wrong.
+ @Test
+ fun limitsAreReportedRatherThanThrown() {
+ val remote = Remote("nas", "nas", 22, "backup", "nas ssh-ed25519 AAAA")
+ val folder = Folder("f", "/a", "nas", "backup")
+ assertEquals(null, Config.overLimit(Config(remotes = listOf(remote), folders = listOf(folder))))
+
+ val remotes = (1..65).map { remote.copy(name = "nas$it", hostKey = "") }
+ assertTrue(Config.overLimit(Config(remotes = remotes))!!.contains("Too many remotes"))
+
+ val folders = (1..257).map { folder.copy(name = "f$it", remotePath = "backup/$it") }
+ assertTrue(
+ Config.overLimit(Config(remotes = listOf(remote), folders = folders))!!
+ .contains("Too many folders")
+ )
+
+ // Field limits alone allow far more than the file limit: 40 folders of
+ // maximum-length excludes already exceed it.
+ val fat = (1..40).map {
+ folder.copy(
+ name = "f$it",
+ remotePath = "backup/$it",
+ excludes = List(FolderRules.MAX_EXCLUDES) { i -> "x".repeat(512 - "$i".length) + i },
+ )
+ }
+ assertTrue(
+ Config.overLimit(Config(remotes = listOf(remote), folders = fat))!!
+ .contains("too large")
+ )
+ }
}