2
0
mirror of https://github.com/ComradCollective/Comrad synced 2024-11-11 13:10:45 +00:00

renaming in comrad?

This commit is contained in:
quadrismegistus 2020-09-29 14:09:56 +01:00
parent 31536499ea
commit e56ef03e65
134 changed files with 591 additions and 908 deletions

View File

@ -1,6 +1,6 @@
ANTI-CAPITALIST SOFTWARE LICENSE (v 1.4)
Copyright © 2020 Komrades
Copyright © 2020 Comrads
This is anti-capitalist software, released for free use by individuals and organizations that do not operate by capitalist principles.

View File

@ -1,6 +1,6 @@
# Komrade
# Comrad
Komrade is a socialist network. It seizes the means of digital production.
Comrad is a socialist network. It seizes the means of digital production.
## Why another social network?
@ -16,7 +16,7 @@ All of your data are strongly encrypted end-to-end: only you and those you write
### Untraceable
All network traffic is routed through Tor, a "deep web" of computers so dense even the FBI can't follow you through it. Komrade's "Operator" or central server is accessible only from Tor. It's impossible to tell who is sending what to whom, or even who is using the app at all.
All network traffic is routed through Tor, a "deep web" of computers so dense even the FBI can't follow you through it. Comrad's "Operator" or central server is accessible only from Tor. It's impossible to tell who is sending what to whom, or even who is using the app at all.
### Unmonetizable
@ -28,7 +28,7 @@ Group accounts or 'collectives', like @portland or @socialists, grow as existing
### (Semi-)decentralized
Data is deleted as soon as possible from Komrade. Komrade's "Operator" simply sorts and holds the mail temporarily: as soon as users log in to download their mail, the messages are deleted from the server and network forever.
Data is deleted as soon as possible from Comrad. Comrad's "Operator" simply sorts and holds the mail temporarily: as soon as users log in to download their mail, the messages are deleted from the server and network forever.
### Anti-profit
@ -67,19 +67,19 @@ We present a simplified set of social media features drawn from everything that'
## How is this different from ...?
See ["Comparison of alternative social networks" on the wiki](https://github.com/Komrade/Komrade/wiki/Comparison-of-alternative-social-networks) for an attempt at a systematic comparison. (And please help edit, if you can! The data there is a little incomplete and probably a little inaccurate.) But here are some imagined differences:
See ["Comparison of alternative social networks" on the wiki](https://github.com/Comrad/Comrad/wiki/Comparison-of-alternative-social-networks) for an attempt at a systematic comparison. (And please help edit, if you can! The data there is a little incomplete and probably a little inaccurate.) But here are some imagined differences:
* **It's not (fully) decentralized.** Who's afraid of a little central planning? In contrast to [Secure Scuttlebutt](https://scuttlebutt.nz/) and [Cabal Chat](https://cabal.chat/), which are 100% decentralized, subsisting only through peer-to-peer connections, Komrade sticks with the old, client/server model. Why?
* **It's not (fully) decentralized.** Who's afraid of a little central planning? In contrast to [Secure Scuttlebutt](https://scuttlebutt.nz/) and [Cabal Chat](https://cabal.chat/), which are 100% decentralized, subsisting only through peer-to-peer connections, Comrad sticks with the old, client/server model. Why?
* **It *is* anonymous.** Because P2P networks almost always expose your IP address: they privilege decentralization over anonymity -- and, potentially, safety. By contrast, lying hidden within the deep web of Tor, accessible only from this application and its built-in Tor client, Komrade will never reveal who is accessing it and its encrypted information. This is important for komrades organizing protests against the surveillance state, and to protect our social media traffic from being harvested and monetized by surveillance capitalism.
* **It *is* anonymous.** Because P2P networks almost always expose your IP address: they privilege decentralization over anonymity -- and, potentially, safety. By contrast, lying hidden within the deep web of Tor, accessible only from this application and its built-in Tor client, Comrad will never reveal who is accessing it and its encrypted information. This is important for comrads organizing protests against the surveillance state, and to protect our social media traffic from being harvested and monetized by surveillance capitalism.
* **It's 100% end-to-end encrypted.** Unlike [Mastodon](https://joinmastodon.org/) or [Diaspora](https://diasporafoundation.org/), direct messages between users and within groups remain encrypted 1:1 end-to-end among users. Posts to the public are encrypted to @komrades, a special account which automatically re-encrypts its messages back to any key-registered requester of them.
* **It's 100% end-to-end encrypted.** Unlike [Mastodon](https://joinmastodon.org/) or [Diaspora](https://diasporafoundation.org/), direct messages between users and within groups remain encrypted 1:1 end-to-end among users. Posts to the public are encrypted to @comrads, a special account which automatically re-encrypts its messages back to any key-registered requester of them.
* **It verifies identities.** Komrade's server, "The Operator", keeps a permanent record of one thing only: every komrade's name and public key, and requires that new komrades choose a unique name. Whenever you send or receive mail, the Operator will make sure that the name and public key on the letter matches what it has on file, verifying the identity of both parties.
* **It verifies identities.** Comrad's server, "The Operator", keeps a permanent record of one thing only: every comrad's name and public key, and requires that new comrads choose a unique name. Whenever you send or receive mail, the Operator will make sure that the name and public key on the letter matches what it has on file, verifying the identity of both parties.
* **It's (semi-)ephemeral.** Data, like all natural things, should not last forever. Direct messages auto-delete from the server as soon as they are downloaded. Group messages are sent as direct messages through the "web of trust" of the group membership network. Posts to the world auto-delete in however many days you specify. By contrast, data on both [SSB](https://scuttlebutt.nz/) and [Matrix](https://matrix.org/) is undeletable.
* **It's easy to use.** No invitation or server is needed on startup, unlike [SSB](https://scuttlebutt.nz/), [Mastodon](https://joinmastodon.org/), [Diaspora](https://diasporafoundation.org/), or [Briar](https://briarproject.org/). It's basically a Twitter clone, but one where you can also post to a universal feed shared by the entire world (@komrades), so that you can make yourself known, participate in general discussions, find new contacts, and organize new groups.
* **It's easy to use.** No invitation or server is needed on startup, unlike [SSB](https://scuttlebutt.nz/), [Mastodon](https://joinmastodon.org/), [Diaspora](https://diasporafoundation.org/), or [Briar](https://briarproject.org/). It's basically a Twitter clone, but one where you can also post to a universal feed shared by the entire world (@comrads), so that you can make yourself known, participate in general discussions, find new contacts, and organize new groups.
@ -90,30 +90,30 @@ See ["Comparison of alternative social networks" on the wiki](https://github.com
#### Registering and connecting through Tor
<img src="komrade/app/assets/komrade-screen-preview-2020-09-27.gif" alt="GIF animation" height="600" />
<img src="comrad/app/assets/comrad-screen-preview-2020-09-27.gif" alt="GIF animation" height="600" />
#### Navigating posts
<img src="komrade/app/assets/komrade-screen-preview-2020-08-23.gif" alt="GIF animation" height="600" />
<img src="comrad/app/assets/comrad-screen-preview-2020-08-23.gif" alt="GIF animation" height="600" />
### Animations from terminal app
#### Connecting through Tor
<img src="komrade/app/assets/komrade-terminal-preview--2020-09-20--tor.gif" alt="GIF animation of Tor connection" />
<img src="comrad/app/assets/comrad-terminal-preview--2020-09-20--tor.gif" alt="GIF animation of Tor connection" />
#### "Meeting" (exchanging public keys)
<img src="komrade/app/assets/komrade-terminal-preview--2020-09-16--meet.gif" alt="GIF animation of meeting process" />
<img src="comrad/app/assets/comrad-terminal-preview--2020-09-16--meet.gif" alt="GIF animation of meeting process" />
#### Messaging
<img src="komrade/app/assets/komrade-terminal-preview--2020-09-16--msg.gif" alt="GIF animation of messaging" />
<img src="comrad/app/assets/comrad-terminal-preview--2020-09-16--msg.gif" alt="GIF animation of messaging" />
### Posting
<img src="komrade/app/assets/komrade-terminal-preview--2020-09-19--posting.gif" alt="GIF animation of posting" />
<img src="comrad/app/assets/comrad-terminal-preview--2020-09-19--posting.gif" alt="GIF animation of posting" />
## Usage
@ -122,17 +122,17 @@ See ["Comparison of alternative social networks" on the wiki](https://github.com
#### ...on Mac OSX
Download and run [this installer](https://github.com/Komrade/Komrade/raw/master/script/InstallKomrade.app.zip).
Download and run [this installer](https://github.com/Comrad/Comrad/raw/master/script/InstallComrad.app.zip).
#### ...on Linux or Windows
Open a terminal in Linux, or a [Cygwin shell](https://cygwin.com/install.html) in Windows, and copy and paste the following line into it:
```
bash <(curl -s https://komrade.app/run)
bash <(curl -s https://comrad.app/run)
```
[That](https://komrade.app/run)'s a shortcut to [this auto-installer script](https://github.com/Komrade/Komrade/blob/master/script/install). It installs Komrade in a virtual Python environment in the folder "komrade" in your home directory.
[That](https://comrad.app/run)'s a shortcut to [this auto-installer script](https://github.com/Comrad/Comrad/blob/master/script/install). It installs Comrad in a virtual Python environment in the folder "comrad" in your home directory.
### Run
@ -140,7 +140,7 @@ bash <(curl -s https://komrade.app/run)
Install [as above](#on-mac-osx).
Run "Komrade.app" in your Applications folder.
Run "Comrad.app" in your Applications folder.
#### ...on Linux or Windows
@ -148,23 +148,23 @@ Run "Komrade.app" in your Applications folder.
Open a terminal in Linux, or a [Cygwin shell](https://cygwin.com/install.html) in Windows, and type:
```
komrade-app
comrad-app
```
If that doesn't work, try:
```
~/komrade/code/bin/komrade-app
~/comrad/code/bin/comrad-app
```
If that still doesn't work, try pasting the following lines:
```
source ~/komrade/lib/miniconda3/etc/profile.d/conda.sh
export PATH="~/komrade/lib/miniconda3/bin:$PATH"
conda activate ~/komrade/code/venv
python -m pip install -r ~/komrade/code/requirements.txt
python ~/komrade/code/komrade/app/main.py
source ~/comrad/lib/miniconda3/etc/profile.d/conda.sh
export PATH="~/comrad/lib/miniconda3/bin:$PATH"
conda activate ~/comrad/code/venv
python -m pip install -r ~/comrad/code/requirements.txt
python ~/comrad/code/comrad/app/main.py
```
#### Running terminal client
@ -172,17 +172,17 @@ python ~/komrade/code/komrade/app/main.py
For the terminal client (which may be broken at the moment), run:
```
komrade-cli # or: ~/komrade/code/bin/komrade-cli
comrad-cli # or: ~/comrad/code/bin/comrad-cli
```
or, if necessary, paste the following lines:
```
source ~/komrade/lib/miniconda3/etc/profile.d/conda.sh
export PATH="~/komrade/lib/miniconda3/bin:$PATH"
conda activate ~/komrade/code/venv
python -m pip install -r ~/komrade/code/requirements.txt
python ~/komrade/code/komrade/cli/cli.py
source ~/comrad/lib/miniconda3/etc/profile.d/conda.sh
export PATH="~/comrad/lib/miniconda3/bin:$PATH"
conda activate ~/comrad/code/venv
python -m pip install -r ~/comrad/code/requirements.txt
python ~/comrad/code/comrad/cli/cli.py
```
#### Running server (development only)
@ -191,17 +191,17 @@ python ~/komrade/code/komrade/cli/cli.py
To run The Operator server (for development purposes only), run:
```
komrade-op # or: ~/komrade/code/bin/komrade-op
comrad-op # or: ~/comrad/code/bin/comrad-op
```
or, if necessary, paste the following lines:
```
source ~/komrade/lib/miniconda3/etc/profile.d/conda.sh
export PATH="~/komrade/lib/miniconda3/bin:$PATH"
conda activate ~/komrade/code/venv
python -m pip install -r ~/komrade/code/requirements.txt
python ~/komrade/code/komrade/backend/switchboard.py
source ~/comrad/lib/miniconda3/etc/profile.d/conda.sh
export PATH="~/comrad/lib/miniconda3/bin:$PATH"
conda activate ~/comrad/code/venv
python -m pip install -r ~/comrad/code/requirements.txt
python ~/comrad/code/comrad/backend/switchboard.py
```
@ -211,17 +211,17 @@ python ~/komrade/code/komrade/backend/switchboard.py
#### Mobile/desktop
The mobile/desktop app is made with [KivyMD](https://github.com/kivymd/KivyMD), a variant of [Kivy](https://kivy.org/), a cross-platform app development framework in Python. Python is an easy and versatile progamming language to learn, which keeps the code accessible to as many people as possible. Code for the app is in [komrade/app](komrade/app).
The mobile/desktop app is made with [KivyMD](https://github.com/kivymd/KivyMD), a variant of [Kivy](https://kivy.org/), a cross-platform app development framework in Python. Python is an easy and versatile progamming language to learn, which keeps the code accessible to as many people as possible. Code for the app is in [comrad/app](comrad/app).
#### Terminal app
Vanilla Python. Code is in [komrade/cli](komrade/cli).
Vanilla Python. Code is in [comrad/cli](comrad/cli).
### Backend
#### API
Plain old object-oriented code in Python. The root entity is a "Keymaker": anyone from @Telephone, to @Operator, to users, to groups, who has a public/private key pair. The database uses a simple file-based key-value store using the Redis protocol: [rlite](https://github.com/seppo0010/rlite), via its [rlite-py](https://github.com/seppo0010/rlite-py) Python bindings. All code for backend/API is in [komrade/backend](komrade/backend).
Plain old object-oriented code in Python. The root entity is a "Keymaker": anyone from @Telephone, to @Operator, to users, to groups, who has a public/private key pair. The database uses a simple file-based key-value store using the Redis protocol: [rlite](https://github.com/seppo0010/rlite), via its [rlite-py](https://github.com/seppo0010/rlite-py) Python bindings. All code for backend/API is in [comrad/backend](comrad/backend).
#### Cryptography
@ -229,9 +229,9 @@ We are using [Themis](https://github.com/cossacklabs/themis), a high-level cross
Crypto-related code is primarily in:
* [komrade/backend/keymaker.py](komrade/backend/keymaker.py)
* [comrad/backend/keymaker.py](comrad/backend/keymaker.py)
* [komrade/backend/komrades.py](komrade/backend/komrades.py)
* [comrad/backend/comrads.py](comrad/backend/comrads.py)
* [komrade/backend/phonelines.py](komrade/backend/phonelines.py)
* [comrad/backend/phonelines.py](comrad/backend/phonelines.py)

View File

@ -1,6 +1,6 @@
path_conda="`realpath ~/komrade/lib/miniconda3`"
path_venv="`realpath ~/komrade/code/venv`"
path_repo="`realpath ~/komrade/code`"
path_conda="`realpath ~/comrad/lib/miniconda3`"
path_venv="`realpath ~/comrad/code/venv`"
path_repo="`realpath ~/comrad/code`"
source $path_conda/etc/profile.d/conda.sh
export PATH="$path_conda/bin:$PATH"

View File

@ -14,8 +14,8 @@ if [ ! "$y_n" = "y" ]; then
else
rm -r $path
#echo "Reregistering..."
#komrade-cli /register
#comrad-cli /register
cd $path_code
python -c "from komrade import *; create_phonelines()"
komrade-update
python -c "from comrad import *; create_phonelines()"
comrad-update
fi

View File

@ -10,12 +10,12 @@ realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
path_conda="`realpath ~/komrade/lib/miniconda3`"
path_venv="`realpath ~/komrade/code/venv`"
path_repo="`realpath ~/komrade/code`"
path_conda="`realpath ~/comrad/lib/miniconda3`"
path_venv="`realpath ~/comrad/code/venv`"
path_repo="`realpath ~/comrad/code`"
source $path_conda/etc/profile.d/conda.sh
export PATH=\"$path_conda/bin:\$PATH\"
conda activate $path_venv
python -m pip install -r $path_repo/requirements.txt
python $path_repo/komrade/app/main.py
python $path_repo/comrad/app/main.py

View File

@ -7,12 +7,12 @@ realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
path_conda="`realpath ~/komrade/lib/miniconda3`"
path_venv="`realpath ~/komrade/code/venv`"
path_repo="`realpath ~/komrade/code`"
path_conda="`realpath ~/comrad/lib/miniconda3`"
path_venv="`realpath ~/comrad/code/venv`"
path_repo="`realpath ~/comrad/code`"
source $path_conda/etc/profile.d/conda.sh
export PATH="$path_conda/bin:$PATH"
conda activate $path_venv
python -m pip install -r $path_repo/requirements.txt
python $path_repo/komrade/cli/cli.py
python $path_repo/comrad/cli/cli.py

View File

@ -7,13 +7,13 @@ realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
path_conda="`realpath ~/komrade/lib/miniconda3`"
path_venv="`realpath ~/komrade/code/venv`"
path_repo="`realpath ~/komrade/code`"
path_conda="`realpath ~/comrad/lib/miniconda3`"
path_venv="`realpath ~/comrad/code/venv`"
path_repo="`realpath ~/comrad/code`"
source $path_conda/etc/profile.d/conda.sh
export PATH="$path_conda/bin:$PATH"
conda activate $path_venv
python -m pip install -r $path_repo/requirements.txt
python $path_repo/komrade/backend/switchboard.py
python $path_repo/comrad/backend/switchboard.py

View File

@ -13,5 +13,5 @@ if [ ! "$y_n" = "y" ]; then
else
rm -r $path
#echo "Reregistering..."
#komrade-cli /register
#comrad-cli /register
fi

View File

@ -5,6 +5,6 @@ path=`realpath "$SCRIPTPATH/.."`
cd $path
git pull
git add .
git commit -m 'komrade update!'
git commit -m 'comrad update!'
git push
cd $wd

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 286 KiB

View File

Before

Width:  |  Height:  |  Size: 591 KiB

After

Width:  |  Height:  |  Size: 591 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 159 KiB

View File

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 243 KiB

View File

Before

Width:  |  Height:  |  Size: 333 KiB

After

Width:  |  Height:  |  Size: 333 KiB

View File

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 276 KiB

View File

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 276 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 568 KiB

After

Width:  |  Height:  |  Size: 568 KiB

View File

Before

Width:  |  Height:  |  Size: 9.7 MiB

After

Width:  |  Height:  |  Size: 9.7 MiB

View File

Before

Width:  |  Height:  |  Size: 9.7 MiB

After

Width:  |  Height:  |  Size: 9.7 MiB

View File

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 398 KiB

View File

Before

Width:  |  Height:  |  Size: 384 KiB

After

Width:  |  Height:  |  Size: 384 KiB

View File

Before

Width:  |  Height:  |  Size: 9.7 MiB

After

Width:  |  Height:  |  Size: 9.7 MiB

View File

Before

Width:  |  Height:  |  Size: 9.7 MiB

After

Width:  |  Height:  |  Size: 9.7 MiB

View File

Before

Width:  |  Height:  |  Size: 9.7 MiB

After

Width:  |  Height:  |  Size: 9.7 MiB

View File

Before

Width:  |  Height:  |  Size: 491 KiB

After

Width:  |  Height:  |  Size: 491 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 7.1 MiB

After

Width:  |  Height:  |  Size: 7.1 MiB

View File

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

Before

Width:  |  Height:  |  Size: 6.4 MiB

After

Width:  |  Height:  |  Size: 6.4 MiB

View File

Before

Width:  |  Height:  |  Size: 1022 KiB

After

Width:  |  Height:  |  Size: 1022 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 651 KiB

After

Width:  |  Height:  |  Size: 651 KiB

View File

Before

Width:  |  Height:  |  Size: 504 KiB

After

Width:  |  Height:  |  Size: 504 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

Before

Width:  |  Height:  |  Size: 2.9 MiB

After

Width:  |  Height:  |  Size: 2.9 MiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 469 KiB

After

Width:  |  Height:  |  Size: 469 KiB

View File

Before

Width:  |  Height:  |  Size: 923 KiB

After

Width:  |  Height:  |  Size: 923 KiB

View File

Before

Width:  |  Height:  |  Size: 491 KiB

After

Width:  |  Height:  |  Size: 491 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 224 KiB

View File

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 151 KiB

View File

Before

Width:  |  Height:  |  Size: 246 KiB

After

Width:  |  Height:  |  Size: 246 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 202 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -3,7 +3,7 @@
#(needs to be external to allow tor routing)
from config import *
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
import logging
logger=logging.getLogger(__name__)
@ -60,6 +60,7 @@ sys.path.append("..") # Adds higher directory to python modules path.
from kivy.event import *
import threading,asyncio,sys
from requests.exceptions import ReadTimeout
# raise Exception(str(Window.size))
Window.size = WINDOW_SIZE
@ -100,19 +101,19 @@ class MyLayout(MDBoxLayout):
def refresh(self,*x,**yy):
async def go():
if not hasattr(self.app,'is_logged_in') or not self.app.is_logged_in or not hasattr(self.app,'komrade') or not self.app.komrade:
if not hasattr(self.app,'is_logged_in') or not self.app.is_logged_in or not hasattr(self.app,'comrad') or not self.app.comrad:
self.change_screen('login')
self.app.log('changing screen???')
return None
logger.info(f'REFRESH: {self.app.is_logged_in}, {self.app.komrade.name}')
logger.info(f'REFRESH: {self.app.is_logged_in}, {self.app.comrad.name}')
self.app.log('<--',x,yy)
if not hasattr(self.app,'map') or not self.app.map:
from komrade.app.screens.map import MapWidget
from comrad.app.screens.map import MapWidget
self.app.map=MapWidget()
self.app.map.open()
await self.app.komrade.get_updates()
await self.app.comrad.get_updates()
self.app.map.dismiss()
self.app.map=None
asyncio.create_task(go())
@ -120,7 +121,7 @@ class MyLayout(MDBoxLayout):
from komrade.app.screens.dialog import MDDialog2
from comrad.app.screens.dialog import MDDialog2
@ -172,11 +173,11 @@ class TextInputPopupCard(MDDialog2):
return self.response
def __init__(self,msg,password=False,input_name='',komrade_name='',*x,**y):
def __init__(self,msg,password=False,input_name='',comrad_name='',*x,**y):
self.ok_to_continue=False
self.response=None
title=msg
from komrade.app.screens.login.login import UsernameField,PasswordField,UsernameLayout,UsernameLabel
from comrad.app.screens.login.login import UsernameField,PasswordField,UsernameLayout,UsernameLabel
self.layout=MDBoxLayout()
self.layout.orientation='vertical'
@ -407,7 +408,7 @@ def route(uri):
# DEFAULT_SCREEN = route(DEFAULT_URI)
class MainApp(MDApp, Logger):
title = 'Komrade'
title = 'Comrad'
logged_in=False
login_expiry = 60 * 60 * 24 * 7 # once a week
texture = ObjectProperty()
@ -424,7 +425,7 @@ class MainApp(MDApp, Logger):
@property
def crypt(self):
if not hasattr(self,'_crypt'):
from komrade.backend.crypt import Crypt
from comrad.backend.crypt import Crypt
self._crypt = Crypt(
fn=PATH_CRYPT_CA_DATA,
encrypt_values=False,
@ -437,7 +438,7 @@ class MainApp(MDApp, Logger):
self.loop=asyncio.get_event_loop()
# connect to API
self.komrade=None
self.comrad=None
self._name=''
@ -471,13 +472,13 @@ class MainApp(MDApp, Logger):
ipinfo_access_token = '90df1baf7c373a'
self.ipinfo_handler = ipinfo.getHandler(ipinfo_access_token)
from komrade.app.screens.map import MapWidget
from comrad.app.screens.map import MapWidget
self.map = MapWidget()
return self.root
# def boot(self,username):
# kommie = Komrade(username)
# kommie = Comrad(username)
# if self.exists_locally_as_contact()
@property
@ -490,21 +491,25 @@ class MainApp(MDApp, Logger):
async def callback_on_hop(self,rtr):
if not hasattr(self,'hops'): self.hops=[]
if not hasattr(self,'map') or not self.map:
from komrade.app.screens.map import MapWidget
from comrad.app.screens.map import MapWidget
self.map=MapWidget()
if not self.map.opened:
self.map.open()
# self.map.draw()
deets = self.ipinfo_handler.getDetails(rtr.ip)
self.hops.append((rtr,deets))
lat,long=tuple(float(_) for _ in deets.loc.split(','))
flag=f'{deets.city}, {deets.country_name} ({rtr.nickname})'
self.map.add_point(lat,long,flag)
self.map.draw()
# await asyncio.sleep(2)
# logger.info('CALLBACK ON HOP: ' + flag)
try:
deets = self.ipinfo_handler.getDetails(rtr.ip)
self.hops.append((rtr,deets))
lat,long=tuple(float(_) for _ in deets.loc.split(','))
flag=f'{deets.city}, {deets.country_name} ({rtr.nickname})'
self.map.add_point(lat,long,flag)
self.map.draw()
# await asyncio.sleep(2)
# logger.info('CALLBACK ON HOP: ' + flag)
except ReadTimeout as e:
self.log('!! read time out:',e)
return
def load_store(self):
if not self.store.exists('user'): return
@ -605,15 +610,15 @@ class MainApp(MDApp, Logger):
@property
def keys(self):
contacts_obj = self.komrade.contacts()
contacts_obj = self.comrad.contacts()
contacts = [p.name for p in contacts_obj]
return contacts
async def get_post(self,post_id):
return self.komrade.read_post()
return self.comrad.read_post()
def get_posts(self,uri=b'/inbox/world'):
return self.komrade.posts()
return self.comrad.posts()
async def get_channel_posts(self,channel,prefix='inbox'):
@ -630,7 +635,7 @@ class MainApp(MDApp, Logger):
return await self.get_channel_posts(channel=channel,prefix='outbox')
async def get_my_posts(self):
return await self.komrade.posts()
return await self.comrad.posts()
@ -663,17 +668,17 @@ class MainApp(MDApp, Logger):
self.dialog.open()
#stop
async def get_input(self,msg,komrade_name='Telephone',get_pass=False,yesno=False,**y):
from komrade.app.screens.feed.feed import PostCardInputPopup
async def get_input(self,msg,comrad_name='Telephone',get_pass=False,yesno=False,**y):
from comrad.app.screens.feed.feed import PostCardInputPopup
if hasattr(self,'msg_dialog') and self.msg_dialog:# and hasattr(self.msg_dialog,'card') and self.msg_dialog.card:
self.msg_dialog0=self.msg_dialog
self.msg_dialog0.dismiss()
self.msg_dialog0=None
if yesno:
self.msg_dialog = BooleanInputPopupCard(msg,komrade_name=komrade_name,**y)
self.msg_dialog = BooleanInputPopupCard(msg,comrad_name=comrad_name,**y)
else:
self.msg_dialog = TextInputPopupCard(msg,password=get_pass,komrade_name=komrade_name,**y)
self.msg_dialog = TextInputPopupCard(msg,password=get_pass,comrad_name=comrad_name,**y)
response = await self.msg_dialog.open()
logger.info(f'get_input got user response {response}')
@ -684,8 +689,8 @@ class MainApp(MDApp, Logger):
return response
async def ring_ring(self,*x,kommie=None,**y):
if not kommie: kommie=self.komrade
from komrade.app.screens.map import MapWidget
if not kommie: kommie=self.comrad
from comrad.app.screens.map import MapWidget
self.map=MapWidget()
self.map.open()
resp_msg_d = await kommie.ring_ring(*x,**y)
@ -696,8 +701,8 @@ class MainApp(MDApp, Logger):
async def get_updates(self,*x,kommie=None,**y):
if not kommie: kommie=self.komrade
from komrade.app.screens.map import MapWidget
if not kommie: kommie=self.comrad
from comrad.app.screens.map import MapWidget
self.map=MapWidget()
self.map.open()
await kommie.get_updates(*x,**y)
@ -707,8 +712,8 @@ class MainApp(MDApp, Logger):
async def stat(self,msg,komrade_name='Telephone',pause=False,get_pass=False,**y):
from komrade.app.screens.feed.feed import PostCard,PostCardPopup
async def stat(self,msg,comrad_name='Telephone',pause=False,get_pass=False,**y):
from comrad.app.screens.feed.feed import PostCard,PostCardPopup
if hasattr(self,'msg_dialog') and self.msg_dialog:# and hasattr(self.msg_dialog,'card') and self.msg_dialog.card:
self.msg_dialog0=self.msg_dialog
self.msg_dialog0.dismiss()
@ -720,7 +725,7 @@ class MainApp(MDApp, Logger):
# self.msg_dialog.ids.msg_label.text=msg
self.msg_dialog.card = postcard = PostCardPopup({
'author':komrade_name,
'author':comrad_name,
'author_prefix':'@',
'to_name':'me',
'content':msg,

View File

@ -5,7 +5,7 @@ from kivymd.uix.label import MDLabel
from kivy.app import App
import asyncio
from kivymd.uix.dialog import MDDialog
from komrade.app.screens.dialog import MDDialog2
from comrad.app.screens.dialog import MDDialog2
### Layout
@ -49,7 +49,7 @@ class BaseScreen(MDScreen):
class ProtectedScreen(BaseScreen):
def on_pre_enter(self):
super().on_pre_enter()
if not hasattr(self.app,'is_logged_in') or not self.app.is_logged_in or not hasattr(self.app,'komrade') or not self.app.komrade:
if not hasattr(self.app,'is_logged_in') or not self.app.is_logged_in or not hasattr(self.app,'comrad') or not self.app.comrad:
self.root.change_screen('login')
self.log('changing screen???')
return None

View File

@ -1,5 +1,5 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
from kivymd.uix.label import MDLabel
@ -284,7 +284,7 @@ class FeedScreen(ProtectedScreen):
if self.app.map:
self.app.map.dismiss()
self.root.remove_widget(self.app.map)
if not hasattr(self,'get_posts'): self.get_posts=self.app.komrade.posts
if not hasattr(self,'get_posts'): self.get_posts=self.app.comrad.posts
for post in self.posts:
self.ids.post_carousel.remove_widget(post)

View File

@ -44,7 +44,7 @@
# md_bg_color:1,1,0,1
<WelcomeLabel>:
# text: 'Enter, Komrade'
# text: 'Enter, Comrad'
halign: 'center'
size_hint_x: 1
theme_text_color: 'Custom'

View File

@ -1,5 +1,5 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
from screens.base import *
from kivymd.uix.boxlayout import *
from kivymd.uix.textfield import *
@ -69,7 +69,7 @@ class LoginScreen(BaseScreen):
self.layout_username = UsernameLayout()
self.label_username = UsernameLabel(text="Komrade @")
self.label_username = UsernameLabel(text="Comrad @")
self.username_field = UsernameField()
self.username_field.line_color_focus=rgb(*COLOR_TEXT)
@ -163,7 +163,7 @@ class LoginScreen(BaseScreen):
return self.password_field.text if not passphrase else passphrase
async def boot(self,un,pw=None):
# await self.stat('hello',img_src='/home/ryan/komrade/data/contacts/marxxx.png',komrade_name='Keymaker')
# await self.stat('hello',img_src='/home/ryan/comrad/data/contacts/marxxx.png',comrad_name='Keymaker')
# await self.app.get_input('hello?',get_pass=True,title='gimme your passwrdd')
# await self.app.get_input('hello?',get_pass=False,title='gimme your fav color bitch')
@ -191,10 +191,10 @@ class LoginScreen(BaseScreen):
# return
name=un
from komrade.backend import Komrade
from comrad.backend import Comrad
kommie = Komrade(un)
kommie = Comrad(un)
self.log('KOMMIE!?!?',kommie)
self.log('wtf',PATH_CRYPT_CA_KEYS)
@ -208,10 +208,10 @@ class LoginScreen(BaseScreen):
# self.login_status.text='You should be able to log into this account.'
if kommie.privkey:
logger.info(f'passkey login succeeded')
self.login_status.text=f'Welcome back, Komrade @{un}'
self.login_status.text=f'Welcome back, Comrad @{un}'
self.app.is_logged_in=True
self.app.username=kommie.name
self.app.komrade=kommie
self.app.comrad=kommie
self.root.change_screen('feed')
else:
logger.info(f'passkey login failed')
@ -221,12 +221,12 @@ class LoginScreen(BaseScreen):
# self.layout.add_widget(self.layout_password)
elif kommie.exists_locally_as_contact():
await self.app.stat('This is a contact of yours')
self.login_status.text='Komrade exists as a contact of yours.'
self.login_status.text='Comrad exists as a contact of yours.'
# self.app.change_screen('feed')
self.app.change_screen('login')
else:
# await self.app.stat('Account does not exist on hardware, maybe not on server. Try to register?')
# self.login_status.text='Komrade not known on this device. Registering...'
# self.login_status.text='Comrad not known on this device. Registering...'
### REGISTER
self.remove_widget(self.layout)
@ -236,7 +236,7 @@ class LoginScreen(BaseScreen):
self.login_status.text='Registered'
self.app.is_logged_in=True
self.app.username=kommie.name
self.app.komrade=kommie
self.app.comrad=kommie
self.remove_widget(self.layout)
self.app.change_screen('feed')
else:
@ -247,10 +247,10 @@ class LoginScreen(BaseScreen):
async def register(self,name):
async def logfunc(*x,**y):
if not 'komrade_name' in y: y['komrade_name']='Keymaker'
if not 'comrad_name' in y: y['comrad_name']='Keymaker'
await self.app.stat(*x,**y)
kommie = Komrade(name)
kommie = Comrad(name)
# already have it?
if kommie.exists_locally_as_account():
@ -259,31 +259,31 @@ class LoginScreen(BaseScreen):
return {'success':False, 'status':'This is already a contact of yours'}
#
await logfunc(f'Hello, this is Komrade @{name}. I would like to join the socialist network.',pause=True,komrade_name=name)
await logfunc(f'Hello, this is Comrad @{name}. I would like to join the socialist network.',pause=True,comrad_name=name)
await logfunc(f'Welcome, Komrade @{name}. To help us communicate safely, I have cut for you a matching pair of encryption keys.',pause=True,clear=True,komrade_name='Keymaker')
await logfunc(f'Welcome, Comrad @{name}. To help us communicate safely, I have cut for you a matching pair of encryption keys.',pause=True,clear=True,comrad_name='Keymaker')
# ## 2) Make pub public/private keys
from komrade.backend.keymaker import KomradeAsymmetricKey
from komrade.cli.artcode import ART_KEY_PAIR
keypair = KomradeAsymmetricKey()
from comrad.backend.keymaker import ComradAsymmetricKey
from comrad.cli.artcode import ART_KEY_PAIR
keypair = ComradAsymmetricKey()
logger.info('cut keypair!')
pubkey,privkey = keypair.pubkey_obj,keypair.privkey_obj
uri_id = pubkey.data_b64
uri_s = pubkey.data_b64_s
fnfn = kommie.save_uri_as_qrcode(uri_id=uri_id,name=name)
# await logfunc(f'Here. I have cut for you a private and public asymmetric key pair, using the iron-clad Elliptic curve algorithm:',komrade_name='Keymaker')
# await logfunc(f'Here. I have cut for you a private and public asymmetric key pair, using the iron-clad Elliptic curve algorithm:',comrad_name='Keymaker')
await logfunc(f'The first is your "public key", which you can share with anyone. With it, someone can write you an encrypted message.',komrade_name='Keymaker')
await logfunc(f'The first is your "public key", which you can share with anyone. With it, someone can write you an encrypted message.',comrad_name='Keymaker')
# delete qr!
os.remove(fnfn)
# await logfunc(f'(1) {pubkey} -- and -- (2) {privkey}',clear=True,pause=True,komrade_name='Keymaker')
# await logfunc(f'(1) {pubkey} -- and -- (2) {privkey}',clear=True,pause=True,comrad_name='Keymaker')
# await logfunc(f'(1) You may store your public key both on your device hardware, as well as share it with anyone you wish: {pubkey.data_b64_s}') #\n\nIt will also be stored as a QR code on your device:\n{qr_str}',pause=True,clear=True)
@ -292,7 +292,7 @@ class LoginScreen(BaseScreen):
kommie._keychain['pubkey']=pubkey
kommie._keychain['privkey']=privkey
from komrade.utils import dict_format
from comrad.utils import dict_format
self.log('My keychain now looks like:' + dict_format(kommie.keychain()))
# return
@ -313,22 +313,22 @@ class LoginScreen(BaseScreen):
passhash = hasher(passphrase)
privkey_decr = KomradeSymmetricKeyWithPassphrase(passhash=passhash)
privkey_decr = ComradSymmetricKeyWithPassphrase(passhash=passhash)
print()
# await logfunc(f'''We immediately whatever you typed through a 1-way hashing algorithm (SHA-256), scrambling it into (redacted):\n{make_key_discreet_str(passhash)}''',pause=True,clear=False)
privkey_encr = privkey_decr.encrypt(privkey.data)
privkey_encr_obj = KomradeEncryptedAsymmetricPrivateKey(privkey_encr)
privkey_encr_obj = ComradEncryptedAsymmetricPrivateKey(privkey_encr)
kommie._keychain['privkey_encr']=privkey_encr_obj
self.log('My keychain now looks like v2:',dict_format(kommie.keychain()))
# await logfunc(f'With this scrambled password we can encrypt your super-sensitive private key, from this:\n{privkey.discreet}to this:\n{privkey_encr_obj.discreet}',pause=True,clear=False)
# ### PUBLIC KEY
await logfunc('You must now register your username and public key with Komrade @Operator on the remote server.',pause=False,clear=False)
await logfunc('You must now register your username and public key with Comrad @Operator on the remote server.',pause=False,clear=False)
await logfunc('Connecting you to the @Operator...',komrade_name='Telephone')
await logfunc('Connecting you to the @Operator...',comrad_name='Telephone')
## CALL OP WITH PUBKEY
# self.app.open_dialog('Calling @Operator...')
@ -346,10 +346,10 @@ class LoginScreen(BaseScreen):
# print()
await logfunc(resp_msg_d.get('status'),komrade_name='Operator',pause=True)
await logfunc(resp_msg_d.get('status'),comrad_name='Operator',pause=True)
if not resp_msg_d.get('success'):
self.app.komrade=None
self.app.comrad=None
self.app.is_logged_in=False
self.app.username=''
@ -360,7 +360,7 @@ class LoginScreen(BaseScreen):
return
# clear_screen()
await logfunc('Great. Komrade @Operator now has your name and public key on file (and nothing else!).',pause=True,clear=True)
await logfunc('Great. Comrad @Operator now has your name and public key on file (and nothing else!).',pause=True,clear=True)
@ -383,16 +383,16 @@ class LoginScreen(BaseScreen):
# store privkey pieces
kommie.crypt_keys.set(uri_id, privkey_encr_obj.data, prefix='/privkey_encr/')
# just to show we used a passphrase -->
kommie.crypt_keys.set(uri_id, KomradeSymmetricKeyWithPassphrase.__name__, prefix='/privkey_decr/')
kommie.crypt_keys.set(uri_id, ComradSymmetricKeyWithPassphrase.__name__, prefix='/privkey_decr/')
# save qr too:
_fnfn=kommie.save_uri_as_qrcode(uri_id)
# await logfunc(f'Saving public key, encrypted private key, and login secret to hardware-only database. Also saving public key as QR code to: {_fnfn}.',pause=True,clear=False,use_prefix=False)
await logfunc(f'You can share it by pasting it to someone in a secure message:\n{uri_s}',komrade_name='Keymaker')
await logfunc(f'You can share it by pasting it to someone in a secure message:\n{uri_s}',comrad_name='Keymaker')
await logfunc(f'You can also share it IRL, phone to phone, as a QR code. It is saved to {fnfn} and looks like this.',img_src=fnfn,komrade_name='Keymaker')
await logfunc(f'You can also share it IRL, phone to phone, as a QR code. It is saved to {fnfn} and looks like this.',img_src=fnfn,comrad_name='Keymaker')
await logfunc(f"(2) Your PRIVATE encryption key, on the other hand, will be stored encrypted on your device hardware. Do not it this with anyone or across any network whatsoever.")
@ -412,7 +412,7 @@ class LoginScreen(BaseScreen):
# await logfunc('Returning...')
from komrade.app.screens.map import MapWidget
from comrad.app.screens.map import MapWidget
if self.app.map:
self.app.map.dismiss()
self.app.map=None

View File

@ -1,5 +1,5 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..','..')))
from komrade.app.screens.dialog import MDDialog2
from comrad.app.screens.dialog import MDDialog2
import cartopy
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
@ -8,8 +8,8 @@ from kivymd.uix.gridlayout import MDGridLayout
from kivymd.uix.button import MDFlatButton
from kivymd.uix.label import MDLabel
print('\n'.join(sys.path))
from komrade.constants import *
# from komrade.app.main import rgb
from comrad.constants import *
# from comrad.app.main import rgb
import io
from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image,AsyncImage
@ -139,7 +139,7 @@ class MapWidget(MDDialog2):
# buf = io.BytesIO()
# plt.ion()
from komrade.constants import PATH_MAPS
from comrad.constants import PATH_MAPS
odir=PATH_MAPS
if not os.path.exists(odir): os.makedirs(odir)
ofn=os.path.join(odir,f't_{len(self.points)}.png')
@ -189,7 +189,7 @@ class MapWidget(MDDialog2):
# transform=self.projection
# )
import random
from komrade.constants import ALL_COLORS
from comrad.constants import ALL_COLORS
color = random.choice(ALL_COLORS)
self.points+=[(lat,long,desc)]
@ -206,6 +206,7 @@ class MapWidget(MDDialog2):
# line
if self.last_lat and self.last_long:
self.ax.lines = []
plt.plot(
[self.last_long, long],
[self.last_lat, lat],

View File

@ -6,5 +6,5 @@ class MessagesScreen(FeedScreen):
def on_pre_enter(self):
if not super().on_pre_enter(): return
self.get_posts = self.app.komrade.messages
self.get_posts = self.app.comrad.messages

View File

@ -1,6 +1,6 @@
from screens.base import ProtectedScreen
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
class NotificationsScreen(ProtectedScreen): pass

View File

@ -1,5 +1,5 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
from screens.base import ProtectedScreen,BaseScreen
@ -164,7 +164,7 @@ class PostScreen(ProtectedScreen):
# self.post_card.author_section_layout.add_widget(self.tmp_msg,1)
self.post_card.author_section_layout.add_widget(self.to_whom_btn,1)
from komrade.constants import WORLD_NAME
from comrad.constants import WORLD_NAME
self.to_whom_btn.ids.txt_input.text = '@'+WORLD_NAME
#self.to_whom_btn.adaptive_height = True
self.to_whom_btn.ids.txt_input.word_list = ['@'+k for k in self.app.keys if k != self.app.username]
@ -325,7 +325,7 @@ class PostScreen(ProtectedScreen):
file_ext = self.img_ext if hasattr(self,'img_ext') else None
#await self.app.post(content=content, channel = channel, file_id=file_id, file_ext=file_ext)
# post?
await self.app.komrade.post(content)
await self.app.comrad.post_async(content)
import time
self.close_dialog()
if hasattr(self.app,'map') and self.app.map:

View File

@ -1,5 +1,5 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
from screens.base import BaseScreen
from kivymd.uix.boxlayout import MDBoxLayout
@ -243,7 +243,7 @@ class ProfileScreen(ProtectedScreen):
## author info
self.author_info_layout = AuthorInfoLayout()
#self.app.name_irl = 'Marx Zuckerberg'
self.app.name_irl = 'Komrade @'+self.app.username
self.app.name_irl = 'Comrad @'+self.app.username
if hasattr(self.app,'name_irl'):
self.author_name_irl = AuthorName(text=self.app.name_irl)
@ -276,7 +276,7 @@ class ProfileScreen(ProtectedScreen):
## Followers
self.follower_layout = FollowerLayout()
# self.author_followers = AuthorFollowers(label='13 followers',icon='account-arrow-left')
self.author_following = AuthorFollowing(label='13 komrades',icon='account-multiple')
self.author_following = AuthorFollowing(label='13 comrads',icon='account-multiple')
## add to layout

View File

@ -13,7 +13,7 @@ def run_command():
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
class Watcher:
DIRECTORY_TO_WATCH = '.' #os.path.join(os.path.expanduser('~'),"/github/Komrade/")
DIRECTORY_TO_WATCH = '.' #os.path.join(os.path.expanduser('~'),"/github/Comrad/")
def __init__(self):
self.observer = Observer()

View File

@ -15,7 +15,7 @@ from .callers import *
from .phonelines import *
from .messages import *
from .komrades import *
from .comrads import *
## define default entities
OPERATOR = None

View File

@ -1,10 +1,10 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from komrade.backend import *
from komrade.cli import *
# from komrade.backend.the_telephone import *
from comrad import *
from comrad.backend import *
from comrad.cli import *
# from comrad.backend.the_telephone import *
# from komrade.backend.the_telephone import *
# from comrad.backend.the_telephone import *
class Caller(Operator):

View File

@ -1,8 +1,8 @@
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from komrade.backend import *
from komrade.backend.keymaker import *
from komrade.backend.messages import Message
from comrad import *
from comrad.backend import *
from comrad.backend.keymaker import *
from comrad.backend.messages import Message
import logging,asyncio
logger = logging.getLogger(__name__)
@ -12,10 +12,10 @@ logger = logging.getLogger(__name__)
class KomradeX(Caller):
class ComradX(Caller):
def __init__(self, name=None, pubkey=None, callbacks={}, getpass_func=None):
# logger.info('booting KomradeX with getpass_func:',getpass_func)
# logger.info('booting ComradX with getpass_func:',getpass_func)
super().__init__(name=name, callbacks=callbacks, getpass_func=getpass_func)
self.log(f'Starting up with callbacks: {self._callbacks}')
# self.boot(create=False)
@ -26,8 +26,8 @@ class KomradeX(Caller):
with open(PATH_SUPER_SECRET_OP_KEY,'rb') as f:
#pass_encr=f.read()
opk1,opk2,privkey_decr,privkey_encr = b64dec(f.read()).split(BSEP)
privkey_decr_obj = KomradeSymmetricKeyWithoutPassphrase(privkey_decr)
privkey_encr_obj = KomradeEncryptedAsymmetricPrivateKey(privkey_encr)
privkey_decr_obj = ComradSymmetricKeyWithoutPassphrase(privkey_decr)
privkey_encr_obj = ComradEncryptedAsymmetricPrivateKey(privkey_encr)
self._keychain['privkey_decr']=privkey_decr_obj
self._keychain['privkey_encr']=privkey_encr_obj
@ -146,18 +146,18 @@ class KomradeX(Caller):
if SHOW_STATUS and show_intro:
self.name = name = self.cli.status_keymaker_part1(name)
elif not name:
self.name = name = input('\nHello, this is Komrade @')
logfunc('I would like to sign up for the socialist network revolution.',flush=True,komrade_name=name,pause=True)
self.name = name = input('\nHello, this is Comrad @')
logfunc('I would like to sign up for the socialist network revolution.',flush=True,comrad_name=name,pause=True)
# do_pause()
else:
logfunc(f'Hello, this is Komrade @{name}.\n\nI would like to sign up for the socialist network revolution.',pause=True,komrade_name=name)
logfunc(f'Hello, this is Comrad @{name}.\n\nI would like to sign up for the socialist network revolution.',pause=True,comrad_name=name)
# do_pause()
# clear_screen()
logfunc(f'Excellent. But to communicate with komrades securely, you must first cut your public & private encryption keys.',pause=True,clear=True)
logfunc(f'Excellent. But to communicate with comrads securely, you must first cut your public & private encryption keys.',pause=True,clear=True)
# do_pause()
## 2) Make pub public/private keys
keypair = KomradeAsymmetricKey()
keypair = ComradAsymmetricKey()
pubkey,privkey = keypair.pubkey_obj,keypair.privkey_obj
logfunc(f'I have cut for you a private and public asymmetric key pair, using the iron-clad Elliptic curve algorithm:\n\n(1) {pubkey}\n\n(2) {privkey}{ART_KEY_PAIR}',clear=True,pause=True)
self._keychain['pubkey']=pubkey
@ -168,14 +168,14 @@ class KomradeX(Caller):
### PUBLIC KEY
qr_str=self.qr_str(pubkey.data_b64)
logfunc(f'(1) You may store your public key both on your device hardware, as well as share it with anyone you wish:\n\n{pubkey.data_b64_s}\n\nIt will also be stored as a QR code on your device:\n{qr_str}',pause=True,clear=True)
logfunc('You must also register your username and public key with Komrade @Operator on the remote server.\n\nShall Komrade @Telephone send them over?',pause=False,clear=False)#),dict_format(data,tab=2),pause=True)
logfunc('You must also register your username and public key with Comrad @Operator on the remote server.\n\nShall Comrad @Telephone send them over?',pause=False,clear=False)#),dict_format(data,tab=2),pause=True)
ok_to_send = 'y' #input(f'\n@{name}: [Y/n] ')
if ok_to_send.strip().lower()=='n':
logfunc('Cancelling registration.')
return
else:
print()
logfunc('Connecting you to the @Operator...',komrade_name='Telephone')
logfunc('Connecting you to the @Operator...',comrad_name='Telephone')
# print()
# time.sleep(1)
@ -189,7 +189,7 @@ class KomradeX(Caller):
))
# print()
clear_screen()
logfunc(resp_msg_d.get('status')+ART_OLDPHONE4,komrade_name='Operator',pause=True)
logfunc(resp_msg_d.get('status')+ART_OLDPHONE4,comrad_name='Operator',pause=True)
print()
if not resp_msg_d.get('success'):
@ -197,7 +197,7 @@ class KomradeX(Caller):
return
# clear_screen()
logfunc('Great. Komrade @Operator now has your name and public key on file (and nothing else!).',pause=True,clear=True)
logfunc('Great. Comrad @Operator now has your name and public key on file (and nothing else!).',pause=True,clear=True)
logfunc(f"(2) Your PRIVATE key, on the other hand, must be stored only on your device hardware.",pause=True)
logfunc('''Your private key is so sensitive we'll even encrypt it before storing it.''',pause=True,use_prefix=False)
@ -219,12 +219,12 @@ class KomradeX(Caller):
## 4) Get hashed password
passhash = hasher(passphrase)
privkey_decr = KomradeSymmetricKeyWithPassphrase(passhash=passhash)
privkey_decr = ComradSymmetricKeyWithPassphrase(passhash=passhash)
print()
logfunc(f'''Let's immediately run whatever you typed through a 1-way hashing algorithm (SHA-256), inflating it to (redacted):\n\n{make_key_discreet_str(passhash)}''',pause=True,clear=False)
privkey_encr = privkey_decr.encrypt(privkey.data)
privkey_encr_obj = KomradeEncryptedAsymmetricPrivateKey(privkey_encr)
privkey_encr_obj = ComradEncryptedAsymmetricPrivateKey(privkey_encr)
self._keychain['privkey_encr']=privkey_encr_obj
self.log('My keychain now looks like v2:',dict_format(self.keychain()))
@ -262,7 +262,7 @@ class KomradeX(Caller):
# store privkey pieces
self.crypt_keys.set(uri_id, privkey_encr_obj.data, prefix='/privkey_encr/')
# just to show we used a passphrase -->
self.crypt_keys.set(uri_id, KomradeSymmetricKeyWithPassphrase.__name__, prefix='/privkey_decr/')
self.crypt_keys.set(uri_id, ComradSymmetricKeyWithPassphrase.__name__, prefix='/privkey_decr/')
# save qr too:
@ -310,12 +310,12 @@ class KomradeX(Caller):
# check hardware
if not 'pubkey' in keys or not self.pubkey:
emsg='''Login impossible. I do not have this komrade's public key, much less private one.'''
emsg='''Login impossible. I do not have this comrad's public key, much less private one.'''
# self.log()
return {'success':False, 'status':emsg}
if not 'privkey_encr' in keys:
emsg='''Login impossible. I do not have this komrade's private key on this hardware.'''
emsg='''Login impossible. I do not have this comrad's private key on this hardware.'''
self.log(emsg)
return {'success':False, 'status':emsg}
@ -372,7 +372,7 @@ class KomradeX(Caller):
qr_names = sorted([
fn.split('.png')[0] for fn in os.listdir(PATH_QRCODES)
])
ppl = [Komrade(name) for name in qr_names]
ppl = [Comrad(name) for name in qr_names]
ppl = [p for p in ppl if p.exists_locally_as_contact()]
return ppl
@ -461,7 +461,7 @@ class KomradeX(Caller):
async def msg_async(self,someone,something):
# find or boot
someone = Komrade(someone)
someone = Comrad(someone)
self.log(f'found {someone}')
# can we?
@ -530,7 +530,7 @@ class KomradeX(Caller):
# self.log('something_b_signed_b64 =',something_b_signed_b64)
# encrypt package to world (or op?)
world=Komrade(WORLD_NAME)
world=Comrad(WORLD_NAME)
something_b_signed_encr4world = SMessage(
self.privkey.data,
world.pubkey.data
@ -550,7 +550,7 @@ class KomradeX(Caller):
# post_pkg_b_encr4world = SMessage(
# self.privkey.data,
# Komrade(WORLD_NAME).pubkey.data
# Comrad(WORLD_NAME).pubkey.data
# ).wrap(post_pkg_b)
# self.log(post_pkg_b_encr4world)
@ -593,7 +593,7 @@ class KomradeX(Caller):
self.crypt_data.set(
post_id,
post,
prefix=post_prefix,
prefix=f'{post_prefix}{self.name}/',
override=True
)
@ -719,12 +719,12 @@ class KomradeX(Caller):
posts.append(post)
return posts
def read_post(self,post_id,post_encr=None):
def read_post(self,post_id,post_encr=None,post_prefix='/post/'):
# get post
if not post_encr:
post_encr = self.crypt_data.get(
post_id,
prefix='/post/'
prefix=f'{post_prefix}{self.name}/',
)
self.log('found encrypted post store:',post_encr)
@ -768,7 +768,7 @@ class KomradeX(Caller):
post_obj = Message(
{
'from':post_from_uri,'from_name':post_from_name,
'to':Komrade(WORLD_NAME).uri, 'to_name':WORLD_NAME,
'to':Comrad(WORLD_NAME).uri, 'to_name':WORLD_NAME,
'msg':post_data,
'timestamp':post_timestamp
}
@ -826,12 +826,12 @@ class KomradeX(Caller):
self.log('read_db.values 2',read_db.values)
def read_msg(self,post_id=None,post_encr=None):
def read_msg(self,post_id=None,post_encr=None,post_prefix='/post/'):
# get post
if not post_encr:
post_encr = self.crypt_data.get(
post_id,
prefix='/post/'
prefix=f'{post_prefix}{self.name}/',
)
self.log('found encrypted post store:',post_encr)
@ -866,7 +866,7 @@ class KomradeX(Caller):
}
else:
# print(msg_from_op)
raise KomradeException('Why am I getting this msg? '+str(msg_from_op))
raise ComradException('Why am I getting this msg? '+str(msg_from_op))
return
# now try to decrypt?
@ -951,32 +951,32 @@ def test_register():
import random
num = random.choice(list(range(0,1000)))
botname=f'marx{str(num).zfill(3)}'
marxbot = Komrade(botname)
# marxbot=Komrade()
marxbot = Comrad(botname)
# marxbot=Comrad()
marxbot.register(passphrase='boo')
def test_msg():
b = Komrade('bez')
b = Comrad('bez')
b.inbox()
# b.read_msg(b'YWY3NDUxZjNjYjdhNDFmNmIyNDI2NzU3YTI4ZTA0OWM=')
#b.login()
#print(b.download_msgs())
# z = Komrade('zuckbot')
# z = Comrad('zuckbot')
# b.msg(z,'you ssssssuck')
def test_loading():
z1 = Komrade('elon')
z1 = Comrad('elon')
# z1.register()
print(z1.keychain())
# exit()
z2 = Komrade(b'VUVDMgAAAC08BCMVA+0dMJXc66/W7hty669+3/3S61Q1yjmgJW8I0k3lqfDi')
z2 = Comrad(b'VUVDMgAAAC08BCMVA+0dMJXc66/W7hty669+3/3S61Q1yjmgJW8I0k3lqfDi')
print(z2)
print(z2.keychain())
@ -989,9 +989,9 @@ def test_loading():
def test_sign():
from pythemis import smessage
b = Komrade('bez')
m = Komrade('marx')
z = Komrade('zuckbot')
b = Comrad('bez')
m = Comrad('marx')
z = Comrad('zuckbot')
msg = b'this is cool. --bez'
@ -1003,7 +1003,7 @@ def test_sign():
print(verified_msg)
def test_send():
z = Komrade('zuckbot')
z = Comrad('zuckbot')
if __name__=='__main__':
test_msg()

View File

@ -2,7 +2,7 @@
Storage for both keys and data
"""
import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..')))
from komrade import *
from comrad import *
# from simplekv.fs import FilesystemStore
# from simplekv.memory.redisstore import RedisStore
# import redis
@ -38,7 +38,7 @@ class Crypt(Logger):
if use_secret and path_secret:
if not os.path.exists(path_secret):
self.secret = get_random_binary_id()
from komrade.backend.keymaker import make_key_discreet
from comrad.backend.keymaker import make_key_discreet
self.log('shhh! creating secret:',make_key_discreet(self.secret))
with open(path_secret,'wb') as of:
of.write(self.secret)
@ -49,8 +49,8 @@ class Crypt(Logger):
self.secret = b''
self.encrypt_values = encrypt_values
if self.secret and encrypt_values and (not encryptor_func or not decryptor_func):
from komrade.backend.keymaker import KomradeSymmetricKeyWithPassphrase
self.key = KomradeSymmetricKeyWithPassphrase(
from comrad.backend.keymaker import ComradSymmetricKeyWithPassphrase
self.key = ComradSymmetricKeyWithPassphrase(
passphrase=self.secret
)
encryptor_func = self.key.encrypt
@ -82,10 +82,6 @@ class Crypt(Logger):
def package_key(self,k,prefix=''):
if not k: return b''
# @DANGEROUS!?!!!!!
name=self.name if self.name else '?'
prefix=f'''{prefix}@{name}/'''
k_b = self.force_binary(k)
k_b2 = self.force_binary(prefix) + k_b
return k_b2

Some files were not shown because too many files have changed in this diff Show More