Project-Wide Unified TODO List / Schedule

Logo

Schedule

Minimal project-wide goals before full-release:

Ideal project-wide goals before full-release:

For public discussion (Library):

For public discussion (UI Clients):

TODO List for TorX Library:

High Priority / Security Audit:

Medium Priority:

Low Priority:

TODO List for Both UIs (Flutter and GTK4):

High Priority / Security Audit:

  • peer_onine_cb/peer_offline_cb/call_peer_joining/call_peer_leaving should trigger rebuilds of popovers. In GTK, by re-populating the appropriate list_store. In Flutter, with changeNotifierPopoverList.
  • Participating List popover should also be re-built when a peer is speaking (to flash badge), and in GTK when someone clicks "mic/mic_off" "volume_up/volume_off" icons to toggle peer specific setting in Participant List (currently it is static).
  • Pete Hegseth function: When a new GROUP_PEER joins, some sort of message needs to be displayed in channel showing who invited them. Perhaps we should generate a non-sendable message type that can be saved into the database and appear as a permanent local notification in the channel.
  • Missed call: should also be displayed as a non-sendable message in channel, similar to Pete Hegseth function. Completed calls probably don't need to be noted.
  • RAM: Get stickers out of RAM.
  • Un-pause option is not available for PM transfers. (May also apply to Flutter?)
  • Messages that come in out-of-order in group chats are printed as the come in, instead of in-order, if chat is open. (May also apply to Flutter?)
  • When deleting group chat history, only sent public messages disappear immediately. The rest disappear when the chat route is re-opened. (Possibly related to above) (May also apply to Flutter?)
  • Global and per-peer settings of "Enable microphone"
  • Check destination folder write permissions before allowing its' selection
  • String functions in UI should use secure allocators/de-allocators, if possible. (Note: not possible?)
  • Analyze audio recordings for metadata? Requires writing samples to disk or analyzing sources https://gstreamer.freedesktop.org/documentation/application-development/advanced/metadata.html?gi-language=c

