back-to-app
quadrismegistus 4 years ago
parent 186ad561b2
commit 17846b33e2

@ -178,7 +178,8 @@ Plain old object-oriented code in Python. The root entity is a "Keymaker": anyon
We are using [Themis](https://github.com/cossacklabs/themis), a high-level cross-platform cryptography library, for all cryptographic functions, rather than handling any primitives ourselves.
Code is primarily in:
* [komrade/backend/keymaker.py](komrade/backend/keymaker.py)
* [komrade/backend/komrades.py](komrade/backend/komrades.py)
* [komrade/backend/phonelines.py](komrade/backend/phonelines.py)
* [komrade/backend/keymaker.py](komrade/backend/keymaker.py)
* [komrade/backend/komrades.py](komrade/backend/komrades.py)
* [komrade/backend/phonelines.py](komrade/backend/phonelines.py)

@ -93,39 +93,90 @@
```
@Tor: Hiding your IP by hopping it around the globe:
--> Balashikha, Russia (Aramis70)____ _ __________ _
--> Kuala Lumpur, Malaysia (PressF)__ __ _ _______________ __
--> Frankfurt am Main, Germany (Unnamed) ___ __ ______________________
--> Berlin, Germany (niftyentry74)__ ______ ___ _______________________
--> Düsseldorf, Germany (grobosolforte) _______ _______ _______________________
______________________ ___ ___ _ ___ __ ________________________________
____________________ _ __ ___ _____________________________________
__________________ __ __ ____ ___________________________________ _
__ ______________ ____ _ ___ _______________________________ __
____________________ _ _ ________@__________________________ _
___________________ ___@@+______+_________________________
_______________ __ ______++_____+________________________
_______________ _______++ ___+______________________ _
______________ ___ _____++__ +____________________
____________ ___ _ _____++ _+_______________ _
___________ ____ ____++_+_______________ __
__________ _________________+++______________
_ ___ __ ______________________++____________
___ ______________ ____ ++_ ___
__ ________________ _ +++ ____ _
_____ ________________ _+ ++_ _
_______ _ __________ + +@ _
_________ _________ _ ___
____________ ______ _ _ ___
____________ _______ __
__________ _______ _ __ _
________ ______ _ _________
______ _____ __________
______ _____ __________
____ _ _ _____
____ __
__ _
__
__
__
```
## Exchange public keys
## Post to all @komrades
Posts are end-to-encrypted between the @Operator (server) and you: by request, messages to @komrades are decrypted by that account on the server, and then re-encrypted on the fly back to the requester.
```
############################################################
from: @marxxx
to: @komrades
############################################################
Nature builds no machines, ... These are products of human
industry; ... organs of the human brain, created by the
human hand; the power of knowledge, objectified. The
development of [machinery] indicates to what degree ...
knowledge has become a direct force of production, and to
what degree, hence, the conditions of the process of social
life itself have come under the control of the general
intellect and been transformed in accordance with it.
############################################################
Type "r" to reply to this message, "d" to delete it, or hit
Enter to continue.
```
## Send end-to-end encrypted messages
```
############################################################
from: @marxbot
to: @marxxx
############################################################
Let's talk secretly about the coming revolution?
############################################################
Type "r" to reply to this message, "d" to delete it, or hit
Enter to continue.
@marxxx:
```
--> Haarlem, Netherlands (cGbu7BKzxg7hB2m)____ _ ____________ _
--> Freiburg, Germany (Avalon2) __________ __ _ _________________ _ ___
--> Olive Branch, United States (nonanet04)__ ___ __ ___________________________
--> Berlin, Germany (niftyentry74) ________ _______ __ _ ____________________________
--> Düsseldorf, Germany (grobosolforte)____ _________ _________ ____________________________
___________________________ ___ ____ __ ____ ___ _______________________________________
________________________ __ ___ ____ _____________________________________________
_______________________ __ __ ____ ___________________________________________ _
__ _________________ _____ _ ___ ______________________________________ __
_______________ ________ _ _ ___________________________________________ _
_______________________ +++++_@@+@_________________________________________
___________________ __ +++++ +++++@___________________________________________
__________________ +++++ ++++++ _____ ____ ___ ____________________________ _
_________________ +++++++++++ __ __ _ ___ __ ___ _________________________
_______________++++++++++ __ _ _ _________ _____________________ _
_________@++++++++ _ ____ ____________________________ __
____________ __ ________________________________________
_ ___ __ _____ _______________________________________
____ ____ _____________ _____ ____ ____
__ _____ ______________ _ __ ____ _
______ ___ _________________ _ _ _
________ _ ____________ _ _
__________ ___________ _ ____
______________ ________ _ _ ___
______________ _________ _ _
____________ _________ _ __ _
__________ ________ __ ___________
_______ _____ _____________
_______ _____ ____________
_____ _ _ ______
_____ ___
___ _
___
___
```

@ -0,0 +1,14 @@
#!/usr/bin/env python
import os
ROOT = os.path.dirname(__file__)
os.chdir(ROOT)
theme_fn=os.path.join(ROOT,'theme.html')
with open(theme_fn) as theme_f: theme=theme_f.read()
os.system('pandoc ../../README.md > content.html')
with open('content.html') as content_f,open('index.html','w') as of:
content = content_f.read() #.replace('\n * ','</li>\n<li>')
content=content.replace('&lt;','<').replace('&gt;','>')
total = theme.replace('[[CONTENT]]',content)
of.write(total)
os.remove('content.html')

@ -0,0 +1,245 @@
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type='text/css'>
body {
font-family:'Baskerville', 'Libre Baskerville','Courier New', Courier, monospace;
/* text-align:center; */
/* font-size:1.1em; */
}
img {
display: block;
margin: 0 auto;
width: 200px;
}
h1 { text-align: center;}
#content {
max-width:600px;
margin: 0 auto;
}
p { text-align: justify }
</style>
<title>Ryan Heuser</title>
</head>
<body>
<div id="content">
<h1 id="komrade">Komrade</h1>
<p>Komrade is a socialist network. It seizes the means of digital production.</p>
<h2 id="why-another-social-network">Why another social network?</h2>
<p>Is a 'socialist network' possible? Although the internet began with anarchic design principles, it quickly consolidated into the hands of a few of the largest corporations in the world. It has effectively recreated the capitalist mode of production within itself: the means of content production (social media platforms) are privatized while the work of production (posting) remains socially distributed. Exploitation inheres in that relation, whether in the industrial factory or the digital platform, because the value you produce is taken from you, concentrated and privatized.</p>
<p>But a digital network can be redesigned. The technology behind these social media platforms is actually quite simple. We can easily build our own social network, one which is secure, insurveillable, and unmonetizable—one which would give people the security they need to communicate about whatever they want, including protesting against capital and the state..</p>
<h2 id="core-principles">Core principles</h2>
<h3 id="confidential">Confidential</h3>
<p>All of your data are strongly encrypted end-to-end: only you and those you write to can decrypt and read it. To anyone without the right decryption 'key', the data is nonsense.</p>
<h3 id="untraceable">Untraceable</h3>
<p>All network traffic is routed through Tor, a &quot;deep web&quot; of computers so dense even the FBI can't follow you through it. Komrade's &quot;Operator&quot; 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.</p>
<h3 id="unmonetizable">Unmonetizable</h3>
<p>What's untraceable is also unmonetizable: your data can't be harvested by technology companies and used for advertising algorithms. You're protected from both surveillance capitalism and the surveillance state.</p>
<h3 id="democratized">Democratized</h3>
<p>Group accounts or 'collectives', like <span class="citation">@portland</span> or <span class="citation">@socialists</span>, grow as existing members 'vouch for' new ones, forming webs of trust. Other komrades can see how many times a given person has been vouched for, both within a group and overall, but not who has vouched for them. In order to join a group, at least one member must vouch for you; this minimum (or 'quorum') may grow as the group grows.</p>
<h3 id="semi-decentralized">(Semi-)decentralized</h3>
<p>Data is deleted as soon as possible from Komrade. Komrade's &quot;Operator&quot; 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.</p>
<h3 id="anti-profit">Anti-profit</h3>
<p>Not just non-profit, we're anti-profit.</p>
<h3 id="open-source">Open-source</h3>
<p>Information wants to be communist.</p>
<h2 id="social-media-features">Social media features</h2>
<p>We present a simplified set of social media features drawn from everything that's out there:</p>
<h4 id="profile">Profile</h4>
<ul>
<li>Curate a profile with photo and posts (e.g. Twitter)</li>
<li>Show profile to world (e.g. Twitter)</li>
<li>Show profile only to those you trust (e.g. Facebook)</li>
<li>Show profile only to your local area (e.g. Nextdoor)</li>
</ul>
<h4 id="posting">Posting</h4>
<ul>
<li>Post up to 1 image and/or 1000 characters</li>
<li>Post to the entire world (e.g. Twitter) ✔</li>
<li>Post to those you trust (e.g. Facebook)</li>
<li>Post to your surrounding area by a distance radius (e.g. Nextdoor)</li>
<li>Anonymously up-vote or down-vote posts (e.g. Reddit)</li>
</ul>
<h4 id="organizing">Organizing</h4>
<ul>
<li>Host events and invite others (e.g. Facebook)</li>
<li>Host events like protests anonymously (new)</li>
<li>Anonymously pin on a map sites of danger, like police (e.g. Waze)</li>
</ul>
<h4 id="messaging">Messaging</h4>
<ul>
<li>Message securely with encrypted contents (e.g. Signal) ✔</li>
<li>Message with untraceable metadata via Tor (new) ✔</li>
</ul>
<h2 id="how-is-this-different-from...">How is this different from...</h2>
<h3 id="comparison-table">Comparison table</h3>
<table>
<colgroup>
<col width="13%" />
<col width="4%" />
<col width="4%" />
<col width="8%" />
<col width="12%" />
<col width="12%" />
<col width="10%" />
<col width="11%" />
<col width="9%" />
<col width="12%" />
</colgroup>
<thead>
<tr class="header">
<th>Other cool thing</th>
<th>What is it?</th>
<th>Kind of like...</th>
<th>Decentralized?</th>
<th>Anonymous?</th>
<th>Confidential?</th>
<th>Data persistence?</th>
<th>Identity verification?</th>
<th>Need invitation/server?</th>
<th>What data can user find?</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><em>Komrade</em></td>
<td><em>Social network</em></td>
<td><em>Twitter</em></td>
<td><em>No (central server on Tor)</em></td>
<td><strong><em>Yes (everything routed via Tor)</em></strong></td>
<td><strong><em>Yes (100% E2EE)</em></strong></td>
<td><em>Minimal server (deleted ASAP)</em></td>
<td><em>Yes (central public key repository)</em></td>
<td><strong><em>No (works like twitter)</em></strong></td>
<td>Mixed (global feed; hashtag search only)</td>
</tr>
<tr class="even">
<td><a href="https://scuttlebutt.nz/">Secure Scuttlebutt</a></td>
<td>Social network</td>
<td>Twitter/Facebook</td>
<td><strong>Fully (P2P)</strong></td>
<td>No (P2P reveals IP; friend networks public)</td>
<td>Partly (private E2EE, public unencrypted)</td>
<td>Distributed across friend networks?</td>
<td>Yes? (federated key exchange?)</td>
<td>Yes (need initial pub)</td>
<td>Limited (search friends-of-friends' data)</td>
</tr>
<tr class="odd">
<td><a href="https://diasporafoundation.org/">Diaspora</a></td>
<td>Social network</td>
<td>Twitter</td>
<td>Partly (federated)</td>
<td>No (unless via Tor Browser)</td>
<td>No (unencrypted?)</td>
<td>?</td>
<td>?</td>
<td>Yes (need 'pod' server)</td>
<td></td>
</tr>
<tr class="even">
<td><a href="https://joinmastodon.org/">Mastodon</a></td>
<td>Social network</td>
<td>Twitter</td>
<td>Partly (federated)</td>
<td>No (unless via Tor Browser)</td>
<td>No (unencrypted?)</td>
<td>?</td>
<td>?</td>
<td>Yes (need 'instance' server)</td>
<td></td>
</tr>
<tr class="odd">
<td><a href="https://matrix.org/">Matrix</a></td>
<td>Group chat</td>
<td>Slack</td>
<td>Partly (federated)</td>
<td>No?</td>
<td><strong>Yes? (100% E2EE)</strong></td>
<td>?</td>
<td>Yes (?)</td>
<td>Yes (invited channels only?)</td>
<td></td>
</tr>
<tr class="even">
<td><a href="https://briarproject.org/">Briar Messenger</a></td>
<td>Messenger</td>
<td>WhatsApp</td>
<td><strong>Fully (P2P)</strong></td>
<td><strong>Yes? (Tor)</strong></td>
<td><strong>Yes (100% E2EE)</strong></td>
<td>None (needs 24/7 listener)</td>
<td>Partly (public keys traded IRL)</td>
<td>Yes (need initial contact?)</td>
<td></td>
</tr>
<tr class="odd">
<td><a href="https://cabal.chat/">Cabal Chat</a></td>
<td>Chatrooms</td>
<td>IRC</td>
<td><strong>Fully (P2P)</strong></td>
<td>No (P2P reveals IP) <sup>1</sup></td>
<td>Mostly (shared key, not E2EE)</td>
<td>Distributed Hash Table</td>
<td>No (?)</td>
<td>Not really (public chat is open)</td>
<td></td>
</tr>
</tbody>
</table>
<p>Sources:</p>
<p><sup>1.</sup> <a href="https://cabal.chat/faq.html#:~:text=What%20kind%20of%20security%20does,is%20involved%20in%20a%20cabal">Cabal FAQ: What kind of security is involved with Cabal?</a></p>
<h3 id="in-words">In words</h3>
<ol style="list-style-type: decimal">
<li>Secure Scuttlebutt? SSB is probably the most impressive alternative social network out there. It's truly P2P, not just federated like Diaspora or Mastodon, so the content you see is coming to you via your friends and their friends: you download it directly from them. It has a great user base...</li>
</ol>
<h2 id="progress">Progress</h2>
<h3 id="animations-from-mobiledesktop-app">Animations from mobile/desktop app</h3>
<p>As of the 23rd of August.</p>
<p><img src="komrade/app/assets/komrade-screen-preview-2020-08-23.gif" alt="GIF animation" /></p>
<h3 id="animations-from-terminal-app">Animations from terminal app</h3>
<h4 id="connecting-through-tor">Connecting through Tor</h4>
<p><img src="komrade/app/assets/komrade-terminal-preview--2020-09-20--tor.gif" alt="GIF animation of Tor connection" /></p>
<h4 id="registerlogin">Register/Login</h4>
<p><img src="komrade/app/assets/komrade-terminal-preview--2020-09-16--register.gif" height="500" alt="GIF animation of registering new user" /></p>
<h4 id="meeting-exchanging-public-keys">&quot;Meeting&quot; (exchanging public keys)</h4>
<p><img src="komrade/app/assets/komrade-terminal-preview--2020-09-16--meet.gif" alt="GIF animation of meeting process" /></p>
<h4 id="messaging-1">Messaging</h4>
<p><img src="komrade/app/assets/komrade-terminal-preview--2020-09-16--msg.gif" alt="GIF animation of messaging" /></p>
<h3 id="posting-1">Posting</h3>
<p><img src="komrade/app/assets/komrade-terminal-preview--2020-09-19--posting.gif" alt="GIF animation of posting" /></p>
<h2 id="usage">Usage</h2>
<h3 id="install">Install</h3>
<p>In one line:</p>
<pre><code>bash <(curl http://komrade.app/run)</code></pre>
<p>(<a href="https://github.com/Komrade/Komrade/blob/master/script/micro_installer">That's</a> a shortcut to <a href="https://github.com/Komrade/Komrade/blob/master/script/install">this auto-installer script</a>.)</p>
<p>Using pyenv, it installs Komrade in a virtual environment with the correct version (3.7) of Python attached. It doesn't override your existing Python configurations.</p>
<h3 id="run">Run</h3>
<p>Install as above.</p>
<p>For the terminal client, run:</p>
<pre><code>komrade-cli</code></pre>
<p>For the mobile/desktop app, run:</p>
<pre><code>komrade-app</code></pre>
<p>Or to run the server or Operator (for development only):</p>
<pre><code>komrade-op</code></pre>
<h2 id="details">Details</h2>
<h3 id="frontend">Frontend</h3>
<h4 id="mobiledesktop">Mobile/desktop</h4>
<p>The mobile/desktop app is made with <a href="https://github.com/kivymd/KivyMD">KivyMD</a>, a variant of <a href="https://kivy.org/">Kivy</a>, 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 <a href="komrade/app" class="uri">komrade/app</a>.</p>
<h4 id="terminal-app">Terminal app</h4>
<p>Vanilla Python. Code is in <a href="komrade/cli" class="uri">komrade/cli</a>.</p>
<h3 id="backend">Backend</h3>
<h4 id="api">API</h4>
<p>Plain old object-oriented code in Python. The root entity is a &quot;Keymaker&quot;: anyone from <span class="citation">@Telephone</span>, to <span class="citation">@Operator</span>, to users, to groups, who has a public/private key pair. The database uses a simple file-based key-value store, written in Python (<a href="https://github.com/mbr/simplekv">simplekv</a>). Code is in <a href="komrade/backend" class="uri">komrade/backend</a>.</p>
<h4 id="cryptography">Cryptography</h4>
<p>We are using <a href="https://github.com/cossacklabs/themis">Themis</a>, a high-level cross-platform cryptography library, for all cryptographic functions, rather than handling any primitives ourselves.</p>
<p>Code is primarily in: * <a href="komrade/backend/keymaker.py" class="uri">komrade/backend/keymaker.py</a> * <a href="komrade/backend/komrades.py" class="uri">komrade/backend/komrades.py</a> * <a href="komrade/backend/phonelines.py" class="uri">komrade/backend/phonelines.py</a></p>
</div>
</body>
</html>

@ -0,0 +1,34 @@
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type='text/css'>
body {
font-family:'Baskerville', 'Libre Baskerville','Courier New', Courier, monospace;
/* text-align:center; */
/* font-size:1.1em; */
}
img {
display: block;
margin: 0 auto;
/* width: 200px; */
}
h1 { text-align: center;}
#content {
max-width:600px;
margin: 0 auto;
}
p { text-align: justify }
</style>
<title>Ryan Heuser</title>
</head>
<body>
<div id="content">
[[CONTENT]]
</div>
</body>
</html>

@ -397,7 +397,7 @@ class CLI(Logger):
res = self.komrade.get_updates()
#print(res.get('success'))
if not res.get('success'):
self.stat(res.get('status'))
self.stat(res.get('status'),komrade_name='')
return
self.stat('@Telephone: Patching you through to the @Operator. One moment please...')

Loading…
Cancel
Save