fixed bizarre new screen import error

p2p
quadrismegistus 4 years ago
parent f499b55cb0
commit 2d8117092f

@ -36,7 +36,7 @@ from kivy.core.window import Window
from kivy.core.text import LabelBase
import shutil
from kivy.uix.image import Image
from p2p.crypto import *
from p2p import p2p,crypto,api
Window.size = WINDOW_SIZE
@ -103,28 +103,14 @@ def draw_background(widget, img_fn='assets/bg.png'):
class MainApp(MDApp):
title = 'Komrade'
#api = 'http://localhost:5555/api'
api = 'http://%s/api' % SERVER_ADDR
#api = 'http://komrades.net:5555/api'
logged_in=False
store = JsonStore('komrade.json')
login_expiry = 60 * 60 * 24 * 7 # once a week
#login_expiry = 5 # 5 seconds
texture = ObjectProperty()
# def boot_kad(self):
# def connect(self):
# # connect to kad?
# from kad import DHT
# host1, port1 = '68.66.241.111', 3000
# # dht1 = DHT(host1, port1)
# host2, port2 = 'localhost', 3001
# dht2 = DHT(host2, port2, seeds=[(host1, port1)])
# # dht1["my_key"] = [u"My", u"json-serializable", u"Object"]
# #log (dht2["my_key"]) # blocking get
# dht2.get("my_key", lambda data: log ('from server!',data)) # threaded get
# self.node = p2p.connect()
def get_session(self):
@ -232,16 +218,17 @@ class MainApp(MDApp):
return False
def register(self,un,pw):
url = self.api+'/register'
with self.get_session() as sess:
#res = requests.post(url, json={'name':un, 'passkey':pw})
res = sess.post(url, json={'name':un, 'passkey':pw})
if res.status_code==200:
self.save_login(un)
else:
pass
#self.root.ids.login_status.text=res.text
# url = self.api+'/register'
# with self.get_session() as sess:
# #res = requests.post(url, json={'name':un, 'passkey':pw})
# res = sess.post(url, json={'name':un, 'passkey':pw})
# if res.status_code==200:
# self.save_login(un)
# else:
# pass
# #self.root.ids.login_status.text=res.text
res = api.register(un,pw)
def upload(self,orig_img_src):

@ -0,0 +1,215 @@
# import flask,os,time
# from flask import request, jsonify, send_from_directory
# from pathlib import Path
# from models import *
# from flask_api import FlaskAPI, status, exceptions
# from werkzeug.security import generate_password_hash,check_password_hash
# from flask import Flask, flash, request, redirect, url_for
# from werkzeug.utils import secure_filename
import os,time
from pathlib import Path
from flask_api import status
from .p2p import connect
import asyncio
# works better with tor?
import json
jsonify = json.dumps
# Start server
DEBUG = True
UPLOAD_DIR = 'uploads/'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
# Api Functions
NODE = connect()
## LOGIN
def login(data):
name=data.get('name','')
passkey=data.get('passkey','')
if not (name and passkey):
return {'error':'Login failed'},status.HTTP_400_BAD_REQUEST
person = Person.nodes.get_or_none(name=name)
if person is None:
return {'error':'User already exists'},status.HTTP_401_UNAUTHORIZED
real_passkey = person.passkey
if not check_password_hash(real_passkey, passkey):
return {'error':'Login failed'},status.HTTP_401_UNAUTHORIZED
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):
if not (name and passkey):
return {'error':'Register failed'},status.HTTP_400_BAD_REQUEST
if person is not None:
return {'error':'User exists'},status.HTTP_401_UNAUTHORIZED
private_key,public_key = crypto.new_keys(password=passkey)
person = Person(name=name,passkey=passkey).save()
print('REGISTERED!',data)
return {'success':'Account created', 'username':name},status.HTTP_200_OK
"""
## CREATE
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def get_random_filename(filename):
import uuid
fn=uuid.uuid4().hex
return (fn[:3],fn[3:]+os.path.splitext(filename)[-1])
@app.route('/api/upload',methods=['POST'])
def upload():
files = request.files
# check if the post request has the file part
if 'file' not in request.files:
return {'error':'No file found'},status.HTTP_204_NO_CONTENT
file = request.files['file']
# if user does not select file, browser also
# submit an empty part without filename
print('filename!',file.filename)
if file.filename == '':
return {'error':'No filename'},status.HTTP_206_PARTIAL_CONTENT
if file and allowed_file(file.filename):
print('uploading file...')
#prefix,filename = get_random_filename(file.filename) #secure_filename(file.filename)
#odir = os.path.join(app.config['UPLOAD_DIR'], os.path.dirname(filename))
#if not os.path.exists(odir):
ext = os.path.splitext(file.filename)[-1]
media = Media(ext=ext).save()
uid = media.uid
filename = media.filename
prefix,fn=filename.split('/')
folder = os.path.join(app.config['UPLOAD_DIR'], prefix)
if not os.path.exists(folder): os.makedirs(folder)
file.save(os.path.join(folder, fn))
#return redirect(url_for('uploaded_file', filename=filename))
return {'media_uid':uid, 'filename':filename}, status.HTTP_200_OK
return {'error':'Upload failed'},status.HTTP_406_NOT_ACCEPTABLE
@app.route('/api/post',methods=['POST'])
@app.route('/api/post/<post_id>',methods=['GET'])
def post(post_id=None):
if request.method == 'POST':
# get data
data=request.json
print('POST /api/post:',data)
# make post
post = Post(content=data.get('content',''), timestamp=data.get('timestamp')).save()
# attach author
name = data.get('username')
if name:
author = Person.nodes.get_or_none(name=name)
author.wrote.connect(post)
# attach media
media_uid=data.get('media_uid')
if media_uid:
media=Media.nodes.get_or_none(uid=media_uid)
post.has_media.connect(media)
# return
post_id=post.uid
print('created new post!',post_id)
return {'post_id':post_id},status.HTTP_200_OK
print('got post id!',post_id)
post = Post.nodes.get_or_none(uid=post_id)
if not post: return {},status.HTTP_204_NO_CONTENT
return post.data,status.HTTP_200_OK
@app.route('/api/download/<prefix>/<filename>',methods=['GET'])
def download(prefix, filename):
filedir = os.path.join(app.config['UPLOAD_DIR'], prefix)
print(filedir, filename)
return send_from_directory(filedir, filename)
### READ
@app.route('/api/followers/<name>')
def get_followers(name=None):
person = Person.match(G, name).first()
data = [p.data for p in person.followers]
return jsonify(data)
@app.route('/api/followers/<name>')
def get_follows(name=None):
person = Person.match(G, name).first()
data = [p.data for p in person.follows]
return jsonify(data)
@app.route('/api/posts')
@app.route('/api/posts/<name>')
def get_posts(name=None):
if name:
person = Person.nodes.get_or_none(name=name)
data = [p.data for p in person.wrote.all()] if person is not None else []
else:
data = [p.data for p in Post.nodes.order_by('-timestamp')]
# print(data)
return jsonify({'posts':data})
@app.route('/api/post/<int:id>')
def get_post(id=None):
post = Post.match(G, int(id)).first()
data = post.data
return jsonify(data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5555)
# socketio.run(app,host='0.0.0.0', port=5555)
# from gevent import pywsgi
# from geventwebsocket.handler import WebSocketHandler
# server = pywsgi.WSGIServer(('', 5555), app, handler_class=WebSocketHandler)
# server.serve_forever()
"""

