Commit fa240eae authored by Mygod's avatar Mygod

Revert "Remove unnecessary bypassHostnames in Acl" and fix inconsistencies of ACL file handling

This reverts commit e5cd145b. Fixes #1895.
parent 7d21fb78
Subproject commit a9d56518bb3e0662e76f60e0ce087a35d6af8323 Subproject commit d107f9ecdb76d6503bba1288ea2bc16052b62f16
...@@ -52,19 +52,16 @@ class Acl { ...@@ -52,19 +52,16 @@ class Acl {
get() { get() {
val acl = Acl() val acl = Acl()
val str = DataStore.publicStore.getString(CUSTOM_RULES) val str = DataStore.publicStore.getString(CUSTOM_RULES)
if (str != null) { if (str != null) acl.fromReader(str.reader(), true)
acl.fromReader(str.reader())
if (!acl.bypass) { if (!acl.bypass) {
acl.subnets.clear()
acl.hostnames.clear()
acl.bypass = true acl.bypass = true
acl.subnets.clear()
} }
} else acl.bypass = true
return acl return acl
} }
set(value) = DataStore.publicStore.putString(CUSTOM_RULES, if ((!value.bypass || set(value) = DataStore.publicStore.putString(CUSTOM_RULES,
value.subnets.size() == 0 && value.hostnames.size() == 0) && value.urls.size() == 0) if ((!value.bypass || value.subnets.size() == 0) && value.bypassHostnames.size() == 0 &&
null else value.toString()) value.proxyHostnames.size() == 0 && value.urls.size() == 0) null else value.toString())
fun save(id: String, acl: Acl) = getFile(id).writeText(acl.toString()) fun save(id: String, acl: Acl) = getFile(id).writeText(acl.toString())
} }
...@@ -89,31 +86,30 @@ class Acl { ...@@ -89,31 +86,30 @@ class Acl {
override fun compareNonNull(o1: URL, o2: URL): Int = ordering.compare(o1, o2) override fun compareNonNull(o1: URL, o2: URL): Int = ordering.compare(o1, o2)
} }
val hostnames = SortedList(String::class.java, StringSorter) val bypassHostnames = SortedList(String::class.java, StringSorter)
val proxyHostnames = SortedList(String::class.java, StringSorter)
val subnets = SortedList(Subnet::class.java, SubnetSorter) val subnets = SortedList(Subnet::class.java, SubnetSorter)
val urls = SortedList(URL::class.java, URLSorter) val urls = SortedList(URL::class.java, URLSorter)
var bypass = false var bypass = false
fun clear(): Acl {
hostnames.clear()
subnets.clear()
urls.clear()
return this
}
fun fromAcl(other: Acl): Acl { fun fromAcl(other: Acl): Acl {
clear() bypassHostnames.clear()
for (item in other.hostnames.asIterable()) hostnames.add(item) for (item in other.bypassHostnames.asIterable()) bypassHostnames.add(item)
proxyHostnames.clear()
for (item in other.proxyHostnames.asIterable()) proxyHostnames.add(item)
subnets.clear()
for (item in other.subnets.asIterable()) subnets.add(item) for (item in other.subnets.asIterable()) subnets.add(item)
urls.clear()
for (item in other.urls.asIterable()) urls.add(item) for (item in other.urls.asIterable()) urls.add(item)
bypass = other.bypass bypass = other.bypass
return this return this
} }
fun fromReader(reader: Reader, defaultBypass: Boolean = false): Acl { fun fromReader(reader: Reader, defaultBypass: Boolean = false): Acl {
clear() bypassHostnames.clear()
proxyHostnames.clear()
subnets.clear()
urls.clear()
bypass = defaultBypass bypass = defaultBypass
val proxyHostnames by lazy { SortedList(String::class.java, StringSorter) }
val bypassHostnames by lazy { SortedList(String::class.java, StringSorter) }
val bypassSubnets by lazy { SortedList(Subnet::class.java, SubnetSorter) } val bypassSubnets by lazy { SortedList(Subnet::class.java, SubnetSorter) }
val proxySubnets by lazy { SortedList(Subnet::class.java, SubnetSorter) } val proxySubnets by lazy { SortedList(Subnet::class.java, SubnetSorter) }
var hostnames: SortedList<String>? = if (defaultBypass) proxyHostnames else bypassHostnames var hostnames: SortedList<String>? = if (defaultBypass) proxyHostnames else bypassHostnames
...@@ -147,7 +143,6 @@ class Acl { ...@@ -147,7 +143,6 @@ class Acl {
} }
} }
} }
for (item in (if (bypass) proxyHostnames else bypassHostnames).asIterable()) this.hostnames.add(item)
for (item in (if (bypass) proxySubnets else bypassSubnets).asIterable()) this.subnets.add(item) for (item in (if (bypass) proxySubnets else bypassSubnets).asIterable()) this.subnets.add(item)
return this return this
} }
...@@ -167,12 +162,11 @@ class Acl { ...@@ -167,12 +162,11 @@ class Acl {
if (bypass != child.bypass) { if (bypass != child.bypass) {
Crashlytics.log(Log.WARN, TAG, "Imported network ACL has a conflicting mode set. " + Crashlytics.log(Log.WARN, TAG, "Imported network ACL has a conflicting mode set. " +
"This will probably not work as intended. URL: $url") "This will probably not work as intended. URL: $url")
// rules for the different mode are discarded child.subnets.clear() // subnets for the different mode are discarded
child.hostnames.clear()
child.subnets.clear()
child.bypass = bypass child.bypass = bypass
} }
for (item in child.hostnames.asIterable()) hostnames.add(item) for (item in child.bypassHostnames.asIterable()) bypassHostnames.add(item)
for (item in child.proxyHostnames.asIterable()) proxyHostnames.add(item)
for (item in child.subnets.asIterable()) subnets.add(item) for (item in child.subnets.asIterable()) subnets.add(item)
} }
urls.clear() urls.clear()
...@@ -181,11 +175,21 @@ class Acl { ...@@ -181,11 +175,21 @@ class Acl {
override fun toString(): String { override fun toString(): String {
val result = StringBuilder() val result = StringBuilder()
result.append(if (bypass) "[bypass_all]\n[proxy_list]\n" else "[proxy_all]\n[bypass_list]\n") result.append(if (bypass) "[bypass_all]\n" else "[proxy_all]\n")
result.append(subnets.asIterable().joinToString("\n")) val bypassList = (if (bypass) bypassHostnames.asIterable().asSequence() else
subnets.asIterable().asSequence().map(Subnet::toString) + proxyHostnames.asIterable().asSequence()).toList()
val proxyList = (if (bypass) subnets.asIterable().asSequence().map(Subnet::toString) +
proxyHostnames.asIterable().asSequence() else bypassHostnames.asIterable().asSequence()).toList()
if (bypassList.isNotEmpty()) {
result.append("[bypass_list]\n")
result.append(bypassList.joinToString("\n"))
result.append('\n') result.append('\n')
result.append(hostnames.asIterable().joinToString("\n")) }
if (proxyList.isNotEmpty()) {
result.append("[proxy_list]\n")
result.append(proxyList.joinToString("\n"))
result.append('\n') result.append('\n')
}
result.append(urls.asIterable().joinToString("") { "#IMPORT_URL <$it>\n" }) result.append(urls.asIterable().joinToString("") { "#IMPORT_URL <$it>\n" })
return result.toString() return result.toString()
} }
......
...@@ -215,13 +215,13 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -215,13 +215,13 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
override fun onBindViewHolder(holder: AclRuleViewHolder, i: Int) { override fun onBindViewHolder(holder: AclRuleViewHolder, i: Int) {
val j = i - acl.subnets.size() val j = i - acl.subnets.size()
if (j < 0) holder.bind(acl.subnets[i]) else { if (j < 0) holder.bind(acl.subnets[i]) else {
val k = j - acl.hostnames.size() val k = j - acl.proxyHostnames.size()
if (k < 0) holder.bind(acl.hostnames[j]) else holder.bind(acl.urls[k]) if (k < 0) holder.bind(acl.proxyHostnames[j]) else holder.bind(acl.urls[k])
} }
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = AclRuleViewHolder(LayoutInflater override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = AclRuleViewHolder(LayoutInflater
.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)) .from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false))
override fun getItemCount(): Int = acl.subnets.size() + acl.hostnames.size() + acl.urls.size() override fun getItemCount(): Int = acl.subnets.size() + acl.proxyHostnames.size() + acl.urls.size()
private fun apply() { private fun apply() {
if (!savePending) { if (!savePending) {
...@@ -249,9 +249,9 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -249,9 +249,9 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
return index return index
} }
fun addHostname(hostname: String): Int { fun addHostname(hostname: String): Int {
val old = acl.hostnames.size() val old = acl.proxyHostnames.size()
val index = acl.subnets.size() + acl.hostnames.add(hostname) val index = acl.subnets.size() + acl.proxyHostnames.add(hostname)
if (old != acl.hostnames.size()) { if (old != acl.proxyHostnames.size()) {
notifyItemInserted(index) notifyItemInserted(index)
apply() apply()
} }
...@@ -259,7 +259,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -259,7 +259,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
} }
fun addURL(url: URL): Int { fun addURL(url: URL): Int {
val old = acl.urls.size() val old = acl.urls.size()
val index = acl.subnets.size() + acl.hostnames.size() + acl.urls.add(url) val index = acl.subnets.size() + acl.proxyHostnames.size() + acl.urls.add(url)
if (old != acl.urls.size()) { if (old != acl.urls.size()) {
notifyItemInserted(index) notifyItemInserted(index)
apply() apply()
...@@ -271,7 +271,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -271,7 +271,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
var result: Int? = null var result: Int? = null
if (acl.bypass) acl.subnets.asIterable().asSequence().map { addSubnet(it) } if (acl.bypass) acl.subnets.asIterable().asSequence().map { addSubnet(it) }
.forEach { if (result == null) result = it } .forEach { if (result == null) result = it }
(acl.hostnames.asIterable().asSequence().map { addHostname(it) } + (acl.proxyHostnames.asIterable().asSequence().map { addHostname(it) } +
acl.urls.asIterable().asSequence().map { addURL(it) }) acl.urls.asIterable().asSequence().map { addURL(it) })
.forEach { if (result == null) result = it } .forEach { if (result == null) result = it }
return result return result
...@@ -283,10 +283,10 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -283,10 +283,10 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
undoManager.remove(Pair(i, acl.subnets[i])) undoManager.remove(Pair(i, acl.subnets[i]))
acl.subnets.removeItemAt(i) acl.subnets.removeItemAt(i)
} else { } else {
val k = j - acl.hostnames.size() val k = j - acl.proxyHostnames.size()
if (k < 0) { if (k < 0) {
undoManager.remove(Pair(j, acl.hostnames[j])) undoManager.remove(Pair(j, acl.proxyHostnames[j]))
acl.hostnames.removeItemAt(j) acl.proxyHostnames.removeItemAt(j)
} else { } else {
undoManager.remove(Pair(k, acl.urls[k])) undoManager.remove(Pair(k, acl.urls[k]))
acl.urls.removeItemAt(k) acl.urls.removeItemAt(k)
...@@ -303,12 +303,12 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -303,12 +303,12 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
apply() apply()
} }
is String -> { is String -> {
notifyItemRemoved(acl.subnets.size() + acl.hostnames.indexOf(item)) notifyItemRemoved(acl.subnets.size() + acl.proxyHostnames.indexOf(item))
acl.hostnames.remove(item) acl.proxyHostnames.remove(item)
apply() apply()
} }
is URL -> { is URL -> {
notifyItemRemoved(acl.subnets.size() + acl.hostnames.size() + acl.urls.indexOf(item)) notifyItemRemoved(acl.subnets.size() + acl.proxyHostnames.size() + acl.urls.indexOf(item))
acl.urls.remove(item) acl.urls.remove(item)
apply() apply()
} }
...@@ -327,7 +327,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -327,7 +327,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
fun selectAll() { fun selectAll() {
selectedItems.clear() selectedItems.clear()
selectedItems.addAll(acl.subnets.asIterable()) selectedItems.addAll(acl.subnets.asIterable())
selectedItems.addAll(acl.hostnames.asIterable()) selectedItems.addAll(acl.proxyHostnames.asIterable())
selectedItems.addAll(acl.urls.asIterable()) selectedItems.addAll(acl.urls.asIterable())
onSelectedItemsUpdated() onSelectedItemsUpdated()
notifyDataSetChanged() notifyDataSetChanged()
...@@ -406,7 +406,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -406,7 +406,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
selectedItems.forEach { selectedItems.forEach {
when (it) { when (it) {
is Subnet -> acl.subnets.add(it) is Subnet -> acl.subnets.add(it)
is String -> acl.hostnames.add(it) is String -> acl.proxyHostnames.add(it)
is URL -> acl.urls.add(it) is URL -> acl.urls.add(it)
} }
} }
...@@ -432,7 +432,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -432,7 +432,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
R.id.action_import_gfwlist -> { R.id.action_import_gfwlist -> {
val acl = Acl().fromId(Acl.GFWLIST) val acl = Acl().fromId(Acl.GFWLIST)
if (!acl.bypass) acl.subnets.asIterable().forEach { adapter.addSubnet(it) } if (!acl.bypass) acl.subnets.asIterable().forEach { adapter.addSubnet(it) }
acl.hostnames.asIterable().forEach { adapter.addHostname(it) } acl.proxyHostnames.asIterable().forEach { adapter.addHostname(it) }
acl.urls.asIterable().forEach { adapter.addURL(it) } acl.urls.asIterable().forEach { adapter.addURL(it) }
true true
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment