import socketio import eventlet # SESSION class server_session(): def __init__(self): self.clients = [] self.logged_in = [] self.accepting_clients = True self.mode = "normal" self.flags = [] self.encrypt_on_shutdown = True self.db_encrypted = True self.password = None # this is a class object shared accross the server # it allows access to some basic infomation about the server's current status session = server_session() # SESSION # STARTUP from modules.track.logging import log from modules.start.start import main as server_startup server_startup(session) # STARTUP # MODULES from modules.auth import auth from modules.track import * send_status = logging.status.send_status from modules.user import info as user_info from modules.handler.handler import * from modules.handler.tasks import user_service, server_service from modules.algorithms.univ import dict_key_verify from modules.data.datetime import timestamp from modules.data.config import read as config_read # MODULES sio = socketio.Server() app = socketio.WSGIApp(sio) # CONNECT/DISCONNECT EVENTS @sio.event def connect(sid, environ, auth): if session.accepting_clients: sio.save_session(sid, {'id': None, 'level': None}) log("INFO", f"client {sid} connected") session.clients.append(sid) else: # return status here, create interface etc sio.disconnect(sid) @sio.event def disconnect(sid): log("INFO", f"client {sid} disconnected") session.clients.remove(sid) if sid in session.logged_in: session.logged_in.remove(sid) # CONNECT/DISCONNECT EVENTS # AUTH EVENTS @sio.event def login(sid, data): info = {'logged_in': False} status, user_id, level = auth.login(sio, sid, data) with sio.session(sid) as client_session: # saves some infomation to the sid of a connected client # this sid can be passed to other functions to identify the client even if they havent provided specfic info to that event # as long as they have logged in client_session['id'] = user_id client_session['level'] = level if auth.authorised(sio, sid, "member"): info['logged_in'] = True if sid not in session.logged_in: session.logged_in.append(sid) sio.start_background_task(user_service, sio, sid) send_status(sio, sid, status) return True, info # any event that returns infomation will return True as its first parameter # this is to let the client side function know that the infomation being returned is a "callback" from the server # without this the client side function would have no way of knowing if the function has been called by the server or the client itself @sio.event def register(sid, data): status = auth.register(data) send_status(sio, sid, status) if status['level'] == "INFO": return True, {'is_registered': True} return True, {'is_registered': False} @sio.event def admin_register(sid, data): status = auth.admin_register(data) send_status(sio, sid, status) if status['level'] == "INFO": return True, {'is_registered': True} return True, {'is_registered': False} @sio.event def auth_get(sid, data=None): info, status = auth_handler(sio, sid, session, min_level='member', event_name='auth_get').get(data) return True, info @sio.event def auth_set(sid, data=None): info, status = auth_handler(sio, sid, session, min_level='member', event_name='auth_set').set(data) # AUTH EVENTS # PROFILE EVENTS @sio.event def profile_get(sid, data=None): info, status = profile_handler(sio, sid, session, min_level='member', event_name='profile_get').get(data) return True, info @sio.event def profile_get_permissions(sid, data=None): info, status = profile_handler(sio, sid, session, min_level='member', event_name='profile_get_permissions').get_permissions(data) return True, info @sio.event def profile_set(sid, data=None): info, status = profile_handler(sio, sid, session, min_level='member', event_name='profile_set').set(data) @sio.event def profile_delete(sid, data=None): info, status = profile_handler(sio, sid, session, min_level='member', event_name='profile_delete').delete(data) # PROFILE EVENTS END # FRIEND EVENTS START @sio.event def friend_get(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_get').get(data) return True, info @sio.event def friend_get_requests(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_get_requests').get_requests(data) return True, info @sio.event def friend_get_recomendations(sid, data=None): friend_get_recomendations info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_get_recomendations').get_recomendations(data) return True, info @sio.event def friend_add_request(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_add_request').add_request(data) @sio.event def friend_approve_request(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_approve_request').approve_request(data) @sio.event def friend_remove_request(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_remove_request').remove_request(data) @sio.event def friend_reject_request(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='friend_reject_request').reject_request(data) @sio.event def friend_remove(sid, data=None): info, status = friend_handler(sio, sid, session, min_level='member', event_name='remove').remove(data) # FRIEND EVENTS END # OCCUAPTION EVENTS @sio.event def occupation_get(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_get').get(data) return True, info @sio.event def occupation_get_all(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_get_all').get_all(data) return True, info @sio.event def occupation_set(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_set').set(data) @sio.event def occupation_set_request(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_set_request').set_request(data) @sio.event def occupation_get_request(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_get_request').get_request(data) return True, info @sio.event def occupation_get_all_requests(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_get_all_request').get_all_request(data) return True, info @sio.event def occupation_delete_request(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='member', event_name='occupation_delete_request').delete_request(data) @sio.event def occupation_approve_request(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='management', event_name='occupation_approve_request').approve_request(data) @sio.event def occupation_reject_request(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='management', event_name='occupation_reject_request').reject_request(data) @sio.event def occupation_create(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='management', event_name='occupation_create').create(data) @sio.event def occupation_edit(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='management', event_name='occupation_edit').edit(data) @sio.event def occupation_delete_occupation(sid, data=None): info, status = occupation_handler(sio, sid, session, min_level='management', event_name='occupation_delete_occupation').delete_occupation(data) # OCCUAPTION EVENTS # TEAM EVENTS @sio.event def team_get(sid, data=None): info, status = team_handler(sio, sid, session, min_level='member', event_name='team_get').get(data) return True, info @sio.event def team_get_all(sid, data=None): info, status = team_handler(sio, sid, session, min_level='member', event_name='team_get_all').get_all(data) return True, info @sio.event def team_get_leaders(sid, data=None): info, status = team_handler(sio, sid, session, min_level='member', event_name='team_get_leaders').get_leaders(data) return True, info @sio.event def team_get_members(sid, data=None): info, status = team_handler(sio, sid, session, min_level='member', event_name='team_get_members').get_members(data) return True, info @sio.event def team_set(sid, data=None): info, status = team_handler(sio, sid, session, min_level='member', event_name='team_set').set(data) @sio.event def team_delete_leaders(sid, data=None): info, status = team_handler(sio, sid, session, min_level='member', event_name='team_delete_leaders').delete_leaders(data) # TEAM EVENTS # POST EVENTS @sio.event def post_get_feed(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get_feed').get_feed(data) return True, info @sio.event def post_get(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get').get(data) return True, info @sio.event def post_get_memories(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get').get_memories(data) return True, info @sio.event def post_get_user(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get_user').get_user(data) return True, info @sio.event def post_get_friends(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get_friends').get_friends(data) return True, info @sio.event def post_get_team(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get_team').get_team(data) return True, info @sio.event def post_get_permissions(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_get_permissions').get_permissions(data) return True, info @sio.event def post_set(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_set').set(data) @sio.event def post_delete(sid, data=None): info, status = post_handler(sio, sid, session, min_level='member', event_name='post_delete').delete(data) # POST EVENTS # COMMENT EVENTS @sio.event def comment_get(sid, data=None): info, status = comment_handler(sio, sid, session, min_level='member', event_name='comment_get').get(data) return True, info @sio.event def comment_get_post(sid, data=None): info, status = comment_handler(sio, sid, session, min_level='member', event_name='comment_get_post').get_post(data) return True, info @sio.event def comment_get_permissions(sid, data=None): info, status = comment_handler(sio, sid, session, min_level='member', event_name='comment_get_permissions').get_permissions(data) return True, info @sio.event def comment_set(sid, data=None): info, status = comment_handler(sio, sid, session, min_level='member', event_name='comment_set').set(data) return True, info @sio.event def comment_delete(sid, data=None): info, status = comment_handler(sio, sid, session, min_level='member', event_name='comment_delete').delete(data) return True, info # COMMENT EVENTS # IMPRESSION EVENTS @sio.event def post_impression_get(sid, data=None): info, status = post_impression_handler(sio, sid, session, min_level='member', event_name='post_impression_get').get(data) return True, info @sio.event def post_impression_get_post(sid, data=None): info, status = post_impression_handler(sio, sid, session, min_level='member', event_name='post_impression_get_post').get_post(data) return True, info @sio.event def post_impression_count(sid, data=None): info, status = post_impression_handler(sio, sid, session, min_level='member', event_name='post_impression_count').count(data) return True, info @sio.event def post_impression_set(sid, data=None): info, status = post_impression_handler(sio, sid, session, min_level='member', event_name='post_impression_set').set(data) @sio.event def post_impression_delete(sid, data=None): info, status = post_impression_handler(sio, sid, session, min_level='member', event_name='post_impression_delete').delete(data) @sio.event def comment_impression_get(sid, data=None): info, status = comment_impression_handler(sio, sid, session, min_level='member', event_name='comment_impression_get').get(data) return True, info @sio.event def comment_impression_get_comment(sid, data=None): info, status = comment_impression_handler(sio, sid, session, min_level='member', event_name='comment_impression_get_comment').get_comment(data) return True, info @sio.event def comment_impression_count(sid, data=None): info, status = comment_impression_handler(sio, sid, session, min_level='member', event_name='comment_impression_count').count(data) return True, info @sio.event def comment_impression_set(sid, data=None): info, status = comment_impression_handler(sio, sid, session, min_level='member', event_name='comment_impression_set').set(data) @sio.event def comment_impression_delete(sid, data=None): info, status = comment_impression_handler(sio, sid, session, min_level='member', event_name='comment_impression_delete').delete(data) # IMPRESSION EVENTS END # NOTIFICATION EVENTS START @sio.event def notification_get(sid, data=None): info, status = notification_handler(sio, sid, session, min_level='member', event_name='notification_get').get(data) return True, info @sio.event def notification_create(sid, data=None): status = notification_handler(sio, sid, session, min_level='member', event_name='notification_create').create(data) @sio.event def notification_delete(sid, data=None): status = notification_handler(sio, sid, session, min_level='member', event_name='notification_delete').delete(data) @sio.event def notification_remove(sid, data=None): status = notification_handler(sio, sid, session, min_level='member', event_name='notification_remove').remove(data) # NOTIFICATION EVENTS END # OTHER EVENTS @sio.event def get_ntfy_topic(sid, data=None): info = {'topic': None} if sio.get_session(sid)['level']: user_id = sio.get_session(sid)['id'] username = user_info.auth(user_id=user_id).get()['username'] nfty_topic = f"{username}-{user_id[:8]}" info['topic'] = nfty_topic return True, info @sio.event def server_code_get(sid, data=None): code = config_read('miscellaneous', 'servercode') info = {'server_code': code} return True, info @sio.event def is_post_slot(sid, data=None): info = None if timestamp().is_valid_time(): info = {'is_post_slot': True} else: info = {'is_post_slot': False} return True, info @sio.event def get_date(sid, data=None): info = {'date':timestamp().date} return True, info @sio.event def post_slot_get(sid, data=None): info, status = post_slot_handler(sio, sid, session, min_level='member', event_name='post_slot_get').get(data) return True, info @sio.event def shutdown(sid, data=None): info, status = server(sio, sid, session, min_level='admin', event_name='shutdown').shutdown(data) # OTHER EVENTS # ENCRYPTION EVENTS START @sio.event def decrypt(sid, data=None): success = encryption_handler(session).decrypt(data) return True, {'success': success} @sio.event def get_mode(sid, data=None): sss_enabled = config_read('database', 'ShamirSecretSharing') min_shares = config_read('database', 'MinimumShares') info = {'mode': session.mode, 'password': True, 'sss': sss_enabled, 'min_shares': min_shares} return True, info # ENCRYPTION EVENTS END def test(): from modules.algorithms.recomend import main as recommend recommend() def main(): # add mode check + while loop to background tasks sio.start_background_task(server_service, session) open_port = int(config_read('networking', 'Port')) eventlet.wsgi.server(eventlet.listen(('', open_port)), app) server(sio, None, session, min_level='admin', event_name='shutdown').internal_shutdown({'time': 0.1}) if __name__ == "__main__": main()