Compare commits

..

667 Commits

Author SHA1 Message Date
akwizgran
559138c5b6 Bump version numbers for 1.4.12 release. 2022-09-28 17:58:47 +01:00
akwizgran
f90aef7767 Update translations, add Georgian translation. 2022-09-28 17:57:48 +01:00
Torsten Grote
ee417fc8d2 Merge branch 'snowflake' into 'master'
Add Snowflake pluggable transport

See merge request briar/briar!1714
2022-09-28 15:53:45 +00:00
akwizgran
b424d6f98e Add test for snowflake parameters. 2022-09-28 16:18:08 +01:00
akwizgran
32205ca6d3 Rename oldAndroid to letsEncrypt. 2022-09-28 16:17:45 +01:00
akwizgran
dd3a9aa71b Merge branch 'separating-signout' into 'master'
Added a separator to a sign out button

Closes #1074

See merge request briar/briar!1711
2022-09-27 17:14:53 +00:00
akwizgran
4e59836dd0 Merge branch 'update-bridges' into 'master'
Update bridges

See merge request briar/briar!1713
2022-09-27 14:17:59 +00:00
akwizgran
264b2ca2f3 Add Snowflake pluggable transport. 2022-09-27 15:10:44 +01:00
akwizgran
23f5de66a8 Use port 80 for placeholder meek_lite address.
See upstream commit:

https://gitweb.torproject.org/builders/tor-browser-build.git/commit/projects/common/bridges_list.meek-azure.txt?h=main&id=55f89756330a060cc65456000acf75226c545a42
2022-09-27 15:08:52 +01:00
akwizgran
79aa42c0f8 Add some new non-default and vanilla bridges. 2022-09-27 15:08:52 +01:00
akwizgran
f00c3a47f5 Remove some failing bridges. 2022-09-27 15:08:52 +01:00
Torsten Grote
04011e50bc Merge branch 'obfs4proxy-0.0.14' into 'master'
Upgrade obfs4proxy to 0.0.14

See merge request briar/briar!1712
2022-09-26 11:26:35 +00:00
akwizgran
7d20a844ff Increase BridgeTest timeout to 4 hours. 2022-09-26 12:15:51 +01:00
akwizgran
43581cc339 Upgrade obfs4proxy to 0.0.14. 2022-09-23 15:38:52 +01:00
akwizgran
34815eb1a5 Merge branch 'privacy-policy' into 'master'
Fixed privacy policy in report form

See merge request briar/briar!1704
2022-09-17 13:04:13 +00:00
FlyingP1g FlyingP1g
13d9e93758 Fixed privacy policy in report form 2022-09-17 13:04:13 +00:00
FlyingP1g FlyingP1g
98c1dca602 Added a separator to a sign out button 2022-09-15 00:54:28 +03:00
akwizgran
5ceba8f508 Merge branch '2363-mailbox-problem-scrollable' into 'master'
Make mailbox problem screen scrollable

See merge request briar/briar!1709
2022-09-12 09:49:07 +00:00
Torsten Grote
8e5ec347f2 Make mailbox problem screen scrollable
so all views will never overlap even on small screens in landscape orientation.
2022-09-09 14:51:35 -03:00
akwizgran
f3afcb8469 Merge branch '1052-trust-indicator-in-main-contact-list' into 'master'
Show trust-indicator with description in contact list

Closes #1052

See merge request briar/briar!1688
2022-09-06 09:58:48 +00:00
akwizgran
3a317a9144 Merge branch 'removed-anonymous-author-status' into 'master'
Removed anonymous author status.

Closes #1630

See merge request briar/briar!1706
2022-09-06 09:56:19 +00:00
Torsten Grote
480a4b5901 Merge branch 'tor-0.4.5.14' into 'master'
Upgrade Tor to 0.4.5.14

Closes #2355

See merge request briar/briar!1708
2022-09-05 12:16:12 +00:00
akwizgran
6d9a241820 Upgrade Tor to 0.4.5.14. 2022-09-05 12:42:34 +01:00
Torsten Grote
1c656d217c Merge branch 'upgrade-jsoup' into 'master'
Upgrade jsoup to 1.15.3

See merge request briar/briar!1707
2022-08-31 12:20:12 +00:00
akwizgran
a503aa6ed2 Fix test expectations: no whitespace after tag. 2022-08-31 13:04:44 +01:00
akwizgran
85361b0099 Upgrade jsoup to 1.15.3. 2022-08-31 12:39:50 +01:00
FlyingP1g FlyingP1g
4efdb7b75b Removed anonymous author status. 2022-08-30 20:28:01 +03:00
akwizgran
787200d03f Merge branch '2360-mailbox-raster-notification' into 'master'
Use raster image for mailbox problem notifications

Closes #2360

See merge request briar/briar!1705
2022-08-29 15:08:04 +00:00
Torsten Grote
3ac05e4b88 Use raster image for mailbox problem notifications 2022-08-29 11:56:48 -03:00
Torsten Grote
7aafbdd715 Merge branch '2354-show-confirmation-toast-after-unlinking' into 'master'
Show confirmation toast after unlinking mailbox

Closes #2354

See merge request briar/briar!1703
2022-08-17 17:01:33 +00:00
akwizgran
617a6db84c Show confirmation toast after unlinking mailbox. 2022-08-17 16:59:31 +01:00
Torsten Grote
2c295fb096 Merge branch '2356-fix-expectations-for-flaky-unit-tests' into 'master'
Fix expecations for unit tests

Closes #2356

See merge request briar/briar!1702
2022-08-17 11:54:14 +00:00
akwizgran
4af895d124 Merge branch 'privacy-policy' into 'master'
Added privacy policy to menu and report form.

Closes #2351

See merge request briar/briar!1695
2022-08-17 11:32:12 +00:00
FlyingP1g FlyingP1g
3cd388decd Merge remote-tracking branch 'mine/privacy-policy' into privacy-policy
# Conflicts:
#	briar-android/src/main/res/layout/fragment_report_form.xml
2022-08-17 14:11:45 +03:00
FlyingP1g FlyingP1g
08551d16cd Added privacy policy to menu and report form. 2022-08-17 14:08:36 +03:00
akwizgran
d905cb6cda Fix expecations for unit tests.
The missing expectations were only causing failures some of the time because the `shared` flag is set randomly for each test run.
2022-08-17 11:52:52 +01:00
Torsten Grote
bcc7a4b93b Merge branch '2352-do-not-create-files-for-upload-while-connected' into 'master'
Don't create files for upload while directly connected to contact

Closes #2352

See merge request briar/briar!1697
2022-08-16 14:28:07 +00:00
Torsten Grote
4fe9fa3315 Merge branch '2228-mailbox-client-manager' into 'master'
Add mailbox client manager

Closes #2228

See merge request briar/briar!1696
2022-08-16 14:20:42 +00:00
akwizgran
079ef5b3c0 Add helper method for checking client/server compatibility. 2022-08-16 15:11:53 +01:00
akwizgran
de76986ee4 Rename event, only broadcast it when adding a new contact. 2022-08-16 15:06:38 +01:00
Torsten Grote
96630e1b34 Merge branch '2174-check-own-mailbox-periodically' into 'master'
Check our own mailbox periodically while we're online

Closes #2174

See merge request briar/briar!1698
2022-08-16 13:54:14 +00:00
akwizgran
4eddf625d8 Add tests for visible/invisible group when message is shared. 2022-08-16 14:48:37 +01:00
Torsten Grote
28ad66a03d Merge branch '2302-send-new-server-supported-versions-to-contacts' into 'master'
When our mailbox's API versions change, send them to contacts

Closes #2302

See merge request briar/briar!1701
2022-08-16 13:43:23 +00:00
akwizgran
0af371d026 Update comments. 2022-08-16 14:14:14 +01:00
akwizgran
a57c784b47 Add comments for group visibility. 2022-08-16 14:06:12 +01:00
akwizgran
ab360e1e25 Address some review comments. 2022-08-16 13:49:30 +01:00
akwizgran
2aa39e43ef Bump version numbers for 1.4.11 release. 2022-08-15 16:35:42 +01:00
Torsten Grote
efb294de53 Merge branch 'update-tor-bridges' into 'master'
Update Tor bridges

See merge request briar/briar!1700
2022-08-15 14:59:40 +00:00
Torsten Grote
99755619c5 Merge branch '2228-more-mailbox-client-manager-preliminaries' into 'master'
More mailbox client manager preliminaries

See merge request briar/briar!1694
2022-08-15 14:27:23 +00:00
akwizgran
9990fb3b8f When our mailbox's API versions change, send them to contacts. 2022-08-12 16:38:15 +01:00
akwizgran
6d26db3d66 Add some non-default and vanilla bridges. 2022-08-12 14:53:42 +01:00
akwizgran
51301968a5 Remove some failing bridges. 2022-08-12 14:42:01 +01:00
akwizgran
feb1c1b655 Update translations. 2022-08-10 14:41:58 +01:00
akwizgran
148f61a6b5 Check our own mailbox periodically while we're online. 2022-08-10 14:34:09 +01:00
akwizgran
24d4debde0 Don't create files for upload while directly connected to contact. 2022-08-10 12:37:38 +01:00
akwizgran
a1f25c8101 Attach group visibility to MessageSharedEvent.
This allows listeners to decide whether to act on the event.
2022-08-10 12:33:53 +01:00
akwizgran
62883b4bde Unit tests for mailbox client manager. 2022-08-08 15:46:58 +01:00
akwizgran
42243f73f4 Simplify logic. 2022-08-08 15:33:21 +01:00
FlyingP1g FlyingP1g
f4365330cb Added privacy policy to menu and report form. 2022-08-06 13:45:48 +03:00
akwizgran
d3a06cf2c0 Add some javadocs. 2022-08-05 15:43:17 +01:00
akwizgran
15d29f6189 Don't check whether messages are visible before lowering ack flag.
This check excludes messages that aren't shared, including incoming private messages. The check isn't necessary because lowerAckFlag() ignores messages for which no status row exists for the contact.
2022-08-05 14:16:15 +01:00
akwizgran
339e4daded Update Dagger modules. 2022-08-05 14:16:15 +01:00
akwizgran
217a6dbf1c If worker is destroyed during upload, delete file before returning. 2022-08-05 14:16:15 +01:00
akwizgran
46352f664c Add mailbox client manager. 2022-08-05 14:16:15 +01:00
akwizgran
dfcd626081 Add some logging to connectivity checks. 2022-08-05 14:16:15 +01:00
akwizgran
347895f6b2 Update ProGuard rules to keep serialisable classes. 2022-08-05 14:16:14 +01:00
akwizgran
7a6d075984 Don't repeatedly ack the same messages. 2022-08-04 15:51:44 +01:00
akwizgran
68ab3b0e97 Register contact list worker to receive events. 2022-08-03 17:57:35 +01:00
akwizgran
16fc4f4527 Allow read-only transaction when not marking message as sent. 2022-08-03 17:57:35 +01:00
akwizgran
8657216345 Broadcast an event when sending a mailbox update. 2022-08-03 17:57:35 +01:00
akwizgran
42e2926d61 Always sort lists of API versions for easier comparison. 2022-08-03 17:57:35 +01:00
Torsten Grote
a261b8e739 Merge branch '2228-mailbox-client-manager-preliminaries' into 'master'
Preliminaries for mailbox client manager

See merge request briar/briar!1693
2022-08-02 14:41:59 +00:00
akwizgran
1699d6b5f8 Check properties of events. 2022-08-02 15:24:20 +01:00
akwizgran
848872a803 Broadcast events for pairing and unpairing. 2022-08-02 12:59:27 +01:00
akwizgran
04ed3a652a Pass mailbox properties to hook when pairing. 2022-08-02 12:59:27 +01:00
akwizgran
d20457f338 Remove redundant method for recording successful connection. 2022-08-02 12:59:26 +01:00
akwizgran
ab29aacce0 Add MailboxClientFactory. 2022-08-02 12:59:26 +01:00
akwizgran
46bb2b8ec2 Destroy connectivity checker when client is destroyed. 2022-08-02 12:59:26 +01:00
Torsten Grote
6b6880c1ff Merge branch 'tolerate-missing-folders' into 'master'
Tolerate 404 responses due to missing folders

See merge request briar/briar!1692
2022-08-01 13:40:33 +00:00
akwizgran
5defd500ae Tolerate 404 responses due to missing folders.
This prevents our own mailbox's download worker from getting stuck trying to list a folder that has been removed. Instead, the worker will move on to the next folder.
2022-07-27 16:36:32 +01:00
johndoe4221
7a888a6114 feat: [1052] show trust-indicator in contact list 2022-07-23 14:11:40 +02:00
Torsten Grote
37ff06d192 Merge branch '2290-client-for-own-mailbox' into 'master'
Add mailbox client for our own mailbox

Closes #2290

See merge request briar/briar!1691
2022-07-18 14:27:19 +00:00
akwizgran
85aa21ebf6 Address review feedback. 2022-07-18 11:25:27 +01:00
akwizgran
e448699895 Merge branch 'briar-about-update' into 'master'
Briar about update

See merge request briar/briar!1690
2022-07-18 10:08:41 +00:00
Torsten Grote
200f83bcfe Merge branch '2293-own-mailbox-download-worker' into 'master'
Mailbox download worker for our own mailbox

Closes #2293

See merge request briar/briar!1689
2022-07-15 19:40:48 +00:00
FlyingP1g FlyingP1g
89cce89650 About menu: Added url method. 2022-07-15 20:25:43 +03:00
akwizgran
8982964fbf Add mailbox client for our own mailbox. 2022-07-15 18:00:13 +01:00
FlyingP1g FlyingP1g
f3a3fa0ea8 Merge branch 'master' into briar-about-update-bad
# Conflicts:
#	briar-android/src/main/res/layout/fragment_about.xml
#	briar-android/src/main/res/values/strings.xml
2022-07-15 19:18:21 +03:00
akwizgran
0865a06ac8 Refactor duplicated test code into superclass. 2022-07-15 16:24:22 +01:00
akwizgran
f2738c8bc4 Add some javadocs. 2022-07-15 16:07:26 +01:00
akwizgran
1321f8775e Refactor duplicated code into superclass. 2022-07-15 15:45:55 +01:00
akwizgran
9764aba47d Add download worker for own mailbox. 2022-07-15 15:19:44 +01:00
akwizgran
913e5da2f5 Refactor test expectations, add test for nothing to download. 2022-07-15 15:19:11 +01:00
akwizgran
f2ce7a386b Merge branch 'briar-info-translators-string' into 'master'
Added "translated by" to about menu.

See merge request briar/briar!1687
2022-07-15 13:26:02 +00:00
FlyingP1g FlyingP1g
7607b65e82 Added "translated by" to about menu. 2022-07-15 13:26:02 +00:00
FlyingP1g FlyingP1g
c13c2d62f5 About menu: Added tor version and small wording fixes 2022-07-12 22:26:58 +03:00
FlyingP1g FlyingP1g
8ea7204cf6 About menu: Added changelog and fixed wording 2022-07-12 21:10:29 +03:00
FlyingP1g FlyingP1g
6ec382cfc4 About menu: Thanks to translators redesign 2022-07-12 20:35:53 +03:00
FlyingP1g FlyingP1g
ad0b28a684 Better wording. 2022-07-12 19:18:29 +03:00
FlyingP1g FlyingP1g
0ae94e9579 String fix 2022-07-12 17:30:48 +03:00
FlyingP1g FlyingP1g
57bd5789d4 About menu contribution fixes. 2022-07-12 17:07:28 +03:00
FlyingP1g FlyingP1g
f7dde1250c Added "translated by" to about menu. 2022-07-12 00:54:15 +03:00
akwizgran
13d96651b4 Merge branch '2329-translations-for-trust-indicator-view-trust-levels' into 'master'
feat: [2329] adding initial translations for contact trust levels

Closes #2329

See merge request briar/briar!1664
2022-07-11 12:49:09 +00:00
johndoe4221
65029982ce feat: [2329] changing translation of trustlevel to 'verifified contact'/'unverified contact' 2022-07-11 14:31:54 +02:00
johndoe4221
380921ce25 Merge branch 'master' of https://code.briarproject.org/johndoe4221/briar into 2329-translations-for-trust-indicator-view-trust-levels 2022-07-11 14:28:28 +02:00
Torsten Grote
87ee8cd653 Merge branch 'jtorctl-0.5' into 'master'
Crash as soon as Tor closes the control connection

See merge request briar/briar!1686
2022-07-11 12:04:25 +00:00
akwizgran
d4810a6f71 Merge branch 'mr/contributing-md' into 'master'
Create CONTRIBUTING.md (describe folder names)

See merge request briar/briar!1685
2022-07-11 11:40:01 +00:00
Thomas
aa56aba1a5 Create CONTRIBUTING.md (describe folder names) 2022-07-11 11:40:01 +00:00
akwizgran
35438dbac1 Merge branch 'briar-info' into 'master'
Added about menu.

See merge request briar/briar!1683
2022-07-11 11:17:13 +00:00
johndoe4221
543b1178a1 feat: [2329] use term peer-trust-level 2022-07-07 19:10:27 +02:00
johndoe4221
7f1071f5cd feat: [2329] adding initial translations for contact trust levels 2022-07-07 19:06:45 +02:00
johndoe4221
e8c694fe00 feat: [2329] changing terminology from contact-trust-level to author-trust-level 2022-07-07 18:06:41 +02:00
johndoe4221
b58b0c74a9 feat: [2329][1630] remove translation for anonymous trust level 2022-07-07 18:06:41 +02:00
johndoe4221
9e5029917e feat: [2329] adding initial translations for contact trust levels 2022-07-07 18:06:40 +02:00
FlyingP1g FlyingP1g
12ca74f86a Minor about menu improvements. 2022-07-07 16:26:12 +03:00
akwizgran
622683f45e Crash as soon as Tor closes the control connection. 2022-07-06 15:38:23 +01:00
akwizgran
a5563ead28 Bump version numbers for 1.4.10 release. 2022-07-04 16:08:53 +01:00
akwizgran
e15f49fde7 Update translations. 2022-07-04 15:59:57 +01:00
johndoe4221
e66f92f27e Merge branch '2329-translations-for-trust-indicator-view-trust-levels' of https://code.briarproject.org/johndoe4221/briar into 2329-translations-for-trust-indicator-view-trust-levels 2022-07-02 09:55:42 +02:00
johndoe4221
44acda2045 feat: [2329] changing terminology from contact-trust-level to author-trust-level 2022-07-02 09:43:53 +02:00
johndoe4221
afd92dd916 feat: [2329][1630] remove translation for anonymous trust level 2022-07-02 09:38:35 +02:00
johndoe4221
2a969f8e0b feat: [2329] adding initial translations for contact trust levels 2022-07-02 09:38:35 +02:00
FlyingP1g FlyingP1g
ddc6606ccf About menu improvements. 2022-07-01 17:25:14 +03:00
Torsten Grote
1531a24b2d Merge branch '1499-do-not-set-tor-config-during-shutdown' into 'master'
Don't set "DisableNetwork 1" during shutdown

See merge request briar/briar!1684
2022-07-01 13:10:02 +00:00
akwizgran
2298818af5 Don't set "DisableNetwork 1" during shutdown.
This is redundant now that we start from the default config every time.
2022-07-01 12:30:46 +01:00
FlyingP1g FlyingP1g
a19a4f36c6 Update strings.xml 2022-06-30 16:14:10 +00:00
FlyingP1g FlyingP1g
6765de992d Added about menu. 2022-06-30 00:05:29 +03:00
akwizgran
0ae5361281 Merge branch '1777-lifecycle-manager' into 'master'
Allow process to exit if an exception is thrown during shutdown

Closes #1777

See merge request briar/briar!1668
2022-06-29 14:23:16 +00:00
Torsten Grote
d8e26eebbe Merge branch '1499-do-not-apply-redundant-settings' into 'master'
Start from default Tor config every time, don't apply redundant settings

See merge request briar/briar!1681
2022-06-29 13:50:01 +00:00
akwizgran
692e353046 Convert comments to javadocs. 2022-06-29 13:54:30 +01:00
akwizgran
b9ba7aded5 Merge branch 'string-utils-checked-exceptions' into 'master'
Let StringUtils throw FormatException instead of IllegalArgumentException

See merge request briar/briar!1682
2022-06-29 12:21:29 +00:00
Sebastian Kürten
4bca9decc1 Let StringUtils throw FormatException instead of IllegalArgumentException 2022-06-29 14:13:42 +02:00
akwizgran
7bbe9068bb Start from the default Tor config every time.
Don't apply settings to Tor unless they've changed.
2022-06-28 12:42:55 +01:00
akwizgran
63060679a3 Merge branch '2342-mailbox-setup-stuck' into 'master'
Ensure that mailbox setup can proceed after activity was destroyed

Closes #2342

See merge request briar/briar!1678
2022-06-26 13:04:34 +00:00
Torsten Grote
ddb759dbb8 Merge branch 'mailbox-base-url-refactoring' into 'master'
Refactor MailboxProperties to hold raw onion address

See merge request briar/briar!1680
2022-06-23 17:27:17 +00:00
akwizgran
592daf9c20 Bump version numbers for 1.4.9 release. 2022-06-23 14:55:06 +01:00
akwizgran
3922270db1 Merge branch 'update-bridges' into 'master'
Update Tor bridges

See merge request briar/briar!1679
2022-06-23 13:50:12 +00:00
akwizgran
feb8854678 Add @Inject constructor. 2022-06-23 14:22:25 +01:00
Torsten Grote
4ba4e41e69 Merge branch '2294-contact-list-worker' into 'master'
Mailbox worker for updating our own mailbox's contact list

Closes #2294

See merge request briar/briar!1677
2022-06-23 12:19:32 +00:00
akwizgran
1f699238a9 Add some non-default bridges. 2022-06-23 12:23:50 +01:00
akwizgran
b8e91a12e8 Remove some failing bridges. 2022-06-23 12:18:38 +01:00
akwizgran
06eb01ab0a Update translations. 2022-06-23 11:43:26 +01:00
akwizgran
d82509f3ce Address review feedback. 2022-06-23 11:00:13 +01:00
Torsten Grote
b01c306500 Merge branch '2289-client-for-contacts-mailbox' into 'master'
Mailbox client for a contact's mailbox

Closes #2289

See merge request briar/briar!1674
2022-06-22 17:09:37 +00:00
Torsten Grote
61e7635b9f Merge branch 'windows-tor-plugin' into 'master'
Add Tor plugin for Windows

See merge request briar/briar!1666
2022-06-22 17:08:23 +00:00
akwizgran
f2f356cbd4 Merge branch '2340-unlink-offline-crash' into 'master'
Don't crash when offline while unlink dialog gets shown

Closes #2340

See merge request briar/briar!1676
2022-06-22 16:41:26 +00:00
Torsten Grote
28f3ab1310 Dismiss unlink dialog when going offline 2022-06-22 13:25:12 -03:00
Torsten Grote
1af52b21d5 Ensure that mailbox setup can proceed after activity was destroyed 2022-06-22 11:44:07 -03:00
akwizgran
8bb3a83ccb Add tests for contact list worker. 2022-06-22 13:59:50 +01:00
Torsten Grote
a742b007ef Don't crash when offline while unlink dialog gets shown 2022-06-22 08:58:59 -03:00
Torsten Grote
6bfd7bcc4f Merge branch '2338-make-headless-platform-jars-depend-on-jar-task' into 'master'
Make headless platform jars depend on main jar task

Closes #2338

See merge request briar/briar!1675
2022-06-22 11:28:12 +00:00
Sebastian Kürten
17f5fc7518 Make headless platform jars depend on main jar task 2022-06-22 10:30:32 +02:00
akwizgran
8dcf988399 Add contact list worker for own mailbox. 2022-06-20 17:55:21 +01:00
akwizgran
05bf3833cf No need to use @Before to create stateful test objects. 2022-06-20 16:24:55 +01:00
akwizgran
c39c2ce124 Fetch supported API versions during connectivity check. 2022-06-20 13:55:05 +01:00
akwizgran
0b93af5d71 Add some logging. 2022-06-20 13:46:09 +01:00
akwizgran
f8e3579a92 Add tests for ContactMailboxClient. 2022-06-20 13:33:32 +01:00
Torsten Grote
54e434d812 Merge branch '2291-mailbox-upload-worker' into 'master'
Mailbox upload worker

Closes #2291

See merge request briar/briar!1673
2022-06-20 11:39:44 +00:00
akwizgran
13c3974f73 Implement client for a contact's mailbox. 2022-06-20 12:24:21 +01:00
akwizgran
aeb2a370e1 Return safely if destroy() is called before start(). 2022-06-20 12:20:15 +01:00
akwizgran
0aff23a067 Add MailboxWorkerFactory. 2022-06-20 11:31:37 +01:00
akwizgran
a2a2da0260 Make MailboxSettingsManager a singleton, now that it accepts hooks. 2022-06-20 11:23:26 +01:00
akwizgran
4d7a3bca62 Address review feedback. 2022-06-20 10:41:13 +01:00
akwizgran
91d5698fe9 Fix a typo. 2022-06-17 16:36:07 +01:00
akwizgran
7266c6ee6b Create temp file before requesting plugin. 2022-06-17 16:34:21 +01:00
akwizgran
06b539b911 Tests for MailboxUploadWorker. 2022-06-17 16:28:04 +01:00
akwizgran
486ba4a3fc Merge branch '2337-dont-show-offline-screen-after-pairing' into 'master'
Ignore offline event in Paired state (when success screen is shown)

Closes #2337

See merge request briar/briar!1672
2022-06-17 13:16:28 +00:00
Torsten Grote
7f987667fe Merge branch '2336-get-next-send-time' into 'master'
Consider latency when getting next send time from DB

Closes #2336

See merge request briar/briar!1671
2022-06-17 13:14:38 +00:00
Torsten Grote
8d22a0ffaf Merge branch 'do-not-interpolate-app-name' into 'master'
Don't interpolate the app name into strings

See merge request briar/briar!1669
2022-06-17 13:13:04 +00:00
Torsten Grote
43d28608f5 Merge branch '2291-mailbox-upload-plumbing' into 'master'
Plumbing for mailbox upload worker

See merge request briar/briar!1670
2022-06-17 13:07:22 +00:00
Torsten Grote
c84d3f7707 Ignore offline event in Paired state (when success screen is shown) 2022-06-17 10:05:00 -03:00
akwizgran
2843e15905 Add mailbox upload worker. 2022-06-16 18:11:52 +01:00
akwizgran
a2fb388aa6 Add creation of files for upload by MailboxFileManager. 2022-06-16 18:11:52 +01:00
akwizgran
b7b253cf24 Clear reference to API call when download cycle finishes. 2022-06-16 18:11:52 +01:00
akwizgran
f05e9dd746 Fix a couple of test assertions. 2022-06-16 18:11:52 +01:00
johndoe4221
b24a18b231 feat: [2329][1630] remove translation for anonymous trust level 2022-06-16 18:10:21 +02:00
akwizgran
e2a63ee361 Consider latency when getting next send time from DB. 2022-06-16 17:05:30 +01:00
akwizgran
ff9f706670 Add plumbing for creating outgoing sync sessions. 2022-06-16 15:51:16 +01:00
akwizgran
10ab60569b Replace DeferredSendHandler with OutgoingSessionRecord. 2022-06-16 15:51:15 +01:00
akwizgran
d77d1d67aa Include new visibility in GroupVisibilityUpdatedEvent. 2022-06-16 15:51:15 +01:00
akwizgran
924425522a Split containsAnythingToSend() into methods for acks and messages. 2022-06-16 15:51:15 +01:00
akwizgran
356e0ee07b Move MAX_LATENCY to MailboxConstants. 2022-06-16 15:51:15 +01:00
johndoe4221
8e83743dd7 Merge remote-tracking branch 'origin/master' into 2329-translations-for-trust-indicator-view-trust-levels 2022-06-15 12:19:24 +02:00
akwizgran
61658655ff Merge branch '2326-fetch-versions' into 'master'
Use /versions for mailbox connectivity check

Closes #2326

See merge request briar/briar!1665
2022-06-14 12:29:31 +00:00
akwizgran
40086ffde2 Don't interpolate the app name into strings. 2022-06-14 10:30:05 +01:00
Torsten Grote
1551142e98 Merge branch '2157-2158-xiaomi-power-setup' into 'master'
Adapt Xiaomi power setup for MIUI 12.5

Closes #2158 and #2157

See merge request briar/briar!1667
2022-06-13 13:12:50 +00:00
Torsten Grote
1c6fb6491a Use /versions for mailbox connectivity check
Briar's mailbox status screen used the status API endpoint for its connectivity check. Now, it uses the versions endpoint instead, so that if we've warned the user that Briar and the Mailbox are using incompatible API versions, and the user has upgraded one of the apps to fix the issue, the user can use the "check connection" button in the status screen to check that the issue has been fixed.

