123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2012, Digium, Inc.
- *
- * Joshua Colp <jcolp@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
- /*! \file
- * \brief XMPP Interface
- * \author Joshua Colp <jcolp@digium.com>
- * IKSEMEL http://iksemel.jabberstudio.org
- */
- #ifndef _ASTERISK_XMPP_H
- #define _ASTERISK_XMPP_H
- #ifdef HAVE_OPENSSL
- #include <openssl/ssl.h>
- #include <openssl/err.h>
- #define TRY_SECURE 2
- #define SECURE 4
- #endif /* HAVE_OPENSSL */
- /* file is read by blocks with this size */
- #define NET_IO_BUF_SIZE 16384
- /* Return value for timeout connection expiration */
- #define IKS_NET_EXPIRED 12
- #include <iksemel.h>
- #include "asterisk/utils.h"
- #include "asterisk/astobj2.h"
- #include "asterisk/linkedlists.h"
- #include "asterisk/stringfields.h"
- #include "asterisk/pbx.h"
- #include "asterisk/stasis.h"
- /*
- * As per RFC 3920 - section 3.1, the maximum length for a full Jabber ID
- * is 3071 bytes.
- * The ABNF syntax for jid :
- * jid = [node "@" ] domain [ "/" resource ]
- * Each allowable portion of a JID (node identifier, domain identifier,
- * and resource identifier) MUST NOT be more than 1023 bytes in length,
- * resulting in a maximum total size (including the '@' and '/' separators)
- * of 3071 bytes.
- */
- #define XMPP_MAX_JIDLEN 3071
- /*! \brief Maximum size of a resource JID */
- #define XMPP_MAX_RESJIDLEN 1023
- /*! \brief Maximum size of an attribute */
- #define XMPP_MAX_ATTRLEN 256
- /*! \brief Client connection states */
- enum xmpp_state {
- XMPP_STATE_DISCONNECTING, /*!< Client is disconnecting */
- XMPP_STATE_DISCONNECTED, /*!< Client is disconnected */
- XMPP_STATE_CONNECTING, /*!< Client is connecting */
- XMPP_STATE_REQUEST_TLS, /*!< Client should request TLS */
- XMPP_STATE_REQUESTED_TLS, /*!< Client has requested TLS */
- XMPP_STATE_AUTHENTICATE, /*!< Client needs to authenticate */
- XMPP_STATE_AUTHENTICATING, /*!< Client is authenticating */
- XMPP_STATE_ROSTER, /*!< Client is currently getting the roster */
- XMPP_STATE_CONNECTED, /*!< Client is fully connected */
- };
- /*! \brief Resource capabilities */
- struct ast_xmpp_capabilities {
- char node[200]; /*!< Node string from the capabilities stanza in presence notification */
- char version[50]; /*!< Version string from the capabilities stanza in presence notification */
- unsigned int jingle:1; /*!< Set if the resource supports Jingle */
- unsigned int google:1; /*!< Set if the resource supports Google Talk */
- };
- /*! \brief XMPP Resource */
- struct ast_xmpp_resource {
- char resource[XMPP_MAX_RESJIDLEN]; /*!< JID of the resource */
- int status; /*!< Current status of the resource */
- char *description; /*!< Description of the resource */
- int priority; /*!< Priority, used for deciding what resource to use */
- struct ast_xmpp_capabilities caps; /*!< Capabilities of the resource */
- };
- /*! \brief XMPP Message */
- struct ast_xmpp_message {
- char *from; /*!< Who the message is from */
- char *message; /*!< Message contents */
- char id[25]; /*!< Identifier for the message */
- struct timeval arrived; /*!< When the message arrived */
- AST_LIST_ENTRY(ast_xmpp_message) list; /*!< Linked list information */
- };
- struct ast_endpoint;
- /*! \brief XMPP Buddy */
- struct ast_xmpp_buddy {
- char id[XMPP_MAX_JIDLEN]; /*!< JID of the buddy */
- struct ao2_container *resources; /*!< Resources for the buddy */
- unsigned int subscribe:1; /*!< Need to subscribe to get their status */
- };
- /*! \brief XMPP Client Connection */
- struct ast_xmpp_client {
- AST_DECLARE_STRING_FIELDS(
- /*! Name of the client configuration */
- AST_STRING_FIELD(name);
- );
- /*! Message ID */
- char mid[6];
- iksid *jid;
- iksparser *parser;
- iksfilter *filter;
- ikstack *stack;
- #ifdef HAVE_OPENSSL
- SSL_CTX *ssl_context;
- SSL *ssl_session;
- const SSL_METHOD *ssl_method;
- unsigned int stream_flags;
- #endif /* HAVE_OPENSSL */
- enum xmpp_state state;
- struct ao2_container *buddies;
- AST_LIST_HEAD(, ast_xmpp_message) messages;
- pthread_t thread;
- int timeout;
- /*! Reconnect this client */
- unsigned int reconnect:1;
- /*! If distributing event information the MWI subscription */
- struct stasis_subscription *mwi_sub;
- /*! If distributing event information the device state subscription */
- struct stasis_subscription *device_state_sub;
- /*! The endpoint associated with this client */
- struct ast_endpoint *endpoint;
- };
- /*!
- * \brief Find an XMPP client connection using a given name
- *
- * \param name Name of the client connection
- *
- * \retval non-NULL on success
- * \retval NULL on failure
- *
- * \note This will return the client connection with the reference count incremented by one.
- */
- struct ast_xmpp_client *ast_xmpp_client_find(const char *name);
- /*!
- * \brief Disconnect an XMPP client connection
- *
- * \param client Pointer to the client
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_client_disconnect(struct ast_xmpp_client *client);
- /*!
- * \brief Release XMPP client connection reference
- *
- * \param client Pointer to the client
- */
- void ast_xmpp_client_unref(struct ast_xmpp_client *client);
- /*!
- * \brief Lock an XMPP client connection
- *
- * \param client Pointer to the client
- */
- void ast_xmpp_client_lock(struct ast_xmpp_client *client);
- /*!
- * \brief Unlock an XMPP client connection
- *
- * \param client Pointer to the client
- */
- void ast_xmpp_client_unlock(struct ast_xmpp_client *client);
- /*!
- * \brief Send an XML stanza out using an established XMPP client connection
- *
- * \param client Pointer to the client
- * \param stanza Pointer to the Iksemel stanza
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_client_send(struct ast_xmpp_client *client, iks *stanza);
- /*!
- * \brief Send a message to a given user using an established XMPP client connection
- *
- * \param client Pointer to the client
- * \param user User the message should be sent to
- * \param message The message to send
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_client_send_message(struct ast_xmpp_client *client, const char *user, const char *message);
- /*!
- * \brief Invite a user to an XMPP multi-user chatroom
- *
- * \param client Pointer to the client
- * \param user JID of the user
- * \param room Name of the chatroom
- * \param message Message to send with the invitation
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_chatroom_invite(struct ast_xmpp_client *client, const char *user, const char *room, const char *message);
- /*!
- * \brief Join an XMPP multi-user chatroom
- *
- * \param client Pointer to the client
- * \param room Name of the chatroom
- * \param nickname Nickname to use
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_chatroom_join(struct ast_xmpp_client *client, const char *room, const char *nickname);
- /*!
- * \brief Send a message to an XMPP multi-user chatroom
- *
- * \param client Pointer to the client
- * \param nickname Nickname to use
- * \param address Address of the room
- * \param message Message itself
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_chatroom_send(struct ast_xmpp_client *client, const char *nickname, const char *address, const char *message);
- /*!
- * \brief Leave an XMPP multi-user chatroom
- *
- * \param client Pointer to the client
- * \param room Name of the chatroom
- * \param nickname Nickname being used
- *
- * \retval 0 on success
- * \retval -1 on failure
- */
- int ast_xmpp_chatroom_leave(struct ast_xmpp_client *client, const char *room, const char *nickname);
- /*!
- * \brief Helper function which increments the message identifier
- *
- * \param mid Pointer to a string containing the message identifier
- */
- void ast_xmpp_increment_mid(char *mid);
- #endif
|