aboutsummaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/invalid/lena/rsend/Config.kt16
-rw-r--r--app/src/main/java/invalid/lena/rsend/FolderEditActivity.kt8
-rw-r--r--app/src/main/java/invalid/lena/rsend/RemoteActivity.kt5
3 files changed, 28 insertions, 1 deletions
diff --git a/app/src/main/java/invalid/lena/rsend/Config.kt b/app/src/main/java/invalid/lena/rsend/Config.kt
index 25bf338..a38fbde 100644
--- a/app/src/main/java/invalid/lena/rsend/Config.kt
+++ b/app/src/main/java/invalid/lena/rsend/Config.kt
@@ -57,6 +57,9 @@ object RemoteRules {
if (remote.hostKey.length > MAX_HOST_KEY_CHARS) return false
val parts = remote.hostKey.split(' ')
if (parts.size != 3 || parts.any(String::isEmpty)) return false
+ // Must be exactly the address rsh writes, which is knownhosts.Normalize:
+ // the bare host on port 22, including an IPv6 literal, "[host]:port"
+ // otherwise. A different form here silently stops matching the pin.
val address = if (remote.port == 22) remote.host else "[${remote.host}]:${remote.port}"
if (parts[0] != address || parts[1] !in hostKeyTypes) return false
return try {
@@ -187,6 +190,19 @@ data class Config(
}
}
+ // overLimit reports why c cannot be persisted, or null. These are the
+ // only save failures a form cannot rule out on its own, so the editors
+ // ask before adding an entry and report the answer. Every other rule
+ // fromJson enforces is already checked field by field; one firing there
+ // is a bug and must throw.
+ fun overLimit(c: Config): String? = when {
+ c.remotes.size > MAX_REMOTES -> "Too many remotes; the limit is $MAX_REMOTES."
+ c.folders.size > MAX_FOLDERS -> "Too many folders; the limit is $MAX_FOLDERS."
+ c.toJson().toString(2).toByteArray(Charsets.UTF_8).size > MAX_CONFIG_BYTES ->
+ "Configuration is too large; the limit is $MAX_CONFIG_BYTES bytes."
+ else -> null
+ }
+
// legacyShape reports whether o is the pre-0.2 config 0.1.x wrote: one
// "remote" object instead of a "remotes" array.
fun legacyShape(o: JSONObject): Boolean =
diff --git a/app/src/main/java/invalid/lena/rsend/FolderEditActivity.kt b/app/src/main/java/invalid/lena/rsend/FolderEditActivity.kt
index 5565bff..47961c1 100644
--- a/app/src/main/java/invalid/lena/rsend/FolderEditActivity.kt
+++ b/app/src/main/java/invalid/lena/rsend/FolderEditActivity.kt
@@ -161,7 +161,13 @@ class FolderEditActivity : AppCompatActivity() {
}
val list = cfg.folders.toMutableList()
if (index in list.indices) list[index] = f else list.add(f)
- Config.save(this, cfg.copy(folders = list))
+ val next = cfg.copy(folders = list)
+ val limit = Config.overLimit(next)
+ if (limit != null) {
+ Toast.makeText(this, limit, Toast.LENGTH_LONG).show()
+ return false
+ }
+ Config.save(this, next)
return true
}
diff --git a/app/src/main/java/invalid/lena/rsend/RemoteActivity.kt b/app/src/main/java/invalid/lena/rsend/RemoteActivity.kt
index 994e233..83f499d 100644
--- a/app/src/main/java/invalid/lena/rsend/RemoteActivity.kt
+++ b/app/src/main/java/invalid/lena/rsend/RemoteActivity.kt
@@ -130,6 +130,11 @@ class RemoteActivity : AppCompatActivity() {
"folder \"${b.name.ifEmpty { b.remotePath }}\"."
return -1
}
+ val limit = Config.overLimit(next)
+ if (limit != null) {
+ status.text = limit
+ return -1
+ }
Config.save(this, next)
Scheduler.apply(this)
return at