From a4c7fe6ebff9d34e47ec0d2c2f6d4baaf0f88c4f Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 7 Jun 2021 14:14:05 -0700 Subject: [PATCH] Fix Self-Invitations --- lib/views/messageview.dart | 4 +++- lib/widgets/DropdownContacts.dart | 8 +++++++- lib/widgets/invitationbubble.dart | 26 ++++++++++++++++++-------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index ff465be..b3d4488 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -177,7 +177,9 @@ class _MessageViewState extends State { ), ChangeNotifierProvider.value( value: Provider.of(ctx, listen: false), - child: DropdownContacts(onChanged: (newVal) { + child: DropdownContacts(filter: (contact) { + return contact.onion != Provider.of(context).onion; + }, onChanged: (newVal) { setState(() { this.selectedContact = newVal; }); diff --git a/lib/widgets/DropdownContacts.dart b/lib/widgets/DropdownContacts.dart index 7cb3dcc..aed9c4a 100644 --- a/lib/widgets/DropdownContacts.dart +++ b/lib/widgets/DropdownContacts.dart @@ -3,6 +3,10 @@ import 'package:provider/provider.dart'; import '../model.dart'; +bool noFilter(ContactInfoState peer) { + return true; +} + // Dropdown menu populated from Provider.of's contact list // Includes both peers and groups; begins empty/nothing selected // Displays nicknames to UI but uses handles as values @@ -10,8 +14,10 @@ import '../model.dart'; class DropdownContacts extends StatefulWidget { DropdownContacts({ required this.onChanged, + this.filter = noFilter, }); final Function(dynamic) onChanged; + final bool Function(ContactInfoState) filter; @override _DropdownContactsState createState() => _DropdownContactsState(); @@ -24,7 +30,7 @@ class _DropdownContactsState extends State { Widget build(BuildContext context) { return DropdownButton( value: this.selected, - items: Provider.of(context, listen: false).contactList.contacts.map>((ContactInfoState contact) { + items: Provider.of(context, listen: false).contactList.contacts.where(widget.filter).map>((ContactInfoState contact) { return DropdownMenuItem(value: contact.onion, child: Text(contact.nickname)); }).toList(), onChanged: (String? newVal) { diff --git a/lib/widgets/invitationbubble.dart b/lib/widgets/invitationbubble.dart index 600dad1..10d0569 100644 --- a/lib/widgets/invitationbubble.dart +++ b/lib/widgets/invitationbubble.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:cwtch/cwtch_icons_icons.dart'; +import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../main.dart'; @@ -54,10 +55,18 @@ class InvitationBubbleState extends State { style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()))); // todo: translations + + // If we receive an invite for ourselves, treat it as a bug. The UI no longer allows this so it could have only come from + // some kind of malfeasance. + var selfInvite = Provider.of(context).inviteNick == Provider.of(context).onion; + if (selfInvite) { + return MalformedBubble(); + } + var wdgMessage = fromMe ? senderInviteChrome("You sent an invitation for", isGroup ? "a group" : Provider.of(context).message, myKey) - : inviteChrome(isGroup ? AppLocalizations.of(context)!.inviteToGroup : "This is a contact suggestion for:", Provider.of(context).inviteNick, - Provider.of(context).inviteTarget, myKey); + : (inviteChrome(isGroup ? AppLocalizations.of(context)!.inviteToGroup : "This is a contact suggestion for:", Provider.of(context).inviteNick, + Provider.of(context).inviteTarget, myKey)); Widget wdgDecorations; if (fromMe) { @@ -98,12 +107,13 @@ class InvitationBubbleState extends State { child: Wrap(runAlignment: WrapAlignment.spaceEvenly, alignment: WrapAlignment.spaceEvenly, runSpacing: 1.0, crossAxisAlignment: WrapCrossAlignment.center, children: [ Center(widthFactor: 1, child: Padding(padding: EdgeInsets.all(10.0), child: Icon(CwtchIcons.send_invite, size: 32))), Center( - widthFactor: 1.0, - child: Column( - crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, - mainAxisAlignment: fromMe ? MainAxisAlignment.end : MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: fromMe ? [wdgMessage, wdgDecorations] : [wdgSender, wdgMessage, wdgDecorations])), + widthFactor: 1.0, + child: Column( + crossAxisAlignment: fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, + mainAxisAlignment: fromMe ? MainAxisAlignment.end : MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: fromMe ? [wdgMessage, wdgDecorations] : [wdgSender, wdgMessage, wdgDecorations]), + ) ]))))); }); }