Commit graph

1947 commits

Author SHA1 Message Date
Jonas Schäfer
d4d520e1f6 xso-proc: add support for built-in prefixes in attribute names
This simplifies the use of built-in XML attributes such as xml:lang.
2024-06-24 12:39:32 +02:00
Jonas Schäfer
84de7fc248 xso-proc: add support for namespaced attributes 2024-06-24 12:39:32 +02:00
Jonas Schäfer
219d682295 xso-proc: add support for renaming attributes
This is akin to `#[serde(rename = ..)]` and thus useful.
2024-06-24 11:33:10 +02:00
Jonas Schäfer
0bae5d3346 parsers: replace some generate_element! usage with derive macros 2024-06-24 11:33:10 +02:00
Jonas Schäfer
212c5c4a83 xso-proc: add support for parsing attributes into Strings
This is bare-bones and is missing many features which we intend to add
in future commits, such as parsing from attributes whose names differ
from the field names and parsing into non-String types.
2024-06-24 11:33:10 +02:00
Jonas Schäfer
183bef5cf6 xso-proc: completely overengineer everything for no good reason!
Well, not really, of course. All of this will make sense once we start
adding support for fields and non-struct types. Refactoring the code now
before we start to add actual member field parsing is much easier.

How do I know that this will work out? Well, my crystal ball knows it.
Don't believe me? Okay, ChatGPT told me ... Alright alright, I went
through the entire process of implementing this feature *twice* at this
point and have a pretty good idea of where to draw the abstraction lines
so that everything falls neatly into place. You'll have to trust me on
this one.

(Or, you know, check out old branches in my xmpp-rs repo. That might
work, too. `feature/derive-macro-streaming-full` might be a name to look
for if you dare.)
2024-06-23 18:43:34 +02:00
Jonas Schäfer
bf7816d321 xso-proc: refactor struct processing
If we are going to support structs with fields, it would be good to have
that struct-related code organised a little and less splashed over the
main lib.rs file.
2024-06-23 13:17:27 +02:00
Jonas Schäfer
2efef5ceeb xso-proc: add support for string literals for namespaces
Makes it easier to use ad-hoc.
2024-06-23 12:40:18 +02:00
Jonas Schäfer
4d1166b66d xso-proc: allow paths as XML names
Not sure if this is something useful to have, but it feels consistent
with `namespace`.
2024-06-23 12:40:18 +02:00
Jonas Schäfer
1611c5fba9 xso-proc: validate XML names against rxml_validation::NcName
That way we avoid a fallible conversion at runtime.
2024-06-23 12:22:17 +02:00
Jonas Schäfer
bc785fde28 parsers: replace generate_empty_element with derive 2024-06-23 12:20:02 +02:00
Jonas Schäfer
0adfd1218b xso-proc: start making derive macros for FromXml and IntoXml
For now, these macros only support empty elements. Everything else will
be rejected with a compile-time error.
2024-06-23 12:20:02 +02:00
Jonas Schäfer
9ec9a0f0c6 xso: introduce xso::from_bytes
This is useful both for doctests and other scenarios where you just
want to parse a bit of XML you already have.
2024-06-23 09:41:28 +02:00
Jonas Schäfer
6ef8dbefa3 parsers: use Error type from xso
This is a large change and as such, it needs good motivation. Let me
remind you of the ultimate goal: we want a derive macro which allows us
to FromXml/IntoXml, and that derive macro should be usable from
`xmpp_parsers` and other crates.

For that, any code generated by the derive macro mustn't depend on any
code in the `xmpp_parsers` crate, because you cannot name the crate you
are in portably (`xmpp_parsers::..` wouldn't resolve within
`xmpp_parsers`, and `crate::..` would point at other crates if the macro
was used in other crates).

We also want to interoperate with code already implementing
`TryFrom<Element>` and `Into<Element>` on structs. This ultimately
requires that we have an error type which is shared by the two
implementations and that error type must be declared in the `xso` crate
to be usable by the macros.

Thus, we port the error type over to use the type declared in `xso`.