(This is specifically needed for the case where the user has upgraded the Mailbox, because in the case where the user has upgraded Briar, Briar should automatically check the mailbox's API versions when it comes back online after upgrading.)
2022-06-13 10:07:40 -03:00
akwizgran
cfd4e85e77 Remove package names that are now provided by dont-kill-me-lib. 2022-06-13 13:48:23 +01:00
akwizgran
4d6abfabf7 Adapt Xiaomi power setup for MIUI 12.5. 2022-06-13 11:32:36 +01:00
akwizgran
a38933df66 Read Tor process's stdout until it exits.
On Windows, RunAsDaemon is a no-op so we need to read stdout to find out when Tor has finished starting up, then continue to read and discard stdout until Tor exits.
2022-06-13 11:21:26 +01:00
johndoe4221
6a91d18003 feat: [2329] adding initial translations for contact trust levels 2022-06-09 21:47:50 +02:00
akwizgran
e481a02126 Shutdown from background if BriarService is recreated. 2022-06-09 18:10:24 +01:00
akwizgran
825dff27fc Exit if BriarService finds lifecycle already running. 2022-06-09 18:06:08 +01:00
akwizgran
de3a87fff5 Return early when starting/stopping if not in expected state. 2022-06-09 18:01:32 +01:00
akwizgran
85d1addd04 Continue shutdown if an exception is thrown. 2022-06-09 17:16:02 +01:00
akwizgran
4993873ae2 Add Tor and obfsproxy binaries for Windows. 2022-06-09 15:39:27 +01:00
akwizgran
02b805ce42 Disable GeoIPFile and GeoIPv6File options.
On Windows, Tor falls back to the default paths if these options aren't specified and then refuses to start because the default paths are relative.
2022-06-09 15:39:26 +01:00
akwizgran
1a6ba16a59 Add windowsJar task. 2022-06-09 15:39:26 +01:00
akwizgran
654a05df8a Use Windows Tor plugin in briar-headless. 2022-06-09 15:39:26 +01:00
akwizgran
ffe1876337 Redirect standard error (copied from Nico's branch). 2022-06-09 15:39:26 +01:00
akwizgran
98963955b1 Use default SecureRandomProvider on Windows. 2022-06-09 15:39:26 +01:00
akwizgran
d83efce002 Add WindowsTorPlugin and factory. 2022-06-09 15:39:26 +01:00
Torsten Grote
efb1b8c1ad Merge branch '2292-contact-mailbox-download-worker' into 'master'
Mailbox download worker for a contact's mailbox

Closes #2292

See merge request briar/briar!1658
2022-06-08 16:31:35 +00:00
akwizgran
3f36db8b3a Merge branch 'obfs4-bridges-for-dpi-countries' into 'master'
Use non-default obfs4 bridges alongside meek in countries with advanced firewalls

See merge request briar/briar!1663
2022-06-08 14:13:43 +00:00
akwizgran
a2f4e70a48 Remove a failing bridge. 2022-06-08 14:44:05 +01:00
akwizgran
01e72eff40 Always remove observers in destroy(). 2022-06-08 13:56:46 +01:00
Torsten Grote
dbcea3e1d1 Merge branch '1898-memory-stats' into 'master'
Pass memory stats from main process to crash reporter process

See merge request briar/briar!1662
2022-06-08 11:30:09 +00:00
akwizgran
6288577daa Add javadoc explaining worker's lifecycle. 2022-06-08 12:13:07 +01:00
akwizgran
5d363496bd Download files in the order the mailbox returns them. 2022-06-08 12:03:11 +01:00
akwizgran
75b5c92495 Pass memory stats from main process to crash reporter process. 2022-06-08 11:49:56 +01:00
Torsten Grote
bcc98cc4c9 Merge branch 'remove-bridge-test-from-release-pipeline' into 'master'
Remove BridgeTest from release pipeline

See merge request briar/briar!1661
2022-06-07 11:57:07 +00:00
Torsten Grote
2d605089bc Merge branch 'skip-hypersql-tests-if-crypto-strength-is-limited' into 'master'
Skip HyperSQL tests if the test environment has crypto restrictions

See merge request briar/briar!1660
2022-06-07 11:56:04 +00:00
Torsten Grote
01f8be1b66 Merge branch 'return-early-if-services-are-stopped-twice' into 'master'
Return early if LifecycleManager#stopServices() is called twice

See merge request briar/briar!1659
2022-06-07 11:55:07 +00:00
akwizgran
eac6d0aa40 Remove BridgeTest from release pipeline. 2022-06-07 12:46:03 +01:00
akwizgran
713be403eb Add some more non-default and vanilla bridges. 2022-06-07 12:18:59 +01:00
akwizgran
2fd948b81d Use non-default obfs4 bridges in countries that use DPI. 2022-06-07 12:18:24 +01:00
akwizgran
62af5e858c Merge branch 'Feedback_fix' into 'master'
Removed word limit on feedback.

See merge request briar/briar!1657
2022-06-07 10:59:45 +00:00
akwizgran
2201585a34 Skip HyperSQL tests if the test environment has crypto restrictions. 2022-06-07 11:11:41 +01:00
akwizgran
97d11cc602 Add tests for download worker. 2022-06-07 10:43:29 +01:00
akwizgran
79f41064e4 Add download worker for a contact's mailbox. 2022-06-07 10:43:29 +01:00
akwizgran
9aacd9d3d8 Allow observers to be removed. 2022-06-07 10:39:35 +01:00
FlyingP1g FlyingP1g
78f4dee43d Removed word limit on feedback. 2022-06-06 21:15:46 +03:00
akwizgran
2b4a1cf54b Refactor SimpleApiCall to support lambdas. 2022-06-06 17:40:19 +01:00
akwizgran
bb71de1a78 Merge branch '2319-mailbox-version-warning' into 'master'
Show warning if own mailbox's API version is incompatible

Closes #2319

See merge request briar/briar!1651
2022-06-06 16:23:15 +00:00
Torsten Grote
08bf13e44f Move check for common mailbox versions into a helper method
and use this in the UI for knowing which app needs to be updated.
2022-06-06 11:04:55 -03:00
Torsten Grote
cc7de2c70a Show warning if own mailbox's API version is incompatible 2022-06-06 11:00:05 -03:00
Torsten Grote
0f4aa8027a Include mailbox server versions in MailboxStatus
so we know if the mailbox is incompatible with Briar
2022-06-06 11:00:04 -03:00
Torsten Grote
b161a5e115 Merge branch '2292-mailbox-file-manager' into 'master'
Add mailbox plugin and file manager for downloads

See merge request briar/briar!1655
2022-06-06 11:51:22 +00:00
akwizgran
e112f69c4e Split onError() into two methods. 2022-06-04 13:00:05 +01:00
Torsten Grote
4623d03c93 Merge branch '2292-tor-reachability-monitor' into 'master'
Tor reachability monitor

See merge request briar/briar!1654
2022-06-03 17:08:14 +00:00
akwizgran
b128220be3 Add MailboxFileManager for downloads (uploads to be added later). 2022-06-03 17:55:19 +01:00
akwizgran
6aa24af94c Add ConnectionManager method for incoming mailbox connections. 2022-06-03 17:13:20 +01:00
akwizgran
de63a50662 Add mailbox plugin. 2022-06-03 17:13:20 +01:00
akwizgran
5517ac14ed Address review feedback. 2022-06-03 17:09:51 +01:00
akwizgran
2672d82a40 Add unit tests for TorReachabilityMonitorImpl. 2022-06-01 16:29:30 +01:00
akwizgran
63c0210047 Add Tor reachability monitor. 2022-05-31 16:24:59 +01:00
akwizgran
6e61827fe6 Bump version numbers for 1.4.8 release. 2022-05-31 15:58:44 +01:00
akwizgran
2be93f6a49 Update translations. 2022-05-31 15:44:42 +01:00
Torsten Grote
5eb994d3e8 Merge branch 'update-tor-bridges' into 'master'
Update tor bridges

See merge request briar/briar!1653
2022-05-31 13:53:28 +00:00
akwizgran
f0c9819332 Update tor bridges 2022-05-31 13:53:27 +00:00
Torsten Grote
971dbf5df2 Merge branch '2229-mailbox-client' into 'master'
Add connectivity check tasks, refactor mailbox properties

See merge request briar/briar!1650
2022-05-31 12:45:27 +00:00
Torsten Grote
43a83df342 Merge branch '1499-tor-not-running' into 'master'
Crash as soon as we notice that Tor has stopped running

See merge request briar/briar!1652
2022-05-31 11:14:06 +00:00
akwizgran
0092f38bab Fix missing space in log message. 2022-05-31 11:46:09 +01:00
akwizgran
285a5f2928 Rethrow TorNotRunningException to get a crash report. 2022-05-31 11:46:09 +01:00
akwizgran
804049209d Upgrade jtorctl to 0.4. 2022-05-31 11:46:09 +01:00
akwizgran
2b1aed6caa Update test expectations. 2022-05-27 17:38:06 +01:00
akwizgran
44b0955b9d Allow status endpoint to be called with contact properties. 2022-05-27 17:26:55 +01:00
akwizgran
d43ef463a6 Check status endpoint with contact's auth token in integration test. 2022-05-27 13:01:26 +01:00
akwizgran
34337486e9 Use status endpoint for contact connectivity check. 2022-05-27 13:00:43 +01:00
akwizgran
3ebbb2a8cf Merge branch '2175-mailbox-problem-notification' into 'master'
Show notification warning when own mailbox is unreachable

Closes #2175

See merge request briar/briar!1648
2022-05-26 20:10:13 +00:00
Torsten Grote
54339afab8 Factor mailbox problem detection into MailboxStatus and constants 2022-05-26 14:07:06 -03:00
Torsten Grote
6c19b22aab Show notification warning when own mailbox is unreachable 2022-05-26 14:07:06 -03:00
akwizgran
6b790b59fa Use status endpoint for connectivity check. 2022-05-26 15:11:05 +01:00
akwizgran
8b61a0279b Move nested try block into private method. 2022-05-26 14:54:44 +01:00
akwizgran
94ce6bbb2c Reject mailbox owner properties for mailbox update. 2022-05-26 14:49:33 +01:00
akwizgran
845d505d2b Merge branch '2320-mailbox-metadata-format-exception' into 'master'
Bump major version of mailbox update client to avoid startup failure

Closes #2320

See merge request briar/briar!1647
2022-05-26 12:45:55 +00:00
akwizgran
6358518f88 Add connectivity checkers for our own mailbox and a contact's mailbox. 2022-05-26 13:40:31 +01:00
akwizgran
ef6e3bb2a7 Refactor MailboxProperties and MailboxUpdateWithMailbox. 2022-05-26 13:40:31 +01:00
akwizgran
8ec998f645 Replace Supplier<Boolean> with more legible ApiCall interface. 2022-05-26 13:40:31 +01:00
akwizgran
f75d63fc46 Merge branch '2234-mailbox-api-task' into 'master'
Abstract task for calling an API endpoint

Closes #2234

See merge request briar/briar!1649
2022-05-26 12:27:14 +00:00
akwizgran
0c22c25995 Submit first try to IoExecutor directly. 2022-05-25 12:45:23 +01:00
akwizgran
7e249ecf70 Add convenience class for simple API calls. 2022-05-24 15:10:07 +01:00
akwizgran
274963d9d1 Add MailboxApiCaller for calling API endpoints with retries. 2022-05-24 15:10:07 +01:00
akwizgran
18b3865a86 Factor out Cancellable interface from TaskScheduler. 2022-05-24 15:10:07 +01:00
akwizgran
f08688708a Bump client major version to ensure group metadata gets created. 2022-05-23 16:12:23 +01:00
akwizgran
c37f6069c7 Use feature flag to enable mailbox sync client. 2022-05-23 16:11:27 +01:00
Torsten Grote
c8caae49f1 Broadcast MailboxProblemEvent in case of mailbox problems
Also move other mailbox related events into the events package
2022-05-23 12:00:42 -03:00
Torsten Grote
670cc34b12 Merge branch 'tor-state-enabling-when-zero-onion-router-connections' into 'master'
Fix OR connection counts, set Tor status to ENABLING when not connected to any ORs

See merge request briar/briar!1646
2022-05-20 16:54:34 +00:00
akwizgran
f387c3801b Don't count pending OR connections, don't reset connection count.
Tor doesn't report status changes for bridge connections that fail during handshaking, which causes the pending connection count to become inaccurate.

We were resetting the connection counts when switching guard context, but this was a mistake caused by the pending connection count being inaccurate. The counts should not be reset, as Tor continues to report status changes for connected connections belonging to the old context.

It's no longer necessary to disable and re-enable the network when the Tor settings are updated. This only appeared to be necessary because we were wrongly resetting the connection counts.
2022-05-20 17:20:34 +01:00
Torsten Grote
aa759a636e Merge branch 'limit-connection-pool-size' into 'master'
Keep one connection in the DB pool

See merge request briar/briar!1644
2022-05-20 14:23:47 +00:00
akwizgran
0b85aca932 Remove connectivity workaround that should no longer be needed. 2022-05-20 14:48:00 +01:00
akwizgran
d4cdedeed7 Set status to ENABLING when not connected to any guards/bridges. 2022-05-20 14:48:00 +01:00
Torsten Grote
9b10c12f23 Merge branch 'refactor-tor-plugin-factories' into 'master'
Refactor Tor plugin factories

See merge request briar/briar!1645
2022-05-20 11:55:23 +00:00
akwizgran
2bf490b973 Use non-default Tor ports for BridgeTest. 2022-05-19 14:12:36 +01:00
akwizgran
d2f25f2ebe Refactor Tor plugin factories. 2022-05-19 14:12:36 +01:00
akwizgran
b3dcde9187 Merge branch '2301-update-contacts-about-change-in-mailbox-versions-that-client-supports' into 'master'
Send mailbox update to contacts if supported mailbox versions changed

Closes #2301

See merge request briar/briar!1642
2022-05-19 12:17:39 +00:00
Daniel Lublin
241e5e9f6e Test for update sent when clientSupports is found to have changed on startup 2022-05-19 09:35:46 +02:00
Daniel Lublin
c59524df65 Make current tests independent of real CLIENT_SUPPORTS 2022-05-19 09:06:40 +02:00
Daniel Lublin
4467f9e260 Keep last sent clientSupports on record, sending update only if changed 2022-05-19 09:06:40 +02:00
Daniel Lublin
7e215e7f84 Keep MailboxUpdate immutable 2022-05-19 09:06:40 +02:00
Daniel Lublin
601ff50294 Send mailbox update to contacts if supported mailbox versions changed 2022-05-19 09:06:40 +02:00
akwizgran
9f839d9d12 Merge branch '2309-troubleshooting-wizard' into 'master'
Troubleshooting wizard for mailbox

Closes #2309

See merge request briar/briar!1640
2022-05-18 17:00:50 +00:00
akwizgran
1e4c28a30a Merge branch '2299-method-for-fetching-mailboxs-supported-api-versions' into 'master'
Add method for fetching api versions that the mailbox supports

Closes #2299

See merge request briar/briar!1643
2022-05-18 12:18:48 +00:00
Daniel Lublin
bc0f9a984c Add method for fetching api versions that the mailbox supports 2022-05-17 14:49:00 +02:00
Torsten Grote
15e0abffb0 Address review feedback for mailbox troubleshooting wizard 2022-05-16 11:44:23 -03:00
Torsten Grote
5254efb630 Troubleshooting wizard for mailbox 2022-05-16 10:56:58 -03:00
Torsten Grote
df22df22a0 Merge branch '2277-activity-not-found-exception' into 'master'
Catch ActivityNotFoundException when choosing files

Closes #2277

See merge request briar/briar!1628
2022-05-16 12:52:23 +00:00
Torsten Grote
23681ff7f7 Merge branch 'emoji-0.7.0' into 'master'
Upgrade emoji library to 0.7.0

Closes #1775

See merge request briar/briar!1630
2022-05-16 12:35:23 +00:00
Torsten Grote
57bebc0b87 Merge branch '2261-extra-logging' into 'master'
Add logging for message delivery, comments for initial messages exchanged in tests

See merge request briar/briar!1641
2022-05-16 11:18:02 +00:00
akwizgran
82057da962 Sync acks when re-adding contacts. 2022-05-16 11:05:14 +01:00
akwizgran
00b7518e49 Add comments to explain initial messages exchanged with contacts. 2022-05-16 11:05:10 +01:00
akwizgran
418ab99a3c Log client IDs when validating and delivering messages. 2022-05-16 11:04:25 +01:00
akwizgran
49c14af0dc Merge branch '2261-include-mailbox-api-version-in-mailbox-properties' into 'master'
Include mailbox API version in local and remote mailbox properties

Closes #2261

See merge request briar/briar!1621
2022-05-16 09:58:30 +00:00
Daniel Lublin
3f7aed7886 Rename to Mailbox update 2022-05-16 10:21:41 +02:00
Daniel Lublin
d2728dd29b Assert that we have a local update 2022-05-16 10:07:35 +02:00
Daniel Lublin
84afc6d934 Let integration tests mind the mailbox prop update when adding contact 2022-05-13 16:19:51 +02:00
Daniel Lublin
a42d9eec1c Include mailbox API version in local and remote mailbox properties
This changes the format of the mailbox properties update message, so
the major version of the client is bumped.
2022-05-13 16:19:51 +02:00
akwizgran
5d5d8d206c Merge branch '2298-fetch-and-store-mailboxs-supported-api-versions-when-pairing' into 'master'
Fetch and store mailbox's supported API versions when pairing mailbox

Closes #2298

See merge request briar/briar!1622
2022-05-12 14:12:40 +00:00
akwizgran
5237df32e3 Merge branch '2226-defer-marking-messages-and-acks-as-sent' into 'master'
Defer marking messages and acks as sent

Closes #2296

See merge request briar/briar!1635
2022-05-12 13:59:17 +00:00
akwizgran
72e376f152 Merge branch 'db-shutdown-race' into 'master'
Fix race condition in DB shutdown

See merge request briar/briar!1620
2022-05-12 13:57:45 +00:00
Daniel Lublin
4d685a2617 Fetch and store mailbox's supported api versions when pairing 2022-05-09 14:17:30 +02:00
Daniel Lublin
16ab48d009 Allow storing int array in settings 2022-05-01 08:23:27 +02:00
akwizgran
095bebf524 Merge branch 'use-do-not-kill-lib' into 'master'
Use do-not-kill-me-lib

See merge request briar/briar!1636
2022-04-29 14:49:42 +00:00
Torsten Grote
b67d9935c7 Update do-not-kill-lib to 0.2.2 2022-04-29 07:49:06 -03:00
akwizgran
34aea945cb Merge branch '2311-remind-to-wipe' into 'master'
Remind user to wipe mailbox if it's unreachable when unpairing

Closes #2311

See merge request briar/briar!1639
2022-04-27 17:00:12 +00:00
akwizgran
a82666b8bd Merge branch '2173-unlink-mailbox' into 'master'
Implement UI for unpairing the mailbox

Closes #2173

See merge request briar/briar!1637
2022-04-27 16:47:46 +00:00
akwizgran
e614046662 Use longs to represent session capacity. 2022-04-27 17:45:11 +01:00
akwizgran
0691354952 Defer marking messages and acks as sent. 2022-04-27 17:45:11 +01:00
Torsten Grote
aa997a9c64 Tweak mailbox wipe reminder string 2022-04-27 13:41:58 -03:00
Torsten Grote
f05cbac20a Use a new WasUnpaired state that shows a dialog over a blank fragment 2022-04-27 12:14:26 -03:00
Torsten Grote
39c74f1363 Annotate MailboxApi with @NotNullByDefault 2022-04-27 11:57:39 -03:00
Torsten Grote
2411c82d9c Remind user to wipe mailbox if it's unreachable when unpairing
If we fail to tell the mailbox to wipe itself when unpairing, remind the user that they should wipe the mailbox next time they have access to it.
2022-04-27 10:44:27 -03:00
Torsten Grote
f43839dbb3 Upgrade translations for dont-kill-me lib 2022-04-27 10:40:03 -03:00
Torsten Grote
3138213f39 Let MailboxManager#unPair() return a boolean for whether it could wipe the mailbox 2022-04-27 08:38:43 -03:00
Torsten Grote
d080af4b7a Show a warning before unlinking the mailbox when there haven't been any connection failures 2022-04-27 08:07:12 -03:00
Torsten Grote
9d19761dbe Tweak mailbox unlink dialog warning 2022-04-27 07:56:30 -03:00
Torsten Grote
fa3a5be083 Implement UI for unpairing the mailbox 2022-04-26 15:18:29 -03:00
Torsten Grote
fa3db0f888 Add method for unpairing to MailboxManager 2022-04-26 15:18:29 -03:00
akwizgran
4b7ee62190 Merge branch 'invite-button-change' into 'master'
Moved invite buttons in groups and forums to overflow menu.

See merge request briar/briar!1638
2022-04-26 11:51:50 +00:00
FlyingP1g FlyingP1g
9d3c33fdbc Moved invite buttons in groups and forums to overflow menu. 2022-04-23 22:48:01 +03:00
Torsten Grote
37d4ca84f7 Adapt tests to do-not-kill lib as well 2022-04-20 13:56:37 -03:00
Torsten Grote
1b58d986ae Use dependency from maven central as it produces a different integrity assertion than maven local 2022-04-20 13:56:37 -03:00
Torsten Grote
784c7416ec Use do-not-kill-me-lib 2022-04-20 13:56:34 -03:00
akwizgran
7536f16c61 Bump version numbers for 1.4.7 release. 2022-04-20 16:35:07 +01:00
akwizgran
ab628c1921 Update translations. 2022-04-20 16:14:58 +01:00
akwizgran
85e53479f2 Merge branch '2172-mailbox-status-ui' into 'master'
Improve MailboxStatusFragment and record check failures as well

Closes #2172

See merge request briar/briar!1632
2022-04-20 15:04:31 +00:00
akwizgran
116ee97056 Merge branch '1980-catch-security-exceptions-from-connectivity-manager' into 'master'
Catch SecurityExceptions from all ConnectivityManager calls

Closes #1980

See merge request briar/briar!1634
2022-04-20 14:51:57 +00:00
Torsten Grote
78938f1ac6 Merge branch '2280-check-lifecycle-before-recreating-removable-drive-tasks' into 'master'
Check lifecycle state before recreating removable drive tasks

Closes #2280

See merge request briar/briar!1629
2022-04-20 13:37:24 +00:00
akwizgran
afff66eaff Don't assume that non-null WifiInfo means we're connected to wifi. 2022-04-20 12:42:35 +01:00
akwizgran
8c33ea5a6b Add javadocs for database. 2022-04-19 13:04:35 +01:00
akwizgran
96228c1fd0 Do all of SimplexOutgoingSession's work on the IoExecutor. 2022-04-19 13:04:35 +01:00
akwizgran
eb6a5fe63e Try GET_CONTENT first, fall back to OPEN_DOCUMENT. 2022-04-19 12:57:58 +01:00
akwizgran
a8624cd507 Guess connectivity when ConnectivityManager is broken. 2022-04-19 11:27:40 +01:00
akwizgran
e7fc37d81e Catch SecurityExceptions from all ConnectivityManager calls.
This issue occurs on Android 11 and no fix is expected. When the issue occurs, Tor connectivity and outgoing LAN connectivity will be broken until the app is restarted.
2022-04-19 11:03:08 +01:00
Torsten Grote
7bd220f18d Merge branch 'clear-glide-cache-under-more-circumstances' into 'master'
Clear the Glide cache in response to a wider range of warnings

See merge request briar/briar!1633
2022-04-18 16:46:31 +00:00
akwizgran
7f581fee15 Merge branch 'master' into '2277-activity-not-found-exception'
# Conflicts:
#   briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageActivity.java
2022-04-18 16:18:14 +00:00
akwizgran
383056d37e Fix the lint problems I created for myself. 2022-04-18 15:57:18 +01:00
akwizgran
23316f5e9c Don't use OPEN_DOCUMENT launchers on API < 19. 2022-04-18 15:42:24 +01:00
Torsten Grote
dea05c85a2 Improve MailboxStatusFragment and record check failures as well 2022-04-18 10:16:38 -03:00
akwizgran
b36066514b Add SDK_INT check to appease the linter. 2022-04-18 14:02:25 +01:00
akwizgran
f9403782a2 When opening files, try OPEN_DOCUMENT and fall back to GET_CONTENT. 2022-04-18 14:02:03 +01:00
Torsten Grote
174ca3cfb8 Merge branch '2214-catch-activity-not-found-exception-when-saving-image' into 'master'
Catch ActivityNotFoundException when saving image

Closes #2214

See merge request briar/briar!1627
2022-04-18 12:44:20 +00:00
akwizgran
961af66c8e Use new onSaveImageError() method for readability. 2022-04-18 13:33:09 +01:00
Torsten Grote
a86ea454d0 Merge branch '2143-rethrow-security-exceptions-when-opening-images' into 'master'
Rethrow SecurityExceptions when opening images

Closes #2143

See merge request briar/briar!1626
2022-04-18 12:12:20 +00:00
Torsten Grote
a7877bf7ee Merge branch '2273-rethrow-security-exceptions-for-removable-drives' into 'master'
Rethrow SecurityExceptions when opening files on removable drives

Closes #2273

See merge request briar/briar!1625
2022-04-18 12:11:42 +00:00
Torsten Grote
62ae0f745b Merge branch '2306-task-scheduler-zero-delay' into 'master'
Fixe race condition in AndroidTaskScheduler

Closes #2306

See merge request briar/briar!1624
2022-04-18 11:57:34 +00:00
Torsten Grote
f83abbe63d Merge branch '2305-increase-tor-connection-timeout' into 'master'
Increase Tor connection timeout to 2 minutes

Closes #2305

See merge request briar/briar!1623
2022-04-18 11:53:57 +00:00
Torsten Grote
e0b6b8435d Merge branch 'update-introduction-onboarding-text' into 'master'
Update introduction onboarding text

See merge request briar/briar!1631
2022-04-18 11:49:41 +00:00
akwizgran
d3c7832245 Update introduction onboarding text.
The old text caused some confusion in user testing because contacts can now add each other remotely.
2022-04-18 11:34:22 +01:00
akwizgran
cc4978c2b1 Upgrade emoji library to 0.7.0. 2022-04-18 10:45:49 +01:00
akwizgran
a043e8b1cf Check lifecycle state before recreating removable drive tasks. 2022-04-17 12:28:26 +01:00
akwizgran
97ba18cfb2 Catch ActivityNotFoundException when choosing files. 2022-04-17 12:12:02 +01:00
akwizgran
bc013296f6 Catch ActivityNotFoundException when saving image. 2022-04-17 11:59:00 +01:00
akwizgran
c1fabcd46b Rethrow SecurityExceptions when opening images. 2022-04-17 11:51:49 +01:00
akwizgran
3c08e86822 Rethrow SecurityExceptions when opening files on removable drives. 2022-04-17 11:36:16 +01:00
akwizgran
de2c9670d5 Clear the Glide cache in response to a wider range of warnings. 2022-04-17 10:50:59 +01:00
akwizgran
9632754274 Ensure task is added to queue before queue is checked. 2022-04-16 19:32:51 +01:00
akwizgran
b275a0ffff Increase Tor connection timeout to 2 minutes. 2022-04-16 16:07:03 +01:00
akwizgran
74a3f54d28 Merge branch '2172-mailbox-status-ui' into 'master'
Implement status UI for mailbox connection

Closes #2172

See merge request briar/briar!1617
2022-04-14 12:46:28 +00:00
Torsten Grote
edcb234b93 Show OfflineFragment when TorPlugin becomes inactive in mailbox flow 2022-04-12 10:10:09 -03:00
Torsten Grote
dae00c7e4e Show different mailbox status in UI
and show failure status after unsuccessful attempt
2022-04-12 10:01:43 -03:00
Torsten Grote
29b16c4d74 Re-use OfflineFragment when offline in mailbox status screen 2022-04-12 09:35:39 -03:00
akwizgran
edd270abf3 Keep one connection in the DB pool.
For H2, this ensures we're not constantly closing and reopening the DB.
2022-04-08 16:06:35 +01:00
akwizgran
47d412dd0a Limit the size of the DB connection pool. 2022-04-08 15:50:49 +01:00
akwizgran
5d952ff68e Don't return connections to the pool if they've thrown exceptions. 2022-04-08 15:49:43 +01:00
akwizgran
9304a6b266 Continue with closing connections if an exception is thrown. 2022-04-08 15:37:02 +01:00
akwizgran
a99ec5ed51 Fix a race condition when starting a transaction during shutdown. 2022-04-08 15:28:13 +01:00
Torsten Grote
40d58a9359 Prevent memory leak and crash when refreshing MailboxStatusFragment 2022-04-07 11:00:41 -03:00
Torsten Grote
60a1a4d2d1 Make MailboxManager#checkConnection() blocking and let the UI manage the executor 2022-04-07 10:44:24 -03:00
Torsten Grote
238aeb3abd Merge branch 'extend-timeout-for-pre-release-tests' into 'master'
Extend timeout for pre-release tests

See merge request briar/briar!1618
2022-04-04 11:13:50 +00:00
akwizgran
62c16fad09 Merge branch '2191-reset-retransmission-times-when-contacts-mailbox-props-change' into 'master'
Reset retransmission times when contact's mailbox props change

Closes #2191

See merge request briar/briar!1619
2022-04-04 10:19:02 +00:00
Daniel Lublin
68e57bda0d Reset retransmission times when contact's mailbox props change 2022-04-04 12:01:19 +02:00
akwizgran
0df73dbf0a Extend timeout for pre-release tests. 2022-04-02 08:16:34 +01:00
Torsten Grote
5b648cbd35 Add connection check button to Mailbox status UI
and update the last connection timestamp accordingly
2022-04-01 13:55:11 -03:00
Torsten Grote
5e7891d78a Add checkConnection() to MailboxManager 2022-04-01 13:55:11 -03:00
akwizgran
d5e17c8201 Bump version numbers for 1.4.6 release. 2022-04-01 17:05:12 +01:00
Torsten Grote
d572ae71e7 Merge branch 'more-non-default-bridges' into 'master'
Vanilla bridges

See merge request briar/briar!1611
2022-04-01 16:02:58 +00:00
akwizgran
2e9d9dac84 Update translations. 2022-04-01 16:45:59 +01:00
akwizgran
573817c4c9 Map el to el-GR for Play Store metadata. 2022-04-01 16:44:07 +01:00
Torsten Grote
4f00f39d3f Merge branch 'initialise-mailbox-eager-singletons' into 'master'
Initialise mailbox eager singletons at startup

See merge request briar/briar!1616
2022-04-01 15:30:47 +00:00
akwizgran
c7d3628ecb Update Play Store metadata. 2022-04-01 16:22:46 +01:00
akwizgran
b198bef5f8 Initialise mailbox eager singletons at startup. 2022-04-01 16:02:12 +01:00
Torsten Grote
cff94009a1 Merge branch 'tor-0.4.5' into 'master'
Upgrade to Tor 0.4.5.12-1 and obfs4proxy 0.0.12

See merge request briar/briar!1608
2022-04-01 14:00:50 +00:00
Torsten Grote
44f9f0bbc5 Merge branch 'more-tor-events' into 'master'
Log more Tor events and react to CIRCUIT_NOT_ESTABLISHED

See merge request briar/briar!1605
2022-04-01 13:22:09 +00:00
akwizgran
5fdb43ce9b Merge branch '2192-reset-retransmission-times-when-pairing-mailbox' into 'master'
Reset retransmission times when pairing (new) mailbox

Closes #2192

See merge request briar/briar!1615
2022-04-01 13:08:47 +00:00
Daniel Lublin
725d11d960 Extend test 2022-04-01 14:56:05 +02:00
Daniel Lublin
7cf2c2faa7 Reset retransmission times when pairing (new) mailbox 2022-04-01 14:56:05 +02:00
akwizgran
4b3c26feb6 Merge branch 'fix_openOutputStream' into 'master'
Fix usage of ContentResolver.openOutputStream()

See merge request briar/briar!1607
2022-04-01 12:36:50 +00:00
akwizgran
2fbeb29195 Merge branch 'simplify-and-get-rid-of-contactmanager' into 'master'
Simplify and get rid of injected contactmanager

See merge request briar/briar!1614
2022-04-01 11:18:43 +00:00
akwizgran
5892fba237 Merge branch '2267-broadcast-event-when-recording-own-mailbox-connection-status' into 'master'
Broadcast event when recording connection status of own mailbox

Closes #2267

See merge request briar/briar!1613
2022-04-01 11:17:47 +00:00
akwizgran
cc9f04980a Merge branch 'fix-exception-logging' into 'master'
Don't warn about background exceptions unless one was thrown

See merge request briar/briar!1610
2022-04-01 11:15:33 +00:00
Daniel Lublin
44fb2a5c59 Use db directly, get rid of injected ContactManager 2022-04-01 10:31:52 +02:00
Daniel Lublin
68e534348f Broadcast event when recording connection status of own mailbox 2022-04-01 09:14:50 +02:00
akwizgran
795a8f1e70 Upgrade Tor to 0.4.5.12-2. 2022-03-31 14:20:17 +01:00
akwizgran
bf968b227e Merge branch '2295-broadcast-event-on-contact-mailbox-props-update' into 'master'
Broadcast event when a contact's Mailbox properties are updated

Closes #2295

See merge request briar/briar!1612
2022-03-31 09:24:00 +00:00
Daniel Lublin
8b94dad01f Broadcast event when a contact's Mailbox properties are updated 2022-03-31 09:20:19 +02:00
akwizgran
fa0610fff1 Use vanilla bridges in parallel with obfs4 bridges. 2022-03-30 18:01:28 +01:00
Torsten Grote
1d94db8d60 Merge branch 'compact-db-at-shutdown' into 'master'
Always compact the DB at shutdown

See merge request briar/briar!1609
2022-03-30 16:29:29 +00:00
akwizgran
1d4f450960 Update translations. 2022-03-30 17:03:29 +01:00
akwizgran
7f6b31d36c Don't warn about background exceptions unless one was thrown. 2022-03-30 16:54:11 +01:00
akwizgran
05737d858d Increase number of unreachable bridges allowed. 2022-03-30 14:30:44 +01:00
akwizgran
2c8e2ab6b8 Remove two unreliable non-default bridges. 2022-03-30 14:29:55 +01:00
akwizgran
97f64fb31c Remove the max compaction interval.
We always compact on shutdown, or on startup if we've shut down uncleanly without compacting.
2022-03-30 13:32:45 +01:00
akwizgran
e66152e812 Compact the DB at shutdown, and at startup if not closed cleanly. 2022-03-30 13:32:39 +01:00
akwizgran
101ffa2f08 Merge branch '2181-implement-sync-client-for-mailbox-props' into 'master'
Implement sync client for mailbox properties

Closes #2181

See merge request briar/briar!1591
2022-03-30 12:29:15 +00:00
Daniel Lublin
13eebe393a Rename, clarifying this is not an address; it has no scheme, no .onion 2022-03-30 13:32:28 +02:00
Daniel Lublin
5bc5791ddb Implement the Mailbox property client 2022-03-30 13:32:28 +02:00
akwizgran
a35e9af1de Add method for generating a unique ID, remove equals() methods. 2022-03-30 13:23:59 +02:00
akwizgran
ade89c14c4 Update translations. 2022-03-30 11:28:58 +01:00
akwizgran
16cfb89310 Add more non-default bridges. 2022-03-29 16:47:33 +01:00
akwizgran
78f00863dd Upgrade to obfs4proxy 0.0.12. 2022-03-29 16:39:07 +01:00
akwizgran
bd50a109cd Keep empty directory for unpacking Tor binaries. 2022-03-29 16:19:47 +01:00
akwizgran
38c91aea32 Upgrade Tor to 0.4.5.12-1. 2022-03-29 15:49:40 +01:00
akwizgran
92517ae7c0 Merge branch '2265-replace-eta-with-maxlatency-retransmission-logic' into 'master'
Replace ETA with max latency in retransmission logic

Closes #2265

See merge request briar/briar!1606
2022-03-29 13:12:38 +00:00
Daniel Lublin
dd1c8c8301 Replace ETA with max latency in retransmission logic 2022-03-29 14:57:03 +02:00
Torsten Grote
edc1029e92 Merge branch '2270-huawei-power-management-crash' into 'master'
Catch exception in Huawei power management setup

Closes #2270

See merge request briar/briar!1602
2022-03-29 12:54:16 +00:00
akwizgran
27e9338a12 Merge branch 'exceptions-on-thread-in-bramble-testcases' into 'master'
Exceptions on thread in bramble testcases

See merge request briar/briar!1584
2022-03-29 10:59:25 +00:00
Sebastian Kürten
243df3096a Add logging message when BrambleTestCase detects background thread exception 2022-03-29 09:30:51 +02:00
cketti
50f9718037 Truncate existing file when writing to removable drive 2022-03-29 01:27:01 +02:00
cketti
88c8bd32a5 Truncate existing file when saving image 2022-03-29 01:22:46 +02:00
akwizgran
3e597ceff8 Use a constructor that Animal Sniffer knows about. 2022-03-28 15:09:26 +01:00
akwizgran
3d6972fd73 Fix race condition in IntroductionIntegrationTest. 2022-03-28 14:59:43 +01:00
akwizgran
288f3331ec Include background exception in test failure report. 2022-03-28 14:59:01 +01:00
akwizgran
a14ee55f12 Update translations. 2022-03-21 14:19:02 +00:00
akwizgran
2a85907565 Update translations. 2022-03-21 14:16:34 +00:00
Torsten Grote
1fe7b2f451 Merge branch 'transifex-migration' into 'master'
Migrate to Transifex Go client

See merge request briar/briar!1603
2022-03-21 12:23:01 +00:00
akwizgran
585ceb626b Merge branch 'update-bridge-config' into 'master'
Update circumvention config

See merge request briar/briar!1604
2022-03-15 12:52:22 +00:00
akwizgran
5da782cf18 Turkmenistan needs non-default bridges. 2022-03-15 12:07:59 +00:00
akwizgran
ec6b999d30 Belarus needs non-default bridges. 2022-03-15 12:06:34 +00:00
akwizgran
d8a925a94f Remove Syria and Turkey from list of countries blocking Tor.
https://explorer.ooni.org/chart/circumvention?since=2021-12-13&until=2022-03-13&probe_cc=BY%2CCN%2CEG%2CIR%2CRU%2CSY%2CTR%2CVE
2022-03-15 12:06:34 +00:00
akwizgran
3de4386e63 Log the scrubbed onion address when an HS descriptor is uploaded.
This allows us to distinguish between descriptors for our permanent hidden service and rendezvous hidden services.
2022-03-15 12:04:22 +00:00
akwizgran
8c60787866 Fix inverted logic. 2022-03-15 12:04:22 +00:00
akwizgran
fa8ca8e6cf Log more Tor events and react to CIRCUIT_NOT_ESTABLISHED.
In future we should also react to CLOCK_SKEW and maybe CLOCK_JUMPED.
2022-03-15 12:04:22 +00:00
akwizgran
07814d43de Restore comment to Transifex config. 2022-03-15 11:57:30 +00:00
akwizgran
d80ba0f556 Migrate to Transifex Go client. 2022-03-15 10:35:35 +00:00
akwizgran
d70e1ed32e Merge branch 'make-bridge-test-more-robust' into 'master'
Make bridge test more robust

See merge request briar/briar!1601
2022-03-10 17:15:29 +00:00
akwizgran
eec2c87797 Catch exception in Huawei power management setup. 2022-03-10 12:40:32 +00:00
akwizgran
a256027916 Tolerate up to 4 unreachable bridges per run. 2022-03-10 10:03:06 +00:00
akwizgran
bf0f99277a Remove four consistently failing bridges. 2022-03-10 10:02:00 +00:00
akwizgran
2d62deb2db Increase CI timeout for BridgeTest. 2022-03-09 12:57:20 +00:00
akwizgran
e3682bb331 Make more attempts per bridge to try to get stable results. 2022-03-09 12:54:34 +00:00
akwizgran
6805040ac4 Make BridgeTest more robust by trying each bridge three times. 2022-03-08 22:45:39 +00:00
akwizgran
4198e1f22a Add some default bridges from Tor Browser. 2022-03-08 22:44:47 +00:00
akwizgran
ee11d2a28d Merge branch '2269-use-full-camera-preview-when-scanning-qr-codes' into 'master'
Use whole preview image when decoding QR

Closes #2269

See merge request briar/briar!1600
2022-03-08 15:02:25 +00:00
Daniel Lublin
f3718e496c Use whole preview image when decoding QR
When scanning Mailbox QR, the whole preview is visible on screen, so we
should use it. We choose to never crop the preview, because it was
originally a speed optimization which no longer is needed.
2022-03-08 13:32:57 +01:00
Torsten Grote
414c296abd Merge branch '2272-get-network-interfaces-npe' into 'master'
Catch NPE thrown by NetworkInterface.getNetworkInterfaces()

Closes #2272

See merge request briar/briar!1599
2022-03-07 11:39:44 +00:00
akwizgran
79051439c5 Catch NPE thrown by NetworkInterface.getNetworkInterfaces(). 2022-03-05 13:54:48 +00:00
Sebastian Kürten
32b62d3e30 Allow BrambleTestCase to handle background thread exceptions gracefully during after() 2022-03-04 18:00:16 +01:00
Sebastian Kürten
e3f2a30120 Make BrambleTestCase fail if background thread throws an exception 2022-03-04 18:00:15 +01:00
Sebastian Kürten
58a122ee28 Add test that checks exception handling on background threads 2022-03-04 18:00:09 +01:00
akwizgran
f5f7b3eb51 Merge branch 'master' into 'master'
Changed from share icon to plus icon.

See merge request briar/briar!1596
2022-03-02 12:05:58 +00:00
FlyingP1g FlyingP1g
098128c8a8 Changed from share icon to plus icon. 2022-03-02 12:05:57 +00:00
Torsten Grote
27d566df7a Merge branch 'memory-stats' into 'master'
Collect some more memory stats for help with debugging OOM errors

See merge request briar/briar!1595
2022-02-28 14:58:07 +00:00
akwizgran
9469825f4f Collect some more memory stats for help with debugging OOM errors. 2022-02-28 13:58:15 +00:00
Torsten Grote
5ce90422c6 Merge branch 'update-play-store-metadata' into 'master'
Update Play Store metadata

See merge request briar/briar!1593
2022-02-28 12:39:17 +00:00
akwizgran
256662e094 Merge branch 'fix-screenshot-tests' into 'master'
Fix screenshot PromoVideoTest

See merge request briar/briar!1594
2022-02-25 18:09:37 +00:00
Torsten Grote
dc7f1e0c86 Fix screenshot PromoVideoTest
Needs also to upgrade androidTestImplementation dependencies, but this makes normal instrumentation tests fail due to method limit.
So those are not committed.
2022-02-25 14:37:28 -03:00
akwizgran
a54e1d424c Merge branch '2162-mailbox-pairing-ui-end' into 'master'
Implement final parts of UI for pairing Briar with mailbox

Closes #2162

See merge request briar/briar!1590
2022-02-25 14:27:34 +00:00
Torsten Grote
9fa3ee18a4 Capitalize more words and fix duplicate string 2022-02-25 11:17:49 -03:00
akwizgran
4df523aaf8 Bump version numbers for 1.4.5 release. 2022-02-24 16:06:34 +00:00
akwizgran
84be347695 Update Play Store metadata. 2022-02-24 16:00:37 +00:00
akwizgran
6783eae1b1 Update bridges. 2022-02-24 15:32:57 +00:00
akwizgran
fe58bd8f86 Update translations. 2022-02-24 11:11:17 +00:00
Torsten Grote
952ac2c922 Simplify fragment transitions for mailbox pairing UI
Now, trying again always starts before scanning, so the user needs to scan the code again.
2022-02-22 14:43:30 -03:00
Torsten Grote
4390c810d1 Address first round of review feedback for mailbox pairing UI 2022-02-21 14:32:28 -03:00
akwizgran
1a1b26d8f2 Merge branch 'ci-manual-fix' into 'master'
Fix required manual tests

See merge request briar/briar!1588
2022-02-21 12:33:43 +00:00
Torsten Grote
a567301e49 Add a minimal MailboxStatusFragment 2022-02-18 12:57:32 -03:00
Torsten Grote
5e8d5c96fc Implement UI for mailbox pairing error and final states 2022-02-18 12:57:32 -03:00
Torsten Grote
80d804d280 Use new MailboxManager in Android UI 2022-02-18 12:57:32 -03:00
Torsten Grote
7fad299cf0 Add network_security_config so we are allowed to connect to onion addresses
Otherwise trying to connect without TLS will throw an exception.
2022-02-18 12:57:32 -03:00
akwizgran
4e90641059 Merge branch 'onion-address-fix' into 'master'
Fix merge request race condition

See merge request briar/briar!1589
2022-02-18 15:33:00 +00:00
Torsten Grote
f7892050ea allow_failure of mailbox test to make it optional again 2022-02-18 12:18:37 -03:00
Torsten Grote
003ecdb81f Fix merge request race condition 2022-02-18 12:02:06 -03:00
Torsten Grote
9141a8bb3b Merge branch '2168-mailbox-pairing-backend' into 'master'
Implement backend for pairing mailbox

Closes #2168

See merge request briar/briar!1587
2022-02-18 14:56:44 +00:00
akwizgran
7ba2af077e Merge branch '2162-mailbox-pairing-ui' into 'master'
Implement UI for pairing Briar with mailbox

See merge request briar/briar!1585
2022-02-18 14:50:10 +00:00
Torsten Grote
ce7f44de01 Set our own mailbox status right after pairing 2022-02-18 11:01:04 -03:00
Torsten Grote
4a46b13e9d Address mailbox pairing backend review feedback 2022-02-18 09:50:38 -03:00
Torsten Grote
ae7ccdf34c Tweak wording of mailbox intro and download instructions 2022-02-18 09:28:50 -03:00
Torsten Grote
88c54ed3b0 Rename getOnionAddress() to getBaseUrl()
This can later include a version parameter as well.
2022-02-18 09:16:51 -03:00
Torsten Grote
653b744a02 Add getMailboxStatus method to MailboxManager 2022-02-18 09:16:51 -03:00
Torsten Grote
65e7bcb94e Add unit tests for MailboxPairingTask 2022-02-18 09:16:51 -03:00
Torsten Grote
d6bbe59d3a Implement backend for pairing mailbox 2022-02-18 09:16:50 -03:00
Torsten Grote
98dddf3572 Make hiding ActionBar up/back button in Final Fragment optional 2022-02-16 10:37:27 -03:00
akwizgran
6d22bab5ee Merge branch 'transactional-remove-pending-contact' into 'master'
Add transactional version of removePendingContact()

See merge request briar/briar!1586
2022-02-16 11:18:31 +00:00
Sebastian Kürten
7ae91a984f Add transactional version of removePendingContact() 2022-02-15 22:28:29 +01:00
Torsten Grote
fb50a5ba45 Remove custom back and action bar code from OfflineFragment
Also pop the offline fragment off the stack when trying again, so it doesn't show up again when we are not offline anymore.
2022-02-14 14:56:39 -03:00
Torsten Grote
80bc409225 Remove 'share mailbox download link' button 2022-02-14 13:47:04 -03:00
akwizgran
80cac277ac Merge branch '2257-mailbox-wipe' into 'master'
Add method for wiping the mailbox

Closes #2257

See merge request briar/briar!1582
2022-02-14 14:45:51 +00:00
Torsten Grote
888aea4b37 Scroll fragments down on small screens to make bottom buttons visible 2022-02-10 09:46:43 -03:00
Torsten Grote
e9d3f600fa Improve mailbox pairing strings 2022-02-10 09:43:28 -03:00
Torsten Grote
3055338ea8 Show offline fragment before scanning mailbox QR code 2022-02-10 09:41:03 -03:00
Torsten Grote
e4a7b1731a Do real check if mailbox is set up 2022-02-10 09:41:03 -03:00
Torsten Grote
2da8c19d3e Handle TorPlugin not being active during mailbox setup 2022-02-10 09:41:03 -03:00
Torsten Grote
237ac50b01 Handle scanning a wrong QR code
when pairing a mailbox.
2022-02-10 09:41:02 -03:00
Torsten Grote
73d9e05ada Scan Mailbox QR code for setup and show progress screen 2022-02-10 09:17:39 -03:00
Torsten Grote
e14773985d Show mailbox onboarding/download info
if the mailbox is not yet set up.
2022-02-10 08:51:58 -03:00
Torsten Grote
8b3dae6daf Add Mailbox entry into settings 2022-02-10 08:51:58 -03:00
Torsten Grote
065ceb8e98 Add FeatureFlag for mailbox 2022-02-10 08:51:58 -03:00
akwizgran
6d881892c7 Merge branch '2231-file-api' into 'master'
Add Mailbox File Mangement API

Closes #2233, #2232, and #2231

See merge request briar/briar!1581
2022-02-10 11:50:15 +00:00
Torsten Grote
16b503dd7b Introduce MailboxId sub-classes for even more type-safety 2022-02-07 15:58:54 -03:00
Torsten Grote
fc5533ec6e Add method for wiping the mailbox 2022-02-07 09:37:05 -03:00
Torsten Grote
5c153aeb6c Sort files returned by getFiles by time (oldest first). 2022-02-07 09:36:48 -03:00
akwizgran
36670a8bf6 Bump version numbers for 1.4.4 release. 2022-01-27 11:56:54 +00:00
akwizgran
32d62f9960 Update translations. 2022-01-27 11:56:10 +00:00
akwizgran
eafd6a1ca1 Merge branch '2143-security-exception-image-loading' into 'master'
Add FLAG_GRANT_READ_URI_PERMISSION when getting content

Closes #2143

See merge request briar/briar!1583
2022-01-27 11:47:03 +00:00
Torsten Grote
1614e72c43 Add FLAG_GRANT_READ_URI_PERMISSION when getting content 2022-01-27 07:57:51 -03:00
Torsten Grote
d3beb850ef Factor out getArray() for easier JSON parsing 2022-01-24 14:03:48 -03:00
Torsten Grote
f057f0859b Use MailboxId instead of String for type-safety 2022-01-24 13:50:58 -03:00
Torsten Grote
61ea7ff8de Make deleting a non-existent file is tolerable 2022-01-21 15:12:14 -03:00
Torsten Grote
0fba65a722 Add integration test for File Management API 2022-01-21 15:12:13 -03:00
Torsten Grote
3a191908c0 Add method for listing folders with files available
for download (owner only)
2022-01-21 15:12:13 -03:00
Torsten Grote
482258fc92 Add method for deleting a file from a mailbox 2022-01-21 15:11:47 -03:00
Torsten Grote
0cb2dcf6b7 Add method for downloading a file from a mailbox 2022-01-21 15:11:46 -03:00
Torsten Grote
76599a8d04 Add method for listing files from mailbox 2022-01-21 15:11:46 -03:00
Torsten Grote
173af62dec Add method for adding file to mailbox 2022-01-21 15:11:46 -03:00
akwizgran
a53a49e543 Merge branch '2250-refuse-to-start-if-android4-expired' into 'master'
Refuse to start app on Android 4 beyond expiry date

Closes #2250

See merge request briar/briar!1578
2022-01-18 15:03:25 +00:00
akwizgran
78b993bda4 Merge branch 'mailbox-integration-test' into 'master'
Add MailboxIntegrationTest against a real mailbox instance

See merge request briar/briar!1575
2022-01-18 14:46:38 +00:00
akwizgran
6b956611e7 Merge branch '2251-warn-briar-expires-on-android4' into 'master'
Show expiry warning when running on Android 4

Closes #2251

See merge request briar/briar!1577
2022-01-18 14:36:33 +00:00
Torsten Grote
d0c3c1f9f6 Move wait-for-mailbox.sh to bramble-core/src/test/bash 2022-01-18 11:33:08 -03:00
Torsten Grote
24d058cdcc Merge branch 'add-more-feature-flags-for-desktop' into 'master'
Add feature flags for private groups, forums and blogs

See merge request briar/briar!1572
2022-01-18 11:41:26 +00:00
Torsten Grote
a9ab7fd60f Do not kill mailbox at the end of integration test 2022-01-17 11:10:49 -03:00
Daniel Lublin
9e5201d571 Don't try to sign out; we know we aren't signed in 2022-01-17 13:09:40 +01:00
Daniel Lublin
39eebe4c02 Remove, BaseActivity does this 2022-01-17 11:21:49 +01:00
Daniel Lublin
171df265ab Let our activity actually show up, by avoiding to extend BriarActivity
If user needs to sign in or create an account, BriarActivity launches
StartupActivity. But we want to show up before that.

Implement our own signOut with BriarActivity as a template.
2022-01-17 11:04:50 +01:00
Daniel Lublin
9436757215 Reuse existing string (same kind of context) 2022-01-13 12:59:55 +01:00
Daniel Lublin
75370c8124 Refuse to start on Android 4 beyond the set expiry date 2022-01-13 12:59:55 +01:00
Daniel Lublin
10dceafde1 Show expiry warning when running on Android 4
After a set date a snackbar is shown, warning that Briar will stop
working at a later set date.
2022-01-13 12:59:03 +01:00
akwizgran
e3126f931e Merge branch 'move-proguard-rules' into 'master'
Move ProGuard rules for Briar to briar-android

See merge request briar/briar!1580
2022-01-13 11:44:38 +00:00
akwizgran
6ddedbba36 Move ProGuard rules for Briar to briar-android. 2022-01-13 10:37:10 +00:00
akwizgran
982637a0b0 Merge branch 'correct-proguard' into 'master'
Restore proguard rule to keep us alive

See merge request briar/briar!1579
2022-01-13 10:35:37 +00:00
Daniel Lublin
78ef8c8117 Restore proguard, letting us stay alive by keeping more classes
For one, fragment classes referenced *only* from settings.xml (in
app:fragment-attributes) where not pulled in. Accessing such settings
would cause a crash.
2022-01-12 13:51:44 +01:00
Torsten Grote
7319398c3b Merge branch 'dex-method-limit' into 'master'
Update ProGuard rules to stay within dex method limit

See merge request briar/briar!1576
2022-01-11 14:45:22 +00:00
akwizgran
841b8133d1 Update ProGuard rules to stay within dex method limit. 2022-01-11 10:50:49 +00:00
akwizgran
b334e8da27 Suppress ProGuard warning about Jackson's Java7SupportImpl. 2022-01-11 10:48:56 +00:00
akwizgran
0ac26883c6 Build APK for CI pipelines. 2022-01-11 10:48:03 +00:00
Torsten Grote
519837e829 Add MailboxIntegrationTest against a real mailbox instance 2022-01-07 15:34:19 -03:00
Torsten Grote
9fa54bf15c Actually throw TolerableFailureException when *deleting* a contact
Before, this was accidentally added to *listing* contacts.
2022-01-07 14:29:14 -03:00
akwizgran
af3389e0e1 Merge branch '2187-delete-contact-from-mailbox' into 'master'
Add method for deleting a contact and retrieving contact list from own mailbox

Closes #2182 and #2187

See merge request briar/briar!1574
2022-01-07 15:13:19 +00:00
Torsten Grote
f5cdad9100 Throw TolerableFailureException when deleting a contact returns 404 2022-01-07 12:03:21 -03:00
Torsten Grote
df4e6aa207 Add method for retrieving contact list from own mailbox 2022-01-07 11:33:57 -03:00
Torsten Grote
82443d9708 Add method for deleting a contact from own mailbox 2022-01-07 10:46:43 -03:00
akwizgran
27058ba0ca Merge branch '2183-mailbox-add-contact' into 'master'
Add method for adding a contact to own mailbox

Closes #2183

See merge request briar/briar!1573
2022-01-07 13:37:40 +00:00
Torsten Grote
f400cf5aa0 Throw ApiException when adding contact is not successful 2022-01-07 10:22:22 -03:00
Torsten Grote
e52c5ddc8e Rename PermanentFailureException to ApiException 2022-01-07 10:13:31 -03:00
Torsten Grote
835e9f6994 Add mailbox API endpoint for adding a contact 2022-01-07 10:13:31 -03:00
akwizgran
4193179eb8 Merge branch '2243-okhttp-mailbox-calls' into 'master'
Add /status mailbox API call and a test for it

Closes #2207 and #2243

See merge request briar/briar!1564
2022-01-07 13:10:49 +00:00
Torsten Grote
421b00517f Address review comments for MailboxApi 2022-01-07 09:51:29 -03:00
Sebastian Kürten
707802c459 Add feature flags for private groups, forums and blogs 2022-01-06 15:35:37 +01:00
Torsten Grote
9f1757ccaf Remove concept of fatal permanent exceptions
All exceptions will just cause the request to be tried again with some backoff.
2022-01-03 14:12:21 -03:00
Torsten Grote
d665fc17ec Add /status and /setup mailbox API call with tests 2022-01-03 14:10:44 -03:00
akwizgran
65be2d2b26 Merge branch 'transactional-attachment-reader' into 'master'
Transactional version of AttachmentReader#getAttachment()

See merge request briar/briar!1570
2021-12-23 17:05:32 +00:00
Sebastian Kürten
d2a39da3e0 Transactional version of AttachmentReader#getAttachment() 2021-12-20 13:55:08 +01:00
akwizgran
d13e4c976e Merge branch 'fix-string-substitutions' into 'master'
Fix multiple substitutions specified in non-positional format

See merge request briar/briar!1568
2021-12-17 11:23:03 +00:00
akwizgran
20b52804bf Merge branch 'add-pending-contact-transactional' into 'master'
Transactional versions of some more API calls

See merge request briar/briar!1561
2021-12-16 16:38:15 +00:00
ialokim
5b27eb354c transactional versions of addPendingContact, getPendingContacts, getConversationId and respondToIntroduction 2021-12-16 17:21:57 +01:00
Torsten Grote
c340071469 Merge branch 'jmock-java-11' into 'master'
Replace ClassImposteriser with ByteBuddyClassImposteriser

See merge request briar/briar!1569
2021-12-15 16:34:04 +00:00
akwizgran
506e274dff Merge branch '2242-migrate-okhttp' into 'master'
Migrate OkHttp to bramble-core

Closes #2242

See merge request briar/briar!1562
2021-12-15 16:04:33 +00:00
Torsten Grote
423356fdda Add missing bouncycastle dependency to witness 2021-12-15 10:48:55 -03:00
Torsten Grote
043a173828 Migrate OkHttp to bramble-core 2021-12-15 10:46:48 -03:00
akwizgran
f0501bbfab Merge branch '1483-peer-session-crash' into 'master'
Do not create PeerSession for groups we created

Closes #1483

See merge request briar/briar!1344
2021-12-15 12:37:46 +00:00
akwizgran
5cafde7b14 Merge branch 'test-deps' into 'master'
Upgrade briar-android unit test dependencies

See merge request briar/briar!1567
2021-12-15 12:34:54 +00:00
akwizgran
5117dbad7e Merge branch 'bouncycastle-java8' into 'master'
Switch to bouncycastle dependency for Java 1.8 to prevent Java 15 class warnings of multi-jar

See merge request briar/briar!1566
2021-12-15 10:39:38 +00:00
Torsten Grote
3a22388495 Fix multiple substitutions specified in non-positional format
The build warnings might persist until translations have been updated
2021-12-14 16:51:52 -03:00
Torsten Grote
1d4de46dfd Upgrade briar-android unit test dependencies 2021-12-14 16:22:11 -03:00
Torsten Grote
d805069dfe Switch to bouncycastle dependency for Java 1.8 to prevent Java 15 class warnings of multi-jar 2021-12-14 15:42:10 -03:00
akwizgran
74cb2a6ce5 Merge branch 'readme-reproducible' into 'master'
Add a section about reproducible builds to the readme

See merge request briar/briar!1565
2021-12-14 13:23:46 +00:00
Torsten Grote
2880a4adac Add a section about reproducible builds to the readme 2021-12-14 10:00:20 -03:00
akwizgran
e032e0ccd5 Bump version numbers for 1.4.3 release. 2021-12-13 16:58:13 +00:00
Torsten Grote
38a07e1d54 Merge branch 'fix-headless-jar-build-on-java-11' into 'master'
Fix headless jar build on Java 11, add to CI pipeline

See merge request briar/briar!1563
2021-12-13 16:22:43 +00:00
akwizgran
07b35db4d4 Fix headless jar build on Java 11, add to CI pipeline. 2021-12-13 15:38:17 +00:00
akwizgran
3b03db9f43 Bump version numbers for 1.4.2 release. 2021-12-13 15:17:34 +00:00
akwizgran
de3a74eedf Update translations. 2021-12-13 15:16:17 +00:00
akwizgran
5a39f9730f Merge branch 'non-default-bridges' into 'master'
Use non-default obfs4 bridges in Russia

See merge request briar/briar!1556
2021-12-13 13:34:19 +00:00
akwizgran
bdf02bbc6c Increase test timeout because meek bridge is super slow. 2021-12-13 12:53:42 +00:00
akwizgran
d5b2ebdb23 Include meek bridge in test and mark it as essential. 2021-12-13 11:56:52 +00:00
Torsten Grote
98bb8d4af1 Merge branch 'fix-database-locking' into 'master'
Use ReentrantLock as a lock (not a monitor) when marking DB as open.

See merge request briar/briar!1549
2021-12-13 11:48:28 +00:00
akwizgran
75cc19e578 Remove failing non-default bridge. 2021-12-13 11:47:03 +00:00
akwizgran
aad87e6e98 Update default bridges from upstream. 2021-12-13 11:46:43 +00:00
akwizgran
dad895c30d Merge branch '2225-error-handling-for-mailbox-downloads' into 'master'
Add methods to get StreamContext from tag, and mark it as recognised

Closes #2225

See merge request briar/briar!1560
2021-12-10 14:45:34 +00:00
Daniel Lublin
f8b3d79813 Add methods to get StreamContext from tag, and mark it as recognised
Separate methods are needed to be able to restart reading from a stream
in the case of errors. Tag should be marked as recognised only after
successfully reading the stream.

Closes #2225
2021-12-10 15:23:30 +01:00
akwizgran
0a98566298 Merge branch '2190-mailbox-reset-retransmission-times' into 'master'
Resolve "Method for resetting retransmission times"

Closes #2190

See merge request briar/briar!1559
2021-12-09 12:11:54 +00:00
Daniel Lublin
93a03d7e15 Reset using a single db query 2021-12-09 12:55:01 +01:00
Daniel Lublin
3eb3dbde09 Add database method to reset retransmission times
Will be used to ensure messages are not stranded on a Mailbox, when such
is added, removed, or otherwise changed.

Closes #2190.
2021-12-09 11:10:50 +01:00
akwizgran
fd56176450 Merge branch 'desktop-98-transactional' into 'master'
Add transactional versions of some API calls for Briar Desktop

See merge request briar/briar!1557
2021-12-08 11:08:47 +00:00
ialokim
d29812f055 add transactional versions of some API calls 2021-12-07 20:39:55 +01:00
akwizgran
403601b9f2 Merge branch '2088-fix-error-with-null-group' into 'master'
Offline hotspot: don't crash if group is null

Closes #2088

See merge request briar/briar!1552
2021-12-07 15:20:35 +00:00
akwizgran
992215b78a Merge branch '2230-tracking-uploads' into 'master'
Add MailboxSettingsManager methods for tracking pending uploads

Closes #2230

See merge request briar/briar!1558
2021-12-07 15:12:24 +00:00
Torsten Grote
658ca8de21 Add MailboxSettingsManager methods for tracking pending uploads 2021-12-07 10:07:54 -03:00
akwizgran
e0e2c0cc89 Add unit test. 2021-12-07 10:33:16 +00:00
akwizgran
114d80ad43 Use non-default obfs4 bridges in Russia. 2021-12-06 18:11:16 +00:00
Torsten Grote
8d5803098b Merge branch 'network-usage-metrics' into 'master'
Include network usage metrics in crash reports and feedback

See merge request briar/briar!1555
2021-11-30 18:08:07 +00:00
akwizgran
a9ed9da822 Include network usage metrics in crash reports and feedback. 2021-11-30 14:12:45 +00:00
akwizgran
1d04bbcb4f Merge branch '1607-share-http-client-instance' into 'master'
Use a single OkHttpClient instance for all RSS fetches

Closes #1607

See merge request briar/briar!1536
2021-11-23 11:51:23 +00:00
akwizgran
43b0d1d543 Merge branch 'gradle-7-3' into 'master'
Upgrade gradle to v7.3

See merge request briar/briar!1553
2021-11-23 11:43:47 +00:00
Sebastian Kürten
1bfd9e4eb0 Upgrade gradle to v7.3 2021-11-23 10:13:11 +01:00
Sebastian Kürten
2295db4361 Offline hotspot: don't crash if group is null 2021-11-22 17:26:01 +01:00
akwizgran
8fca06e040 Merge branch 'gradle-7' into 'master'
Upgrade gradle and android plugin to v7

See merge request briar/briar!1551
2021-11-22 15:36:30 +00:00
akwizgran
3f7c9af3a9 Create the HTTP client lazily and allow it to be garbage collected. 2021-11-22 12:01:51 +00:00
akwizgran
93178d2f28 Merge branch '2171-store-time-of-last-connection-to-own-mailbox' into 'master'
Store time of last attempted and successful connections to own mailbox

Closes #2171

See merge request briar/briar!1547
2021-11-22 11:09:37 +00:00
akwizgran
2755d3f470 Merge branch '2169-store-own-mailbox-properties' into 'master'
Add mailbox settings manager

Closes #2169

See merge request briar/briar!1546
2021-11-22 11:09:03 +00:00
Torsten Grote
7efc3ca78f Fix AuthorView using the wrong constant 2021-11-19 15:11:23 -03:00
Torsten Grote
d6767a62b9 Upgrade gradle and android plugin to v7 2021-11-19 14:55:16 -03:00
Torsten Grote
2821460648 Merge branch 'use-synchroniser-for-mock-tests' into 'master'
Use Synchroniser for all mock tests

See merge request briar/briar!1550
2021-11-18 13:37:16 +00:00
akwizgran
7aa1073bf5 Replace ClassImposteriser with ByteBuddyClassImposteriser.
This may avoid problems with ClassImposteriser when using Java 11. See
https://github.com/jmock-developers/jmock-library/releases/tag/2.10.0
2021-11-18 13:28:08 +00:00
akwizgran
3ff7349b40 Set threading policy for the one test that does things differently. 2021-11-18 13:27:38 +00:00
akwizgran
22593722a7 Convert remaining tests to use BrambleMockTestCase. 2021-11-18 12:56:39 +00:00
akwizgran
e91ad962cb Use Synchroniser for all mock tests.
Android Studio tries to collect the output of failed tests on a different thread, which results in an exception when using Mockery's default threading policy, causing the tests to appear as incomplete rather than failed.
2021-11-18 11:32:33 +00:00
akwizgran
53d9a9b43b Merge branch '2153-tor-0.3.5.17' into 'master'
Upgrade Tor to 0.3.5.17 and remove v2 onion code

Closes #1280 and #2153

See merge request briar/briar!1548
2021-11-17 15:40:44 +00:00
akwizgran
47085722da Return early if LifecycleManager#stopServices() is called twice.
This could happen if the app shuts down spontaneously (eg due to low memory) concurrently with a manual shutdown.
2021-11-17 15:38:44 +00:00
akwizgran
6c702bad0a Use ReentrantLock as a lock (not a monitor) when marking DB as open. 2021-11-17 15:03:58 +00:00
Torsten Grote
0dc2aba22f Remove old v2 onion code from TorPlugin 2021-11-17 10:54:49 -03:00
Torsten Grote
5a8b822e08 Upgrade Tor to 0.3.5.17 2021-11-17 09:46:49 -03:00
akwizgran
8ac6b0155b Store time of last attempted and successful connections to mailbox. 2021-11-17 10:49:00 +00:00
akwizgran
372810f48e Add mailbox settings manager. 2021-11-16 12:53:17 +00:00
akwizgran
1b4ab4f945 Merge branch '2167-decode-qr-code-for-pairing-with-mailbox' into 'master'
Create initial MailboxPairViewModel that decodes QR code

Closes #2167

See merge request briar/briar!1544
2021-11-16 12:15:26 +00:00
Daniel Lublin
407ddad0a8 Make it package private 2021-11-15 12:59:57 +01:00
Daniel Lublin
77a986318e Add MailboxPairViewModel that decodes Mailbox QR code 2021-11-15 12:59:56 +01:00
Daniel Lublin
1809be4656 Factor out onion address encoder to CryptoComponent 2021-11-15 12:59:56 +01:00
Daniel Lublin
6d1a0a5792 Refactor qrcode and its camera classes to separate package 2021-11-15 12:59:56 +01:00
akwizgran
85dc27ed77 Merge branch 'message-tracked-event' into 'master'
Implement and use new message tracked event

See merge request briar/briar!1541
2021-11-12 11:35:59 +00:00
ialokim
3f8df34f5c use new event to update contacts view model 2021-11-11 20:56:13 +01:00
ialokim
eb08781460 broadcast event when a conversation message is tracked 2021-11-11 20:56:02 +01:00
akwizgran
8a4fe7ca49 Fix missing import. 2021-11-04 11:08:15 +00:00
akwizgran
e688448537 Merge branch 'dynamic-tor-ports' into 'master'
Make Tor ports configurable at runtime

See merge request briar/briar!1537
2021-11-04 11:00:09 +00:00
Sebastian Kürten
e0f36ade92 Address review feedback 2021-11-03 16:32:17 +01:00
akwizgran
6517f3f2d0 Bump version numbers for 1.4.1 release. 2021-11-03 15:08:52 +00:00
akwizgran
70d5150faf Fix placeholder in Icelandic translation. 2021-11-03 15:08:05 +00:00
Sebastian Kürten
a1f9e80e12 Inject Tor ports via annotated int parameters 2021-11-03 15:43:01 +01:00
akwizgran
770c87c723 Bump version numbers for 1.4.0 release. 2021-11-03 14:38:32 +00:00
akwizgran
2b5446759f Update translations. 2021-11-03 14:37:34 +00:00
Torsten Grote
edccb9ae14 Merge branch '1081-fix-typo' into 'master'
Fix a typo: without Internet connection -> without an Internet connection

See merge request briar/briar!1540
2021-11-03 14:33:43 +00:00
Torsten Grote
1337fc46b3 Merge branch 'feature-flags-for-hotspot-and-removable-drives' into 'master'
Enable removable drives and sharing app offline in release builds

See merge request briar/briar!1542
2021-11-02 12:09:36 +00:00
akwizgran
ed26dc0b2b Enable removable drives and sharing app offline in release builds. 2021-11-02 11:18:54 +00:00
akwizgran
bf9fe6a146 Fix a typo: without Internet connection -> without an Internet connection. 2021-10-29 13:01:26 +01:00
akwizgran
448ea114f3 Merge branch 'suggest-restarting-hotspot-phone' into 'master'
Add restarting hotspot phone to troubleshooting

See merge request briar/briar!1534
2021-10-29 11:53:52 +00:00
akwizgran
abc523fae3 Merge branch '2011-hotspot-graphic' into 'master'
Add feature graphic for app sharing feature

Closes #2011

See merge request briar/briar!1538
2021-10-29 11:45:21 +00:00
Daniel Lublin
6de5f424b8 Add restarting hotspot phone to troubleshooting 2021-10-21 10:03:48 +02:00
Torsten Grote
703559102a Add feature graphic for app sharing feature 2021-10-19 14:02:57 -03:00
Torsten Grote
4acc5f4d8c Merge branch 'gradle-run-configurations' into 'master'
Convert AS run configurations for tests to Gradle

See merge request briar/briar!1535
2021-10-18 13:31:59 +00:00
Sebastian Kürten
bf091ef854 Use different Tor ports for regular and debug builds 2021-10-16 14:45:14 +02:00
Sebastian Kürten
d4656df384 Make Tor ports configurable at runtime
Instead of using hard-coded values 59050 and 59051 for the Tor socks and
control ports, provide them via a TorPorts interface. This makes it possible
to pass the ports to a TorPortsImpl in modules. Hence it is possible to
configure the Tor port for different types of builds or via command line
options in case of briar headless or other clients using the core code.
2021-10-16 14:41:29 +02:00
akwizgran
e79abeff2e Use a single OkHttpClient instance for all RSS fetches. 2021-09-30 14:09:15 +01:00
akwizgran
4a4d8f4ccf Convert AS run configurations for tests to Gradle. 2021-09-24 14:02:41 +01:00
akwizgran
807677532c Bump version numbers for 1.3.8 release. 2021-08-31 15:38:11 +01:00
Torsten Grote
7e9d64b6ad Merge branch 'fix-headless-build' into 'master'
Remove jar signatures to avoid SecurityException when repacking headless jar

See merge request briar/briar!1532
2021-08-31 14:37:13 +00:00
akwizgran
f963c4cfdd Remove jar signatures to avoid SecurityException when repacking headless jar. 2021-08-31 15:02:43 +01:00
akwizgran
7388da410f Bump version numbers for 1.3.7 release. 2021-08-31 14:16:43 +01:00
akwizgran
3635c35923 Update translations. 2021-08-31 14:15:47 +01:00
akwizgran
7c1399c326 Merge branch 'simpler-hotspot-name-pass' into 'master'
Limit hotspot name and password to only lowercase letters (on 29+)

See merge request briar/briar!1520
2021-08-31 13:10:02 +00:00
akwizgran
c002cc2e73 Merge branch 'enable-connect-via-bluetooth' into 'master'
Enable connect via Bluetooth feature in release builds

See merge request briar/briar!1531
2021-08-31 13:07:59 +00:00
Torsten Grote
f3273260bb Fix Kotlin coding style 2021-08-31 14:32:36 +02:00
Torsten Grote
abf99f0219 Merge branch '2148-shrink-hotspot-qr-codes' into 'master'
Shrink QR code to avoid scrolling

Closes #2148

See merge request briar/briar!1528
2021-08-31 12:21:16 +00:00
Torsten Grote
7405ed7196 Merge branch '2076-revise-transfer-data-explanation' into 'master'
Revise removable drive ui after usability testing

Closes #2076

See merge request briar/briar!1530
2021-08-31 12:11:11 +00:00
Daniel Lublin
b53203581c Enable scrollbar for hotspot scrollviews 2021-08-31 12:10:40 +02:00
Daniel Lublin
d522942bdd Enable scrollbar for scrollview 2021-08-31 12:02:39 +02:00
Daniel Lublin
802015d995 Shrink QR code to avoid scrolling 2021-08-31 09:09:10 +02:00
Daniel Lublin
c36352f2b8 Rename feature for user 2021-08-31 09:08:42 +02:00
Daniel Lublin
21a2f91521 Revise transfer data wording, adding explanation in fullscreen dialog 2021-08-31 09:08:40 +02:00
akwizgran
d8267ce559 Update code style settings. 2021-08-30 15:22:34 +01:00
akwizgran
8f887c609f Enable connect via Bluetooth feature in release builds. 2021-08-30 15:17:53 +01:00
akwizgran
b077e5f94f Update translations. 2021-08-30 15:03:57 +01:00
akwizgran
2b61b01b4e Merge branch '2151-bluetooth-connect-ui' into 'master'
Add simple UI for Connect via Bluetooth feature

Closes #2151 and #1821

See merge request briar/briar!1524
2021-08-30 13:58:26 +00:00
Torsten Grote
822a58c8a6 Replace final Bluetooth connection fragments with toasts 2021-08-30 15:34:37 +02:00
Daniel Lublin
09b065f46e Limit hotspot name and password to only lowercase letters (on 29+) 2021-08-23 10:44:42 +02:00
Torsten Grote
1be8ac6e14 Add simple UI for Connect via Bluetooth feature 2021-08-20 09:11:35 +02:00
Torsten Grote
d3dbcfd62d Recreate plausible private group sharing sessions when re-adding contact from group 2021-04-15 14:46:22 -03:00
Torsten Grote
c4c70f5ac2 Do not create PeerSession for groups we created
This needs a CreatorSession which gets created on-demand.
2021-04-15 14:44:58 -03:00
607 changed files with 32756 additions and 5852 deletions

View File

@@ -32,8 +32,9 @@ test:
extends: .base-test
stage: test
script:
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom compileOfficialDebugAndroidTestSources compileScreenshotDebugAndroidTestSources check
- ./gradlew -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest
- ./gradlew -Djava.security.egd=file:/dev/urandom assembleOfficialDebug :briar-headless:linuxJars
- ./gradlew -Djava.security.egd=file:/dev/urandom compileOfficialDebugAndroidTestSources compileScreenshotDebugAndroidTestSources check
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: always
@@ -61,7 +62,7 @@ android test:
when: on_failure
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success
when: manual
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- briar-android/**/*
@@ -84,35 +85,36 @@ test_reproducible:
.optional_tests:
stage: optional_tests
before_script:
- set -e
- export GRADLE_USER_HOME=$PWD/.gradle
cache:
key: "$CI_COMMIT_REF_SLUG"
paths:
- .gradle/wrapper
- .gradle/caches
script:
- OPTIONAL_TESTS=org.briarproject.bramble.plugin.tor.BridgeTest ./gradlew --info bramble-java:test --tests BridgeTest
after_script:
# these file change every time but should not be cached
- rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
- rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/
extends: .base-test
bridge test:
extends: .optional_tests
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success
allow_failure: true
allow_failure: false
- if: '$CI_COMMIT_TAG == null'
when: manual
allow_failure: true
script:
- OPTIONAL_TESTS=org.briarproject.bramble.plugin.tor.BridgeTest ./gradlew --info bramble-java:test --tests BridgeTest
timeout: 4h
pre_release_tests:
mailbox integration test:
extends: .optional_tests
only:
- tags
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success
- if: '$CI_COMMIT_TAG == null'
when: manual
allow_failure: true # TODO figure out how not to allow failure while leaving this optional
script:
# start mailbox
- cd /opt && git clone --depth 1 https://code.briarproject.org/briar/briar-mailbox.git briar-mailbox
- cd briar-mailbox
- mkdir -p /root/.local/share # create directory that mailbox (currently) expects to exist
- ./gradlew run --args="--debug --setup-token 54686973206973206120736574757020746f6b656e20666f722042726961722e" &
# run mailbox integration test once mailbox has started
- cd "$CI_PROJECT_DIR"
- bramble-core/src/test/bash/wait-for-mailbox.sh
- OPTIONAL_TESTS=org.briarproject.bramble.mailbox.MailboxIntegrationTest ./gradlew --info bramble-core:test --tests MailboxIntegrationTest

View File

@@ -1,35 +0,0 @@
# Summary
(Briefly describe the bug encontered)
# Steps to reproduce
(Please list the steps you performed when you encountered the bug)
-
-
-
# How often does it happen?
(Every time, Sometimes, It happened only once)
# What did you expect to happen
(Describe the app behaviour that you expected to happen)
# What actually happened?
(Describe what actually happened)
* What version of Briar app do you have installed? [Please fill in]
* Did you send the feedback from your device? [Yes/No]
* Your device manufacturer: [Please fill in]
* Your device model: [Please fill in]
* Android version: [Please fill in]

View File

@@ -1,15 +0,0 @@
# Are you requesting a new feature or an improvement to an existing feature?
# Brief description of the new or improved feature you would like to see in the Briar app
# Please describe in detail what you would like to do in Briar app, for which a new or improved feature is required?
* Does the absence of this feature prevent you from using the Briar app for certain activities? What are those activities?
* Would your use of Briar app increase with this new feature?

View File

@@ -31,15 +31,6 @@
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value />
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
@@ -197,9 +188,9 @@
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="PARAMETER_ANNOTATION_WRAP" value="1" />
<option name="VARIABLE_ANNOTATION_WRAP" value="1" />
<option name="ENUM_CONSTANTS_WRAP" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,21 +1,32 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.briar-android" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/briar-android" />
<configuration default="false" name="All tests" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":briar-android:testOfficialDebugUnitTest" />
<option value=":briar-android:testScreenshotDebugUnitTest" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-api" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-core" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-android" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-java" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-api" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-core" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-headless" run_configuration_type="AndroidJUnit" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-api" run_configuration_type="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-core" run_configuration_type="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-java" run_configuration_type="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in bramble-android" run_configuration_type="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-api" run_configuration_type="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-core" run_configuration_type="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-headless" run_configuration_type="GradleRunConfiguration" />
</method>
</configuration>
</component>

View File

@@ -1,14 +1,23 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-android" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.bramble-android" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-android" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in bramble-android" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":bramble-android:testDebugUnitTest" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-api" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.bramble-api" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-api" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in bramble-api" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":bramble-api:animalSnifferMain" />
<option value=":bramble-api:animalSnifferTest" />
<option value=":bramble-api:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-core" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.bramble-core" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-core" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in bramble-core" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":bramble-core:animalSnifferMain" />
<option value=":bramble-core:animalSnifferTest" />
<option value=":bramble-core:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,15 +1,23 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-java" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.bramble-java" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -Djava.library.path=libs" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-java" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in bramble-java" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":bramble-java:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,14 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-android" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.briar-android" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/briar-android" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in briar-android" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":briar-android:testOfficialDebugUnitTest" />
<option value=":briar-android:testScreenshotDebugUnitTest" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-api" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.briar-api" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/briar-api" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in briar-api" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":briar-api:animalSnifferMain" />
<option value=":briar-api:animalSnifferTest" />
<option value=":briar-api:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-core" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.briar-core" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/briar-core" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in briar-core" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":briar-core:animalSnifferMain" />
<option value=":briar-core:animalSnifferTest" />
<option value=":briar-core:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,15 +1,23 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-headless" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.briar-headless" />
<option name="PACKAGE_NAME" value="org.briarproject.briar.headless" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/briar-headless" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="All tests in briar-headless" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":briar-headless:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,24 +1,28 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="BridgeTest" type="AndroidJUnit" factoryName="Android JUnit" nameIsGenerated="true">
<module name="briar.bramble-java" />
<useClassPathOnly />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.briarproject.bramble.plugin.tor.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<option name="PACKAGE_NAME" value="org.briarproject.bramble.plugin.tor" />
<option name="MAIN_CLASS_NAME" value="org.briarproject.bramble.plugin.tor.BridgeTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
<envs>
<env name="OPTIONAL_TESTS" value="org.briarproject.bramble.plugin.tor.BridgeTest" />
</envs>
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
<configuration default="false" name="BridgeTest" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="env">
<map>
<entry key="OPTIONAL_TESTS" value="org.briarproject.bramble.plugin.tor.BridgeTest" />
</map>
</option>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="--tests &quot;org.briarproject.bramble.plugin.tor.BridgeTest&quot;" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":bramble-java:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,14 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="H2 Performance Test" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.bramble-core" />
<option name="PACKAGE_NAME" value="org.briarproject.bramble.db" />
<option name="MAIN_CLASS_NAME" value="org.briarproject.bramble.db.H2DatabasePerformanceTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -1,14 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="HyperSQL Performance Test" type="AndroidJUnit" factoryName="Android JUnit">
<module name="briar.bramble-core" />
<option name="PACKAGE_NAME" value="org.briarproject.bramble.db" />
<option name="MAIN_CLASS_NAME" value="org.briarproject.bramble.db.HyperSqlDatabasePerformanceTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

10
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,10 @@
Folder-Description:
===================
* `briar-*`: Specifically for the Briar app (Phone/Desktop/Headless)
* `bramble-*`: The protocol stack - not necessarily Briar-dependent
---
* `*-api`: public stuff that can be referenced from other packages and modules - mostly interfaces + a few utility classes
* `*-core`: implementations of api that are portable across Android/Desktop/Headless
* `*-java`: implementations of api that are specific to Desktop & Headless

View File

@@ -22,6 +22,15 @@ our site.
[Wiki](https://code.briarproject.org/briar/briar/-/wikis/home)
## Reproducible builds
We provide [docker images](https://code.briarproject.org/briar/briar-reproducer#briar-reproducer)
to ease the task of verifying that the published APK binaries
include nothing but our publicly available source code.
You can either use those images or use them as a blueprint to build your own environment
for reproduction.
## Donate
[![Donate using Liberapay](https://briarproject.org/img/liberapay.svg)](https://liberapay.com/Briar/donate) [![Flattr this](https://briarproject.org/img/flattr-badge-large.png "Flattr this")](https://flattr.com/t/592836/)

View File

@@ -15,8 +15,8 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
versionCode 10306
versionName "1.3.6"
versionCode 10412
versionName "1.4.12"
consumerProguardFiles 'proguard-rules.txt'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -42,8 +42,10 @@ configurations {
dependencies {
implementation project(path: ':bramble-core', configuration: 'default')
tor 'org.briarproject:tor-android:0.3.5.15'
tor 'org.briarproject:obfs4proxy-android:0.0.12-dev-40245c4a@zip'
implementation 'androidx.annotation:annotation:1.5.0'
tor "org.briarproject:tor-android:$tor_version"
tor "org.briarproject:obfs4proxy-android:$obfs4proxy_version"
tor "org.briarproject:snowflake-android:$snowflake_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
@@ -53,7 +55,7 @@ dependencies {
testImplementation "junit:junit:$junit_version"
testImplementation "org.jmock:jmock:$jmock_version"
testImplementation "org.jmock:jmock-junit4:$jmock_version"
testImplementation "org.jmock:jmock-legacy:$jmock_version"
testImplementation "org.jmock:jmock-imposters:$jmock_version"
}
def torBinariesDir = 'src/main/res/raw'
@@ -70,11 +72,6 @@ clean.dependsOn cleanTorBinaries
task unpackTorBinaries {
doLast {
copy {
from configurations.tor.collect { zipTree(it) }
into torBinariesDir
include 'geoip.zip'
}
configurations.tor.each { outer ->
zipTree(outer).each { inner ->
if (inner.name.endsWith('_arm_pie.zip')) {

View File

@@ -1,6 +1,8 @@
-keep,includedescriptorclasses class org.briarproject.** { *; }
-keep class org.h2.** { *; }
# Keep the H2 classes that are loaded via reflection
-keep class org.h2.Driver { *; }
-keep class org.h2.engine.Engine { *; }
-keep class org.h2.store.fs.** { *; }
# Don't warn about unused dependencies of H2 classes
-dontwarn org.h2.**
-dontnote org.h2.**
@@ -15,5 +17,8 @@
-dontwarn sun.misc.Unsafe
-dontnote com.google.common.**
# UPnP library isn't used
-dontwarn org.bitlet.weupnp.**
-dontwarn com.fasterxml.jackson.databind.ext.Java7SupportImpl
# Keep all Jackson-serialisable classes and their members
-keep interface com.fasterxml.jackson.databind.annotation.JsonSerialize
-keep @com.fasterxml.jackson.databind.annotation.JsonSerialize class * { *; }

View File

@@ -1,6 +1,7 @@
package org.briarproject.bramble;
import org.briarproject.bramble.battery.AndroidBatteryModule;
import org.briarproject.bramble.io.DnsModule;
import org.briarproject.bramble.network.AndroidNetworkModule;
import org.briarproject.bramble.plugin.tor.CircumventionModule;
import org.briarproject.bramble.reporting.ReportingModule;
@@ -18,6 +19,7 @@ import dagger.Module;
AndroidTaskSchedulerModule.class,
AndroidWakefulIoExecutorModule.class,
CircumventionModule.class,
DnsModule.class,
ReportingModule.class,
SocksModule.class
})

View File

@@ -11,7 +11,10 @@ import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import org.briarproject.bramble.api.Cancellable;
import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.lifecycle.Service;
@@ -21,7 +24,6 @@ import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.system.TaskScheduler;
import org.briarproject.bramble.api.system.TaskScheduler.Cancellable;
import java.net.Inet4Address;
import java.net.InetAddress;
@@ -38,6 +40,7 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import static android.content.Context.CONNECTIVITY_SERVICE;
import static android.content.Context.WIFI_SERVICE;
import static android.content.Intent.ACTION_SCREEN_OFF;
import static android.content.Intent.ACTION_SCREEN_ON;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
@@ -111,15 +114,37 @@ class AndroidNetworkManager implements NetworkManager, Service {
@Override
public NetworkStatus getNetworkStatus() {
NetworkInfo net = connectivityManager.getActiveNetworkInfo();
boolean connected = net != null && net.isConnected();
boolean wifi = false, ipv6Only = false;
if (connected) {
wifi = net.getType() == TYPE_WIFI;
if (SDK_INT >= 23) ipv6Only = isActiveNetworkIpv6Only();
else ipv6Only = areAllAvailableNetworksIpv6Only();
// https://issuetracker.google.com/issues/175055271
try {
NetworkInfo net = connectivityManager.getActiveNetworkInfo();
boolean connected = net != null && net.isConnected();
boolean wifi = false, ipv6Only = false;
if (connected) {
wifi = net.getType() == TYPE_WIFI;
if (SDK_INT >= 23) ipv6Only = isActiveNetworkIpv6Only();
else ipv6Only = areAllAvailableNetworksIpv6Only();
}
return new NetworkStatus(connected, wifi, ipv6Only);
} catch (SecurityException e) {
logException(LOG, WARNING, e);
// Without the ConnectivityManager we can't detect whether we have
// internet access. Assume we do, which is probably less harmful
// than assuming we don't. Likewise, assume the connection is
// IPv6-only. Fall back to the WifiManager to detect whether we
// have a wifi connection.
LOG.info("ConnectivityManager is broken, guessing connectivity");
boolean connected = true, wifi = false, ipv6Only = true;
WifiManager wm = (WifiManager) app.getSystemService(WIFI_SERVICE);
if (wm != null) {
WifiInfo info = wm.getConnectionInfo();
if (info != null && info.getIpAddress() != 0) {
LOG.info("Connected to wifi");
wifi = true;
ipv6Only = false;
}
}
return new NetworkStatus(connected, wifi, ipv6Only);
}
return new NetworkStatus(connected, wifi, ipv6Only);
}
/**
@@ -130,23 +155,29 @@ class AndroidNetworkManager implements NetworkManager, Service {
*/
@TargetApi(23)
private boolean isActiveNetworkIpv6Only() {
Network net = connectivityManager.getActiveNetwork();
if (net == null) {
LOG.info("No active network");
// https://issuetracker.google.com/issues/175055271
try {
Network net = connectivityManager.getActiveNetwork();
if (net == null) {
LOG.info("No active network");
return false;
}
LinkProperties props = connectivityManager.getLinkProperties(net);
if (props == null) {
LOG.info("No link properties for active network");
return false;
}
boolean hasIpv6Unicast = false;
for (LinkAddress linkAddress : props.getLinkAddresses()) {
InetAddress addr = linkAddress.getAddress();
if (addr instanceof Inet4Address) return false;
if (!addr.isMulticastAddress()) hasIpv6Unicast = true;
}
return hasIpv6Unicast;
} catch (SecurityException e) {
logException(LOG, WARNING, e);
return false;
}
LinkProperties props = connectivityManager.getLinkProperties(net);
if (props == null) {
LOG.info("No link properties for active network");
return false;
}
boolean hasIpv6Unicast = false;
for (LinkAddress linkAddress : props.getLinkAddresses()) {
InetAddress addr = linkAddress.getAddress();
if (addr instanceof Inet4Address) return false;
if (!addr.isMulticastAddress()) hasIpv6Unicast = true;
}
return hasIpv6Unicast;
}
/**

View File

@@ -32,13 +32,22 @@ class AndroidRemovableDrivePlugin extends RemovableDrivePlugin {
InputStream openInputStream(TransportProperties p) throws IOException {
String uri = p.get(PROP_URI);
if (isNullOrEmpty(uri)) throw new IllegalArgumentException();
return app.getContentResolver().openInputStream(Uri.parse(uri));
try {
return app.getContentResolver().openInputStream(Uri.parse(uri));
} catch (SecurityException e) {
throw new IOException(e);
}
}
@Override
OutputStream openOutputStream(TransportProperties p) throws IOException {
String uri = p.get(PROP_URI);
if (isNullOrEmpty(uri)) throw new IllegalArgumentException();
return app.getContentResolver().openOutputStream(Uri.parse(uri));
try {
return app.getContentResolver()
.openOutputStream(Uri.parse(uri), "wt");
} catch (SecurityException e) {
throw new IOException(e);
}
}
}

View File

@@ -175,16 +175,24 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
@TargetApi(21)
@Nullable
private InetAddress getWifiClientIpv6Address() {
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities caps =
connectivityManager.getNetworkCapabilities(net);
if (caps == null || !caps.hasTransport(TRANSPORT_WIFI)) continue;
LinkProperties props = connectivityManager.getLinkProperties(net);
if (props == null) continue;
for (LinkAddress linkAddress : props.getLinkAddresses()) {
InetAddress addr = linkAddress.getAddress();
if (isIpv6LinkLocalAddress(addr)) return addr;
// https://issuetracker.google.com/issues/175055271
try {
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities caps =
connectivityManager.getNetworkCapabilities(net);
if (caps == null || !caps.hasTransport(TRANSPORT_WIFI)) {
continue;
}
LinkProperties props =
connectivityManager.getLinkProperties(net);
if (props == null) continue;
for (LinkAddress linkAddress : props.getLinkAddresses()) {
InetAddress addr = linkAddress.getAddress();
if (isIpv6LinkLocalAddress(addr)) return addr;
}
}
} catch (SecurityException e) {
logException(LOG, WARNING, e);
}
return null;
}
@@ -227,12 +235,17 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
// network's socket factory may try to connect via another network
private SocketFactory getSocketFactory() {
if (SDK_INT < 21) return SocketFactory.getDefault();
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities caps =
connectivityManager.getNetworkCapabilities(net);
if (caps != null && caps.hasTransport(TRANSPORT_WIFI)) {
return net.getSocketFactory();
// https://issuetracker.google.com/issues/175055271
try {
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities caps =
connectivityManager.getNetworkCapabilities(net);
if (caps != null && caps.hasTransport(TRANSPORT_WIFI)) {
return net.getSocketFactory();
}
}
} catch (SecurityException e) {
logException(LOG, WARNING, e);
}
LOG.warning("Could not find suitable socket factory");
return SocketFactory.getDefault();

View File

@@ -31,6 +31,8 @@ import java.util.zip.ZipInputStream;
import javax.net.SocketFactory;
import androidx.annotation.ChecksSdkIntAtLeast;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.Arrays.asList;
import static java.util.logging.Level.INFO;
@@ -45,13 +47,14 @@ class AndroidTorPlugin extends TorPlugin {
private static final String TOR_LIB_NAME = "libtor.so";
private static final String OBFS4_LIB_NAME = "libobfs4proxy.so";
private static final String SNOWFLAKE_LIB_NAME = "libsnowflake.so";
private static final Logger LOG =
getLogger(AndroidTorPlugin.class.getName());
private final Application app;
private final AndroidWakeLock wakeLock;
private final File torLib, obfs4Lib;
private final File torLib, obfs4Lib, snowflakeLib;
AndroidTorPlugin(Executor ioExecutor,
Executor wakefulIoExecutor,
@@ -70,17 +73,20 @@ class AndroidTorPlugin extends TorPlugin {
String architecture,
long maxLatency,
int maxIdleTime,
File torDirectory) {
File torDirectory,
int torSocksPort,
int torControlPort) {
super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils,
torSocketFactory, clock, resourceProvider,
circumventionProvider, batteryManager, backoff,
torRendezvousCrypto, callback, architecture, maxLatency,
maxIdleTime, torDirectory);
maxIdleTime, torDirectory, torSocksPort, torControlPort);
this.app = app;
wakeLock = wakeLockManager.createWakeLock("TorPlugin");
String nativeLibDir = app.getApplicationInfo().nativeLibraryDir;
torLib = new File(nativeLibDir, TOR_LIB_NAME);
obfs4Lib = new File(nativeLibDir, OBFS4_LIB_NAME);
snowflakeLib = new File(nativeLibDir, SNOWFLAKE_LIB_NAME);
}
@Override
@@ -106,6 +112,12 @@ class AndroidTorPlugin extends TorPlugin {
if (!enable) wakeLock.release();
}
@Override
@ChecksSdkIntAtLeast(api = 25)
protected boolean canVerifyLetsEncryptCerts() {
return SDK_INT >= 25;
}
@Override
public void stop() {
super.stop();
@@ -122,39 +134,43 @@ class AndroidTorPlugin extends TorPlugin {
return obfs4Lib.exists() ? obfs4Lib : super.getObfs4ExecutableFile();
}
@Override
protected File getSnowflakeExecutableFile() {
return snowflakeLib.exists()
? snowflakeLib : super.getSnowflakeExecutableFile();
}
@Override
protected void installTorExecutable() throws IOException {
File extracted = super.getTorExecutableFile();
if (torLib.exists()) {
// If an older version left behind a Tor binary, delete it
if (extracted.exists()) {
if (extracted.delete()) LOG.info("Deleted Tor binary");
else LOG.info("Failed to delete Tor binary");
}
} else if (SDK_INT < 29) {
// The binary wasn't extracted at install time. Try to extract it
extractLibraryFromApk(TOR_LIB_NAME, extracted);
} else {
// No point extracting the binary, we won't be allowed to execute it
throw new FileNotFoundException(torLib.getAbsolutePath());
}
installExecutable(super.getTorExecutableFile(), torLib, TOR_LIB_NAME);
}
@Override
protected void installObfs4Executable() throws IOException {
File extracted = super.getObfs4ExecutableFile();
if (obfs4Lib.exists()) {
// If an older version left behind an obfs4 binary, delete it
installExecutable(super.getObfs4ExecutableFile(), obfs4Lib,
OBFS4_LIB_NAME);
}
@Override
protected void installSnowflakeExecutable() throws IOException {
installExecutable(super.getSnowflakeExecutableFile(), snowflakeLib,
SNOWFLAKE_LIB_NAME);
}
private void installExecutable(File extracted, File lib, String libName)
throws IOException {
if (lib.exists()) {
// If an older version left behind a binary, delete it
if (extracted.exists()) {
if (extracted.delete()) LOG.info("Deleted obfs4 binary");
else LOG.info("Failed to delete obfs4 binary");
if (extracted.delete()) LOG.info("Deleted old binary");
else LOG.info("Failed to delete old binary");
}
} else if (SDK_INT < 29) {
// The binary wasn't extracted at install time. Try to extract it
extractLibraryFromApk(OBFS4_LIB_NAME, extracted);
extractLibraryFromApk(libName, extracted);
} else {
// No point extracting the binary, we won't be allowed to execute it
throw new FileNotFoundException(obfs4Lib.getAbsolutePath());
throw new FileNotFoundException(lib.getAbsolutePath());
}
}

View File

@@ -3,6 +3,7 @@ package org.briarproject.bramble.plugin.tor;
import android.app.Application;
import org.briarproject.bramble.api.battery.BatteryManager;
import org.briarproject.bramble.api.crypto.CryptoComponent;
import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.network.NetworkManager;
@@ -10,57 +11,35 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.BackoffFactory;
import org.briarproject.bramble.api.plugin.PluginCallback;
import org.briarproject.bramble.api.plugin.TorConstants;
import org.briarproject.bramble.api.plugin.TorControlPort;
import org.briarproject.bramble.api.plugin.TorDirectory;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
import org.briarproject.bramble.api.plugin.TorSocksPort;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.bramble.api.system.ResourceProvider;
import org.briarproject.bramble.api.system.WakefulIoExecutor;
import org.briarproject.bramble.util.AndroidUtils;
import java.io.File;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import javax.inject.Inject;
import javax.net.SocketFactory;
import static org.briarproject.bramble.util.AndroidUtils.getSupportedArchitectures;
@Immutable
@NotNullByDefault
public class AndroidTorPluginFactory implements DuplexPluginFactory {
public class AndroidTorPluginFactory extends TorPluginFactory {
private static final Logger LOG =
Logger.getLogger(AndroidTorPluginFactory.class.getName());
private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute
private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins
private static final double BACKOFF_BASE = 1.2;
private final Executor ioExecutor, wakefulIoExecutor;
private final Application app;
private final NetworkManager networkManager;
private final LocationUtils locationUtils;
private final EventBus eventBus;
private final SocketFactory torSocketFactory;
private final BackoffFactory backoffFactory;
private final ResourceProvider resourceProvider;
private final CircumventionProvider circumventionProvider;
private final BatteryManager batteryManager;
private final AndroidWakeLockManager wakeLockManager;
private final Clock clock;
private final File torDirectory;
@Inject
AndroidTorPluginFactory(@IoExecutor Executor ioExecutor,
@WakefulIoExecutor Executor wakefulIoExecutor,
Application app,
NetworkManager networkManager,
LocationUtils locationUtils,
EventBus eventBus,
@@ -69,72 +48,43 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory {
ResourceProvider resourceProvider,
CircumventionProvider circumventionProvider,
BatteryManager batteryManager,
AndroidWakeLockManager wakeLockManager,
Clock clock,
@TorDirectory File torDirectory) {
this.ioExecutor = ioExecutor;
this.wakefulIoExecutor = wakefulIoExecutor;
CryptoComponent crypto,
@TorDirectory File torDirectory,
@TorSocksPort int torSocksPort,
@TorControlPort int torControlPort,
Application app,
AndroidWakeLockManager wakeLockManager) {
super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils,
eventBus, torSocketFactory, backoffFactory, resourceProvider,
circumventionProvider, batteryManager, clock, crypto,
torDirectory, torSocksPort, torControlPort);
this.app = app;
this.networkManager = networkManager;
this.locationUtils = locationUtils;
this.eventBus = eventBus;
this.torSocketFactory = torSocketFactory;
this.backoffFactory = backoffFactory;
this.resourceProvider = resourceProvider;
this.circumventionProvider = circumventionProvider;
this.batteryManager = batteryManager;
this.wakeLockManager = wakeLockManager;
this.clock = clock;
this.torDirectory = torDirectory;
}
@Nullable
@Override
public TransportId getId() {
return TorConstants.ID;
}
@Override
public long getMaxLatency() {
return MAX_LATENCY;
}
@Override
public DuplexPlugin createPlugin(PluginCallback callback) {
// Check that we have a Tor binary for this architecture
String architecture = null;
for (String abi : AndroidUtils.getSupportedArchitectures()) {
if (abi.startsWith("x86_64")) {
architecture = "x86_64";
break;
} else if (abi.startsWith("x86")) {
architecture = "x86";
break;
} else if (abi.startsWith("arm64")) {
architecture = "arm64";
break;
} else if (abi.startsWith("armeabi")) {
architecture = "arm";
break;
}
String getArchitectureForTorBinary() {
for (String abi : getSupportedArchitectures()) {
if (abi.startsWith("x86_64")) return "x86_64_pie";
else if (abi.startsWith("x86")) return "x86_pie";
else if (abi.startsWith("arm64")) return "arm64_pie";
else if (abi.startsWith("armeabi")) return "arm_pie";
}
if (architecture == null) {
LOG.info("Tor is not supported on this architecture");
return null;
}
// Use position-independent executable
architecture += "_pie";
return null;
}
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
MAX_POLLING_INTERVAL, BACKOFF_BASE);
TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl();
AndroidTorPlugin plugin = new AndroidTorPlugin(ioExecutor,
@Override
TorPlugin createPluginInstance(Backoff backoff,
TorRendezvousCrypto torRendezvousCrypto, PluginCallback callback,
String architecture) {
return new AndroidTorPlugin(ioExecutor,
wakefulIoExecutor, app, networkManager, locationUtils,
torSocketFactory, clock, resourceProvider,
circumventionProvider, batteryManager, wakeLockManager,
backoff, torRendezvousCrypto, callback, architecture,
MAX_LATENCY, MAX_IDLE_TIME, torDirectory);
eventBus.addListener(plugin);
return plugin;
MAX_LATENCY, MAX_IDLE_TIME, torDirectory, torSocksPort,
torControlPort);
}
}

View File

@@ -8,6 +8,7 @@ import android.content.Intent;
import android.os.Process;
import android.os.SystemClock;
import org.briarproject.bramble.api.Cancellable;
import org.briarproject.bramble.api.lifecycle.Service;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AlarmListener;
@@ -116,10 +117,12 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
long dueMillis = now + MILLISECONDS.convert(delay, unit);
Runnable wakeful = () ->
wakeLockManager.executeWakefully(task, executor, "TaskHandoff");
Future<?> check = scheduleCheckForDueTasks(delay, unit);
ScheduledTask s = new ScheduledTask(wakeful, dueMillis, check,
cancelled);
// Acquire the lock before scheduling the check to ensure the check
// doesn't access the task queue before the task has been added
ScheduledTask s;
synchronized (lock) {
Future<?> check = scheduleCheckForDueTasks(delay, unit);
s = new ScheduledTask(wakeful, dueMillis, check, cancelled);
tasks.add(s);
}
return s;
@@ -136,6 +139,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
return schedule(wrapped, executor, delay, unit, cancelled);
}
@GuardedBy("lock")
private Future<?> scheduleCheckForDueTasks(long delay, TimeUnit unit) {
Runnable wakeful = () -> wakeLockManager.runWakefully(
this::runDueTasks, "TaskScheduler");
@@ -206,7 +210,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
private final Future<?> check;
private final AtomicBoolean cancelled;
public ScheduledTask(Runnable task, long dueMillis,
private ScheduledTask(Runnable task, long dueMillis,
Future<?> check, AtomicBoolean cancelled) {
this.task = task;
this.dueMillis = dueMillis;

View File

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.os.Build;
import android.os.Looper;
import android.provider.Settings;
import org.briarproject.bramble.api.Pair;
@@ -134,4 +135,8 @@ public class AndroidUtils {
return null;
}
}
public static boolean isUiThread() {
return Looper.myLooper() == Looper.getMainLooper();
}
}

View File

@@ -9,7 +9,7 @@ import org.briarproject.bramble.api.db.DatabaseConfig;
import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.test.BrambleMockTestCase;
import org.jmock.Expectations;
import org.jmock.lib.legacy.ClassImposteriser;
import org.jmock.imposters.ByteBuddyClassImposteriser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -44,7 +44,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
private AndroidAccountManager accountManager;
public AndroidAccountManagerTest() {
context.setImposteriser(ClassImposteriser.INSTANCE);
context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
app = context.mock(Application.class);
applicationInfo = new ApplicationInfo();
applicationInfo.dataDir = testDir.getAbsolutePath();

View File

@@ -1,50 +1,51 @@
dependencyVerification {
verify = [
'androidx.annotation:annotation:1.5.0:annotation-1.5.0.jar:261fb7c0210858500bab66d34354972a75166ab4182add283780b05513d6ec4a',
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
'com.android.tools.analytics-library:protos:27.1.3:protos-27.1.3.jar:0d9e6cff60b318baac250b6f5bb076a8161103338bf2749cdf1db8a5a13a1f12',
'com.android.tools.analytics-library:shared:27.1.3:shared-27.1.3.jar:10d2a51d8f89ff4ac849888e5a9c60b10e879c30d78545ec1da4d3df7bd56ae4',
'com.android.tools.analytics-library:tracker:27.1.3:tracker-27.1.3.jar:589b355a2ba796cbc0a2b2295737de6661f078262e5f87cd6f540b8d011e5ebb',
'com.android.tools.analytics-library:protos:30.0.3:protos-30.0.3.jar:f62b89dcd9de719c6a7b7e15fb1dd20e45b57222e675cf633607bd0ed6bca7e7',
'com.android.tools.analytics-library:shared:30.0.3:shared-30.0.3.jar:05aa9ba3cc890354108521fdf99802565aae5dd6ca44a6ac8bb8d594d1c1cd15',
'com.android.tools.analytics-library:tracker:30.0.3:tracker-30.0.3.jar:5d0ef35bf6733e96210b5085a2a202152921bf834d345959dce1ca3369b528df',
'com.android.tools.build:aapt2-proto:4.1.0-alpha01-6193524:aapt2-proto-4.1.0-alpha01-6193524.jar:17e75523e1e92dd4f222c7368ee41df9e964a508232f591e265d0c499baf9dca',
'com.android.tools.build:apksig:4.1.3:apksig-4.1.3.jar:a851980c678ff7a6785388b9a9e8cc094788ce3c4a985ad2b19c2028fd3c631a',
'com.android.tools.build:apkzlib:4.1.3:apkzlib-4.1.3.jar:475903065e7e83a8c1ba78d267c97a54dc5a04d768b535093850423d7b11f2c8',
'com.android.tools.build:builder-model:4.1.3:builder-model-4.1.3.jar:2624a1436c3ab39dd91d3ecf9409a594b0f89ea5cab255f2e9ff11f5ee03d274',
'com.android.tools.build:builder-test-api:4.1.3:builder-test-api-4.1.3.jar:3d2af66726b06b53b8d6d497efcee39ff9f77eb2f8d2cce38b31502383a40d2c',
'com.android.tools.build:builder:4.1.3:builder-4.1.3.jar:a40426cd6d68f6a722ef4950058c075e4547025e8c2fd78e732ad89f15176f84',
'com.android.tools.build:gradle-api:4.1.3:gradle-api-4.1.3.jar:11b1fb9de658bdcf9290b1c1517060d0c4d93f2b27975934989ca4ac890bc077',
'com.android.tools.build:manifest-merger:27.1.3:manifest-merger-27.1.3.jar:ce8d4009b1f1584777a7ffa1da3b0551dc316bc8e08112e442c352af70f46f2d',
'com.android.tools.ddms:ddmlib:27.1.3:ddmlib-27.1.3.jar:8f76e8236d2b9eebf26378746dad025c4c7c056a02e133dae4ddef47b283c710',
'com.android.tools.external.com-intellij:intellij-core:27.1.3:intellij-core-27.1.3.jar:652814fa099b4746fb6f10e19718e476952e8b5bac24e17d914f90650ad21808',
'com.android.tools.external.com-intellij:kotlin-compiler:27.1.3:kotlin-compiler-27.1.3.jar:8d7a78d5efd213c5e467e42bd205582aad73ffc77ee5dc18eb1361c9af72f125',
'com.android.tools.external.org-jetbrains:uast:27.1.3:uast-27.1.3.jar:aea53944a1ac6a05f12297b55290e8cbecfe54c4166260cfba4405823bfe1c78',
'com.android.tools.layoutlib:layoutlib-api:27.1.3:layoutlib-api-27.1.3.jar:23875ce0a8429f33a4e86cc358f658faa0ba9c576f5f05760e544b453d67d04b',
'com.android.tools.lint:lint-api:27.1.3:lint-api-27.1.3.jar:97666be32bcadacd944416ea334a9575ef8f4ad0c8f333151491ff4a7df43e1c',
'com.android.tools.lint:lint-checks:27.1.3:lint-checks-27.1.3.jar:b2d71ae84a31490fe9ff26c706163fe245b2aea98e3eb747214c1085df444708',
'com.android.tools.lint:lint-gradle-api:27.1.3:lint-gradle-api-27.1.3.jar:e54131c287a2954e6ed78a3351e5e10e35a1da2f09ac443bf44b705c71b63a4d',
'com.android.tools.lint:lint-gradle:27.1.3:lint-gradle-27.1.3.jar:6a79e48943649d63665db7b17dbaff7af93e94ab9b15072f1a4d90486294ee9f',
'com.android.tools.lint:lint-model:27.1.3:lint-model-27.1.3.jar:acb9e792db7000e38e3c3ca21a9b14f2de6549d7a3fc92a97ffba3d06345e5bf',
'com.android.tools.lint:lint:27.1.3:lint-27.1.3.jar:5a2e69d0901a3a476a5b2d5001de755868113145f5f6aa557750cfad5389a44b',
'com.android.tools:annotations:27.1.3:annotations-27.1.3.jar:904dd771883496d5dfc86619ab2555968ea4e8a29d7a5f4f7cae6fbf5429f8f5',
'com.android.tools:common:27.1.3:common-27.1.3.jar:17ab4728e3ea50f047dd5937f0faf35f2c5416962ed74891057087ddc328bf96',
'com.android.tools:dvlib:27.1.3:dvlib-27.1.3.jar:cead1c0c356cbe43e6855b0330fe09ef4bec2c72e22bdb4c6e7cf7e6b1dfbc37',
'com.android.tools:repository:27.1.3:repository-27.1.3.jar:99de1a178855b56b8cd91a56296f1e0a9399c445e6acc51f1d2927947cc472cb',
'com.android.tools:sdk-common:27.1.3:sdk-common-27.1.3.jar:b591e2aa0f1be600795f5c9e2bf81cba9b052bee452fc86c3362b5dd9e427a14',
'com.android.tools:sdklib:27.1.3:sdklib-27.1.3.jar:ad6c08a45fe2904d05656bdddf9f623fa5c1d16bbd7b8d6a270a0734136ae02e',
'com.android:signflinger:4.1.3:signflinger-4.1.3.jar:f3103b55ccdc8dd9ee2517eb26af93b904d41303726594372d0df59d51156e5c',
'com.android:zipflinger:4.1.3:zipflinger-4.1.3.jar:48569896c0497268308a8014c66eb0f2bace2b9e2fc9390f3012823fb86387d5',
'com.android.tools.build:apksig:7.0.3:apksig-7.0.3.jar:012337a2803c9a30dfc41dcbc6450686ee9e5f582549f7f126479f743a343ec9',
'com.android.tools.build:apkzlib:7.0.3:apkzlib-7.0.3.jar:b31e53174c92db83c5cc6e7dac6734ea4e907a72e452c2bf1818dfd082c59397',
'com.android.tools.build:builder-model:7.0.3:builder-model-7.0.3.jar:483f99d7494a5bed027e1e8d29111384cf535d4842f0be5a79805bd44bb68d4e',
'com.android.tools.build:builder-test-api:7.0.3:builder-test-api-7.0.3.jar:f6de4bc2cef545e8367bf82d7c733829c7be3b0b3b8b09fd8c58f2150e59ab46',
'com.android.tools.build:builder:7.0.3:builder-7.0.3.jar:c6952da0094b094c2ba0fe84c675622097c5d9b9f9beb53485b860320540cf1d',
'com.android.tools.build:manifest-merger:30.0.3:manifest-merger-30.0.3.jar:72b346ba6318b4b6260e6e49df4bea5da2e12329ab6c2beb2269c49a9f51f178',
'com.android.tools.ddms:ddmlib:30.0.3:ddmlib-30.0.3.jar:7a914a68ab93393657297234e2f37b22410ae9a433cba692ce8c727c9607e3bb',
'com.android.tools.external.com-intellij:intellij-core:30.0.3:intellij-core-30.0.3.jar:1ebe858d3f58eeaa8c06507f8ac0f1c7051e6c61f35a70f3c3967d5734d3abc5',
'com.android.tools.external.com-intellij:kotlin-compiler:30.0.3:kotlin-compiler-30.0.3.jar:ed00e441f427cb4e0d418287b9da30b12b7f735f9af32e6b5d3dc960b6a742fc',
'com.android.tools.external.org-jetbrains:uast:30.0.3:uast-30.0.3.jar:a77801bee6ff509910e459525c9c34d7f04b066ade123547f16f1917548eadea',
'com.android.tools.layoutlib:layoutlib-api:30.0.3:layoutlib-api-30.0.3.jar:4caa87e9ca2e11315f650d576cd59fec1793373bc3fca3f6d53c029e7534e7c4',
'com.android.tools.lint:lint-api:30.0.3:lint-api-30.0.3.jar:bcecbd2f752a6560096a9029a47d1de6bd788a51bab505c5ebfba6a18524b983',
'com.android.tools.lint:lint-checks:30.0.3:lint-checks-30.0.3.jar:25a7cd42dc3ad502337f131fb8b7e873c53301db0a67b1c64dd4ae7a8eb66cec',
'com.android.tools.lint:lint-gradle:30.0.3:lint-gradle-30.0.3.jar:94544d6147a809bf2fd3440e51f28a4e42e547d74aab53eefd74938cdad42c26',
'com.android.tools.lint:lint-model:30.0.3:lint-model-30.0.3.jar:0b940a7f575c2ff5cbd038260f41dde686a93c672213881ead3ce8af3513b396',
'com.android.tools.lint:lint:30.0.3:lint-30.0.3.jar:ee4f11001e0c7e3b776e0d67399ad354b19b0f168822ec2b7db47c0910ed227d',
'com.android.tools:annotations:30.0.3:annotations-30.0.3.jar:5c1944982fda8555855c4f5422fabf0dc8e2306e1f5460e9ad82dae71316bc31',
'com.android.tools:common:30.0.3:common-30.0.3.jar:8751efaaf2c2ddd1f0a37526c794347def6a3057ca9fc510307c13a6cf0d036f',
'com.android.tools:dvlib:30.0.3:dvlib-30.0.3.jar:5affafcec390041e5afd64cb924153f5e474db47ee8ccc2f555b495083141233',
'com.android.tools:repository:30.0.3:repository-30.0.3.jar:0a40c6f16c506903ce2c609affd8228aceda73a69d93dfa42d4f02b8491449f6',
'com.android.tools:sdk-common:30.0.3:sdk-common-30.0.3.jar:b45570a380360236ffee0f6bb593d66b673bad3834dfe0d6c9871fa7188ee0eb',
'com.android.tools:sdklib:30.0.3:sdklib-30.0.3.jar:7088f20a414fab170a21e457825e14ebe099f753558e02c8acc12c67eb412162',
'com.android:signflinger:7.0.3:signflinger-7.0.3.jar:903a4536db3e96b4e1e1dc1e400eb0b91bf7866d9b39cd7ec94d75dde158f152',
'com.android:zipflinger:7.0.3:zipflinger-7.0.3.jar:fd209c960a3eff7a339e6fcba07d5e9ef4604d1633c69ab2df987460d9804140',
'com.beust:jcommander:1.78:jcommander-1.78.jar:7891debb84b5f83e9bd57593ebece3399abbe0fd938cf306b3534c57913b9615',
'com.github.javaparser:javaparser-core:3.17.0:javaparser-core-3.17.0.jar:23f5c982e1c7771423d37d52c774e8d2e80fd7ea7305ebe448797a96f67e6fca',
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
'com.google.code.gson:gson:2.8.5:gson-2.8.5.jar:233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81',
'com.google.code.gson:gson:2.8.6:gson-2.8.6.jar:c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f',
'com.google.dagger:dagger-compiler:2.33:dagger-compiler-2.33.jar:aa8a0d8370c578fd6999802d0d90b9829377a46d2c1141e11b8f737970e7155e',
'com.google.dagger:dagger-producers:2.33:dagger-producers-2.33.jar:5897f0b6eef799c2adfe3ccacc58c0fb374d58acb063c3ebe5366c38a8bce5c8',
'com.google.dagger:dagger-spi:2.33:dagger-spi-2.33.jar:e2dcab2221b8afb9556ef0a1c83b0bd5f42552e254322a257330f754cdbbb9d4',
'com.google.dagger:dagger:2.33:dagger-2.33.jar:d8798c5b8cf6b125234e33af5c6293bb9f2208ce29b57924c35b8c0be7b6bdcb',
'com.google.errorprone:error_prone_annotations:2.2.0:error_prone_annotations-2.2.0.jar:6ebd22ca1b9d8ec06d41de8d64e0596981d9607b42035f9ed374f9de271a481a',
'com.google.errorprone:error_prone_annotations:2.3.2:error_prone_annotations-2.3.2.jar:357cd6cfb067c969226c442451502aee13800a24e950fdfde77bcdb4565a668d',
'com.google.errorprone:error_prone_annotations:2.3.4:error_prone_annotations-2.3.4.jar:baf7d6ea97ce606c53e11b6854ba5f2ce7ef5c24dddf0afa18d1260bd25b002c',
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30',
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
'com.google.guava:failureaccess:1.0.1:failureaccess-1.0.1.jar:a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26',
'com.google.guava:guava:27.1-jre:guava-27.1-jre.jar:4a5aa70cc968a4d137e599ad37553e5cfeed2265e8c193476d7119036c536fe7',
'com.google.guava:guava:28.1-jre:guava-28.1-jre.jar:30beb8b8527bd07c6e747e77f1a92122c2f29d57ce347461a4a55eb26e382da4',
'com.google.guava:guava:30.1-jre:guava-30.1-jre.jar:e6dd072f9d3fe02a4600688380bd422bdac184caf6fe2418cfdd0934f09432aa',
'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava:listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99',
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6',
'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
@@ -54,63 +55,111 @@ dependencyVerification {
'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
'com.squareup:javawriter:2.5.0:javawriter-2.5.0.jar:fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0',
'com.sun.activation:javax.activation:1.2.0:javax.activation-1.2.0.jar:993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce',
'com.sun.istack:istack-commons-runtime:3.0.7:istack-commons-runtime-3.0.7.jar:6443e10ba2e259fb821d9b6becf10db5316285fc30c53cec9d7b19a3877e7fdf',
'com.sun.xml.fastinfoset:FastInfoset:1.2.15:FastInfoset-1.2.15.jar:785861db11ca1bd0d1956682b974ad73eb19cd3e01a4b3fa82d62eca97210aec',
'com.sun.istack:istack-commons-runtime:3.0.8:istack-commons-runtime-3.0.8.jar:4ffabb06be454a05e4398e20c77fa2b6308d4b88dfbef7ca30a76b5b7d5505ef',
'com.sun.xml.fastinfoset:FastInfoset:1.2.16:FastInfoset-1.2.16.jar:056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511',
'com.thoughtworks.qdox:qdox:1.12.1:qdox-1.12.1.jar:21fba22f830e9268f07cf4ab2d99e8181abbdcb0cb91ee0228eb3cb918dcdd1d',
'commons-codec:commons-codec:1.10:commons-codec-1.10.jar:4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569',
'commons-io:commons-io:2.4:commons-io-2.4.jar:cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581',
'commons-logging:commons-logging:1.2:commons-logging-1.2.jar:daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636',
'it.unimi.dsi:fastutil:7.2.0:fastutil-7.2.0.jar:74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c',
'javax.activation:javax.activation-api:1.2.0:javax.activation-api-1.2.0.jar:43fdef0b5b6ceb31b0424b208b930c74ab58fac2ceeb7b3f6fd3aeb8b5ca4393',
'info.picocli:picocli:4.5.2:picocli-4.5.2.jar:b4395e9a67932616efd2245d984bf5fcd453c2c5049558c3ce959ac2af4d3fac',
'it.unimi.dsi:fastutil:8.4.0:fastutil-8.4.0.jar:2ad2824a4a0a0eb836b52ee2fc84ba2134f44bce7bfa54015ae3f31c710a3071',
'jakarta.activation:jakarta.activation-api:1.2.1:jakarta.activation-api-1.2.1.jar:8b0a0f52fa8b05c5431921a063ed866efaa41dadf2e3a7ee3e1961f2b0d9645b',
'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2:jakarta.xml.bind-api-2.3.2.jar:69156304079bdeed9fc0ae3b39389f19b3cc4ba4443bc80508995394ead742ea',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'javax.xml.bind:jaxb-api:2.3.1:jaxb-api-2.3.1.jar:88b955a0df57880a26a74708bc34f74dcaf8ebf4e78843a28b50eae945732b06',
'jline:jline:2.14.6:jline-2.14.6.jar:97d1acaac82409be42e622d7a54d3ae9d08517e8aefdea3d2ba9791150c2f02d',
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
'net.java.dev.jna:jna-platform:5.6.0:jna-platform-5.6.0.jar:9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7',
'net.java.dev.jna:jna:5.6.0:jna-5.6.0.jar:5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf',
'net.jcip:jcip-annotations:1.0:jcip-annotations-1.0.jar:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5',
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2',
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
'org.apache.commons:commons-compress:1.12:commons-compress-1.12.jar:2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6',
'org.apache.ant:ant-antlr:1.10.9:ant-antlr-1.10.9.jar:7623dc9d0f20ea713290c6bf1a23f4c059447aef7ff9f5b2be75960f3f028d2e',
'org.apache.ant:ant-junit:1.10.9:ant-junit-1.10.9.jar:960bdc8827954d62206ba42d0a68a7ee4476175ba47bb113e17e77cce7394630',
'org.apache.ant:ant-launcher:1.10.9:ant-launcher-1.10.9.jar:fcce891f57f3be72149ff96ac2a80574165b3e0839866b95d24528f3027d50c1',
'org.apache.ant:ant:1.10.9:ant-1.10.9.jar:0715478af585ea80a18985613ebecdc7922122d45b2c3c970ff9b352cddb75fc',
'org.apache.commons:commons-compress:1.20:commons-compress-1.20.jar:0aeb625c948c697ea7b205156e112363b59ed5e2551212cd4e460bdb72c7c06e',
'org.apache.httpcomponents:httpclient:4.5.6:httpclient-4.5.6.jar:c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7',
'org.apache.httpcomponents:httpcore:4.4.10:httpcore-4.4.10.jar:78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd',
'org.apache.httpcomponents:httpmime:4.5.6:httpmime-4.5.6.jar:0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e',
'org.bouncycastle:bcpkix-jdk15on:1.56:bcpkix-jdk15on-1.56.jar:7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca',
'org.bouncycastle:bcprov-jdk15on:1.56:bcprov-jdk15on-1.56.jar:963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349',
'org.briarproject:obfs4proxy-android:0.0.12-dev-40245c4a:obfs4proxy-android-0.0.12-dev-40245c4a.zip:8ab05a8f8391be2cb5ab2b665c281a06d9e3a756bd0f95a40a36ca927866ea82',
'org.briarproject:tor-android:0.3.5.15:tor-android-0.3.5.15.jar:560c5070166300b396cb2f28d82d9f639ee1fb5479096a3cef67da56d39937ad',
'org.briarproject:obfs4proxy-android:0.0.14:obfs4proxy-android-0.0.14.jar:ad9b1ee4757b05867a19e993147bbb018bddd1f26ce3da746d5f037d5991a8c8',
'org.briarproject:snowflake-android:2.3.1:snowflake-android-2.3.1.jar:1f83c9a070f87b7074af13627709a8b5aced5460104be7166af736b1bb73c293',
'org.briarproject:tor-android:0.4.5.14:tor-android-0.4.5.14.jar:7cf1beaa6c1db51fc8fac263aba9624ef289c3db29772509efcbc59f7057330a',
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d',
'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a',
'org.checkerframework:checker-qual:2.8.1:checker-qual-2.8.1.jar:9103499008bcecd4e948da29b17864abb64304e15706444ae209d17ebe0575df',
'org.codehaus.groovy:groovy-all:2.4.15:groovy-all-2.4.15.jar:51d6c4e71782e85674239189499854359d380fb75e1a703756e3aaa5b98a5af0',
'org.checkerframework:checker-qual:3.5.0:checker-qual-3.5.0.jar:729990b3f18a95606fc2573836b6958bcdb44cb52bfbd1b7aa9c339cff35a5a4',
'org.codehaus.groovy:groovy-ant:3.0.7:groovy-ant-3.0.7.jar:6ed2ba82813d128f7050c24142e87b3dc2ad8b504786280eb03e81f0cf6a5793',
'org.codehaus.groovy:groovy-astbuilder:3.0.7:groovy-astbuilder-3.0.7.jar:b290451eb1583666e906c41f7d14747b4cc96363c99c478b244634fd5dfc9013',
'org.codehaus.groovy:groovy-cli-picocli:3.0.7:groovy-cli-picocli-3.0.7.jar:71b4bd11fb30a9c7b5618e22122c9c5141958fb27f4dcf0068b6f715088f6916',
'org.codehaus.groovy:groovy-console:3.0.7:groovy-console-3.0.7.jar:0541b358b6b8e5363215026736168fccfec1d91bac678d066fa77349eeeaa5dd',
'org.codehaus.groovy:groovy-datetime:3.0.7:groovy-datetime-3.0.7.jar:b9823d14b1a4f94236ae2f8a471701aab17e093e1b33402b91550b5c8dd88f04',
'org.codehaus.groovy:groovy-docgenerator:3.0.7:groovy-docgenerator-3.0.7.jar:bf53f7a11c9eb1e278e1b8ed2714c741bcf781235c803ad3ba1555f2614573f3',
'org.codehaus.groovy:groovy-groovydoc:3.0.7:groovy-groovydoc-3.0.7.jar:86b24dfc23c005066ab83927cdb54177f06c9531773f2e2d2ecc9a131f7c2677',
'org.codehaus.groovy:groovy-groovysh:3.0.7:groovy-groovysh-3.0.7.jar:5c40e78cbc09726aedd1c75fab112d245d665d6294870f9119e6cd3013ed14ab',
'org.codehaus.groovy:groovy-jmx:3.0.7:groovy-jmx-3.0.7.jar:0a89f3007884eb156751937d93382038b83d39c7c2f0ab156ebf251a7251f2ab',
'org.codehaus.groovy:groovy-json:3.0.7:groovy-json-3.0.7.jar:df1f0ee475e3fc93a6a0d17548294e160cca5de6d9d36817a7be1fbe650de03b',
'org.codehaus.groovy:groovy-jsr223:3.0.7:groovy-jsr223-3.0.7.jar:1dbd969595332416193baa660fbb45743d19696eaa25fe98e591a2739e13517e',
'org.codehaus.groovy:groovy-macro:3.0.7:groovy-macro-3.0.7.jar:c6cc06df526b39e2c359e2435f0071594c5a1c7babafaa6c184fdd8fa931531f',
'org.codehaus.groovy:groovy-nio:3.0.7:groovy-nio-3.0.7.jar:db54c577882b294cd8c975ec5451596441baf54781319c61627dca0e0c2361ef',
'org.codehaus.groovy:groovy-servlet:3.0.7:groovy-servlet-3.0.7.jar:5b6a909bf501c209adfb6205b9e740649609074455fd979bf9da4853e6ff9a39',
'org.codehaus.groovy:groovy-sql:3.0.7:groovy-sql-3.0.7.jar:252bb6c74e1a9f41756ad4fbd3b0d2eddc93bb61109961dd1952a37bf2d57a64',
'org.codehaus.groovy:groovy-swing:3.0.7:groovy-swing-3.0.7.jar:bd942032d9328d54c6679c49a41f6caa0d4a0039ebe598493b8a647730d98cff',
'org.codehaus.groovy:groovy-templates:3.0.7:groovy-templates-3.0.7.jar:f119e07f650ef186ae5a4b944f9e30915b14311bad47c94a6b32de8d4f69bc80',
'org.codehaus.groovy:groovy-test-junit5:3.0.7:groovy-test-junit5-3.0.7.jar:c16eeea07b8e396891e266d7ba9388b24ac804237ffdd9a792b0d08969bad014',
'org.codehaus.groovy:groovy-test:3.0.7:groovy-test-3.0.7.jar:f71afd7c25d43017f89ea47e6de6daec971d159047dae083c1513a8422d44b90',
'org.codehaus.groovy:groovy-testng:3.0.7:groovy-testng-3.0.7.jar:713d5f2231bbb5712aefd362151b9ffd884aeb7ef2e773315cc54259cbdd063d',
'org.codehaus.groovy:groovy-xml:3.0.7:groovy-xml-3.0.7.jar:8a62e7c9ddece3e82676c4bef2f2c100f459602cd1fb6a14e94187bf863e97ff',
'org.codehaus.groovy:groovy:3.0.7:groovy-3.0.7.jar:51d1777e8dd1f00e60ea56e00d8a354ff5aab1f00fc8464ae8d39d71867e401f',
'org.codehaus.mojo:animal-sniffer-annotations:1.17:animal-sniffer-annotations-1.17.jar:92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53',
'org.codehaus.mojo:animal-sniffer-annotations:1.18:animal-sniffer-annotations-1.18.jar:47f05852b48ee9baefef80fa3d8cea60efa4753c0013121dd7fe5eef2e5c729d',
'org.glassfish.jaxb:jaxb-runtime:2.3.1:jaxb-runtime-2.3.1.jar:45fecfa5c8217ce1f3652ab95179790ec8cc0dec0384bca51cbeb94a293d9f2f',
'org.glassfish.jaxb:txw2:2.3.1:txw2-2.3.1.jar:34975dde1c6920f1a39791142235689bc3cd357e24d05edd8ff93b885bd68d60',
'org.glassfish.jaxb:jaxb-runtime:2.3.2:jaxb-runtime-2.3.2.jar:e6e0a1e89fb6ff786279e6a0082d5cef52dc2ebe67053d041800737652b4fd1b',
'org.glassfish.jaxb:txw2:2.3.2:txw2-2.3.2.jar:4a6a9f483388d461b81aa9a28c685b8b74c0597993bf1884b04eddbca95f48fe',
'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9',
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
'org.jetbrains.kotlin:kotlin-reflect:1.3.72:kotlin-reflect-1.3.72.jar:a188d9367de1c4ee9479db630985c0597b20709c83161b1430d24edb27e38c40',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72:kotlin-stdlib-common-1.3.72.jar:5e7d1552863e480c1628b1cc39ce230ef829f5b7230106215a05acda5172203a',
'org.jacoco:org.jacoco.agent:0.8.3:org.jacoco.agent-0.8.3.jar:522deb254ee16a04cc8341cc8f335f5cb7232982994d961b9cf3a0454709209f',
'org.jacoco:org.jacoco.ant:0.8.3:org.jacoco.ant-0.8.3.jar:735844e1ae15f9b875b42a27ac5cb61cc26e106d9e839e5d1c6756709b424ce0',
'org.jacoco:org.jacoco.core:0.8.3:org.jacoco.core-0.8.3.jar:0818437bc060a0c7cc798148f22b713702aae2771aba104444407697d578f1ea',
'org.jacoco:org.jacoco.report:0.8.3:org.jacoco.report-0.8.3.jar:aae08fa4ff043c807b8876cdb2d8705eb8449a55efce461baa6c09da245088c1',
'org.jetbrains.intellij.deps:trove4j:1.0.20181211:trove4j-1.0.20181211.jar:affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601',
'org.jetbrains.kotlin:kotlin-reflect:1.4.32:kotlin-reflect-1.4.32.jar:dbf19e9cdaa9c3c170f3f6f6ce3922f38dfc1d7fa1cab5b7c23a19da8b5eec5b',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.20:kotlin-stdlib-common-1.4.20.jar:a7112c9b3cefee418286c9c9372f7af992bd1e6e030691d52f60cb36dbec8320',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72:kotlin-stdlib-jdk7-1.3.72.jar:40566c0c08d414b9413ba556ff7f8a0b04b98b9f0f424d122dd2088510efccc4',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72:kotlin-stdlib-jdk8-1.3.72.jar:133da70cfc07b56094282eac5c59bccd59f167ee2ead22e5282876d8bc10bf95',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.72:kotlin-stdlib-1.3.72.jar:3856a7349ebacd6d1be6802b2fed9c4dc2c5a564ea92b6b945ac988243d4b16b',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32:kotlin-stdlib-common-1.4.32.jar:e1ff6f55ee9e7591dcc633f7757bac25a7edb1cc7f738b37ec652f10f66a4145',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10:kotlin-stdlib-common-1.7.10.jar:19f102efe9629f8eabc63853ad15c533e47c47f91fca09285c5bde86e59f91d4',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.32:kotlin-stdlib-jdk7-1.4.32.jar:5f801e75ca27d8791c14b07943c608da27620d910a8093022af57f543d5d98b6',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32:kotlin-stdlib-jdk8-1.4.32.jar:adc43e54757b106e0cd7b3b7aa257dff471b61efdabe067fc02b2f57e2396262',
'org.jetbrains.kotlin:kotlin-stdlib:1.4.20:kotlin-stdlib-1.4.20.jar:b8ab1da5cdc89cb084d41e1f28f20a42bd431538642a5741c52bbfae3fa3e656',
'org.jetbrains.kotlin:kotlin-stdlib:1.4.32:kotlin-stdlib-1.4.32.jar:13e9fd3e69dc7230ce0fc873a92a4e5d521d179bcf1bef75a6705baac3bfecba',
'org.jetbrains.kotlin:kotlin-stdlib:1.7.10:kotlin-stdlib-1.7.10.jar:e771fe74250a943e8f6346713201ff1d8cb95c3a5d1a91a22b65a9e04f6a8901',
'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0:kotlinx-metadata-jvm-0.1.0.jar:9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5',
'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
'org.jvnet.staxex:stax-ex:1.8:stax-ex-1.8.jar:95b05d9590af4154c6513b9c5dc1fb2e55b539972ba0a9ef28e9a0c01d83ad77',
'org.junit.jupiter:junit-jupiter-api:5.7.0:junit-jupiter-api-5.7.0.jar:b03f78e0daeed2d77a0af9bcd662b4cdb9693f7ee72e01a539b508b84c63d182',
'org.junit.jupiter:junit-jupiter-engine:5.7.0:junit-jupiter-engine-5.7.0.jar:dfa26af94644ac2612dde6625852fcb550a0d21caa243257de54cba738ba87af',
'org.junit.platform:junit-platform-commons:1.7.0:junit-platform-commons-1.7.0.jar:5330ee87cc7586e6e25175a34e9251624ff12ff525269d3415d0b4ca519b6fea',
'org.junit.platform:junit-platform-engine:1.7.0:junit-platform-engine-1.7.0.jar:75f21a20dc594afdc875736725b408cec6d0344874d29f34b2dd3075500236f2',
'org.junit.platform:junit-platform-launcher:1.7.0:junit-platform-launcher-1.7.0.jar:fbdc748fde4c4279fe1d3c607447cb3b7ccd45d7338fc574f8a894ddf2d16818',
'org.jvnet.staxex:stax-ex:1.8.1:stax-ex-1.8.1.jar:20522549056e9e50aa35ef0b445a2e47a53d06be0b0a9467d704e2483ffb049a',
'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
'org.opentest4j:opentest4j:1.2.0:opentest4j-1.2.0.jar:58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2',
'org.ow2.asm:asm-analysis:7.0:asm-analysis-7.0.jar:e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474',
'org.ow2.asm:asm-commons:7.0:asm-commons-7.0.jar:fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d',
'org.ow2.asm:asm-tree:7.0:asm-tree-7.0.jar:cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c',
'org.ow2.asm:asm-util:7.0:asm-util-7.0.jar:75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145',
'org.ow2.asm:asm:7.0:asm-7.0.jar:b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf',
'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
'org.testng:testng:7.3.0:testng-7.3.0.jar:63727488f9717d57f0d0a0fee5a1fc10a2be9cfcff2ec3a7187656d663c0774e',
'xerces:xercesImpl:2.12.0:xercesImpl-2.12.0.jar:b50d3a4ca502faa4d1c838acb8aa9480446953421f7327e338c5dda3da5e76d0',
'xml-apis:xml-apis:1.4.01:xml-apis-1.4.01.jar:a840968176645684bb01aed376e067ab39614885f9eee44abe35a5f20ebe7fad',
]
}

View File

@@ -9,11 +9,11 @@ apply from: 'witness.gradle'
dependencies {
implementation "com.google.dagger:dagger:$dagger_version"
implementation 'com.google.code.findbugs:jsr305:3.0.2'
implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version"
testImplementation "junit:junit:$junit_version"
testImplementation "org.jmock:jmock:$jmock_version"
testImplementation "org.jmock:jmock-junit4:$jmock_version"
testImplementation "org.jmock:jmock-legacy:$jmock_version"
signature 'org.codehaus.mojo.signature:java16:1.1@signature'
}

View File

@@ -0,0 +1,6 @@
package org.briarproject.bramble.api;
public interface Cancellable {
void cancel();
}

View File

@@ -11,9 +11,11 @@ public interface FeatureFlags {
boolean shouldEnableDisappearingMessages();
boolean shouldEnableConnectViaBluetooth();
boolean shouldEnableMailbox();
boolean shouldEnableTransferData();
boolean shouldEnablePrivateGroupsInCore();
boolean shouldEnableShareAppViaOfflineHotspot();
boolean shouldEnableForumsInCore();
boolean shouldEnableBlogsInCore();
}

View File

@@ -1,8 +1,14 @@
package org.briarproject.bramble.api;
import org.briarproject.bramble.util.StringUtils;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
public abstract class StringMap extends Hashtable<String, String> {
protected StringMap(Map<String, String> m) {
@@ -52,4 +58,31 @@ public abstract class StringMap extends Hashtable<String, String> {
public void putLong(String key, long value) {
put(key, String.valueOf(value));
}
@Nullable
public int[] getIntArray(String key) {
String s = get(key);
if (s == null) return null;
// Handle empty string because "".split(",") returns {""}
if (s.length() == 0) return new int[0];
String[] intStrings = s.split(",");
int[] ints = new int[intStrings.length];
try {
for (int i = 0; i < ints.length; i++) {
ints[i] = Integer.parseInt(intStrings[i]);
}
} catch (NumberFormatException e) {
return null;
}
return ints;
}
public void putIntArray(String key, int[] value) {
List<String> intStrings = new ArrayList<>();
for (int integer : value) {
intStrings.add(String.valueOf(integer));
}
// Puts empty string if input array value is empty
put(key, StringUtils.join(intStrings, ","));
}
}

View File

@@ -6,14 +6,14 @@ import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe
@NotNullByDefault
public abstract class UniqueId extends Bytes {
public class UniqueId extends Bytes {
/**
* The length of a unique identifier in bytes.
*/
public static final int LENGTH = 32;
protected UniqueId(byte[] id) {
public UniqueId(byte[] id) {
super(id);
if (id.length != LENGTH) throw new IllegalArgumentException();
}

View File

@@ -0,0 +1,35 @@
package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.lang.ref.WeakReference;
import javax.annotation.concurrent.GuardedBy;
import javax.inject.Provider;
/**
* A {@link Provider} that keeps a {@link WeakReference} to the last provided
* instance and provides the same instance again until the instance is garbage
* collected.
*/
@NotNullByDefault
public abstract class WeakSingletonProvider<T> implements Provider<T> {
private final Object lock = new Object();
@GuardedBy("lock")
private WeakReference<T> ref = new WeakReference<>(null);
@Override
public T get() {
synchronized (lock) {
T instance = ref.get();
if (instance == null) {
instance = createInstance();
ref = new WeakReference<>(instance);
}
return instance;
}
}
public abstract T createInstance();
}

View File

@@ -9,6 +9,8 @@ import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
import org.briarproject.bramble.api.mailbox.MailboxVersion;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.properties.TransportProperties;
@@ -18,6 +20,7 @@ import org.briarproject.bramble.api.sync.MessageId;
import java.security.GeneralSecurityException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@NotNullByDefault
@@ -123,12 +126,25 @@ public interface ClientHelper {
Map<TransportId, TransportProperties> parseAndValidateTransportPropertiesMap(
BdfDictionary properties) throws FormatException;
/**
* Parse and validate the elements of a Mailbox update message.
*
* @return the parsed update message
* @throws FormatException if the message elements are invalid
*/
MailboxUpdate parseAndValidateMailboxUpdate(BdfList clientSupports,
BdfList serverSupports, BdfDictionary properties)
throws FormatException;
List<MailboxVersion> parseMailboxVersionList(BdfList bdfList)
throws FormatException;
/**
* Retrieves the contact ID from the group metadata of the given contact
* group.
*/
ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException, FormatException;
throws DbException;
/**
* Stores the given contact ID in the group metadata of the given contact

View File

@@ -7,6 +7,7 @@ import org.briarproject.bramble.api.plugin.TransportConnectionReader;
import org.briarproject.bramble.api.plugin.TransportConnectionWriter;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
import org.briarproject.bramble.api.sync.OutgoingSessionRecord;
@NotNullByDefault
public interface ConnectionManager {
@@ -16,6 +17,17 @@ public interface ConnectionManager {
*/
void manageIncomingConnection(TransportId t, TransportConnectionReader r);
/**
* Manages an incoming connection from a contact via a mailbox.
* <p>
* This method does not mark the tag as recognised until after the data
* has been read from the {@link TransportConnectionReader}, at which
* point the {@link TagController} is called to decide whether the tag
* should be marked as recognised.
*/
void manageIncomingConnection(TransportId t, TransportConnectionReader r,
TagController c);
/**
* Manages an incoming connection from a contact over a duplex transport.
*/
@@ -34,6 +46,14 @@ public interface ConnectionManager {
void manageOutgoingConnection(ContactId c, TransportId t,
TransportConnectionWriter w);
/**
* Manages an outgoing connection to a contact via a mailbox. The IDs of
* any messages sent or acked are added to the given
* {@link OutgoingSessionRecord}.
*/
void manageOutgoingConnection(ContactId c, TransportId t,
TransportConnectionWriter w, OutgoingSessionRecord sessionRecord);
/**
* Manages an outgoing connection to a contact over a duplex transport.
*/
@@ -46,4 +66,21 @@ public interface ConnectionManager {
*/
void manageOutgoingConnection(PendingContactId p, TransportId t,
DuplexTransportConnection d);
/**
* An interface for controlling whether a tag should be marked as
* recognised.
*/
interface TagController {
/**
* This method is only called if a tag was read from the corresponding
* {@link TransportConnectionReader} and recognised.
*
* @param exception True if an exception was thrown while reading from
* the {@link TransportConnectionReader}, after successfully reading
* and recognising the tag.
* @return True if the tag should be marked as recognised.
*/
boolean shouldMarkTagAsRecognised(boolean exception);
}
}

View File

@@ -107,6 +107,32 @@ public interface ContactManager {
*/
String getHandshakeLink() throws DbException;
/**
* Returns the handshake link that needs to be sent to a contact we want
* to add.
*/
String getHandshakeLink(Transaction txn) throws DbException;
/**
* Creates a {@link PendingContact} from the given handshake link and
* alias, adds it to the database and returns it.
*
* @param link The handshake link received from the pending contact
* @param alias The alias the user has given this pending contact
* @throws UnsupportedVersionException If the link uses a format version
* that is not supported
* @throws FormatException If the link is invalid
* @throws GeneralSecurityException If the pending contact's handshake
* public key is invalid
* @throws ContactExistsException If a contact with the same handshake
* public key already exists
* @throws PendingContactExistsException If a pending contact with the same
* handshake public key already exists
*/
PendingContact addPendingContact(Transaction txn, String link, String alias)
throws DbException, FormatException, GeneralSecurityException,
ContactExistsException, PendingContactExistsException;
/**
* Creates a {@link PendingContact} from the given handshake link and
* alias, adds it to the database and returns it.
@@ -140,11 +166,24 @@ public interface ContactManager {
Collection<Pair<PendingContact, PendingContactState>> getPendingContacts()
throws DbException;
/**
* Returns a list of {@link PendingContact PendingContacts} and their
* {@link PendingContactState states}.
*/
Collection<Pair<PendingContact, PendingContactState>> getPendingContacts(Transaction txn)
throws DbException;
/**
* Removes a {@link PendingContact}.
*/
void removePendingContact(PendingContactId p) throws DbException;
/**
* Removes a {@link PendingContact}.
*/
void removePendingContact(Transaction txn, PendingContactId p)
throws DbException;
/**
* Returns the contact with the given ID.
*/

View File

@@ -3,7 +3,6 @@ package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.UniqueId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
/**
@@ -17,9 +16,4 @@ public class PendingContactId extends UniqueId {
public PendingContactId(byte[] id) {
super(id);
}
@Override
public boolean equals(@Nullable Object o) {
return o instanceof PendingContactId && super.equals(o);
}
}

View File

@@ -1,5 +1,6 @@
package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.UniqueId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.security.GeneralSecurityException;
@@ -10,6 +11,8 @@ import javax.annotation.Nullable;
@NotNullByDefault
public interface CryptoComponent {
UniqueId generateUniqueId();
SecretKey generateSecretKey();
SecureRandom getSecureRandom();
@@ -170,4 +173,13 @@ public interface CryptoComponent {
* length. The line terminator is CRLF.
*/
String asciiArmour(byte[] b, int lineLength);
/**
* Encode the Onion given its public key. Specified here:
* https://gitweb.torproject.org/torspec.git/tree/rend-spec-v3.txt?id=29245fd5#n2135
*
* @return the encoded onion, base32 chars
*/
String encodeOnion(byte[] publicKey);
}

View File

@@ -33,11 +33,18 @@ import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
/**
* Encapsulates the database implementation and exposes high-level operations
* to other components.
* <p>
* With the exception of the {@link #open(SecretKey, MigrationListener)} and
* {@link #close()} methods, which must not be called concurrently, the
* database can be accessed from any thread. See {@link TransactionManager}
* for locking behaviour.
*/
@ThreadSafe
@NotNullByDefault
public interface DatabaseComponent extends TransactionManager {
@@ -119,16 +126,11 @@ public interface DatabaseComponent extends TransactionManager {
TransportKeys k) throws DbException;
/**
* Returns true if there are any acks or messages to send to the given
* contact over a transport with the given maximum latency.
* Returns true if there are any acks to send to the given contact.
* <p/>
* Read-only.
*
* @param eager True if messages that are not yet due for retransmission
* should be included
*/
boolean containsAnythingToSend(Transaction txn, ContactId c,
long maxLatency, boolean eager) throws DbException;
boolean containsAcksToSend(Transaction txn, ContactId c) throws DbException;
/**
* Returns true if the database contains the given contact for the given
@@ -154,6 +156,18 @@ public interface DatabaseComponent extends TransactionManager {
*/
boolean containsIdentity(Transaction txn, AuthorId a) throws DbException;
/**
* Returns true if there are any messages to send to the given contact
* over a transport with the given maximum latency.
* <p/>
* Read-only.
*
* @param eager True if messages that are not yet due for retransmission
* should be included
*/
boolean containsMessagesToSend(Transaction txn, ContactId c,
long maxLatency, boolean eager) throws DbException;
/**
* Returns true if the database contains the given pending contact.
* <p/>
@@ -193,26 +207,15 @@ public interface DatabaseComponent extends TransactionManager {
throws DbException;
/**
* Returns a batch of messages for the given contact, with a total length
* less than or equal to the given length, for transmission over a
* transport with the given maximum latency. Returns null if there are no
* sendable messages that fit in the given length.
* Returns a batch of messages for the given contact, for transmission over
* a transport with the given maximum latency. The total length of the
* messages, including record headers, will be no more than the given
* capacity. Returns null if there are no sendable messages that would fit
* in the given capacity.
*/
@Nullable
Collection<Message> generateBatch(Transaction txn, ContactId c,
int maxLength, long maxLatency) throws DbException;
/**
* Returns a batch of messages for the given contact containing the
* messages with the given IDs, for transmission over a transport with
* the given maximum latency.
* <p/>
* If any of the given messages are not in the database or are not visible
* to the contact, they are omitted from the batch without throwing an
* exception.
*/
Collection<Message> generateBatch(Transaction txn, ContactId c,
Collection<MessageId> ids, long maxLatency) throws DbException;
long capacity, long maxLatency) throws DbException;
/**
* Returns an offer for the given contact for transmission over a
@@ -232,15 +235,16 @@ public interface DatabaseComponent extends TransactionManager {
throws DbException;
/**
* Returns a batch of messages for the given contact, with a total length
* less than or equal to the given length, for transmission over a
* transport with the given maximum latency. Only messages that have been
* requested by the contact are returned. Returns null if there are no
* sendable messages that fit in the given length.
* Returns a batch of messages for the given contact, for transmission over
* a transport with the given maximum latency. Only messages that have been
* requested by the contact are returned. The total length of the messages,
* including record headers, will be no more than the given capacity.
* Returns null if there are no sendable messages that have been requested
* by the contact and would fit in the given capacity.
*/
@Nullable
Collection<Message> generateRequestedBatch(Transaction txn, ContactId c,
int maxLength, long maxLatency) throws DbException;
long capacity, long maxLatency) throws DbException;
/**
* Returns the contact with the given ID.
@@ -279,6 +283,13 @@ public interface DatabaseComponent extends TransactionManager {
*/
Group getGroup(Transaction txn, GroupId g) throws DbException;
/**
* Returns the ID of the group containing the given message.
* <p/>
* Read-only.
*/
GroupId getGroupId(Transaction txn, MessageId m) throws DbException;
/**
* Returns the metadata for the given group.
* <p/>
@@ -344,6 +355,30 @@ public interface DatabaseComponent extends TransactionManager {
Collection<MessageId> getMessageIds(Transaction txn, GroupId g,
Metadata query) throws DbException;
/**
* Returns the IDs of all messages received from the given contact that
* need to be acknowledged.
* <p/>
* Read-only.
*/
Collection<MessageId> getMessagesToAck(Transaction txn, ContactId c)
throws DbException;
/**
* Returns the IDs of some messages that are eligible to be sent to the
* given contact over a transport with the given maximum latency. The total
* length of the messages including record headers will be no more than the
* given capacity.
* <p/>
* Unlike {@link #getUnackedMessagesToSend(Transaction, ContactId)} this
* method does not return messages that have already been sent unless they
* are due for retransmission.
* <p/>
* Read-only.
*/
Collection<MessageId> getMessagesToSend(Transaction txn, ContactId c,
long capacity, long maxLatency) throws DbException;
/**
* Returns the IDs of any messages that need to be validated.
* <p/>
@@ -460,17 +495,42 @@ public interface DatabaseComponent extends TransactionManager {
MessageStatus getMessageStatus(Transaction txn, ContactId c, MessageId m)
throws DbException;
/**
* Returns the message with the given ID for transmission to the given
* contact over a transport with the given maximum latency. Returns null
* if the message is no longer visible to the contact.
* <p/>
* Read-only if {@code markAsSent} is false.
*
* @param markAsSent True if the message should be marked as sent.
* If false it can be marked as sent by calling
* {@link #setMessagesSent(Transaction, ContactId, Collection, long)}.
*/
@Nullable
Message getMessageToSend(Transaction txn, ContactId c, MessageId m,
long maxLatency, boolean markAsSent) throws DbException;
/**
* Returns the IDs of all messages that are eligible to be sent to the
* given contact, together with their raw lengths. This may include
* messages that have already been sent and are not yet due for
* retransmission.
* given contact.
* <p>
* Unlike {@link #getMessagesToSend(Transaction, ContactId, long, long)}
* this method may return messages that have already been sent and are
* not yet due for retransmission.
* <p/>
* Read-only.
*/
Map<MessageId, Integer> getUnackedMessagesToSend(Transaction txn,
Collection<MessageId> getUnackedMessagesToSend(Transaction txn,
ContactId c) throws DbException;
/**
* Resets the transmission count, expiry time and max latency of all messages
* that are eligible to be sent to the given contact. This includes messages
* that have already been sent and are not yet due for retransmission.
*/
void resetUnackedMessagesToSend(Transaction txn, ContactId c)
throws DbException;
/**
* Returns the total length, including headers, of all messages that are
* eligible to be sent to the given contact. This may include messages
@@ -490,15 +550,18 @@ public interface DatabaseComponent extends TransactionManager {
*/
long getNextCleanupDeadline(Transaction txn) throws DbException;
/*
/**
* Returns the next time (in milliseconds since the Unix epoch) when a
* message is due to be sent to the given contact. The returned value may
* be zero if a message is due to be sent immediately, or Long.MAX_VALUE if
* no messages are scheduled to be sent.
* message is due to be sent to the given contact over a transport with
* the given latency.
* <p>
* The returned value may be zero if a message is due to be sent
* immediately, or Long.MAX_VALUE if no messages are scheduled to be sent.
* <p/>
* Read-only.
*/
long getNextSendTime(Transaction txn, ContactId c) throws DbException;
long getNextSendTime(Transaction txn, ContactId c, long maxLatency)
throws DbException;
/**
* Returns the pending contact with the given ID.
@@ -640,6 +703,13 @@ public interface DatabaseComponent extends TransactionManager {
void removeTransportKeys(Transaction txn, TransportId t, KeySetId k)
throws DbException;
/**
* Records an ack for the given messages as having been sent to the given
* contact.
*/
void setAckSent(Transaction txn, ContactId c, Collection<MessageId> acked)
throws DbException;
/**
* Sets the cleanup timer duration for the given message. This does not
* start the message's cleanup timer.
@@ -686,6 +756,13 @@ public interface DatabaseComponent extends TransactionManager {
void setMessageState(Transaction txn, MessageId m, MessageState state)
throws DbException;
/**
* Records the given messages as having been sent to the given contact
* over a transport with the given maximum latency.
*/
void setMessagesSent(Transaction txn, ContactId c,
Collection<MessageId> sent, long maxLatency) throws DbException;
/**
* Adds dependencies for a message
*/

View File

@@ -18,6 +18,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* submitted, tasks are not run concurrently, and submitting a task will never
* block. Tasks must not run indefinitely. Tasks submitted during shutdown are
* discarded.
* <p>
* It is not mandatory to use this executor for database tasks. The database
* can be accessed from any thread, but this executor's guarantee that tasks
* are run in the order they're submitted may be useful in some cases.
*/
@Qualifier
@Target({FIELD, METHOD, PARAMETER})

View File

@@ -45,6 +45,9 @@ public class Transaction {
/**
* Attaches an event to be broadcast when the transaction has been
* committed. The event will be broadcast on the {@link EventExecutor}.
* Events and {@link #attach(Runnable) tasks} are submitted to the
* {@link EventExecutor} in the order they were attached to the
* transaction.
*/
public void attach(Event e) {
if (actions == null) actions = new ArrayList<>();
@@ -54,6 +57,9 @@ public class Transaction {
/**
* Attaches a task to be executed when the transaction has been
* committed. The task will be run on the {@link EventExecutor}.
* {@link #attach(Event) Events} and tasks are submitted to the
* {@link EventExecutor} in the order they were attached to the
* transaction.
*/
public void attach(Runnable r) {
if (actions == null) actions = new ArrayList<>();

View File

@@ -1,51 +1,95 @@
package org.briarproject.bramble.api.db;
import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
/**
* An interface for managing database transactions.
* <p>
* Read-only transactions may access the database concurrently. Read-write
* transactions access the database exclusively, so starting a read-only or
* read-write transaction will block until there are no read-write
* transactions in progress.
* <p>
* Failing to {@link #endTransaction(Transaction) end} a transaction will
* prevent other callers from accessing the database, so it is recommended to
* use the {@link #transaction(boolean, DbRunnable)},
* {@link #transactionWithResult(boolean, DbCallable)} and
* {@link #transactionWithNullableResult(boolean, NullableDbCallable)} methods
* where possible, which handle committing or aborting the transaction on the
* caller's behalf.
* <p>
* Transactions are not reentrant, i.e. it is not permitted to start a
* transaction on a thread that already has a transaction in progress.
*/
@ThreadSafe
@NotNullByDefault
public interface TransactionManager {
/**
* Starts a new transaction and returns an object representing it.
* <p/>
* This method acquires locks, so it must not be called while holding a
* lock.
* Starts a new transaction and returns an object representing it. This
* method acquires the database lock, which is held until
* {@link #endTransaction(Transaction)} is called.
*
* @param readOnly true if the transaction will only be used for reading.
* @param readOnly True if the transaction will only be used for reading,
* in which case the database lock can be shared with other read-only
* transactions.
*/
Transaction startTransaction(boolean readOnly) throws DbException;
/**
* Commits a transaction to the database.
* {@link #endTransaction(Transaction)} must be called to release the
* database lock.
*/
void commitTransaction(Transaction txn) throws DbException;
/**
* Ends a transaction. If the transaction has not been committed,
* it will be aborted. If the transaction has been committed,
* any events attached to the transaction are broadcast.
* The database lock will be released in either case.
* Ends a transaction. If the transaction has not been committed by
* calling {@link #commitTransaction(Transaction)}, it is aborted and the
* database lock is released.
* <p>
* If the transaction has been committed, any
* {@link Transaction#attach events} attached to the transaction are
* broadcast and any {@link Transaction#attach(Runnable) tasks} attached
* to the transaction are submitted to the {@link EventExecutor}. The
* database lock is then released.
*/
void endTransaction(Transaction txn);
/**
* Runs the given task within a transaction.
* Runs the given task within a transaction. The database lock is held
* while running the task.
*
* @param readOnly True if the transaction will only be used for reading,
* in which case the database lock can be shared with other read-only
* transactions.
*/
<E extends Exception> void transaction(boolean readOnly,
DbRunnable<E> task) throws DbException, E;
/**
* Runs the given task within a transaction and returns the result of the
* task.
* task. The database lock is held while running the task.
*
* @param readOnly True if the transaction will only be used for reading,
* in which case the database lock can be shared with other read-only
* transactions.
*/
<R, E extends Exception> R transactionWithResult(boolean readOnly,
DbCallable<R, E> task) throws DbException, E;
/**
* Runs the given task within a transaction and returns the result of the
* task, which may be null.
* task, which may be null. The database lock is held while running the
* task.
*
* @param readOnly True if the transaction will only be used for reading,
* in which case the database lock can be shared with other read-only
* transactions.
*/
@Nullable
<R, E extends Exception> R transactionWithNullableResult(boolean readOnly,

View File

@@ -21,9 +21,4 @@ public class AuthorId extends UniqueId {
public AuthorId(byte[] id) {
super(id);
}
@Override
public boolean equals(Object o) {
return o instanceof AuthorId && super.equals(o);
}
}

View File

@@ -37,8 +37,14 @@ public interface LifecycleManager {
*/
enum LifecycleState {
STARTING, MIGRATING_DATABASE, COMPACTING_DATABASE, STARTING_SERVICES,
RUNNING, STOPPING;
CREATED,
STARTING,
MIGRATING_DATABASE,
COMPACTING_DATABASE,
STARTING_SERVICES,
RUNNING,
STOPPING,
STOPPED;
public boolean isAfter(LifecycleState state) {
return ordinal() > state.ordinal();

View File

@@ -0,0 +1,8 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public class InvalidMailboxIdException extends Exception {
}

View File

@@ -0,0 +1,24 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe
@NotNullByDefault
public class MailboxAuthToken extends MailboxId {
public MailboxAuthToken(byte[] id) {
super(id);
}
/**
* Creates a {@link MailboxAuthToken} from the given string.
*
* @throws InvalidMailboxIdException if token is not valid.
*/
public static MailboxAuthToken fromString(@Nullable String token)
throws InvalidMailboxIdException {
return new MailboxAuthToken(bytesFromString(token));
}
}

View File

@@ -0,0 +1,73 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.plugin.TransportId;
import java.util.List;
import static java.util.Collections.singletonList;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.HOURS;
import static org.briarproject.bramble.api.transport.TransportConstants.MAX_FRAME_LENGTH;
import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH;
import static org.briarproject.bramble.api.transport.TransportConstants.STREAM_HEADER_LENGTH;
import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
public interface MailboxConstants {
/**
* The transport ID of the mailbox plugin.
*/
TransportId ID = new TransportId("org.briarproject.bramble.mailbox");
/**
* Mailbox API versions that we support as a client. This is reported to our
* contacts by {@link MailboxUpdateManager}.
*/
List<MailboxVersion> CLIENT_SUPPORTS = singletonList(
new MailboxVersion(1, 0));
/**
* The constant returned by
* {@link MailboxHelper#getHighestCommonMajorVersion(List, List)}
* when the server is too old to support our major version.
*/
int API_SERVER_TOO_OLD = -1;
/**
* The constant returned by
* {@link MailboxHelper#getHighestCommonMajorVersion(List, List)}
* when we as a client are too old to support the server's major version.
*/
int API_CLIENT_TOO_OLD = -2;
/**
* The maximum length of a file that can be uploaded to or downloaded from
* a mailbox.
*/
int MAX_FILE_BYTES = 1024 * 1024;
/**
* The maximum length of the plaintext payload of a file, such that the
* ciphertext is no more than {@link #MAX_FILE_BYTES}.
*/
int MAX_FILE_PAYLOAD_BYTES =
(MAX_FILE_BYTES - TAG_LENGTH - STREAM_HEADER_LENGTH)
/ MAX_FRAME_LENGTH * MAX_PAYLOAD_LENGTH;
/**
* The number of connection failures
* that indicate a problem with the mailbox.
*/
int PROBLEM_NUM_CONNECTION_FAILURES = 5;
/**
* The time in milliseconds since the last connection success
* that need to pass to indicates a problem with the mailbox.
*/
long PROBLEM_MS_SINCE_LAST_SUCCESS = HOURS.toMillis(1);
/**
* The maximum latency of the mailbox transport in milliseconds.
*/
long MAX_LATENCY = DAYS.toMillis(14);
}

View File

@@ -0,0 +1,22 @@
package org.briarproject.bramble.api.mailbox;
import java.io.File;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Annotation for injecting the {@link File directory} where the Mailbox plugin
* should store its state.
*/
@Qualifier
@Target({FIELD, METHOD, PARAMETER})
@Retention(RUNTIME)
public @interface MailboxDirectory {
}

View File

@@ -0,0 +1,24 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe
@NotNullByDefault
public class MailboxFileId extends MailboxId {
public MailboxFileId(byte[] id) {
super(id);
}
/**
* Creates a {@link MailboxFileId} from the given string.
*
* @throws IllegalArgumentException if token is not valid.
*/
public static MailboxFileId fromString(@Nullable String token)
throws InvalidMailboxIdException {
return new MailboxFileId(bytesFromString(token));
}
}

View File

@@ -0,0 +1,24 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe
@NotNullByDefault
public class MailboxFolderId extends MailboxId {
public MailboxFolderId(byte[] id) {
super(id);
}
/**
* Creates a {@link MailboxFolderId} from the given string.
*
* @throws IllegalArgumentException if token is not valid.
*/
public static MailboxFolderId fromString(@Nullable String token)
throws InvalidMailboxIdException {
return new MailboxFolderId(bytesFromString(token));
}
}

View File

@@ -0,0 +1,47 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.List;
import java.util.TreeSet;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_CLIENT_TOO_OLD;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_SERVER_TOO_OLD;
@NotNullByDefault
public class MailboxHelper {
/**
* Returns the highest major version that both client and server support
* or {@link MailboxConstants#API_SERVER_TOO_OLD} if the server is too old
* or {@link MailboxConstants#API_CLIENT_TOO_OLD} if the client is too old.
*/
public static int getHighestCommonMajorVersion(
List<MailboxVersion> client, List<MailboxVersion> server) {
TreeSet<Integer> clientVersions = new TreeSet<>();
for (MailboxVersion version : client) {
clientVersions.add(version.getMajor());
}
TreeSet<Integer> serverVersions = new TreeSet<>();
for (MailboxVersion version : server) {
serverVersions.add(version.getMajor());
}
for (int clientVersion : clientVersions.descendingSet()) {
if (serverVersions.contains(clientVersion)) return clientVersion;
}
if (clientVersions.last() < serverVersions.last()) {
return API_CLIENT_TOO_OLD;
}
return API_SERVER_TOO_OLD;
}
/**
* Returns true if a client and server with the given API versions can
* communicate with each other (ie, have any major API versions in common).
*/
public static boolean isClientCompatibleWithServer(
List<MailboxVersion> client, List<MailboxVersion> server) {
int common = getHighestCommonMajorVersion(client, server);
return common != API_CLIENT_TOO_OLD && common != API_SERVER_TOO_OLD;
}
}

View File

@@ -0,0 +1,50 @@
package org.briarproject.bramble.api.mailbox;
import com.fasterxml.jackson.annotation.JsonValue;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.UniqueId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.Locale;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
import static org.briarproject.bramble.util.StringUtils.fromHexString;
import static org.briarproject.bramble.util.StringUtils.toHexString;
@ThreadSafe
@NotNullByDefault
public abstract class MailboxId extends UniqueId {
MailboxId(byte[] id) {
super(id);
}
/**
* Returns valid {@link MailboxId} bytes from the given string.
*
* @throws InvalidMailboxIdException if token is not valid.
*/
static byte[] bytesFromString(@Nullable String token)
throws InvalidMailboxIdException {
if (token == null || token.length() != 64) {
throw new InvalidMailboxIdException();
}
try {
return fromHexString(token);
} catch (FormatException e) {
throw new InvalidMailboxIdException();
}
}
/**
* Returns the string representation expected by the mailbox API.
* Also used for serialization.
*/
@Override
@JsonValue
public String toString() {
return toHexString(getBytes()).toLowerCase(Locale.US);
}
}

View File

@@ -0,0 +1,56 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent;
import javax.annotation.Nullable;
public interface MailboxManager {
/**
* @return true if a mailbox is already paired.
*/
boolean isPaired(Transaction txn) throws DbException;
/**
* @return the current status of the mailbox.
*/
MailboxStatus getMailboxStatus(Transaction txn) throws DbException;
/**
* Returns the currently running pairing task,
* or null if no pairing task is running.
*/
@Nullable
MailboxPairingTask getCurrentPairingTask();
/**
* Starts and returns a pairing task. If a pairing task is already running,
* it will be returned and the argument will be ignored.
*
* @param qrCodePayload The ISO-8859-1 encoded bytes of the mailbox QR code.
*/
MailboxPairingTask startPairingTask(String qrCodePayload);
/**
* Can be used by the UI to test the mailbox connection.
*
* @return true (success) or false (error).
* A {@link OwnMailboxConnectionStatusEvent} might be broadcast with a new
* {@link MailboxStatus}.
*/
boolean checkConnection();
/**
* Unpairs the owner's mailbox and tries to wipe it.
* As this makes a network call, it should be run on the {@link IoExecutor}.
*
* @return true if we could wipe the mailbox, false if we couldn't.
* It is advised to inform the user to wipe the mailbox themselves,
* if we failed to wipe it.
*/
@IoExecutor
boolean unPair() throws DbException;
}

View File

@@ -0,0 +1,25 @@
package org.briarproject.bramble.api.mailbox;
public abstract class MailboxPairingState {
public static class QrCodeReceived extends MailboxPairingState {
}
public static class Pairing extends MailboxPairingState {
}
public static class Paired extends MailboxPairingState {
}
public static class InvalidQrCode extends MailboxPairingState {
}
public static class MailboxAlreadyPaired extends MailboxPairingState {
}
public static class ConnectionError extends MailboxPairingState {
}
public static class UnexpectedError extends MailboxPairingState {
}
}

View File

@@ -0,0 +1,21 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.Consumer;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public interface MailboxPairingTask extends Runnable {
/**
* Adds an observer to the task. The observer will be notified on the
* event thread of the current state of the task and any subsequent state
* changes.
*/
void addObserver(Consumer<MailboxPairingState> observer);
/**
* Removes an observer from the task.
*/
void removeObserver(Consumer<MailboxPairingState> observer);
}

View File

@@ -0,0 +1,98 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.nullsafety.NullSafety;
import java.util.List;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public class MailboxProperties {
private final String onion;
private final MailboxAuthToken authToken;
private final boolean owner;
private final List<MailboxVersion> serverSupports;
@Nullable
private final MailboxFolderId inboxId; // Null for own mailbox
@Nullable
private final MailboxFolderId outboxId; // Null for own mailbox
/**
* Constructor for properties used by the mailbox's owner.
*/
public MailboxProperties(String onion, MailboxAuthToken authToken,
List<MailboxVersion> serverSupports) {
this.onion = onion;
this.authToken = authToken;
this.owner = true;
this.serverSupports = serverSupports;
this.inboxId = null;
this.outboxId = null;
}
/**
* Constructor for properties used by a contact of the mailbox's owner.
*/
public MailboxProperties(String onion, MailboxAuthToken authToken,
List<MailboxVersion> serverSupports, MailboxFolderId inboxId,
MailboxFolderId outboxId) {
this.onion = onion;
this.authToken = authToken;
this.owner = false;
this.serverSupports = serverSupports;
this.inboxId = inboxId;
this.outboxId = outboxId;
}
/**
* Returns the onion address of the mailbox, excluding the .onion suffix.
*/
public String getOnion() {
return onion;
}
public MailboxAuthToken getAuthToken() {
return authToken;
}
public boolean isOwner() {
return owner;
}
public List<MailboxVersion> getServerSupports() {
return serverSupports;
}
@Nullable
public MailboxFolderId getInboxId() {
return inboxId;
}
@Nullable
public MailboxFolderId getOutboxId() {
return outboxId;
}
@Override
public boolean equals(Object o) {
if (o instanceof MailboxProperties) {
MailboxProperties m = (MailboxProperties) o;
return owner == m.owner &&
onion.equals(m.onion) &&
authToken.equals(m.authToken) &&
NullSafety.equals(inboxId, m.inboxId) &&
NullSafety.equals(outboxId, m.outboxId) &&
serverSupports.equals(m.serverSupports);
}
return false;
}
@Override
public int hashCode() {
return authToken.hashCode();
}
}

View File

@@ -0,0 +1,73 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.List;
import javax.annotation.Nullable;
@NotNullByDefault
public interface MailboxSettingsManager {
/**
* Registers a hook to be called when a mailbox has been paired or unpaired.
* This method should be called before
* {@link LifecycleManager#startServices(SecretKey)}.
*/
void registerMailboxHook(MailboxHook hook);
@Nullable
MailboxProperties getOwnMailboxProperties(Transaction txn)
throws DbException;
void setOwnMailboxProperties(Transaction txn, MailboxProperties p)
throws DbException;
void removeOwnMailboxProperties(Transaction txn) throws DbException;
MailboxStatus getOwnMailboxStatus(Transaction txn) throws DbException;
void recordSuccessfulConnection(Transaction txn, long now,
List<MailboxVersion> versions) throws DbException;
void recordFailedConnectionAttempt(Transaction txn, long now)
throws DbException;
void setPendingUpload(Transaction txn, ContactId id,
@Nullable String filename) throws DbException;
@Nullable
String getPendingUpload(Transaction txn, ContactId id) throws DbException;
interface MailboxHook {
/**
* Called when Briar is paired with a mailbox.
*
* @param txn A read-write transaction
*/
void mailboxPaired(Transaction txn, MailboxProperties p)
throws DbException;
/**
* Called when the mailbox is unpaired.
*
* @param txn A read-write transaction
*/
void mailboxUnpaired(Transaction txn) throws DbException;
/**
* Called when we receive our mailbox's server-supported API versions.
* This happens whenever we successfully check the connectivity of
* our mailbox, so this hook may be called frequently.
*
* @param txn A read-write transaction
*/
void serverSupportedVersionsReceived(Transaction txn,
List<MailboxVersion> serverSupports) throws DbException;
}
}

View File

@@ -0,0 +1,93 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.List;
import javax.annotation.concurrent.Immutable;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_MS_SINCE_LAST_SUCCESS;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_NUM_CONNECTION_FAILURES;
import static org.briarproject.bramble.api.mailbox.MailboxHelper.getHighestCommonMajorVersion;
@Immutable
@NotNullByDefault
public class MailboxStatus {
private final long lastAttempt, lastSuccess;
private final int attemptsSinceSuccess;
private final List<MailboxVersion> serverSupports;
public MailboxStatus(long lastAttempt, long lastSuccess,
int attemptsSinceSuccess,
List<MailboxVersion> serverSupports) {
this.lastAttempt = lastAttempt;
this.lastSuccess = lastSuccess;
this.attemptsSinceSuccess = attemptsSinceSuccess;
this.serverSupports = serverSupports;
}
/**
* Returns the time of the last attempt to connect to the mailbox, in
* milliseconds since the Unix epoch, or -1 if no attempt has been made.
* <p>
* If an attempt is in progress and has not yet succeeded or failed then
* this method returns the time of the previous attempt, or -1 if the
* current attempt is the first.
*/
public long getTimeOfLastAttempt() {
return lastAttempt;
}
/**
* Returns the time of the last successful attempt to connect to the
* mailbox, in milliseconds since the Unix epoch, or -1 if no attempt has
* succeeded.
* <p>
* If the last attempt was successful then this method returns the same
* value as {@link #getTimeOfLastAttempt()}. If an attempt is in progress
* and has not yet succeeded or failed then this method returns the time
* of the previous successful connection, or -1 if no attempt has
* succeeded.
*/
public long getTimeOfLastSuccess() {
return lastSuccess;
}
/**
* Returns the number of attempts to connect to the mailbox that have
* failed since the last attempt succeeded, or the number of attempts that
* have been made, if no attempt has ever succeeded.
* <p>
* If an attempt is in progress and has not yet succeeded or failed then
* it is not included in this count.
*/
public int getAttemptsSinceSuccess() {
return attemptsSinceSuccess;
}
/**
* Returns the mailbox's supported API versions.
*/
public List<MailboxVersion> getServerSupports() {
return serverSupports;
}
/**
* @return true if this status indicates a problem with the mailbox.
*/
public boolean hasProblem(long now) {
return attemptsSinceSuccess >= PROBLEM_NUM_CONNECTION_FAILURES &&
(now - lastSuccess) >= PROBLEM_MS_SINCE_LAST_SUCCESS;
}
/**
* @return a positive integer if the mailbox is compatible. Same result as
* {@link MailboxHelper#getHighestCommonMajorVersion(List, List)}.
*/
public int getMailboxCompatibility() {
return getHighestCommonMajorVersion(CLIENT_SUPPORTS, serverSupports);
}
}

View File

@@ -0,0 +1,31 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.List;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public class MailboxUpdate {
private final boolean hasMailbox;
private final List<MailboxVersion> clientSupports;
public MailboxUpdate(List<MailboxVersion> clientSupports) {
this(clientSupports, false);
}
MailboxUpdate(List<MailboxVersion> clientSupports, boolean hasMailbox) {
this.clientSupports = clientSupports;
this.hasMailbox = hasMailbox;
}
public List<MailboxVersion> getClientSupports() {
return clientSupports;
}
public boolean hasMailbox() {
return hasMailbox;
}
}

View File

@@ -0,0 +1,111 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.ClientId;
import javax.annotation.Nullable;
@NotNullByDefault
public interface MailboxUpdateManager {
/**
* The unique ID of the mailbox update (properties) client.
*/
ClientId CLIENT_ID =
new ClientId("org.briarproject.bramble.mailbox.properties");
/**
* The current major version of the mailbox update (properties) client.
*/
int MAJOR_VERSION = 2;
/**
* The current minor version of the mailbox update (properties) client.
*/
int MINOR_VERSION = 0;
/**
* The number of properties required for an update message with a mailbox.
* <p>
* The required properties are {@link #PROP_KEY_ONION},
* {@link #PROP_KEY_AUTHTOKEN}, {@link #PROP_KEY_INBOXID} and
* {@link #PROP_KEY_OUTBOXID}.
*/
int PROP_COUNT = 4;
/**
* The onion address of the mailbox, excluding the .onion suffix.
*/
String PROP_KEY_ONION = "onion";
/**
* A bearer token for accessing the mailbox (64 hex digits).
*/
String PROP_KEY_AUTHTOKEN = "authToken";
/**
* A folder ID for downloading messages (64 hex digits).
*/
String PROP_KEY_INBOXID = "inboxId";
/**
* A folder ID for uploading messages (64 hex digits).
*/
String PROP_KEY_OUTBOXID = "outboxId";
/**
* Length of the {@link #PROP_KEY_ONION} property.
*/
int PROP_ONION_LENGTH = 56;
/**
* Message metadata key for the version number of a local or remote update,
* as a BDF long.
*/
String MSG_KEY_VERSION = "version";
/**
* Message metadata key for whether an update is local or remote, as a BDF
* boolean.
*/
String MSG_KEY_LOCAL = "local";
/**
* Key in the client's local group for storing the clientSupports list that
* was last sent out.
*/
String GROUP_KEY_SENT_CLIENT_SUPPORTS = "sentClientSupports";
/**
* Key in the client's local group for storing the serverSupports list that
* was last sent out, if any.
*/
String GROUP_KEY_SENT_SERVER_SUPPORTS = "sentServerSupports";
/**
* Returns the latest {@link MailboxUpdate} sent to the given contact.
* <p>
* If we have our own mailbox then the update will be a
* {@link MailboxUpdateWithMailbox} containing the
* {@link MailboxProperties} the contact should use for communicating with
* our mailbox.
*/
MailboxUpdate getLocalUpdate(Transaction txn, ContactId c)
throws DbException;
/**
* Returns the latest {@link MailboxUpdate} received from the given
* contact, or null if no update has been received.
* <p>
* If the contact has a mailbox then the update will be a
* {@link MailboxUpdateWithMailbox} containing the
* {@link MailboxProperties} we should use for communicating with the
* contact's mailbox.
*/
@Nullable
MailboxUpdate getRemoteUpdate(Transaction txn, ContactId c)
throws DbException;
}

View File

@@ -0,0 +1,30 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.List;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public class MailboxUpdateWithMailbox extends MailboxUpdate {
private final MailboxProperties properties;
public MailboxUpdateWithMailbox(List<MailboxVersion> clientSupports,
MailboxProperties properties) {
super(clientSupports, true);
if (properties.isOwner()) throw new IllegalArgumentException();
this.properties = properties;
}
public MailboxUpdateWithMailbox(MailboxUpdateWithMailbox o,
List<MailboxVersion> newClientSupports) {
this(newClientSupports, o.getMailboxProperties());
}
public MailboxProperties getMailboxProperties() {
return properties;
}
}

View File

@@ -0,0 +1,44 @@
package org.briarproject.bramble.api.mailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public class MailboxVersion implements Comparable<MailboxVersion> {
private final int major;
private final int minor;
public MailboxVersion(int major, int minor) {
this.major = major;
this.minor = minor;
}
public int getMajor() {
return major;
}
public int getMinor() {
return minor;
}
@Override
public boolean equals(Object o) {
if (o instanceof MailboxVersion) {
MailboxVersion v = (MailboxVersion) o;
return major == v.major && minor == v.minor;
}
return false;
}
@Override
public int compareTo(MailboxVersion v) {
int c = major - v.major;
if (c != 0) {
return c;
}
return minor - v.minor;
}
}

View File

@@ -0,0 +1,36 @@
package org.briarproject.bramble.api.mailbox.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.Map;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast when a mailbox is paired.
*/
@Immutable
@NotNullByDefault
public class MailboxPairedEvent extends Event {
private final MailboxProperties properties;
private final Map<ContactId, MailboxUpdateWithMailbox> localUpdates;
public MailboxPairedEvent(MailboxProperties properties,
Map<ContactId, MailboxUpdateWithMailbox> localUpdates) {
this.properties = properties;
this.localUpdates = localUpdates;
}
public MailboxProperties getProperties() {
return properties;
}
public Map<ContactId, MailboxUpdateWithMailbox> getLocalUpdates() {
return localUpdates;
}
}

View File

@@ -0,0 +1,19 @@
package org.briarproject.bramble.api.mailbox.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast by {@link MailboxSettingsManager} when
* recording a connection failure for own Mailbox
* that has persistent for long enough for the mailbox owner to become active
* and fix the problem with the mailbox.
*/
@Immutable
@NotNullByDefault
public class MailboxProblemEvent extends Event {
}

View File

@@ -0,0 +1,28 @@
package org.briarproject.bramble.api.mailbox.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.Map;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast when a mailbox is unpaired.
*/
@Immutable
@NotNullByDefault
public class MailboxUnpairedEvent extends Event {
private final Map<ContactId, MailboxUpdate> localUpdates;
public MailboxUnpairedEvent(Map<ContactId, MailboxUpdate> localUpdates) {
this.localUpdates = localUpdates;
}
public Map<ContactId, MailboxUpdate> getLocalUpdates() {
return localUpdates;
}
}

View File

@@ -0,0 +1,40 @@
package org.briarproject.bramble.api.mailbox.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
import org.briarproject.bramble.api.mailbox.MailboxUpdateManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast when the first mailbox update is sent to a
* newly added contact, which happens in the same transaction in which the
* contact is added.
* <p>
* This event is not broadcast when the first mailbox update is sent to an
* existing contact when setting up the
* {@link MailboxUpdateManager mailbox update client}.
*/
@Immutable
@NotNullByDefault
public class MailboxUpdateSentToNewContactEvent extends Event {
private final ContactId contactId;
private final MailboxUpdate mailboxUpdate;
public MailboxUpdateSentToNewContactEvent(ContactId contactId,
MailboxUpdate mailboxUpdate) {
this.contactId = contactId;
this.mailboxUpdate = mailboxUpdate;
}
public ContactId getContactId() {
return contactId;
}
public MailboxUpdate getMailboxUpdate() {
return mailboxUpdate;
}
}

View File

@@ -0,0 +1,27 @@
package org.briarproject.bramble.api.mailbox.event;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
import org.briarproject.bramble.api.mailbox.MailboxStatus;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast by {@link MailboxSettingsManager} when
* recording the connection status of own Mailbox.
*/
@Immutable
@NotNullByDefault
public class OwnMailboxConnectionStatusEvent extends Event {
private final MailboxStatus status;
public OwnMailboxConnectionStatusEvent(MailboxStatus status) {
this.status = status;
}
public MailboxStatus getStatus() {
return status;
}
}

View File

@@ -0,0 +1,34 @@
package org.briarproject.bramble.api.mailbox.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable;
/**
* An event that is broadcast when {@link MailboxUpdate} are received
* from a contact.
*/
@Immutable
@NotNullByDefault
public class RemoteMailboxUpdateEvent extends Event {
private final ContactId contactId;
private final MailboxUpdate mailboxUpdate;
public RemoteMailboxUpdateEvent(ContactId contactId,
MailboxUpdate mailboxUpdate) {
this.contactId = contactId;
this.mailboxUpdate = mailboxUpdate;
}
public ContactId getContact() {
return contactId;
}
public MailboxUpdate getMailboxUpdate() {
return mailboxUpdate;
}
}

View File

@@ -1,34 +1,27 @@
package org.briarproject.bramble.api.plugin;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.SECONDS;
public interface TorConstants {
TransportId ID = new TransportId("org.briarproject.bramble.tor");
// Transport properties
String PROP_ONION_V2 = "onion";
String PROP_ONION_V3 = "onion3";
int SOCKS_PORT = 59050;
int CONTROL_PORT = 59051;
int DEFAULT_SOCKS_PORT = 59050;
int DEFAULT_CONTROL_PORT = 59051;
int CONNECT_TO_PROXY_TIMEOUT = 5000; // Milliseconds
int EXTRA_SOCKET_TIMEOUT = 30000; // Milliseconds
int CONNECT_TO_PROXY_TIMEOUT = (int) SECONDS.toMillis(5);
int EXTRA_CONNECT_TIMEOUT = (int) SECONDS.toMillis(120);
int EXTRA_SOCKET_TIMEOUT = (int) SECONDS.toMillis(30);
// Local settings (not shared with contacts)
String PREF_TOR_NETWORK = "network2";
String PREF_TOR_PORT = "port";
String PREF_TOR_MOBILE = "useMobileData";
String PREF_TOR_ONLY_WHEN_CHARGING = "onlyWhenCharging";
String HS_PRIVATE_KEY_V2 = "onionPrivKey";
String HS_PRIVATE_KEY_V3 = "onionPrivKey3";
String HS_V3_CREATED = "onionPrivKey3Created";
/**
* How long to publish a v3 hidden service before retiring the v2 service.
*/
long V3_MIGRATION_PERIOD_MS = DAYS.toMillis(180);
// Values for PREF_TOR_NETWORK
int PREF_TOR_NETWORK_AUTOMATIC = 0;

View File

@@ -0,0 +1,20 @@
package org.briarproject.bramble.api.plugin;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Annotation for injecting the control port for the Tor plugin.
*/
@Qualifier
@Target({FIELD, METHOD, PARAMETER})
@Retention(RUNTIME)
public @interface TorControlPort {
}

View File

@@ -0,0 +1,20 @@
package org.briarproject.bramble.api.plugin;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Annotation for injecting the socks port for the Tor plugin.
*/
@Qualifier
@Target({FIELD, METHOD, PARAMETER})
@Retention(RUNTIME)
public @interface TorSocksPort {
}

View File

@@ -12,4 +12,6 @@ public interface RecordWriter {
void flush() throws IOException;
void close() throws IOException;
long getBytesWritten();
}

View File

@@ -22,4 +22,11 @@ public interface SettingsManager {
* namespace.
*/
void mergeSettings(Settings s, String namespace) throws DbException;
/**
* Merges the given settings with any existing settings in the given
* namespace.
*/
void mergeSettings(Transaction txn, Settings s, String namespace)
throws DbException;
}

View File

@@ -20,9 +20,4 @@ public class GroupId extends UniqueId {
public GroupId(byte[] id) {
super(id);
}
@Override
public boolean equals(Object o) {
return o instanceof GroupId && super.equals(o);
}
}

View File

@@ -27,9 +27,4 @@ public class MessageId extends UniqueId {
public MessageId(byte[] id) {
super(id);
}
@Override
public boolean equals(Object o) {
return o instanceof MessageId && super.equals(o);
}
}

View File

@@ -0,0 +1,37 @@
package org.briarproject.bramble.api.sync;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.Collection;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.annotation.concurrent.ThreadSafe;
/**
* A container for holding the IDs of messages sent and acked during an
* outgoing {@link SyncSession}, so they can be recorded in the DB as sent
* or acked at some later time.
*/
@ThreadSafe
@NotNullByDefault
public class OutgoingSessionRecord {
private final Collection<MessageId> ackedIds = new CopyOnWriteArrayList<>();
private final Collection<MessageId> sentIds = new CopyOnWriteArrayList<>();
public void onAckSent(Collection<MessageId> acked) {
ackedIds.addAll(acked);
}
public void onMessageSent(MessageId sent) {
sentIds.add(sent);
}
public Collection<MessageId> getAckedIds() {
return ackedIds;
}
public Collection<MessageId> getSentIds() {
return sentIds;
}
}

View File

@@ -20,4 +20,6 @@ public interface SyncRecordWriter {
void writePriority(Priority p) throws IOException;
void flush() throws IOException;
long getBytesWritten();
}

View File

@@ -12,12 +12,30 @@ import javax.annotation.Nullable;
@NotNullByDefault
public interface SyncSessionFactory {
/**
* Creates a session for receiving data from a contact.
*/
SyncSession createIncomingSession(ContactId c, InputStream in,
PriorityHandler handler);
/**
* Creates a session for sending data to a contact over a simplex transport.
*
* @param eager True if messages should be sent eagerly, ie regardless of
* whether they're due for retransmission.
*/
SyncSession createSimplexOutgoingSession(ContactId c, TransportId t,
long maxLatency, boolean eager, StreamWriter streamWriter);
/**
* Creates a session for sending data to a contact via a mailbox. The IDs
* of any messages sent or acked will be added to the given
* {@link OutgoingSessionRecord}.
*/
SyncSession createSimplexOutgoingSession(ContactId c, TransportId t,
long maxLatency, StreamWriter streamWriter,
OutgoingSessionRecord sessionRecord);
SyncSession createDuplexOutgoingSession(ContactId c, TransportId t,
long maxLatency, int maxIdleTime, StreamWriter streamWriter,
@Nullable Priority priority);

View File

@@ -3,6 +3,7 @@ package org.briarproject.bramble.api.sync.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.Group.Visibility;
import java.util.Collection;
@@ -15,12 +16,19 @@ import javax.annotation.concurrent.Immutable;
@NotNullByDefault
public class GroupVisibilityUpdatedEvent extends Event {
private final Visibility visibility;
private final Collection<ContactId> affected;
public GroupVisibilityUpdatedEvent(Collection<ContactId> affected) {
public GroupVisibilityUpdatedEvent(Visibility visibility,
Collection<ContactId> affected) {
this.visibility = visibility;
this.affected = affected;
}
public Visibility getVisibility() {
return visibility;
}
/**
* Returns the contacts affected by the update.
*/

View File

@@ -1,9 +1,14 @@
package org.briarproject.bramble.api.sync.event;
import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.Group.Visibility;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId;
import java.util.Map;
import javax.annotation.concurrent.Immutable;
/**
@@ -14,12 +19,32 @@ import javax.annotation.concurrent.Immutable;
public class MessageSharedEvent extends Event {
private final MessageId messageId;
private final GroupId groupId;
private final Map<ContactId, Boolean> groupVisibility;
public MessageSharedEvent(MessageId message) {
public MessageSharedEvent(MessageId message, GroupId groupId,
Map<ContactId, Boolean> groupVisibility) {
this.messageId = message;
this.groupId = groupId;
this.groupVisibility = groupVisibility;
}
public MessageId getMessageId() {
return messageId;
}
public GroupId getGroupId() {
return groupId;
}
/**
* Returns the IDs of all contacts for which the visibility of the
* message's group is either {@link Visibility#SHARED shared} or
* {@link Visibility#VISIBLE visible}. The value in the map is true if the
* group is {@link Visibility#SHARED shared} or false if the group is
* {@link Visibility#VISIBLE visible}.
*/
public Map<ContactId, Boolean> getGroupVisibility() {
return groupVisibility;
}
}

View File

@@ -1,5 +1,6 @@
package org.briarproject.bramble.api.system;
import org.briarproject.bramble.api.Cancellable;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.concurrent.Executor;
@@ -16,6 +17,8 @@ public interface TaskScheduler {
* <p>
* If the platform supports wake locks, a wake lock will be held while
* submitting and running the task.
*
* @return A {@link Cancellable} for cancelling the task.
*/
Cancellable schedule(Runnable task, Executor executor, long delay,
TimeUnit unit);
@@ -27,17 +30,11 @@ public interface TaskScheduler {
* <p>
* If the platform supports wake locks, a wake lock will be held while
* submitting and running the task.
*
* @return A {@link Cancellable} for cancelling all future executions of
* the task.
*/
Cancellable scheduleWithFixedDelay(Runnable task, Executor executor,
long delay, long interval, TimeUnit unit);
interface Cancellable {
/**
* Cancels the task if it has not already started running. If the task
* is {@link #scheduleWithFixedDelay(Runnable, Executor, long, long, TimeUnit) periodic},
* all future executions of the task are cancelled.
*/
void cancel();
}
}

View File

@@ -113,9 +113,25 @@ public interface KeyManager {
/**
* Looks up the given tag and returns a {@link StreamContext} for reading
* from the corresponding stream, or null if an error occurs or the tag was
* unexpected.
* unexpected. Marks the tag as recognised and updates the reordering
* window.
*/
@Nullable
StreamContext getStreamContext(TransportId t, byte[] tag)
throws DbException;
/**
* Looks up the given tag and returns a {@link StreamContext} for reading
* from the corresponding stream, or null if an error occurs or the tag was
* unexpected. Only returns the StreamContext; does not mark the tag as
* recognised.
*/
@Nullable
StreamContext getStreamContextOnly(TransportId t, byte[] tag)
throws DbException;
/**
* Marks the tag as recognised and updates the reordering window.
*/
void markTagAsRecognised(TransportId t, byte[] tag) throws DbException;
}

View File

@@ -40,7 +40,7 @@ public class IoUtils {
}
}
private static void delete(File f) {
public static void delete(File f) {
if (!f.delete() && LOG.isLoggable(WARNING))
LOG.warning("Could not delete " + f.getAbsolutePath());
}

View File

@@ -26,7 +26,7 @@ public class NetworkUtils {
// Despite what the docs say, the return value can be null
//noinspection ConstantConditions
return ifaces == null ? emptyList() : list(ifaces);
} catch (SocketException e) {
} catch (SocketException | NullPointerException e) {
logException(LOG, WARNING, e);
return emptyList();
}

View File

@@ -1,5 +1,6 @@
package org.briarproject.bramble.util;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.io.UnsupportedEncodingException;
@@ -95,10 +96,10 @@ public class StringUtils {
/**
* Converts the given hex string to a byte array.
*/
public static byte[] fromHexString(String hex) {
public static byte[] fromHexString(String hex) throws FormatException {
int len = hex.length();
if (len % 2 != 0)
throw new IllegalArgumentException("Not a hex string");
throw new FormatException();
byte[] bytes = new byte[len / 2];
for (int i = 0, j = 0; i < len; i += 2, j++) {
int high = hexDigitToInt(hex.charAt(i));
@@ -108,11 +109,11 @@ public class StringUtils {
return bytes;
}
private static int hexDigitToInt(char c) {
private static int hexDigitToInt(char c) throws FormatException {
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
throw new IllegalArgumentException("Not a hex digit: " + c);
throw new FormatException();
}
public static String trim(String s) {
@@ -130,13 +131,13 @@ public class StringUtils {
return MAC.matcher(mac).matches();
}
public static byte[] macToBytes(String mac) {
if (!MAC.matcher(mac).matches()) throw new IllegalArgumentException();
public static byte[] macToBytes(String mac) throws FormatException {
if (!MAC.matcher(mac).matches()) throw new FormatException();
return fromHexString(mac.replaceAll(":", ""));
}
public static String macToString(byte[] mac) {
if (mac.length != 6) throw new IllegalArgumentException();
public static String macToString(byte[] mac) throws FormatException {
if (mac.length != 6) throw new FormatException();
StringBuilder s = new StringBuilder();
for (byte b : mac) {
if (s.length() > 0) s.append(':');

View File

@@ -0,0 +1,44 @@
package org.briarproject.bramble.api.mailbox;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_CLIENT_TOO_OLD;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_SERVER_TOO_OLD;
import static org.briarproject.bramble.api.mailbox.MailboxHelper.getHighestCommonMajorVersion;
import static org.junit.Assert.assertEquals;
public class MailboxHelperTest {
private final Random random = new Random();
@Test
public void testGetHighestCommonMajorVersion() {
assertEquals(2, getHighestCommonMajorVersion(v(2), v(2)));
assertEquals(2, getHighestCommonMajorVersion(v(1, 2), v(2, 3, 4)));
assertEquals(2, getHighestCommonMajorVersion(v(2, 3, 4), v(2)));
assertEquals(2, getHighestCommonMajorVersion(v(2), v(2, 3, 4)));
assertEquals(API_CLIENT_TOO_OLD,
getHighestCommonMajorVersion(v(2), v(3, 4)));
assertEquals(API_CLIENT_TOO_OLD,
getHighestCommonMajorVersion(v(2), v(1, 3)));
assertEquals(API_SERVER_TOO_OLD,
getHighestCommonMajorVersion(v(3, 4, 5), v(2)));
assertEquals(API_SERVER_TOO_OLD,
getHighestCommonMajorVersion(v(1, 3), v(2)));
}
private List<MailboxVersion> v(int... ints) {
List<MailboxVersion> versions = new ArrayList<>(ints.length);
for (int v : ints) {
// minor versions should not matter
versions.add(new MailboxVersion(v, random.nextInt(42)));
}
return versions;
}
}

View File

@@ -1,12 +1,17 @@
package org.briarproject.bramble.test;
import org.jmock.Mockery;
import org.jmock.lib.concurrent.Synchroniser;
import org.junit.After;
public abstract class BrambleMockTestCase extends BrambleTestCase {
protected final Mockery context = new Mockery();
public BrambleMockTestCase() {
context.setThreadingPolicy(new Synchroniser());
}
@After
public void checkExpectations() {
context.assertIsSatisfied();

View File

@@ -1,17 +1,46 @@
package org.briarproject.bramble.test;
import java.lang.Thread.UncaughtExceptionHandler;
import org.junit.After;
import org.junit.Before;
import static org.junit.Assert.fail;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
public abstract class BrambleTestCase {
private static final Logger LOG =
getLogger(BrambleTestCase.class.getName());
@Nullable
protected volatile Throwable exceptionInBackgroundThread = null;
public BrambleTestCase() {
// Ensure exceptions thrown on worker threads cause tests to fail
UncaughtExceptionHandler fail = (thread, throwable) -> {
throwable.printStackTrace();
fail();
LOG.log(WARNING, "Caught unhandled exception", throwable);
exceptionInBackgroundThread = throwable;
};
Thread.setDefaultUncaughtExceptionHandler(fail);
}
@Before
public void beforeBrambleTestCase() {
exceptionInBackgroundThread = null;
}
@After
public void afterBrambleTestCase() {
Throwable thrown = exceptionInBackgroundThread;
if (thrown != null) {
LOG.log(WARNING,
"Background thread has thrown an exception unexpectedly",
thrown);
throw new AssertionError(thrown);
}
}
}

View File

@@ -12,10 +12,20 @@ import org.briarproject.bramble.api.crypto.PublicKey;
import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.crypto.SignaturePrivateKey;
import org.briarproject.bramble.api.crypto.SignaturePublicKey;
import org.briarproject.bramble.api.db.CommitAction;
import org.briarproject.bramble.api.db.EventAction;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.identity.Identity;
import org.briarproject.bramble.api.identity.LocalAuthor;
import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxFolderId;
import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox;
import org.briarproject.bramble.api.mailbox.MailboxVersion;
import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.properties.TransportProperties;
import org.briarproject.bramble.api.sync.ClientId;
@@ -25,7 +35,12 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.bramble.util.IoUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -35,6 +50,9 @@ import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.Nullable;
import javax.crypto.Cipher;
import static java.util.Arrays.asList;
import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_AGREEMENT_PUBLIC_KEY_BYTES;
import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_SIGNATURE_PUBLIC_KEY_BYTES;
@@ -45,6 +63,7 @@ import static org.briarproject.bramble.api.properties.TransportPropertyConstants
import static org.briarproject.bramble.api.sync.ClientId.MAX_CLIENT_ID_LENGTH;
import static org.briarproject.bramble.api.sync.SyncConstants.MAX_GROUP_DESCRIPTOR_LENGTH;
import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH;
import static org.briarproject.bramble.util.IoUtils.copyAndClose;
import static org.briarproject.bramble.util.StringUtils.getRandomString;
public class TestUtils {
@@ -209,6 +228,37 @@ public class TestUtils {
getAgreementPublicKey(), verified);
}
public static MailboxProperties getMailboxProperties(boolean owner,
List<MailboxVersion> serverSupports) {
String onion = getRandomString(56);
MailboxAuthToken authToken = new MailboxAuthToken(getRandomId());
if (owner) {
return new MailboxProperties(onion, authToken, serverSupports);
}
MailboxFolderId inboxId = new MailboxFolderId(getRandomId());
MailboxFolderId outboxId = new MailboxFolderId(getRandomId());
return new MailboxProperties(onion, authToken, serverSupports,
inboxId, outboxId);
}
public static void writeBytes(File file, byte[] bytes)
throws IOException {
FileOutputStream outputStream = new FileOutputStream(file);
//noinspection TryFinallyCanBeTryWithResources
try {
outputStream.write(bytes);
} finally {
outputStream.close();
}
}
public static byte[] readBytes(File file) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
FileInputStream inputStream = new FileInputStream(file);
copyAndClose(inputStream, outputStream);
return outputStream.toByteArray();
}
public static double getMedian(Collection<? extends Number> samples) {
int size = samples.size();
if (size == 0) throw new IllegalArgumentException();
@@ -243,9 +293,68 @@ public class TestUtils {
return Math.sqrt(getVariance(samples));
}
public static boolean isOptionalTestEnabled(Class testClass) {
public static boolean isOptionalTestEnabled(Class<?> testClass) {
String optionalTests = System.getenv("OPTIONAL_TESTS");
return optionalTests != null &&
asList(optionalTests.split(",")).contains(testClass.getName());
}
public static boolean mailboxUpdateEqual(@Nullable MailboxUpdate a,
@Nullable MailboxUpdate b) {
if (a == null || b == null) {
return a == b;
}
if (!a.hasMailbox() && !b.hasMailbox()) {
return a.getClientSupports().equals(b.getClientSupports());
} else if (a.hasMailbox() && b.hasMailbox()) {
MailboxUpdateWithMailbox am = (MailboxUpdateWithMailbox) a;
MailboxUpdateWithMailbox bm = (MailboxUpdateWithMailbox) b;
return am.getClientSupports().equals(bm.getClientSupports()) &&
mailboxPropertiesEqual(am.getMailboxProperties(),
bm.getMailboxProperties());
}
return false;
}
public static boolean mailboxPropertiesEqual(@Nullable MailboxProperties a,
@Nullable MailboxProperties b) {
if (a == null || b == null) {
return a == b;
}
return a.getOnion().equals(b.getOnion()) &&
a.getAuthToken().equals(b.getAuthToken()) &&
a.isOwner() == b.isOwner() &&
a.getServerSupports().equals(b.getServerSupports());
}
public static boolean hasEvent(Transaction txn,
Class<? extends Event> eventClass) {
for (CommitAction action : txn.getActions()) {
if (action instanceof EventAction) {
Event event = ((EventAction) action).getEvent();
if (eventClass.isInstance(event)) return true;
}
}
return false;
}
public static <E extends Event> E getEvent(Transaction txn,
Class<E> eventClass) {
for (CommitAction action : txn.getActions()) {
if (action instanceof EventAction) {
Event event = ((EventAction) action).getEvent();
if (eventClass.isInstance(event)) return eventClass.cast(event);
}
}
throw new AssertionError();
}
public static boolean isCryptoStrengthUnlimited() {
try {
return Cipher.getMaxAllowedKeyLength("AES/CBC/PKCS5Padding")
== Integer.MAX_VALUE;
} catch (NoSuchAlgorithmException e) {
throw new AssertionError();
}
}
}

View File

@@ -0,0 +1,36 @@
package org.briarproject.bramble.test;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
public class ThreadExceptionTest extends BrambleTestCase {
@Test(expected = AssertionError.class)
public void testAssertionErrorMakesTestCaseFail() {
// This is what BrambleTestCase does, too:
fail();
}
@Test
public void testExceptionInThreadMakesTestCaseFail() {
Thread t = new Thread(() -> {
System.out.println("thread before exception");
throw new RuntimeException("boom");
});
t.start();
try {
t.join();
System.out.println("joined thread");
} catch (InterruptedException e) {
System.out.println("interrupted while joining thread");
fail();
}
assertNotNull(exceptionInBackgroundThread);
exceptionInBackgroundThread = null;
}
}

View File

@@ -1,6 +1,7 @@
dependencyVerification {
verify = [
'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
'com.fasterxml.jackson.core:jackson-annotations:2.13.0:jackson-annotations-2.13.0.jar:81f9724d8843e8b08f8f6c0609e7a2b030d00c34861c4ac7e2099a7235047d6f',
'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
'com.google.dagger:dagger:2.33:dagger-2.33.jar:d8798c5b8cf6b125234e33af5c6293bb9f2208ce29b57924c35b8c0be7b6bdcb',

View File

@@ -10,12 +10,17 @@ apply from: '../dagger.gradle'
dependencies {
implementation project(path: ':bramble-api', configuration: 'default')
implementation 'org.bouncycastle:bcprov-jdk15on:1.69'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.70'
//noinspection GradleDependency
implementation 'com.h2database:h2:1.4.192' // The last version that supports Java 1.6
implementation 'org.bitlet:weupnp:0.1.4'
implementation 'net.i2p.crypto:eddsa:0.2.0'
implementation 'org.whispersystems:curve25519-java:0.5.0'
implementation 'org.briarproject:jtorctl:0.3'
implementation 'org.briarproject:jtorctl:0.5'
//noinspection GradleDependency
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
@@ -25,7 +30,8 @@ dependencies {
testImplementation "junit:junit:$junit_version"
testImplementation "org.jmock:jmock:$jmock_version"
testImplementation "org.jmock:jmock-junit4:$jmock_version"
testImplementation "org.jmock:jmock-legacy:$jmock_version"
testImplementation "org.jmock:jmock-imposters:$jmock_version"
testImplementation "com.squareup.okhttp3:mockwebserver:4.9.3"
testAnnotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"

View File

@@ -6,6 +6,7 @@ import org.briarproject.bramble.crypto.CryptoExecutorModule;
import org.briarproject.bramble.db.DatabaseExecutorModule;
import org.briarproject.bramble.identity.IdentityModule;
import org.briarproject.bramble.lifecycle.LifecycleModule;
import org.briarproject.bramble.mailbox.MailboxModule;
import org.briarproject.bramble.plugin.PluginModule;
import org.briarproject.bramble.properties.PropertiesModule;
import org.briarproject.bramble.rendezvous.RendezvousModule;
@@ -28,6 +29,8 @@ public interface BrambleCoreEagerSingletons {
void inject(LifecycleModule.EagerSingletons init);
void inject(MailboxModule.EagerSingletons init);
void inject(PluginModule.EagerSingletons init);
void inject(PropertiesModule.EagerSingletons init);
@@ -51,6 +54,7 @@ public interface BrambleCoreEagerSingletons {
c.inject(new DatabaseExecutorModule.EagerSingletons());
c.inject(new IdentityModule.EagerSingletons());
c.inject(new LifecycleModule.EagerSingletons());
c.inject(new MailboxModule.EagerSingletons());
c.inject(new RendezvousModule.EagerSingletons());
c.inject(new PluginModule.EagerSingletons());
c.inject(new PropertiesModule.EagerSingletons());

View File

@@ -14,6 +14,7 @@ import org.briarproject.bramble.identity.IdentityModule;
import org.briarproject.bramble.io.IoModule;
import org.briarproject.bramble.keyagreement.KeyAgreementModule;
import org.briarproject.bramble.lifecycle.LifecycleModule;
import org.briarproject.bramble.mailbox.MailboxModule;
import org.briarproject.bramble.plugin.PluginModule;
import org.briarproject.bramble.properties.PropertiesModule;
import org.briarproject.bramble.record.RecordModule;
@@ -43,6 +44,7 @@ import dagger.Module;
IoModule.class,
KeyAgreementModule.class,
LifecycleModule.class,
MailboxModule.class,
PluginModule.class,
PropertiesModule.class,
RecordModule.class,

View File

@@ -1,5 +1,6 @@
package org.briarproject.bramble.account;
import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.crypto.CryptoComponent;
import org.briarproject.bramble.api.crypto.DecryptionException;
@@ -209,7 +210,13 @@ class AccountManagerImpl implements AccountManager {
LOG.warning("Failed to load encrypted database key");
throw new DecryptionException(INVALID_CIPHERTEXT);
}
byte[] ciphertext = fromHexString(hex);
byte[] ciphertext;
try {
ciphertext = fromHexString(hex);
} catch (FormatException e) {
LOG.warning("Encrypted database key has invalid format");
throw new DecryptionException(INVALID_CIPHERTEXT);
}
KeyStrengthener keyStrengthener = databaseConfig.getKeyStrengthener();
byte[] plaintext = crypto.decryptWithPassword(ciphertext, password,
keyStrengthener);

Some files were not shown because too many files have changed in this diff Show More