Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
PublicAndroidApps
Nebulo
Commits
7e9ed24c
Commit
7e9ed24c
authored
Nov 18, 2019
by
Daniel Wolf
Browse files
Added synchronization
parent
0953691d
Changes
1
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/com/frostnerd/smokescreen/util/proxy/QueryListener.kt
View file @
7e9ed24c
...
...
@@ -34,30 +34,33 @@ import org.minidns.dnsmessage.DnsMessage
class
QueryListener
(
private
val
context
:
Context
)
:
QueryListener
{
private
val
writeQueriesToLog
=
context
.
getPreferences
().
shouldLogDnsQueriesToConsole
()
private
val
logQueriesToDb
=
context
.
getPreferences
().
queryLoggingEnabled
private
va
l
waitingQueryLogs
=
LinkedHashMap
<
Int
,
DnsQuery
>()
private
va
r
waitingQueryLogs
=
LinkedHashMap
<
Int
,
DnsQuery
>()
// Question ID -> <Query, Insert> (true if the query has already been inserted)
private
val
queryLogState
:
MutableMap
<
Int
,
Boolean
>
=
mutableMapOf
()
// Query -> Has already been inserted
private
va
l
doneQueries
=
mutableMapOf
<
DnsQuery
,
Boolean
>()
private
val
askedServer
:
String
private
va
r
doneQueries
=
mutableMapOf
<
DnsQuery
,
Boolean
>()
private
val
askedServer
:
String
private
var
nextQueryId
=
0L
var
lastDnsResponse
:
DnsMessage
?
=
null
private
val
databaseWriteJob
:
Job
var
lastDnsResponse
:
DnsMessage
?
=
null
private
val
databaseWriteJob
:
Job
init
{
val
config
=
context
.
getPreferences
().
dnsServerConfig
askedServer
=
if
(
config
.
hasTlsServer
())
{
askedServer
=
if
(
config
.
hasTlsServer
())
{
"tls::"
+
config
.
servers
.
first
().
address
.
host
!!
}
else
{
"https::"
+
(
config
as
HttpsDnsServerInformation
).
serverConfigurations
.
values
.
first
().
urlCreator
.
address
.
getUrl
(
false
)
"https::"
+
(
config
as
HttpsDnsServerInformation
).
serverConfigurations
.
values
.
first
().
urlCreator
.
address
.
getUrl
(
false
)
}
nextQueryId
=
context
.
getDatabase
().
dnsQueryDao
().
getLastInsertedId
()
+
1
databaseWriteJob
=
GlobalScope
.
launch
(
newSingleThreadContext
(
"QueryListener-DatabaseWrite"
))
{
while
(
isActive
)
{
delay
(
1500
)
insertQueries
()
databaseWriteJob
=
GlobalScope
.
launch
(
newSingleThreadContext
(
"QueryListener-DatabaseWrite"
))
{
while
(
isActive
)
{
delay
(
1500
)
insertQueries
()
}
}
}
}
override
suspend
fun
onDeviceQuery
(
questionMessage
:
DnsMessage
,
srcPort
:
Int
)
{
...
...
@@ -73,14 +76,20 @@ class QueryListener(private val context: Context) : QueryListener {
questionTime
=
System
.
currentTimeMillis
(),
responses
=
mutableListOf
()
)
query
.
id
=
nextQueryId
++
waitingQueryLogs
[
questionMessage
.
id
]
=
query
queryLogState
[
questionMessage
.
id
]
=
false
synchronized
(
waitingQueryLogs
)
{
query
.
id
=
nextQueryId
++
waitingQueryLogs
[
questionMessage
.
id
]
=
query
queryLogState
[
questionMessage
.
id
]
=
false
}
}
}
override
suspend
fun
onQueryForwarded
(
questionMessage
:
DnsMessage
,
destination
:
UpstreamAddress
,
usedHandle
:
DnsHandle
)
{
if
(
writeQueriesToLog
)
{
override
suspend
fun
onQueryForwarded
(
questionMessage
:
DnsMessage
,
destination
:
UpstreamAddress
,
usedHandle
:
DnsHandle
)
{
if
(
writeQueriesToLog
)
{
context
.
log
(
"Query with ID ${questionMessage.id} forwarded by $usedHandle"
)
}
...
...
@@ -89,20 +98,25 @@ class QueryListener(private val context: Context) : QueryListener {
}
}
override
suspend
fun
onQueryResponse
(
responseMessage
:
DnsMessage
,
source
:
QueryListener
.
Source
)
{
override
suspend
fun
onQueryResponse
(
responseMessage
:
DnsMessage
,
source
:
QueryListener
.
Source
)
{
if
(
writeQueriesToLog
)
{
context
.
log
(
"Returned from $source: $responseMessage"
)
}
lastDnsResponse
=
responseMessage
if
(
logQueriesToDb
)
{
val
query
=
waitingQueryLogs
.
remove
(
responseMessage
.
id
)
!!
val
query
=
synchronized
(
waitingQueryLogs
)
{
waitingQueryLogs
.
remove
(
responseMessage
.
id
)
!!
}
query
.
responseTime
=
System
.
currentTimeMillis
()
for
(
answer
in
responseMessage
.
answerSection
)
{
query
.
addResponse
(
answer
)
}
query
.
responseSource
=
source
doneQueries
[
query
]
=
queryLogState
.
remove
(
responseMessage
.
id
)
!!
doneQueries
[
query
]
=
queryLogState
.
remove
(
responseMessage
.
id
)
!!
}
}
...
...
@@ -114,16 +128,20 @@ class QueryListener(private val context: Context) : QueryListener {
}
private
fun
insertQueries
()
{
if
(
waitingQueryLogs
.
isEmpty
()
&&
doneQueries
.
isEmpty
())
return
val
currentInsertions
=
waitingQueryLogs
.
toMap
()
val
currentDoneInsertions
=
doneQueries
.
toMap
()
doneQueries
.
clear
()
if
(
waitingQueryLogs
.
isEmpty
()
&&
doneQueries
.
isEmpty
())
return
val
currentInsertions
:
Map
<
Int
,
DnsQuery
>
val
currentDoneInsertions
:
Map
<
DnsQuery
,
Boolean
>
synchronized
(
waitingQueryLogs
)
{
currentInsertions
=
waitingQueryLogs
.
toMap
()
currentDoneInsertions
=
doneQueries
doneQueries
.
clear
()
}
val
database
=
context
.
getDatabase
()
val
dao
=
database
.
dnsQueryDao
()
database
.
runInTransaction
{
currentInsertions
.
forEach
{
(
key
,
value
)
->
if
(
queryLogState
[
key
]
!!
)
{
if
(
queryLogState
[
key
]
!!
)
{
dao
.
insert
(
value
)
queryLogState
[
key
]
=
true
}
else
{
...
...
@@ -131,10 +149,9 @@ class QueryListener(private val context: Context) : QueryListener {
}
}
currentDoneInsertions
.
forEach
{
(
key
,
value
)
->
if
(
value
)
dao
.
update
(
key
)
if
(
value
)
dao
.
update
(
key
)
else
dao
.
insert
(
key
)
}
}
}
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment