p2p login working 😈

p2p
quadrismegistus 4 years ago
parent 2d8117092f
commit f6f526aad1

@ -40,11 +40,22 @@ from p2p import p2p,crypto,api
Window.size = WINDOW_SIZE Window.size = WINDOW_SIZE
def log(*args): # with open('log.txt','w') as of:
with open('log.txt','a+') as of: # of.write('### LOG ###\n')
of.write(' '.join([str(x) for x in args])+'\n')
import logging
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger = logging.getLogger('app')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
def log(*args):
#with open('log.txt','a+') as of:
# of.write(' '.join([str(x) for x in args])+'\n')
line = ' '.join(str(x) for x in args)
logger.debug(line)
class MyLayout(MDBoxLayout): class MyLayout(MDBoxLayout):
scr_mngr = ObjectProperty(None) scr_mngr = ObjectProperty(None)
@ -130,14 +141,19 @@ class MainApp(MDApp):
# self.texture.wrap = 'clamp_to_edge' # self.texture.wrap = 'clamp_to_edge'
# self.texture.uvsize = (-2, -2) # self.texture.uvsize = (-2, -2)
with open('log.txt','w') as of: of.write('## LOG ##\n')
self.load_store()
# self.boot_kad() # self.boot_kad()
from p2p.api import Api
self.api = Api(app_storage=self.store)
self.username='' self.username=''
# bind # bind
global app,root global app,root
app = self app = self
#self.username = self.store.get('userd').get('username') #self.username = self.store.get('userd').get('username')
self.load_store()
self.root = root = Builder.load_file('root.kv') self.root = root = Builder.load_file('root.kv')
draw_background(self.root) draw_background(self.root)
@ -159,7 +175,7 @@ class MainApp(MDApp):
if not self.is_logged_in(): if not self.is_logged_in():
self.root.change_screen('login') self.root.change_screen('login')
log(self.username) #log(self.username)
else: else:
# self.root.post_id=190 # self.root.post_id=190
self.root.change_screen(DEFAULT_SCREEN) self.root.change_screen(DEFAULT_SCREEN)
@ -202,35 +218,23 @@ class MainApp(MDApp):
def login(self,un=None,pw=None): def login(self,un=None,pw=None):
url = self.api+'/login' dat = self.api.login(un,pw)
log(dat)
with self.get_session() as sess: if 'success' in dat:
#res = requests.post(url, json={'name':un, 'passkey':pw}) self.save_login(un)
res = sess.post(url, json={'name':un, 'passkey':pw}) elif 'error' in dat:
log(res.text) self.root.ids.login_screen.login_status.text=dat['error']
return False
if res.status_code==200:
data=res.json()
self.save_login(un)
return True
else:
# self.root.ids.login_status.text=res.text
return False
def register(self,un,pw): def register(self,un,pw):
# url = self.api+'/register' dat = self.api.register(un,pw)
if 'success' in dat:
# with self.get_session() as sess: self.save_login(un)
# #res = requests.post(url, json={'name':un, 'passkey':pw}) return True
# res = sess.post(url, json={'name':un, 'passkey':pw}) elif 'error' in dat:
# if res.status_code==200: self.root.ids.login_screen.login_status.text=dat['error']
# self.save_login(un) return False
# else:
# pass
# #self.root.ids.login_status.text=res.text
res = api.register(un,pw)
def upload(self,orig_img_src): def upload(self,orig_img_src):
url_upload=self.api+'/upload' url_upload=self.api+'/upload'
filename=orig_img_src[0] if orig_img_src and os.path.exists(orig_img_src[0]) else '' filename=orig_img_src[0] if orig_img_src and os.path.exists(orig_img_src[0]) else ''
@ -303,6 +307,7 @@ class MainApp(MDApp):
return jsond return jsond
def get_posts(self): def get_posts(self):
return []
with self.get_session() as sess: with self.get_session() as sess:
with sess.get(self.api+'/posts') as r: with sess.get(self.api+'/posts') as r:
log(r.text) log(r.text)

