Improved node registry so it should provide better nodes

This commit is contained in:
Christian Basler 2017-11-14 07:47:34 +01:00
parent 072f732924
commit 33e932e630
2 changed files with 44 additions and 4 deletions

View File

@ -82,8 +82,8 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP
doAsync { doAsync {
val bmc = Singleton.getBitmessageContext(ctx) val bmc = Singleton.getBitmessageContext(ctx)
bmc.cleanup()
bmc.internals.nodeRegistry.clear() bmc.internals.nodeRegistry.clear()
bmc.cleanup()
Preferences.cleanupExportDirectory(ctx) Preferences.cleanupExportDirectory(ctx)
uiThread { uiThread {

View File

@ -11,9 +11,11 @@ import ch.dissem.bitmessage.ports.NodeRegistryHelper.loadStableNodes
import ch.dissem.bitmessage.utils.Collections import ch.dissem.bitmessage.utils.Collections
import ch.dissem.bitmessage.utils.SqlStrings import ch.dissem.bitmessage.utils.SqlStrings
import ch.dissem.bitmessage.utils.Strings.hex import ch.dissem.bitmessage.utils.Strings.hex
import ch.dissem.bitmessage.utils.UnixTime
import ch.dissem.bitmessage.utils.UnixTime.DAY import ch.dissem.bitmessage.utils.UnixTime.DAY
import ch.dissem.bitmessage.utils.UnixTime.MINUTE import ch.dissem.bitmessage.utils.UnixTime.MINUTE
import ch.dissem.bitmessage.utils.UnixTime.now import ch.dissem.bitmessage.utils.UnixTime.now
import ch.dissem.bitmessage.utils.max
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.util.* import java.util.*
import kotlin.concurrent.getOrSet import kotlin.concurrent.getOrSet
@ -132,7 +134,14 @@ class AndroidNodeRegistry(private val sql: SqlHelper) : NodeRegistry {
values.put(COLUMN_ADDRESS, node.IPv6) values.put(COLUMN_ADDRESS, node.IPv6)
values.put(COLUMN_PORT, node.port) values.put(COLUMN_PORT, node.port)
values.put(COLUMN_SERVICES, node.services) values.put(COLUMN_SERVICES, node.services)
values.put(COLUMN_TIME, node.time) values.put(COLUMN_TIME,
if (node.time > UnixTime.now) {
// This might be an attack, let's not use those nodes with priority
UnixTime.now - 7 * UnixTime.DAY
} else {
node.time
}
)
sql.writableDatabase.insertOrThrow(TABLE_NAME, null, values) sql.writableDatabase.insertOrThrow(TABLE_NAME, null, values)
} catch (e: SQLiteConstraintException) { } catch (e: SQLiteConstraintException) {
@ -140,12 +149,19 @@ class AndroidNodeRegistry(private val sql: SqlHelper) : NodeRegistry {
} }
} }
private fun update(node: NetworkAddress) { override fun update(node: NetworkAddress) {
try { try {
val time = if (node.time > UnixTime.now) {
// This might be an attack, let's not use those nodes with priority
UnixTime.now - 7 * UnixTime.DAY
} else {
node.time
}
// Create a new map of values, where column names are the keys // Create a new map of values, where column names are the keys
val values = ContentValues() val values = ContentValues()
values.put(COLUMN_SERVICES, node.services) values.put(COLUMN_SERVICES, node.services)
values.put(COLUMN_TIME, node.time) values.put(COLUMN_TIME, max(node.time, time))
sql.writableDatabase.update( sql.writableDatabase.update(
TABLE_NAME, TABLE_NAME,
@ -158,6 +174,30 @@ class AndroidNodeRegistry(private val sql: SqlHelper) : NodeRegistry {
} }
} }
override fun remove(node: NetworkAddress) {
try {
sql.writableDatabase.delete(
TABLE_NAME,
"stream=${node.stream} AND address=X'${hex(node.IPv6)}' AND port=${node.port}",
null
)
} catch (e: SQLiteConstraintException) {
LOG.trace(e.message, e)
}
}
override fun cleanup() {
try {
sql.writableDatabase.delete(
TABLE_NAME,
"time<${UnixTime.now - 8 * DAY}",
null
)
} catch (e: SQLiteConstraintException) {
LOG.trace(e.message, e)
}
}
companion object { companion object {
private val LOG = LoggerFactory.getLogger(AndroidInventory::class.java) private val LOG = LoggerFactory.getLogger(AndroidInventory::class.java)