From 0ab40eedecf14462825c708d1f69cc94b36857ac Mon Sep 17 00:00:00 2001 From: "Schimon Jehudah, Adv." Date: Wed, 11 Sep 2024 07:44:18 +0300 Subject: [PATCH] Python : Utilize XEP-0004: Data Forms to store configurations; Python : Fix error in blasta_client.py (Thank you. yvo.); XMPP : Replace node xmpp:blasta:settings:0 by xmpp:blasta:configuration:0; --- blasta.py | 57 ++++++++++++++++++++++++--------------- blasta_client.py | 2 +- template/profile.xhtml | 60 +++++++++++++++++++++++++++++++----------- 3 files changed, 82 insertions(+), 37 deletions(-) diff --git a/blasta.py b/blasta.py index 9b6d445..17687c0 100644 --- a/blasta.py +++ b/blasta.py @@ -60,7 +60,7 @@ class Data: entry_tags = entry['tags'] entry_url_hash = entry['url_hash'] tags_to_include = [] - if query in entry_tags or query in ' '.join([entry['title'], entry['link'], entry['summary']]): + if query in ' '.join([entry['title'], entry['link'], entry['summary'], ' '.join(entry_tags)]): item_ids.append(entry_url_hash) tags_to_include += entry_tags for tag_to_include in tags_to_include: @@ -1387,19 +1387,21 @@ class HttpInstance: path = 'error' return result_post(request, jabber_id, description, message, path) else: - iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, 'xmpp:blasta:settings:0', 'routine') + iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, 'xmpp:blasta:configuration:0', 'routine') + routine = None if isinstance(iq, slixmpp.stanza.iq.Iq): payload = iq['pubsub']['items']['item']['payload'] - routine = payload.text if payload else None - else: - routine = None + if payload: + xmlns = '{jabber:x:data}' + element_value = payload.find('.//' + xmlns + 'field[@var="routine"]/' + xmlns + 'value') + if isinstance(element_value, ET.Element): routine = element_value.text match routine: case 'private': response = RedirectResponse(url='/private') case 'read': response = RedirectResponse(url='/read') case _: - response = RedirectResponse(url='/jid/' + jabber_id) + response = RedirectResponse(url='/jid/') else: #del accounts[jabber_id] @@ -1470,7 +1472,7 @@ class HttpInstance: jabber_id = Utilities.is_jid_matches_to_session(accounts, sessions, request) if jabber_id: xmpp_instance = accounts[jabber_id] - if not await XmppPubsub.is_node_exist(xmpp_instance, 'xmpp:blasta:settings:0'): + if not await XmppPubsub.is_node_exist(xmpp_instance, 'xmpp:blasta:configuration:0'): iq = XmppPubsub.create_node_config(xmpp_instance, jabber_id) await iq.send(timeout=15) access_models = {} @@ -1481,10 +1483,13 @@ class HttpInstance: access_models[node_type] = access_model settings = {} for setting in ['enrollment', 'routine']: - iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, 'xmpp:blasta:settings:0', setting) + iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, 'xmpp:blasta:configuration:0', setting) if isinstance(iq, slixmpp.stanza.iq.Iq): payload = iq['pubsub']['items']['item']['payload'] - if payload: settings[setting] = payload.text + if payload: + xmlns = '{jabber:x:data}' + element_value = payload.find('.//' + xmlns + 'field[@var="' + setting + '"]/' + xmlns + 'value') + if isinstance(element_value, ET.Element): settings[setting] = element_value.text template_file = 'profile.xhtml' template_dict = { 'access_models' : access_models, @@ -1511,15 +1516,15 @@ class HttpInstance: xmpp_instance = accounts[jabber_id] if routine: message = 'The routine directory has been set to {}'.format(routine) - payload = Xml.create_setting_entry(routine) - iq = await XmppPubsub.publish_node_item( - xmpp_instance, jabber_id, 'xmpp:blasta:settings:0', 'routine', payload) + payload = Xml.create_setting_entry(xmpp_instance, 'routine', routine) + iq = await XmppPubsub.publish_node_item( # NOTE Consider "configurations" as item ID (see Movim) + xmpp_instance, jabber_id, 'xmpp:blasta:configuration:0', 'routine', payload) if enroll: if enroll == '1': message = 'Your database is shared with the Blasta system' else: message = 'Your database is excluded from the Blasta system' - payload = Xml.create_setting_entry(enroll) + payload = Xml.create_setting_entry(xmpp_instance, 'enroll', enroll) iq = await XmppPubsub.publish_node_item( - xmpp_instance, jabber_id, 'xmpp:blasta:settings:0', 'enrollment', payload) + xmpp_instance, jabber_id, 'xmpp:blasta:configuration:0', 'enrollment', payload) description = 'Setting has been saved' template_file = 'result.xhtml' template_dict = { @@ -1663,10 +1668,13 @@ class HttpInstance: if (isinstance(iq, slixmpp.stanza.iq.Iq) and url_hash == iq['pubsub']['items']['item']['id']): return RedirectResponse(url='/url/' + url_hash + '/edit') - iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, 'xmpp:blasta:settings:0', 'routine') + iq = await XmppPubsub.get_node_item(xmpp_instance, jabber_id, 'xmpp:blasta:configuration:0', 'routine') if isinstance(iq, slixmpp.stanza.iq.Iq): payload = iq['pubsub']['items']['item']['payload'] - routine = payload.text if payload else None + if payload: + xmlns = '{jabber:x:data}' + element_value = payload.find('.//' + xmlns + 'field[@var="routine"]/' + xmlns + 'value') + if isinstance(element_value, ET.Element): routine = element_value.text else: routine = None # NOTE Is "message" missing? @@ -5111,10 +5119,17 @@ class Utilities: class Xml: - def create_setting_entry(value : str): - element = ET.Element('value') - element.text = value - return element + def create_setting_entry(xmpp_instance, key : str, value : str): + form = xmpp_instance['xep_0004'].make_form('form', 'Settings') + form['type'] = 'result' + form.add_field(var=key, + value=value) + return form + +# def create_setting_entry(value : str): +# element = ET.Element('value') +# element.text = value +# return element class Configuration: @@ -5222,7 +5237,7 @@ class XmppPubsub: iq = xmpp_instance.Iq(stype='set', sto=jid, sfrom=jid_from) - iq['pubsub']['create']['node'] = 'xmpp:blasta:settings:0' + iq['pubsub']['create']['node'] = 'xmpp:blasta:configuration:0' form = iq['pubsub']['configure']['form'] form['type'] = 'submit' form.addField('pubsub#access_model', diff --git a/blasta_client.py b/blasta_client.py index 4043812..caba60f 100644 --- a/blasta_client.py +++ b/blasta_client.py @@ -16,7 +16,7 @@ class HtmlView: # Open the link using xdg-open subprocess.run(['xdg-open', uri], check=True) except subprocess.CalledProcessError as e: - print(f"Failed to open URL: {uri}. Error: {e}") + print('Failed to open URL: {}. Error: {}'.format(uri, e)) else: # If it is from url_instance, just load it in the webview #webview.load_url(uri) diff --git a/template/profile.xhtml b/template/profile.xhtml index 0392dc4..5fbaa4e 100644 --- a/template/profile.xhtml +++ b/template/profile.xhtml @@ -64,14 +64,20 @@   PubSub bookmarks -

