source: irc.h @ 701ab812

Last change on this file since 701ab812 was 30093fa, checked in by dequis <dx@…>, at 2016-11-12T02:30:32Z

otr: word_wrap long system messages ("unencrypted message received")

  • Property mode set to 100644
File size: 12.7 KB
Line 
1/********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2013 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* The IRC-based UI (for now the only one)                              */
8
9/*
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License with
21  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22  if not, write to the Free Software Foundation, Inc., 51 Franklin St.,
23  Fifth Floor, Boston, MA  02110-1301  USA
24*/
25
26#ifndef _IRC_H
27#define _IRC_H
28
29#define IRC_MAX_LINE 512
30#define IRC_MAX_ARGS 16
31#define IRC_WORD_WRAP 425
32
33#define IRC_LOGIN_TIMEOUT 60
34#define IRC_PING_STRING "PinglBee"
35
36#define UMODES "abisw"     /* Allowed umodes (although they mostly do nothing) */
37#define UMODES_PRIV "Ro"   /* Allowed, but not by user directly */
38#define UMODES_KEEP "R"    /* Don't allow unsetting using /MODE */
39#define CMODES "ntC"       /* Allowed modes */
40#define CMODE "t"          /* Default mode */
41#define UMODE "s"          /* Default mode */
42
43#define CTYPES "&#"        /* Valid channel name prefixes */
44
45typedef enum {
46        USTATUS_OFFLINE = 0,
47        USTATUS_AUTHORIZED = 1, /* Gave the correct server password (PASS). */
48        USTATUS_LOGGED_IN = 2,  /* USER+NICK(+PASS) finished. */
49        USTATUS_IDENTIFIED = 4, /* To NickServ (root). */
50        USTATUS_SHUTDOWN = 8,   /* Now used to indicate we're shutting down.
51                                   Currently just blocks irc_vawrite(). */
52        USTATUS_CAP_PENDING = 16,
53        USTATUS_SASL_PLAIN_PENDING = 32,
54
55        /* Not really status stuff, but other kinds of flags: For slightly
56           better password security, since the only way to send passwords
57           to the IRC server securely (i.e. not echoing to screen or written
58           to logfiles) is the /OPER command, try to use that command for
59           stuff that matters. */
60        OPER_HACK_IDENTIFY = 0x100,
61        OPER_HACK_IDENTIFY_NOLOAD = 0x01100,
62        OPER_HACK_IDENTIFY_FORCE  = 0x02100,
63        OPER_HACK_REGISTER = 0x200,
64        OPER_HACK_ACCOUNT_PASSWORD = 0x400,
65        OPER_HACK_ANY = 0x3700, /* To check for them all at once. */
66
67        IRC_UTF8_NICKS = 0x10000, /* Disable ASCII restrictions on buddy nicks. */
68} irc_status_t;
69
70typedef enum {
71        CAP_SASL = (1 << 0),
72        CAP_MULTI_PREFIX = (1 << 1),
73        CAP_EXTENDED_JOIN = (1 << 2),
74        CAP_AWAY_NOTIFY = (1 << 3),
75        CAP_USERHOST_IN_NAMES = (1 << 4),
76} irc_cap_flag_t;
77
78struct irc_user;
79
80typedef struct irc {
81        int fd;
82        irc_status_t status;
83        double last_pong;
84        int pinging;
85        char *sendbuffer;
86        char *readbuffer;
87        GIConv iconv, oconv;
88
89        struct irc_user *root;
90        struct irc_user *user;
91
92        char *password; /* HACK: Used to save the user's password, but before
93                           logging in, this may contain a password we should
94                           send to identify after USER/NICK are received. */
95        char *auth_backend;
96
97        char umode[8];
98
99        struct query *queries;
100        GSList *file_transfers;
101
102        GSList *users, *channels;
103        struct irc_channel *default_channel;
104        GHashTable *nick_user_hash;
105        GHashTable *watches; /* See irc_cmd_watch() */
106
107        gint r_watch_source_id;
108        gint w_watch_source_id;
109        gint ping_source_id;
110        gint login_source_id; /* To slightly delay some events at login time. */
111
112        struct otr *otr; /* OTR state and book keeping, used by the OTR plugin.
113                            TODO: Some mechanism for plugindata. */
114
115        struct bee *b;
116        guint32 caps;
117} irc_t;
118
119typedef enum {
120        /* Replaced with iu->last_channel IRC_USER_PRIVATE = 1, */
121        IRC_USER_AWAY = 2,
122
123        IRC_USER_OTR_ENCRYPTED = 0x10000,
124        IRC_USER_OTR_TRUSTED   = 0x20000,
125} irc_user_flags_t;
126
127typedef struct irc_user {
128        irc_t *irc;
129
130        char *nick;
131        char *user;
132        char *host;
133        char *fullname;
134
135        /* Nickname in lowercase for case insensitive searches */
136        char *key;
137
138        irc_user_flags_t flags;
139        struct irc_channel *last_channel;
140
141        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
142        guint pastebuf_timer;
143        time_t away_reply_timeout; /* Only send a 301 if this time passed. */
144
145        struct bee_user *bu;
146
147        const struct irc_user_funcs *f;
148} irc_user_t;
149
150struct irc_user_funcs {
151        gboolean (*privmsg)(irc_user_t *iu, const char *msg);
152        gboolean (*ctcp)(irc_user_t *iu, char * const* ctcp);
153};
154
155extern const struct irc_user_funcs irc_user_root_funcs;
156extern const struct irc_user_funcs irc_user_self_funcs;
157
158typedef enum {
159        IRC_CHANNEL_JOINED = 1, /* The user is currently in the channel. */
160        IRC_CHANNEL_TEMP = 2,   /* Erase the channel when the user leaves,
161                                   and don't save it. */
162
163        /* Hack: Set this flag right before jumping into IM when we expect
164           a call to imcb_chat_new(). */
165        IRC_CHANNEL_CHAT_PICKME = 0x10000,
166} irc_channel_flags_t;
167
168typedef struct irc_channel {
169        irc_t *irc;
170        char *name;
171        char mode[8];
172        int flags;
173
174        char *topic;
175        char *topic_who;
176        time_t topic_time;
177
178        GSList *users; /* struct irc_channel_user */
179        struct irc_user *last_target;
180        struct set *set;
181
182        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
183        guint pastebuf_timer;
184
185        const struct irc_channel_funcs *f;
186        void *data;
187} irc_channel_t;
188
189struct irc_channel_funcs {
190        gboolean (*privmsg)(irc_channel_t *ic, const char *msg);
191        gboolean (*join)(irc_channel_t *ic);
192        gboolean (*part)(irc_channel_t *ic, const char *msg);
193        gboolean (*topic)(irc_channel_t *ic, const char *new_topic);
194        gboolean (*invite)(irc_channel_t *ic, irc_user_t *iu);
195        void (*kick)(irc_channel_t *ic, irc_user_t *iu, const char *msg);
196
197        gboolean (*_init)(irc_channel_t *ic);
198        gboolean (*_free)(irc_channel_t *ic);
199};
200
201typedef enum {
202        IRC_CHANNEL_USER_OP = 1,
203        IRC_CHANNEL_USER_HALFOP = 2,
204        IRC_CHANNEL_USER_VOICE = 4,
205        IRC_CHANNEL_USER_NONE = 8,
206} irc_channel_user_flags_t;
207
208typedef struct irc_channel_user {
209        irc_user_t *iu;
210        int flags;
211} irc_channel_user_t;
212
213typedef enum {
214        IRC_CC_TYPE_DEFAULT  = 0x00001,
215        IRC_CC_TYPE_REST     = 0x00002, /* Still not implemented. */
216        IRC_CC_TYPE_GROUP    = 0x00004,
217        IRC_CC_TYPE_ACCOUNT  = 0x00008,
218        IRC_CC_TYPE_PROTOCOL = 0x00010,
219        IRC_CC_TYPE_MASK     = 0x000ff,
220        IRC_CC_TYPE_INVERT   = 0x00100,
221} irc_control_channel_type_t;
222
223struct irc_control_channel {
224        irc_control_channel_type_t type;
225        struct bee_group *group;
226        struct account *account;
227        struct prpl *protocol;
228        char modes[5];
229};
230
231extern const struct bee_ui_funcs irc_ui_funcs;
232
233typedef enum {
234        IRC_CDU_SILENT,
235        IRC_CDU_PART,
236        IRC_CDU_KICK,
237} irc_channel_del_user_type_t;
238
239/* These are a glued a little bit to the core/bee layer and a little bit to
240   IRC. The first user is OTR, and I guess at some point we'll get to shape
241   this a little bit more as other uses come up. */
242typedef struct irc_plugin {
243        /* Called at the end of irc_new(). Can be used to add settings, etc. */
244        gboolean (*irc_new)(irc_t *irc);
245        /* At the end of irc_free(). */
246        void (*irc_free)(irc_t *irc);
247
248        /* Problem with the following two functions is ordering if multiple
249           plugins are handling them. Let's keep fixing that problem for
250           whenever it becomes important. */
251
252        /* Called by bee_irc_user_privmsg_cb(). Return NULL if you want to
253           abort sending the msg. */
254        char* (*filter_msg_out)(irc_user_t * iu, char *msg, int flags);
255        /* Called by bee_irc_user_msg(). Return NULL if you swallowed the
256           message and don't want anything to go to the user. */
257        char* (*filter_msg_in)(irc_user_t * iu, char *msg, int flags);
258
259        /* From storage.c functions. Ideally these should not be used
260           and instead data should be stored in settings which will get
261           saved automatically. Consider these deprecated! */
262        void (*storage_load)(irc_t *irc);
263        void (*storage_save)(irc_t *irc);
264        void (*storage_remove)(const char *nick);
265} irc_plugin_t;
266
267extern GSList *irc_plugins; /* struct irc_plugin */
268
269/* irc.c */
270extern GSList *irc_connection_list;
271
272irc_t *irc_new(int fd);
273void irc_abort(irc_t *irc, int immed, char *format, ...) G_GNUC_PRINTF(3, 4);
274void irc_free(irc_t *irc);
275void irc_setpass(irc_t *irc, const char *pass);
276
277void irc_process(irc_t *irc);
278char **irc_parse_line(char *line);
279char *irc_build_line(char **cmd);
280
281void irc_write(irc_t *irc, char *format, ...) G_GNUC_PRINTF(2, 3);
282void irc_write_all(int now, char *format, ...) G_GNUC_PRINTF(2, 3);
283void irc_vawrite(irc_t *irc, char *format, va_list params);
284
285void irc_flush(irc_t *irc);
286void irc_switch_fd(irc_t *irc, int fd);
287void irc_sync(irc_t *irc);
288void irc_desync(irc_t *irc);
289
290int irc_check_login(irc_t *irc);
291
292void irc_umode_set(irc_t *irc, const char *s, gboolean allow_priv);
293
294void register_irc_plugin(const struct irc_plugin *p);
295
296/* irc_channel.c */
297irc_channel_t *irc_channel_new(irc_t *irc, const char *name);
298irc_channel_t *irc_channel_by_name(irc_t *irc, const char *name);
299irc_channel_t *irc_channel_get(irc_t *irc, char *id);
300int irc_channel_free(irc_channel_t *ic);
301void irc_channel_free_soon(irc_channel_t *ic);
302int irc_channel_add_user(irc_channel_t *ic, irc_user_t *iu);
303int irc_channel_del_user(irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg);
304irc_channel_user_t *irc_channel_has_user(irc_channel_t *ic, irc_user_t *iu);
305struct irc_channel *irc_channel_with_user(irc_t *irc, irc_user_t *iu);
306int irc_channel_set_topic(irc_channel_t *ic, const char *topic, const irc_user_t *who);
307void irc_channel_user_set_mode(irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags);
308void irc_channel_set_mode(irc_channel_t *ic, const char *s);
309void irc_channel_auto_joins(irc_t *irc, struct account *acc);
310void irc_channel_printf(irc_channel_t *ic, char *format, ...);
311gboolean irc_channel_name_ok(const char *name);
312void irc_channel_name_strip(char *name);
313int irc_channel_name_cmp(const char *a_, const char *b_);
314char *irc_channel_name_gen(irc_t *irc, const char *name);
315gboolean irc_channel_name_hint(irc_channel_t *ic, const char *name);
316void irc_channel_update_ops(irc_channel_t *ic, char *value);
317char irc_channel_user_get_prefix(irc_channel_user_t *icu);
318char *set_eval_irc_channel_ops(struct set *set, char *value);
319gboolean irc_channel_wants_user(irc_channel_t *ic, irc_user_t *iu);
320
321/* irc_commands.c */
322void irc_exec(irc_t *irc, char **cmd);
323
324/* irc_send.c */
325void irc_send_num(irc_t *irc, int code, char *format, ...) G_GNUC_PRINTF(3, 4);
326void irc_send_login(irc_t *irc);
327void irc_send_motd(irc_t *irc);
328const char *irc_user_msgdest(irc_user_t *iu);
329void irc_rootmsg(irc_t *irc, char *format, ...);
330void irc_usermsg(irc_user_t *iu, char *format, ...);
331void irc_usernotice(irc_user_t *iu, char *format, ...);
332void irc_send_join(irc_channel_t *ic, irc_user_t *iu);
333void irc_send_part(irc_channel_t *ic, irc_user_t *iu, const char *reason);
334void irc_send_quit(irc_user_t *iu, const char *reason);
335void irc_send_kick(irc_channel_t *ic, irc_user_t *iu, irc_user_t *kicker, const char *reason);
336void irc_send_names(irc_channel_t *ic);
337void irc_send_topic(irc_channel_t *ic, gboolean topic_change);
338void irc_send_whois(irc_user_t *iu);
339void irc_send_who(irc_t *irc, GSList *l, const char *channel);
340void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix);
341void irc_send_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg);
342void irc_send_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *format, ...) G_GNUC_PRINTF(4, 5);
343void irc_send_nick(irc_user_t *iu, const char *new_nick);
344void irc_send_channel_user_mode_diff(irc_channel_t *ic, irc_user_t *iu,
345                                     irc_channel_user_flags_t old_flags, irc_channel_user_flags_t new_flags);
346void irc_send_invite(irc_user_t *iu, irc_channel_t *ic);
347void irc_send_cap(irc_t *irc, char *subcommand, char *body);
348void irc_send_away_notify(irc_user_t *iu);
349
350/* irc_user.c */
351irc_user_t *irc_user_new(irc_t *irc, const char *nick);
352int irc_user_free(irc_t *irc, irc_user_t *iu);
353irc_user_t *irc_user_by_name(irc_t *irc, const char *nick);
354int irc_user_set_nick(irc_user_t *iu, const char *new_nick);
355gint irc_user_cmp(gconstpointer a_, gconstpointer b_);
356const char *irc_user_get_away(irc_user_t *iu);
357void irc_user_quit(irc_user_t *iu, const char *msg);
358
359/* irc_util.c */
360char *set_eval_timezone(struct set *set, char *value);
361char *irc_format_timestamp(irc_t *irc, time_t msg_ts);
362char *set_eval_self_messages(struct set *set, char *value);
363
364/* irc_im.c */
365void bee_irc_channel_update(irc_t *irc, irc_channel_t *ic, irc_user_t *iu);
366void bee_irc_user_nick_reset(irc_user_t *iu);
367
368/* irc_cap.c */
369void irc_cmd_cap(irc_t *irc, char **cmd);
370
371#endif
Note: See TracBrowser for help on using the repository browser.