plugin XEP-0277: Make MbData a Pydantic model:

- MbData is now a Pydantic based model.
- Bridge method has been updated to use `service` and `node` from MbData instead of using
  separate fields.
- Added `In-Reply-To` to MbData.
- Adapted code using XEP-0277 to work with the changes.

rel 462
This commit is contained in:
Goffi 2025-08-03 23:35:21 +02:00
commit cab460152c
5 changed files with 828 additions and 492 deletions

View file

@ -17,9 +17,12 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from twisted.words.xish import domish
from libervia.backend.core.core_types import SatXMPPClient
from libervia.backend.core.i18n import _
from libervia.backend.core.constants import Const as C
from libervia.backend.core.log import getLogger
from libervia.backend.plugins.plugin_xep_0277 import MbData
log = getLogger(__name__)
from twisted.internet import defer
@ -102,18 +105,31 @@ class GroupBlog(object):
config_form = data_form.findForm(item_elt, NS_PUBSUB_ITEM_CONFIG)
if config_form is None:
return
# FIXME: Legacy code, need to be adapted to new MbData model.
log.warning(
"Item config is temporarily not supported, it needs to be moved to "
"adapted to new model"
)
return
access_model = config_form.get(self._p.OPT_ACCESS_MODEL, self._p.ACCESS_OPEN)
if access_model == self._p.ACCESS_PUBLISHER_ROSTER:
opt = self._p.OPT_ROSTER_GROUPS_ALLOWED
microblog_data["groups"] = config_form.fields[opt].values
def _data_2_entry_trigger(self, client, mb_data, entry_elt, item_elt):
def _data_2_entry_trigger(
self,
client: SatXMPPClient,
mb_data: MbData,
entry_elt: domish.Element,
item_elt: domish.Element
) -> None:
"""Build fine access permission if needed
This trigger check if "group*" key are present,
and create a fine item config to restrict view to these groups
"""
groups = mb_data.get("groups", [])
# FIXME: Model_dump is temporarily used while converting MbData to Pydantic model.
groups = mb_data.model_dump().get("groups", [])
if not groups:
return
if not client.server_groupblog_available:

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,7 @@ from libervia.backend.core.i18n import _
from libervia.backend.core.log import getLogger
from libervia.backend.core.core_types import SatXMPPEntity
from libervia.backend.core import exceptions
from libervia.backend.plugins.plugin_xep_0277 import MbData
from libervia.backend.tools.common import uri, data_format, date_utils
from libervia.backend.tools.utils import as_deferred, xmpp_date
@ -43,7 +44,7 @@ PLUGIN_INFO = {
C.PI_TYPE: C.PLUG_TYPE_XEP,
C.PI_MODES: C.PLUG_MODE_BOTH,
C.PI_PROTOCOLS: [],
C.PI_DEPENDENCIES: ["XEP-0060"],
C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0277"],
C.PI_MAIN: "PubsubAttachments",
C.PI_HANDLER: "yes",
C.PI_DESCRIPTION: _("""Pubsub Attachments implementation"""),
@ -152,14 +153,12 @@ class PubsubAttachments:
async def on_mb_send(
self,
client: SatXMPPEntity,
service: jid.JID,
node: str,
item: domish.Element,
data: dict,
data: MbData,
) -> bool:
"""trigger to create attachment node on each publication"""
await self.create_attachments_node(
client, service, node, item["id"], autocreate=True
client, data.service, data.node, item["id"], autocreate=True
)
return True

View file

@ -313,6 +313,7 @@ class BlogPublishCommon:
if metadata already exist, it will be overwritten
"""
extra = mb_data.setdefault("extra", {})
if self.args.comments is not None:
mb_data["allow_comments"] = self.args.comments
if self.args.tag:
@ -324,13 +325,13 @@ class BlogPublishCommon:
if self.args.no_id_suffix:
mb_data["user_friendly_id_suffix"] = False
if self.args.alt_links:
mb_data.setdefault("extra", {})["alt_links"] = self.args.alt_links
extra["alt_links"] = self.args.alt_links
if self.args.encrypt:
mb_data["encrypted"] = True
extra["encrypted"] = True
if self.args.sign:
mb_data["signed"] = True
extra["signed"] = True
if self.args.encrypt_for:
mb_data["encrypted_for"] = {"targets": self.args.encrypt_for}
extra["encrypted_for"] = {"targets": self.args.encrypt_for}
self.handle_attachments(mb_data)
@ -352,7 +353,11 @@ class Set(base.CommandBase, BlogPublishCommon):
async def start(self):
self.current_syntax = await self.get_current_syntax()
self.pubsub_item = self.args.item
mb_data = {}
mb_data = {
"service": self.args.service or None,
}
if self.args.node:
mb_data["node"] = self.args.node
self.set_mb_data_from_args(mb_data)
if self.pubsub_item:
mb_data["id"] = self.pubsub_item
@ -361,8 +366,6 @@ class Set(base.CommandBase, BlogPublishCommon):
try:
item_id = await self.host.bridge.mb_send(
self.args.service,
self.args.node,
data_format.serialise(mb_data),
self.profile,
)
@ -708,6 +711,9 @@ class Edit(base.CommandBase, BlogPublishCommon, common.BaseEdit):
await asyncio.gather(*coroutines)
async def publish(self, content, mb_data):
mb_data["service"] = self.pubsub_service or None
if self.pubsub_node:
mb_data["node"] = self.pubsub_node
await self.set_mb_data_content(content, mb_data)
if self.pubsub_item:
@ -715,9 +721,7 @@ class Edit(base.CommandBase, BlogPublishCommon, common.BaseEdit):
mb_data = data_format.serialise(mb_data)
await self.host.bridge.mb_send(
self.pubsub_service, self.pubsub_node, mb_data, self.profile
)
await self.host.bridge.mb_send(mb_data, self.profile)
self.disp("Blog item published")
def get_tmp_suff(self):

View file

@ -294,9 +294,9 @@ class Entry(EntriesManager):
if self.blog.new_message_target == C.GROUP:
mb_data["groups"] = list(self.blog.targets)
mb_data["service"] = self.service
mb_data["node"] = self.node
self.blog.host.bridge.mb_send(
str(self.service or ""),
self.node or "",
data_format.serialise(mb_data),
profile=self.blog.profile,
)