» Information of your Jabber ID.

-

Your Profile

+

+ » Information of your Jabber ID. +

+

+ Your profile +

This page provides a general survey of your XMPP account and stored bookmarks.

-

Export

+

+ Export +

Export bookmarks to a file.

@@ -128,7 +136,9 @@
- Private + + Private +
.
- Public + + Public +
.
- Read + + Read +

-

Import

+

+ Import +

Import bookmarks from a file, and choose a node to import your bookmarks to. @@ -175,7 +191,9 @@ - + @@ -189,7 +207,9 @@ - + @@ -214,7 +234,9 @@ - + @@ -422,7 +444,9 @@ retrieve items only if on a whitelist managed by the node owner."> proceeding.


-

Termination

+

+ Termination +

Due to security concerns, Blasta does not have a built-in mechanism to delete nodes. @@ -438,7 +462,9 @@ retrieve items only if on a whitelist managed by the node owner."> Psi, or Psi+.

-

Delete your public bookmarks

+

+ Delete your public bookmarks +

     <iq type='set'
         from='{{jabber_id}}'
@@ -449,7 +475,9 @@ retrieve items only if on a whitelist managed by the node owner.">
       </pubsub>
     </iq>
                 
-

Delete your private bookmarks

+

+ Delete your private bookmarks +

     <iq type='set'
         from='{{jabber_id}}'
@@ -460,7 +488,9 @@ retrieve items only if on a whitelist managed by the node owner.">
       </pubsub>
     </iq>
                 
-

Delete your reading list

+

+ Delete your reading list +

     <iq type='set'
         from='{{jabber_id}}'