ekg2
|
00001 /* $Id$ */ 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> /* XXX, protocol_uid() */ 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 /* some tlen constants */ 00024 #define TLEN_HUB "idi.tlen.pl" /* hub */ 00025 #define TLEN_FALLBACK_SERVER "s1.tlen.pl" /* fallback server */ 00026 #define TLEN_FALLBACK_PORT 443 /* fallback port */ 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 /* struct xmlnode_s *prev; */ 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 { /* see JEP-0048 for details */ 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 { /* priv_data data based on bookmark type */ 00087 jabber_bookmark_url_t *url; /* for JABBER_BOOKMARK_URL */ 00088 jabber_bookmark_conference_t *conf; /* for JABBER_BOOKMARK_CONFERENCE */ 00089 void *other; /* ? ;p */ 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 /* name bit allow/block: */ 00103 typedef enum { 00104 PRIVACY_LIST_MESSAGE = 1, /* incoming messages */ 00105 PRIVACY_LIST_IQ = 2, /* incoming iq packets */ 00106 PRIVACY_LIST_PRESENCE_IN = 4, /* incoming presence packets */ 00107 PRIVACY_LIST_PRESENCE_OUT = 8, /* outgoint presence packets */ 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; /* jid/group/subscription/ */ 00113 char *value; /* jid:.../@group/subscription ---- value */ 00114 unsigned int allow : 1; /* 1 - allow 0 - deny */ 00115 jabber_iq_privacy_flags_t items; /* lista bitmaski j/w */ 00116 unsigned int order; /* 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 /* from muc_userlist_t */ 00173 char *role; /* role: */ 00174 char *aff; /* affiliation: */ 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 /* digest.c hashowanie.. */ 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 /* __EKG_JABBER_JABBER_H */ 00248 00249 /* 00250 * Local Variables: 00251 * mode: c 00252 * c-file-style: "k&r" 00253 * c-basic-offset: 8 00254 * indent-tabs-mode: t 00255 * End: 00256 */