Medium Priority:

  • RAM: Perhaps offload messages as soon as we get to the bottom?
  • Streaming audio: Ideas? The biggest issue is playback. In audio.c, we would have to write a new playback function. In flutter, unknown.
  • Walkie-talkie mode / Touch to speak: When enabled during a voice call, display Participant List and only two buttons: one small one to leave the mode, and a massive one to touch to speak. Touching simply enables microphone, which is otherwise disabled.
  • There could be an UI option to set a debug_file location, and then upon startup have that log pop up (partially as a reminder that it should be disabled).
  • Better notifications for calls
    • Clicking notifications (both message and calls) should open the proper route (Flutter + GTK)
    • Flutter notifications should cancel after replies are sent (attempts made, no success)
    • Accept / Decline within the notification (GTK)
    • Peer list should rebuild and display something, or flash, to indicate an waiting call (Flutter + GTK)
    • Notifications may need to last longer (Flutter + GTK)
  • Test and document "Stealth addresses". Facilitated by peer_save(), "Stealth Addresses" functionality is where invalid (non-base32) and excessive (beyond 51 characters) characters are stripped. To utilize, take a 51(?) length TorX-ID, sprinkle invalid characters throughout it as desired, add unlimited length suffix trailing it, and then pass to peer_save. Note: cannot be exactly 56 characters long? Needs review and testing.
  • Have a toggle for kill_delete. Delete or Disable options.
  • Facilitate msg searching via gtk_list_view_scroll_to in GTK4 and ?? in Flutter.
  • message_load_more could take a specific time nstime as argument, or time/nstime AND _MIN/_MAX to designate loading more forwards/backwards from a specific message. These would have to be passed to sql_populate_message. This could facilitate loading of searched messages and then scroll from there. NOTE: This will only *really* save having to load thousands of messages if the user then doesn't scroll afterwards and clicks back or something.
  • We need to do sanity checks on sticker/image data or people can be crashed with junk stickers/images. (Send 0 size .gif or bunk data for testing)
  • Flash entry box red when no nick is entered for generating (generate_onion) or adding onion (save_peer), or when an invalid onion is passed (bad checksum)
  • Consider registering a URI? ie: "torx:" Base64 would be a grup, base32 would be a SING/MULT. is_valid_b32_input( and b64_isvalidchar( in conjunction can determine whether a string is peer/group/trash, for use with 'Search' or invalid input when adding peer.

Low Priority:

  • "Tor is running on port ..." could be displayed on settings page or "Tor Port: ..." at the top of Tor Log? (better)
  • "Peer Group Block" lists could be replaced with "Person Groups(or Diversity_2) No_Accounts" Google SVG icons for more standardized and intuitive appearance
  • If a last_message is too long, is there any way we can prevent it from cutting a character in half? We can't simply use multiples of 4 because spaces and newlines.
  • Multi-select messages and "forward" / "delete" / "resend" for them
  • ENUM_PROTOCOL_UTF8_TEXT_QUOTE could include a suffix of the quoted message time + nstime. Main difficulty in implementation is UI design.
  • Multi-Select: Tables should allow multiple selections for deletion. It should show only Delete (or Accept + Reject).
  • Implement our fancy new .SVG icons (can wait for GTK4.14) and colorize, replacing .PNG files. Search our code for gtk_symbolic_paintable_snapshot_symbolic, where we have an example implementation ready.
  • Tooltips: Use text_tooltip_ prefix. For flutter, https://material.io/components/tooltips alternatively we have used showSnackBar in Flutter and could use it for safety warnings/etc.
  • Have a tooltip that shows TorX-IDs, at least on the group's peerlist
  • If someone is fast on the censored region toggle while waiting for login, it will save the setting but not take effect until next restart
  • Should probably have a "doing checksum" spinner or something for file transfers, so people don't add more than once
  • Could have a toggleable option about whether to run as a tor binary as a middle node (this would support the network, but be bandwidth eating)

TODO List for GTK4 client:

High Priority / Security Audit:

  • transfer_progress_idle can segfault on t_peer[n].t_file[f].progress_bar if messages are deleted. We should be nulling t_peer[n].t_file[f].progress_bar when deleting file messages.
  • Clearing group messages only makes the outbound group messages immediately disappear and doesn't effect the GROUP_PEER messages.
  • Need to list appropriate GStreamer package as a build dependancy
  • t_main.global_pos and ].pos need to be analysed. Whether they are fully working or not is unknown. It's likely that adding messages from pos==0 is breaking every subsequent .pos, which likely needs to be modified (so, if we add 15 messages from 0, every other message with >0 ].pos needs to be +=15. For efficiency, this would be done in the functions that call print_message, not in print_message itself).
  • ListView should be a direct child of ScrolledWindow. If it is a child of a box, there may be issues if having >205 widgets (experienced in a test build). There are 3 places where we might face this issue (ctrl+f gtk_list_view_new), but our chat history itself is properly setup.

Medium Priority:

  • file_set_path should be used to set .file_path, instead of manually setting it.
  • GTK_FACTORY_BUG mitigation has a side effect: messages are not reloaded until application restart, which means that modifying peernicks of group members do not change nicks within loaded messages until restart. Mitigate by re-loading effected messages.
  • Bug: Messages that are larger than the chat window cannot be long-pressed properly (so cannot copy, etc). Issue is caused by the popover being spawned at the top of the message rather than the point of long-press.
  • While minimized to tray, message scroll doesn't really work. The scroll_func_idle gets called, but to no effect.
  • Create .deb file + Debian repo
  • Create .rpm file + RedHat repo
  • Create .??? file + MacOS brew.sh repo
  • Windows build:
    • Saving torrc results in warnings to override. Should complain to #tor if they persist.
    • Need to ship an installer or just zip up the files (if that is sufficient).
    • Need a "Microsoft code signing certificate"(?) to be able to distribute without warnings.
    • "Microsoft Store" listing should be considered.
    • Note for devs: torx-tray.exe may not die when TorX is abruptly killed (ex: ctrl+c in GDB) because TCP connections are not properly closed. Unavoidable without dropping a PID file, but this should only be an issue for devs who are repeatedly building in the same directory of execution (builds might fail on torx-tray.exe because it is running). This issue should not exist for users because multiple instances of torx-tray.exe can run concurrently.
  • Images should be clickable (to show larger).

Low Priority:

  • Landscape style images, at least in group PM, end up displaying undersized in an oversized message bubble.
  • Allow adding multiple stickers at once, from filepicker.
  • Rebuild message list after file transfer deletes (or specific message)
  • Clicking back while modifying peernick causes loss of changes (only in GTK4)
  • Vertical mode: consider putting Send button below the emoji and attach buttons, or simply hide buttons other than Send while typing (like Flutter client).
  • Memory leakage: Free memory. Eliminate memory leaks so that it can valgrind 0. g_free, g_object_free(), etc Unsure how to handle sensitive things.
  • Review any _swapped( and instead set proper args for given ::signal) (note: if signal can't be found in GTK docs, check gobject docs)
  • Have some clang specific compile flags. Could add more. See CMakeLists.txt.
  • Fully Mitigated by GTK_FACTORY_BUG=1: g_list_store_insert/splice in GTK4 are horribly inefficient until https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/7420 gets merged
  • Partially mitigated by GTK_FACTORY_BUG=1: Loading chats is horribly slow until gtk_list_base_set_anchor_max_widgets stops being passed GTK_LIST_VIEW_MAX_LIST_ITEMS as n_center, because it builds 205 widgets.
  • INVERSION_TEST is necessary until https://gitlab.gnome.org/GNOME/gtk/-/issues/4680 gets resolved
  • Gnotification can't use gresource icon. We already worked around it by dropping a .png, but we also have a .png for our .desktop file. If we set icon_logo to NULL, the icon registered with DBUS by .desktop will be used.

TODO List for Flutter client:

High Priority / Security Audit:

  • Outgoing voice messages are momentarily cached on disk: record.start( needs replacing with record.startStream(, but currently the "record" package has bugs
  • Values passed to changeNotifier(s) are inconsistent and arbitrary because in most cases we don't use them. We should universally standardize them and utilize them with $changeNotifier.section.$value
  • CMakeLists.txt: Depreciate the BUILD_BINARIES argument in favor of checking if they are already built.
    • Passing environmental variables to CMake through Flutter seems unreliable at best (may only be working when building re-binaries, with clean directories, at best).
    • Resolve issues / causes of unnecessary rebuilds (libevent related issue). Alternatively, BUILD_ALWAYS TRUE or otherwise force clean rebuild of libevent.
    • Allow forcing of rebuilds for when deps change? CMake can ideally handle this
  • CMakeLists.txt: Ship a release version of Tor instead of building from main (this requires following tor-announce mailing list and manually updating CMakeLists.txt for every stable release)
  • File picker caches in /data/user/0/com.torx.chat/cache/file_picker/, causing failure to resume outbound transfers after restarting
  • Can we prevent other applications from knowing this application is installed?
  • Client attempts to connect to https://firebaselogging.googleapis.com/v0cc/log/batch?format=json_proto3. Need to prevent that and verify that it isn't making other connections. We may need to fork all our dependencies to disable any firebase reference or remote connections.
  • Consider having a popup when adding something to clipboard. The clipboard would have a "Clear clipboard" and "Exit" option, along with a warning about other applications being able to steal clipboard contents. In some softwares (ie password managers), after ~45 seconds, it will clear the clipboard.

Medium Priority:

  • Need to do more testing with horizontal views. Known issue: Deleting stuff on Home page is impossible in horizontal mode. Other stuff untested.
  • Rebuilds are still too frequent; mostly when bringing keyboard up, NOT caused by use of MediaQuery (tested by eliminating all). https://github.com/flutter/flutter/issues/105184
  • Crash: Likely related to but NOT caused by android:stopWithTask="false" in AndroidManifest.xml? Read: https://stackoverflow.com/questions/19568315/how-to-handle-running-service-when-app-is-killed-by-swiping-in-android Occurs occassionally when application is in the background, especially when other high-RAM applications are running https://stackoverflow.com/questions/44425584/context-startforegroundservice-did-not-then-call-service-startforeground E/AndroidRuntime(12140): android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{52682ad u0 com.torx.chat/com.dexterous.flutterlocalnotifications.ForegroundService}
  • Crash: Also FlutterLocalNotifications, Unable to start service com.dexterous.flutterlocalnotifications.ForegroundService@52b4439 with null: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String, java.lang.Class)' on a null object reference
  • Isolates: showsUserInterface should be false, but we can't get it to work. Seems like few if any have (seems like they only use it with cancelNotification): https://github.com/search?q=%22showsUserInterface%3A+false%22&type=code with the only exception being here: https://github.com/jenspfahl/EverydayTasks/blob/a85475deae37649ba8ef18978e19270e3ba7ebb6/lib/ui/pages/ScheduledTaskList.dart#L977 Note: If we re-write our notifications (and perhaps callbacks) in native code for better lifecycle management, this issue would be irrelevant.
  • Delete temporaryDir/qr.png on program startup and shutdown (or when going to AppLifecycleState.paused?). Zero and delete might be best.
  • Message box height: 400 is too tall. Figure out a way to avoid hard coding it.

Low Priority:

  • Too long of a nick can overflow a activity bar.
  • Consider other default ringtone/beeps, such as https://freesound.org/people/knufds/sounds/633159/
  • "Resend" is available in different/less circumstances than in GTK
  • Flutter CMakeLists.txt: If jnilibs is populated with files, don't try to copy output binaries into jnilibs because if deleted the build dir and rebuilt a release only, it will be empty.
  • Can't change app name on the fly, but can change icon. Could use it to notify user of messages or put alternate icon option (calculator, or something people never use). "The calculator theoretically opens chat but it doesn't work anymore. They said it requires entering a specific calculation," Micay said.
  • Should use gallery with photo_view to allow swipping back/forward to see other images in PhotoView.
  • autoRunOnBoot: true (foreground task) + fix BootBroadcastReceiver.kt, then have a toggle in settings page for both.
  • Consider requesting battery optimization exemption
  • Calling peer_accept() while actively modifying peernick results in modifications being lost
  • Lifecycle: Notifications may have to handled by callbacks written in Java/Kotlin to prevent their disposal during lifecycle events. Singleton was attempted, but didn't help.
  • Lifecycle: RestorationScopeId seems to not be saving our route. Unsure if it saves anything. If we can get it to work, we can use restorationId on TextField and ScrollView (note: security implications of saving to disk in cleartext)
  • Lifecycle needs a full audit, including use of restorationScopeId, initialization_functions(), resumptionTasks()
  • Prevent un-encrypted backups of android data? Most chat apps do this but I'm on the fence because our data is encrypted, and we do want to support history migration. GrapheneOS project has some info that suggests we can block only unencrypted backups.
  • Comment out any unused color and language strings. Ensure that we don't have any strings not in our languages file.
  • AnimatedBuilder should replace most or all remaining of our setState calls, for efficiency. There are few left.
  • We lose TorX log and Tor log contents every time we .detach, so we might consider to store it in a library defined C pointer so it stays in RAM. We would just need to create the pointer in lib and the remaining work is done in flutter. However, this is kind of contrary to the direction we are going, which is to be able to minimize RAM usage in Android.