diff --git a/komrade/api/__init__.py b/komrade/api/__init__.py deleted file mode 100644 index f77d506..0000000 --- a/komrade/api/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .api import * \ No newline at end of file diff --git a/komrade/api/api.py b/komrade/api/api.py deleted file mode 100644 index 5baa762..0000000 --- a/komrade/api/api.py +++ /dev/null @@ -1,519 +0,0 @@ -# ### Constants -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.constants import * -LAST_N_IN_INBOX = 10 - - -### Imports - -import os,time,sys,logging -from pathlib import Path -import asyncio,time,sys -from base64 import b64encode,b64decode -sys.path.append(os.path.dirname(__file__)) -import logging -import asyncio -import shelve -from collections import OrderedDict -import pickle,os -from threading import Thread -from pathlib import Path - -# local imports -from komrade import * -CACHE_DIR = os.path.join(os.path.expanduser('~'),'.komrade','.cache') -if not os.path.exists(CACHE_DIR): os.makedirs(CACHE_DIR) -MEMCACHE_FNFN=os.path.join(CACHE_DIR,'.memory') - - -### Logging -def logger(): - import logging - handler = logging.StreamHandler() - formatter = logging.Formatter('[%(asctime)s]\n%(message)s\n') - handler.setFormatter(formatter) - logger = logging.getLogger('komrade') - logger.addHandler(handler) - logger.setLevel(logging.DEBUG) - return logger - -LOG = None - -def log(*x): - global LOG - if not LOG: LOG=logger().debug - - tolog=' '.join(str(_) for _ in x) - LOG(tolog) - - - -## func - -def bytes_from_file(filename,chunksize=8192): - with open(filename, 'rb') as f: - while True: - piece = f.read(chunksize) - if not piece: - break - yield piece - -def get_random_id(): - import uuid - return uuid.uuid4().hex - -def get_random_binary_id(): - import base64 - idstr = get_random_id() - return base64.b64encode(idstr.encode()) - -### Headless API - -def boot_lonely_selfless_node(port=8467): - async def go(): - api = Api(log=log, port=port) - await api.connect_forever() - asyncio.run(go()) - - -class NetworkStillConnectingError(OSError): pass - - -PORT_LISTEN = 5111 -async def _getdb(self=None,port=PORT_LISTEN): - return None - from kademlia.network import Server - - if self: - self.log('starting server on port %s..' % port) - - import os - if self: self.log(os.getcwd()) - node = Server(log=self.log if self else None) #fn='../p2p/data.db',log=(self.log if self else print))) - - try: - if self: self.log('listening on port %s...' % format(port)) - await node.listen(port) - except OSError: - raise NetworkStillConnectingError('Still connecting...') - #await asyncio.sleep(3) - - if self: self.log('bootstrapping server..') - await node.bootstrap(NODES_PRIME) - - if self: node.log = self.log - self.log('NODE:',node) - - # if self and self.app: - # self.app.close_dialog() - - return node - -def logg(*x): - print(*x) - - - - - - - - -class Api(object): - def __init__(self,log=None,port=PORT_LISTEN): - self.log = log if log is not None else logg - self.port=port - - # load file-based keys - self.load_keys() - - - async def connect_forever(self,save_every=60): - try: - i = 0 - self._node = await self.connect() - while True: - if not i%90: self.log(f'Node status (tick {i}): {self._node}') - if i and not i%save_every: await self.flush() - i += 1 - await asyncio.sleep(1) - # asyncio.sleep(0) - except (asyncio.CancelledError,KeyboardInterrupt) as e: - self.log('P2P node cancelled', e) - await self.flush() - finally: - # when canceled, print that it finished - self.log('P2P node shutting down') - pass - - @property - async def node(self): - if not hasattr(self,'_node'): - await self.connect() - self._node.log=self.log - return self._node - - async def connect(self): - port=self.port - # if self.app: self.app.open_dialog('hello?') - self.log('connecting on port %s...' % port) - node = await _getdb(self,port) - self.log(f'connect() has node {node}') - self._node = node - return node - - def get_tor_python_session(self): - # from torpy.http.requests import TorRequests - # with TorRequests() as tor_requests: - # with tor_requests.get_session() as s: - # # return s - # from torpy.http.requests import tor_requests_session - # with tor_requests_session() as s: # returns requests.Session() object - # return s - pass - - - - def get_tor_proxy_session(self): - session = requests.session() - # Tor uses the 9050 port as the default socks port - session.proxies = {'http': 'socks5://127.0.0.1:9050', - 'https': 'socks5://127.0.0.1:9050'} - return session - - def get_async_tor_proxy_session(self): - from requests_futures.sessions import FuturesSession - session = FuturesSession() - # Tor uses the 9050 port as the default socks port - session.proxies = {'http': 'socks5://127.0.0.1:9050', - 'https': 'socks5://127.0.0.1:9050'} - return session - - - - - def tor_request(self,url,method='get',data=None): - stopfixthis - with self.get_tor_proxy_session() as s: - if method=='get': - return s.get(url) - elif method=='post': - self.log('data',data) - return s.post(url,data=data) - - - def request(self,Q,**kwargs): - self.log('request() Q:',Q) - res = self.tor_request(Q,**kwargs) - self.log('reqeust() <-',res) - return res - - - - #@property - def load_keys(self): - # get key names - KEY_PATH_PUB ='.' - KEY_PATH_PRIV ='.' - - pub_key_names = [x.split('.')[1] for x in os.listdir(KEY_PATH_PUB) if x.count('.')==2 and x.endswith('.loc')] - priv_key_names = [x.split('.')[1] for x in os.listdir(KEY_PATH_PRIV) if x.count('.')==2 and x.endswith('.key')] - key_names = set(pub_key_names)|set(priv_key_names) - - self.log('get_keys() found public key names:',pub_key_names) - self.log('get_keys() found private key names:',priv_key_names) - - - # load and find all local - self._keys = {} - for key_name in key_names: - self.log('key_name =',key_name) - self._keys[key_name] = Komrade(key_name,api=self,create_if_missing=False) - - # break into types - self.accounts = [self._keys[name] for name in priv_key_names] - self.contacts = [self._keys[name] for name in pub_key_names] - - - self.log('get_keys() loaded accounts:',self.accounts) - self.log('get_keys() loaded contacts:',self.contacts) - - @property - def keys(self): - if not hasattr(self,'_keys'): self.load_keys() - return self._keys - - #async - def personate(self,persona_name,create_if_missing=True): - komrade = Komrade(persona_name,api=self,create_if_missing=create_if_missing) - res = persona.boot() - self.log('personate() res =',res) - return persona - # komrade = self.keys[persona_name] if persona_name in self.keys else None - # if komrade is None and create_if_missing: - # self.keys[persona_name] = komrade = Komrade(persona_name, api=self, create_if_missing=create_if_missing) - # res = await persona.boot() - # self.log('BOOT RESULT:',res) - # return persona - - - async def upload(self,filename,file_id=None, uri='/file/',uri_part='/part/'): - import sys - - if not file_id: file_id = get_random_id() - part_ids = [] - part_keys = [] - parts=[] - PARTS=[] - buffer_size=100 - for part in bytes_from_file(filename,chunksize=1024*2): - part_id = get_random_id() - part_ids.append(part_id) - part_key='/part/'+part_id - part_keys.append(part_key) - parts.append(part) - # PARTS.append(part) - - # self.log('part!:',sys.getsizeof(part)) - #self.set(part_key,part) - - if len(parts)>=buffer_size: - # self.log('setting...') - await self.set(part_keys,parts) - part_keys=[] - PARTS+=parts - parts=[] - - # set all parts - #self.set(part_keys,PARTS) - # self.log('# parts:',len(PARTS)) - if parts and part_keys: - await self.set(part_keys, parts) - - # how many parts? - # self.log('# pieces!',len(part_ids)) - - file_store = {'ext':os.path.splitext(filename)[-1][1:], 'parts':part_ids} - # self.log('FILE STORE??',file_store) - await self.set_json(uri+file_id,file_store) - - # file_store['data'].seek(0) - file_store['id']=file_id - return file_store - - async def download(self,file_id): - self.log('file_id =',file_id) - file_store = await self.get_json_val('/file/'+file_id) - self.log('file_store =',file_store) - if file_store is None: return - - self.log('file_store!?',file_store) - keys = ['/part/'+x for x in file_store['parts']] - - #time,pieces,pub,sign = await self.get_json_val(keys) - pieces = await self.get_json_val(keys) - self.log('pieces = ',pieces) - file_store['parts_data']=pieces - return file_store - - async def flush(self): - #self.log('saving back to db file...') - node = await self.node - node.storage.dump() - # self.log('DONE saving back to db file...') - - - - async def get_posts(self,uri='/inbox/world'): - # get IDs - post_ids = await self.get_post_ids(uri) - - # get posts - posts = [self.get_post(post_id) for post_id in post_ids] - return await asyncio.gather(*posts) - - - - - - - async def read_inbox(self,uri_inbox=None): - if uri_inbox is None: uri_inbox = P2P_PREFIX_INBOX+self.name.encode() - node = await self.node - inbox_ids = await node.get(uri_inbox) - if inbox_ids is not None: - inbox_ids = inbox_ids.split(BSEP) - self.log('found inbox IDs:',inbox_ids) - - msgs_toread = [self.read_msg(msg_id) for msg_id in inbox_ids] - msgs = await asyncio.gather(*msgs_toread) - self.log('read_inbox() msgs = ',msgs) - return msgs - return [] - - async def read_outbox(self,uri_outbox=None): - if uri_outbox is None: uri_outbox = P2P_PREFIX_OUTBOX+self.name.encode() - return await self.read_inbox(uri_outbox) - - - async def read_msg(self,msg_id): - self.log(f'Persona.read_msg({msg_id}) ?') - uri_msg=P2P_PREFIX_POST+msg_id - node = await self.node - komrade = await self.komrade - - res = await node.get(uri_msg) - self.log('res = ',res) - if res is not None: - double_encrypted_payload_b64 = res - single_encrypted_payload = self.decrypt(double_encrypted_payload_b64, komrade.pubkey_b64) - self.log('GOT ENRYPTED PAYLOAD:',single_encrypted_payload) - - signed_encrypted_payload_b64,from_pubkey_b64,name_b64,time_b64 = single_encrypted_payload.split(BSEP) - self.log('signed_encrypted_payload =',signed_encrypted_payload_b64) - self.log('from_pubkey_b64 =',from_pubkey_b64) - self.log('time_b64 =',time_b64) - - from_name = b64decode(name_b64).decode() - self.log('from_name =',from_name) - timestamp = b64decode(time_b64).decode() - tmpP = Komrade(from_name) - await tmpP.boot() - from_pubkey_b64_accto_name = tmpP.pubkey_b64 - assert from_pubkey_b64==from_pubkey_b64_accto_name - - encrypted_payload_b64 = self.verify(signed_encrypted_payload_b64, from_pubkey_b64) - self.log('encrypted_payload_b64 =',encrypted_payload_b64) - - payload = self.decrypt(encrypted_payload_b64, from_pubkey_b64) - self.log('payload =',payload) - return { - 'success':True, - 'content':payload, - 'from_name':from_name, - 'from_pubkey_b64':from_pubkey_b64, - 'timestamp':timestamp - } - return {'error':'Unknown'} - - async def refresh_inboxes(self): - uris_to_get=[] - - for komrade in self.accounts: - inbox = await persona.load_inbox(decrypt_msg_uri=True, last=LAST_N_IN_INBOX) - for decr_msg_uri in inbox: - uris_to_get.append(self.get_msg(decr_msg_uri)) - # uris_to_get+=inbox - - - res = await asyncio.gather(*uris_to_get) - for decr_msg_uri,encr_msg in res: - self.memcache[decr_msg_uri]=encr_msg - - self.memcache_save() - - @property - def memcache(self): - if not hasattr(self,'_memcache'): - self._memcache = OrderedDict() - if os.path.exists(MEMCACHE_FNFN): - import pickle - try: - self._memcache = pickle.load(open(MEMCACHE_FNFN,'rb')) - except EOFError: - pass - return self._memcache - - def memcache_save(self): - import pickle - with open(MEMCACHE_FNFN,'wb') as of: - pickle.dump(self.memcache, of) - self.log('>> saved:',MEMCACHE_FNFN) - - async def get_msg(self,decr_msg_uri): - self.log('get_msg()',decr_msg_uri) - rval=self.memcache.get(decr_msg_uri) - self.log('got <--',rval) - if rval is not None: - self.log('in memcache') - encr_msg = rval - else: - self.log('>> downloading',decr_msg_uri,'...') - - node = await self.node - encr_msg = await node.get(decr_msg_uri) - self.log('downloaded:',encr_msg) - - return (decr_msg_uri,encr_msg) - #self.memcache. - - async def see(self,decr_msg_id): - res=await self.get(decr_msg_id) - self.log('see() saw',res) - return decr_msg_id - - - -async def test1(): - api = Api() - - marx=await api.personate('marx') - elon=await api.personate('elon') - res = await marx.send(b'secret',to=elon) - - print(marx,elon,res) - -async def test(): - - api = Api() - - - # message? - marx=await api.personate('marx') - elon=await api.personate('elon') - res = await marx.send(b'secret',to=elon) - - res = await elon.send(b'secret back',to=marx) - # print(marx,elon,res) - - # get overall inbox - meta_inbox = await api.refresh_inboxes() - api.log('meta_inbox',meta_inbox) - - keys = api.memcache.keys() - api.log('ALL KEYS =',keys) - - for key in keys: - val = api.memcache.get(key) - api.log(key,'-->',val) - # stop - -#async -async def test_keyserver(): - api = Api() - marx = api.personate('marx') - elon = api.personate('elon') - - - - - zuck = api.personate('zuck') - - print('marx',marx.pubkey_b64) - - print('elon',elon.pubkey_b64) - - print('zuck',zuck.pubkey_b64) - - - #marx = await api.personate(marx) - #res = await api.get_externally_signed_pubkey('marx') - #res = await api.get_externally_signed_pubkey('marx') - #return res - - await elon.send(b'oh no',to=marx) - - -if __name__=='__main__': - asyncio.run(test_keyserver()) \ No newline at end of file diff --git a/komrade/api/persona.py b/komrade/api/persona.py deleted file mode 100644 index 4c0fea1..0000000 --- a/komrade/api/persona.py +++ /dev/null @@ -1,81 +0,0 @@ -# mine imports -import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..'))) -from komrade.backend.caller import Caller -from komrade import KomradeException,Logger - -# other imports -import asyncio,os,time,sys,logging,getpass -from pythemis.skeygen import KEY_PAIR_TYPE, GenerateKeyPair -from pythemis.smessage import SMessage, ssign, sverify -from pythemis.exception import ThemisError -from pythemis.scell import SCellSeal -from base64 import b64decode,b64encode -from pathlib import Path - - -class Model(Logger): pass - -class UserAlreadyExists(KomradeException): pass - -class Komrade(Model): - def __init__(self, name, is_group=False): - self.name = name - self.is_group=is_group - - @property - def op(self): - return Caller(self.name) - - - ### - # MAJOR OPERATIONS - ### - - def register(self,passphrase = DEBUG_DEFAULT_PASSPHRASE): - """ - Register this new persona. - Protect keys according to a passphrase. - If group, only admin key pass-protected; - if individual, all keys pass-protected. - """ - - # Does user already exist? - if self.op.exists(): raise UserAlreadyExists('User already exists') - - # Get passphrase - if not passphrase: passphrase = getpass.getpass('Enter password for new account: ') - - # Create - if self.is_group: - self.op.create_keys(adminkey_pass=passphrase) - else: - self.op.create_keys(privkey_pass=passphrase,adminkey_pass=passphrase) - - - def login(self,passphrase = DEBUG_DEFAULT_PASSPHRASE): - # Get passphrase - if not passphrase: passphrase = getpass.getpass('Enter login password: ') - - # Get my decryption keys - if self.is_group: - keychain_decr = self.op.keychain_decr(adminkey_pass=passphrase) - else: - keychain_decr = self.op.keychain_decr(privkey_pass=passphrase,adminkey_pass=passphrase) - - print(keychain_decr) - - - - - - -if __name__ == '__main__': - import random - idnum = random.choice(list(range(1000))) - komrade = Komrade('Op'+str(idnum)) - print('\n\n\nREGISTERING\n\n\n') - persona.register(passphrase='bb') - - print('\n\n\nLOGGING IN\n\n\n') - - persona.login(passphrase='bb') \ No newline at end of file diff --git a/komrade/api/run.sh b/komrade/api/run.sh deleted file mode 100755 index 027a7d7..0000000 --- a/komrade/api/run.sh +++ /dev/null @@ -1 +0,0 @@ -python -c "import api; api.boot_lonely_selfless_node()" \ No newline at end of file diff --git a/komrade/app/assets/avatars/Telephone.jpg b/komrade/app/assets/avatars/Telephone.jpg new file mode 100644 index 0000000..3e886eb Binary files /dev/null and b/komrade/app/assets/avatars/Telephone.jpg differ diff --git a/komrade/app/assets/avatars/Telephone.png b/komrade/app/assets/avatars/Telephone.png new file mode 100644 index 0000000..60633cb Binary files /dev/null and b/komrade/app/assets/avatars/Telephone.png differ diff --git a/komrade/app/main.py b/komrade/app/main.py index 6b1d392..c04588e 100644 --- a/komrade/app/main.py +++ b/komrade/app/main.py @@ -4,7 +4,7 @@ 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 komrade.api import Api + import logging logger=logging.getLogger(__name__) @@ -106,6 +106,7 @@ class MyLayout(MDBoxLayout): class ProgressPopup(MDDialog): pass class MessagePopup(MDDialog): pass +class MessagePopupCard(MDDialog): pass class MyBoxLayout(MDBoxLayout): pass class MyLabel(MDLabel): pass @@ -238,6 +239,9 @@ class MainApp(MDApp, Logger): logo.text_color=root.rgb(*COLOR_LOGO) self.root.change_screen_from_uri(self.uri if self.uri else DEFAULT_URI) + + + return self.root @@ -367,16 +371,26 @@ class MainApp(MDApp, Logger): #stop def stat(self,msg,komrade_name='Telephone',pause=False,**y): - logger.info(msg) - # self.open_msg_dialog(msg) - self.root.add_card({ - 'author':komrade_name, - 'to_name':self.komrade.name if self.komrade else '?', - 'content':str(msg) - }) + from komrade.app.screens.feed.feed import PostCard + if not hasattr(self,'msg_dialog') or not self.msg_dialog: + self.msg_dialog = MessagePopupCard() + # self.msg_dialog.ids.msg_label.text=msg + + self.msg_dialog.card = postcard = PostCard({ + 'author':komrade_name, + 'author_prefix':'Komrade @', + 'to_name':'me', + 'content':msg, + 'timestamp':time.time(), + }) + postcard.size_hint=(None,None) + postcard.size=('600sp','600sp') + self.msg_dialog.add_widget(postcard) + + self.msg_dialog.open() def open_msg_dialog(self,msg): - from screens.post.post import MessagePopup,ProgressPopup + # from screens.post.post import MessagePopup,ProgressPopup if not hasattr(self,'msg_dialog') or not self.msg_dialog: self.msg_dialog = MessagePopup() self.msg_dialog.ids.msg_label.text=msg @@ -388,6 +402,7 @@ class MainApp(MDApp, Logger): def close_msg_dialog(self): if hasattr(self,'msg_dialog'): + self.msg_dialog.remove_widget(self.msg_dialog.card) self.msg_dialog.dismiss() diff --git a/komrade/app/root.kv b/komrade/app/root.kv index afb227b..340337c 100644 --- a/komrade/app/root.kv +++ b/komrade/app/root.kv @@ -17,6 +17,7 @@ #:import COLOR_BG main.COLOR_BG #:import BG_IMG main.BG_IMG #:import COLOR_TEXT main.COLOR_TEXT +#:import COLOR_CARD main.COLOR_CARD ## CLASS DEFS @@ -98,19 +99,26 @@ type: "custom" size_hint: None,None size: ('300dp','300dp') - # md_bg_color: 0,0,0,1 + # md_bg_color: rgb(*COLOR_CARD) MDBoxLayout: id: msg_popup_box_layout size_hint:(1,1) orientation: 'vertical' cols:1 - md_bg_color: 0,0,0,1 + md_bg_color: rgb(*COLOR_CARD) spacing:'0dp' padding:'0dp' pos_hint: {'center_x':0.5, 'center_y':0.5} # radius:[20,] # border_radius:20 + border_radius:20 + canvas: + Color: + rgba: rgb(*COLOR_CARD_BORDER,a=0.5) + Line: + width: 1 + rounded_rectangle: (self.x, self.y, self.width, self.height, 20, 20, 20, 20) @@ -127,6 +135,52 @@ pos_hint: {'center_x': .5, 'y': 0} +: + type: "custom" + size_hint: 1,1 + # size: ('300dp','300dp') + # md_bg_color: rgb(*COLOR_CARD) + md_bg_color:0,0,0,1 + size:('600sp','600sp') + + MDBoxLayout: + id: msg_popup_box_layout + #size_hint:(1,1) + orientation: 'vertical' + padding: "20dp" + size_hint: (1, 1) + # adaptive_height: True + pos_hint: {"center_x": .5, "center_y": .5} + # md_bg_color: rgb(*COLOR_CARD) + md_bg_color:0,0,0,0 + height: self.minimum_height + # radius:[20,] + # border_radius:20 + # canvas: + # Color: + # rgba: rgb(*COLOR_CARD_BORDER,a=0.5) + # Line: + # width: 1 + # rounded_rectangle: (self.x, self.y, self.width, self.height, 20, 20, 20, 20) + + + # MDLabel: + # # size_hint:(None,None) + # id: msg_label + # text: '' + # halign: 'center' + # # valign: 'top' + # theme_text_color: 'Custom' + # text_color: rgb(*COLOR_TEXT) + # font_size: '18dp' + # font_name: 'assets/overpass-mono-regular.otf' + # pos_hint: {'center_x': .5, 'y': 0} + + + + + + diff --git a/komrade/app/screens/base.py b/komrade/app/screens/base.py index 304602f..ebd1833 100644 --- a/komrade/app/screens/base.py +++ b/komrade/app/screens/base.py @@ -29,6 +29,29 @@ class BaseScreen(MDScreen): +# class CardScreen(BaseScreen): +# @property +# def cards(self): +# if not hasattr(self,'_cards'): self._cards=[] +# return self._cards + +# def clear_deck(self): +# for card in self.cards: +# self.ids.post_carousel.remove_widget(card) + +# def add_card(self,data): +# card = PostCard(data) +# if not hasattr(self,'_cards'): self._cards=[] +# self._cards.append(card) + +# self.app.log('card!',data) +# self.app.log('ids:',self.ids.keys(), type(self)) +# self.app.log('card obj?',card) +# # self.ids.post_carousel.add_widget(card) +# stop + + + diff --git a/komrade/app/screens/feed/feed.py b/komrade/app/screens/feed/feed.py index 01449ef..429624c 100644 --- a/komrade/app/screens/feed/feed.py +++ b/komrade/app/screens/feed/feed.py @@ -118,7 +118,9 @@ class PostCard(MDCard): self.content = data.get('content','') self.timestamp = data.get('timestamp',None) self.bind(minimum_height=self.setter('height')) - + author_prefix=data.get('author_prefix','@') + author_label_font_size=data.get('author_label_font_size','24sp') + recip_label_font_size=data.get('author_label_font_size','14sp') # minwidth = 400 # maxwidth = 800 @@ -135,14 +137,14 @@ class PostCard(MDCard): # pieces self.author_section_layout = author_section_layout = PostAuthorLayout() - self.author_label = author_label = PostAuthorLabel(text='@'+self.author) + self.author_label = author_label = PostAuthorLabel(text=author_prefix+self.author) self.author_label.font_name='assets/overpass-mono-semibold.otf' if self.recipient: recip=self.recipient recip='@'+recip if recip and recip[0].isalpha() else recip self.author_label.text+='\n[size=14sp]to '+recip+'[/size]' self.author_label.markup=True - self.author_label.font_size = '24sp' + self.author_label.font_size = author_label_font_size self.author_avatar = author_avatar = PostAuthorAvatar(source=f'assets/avatars/{self.author}.png') #self.img_src) self.author_section_layout.add_widget(author_avatar) self.author_section_layout.add_widget(author_label) @@ -243,56 +245,29 @@ class PostCard(MDCard): class FeedScreen(BaseScreen): posts = ListProperty() - # def on_pre_enter(self): - # if not hasattr(self,'get_posts'): self.get_posts=self.app.komrade.posts - # super().on_pre_enter() - # for post in self.posts: - # self.ids.post_carousel.remove_widget(post) - - # i=0 - # lim=25 - # self.app.komrade.get_updates() - # posts=self.get_posts() - # for i,post in enumerate(reversed(posts)): - # if i>lim: break - # data = { - # 'author':post.from_name, - # 'to_name':post.to_name, - # 'content':post.msg.get('txt') if type(post.msg)==dict else str(post.msg) - # } - # post_obj = PostCard(data) - # self.posts.append(post_obj) - # self.ids.post_carousel.add_widget(post_obj) - def on_pre_enter(self): - self.clear_deck() - # for i,x - - - - - #### - # - - @property - def cards(self): - if not hasattr(self,'_cards'): self._cards=[] - return self._cards - - def clear_deck(self): - for card in self.cards: - self.ids.post_carousel.remove_widget(card) - - def add_card(self,data): - card = PostCard(data) - if not hasattr(self,'_cards'): self._cards=[] - self._cards.append(card) - - self.app.log('card!',data) - self.app.log('ids:',self.ids.keys(), type(self)) - self.app.log('card obj?',card) - # self.ids.post_carousel.add_widget(card) - stop + if not hasattr(self,'get_posts'): self.get_posts=self.app.komrade.posts + super().on_pre_enter() + for post in self.posts: + self.ids.post_carousel.remove_widget(post) + + i=0 + lim=25 + self.app.komrade.get_updates() + posts=self.get_posts() + for i,post in enumerate(reversed(posts)): + if i>lim: break + data = { + 'author':post.from_name, + 'to_name':post.to_name, + 'content':post.msg.get('txt') if type(post.msg)==dict else str(post.msg) + } + post_obj = PostCard(data) + self.posts.append(post_obj) + self.ids.post_carousel.add_widget(post_obj) + # def on_pre_enter(self): + # self.clear_deck() + # # for i,x diff --git a/komrade/app/screens/login/login.py b/komrade/app/screens/login/login.py index f88073a..3b66112 100644 --- a/komrade/app/screens/login/login.py +++ b/komrade/app/screens/login/login.py @@ -160,11 +160,21 @@ class LoginScreen(BaseScreen): return self.password_field.text def boot(self,un): + + self.app.stat( + 'You chose the username '+un + ) + + + return kommie = Komrade(un,getpass_func=self.getpass_func) # self.show_pass_opt() + logger.info(f'booted kommie: {kommie}') if kommie.exists_locally_as_account(): + logger.info(f'is account') 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.app.is_logged_in=True self.app.username=kommie.name @@ -172,6 +182,7 @@ class LoginScreen(BaseScreen): self.remove_widget(self.layout) self.root.change_screen('feed') else: + logger.info(f'passkey login failed') self.login_status.text='Login failed...' # self.layout.add_widget(self.layout_password) diff --git a/komrade/app/screens/profile/profile.py b/komrade/app/screens/profile/profile.py index f64c9e0..9f94f98 100644 --- a/komrade/app/screens/profile/profile.py +++ b/komrade/app/screens/profile/profile.py @@ -1,3 +1,6 @@ +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 screens.base import BaseScreen from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.chip import MDChip @@ -18,7 +21,6 @@ from copy import copy,deepcopy from kivy.animation import Animation from main import MyLabel,COLOR_ICON from misc import * -import os diff --git a/komrade/constants.py b/komrade/constants.py index 1a3753b..e3bda94 100644 --- a/komrade/constants.py +++ b/komrade/constants.py @@ -1,11 +1,11 @@ # addresses KOMRADE_ONION = 'u7spnj3dmwumzoa4.onion' KOMRADE_ONION2 = 'rwg4zcnpwshv4laq.onion' -KOMRADE_URL = KOMRADE_ONION +KOMRADE_URL = '68.66.241.111' #KOMRADE_ONION -OPERATOR_API_URL = f'http://{KOMRADE_ONION}/op/' -# OPERATOR_API_URL = f'http://{KOMRADE_URL}/op/' +# OPERATOR_API_URL = f'http://{KOMRADE_ONION}/op/' +OPERATOR_API_URL = f'http://{KOMRADE_URL}/op/' # paths diff --git a/script/install b/script/install index 53fed4f..221e521 100644 --- a/script/install +++ b/script/install @@ -101,8 +101,8 @@ then #eval "$(pyenv init -)" - pyenv install 3.7.3 - pyenv local 3.7.3 + $HOME/.pyenv/bin/pyenv install 3.7.3 + fi fi @@ -117,22 +117,33 @@ echo ' ' ## the pyenv way -if command -v pyenv &> /dev/null +if command -v $HOME/.pyenv/bin/pyenv &> /dev/null then + # activate right version + $HOME/.pyenv/bin/pyenv local 3.7.3 + + # activate right python exec in terminal + eval "$($HOME/.pyenv/bin/pyenv init -)" + cd $path_repo - pyenv install --skip-existing + + echo "Using Python version:" + python3 --version + + $HOME/.pyenv/bin/pyenv install --skip-existing + #VENV="${PWD##*/}.venv" VENV="venv" VENV=${VENV#-} - python -m venv $VENV + python3 -m venv $VENV . $VENV/bin/activate - python -m pip install -U pip setuptools wheel - python -m pip install -r requirements.txt + python3 -m pip install -U pip setuptools wheel + python3 -m pip install -r requirements.txt else cd $path_repo - python -m pip install virtualenv - python -m virtualenv venv + python3 -m pip install virtualenv + python3 -m virtualenv venv source venv/bin/activate pip install -r requirements.txt fi