Compare commits

..

1242 Commits

Author SHA1 Message Date
ialokim e617cab427 add same fix for private groups 2023-08-31 16:40:27 +02:00
Sebastian Kürten 606739b93d Add fix for nightly desktop users that broke their db for some contacts 2023-08-31 16:40:22 +02:00
akwizgran 87ef5e58ee Update Play Store metadata. 2023-08-28 16:54:13 +01:00
akwizgran b8b5e6c201 Update Play Store metadata. 2023-08-24 17:44:35 +01:00
akwizgran b68d24dca5 Bump version numbers for 1.5.6 release. 2023-08-23 10:45:39 +01:00
Torsten Grote 8bb3ea8a85 Merge branch 'no-tv-for-you' into 'master'
Remove support for Android TV

See merge request briar/briar!1808
2023-08-23 07:51:20 +00:00
Torsten Grote e13563952b Merge branch 'update-play-store-description' into 'master'
Add links to Play Store description

See merge request briar/briar!1807
2023-08-23 07:49:08 +00:00
Torsten Grote c74ebabcd1 Merge branch 'update-readme' into 'master'
Update readme: add privacy policy, remove Flattr

See merge request briar/briar!1806
2023-08-23 07:47:35 +00:00
akwizgran 47b8f47f07 Remove support for Android TV.
Google requires apps that support Android TV to be published as app bundles.
2023-08-22 15:59:20 +01:00
akwizgran d0feacd38f Add links to Play Store description. 2023-08-22 15:35:04 +01:00
akwizgran 2844adb8fa Bump version numbers for 1.5.5 release. 2023-08-21 14:54:06 +01:00
akwizgran f02dcc9f70 Update translations. 2023-08-21 14:53:21 +01:00
akwizgran 8ab7eb7edf Update readme: add privacy policy, remove Flattr. 2023-08-21 14:44:29 +01:00
akwizgran 1ef1ccc1f7 Merge branch 'fix-group-invitation-state' into 'master'
fix SharingState for private group creator

See merge request briar/briar!1805
2023-08-15 15:33:37 +00:00
akwizgran c7e382c1af Update translations. 2023-08-15 13:33:02 +01:00
ialokim 38a7217c3f fix SharingState for private group creator 2023-08-14 18:05:48 +02:00
Torsten Grote 6d3e81a074 Merge branch 'tor-0.4.7.14' into 'master'
Upgrade Tor to 0.4.7.14

See merge request briar/briar!1804
2023-08-11 12:44:57 +00:00
akwizgran 4591de2017 Upgrade Tor to 0.4.7.14. 2023-08-08 16:54:09 +01:00
Torsten Grote 6da34fac84 Merge branch 'bdf-javadocs' into 'master'
Add BDF javadocs

See merge request briar/briar!1801
2023-08-07 14:16:22 +00:00
Torsten Grote 810ac24cee Merge branch 'onionwrapper-0.0.5' into 'master'
Upgrade onionwrapper to 0.0.5

See merge request briar/briar!1803
2023-08-07 13:48:36 +00:00
akwizgran 704f69c9fd Upgrade onionwrapper to 0.0.5. 2023-08-07 14:17:11 +01:00
akwizgran 952ee42ad1 Merge branch 'blog-txns' into 'master'
Add transactional versions of BlogManager methods and a bug fix

See merge request briar/briar!1802
2023-07-13 20:30:21 +00:00
Torsten Grote f61b09d5a9 Fix BlogManager tests after last commits 2023-07-13 14:50:05 -03:00
Torsten Grote 8f735d176e Add transactional versions of BlogManager methods 2023-07-13 13:01:30 -03:00
Torsten Grote c47253fc5f Mark our own reblogs as read automatically 2023-07-13 12:54:17 -03:00
akwizgran b1cc63cd49 Deprecate methods for handling non-canonical BDF. 2023-07-05 15:23:14 +01:00
akwizgran 8cd6546840 Add javadocs for BDF classes. 2023-07-05 15:23:08 +01:00
akwizgran 7a0fb74c09 Merge branch '2266-target-sdk-33' into 'master'
Target SDK 33

Closes #2266

See merge request briar/briar!1800
2023-07-03 10:55:46 +00:00
akwizgran 882f536b8d Don't try to get Bluetooth address from settings. 2023-06-30 18:14:12 +01:00
Torsten Grote 74f8e84a9b React to device light idle mode in DozeWatchdog as well 2023-06-29 10:58:32 -03:00
Torsten Grote 23df2a41c2 Add @NotNullByDefault annotation to ConditionManagers 2023-06-29 10:58:32 -03:00
Torsten Grote c77eaf16d9 Log more mode changes in AndroidBatteryManager 2023-06-29 10:58:31 -03:00
Torsten Grote 9a6bb4b203 Set dozed to true when we are in LowPowerStandby 2023-06-29 10:58:31 -03:00
Torsten Grote 3d237a9104 Introduce tryToStartActivity() helper method 2023-06-29 10:58:31 -03:00
Torsten Grote fa216ffc6f Move requestEnableWiFi() into AbstractConditionManager 2023-06-29 10:58:31 -03:00
Torsten Grote a34631d36c Catch ActivityNotFoundException in places where we launch external intents 2023-06-29 10:58:31 -03:00
Torsten Grote 45cda191e5 Log changes to DeviceLightIdleMode in AndroidBatteryManager 2023-06-29 10:58:31 -03:00
Torsten Grote 2495b6f5c0 Add LowPowerStandby stub to DozeWatchdogImpl 2023-06-29 10:58:31 -03:00
Torsten Grote 03fc504f7d Log changes to LowPowerStandby in AndroidBatteryManager 2023-06-29 10:58:30 -03:00
Torsten Grote d19062e319 Don't disable hotspot start button after click
to avoid issues when coming back to the screen after granting permissions.
2023-06-29 10:58:30 -03:00
Torsten Grote fdb429ab7a Ask for NEARBY_WIFI_DEVICES permission on SDK 33 and up 2023-06-29 10:58:30 -03:00
Torsten Grote d0c59a6d75 Target SDK 33 and ask for notification permission
when creating account and when signing in
2023-06-29 10:58:30 -03:00
akwizgran 3bb39c2aa3 Merge branch 'fix-macos-x86-issue' into 'master'
Fix architecture detection for macOS Intel CPUs

See merge request briar/briar!1799
2023-06-28 11:07:26 +00:00
Sebastian Kürten 917fc5e5b6 Fix architecture detection for macOS Intel CPUs 2023-06-28 12:57:20 +02:00
akwizgran caa078585b Merge branch 'macos3' into 'master'
macOS support

See merge request briar/briar!1790
2023-06-22 17:04:09 +00:00
akwizgran e68c0c7f4b Merge branch 'onionwrapper-0.0.4' into 'master'
Upgrade onionwrapper to 0.0.4

See merge request briar/briar!1798
2023-06-22 12:26:21 +00:00
akwizgran a6b3749fb6 Extend comment explaining TorState -> State mapping. 2023-06-22 13:12:58 +01:00
Torsten Grote a8f6e8e4bd Merge branch 'check-network-status-periodically' into 'master'
Check network status periodically

See merge request briar/briar!1797
2023-06-21 13:32:39 +00:00
akwizgran 4d884601f0 Check more often, only broadcast status if changed. 2023-06-20 17:01:45 +01:00
akwizgran b71198d9b1 Check network status periodically on JavaSE. 2023-06-20 16:34:45 +01:00
Sebastian Kürten 079c6e0475 Add comment why we choose a differnt port for headless on macOS 2023-06-20 12:21:11 +02:00
Sebastian Kürten 3a0f8ed85c Document building of macOS headless jars and fix included native binaries on macOS 2023-06-15 18:07:18 +02:00
Sebastian Kürten 57f7501780 macOS support 2023-06-15 12:48:01 +02:00
akwizgran 3cc5699fe0 Upgrade onionwrapper to 0.0.4. 2023-06-14 17:06:10 +01:00
akwizgran 7d761710e6 Bump version numbers for 1.5.4 release. 2023-06-02 13:53:20 +01:00
Torsten Grote 7461d3c943 Merge branch '2434-use-us-locale-for-lowercasing-onion-hostname' into 'master'
Use US locale for lowercasing onion hostname

Closes #2434

See merge request briar/briar!1796
2023-05-31 16:27:24 +00:00
akwizgran 9291613175 Fix some other uses of toLowerCase() without a locale. 2023-05-30 22:06:18 +01:00
akwizgran ce6739a9fd Use US locale for lowercasing onion hostname. 2023-05-30 22:00:41 +01:00
akwizgran 1f1a97f62d Bump version numbers for 1.5.3 release. 2023-05-24 11:33:49 +01:00
akwizgran 7a33d26533 Merge branch 'new-handshake' 2023-05-24 11:22:23 +01:00
akwizgran f2c85f37be Merge branch '2391-share-link' into 'master'
Share a link to the Briar download page via another app

Closes #2391

See merge request briar/briar!1795
2023-05-22 15:35:43 +00:00
Torsten Grote 8e3fa872fd Move About settings item to the bottom 2023-05-17 08:53:24 -03:00
akwizgran 0d1e81ebdb Merge branch 'use-default-secure-random-provider-on-macos' into 'master'
Use system default secure random provider on macOS

Closes briar-desktop#132

See merge request briar/briar!1794
2023-05-17 09:25:42 +00:00
Sebastian Kürten bded4e7bc8 Use system default secure random provider on macOS 2023-05-17 11:13:43 +02:00
Torsten Grote bf1a5cf218 Allow sharing download link for Briar from settings actions 2023-05-16 16:55:19 -03:00
akwizgran dd7a638984 Merge branch 'fa-string-fix' into 'master'
Fix translation

See merge request briar/briar!1793
2023-05-16 10:38:47 +00:00
paul 942222131e Fix translation. 2023-05-15 21:48:02 +00:00
akwizgran 643757e407 Bump version numbers for 1.5.2 release. 2023-05-15 15:48:50 +01:00
akwizgran 7c530ad7a3 Update translations. 2023-05-15 15:48:00 +01:00
Torsten Grote 23b2dfa4a8 Merge branch 'conversationmanager-txn' into 'master'
Add transactional versions to delete message functions

See merge request briar/briar!1792
2023-05-15 12:03:53 +00:00
ialokim ce10e6770f add transactional versions to delete message functions 2023-05-12 23:58:59 +02:00
Torsten Grote b88dbee881 Merge branch 'onionwrapper-0.0.2' into 'master'
Upgrade onionwrapper to 0.0.2 and dont-kill-me-lib to 0.2.7

See merge request briar/briar!1791
2023-05-10 17:00:38 +00:00
akwizgran 0ca21ad4c0 Upgrade onionwrapper to 0.0.2 and dont-kill-me-lib to 0.2.7. 2023-05-09 15:23:17 +01:00
akwizgran a14f62dcc3 Update translations. 2023-05-05 14:57:46 +01:00
akwizgran f0c1ebcc1b Merge branch 'kill-android4' into 'master'
Drop support for Android 4

See merge request briar/briar!1770
2023-05-05 13:54:07 +00:00
akwizgran 4a4b04bec3 Rename version constant. 2023-04-26 17:10:23 +01:00
Torsten Grote 6f57ec8281 Merge branch 'privategroup-testdata' into 'master'
TestDataCreator with support for private groups

See merge request briar/briar!1788
2023-04-26 12:38:53 +00:00
Sebastian Kürten 0eb0bbdc99 Add ability to add private group test data in settings 2023-04-26 00:05:49 +02:00
Torsten Grote 76344344d2 Downgrade material library due to upstream bug
https://github.com/material-components/material-components-android/issues/3191
2023-04-25 11:29:51 -03:00
akwizgran 624f11a61f Bump version numbers for 1.5.1 release. 2023-04-21 15:51:55 +01:00
Torsten Grote fbc32830bd Force kotlin standard lib to latest version to prevent jetifier issues 2023-04-19 11:02:33 -03:00
Torsten Grote 145117a1dc Update most of the things 2023-04-19 11:02:33 -03:00
Torsten Grote 6ed55bcd7d Drop support for Android 4
new minSdk is 21
2023-04-19 11:02:31 -03:00
akwizgran c6a284bd6d Bump version numbers for 1.5.0 release. 2023-04-19 14:23:20 +01:00
akwizgran 9d4d992009 Update translations. 2023-04-19 14:21:38 +01:00
Torsten Grote e92eb1c699 Merge branch 'enable-mailbox-in-release-builds' into 'master'
Enable mailbox support in release builds

See merge request briar/briar!1789
2023-04-19 13:17:53 +00:00
akwizgran 07e56f7086 Remove mailbox feature flag. 2023-04-18 14:18:58 +01:00
akwizgran fe31e60e66 Merge branch '2420-obsolete-bluetooth-permission-api-32' into 'master'
Require obsolete Bluetooth permission on API 32 (and counting)

Closes #2420

See merge request briar/briar!1782
2023-04-18 11:43:59 +00:00
akwizgran 7810e7e848 Enable mailbox support in release builds. 2023-04-18 12:37:33 +01:00
ialokim f8015272f4 private group support for TestDataCreator 2023-04-06 16:43:18 +02:00
Torsten Grote 2566105f13 Merge branch 'tor-wrapper-library' into 'master'
Use Tor wrapper library

See merge request briar/briar!1787
2023-04-03 19:27:58 +00:00
akwizgran cab8f834bd Convert onionwrapper from a submodule to a dependency. 2023-03-29 17:01:30 +01:00
akwizgran ec0a754289 Remove BridgeTest from CI config. 2023-03-29 11:58:38 +01:00
akwizgran e81fe44ea1 Update onionwrapper. 2023-03-28 18:09:43 +01:00
akwizgran e399b9196a Merge branch 'tor-plugin-refactoring' into 'master'
Refactor Tor plugin to separate out reusable code

See merge request briar/briar!1786
2023-03-28 16:42:17 +00:00
akwizgran aadbd3a662 Fix dependencies for headless jar tasks. 2023-03-28 17:41:22 +01:00
akwizgran f4fd65aee4 Remove jtorctl dependency. 2023-03-28 17:28:15 +01:00
akwizgran 61e7d2ebf9 Move Tor wrapper to library. 2023-03-28 17:18:05 +01:00
akwizgran 06dd8c65aa Fix parsing of bootstrap percentage. 2023-03-28 15:44:25 +01:00
akwizgran 2f351b318e Move CircumventionProvider classes to wrapper package. 2023-03-28 15:40:48 +01:00
akwizgran a468af94db Add bootstrap percentage and HS desc uploads to observer interface. 2023-03-28 11:31:20 +01:00
akwizgran 49f10e7e82 Move wake lock code to dont-kill-me-lib. 2023-03-28 10:58:45 +01:00
akwizgran 01b1741e83 Factor out Tor wrapper from plugin 2023-03-27 12:02:05 +01:00
akwizgran b7003a3587 Update translations. 2023-03-20 10:59:32 +00:00
akwizgran 3dbf327937 Merge branch 'backport-os-check-algorithm' into 'master'
Backport OS-check logic from Compose Multiplatform

See merge request briar/briar!1785
2023-03-10 16:28:33 +00:00
akwizgran 462f57c966 Upgrade handshake protocol to new key agreement method. 2023-03-10 16:05:59 +00:00
akwizgran 8d20c5d8b8 Reify RecordPredicate for easier testing. 2023-03-10 15:15:29 +00:00
Sebastian Kürten 73d806f8b9 Backport OS-check logic from Compose Multiplatform 2023-03-09 17:03:08 +01:00
akwizgran f1ae57b213 Merge branch 'mailbox-fix' into 'master'
Fix mailbox integration tests

See merge request briar/briar!1784
2023-03-09 15:42:22 +00:00
Torsten Grote cae9efb4bf Fix integration tests by using dynamic webserver port of mailbox 2023-03-09 12:29:48 -03:00
Torsten Grote 39ac737015 Merge branch 'no-personalized-learning' into 'master'
Set "no personalized learning" flag for all text input

See merge request briar/briar!1783
2023-03-09 14:14:11 +00:00
akwizgran edd3310d03 Set "no personalized learning" flag for all text input. 2023-03-09 10:52:46 +00:00
akwizgran a09d88daa8 Add Slovak to list of available languages. 2023-03-09 09:53:43 +00:00
akwizgran 3dc984659d Update translations. 2023-03-09 09:41:02 +00:00
akwizgran f580525734 Require obsolete Bluetooth permission on API 32 (and counting). 2023-03-06 17:46:34 +00:00
akwizgran fbf0f63ff7 Merge branch 'introduction-manager-txn' into 'master'
Transactional versions for introduction manager and private group invitation manager

See merge request briar/briar!1781
2023-03-06 12:08:34 +00:00
ialokim ee9234e12e transactional versions for GroupInvitationManager 2023-03-05 22:10:50 +01:00
akwizgran 2657e2bc08 Merge branch '2245-toast-name-wrong' into 'master'
Remove wrong name from "Contact already exists"

Closes #2245

See merge request briar/briar!1780
2023-02-27 14:26:27 +00:00
Torsten Grote 3c40c11dfb remove wrong name from "Contact already exists" 2023-02-27 10:43:12 -03:00
akwizgran 3bdbabf38a Merge branch 'no-longer-use-deprecated-double-valueof' into 'master'
No longer use deprecated Double.valueOf()

See merge request briar/briar!1779
2023-02-27 12:45:01 +00:00
Sebastian Kürten a378c24af8 No longer use deprecated Double.valueOf() 2023-02-27 12:22:27 +01:00
ialokim b09ea495e7 add transactional versions to introductionManager and privateGroupManager 2023-02-24 18:43:08 +01:00
akwizgran 070165f608 Bump version numbers for 1.4.23 release. 2023-02-24 14:04:57 +00:00
Torsten Grote 445f174275 Merge branch 'update-tor-bridges' into 'master'
Update Tor bridges

See merge request briar/briar!1778
2023-02-24 13:28:27 +00:00
akwizgran ea5af72878 Add some non-default bridges. 2023-02-24 12:31:22 +00:00
akwizgran ecf2e75424 Remove some bridges not known to Onionoo. 2023-02-24 12:30:24 +00:00
akwizgran feebd89029 Remove some failing bridges. 2023-02-24 12:23:37 +00:00
akwizgran cf723f8002 Merge branch 'dont-unpack-tor' into 'master'
Upgrade tor, obfs4proxy, snoflake and convert tor to regular dependencies in bramble-java

See merge request briar/briar!1775
2023-02-24 12:13:31 +00:00
akwizgran b8e743021c Update translations. 2023-02-24 12:11:58 +00:00
Sebastian Kürten b785b6c10f Upgrade tor 2023-02-24 13:05:46 +01:00
Sebastian Kürten 26ec200f50 Convert tor to regular dependencies 2023-02-24 12:51:50 +01:00
akwizgran 82efb0d044 Upgrade Tor, obfs4 and snowflake; use new artifact layout. 2023-02-23 16:25:08 +01:00
akwizgran 4ac4ba13d4 Merge branch 'split-app' into 'master'
Split out APP for check_reproducibility CI job

See merge request briar/briar!1777
2023-02-22 17:06:31 +00:00
Torsten Grote 0844cd3547 Split out APP for check_reproducibility CI job 2023-02-21 16:14:02 -03:00
Torsten Grote 69e6648ded Merge branch '2415-check-bt-socket-streams-not-null' into 'master'
Check that BluetoothSocket's input and output streams aren't null

Closes #2415

See merge request briar/briar!1776
2023-02-21 13:38:49 +00:00
akwizgran 518aeb38b9 Check that BluetoothSocket's input and output streams aren't null. 2023-02-21 13:29:35 +00:00
akwizgran 7e5e61fc05 Merge branch 'dont-package-all-snowflake-architectures-into-headless-jars' into 'master'
Don't package all snowflake architectures into headless jars

See merge request briar/briar!1774
2023-02-21 11:34:04 +00:00
Sebastian Kürten 6ecb44bcaa Don't package all snowflake architectures into headless jars 2023-02-21 09:38:24 +01:00
akwizgran f02bbebf6c Bump version numbers for 1.4.22 release. 2023-02-20 17:29:41 +00:00
akwizgran b8612715f8 Merge branch 'check_repro' into 'master'
Fix variable substitution for check_reproducibility

See merge request briar/briar!1773
2023-02-20 17:26:25 +00:00
Torsten Grote b86ddfa22f Fix variable substitution for check_reproducibility 2023-02-20 14:08:19 -03:00
akwizgran 0dd4d86f4a Bump version numbers for 1.4.21 release. 2023-02-20 16:00:45 +00:00
akwizgran 17e0829f42 Update translations. 2023-02-20 16:00:05 +00:00
Torsten Grote 938d8b71a0 Merge branch 'bdf-cleanup' into 'master'
Clean up some BDF quirks

See merge request briar/briar!1772
2023-02-20 14:15:47 +00:00
akwizgran 1b808584b6 Replace some more longs with ints. 2023-02-20 13:53:40 +00:00
akwizgran 36db5b48ef Remove methods for manually reading lists and dictionaries. 2023-02-20 13:05:38 +00:00
akwizgran ccd6ed9ff0 Add fast path for writing BdfDictionaries. 2023-02-20 11:56:13 +00:00
akwizgran 0ced10b3a9 Use getInt() in a couple more places. 2023-02-20 11:33:48 +00:00
akwizgran 98064e9efe Remove BdfWriter methods for manually constructing lists and dicts. 2023-02-18 17:36:02 +00:00
akwizgran 63172ef2e4 Add 32-bit int methods to BdfList and BdfDictionary.
We use these a lot so it's useful to have built-in support.

Also refactor BdfList and BdfDictionary so the getters that take default values behave like the other getters. This simplifies the semantics and allows duplicated code to be removed.

Add comprehensive tests for BdfList and BdfDictionary.
2023-02-18 17:36:02 +00:00
akwizgran 7a854e70cb Add BdfReader methods for 32-bit ints.
We use these a lot so it's convenient to have built-in support.

Also make BdfReaderImpl and BdfWriterImpl final to enable compiler optimisations.
2023-02-18 17:36:02 +00:00
akwizgran ac8a4db457 Add support for reading and writing BDF in canonical form.
Existing transport property updates may not be in canonical form, so we need to parse them leniently.
2023-02-18 17:36:02 +00:00
akwizgran 5a09530670 Reject invalid UTF-8 instead of ignoring it. 2023-02-18 17:10:57 +00:00
akwizgran 4fe91bacc6 Merge branch 'sync-record-reader-tests' into 'master'
Add some tests for sync record reader

See merge request briar/briar!1771
2023-02-17 17:38:04 +00:00
akwizgran 7f70a1519b Make message fields local. 2023-02-17 17:28:10 +00:00
akwizgran c92ee0458e Add some tests for sync record reader. 2023-02-17 17:19:59 +00:00
akwizgran 10b1fe756d Merge branch 'reproduce-headless' into 'master'
Check reproducibility of headless releases

See merge request briar/briar!1769
2023-02-13 16:21:50 +00:00
Torsten Grote 1a2a250be0 Check reproducibility of headless releases 2023-02-10 16:43:01 -03:00
akwizgran a621b8077e Merge branch 'update-reproducer-release-tag' into 'master'
Update briar-reproducer release tag

See merge request briar/briar!1768
2023-02-10 14:17:15 +00:00
akwizgran 19084d4060 Merge branch 'mailbox-version-mismatch' into 'master'
Show mailbox version issues before connection failures

See merge request briar/briar!1767
2023-02-10 13:57:36 +00:00
akwizgran 2f73ee1b57 Update briar-reproducer release tag. 2023-02-10 13:54:44 +00:00
Torsten Grote 45fa12c0b3 Show mailbox version issues before connection failures 2023-02-09 13:10:02 -03:00
akwizgran 4253bbaaf5 Update translations. 2023-02-06 12:40:04 +00:00
akwizgran 8c2e58796b Merge branch 'mailbox-convert-qr' into 'master'
Add convenience method for converting mailbox pairing text into QR code payload

See merge request briar/briar!1766
2023-02-03 14:34:04 +00:00
Torsten Grote 3f13e7e9c3 Add convenience method for converting mailbox pairing text into QR code payload 2023-02-03 11:18:25 -03:00
akwizgran 421a93b9a6 Merge branch 'rss-from-file' into 'master'
Allow to import RSS feeds from a file

See merge request briar/briar!1765
2023-01-31 13:17:21 +00:00
Torsten Grote 8a088638db Don't show success fragment for RSS file import 2023-01-31 09:57:51 -03:00
Torsten Grote a888c5f632 Allow to import RSS feeds from a file 2023-01-30 15:31:25 -03:00
Torsten Grote 0b94814620 Merge branch 'remove-migration-code' into 'master'
Remove various bits of code whose migration periods have passed

See merge request briar/briar!1750
2023-01-30 13:59:02 +00:00
akwizgran e82e11acfa Merge branch '2384-mailbox-problem-notification' into 'master'
Clear mailbox problem notification after unlinking

Closes #2384

See merge request briar/briar!1764
2023-01-27 15:09:27 +00:00
Torsten Grote 795461d9a8 Clear mailbox problem notification after unlinking 2023-01-27 11:49:01 -03:00
Torsten Grote 7b8d01cfe0 Merge branch '1822-rss-feeds-backend' into 'master'
Resolve "Import RSS feeds shared by other apps"

See merge request briar/briar!1763
2023-01-25 11:39:34 +00:00
akwizgran abd04ee7f5 Add tests for feed serialisation/deserialisation. 2023-01-24 17:27:52 +00:00
akwizgran cc5365eaf0 Remove redundant comparison from test. 2023-01-24 17:27:34 +00:00
akwizgran 6b20b03698 Bump version numbers for 1.4.20 release. 2023-01-24 15:51:48 +00:00
akwizgran 9da7fbf4f6 Update translations. 2023-01-24 15:51:26 +00:00
akwizgran f64f442fcf Merge branch 'add-comment-for-is-connected' into 'master'
Add comment about NetworkInfo#isConnected()

