Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
briar
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
681
Issues
681
List
Boards
Labels
Service Desk
Milestones
Merge Requests
16
Merge Requests
16
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
briar
briar
Commits
b0e97d78
Verified
Commit
b0e97d78
authored
Jun 15, 2019
by
akwizgran
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add offline state for pending contacts.
parent
9c20e6b3
Pipeline
#3565
failed with stage
in 2 minutes and 50 seconds
Changes
6
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
50 additions
and
26 deletions
+50
-26
bramble-api/src/main/java/org/briarproject/bramble/api/contact/PendingContactState.java
...briarproject/bramble/api/contact/PendingContactState.java
+1
-0
bramble-core/src/main/java/org/briarproject/bramble/rendezvous/RendezvousPollerImpl.java
...briarproject/bramble/rendezvous/RendezvousPollerImpl.java
+22
-9
bramble-core/src/test/java/org/briarproject/bramble/rendezvous/RendezvousPollerImplTest.java
...rproject/bramble/rendezvous/RendezvousPollerImplTest.java
+20
-17
briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactViewHolder.java
.../android/contact/add/remote/PendingContactViewHolder.java
+5
-0
briar-headless/README.md
briar-headless/README.md
+1
-0
briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputPendingContact.kt
...iarproject/briar/headless/contact/OutputPendingContact.kt
+1
-0
No files found.
bramble-api/src/main/java/org/briarproject/bramble/api/contact/PendingContactState.java
View file @
b0e97d78
...
...
@@ -3,6 +3,7 @@ package org.briarproject.bramble.api.contact;
public
enum
PendingContactState
{
WAITING_FOR_CONNECTION
,
OFFLINE
,
CONNECTING
,
ADDING_CONTACT
,
FAILED
...
...
bramble-core/src/main/java/org/briarproject/bramble/rendezvous/RendezvousPollerImpl.java
View file @
b0e97d78
...
...
@@ -66,6 +66,7 @@ import static java.util.logging.Level.WARNING;
import
static
java
.
util
.
logging
.
Logger
.
getLogger
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
ADDING_CONTACT
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
FAILED
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
OFFLINE
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
WAITING_FOR_CONNECTION
;
import
static
org
.
briarproject
.
bramble
.
api
.
nullsafety
.
NullSafety
.
requireNull
;
import
static
org
.
briarproject
.
bramble
.
rendezvous
.
RendezvousConstants
.
POLLING_INTERVAL_MS
;
...
...
@@ -158,9 +159,7 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
private
void
addPendingContact
(
PendingContact
p
)
{
long
now
=
clock
.
currentTimeMillis
();
long
expiry
=
p
.
getTimestamp
()
+
RENDEZVOUS_TIMEOUT_MS
;
if
(
expiry
>
now
)
{
broadcastState
(
p
.
getId
(),
WAITING_FOR_CONNECTION
);
}
else
{
if
(
expiry
<=
now
)
{
broadcastState
(
p
.
getId
(),
FAILED
);
return
;
}
...
...
@@ -180,9 +179,13 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
for
(
PluginState
ps
:
pluginStates
.
values
())
{
RendezvousEndpoint
endpoint
=
createEndpoint
(
ps
.
plugin
,
p
.
getId
(),
cs
);
if
(
endpoint
!=
null
)
if
(
endpoint
!=
null
)
{
requireNull
(
ps
.
endpoints
.
put
(
p
.
getId
(),
endpoint
));
cs
.
endpoints
++;
}
}
if
(
cs
.
endpoints
==
0
)
broadcastState
(
p
.
getId
(),
OFFLINE
);
else
broadcastState
(
p
.
getId
(),
WAITING_FOR_CONNECTION
);
}
catch
(
DbException
|
GeneralSecurityException
e
)
{
logException
(
LOG
,
WARNING
,
e
);
}
...
...
@@ -328,9 +331,14 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
TransportId
t
=
plugin
.
getId
();
Map
<
PendingContactId
,
RendezvousEndpoint
>
endpoints
=
new
HashMap
<>();
for
(
Entry
<
PendingContactId
,
CryptoState
>
e
:
cryptoStates
.
entrySet
())
{
RendezvousEndpoint
endpoint
=
createEndpoint
(
plugin
,
e
.
getKey
(),
e
.
getValue
());
if
(
endpoint
!=
null
)
endpoints
.
put
(
e
.
getKey
(),
endpoint
);
PendingContactId
p
=
e
.
getKey
();
CryptoState
cs
=
e
.
getValue
();
RendezvousEndpoint
endpoint
=
createEndpoint
(
plugin
,
p
,
cs
);
if
(
endpoint
!=
null
)
{
endpoints
.
put
(
p
,
endpoint
);
if
(++
cs
.
endpoints
==
1
)
broadcastState
(
p
,
WAITING_FOR_CONNECTION
);
}
}
requireNull
(
pluginStates
.
put
(
t
,
new
PluginState
(
plugin
,
endpoints
)));
}
...
...
@@ -344,8 +352,11 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
private
void
removeTransport
(
TransportId
t
)
{
PluginState
ps
=
pluginStates
.
remove
(
t
);
if
(
ps
!=
null
)
{
for
(
RendezvousEndpoint
endpoint
:
ps
.
endpoints
.
values
())
{
tryToClose
(
endpoint
,
LOG
,
INFO
);
for
(
Entry
<
PendingContactId
,
RendezvousEndpoint
>
e
:
ps
.
endpoints
.
entrySet
())
{
tryToClose
(
e
.
getValue
(),
LOG
,
INFO
);
CryptoState
cs
=
cryptoStates
.
get
(
e
.
getKey
());
if
(--
cs
.
endpoints
==
0
)
broadcastState
(
e
.
getKey
(),
OFFLINE
);
}
}
}
...
...
@@ -391,6 +402,8 @@ class RendezvousPollerImpl implements RendezvousPoller, Service, EventListener {
private
final
boolean
alice
;
private
final
long
expiry
;
private
int
endpoints
=
0
;
private
CryptoState
(
SecretKey
rendezvousKey
,
boolean
alice
,
long
expiry
)
{
this
.
rendezvousKey
=
rendezvousKey
;
...
...
bramble-core/src/test/java/org/briarproject/bramble/rendezvous/RendezvousPollerImplTest.java
View file @
b0e97d78
...
...
@@ -45,6 +45,7 @@ import static java.util.Collections.singletonList;
import
static
java
.
util
.
concurrent
.
TimeUnit
.
MILLISECONDS
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
ADDING_CONTACT
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
FAILED
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
OFFLINE
;
import
static
org
.
briarproject
.
bramble
.
api
.
contact
.
PendingContactState
.
WAITING_FOR_CONNECTION
;
import
static
org
.
briarproject
.
bramble
.
rendezvous
.
RendezvousConstants
.
POLLING_INTERVAL_MS
;
import
static
org
.
briarproject
.
bramble
.
rendezvous
.
RendezvousConstants
.
RENDEZVOUS_TIMEOUT_MS
;
...
...
@@ -120,7 +121,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
will
(
returnValue
(
beforeExpiry
));
oneOf
(
eventBus
).
broadcast
(
with
(
new
PredicateMatcher
<>(
PendingContactStateChangedEvent
.
class
,
e
->
e
.
getPendingContactState
()
==
WAITING_FOR_CONNECTION
)));
e
.
getPendingContactState
()
==
OFFLINE
)));
// Capture the poll task
oneOf
(
scheduler
).
scheduleAtFixedRate
(
with
(
any
(
Runnable
.
class
)),
with
(
POLLING_INTERVAL_MS
),
with
(
POLLING_INTERVAL_MS
),
...
...
@@ -184,7 +185,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context
.
assertIsSatisfied
();
// Add the pending contact - endpoint should be created and polled
expectAdd
UnexpiredPendingContact
(
beforeExpiry
);
expectAdd
PendingContact
(
beforeExpiry
,
WAITING_FOR_CONNECTION
);
expectDeriveRendezvousKey
();
expectCreateEndpoint
();
...
...
@@ -205,9 +206,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context
.
assertIsSatisfied
();
// Remove the pending contact - endpoint should be closed
context
.
checking
(
new
Expectations
()
{{
oneOf
(
rendezvousEndpoint
).
close
();
}});
expectCloseEndpoint
();
rendezvousPoller
.
eventOccurred
(
new
PendingContactRemovedEvent
(
pendingContact
.
getId
()));
...
...
@@ -238,7 +237,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context
.
assertIsSatisfied
();
// Add the pending contact - endpoint should be created and polled
expectAdd
UnexpiredPendingContact
(
beforeExpiry
);
expectAdd
PendingContact
(
beforeExpiry
,
WAITING_FOR_CONNECTION
);
expectDeriveRendezvousKey
();
expectCreateEndpoint
();
...
...
@@ -260,10 +259,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
// Run the poll task - pending contact expires, endpoint is closed
expectPendingContactExpires
(
afterExpiry
);
context
.
checking
(
new
Expectations
()
{{
oneOf
(
rendezvousEndpoint
).
close
();
}});
expectCloseEndpoint
();
capturePollTask
.
get
().
run
();
context
.
assertIsSatisfied
();
...
...
@@ -289,7 +285,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
context
.
assertIsSatisfied
();
// Add the pending contact - no endpoints should be created yet
expectAdd
UnexpiredPendingContact
(
beforeExpiry
);
expectAdd
PendingContact
(
beforeExpiry
,
OFFLINE
);
expectDeriveRendezvousKey
();
rendezvousPoller
.
eventOccurred
(
...
...
@@ -299,14 +295,14 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
// Enable the transport - endpoint should be created
expectGetPlugin
();
expectCreateEndpoint
();
expectStateChangedEvent
(
WAITING_FOR_CONNECTION
);
rendezvousPoller
.
eventOccurred
(
new
TransportEnabledEvent
(
transportId
));
context
.
assertIsSatisfied
();
// Disable the transport - endpoint should be closed
context
.
checking
(
new
Expectations
()
{{
oneOf
(
rendezvousEndpoint
).
close
();
}});
expectCloseEndpoint
();
expectStateChangedEvent
(
OFFLINE
);
rendezvousPoller
.
eventOccurred
(
new
TransportDisabledEvent
(
transportId
));
context
.
assertIsSatisfied
();
...
...
@@ -482,13 +478,14 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
return
capturePollTask
;
}
private
void
expectAddUnexpiredPendingContact
(
long
now
)
{
private
void
expectAddPendingContact
(
long
now
,
PendingContactState
initialState
)
{
context
.
checking
(
new
Expectations
()
{{
oneOf
(
clock
).
currentTimeMillis
();
will
(
returnValue
(
now
));
oneOf
(
eventBus
).
broadcast
(
with
(
new
PredicateMatcher
<>(
PendingContactStateChangedEvent
.
class
,
e
->
e
.
getPendingContactState
()
==
WAITING_FOR_CONNECTION
)));
e
.
getPendingContactState
()
==
initialState
)));
}});
}
...
...
@@ -546,7 +543,7 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
will
(
returnValue
(
now
));
oneOf
(
eventBus
).
broadcast
(
with
(
new
PredicateMatcher
<>(
PendingContactStateChangedEvent
.
class
,
e
->
e
.
getPendingContactState
()
==
WAITING_FOR_CONNECTION
)));
e
.
getPendingContactState
()
==
OFFLINE
)));
// Capture the poll task
oneOf
(
scheduler
).
scheduleAtFixedRate
(
with
(
any
(
Runnable
.
class
)),
with
(
POLLING_INTERVAL_MS
),
with
(
POLLING_INTERVAL_MS
),
...
...
@@ -576,4 +573,10 @@ public class RendezvousPollerImplTest extends BrambleMockTestCase {
e
.
getPendingContactState
()
==
state
)));
}});
}
private
void
expectCloseEndpoint
()
throws
Exception
{
context
.
checking
(
new
Expectations
()
{{
oneOf
(
rendezvousEndpoint
).
close
();
}});
}
}
briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactViewHolder.java
View file @
b0e97d78
...
...
@@ -52,6 +52,11 @@ class PendingContactViewHolder extends ViewHolder {
.
getColor
(
status
.
getContext
(),
R
.
color
.
briar_yellow
);
status
.
setText
(
R
.
string
.
waiting_for_contact_to_come_online
);
break
;
case
OFFLINE:
color
=
ContextCompat
.
getColor
(
status
.
getContext
(),
R
.
color
.
briar_yellow
);
status
.
setText
(
R
.
string
.
offline_state
);
break
;
case
CONNECTING:
status
.
setText
(
R
.
string
.
connecting
);
break
;
...
...
briar-headless/README.md
View file @
b0e97d78
...
...
@@ -131,6 +131,7 @@ This will return a JSON array of pending contacts and their states:
The state can be one of these values:
*
`waiting_for_connection`
*
`offline`
*
`connecting`
*
`adding_contact`
*
`failed`
...
...
briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputPendingContact.kt
View file @
b0e97d78
...
...
@@ -16,6 +16,7 @@ internal fun PendingContact.output() = JsonDict(
internal
fun
PendingContactState
.
output
()
=
when
(
this
)
{
WAITING_FOR_CONNECTION
->
"waiting_for_connection"
OFFLINE
->
"offline"
CONNECTING
->
"connecting"
ADDING_CONTACT
->
"adding_contact"
FAILED
->
"failed"
...
...
Write
Preview
Markdown
is supported
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