summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-xmpp-utils.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-xmpp-utils.h
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-xmpp-utils.h')
-rw-r--r--epan/dissectors/packet-xmpp-utils.h251
1 files changed, 251 insertions, 0 deletions
diff --git a/epan/dissectors/packet-xmpp-utils.h b/epan/dissectors/packet-xmpp-utils.h
new file mode 100644
index 00000000..34214086
--- /dev/null
+++ b/epan/dissectors/packet-xmpp-utils.h
@@ -0,0 +1,251 @@
+/* xmpp-utils.h
+ *
+ * Copyright 2011, Mariusz Okroj <okrojmariusz[]gmail.com>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef XMPP_UTILS_H
+#define XMPP_UTILS_H
+
+#include "ws_symbol_export.h"
+#include "tvbuff.h"
+#include "dissectors/packet-xml.h"
+#include <epan/wmem_scopes.h>
+
+#define xmpp_elem_cdata(elem) \
+elem->data?elem->data->value:""
+
+typedef struct _xmpp_array_t
+{
+ gpointer data;
+ gint length;
+} xmpp_array_t;
+
+typedef struct _xmpp_attr_t{
+ const gchar *value;
+ const gchar *name;
+ gint offset;
+ gint length;
+
+ gboolean was_read;
+} xmpp_attr_t;
+
+typedef struct _xmpp_data_t{
+ gchar *value;
+
+ gint offset;
+ gint length;
+} xmpp_data_t;
+
+typedef struct _xmpp_element_t{
+ gchar* name;
+
+ /*abbreviation that apprears before tag name (<nos:x .../>)
+ if abbrev doesn't appear then NULL*/
+ gchar* default_ns_abbrev;
+ /*pair of namespace abbrev and namespace*/
+ GHashTable *namespaces;
+
+ GHashTable *attrs;
+ GList *elements;
+ xmpp_data_t *data;
+
+ gint offset;
+ gint length;
+
+ gboolean was_read;
+} xmpp_element_t;
+
+/*informations about attributes that are displayed in proto tree*/
+typedef struct _xmpp_attr_info{
+ const gchar *name;
+ const gint *phf;
+ gboolean is_required;
+ gboolean in_short_list;
+
+ /*function validates this attribute
+ it may impose other restrictions (e.g. validating atribut's name, ...)*/
+ void (*val_func)(packet_info *pinfo, proto_item *item, const gchar *name, const gchar *value, gconstpointer data);
+ gpointer data;
+} xmpp_attr_info;
+
+typedef struct _xmpp_attr_info_ext{
+ const gchar* ns;
+ xmpp_attr_info info;
+} xmpp_attr_info_ext;
+
+typedef enum _xmpp_elem_info_type{
+ NAME,
+ ATTR,
+ NAME_AND_ATTR,
+ NAMES
+} xmpp_elem_info_type;
+
+typedef enum _xmpp_elem_info_occurrence
+{
+ ONE,MANY
+} xmpp_elem_info_occurrence;
+
+/*informations about elements that are displayed in proto tree*/
+typedef struct _xmpp_elem_info{
+ xmpp_elem_info_type type;
+ gconstpointer data;
+ /*function that displays element in tree*/
+ void (*elem_func)(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
+ xmpp_elem_info_occurrence occurrence;
+} xmpp_elem_info;
+
+typedef struct _xmpp_conv_info_t {
+ wmem_tree_t *req_resp;
+ wmem_tree_t *jingle_sessions;
+ wmem_tree_t *ibb_sessions;
+ wmem_tree_t *gtalk_sessions;
+ guint32 ssl_start;
+} xmpp_conv_info_t;
+
+/** Struct conatins frame numbers (request frame(IQ set/get) and
+ * response frame(IQ result/error)).
+ */
+typedef struct _xmpp_reqresp_transaction_t {
+ guint32 req_frame;
+ guint32 resp_frame;
+} xmpp_transaction_t;
+
+/** Function that is responsibe for request/response tracking in IQ packets.
+ * Each IQ set/get packet should have the response in other IQ result/error packet.
+ * Both packet should have the same id attribute. Function saves in wmem_tree pairs of
+ * packet id and struct xmpp_transaction_t.
+ */
+extern void xmpp_iq_reqresp_track(packet_info *pinfo, xmpp_element_t *packet, xmpp_conv_info_t *xmpp_info);
+
+/** Function that is responsibe for jingle session tracking in IQ packets.
+ * Function saves in wmem_tree pairs of packet's id and Jingle session's id.
+ */
+extern void xmpp_jingle_session_track(packet_info *pinfo, xmpp_element_t *packet, xmpp_conv_info_t *xmpp_info);
+
+/** Function that is responsibe for ibb(in band bytestreams) session tracking in IQ packets.
+ * Function saves in wmem_tree pairs of packet's id and In-Band Bytestreams session's id.
+ */
+extern void xmpp_ibb_session_track(packet_info *pinfo, xmpp_element_t *packet, xmpp_conv_info_t *xmpp_info);
+
+/** Function that is responsibe for GTalk session(voice/video) tracking in IQ packets.
+ * Function saves in wmem_tree pairs of packet's id and GTalk session's id.
+ */
+extern void xmpp_gtalk_session_track(packet_info *pinfo, xmpp_element_t *packet, xmpp_conv_info_t *xmpp_info);
+
+/** Function detects unrecognized elements and displays them in tree.
+ * It uses ett_unknown to display packets. ett_unknown has const size described by
+ * ETT_UNKNOWN_LEN in packet-xmpp.h
+ */
+extern void xmpp_unknown(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
+
+/** Displays CDATA from element in tree. You can use your own header field hf or
+ * pass -1. If you pass -1 then CDATA will be display as text:
+ * ELEMENT_NAME: CDATA
+ * ELEMENT_NAME = element->name, if element is empty CDATA = "(empty)"
+ */
+extern void xmpp_cdata(proto_tree *tree, tvbuff_t *tvb, xmpp_element_t *element, gint hf);
+
+/** Function is similar to xmpp_cdata. But it display items only as a text and it is
+ * compatibile with function display_elems
+ */
+extern void xmpp_simple_cdata_elem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
+
+/** Converts xml_frame_t struct to xmpp_element_t. Should be call with parent==NULL.
+ */
+extern xmpp_element_t* xmpp_xml_frame_to_element_t(wmem_allocator_t *pool, xml_frame_t *xml_frame, xmpp_element_t *parent, tvbuff_t *tvb);
+
+/** Frees all GLib structs in xmpp_element_t struct. Should be call only for root element.
+ * It works recursively.
+ */
+extern void xmpp_element_t_tree_free(xmpp_element_t *root);
+
+/** Allocs ephemeral memory for xmpp_array_t struct.*/
+extern xmpp_array_t* xmpp_ep_init_array_t(wmem_allocator_t *pool, const gchar** array, gint len);
+
+/*Allocs ephemeral memory for xmpp_attr_t struct*/
+extern xmpp_attr_t* xmpp_ep_init_attr_t(wmem_allocator_t *pool, const gchar *value, gint offset, gint length);
+
+/** steal_*
+ * Functions searches and marks as read found elements.
+ * If element is set as read, it is invisible for these functions.*/
+
+extern xmpp_element_t* xmpp_steal_element_by_name(xmpp_element_t *packet, const gchar *name);
+extern xmpp_element_t* xmpp_steal_element_by_names(xmpp_element_t *packet, const gchar **names, gint names_len);
+extern xmpp_element_t* xmpp_steal_element_by_attr(xmpp_element_t *packet, const gchar *attr_name, const gchar *attr_value);
+extern xmpp_element_t* xmpp_steal_element_by_name_and_attr(xmpp_element_t *packet, const gchar *name, const gchar *attr_name, const gchar *attr_value);
+
+/*Returns first child in element*/
+extern xmpp_element_t* xmpp_get_first_element(xmpp_element_t *packet);
+
+/*Converts element to string. Returns memory allocated from the given pool.*/
+extern gchar* xmpp_element_to_string(wmem_allocator_t *pool, tvbuff_t *tvb, xmpp_element_t *element);
+
+/* Returns attribute by name and set as read. If attrib is set as read, it may be found
+ * one more time, but it is invisible for function xmpp_unknown_attrib*/
+extern xmpp_attr_t* xmpp_get_attr(xmpp_element_t *element, const gchar* attr_name);
+
+/*Function hides first element in tree.*/
+extern void xmpp_proto_tree_hide_first_child(proto_tree *tree);
+
+/*Function shows first element in tree.*/
+extern void xmpp_proto_tree_show_first_child(proto_tree *tree);
+
+/*Function returns item as text. Memory is allocated from the given pool.*/
+extern gchar* proto_item_get_text(wmem_allocator_t *pool, proto_item *item);
+
+/*Function returns struct that contains 3 strings. It is used to build xmpp_attr_info struct.*/
+extern gpointer xmpp_name_attr_struct(wmem_allocator_t *pool, const gchar *name, const gchar *attr_name, const gchar *attr_value);
+
+/** Function displays attributes from element in way described in attrs.
+ * Elements that doesn't exist in attrs are displayed as text.
+ * In XMPP_ATTR_INFO struct you can define several things:
+ * - is_in_short_list - attribute should be displayed in short list e.g. ELEMENT_NAME [ATTR1='value' ATTR2='value']
+ * - is_required - attribute is required. If attribute doesn't appear then EXPERT INFO will be displayed
+ * - val_func - validate function
+ * - data - data passes to the val_func
+ */
+extern void xmpp_display_attrs(proto_tree *tree, xmpp_element_t *element, packet_info *pinfo, tvbuff_t *tvb, const xmpp_attr_info *attrs, guint n);
+
+/** Function does the same as shown above. It takes attrs(XMPP_ATTR_INFO_EXT) argument
+ * that contains XMPP_ATTR_INFO struct and string with namespace. It is used when packet
+ * contains several namespaces and each attribute belongs to particular namespace.
+ * E.g.
+ * @code
+ * <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl'
+ * mechanism='PLAIN'
+ * xmlns:ga='http://www.google.com/talk/protocol/auth'
+ * ga:client-uses-full-bind-result='true'>
+ * </auth>
+ * @endcode
+ */
+extern void xmpp_display_attrs_ext(proto_tree *tree, xmpp_element_t *element, packet_info *pinfo, tvbuff_t *tvb, const xmpp_attr_info_ext *attrs, guint n);
+
+/** Displays elements from parent element in a way described in elems(XMPP_ELEM_INFO).
+ * XMPP_ELEM_INFO describes how to find particular element and what action should be done
+ * for this element.
+ * Function calls xmpp_unknown.
+ */
+extern void xmpp_display_elems(proto_tree *tree, xmpp_element_t *parent, packet_info *pinfo, tvbuff_t *tvb, xmpp_elem_info *elems, guint n);
+
+/* Validates attribute value. Takes string array(gchar**) in parameter data.
+ * Is used in XMPP_ATTR_INFO struct.
+ */
+extern void xmpp_val_enum_list(packet_info *pinfo, proto_item *item, const gchar *name, const gchar *value, gconstpointer data);
+
+/** Function changes element to attribute. It searches element by name in parent element,
+ * next it create attribute using transform_func and inserts it to parent attributes hash table
+ * using attr_name as key.
+ */
+extern void xmpp_change_elem_to_attrib(wmem_allocator_t *pool, const gchar *elem_name, const gchar *attr_name, xmpp_element_t *parent, xmpp_attr_t* (*transform_func)(wmem_allocator_t *pool, xmpp_element_t *element));
+
+/** transform_func that creates attribute with element's cdata as value
+ */
+extern xmpp_attr_t* xmpp_transform_func_cdata(wmem_allocator_t *pool, xmpp_element_t *elem);
+
+#endif /* XMPP_UTILS_H */