Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-nbxmpp for openSUSE:Factory checked in at 2026-04-21 12:44:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-nbxmpp (Old) and /work/SRC/openSUSE:Factory/.python-nbxmpp.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-nbxmpp" Tue Apr 21 12:44:04 2026 rev:58 rq:1348323 version:7.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-nbxmpp/python-nbxmpp.changes 2026-02-27 17:13:42.213549191 +0100 +++ /work/SRC/openSUSE:Factory/.python-nbxmpp.new.11940/python-nbxmpp.changes 2026-04-21 12:46:25.674424351 +0200 @@ -1,0 +2,10 @@ +Mon Apr 20 20:58:35 UTC 2026 - Dirk Müller <[email protected]> + +- update to 7.2.0: + * Implement XEP-445 Pre-Auth IBR + * OpenPGP: Make sure fingerprints are always upper case + * VCard4: Request access model before publishing + * Presence: Add preauth attribute + * Protocol: Add feature method for pre approval + +------------------------------------------------------------------- Old: ---- python-nbxmpp-7.1.0.tar.bz2 New: ---- python-nbxmpp-7.2.0.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-nbxmpp.spec ++++++ --- /var/tmp/diff_new_pack.miAAKJ/_old 2026-04-21 12:46:26.282449573 +0200 +++ /var/tmp/diff_new_pack.miAAKJ/_new 2026-04-21 12:46:26.282449573 +0200 @@ -19,7 +19,7 @@ %define _name nbxmpp %{?sle15_python_module_pythons} Name: python-nbxmpp -Version: 7.1.0 +Version: 7.2.0 Release: 0 Summary: XMPP library by Gajim team License: GPL-3.0-or-later @@ -32,7 +32,7 @@ BuildRequires: %{python_module idna} BuildRequires: %{python_module packaging} BuildRequires: %{python_module pip} -BuildRequires: %{python_module precis-i18n} +BuildRequires: %{python_module precis-i18n >= 1.0.0} BuildRequires: %{python_module setuptools >= 65.0} BuildRequires: %{python_module sqlite3} BuildRequires: %{python_module wheel} ++++++ python-nbxmpp-7.1.0.tar.bz2 -> python-nbxmpp-7.2.0.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/ChangeLog new/python-nbxmpp-7.2.0/ChangeLog --- old/python-nbxmpp-7.1.0/ChangeLog 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/ChangeLog 2026-04-19 19:12:23.000000000 +0200 @@ -1,3 +1,16 @@ +nbxmpp 7.2.0 (19 Apr 2026) + + New + + * Implement XEP-445 Pre-Auth IBR + + Improvements + + * OpenPGP: Make sure fingerprints are always upper case + * VCard4: Request access model before publishing + * Presence: Add preauth attribute + * Protocol: Add feature method for pre approval + nbxmpp 7.1.0 (22 Feb 2026) Improvements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/__init__.py new/python-nbxmpp-7.2.0/nbxmpp/__init__.py --- old/python-nbxmpp-7.1.0/nbxmpp/__init__.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/__init__.py 2026-04-19 19:12:23.000000000 +0200 @@ -4,4 +4,4 @@ from .protocol import * # noqa: F403, E402 -__version__: str = "7.1.0" +__version__: str = "7.2.0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/modules/date_and_time.py new/python-nbxmpp-7.2.0/nbxmpp/modules/date_and_time.py --- old/python-nbxmpp-7.1.0/nbxmpp/modules/date_and_time.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/modules/date_and_time.py 2026-04-19 19:12:23.000000000 +0200 @@ -193,12 +193,3 @@ # convert=None return date_time - - -def get_local_time() -> tuple[str, str]: - formated_time = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) - isdst = time.localtime().tm_isdst - zone = -(time.timezone, time.altzone)[isdst] / 60.0 - zone = (zone / 60, abs(zone % 60)) - tzo = "%+03d:%02d" % zone - return formated_time, tzo diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/modules/entity_time.py new/python-nbxmpp-7.2.0/nbxmpp/modules/entity_time.py --- old/python-nbxmpp-7.1.0/nbxmpp/modules/entity_time.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/modules/entity_time.py 2026-04-19 19:12:23.000000000 +0200 @@ -8,13 +8,13 @@ from typing import TYPE_CHECKING +import datetime as dt from collections.abc import Callable from nbxmpp.errors import MalformedStanzaError from nbxmpp.errors import StanzaError from nbxmpp.modules.base import BaseModule from nbxmpp.modules.date_and_time import create_tzinfo -from nbxmpp.modules.date_and_time import get_local_time from nbxmpp.modules.date_and_time import parse_datetime from nbxmpp.namespaces import Namespace from nbxmpp.protocol import ERR_FORBIDDEN @@ -91,6 +91,19 @@ raise NodeProcessed +def get_local_time() -> tuple[str, str]: + utc = dt.datetime.now(tz=dt.timezone.utc) + utc_formated = utc.strftime("%Y-%m-%dT%H:%M:%SZ") + local = utc.astimezone() + if local.utcoffset() == utc.utcoffset(): + offset = "Z" + else: + # %z has the format ±HHMM[SS[.ffffff]] + offset = local.strftime("%z")[:5] + offset = f"{offset[:-2]}:{offset[-2:]}" + return utc_formated, offset + + def _make_request(jid: JID) -> Iq: iq = Iq("get", to=jid) iq.addChild("time", namespace=Namespace.TIME) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/modules/openpgp.py new/python-nbxmpp-7.2.0/nbxmpp/modules/openpgp.py --- old/python-nbxmpp-7.1.0/nbxmpp/modules/openpgp.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/modules/openpgp.py 2026-04-19 19:12:23.000000000 +0200 @@ -168,7 +168,7 @@ date_str = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(date)) result = yield self.publish( - f"{Namespace.OPENPGP_PK}:{fingerprint}", + f"{Namespace.OPENPGP_PK}:{fingerprint.upper()}", _make_public_key(key, date_str), id_=date_str, options=options, @@ -182,7 +182,7 @@ task = yield items = yield self.request_items( - f"{Namespace.OPENPGP_PK}:{fingerprint}", max_items=1, jid=jid + f"{Namespace.OPENPGP_PK}:{fingerprint.upper()}", max_items=1, jid=jid ) raise_if_error(items) @@ -371,7 +371,7 @@ if keylist is not None: for key in keylist: date = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(key.date)) - attrs = {"v4-fingerprint": key.fingerprint, "date": date} + attrs = {"v4-fingerprint": key.fingerprint.upper(), "date": date} item.addChild("pubkey-metadata", attrs=attrs) return item diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/modules/presence.py new/python-nbxmpp-7.2.0/nbxmpp/modules/presence.py --- old/python-nbxmpp-7.1.0/nbxmpp/modules/presence.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/modules/presence.py 2026-04-19 19:12:23.000000000 +0200 @@ -109,9 +109,13 @@ @log_calls def subscribe( - self, jid: JID, status: str | None = None, nick: str | None = None + self, + jid: JID, + status: str | None = None, + nick: str | None = None, + preauth: str | None = None, ) -> None: - self.send(jid=jid, typ="subscribe", status=status, nick=nick) + self.send(jid=jid, typ="subscribe", status=status, nick=nick, preauth=preauth) def send( self, @@ -127,6 +131,7 @@ muc: bool = False, muc_history=None, muc_password: str | None = None, + preauth: str | None = None, extend=None, ) -> None: @@ -156,6 +161,9 @@ if muc_password is not None: muc_x.setTagData("password", muc_password) + if preauth is not None: + presence.setTag(Namespace.PARS + " preauth", attrs={"token": preauth}) + if extend is not None: for node in extend: presence.addChild(node=node) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/modules/register/register.py new/python-nbxmpp-7.2.0/nbxmpp/modules/register/register.py --- old/python-nbxmpp-7.1.0/nbxmpp/modules/register/register.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/modules/register/register.py 2026-04-19 19:12:23.000000000 +0200 @@ -43,6 +43,19 @@ yield process_response(response) @iq_request_task + def send_preauth(self, token: str, jid: JID | None = None): + _task = yield + + if jid is None: + jid = self._client.domain + + iq = Iq("set", to=jid) + iq.addChild("preauth", namespace=Namespace.PARS, attrs={"token": token}) + + response = yield iq + yield process_response(response) + + @iq_request_task def request_register_form(self, jid: JID | None = None): _task = yield diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/modules/vcard4.py new/python-nbxmpp-7.2.0/nbxmpp/modules/vcard4.py --- old/python-nbxmpp-7.1.0/nbxmpp/modules/vcard4.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/modules/vcard4.py 2026-04-19 19:12:23.000000000 +0200 @@ -16,6 +16,7 @@ from dataclasses import dataclass from dataclasses import field +from nbxmpp.errors import is_error from nbxmpp.errors import MalformedStanzaError from nbxmpp.modules.base import BaseModule from nbxmpp.modules.util import finalize @@ -1207,6 +1208,7 @@ _depends = { "publish": "PubSub", + "get_access_model": "PubSub", "request_items": "PubSub", } @@ -1264,10 +1266,14 @@ yield _get_vcard(items[0]) @iq_request_task - def set_vcard(self, vcard: VCard, public: bool = False): + def set_vcard(self, vcard: VCard, public: bool | None = None): task = yield - access_model = "open" if public else "presence" + if public is not None: + access_model = "open" if public else "presence" + else: + result = yield self.get_access_model(Namespace.VCARD4_PUBSUB) + access_model = "presence" if is_error(result) else result options = { "pubsub#persist_items": "true", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/namespaces.py new/python-nbxmpp-7.2.0/nbxmpp/namespaces.py --- old/python-nbxmpp-7.1.0/nbxmpp/namespaces.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/namespaces.py 2026-04-19 19:12:23.000000000 +0200 @@ -73,6 +73,7 @@ HTTPUPLOAD_0: str = "urn:xmpp:http:upload:0" HTTP_AUTH: str = "http://jabber.org/protocol/http-auth" IBB: str = "http://jabber.org/protocol/ibb" + IBR_TOKEN = "urn:xmpp:ibr-token:0" # noqa: S105 IDLE: str = "urn:xmpp:idle:1" JINGLE: str = "urn:xmpp:jingle:1" JINGLE_BYTESTREAM: str = "urn:xmpp:jingle:transports:s5b:1" @@ -119,7 +120,9 @@ OPENPGP: str = "urn:xmpp:openpgp:0" OPENPGP_PK: str = "urn:xmpp:openpgp:0:public-keys" OPENPGP_SK: str = "urn:xmpp:openpgp:0:secret-key" + PARS: str = "urn:xmpp:pars:0" PING: str = "urn:xmpp:ping" + PRE_APPROVAL: str = "urn:xmpp:features:pre-approval" PRIVACY: str = "jabber:iq:privacy" PRIVATE: str = "jabber:iq:private" PUBKEY_ATTEST: str = "urn:xmpp:attest:2" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/protocol.py new/python-nbxmpp-7.2.0/nbxmpp/protocol.py --- old/python-nbxmpp-7.1.0/nbxmpp/protocol.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/protocol.py 2026-04-19 19:12:23.000000000 +0200 @@ -2026,9 +2026,15 @@ def has_roster_version(self) -> bool: return self.getTag("ver", namespace=Namespace.ROSTER_VER) is not None + def has_pre_approval(self) -> bool: + return self.getTag("sub", namespace=Namespace.PRE_APPROVAL) is not None + def has_register(self) -> bool: return self.getTag("register", namespace=Namespace.REGISTER_FEATURE) is not None + def has_ibr_token(self) -> bool: + return self.getTag("register", namespace=Namespace.IBR_TOKEN) is not None + def has_anonymous(self) -> bool: return "ANONYMOUS" in self.get_mechs() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/nbxmpp/structs.py new/python-nbxmpp-7.2.0/nbxmpp/structs.py --- old/python-nbxmpp-7.1.0/nbxmpp/structs.py 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/nbxmpp/structs.py 2026-04-19 19:12:23.000000000 +0200 @@ -781,7 +781,7 @@ class AdHocCommand(NamedTuple): jid: JID - node: Node + node: str name: str | None sessionid: str | None = None status: AdHocStatus | None = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-nbxmpp-7.1.0/python-nbxmpp.doap new/python-nbxmpp-7.2.0/python-nbxmpp.doap --- old/python-nbxmpp-7.1.0/python-nbxmpp.doap 2026-02-25 20:15:32.000000000 +0100 +++ new/python-nbxmpp-7.2.0/python-nbxmpp.doap 2026-04-19 19:12:23.000000000 +0200 @@ -375,6 +375,13 @@ </implements> <implements> <xmpp:SupportedXep> + <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0379.html"/> + <xmpp:status>complete</xmpp:status> + <xmpp:version>0.3.3</xmpp:version> + </xmpp:SupportedXep> + </implements> + <implements> + <xmpp:SupportedXep> <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0380.html"/> <xmpp:status>complete</xmpp:status> <xmpp:version>0.1</xmpp:version> @@ -453,6 +460,13 @@ </implements> <implements> <xmpp:SupportedXep> + <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0445.html"/> + <xmpp:status>complete</xmpp:status> + <xmpp:version>0.2.0</xmpp:version> + </xmpp:SupportedXep> + </implements> + <implements> + <xmpp:SupportedXep> <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0461.html"/> <xmpp:status>complete</xmpp:status> <xmpp:version>0.2.0</xmpp:version> @@ -465,5 +479,13 @@ <xmpp:version>0.1.0</xmpp:version> </xmpp:SupportedXep> </implements> + <implements> + <xmpp:SupportedXep> + <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0511.html"/> + <xmpp:status>complete</xmpp:status> + <xmpp:version>0.1.0</xmpp:version> + <xmpp:since>7.1.0</xmpp:since> + </xmpp:SupportedXep> + </implements> </Project> </rdf:RDF>
