00001
00002
00003 #ifndef __EKG_JABBER_JABBER_H
00004 #define __EKG_JABBER_JABBER_H
00005
00006 #include <ekg2-config.h>
00007
00008 #include <ekg/dynstuff.h>
00009 #include <ekg/plugins.h>
00010 #include <ekg/protocol.h>
00011 #include <ekg/sessions.h>
00012 #include <ekg/userlist.h>
00013
00014 #ifdef HAVE_EXPAT_H
00015 #include <expat.h>
00016 #endif
00017
00018 #include "jabber-ssl.h"
00019
00020 #define DEFAULT_CLIENT_NAME "EKG2 -- http://www.ekg2.org"
00021 #define JABBER_DEFAULT_RESOURCE "ekg2"
00022
00023
00024 #define TLEN_HUB "idi.tlen.pl"
00025 #define TLEN_FALLBACK_SERVER "s1.tlen.pl"
00026 #define TLEN_FALLBACK_PORT 443
00027
00028 #define tlenjabber_escape(str) (j->istlen ? tlen_encode(str) : jabber_escape(str))
00029 #define tlenjabber_unescape(str) (j->istlen ? tlen_decode(str) : jabber_unescape(str))
00030 #define tlenjabber_uid(target) protocol_uid(j->istlen ? "tlen" : "xmpp", target)
00031
00032 #define tlen_uid(target) protocol_uid("tlen", target)
00033 #define xmpp_uid(target) protocol_uid("xmpp", target)
00034
00035 struct xmlnode_s {
00036 char *name;
00037 char *data;
00038 char **atts;
00039 char *xmlns;
00040
00041 struct xmlnode_s *parent;
00042 struct xmlnode_s *children;
00043
00044 struct xmlnode_s *next;
00045
00046 };
00047
00048 typedef struct xmlnode_s xmlnode_t;
00049
00050 enum jabber_opengpg_type_t {
00051 JABBER_OPENGPG_ENCRYPT = 0,
00052 JABBER_OPENGPG_DECRYPT,
00053 JABBER_OPENGPG_SIGN,
00054 JABBER_OPENGPG_VERIFY
00055 };
00056
00057 enum jabber_bookmark_type_t {
00058 JABBER_BOOKMARK_UNKNOWN = 0,
00059 JABBER_BOOKMARK_URL,
00060 JABBER_BOOKMARK_CONFERENCE,
00061 };
00062
00063 typedef enum {
00064 JABBER_IQ_TYPE_NONE,
00065 JABBER_IQ_TYPE_GET,
00066 JABBER_IQ_TYPE_SET,
00067 JABBER_IQ_TYPE_RESULT,
00068 JABBER_IQ_TYPE_ERROR,
00069 } jabber_iq_type_t;
00070
00071 typedef struct {
00072 char *name;
00073 char *url;
00074 } jabber_bookmark_url_t;
00075
00076 typedef struct {
00077 char *name;
00078 char *jid;
00079 unsigned int autojoin : 1;
00080 char *nick;
00081 char *pass;
00082 } jabber_bookmark_conference_t;
00083
00084 typedef struct {
00085 enum jabber_bookmark_type_t type;
00086 union {
00087 jabber_bookmark_url_t *url;
00088 jabber_bookmark_conference_t *conf;
00089 void *other;
00090 } priv_data;
00091 } jabber_bookmark_t;
00092
00093 enum jabber_compression_method {
00094 JABBER_COMPRESSION_NONE = 0,
00095 JABBER_COMPRESSION_ZLIB_INIT,
00096 JABBER_COMPRESSION_LZW_INIT,
00097
00098 JABBER_COMPRESSION_ZLIB,
00099 JABBER_COMPRESSION_LZW,
00100 };
00101
00102
00103 typedef enum {
00104 PRIVACY_LIST_MESSAGE = 1,
00105 PRIVACY_LIST_IQ = 2,
00106 PRIVACY_LIST_PRESENCE_IN = 4,
00107 PRIVACY_LIST_PRESENCE_OUT = 8,
00108 PRIVACY_LIST_ALL = (PRIVACY_LIST_MESSAGE | PRIVACY_LIST_IQ | PRIVACY_LIST_PRESENCE_IN | PRIVACY_LIST_PRESENCE_OUT)
00109 } jabber_iq_privacy_flags_t;
00110
00111 typedef struct {
00112 char *type;
00113 char *value;
00114 unsigned int allow : 1;
00115 jabber_iq_privacy_flags_t items;
00116 unsigned int order;
00117 } jabber_iq_privacy_t;
00118
00119 typedef struct {
00120 char *thread;
00121 char *uid;
00122 char *subject;
00123 void *next;
00124 } jabber_conversation_t;
00125
00126 typedef struct {
00127 char *id;
00128 char *to;
00129 char *type;
00130 char *xmlns;
00131 void (*handler)(session_t *s, xmlnode_t *n, const char *from, const char *id);
00132 void (*error)(session_t *s, xmlnode_t *n, const char *from, const char *id);
00133 } jabber_stanza_t;
00134
00138 typedef struct {
00139 int fd;
00140 unsigned int istlen : 2;
00142 enum jabber_compression_method using_compress;
00143 #ifdef JABBER_HAVE_SSL
00144 unsigned char using_ssl : 2;
00145 SSL_SESSION ssl_session;
00146 #ifdef JABBER_HAVE_GNUTLS
00147 gnutls_certificate_credentials xcred;
00148 #endif
00149 #endif
00150 int id;
00151 XML_Parser parser;
00152 char *server;
00153 uint16_t port;
00154 unsigned int sasl_connecting :1;
00155 char *resource;
00156 char *last_gmail_result_time;
00157 char *last_gmail_tid;
00158 list_t privacy;
00159 list_t bookmarks;
00160 list_t iq_stanzas;
00161
00162 watch_t *send_watch;
00163 watch_t *connect_watch;
00164
00165 xmlnode_t *node;
00166 jabber_conversation_t *conversations;
00167 } jabber_private_t;
00168
00169 typedef struct {
00170 int authtype;
00171
00172
00173 char *role;
00174 char *aff;
00175 } jabber_userlist_private_t;
00176
00177 enum jabber_auth_t {
00178 EKG_JABBER_AUTH_NONE = 0,
00179 EKG_JABBER_AUTH_FROM = 1,
00180 EKG_JABBER_AUTH_TO = 2,
00181 EKG_JABBER_AUTH_BOTH = 3,
00182 EKG_JABBER_AUTH_REQ = 4,
00183 EKG_JABBER_AUTH_UNREQ = 8
00184 };
00185
00186 extern plugin_t jabber_plugin;
00187 extern char *jabber_default_pubsub_server;
00188 extern char *jabber_default_search_server;
00189 extern int config_jabber_beep_mail;
00190 extern const char *jabber_authtypes[];
00191
00192 #define jabber_private(s) ((jabber_private_t*) session_private_get(s))
00193 #define jabber_userlist_priv_get(u) ((jabber_userlist_private_t *) userlist_private_get(&jabber_plugin, u))
00194
00195 void jabber_register_commands(void);
00196 XML_Parser jabber_parser_recreate(XML_Parser parser, void *data);
00197
00198 int JABBER_COMMIT_DATA(watch_t *w);
00199 void jabber_handle(void *data, xmlnode_t *n);
00200
00201 int jabber_privacy_freeone(jabber_private_t *j, jabber_iq_privacy_t *item);
00202 int jabber_stanza_freeone(jabber_private_t *j, jabber_stanza_t *stanza);
00203
00204 const char *jabber_iq_reg(session_t *s, const char *prefix, const char *to, const char *type, const char *xmlns);
00205 const char *jabber_iq_send(session_t *s, const char *prefix, jabber_iq_type_t iqtype, const char *to, const char *type, const char *xmlns);
00206
00207
00208 char *jabber_digest(const char *sid, const char *password, int istlen);
00209 char *jabber_sha1_generic(char *buf, int len);
00210 char *jabber_dcc_digest(char *sid, char *initiator, char *target);
00211 char *jabber_challange_digest(const char *sid, const char *password, const char *nonce, const char *cnonce, const char *xmpp_temp, const char *realm);
00212 void jabber_iq_auth_send(session_t *s, const char *username, const char *passwd, const char *stream_id);
00213
00214 char *jabber_attr(char **atts, const char *att);
00215 char *jabber_escape(const char *text);
00216 char *jabber_unescape(const char *text);
00217 char *tlen_encode(const char *what);
00218 char *tlen_decode(const char *what);
00219 int jabber_write_status(session_t *s);
00220
00221 void jabber_reconnect_handler(int type, void *data);
00222
00223 LIST_ADD_COMPARE(jabber_privacy_add_compare, jabber_iq_privacy_t *);
00224 int jabber_privacy_free(jabber_private_t *j);
00225 int jabber_bookmarks_free(jabber_private_t *j);
00226 int jabber_iq_stanza_free(jabber_private_t *j);
00227
00228 #define jabber_write(s, args...) watch_write((s && s->priv) ? jabber_private(s)->send_watch : NULL, args);
00229 WATCHER_LINE(jabber_handle_write);
00230
00231 void xmlnode_handle_end(void *data, const char *name);
00232 void xmlnode_handle_cdata(void *data, const char *text, int len);
00233
00234 void jabber_handle_disconnect(session_t *s, const char *reason, int type);
00235
00236 char *jabber_openpgp(session_t *s, const char *fromto, enum jabber_opengpg_type_t way, char *message, char *key, char **error);
00237 #ifdef HAVE_ZLIB
00238 char *jabber_zlib_decompress(const char *buf, int *len);
00239 char *jabber_zlib_compress(const char *buf, int *len);
00240 #endif
00241
00242 int jabber_conversation_find(jabber_private_t *j, const char *uid, const char *subject, const char *thread, jabber_conversation_t **result, const int can_add);
00243 jabber_conversation_t *jabber_conversation_get(jabber_private_t *j, const int n);
00244 char *jabber_thread_gen(jabber_private_t *j, const char *uid);
00245
00246 uint32_t *jabber_msg_format(const char *plaintext, const xmlnode_t *html);
00247 #endif
00248
00249
00250
00251
00252
00253
00254
00255
00256