You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.4 KiB
91 lines
3.4 KiB
# Signal Group User Activity
|
|
|
|
"How active is each user in the signal groups I'm in?"
|
|
|
|
This project reads the configuration directory from the Signal for Desktop app
|
|
and generates a spreadsheet that looks like this:
|
|
|
|
| | Alice | Bob | ... |
|
|
|------------------|-------|-----| ----|
|
|
| Neighborhod Chat | 1 | 5 | ... |
|
|
| Roomate Chat | 12 | 0 | ... |
|
|
| ... | ... | ... | ... |
|
|
|
|
Each cell is the total message count for a user in a chat.
|
|
|
|
The goal is to afford distributed collection of group participation metadata
|
|
from a community that uses disparate signal groups. No one member of the
|
|
community is a member of every signal group, so we need to make use of multiple
|
|
users' signal data.
|
|
|
|
I personally would not at all feel comfortable sending someone my decrypted
|
|
signal database, so I implemented this as a dockerized python command line tool
|
|
that runs locally. It generates a simple csv file that's easily inspectable
|
|
before sharing.
|
|
|
|
## Usage
|
|
|
|
### Build the container
|
|
|
|
First build the docker container for the tool. You should do this once every
|
|
time you pull from the repo again.
|
|
|
|
$ ./build.sh
|
|
Sending build context to Docker daemon 716.3kB
|
|
Step 1/12 : FROM archlinux:base-20241110.0.278197
|
|
---> 8f94599caa7b
|
|
[...]
|
|
Successfully built 1c3e3a1b45f5
|
|
Successfully tagged sigint:latest
|
|
|
|
|
|
### Run the tool
|
|
|
|
The following command will run the analysis against the signal config directory
|
|
you point it to, and dump the output to ./output/table.csv
|
|
|
|
#### Linux
|
|
|
|
$ ./run.sh -c ~/.config/Signal
|
|
|
|
INFO:main:writing message count table to /output/table.csv
|
|
|
|
#### Macos
|
|
|
|
$ ./run.sh -c ~/Library/Application\ Support/Signal
|
|
|
|
INFO:main:writing message count table to /output/table.csv
|
|
|
|
#### Providing a Password
|
|
|
|
If you get the following error while running the command:
|
|
|
|
Exception: you must use the -p option to pass the password in for your signal db
|
|
|
|
Then you need to find the `Signal Safe Storage` [^1] entry in your keychain (on
|
|
macos) and pass that as an argument to the script:
|
|
|
|
$ ./run.sh -c ~/Library/Application\ Support/Signal -p YOURPASSWORD
|
|
|
|
### Group Filtering
|
|
|
|
Adding -f will filter the groups under consideration to only those listed in
|
|
config/chat_list.txt
|
|
|
|
$ ./run.sh -c ~/.config/Signal -f
|
|
|
|
You might want to run the command once without filtering, then paste the chat
|
|
name column from the spreadsheet into config/chat_list.txt and narrow down to
|
|
only the ones you care about and run it again with -f. This will ensure the
|
|
output spreadsheet only has columns for users in the groups you care about, and
|
|
not every single user you ever saw on Signal.
|
|
|
|
[^1]: [after some alarmist press](https://candid.technology/signal-encryption-key-flaw-desktop-app-fixed/)
|
|
about Signal Desktop not encrypting data at rest securely, they
|
|
[switched to using](https://github.com/signalapp/Signal-Desktop/issues/6944#issuecomment-2243704263)
|
|
Electron's [safe storage api](https://www.electronjs.org/docs/latest/api/safe-storage)
|
|
which automatically creates a per-application private key when used, and
|
|
stores that key in the OS keychain. I found the docs to be lacking on
|
|
details but [this blogpost](https://control-plane.io/posts/abusing-vscode-from-malicious-extensions-to-stolen-credentials-part-2/#electron-safestorage)
|
|
and [this gist](https://gist.github.com/flatz/3f242ab3c550d361f8c6d031b07fb6b1) were both helpful.
|