See merge request briar/briar!1762
2023-01-24 15:25:52 +00:00
akwizgran 6eda2f6d13 AnimalSniffer doesn't allow StandardCharsets in tests. 2023-01-24 14:50:40 +00:00
akwizgran 6faa095dfb FeedMatcher interface doesn't need to be public. 2023-01-24 14:48:55 +00:00
akwizgran 4007fca668 Add integration tests for importing an RSS feed from a file. 2023-01-24 14:15:03 +00:00
akwizgran 28a747f7f3 Add method for adding an RSS feed from an input stream. 2023-01-24 13:57:44 +00:00
Sebastian Kürten fd2d5c9173 Add comment about NetworkInfo#isConnected() 2023-01-24 14:48:03 +01:00
akwizgran 8f7bb9d26b Don't overwrite the list of feeds after fetching. 2023-01-24 13:28:22 +00:00
akwizgran dc220200b6 Match newly added RSS feeds to existing feeds. 2023-01-24 12:43:14 +00:00
Torsten Grote 0cea137d75 Merge branch 'update-tor-bridges' into 'master'
Update Tor bridges

See merge request briar/briar!1761
2023-01-23 15:06:28 +00:00
akwizgran 2eef34f424 Use new transaction wrappers. 2023-01-23 13:02:16 +00:00
akwizgran a68fff9dd2 Merge branch 'tor-0.4.7.13' into 'master'
Upgrade Tor to 0.4.7.13

See merge request briar/briar!1760
2023-01-23 12:11:32 +00:00
akwizgran ddc8f4a7d7 Add three non-default obfs4 bridges. 2023-01-20 16:12:47 +00:00
akwizgran f961b6a80b Remove three failing bridges. 2023-01-20 16:11:11 +00:00
akwizgran 93439d9c17 Update translations. 2023-01-20 15:50:28 +00:00
akwizgran f3ee884816 Upgrade Tor to 0.4.7.13. 2023-01-20 15:34:23 +00:00
akwizgran 8ca22043cf Merge branch '1897-sharing-status' into 'master'
Introduce SharingStatus to report more fine-grained status

Closes #1897

See merge request briar/briar!1758
2023-01-20 14:33:32 +00:00
Torsten Grote 9353b78da8 Clarify sharing state docs 2023-01-20 11:13:35 -03:00
Torsten Grote 429bbe1275 Introduce more sharing states 2023-01-20 11:13:35 -03:00
Torsten Grote c5fb1416bd Update JavaDoc for SharingState change 2023-01-20 11:13:34 -03:00
Torsten Grote e52cbd896e Introduce SharingStatus to report more fine-grained status 2023-01-20 11:13:34 -03:00
akwizgran ab1b8784b7 Merge branch '90-clickable-links' into 'master'
Resolve "Handle Hyperlinks (Clickable Links)"

Closes #90

See merge request briar/briar!1757
2023-01-20 13:47:08 +00:00
akwizgran 55a4daa92f Merge branch 'progressbar-remove-contact' into 'master'
Show progress bar while removing contact

See merge request briar/briar!1759
2023-01-20 13:44:29 +00:00
akwizgran e52250f1e4 Don't sort list of RSS feeds in UI. 2023-01-18 15:04:38 +00:00
akwizgran 33d01aac8c Add matcher for matching an imported feed against existing feeds. 2023-01-18 15:04:38 +00:00
akwizgran b920382e44 Store additional properties of RSS feed in metadata. 2023-01-18 15:04:38 +00:00
akwizgran 1a2f85f701 Small code cleanups for feed manager, don't fetch new feeds twice. 2023-01-18 15:04:33 +00:00
Airplane Mode 186bcc0b47 Show progress bar while removing contact 2023-01-16 23:56:26 +00:00
Torsten Grote 8b9140f477 Merge branch 'tor-0.4.7.12' into 'master'
Upgrade Tor to 0.4.7.12

See merge request briar/briar!1755
2023-01-13 16:25:42 +00:00
Katelyn Dickey f959c32935 Remove autoLink attribute which was causing warnings to show twice, and highlight links in comments before a blog is expanded 2023-01-05 17:20:40 -05:00
akwizgran 1c060bc6db Upgrade Tor to 0.4.7.12. 2023-01-04 17:51:46 +00:00
Katelyn Dickey 5e44e4d308 Add clickable links to blog comments 2023-01-03 20:52:36 -05:00
Katelyn Dickey 75d5dec45f Add clickable links to notices/requests 2023-01-03 18:38:13 -05:00
Katelyn Dickey d825227eb5 Add clickable links to threads (forums/groups) 2023-01-03 18:38:07 -05:00
Katelyn Dickey 967dd1f18d Add clickable links for conversations 2023-01-03 18:37:40 -05:00
akwizgran 4a4147b563 Bump version numbers for 1.4.19 release. 2022-12-30 11:15:32 +00:00
akwizgran 08b72af647 Update translations. 2022-12-30 11:07:38 +00:00
akwizgran 528e090c6f Merge branch '2409-require-obsolete-bluetooth-permission' into 'master'
Require obsolete BLUETOOTH permission on API 31

Closes #2409

See merge request briar/briar!1754
2022-12-30 10:56:29 +00:00
akwizgran 652f9e5705 Require obsolete BLUETOOTH permission on API 31.
This is a workaround for a platform bug on Xiaomi/Redmi/POCO devices that still checks for the obsolete permission.
2022-12-28 14:12:30 +00:00
akwizgran 6a91ec7a6b Merge branch '2407-bluetooth-permission' into 'master'
Always check Bluetooth permission when trying to get own address

Closes #2407

See merge request briar/briar!1753
2022-12-28 11:07:31 +00:00
akwizgran c3a9eff96b Always check Bluetooth permission when trying to get own address. 2022-12-22 17:46:12 +00:00
akwizgran bd05d893eb Merge branch '2397-wrong-type-of-qr-code' into 'master'
Tweak text for unknown QR code type

See merge request briar/briar!1752
2022-12-21 12:29:48 +00:00
akwizgran 6965bc0acd Tweak text for unknown QR code type. 2022-12-21 12:19:31 +00:00
akwizgran c6e9554026 Merge branch '2397-wrong-type-of-qr-code' into 'master'
Show appropriate error message if user scans wrong kind of QR code

Closes #2397

See merge request briar/briar!1748
2022-12-19 15:43:16 +00:00
akwizgran ab8734e373 Show relevant message when contact QR code has unknown format. 2022-12-19 10:24:58 +00:00
akwizgran 267956b36c Restore javadoc for qrCodeTooOld flag. 2022-12-19 10:04:55 +00:00
akwizgran ec84ddb38b Merge branch '2403-show-progress-while-connecting-to-mailbox' into 'master'
Show progress while connecting to mailbox

Closes #2403

See merge request briar/briar!1747
2022-12-14 12:20:43 +00:00
akwizgran ba2db48d8e Center text, add margin at bottom to center layout. 2022-12-14 12:03:06 +00:00
akwizgran 186f61f771 Set width of text views to 0dp so margins are applied. 2022-12-12 16:14:34 +00:00
akwizgran 47971517cd Bump version numbers for 1.4.18 release. 2022-12-12 14:03:52 +00:00
akwizgran 8db182d7e5 Update translations. 2022-12-12 14:03:01 +00:00
akwizgran d44a609d0c Merge branch '2405-bonded-devices' into 'master'
Don't try to get bonded Bluetooth devices on API 31+

See merge request briar/briar!1751
2022-12-12 13:58:21 +00:00
akwizgran 0a1892d39f Merge branch 'do-not-crash-when-tor-crashes' into 'master'
Don't crash when the Tor process crashes

See merge request briar/briar!1749
2022-12-12 11:04:52 +00:00
akwizgran 9b092da37a Don't try to get bonded Bluetooth devices on API 31+. 2022-12-07 18:38:36 +00:00
akwizgran 7a3ffcbae6 Remove various bits of code whose migration periods have passed. 2022-12-07 17:47:02 +00:00
akwizgran 852e2c29e3 Don't crash when the Tor process crashes. 2022-12-07 17:28:33 +00:00
akwizgran 1b087d59d4 Merge branch '2400-outline-buttons' into 'master'
Use outlined button style

Closes #2400

See merge request briar/briar!1746
2022-12-07 16:54:34 +00:00
akwizgran 30ce8651b5 Fix ripple effect for outlined buttons on API 21+. 2022-12-07 15:50:56 +00:00
akwizgran 80a8ee4de9 Fix button inheritance. 2022-12-07 11:16:34 +00:00
akwizgran 354f3bc1cf Use chain so that margins are enforced. 2022-12-07 11:13:42 +00:00
akwizgran 1e6b018ff4 Add corner radius and increase top inset. 2022-12-07 11:03:46 +00:00
akwizgran eba489bb98 Merge branch 'project-dependencies' into 'master'
Refactor dependencies to satisfy Android Studio's linter

See merge request briar/briar!1745
2022-12-05 14:54:12 +00:00
akwizgran 2bfdcaaa42 Declare dependencies for custom jar tasks. 2022-12-02 18:05:28 +00:00
akwizgran c2e71ef52f Remove configuration: default, make transitive dependencies explicit. 2022-12-02 17:43:52 +00:00
akwizgran 9ee8fe74ba Export bramble/briar-api as API of bramble/briar-core. 2022-12-02 15:53:23 +00:00
akwizgran 95d8783852 Show appropriate error message if contact QR code is scanned. 2022-12-02 14:27:42 +00:00
akwizgran b4f3604584 Show appropriate error message if mailbox QR code is scanned. 2022-12-02 13:35:00 +00:00
akwizgran badccac90c Factor out recognition of QR code format. 2022-12-02 13:35:00 +00:00
akwizgran 1b8d1a5a8d Update test expectations. 2022-11-30 17:30:33 +00:00
akwizgran 2fe57d2597 Show progress while connecting to mailbox. 2022-11-30 17:17:08 +00:00
akwizgran 904d5b2ce2 Remove unused dimension. 2022-11-30 10:58:44 +00:00
akwizgran 1911b3dd97 Make OfflineFragment suitable for small screens. 2022-11-30 10:44:39 +00:00
akwizgran bd430a1009 Use outlined button style for secondary actions. 2022-11-30 10:33:11 +00:00
akwizgran c16d0e8f45 Refactor dependencies to satisfy Android Studio's linter.
If an Android module depends on another module's default configuration, Android Studio's linter won't recognise references to classes in the other module. Instead, the Android module must depend on the other module without specifying a configuration. This entails some changes in the handling of transitive dependencies, and the other module must include its main classes in its testOutput artifact so the Android module's tests can use them.
2022-11-29 13:35:29 +00:00
akwizgran 847273c558 Merge branch 'transactions-forum' into 'master'
Add transactional versions to functions related to forums

See merge request briar/briar!1743
2022-11-23 17:47:59 +00:00
ialokim b9bac8b6a5 add transactional versions to functions related to forums 2022-11-23 18:37:07 +01:00
akwizgran c855967d56 Bump version numbers for 1.4.17 release. 2022-11-14 10:41:58 +00:00
Torsten Grote bae97e3312 Merge branch 'unpack-tor-binaries-earlier' into 'master'
Unpack Tor binaries earlier to avoid issues with task order

See merge request briar/briar!1742
2022-11-11 18:21:31 +00:00
akwizgran f1be3031a7 Unpack Tor binaries earlier to avoid issues with task order. 2022-11-11 15:28:21 +00:00
akwizgran 3173486b3b Bump version numbers for 1.4.16 release. 2022-11-10 14:55:11 +00:00
akwizgran c445b21d58 Update translations. 2022-11-10 14:54:30 +00:00
akwizgran 9a16cf6e54 Update translations. 2022-11-07 17:52:57 +00:00
akwizgran a22990c1ed Merge branch 'illustration-revert' into 'master'
Don't change icons for thinner versions

See merge request briar/briar!1740
2022-11-07 13:56:42 +00:00
Torsten Grote 8262fa183b Revert "Replace illustration for mailbox success"
This reverts commit 65509137
2022-11-07 10:05:09 -03:00
akwizgran c3f3c6211d Merge branch 'mailbox-integration-tests' into 'master'
First integration test for mailbox with two contacts

See merge request briar/briar!1725
2022-11-07 12:58:18 +00:00
Torsten Grote 0c40f39a90 Revert "Replace illustration for error fragment"
This reverts commit dab8d731
2022-11-07 09:53:19 -03:00
Torsten Grote 20b9aa86f7 revert icon changes 2022-11-07 09:53:19 -03:00
Torsten Grote a00c920382 Merge branch 'update-play-store-translations' into 'master'
Update Play Store translations and config

See merge request briar/briar!1739
2022-11-04 17:36:08 +00:00
akwizgran e40d6552bc Merge branch 'fix-fastlane-metadata' into 'master'
Execute Transifex for fastlane metadata from correct directory

See merge request briar/briar!1738
2022-11-04 17:09:36 +00:00
Torsten Grote 5e1564de6c don't insist on 2 uploaded messages in case Bob deletes one of them quickly 2022-11-04 13:53:58 -03:00
Torsten Grote 155daae8d0 Execute Transifex for fastlane metadata from correct directory 2022-11-04 13:19:23 -03:00
Torsten Grote 6680abf925 Make MailboxIntegrationTest a bit more thorough
by checking, after adding the contact to the mailbox but before creating the message, that the first file containing the mailbox update gets uploaded. Then after creating the message, the second file should be uploaded.
2022-11-04 12:01:00 -03:00
akwizgran 9bbfea525a Merge branch '2370-fix-readme-for-headless-jar' into 'master'
Update instructions on how to build and run briar-headless

Closes #2370

See merge request briar/briar!1726
2022-11-04 13:01:53 +00:00
akwizgran 979ef077b3 Update Play Store translations and config. 2022-11-04 12:51:49 +00:00
Torsten Grote b7e1a987fc Don't depend on briar for mailbox integration tests
Use transport properties instead of sending private messages
2022-11-03 10:57:06 -03:00
Torsten Grote a705caa5fa Add better logging for integration tests by injecting a ThreadFactory that can set thread names 2022-11-02 13:25:30 -03:00
akwizgran 441b28fede Merge branch 'remove-jcenter' into 'master'
Remove jcenter repository from gradle files

See merge request briar/briar!1736
2022-11-01 13:18:17 +00:00
Torsten Grote 9c95534f39 Merge branch 'merge-redundant-strings' into 'master'
Merge redundant strings

See merge request briar/briar!1737
2022-11-01 13:17:04 +00:00
Torsten Grote 57015c36b2 Re-format witness.gradle to make it easier to see what changed 2022-11-01 09:57:48 -03:00
akwizgran a2815c75a3 Merge redundant strings. 2022-11-01 12:53:52 +00:00
Torsten Grote 9ce82af856 Merge branch '348-add-hint-to-scan-both-qr-codes' into 'master'
Add hints that both users need to scan each other's QR codes/add each other's links

See merge request briar/briar!1734
2022-11-01 12:49:39 +00:00
Torsten Grote 4b792ff040 Remove jcenter repo from gradle files 2022-11-01 09:48:39 -03:00
Torsten Grote 904355b0a6 Replace khttp test library with a fork that is available on maven central 2022-11-01 09:48:38 -03:00
Torsten Grote 02f2fdd4a1 Vendorize TrustedIntents library and upgrade screengrab 2022-11-01 09:48:38 -03:00
akwizgran 9f039ff0b8 Address review feedback. 2022-11-01 12:23:26 +00:00
akwizgran ba83290fcd Add a hint that both parties need to add each other's links. 2022-11-01 12:23:26 +00:00
Torsten Grote 05f84000b3 Merge branch 'testdatacreator-featureflags' into 'master'
Prevent crash in TestDataCreator if blogs or forums are not enabled in core

Closes briar-desktop#420

See merge request briar/briar!1735
2022-11-01 12:18:35 +00:00
akwizgran 7302bf9d7a Add a hint that both parties need to scan each other's QR codes. 2022-11-01 12:05:28 +00:00
akwizgran 8c269541c3 Merge branch 'illustration-revamp' into 'master'
Illustration revamp

See merge request briar/briar!1722
2022-11-01 11:50:29 +00:00
Torsten Grote 324ca1b50b Address review feedback 2022-10-31 18:16:27 -03:00
akwizgran 79730484c0 Merge branch 'android-12' 2022-10-31 13:56:21 +00:00
akwizgran 86fb648dae Merge branch 'client-version-update-events' into 'master'
Send ClientVersionUpdatedEvent for each client state change, not only on version updates

See merge request briar/briar!1724
2022-10-31 12:36:25 +00:00
Torsten Grote 52809d8f2d Add permission rationale for camera and Bluetooth combined 2022-10-27 10:47:06 -03:00
Torsten Grote 0a906998fe Address review feedback 2022-10-27 10:47:06 -03:00
Torsten Grote 4a65bc1726 Update some libraries 2022-10-27 10:43:30 -03:00
Torsten Grote f395ab1cb5 Disable our splash screen on Android 11+
in order to avoid two splash screens from being shown.
2022-10-27 10:42:41 -03:00
Torsten Grote e6c051fee4 Require location for hotspot on Android 12+
This seems to be necessary. Without the location turned on, the hotspot does not start showing a p2p error.
2022-10-27 10:42:41 -03:00
Torsten Grote e76701f988 Add current AppStandbyBucket to BriarReportCollector 2022-10-27 10:42:41 -03:00
Torsten Grote e6616a8c36 Exclude all files from D2D transfers 2022-10-27 10:42:40 -03:00
Torsten Grote 824a9e1124 Handle new BLUETOOTH_SCAN and BLUETOOTH_CONNECT permission
We need to have those permissions before doing things like accessing the Bluetooth address. So we force-disable the Bluetooth plugin if the permission is not granted. The UI then forces the permission before allowing to enable the plugin.
2022-10-27 10:42:40 -03:00
Torsten Grote 113793045f Set pending intents to be immutable 2022-10-27 10:42:40 -03:00
Torsten Grote c04937b1fa Do export only activities that need to react to external intents
For some reason SettingsActivity does not need to be exported for it to be launched from system app settings.

androidx.test.ext:junit needed to be upgraded because it somehow brought in an activity without exported attribute
2022-10-27 10:42:40 -03:00
Torsten Grote e8994d503e Bump targetSdk to 31 (Android 12) 2022-10-27 10:42:38 -03:00
ialokim 768bb6fc64 send ClientVersionUpdatedEvent for each client state change, not only on version updates 2022-10-27 11:45:46 +02:00
Torsten Grote 645eba7fe7 Replace illustration for add contact nearby error 2022-10-25 15:49:04 -03:00
Torsten Grote c76ed41958 Replace illustration for share app offline intro 2022-10-25 15:49:04 -03:00
Torsten Grote 4a2c1113c1 Replace illustration for crash 2022-10-25 15:49:04 -03:00
Torsten Grote b6f78a8667 Replace illustration for connecting via Bluetooth 2022-10-25 15:49:03 -03:00
ialokim 53c7c81c0f prevent crash in testDataCreator when blogs or forums are not enabled in core 2022-10-25 10:47:03 +02:00
Torsten Grote 6dd250a1ed Merge branch 'only-retry-bridges-that-have-failed' into 'master'
Speed up BridgeTest by only retrying bridges that have failed

See merge request briar/briar!1732
2022-10-21 16:46:22 +00:00
akwizgran 87df641b5d Bump version numbers for 1.4.15 release. 2022-10-21 17:18:01 +01:00
akwizgran a56a70a947 Merge branch 'update-bridges' into 'master'
Update bridges

See merge request briar/briar!1731
2022-10-21 16:16:26 +00:00
Torsten Grote 2e2c720241 Replace illustration for transfer data onboarding 2022-10-21 12:25:19 -03:00
Torsten Grote 7e3cf8f162 Replace illustration for mailbox problem 2022-10-21 12:25:19 -03:00
Torsten Grote dab8d731fa Replace illustration for error fragment 2022-10-21 12:25:19 -03:00
Torsten Grote 65509137b6 Replace illustration for mailbox success 2022-10-21 12:25:19 -03:00
Torsten Grote 48ab5f4966 Replace illustration for mailbox download 2022-10-21 12:25:19 -03:00
Torsten Grote a37447d3e8 Replace illustration for mailbox onboarding 2022-10-21 12:25:18 -03:00
Torsten Grote 5d1d0fb12a Replace illustration for adding contacts nearby 2022-10-21 12:25:18 -03:00
Torsten Grote 790818623f Replace illustration for adding a nickname for pending contact 2022-10-21 12:25:18 -03:00
Torsten Grote d46a227cfc Add new illustration for adding contact remotely 2022-10-21 12:25:18 -03:00
Torsten Grote e986d4b214 Replace empty state images with new illustrations 2022-10-21 12:25:18 -03:00
Torsten Grote 7bcffdf0d1 Replace illustration for sending data from removable drive 2022-10-21 12:25:18 -03:00
Torsten Grote f4dd3c4f06 Replace illustration for receiving data from removable drive 2022-10-21 12:25:17 -03:00
Torsten Grote f42cf00c35 Fix BriarButton rendering in AS EditMode
loses the style, but at least there's a preview now
2022-10-21 12:25:17 -03:00
Torsten Grote 38c347552b Add UiUtils for hiding illustrations on small screens 2022-10-21 12:25:17 -03:00
Torsten Grote bab6ec70f5 Factor out mailbox constants into a MailboxConfig
so that we can change them for integration tests via the new ModularMailboxModule that now also includes the UrlProvider
2022-10-21 12:22:57 -03:00
akwizgran 8db25738e2 Speed up BridgeTest by only retrying bridges that have failed. 2022-10-21 16:02:44 +01:00
Torsten Grote 28f770df89 Always run mailbox tests when changing them 2022-10-21 10:01:32 -03:00
Torsten Grote a720501fde First integration test for mailbox with two contacts
one private message gets send via mailbox from one contact to the other
2022-10-21 10:01:32 -03:00
Torsten Grote 648911b3ed clean up mailbox integration tests 2022-10-21 10:01:31 -03:00
akwizgran 3767aeb8b2 Add some non-default and vanilla bridges. 2022-10-21 13:41:13 +01:00
akwizgran 6344e29c29 Remove some failing bridges. 2022-10-21 13:34:32 +01:00
Torsten Grote 3734e36782 Merge branch 'obfs4proxy-0.0.14-tor1' into 'master'
Upgrade obfs4proxy to 0.0.14-tor1 and enable uTLS for meek-lite

See merge request briar/briar!1730
2022-10-21 12:03:49 +00:00
akwizgran 48ac5e2bc5 Upgrade obfs4proxy to 0.0.14-tor1 and enable uTLS for meek-lite. 2022-10-21 12:33:31 +01:00
akwizgran 404e30bb0f Bump version numbers for 1.4.14 release. 2022-10-20 15:25:58 +01:00
Torsten Grote 6a5024e8a2 Merge branch 'update-meek-bridge' into 'master'
Update meek bridge

See merge request briar/briar!1729
2022-10-20 14:24:23 +00:00
akwizgran f19c636ddb Update meek bridge. 2022-10-20 11:20:45 +01:00
akwizgran 45833a2ec0 Bump version numbers for 1.4.13 release. 2022-10-19 18:02:22 +01:00
Torsten Grote 55efb5f41d Merge branch 'snowflake-utls' into 'master'
Use uTLS with Chrome profile for Snowflake

See merge request briar/briar!1728
2022-10-19 17:00:33 +00:00
akwizgran 6ec0fba5a2 Update translations. 2022-10-19 17:58:05 +01:00
akwizgran 1eb39eeea8 Use uTLS with Chrome profile for Snowflake. 2022-10-19 17:41:07 +01:00
akwizgran bc9c4c9e3f Merge branch 'add-test-lan-tcp-plugin-factory' into 'master'
Add TestLanTcpPluginFactory

See merge request briar/briar!1723
2022-10-18 11:17:43 +00:00
Sebastian Kürten ab6c925a9c Update instructions on how to build and run briar-headless 2022-10-14 16:39:44 +02:00
Sebastian Kürten 3844d33015 Add TestLanTcpPluginFactory
This factory provides a LanTcpPlugin that can connect to its own
address, useful for testing.
2022-10-06 12:07:07 +02:00
Torsten Grote 718d95f3d5 Merge branch 'use-mailbox-main' into 'master'
Use mailbox main branch for integration tests

See merge request briar/briar!1721
2022-10-03 14:38:32 +00:00
Sebastian Kürten fa425bdc53 Use mailbox main branch for integration tests 2022-10-03 15:44:25 +02:00
Torsten Grote d441618ea1 Merge branch 'fix-imports-null-safety' into 'master'
Fix imports for null-safety annotations

See merge request briar/briar!1720
2022-10-03 13:38:58 +00:00
Sebastian Kürten df86f2f258 Fix imports for null-safety annotations 2022-10-03 15:25:35 +02:00
Torsten Grote 2a2c054959 Merge branch '2343-mailbox-as-submodule' into 'master'
End-to-end integration tests for communication via mailbox

Closes #2343

See merge request briar/briar!1699
2022-10-03 13:11:18 +00:00
akwizgran ad9092f414 Merge branch '2358-unlink-dialog-blank' into 'master'
Re-show mailbox unpaired dialog after screen-rotation

Closes #2358

See merge request briar/briar!1718
2022-09-30 12:01:35 +00:00
akwizgran 78ed21b493 Merge branch '2367-mailbox-intro-duplicate' into 'master'
Don't re-add mailbox intro fragment after activity got destroyed

Closes #2367

See merge request briar/briar!1719
2022-09-30 09:10:51 +00:00
Torsten Grote abb4d43f14 Don't re-add mailbox intro fragment after activity got destroyed 2022-09-29 16:43:28 -03:00
Torsten Grote c049c9c370 re-show mailbox unpaired dialog after screen-rotation 2022-09-29 14:52:30 -03:00
Torsten Grote a0de0a40aa Merge branch 'socks-library' into 'master'
Use SOCKS socket library

See merge request briar/briar!1717
2022-09-29 16:26:17 +00:00
Torsten Grote 73d957434b Merge branch 'null-safety-library' into 'master'
Use null safety library

