Internet Independent Wireless Mesh Communication App

In order to be able to run on unpriviledged mobile platforms qaul

qaul.net – قول

Internet Independent Wireless Mesh Communication App

qaul.net

To install and run qaul.net please see the Documentation

License

qaul is a fully free and open source software. It is published under the AGPLv3, the GNU Affero General Public License version 3 or later.

Please see the licenses folder for in depth information on qaul's licenses.

Committing and Contributing to qaul

Committing and contributing to this project, you agree to transfer the full copyright of all your contributions to the 'Verein zur Förderung von offenen Community-Projekten' in Switzerland (English name: Open Community Project Association). This transfer includes the transfer of the following rights: the right to enforce the copyright, the right to relicense the work, the right to transfer ownership of the work as well as the exploitation rights of the work.

Issues

Collection of the latest Issues

MathJud

MathJud

Tracking Issue
0

creation of a qaul file sharing service:

  • #348
  • flutter implementation of file sharing service
MathJud

MathJud

Libqaul
0

The file sharing service needs to implement the following shall use the messaging service to send a file to other users.

  • It needs to based on libqaul messaging service
  • the maximum data package size we can encrypt is 64KBytes, bigger files need to be sliced into 64KB data parts.
  • the received files reside in the files folder in the users data folder.

The following things need to be implemented:

  • filesharing folder in the service folder containing all file sharing related files.
  • filesharing protobuf network message file
    • file collection message:
      • file description section: file name, description text, file hash, file size
      • collection of all message nonces of the data packages
    • file data message (max 64KB)
  • file sharing service
    • analyze file to send and create file description, and calculate amount of data packages used.
    • slice file in 64KB parts and create the encrypted messages.
    • create collection message and send it to the user.
  • create filesharing protobuf RPC messaging
  • create qaul-cli feature to use the file sharing service
MathJud

MathJud

Protobuf
0
  • #344
  • Display message status in Chat
  • Evolve message scheduler
  • Create chat groups
MathJud

MathJud

Protobuf
0
MathJud

MathJud

Libqaul
0

The routing protocol has many default values:

  • Sending the table every 10 seconds to direct neighbours.
  • Pinging every neighbour all 5 seconds.
  • Hop count penalty.
  • How long a route is stored until it is removed.

All these values should be centrally accessiable and configurable via the config.yml file.

MathJud

MathJud

Protobuf
0

The feed messages are spread via flood sub in the network. But they are only received when a user is interconnected with the other users at that time. The synchronizsation shall make the system more robust and the messages delay tolerant.

The last feed messages shall be synchronized:

  1. when a user joins the network.
  2. In case a user missed a feed message.

Tasks

  • extend the protobuf RouterInfoMessage with a feeds field.
  • create protobuf feed synchronization request and response messages in router info service.
  • send up to the last 5 feed message ID's with the routing table to the neighbours.
  • only send a specific feed message ID once to the same neighbour.

Implementation Discussion

As we only have the index as a key to search for the data base we need a second sled data base translation table that maps the message ID to the message index

Feed Structure

Create new Sled Translation Table

This data base management logic should go into the module services/feed

Open Questions

Do we still need the messages btreemap? I guess it is only here for historical reasons and not needed anymore. Please check if this is correct. If yes, it should be removed.

MathJud

MathJud

Libqaul
0

When sending the routing table to neighbours, a list of online users is sent along with it. At the moment all known users in the network by the node are sent to the neighbour every time a routing table is sent. This can be optimized the following way:

  • Only send users that have been online within the last 5 minutes.
  • Only send newly added users
  • Put logic into router/users.rs
  • Create a vecdec ringlist of all online users
    • ringlist is ordered by time a user came online
  • Create a vecdec ringlist of all users that went offline
    • ringlist is ordered by time users went offline
    • remove users from ringlist after 5 minutes
MathJud

MathJud

0

Community Server

The qaul daemon qauld can be used to run on servers as headless daemon. The interest to set up an own community Server was high.

  • Youtube tutorial on how to setup a community server
  • provide binaries to run it servers without the need to compiling it
  • make handling server easier & more standard conform
    • automatically start listening at port 9229
    • automatically decouple it from terminal
      • provide start/stop script
      • start/stop it via sysctl
    • create qauld storage place
    • create a special client qauld-ctl to control and configure the running server
MathJud

MathJud

Discussion
0