@ -13,7 +13,7 @@ PATH_PUBLIC_KEY=os.path.join(key_dir,'public_key.pem')
### CREATING KEYS
def new_keys(save=True):
def new_keys(save=True,password=None):
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
@ -22,7 +22,7 @@ def new_keys(save=True):
public_key = private_key.public_key()
if save:
save_private_key(private_key)
save_private_key(private_key,password=password)
save_public_key(public_key)
return private_key,public_key
@ -31,7 +31,7 @@ def save_private_key(private_key,fn=PATH_PRIVATE_KEY,return_instead=False):
pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
encryption_algorithm=serialization.NoEncryption() if not password else serialization.BestAvailableEncryption(password.encode())
)
if return_instead: return pem
with open(fn,'wb') as f: f.write(pem)
@ -50,11 +50,11 @@ def save_public_key(public_key,fn=PATH_PUBLIC_KEY,return_instead=False):
def load_keys():
return (load_private_key(), load_public_key())
def load_private_key(fn=PATH_PRIVATE_KEY):
def load_private_key(fn=PATH_PRIVATE_KEY,password=None):
with open(fn, "rb") as key_file:
return serialization.load_pem_private_key(
key_file.read(),
password=None,
password=password.encode(),
backend=default_backend()
)

@ -92,7 +92,8 @@ def connect():
#await node.set("my-key2", "my awesome value")
# get the value associated with "my-key" from the network
result = await node.get("my-key2")
print(result)
#result = await node.get("my-key2")
# print(result)
return node
asyncio.run(run())
return asyncio.run(run())

@ -17,8 +17,6 @@
## CLASS DEFS
<MyBoxLayout>:
@ -45,6 +43,15 @@
size_hint:1,None
<AddPostScreen>:
name: 'post'
id: post_screen
<ViewPostScreen>:
name: 'view'

@ -1,6 +1,3 @@
#:import AddPostScreen screens.post.post.AddPostScreen
#:import ViewPostScreen screens.post.post.ViewPostScreen
#:import PostCard screens.feed.feed.PostCard
<AddPostTextField>
@ -154,10 +151,10 @@
<AddPostScreen>:
<AddPostScreen@Screen>:
name: 'post'
id: post_screen
<ViewPostScreen>:
<ViewPostScreen@Screen>:
name: 'view'

Loading…
Cancel
Save