diff --git a/blasta/__main__.py b/blasta/__main__.py index 2f1c60d..7c4f066 100644 --- a/blasta/__main__.py +++ b/blasta/__main__.py @@ -15,8 +15,8 @@ import argparse from blasta.config import Cache, Settings, Share from blasta.http.instance import HttpInstance from blasta.database.sqlite import DatabaseSQLite +from blasta.utilities.logger import UtilitiesLogger import json -import logging import os from os.path import getsize, exists import shutil @@ -80,9 +80,38 @@ if __name__ == 'blasta.__main__': usage='%(prog)s [OPTION]...') parser.add_argument('-v', '--version', help='print version', action='version', version='0.1') + + # Setup the command line arguments. parser.add_argument('-p', '--port', help='port number', dest='port') parser.add_argument('-o', '--open', help='open an html browser', action='store_const', const=True, dest='open') + parser.add_argument('--no-log', '--nolog', help='Do not create a log file', + action='store_const', dest='nolog', + const=True, default=False) + + # Output verbosity options. + parser.add_argument('-d', '--debug', help='set logging to DEBUG', + action='store_const', dest='loglevel', + const='debug', default='info') + parser.add_argument('-q', '--quiet', help='set logging to ERROR', + action='store_const', dest='loglevel', + const='error', default='info') + parser.add_argument('-w', '--warning', help='set logging to WARNING', + action='store_const', dest='loglevel', + const='warn', default='info') + args = parser.parse_args() + + filename_log = os.path.join(directory_cache, 'blasta_log.csv') + filename_log_old = os.path.join(directory_cache, 'blasta_log.csv.old') + if os.path.exists(filename_log): os.rename(filename_log, filename_log_old) + loglevel = args.loglevel + logger = UtilitiesLogger('blasta') + if not args.nolog: + logger.set_filename(filename_log) + with open(filename_log, 'a') as file: + file.write('Time,,Level,Module,Function,JID/Path,Message\n') + logger.set_level(loglevel) + port = int(args.port or 8000) app = main() diff --git a/blasta/http/instance.py b/blasta/http/instance.py index 7fcf710..97f7f84 100644 --- a/blasta/http/instance.py +++ b/blasta/http/instance.py @@ -8,12 +8,12 @@ from blasta.utilities.cryptography import UtilitiesCryptography from blasta.utilities.data import UtilitiesData from blasta.utilities.date import UtilitiesDate from blasta.utilities.http import UtilitiesHttp +from blasta.utilities.logger import UtilitiesLogger from blasta.utilities.syndication import UtilitiesSyndication from blasta.xmpp.form import DataForm from blasta.xmpp.instance import XmppInstance from blasta.xmpp.iq import XmppIq from blasta.xmpp.pubsub import XmppPubsub -from datetime import datetime from fastapi import Cookie, FastAPI, File, Form, HTTPException, Request, Response, UploadFile from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, HTMLResponse @@ -22,10 +22,13 @@ from fastapi.templating import Jinja2Templates import os import random from slixmpp.stanza.iq import Iq +import sys from starlette.responses import RedirectResponse import urllib.parse import xml.etree.ElementTree as ET +logger = UtilitiesLogger(__name__) + class HttpInstance: def __init__(self, accounts, sessions): @@ -127,9 +130,12 @@ class HttpInstance: # It appears that there is a problem to set or send a "cookie" when a template is returned. @self.app.middleware('http') async def middleware_handler(request: Request, call_next): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') # Handle URL query - if request.url.path != '/save': + if request_url_path != '/save': param_url = request.query_params.get('url', '') or None param_hash = request.query_params.get('hash', '') or None if param_hash: @@ -141,14 +147,8 @@ class HttpInstance: response = await call_next(request) jabber_id = session_key = None - infoo = { - 'accounts' : accounts, - 'sessions' : sessions - } - print(infoo) - # Handle credentials (i.e. so called "cookies") - if request.url.path == '/disconnect': + if request_url_path == '/disconnect': jid = request.cookies.get('jabber_id') if jid in accounts: del accounts[jid] if jid in sessions: del sessions[jid] @@ -159,23 +159,24 @@ class HttpInstance: # Access the variable from the request state jabber_id = request.app.state.jabber_id except Exception as e: - print(request.cookies.get('jabber_id')) - print(e) + jabber_id = request.cookies.get('jabber_id') + logger.error(f'{function_name},{jabber_id},{str(e)}') pass try: # Access the variable from the request state session_key = request.app.state.session_key except Exception as e: - print(request.cookies.get('session_key')) - print(e) + session_key = request.cookies.get('session_key') + logger.error(f'{function_name},{session_key},{str(e)}') pass if jabber_id and session_key: - print(['Establishing a sessiong for:', jabber_id, session_key]) + logger.info(f'{function_name},{jabber_id},Session key: {session_key}') response.set_cookie(key='jabber_id', value=jabber_id) response.set_cookie(key='session_key', value=session_key) # del request.app.state.jabber_id # del request.app.state.session_key request.app.state.jabber_id = request.app.state.session_key = None + logger.debug(f'{function_name},{request_url_path},Finish') return response # response.set_cookie(key='session', value=str(jid) + '/' + str(session_key)) @@ -191,46 +192,74 @@ class HttpInstance: @self.app.exception_handler(401) def not_authorized_exception_handler(request: Request, exc: HTTPException): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') #jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) message = 'Not Authorized.' description = 'Not Authorized (401)' + logger.warning(f'{function_name},{request_url_path},{description}') + logger.debug(f'{function_name},{request_url_path},Finish') return result_post(request, description, message) @self.app.exception_handler(403) def access_denied_exception_handler(request: Request, exc: HTTPException): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) message = 'Blasta system message » Access denied.' description = 'Access denied (403)' path = 'error' + logger.warning(f'{function_name},{request_url_path},{description}') + logger.debug(f'{function_name},{request_url_path},Finish') return result_post(request, jabber_id, description, message, path) @self.app.exception_handler(404) def not_found_exception_handler(request: Request, exc: HTTPException): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) message = 'Blasta system message » Not Found.' description = 'Not found (404)' path = 'error' + logger.warning(f'{function_name},{request_url_path},{description}') + logger.debug(f'{function_name},{request_url_path},Finish') return result_post(request, jabber_id, description, message, path) @self.app.exception_handler(405) def not_allowed_exception_handler(request: Request, exc: HTTPException): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) message = 'Blasta system message » Method Not Allowed.' description = 'Not allowed (405)' path = 'error' + logger.warning(f'{function_name},{request_url_path},{description}') + logger.debug(f'{function_name},{request_url_path},Finish') return result_post(request, jabber_id, description, message, path) @self.app.exception_handler(500) def internal_error_exception_handler(request: Request, exc: HTTPException): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) message = 'Blasta system message » Internal Server Error.' description = 'Internal error (500)' path = 'error' + logger.warning(f'{function_name},{request_url_path},{description}') + logger.debug(f'{function_name},{request_url_path},Finish') return result_post(request, jabber_id, description, message, path) # TODO @self.app.get('/admin') def admin_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) authorized = None if authorized: @@ -240,14 +269,19 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response else: raise HTTPException(status_code=403, detail='Access denied') @self.app.get('/connect') def connect_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: + logger.debug(f'{function_name},{jabber_id},Finish') response = RedirectResponse(url='/jid/' + jabber_id) else: template_file = 'connect.xhtml' @@ -256,10 +290,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/contact') def contact_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'contact.xhtml' template_dict = { @@ -274,6 +312,7 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/disconnect') @@ -281,11 +320,15 @@ class HttpInstance: response: Response, jabber_id: str = Cookie(None), session_key: str = Cookie(None)): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') # response.set_cookie(max_age=0, value='', key='jabber_id') # response.set_cookie(max_age=0, value='', key='session_key') response = RedirectResponse(url='/') response.delete_cookie('session_key') response.delete_cookie('jabber_id') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/favicon.ico', include_in_schema=False) @@ -294,6 +337,9 @@ class HttpInstance: @self.app.get('/help') def help_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'help.xhtml' template_dict = { @@ -302,10 +348,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about') def help_about_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'about.xhtml' template_dict = { @@ -314,10 +364,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/folksonomy') def help_about_folksonomies_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'folksonomy.xhtml' template_dict = { @@ -326,10 +380,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/ideas') def help_about_ideas_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) protocol = request.url.scheme hostname = request.url.hostname + ':' + str(request.url.port) @@ -342,10 +400,14 @@ class HttpInstance: 'origin' : origin} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/philosophy') def help_about_philosophy_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'philosophy.xhtml' template_dict = { @@ -354,10 +416,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/projects') def help_about_projects_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'projects.xhtml' template_dict = { @@ -366,10 +432,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/software') def help_about_software_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'software.xhtml' template_dict = { @@ -378,10 +448,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/thanks') def help_about_thanks_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'thanks.xhtml' template_dict = { @@ -390,10 +464,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/xmpp') def help_about_xmpp_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'xmpp.xhtml' template_dict = { @@ -402,10 +480,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/xmpp/atomsub') def help_about_xmpp_atomsub_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'atomsub.xhtml' template_dict = { @@ -414,10 +496,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/xmpp/libervia') def help_about_xmpp_libervia_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'libervia.xhtml' template_dict = { @@ -426,10 +512,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/xmpp/movim') def help_about_xmpp_movim_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'movim.xhtml' template_dict = { @@ -438,11 +528,15 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/about/xmpp/pubsub') def help_about_xmpp_pubsub_get(request: Request): - date_now_iso = datetime.now().isoformat() + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') + date_now_iso = UtilitiesDate.get_current_time_as_iso8601() date_now_readable = UtilitiesDate.convert_iso8601_to_readable(date_now_iso) jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'pubsub.xhtml' @@ -454,10 +548,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/feeds') def help_about_feeds_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'feeds.xhtml' template_dict = { @@ -466,10 +564,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/questions') def help_questions_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'questions.xhtml' template_dict = { @@ -478,10 +580,14 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/syndication') def help_syndication_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') hostname = request.url.hostname + ':' + str(request.url.port) protocol = request.url.scheme origin = protocol + '://' + hostname @@ -495,10 +601,14 @@ class HttpInstance: 'pubsub_jid' : jabber_id_pubsub} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/help/utilities') def help_utilities_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) hostname = request.url.hostname protocol = request.url.scheme @@ -513,11 +623,15 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/jid', response_class=HTMLResponse) @self.app.post('/jid') async def jid_get(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') node_type = 'public' path = 'jid' jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) @@ -530,23 +644,33 @@ class HttpInstance: message = f'XMPP system message » {reason}.' description = 'IQ Error' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: response = await jid_main_get(request, node_type, path, jid=jabber_id) - return response else: description = 'An XMPP account is required' message = 'Blasta system message » Please connect with your XMPP account to view this directory.' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/jid/{jid}') @self.app.post('/jid/{jid}') async def jid_jid_get(request: Request, response : Response, jid): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = await jid_main_get(request, node_type='public', path='jid', jid=jid) + logger.debug(f'{function_name},{request_url_path},Finish') return response async def jid_main_get(request: Request, node_type=None, path=None, jid=None): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') ask = invite = name = origin = start = '' # pubsub_jid = syndicate = jid # message = 'Find and share bookmarks with family and friends!' @@ -778,13 +902,13 @@ class HttpInstance: iq = await XmppPubsub.get_node_item_ids(xmpp_instance, jid, node_public_id) if isinstance(iq, Iq): iq_items_remote = iq['disco_items'] - + # Cache a list of identifiers of node items to a file. iq_items_remote_name = [] for iq_item_remote in iq_items_remote: iq_item_remote_name = iq_item_remote['name'] iq_items_remote_name.append(iq_item_remote_name) - + #data_item_ids = {'iq_items' : iq_items_remote_name} #filename_item_ids = 'item_ids/' + jid + '.toml' #Data.save_to_toml(filename_item_ids, data_item_ids) @@ -814,6 +938,7 @@ class HttpInstance: message = f'XMPP system message » {iq}.' name = jid.split('@')[0] path = 'error' + logger.error(f'{function_name},{request_url_path},{description}') if not iq: message = 'XMPP system message » Empty.' description = 'An unknown error has occurred' @@ -827,7 +952,6 @@ class HttpInstance: description = 'Jabber ID does not appear to be exist' elif iq == 'not-authorized': description = 'You have no authorization to view ' + name + '\'s bookmarks.' - ask = True elif iq == 'Node not found': description = name + '\'s bookmarks directory appears to be empty.' @@ -867,7 +991,9 @@ class HttpInstance: description = 'An XMPP account is required' message = 'Blasta system message » Please connect with your XMPP account to view this directory.' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response #if not entries: raise HTTPException(status_code=404, detail='No entries were found') template_dict = { 'request': request, @@ -897,34 +1023,59 @@ class HttpInstance: template_file = 'browse.xhtml' response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/blasta.svg') def logo_get(): - return FileResponse(directory_data_graphic_svg) + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') + response = FileResponse(directory_data_graphic_svg) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/', response_class=HTMLResponse) @self.app.get('/new', response_class=HTMLResponse) async def root_get_new(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = await root_main_get(request, response, page_type='new') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/popular', response_class=HTMLResponse) async def root_get_popular(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = await root_main_get(request, response, page_type='popular') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/query', response_class=HTMLResponse) async def root_get_query(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = await root_main_get(request, response, page_type='query') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/recent', response_class=HTMLResponse) async def root_get_recent(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = await root_main_get(request, response, page_type='recent') + logger.debug(f'{function_name},{request_url_path},Finish') return response async def root_main_get(request: Request, response : Response, page_type=None): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) node_id = path = syndicate = page_type param_filetype = request.query_params.get('filetype', '') or None @@ -1068,6 +1219,7 @@ class HttpInstance: template_file = 'browse.xhtml' response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response """ @@ -1122,12 +1274,15 @@ class HttpInstance: response: Response, jabber_id: str = Form(...), password: str = Form(...)): + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{jabber_id},Start') if not UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request): # Store a variable in the request's state request.app.state.jabber_id = jabber_id session_key = str(random.random()) request.app.state.session_key = session_key accounts[jabber_id] = XmppInstance(jabber_id + '/blasta', password) + breakpoint() # accounts[jabber_id].authenticated # dir(accounts[jabber_id]) # accounts[jabber_id].failed_auth @@ -1135,7 +1290,7 @@ class HttpInstance: sessions[jabber_id] = session_key # Check if the user and password are present and valid # If not valid, return "Could not connect to JID" - + # FIXME Instead of an arbitrary number (i.e. 5 seconds), write a # while loop with a timeout of 10 seconds. @@ -1168,7 +1323,8 @@ class HttpInstance: message = f'XMPP system message » {reason}.' description = 'IQ Error' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, node_settings_id, 'routine') routine = None @@ -1192,13 +1348,18 @@ class HttpInstance: message = 'Blasta system message » Authorization has failed.' description = 'Connection has failed' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.post('/message') async def message_post(request: Request, jid: str = Form(...), body: str = Form(...)): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: #headline = 'This is a message from Blasta' @@ -1208,14 +1369,21 @@ class HttpInstance: message = f'Your message has been sent to {alias}.' description = 'Message has been sent' path = 'message' + logger.info(f'{function_name},{request_url_path},{description}') else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/now') def now_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'now.xhtml' template_dict = { @@ -1224,11 +1392,15 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/private', response_class=HTMLResponse) @self.app.post('/private') async def private_get(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') node_type = 'private' path = 'private' jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) @@ -1241,18 +1413,24 @@ class HttpInstance: message = f'Blasta system message » {reason}.' description = 'Directory "private" appears to be empty' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: response = await jid_main_get(request, node_type, path) - return response else: description = 'An XMPP account is required' message = 'Blasta system message » Please connect with your XMPP account to view this directory.' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/profile') async def profile_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: xmpp_instance = accounts[jabber_id] @@ -1289,13 +1467,18 @@ class HttpInstance: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.post('/profile') async def profile_post(request: Request, routine: str = Form(None), enroll: str = Form(None)): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: xmpp_instance = accounts[jabber_id] @@ -1326,11 +1509,16 @@ class HttpInstance: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/profile/export/{node_type}/{filetype}') async def profile_export_get(request: Request, node_type, filetype): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: xmpp_instance = accounts[jabber_id] @@ -1357,7 +1545,9 @@ class HttpInstance: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.post('/profile/import') @@ -1367,6 +1557,9 @@ class HttpInstance: merge: str = Form(None), node: str = Form(...), override: str = Form(None)): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: xmpp_instance = accounts[jabber_id] @@ -1401,8 +1594,10 @@ class HttpInstance: message = 'Blasta system message » Error: Unknown file type.' description = 'Import error' path = 'error' - return result_post(request, jabber_id, description, message, path) - + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response + # entries_node = entries[node] #breakpoint() @@ -1438,20 +1633,27 @@ class HttpInstance: message = f'Blasta system message » Imported {counter} items.' description = 'Import successful' path = 'profile' - return result_post(request, jabber_id, description, message, path) + response = result_post(request, jabber_id, description, message, path) else: message = 'Blasta system message » Error: No upload file sent.' description = 'Import error' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/save') async def save_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: routine = None @@ -1464,7 +1666,8 @@ class HttpInstance: #if len(iq['pubsub']['items']): if (isinstance(iq, Iq) and url_hash == iq['pubsub']['items']['item']['id']): - return RedirectResponse(url='/url/' + url_hash + '/edit') + response = RedirectResponse(url='/url/' + url_hash + '/edit') + return response iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, node_settings_id, 'routine') if isinstance(iq, Iq): payload = iq['pubsub']['items']['item']['payload'] @@ -1505,7 +1708,9 @@ class HttpInstance: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.post('/save') @@ -1515,6 +1720,9 @@ class HttpInstance: tags: str = Form(''), title: str = Form(...), url: str = Form(...)): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: xmpp_instance = accounts[jabber_id] @@ -1528,7 +1736,7 @@ class HttpInstance: return RedirectResponse(url='/url/' + url_hash + '/edit') description = 'Confirm properties of a bookmark' path = 'save' - published = datetime.now().isoformat() + published = UtilitiesDate.get_current_time_as_iso8601() template_file = 'edit.xhtml' template_dict = { 'request' : request, @@ -1546,16 +1754,21 @@ class HttpInstance: 'url_hash' : url_hash} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' - return response else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/read', response_class=HTMLResponse) @self.app.post('/read') async def read_get(request: Request, response : Response): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') node_type = 'read' path = 'read' jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) @@ -1568,17 +1781,23 @@ class HttpInstance: message = f'Blasta system message » {reason}.' description = 'Directory "read" appears to be empty' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: response = await jid_main_get(request, node_type, path) - return response else: description = 'An XMPP account is required' message = 'Blasta system message » Please connect with your XMPP account to view this directory.' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + esponse = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response def result_post(request: Request, jabber_id: str, description: str, message: str, path: str, http_code=None): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') template_file = 'result.xhtml' template_dict = { 'description' : description, @@ -1589,10 +1808,14 @@ class HttpInstance: 'request' : request} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/register') def register_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) template_file = 'register.xhtml' template_dict = { @@ -1601,19 +1824,32 @@ class HttpInstance: 'journal' : journal} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/rss') def rss(request: Request): - return RedirectResponse(url='/help/syndication') + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') + response = RedirectResponse(url='/help/syndication') + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/search') async def search_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = RedirectResponse(url='/search/all') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/search/all') async def search_all_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) description = 'Search for public bookmarks' form_action = '/query' @@ -1640,10 +1876,14 @@ class HttpInstance: 'path' : path} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/search/jid/{jid}') async def search_jid_get(request: Request, jid): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: if jabber_id == jid: @@ -1678,10 +1918,14 @@ class HttpInstance: response.headers['Content-Type'] = 'application/xhtml+xml' else: response = RedirectResponse(url='/search/all') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/search/url') async def search_url_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) description = 'Search for a bookmark' form_action = None # This is not relevant due to function middleware. Maybe / or /url. @@ -1708,10 +1952,14 @@ class HttpInstance: 'path' : path} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/tag') def tag_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) tag_list = DatabaseSQLite.get_tags_500(db_file) message = 'Common 500 tags sorted by name and sized by commonality.' @@ -1726,10 +1974,14 @@ class HttpInstance: 'tag_list' : tag_list} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/tag/{jid}') def tag_get_jid(request: Request, jid): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) # NOTE Consider retrieval of tags from cache file. # This is relevant to private and read nodes. @@ -1748,15 +2000,23 @@ class HttpInstance: 'tag_list' : tag_list} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/url') async def url_get(request: Request): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') response = RedirectResponse(url='/search/url') + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/url/{url_hash}') async def url_hash_get(request: Request, url_hash): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) node_id = f'hash:{url_hash}' param_hash = url_hash @@ -1780,7 +2040,9 @@ class HttpInstance: message = f'XMPP system message » Error: {iq}.' description = 'The requested bookmark could not be retrieved' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}: {iq}') + response = result_post(request, jabber_id, description, message, path) + return response if exist: # TODO Perhaps adding a paragraph with "your tags" and "who else has tagged this link" # and keep the (5 item) limit. @@ -1809,7 +2071,8 @@ class HttpInstance: message = 'Blasta system message » Error: Not found.' description = 'The requested bookmark does not exist' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) return response else: entry = DatabaseSQLite.get_entry_by_url_hash(db_file, url_hash) @@ -1845,7 +2108,8 @@ class HttpInstance: message = 'Blasta system message » Error: Not found.' description = 'The requested bookmark does not exist' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) return response else: entry = DatabaseSQLite.get_entry_by_url_hash(db_file, url_hash) @@ -1876,7 +2140,9 @@ class HttpInstance: message = 'Blasta system message » Error: Not found.' description = 'The requested bookmark does not exist' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response message = f'Information for URI {entries[0]["link"]}' # entry[2] if not instances: instances = 0 if instances > 1: @@ -1914,7 +2180,9 @@ class HttpInstance: message = 'Blasta system message » Error: MD5 message-digest algorithm.' description = 'The argument for URL does not appear to be a valid MD5 Checksum' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.post('/url/{url_hash}') @@ -1928,6 +2196,9 @@ class HttpInstance: tags_old: str = Form(''), title: str = Form(...), url: str = Form(...)): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') node_id = f'hash:{url_hash}' param_hash = url_hash syndicate = path = 'url' @@ -1935,7 +2206,7 @@ class HttpInstance: if jabber_id: name = jabber_id.split('@')[0] instances = DatabaseSQLite.get_entry_instances_by_url_hash(db_file, url_hash) - timestamp = datetime.now().isoformat() + timestamp = UtilitiesDate.get_current_time_as_iso8601() tags_new = UtilitiesData.organize_tags(tags) if tags else '' entry = {'title' : title.strip(), 'link' : url.strip(), @@ -1983,7 +2254,9 @@ class HttpInstance: description = 'Could not save bookmark' message = f'XMPP system message » {iq}.' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response #await XmppIq.send(iq, 15) # Save changes to cache file entries_cache_filename = os.path.join(directory_cache, 'items', jabber_id + '.toml') @@ -2069,15 +2342,20 @@ class HttpInstance: 'tags' : tags_new} response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' - return response else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') + return response @self.app.get('/url/{url_hash}/confirm') async def url_hash_confirm_get(request: Request, url_hash): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) node_id = f'hash:{url_hash}' param_hash = url_hash @@ -2103,7 +2381,9 @@ class HttpInstance: else: description = 'An unknown error has occurred' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response if exist: # TODO Add a check: if iq_item['id'] == url_hash: entries = [] @@ -2135,21 +2415,28 @@ class HttpInstance: response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' else: + logger.info(f'{function_name},{request_url_path},Redirecting to /jid/{jabber_id}') response = RedirectResponse(url='/jid/' + jabber_id) else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: message = 'Blasta system message » Error: MD5 message-digest algorithm.' description = 'The argument for URL does not appear to be a valid MD5 Checksum' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/url/{url_hash}/delete') async def url_hash_delete_get(request: Request, url_hash): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) node_id = f'hash:{url_hash}' param_hash = url_hash @@ -2175,7 +2462,9 @@ class HttpInstance: else: description = 'An unknown error has occurred' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response if exist: # TODO Add a check: if iq_item['id'] == url_hash: entries = [] @@ -2229,22 +2518,29 @@ class HttpInstance: response = templates.TemplateResponse(template_file, template_dict) response.headers['Content-Type'] = 'application/xhtml+xml' else: + logger.info(f'{function_name},{request_url_path},Redirecting to /jid/{jabber_id}') response = RedirectResponse(url='/jid/' + jabber_id) else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: message = 'Blasta system message » Error: MD5 message-digest algorithm.' description = 'The argument for URL does not appear to be a valid MD5 Checksum' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response @self.app.get('/url/{url_hash}/edit') @self.app.post('/url/{url_hash}/edit') async def url_hash_edit_get(request: Request, url_hash): + request_url_path = request.url.path + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{request_url_path},Start') jabber_id = UtilitiesHttp.is_jid_matches_to_session(accounts, sessions, request) # node_id = f'hash:{url_hash}' if len(url_hash) == 32: @@ -2271,8 +2567,9 @@ class HttpInstance: else: description = 'An unknown error has occurred' path = 'error' - return result_post(request, jabber_id, description, message, path) - + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + return response if exist: path = 'edit' description = 'Edit an existing bookmark' @@ -2304,6 +2601,23 @@ class HttpInstance: entry['jid'] = jabber_id entry['name'] = name entry['url_hash'] = url_hash + template_file = 'edit.xhtml' + template_dict = { + 'request' : request, + 'description' : description, + 'edit' : True, + 'jabber_id' : jabber_id, + 'journal' : journal, + 'node' : node, + 'path' : path, + 'published' : entry['published'], + 'summary' : entry['summary'], + 'tags' : ', '.join(entry['tags']), + 'title' : entry['title'], + 'url' : entry['link'], + 'url_hash' : url_hash} + response = templates.TemplateResponse(template_file, template_dict) + response.headers['Content-Type'] = 'application/xhtml+xml' else: message = f'XMPP system message » {iq}.' if iq == 'Node not found': @@ -2311,32 +2625,19 @@ class HttpInstance: else: description = 'An unknown error has occurred' path = 'error' - return result_post(request, jabber_id, description, message, path) - template_file = 'edit.xhtml' - template_dict = { - 'request' : request, - 'description' : description, - 'edit' : True, - 'jabber_id' : jabber_id, - 'journal' : journal, - 'node' : node, - 'path' : path, - 'published' : entry['published'], - 'summary' : entry['summary'], - 'tags' : ', '.join(entry['tags']), - 'title' : entry['title'], - 'url' : entry['link'], - 'url_hash' : url_hash} - response = templates.TemplateResponse(template_file, template_dict) - response.headers['Content-Type'] = 'application/xhtml+xml' + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: message = 'Blasta system message » Error: No active session.' description = 'You are not connected' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) else: message = 'Blasta system message » Error: MD5 message-digest algorithm.' description = 'The argument for URL does not appear to be a valid MD5 Checksum' path = 'error' - return result_post(request, jabber_id, description, message, path) + logger.error(f'{function_name},{request_url_path},{description}') + response = result_post(request, jabber_id, description, message, path) + logger.debug(f'{function_name},{request_url_path},Finish') return response diff --git a/blasta/utilities/logger.py b/blasta/utilities/logger.py new file mode 100644 index 0000000..26007f6 --- /dev/null +++ b/blasta/utilities/logger.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from datetime import datetime +import logging + +class UtilitiesLogger: + + def __init__(self, name): + self.logger = logging.getLogger(name) + + def set_level(self, loglevel): + match loglevel: + case 'debug': + level = logging.DEBUG + case 'error': + level = logging.ERROR + case 'info': + level = logging.INFO + case 'warning': + level = logging.WARNING + case _: + level = logging.NOTSET + + self.logger.setLevel(level) + + console_handler = logging.StreamHandler() + console_handler.setLevel(level) + + formatter = logging.Formatter('[%(asctime)s] %(levelname)s:%(name)s:%(message)s') + console_handler.setFormatter(formatter) + + # Add the console handler only if there are no handlers already + if not self.logger.handlers: + self.logger.addHandler(console_handler) + + def set_filename(self, filename): + + file_handler = logging.FileHandler(filename) + file_handler.setLevel(logging.DEBUG) + + formatter = logging.Formatter('%(asctime)s,%(levelname)s,%(name)s,%(message)s') + file_handler.setFormatter(formatter) + + # Add the console handler only if there are no handlers already + if not self.logger.handlers: + self.logger.addHandler(file_handler) + + def debug(self, message): + self.logger.debug(message) + + def info(self, message): + self.logger.info(message) + + def warning(self, message): + self.logger.warning(message) + + def error(self, message): + self.logger.error(message) + + def critical(self, message): + self.logger.critical(message) + +# Example usage: +# logger = Logger('my_logger') +# logger.set_level('debug') +# logger.debug('This is a debug message.') + +class Message: + + def printer(text): + now = datetime.now() + current_time = now.strftime("%H:%M:%S") +# print('{} {}'.format(current_time, text), end='\r') + print('{} {}'.format(current_time, text)) diff --git a/blasta/xmpp/instance.py b/blasta/xmpp/instance.py index 47f7820..179026d 100644 --- a/blasta/xmpp/instance.py +++ b/blasta/xmpp/instance.py @@ -1,13 +1,20 @@ #!/usr/bin/python # -*- coding: utf-8 -*- +from blasta.utilities.logger import UtilitiesLogger from slixmpp import ClientXMPP +import sys + +logger = UtilitiesLogger(__name__) class XmppInstance(ClientXMPP): + def __init__(self, jid, password): + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{jid},Start') super().__init__(jid, password) - #self.add_event_handler("connection_failed", self.on_connection_failed) - #self.add_event_handler("failed_auth", self.on_failed_auth) + self.add_event_handler("connection_failed", self.on_connection_failed) + self.add_event_handler("failed_auth", self.on_failed_auth) self.add_event_handler("session_start", self.on_session_start) self.register_plugin('xep_0004') # XEP-0004: Data Forms self.register_plugin('xep_0030') # XEP-0030: Service Discovery @@ -17,15 +24,22 @@ class XmppInstance(ClientXMPP): self.register_plugin('xep_0163') # XEP-0163: Personal Eventing Protocol self.register_plugin('xep_0223') # XEP-0223: Persistent Storage of Private Data via PubSub self.connect() - # self.process(forever=False) - self.connection_accepted = False -# def on_connection_failed(self, event): -# self.connection_accepted = False + def on_connection_failed(self, event): + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{event},Start') + self.connection_accepted = False + logger.debug(f'{function_name},{event},Finish') -# def on_failed_auth(self, event): -# self.connection_accepted = False + def on_failed_auth(self, event): + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{event},Start') + self.connection_accepted = False + logger.debug(f'{function_name},{event},Finish') def on_session_start(self, event): + function_name = sys._getframe().f_code.co_name + logger.debug(f'{function_name},{event},Start') self.connection_accepted = True + logger.debug(f'{function_name},{event},Finish')