Connectivity

  • Routing
    • #317
    • #323

UI Improvements

There were serveral detected improvements for the user interface

  • User Overview
    • Order users in chat user selection according to their online status
    • Make users in chat selected searchable
    • Make user list searchable
  • Notifications about new messages

Further Development Suggestions

  • mDNS on Android more reliable
  • Closed Group Communication Options
    • #333
    • #332
  • Routing Protocol Improvements
    • #318
MathJud

MathJud

Discussion
0

Tracking the stabalization & improvements of the qaul routing protocol.

General

  • Send routing data protobuf encoded
    • see also: #306
  • Make hop count work
  • #343

Make data sent via qaul info package smaller

  • #340

Fix Problems and Bugs

  • #317
  • #323
MathJud

MathJud

Feature Request
0

Create a progressive web app client

With WebAssembly one can load compiled code as a progressive web app into a web browser. New API's such as WebBluetooth can be used to interconnect with other devices directly from within the web browser.

The underlying library rust-libp2p compiles to WASM, and also the used database is WASM compatible. It will be interesting to test with the connection modules what will be possible in relation to network transports.

To have storage and cryptography within the browser is the main part of the project and crucial for secure decentralized p2p networks.

MathJud

MathJud

Feature Request
0

Create a BLE (Bluetooth Low Energy) module in rust which compatible to the two existing modules for Android & iOS.

Existing android BLE module: https://github.com/qaul/qaul.net/tree/main/android/blemodule

It shall do the following things:

  • Listen for BLE advertisements
    • detect neighbour nodes
  • Send BLE advertisement messages in regular intervals.
  • send arbitrary binary data to nodes nearby.
  • receive arbitrary binary data from nodes nearby.

The module is independent and will communicate via protobuf to the controlling backend library libqaul.

BlueR is the official Bluetooth low energy repository for for rust. https://github.com/bluez/bluer

Prototypes with partial functionality already exist.

MathJud

MathJud

Feature Request
0

Create the possibility for qaul web clients as a

There are two necessities to be able to communication via web.

  • #311
  • #312
MathJud

MathJud

Feature Request
0

