briar issueshttps://code.briarproject.org/groups/briar/-/issues2023-03-15T13:04:32Zhttps://code.briarproject.org/briar/briar/-/issues/2255Improve ContactExistsException2023-03-15T13:04:32ZSebastianImprove ContactExistsExceptionWhen Alice adds an existing proper contact again via `briar://` link, we throw a `ContactExistsException` that is used to show warnings to her to warn about a potential attack that might be in progress with one of the contacts trying to ...When Alice adds an existing proper contact again via `briar://` link, we throw a `ContactExistsException` that is used to show warnings to her to warn about a potential attack that might be in progress with one of the contacts trying to discover her contacts or non-contacts. The exception carries the local `AuthorId` as well as the remote `Author` so that a warning message can explain to Alice who the involved contacts are. However it lacks the alias Alice might have given to the existing contact. The result is that only the original self-given name of the contact can be displayed in warnings. I think this might confuse Alice as the contact name displayed in the warning can be different from the name displayed in her contact list and also can be rather ambiguous.
I propose we add the alias to the `ContactExistsException`. Among the three places where this exception gets created, in one place (in `DatabaseComponentImpl#addPendingContact()`) we already have the existing contact retrieved from the db readily available and could set the additional data right away. In the two other places (in `DatabaseComponentImpl#addContact()`), we don't yet have the contact retrieved. Instead we checked `containsIdentity()` and/or `containsContact()` there. I think we could either just retrieve the existing contact additionally there, shouldn't be a huge burden in terms of performance. We could also leave out the `containsContact()` check and just check if the contact retrieved is `!= null`. Maybe we can even leave out the `containsIdentity()` in this case? Either way I think performance shouldn't be an issue.https://code.briarproject.org/briar/briar-desktop/-/issues/242Improve test data creator2022-04-03T10:36:24ZSebastianImprove test data creatorThis can be broken down into smaller tickets for individual improvements of the test data creator.
* It would be nice to have not only readily added contacts, but also a bunch of pending contacts.
* Also it would be good if we can make ...This can be broken down into smaller tickets for individual improvements of the test data creator.
* It would be nice to have not only readily added contacts, but also a bunch of pending contacts.
* Also it would be good if we can make the `briar://`-links of both regular and pending contacts available for further interactive testing, for example by printing them on stdout. That would allow for easy testing of contact-readding etc.
* However, testing contacts don't currently have a handshake key from which the briar:// link gets derived. We can generated one, but apparently we need to go through the process of first adding our testing contacts as pending contacts and then making them proper contacts. See this message and the conversation shortly before and after for details: https://chat.briarproject.org/briar/pl/7tcobcx5qfb5mjkto3cj33kw8r
* Support for aliases
* Support for introductionshttps://code.briarproject.org/briar/briar-desktop/-/issues/240Improve warning for users about potential attack when creating contacts2023-01-09T21:39:55ZSebastianImprove warning for users about potential attack when creating contactsAs discussed in #82 there can be attacks related to adding contacts where an attacker might try to find out which contacts somebody has.
We plan to implement a simpler variant of the solution from Android in !105 and pick this up here.As discussed in #82 there can be attacks related to adding contacts where an attacker might try to find out which contacts somebody has.
We plan to implement a simpler variant of the solution from Android in !105 and pick this up here.Desktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/237Use central place to show error dialogs by means of some ErrorManager2022-11-27T13:22:07ZMikolai GütschowUse central place to show error dialogs by means of some ErrorManagerThat would avoid having an additional state and two parameters per dialog we want to show.
I think @seb already had a working implementation for #81.That would avoid having an additional state and two parameters per dialog we want to show.
I think @seb already had a working implementation for #81.https://code.briarproject.org/briar/briar-desktop/-/issues/236Use native windows for dialogs2023-01-09T21:39:56ZMikolai GütschowUse native windows for dialogse.g. for the AddContactDialog and AboutDialog, which do not strictly require to be modal.e.g. for the AddContactDialog and AboutDialog, which do not strictly require to be modal.Desktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/235Check if factoring out some scrollbar related logic makes sense2022-01-18T20:28:35ZMikolai GütschowCheck if factoring out some scrollbar related logic makes senseThe following discussion from !105 should be addressed:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/105#note_60777):
> Might be also good to have those scrollbar-related...The following discussion from !105 should be addressed:
- [ ] @ialokim started a [discussion](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/105#note_60777):
> Might be also good to have those scrollbar-related things as a reusable component in the future.https://code.briarproject.org/briar/briar-desktop/-/issues/234Validate or test translations2022-04-03T10:36:25ZNicoValidate or test translationsDepending on what translators put as their translation, this might lead to exceptions when processing the text, especially in the context of plurals. Seen when translating Briar Android to Indonesian for dark crystal.Depending on what translators put as their translation, this might lead to exceptions when processing the text, especially in the context of plurals. Seen when translating Briar Android to Indonesian for dark crystal.https://code.briarproject.org/briar/briar-desktop/-/issues/232Properly handle DbException and UnexpectedTimerException when sending messages2023-01-09T21:39:54ZNicoProperly handle DbException and UnexpectedTimerException when sending messagesCurrently the input field gets cleared and the exception gets logged, but the user sees no indication that sending the message failed besides seeing that it didn't get added to the chat history.
https://code.briarproject.org/briar/briar...Currently the input field gets cleared and the exception gets logged, but the user sees no indication that sending the message failed besides seeing that it didn't get added to the chat history.
https://code.briarproject.org/briar/briar-desktop/-/blob/d1e668dec33d8f309a6f6d99bbc8b4af015475d2/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt#L193Desktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/231Handle NoSuchContactException when loading contact or messages in Conversatio...2023-01-09T21:39:55ZNicoHandle NoSuchContactException when loading contact or messages in ConversationViewModelCurrently the whole app most likely crashes, I think.
https://code.briarproject.org/briar/briar-desktop/-/blob/d1e668dec33d8f309a6f6d99bbc8b4af015475d2/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt...Currently the whole app most likely crashes, I think.
https://code.briarproject.org/briar/briar-desktop/-/blob/d1e668dec33d8f309a6f6d99bbc8b4af015475d2/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt#L275Desktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/230React on ClientVersionUpdatedEvent from ConversationViewModel2022-04-03T10:36:26ZNicoReact on ClientVersionUpdatedEvent from ConversationViewModel```
/**
* An event that is broadcast when we receive a client versioning update from
* a contact.
*/
```
https://code.briarproject.org/briar/briar/-/blob/a53a49e543e3190f329b8608ecec157da4047b89/bramble-api/src/main/java/org/briarproj...```
/**
* An event that is broadcast when we receive a client versioning update from
* a contact.
*/
```
https://code.briarproject.org/briar/briar/-/blob/a53a49e543e3190f329b8608ecec157da4047b89/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/event/ClientVersionUpdatedEvent.java
TODO here: https://code.briarproject.org/briar/briar-desktop/-/blob/d1e668dec33d8f309a6f6d99bbc8b4af015475d2/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt#L363https://code.briarproject.org/briar/briar-desktop/-/issues/226NPE when introducing second test contact after already completed introduction2023-01-09T21:39:56ZNicoNPE when introducing second test contact after already completed introduction_I tried to reproduce this but failed because one contact out of 3 didn't want to connect with the other two inside the test environment._
Steps to reproduce:
* Start `TestWithThreeConnectedTemporaryAccounts::main`
* Introduce your firs..._I tried to reproduce this but failed because one contact out of 3 didn't want to connect with the other two inside the test environment._
Steps to reproduce:
* Start `TestWithThreeConnectedTemporaryAccounts::main`
* Introduce your first contact to the second one
* accept the introductions from both accounts
* try to introduce your second account to the first
```
Exception in thread "main" java.lang.NullPointerException
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$SubcomposeLayout$3$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:496)
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$SubcomposeLayout$3$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:496)
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$SubcomposeLayout$3$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:496)
at androidx.compose.ui.ComposeScene.close(ComposeScene.skiko.kt:195)
at androidx.compose.ui.awt.ComposeLayer.dispose(ComposeLayer.desktop.kt:362)
at androidx.compose.ui.awt.ComposeWindowDelegate.dispose(ComposeWindowDelegate.desktop.kt:113)
at androidx.compose.ui.awt.ComposeWindow.dispose(ComposeWindow.desktop.kt:117)
at androidx.compose.ui.window.Window_desktopKt$Window$4.invoke(Window.desktop.kt:193)
at androidx.compose.ui.window.Window_desktopKt$Window$4.invoke(Window.desktop.kt:193)
at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:647)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:488)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:425)
at androidx.compose.ui.window.YieldFrameClock.withFrameNanos(Application.desktop.kt:262)
at androidx.compose.ui.window.YieldFrameClock$withFrameNanos$1.invokeSuspend(Application.desktop.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:316)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
```
After this the window with the error message got closed. Then I got another error in the second window with this:
```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at org.briarproject.briar.desktop.conversation.ConversationRequestItemViewKt$ConversationRequestItemView$4.invoke(ConversationRequestItemView.kt:85)
at org.briarproject.briar.desktop.conversation.ConversationRequestItemViewKt$ConversationRequestItemView$4.invoke(ConversationRequestItemView.kt:82)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at org.briarproject.briar.desktop.conversation.ConversationItemViewKt$ConversationItemView$2$1$2$1.invoke(ConversationItemView.kt:181)
at org.briarproject.briar.desktop.conversation.ConversationItemViewKt$ConversationItemView$2$1$2$1.invoke(ConversationItemView.kt:180)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:268)
at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:255)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:252)
at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:110)
at androidx.compose.material.CardKt.Card-F-jzlyU(Card.kt:66)
at org.briarproject.briar.desktop.conversation.ConversationItemViewKt$ConversationItemView$2$1$2.invoke(ConversationItemView.kt:174)
at org.briarproject.briar.desktop.conversation.ConversationItemViewKt$ConversationItemView$2$1$2.invoke(ConversationItemView.kt:173)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.foundation.ContextMenuProvider_desktopKt$ContextMenuArea$2.invoke(ContextMenuProvider.desktop.kt:53)
at androidx.compose.foundation.ContextMenuProvider_desktopKt$ContextMenuArea$2.invoke(ContextMenuProvider.desktop.kt:51)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.foundation.ContextMenuProvider_desktopKt$ContextMenuDataProvider$2.invoke(ContextMenuProvider.desktop.kt:79)
at androidx.compose.foundation.ContextMenuProvider_desktopKt$ContextMenuDataProvider$2.invoke(ContextMenuProvider.desktop.kt:78)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.compose.foundation.ContextMenuProvider_desktopKt.ContextMenuDataProvider(ContextMenuProvider.desktop.kt:76)
at androidx.compose.foundation.ContextMenuProvider_desktopKt.ContextMenuArea(ContextMenuProvider.desktop.kt:51)
at org.briarproject.briar.desktop.conversation.ConversationItemViewKt.ConversationItemView(ConversationItemView.kt:167)
at org.briarproject.briar.desktop.conversation.ConversationRequestItemViewKt.ConversationRequestItemView(ConversationRequestItemView.kt:82)
at org.briarproject.briar.desktop.conversation.ConversationListKt$ConversationList$1$1$invoke$$inlined$itemsIndexed$default$2.invoke(LazyDsl.kt:270)
at org.briarproject.briar.desktop.conversation.ConversationListKt$ConversationList$1$1$invoke$$inlined$itemsIndexed$default$2.invoke(LazyDsl.kt:119)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:135)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.foundation.lazy.LazyListScopeImpl$items$1$1.invoke(LazyListScopeImpl.kt:39)
at androidx.compose.foundation.lazy.LazyListScopeImpl$items$1$1.invoke(LazyListScopeImpl.kt:39)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
at androidx.compose.foundation.lazy.layout.LazyLayoutItemContentFactory$CachedItemContent$content$1.invoke(LazyLayoutItemContentFactory.kt:102)
at androidx.compose.foundation.lazy.layout.LazyLayoutItemContentFactory$CachedItemContent$content$1.invoke(LazyLayoutItemContentFactory.kt:93)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2$1$1.invoke(SubcomposeLayout.kt:251)
at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2$1$1.invoke(SubcomposeLayout.kt:251)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.ActualJvm_jvmKt.invokeComposable(ActualJvm.jvm.kt:72)
at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2582)
at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2571)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:247)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source)
at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2571)
at androidx.compose.runtime.ComposerImpl.composeContent$runtime(Composer.kt:2522)
at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:478)
at androidx.compose.runtime.Recomposer.composeInitial$runtime(Recomposer.kt:748)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime(Composer.kt:2987)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime(Composer.kt:2987)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime(Composer.kt:2987)
at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:433)
at androidx.compose.ui.layout.SubcomposeLayoutState.subcomposeInto(SubcomposeLayout.kt:269)
at androidx.compose.ui.layout.SubcomposeLayoutState.access$subcomposeInto(SubcomposeLayout.kt:154)
at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:244)
at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:241)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:142)
at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui(OwnerSnapshotObserver.kt:55)
at androidx.compose.ui.node.LayoutNode.withNoSnapshotReadObservation$ui(LayoutNode.kt:1140)
at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:241)
at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:235)
at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose$ui(SubcomposeLayout.kt:224)
at androidx.compose.ui.layout.SubcomposeLayoutState$Scope.subcompose(SubcomposeLayout.kt:490)
at androidx.compose.foundation.lazy.layout.LazyLayoutPlaceablesProvider.getAndMeasure-0kLqBqw(LazyMeasurePolicy.kt:58)
at androidx.compose.foundation.lazy.LazyMeasuredItemProvider.getAndMeasure-ZjPyQlc(LazyMeasuredItemProvider.kt:45)
at androidx.compose.foundation.lazy.LazyListMeasureKt.measureLazyList-DCyOChk(LazyListMeasure.kt:140)
at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.measure-3p2s80s(LazyList.kt:230)
at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$2.invoke-0kLqBqw(LazyLayout.kt:55)
at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$2.invoke(LazyLayout.kt:44)
at androidx.compose.ui.layout.SubcomposeLayoutState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:355)
at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:55)
at androidx.compose.foundation.layout.PaddingValuesModifier.measure-3p2s80s(Padding.kt:417)
at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:306)
at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)
at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:118)
at androidx.compose.foundation.layout.PaddingModifier.measure-3p2s80s(Padding.kt:364)
at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)
at androidx.compose.foundation.layout.FillModifier.measure-3p2s80s(Size.kt:658)
at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39)
at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke(OuterMeasurablePlaceable.kt:99)
at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke(OuterMeasurablePlaceable.kt:98)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1798)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:88)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:76)
at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:98)
at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui(LayoutNode.kt:1269)
at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui$default(LayoutNode.kt:1265)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure(MeasureAndLayoutDelegate.kt:170)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:228)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:38)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:201)
at androidx.compose.ui.platform.SkiaBasedOwner.measureAndLayout(SkiaBasedOwner.skiko.kt:266)
at androidx.compose.ui.node.Owner$DefaultImpls.measureAndLayout$default(Owner.kt:182)
at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui(SkiaBasedOwner.skiko.kt:342)
at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui$default(SkiaBasedOwner.skiko.kt:341)
at androidx.compose.ui.ComposeScene.onMouseMove(ComposeScene.skiko.kt:465)
at androidx.compose.ui.ComposeScene.sendPointerEvent-Kr8mkKM(ComposeScene.skiko.kt:429)
at androidx.compose.ui.ComposeScene.sendPointerEvent-Kr8mkKM$default(ComposeScene.skiko.kt:397)
at androidx.compose.ui.awt.ComposeLayer_desktopKt.onMouseEvent(ComposeLayer.desktop.kt:415)
at androidx.compose.ui.awt.ComposeLayer_desktopKt.access$onMouseEvent(ComposeLayer.desktop.kt:1)
at androidx.compose.ui.awt.ComposeLayer$onMouseEvent$1.invoke(ComposeLayer.desktop.kt:273)
at androidx.compose.ui.awt.ComposeLayer$onMouseEvent$1.invoke(ComposeLayer.desktop.kt:269)
at androidx.compose.ui.awt.ComposeLayer.catchExceptions(ComposeLayer.desktop.kt:89)
at androidx.compose.ui.awt.ComposeLayer.onMouseEvent(ComposeLayer.desktop.kt:269)
at androidx.compose.ui.awt.ComposeLayer.access$onMouseEvent(ComposeLayer.desktop.kt:70)
at androidx.compose.ui.awt.ComposeLayer$3.mouseEntered(ComposeLayer.desktop.kt:251)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6623)
at java.desktop/java.awt.Component.processEvent(Component.java:6379)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4990)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
```Desktop 1.0.0https://code.briarproject.org/briar/briar/-/issues/2254QR screen hangs if user leave Briar and go to permission manager and denies l...2022-01-19T10:36:04ZIvanaQR screen hangs if user leave Briar and go to permission manager and denies location permission during the creation of nearby contactReproducible on devices: Pixel 2 API 30, Samsung A01 Core API 29, Motorola E2 API 23
It does not happen on HTC One M9 API 24
## Steps to execute
- Verify that Briar debug has location and camera permissions granted in the device setting...Reproducible on devices: Pixel 2 API 30, Samsung A01 Core API 29, Motorola E2 API 23
It does not happen on HTC One M9 API 24
## Steps to execute
- Verify that Briar debug has location and camera permissions granted in the device settings
- Go to 'add nearby contact'
- Follow instructions, and when the QR code is displayed, go to the device settings and deny the locaiton permission to Briar debug
- Return to Briar debug
- re-login when asked
## expected results
- the QR screen that was showing before, displays again
## actual results
- the QR screen hangs. See attached.![device-2022-01-18-141734](/uploads/bbc47c7fbbd01b50beba5f971278fa6c/device-2022-01-18-141734.mp4)[QR_screen_hangs_on_Pixel2.txt](/uploads/48d5e18d8e704108f0fbf9869ce77ad9/QR_screen_hangs_on_Pixel2.txt)https://code.briarproject.org/briar/briar-desktop/-/issues/219NPE when selecting contact after another one had been selected2022-01-18T13:43:25ZTorsten GroteNPE when selecting contact after another one had been selected```
Exception in thread "main" java.lang.NullPointerException
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$Subcompose...```
Exception in thread "main" java.lang.NullPointerException
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$SubcomposeLayout$3$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:496)
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$SubcomposeLayout$3$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:496)
at androidx.compose.ui.layout.SubcomposeLayoutState.disposeCurrentNodes$ui(SubcomposeLayout.kt:386)
at androidx.compose.ui.layout.SubcomposeLayoutKt$SubcomposeLayout$3$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:496)
at androidx.compose.ui.ComposeScene.close(ComposeScene.skiko.kt:195)
at androidx.compose.ui.awt.ComposeLayer.dispose(ComposeLayer.desktop.kt:362)
at androidx.compose.ui.awt.ComposeWindowDelegate.dispose(ComposeWindowDelegate.desktop.kt:113)
at androidx.compose.ui.awt.ComposeWindow.dispose(ComposeWindow.desktop.kt:117)
at androidx.compose.ui.window.Window_desktopKt$Window$4.invoke(Window.desktop.kt:193)
at androidx.compose.ui.window.Window_desktopKt$Window$4.invoke(Window.desktop.kt:193)
at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2$invoke$$inlined$onDispose$1.dispose(Effects.kt:484)
at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:85)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:793)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:647)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:488)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:425)
at androidx.compose.ui.window.YieldFrameClock.withFrameNanos(Application.desktop.kt:262)
at androidx.compose.ui.window.YieldFrameClock$withFrameNanos$1.invokeSuspend(Application.desktop.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
```https://code.briarproject.org/briar/briar-desktop/-/issues/217Don't increase image size when making window larger2023-01-09T21:39:54ZNicoDon't increase image size when making window largerImages like font sizes should always have the same size imho. Related to https://code.briarproject.org/briar/briar-desktop/-/issues/205.Images like font sizes should always have the same size imho. Related to https://code.briarproject.org/briar/briar-desktop/-/issues/205.Desktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/213Use system's default theme color by default2022-05-03T16:44:51ZNicoUse system's default theme color by defaultIn !49 we allowed people to switch themes (or rather implemented a more beautiful UI for it), but in #212 we realized that this setting doesn't stick. This made me think that by default we should be using our desktop environment's defaul...In !49 we allowed people to switch themes (or rather implemented a more beautiful UI for it), but in #212 we realized that this setting doesn't stick. This made me think that by default we should be using our desktop environment's default color theme, which is at least possible on GTK with dark/light.https://code.briarproject.org/briar/briar-desktop/-/issues/211Check whether leading or trailing whitespaces are allowed for nicknames2022-01-14T17:11:13ZMikolai GütschowCheck whether leading or trailing whitespaces are allowed for nicknamessee [here](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/95#note_60540): (+2 comments)see [here](https://code.briarproject.org/briar/briar-desktop/-/merge_requests/95#note_60540): (+2 comments)https://code.briarproject.org/briar/briar-desktop/-/issues/209Hardware based key encryption to strengthen passwords / 2 factor auth?2022-04-03T10:36:28ZSebastianHardware based key encryption to strengthen passwords / 2 factor auth?we currently have:
```kotlin
internal class DesktopDatabaseConfig(private val dbDir: Path, private val keyDir: Path) :
DatabaseConfig {
override fun getDatabaseDirectory(): File = dbDir.toFile()
override fun getDatabaseKey...we currently have:
```kotlin
internal class DesktopDatabaseConfig(private val dbDir: Path, private val keyDir: Path) :
DatabaseConfig {
override fun getDatabaseDirectory(): File = dbDir.toFile()
override fun getDatabaseKeyDirectory(): File = keyDir.toFile()
override fun getKeyStrengthener(): KeyStrengthener? = null
}
```
while Android supports some kind of key strengthening based on Android APIs:
```java
class AndroidKeyStrengthener implements KeyStrengthener {
private static final Logger LOG =
getLogger(AndroidKeyStrengthener.class.getName());
private static final String KEY_STORE_TYPE = "AndroidKeyStore";
private static final String PROVIDER_NAME = "AndroidKeyStore";
private static final String KEY_ALIAS = "db";
private static final int KEY_BITS = 256;
private final List<AlgorithmParameterSpec> specs;
AndroidKeyStrengthener() {
KeyGenParameterSpec noStrongBox =
new KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_SIGN)
.setKeySize(KEY_BITS)
.build();
if (SDK_INT >= 28) {
// Prefer StrongBox if available
KeyGenParameterSpec strongBox =
new KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_SIGN)
.setIsStrongBoxBacked(true)
.setKeySize(KEY_BITS)
.build();
specs = asList(strongBox, noStrongBox);
} else {
specs = singletonList(noStrongBox);
}
}
…
```
I think there are devices such as special USB-dongles that can be plugged into ordinary computers and act as such strenghteners maybe? Or something like smartcards?https://code.briarproject.org/briar/briar-desktop/-/issues/208Investigate using sp units instead of dp2023-01-09T21:39:55ZSebastianInvestigate using sp units instead of dpIt's possible we should be using `sp` units instead of `dp`, but I'm not sure.
It's not straightforward to convert `sp` to `dp`, so keeping this here to not having to research this again:
```kotlin
object DensityUtils {
@Composabl...It's possible we should be using `sp` units instead of `dp`, but I'm not sure.
It's not straightforward to convert `sp` to `dp`, so keeping this here to not having to research this again:
```kotlin
object DensityUtils {
@Composable
fun TextUnit.dp() = with(LocalDensity.current) { this@dp.toDp() }
}
```Desktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/205Make images in conversation clickable for bigger view2023-01-09T21:39:55ZSebastianMake images in conversation clickable for bigger viewClicking an image could open a dialog or similar where the image can be shown in greater detail. Well the image quality at 32Kb doesn't really offer greater detail at the size images are currently rendered in the conversation. Maybe, if ...Clicking an image could open a dialog or similar where the image can be shown in greater detail. Well the image quality at 32Kb doesn't really offer greater detail at the size images are currently rendered in the conversation. Maybe, if we decrease their size there, it actually will make more senseDesktop 1.0.0https://code.briarproject.org/briar/briar-desktop/-/issues/204Better rendering of multiple images in a single message2023-01-09T21:39:56ZSebastianBetter rendering of multiple images in a single messageWhile !94 already adds support for rendering multi-image messages, it would nice if they were rendered in a similarly nice layout as on Android, see https://code.briarproject.org/briar/briar/-/merge_requests/1010 for a reference.While !94 already adds support for rendering multi-image messages, it would nice if they were rendered in a similarly nice layout as on Android, see https://code.briarproject.org/briar/briar/-/merge_requests/1010 for a reference.Desktop 1.0.0