See merge request briar/briar!1716
2022-09-29 13:23:19 +00:00
akwizgran 03adfd850b Use SOCKS socket library. 2022-09-29 13:36:52 +01:00
akwizgran 6c1232bfaa Update dependency checksums. 2022-09-29 13:33:54 +01:00
akwizgran e4e7d84bde Use null safety library. 2022-09-29 13:08:02 +01:00
Torsten Grote d4e5e3577b Merge branch '2366-tor-not-running-exception' into 'master'
No longer crash when the Tor process crashes

Closes #2366

See merge request briar/briar!1715
2022-09-28 17:04:04 +00:00
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
Sebastian Kürten 7be83a56a2 Address review feedback 2022-09-28 15:34:16 +02:00
Sebastian Kürten 867703c774 Upgrade mailbox-lib and refactor to match new API 2022-09-28 11:33:57 +02: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 adf172bf25 No longer crash when the Tor process crashes.
We have enough information about this bug now.
2022-09-27 15:20:45 +01: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
Sebastian Kürten f38f8afc5c Clean up mailbox-integrations-tests/build.gradle 2022-09-22 19:05:01 +02:00
Sebastian Kürten 8be04b3c20 Remove TestIoModule 2022-09-22 18:08:08 +02:00
Sebastian Kürten 459b97c1d4 Integration tests for mailbox using mailbox-lib as submodule 2022-09-22 18:08:03 +02: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 be9255029b Merge branch '2149-hotspot-detection' into 'master'
Use interface name to decide whether we're providing a wifi hotspot

Closes #2149

See merge request briar/briar!1521
2021-08-20 14:55:06 +00:00
Torsten Grote f596811997 Merge branch '2144-graphics-size' into 'master'
Use fixed sizes and consistent layout for "hero icons"

Closes #2144

See merge request briar/briar!1525
2021-08-20 07:43:29 +00:00
Torsten Grote 1be8ac6e14 Add simple UI for Connect via Bluetooth feature 2021-08-20 09:11:35 +02:00
akwizgran 571ec2257e Remove full stop from string that's now used as a title. 2021-08-19 13:03:52 +01:00
akwizgran 7fb2faba45 Automatically scroll HotspotIntroFragment. 2021-08-19 13:00:54 +01:00
akwizgran a390bf1c4f Use consistent layout style for all screens with "hero icons". 2021-08-19 12:27:03 +01:00
akwizgran 9d031fa796 Use fixed dp sizes for graphics. 2021-08-17 13:04:45 +01:00
akwizgran d678043f8e Merge branch '2152-rss-icon' into 'master'
Resolve "RSS icon doesn't appear on older devices"

Closes #2152

See merge request briar/briar!1523
2021-08-17 09:36:56 +00:00
Torsten Grote b11147265d Merge branch '1724-replace-spongy-castle-with-bouncy-castle' into 'master'
Replace Spongy Castle with Bouncy Castle

Closes #1724

See merge request briar/briar!1522
2021-08-17 07:46:04 +00:00
Torsten Grote 2fe052d77e Fix blog post padding on Android 4 2021-08-17 09:43:04 +02:00
Torsten Grote 8e91322869 Upgrade CircleImageView dependency 2021-08-17 09:25:51 +02:00
Torsten Grote 1de5779e2c Fix RSS icon not showing on API < 19 2021-08-17 09:25:39 +02:00
akwizgran 99b2c8af69 Upgrade Bouncy Castle to 1.69, drop Montgomery ladder tests. 2021-08-16 15:52:33 +01:00
akwizgran b1cc4fe006 Replace Spongy Castle with Bouncy Castle. 2021-08-16 15:38:36 +01:00
akwizgran d65afc519a Factor out shared code. 2021-08-16 12:00:42 +01:00
akwizgran 32cbdff532 Use interface name to decide whether we're providing a wifi hotspot. 2021-08-16 11:55:41 +01:00
akwizgran 48292d2e47 Merge branch '2144-transfer-data-graphics' into 'master'
Fix images when sending or receiving data

Closes #2144

See merge request briar/briar!1517
2021-08-11 10:27:24 +00:00
akwizgran 89bd9ee653 Merge branch 'animal-sniffer-11' into 'master'
Fix animal sniffer when run with Java 11

See merge request briar/briar!1516
2021-08-11 10:26:29 +00:00
akwizgran 61aa3a839d Merge branch '2026-ux-offline-sharing' into 'master'
Adjust after UX testing

Closes #2026

See merge request briar/briar!1518
2021-08-11 10:24:29 +00:00
Daniel Lublin e38e9b943d Squeeze items to free more vertical space for qr code 2021-08-10 17:12:26 +02:00
Daniel Lublin 4eb5c2ac10 Revise share-offline screen wording; always show connected peers counter 2021-08-10 17:02:20 +02:00
Torsten Grote ebaa3271dd Merge branch 'ssid-password-white-background' into 'master'
Use white background for hotspot name and password

See merge request briar/briar!1519
2021-08-10 11:24:47 +00:00
akwizgran adb6b4fba5 Use white background for hotspot name and password. 2021-08-10 11:26:23 +01:00
Torsten Grote 917a470559 Upgrade animal sniffer plugin 2021-08-09 15:39:18 +02:00
Torsten Grote a188e41134 Fix animal sniffer when run with Java 11 2021-08-09 15:38:14 +02:00
Torsten Grote b9ba813b23 Fix images when sending or receiving data 2021-08-09 14:26:49 +02:00
akwizgran b7d46b9340 Merge branch '1081-share-app-via-wifi-hotspot' into 'master'
Share app via Wi-Fi hotspot

Closes #1081

See merge request briar/briar!1515
2021-08-04 12:09:08 +00:00
Sebastian Kürten 60aaa4a7c1 HotspotManager: set channel to null after closing it consistently 2021-08-04 12:35:59 +02:00
Sebastian Kürten d411b99030 Improve handling of HotspotState's field 'consumed' 2021-08-04 12:35:33 +02:00
Torsten Grote acacb59114 Address review feedback for feature branch 2021-08-03 09:33:59 +02:00
akwizgran 2e07e79e4c Merge branch 'fix-screenshot-tests' into 'master'
Fix screenshot tests

See merge request briar/briar!1514
2021-07-28 12:37:53 +00:00
akwizgran e9dbceefe8 Merge branch '2117-hotspot-password' into '1081-share-app-via-wifi-hotspot'
hotspot: remove 5 and S, as well as i and l

See merge request briar/briar!1513
2021-07-28 12:36:07 +00:00
Torsten Grote 8cdb314170 Fix screenshot tests 2021-07-27 15:09:10 +02:00
Torsten Grote 39d3f47e19 hotspot: remove 5 and S, as well as i, l and 1 2021-07-27 13:39:28 +02:00
Torsten Grote 522474ac15 Merge branch '2100-refactor-condition-managers' into '1081-share-app-via-wifi-hotspot'
Split ConditionManager into API-specific versions

See merge request briar/briar!1512
2021-07-26 13:49:20 +00:00
akwizgran ed6c4ba634 Merge branch 'master' into 'master'
Create a better formatted and more informant README.md

See merge request briar/briar!1504
2021-07-26 10:34:46 +00:00
akwizgran 49562cbd79 Merge branch 'log-uncaught-exceptions' into 'master'
Log uncaught exceptions on debug builds

See merge request briar/briar!1497
2021-07-23 10:45:27 +00:00
Sebastian Kürten 6337b86266 Rename ConditionManager classes 2021-07-21 16:29:23 +02:00
Sebastian Kürten 93eadb88f3 Apply review feedback 2021-07-21 16:13:44 +02:00
Sebastian Kürten 46e391645c Reduce visibility of a field and two methods 2021-07-21 13:30:20 +02:00
Sebastian Kürten 355c487ec9 Split ConditionManager into API-specific versions
* On API 29+ we need the location permission to start the hotspot, while
  on lower API levels, we don't. In order to handle permissions and
  other conditions in a clear manner depending the API level of the
  device the app is running on, have separate extensions of the base
  ConditionManager class.