Create a web server in libqaul to handle the flutter web GUI ( #311 ).

The web server needs to handle the following things:

  • Libqaul webgui protobuf communication
  • Serve static flutter web sources
MathJud

MathJud

Feature Request
0

Create the flutter GUI for web and communicate with libqaul via protobuf RPC.

MathJud

MathJud

Feature Request
0

qaul shall have a user to user voice & video chat communication possibility. To realize this we could use webrtc and realize it in the GUI as well on distributed network level.

  • #308
  • #309
MathJud

MathJud

Discussion
0

qaul messages shall be end to end encrypted and authenticated by default. To achieve that we use the noise protocol with the already exchanged known longterm public keys of the users.

Every qaul user has an ed25519 key pair. The user ID is a hash of the public key. The public key, the user ID and the user name are propagated within the qaul network.

In order to be a delay tolerant network, the messaging needs to be able to start We can therefore use the Noise_KK_25519_ChaChaPoly_BLAKE2s algorithm.

Noise_KK_25519_ChaChaPoly_BLAKE2s

A noise protocol is specified by a string that specifies all the parts of the used protocol variant. The parts are separted with under scores.

For Noise_KK_25519_ChaChaPoly_BLAKE2s these are:

  • Noise: the noise protocol
  • KK: the handshake pattern with the static longterm public key known by both parties.
  • ChaChaPoly
    • Encryption with ChaCha20 algorithm
    • Authentication with the Poly1305 algorithm
    • This creates an AEAD (Authenticated Encryption with Associated Data)
  • Blake2s: cryptographic hash function

Noise Protocol KK Pattern

The kk patern states that the long term public keys are already known to both parties. Already the content of the first message can be encrypted with an ephemeral key of the initializing party.

https://noiseexplorer.com/patterns/KK/

Libraries & Implementation Ideas

In order to get the the x25519 form of the users ed25519 public key we need to transform it from the users ed25519 key. This Transformation can be done with the

ed25519 -> x25519 conversion to montgomery version

All Libraries of the dalek cryptography

To implement the Noise Noise_KK_25519_ChaChaPoly_BLAKE2s protocol we could use the Snow library, which claims to be 'a hard to fuck up noise implementation'[sic!]. libp2p_noise module is using snow internally too.

examples:

Resources & Interesting Reads

Introduction into the Noise Protocol https://duo.com/labs/tech-notes/noise-protocol-framework-intro

Noise Protocol Specification http://noiseprotocol.org/noise.html

Declaration of the KK Pattern https://noiseexplorer.com/patterns/KK/

Also libp2p's transport protocol is using the noise protocol for transport encryption, with XX pattern. The handling is done in the libp2p-noise module. https://docs.rs/libp2p-noise/0.34.0/libp2p_noise/

MathJud

MathJud

Discussion
0

General

Due to a bug in the time calculation when sending RPC messages to the GUI, libqaul crashed (see logs below). This crash was not transparent to the user, as the UI was still working. This led to confusion.

Better Testing Feedback

  • #291
  • Log libqaul within flutter and make it accessible for analyzation in futher tests.
  • Create the functionality to send the logs via email to the developers.
  • Create the functionality to send device soft/hardware information via email to the developers.
  • #297
  • #298

UI Improvements

  • Android: Make System back button working
  • Mobile: Portrait view: Add gesture sliding functionality between the taps
  • Feed View: make user icons clickable
  • User Account View: show connectivity option in view
    • Display IP addresses via which the user is reachable
  • #293
  • Display round trip time milliseconds on network view correctly.

Further Development Suggestions

  • Synchronize feed
  • Make User Validation Interactive
    • Automatically exchange further more private information
    • Explain Idea behind it to the user
  • Create anti-spam feature for feed messenger

Logs

Libqaul Panic Log

MathJud

MathJud

Good first issue
0

When changing the language on a sub page of the web site, navigation always links to the front page. This is not the desired behaviour. The navigation should always point to the current page and only if this page does not exist to a meaningful other page.

MathJud

MathJud

Tracking Issue
2

Module & Feature overview of qaul.net rewrite

Platforms

The following Platforms are supported by qaul app

  • Android
  • iOS
  • Linux
  • MacOS
  • Windows

There is further a server daemon working on Linux, MacOS and Windows.

Connection Modules

  • Internet Connection Module
    • Connect people and communities over the Internet. Community relay servers can be easily set up and added as connection possibility.
  • LAN Connection Module
    • Discover and communicate with users in the same network, e.g. in the same Wifi network.
    • The user discovery is done via mDNS
  • Bluetooth Low Energy (BLE) Connection Module
    • Communicate via Bluetooth directly from device to device. The nearby devices are automatically discovered and communication established.

This shows the implementation status of the 3 connection modules of qaul. As the connection modules need platform dependent implementation, they are in

System Internet LAN BLE
Linux Y Y -
Android Y Y P
MacOS Y Y -
iOS Y Y P
Windows Y Y -

Legend: Y = Fully implemented, P = partially implemented & prototypes exist, S = Work has been started, - = Work has not started yet

Features

  • Feed Messaging
  • Chat Messages
  • DTN - Delay Tolerant Network
Versions

Find the latest versions by id

Information - Updated Jun 22, 2022

Stars: 236
Forks: 36
Issues: 28

Repositories & Extras

SUPER Android Analyzer

Secure, Unified, Powerful and Extensible Rust Android Analyzer

SUPER Android Analyzer

Rust core for native Android and iOS apps

The Android build contains a wrapper library, which is imported in the Android app with Carthage

Rust core for native Android and iOS apps

cargo-ndk - Build Rust code for Android

This cargo extension handles all the environment configuration needed for successfully building libraries

cargo-ndk - Build Rust code for Android

Very simple command line tool to setup configuration for android native binaries

If you want to use native binary in your android project, and you don't like to write it in C/C++, writting in rust can be...

Very simple command line tool to setup configuration for android native binaries

Rust bindings for Oboe library

Oboe High-Performance Audio library for Android

Rust bindings for Oboe library

The answer to "how do I use Rust on iOS and Android?"

cargo-mobile takes care of generating Xcode and Android Studio project files, building and running on device, generating project boilerplate, and a few other things!

The answer to "how do I use Rust on iOS and Android?"

EndToEnd Anonymus chatting app

With Rust Backend and Android support

EndToEnd Anonymus chatting app

swapi-rust-mobile

Crossplatform mobile solution based on Rust for IOS & Android

swapi-rust-mobile
Facebook Instagram Twitter GitHub Dribbble
Privacy