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 @@
- File
+
+ File
+
@@ -189,7 +207,9 @@
- Node
+
+ Node
+
@@ -214,7 +234,9 @@
- Action
+
+ Action
+
@@ -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}}'