@ -10,8 +10,10 @@
import os,time import os,time
from pathlib import Path from pathlib import Path
from flask_api import status from flask_api import status
from .p2p import connect
import asyncio import asyncio
from .crypto import *
from main import log
from .p2p import *
# works better with tor? # works better with tor?
import json import json
@ -22,10 +24,125 @@ jsonify = json.dumps
DEBUG = True DEBUG = True
UPLOAD_DIR = 'uploads/' UPLOAD_DIR = 'uploads/'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
NODES_PRIME = [("128.232.229.63",8468), ("68.66.241.111",8468)]
PORT_LISTEN = 8469
# Api Functions # Api Functions
NODE = connect() class Api(object):
def __init__(self,app_storage):
#self.connect()
self.app_storage = app_storage
pass
# def connect(self):
#from .p2p import connect
#self.node = connect()
def get(self,key):
async def _get():
node = Server(storage=HalfForgetfulStorage())
await node.listen(PORT_LISTEN)
await node.bootstrap(NODES_PRIME)
return await node.get(key)
return asyncio.run(_get())
def set(self,key,value):
async def _set():
node = Server(storage=HalfForgetfulStorage())
await node.listen(PORT_LISTEN)
await node.bootstrap(NODES_PRIME)
return await node.set(key,value)
return asyncio.run(_set())
def has(self,key):
return self.get(key) is not None
## PERSONS
def get_person(self,username):
person = self.get('/person/'+username)
return None if person is None else json.loads(person)
def set_person(self,username,public_key):
pem_public_key = save_public_key(public_key,return_instead=True)
obj = {'name':username, 'public_key':pem_public_key.decode()}
obj_str = jsonify(obj)
self.set('/person/'+username,obj_str)
## Register
def register(self,name,passkey):
if not (name and passkey):
error('name and passkey not set')
return {'error':'Register failed'},status.HTTP_400_BAD_REQUEST
person = self.get_person(name)
if person is not None:
log('error! person exists')
return {'error':'Register failed'}
private_key,public_key = new_keys(password=passkey,save=False)
pem_private_key = save_private_key(private_key,password=passkey,return_instead=True)
pem_public_key = save_public_key(public_key,return_instead=True)
self.app_storage.put('_keys',
private=str(pem_private_key.decode()),
public=str(pem_public_key.decode())) #(private_key,password=passkey)
self.set_person(name,public_key)
log('success! Account created')
return {'success':'Account created', 'username':name}
def load_private_key(self,password):
if not self.app_storage.exists('_keys'): return None
pem_private_key=self.app_storage.get('_keys').get('private')
try:
return load_private_key(pem_private_key.encode(),password)
except ValueError as e:
log('!!',e)
return None
## LOGIN
def login(self,name,passkey):
# verify input
if not (name and passkey):
return {'error':'Name and password required'}
# try to load private key
private_key = self.load_private_key(passkey)
if private_key is None:
return {'error':'You have never registered on this device'}
# see if user exists
person = self.get_person(name)
log(person)
if person is None:
return {'error':'Login failed'}
# verify keys
person_public_key_pem = person['public_key']
public_key = load_public_key(person_public_key_pem)
real_public_key = private_key.public_key()
#log('PUBLIC',public_key.public_numbers())
#log('REAL PUBLIC',real_public_key.public_numbers())
if public_key.public_numbers() != real_public_key.public_numbers():
return {'error':'keys do not match!'}
return {'success':'Login successful', 'username':name}
"""
## LOGIN ## LOGIN
@ -45,11 +162,6 @@ def login(data):
return {'success':'Login success'},status.HTTP_200_OK return {'success':'Login success'},status.HTTP_200_OK
def get_person(username):
async def go():
return await NODE.get('/person/'+username)
return asyncio.run(run())
def register(name,passkey): def register(name,passkey):
@ -73,8 +185,6 @@ def register(name,passkey):
"""
## CREATE ## CREATE
def allowed_file(filename): def allowed_file(filename):