This changes the structure of the error type greatly; I do not think
that `xso` should have to know about all the different types we are
parsing there and they don't deserve special treatment. Wrapping them in
a `Box<dyn ..>` seems more appropriate.
2024-06-23 09:40:52 +02:00
b3e6e089da
CI: display rustfmt version
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2024-06-18 20:38:42 +02:00
a39a2330aa Revert "tokio-xmpp: rustfmt pass in examples"
This reverts commit 46fdd9cdfa.
2024-06-18 20:32:46 +02:00
46fdd9cdfa
tokio-xmpp: rustfmt pass in examples
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2024-06-18 20:21:23 +02:00
Emmanuel Gil Peyrot
2af07f4fc0 xmpp-parsers: Simplify DataForm creation using constructors
The redundancy made it harder to review changes to the Field struct, for
instance in a1bee56ee1.
2024-06-18 18:03:09 +02:00
mb
3d52905fe9 fix check for childen and attributes in desc element 2024-06-18 15:49:27 +00:00
Jonas Schäfer
49adbc49ac xso: make newlines after module comments consistent with other crates 2024-06-18 17:27:27 +02:00
Jonas Schäfer
dd76a62bdd xso: only warn on missing docs
The CI makes that an error anyway, and this allows developers to start
sketching stuff without running into errors all the time (and then
adding `/// TODO` to work around them).
2024-06-18 17:27:27 +02:00
Jonas Schäfer
6d642ba4a2 xso: pull fmt from core
We don't mark this crate as no_std for now, because its dependencies
aren't no_std, but we want to be prepared.
2024-06-18 17:27:15 +02:00
Jonas Schäfer
17a38f190b xso: mark iterator type as non-breaking to change
Just like with the builder type, the concrete iterator type on IntoXml
is supposed to be an implementation detail. That allows switching freely
between various ways to generate such a type.
2024-06-18 17:20:27 +02:00
mb
a1bee56ee1 Support desc element in field
From [XEP-0004: Data Forms](https://xmpp.org/extensions/xep-0004.html#protocol-field):

> ...
> The <field/> element MAY contain any of the following child elements:
>
> <desc/>
> The XML character data of this element provides a natural-language
> description of the field, intended for presentation in a
> user-agent (e.g., as a "tool-tip", help button, or explanatory text
> provided near the field). The <desc/> element SHOULD NOT contain
> newlines (the \n and \r characters), since layout is the
> responsibility of a user agent, and any handling of
> newlines (e.g., presentation in a user interface) is unspecified
> herein. (Note: To provide a description of a field, it
> is RECOMMENDED to use a <desc/> element rather than
> a separate <field/> element of type "fixed".)
> ...
2024-06-18 15:07:03 +00:00
Jonas Schäfer
cb3da52ba2 parsers: add streamable parsing
This adds shims which provide FromXml and IntoXml implementations to
*all* macro-generated types in `xmpp_parsers`. Mind that this does not
cover all types in `xmpp_parsers`, but a good share of them.

This is another first step toward real, fully streamed parsing.
2024-06-18 16:54:11 +02:00
Jonas Schäfer
14a1d66bf8 xso: create library for streamed XML parsing
This library provides the traits to parse structs from XML and
serialise them into XML without having to buffer the document object
model in memory.

The only implementations it provides are for minidom, basically
providing a lower-level interface to `minidom::Element::from_reader` and
`minidom::Element::to_writer`.

This is the first stepping stone into a world where `xmpp_parsers` can
parse the structs directly from XML.
2024-06-18 16:54:11 +02:00
mb
998d2825f8 Add alternate_address to StanzaError
[gone](https://datatracker.ietf.org/doc/html/rfc6120#section-8.3.3.5) and [redirect](https://datatracker.ietf.org/doc/html/rfc6120#section-8.3.3.14) errors may include an alternative address.

> gone
>
> The recipient or server can no longer be contacted at this address,
> typically on a permanent basis (as opposed to the <redirect/> error
> condition, which is used for temporary addressing failures); the
> associated error type SHOULD be "cancel" and the error stanza SHOULD
> include a new address (if available) as the XML character data of the
> <gone/> element (which MUST be a Uniform Resource Identifier [URI] or
> Internationalized Resource Identifier [IRI] at which the entity can
> be contacted, typically an XMPP IRI as specified in [XMPP-URI]).

—

> redirect
>
> The recipient or server is redirecting requests for this information
> to another entity, typically in a temporary fashion (as opposed to
> the <gone/> error condition, which is used for permanent addressing
> failures); the associated error type SHOULD be "modify" and the error
> stanza SHOULD contain the alternate address in the XML character data
> of the <redirect/> element (which MUST be a URI or IRI with which the
> sender can communicate, typically an XMPP IRI as specified in
> [XMPP-URI](https://datatracker.ietf.org/doc/html/rfc6120#ref-XMPP-URI)).
2024-06-18 11:11:05 +00:00
mb
ac0707e52d
Make ‘var’ attribute of a Field optional
Looking at [the spec](https://xmpp.org/extensions/xep-0004.html#protocol-field)
it seems valid not to have a `var` attribute set, at least for fields of type
`fixed` that is:

> If the element type is anything other than "fixed" (see below), it MUST
> possess a 'var' attribute that uniquely identifies the field in the context
> of the form (if it is "fixed", it MAY possess a 'var' attribute). The element
> MAY possess a 'label' attribute that defines a human-readable name for the field.
2024-06-18 12:55:32 +02:00
Jonas Schäfer
079379a178 Fix build with nightly rust
Nightly rust complains about `cfg(..)` tests against undeclared
features and other unknown cfgs. They need to be explicitly declared
now.

The nightly/stable features don't exist, so I removed them and
substitutes the currently correct number for the single test where they
were used.

The `xmpprs_doc_build` cfg flag is now declared as expectable.
2024-06-17 19:49:26 +00:00
mb
44029c90bb
Derive PartialEq for PubSub elements 2024-06-17 19:10:14 +02:00
Jonas Schäfer
80efd2eb19 Ignore missing disco#info feature in disco#info responses
xmpp-rs normally has the stance to get buggy implementations fixed
rather than dropping checks. In this particular case I think this is not
a good use of resources:

- The disco#info feature var conveys no actual information:
  If an implementation replies properly to a disco#info query, it is
  already implied that it supports the protocol.

- There are broken server implementations out there.
  A lot of them (all recent (>= 0.10 && < 0.13 AFAICT) Prosody IM
  instances). At this point in time, xmpp-rs is unable to query
  disco#info from MUCs hosted on such prosody versions, except by
  workarounds (such as the one removed in this diff).

- XEP-0030 now features a note which reads:

  > Note: Some entities are known not to advertise the
  > `http://jabber.org/protocol/disco#info` feature within their
  > responses, contrary to this specification. Entities receiving
  > otherwise valid responses which do not include this feature SHOULD
  > infer the support.

The case would be different if there were no (deployed) implementations
which had this bug or if the bug actually had an effect on clients.
Especially the latter is not the case though, as pointed out above.

Hence, I conclude that this check is overly pedantic and the resources
(time, emotional energy of dealing with bugs, punching patches through
to stable distributions, etc. etc.) spent on getting this fixed would
be better invested elsewhere.

In addition, the workaround is extremely ugly and, even in the xmpp-rs
implementation, has no test coverage. Without test coverage of such an
implementation, it is bound to break in funny ways when xmpp-rs changes
the strings of its error messages (which is something one might do even
outside a breaking release).
2024-06-16 10:52:51 +02:00
Parker
eb0bc1b82f Changed name to XmppCodec 2024-06-15 13:02:15 -04:00
Parker
56dc1c6e60 Added XmppCodec usage example 2024-06-15 13:02:10 -04:00
Parker
6d449e9aaa Make XmppCodec public 2024-06-15 13:02:02 -04:00
Jonas Schäfer
84de007640 Update rxml to 0.11.0 2024-06-15 12:58:39 +02:00
Jonas Schäfer
2097b9685f Update rxml to 0.10.1
rxml 0.10.0 (and earlier) had a bug which caused it to reject valid XML
documents if an UTF-8 sequence straddled the token size boundary (8192
bytes by default) of a text event.
2024-06-08 07:29:57 +02:00
xmppftw
aabd19f78c State is disconnected, not invalid 2024-06-06 19:44:53 +00:00
xmppftw
034976748a Add serde feature for xmpp crate 2024-06-05 11:20:33 +02:00
xmppftw
aee4c79110 Add syntax-hightlighting feature for xmpp crate 2024-06-04 19:37:54 +02:00
xmppftw
cde6450b78 OpenSSL is optional 2024-06-02 22:47:28 +02:00
Jonas Schäfer
9b2663a28b Add more specific into_* conversion functions to specific JID subtypes
This is necessary because `into_inner()` as implemented on Jid
consumes the value. That means it cannot be called through Deref
(because that only takes a reference).
2024-05-14 17:53:53 +02:00
Emmanuel Gil Peyrot
002c2803d4 Fix typos across the codebase (thanks codespell!) 2024-05-14 05:46:02 +00:00
Paul Fariello
ccd46047be Add OOB 2024-05-14 05:45:42 +00:00
Lucas Kent
8bdd19b0ff Add SCRAM client extensions support
The SCRAM RFC describes extensions that can be used to add extra
data into the protocol.

This commit adds support for the client scram mechanism to insert extension
data into the client messages at the locations specified by the SCRAM RFC.

Kafka utilizes these extensions when authenticating delegation tokens
over scram. Since I am writing a kafka client I would like access to
these extensions so I can support delegation tokens.

I've only added them to Scram::new not Mechanism::from_credentials
since they do not apply to other mechanisms. For my purposes this is
fine since I only need to work with scram. However it would be
limiting for other use cases, so I'm quite happy to add the extension
fields into Credentials if that was desired. For now I've left it out
since the fields would be scram exclusive and everything else in
Credentials is currently generic.
2024-05-13 23:42:22 +00:00
Jonas Schäfer
4853776010 data_forms: ignore incorrect FORM_TYPE fields as per XEP-0068
XEP-0068 is rather explicit that `FORM_TYPE` fields which are not
`type='hidden'` MUST be ignored (in most cases, see comments inside
the code for exceptions). The previous implementation returned an error
instead (and aborted parsing with that), which is obviously not
"ignoring".
2024-05-13 19:56:56 +00:00
Jonas Schäfer
675907ba20 pubsub: provide accessor function for event's source node's name
Handy if you want to prefilter or distribute events based on the source
node's name.
2024-05-13 17:16:57 +00:00
Lucas Kent
1449d300dd Fix clippy lints for sasl crate 2024-05-13 16:03:48 +00:00
Lucas Kent
f4c3238798 Swap sasl crate from sha-1 crate -> sha1 crate
sha-1 has been deprecated in favor of sha1 and has an identical API.
2024-05-13 13:03:33 +10:00
Jonas Schäfer
384b366f5f Add Message::extract_payload function
This should simplify access to message payloads significantly.
2024-05-06 09:40:08 +00:00
Lucas Kent
a291ab2e83 Remove an allocation in client::mechanisms::scram::Scram::initial 2024-05-06 08:25:24 +10:00