* Take special care to handle situations gracefully where the Wifi is
  disabled and the user tries to start the hotspot. We cannot simply
  rely on Wifi being enabled as a sufficient condition that allows us to
  start the hotspot. We need to wait for WifiP2p to be available. While
  it is tricky to obtain that state (it involves registering a broadcast
  receiver for the WIFI_P2P_STATE_CHANGED_ACTION broadcast, keeping
  track of changes there and even then things are still ugly. It can
  happen that WifiP2p is available *before* Wifi is. Also it can happen
  that WifiP2p never becomes available because some other application
  has already opened a hotspot. Instead of checking that state, we now
  just try (and retry repeatedly after a delay) to start the hotspot
  (and the WifiP2p framework) hoping that is becomes availabe within a
  reasonable amount of time after Wifi has been detected to be on.
  Currently we try 5 times with a delay of 1 second.
* Improve the behavior of disabling and re-enabling the 'start hotspot'
  button, so that it becomes impossible to double-tap it, but still
  making sure that the button get re-enabled as soon as the UI is back
  in a state where the user should be able to tap the button again.
2021-07-21 13:30:14 +02:00
Torsten Grote d1c0f1b2f6 Merge branch '2109-assertion-in-rssfeedviewmodel' into 'master'
Fix assertion caused by system-initiated process death

Closes #2109

See merge request briar/briar!1510
2021-07-20 13:03:27 +00:00
akwizgran 445ef0818c Bump version numbers for 1.3.6 release. 2021-07-14 13:12:16 +01:00
akwizgran 8af743db71 Update translations. 2021-07-14 13:11:30 +01:00
akwizgran 806fce8c34 Keep the screen on while the hotspot is running. 2021-07-14 14:04:33 +02:00
Sebastian Kürten f9494d71de Improve texts on offline hotspot for a better UX 2021-07-14 14:04:30 +02:00
Sebastian Kürten df38187288 Do not increment the attempt variable twice when requesting group info 2021-07-14 14:04:12 +02:00
Sebastian Kürten b8009c35f1 Do not allow the user to tap the start sharing button twice quickly 2021-07-14 14:04:11 +02:00
Sebastian Kürten 1306761f4a Don't move to HotspotFragment on rotate when user navigated back to introduction 2021-07-14 14:04:11 +02:00
Sebastian Kürten 703ff9835d Fix bug that occurs when HotspotActivity gets destroyed
If HotspotActivity gets destroyed, so will be its viewmodel, resulting
in an undefined state when the activity gets created again. While the
fragments will be restored, the view model and hotspot/webserver state
will not. Fix this by resetting the UI to reflect the reset of hotspot
and webserver.
2021-07-14 14:04:11 +02:00
Sebastian Kürten 4abaeed32f Fix background color of cardview for qr code 2021-07-14 14:04:10 +02:00
Sebastian Kürten 9192ee32cf Use FragmentContainerView for displaying FallbackFragment 2021-07-14 14:04:09 +02:00
Sebastian Kürten aecd204efe Improve hotspot error fragment UI
* Use different highlighting for error message
* Improve margins in fragment_hotspot_save_apk.xml
* Address some review feedback
2021-07-14 14:04:09 +02:00
Sebastian Kürten 03cb1010e2 Pass error message to feedback activity 2021-07-14 14:04:07 +02:00
Sebastian Kürten 30063f5fbf Create FallbackFragment for alternative apk sharing method 2021-07-14 14:04:05 +02:00
Sebastian Kürten 0fb52a7f53 Log hotspot errors 2021-07-14 14:03:58 +02:00
Sebastian Kürten 094024eb4f Wire feedback button to show feedback fragment 2021-07-14 14:03:58 +02:00
Sebastian Kürten e39c99fd6c Outline specific error fragment for hotspot 2021-07-14 14:03:57 +02:00
Sebastian Kürten 6cd70e0e7f Let HotspotActivity implement BaseFragmentListener 2021-07-14 14:03:57 +02:00
Torsten Grote d646635b1f Move hotspot help ActivityResultLauncher into method 2021-07-14 14:03:57 +02:00
Torsten Grote a534ec2b50 Adapt hotspot buttons to latest design and add a nullability annotation 2021-07-14 14:03:56 +02:00
Torsten Grote a23de6172f Make HotspotHelpFragment headlines bold 2021-07-14 14:03:56 +02:00
Torsten Grote ff2dd33435 Handle returned Uri being null 2021-07-14 14:03:54 +02:00
Torsten Grote d5d0a03638 Save the APK as a hotspot fallback 2021-07-14 14:03:50 +02:00
Sebastian Kürten 344fff4a7a Add feature flag for sharing the app via offline hotspot 2021-07-14 14:03:13 +02:00
Sebastian Kürten f9749fda80 Recommend to undo settings to install apps from unknown sources 2021-07-14 13:53:21 +02:00
Torsten Grote aabba3a6c8 Add missing hotspot nullability annotations 2021-07-14 13:53:20 +02:00
Torsten Grote 673f530c14 Move savedNetworkConfig into HotspotManager and use constructor injection 2021-07-14 13:53:20 +02:00
Torsten Grote 36a1478661 Make hotspot SSID and passphrase persistent 2021-07-14 13:53:19 +02:00
Sebastian Kürten 1c056160e1 Use better filename for apk files shared via hotspot 2021-07-14 13:53:19 +02:00
Torsten Grote ab6b83d4fa Show a snackbar when a peer connected to the hotspot 2021-07-14 13:53:17 +02:00
Torsten Grote a6c33d300c Don't start hotspot while running and use proper ErrorFragment 2021-07-14 13:53:16 +02:00
Torsten Grote 28d87dd153 Port code from Offline hotspot test app 2021-07-14 13:53:12 +02:00
Torsten Grote 16b79e0482 Fix hotspot notification on old APIs 2021-07-14 13:53:03 +02:00
Torsten Grote 3eee144c6c Rename tab fragments
and remove redundant NonNull annotations
2021-07-14 13:52:58 +02:00
Torsten Grote 1b7007d4ef Show notification while hotspot is active 2021-07-14 13:52:42 +02:00
Torsten Grote 19a5c2f79f Add hotspot troubleshooting info 2021-07-14 13:39:11 +02:00
Torsten Grote 8c163d8f10 Add offline sharing entry point to Settings/Actions 2021-07-14 13:39:10 +02:00
Torsten Grote c3cd32b12c Let info screens scroll in case of insufficient space 2021-07-14 13:39:09 +02:00
Torsten Grote 7c8aa5bc21 Implement info screens for offline app sharing 2021-07-14 13:39:05 +02:00
Torsten Grote 54b239f45e Implement intro screen for offline app sharing 2021-07-14 13:38:41 +02:00
Torsten Grote 97bd977108 Merge branch '1802-sync-via-removable-storage' into 'master'
Transfer data securely via removable storage

See merge request briar/briar!1511
2021-07-14 11:23:50 +00:00
akwizgran aaba9f2417 Don't configure plugin unless feature flag is enabled. 2021-07-14 11:48:48 +01:00
akwizgran 6a909b6c5c Rename method, as it no longer involves a notification. 2021-07-13 15:55:29 +01:00
akwizgran 4ef92f1c39 Remove redundant UiUtils method. 2021-07-13 15:49:33 +01:00
akwizgran 8f392b4599 Use getLong() to avoid remote possibility of overflow. 2021-07-13 12:04:09 +01:00
akwizgran f556bc7249 Update javadoc for RemovableDriveTask. 2021-07-13 11:50:17 +01:00
akwizgran e48886c95a Update max latency of AndroidRemovableDrivePlugin to 28 days. 2021-07-13 11:44:32 +01:00
Daniel Lublin e2879cd664 Fix assertion caused by system-initiated process death 2021-07-13 11:31:51 +02:00
akwizgran c3977e9276 Add comment reminding us to remove obsolete notification channel ID. 2021-07-13 10:30:17 +02:00
akwizgran b93803060e Remove unused strings. 2021-07-13 10:30:17 +02:00
akwizgran 4498187721 Suggest upgrading if the app fails to start. 2021-07-13 10:30:16 +02:00
akwizgran 8666fe45b1 Show startup failure activity immediately, without a notification. 2021-07-13 10:30:15 +02:00
akwizgran cd12447c2e Include RemovableDriveModule in UI tests. 2021-07-13 10:30:14 +02:00
Torsten Grote 0a79cc882a Handle the don't keep activities option when using transfer data feature 2021-07-13 10:30:13 +02:00
akwizgran 7f80b5d660 Update text explaining that contact doesn't support removable drives. 2021-07-13 10:30:13 +02:00
akwizgran 92f58e9465 Increase max latency of removable drive plugin to 28 days. 2021-07-13 10:30:12 +02:00
akwizgran 387f7f1545 Check whether we have transport keys before trying to send data. 2021-07-13 10:30:12 +02:00
akwizgran 65e0845376 Don't configure the removable drive plugin on API < 19. 2021-07-13 10:30:11 +02:00
akwizgran 97bb695373 Clear keys from session when moving to AWAIT_ACTIVATE state. 2021-07-13 10:30:11 +02:00
akwizgran d8230afae3 Reject old timestamps when deriving rotation mode keys. 2021-07-13 10:30:11 +02:00
Torsten Grote 07afb955f7 Remove guidelines for percent based laout width 2021-07-13 10:30:10 +02:00
akwizgran a57d668fc9 Use guidelines to set image sizes. 2021-07-13 10:30:10 +02:00
Torsten Grote 765dbcc111 Check if the chosen contact supports removable drive transport
and show message if not
2021-07-13 10:30:09 +02:00
Torsten Grote ccb4f88b89 Combine transfer data graphics to reduce layout complexity
and make scaling work better on smaller screens
2021-07-13 10:30:09 +02:00
Torsten Grote eee9e1a488 Address review feedback for Transfer Data UI 2021-07-13 10:30:08 +02:00
Torsten Grote f832f663c9 Migrate all image file pickers to ActivityResultLauncher
startActivityForResult is deprecated and the new API is nicer. Also, we can use the same launcher types in various places.
2021-07-13 10:30:07 +02:00
Torsten Grote 032f56ad67 Try to force file chooser to show internal/external storage by default 2021-07-13 10:30:07 +02:00
Torsten Grote 3f2ac528c1 Calculate percentages for send progress bar 2021-07-13 10:30:06 +02:00
Torsten Grote d174757ef0 Remove manual initial state and oldTask state argument
The latter is now handled via a LiveEvent
2021-07-13 10:30:06 +02:00
Torsten Grote f457a5e831 Hide Transfer Data feature behind feature flag 2021-07-13 10:30:06 +02:00
Torsten Grote ab2fe58d2f Check if there is data to send and show a message if not 2021-07-13 10:30:05 +02:00
Torsten Grote fe1c384aeb Always inform new observers about current state 2021-07-13 10:30:05 +02:00
Torsten Grote 4c327e9874 Re-organize conversations overflow menu 2021-07-13 10:30:04 +02:00
Torsten Grote 928b951c25 Transfer Data UI 2021-07-13 10:30:04 +02:00
Daniel Lublin ecba2a51d8 Start of UI for transfer data feature 2021-07-13 10:30:03 +02:00
Torsten Grote 9668f62c6a Remove FIXME in test since we won't fix it this way 2021-07-13 10:30:02 +02:00
Torsten Grote dc3ba3d8f0 Also test that messages arrive and activate keys 2021-07-13 10:30:01 +02:00
Torsten Grote 3f6f970d36 Add two more tests to TransportKeyAgreementIntegrationTest 2021-07-13 10:30:01 +02:00
Torsten Grote 768356d8e2 Ensure that private key is not stored anymore 2021-07-13 10:30:00 +02:00
Torsten Grote 65110090de Add first integration test for TransportKeyAgreementManager 2021-07-13 10:29:59 +02:00
Torsten Grote f5cab63052 Add first integration test for TransportKeyAgreementManager 2021-07-13 10:29:56 +02:00
Torsten Grote 399d8adb3b Refactor base of BriarIntegrationTest into BrambleIntegrationTest 2021-07-13 10:27:17 +02:00
Torsten Grote b40055686b Put FeatureFlags for tests into a TestFeatureFlagModule 2021-07-13 10:26:27 +02:00
akwizgran 2dcecb2a46 Add method for checking whether contact supports transport. 2021-07-13 10:26:27 +02:00
akwizgran 0cc118c849 Add transport property to indicate support for removable drives. 2021-07-13 10:26:26 +02:00
akwizgran b1148ebc83 Store ID of message that triggered abort. 2021-07-13 10:26:26 +02:00
akwizgran 802f64e309 Check whether system clock is reasonable at startup. 2021-07-13 10:26:26 +02:00
Torsten Grote 80749fec09 Add TransportKeyAgreementValidatorTest 2021-07-13 10:26:25 +02:00
akwizgran 1f1ea8f3ed Add RemovableDriveManager method. 2021-07-13 10:26:25 +02:00
akwizgran 796cbcaf4b Add DB method for checking whether there's anything to send 2021-07-13 10:26:24 +02:00
akwizgran 4cf5242aa5 Add comment explaining second client versioning message. 2021-07-13 10:26:24 +02:00
akwizgran 8921f10ffd Add integration test for eager retransmission. 2021-07-13 10:26:24 +02:00
akwizgran b60c129acf Update DB method that gets total size of messages to send. 2021-07-13 10:26:23 +02:00
akwizgran 852413b36a Use eager retransmission if the transport is lossy and cheap. 2021-07-13 10:26:23 +02:00
akwizgran a39b367477 Add tests for eager retransmission. 2021-07-13 10:26:22 +02:00
akwizgran 8be274dc4d Replace inner classes with lambdas. 2021-07-13 10:26:22 +02:00
akwizgran 9ac72296c7 Update SimplexOutgoingSession to support sending unacked messages. 2021-07-13 10:26:21 +02:00
akwizgran 1405f5954a Add database methods for sending unacked messages. 2021-07-13 10:26:21 +02:00
akwizgran f406de6b0c Timestamp isn't needed for deriving root key. 2021-07-13 10:26:20 +02:00
akwizgran 0df57c82cb Make tests more readable. 2021-07-13 10:26:20 +02:00
akwizgran 4853bcd724 Remove unused remote timestamp from session. 2021-07-13 10:26:20 +02:00
akwizgran 37e95d4ce6 Add transport key agreement client. 2021-07-13 10:26:19 +02:00
akwizgran 23acd186f7 Hold lock while calling notifyObservers(). 2021-07-13 10:26:19 +02:00
akwizgran 5e98bd0b53 Refactor removable drive tasks. 2021-07-13 10:26:18 +02:00
akwizgran d7238312b1 Add unit tests for addRotationKeys() methods. 2021-07-13 10:26:18 +02:00
akwizgran ec40da4353 Refactor KeyManager startup so managers are created earlier. 2021-07-13 10:26:18 +02:00
akwizgran 204ad8913f Add a key manager method for adding a single set of transport keys. 2021-07-13 10:26:17 +02:00
akwizgran c0f5023b63 Add a DB method for checking whether transport keys exist. 2021-07-13 10:26:17 +02:00
akwizgran b3c105bfa7 Add database method for getting transports with keys. 2021-07-13 10:26:16 +02:00
akwizgran 68acbe5c7d Add javadocs for message states. 2021-07-13 10:26:16 +02:00
akwizgran 12245d960c Allow sync clients to defer delivery of messages. 2021-07-13 10:26:16 +02:00
Daniel Lublin f82c2517fb Make pkg private 2021-07-13 10:26:15 +02:00
Daniel Lublin fa49da68a4 Move to new removabledrive package 2021-07-13 10:26:15 +02:00
Daniel Lublin cffbfdf6f2 Use US locale for now 2021-07-13 10:26:14 +02:00
Daniel Lublin cd126279ac Add initial RemovableDriveViewModel 2021-07-13 10:26:14 +02:00
akwizgran bedd6f9a6e Refactor manager and tasks to remove reliance on files. 2021-07-13 10:26:13 +02:00
akwizgran 10e0c8d876 Update progress of writer task. 2021-07-13 10:26:13 +02:00
akwizgran dc2ad48a7f Ensure that observers see the final state even if they're added late. 2021-07-13 10:26:13 +02:00
akwizgran c010dd9401 Add integration test for syncing via removable drives. 2021-07-13 10:26:12 +02:00
akwizgran 270ef76057 Implement RemovableDriveWriterTask, except for progress updates. 2021-07-13 10:26:12 +02:00
akwizgran 9d47f27293 Fix typo in class names. 2021-07-13 10:26:11 +02:00
akwizgran f0687a082a Implement RemovableDriverReaderTask. 2021-07-13 10:26:11 +02:00
akwizgran edebde2bf4 Add task factory. 2021-07-13 10:26:11 +02:00
akwizgran 71ce74c633 Add removable drive manager with placeholder task implementations. 2021-07-13 10:26:10 +02:00
akwizgran 2dd5239b9d Add Android implementation of RemovableDrivePlugin. 2021-07-13 10:26:10 +02:00
akwizgran f0145eb8e6 Decouple RemovableDrivePlugin from FileConstants. 2021-07-13 10:26:09 +02:00
akwizgran 556ed8fe16 Don't inject default RemovableDrivePluginFactory on Android. 2021-07-13 10:26:08 +02:00
akwizgran ed753fd354 Decouple removable drive plugin from java.io.File for portability. 2021-07-13 10:26:08 +02:00
akwizgran 4ecc5e4367 Clean up plugin injection code, remove unused module. 2021-07-13 10:26:02 +02:00
akwizgran b4ae480d93 Configure removable drive plugin for Android. 2021-07-13 10:25:23 +02:00
akwizgran 9a563e0cdd Add removable drive plugin. 2021-07-13 10:25:23 +02:00
akwizgran c5d6ee6782 Add DB method for getting amount of data to sync. 2021-07-13 10:25:22 +02:00
akwizgran f7fdf7745e Update MessagesSentEvent to include amount of data sent. 2021-07-13 10:25:21 +02:00
akwizgran a48b60a24a Update translations. 2021-07-12 10:18:31 +01:00
Ben Armstead 520f06020c Correct typo 2021-07-08 15:14:30 +00:00
Ben Armstead f96b60c0d0 Create a better formatted and more informant README.md 2021-07-08 13:16:37 +00:00
Torsten Grote 00f03f6587 Merge branch '1981-upgrade-material-tap-target-prompt' into 'master'
Upgrade MaterialTapTargetPrompt library to fix NPE

Closes #1981

See merge request briar/briar!1498
2021-07-05 11:17:39 +00:00
akwizgran c68bd699f1 Upgrade MaterialTapTargetPrompt library to fix NPE. 2021-07-05 10:06:53 +01:00
akwizgran e5f78cdc1e Log uncaught exceptions on debug builds. 2021-06-30 10:44:15 +01:00
akwizgran 00407539d3 Bump version numbers for 1.3.5 release. 2021-06-18 11:17:35 +01:00
akwizgran 62014f4d01 Update translations. 2021-06-18 11:16:33 +01:00
akwizgran e7dddda7e5 Merge branch 'tor-0.3.5.15' into 'master'
Upgrade Tor to 0.3.5.15

Closes #2075

See merge request briar/briar!1483
2021-06-17 12:21:01 +00:00
akwizgran 208ff6f3a5 Merge branch '2056-view-pager-crash' into 'master'
Migrate to ViewPager2 to fix weird ViewPager crash

Closes #2056

See merge request briar/briar!1484
2021-06-17 12:07:04 +00:00
akwizgran 4d31465191 Merge branch 'master' into 'tor-0.3.5.15'
# Conflicts:
#   bramble-java/build.gradle
2021-06-17 12:05:34 +00:00
Torsten Grote cf987427e0 Migrate to ViewPager2 to fix weird ViewPager crash 2021-06-16 12:44:04 -03:00
akwizgran b11b959fd3 Merge branch 'upgrade-libraries-1.3' into 'master'
Upgrade libraries after 1.3 release

See merge request briar/briar!1455
2021-06-16 13:52:04 +00:00
Torsten Grote 61f660ca1d Upgrade libraries before 1.3 release 2021-06-16 10:40:30 -03:00
akwizgran 6d44521016 Upgrade Tor to 0.3.5.15. 2021-06-16 11:16:10 +01:00
akwizgran 7289f5ba8a Merge branch '2059-no-such-group-exception' into 'master'
Check if group still exists before storing MessageId of thread position

Closes #2059

See merge request briar/briar!1477
2021-06-14 14:57:21 +00:00
Torsten Grote b657c7f347 Ignore NoSuchGroupException when storing MessageId of thread position for removed group 2021-06-10 15:45:31 -03:00
Torsten Grote 40865425c5 Merge branch 'fix-padding-of-contact-exchange-error' into 'master'
Fix missing padding for title in contact exchange error fragment

See merge request briar/briar!1478
2021-06-09 11:56:57 +00:00
Sebastian Kürten f7249f5e84 Fix missing padding for title in contact exchange error fragment 2021-06-09 13:45:32 +02:00
Torsten Grote cc04fb05c2 Merge branch '1971-tor-0.3.5.14' into 'master'
Upgrade Tor to 0.3.5.14

Closes #1971

See merge request briar/briar!1470
2021-05-31 12:02:58 +00:00
akwizgran 58eb1d9e24 Upgrade Tor to 0.3.5.14. 2021-05-28 11:45:21 +01:00
akwizgran 76b7e6fecf Bump version numbers for 1.3.4 release. 2021-05-19 10:47:08 +01:00
akwizgran 980940a7cf Update translations. 2021-05-19 10:46:21 +01:00
akwizgran 9a021daae8 Merge branch '2043-blog-scrolling' into 'master'
Automatically scroll to our own blog posts

Closes #2043

See merge request briar/briar!1462
2021-05-19 09:35:10 +00:00
Torsten Grote cc9904a454 Automatically scroll to our own blog posts 2021-05-18 15:39:22 -03:00
Torsten Grote b0faab9395 Merge branch 'remove-failed-bridges' into 'master'
Remove three failed bridges

See merge request briar/briar!1460
2021-05-17 17:37:58 +00:00
akwizgran f1198b47fd Remove three failed bridges. 2021-05-17 16:36:00 +01:00
akwizgran 37f2ab555f Update translations. 2021-05-17 16:26:22 +01:00
akwizgran 61ca2a391b Merge branch 'create-testdata-zero-values' into 'master'
Add button to zero values when creating test data

See merge request briar/briar!1447
2021-05-10 12:05:26 +00:00
akwizgran 88537b9323 Merge branch '2032-connect-via-bt-crash' into 'master'
Remove duplicate code due to merge mistake

Closes #2032

See merge request briar/briar!1456
2021-05-10 11:55:38 +00:00
Daniel Lublin e6c004e8f6 Add button to zero values when creating test data 2021-05-10 13:46:49 +02:00
akwizgran dc7290dab7 Remove duplicate code due to merge mistake. 2021-05-10 12:29:28 +01:00
akwizgran 9dff8bd64a Merge branch '2005-connect-via-bt-error' into 'master'
Connect via Bluetooth: Wait before showing an error Toast

See merge request briar/briar!1446
2021-05-06 13:14:32 +00:00
akwizgran 35c2f60129 Merge branch 'master' into '2005-connect-via-bt-error'
# Conflicts:
#   briar-android/src/main/java/org/briarproject/briar/android/conversation/BluetoothConnecter.java
2021-05-06 13:03:46 +00:00
akwizgran 471a2372c8 Merge branch '2027-pause-polling-when-doing-connect-via-bt' into 'master'
Disable polling while doing connect-via-BT

Closes #2027

See merge request briar/briar!1450
2021-05-06 12:59:38 +00:00
Daniel Lublin fba028db03 Disable polling while doing connect-via-BT 2021-05-06 11:13:35 +02:00
Torsten Grote c647c52638 Merge branch '2009-xiaomi-setup-screen' into 'master'
Show instructions for locking Briar to the Xiaomi recent apps list

Closes #2009

See merge request briar/briar!1451
2021-05-05 16:39:55 +00:00
akwizgran cad5edcf86 Move input state methods to UiUtils. 2021-05-05 16:57:25 +01:00
akwizgran 38f70bb6be Add full stop. 2021-05-05 13:02:56 +01:00
akwizgran 33bdc81b3e Show instructions for locking Briar to the Xiaomi recent apps list. 2021-05-05 12:37:23 +01:00
Torsten Grote 552b9ef21a Wait for an incoming connection before showing an error Toast 2021-04-30 16:01:54 -03: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
1670 changed files with 59670 additions and 14907 deletions
+20 -32
View File
@@ -5,6 +5,9 @@ stages:
- optional_tests - optional_tests
- check_reproducibility - check_reproducibility
variables:
GIT_SUBMODULE_STRATEGY: recursive
workflow: workflow:
# when to create a CI pipeline # when to create a CI pipeline
rules: rules:
@@ -32,8 +35,10 @@ test:
extends: .base-test extends: .base-test
stage: test stage: test
script: script:
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom animalSnifferMain animalSnifferTest - git submodule update
- ./gradlew --no-daemon -Djava.security.egd=file:/dev/urandom 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: rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: always when: always
@@ -61,7 +66,7 @@ android test:
when: on_failure when: on_failure
rules: rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"' - if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success when: manual
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes: changes:
- briar-android/**/* - briar-android/**/*
@@ -78,41 +83,24 @@ android test:
test_reproducible: test_reproducible:
stage: check_reproducibility stage: check_reproducibility
script: script:
- "curl -X POST -F token=${RELEASE_CHECK_TOKEN} -F ref=master -F variables[RELEASE_TAG]=${CI_COMMIT_REF_NAME} https://code.briarproject.org/api/v4/projects/61/trigger/pipeline" - "curl -X POST -F token=${RELEASE_CHECK_TOKEN} -F ref=master -F variables[APP]='briar' -F variables[RELEASE_TAG]=${CI_COMMIT_REF_NAME} https://code.briarproject.org/api/v4/projects/61/trigger/pipeline"
- "curl -X POST -F token=${RELEASE_JAR_CHECK_TOKEN} -F ref=main -F variables[APP]='briar-headless' -F variables[RELEASE_TAG]=${CI_COMMIT_REF_NAME} https://code.briarproject.org/api/v4/projects/307/trigger/pipeline"
only: only:
- tags - tags
.optional_tests: mailbox integration test:
stage: optional_tests stage: optional_tests
before_script: extends: .base-test
- 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/
bridge test:
extends: .optional_tests
rules: rules:
- changes:
- mailbox-integration-tests/**/*
when: on_success
allow_failure: false
- if: '$CI_PIPELINE_SOURCE == "schedule"' - if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success when: on_success
allow_failure: true
- if: '$CI_COMMIT_TAG == null' - if: '$CI_COMMIT_TAG == null'
when: manual when: manual
allow_failure: true allow_failure: true # TODO figure out how not to allow failure while leaving this optional
script:
pre_release_tests: - (cd briar-mailbox; git fetch; git reset --hard origin/main)
extends: .optional_tests - MAILBOX_INTEGRATION_TESTS=true ./gradlew --info mailbox-integration-tests:test
only:
- tags
+3
View File
@@ -0,0 +1,3 @@
[submodule "briar-mailbox"]
path = briar-mailbox
url = https://code.briarproject.org/briar/briar-mailbox.git
+3 -15
View File
@@ -31,22 +31,10 @@
<option name="PACKAGES_TO_USE_STAR_IMPORTS"> <option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value /> <value />
</option> </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" value="2147483647" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" /> <option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings> </JetCodeStyleSettings>
<XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="Groovy"> <codeStyleSettings language="Groovy">
<indentOptions> <indentOptions>
<option name="USE_TAB_CHARACTER" value="true" /> <option name="USE_TAB_CHARACTER" value="true" />
@@ -197,9 +185,9 @@
</codeStyleSettings> </codeStyleSettings>
<codeStyleSettings language="kotlin"> <codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="PARAMETER_ANNOTATION_WRAP" value="1" /> <indentOptions>
<option name="VARIABLE_ANNOTATION_WRAP" value="1" /> <option name="CONTINUATION_INDENT_SIZE" value="4" />
<option name="ENUM_CONSTANTS_WRAP" value="1" /> </indentOptions>
</codeStyleSettings> </codeStyleSettings>
</code_scheme> </code_scheme>
</component> </component>
+27 -16
View File
@@ -1,21 +1,32 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.briar-android" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/briar-android" /> <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"> <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="GradleRunConfiguration" />
<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="GradleRunConfiguration" />
<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-java" run_configuration_type="GradleRunConfiguration" />
<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-android" run_configuration_type="GradleRunConfiguration" />
<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="GradleRunConfiguration" />
<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="GradleRunConfiguration" />
<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="GradleRunConfiguration" />
<option name="RunConfigurationTask" enabled="true" run_configuration_name="All tests in briar-headless" run_configuration_type="AndroidJUnit" />
</method> </method>
</configuration> </configuration>
</component> </component>
+20 -11
View File
@@ -1,14 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-android" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in bramble-android" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.bramble-android" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-android" /> <list />
<method v="2"> </option>
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <option name="taskNames">
</method> <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> </configuration>
</component> </component>
+22 -11
View File
@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-api" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in bramble-api" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.bramble-api" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-api" /> <list />
<method v="2"> </option>
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <option name="taskNames">
</method> <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> </configuration>
</component> </component>
+22 -11
View File
@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-core" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in bramble-core" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.bramble-core" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-core" /> <list />
<method v="2"> </option>
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <option name="taskNames">
</method> <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> </configuration>
</component> </component>
+20 -12
View File
@@ -1,15 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in bramble-java" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in bramble-java" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.bramble-java" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="VM_PARAMETERS" value="-ea -Djava.library.path=libs" /> <option name="taskDescriptions">
<option name="PARAMETERS" value="" /> <list />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/bramble-java" /> </option>
<method v="2"> <option name="taskNames">
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <list>
</method> <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> </configuration>
</component> </component>
+21 -11
View File
@@ -1,14 +1,24 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-android" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in briar-android" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.briar-android" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/briar-android" /> <list />
<method v="2"> </option>
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <option name="taskNames">
</method> <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> </configuration>
</component> </component>
+22 -11
View File
@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-api" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in briar-api" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.briar-api" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/briar-api" /> <list />
<method v="2"> </option>
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <option name="taskNames">
</method> <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> </configuration>
</component> </component>
+22 -11
View File
@@ -1,14 +1,25 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-core" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in briar-core" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.briar-core" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="PARAMETERS" value="" /> <option name="taskDescriptions">
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/briar-core" /> <list />
<method v="2"> </option>
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <option name="taskNames">
</method> <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> </configuration>
</component> </component>
+20 -12
View File
@@ -1,15 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in briar-headless" type="AndroidJUnit" factoryName="Android JUnit"> <configuration default="false" name="All tests in briar-headless" type="GradleRunConfiguration" factoryName="Gradle">
<module name="briar.briar-headless" /> <ExternalSystemSettings>
<option name="PACKAGE_NAME" value="org.briarproject.briar.headless" /> <option name="executionName" />
<option name="MAIN_CLASS_NAME" value="" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="METHOD_NAME" value="" /> <option name="externalSystemIdString" value="GRADLE" />
<option name="TEST_OBJECT" value="package" /> <option name="scriptParameters" value="" />
<option name="VM_PARAMETERS" /> <option name="taskDescriptions">
<option name="PARAMETERS" value="" /> <list />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/briar-headless" /> </option>
<method v="2"> <option name="taskNames">
<option name="Android.Gradle.BeforeRunTask" enabled="true" /> <list>
</method> <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> </configuration>
</component> </component>
@@ -0,0 +1,29 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All tests in mailbox-integration-tests" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="env">
<map>
<entry key="MAILBOX_INTEGRATION_TESTS" value="true" />
</map>
</option>
<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=":mailbox-integration-tests:test" />
<option value=":mailbox-integration-tests:cleanTest" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2" />
</configuration>
</component>
-24
View File
@@ -1,24 +0,0 @@
<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>
</component>
-14
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>
-14
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
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
+39 -1
View File
@@ -1 +1,39 @@
Briar is a messaging app designed for activists, journalists, and anyone else who needs a safe, easy and robust way to communicate. Unlike traditional messaging tools such as email, Twitter or Telegram, Briar doesn't rely on a central server - messages are synchronized directly between the users' devices. If the Internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping the information flowing in a crisis. If the Internet's up, Briar can sync via the Tor network, protecting users and their relationships from surveillance. # Briar
Briar is a messaging app designed for activists, journalists, and anyone else who needs a safe, easy and robust way to communicate.
Unlike traditional messaging apps, Briar doesn't rely on a central server - messages are synchronized directly between the users' devices.
If the Internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping information flowing in a crisis. If the Internet's up, Briar can sync via the Tor network, protecting users and their relationships from surveillance.
## Download Briar
[<img src="https://briarproject.org//img/fdroid_badge.png" width="240">](https://briarproject.org/fdroid)
[<img src="https://briarproject.org/img/google_play_badge_web_generic.png" width="240">](https://play.google.com/store/apps/details?id=org.briarproject.briar.android)
You can also [download the APK file](https://briarproject.org/apk) directly from
our site.
## Useful links
[Project website](https://briarproject.org/)
[Source code](https://code.briarproject.org/briar/briar/tree/master)
[User manual](https://briarproject.org/manual/)
[Wiki](https://code.briarproject.org/briar/briar/-/wikis/home)
[Privacy policy](https://briarproject.org/privacy)
## 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)
Bitcoin and BCH: 1NZCKkUCtJV2U2Y9hDb9uq8S7ksFCFGR6K
+33 -54
View File
@@ -1,25 +1,24 @@
import com.android.build.gradle.tasks.MergeResources
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'witness' apply plugin: 'witness'
apply from: 'witness.gradle' apply from: 'witness.gradle'
android { android {
compileSdkVersion 30 compileSdkVersion 33
buildToolsVersion '30.0.3' buildToolsVersion '33.0.0'
packagingOptions { packagingOptions {
doNotStrip '**/*.so' doNotStrip '**/*.so'
} }
defaultConfig { defaultConfig {
minSdkVersion 16 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 33
versionCode 10303 versionCode 10506
versionName "1.3.3" versionName "1.5.6"
consumerProguardFiles 'proguard-rules.txt' consumerProguardFiles 'proguard-rules.txt'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments disableAnalytics: 'true'
} }
compileOptions { compileOptions {
@@ -41,75 +40,55 @@ configurations {
} }
dependencies { dependencies {
implementation project(path: ':bramble-core', configuration: 'default') api 'org.briarproject:dont-kill-me-lib:0.2.7'
tor 'org.briarproject:tor-android:0.3.5.13@zip'
tor 'org.briarproject:obfs4proxy-android:0.0.12-dev-40245c4a@zip'
annotationProcessor 'com.google.dagger:dagger-compiler:2.24' // In theory this dependency shouldn't be needed, but without it Android Studio's linter will
// complain about unresolved symbols for bramble-api test classes in bramble-android tests,
// even though the bramble-api test classes are provided by the testImplementation dependency
// below and the compiler can find them
implementation project(':bramble-api')
implementation project(':bramble-core')
implementation 'androidx.annotation:annotation:1.5.0'
implementation "org.briarproject:onionwrapper-android:$onionwrapper_version"
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"
compileOnly 'javax.annotation:jsr250-api:1.0' compileOnly 'javax.annotation:jsr250-api:1.0'
testImplementation project(path: ':bramble-api', configuration: 'testOutput') testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation 'junit:junit:4.12'
testImplementation "org.jmock:jmock:2.8.2" testImplementation "junit:junit:$junit_version"
testImplementation "org.jmock:jmock-junit4:2.8.2" testImplementation "org.jmock:jmock:$jmock_version"
testImplementation "org.jmock:jmock-legacy:2.8.2" testImplementation "org.jmock:jmock-junit4:$jmock_version"
testImplementation "org.jmock:jmock-imposters:$jmock_version"
} }
def torBinariesDir = 'src/main/res/raw'
def torLibsDir = 'src/main/jniLibs' def torLibsDir = 'src/main/jniLibs'
task cleanTorBinaries { task cleanTorBinaries {
outputs.dir torLibsDir
doLast { doLast {
delete fileTree(torBinariesDir) { include '*.zip' } delete fileTree(torLibsDir)
delete fileTree(torLibsDir) { include '**/*.so' }
} }
} }
clean.dependsOn cleanTorBinaries clean.dependsOn cleanTorBinaries
task unpackTorBinaries { task unpackTorBinaries {
outputs.dir torLibsDir
doLast { doLast {
copy { copy {
from configurations.tor.collect { zipTree(it) } 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')) {
copy {
from zipTree(inner)
into torLibsDir into torLibsDir
rename '(.*)', 'armeabi-v7a/lib$1.so'
}
} else if (inner.name.endsWith('_arm64_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'arm64-v8a/lib$1.so'
}
} else if (inner.name.endsWith('_x86_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'x86/lib$1.so'
}
} else if (inner.name.endsWith('_x86_64_pie.zip')) {
copy {
from zipTree(inner)
into torLibsDir
rename '(.*)', 'x86_64/lib$1.so'
}
}
}
} }
} }
dependsOn cleanTorBinaries dependsOn cleanTorBinaries
} }
tasks.withType(MergeResources) { preBuild.dependsOn unpackTorBinaries
inputs.dir torBinariesDir
inputs.dir torLibsDir
dependsOn unpackTorBinaries
}
+10 -5
View File
@@ -1,6 +1,8 @@
-keep,includedescriptorclasses class org.briarproject.** { *; } # Keep the H2 classes that are loaded via reflection
-keep class org.h2.Driver { *; }
-keep class org.h2.** { *; } -keep class org.h2.engine.Engine { *; }
-keep class org.h2.store.fs.** { *; }
# Don't warn about unused dependencies of H2 classes
-dontwarn org.h2.** -dontwarn org.h2.**
-dontnote org.h2.** -dontnote org.h2.**
@@ -15,5 +17,8 @@
-dontwarn sun.misc.Unsafe -dontwarn sun.misc.Unsafe
-dontnote com.google.common.** -dontnote com.google.common.**
# UPnP library isn't used -dontwarn com.fasterxml.jackson.databind.ext.Java7SupportImpl
-dontwarn org.bitlet.weupnp.**
# Keep all Jackson-serialisable classes and their members
-keep interface com.fasterxml.jackson.databind.annotation.JsonSerialize
-keep @com.fasterxml.jackson.databind.annotation.JsonSerialize class * { *; }
+19 -6
View File
@@ -1,13 +1,26 @@
<manifest <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.briarproject.bramble" xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"> package="org.briarproject.bramble">
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/> <uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH"/> <!-- The BLUETOOTH permission was supposed to be removed in API 31 but is still needed on some Xiaomi/Redmi/POCO devices running API 31 and Nubia devices running API 32 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="31" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -1,13 +1,16 @@
package org.briarproject.bramble; package org.briarproject.bramble;
import org.briarproject.bramble.battery.AndroidBatteryModule; import org.briarproject.bramble.battery.AndroidBatteryModule;
import org.briarproject.bramble.io.DnsModule;
import org.briarproject.bramble.network.AndroidNetworkModule; import org.briarproject.bramble.network.AndroidNetworkModule;
import org.briarproject.bramble.plugin.tor.CircumventionModule; import org.briarproject.bramble.plugin.tor.CircumventionModule;
import org.briarproject.bramble.reporting.ReportingModule; import org.briarproject.bramble.reporting.ReportingModule;
import org.briarproject.bramble.socks.SocksModule; import org.briarproject.bramble.socks.SocksModule;
import org.briarproject.bramble.system.AndroidSystemModule; import org.briarproject.bramble.system.AndroidSystemModule;
import org.briarproject.bramble.system.AndroidTaskSchedulerModule; import org.briarproject.bramble.system.AndroidTaskSchedulerModule;
import org.briarproject.bramble.system.AndroidWakeLockModule;
import org.briarproject.bramble.system.AndroidWakefulIoExecutorModule; import org.briarproject.bramble.system.AndroidWakefulIoExecutorModule;
import org.briarproject.bramble.system.DefaultThreadFactoryModule;
import dagger.Module; import dagger.Module;
@@ -17,7 +20,10 @@ import dagger.Module;
AndroidSystemModule.class, AndroidSystemModule.class,
AndroidTaskSchedulerModule.class, AndroidTaskSchedulerModule.class,
AndroidWakefulIoExecutorModule.class, AndroidWakefulIoExecutorModule.class,
AndroidWakeLockModule.class,
DefaultThreadFactoryModule.class,
CircumventionModule.class, CircumventionModule.class,
DnsModule.class,
ReportingModule.class, ReportingModule.class,
SocksModule.class SocksModule.class
}) })
@@ -20,7 +20,6 @@ import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.GuardedBy;
import javax.inject.Inject; import javax.inject.Inject;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir; import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir;
@@ -105,16 +104,12 @@ class AndroidAccountManager extends AccountManagerImpl
} }
files.add(appContext.getFilesDir()); files.add(appContext.getFilesDir());
addIfNotNull(files, appContext.getExternalCacheDir()); addIfNotNull(files, appContext.getExternalCacheDir());
if (SDK_INT >= 19) {
for (File file : appContext.getExternalCacheDirs()) { for (File file : appContext.getExternalCacheDirs()) {
addIfNotNull(files, file); addIfNotNull(files, file);
} }
}
if (SDK_INT >= 21) {
for (File file : appContext.getExternalMediaDirs()) { for (File file : appContext.getExternalMediaDirs()) {
addIfNotNull(files, file); addIfNotNull(files, file);
} }
}
// Clear the cache directory but don't delete it // Clear the cache directory but don't delete it
File cacheDir = appContext.getCacheDir(); File cacheDir = appContext.getCacheDir();
File[] children = cacheDir.listFiles(); File[] children = cacheDir.listFiles();
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.system;
import android.content.Intent; import android.content.Intent;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface AlarmListener { public interface AlarmListener {
@@ -1,19 +0,0 @@
package org.briarproject.bramble.api.system;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault
public interface AndroidWakeLock {
/**
* Acquires the wake lock. This has no effect if the wake lock has already
* been acquired.
*/
void acquire();
/**
* Releases the wake lock. This has no effect if the wake lock has already
* been released.
*/
void release();
}
@@ -1,38 +0,0 @@
package org.briarproject.bramble.api.system;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.concurrent.Executor;
@NotNullByDefault
public interface AndroidWakeLockManager {
/**
* Creates a wake lock with the given tag. The tag is only used for
* logging; the underlying OS wake lock will use its own tag.
*/
AndroidWakeLock createWakeLock(String tag);
/**
* Runs the given task while holding a wake lock.
*/
void runWakefully(Runnable r, String tag);
/**
* Submits the given task to the given executor while holding a wake lock.
* The lock is released when the task completes, or if an exception is
* thrown while submitting or running the task.
*/
void executeWakefully(Runnable r, Executor executor, String tag);
/**
* Starts a dedicated thread to run the given task asynchronously. A wake
* lock is acquired before starting the thread and released when the task
* completes, or if an exception is thrown while starting the thread or
* running the task.
* <p>
* This method should only be used for lifecycle management tasks that
* can't be run on an executor.
*/
void executeWakefully(Runnable r, String tag);
}
@@ -5,6 +5,7 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.PowerManager;
import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.battery.BatteryManager;
import org.briarproject.bramble.api.battery.event.BatteryEvent; import org.briarproject.bramble.api.battery.event.BatteryEvent;
@@ -16,10 +17,17 @@ import java.util.logging.Logger;
import javax.inject.Inject; import javax.inject.Inject;
import androidx.annotation.RequiresApi;
import static android.content.Intent.ACTION_BATTERY_CHANGED; import static android.content.Intent.ACTION_BATTERY_CHANGED;
import static android.content.Intent.ACTION_POWER_CONNECTED; import static android.content.Intent.ACTION_POWER_CONNECTED;
import static android.content.Intent.ACTION_POWER_DISCONNECTED; import static android.content.Intent.ACTION_POWER_DISCONNECTED;
import static android.os.BatteryManager.EXTRA_PLUGGED; import static android.os.BatteryManager.EXTRA_PLUGGED;
import static android.os.Build.VERSION.SDK_INT;
import static android.os.PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED;
import static android.os.PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED;
import static android.os.PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED;
import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGED;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
@@ -57,6 +65,12 @@ class AndroidBatteryManager implements BatteryManager, Service {
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_POWER_CONNECTED); filter.addAction(ACTION_POWER_CONNECTED);
filter.addAction(ACTION_POWER_DISCONNECTED); filter.addAction(ACTION_POWER_DISCONNECTED);
filter.addAction(ACTION_POWER_SAVE_MODE_CHANGED);
if (SDK_INT >= 23) filter.addAction(ACTION_DEVICE_IDLE_MODE_CHANGED);
if (SDK_INT >= 33) {
filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED);
}
appContext.registerReceiver(batteryReceiver, filter); appContext.registerReceiver(batteryReceiver, filter);
} }
@@ -76,6 +90,33 @@ class AndroidBatteryManager implements BatteryManager, Service {
eventBus.broadcast(new BatteryEvent(true)); eventBus.broadcast(new BatteryEvent(true));
else if (ACTION_POWER_DISCONNECTED.equals(action)) else if (ACTION_POWER_DISCONNECTED.equals(action))
eventBus.broadcast(new BatteryEvent(false)); eventBus.broadcast(new BatteryEvent(false));
else if (SDK_INT >= 23 &&
ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action) &&
LOG.isLoggable(INFO)) {
LOG.info("Device idle mode changed to: " +
getPowerManager(ctx).isDeviceIdleMode());
} else if (SDK_INT >= 23 &&
ACTION_POWER_SAVE_MODE_CHANGED.equals(action) &&
LOG.isLoggable(INFO)) {
LOG.info("Power save mode changed to: " +
getPowerManager(ctx).isPowerSaveMode());
} else if (SDK_INT >= 33 && LOG.isLoggable(INFO) &&
ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED.equals(action)) {
PowerManager powerManager =
ctx.getSystemService(PowerManager.class);
LOG.info("Low power standby now is: " +
powerManager.isLowPowerStandbyEnabled());
} else if (SDK_INT >= 33 && LOG.isLoggable(INFO) &&
ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED.equals(action)) {
PowerManager powerManager = getPowerManager(ctx);
LOG.info("Light idle mode now is: " +
powerManager.isDeviceLightIdleMode());
} }
} }
} }
@RequiresApi(api = 23)
private PowerManager getPowerManager(Context ctx) {
return ctx.getSystemService(PowerManager.class);
}
}
@@ -11,17 +11,19 @@ import android.net.LinkAddress;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.Network; import android.net.Network;
import android.net.NetworkInfo; 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.EventBus;
import org.briarproject.bramble.api.event.EventExecutor; import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.lifecycle.Service; import org.briarproject.bramble.api.lifecycle.Service;
import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.network.NetworkManager;
import org.briarproject.bramble.api.network.NetworkStatus; import org.briarproject.bramble.api.network.NetworkStatus;
import org.briarproject.bramble.api.network.event.NetworkStatusEvent; 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;
import org.briarproject.bramble.api.system.TaskScheduler.Cancellable; import org.briarproject.nullsafety.MethodsNotNullByDefault;
import org.briarproject.nullsafety.ParametersNotNullByDefault;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.InetAddress; import java.net.InetAddress;
@@ -38,6 +40,7 @@ import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import static android.content.Context.CONNECTIVITY_SERVICE; 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_OFF;
import static android.content.Intent.ACTION_SCREEN_ON; import static android.content.Intent.ACTION_SCREEN_ON;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
@@ -52,8 +55,8 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.nullsafety.NullSafety.requireNonNull;
@MethodsNotNullByDefault @MethodsNotNullByDefault
@ParametersNotNullByDefault @ParametersNotNullByDefault
@@ -111,8 +114,15 @@ class AndroidNetworkManager implements NetworkManager, Service {
@Override @Override
public NetworkStatus getNetworkStatus() { public NetworkStatus getNetworkStatus() {
// https://issuetracker.google.com/issues/175055271
try {
NetworkInfo net = connectivityManager.getActiveNetworkInfo(); NetworkInfo net = connectivityManager.getActiveNetworkInfo();
boolean connected = net != null && net.isConnected(); boolean connected = net != null && net.isConnected();
// Research into Android's behavior to check network connectivity
// (https://code.briarproject.org/briar/public-mesh-research/-/issues/19)
// has shown that NetworkInfo#isConnected() returns true if the device
// is connected to any Wifi, independent of whether any specific IP
// address can be reached using it or any domain names can be resolved.
boolean wifi = false, ipv6Only = false; boolean wifi = false, ipv6Only = false;
if (connected) { if (connected) {
wifi = net.getType() == TYPE_WIFI; wifi = net.getType() == TYPE_WIFI;
@@ -120,6 +130,26 @@ class AndroidNetworkManager implements NetworkManager, Service {
else ipv6Only = areAllAvailableNetworksIpv6Only(); else ipv6Only = areAllAvailableNetworksIpv6Only();
} }
return new NetworkStatus(connected, wifi, ipv6Only); 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);
}
} }
/** /**
@@ -130,6 +160,8 @@ class AndroidNetworkManager implements NetworkManager, Service {
*/ */
@TargetApi(23) @TargetApi(23)
private boolean isActiveNetworkIpv6Only() { private boolean isActiveNetworkIpv6Only() {
// https://issuetracker.google.com/issues/175055271
try {
Network net = connectivityManager.getActiveNetwork(); Network net = connectivityManager.getActiveNetwork();
if (net == null) { if (net == null) {
LOG.info("No active network"); LOG.info("No active network");
@@ -147,6 +179,10 @@ class AndroidNetworkManager implements NetworkManager, Service {
if (!addr.isMulticastAddress()) hasIpv6Unicast = true; if (!addr.isMulticastAddress()) hasIpv6Unicast = true;
} }
return hasIpv6Unicast; return hasIpv6Unicast;
} catch (SecurityException e) {
logException(LOG, WARNING, e);
return false;
}
} }
/** /**
@@ -2,11 +2,11 @@ package org.briarproject.bramble.plugin.bluetooth;
import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothSocket;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.io.TimeoutMonitor; import org.briarproject.bramble.api.io.TimeoutMonitor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
import org.briarproject.bramble.api.system.AndroidWakeLockManager; import org.briarproject.nullsafety.NotNullByDefault;
import java.io.IOException; import java.io.IOException;
@@ -1,5 +1,6 @@
package org.briarproject.bramble.plugin.bluetooth; package org.briarproject.bramble.plugin.bluetooth;
import android.annotation.SuppressLint;
import android.app.Application; import android.app.Application;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
@@ -10,8 +11,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginCallback;
import org.briarproject.bramble.api.plugin.PluginException; import org.briarproject.bramble.api.plugin.PluginException;
@@ -20,6 +19,8 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.bramble.util.AndroidUtils;
import org.briarproject.bramble.util.IoUtils; import org.briarproject.bramble.util.IoUtils;
import org.briarproject.nullsafety.MethodsNotNullByDefault;
import org.briarproject.nullsafety.ParametersNotNullByDefault;
import java.io.IOException; import java.io.IOException;
import java.security.SecureRandom; import java.security.SecureRandom;
@@ -49,16 +50,17 @@ import static android.bluetooth.BluetoothAdapter.STATE_ON;
import static android.bluetooth.BluetoothDevice.ACTION_FOUND; import static android.bluetooth.BluetoothDevice.ACTION_FOUND;
import static android.bluetooth.BluetoothDevice.DEVICE_TYPE_LE; import static android.bluetooth.BluetoothDevice.DEVICE_TYPE_LE;
import static android.bluetooth.BluetoothDevice.EXTRA_DEVICE; import static android.bluetooth.BluetoothDevice.EXTRA_DEVICE;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.Collections.shuffle; import static java.util.Collections.shuffle;
import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.util.AndroidUtils.hasBtConnectPermission;
import static org.briarproject.bramble.util.PrivacyUtils.scrubMacAddress; import static org.briarproject.bramble.util.PrivacyUtils.scrubMacAddress;
@MethodsNotNullByDefault @MethodsNotNullByDefault
@ParametersNotNullByDefault @ParametersNotNullByDefault
@SuppressLint("MissingPermission")
class AndroidBluetoothPlugin extends class AndroidBluetoothPlugin extends
AbstractBluetoothPlugin<BluetoothSocket, BluetoothServerSocket> { AbstractBluetoothPlugin<BluetoothSocket, BluetoothServerSocket> {
@@ -87,7 +89,7 @@ class AndroidBluetoothPlugin extends
Clock clock, Clock clock,
Backoff backoff, Backoff backoff,
PluginCallback callback, PluginCallback callback,
int maxLatency, long maxLatency,
int maxIdleTime) { int maxIdleTime) {
super(connectionLimiter, connectionFactory, ioExecutor, super(connectionLimiter, connectionFactory, ioExecutor,
wakefulIoExecutor, secureRandom, backoff, callback, wakefulIoExecutor, secureRandom, backoff, callback,
@@ -97,6 +99,11 @@ class AndroidBluetoothPlugin extends
this.clock = clock; this.clock = clock;
} }
@Override
protected boolean isBluetoothAccessible() {
return hasBtConnectPermission(app);
}
@Override @Override
public void start() throws PluginException { public void start() throws PluginException {
super.start(); super.start();
@@ -247,7 +254,7 @@ class AndroidBluetoothPlugin extends
} else if (ACTION_FOUND.equals(action)) { } else if (ACTION_FOUND.equals(action)) {
BluetoothDevice d = i.getParcelableExtra(EXTRA_DEVICE); BluetoothDevice d = i.getParcelableExtra(EXTRA_DEVICE);
// Ignore Bluetooth LE devices // Ignore Bluetooth LE devices
if (SDK_INT < 18 || d.getType() != DEVICE_TYPE_LE) { if (d.getType() != DEVICE_TYPE_LE) {
String address = d.getAddress(); String address = d.getAddress();
if (LOG.isLoggable(INFO)) if (LOG.isLoggable(INFO))
LOG.info("Discovered " + LOG.info("Discovered " +
@@ -3,10 +3,10 @@ package org.briarproject.bramble.plugin.bluetooth;
import android.app.Application; import android.app.Application;
import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothSocket;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.io.TimeoutMonitor; import org.briarproject.bramble.api.io.TimeoutMonitor;
import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.BackoffFactory; import org.briarproject.bramble.api.plugin.BackoffFactory;
import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginCallback;
@@ -14,9 +14,9 @@ import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.WakefulIoExecutor; import org.briarproject.bramble.api.system.WakefulIoExecutor;
import org.briarproject.nullsafety.NotNullByDefault;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -75,7 +75,7 @@ public class AndroidBluetoothPluginFactory implements DuplexPluginFactory {
} }
@Override @Override
public int getMaxLatency() { public long getMaxLatency() {
return MAX_LATENCY; return MAX_LATENCY;
} }
@@ -2,12 +2,12 @@ package org.briarproject.bramble.plugin.bluetooth;
import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothSocket;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLock;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.io.TimeoutMonitor; import org.briarproject.bramble.api.io.TimeoutMonitor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.Plugin;
import org.briarproject.bramble.api.plugin.duplex.AbstractDuplexTransportConnection; import org.briarproject.bramble.api.plugin.duplex.AbstractDuplexTransportConnection;
import org.briarproject.bramble.api.system.AndroidWakeLock; import org.briarproject.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -33,8 +33,10 @@ class AndroidBluetoothTransportConnection
super(plugin); super(plugin);
this.connectionLimiter = connectionLimiter; this.connectionLimiter = connectionLimiter;
this.socket = socket; this.socket = socket;
in = timeoutMonitor.createTimeoutInputStream( InputStream socketIn = socket.getInputStream();
socket.getInputStream(), plugin.getMaxIdleTime() * 2); if (socketIn == null) throw new IOException();
in = timeoutMonitor.createTimeoutInputStream(socketIn,
plugin.getMaxIdleTime() * 2L);
wakeLock = wakeLockManager.createWakeLock("BluetoothConnection"); wakeLock = wakeLockManager.createWakeLock("BluetoothConnection");
wakeLock.acquire(); wakeLock.acquire();
String address = socket.getRemoteDevice().getAddress(); String address = socket.getRemoteDevice().getAddress();
@@ -48,7 +50,9 @@ class AndroidBluetoothTransportConnection
@Override @Override
protected OutputStream getOutputStream() throws IOException { protected OutputStream getOutputStream() throws IOException {
return socket.getOutputStream(); OutputStream socketOut = socket.getOutputStream();
if (socketOut == null) throw new IOException();
return socketOut;
} }
@Override @Override
@@ -3,8 +3,9 @@ package org.briarproject.bramble.plugin.file;
import android.app.Application; import android.app.Application;
import android.net.Uri; import android.net.Uri;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.PluginCallback;
import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportProperties;
import org.briarproject.nullsafety.NotNullByDefault;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -21,8 +22,9 @@ class AndroidRemovableDrivePlugin extends RemovableDrivePlugin {
private final Application app; private final Application app;
AndroidRemovableDrivePlugin(Application app, int maxLatency) { AndroidRemovableDrivePlugin(Application app, PluginCallback callback,
super(maxLatency); long maxLatency) {
super(callback, maxLatency);
this.app = app; this.app = app;
} }
@@ -30,13 +32,22 @@ class AndroidRemovableDrivePlugin extends RemovableDrivePlugin {
InputStream openInputStream(TransportProperties p) throws IOException { InputStream openInputStream(TransportProperties p) throws IOException {
String uri = p.get(PROP_URI); String uri = p.get(PROP_URI);
if (isNullOrEmpty(uri)) throw new IllegalArgumentException(); if (isNullOrEmpty(uri)) throw new IllegalArgumentException();
try {
return app.getContentResolver().openInputStream(Uri.parse(uri)); return app.getContentResolver().openInputStream(Uri.parse(uri));
} catch (SecurityException e) {
throw new IOException(e);
}
} }
@Override @Override
OutputStream openOutputStream(TransportProperties p) throws IOException { OutputStream openOutputStream(TransportProperties p) throws IOException {
String uri = p.get(PROP_URI); String uri = p.get(PROP_URI);
if (isNullOrEmpty(uri)) throw new IllegalArgumentException(); 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);
}
} }
} }
@@ -2,11 +2,11 @@ package org.briarproject.bramble.plugin.file;
import android.app.Application; import android.app.Application;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginCallback;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin; import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory;
import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -20,7 +20,7 @@ import static org.briarproject.bramble.api.plugin.file.RemovableDriveConstants.I
public class AndroidRemovableDrivePluginFactory implements public class AndroidRemovableDrivePluginFactory implements
SimplexPluginFactory { SimplexPluginFactory {
private static final int MAX_LATENCY = (int) DAYS.toMillis(14); private static final long MAX_LATENCY = DAYS.toMillis(28);
private final Application app; private final Application app;
@@ -35,13 +35,13 @@ public class AndroidRemovableDrivePluginFactory implements
} }
@Override @Override
public int getMaxLatency() { public long getMaxLatency() {
return MAX_LATENCY; return MAX_LATENCY;
} }
@Nullable @Nullable
@Override @Override
public SimplexPlugin createPlugin(PluginCallback callback) { public SimplexPlugin createPlugin(PluginCallback callback) {
return new AndroidRemovableDrivePlugin(app, MAX_LATENCY); return new AndroidRemovableDrivePlugin(app, callback, MAX_LATENCY);
} }
} }
@@ -1,6 +1,5 @@
package org.briarproject.bramble.plugin.tcp; package org.briarproject.bramble.plugin.tcp;
import android.annotation.TargetApi;
import android.app.Application; import android.app.Application;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.LinkAddress; import android.net.LinkAddress;
@@ -14,10 +13,10 @@ import org.briarproject.bramble.PoliteExecutor;
import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.Pair;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.network.event.NetworkStatusEvent; import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginCallback;
import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.Settings;
import org.briarproject.nullsafety.NotNullByDefault;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
@@ -29,6 +28,7 @@ import java.net.UnknownHostException;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.net.SocketFactory; import javax.net.SocketFactory;
@@ -36,18 +36,18 @@ import javax.net.SocketFactory;
import static android.content.Context.CONNECTIVITY_SERVICE; import static android.content.Context.CONNECTIVITY_SERVICE;
import static android.content.Context.WIFI_SERVICE; import static android.content.Context.WIFI_SERVICE;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
import static java.util.Collections.list; import static java.util.Collections.list;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
import static org.briarproject.bramble.api.plugin.LanTcpConstants.DEFAULT_PREF_PLUGIN_ENABLE; import static org.briarproject.bramble.api.plugin.LanTcpConstants.DEFAULT_PREF_PLUGIN_ENABLE;
import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE;
import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE;
import static org.briarproject.bramble.util.IoUtils.tryToClose; import static org.briarproject.bramble.util.IoUtils.tryToClose;
import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.bramble.util.NetworkUtils.getNetworkInterfaces;
import static org.briarproject.nullsafety.NullSafety.requireNonNull;
@NotNullByDefault @NotNullByDefault
class AndroidLanTcpPlugin extends LanTcpPlugin { class AndroidLanTcpPlugin extends LanTcpPlugin {
@@ -55,6 +55,13 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
private static final Logger LOG = private static final Logger LOG =
getLogger(AndroidLanTcpPlugin.class.getName()); getLogger(AndroidLanTcpPlugin.class.getName());
/**
* The interface name is used as a heuristic for deciding whether the
* device is providing a wifi access point.
*/
private static final Pattern AP_INTERFACE_NAME =
Pattern.compile("^(wlan|ap|p2p)[-0-9]");
private final Executor connectionStatusExecutor; private final Executor connectionStatusExecutor;
private final ConnectivityManager connectivityManager; private final ConnectivityManager connectivityManager;
@Nullable @Nullable
@@ -67,7 +74,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
Application app, Application app,
Backoff backoff, Backoff backoff,
PluginCallback callback, PluginCallback callback,
int maxLatency, long maxLatency,
int maxIdleTime, int maxIdleTime,
int connectionTimeout) { int connectionTimeout) {
super(ioExecutor, wakefulIoExecutor, backoff, callback, maxLatency, super(ioExecutor, wakefulIoExecutor, backoff, callback, maxLatency,
@@ -109,7 +116,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
// If there's no wifi IPv4 address, we might be a client on an // If there's no wifi IPv4 address, we might be a client on an
// IPv6-only wifi network. We can only detect this on API 21+ // IPv6-only wifi network. We can only detect this on API 21+
if (wifi == null) { if (wifi == null) {
return SDK_INT >= 21 ? getWifiClientIpv6Address() : null; return getWifiClientIpv6Address();
} }
// Use the wifi IPv4 address to determine which interface's IPv6 // Use the wifi IPv4 address to determine which interface's IPv6
// address we should return (if the interface has a suitable address) // address we should return (if the interface has a suitable address)
@@ -130,17 +137,14 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
if (info != null && info.getIpAddress() != 0) { if (info != null && info.getIpAddress() != 0) {
return new Pair<>(intToInetAddress(info.getIpAddress()), false); return new Pair<>(intToInetAddress(info.getIpAddress()), false);
} }
List<InterfaceAddress> ifAddrs = getLocalInterfaceAddresses(); // If we're providing an access point, return its address
// If we're providing a normal access point, return its address for (NetworkInterface iface : getNetworkInterfaces()) {
for (InterfaceAddress ifAddr : ifAddrs) { if (AP_INTERFACE_NAME.matcher(iface.getName()).find()) {
if (isAndroidWifiApAddress(ifAddr)) { for (InterfaceAddress ifAddr : iface.getInterfaceAddresses()) {
if (isPossibleWifiApInterface(ifAddr)) {
return new Pair<>(ifAddr.getAddress(), true); return new Pair<>(ifAddr.getAddress(), true);
} }
} }
// If we're providing a wifi direct access point, return its address
for (InterfaceAddress ifAddr : ifAddrs) {
if (isAndroidWifiDirectApAddress(ifAddr)) {
return new Pair<>(ifAddr.getAddress(), true);
} }
} }
// Not connected to wifi // Not connected to wifi
@@ -148,53 +152,45 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
} }
/** /**
* Returns true if the given address belongs to a network provided by an * Returns true if the given address may belong to an interface providing
* Android access point (including the access point's own address). * a wifi access point (including wifi direct legacy mode access points).
* <p> * <p>
* The access point's address is usually 192.168.43.1, but at least one * This method may return true for wifi client interfaces as well, but
* device (Honor 8A) may use other addresses in the range 192.168.43.0/24. * we've already checked for a wifi client connection above.
*/ */
private boolean isAndroidWifiApAddress(InterfaceAddress ifAddr) { private boolean isPossibleWifiApInterface(InterfaceAddress ifAddr) {
if (ifAddr.getNetworkPrefixLength() != 24) return false; if (ifAddr.getNetworkPrefixLength() != 24) return false;
byte[] ip = ifAddr.getAddress().getAddress(); byte[] ip = ifAddr.getAddress().getAddress();
return ip.length == 4 return ip.length == 4
&& ip[0] == (byte) 192 && ip[0] == (byte) 192
&& ip[1] == (byte) 168 && ip[1] == (byte) 168;
&& ip[2] == (byte) 43;
}
/**
* Returns true if the given address belongs to a network provided by an
* Android wifi direct legacy mode access point (including the access
* point's own address).
*/
private boolean isAndroidWifiDirectApAddress(InterfaceAddress ifAddr) {
if (ifAddr.getNetworkPrefixLength() != 24) return false;
byte[] ip = ifAddr.getAddress().getAddress();
return ip.length == 4
&& ip[0] == (byte) 192
&& ip[1] == (byte) 168
&& ip[2] == (byte) 49;
} }
/** /**
* Returns a link-local IPv6 address for the wifi client interface, or null * Returns a link-local IPv6 address for the wifi client interface, or null
* if there's no such interface or it doesn't have a suitable address. * if there's no such interface or it doesn't have a suitable address.
*/ */
@TargetApi(21)
@Nullable @Nullable
private InetAddress getWifiClientIpv6Address() { private InetAddress getWifiClientIpv6Address() {
// https://issuetracker.google.com/issues/175055271
try {
for (Network net : connectivityManager.getAllNetworks()) { for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities caps = NetworkCapabilities caps =
connectivityManager.getNetworkCapabilities(net); connectivityManager.getNetworkCapabilities(net);
if (caps == null || !caps.hasTransport(TRANSPORT_WIFI)) continue; if (caps == null || !caps.hasTransport(TRANSPORT_WIFI)) {
LinkProperties props = connectivityManager.getLinkProperties(net); continue;
}
LinkProperties props =
connectivityManager.getLinkProperties(net);
if (props == null) continue; if (props == null) continue;
for (LinkAddress linkAddress : props.getLinkAddresses()) { for (LinkAddress linkAddress : props.getLinkAddresses()) {
InetAddress addr = linkAddress.getAddress(); InetAddress addr = linkAddress.getAddress();
if (isIpv6LinkLocalAddress(addr)) return addr; if (isIpv6LinkLocalAddress(addr)) return addr;
} }
} }
} catch (SecurityException e) {
logException(LOG, WARNING, e);
}
return null; return null;
} }
@@ -235,7 +231,8 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
// On API 21 and later, a socket that is not created with the wifi // On API 21 and later, a socket that is not created with the wifi
// network's socket factory may try to connect via another network // network's socket factory may try to connect via another network
private SocketFactory getSocketFactory() { private SocketFactory getSocketFactory() {
if (SDK_INT < 21) return SocketFactory.getDefault(); // https://issuetracker.google.com/issues/175055271
try {
for (Network net : connectivityManager.getAllNetworks()) { for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities caps = NetworkCapabilities caps =
connectivityManager.getNetworkCapabilities(net); connectivityManager.getNetworkCapabilities(net);
@@ -243,6 +240,9 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
return net.getSocketFactory(); return net.getSocketFactory();
} }
} }
} catch (SecurityException e) {
logException(LOG, WARNING, e);
}
LOG.warning("Could not find suitable socket factory"); LOG.warning("Could not find suitable socket factory");
return SocketFactory.getDefault(); return SocketFactory.getDefault();
} }
@@ -298,7 +298,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
Pair<InetAddress, Boolean> wifi = getWifiIpv4Address(); Pair<InetAddress, Boolean> wifi = getWifiIpv4Address();
// If there's no wifi IPv4 address, we might be a client on an // If there's no wifi IPv4 address, we might be a client on an
// IPv6-only wifi network. We can only detect this on API 21+ // IPv6-only wifi network. We can only detect this on API 21+
if (wifi == null && SDK_INT >= 21) { if (wifi == null) {
InetAddress ipv6 = getWifiClientIpv6Address(); InetAddress ipv6 = getWifiClientIpv6Address();
if (ipv6 != null) return new Pair<>(ipv6, false); if (ipv6 != null) return new Pair<>(ipv6, false);
} }
@@ -4,7 +4,6 @@ import android.app.Application;
import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventBus;
import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.BackoffFactory; import org.briarproject.bramble.api.plugin.BackoffFactory;
import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginCallback;
@@ -12,6 +11,7 @@ import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin; import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
import org.briarproject.bramble.api.system.WakefulIoExecutor; import org.briarproject.bramble.api.system.WakefulIoExecutor;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -55,7 +55,7 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
} }
@Override @Override
public int getMaxLatency() { public long getMaxLatency() {
return MAX_LATENCY; return MAX_LATENCY;
} }
@@ -1,222 +0,0 @@
package org.briarproject.bramble.plugin.tor;
import android.app.Application;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import org.briarproject.bramble.api.battery.BatteryManager;
import org.briarproject.bramble.api.network.NetworkManager;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.PluginCallback;
import org.briarproject.bramble.api.system.AndroidWakeLock;
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.util.AndroidUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.net.SocketFactory;
import static android.os.Build.VERSION.SDK_INT;
import static java.util.Arrays.asList;
import static java.util.logging.Level.INFO;
import static java.util.logging.Logger.getLogger;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
class AndroidTorPlugin extends TorPlugin {
private static final List<String> LIBRARY_ARCHITECTURES =
asList("armeabi-v7a", "arm64-v8a", "x86", "x86_64");
private static final String TOR_LIB_NAME = "libtor.so";
private static final String OBFS4_LIB_NAME = "libobfs4proxy.so";
private static final Logger LOG =
getLogger(AndroidTorPlugin.class.getName());
private final Application app;
private final AndroidWakeLock wakeLock;
private final File torLib, obfs4Lib;
AndroidTorPlugin(Executor ioExecutor,
Executor wakefulIoExecutor,
Application app,
NetworkManager networkManager,
LocationUtils locationUtils,
SocketFactory torSocketFactory,
Clock clock,
ResourceProvider resourceProvider,
CircumventionProvider circumventionProvider,
BatteryManager batteryManager,
AndroidWakeLockManager wakeLockManager,
Backoff backoff,
TorRendezvousCrypto torRendezvousCrypto,
PluginCallback callback,
String architecture,
int maxLatency,
int maxIdleTime,
File torDirectory) {
super(ioExecutor, wakefulIoExecutor, networkManager, locationUtils,
torSocketFactory, clock, resourceProvider,
circumventionProvider, batteryManager, backoff,
torRendezvousCrypto, callback, architecture, maxLatency,
maxIdleTime, torDirectory);
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);
}
@Override
protected int getProcessId() {
return android.os.Process.myPid();
}
@Override
protected long getLastUpdateTime() {
try {
PackageManager pm = app.getPackageManager();
PackageInfo pi = pm.getPackageInfo(app.getPackageName(), 0);
return pi.lastUpdateTime;
} catch (NameNotFoundException e) {
throw new AssertionError(e);
}
}
@Override
protected void enableNetwork(boolean enable) throws IOException {
if (enable) wakeLock.acquire();
super.enableNetwork(enable);
if (!enable) wakeLock.release();
}
@Override
public void stop() {
super.stop();
wakeLock.release();
}
@Override
protected File getTorExecutableFile() {
return torLib.exists() ? torLib : super.getTorExecutableFile();
}
@Override
protected File getObfs4ExecutableFile() {
return obfs4Lib.exists() ? obfs4Lib : super.getObfs4ExecutableFile();
}
@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());
}
}
@Override
protected void installObfs4Executable() throws IOException {
File extracted = super.getObfs4ExecutableFile();
if (obfs4Lib.exists()) {
// If an older version left behind an obfs4 binary, delete it
if (extracted.exists()) {
if (extracted.delete()) LOG.info("Deleted obfs4 binary");
else LOG.info("Failed to delete obfs4 binary");
}
} else if (SDK_INT < 29) {
// The binary wasn't extracted at install time. Try to extract it
extractLibraryFromApk(OBFS4_LIB_NAME, extracted);
} else {
// No point extracting the binary, we won't be allowed to execute it
throw new FileNotFoundException(obfs4Lib.getAbsolutePath());
}
}
private void extractLibraryFromApk(String libName, File dest)
throws IOException {
File sourceDir = new File(app.getApplicationInfo().sourceDir);
if (sourceDir.isFile()) {
// Look for other APK files in the same directory, if we're allowed
File parent = sourceDir.getParentFile();
if (parent != null) sourceDir = parent;
}
List<String> libPaths = getSupportedLibraryPaths(libName);
for (File apk : findApkFiles(sourceDir)) {
ZipInputStream zin = new ZipInputStream(new FileInputStream(apk));
for (ZipEntry e = zin.getNextEntry(); e != null;
e = zin.getNextEntry()) {
if (libPaths.contains(e.getName())) {
if (LOG.isLoggable(INFO)) {
LOG.info("Extracting " + e.getName()
+ " from " + apk.getAbsolutePath());
}
extract(zin, dest); // Zip input stream will be closed
return;
}
}
zin.close();
}
throw new FileNotFoundException(libName);
}
/**
* Returns all files with the extension .apk or .APK under the given root.
*/
private List<File> findApkFiles(File root) {
List<File> files = new ArrayList<>();
findApkFiles(root, files);
return files;
}
private void findApkFiles(File f, List<File> files) {
if (f.isFile() && f.getName().toLowerCase().endsWith(".apk")) {
files.add(f);
} else if (f.isDirectory()) {
File[] children = f.listFiles();
if (children != null) {
for (File child : children) findApkFiles(child, files);
}
}
}
/**
* Returns the paths at which libraries with the given name would be found
* inside an APK file, for all architectures supported by the device, in
* order of preference.
*/
private List<String> getSupportedLibraryPaths(String libName) {
List<String> architectures = new ArrayList<>();
for (String abi : AndroidUtils.getSupportedArchitectures()) {
if (LIBRARY_ARCHITECTURES.contains(abi)) {
architectures.add("lib/" + abi + "/" + libName);
}
}
return architectures;
}
}
@@ -2,139 +2,99 @@ package org.briarproject.bramble.plugin.tor;
import android.app.Application; import android.app.Application;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.battery.BatteryManager; 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.event.EventBus;
import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.network.NetworkManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.Backoff;
import org.briarproject.bramble.api.plugin.BackoffFactory; import org.briarproject.bramble.api.plugin.BackoffFactory;
import org.briarproject.bramble.api.plugin.PluginCallback; 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.TorDirectory;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TorSocksPort;
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.Clock; 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.api.system.WakefulIoExecutor;
import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.nullsafety.NotNullByDefault;
import org.briarproject.onionwrapper.AndroidTorWrapper;
import org.briarproject.onionwrapper.CircumventionProvider;
import org.briarproject.onionwrapper.LocationUtils;
import org.briarproject.onionwrapper.TorWrapper;
import java.io.File; import java.io.File;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
import javax.net.SocketFactory; import javax.net.SocketFactory;
import static android.os.Build.VERSION.SDK_INT;
import static org.briarproject.bramble.util.AndroidUtils.getSupportedArchitectures;
@Immutable @Immutable
@NotNullByDefault @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 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 AndroidWakeLockManager wakeLockManager;
private final Clock clock;
private final File torDirectory;
@Inject @Inject
AndroidTorPluginFactory(@IoExecutor Executor ioExecutor, AndroidTorPluginFactory(@IoExecutor Executor ioExecutor,
@EventExecutor Executor eventExecutor,
@WakefulIoExecutor Executor wakefulIoExecutor, @WakefulIoExecutor Executor wakefulIoExecutor,
Application app,
NetworkManager networkManager, NetworkManager networkManager,
LocationUtils locationUtils, LocationUtils locationUtils,
EventBus eventBus, EventBus eventBus,
SocketFactory torSocketFactory, SocketFactory torSocketFactory,
BackoffFactory backoffFactory, BackoffFactory backoffFactory,
ResourceProvider resourceProvider,
CircumventionProvider circumventionProvider, CircumventionProvider circumventionProvider,
BatteryManager batteryManager, BatteryManager batteryManager,
AndroidWakeLockManager wakeLockManager,
Clock clock, Clock clock,
@TorDirectory File torDirectory) { CryptoComponent crypto,
this.ioExecutor = ioExecutor; @TorDirectory File torDirectory,
this.wakefulIoExecutor = wakefulIoExecutor; @TorSocksPort int torSocksPort,
@TorControlPort int torControlPort,
Application app,
AndroidWakeLockManager wakeLockManager) {
super(ioExecutor, eventExecutor, wakefulIoExecutor, networkManager,
locationUtils, eventBus, torSocketFactory, backoffFactory,
circumventionProvider, batteryManager, clock, crypto,
torDirectory, torSocksPort, torControlPort);
this.app = app; 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.wakeLockManager = wakeLockManager;
this.clock = clock;
this.torDirectory = torDirectory;
} }
@Nullable
@Override @Override
public TransportId getId() { String getArchitectureForTorBinary() {
return TorConstants.ID; 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";
} }
@Override
public int 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;
}
}
if (architecture == null) {
LOG.info("Tor is not supported on this architecture");
return null; return null;
} }
// Use position-independent executable
architecture += "_pie";
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, @Override
MAX_POLLING_INTERVAL, BACKOFF_BASE); TorPlugin createPluginInstance(Backoff backoff,
TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl(); TorRendezvousCrypto torRendezvousCrypto, PluginCallback callback,
AndroidTorPlugin plugin = new AndroidTorPlugin(ioExecutor, String architecture) {
wakefulIoExecutor, app, networkManager, locationUtils, TorWrapper tor = new AndroidTorWrapper(app, wakeLockManager,
torSocketFactory, clock, resourceProvider, ioExecutor, eventExecutor, architecture, torDirectory,
circumventionProvider, batteryManager, wakeLockManager, torSocksPort, torControlPort);
backoff, torRendezvousCrypto, callback, architecture, // Android versions 7.1 and newer can verify Let's Encrypt TLS certs
MAX_LATENCY, MAX_IDLE_TIME, torDirectory); // signed with the IdentTrust DST Root X3 certificate. Older versions
eventBus.addListener(plugin); // of Android consider the certificate to have expired at the end of
return plugin; // September 2021.
boolean canVerifyLetsEncryptCerts = SDK_INT >= 25;
return new TorPlugin(ioExecutor, wakefulIoExecutor,
networkManager, locationUtils, torSocketFactory,
circumventionProvider, batteryManager, backoff,
torRendezvousCrypto, tor, callback, MAX_LATENCY,
MAX_IDLE_TIME, canVerifyLetsEncryptCerts);
} }
} }
@@ -1,6 +1,6 @@
package org.briarproject.bramble.system; package org.briarproject.bramble.system;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
interface AlarmConstants { interface AlarmConstants {
@@ -1,72 +0,0 @@
package org.briarproject.bramble.system;
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.LocationUtils;
import java.util.Locale;
import java.util.logging.Logger;
import javax.inject.Inject;
import static android.content.Context.TELEPHONY_SERVICE;
@NotNullByDefault
class AndroidLocationUtils implements LocationUtils {
private static final Logger LOG =
Logger.getLogger(AndroidLocationUtils.class.getName());
private final Context appContext;
@Inject
AndroidLocationUtils(Application app) {
appContext = app.getApplicationContext();
}
/**
* This guesses the current country from the first of these sources that
* succeeds (also in order of likelihood of being correct):
*
* <ul>
* <li>Phone network. This works even when no SIM card is inserted, or a
* foreign SIM card is inserted.</li>
* <li>SIM card. This is only an heuristic and assumes the user is not
* roaming.</li>
* <li>User locale. This is an even worse heuristic.</li>
* </ul>
*
* Note: this is very similar to <a href="https://android.googlesource.com/platform/frameworks/base/+/cd92588%5E/location/java/android/location/CountryDetector.java">
* this API</a> except it seems that Google doesn't want us to use it for
* some reason - both that class and {@code Context.COUNTRY_CODE} are
* annotated {@code @hide}.
*/
@Override
@SuppressLint("DefaultLocale")
public String getCurrentCountry() {
String countryCode = getCountryFromPhoneNetwork();
if (!TextUtils.isEmpty(countryCode)) return countryCode.toUpperCase();
LOG.info("Falling back to SIM card country");
countryCode = getCountryFromSimCard();
if (!TextUtils.isEmpty(countryCode)) return countryCode.toUpperCase();
LOG.info("Falling back to user-defined locale");
return Locale.getDefault().getCountry();
}
private String getCountryFromPhoneNetwork() {
Object o = appContext.getSystemService(TELEPHONY_SERVICE);
TelephonyManager tm = (TelephonyManager) o;
return tm == null ? "" : tm.getNetworkCountryIso();
}
private String getCountryFromSimCard() {
Object o = appContext.getSystemService(TELEPHONY_SERVICE);
TelephonyManager tm = (TelephonyManager) o;
return tm == null ? "" : tm.getSimCountryIso();
}
}
@@ -4,8 +4,8 @@ import android.app.Application;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.ResourceProvider; import org.briarproject.bramble.api.system.ResourceProvider;
import org.briarproject.nullsafety.NotNullByDefault;
import java.io.InputStream; import java.io.InputStream;
@@ -6,28 +6,31 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.os.Parcel; import android.os.Parcel;
import android.os.StrictMode; import android.os.StrictMode;
import android.provider.Settings; import android.provider.Settings;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Set;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import javax.inject.Inject; import javax.inject.Inject;
import static android.os.Build.FINGERPRINT;
import static android.os.Build.SERIAL;
import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION.SDK_INT;
import static android.os.Process.myPid;
import static android.os.Process.myTid;
import static android.os.Process.myUid;
import static android.provider.Settings.Secure.ANDROID_ID; import static android.provider.Settings.Secure.ANDROID_ID;
@Immutable @Immutable
@NotNullByDefault @NotNullByDefault
class AndroidSecureRandomProvider extends UnixSecureRandomProvider { class AndroidSecureRandomProvider extends UnixSecureRandomProvider {
private static final int SEED_LENGTH = 32;
private final Context appContext; private final Context appContext;
@Inject @Inject
@@ -39,50 +42,34 @@ class AndroidSecureRandomProvider extends UnixSecureRandomProvider {
@Override @Override
protected void writeToEntropyPool(DataOutputStream out) throws IOException { protected void writeToEntropyPool(DataOutputStream out) throws IOException {
super.writeToEntropyPool(out); super.writeToEntropyPool(out);
out.writeInt(android.os.Process.myPid()); out.writeInt(myPid());
out.writeInt(android.os.Process.myTid()); out.writeInt(myTid());
out.writeInt(android.os.Process.myUid()); out.writeInt(myUid());
if (Build.FINGERPRINT != null) out.writeUTF(Build.FINGERPRINT); if (FINGERPRINT != null) out.writeUTF(FINGERPRINT);
if (Build.SERIAL != null) out.writeUTF(Build.SERIAL); if (SERIAL != null) out.writeUTF(SERIAL);
ContentResolver contentResolver = appContext.getContentResolver(); ContentResolver contentResolver = appContext.getContentResolver();
String id = Settings.Secure.getString(contentResolver, ANDROID_ID); String id = Settings.Secure.getString(contentResolver, ANDROID_ID);
if (id != null) out.writeUTF(id); if (id != null) out.writeUTF(id);
// On API 31 and higher we need permission to access bonded devices
if (SDK_INT < 31) {
Parcel parcel = Parcel.obtain(); Parcel parcel = Parcel.obtain();
BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter(); BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
if (bt != null) { if (bt != null) {
for (BluetoothDevice device : bt.getBondedDevices()) @SuppressLint("MissingPermission")
Set<BluetoothDevice> deviceSet = bt.getBondedDevices();
for (BluetoothDevice device : deviceSet)
parcel.writeParcelable(device, 0); parcel.writeParcelable(device, 0);
} }
out.write(parcel.marshall()); out.write(parcel.marshall());
parcel.recycle(); parcel.recycle();
} }
}
@Override @Override
protected void writeSeed() { protected void writeSeed() {
// Silence strict mode // Silence strict mode
StrictMode.ThreadPolicy tp = StrictMode.allowThreadDiskWrites(); StrictMode.ThreadPolicy tp = StrictMode.allowThreadDiskWrites();
super.writeSeed(); super.writeSeed();
if (SDK_INT <= 18) applyOpenSslFix();
StrictMode.setThreadPolicy(tp); StrictMode.setThreadPolicy(tp);
} }
// Based on https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html
private void applyOpenSslFix() {
byte[] seed = new UnixSecureRandomSpi().engineGenerateSeed(
SEED_LENGTH);
try {
// Seed the OpenSSL PRNG
Class.forName("org.apache.harmony.xnet.provider.jsse.NativeCrypto")
.getMethod("RAND_seed", byte[].class)
.invoke(null, (Object) seed);
// Mix the output of the Linux PRNG into the OpenSSL PRNG
int bytesRead = (Integer) Class.forName(
"org.apache.harmony.xnet.provider.jsse.NativeCrypto")
.getMethod("RAND_load_file", String.class, long.class)
.invoke(null, "/dev/urandom", 1024);
if (bytesRead != 1024) throw new IOException();
} catch (Exception e) {
throw new SecurityException(e);
}
}
} }
@@ -1,12 +1,14 @@
package org.briarproject.bramble.system; package org.briarproject.bramble.system;
import android.app.Application;
import org.briarproject.bramble.api.event.EventExecutor; import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.LocationUtils;
import org.briarproject.bramble.api.system.ResourceProvider; import org.briarproject.bramble.api.system.ResourceProvider;
import org.briarproject.bramble.api.system.SecureRandomProvider; import org.briarproject.bramble.api.system.SecureRandomProvider;
import org.briarproject.onionwrapper.AndroidLocationUtilsFactory;
import org.briarproject.onionwrapper.LocationUtils;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.RejectedExecutionHandler;
@@ -46,8 +48,9 @@ public class AndroidSystemModule {
} }
@Provides @Provides
LocationUtils provideLocationUtils(AndroidLocationUtils locationUtils) { @Singleton
return locationUtils; LocationUtils provideLocationUtils(Application app) {
return AndroidLocationUtilsFactory.createAndroidLocationUtils(app);
} }
@Provides @Provides
@@ -69,11 +72,4 @@ public class AndroidSystemModule {
ResourceProvider provideResourceProvider(AndroidResourceProvider provider) { ResourceProvider provideResourceProvider(AndroidResourceProvider provider) {
return provider; return provider;
} }
@Provides
@Singleton
AndroidWakeLockManager provideWakeLockManager(
AndroidWakeLockManagerImpl wakeLockManager) {
return wakeLockManager;
}
} }
@@ -8,12 +8,13 @@ import android.content.Intent;
import android.os.Process; import android.os.Process;
import android.os.SystemClock; import android.os.SystemClock;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.Cancellable;
import org.briarproject.bramble.api.lifecycle.Service; import org.briarproject.bramble.api.lifecycle.Service;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AlarmListener; import org.briarproject.bramble.api.system.AlarmListener;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.TaskScheduler; import org.briarproject.bramble.api.system.TaskScheduler;
import org.briarproject.bramble.api.system.Wakeful; import org.briarproject.bramble.api.system.Wakeful;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -40,6 +41,7 @@ import static java.util.logging.Level.INFO;
import static java.util.logging.Logger.getLogger; import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.system.AlarmConstants.EXTRA_PID; import static org.briarproject.bramble.system.AlarmConstants.EXTRA_PID;
import static org.briarproject.bramble.system.AlarmConstants.REQUEST_ALARM; import static org.briarproject.bramble.system.AlarmConstants.REQUEST_ALARM;
import static org.briarproject.bramble.util.AndroidUtils.getImmutableFlags;
@ThreadSafe @ThreadSafe
@NotNullByDefault @NotNullByDefault
@@ -116,10 +118,12 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
long dueMillis = now + MILLISECONDS.convert(delay, unit); long dueMillis = now + MILLISECONDS.convert(delay, unit);
Runnable wakeful = () -> Runnable wakeful = () ->
wakeLockManager.executeWakefully(task, executor, "TaskHandoff"); wakeLockManager.executeWakefully(task, executor, "TaskHandoff");
Future<?> check = scheduleCheckForDueTasks(delay, unit); // Acquire the lock before scheduling the check to ensure the check
ScheduledTask s = new ScheduledTask(wakeful, dueMillis, check, // doesn't access the task queue before the task has been added
cancelled); ScheduledTask s;
synchronized (lock) { synchronized (lock) {
Future<?> check = scheduleCheckForDueTasks(delay, unit);
s = new ScheduledTask(wakeful, dueMillis, check, cancelled);
tasks.add(s); tasks.add(s);
} }
return s; return s;
@@ -136,6 +140,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
return schedule(wrapped, executor, delay, unit, cancelled); return schedule(wrapped, executor, delay, unit, cancelled);
} }
@GuardedBy("lock")
private Future<?> scheduleCheckForDueTasks(long delay, TimeUnit unit) { private Future<?> scheduleCheckForDueTasks(long delay, TimeUnit unit) {
Runnable wakeful = () -> wakeLockManager.runWakefully( Runnable wakeful = () -> wakeLockManager.runWakefully(
this::runDueTasks, "TaskScheduler"); this::runDueTasks, "TaskScheduler");
@@ -195,7 +200,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
Intent i = new Intent(app, AlarmReceiver.class); Intent i = new Intent(app, AlarmReceiver.class);
i.putExtra(EXTRA_PID, android.os.Process.myPid()); i.putExtra(EXTRA_PID, android.os.Process.myPid());
return PendingIntent.getBroadcast(app, REQUEST_ALARM, i, return PendingIntent.getBroadcast(app, REQUEST_ALARM, i,
FLAG_CANCEL_CURRENT); getImmutableFlags(FLAG_CANCEL_CURRENT));
} }
private class ScheduledTask private class ScheduledTask
@@ -206,7 +211,7 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
private final Future<?> check; private final Future<?> check;
private final AtomicBoolean cancelled; private final AtomicBoolean cancelled;
public ScheduledTask(Runnable task, long dueMillis, private ScheduledTask(Runnable task, long dueMillis,
Future<?> check, AtomicBoolean cancelled) { Future<?> check, AtomicBoolean cancelled) {
this.task = task; this.task = task;
this.dueMillis = dueMillis; this.dueMillis = dueMillis;
@@ -2,9 +2,9 @@ package org.briarproject.bramble.system;
import android.app.Application; import android.app.Application;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.system.AlarmListener; import org.briarproject.bramble.api.system.AlarmListener;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.TaskScheduler; import org.briarproject.bramble.api.system.TaskScheduler;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
@@ -1,74 +0,0 @@
package org.briarproject.bramble.system;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AndroidWakeLock;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe;
import static java.util.logging.Level.FINE;
import static java.util.logging.Logger.getLogger;
/**
* A wrapper around a {@link SharedWakeLock} that provides the more convenient
* semantics of {@link AndroidWakeLock} (i.e. calls to acquire() and release()
* don't need to be balanced).
*/
@ThreadSafe
@NotNullByDefault
class AndroidWakeLockImpl implements AndroidWakeLock {
private static final Logger LOG =
getLogger(AndroidWakeLockImpl.class.getName());
private static final AtomicInteger INSTANCE_ID = new AtomicInteger(0);
private final SharedWakeLock sharedWakeLock;
private final String tag;
private final Object lock = new Object();
@GuardedBy("lock")
private boolean held = false;
AndroidWakeLockImpl(SharedWakeLock sharedWakeLock, String tag) {
this.sharedWakeLock = sharedWakeLock;
this.tag = tag + "_" + INSTANCE_ID.getAndIncrement();
}
@Override
public void acquire() {
synchronized (lock) {
if (held) {
if (LOG.isLoggable(FINE)) {
LOG.fine(tag + " already acquired");
}
} else {
if (LOG.isLoggable(FINE)) {
LOG.fine(tag + " acquiring shared wake lock");
}
held = true;
sharedWakeLock.acquire();
}
}
}
@Override
public void release() {
synchronized (lock) {
if (held) {
if (LOG.isLoggable(FINE)) {
LOG.fine(tag + " releasing shared wake lock");
}
held = false;
sharedWakeLock.release();
} else {
if (LOG.isLoggable(FINE)) {
LOG.fine(tag + " already released");
}
}
}
}
}
@@ -1,125 +0,0 @@
package org.briarproject.bramble.system;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.PowerManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AndroidWakeLock;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import javax.inject.Inject;
import static android.content.Context.POWER_SERVICE;
import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
@NotNullByDefault
class AndroidWakeLockManagerImpl implements AndroidWakeLockManager {
/**
* How often to replace the wake lock.
*/
private static final long LOCK_DURATION_MS = MINUTES.toMillis(1);
/**
* Automatically release the lock this many milliseconds after it's due
* to have been replaced and released.
*/
private static final long SAFETY_MARGIN_MS = SECONDS.toMillis(30);
private final SharedWakeLock sharedWakeLock;
@Inject
AndroidWakeLockManagerImpl(Application app,
ScheduledExecutorService scheduledExecutorService) {
PowerManager powerManager = (PowerManager)
requireNonNull(app.getSystemService(POWER_SERVICE));
String tag = getWakeLockTag(app);
sharedWakeLock = new RenewableWakeLock(powerManager,
scheduledExecutorService, PARTIAL_WAKE_LOCK, tag,
LOCK_DURATION_MS, SAFETY_MARGIN_MS);
}
@Override
public AndroidWakeLock createWakeLock(String tag) {
return new AndroidWakeLockImpl(sharedWakeLock, tag);
}
@Override
public void runWakefully(Runnable r, String tag) {
AndroidWakeLock wakeLock = createWakeLock(tag);
wakeLock.acquire();
try {
r.run();
} finally {
wakeLock.release();
}
}
@Override
public void executeWakefully(Runnable r, Executor executor, String tag) {
AndroidWakeLock wakeLock = createWakeLock(tag);
wakeLock.acquire();
try {
executor.execute(() -> {
try {
r.run();
} finally {
// Release the wake lock if the task throws an exception
wakeLock.release();
}
});
} catch (Exception e) {
// Release the wake lock if the executor throws an exception when
// we submit the task (in which case the release() call above won't
// happen)
wakeLock.release();
throw e;
}
}
@Override
public void executeWakefully(Runnable r, String tag) {
AndroidWakeLock wakeLock = createWakeLock(tag);
wakeLock.acquire();
try {
new Thread(() -> {
try {
r.run();
} finally {
wakeLock.release();
}
}).start();
} catch (Exception e) {
wakeLock.release();
throw e;
}
}
private String getWakeLockTag(Context ctx) {
PackageManager pm = ctx.getPackageManager();
if (isInstalled(pm, "com.huawei.powergenie")) {
return "LocationManagerService";
} else if (isInstalled(pm, "com.evenwell.PowerMonitor")) {
return "AudioIn";
}
return ctx.getPackageName();
}
private boolean isInstalled(PackageManager pm, String packageName) {
try {
pm.getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
}
@@ -0,0 +1,25 @@
package org.briarproject.bramble.system;
import android.app.Application;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerFactory;
import java.util.concurrent.ScheduledExecutorService;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
public class AndroidWakeLockModule {
@Provides
@Singleton
AndroidWakeLockManager provideWakeLockManager(Application app,
ScheduledExecutorService scheduledExecutorService) {
return AndroidWakeLockManagerFactory.createAndroidWakeLockManager(app,
scheduledExecutorService);
}
}
@@ -1,7 +1,7 @@
package org.briarproject.bramble.system; package org.briarproject.bramble.system;
import org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManager;
import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.WakefulIoExecutor; import org.briarproject.bramble.api.system.WakefulIoExecutor;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -1,130 +0,0 @@
package org.briarproject.bramble.system;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.logging.Level.FINE;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
@ThreadSafe
@NotNullByDefault
class RenewableWakeLock implements SharedWakeLock {
private static final Logger LOG =
getLogger(RenewableWakeLock.class.getName());
private final PowerManager powerManager;
private final ScheduledExecutorService scheduledExecutorService;
private final int levelAndFlags;
private final String tag;
private final long durationMs, safetyMarginMs;
private final Object lock = new Object();
@GuardedBy("lock")
@Nullable
private WakeLock wakeLock;
@GuardedBy("lock")
@Nullable
private Future<?> future;
@GuardedBy("lock")
private int refCount = 0;
@GuardedBy("lock")
private long acquired = 0;
RenewableWakeLock(PowerManager powerManager,
ScheduledExecutorService scheduledExecutorService,
int levelAndFlags,
String tag,
long durationMs,
long safetyMarginMs) {
this.powerManager = powerManager;
this.scheduledExecutorService = scheduledExecutorService;
this.levelAndFlags = levelAndFlags;
this.tag = tag;
this.durationMs = durationMs;
this.safetyMarginMs = safetyMarginMs;
}
@Override
public void acquire() {
synchronized (lock) {
refCount++;
if (refCount == 1) {
if (LOG.isLoggable(INFO)) {
LOG.info("Acquiring wake lock " + tag);
}
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
// We do our own reference counting so we can replace the lock
// TODO: Check whether using a ref-counted wake lock affects
// power management apps
wakeLock.setReferenceCounted(false);
wakeLock.acquire(durationMs + safetyMarginMs);
future = scheduledExecutorService.schedule(this::renew,
durationMs, MILLISECONDS);
acquired = android.os.SystemClock.elapsedRealtime();
} else if (LOG.isLoggable(FINE)) {
LOG.fine("Wake lock " + tag + " has " + refCount + " holders");
}
}
}
private void renew() {
if (LOG.isLoggable(INFO)) LOG.info("Renewing wake lock " + tag);
synchronized (lock) {
if (wakeLock == null) {
LOG.info("Already released");
return;
}
if (LOG.isLoggable(FINE)) {
LOG.fine("Wake lock " + tag + " has " + refCount + " holders");
}
long now = android.os.SystemClock.elapsedRealtime();
long expiry = acquired + durationMs + safetyMarginMs;
if (now > expiry && LOG.isLoggable(WARNING)) {
LOG.warning("Wake lock expired " + (now - expiry) + " ms ago");
}
WakeLock oldWakeLock = wakeLock;
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
wakeLock.setReferenceCounted(false);
wakeLock.acquire(durationMs + safetyMarginMs);
oldWakeLock.release();
future = scheduledExecutorService.schedule(this::renew, durationMs,
MILLISECONDS);
acquired = now;
}
}
@Override
public void release() {
synchronized (lock) {
refCount--;
if (refCount == 0) {
if (LOG.isLoggable(INFO)) {
LOG.info("Releasing wake lock " + tag);
}
requireNonNull(future).cancel(false);
future = null;
requireNonNull(wakeLock).release();
wakeLock = null;
acquired = 0;
} else if (LOG.isLoggable(FINE)) {
LOG.fine("Wake lock " + tag + " has " + refCount + " holders");
}
}
}
}
@@ -1,22 +0,0 @@
package org.briarproject.bramble.system;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AndroidWakeLock;
@NotNullByDefault
interface SharedWakeLock {
/**
* Acquires the wake lock. This increments the wake lock's reference count,
* so unlike {@link AndroidWakeLock#acquire()} every call to this method
* must be followed by a balancing call to {@link #release()}.
*/
void acquire();
/**
* Releases the wake lock. This decrements the wake lock's reference count,
* so unlike {@link AndroidWakeLock#release()} every call to this method
* must follow a balancing call to {@link #acquire()}.
*/
void release();
}
@@ -4,25 +4,29 @@ import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.Looper;
import android.provider.Settings; import android.provider.Settings;
import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.Pair;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import java.io.File; import java.io.File;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import static android.Manifest.permission.BLUETOOTH_CONNECT;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.content.Context.MODE_PRIVATE; import static android.content.Context.MODE_PRIVATE;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION.SDK_INT;
import static android.os.Process.myPid;
import static android.os.Process.myUid;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.nullsafety.NullSafety.requireNonNull;
@NotNullByDefault @NotNullByDefault
public class AndroidUtils { public class AndroidUtils {
@@ -34,14 +38,12 @@ public class AndroidUtils {
private static final String STORED_LOGCAT = "dev-logcat"; private static final String STORED_LOGCAT = "dev-logcat";
public static Collection<String> getSupportedArchitectures() { public static Collection<String> getSupportedArchitectures() {
List<String> abis = new ArrayList<>(); return asList(Build.SUPPORTED_ABIS);
if (SDK_INT >= 21) {
abis.addAll(asList(Build.SUPPORTED_ABIS));
} else {
abis.add(Build.CPU_ABI);
if (Build.CPU_ABI2 != null) abis.add(Build.CPU_ABI2);
} }
return abis;
public static boolean hasBtConnectPermission(Context ctx) {
return SDK_INT < 31 || ctx.checkPermission(BLUETOOTH_CONNECT, myPid(),
myUid()) == PERMISSION_GRANTED;
} }
public static String getBluetoothAddress(Context ctx, public static String getBluetoothAddress(Context ctx,
@@ -51,6 +53,9 @@ public class AndroidUtils {
public static Pair<String, String> getBluetoothAddressAndMethod(Context ctx, public static Pair<String, String> getBluetoothAddressAndMethod(Context ctx,
BluetoothAdapter adapter) { BluetoothAdapter adapter) {
// If we don't have permission to access the adapter's address, let
// the caller know we can't find it
if (!hasBtConnectPermission(ctx)) return new Pair<>("", "");
// Return the adapter's address if it's valid and not fake // Return the adapter's address if it's valid and not fake
@SuppressLint("HardwareIds") @SuppressLint("HardwareIds")
String address = adapter.getAddress(); String address = adapter.getAddress();
@@ -58,11 +63,13 @@ public class AndroidUtils {
return new Pair<>(address, "adapter"); return new Pair<>(address, "adapter");
} }
// Return the address from settings if it's valid and not fake // Return the address from settings if it's valid and not fake
if (SDK_INT < 33) {
address = Settings.Secure.getString(ctx.getContentResolver(), address = Settings.Secure.getString(ctx.getContentResolver(),
"bluetooth_address"); "bluetooth_address");
if (isValidBluetoothAddress(address)) { if (isValidBluetoothAddress(address)) {
return new Pair<>(address, "settings"); return new Pair<>(address, "settings");
} }
}
// Try to get the address via reflection // Try to get the address via reflection
address = getBluetoothAddressByReflection(adapter); address = getBluetoothAddressByReflection(adapter);
if (isValidBluetoothAddress(address)) { if (isValidBluetoothAddress(address)) {
@@ -118,4 +125,15 @@ public class AndroidUtils {
public static String[] getSupportedImageContentTypes() { public static String[] getSupportedImageContentTypes() {
return new String[] {"image/jpeg", "image/png", "image/gif"}; return new String[] {"image/jpeg", "image/png", "image/gif"};
} }
public static boolean isUiThread() {
return Looper.myLooper() == Looper.getMainLooper();
}
public static int getImmutableFlags(int flags) {
if (SDK_INT >= 23) {
return FLAG_IMMUTABLE | flags;
}
return flags;
}
} }
@@ -9,7 +9,7 @@ import org.briarproject.bramble.api.db.DatabaseConfig;
import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.BrambleMockTestCase;
import org.jmock.Expectations; import org.jmock.Expectations;
import org.jmock.lib.legacy.ClassImposteriser; import org.jmock.imposters.ByteBuddyClassImposteriser;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -44,7 +44,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
private AndroidAccountManager accountManager; private AndroidAccountManager accountManager;
public AndroidAccountManagerTest() { public AndroidAccountManagerTest() {
context.setImposteriser(ClassImposteriser.INSTANCE); context.setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
app = context.mock(Application.class); app = context.mock(Application.class);
applicationInfo = new ApplicationInfo(); applicationInfo = new ApplicationInfo();
applicationInfo.dataDir = testDir.getAbsolutePath(); applicationInfo.dataDir = testDir.getAbsolutePath();
@@ -87,6 +87,10 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
File potatoFile = new File(potatoDir, "file"); File potatoFile = new File(potatoDir, "file");
File filesDir = new File(testDir, "filesDir"); File filesDir = new File(testDir, "filesDir");
File externalCacheDir = new File(testDir, "externalCacheDir"); File externalCacheDir = new File(testDir, "externalCacheDir");
File externalCacheDir1 = new File(testDir, "externalCacheDir1");
File externalCacheDir2 = new File(testDir, "externalCacheDir2");
File externalMediaDir1 = new File(testDir, "externalMediaDir1");
File externalMediaDir2 = new File(testDir, "externalMediaDir2");
context.checking(new Expectations() {{ context.checking(new Expectations() {{
oneOf(prefs).edit(); oneOf(prefs).edit();
@@ -109,6 +113,12 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
will(returnValue(cacheDir)); will(returnValue(cacheDir));
oneOf(app).getExternalCacheDir(); oneOf(app).getExternalCacheDir();
will(returnValue(externalCacheDir)); will(returnValue(externalCacheDir));
oneOf(app).getExternalCacheDirs();
will(returnValue(
new File[] {externalCacheDir1, externalCacheDir2}));
oneOf(app).getExternalMediaDirs();
will(returnValue(
new File[] {externalMediaDir1, externalMediaDir2}));
}}); }});
assertTrue(dbDir.mkdirs()); assertTrue(dbDir.mkdirs());
@@ -125,6 +135,10 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
assertTrue(potatoFile.createNewFile()); assertTrue(potatoFile.createNewFile());
assertTrue(filesDir.mkdirs()); assertTrue(filesDir.mkdirs());
assertTrue(externalCacheDir.mkdirs()); assertTrue(externalCacheDir.mkdirs());
assertTrue(externalCacheDir1.mkdirs());
assertTrue(externalCacheDir2.mkdirs());
assertTrue(externalMediaDir1.mkdirs());
assertTrue(externalMediaDir2.mkdirs());
accountManager.deleteAccount(); accountManager.deleteAccount();
@@ -142,6 +156,10 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
assertFalse(potatoFile.exists()); assertFalse(potatoFile.exists());
assertFalse(filesDir.exists()); assertFalse(filesDir.exists());
assertFalse(externalCacheDir.exists()); assertFalse(externalCacheDir.exists());
assertFalse(externalCacheDir1.exists());
assertFalse(externalCacheDir2.exists());
assertFalse(externalMediaDir1.exists());
assertFalse(externalMediaDir2.exists());
} }
@After @After
+53 -96
View File
@@ -1,110 +1,67 @@
dependencyVerification { dependencyVerification {
verify = [ verify = [
'cglib:cglib:3.2.0:cglib-3.2.0.jar:adb13bab79712ad6bdf1bd59f2a3918018a8016e722e8a357065afb9e6690861', 'androidx.annotation:annotation:1.5.0:annotation-1.5.0.jar:261fb7c0210858500bab66d34354972a75166ab4182add283780b05513d6ec4a',
'com.android.tools.analytics-library:protos:27.1.1:protos-27.1.1.jar:13f77e73762e58ab372d140b3a6be6903aea9775b62dd14fbc62d4cc7069c9a4', 'cglib:cglib:3.2.8:cglib-3.2.8.jar:3f64de999ecc5595dc84ca8ff0879d8a34c8623f9ef3c517a53ed59023fcb9db',
'com.android.tools.analytics-library:shared:27.1.1:shared-27.1.1.jar:82930a52001410e97d809930b670f4de3002286975f046b9de5f6b777b06d366', 'com.google.code.findbugs:annotations:3.0.1:annotations-3.0.1.jar:6b47ff0a6de0ce17cbedc3abb0828ca5bce3009d53ea47b3723ff023c4742f79',
'com.android.tools.analytics-library:tracker:27.1.1:tracker-27.1.1.jar:31bc5a00be0055bac89c9b2f34751883e987cd89e3ac1783720645c164f591d9',
'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.1:apksig-4.1.1.jar:e0a69da9e5a03986d608b45bbf954ef0e6a0b3f58c1b8315bd169ec08b279e72',
'com.android.tools.build:apkzlib:4.1.1:apkzlib-4.1.1.jar:ba4b5e419b6be0130eae7f8301c3a551ad3976f487d2e0c6852ebb175ac41127',
'com.android.tools.build:builder-model:4.1.1:builder-model-4.1.1.jar:e95c99cc298ad67b8deb6ced99c51abc8f59afebedad044b1a10dde14646a4dd',
'com.android.tools.build:builder-test-api:4.1.1:builder-test-api-4.1.1.jar:464f596ab261c051c3847406748e843770dea123f6fa5fee8a9390644e709b7a',
'com.android.tools.build:builder:4.1.1:builder-4.1.1.jar:0f78d4759d2f7b57b95865522ec34596ba419b9982f3b25e3449213f9c98b80d',
'com.android.tools.build:gradle-api:4.1.1:gradle-api-4.1.1.jar:d42e6b539e4c1353ad3546e75ec8ce11a017b97481023e8ea18577eefe374358',
'com.android.tools.build:manifest-merger:27.1.1:manifest-merger-27.1.1.jar:7a45fa143687859bb2e5a961dcf6ee88094d3853de0cb543dc03dbcb0f4b554b',
'com.android.tools.ddms:ddmlib:27.1.1:ddmlib-27.1.1.jar:da6e4bd834b6a85dae8019039849d8bd96933347dfbf460df74913ddade6e40a',
'com.android.tools.external.com-intellij:intellij-core:27.1.1:intellij-core-27.1.1.jar:2591a7363c4443c59bf9f793730acafce9d6ec3076e2f46716edaf53a41b6fb6',
'com.android.tools.external.com-intellij:kotlin-compiler:27.1.1:kotlin-compiler-27.1.1.jar:5054ae770ba788f110303c65abd6b1fa28eccf52dee1274510e201b2b81885c8',
'com.android.tools.external.org-jetbrains:uast:27.1.1:uast-27.1.1.jar:54cd8f6886a9d2f5641659dd5c91f626629672cd48301f7f0bd6aad9bd448714',
'com.android.tools.layoutlib:layoutlib-api:27.1.1:layoutlib-api-27.1.1.jar:8a9a22e3b309521ea83b724e5a89cfdac6076f52d675c0e17d77b05527bc0f8c',
'com.android.tools.lint:lint-api:27.1.1:lint-api-27.1.1.jar:c1d8176094cb0478786070d40533efb578ebc53529a82f6ef5bee879bdca418b',
'com.android.tools.lint:lint-checks:27.1.1:lint-checks-27.1.1.jar:3899c91e00bd059b40c31a9ca00cd0f8303191947608735ae1b657323693fb61',
'com.android.tools.lint:lint-gradle-api:27.1.1:lint-gradle-api-27.1.1.jar:26aa89d38b9825cc73229daa82a68875801c8b8491f30497ce62aff1f206eb0d',
'com.android.tools.lint:lint-gradle:27.1.1:lint-gradle-27.1.1.jar:f7355823ead869f4d28184ba28b7a0c693b507519a2d3705bb9848a0f35b3756',
'com.android.tools.lint:lint-model:27.1.1:lint-model-27.1.1.jar:bc23c0c413bdfca59dac2cd56b870d8360d009e9ec0d365e71f774bcf127971d',
'com.android.tools.lint:lint:27.1.1:lint-27.1.1.jar:2f6038a5398a42bd591883c3f5e5894f4ec52ca1c3683bf94fa8553c1700af81',
'com.android.tools:annotations:27.1.1:annotations-27.1.1.jar:ff28c504d2acb9fd1a5ffbd97ae85cf59ee18c76927525aad250509bccf2cab1',
'com.android.tools:common:27.1.1:common-27.1.1.jar:63d9a2a9ad6d278db319f3749b9f50bdf5457ef7020074a1bebe124e714b535c',
'com.android.tools:dvlib:27.1.1:dvlib-27.1.1.jar:998a54201fc1cefee5f2399215e95c42b1f64f9e1d8f4452eb8255c68ba5440f',
'com.android.tools:repository:27.1.1:repository-27.1.1.jar:d25b74ccabf4d876903efb375e9af6fb380d8ae0445bb74bbdcc225c1e37fa1d',
'com.android.tools:sdk-common:27.1.1:sdk-common-27.1.1.jar:4473ae97d0ef7061ee1de61041d5aa97405ae08e44c09cf7bb278b42e4b97c7c',
'com.android.tools:sdklib:27.1.1:sdklib-27.1.1.jar:08e6b83961ac9724b3c1e3d0eff971f13be6701292c77914b8794480f3391250',
'com.android:signflinger:4.1.1:signflinger-4.1.1.jar:0c66825988873ec2d51057fa463f54a8f18fc7326ff4530b9da363b71e97ce60',
'com.android:zipflinger:4.1.1:zipflinger-4.1.1.jar:0a8c3e52ac13dd031236f9fb5ba4408b1d5dcd12325a05440b36da09d8881446',
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7', '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.dagger:dagger-compiler:2.45:dagger-compiler-2.45.jar:5617dfb994537dba5b41f3744a6dd13ec3cd99789c065e0d5c6fa9f21cf7ca25',
'com.google.dagger:dagger-compiler:2.24:dagger-compiler-2.24.jar:3c5afb955fb188da485cb2c048eff37dce0e1530b9780a0f2f7187d16d1ccc1f', 'com.google.dagger:dagger-producers:2.45:dagger-producers-2.45.jar:a05abb4c3ccf6bb0f056bdcb5ef973898ecf172952ab5948a824aeea6c86ecaa',
'com.google.dagger:dagger-producers:2.24:dagger-producers-2.24.jar:f10f45b95191954d5d6b043fca9e62fb621d21bf70634b8f8476c7988b504c3a', 'com.google.dagger:dagger-spi:2.45:dagger-spi-2.45.jar:7cd6f0b09d88e64a9c97bc80e544ab8ac8fdee9301754413585a74cf64222b27',
'com.google.dagger:dagger-spi:2.24:dagger-spi-2.24.jar:c038445d14dbcb4054e61bf49e05009edf26fce4fdc7ec1a9db544784f68e718', 'com.google.dagger:dagger:2.45:dagger-2.45.jar:f011cae7d2c0fb7ea17c34e05bc10e768b1081a5892ad019cf1fdb0e125c49c1',
'com.google.dagger:dagger:2.24:dagger-2.24.jar:550a6e46a6dfcdf1d764887b6090cea94f783327e50e5c73754f18facfc70b64', 'com.google.devtools.ksp:symbol-processing-api:1.7.0-1.0.6:symbol-processing-api-1.7.0-1.0.6.jar:adc29417be5ca9ff42118105fea4e36d9ef44987abfc41432309371a60198941',
'com.google.errorprone:error_prone_annotations:2.2.0:error_prone_annotations-2.2.0.jar:6ebd22ca1b9d8ec06d41de8d64e0596981d9607b42035f9ed374f9de271a481a', 'com.google.errorprone:error_prone_annotations:2.7.1:error_prone_annotations-2.7.1.jar:cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3',
'com.google.errorprone:error_prone_annotations:2.3.2:error_prone_annotations-2.3.2.jar:357cd6cfb067c969226c442451502aee13800a24e950fdfde77bcdb4565a668d',
'com.google.errorprone:javac-shaded:9-dev-r4023-3:javac-shaded-9-dev-r4023-3.jar:65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30', '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.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: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:31.0.1-jre:guava-31.0.1-jre.jar:d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9',
'com.google.guava:guava:28.1-jre:guava-28.1-jre.jar:30beb8b8527bd07c6e747e77f1a92122c2f29d57ce347461a4a55eb26e382da4',
'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.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', 'com.google.j2objc:j2objc-annotations:1.3:j2objc-annotations-1.3.jar:21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b',
'com.google.jimfs:jimfs:1.1:jimfs-1.1.jar:c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd', 'com.squareup:javapoet:1.13.0:javapoet-1.13.0.jar:4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291',
'com.google.protobuf:protobuf-java:3.10.0:protobuf-java-3.10.0.jar:161d7d61a8cb3970891c299578702fd079646e032329d6c2cabf998d191437c9', 'com.squareup:kotlinpoet:1.11.0:kotlinpoet-1.11.0.jar:2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492',
'com.googlecode.json-simple:json-simple:1.1:json-simple-1.1.jar:2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439',
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
'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',
'commons-codec:commons-codec:1.10:commons-codec-1.10.jar:4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569',
'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',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f', 'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff', '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', 'junit:junit:4.13.2:junit-4.13.2.jar:8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3',
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a', 'net.bytebuddy:byte-buddy:1.9.12:byte-buddy-1.9.12.jar:3688c3d434bebc3edc5516296a2ed0f47b65e451071b4afecad84f902f0efc11',
'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.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', 'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2', 'org.briarproject:dont-kill-me-lib:0.2.7:dont-kill-me-lib-0.2.7.aar:8a9540941fd927e1c127096a7a9b4aa61ce2f2965d2e24f849be92f9e57213c4',
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d', 'org.briarproject:jtorctl:0.5:jtorctl-0.5.jar:43f8c7d390169772b9a2c82ab806c8414c136a2a8636c555e22754bb7260793b',
'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8', 'org.briarproject:null-safety:0.1:null-safety-0.1.jar:161760de5e838cb982bafa973df820675d4397098e9a91637a36a306d43ba011',
'org.apache.commons:commons-compress:1.12:commons-compress-1.12.jar:2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6', 'org.briarproject:obfs4proxy-android:0.0.14-tor2:obfs4proxy-android-0.0.14-tor2.jar:a0a93770d6760ce57d9dbd31cc7177687374e00c3361dac22ab75e3b6e0f289e',
'org.apache.httpcomponents:httpclient:4.5.6:httpclient-4.5.6.jar:c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7', 'org.briarproject:onionwrapper-android:0.0.5:onionwrapper-android-0.0.5.aar:d761854dac454616b3e0ca099b2cd17060365ce4316afe495cc7ae86b6c81d15',
'org.apache.httpcomponents:httpcore:4.4.10:httpcore-4.4.10.jar:78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd', 'org.briarproject:onionwrapper-core:0.0.5:onionwrapper-core-0.0.5.jar:9071678323535cb3dfe0f3add96066037db43ea024333eba0117c759bcbd8d63',
'org.apache.httpcomponents:httpmime:4.5.6:httpmime-4.5.6.jar:0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e', 'org.briarproject:snowflake-android:2.5.1:snowflake-android-2.5.1.jar:88ec81c17b1b6fa884d06839dec0330e328b45c89f88c970a213ce91ca8eac87',
'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8', 'org.briarproject:tor-android:0.4.7.14:tor-android-0.4.7.14.jar:d39faa3a8abb116136c191c6ebadf8ea0e1f3e4785076d2c66a7b3b0f26988a2',
'org.bouncycastle:bcpkix-jdk15on:1.56:bcpkix-jdk15on-1.56.jar:7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca', 'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
'org.bouncycastle:bcprov-jdk15on:1.56:bcprov-jdk15on-1.56.jar:963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349', 'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
'org.briarproject:obfs4proxy-android:0.0.12-dev-40245c4a:obfs4proxy-android-0.0.12-dev-40245c4a.zip:8ab05a8f8391be2cb5ab2b665c281a06d9e3a756bd0f95a40a36ca927866ea82', 'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
'org.briarproject:tor-android:0.3.5.13:tor-android-0.3.5.13.zip:e0978db136731dae07774b722970cdae1e462fb5adc82845dd80a7e2d87f356c', 'org.hamcrest:hamcrest-library:2.1:hamcrest-library-2.1.jar:b7e2b6895b3b679f0e47b6380fda391b225e9b78505db9d8bdde8d3cc8d52a21',
'org.checkerframework:checker-compat-qual:2.5.3:checker-compat-qual-2.5.3.jar:d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d', 'org.hamcrest:hamcrest:2.1:hamcrest-2.1.jar:ba93b2e3a562322ba432f0a1b53addcc55cb188253319a020ed77f824e692050',
'org.checkerframework:checker-qual:2.5.2:checker-qual-2.5.2.jar:64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a', 'org.jacoco:org.jacoco.agent:0.8.7:org.jacoco.agent-0.8.7.jar:9cbcc986e0fbe821a78ff1f8f7d5216f200e5eb124e7f6837d1dc4a77b28b143',
'org.checkerframework:checker-qual:2.8.1:checker-qual-2.8.1.jar:9103499008bcecd4e948da29b17864abb64304e15706444ae209d17ebe0575df', 'org.jacoco:org.jacoco.ant:0.8.7:org.jacoco.ant-0.8.7.jar:97ca96a382c3f23a44d8eb4c4e6c3742a30cb8005774a76ced0fc4806ce49605',
'org.codehaus.groovy:groovy-all:2.4.15:groovy-all-2.4.15.jar:51d6c4e71782e85674239189499854359d380fb75e1a703756e3aaa5b98a5af0', 'org.jacoco:org.jacoco.core:0.8.7:org.jacoco.core-0.8.7.jar:ad7739b5fb5969aa1a8aead3d74ed54dc82ed012f1f10f336bd1b96e71c1a13c',
'org.codehaus.mojo:animal-sniffer-annotations:1.17:animal-sniffer-annotations-1.17.jar:92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53', 'org.jacoco:org.jacoco.report:0.8.7:org.jacoco.report-0.8.7.jar:cc89258623700a6c932592153cb528785876b6da183d5431f97efbba6f020e5b',
'org.codehaus.mojo:animal-sniffer-annotations:1.18:animal-sniffer-annotations-1.18.jar:47f05852b48ee9baefef80fa3d8cea60efa4753c0013121dd7fe5eef2e5c729d', 'org.jetbrains.kotlin:kotlin-reflect:1.6.10:kotlin-reflect-1.6.10.jar:3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203',
'org.glassfish.jaxb:jaxb-runtime:2.3.1:jaxb-runtime-2.3.1.jar:45fecfa5c8217ce1f3652ab95179790ec8cc0dec0384bca51cbeb94a293d9f2f', 'org.jetbrains.kotlin:kotlin-stdlib-common:1.7.0:kotlin-stdlib-common-1.7.0.jar:59c6ff64fe9a6604afce03e8aaa75f83586c6030ac71fb0b34ee7cdefed3618f',
'org.glassfish.jaxb:txw2:2.3.1:txw2-2.3.1.jar:34975dde1c6920f1a39791142235689bc3cd357e24d05edd8ff93b885bd68d60', 'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0:kotlin-stdlib-common-1.8.0.jar:78ef93b59e603cc0fe51def9bd4c037b07cbace3b3b7806d1a490a42bc1f4cb2',
'org.hamcrest:hamcrest-core:1.3:hamcrest-core-1.3.jar:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9', 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0:kotlin-stdlib-jdk7-1.7.0.jar:07e91be9b2ca20672d2bdb7e181b766e73453a2da13492b5ddaee8fa47aea239',
'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c', 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0:kotlin-stdlib-jdk7-1.8.0.jar:4c889d1d9803f5f2eb6c1592a6b7e62369ac7660c9eee15aba16fec059163666',
'org.jetbrains.kotlin:kotlin-reflect:1.3.72:kotlin-reflect-1.3.72.jar:a188d9367de1c4ee9479db630985c0597b20709c83161b1430d24edb27e38c40', 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.0:kotlin-stdlib-jdk8-1.7.0.jar:cf058e11db1dfc9944680c8c61b95ac689aaaa8a3eb30bced028100f038f030b',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72:kotlin-stdlib-common-1.3.72.jar:5e7d1552863e480c1628b1cc39ce230ef829f5b7230106215a05acda5172203a', 'org.jetbrains.kotlin:kotlin-stdlib:1.7.0:kotlin-stdlib-1.7.0.jar:aa88e9625577957f3249a46cb6e166ee09b369e600f7a11d148d16b0a6d87f05',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72:kotlin-stdlib-jdk7-1.3.72.jar:40566c0c08d414b9413ba556ff7f8a0b04b98b9f0f424d122dd2088510efccc4', 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0:kotlin-stdlib-1.8.0.jar:c77bef8774640b9fb9d6e217459ff220dae59878beb7d2e4b430506feffc654e',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72:kotlin-stdlib-jdk8-1.3.72.jar:133da70cfc07b56094282eac5c59bccd59f167ee2ead22e5282876d8bc10bf95', 'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0:kotlinx-metadata-jvm-0.5.0.jar:ca063a96639b08b9eaa0de4d65e899480740a6efbe28ab9a8681a2ced03055a4',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.72:kotlin-stdlib-1.3.72.jar:3856a7349ebacd6d1be6802b2fed9c4dc2c5a564ea92b6b945ac988243d4b16b',
'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478', 'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c', 'org.jmock:jmock-imposters:2.12.0:jmock-imposters-2.12.0.jar:3b836269745a137c9b2347e8d7c2104845b126ef04f012d6bfd94f1a7dea7b09',
'org.jmock:jmock-legacy:2.8.2:jmock-legacy-2.8.2.jar:f2b985a5c08a9edb7f37612330c058809da3f6a6d63ce792426ebf8ff0d6d31b', 'org.jmock:jmock-junit4:2.12.0:jmock-junit4-2.12.0.jar:3233062fc889637c151a24f1ee086bad04321ab7d8264fef279daff0fa27205b',
'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760', 'org.jmock:jmock-legacy:2.12.0:jmock-legacy-2.12.0.jar:dea3a9cca653d082e2fe7e40232e982fe03a9984c7d67ceff24f3e03fe580dcd',
'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16', 'org.jmock:jmock-testjar:2.12.0:jmock-testjar-2.12.0.jar:efefbcf6cd294d0e29f0c46eb2a3380d4ca4e1763ff719c69e2f2ac62f564a04',
'org.jvnet.staxex:stax-ex:1.8:stax-ex-1.8.jar:95b05d9590af4154c6513b9c5dc1fb2e55b539972ba0a9ef28e9a0c01d83ad77', 'org.jmock:jmock:2.12.0:jmock-2.12.0.jar:266d07314c0cd343c46ff8a55601272de8cf406807caf55e6f313295f83d10be',
'org.objenesis:objenesis:2.1:objenesis-2.1.jar:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80', 'org.objenesis:objenesis:3.0.1:objenesis-3.0.1.jar:7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984',
'org.ow2.asm:asm-analysis:7.0:asm-analysis-7.0.jar:e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474', 'org.ow2.asm:asm-analysis:9.1:asm-analysis-9.1.jar:81a88041b1b8beda5a8a99646098046c48709538270c49def68abff25ac3be34',
'org.ow2.asm:asm-commons:7.0:asm-commons-7.0.jar:fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d', 'org.ow2.asm:asm-commons:9.1:asm-commons-9.1.jar:afcb26dc1fc12c0c4a99ada670908dd82e18dfc488caf5ee92546996b470c00c',
'org.ow2.asm:asm-tree:7.0:asm-tree-7.0.jar:cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c', 'org.ow2.asm:asm-tree:9.1:asm-tree-9.1.jar:fd00afa49e9595d7646205b09cecb4a776a8ff0ba06f2d59b8f7bf9c704b4a73',
'org.ow2.asm:asm-util:7.0:asm-util-7.0.jar:75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145', 'org.ow2.asm:asm:7.1:asm-7.1.jar:4ab2fa2b6d2cc9ccb1eaa05ea329c407b47b13ed2915f62f8c4b8cc96258d4de',
'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220', 'org.ow2.asm:asm:9.1:asm-9.1.jar:cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2',
'org.ow2.asm:asm:7.0:asm-7.0.jar:b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf',
] ]
} }
+10 -7
View File
@@ -7,13 +7,16 @@ apply plugin: 'witness'
apply from: 'witness.gradle' apply from: 'witness.gradle'
dependencies { dependencies {
implementation "com.google.dagger:dagger:2.24" api 'org.briarproject:null-safety:0.1'
implementation 'com.google.code.findbugs:jsr305:3.0.2' api 'com.google.code.findbugs:jsr305:3.0.2'
api 'javax.inject:javax.inject:1'
api "com.google.dagger:dagger:$dagger_version"
testImplementation 'junit:junit:4.12' implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version"
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2" testImplementation "junit:junit:$junit_version"
testImplementation "org.jmock:jmock-legacy:2.8.2" testImplementation "org.jmock:jmock:$jmock_version"
testImplementation "org.jmock:jmock-junit4:$jmock_version"
signature 'org.codehaus.mojo.signature:java16:1.1@signature' signature 'org.codehaus.mojo.signature:java16:1.1@signature'
} }
@@ -23,7 +26,7 @@ configurations {
testOutput.extendsFrom(testCompile) testOutput.extendsFrom(testCompile)
} }
task jarTest(type: Jar, dependsOn: testClasses) { task jarTest(type: Jar, dependsOn: testClasses) {
from sourceSets.test.output from sourceSets.test.output, sourceSets.main.output
classifier = 'test' classifier = 'test'
} }
artifacts { artifacts {
@@ -1,7 +1,7 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.util.StringUtils; import org.briarproject.bramble.util.StringUtils;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.Arrays; import java.util.Arrays;
@@ -0,0 +1,6 @@
package org.briarproject.bramble.api;
public interface Cancellable {
void cancel();
}
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface Consumer<T> { public interface Consumer<T> {
@@ -11,5 +11,9 @@ public interface FeatureFlags {
boolean shouldEnableDisappearingMessages(); boolean shouldEnableDisappearingMessages();
boolean shouldEnableConnectViaBluetooth(); boolean shouldEnablePrivateGroupsInCore();
boolean shouldEnableForumsInCore();
boolean shouldEnableBlogsInCore();
} }
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface Nameable { public interface Nameable {
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface Predicate<T> { public interface Predicate<T> {
@@ -1,8 +1,14 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.util.StringUtils;
import java.util.ArrayList;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
public abstract class StringMap extends Hashtable<String, String> { public abstract class StringMap extends Hashtable<String, String> {
protected StringMap(Map<String, String> m) { 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) { public void putLong(String key, long value) {
put(key, String.valueOf(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, ","));
}
} }
@@ -1,19 +1,19 @@
package org.briarproject.bramble.api; package org.briarproject.bramble.api;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.ThreadSafe; import javax.annotation.concurrent.ThreadSafe;
@ThreadSafe @ThreadSafe
@NotNullByDefault @NotNullByDefault
public abstract class UniqueId extends Bytes { public class UniqueId extends Bytes {
/** /**
* The length of a unique identifier in bytes. * The length of a unique identifier in bytes.
*/ */
public static final int LENGTH = 32; public static final int LENGTH = 32;
protected UniqueId(byte[] id) { public UniqueId(byte[] id) {
super(id); super(id);
if (id.length != LENGTH) throw new IllegalArgumentException(); if (id.length != LENGTH) throw new IllegalArgumentException();
} }
@@ -0,0 +1,35 @@
package org.briarproject.bramble.api;
import org.briarproject.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();
}
@@ -3,7 +3,7 @@ package org.briarproject.bramble.api.account;
import org.briarproject.bramble.api.crypto.DecryptionException; import org.briarproject.bramble.api.crypto.DecryptionException;
import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -3,9 +3,9 @@ package org.briarproject.bramble.api.cleanup;
import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.Collection; import java.util.Collection;
@@ -5,9 +5,9 @@ import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.bramble.api.sync.ClientId;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.nullsafety.NotNullByDefault;
/** /**
* The CleanupManager is responsible for tracking the cleanup deadlines of * The CleanupManager is responsible for tracking the cleanup deadlines of
@@ -1,8 +1,8 @@
package org.briarproject.bramble.api.cleanup.event; package org.briarproject.bramble.api.cleanup.event;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -8,10 +8,10 @@ import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Metadata; import org.briarproject.bramble.api.db.Metadata;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.InvalidMessageException; import org.briarproject.bramble.api.sync.InvalidMessageException;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.validation.IncomingMessageHook; import org.briarproject.bramble.api.sync.validation.IncomingMessageHook;
import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -32,28 +32,31 @@ public abstract class BdfIncomingMessageHook implements IncomingMessageHook {
/** /**
* Called once for each incoming message that passes validation. * Called once for each incoming message that passes validation.
* <p>
* If an unexpected exception occurs while handling data that is assumed
* to be valid (e.g. locally created metadata), it may be sensible to
* rethrow the unexpected exception as a DbException so that delivery is
* attempted again at next startup. This will allow delivery to succeed if
* the unexpected exception was caused by a bug that has subsequently been
* fixed.
* *
* @param txn A read-write transaction * @param txn A read-write transaction
* @return Whether or not this message should be shared * @throws DbException if a database error occurs while delivering the
* @throws DbException Should only be used for real database errors. * message. Delivery will be attempted again at next startup. Throwing
* If this is thrown, delivery will be attempted again at next startup, * this exception has the same effect as returning
* whereas if a FormatException is thrown, the message will be permanently * {@link DeliveryAction#DEFER}.
* invalidated. * @throws FormatException if the message is invalid in the context of its
* @throws FormatException Use this for any non-database error * dependencies. The message and any dependents will be marked as invalid
* that occurs while handling remotely created data. * and deleted along with their metadata. Throwing this exception has the
* This includes errors that occur while handling locally created data * same effect as returning {@link DeliveryAction#REJECT}.
* in a context controlled by remotely created data
* (for example, parsing the metadata of a dependency
* of an incoming message).
* Never rethrow DbException as FormatException!
*/ */
protected abstract boolean incomingMessage(Transaction txn, Message m, protected abstract DeliveryAction incomingMessage(Transaction txn,
BdfList body, BdfDictionary meta) throws DbException, Message m, BdfList body, BdfDictionary meta)
FormatException; throws DbException, FormatException;
@Override @Override
public boolean incomingMessage(Transaction txn, Message m, Metadata meta) public DeliveryAction incomingMessage(Transaction txn, Message m,
throws DbException, InvalidMessageException { Metadata meta) throws DbException, InvalidMessageException {
try { try {
BdfList body = clientHelper.toList(m); BdfList body = clientHelper.toList(m);
BdfDictionary metaDictionary = metadataParser.parse(meta); BdfDictionary metaDictionary = metadataParser.parse(meta);
@@ -1,8 +1,8 @@
package org.briarproject.bramble.api.client; package org.briarproject.bramble.api.client;
import org.briarproject.bramble.api.data.BdfDictionary; import org.briarproject.bramble.api.data.BdfDictionary;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -4,18 +4,19 @@ import org.briarproject.bramble.api.FormatException;
import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.data.MetadataEncoder; import org.briarproject.bramble.api.data.MetadataEncoder;
import org.briarproject.bramble.api.db.Metadata; import org.briarproject.bramble.api.db.Metadata;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group;
import org.briarproject.bramble.api.sync.InvalidMessageException; import org.briarproject.bramble.api.sync.InvalidMessageException;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageContext; import org.briarproject.bramble.api.sync.MessageContext;
import org.briarproject.bramble.api.sync.validation.MessageValidator; import org.briarproject.bramble.api.sync.validation.MessageValidator;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOCK_DIFFERENCE;
@Immutable @Immutable
@@ -23,17 +24,30 @@ import static org.briarproject.bramble.api.transport.TransportConstants.MAX_CLOC
public abstract class BdfMessageValidator implements MessageValidator { public abstract class BdfMessageValidator implements MessageValidator {
protected static final Logger LOG = protected static final Logger LOG =
Logger.getLogger(BdfMessageValidator.class.getName()); getLogger(BdfMessageValidator.class.getName());
protected final ClientHelper clientHelper; protected final ClientHelper clientHelper;
protected final MetadataEncoder metadataEncoder; protected final MetadataEncoder metadataEncoder;
protected final Clock clock; protected final Clock clock;
protected final boolean canonical;
/**
* Transitional alternative to
* {@link #BdfMessageValidator(ClientHelper, MetadataEncoder, Clock)} that
* accepts messages in non-canonical form, for backward compatibility.
*/
@Deprecated
protected BdfMessageValidator(ClientHelper clientHelper, protected BdfMessageValidator(ClientHelper clientHelper,
MetadataEncoder metadataEncoder, Clock clock) { MetadataEncoder metadataEncoder, Clock clock, boolean canonical) {
this.clientHelper = clientHelper; this.clientHelper = clientHelper;
this.metadataEncoder = metadataEncoder; this.metadataEncoder = metadataEncoder;
this.clock = clock; this.clock = clock;
this.canonical = canonical;
}
protected BdfMessageValidator(ClientHelper clientHelper,
MetadataEncoder metadataEncoder, Clock clock) {
this(clientHelper, metadataEncoder, clock, true);
} }
protected abstract BdfMessageContext validateMessage(Message m, Group g, protected abstract BdfMessageContext validateMessage(Message m, Group g,
@@ -49,7 +63,7 @@ public abstract class BdfMessageValidator implements MessageValidator {
"Timestamp is too far in the future"); "Timestamp is too far in the future");
} }
try { try {
BdfList bodyList = clientHelper.toList(m.getBody()); BdfList bodyList = clientHelper.toList(m, canonical);
BdfMessageContext result = validateMessage(m, g, bodyList); BdfMessageContext result = validateMessage(m, g, bodyList);
Metadata meta = metadataEncoder.encode(result.getDictionary()); Metadata meta = metadataEncoder.encode(result.getDictionary());
return new MessageContext(meta, result.getDependencies()); return new MessageContext(meta, result.getDependencies());
@@ -9,15 +9,18 @@ import org.briarproject.bramble.api.data.BdfList;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.mailbox.MailboxUpdate;
import org.briarproject.bramble.api.mailbox.MailboxVersion;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportProperties;
import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageId;
import org.briarproject.nullsafety.NotNullByDefault;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
@NotNullByDefault @NotNullByDefault
@@ -46,6 +49,18 @@ public interface ClientHelper {
BdfList getMessageAsList(Transaction txn, MessageId m) throws DbException, BdfList getMessageAsList(Transaction txn, MessageId m) throws DbException,
FormatException; FormatException;
/**
* Transitional alternative to
* {@link #getMessageAsList(Transaction, MessageId)} that allows the
* message to be in non-canonical form, for backward compatibility.
*
* @param canonical True if the message must be in canonical form (a
* {@link FormatException} will be thrown if it's not.
*/
@Deprecated
BdfList getMessageAsList(Transaction txn, MessageId m, boolean canonical)
throws DbException, FormatException;
BdfDictionary getGroupMetadataAsDictionary(GroupId g) throws DbException, BdfDictionary getGroupMetadataAsDictionary(GroupId g) throws DbException,
FormatException; FormatException;
@@ -103,6 +118,16 @@ public interface ClientHelper {
BdfList toList(Message m) throws FormatException; BdfList toList(Message m) throws FormatException;
/**
* Transitional alternative to {@link #toList(Message)} that allows the
* message to be in non-canonical form, for backward compatibility.
*
* @param canonical True if the message must be in canonical form (a
* {@link FormatException} will be thrown if it's not.
*/
@Deprecated
BdfList toList(Message m, boolean canonical) throws FormatException;
BdfList toList(Author a); BdfList toList(Author a);
byte[] sign(String label, BdfList toSign, PrivateKey privateKey) byte[] sign(String label, BdfList toSign, PrivateKey privateKey)
@@ -123,12 +148,25 @@ public interface ClientHelper {
Map<TransportId, TransportProperties> parseAndValidateTransportPropertiesMap( Map<TransportId, TransportProperties> parseAndValidateTransportPropertiesMap(
BdfDictionary properties) throws FormatException; 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 * Retrieves the contact ID from the group metadata of the given contact
* group. * group.
*/ */
ContactId getContactId(Transaction txn, GroupId contactGroupId) ContactId getContactId(Transaction txn, GroupId contactGroupId)
throws DbException, FormatException; throws DbException;
/** /**
* Stores the given contact ID in the group metadata of the given contact * Stores the given contact ID in the group metadata of the given contact
@@ -2,9 +2,9 @@ package org.briarproject.bramble.api.client;
import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.Contact;
import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.bramble.api.sync.ClientId;
import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group;
import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface ContactGroupFactory { public interface ContactGroupFactory {
@@ -2,11 +2,12 @@ package org.briarproject.bramble.api.connection;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.contact.PendingContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.TransportConnectionReader; import org.briarproject.bramble.api.plugin.TransportConnectionReader;
import org.briarproject.bramble.api.plugin.TransportConnectionWriter; import org.briarproject.bramble.api.plugin.TransportConnectionWriter;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
import org.briarproject.bramble.api.sync.OutgoingSessionRecord;
import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface ConnectionManager { public interface ConnectionManager {
@@ -16,6 +17,17 @@ public interface ConnectionManager {
*/ */
void manageIncomingConnection(TransportId t, TransportConnectionReader r); 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. * Manages an incoming connection from a contact over a duplex transport.
*/ */
@@ -34,6 +46,14 @@ public interface ConnectionManager {
void manageOutgoingConnection(ContactId c, TransportId t, void manageOutgoingConnection(ContactId c, TransportId t,
TransportConnectionWriter w); 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. * Manages an outgoing connection to a contact over a duplex transport.
*/ */
@@ -46,4 +66,21 @@ public interface ConnectionManager {
*/ */
void manageOutgoingConnection(PendingContactId p, TransportId t, void manageOutgoingConnection(PendingContactId p, TransportId t,
DuplexTransportConnection d); 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);
}
} }
@@ -2,7 +2,6 @@ package org.briarproject.bramble.api.connection;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.contact.PendingContactId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.PluginConfig; import org.briarproject.bramble.api.plugin.PluginConfig;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent; import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent;
@@ -12,6 +11,7 @@ import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent;
import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionClosedEvent; import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionClosedEvent;
import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionOpenedEvent; import org.briarproject.bramble.api.rendezvous.event.RendezvousConnectionOpenedEvent;
import org.briarproject.bramble.api.sync.Priority; import org.briarproject.bramble.api.sync.Priority;
import org.briarproject.nullsafety.NotNullByDefault;
import java.util.Collection; import java.util.Collection;
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api.connection; package org.briarproject.bramble.api.connection;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
/** /**
* A duplex sync connection that can be closed by interrupting its outgoing * A duplex sync connection that can be closed by interrupting its outgoing
@@ -3,7 +3,7 @@ package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.crypto.PublicKey;
import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -3,8 +3,8 @@ package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.db.ContactExistsException; import org.briarproject.bramble.api.db.ContactExistsException;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection; import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
import org.briarproject.nullsafety.NotNullByDefault;
import java.io.IOException; import java.io.IOException;
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api.contact; package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -12,7 +12,7 @@ import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.Author;
import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.AuthorId;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.Collection; import java.util.Collection;
@@ -107,6 +107,32 @@ public interface ContactManager {
*/ */
String getHandshakeLink() throws DbException; 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 * Creates a {@link PendingContact} from the given handshake link and
* alias, adds it to the database and returns it. * alias, adds it to the database and returns it.
@@ -140,11 +166,24 @@ public interface ContactManager {
Collection<Pair<PendingContact, PendingContactState>> getPendingContacts() Collection<Pair<PendingContact, PendingContactState>> getPendingContacts()
throws DbException; 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}. * Removes a {@link PendingContact}.
*/ */
void removePendingContact(PendingContactId p) throws DbException; 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. * Returns the contact with the given ID.
*/ */
@@ -2,8 +2,8 @@ package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.crypto.SecretKey;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.transport.StreamWriter; import org.briarproject.bramble.api.transport.StreamWriter;
import org.briarproject.nullsafety.NotNullByDefault;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -1,7 +1,7 @@
package org.briarproject.bramble.api.contact; package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.crypto.PublicKey;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -1,9 +1,8 @@
package org.briarproject.bramble.api.contact; package org.briarproject.bramble.api.contact;
import org.briarproject.bramble.api.UniqueId; import org.briarproject.bramble.api.UniqueId;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe; import javax.annotation.concurrent.ThreadSafe;
/** /**
@@ -17,9 +16,4 @@ public class PendingContactId extends UniqueId {
public PendingContactId(byte[] id) { public PendingContactId(byte[] id) {
super(id); super(id);
} }
@Override
public boolean equals(@Nullable Object o) {
return o instanceof PendingContactId && super.equals(o);
}
} }
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.PendingContact; import org.briarproject.bramble.api.contact.PendingContact;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -2,7 +2,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.contact.PendingContactId;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -3,7 +3,7 @@ package org.briarproject.bramble.api.contact.event;
import org.briarproject.bramble.api.contact.PendingContactId; import org.briarproject.bramble.api.contact.PendingContactId;
import org.briarproject.bramble.api.contact.PendingContactState; import org.briarproject.bramble.api.contact.PendingContactState;
import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.Event;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -1,7 +1,7 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.Bytes; import org.briarproject.bramble.api.Bytes;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -1,7 +1,7 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.Bytes; import org.briarproject.bramble.api.Bytes;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -1,6 +1,7 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.UniqueId;
import org.briarproject.nullsafety.NotNullByDefault;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.SecureRandom; import java.security.SecureRandom;
@@ -10,6 +11,8 @@ import javax.annotation.Nullable;
@NotNullByDefault @NotNullByDefault
public interface CryptoComponent { public interface CryptoComponent {
UniqueId generateUniqueId();
SecretKey generateSecretKey(); SecretKey generateSecretKey();
SecureRandom getSecureRandom(); SecureRandom getSecureRandom();
@@ -51,6 +54,38 @@ public interface CryptoComponent {
KeyPair ourKeyPair, byte[]... inputs) KeyPair ourKeyPair, byte[]... inputs)
throws GeneralSecurityException; throws GeneralSecurityException;
/**
* Derives a shared secret from two static and two ephemeral key pairs.
* <p>
* Do not use this method for new protocols. The shared secret can be
* re-derived using the ephemeral public keys and both static private
* keys, so keys derived from the shared secret should not be used if
* forward secrecy is required. Use {@link #deriveSharedSecret(String,
* PublicKey, PublicKey, KeyPair, KeyPair, boolean, byte[]...)} instead.
* <p>
* TODO: Remove this after a reasonable migration period (added 2023-03-10).
* <p>
*
* @param label A namespaced label indicating the purpose of this shared
* secret, to prevent it from being repurposed or colliding with a shared
* secret derived for another purpose
* @param theirStaticPublicKey The static public key of the remote party
* @param theirEphemeralPublicKey The ephemeral public key of the remote
* party
* @param ourStaticKeyPair The static key pair of the local party
* @param ourEphemeralKeyPair The ephemeral key pair of the local party
* @param alice True if the local party is Alice
* @param inputs Additional inputs that will be included in the
* derivation of the shared secret
* @return The shared secret
*/
@Deprecated
SecretKey deriveSharedSecretBadly(String label,
PublicKey theirStaticPublicKey, PublicKey theirEphemeralPublicKey,
KeyPair ourStaticKeyPair, KeyPair ourEphemeralKeyPair,
boolean alice, byte[]... inputs)
throws GeneralSecurityException;
/** /**
* Derives a shared secret from two static and two ephemeral key pairs. * Derives a shared secret from two static and two ephemeral key pairs.
* *
@@ -170,4 +205,13 @@ public interface CryptoComponent {
* length. The line terminator is CRLF. * length. The line terminator is CRLF.
*/ */
String asciiArmour(byte[] b, int lineLength); 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);
} }
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public class DecryptionException extends Exception { public class DecryptionException extends Exception {
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.Immutable;
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
@@ -1,6 +1,6 @@
package org.briarproject.bramble.api.crypto; package org.briarproject.bramble.api.crypto;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.nullsafety.NotNullByDefault;
/** /**
* Interface for strengthening a password-based key, for example by using a * Interface for strengthening a password-based key, for example by using a

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