@ -27,7 +27,7 @@ def new_keys(save=True,password=None):
return private_key,public_key return private_key,public_key
def save_private_key(private_key,fn=PATH_PRIVATE_KEY,return_instead=False): def save_private_key(private_key,fn=PATH_PRIVATE_KEY,password=None, return_instead=False):
pem = private_key.private_bytes( pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM, encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8, format=serialization.PrivateFormat.PKCS8,
@ -48,23 +48,28 @@ def save_public_key(public_key,fn=PATH_PUBLIC_KEY,return_instead=False):
### LOADING KEYS ### LOADING KEYS
def load_keys(): def load_keys():
return (load_private_key(), load_public_key()) return (load_private_key_from_file(), load_public_key_from_file())
def load_private_key(fn=PATH_PRIVATE_KEY,password=None): def load_private_key(pem,password=None):
return serialization.load_pem_private_key(
pem,
password=password.encode() if password else None,
backend=default_backend()
)
def load_private_key_from_file(fn=PATH_PRIVATE_KEY,password=None):
with open(fn, "rb") as key_file: with open(fn, "rb") as key_file:
return serialization.load_pem_private_key( return load_private_key(key_file.read(), password)
key_file.read(),
password=password.encode(), def load_public_key(pem):
return serialization.load_pem_public_key(
pem,
backend=default_backend() backend=default_backend()
) )
def load_public_key(fn=PATH_PUBLIC_KEY): def load_public_key_from_file(fn=PATH_PUBLIC_KEY):
with open(fn, "rb") as key_file: with open(fn, "rb") as key_file:
return serialization.load_pem_public_key( return load_public_key(key_file.read())
key_file.read(),
backend=default_backend()
)
### DE/ENCRYPTING ### DE/ENCRYPTING
def encrypt_msg(message, public_key): def encrypt_msg(message, public_key):

@ -33,9 +33,12 @@ class HalfForgetfulStorage(ForgetfulStorage):
self.data[key] = (time.monotonic(), value) self.data[key] = (time.monotonic(), value)
self.write() self.write()
def set(key,value):
self[key]=value
def write(self): def write(self):
with open(self.fn,'wb') as f: with open(self.fn,'wb') as f:
pickle.dump(self.data, f, protocol=pickle.HIGHEST_PROTOCOL) pickle.dump(self.data, f)
def get(self, key, default=None): def get(self, key, default=None):
# self.cull() # self.cull()
@ -49,14 +52,16 @@ class HalfForgetfulStorage(ForgetfulStorage):
return self.data[key][1] return self.data[key][1]
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
log = logging.getLogger('kademlia')
log.addHandler(handler)
log.setLevel(logging.DEBUG)
def start_first_node(): def start_first_node():
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
log = logging.getLogger('kademlia')
log.addHandler(handler)
log.setLevel(logging.DEBUG)
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
loop.set_debug(True) loop.set_debug(True)

@ -43,19 +43,6 @@
size_hint:1,None size_hint:1,None
<AddPostScreen>:
name: 'post'
id: post_screen
<ViewPostScreen>:
name: 'view'
### LAYOUT ### LAYOUT
@ -103,12 +90,9 @@ MyLayout:
FeedScreen: FeedScreen:
id: feed_screen id: feed_screen
AddPostScreen: PostScreen:
id: add_post_screen id: post_screen
ViewPostScreen:
id: view_post_screen
MessagesScreen: MessagesScreen:
id: messages_screen id: messages_screen

@ -26,11 +26,12 @@
required: True required: True
write_tab: False write_tab: False
multiline: False multiline: False
helper_text_mode: "on_error" helper_text_mode: "persistent"
color_mode: 'custom' color_mode: 'custom'
line_color_focus: 1,0,0,1 line_color_focus: 1,0,0,1
line_color_normal: 1,0,0,1 line_color_normal: 1,0,0,1
current_hint_text_color: 1,0,0,1 current_hint_text_color: 1,0,0,1
error_color:1,0,0,1
# pos_hint: {'x':1,'y':0.8} # pos_hint: {'x':1,'y':0.8}
# size_hint:(None,None) # size_hint:(None,None)
@ -43,7 +44,7 @@
required: True required: True
write_tab: False write_tab: False
multiline: False multiline: False
helper_text_mode: "on_error" helper_text_mode: "persistent"
color_mode: 'custom' color_mode: 'custom'
line_color_focus: 1,0,0,1 line_color_focus: 1,0,0,1
line_color_normal: 1,0,0,1 line_color_normal: 1,0,0,1

@ -19,14 +19,14 @@ class LoginScreen(BaseScreen):
# if app.is_logged_in(): # if app.is_logged_in():
# app.root.change_screen('feed') # app.root.change_screen('feed')
def on_pre_enter(self): def on_pre_enter(self):
log(self.ids) #log(self.ids)
log('hello?') #log('hello?')
self.layout = LoginBoxLayout() self.layout = LoginBoxLayout()
self.username_field = UsernameField() self.username_field = UsernameField()
self.username_field.line_color_focus=(1,0,0,1) self.username_field.line_color_focus=(1,0,0,1)
self.layout.add_widget(self.username_field) self.layout.add_widget(self.username_field)
log(self.username_field) #log(self.username_field)
# self.username_field.text='hello????' # self.username_field.text='hello????'
self.password_field = PasswordField() self.password_field = PasswordField()

@ -1,4 +1,4 @@
#:import PostScreen screens.post.post.PostScreen
<AddPostTextField> <AddPostTextField>
id: post_content_input id: post_content_input
@ -151,10 +151,6 @@
<AddPostScreen@Screen>: <PostScreen>:
name: 'post' name: 'post'
id: post_screen id: post_screen
<ViewPostScreen@Screen>:
name: 'view'

@ -10,33 +10,11 @@ from main import log
from screens.feed.feed import * from screens.feed.feed import *
import os,time,threading import os,time,threading
from threading import Thread from threading import Thread
from kivymd.uix.dialog import MDDialog from kivymd.uix.dialog import MDDialog
# # Progress bar code
# class ProgressPopup(MDDialog):
# def __init__(self, *args, **kwargs):
# super().__init__(*args, **kwargs)
# content = MDLabel(font_style='Body1',
# theme_text_color='Secondary',
# text=kwargs.get('text',''),
# size_hint_y=None,
# valign='top')
# content.bind(texture_size=content.setter('size'))
# self.dialog = MDDialog(title="Close",
# content=content,
# size_hint=(.3, None),
# height='200dp')
# self.dialog.add_action_button("Close me!",
# action=lambda *x: self.dismiss_callback())
# self.dialog.open()
class ProgressPopup(MDDialog): pass class ProgressPopup(MDDialog): pass
class MessagePopup(MDDialog): pass class MessagePopup(MDDialog): pass
class UploadButton(MDRectangleFlatButton): class UploadButton(MDRectangleFlatButton):
''' '''
Button that triggers 'filechooser.open_file()' and processes Button that triggers 'filechooser.open_file()' and processes
@ -73,7 +51,7 @@ class PostButton(MDRectangleFlatButton): pass
class PostStatus(MDRectangleFlatButton): pass class PostStatus(MDRectangleFlatButton): pass
class AddPostScreen(ProtectedScreen): class PostScreen(ProtectedScreen):
post_id = ObjectProperty() post_id = ObjectProperty()
def on_pre_enter(self): def on_pre_enter(self):
@ -200,20 +178,20 @@ class AddPostScreen(ProtectedScreen):
Thread(target=do_post).start() Thread(target=do_post).start()
class ViewPostScreen(ProtectedScreen): # class ViewPostScreen(ProtectedScreen):
post_id = ObjectProperty() # post_id = ObjectProperty()
def on_pre_enter(self): # def on_pre_enter(self):
for child in self.children: # for child in self.children:
log('child: '+str(child)) # log('child: '+str(child))
self.remove_widget(child) # self.remove_widget(child)
post_json = self.app.get_post(self.root.post_id) # post_json = self.app.get_post(self.root.post_id)
post = PostCard(post_json) # post = PostCard(post_json)
self.add_widget(post) # self.add_widget(post)
def on_enter(self): # def on_enter(self):
for child in self.children: child.load_image() # for child in self.children: child.load_image()
pass # pass

@ -38,7 +38,8 @@ class Handler(FileSystemEventHandler):
def on_any_event(event): def on_any_event(event):
if '/cache/' in str(event.src_path): return None if '/cache/' in str(event.src_path): return None
if '__pycache__' in str(event.src_path): return None if '__pycache__' in str(event.src_path): return None
if 'sto.dat' in str(event.src_path): return None
if event.is_directory: if event.is_directory:
return None return None

@ -1,69 +1,38 @@
astroid==2.4.2 astroid==2.4.2
attrs==19.3.0
Automat==20.2.0
certifi==2020.6.20 certifi==2020.6.20
characteristic==14.3.0 cffi==1.14.2
chardet==3.0.4 chardet==3.0.4
Click==7.0 click==7.1.2
colorama==0.4.3 cryptography==3.0
constantly==15.1.0
dnspython==1.16.0
docutils==0.16 docutils==0.16
eventlet==0.26.1
Flask==1.1.2 Flask==1.1.2
Flask-API==2.0 Flask-API==2.0
Flask-SocketIO==4.3.1
Flask-Sockets==0.2.1
Flask-Twisted==0.1.2
gevent==20.6.2
gevent-websocket==0.10.1
greenlet==0.4.16
gunicorn==20.0.4
hyperlink==20.0.1
idna==2.10 idna==2.10
incremental==17.5.0
isort==4.3.21 isort==4.3.21
itsdangerous==1.1.0 itsdangerous==1.1.0
Jinja2==2.11.2 Jinja2==2.11.2
kademlia==2.2.1
Kivy==1.11.1 Kivy==1.11.1
Kivy-Garden==0.1.4 Kivy-Garden==0.1.4
kivymd==0.104.1 kivymd==0.104.1
klein==20.6.0
lazy-object-proxy==1.4.3 lazy-object-proxy==1.4.3
llp==0.2.2 llp==0.2.2
MarkupSafe==1.1.1 MarkupSafe==1.1.1
mccabe==0.6.1 mccabe==0.6.1
monotonic==1.5
mpi-slingshot==0.2.0 mpi-slingshot==0.2.0
neo4j-driver==1.7.2
neobolt==1.7.17
neomodel==3.3.2
neotime==1.7.4
observable==1.0.3
pathtools==0.1.2 pathtools==0.1.2
Pillow==7.2.0 Pillow==7.2.0
plyer==1.4.3 plyer==1.4.3
prompt-toolkit==2.0.10 pycparser==2.20
py2neo==4.3.0 Pygments==2.6.1
Pygments==2.3.1
PyHamcrest==2.0.2
pylint==2.5.3 pylint==2.5.3
PySocks==1.7.1
python-dotenv==0.14.0
python-engineio==3.13.1
python-socketio==4.6.0
pytz==2020.1
requests==2.24.0 requests==2.24.0
requests-futures==1.0.0 rpcudp==4.0.1
six==1.15.0 six==1.15.0
toml==0.10.1 toml==0.10.1
Tubes==0.2.0
Twisted==20.3.0
typed-ast==1.4.1 typed-ast==1.4.1
urllib3==1.24.3 u-msgpack-python==2.7.0
urllib3==1.25.10
watchdog==0.10.3 watchdog==0.10.3
wcwidth==0.2.5
Werkzeug==1.0.1 Werkzeug==1.0.1
wrapt==1.12.1 wrapt==1.12.1
zope.event==4.4
zope.interface==5.1.0

Loading…
Cancel
Save