ekg2

plugins/jabber/jabber.h

Idź do dokumentacji tego pliku.
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  */
 All Struktury Danych Pliki Funkcje Zmienne Definicje typów Wyliczenia Wartości wyliczeń Definicje