source: irc.h @ e1c926f

Last change on this file since e1c926f was 060d066, checked in by Wilmer van der Gaast <wilmer@…>, at 2011-02-01T13:05:58Z

More password paranoia: Allow omitting the identify/register password as
well (and enter it using /OPER instead).

This is a gross hack and indeed still not solid: In irssi one can still
use /RAWLOG SAVE to find the OPER line sent to BitlBee (and of course not
everyone uses SSL to talk to remote BitlBee servers). This only works
within 10-30 minutes after entering the password though.

  • Property mode set to 100644
File size: 11.6 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2010 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., 59 Temple Place,
23  Suite 330, Boston, MA  02111-1307  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
32#define IRC_LOGIN_TIMEOUT 60
33#define IRC_PING_STRING "PinglBee"
34
35#define UMODES "abisw"     /* Allowed umodes (although they mostly do nothing) */
36#define UMODES_PRIV "Ro"   /* Allowed, but not by user directly */
37#define UMODES_KEEP "R"    /* Don't allow unsetting using /MODE */
38#define CMODES "ntC"       /* Allowed modes */
39#define CMODE "t"          /* Default mode */
40#define UMODE "s"          /* Default mode */
41
42#define CTYPES "&#"        /* Valid channel name prefixes */
43
44typedef enum
45{
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
53        /* Not really status stuff, but other kinds of flags: For slightly
54           better password security, since the only way to send passwords
55           to the IRC server securely (i.e. not echoing to screen or written
56           to logfiles) is the /OPER command, try to use that command for
57           stuff that matters. */
58        OPER_HACK_IDENTIFY = 0x100,
59        OPER_HACK_REGISTER = 0x200,
60        OPER_HACK_ACCOUNT_ADD = 0x400,
61        OPER_HACK_ANY = 0x700,  /* To check for them all at once. */
62} irc_status_t;
63
64struct irc_user;
65
66typedef struct irc
67{
68        int fd;
69        irc_status_t status;
70        double last_pong;
71        int pinging;
72        char *sendbuffer;
73        char *readbuffer;
74        GIConv iconv, oconv;
75
76        struct irc_user *root;
77        struct irc_user *user;
78       
79        char *password; /* HACK: Used to save the user's password, but before
80                           logging in, this may contain a password we should
81                           send to identify after USER/NICK are received. */
82
83        char umode[8];
84       
85        struct query *queries;
86        GSList *file_transfers;
87       
88        GSList *users, *channels;
89        struct irc_channel *default_channel;
90        GHashTable *nick_user_hash;
91        GHashTable *watches; /* See irc_cmd_watch() */
92
93        gint r_watch_source_id;
94        gint w_watch_source_id;
95        gint ping_source_id;
96        gint login_source_id; /* To slightly delay some events at login time. */
97       
98        struct otr *otr; /* OTR state and book keeping, used by the OTR plugin.
99                            TODO: Some mechanism for plugindata. */
100       
101        struct bee *b;
102} irc_t;
103
104typedef enum
105{
106        /* Replaced with iu->last_channel IRC_USER_PRIVATE = 1, */
107        IRC_USER_AWAY = 2,
108       
109        IRC_USER_OTR_ENCRYPTED = 0x10000,
110        IRC_USER_OTR_TRUSTED   = 0x20000,
111} irc_user_flags_t;
112
113typedef struct irc_user
114{
115        irc_t *irc;
116       
117        char *nick;
118        char *user;
119        char *host;
120        char *fullname;
121       
122        /* Nickname in lowercase for case insensitive searches */
123        char *key;
124       
125        irc_user_flags_t flags;
126        struct irc_channel *last_channel;
127       
128        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
129        guint pastebuf_timer;
130        time_t away_reply_timeout; /* Only send a 301 if this time passed. */
131       
132        struct bee_user *bu;
133       
134        const struct irc_user_funcs *f;
135} irc_user_t;
136
137struct irc_user_funcs
138{
139        gboolean (*privmsg)( irc_user_t *iu, const char *msg );
140        gboolean (*ctcp)( irc_user_t *iu, char * const* ctcp );
141};
142
143extern const struct irc_user_funcs irc_user_root_funcs;
144extern const struct irc_user_funcs irc_user_self_funcs;
145
146typedef enum
147{
148        IRC_CHANNEL_JOINED = 1, /* The user is currently in the channel. */
149        IRC_CHANNEL_TEMP = 2,   /* Erase the channel when the user leaves,
150                                   and don't save it. */
151       
152        /* Hack: Set this flag right before jumping into IM when we expect
153           a call to imcb_chat_new(). */
154        IRC_CHANNEL_CHAT_PICKME = 0x10000,
155} irc_channel_flags_t;
156
157typedef struct irc_channel
158{
159        irc_t *irc;
160        char *name;
161        char mode[8];
162        int flags;
163       
164        char *topic;
165        char *topic_who;
166        time_t topic_time;
167       
168        GSList *users; /* struct irc_channel_user */
169        struct irc_user *last_target;
170        struct set *set;
171       
172        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
173        guint pastebuf_timer;
174       
175        const struct irc_channel_funcs *f;
176        void *data;
177} irc_channel_t;
178
179struct irc_channel_funcs
180{
181        gboolean (*privmsg)( irc_channel_t *ic, const char *msg );
182        gboolean (*join)( irc_channel_t *ic );
183        gboolean (*part)( irc_channel_t *ic, const char *msg );
184        gboolean (*topic)( irc_channel_t *ic, const char *new );
185        gboolean (*invite)( irc_channel_t *ic, irc_user_t *iu );
186       
187        gboolean (*_init)( irc_channel_t *ic );
188        gboolean (*_free)( irc_channel_t *ic );
189};
190
191typedef enum
192{
193        IRC_CHANNEL_USER_OP = 1,
194        IRC_CHANNEL_USER_HALFOP = 2,
195        IRC_CHANNEL_USER_VOICE = 4,
196        IRC_CHANNEL_USER_NONE = 8,
197} irc_channel_user_flags_t;
198
199typedef struct irc_channel_user
200{
201        irc_user_t *iu;
202        int flags;
203} irc_channel_user_t;
204
205typedef enum
206{
207        IRC_CC_TYPE_DEFAULT,
208        IRC_CC_TYPE_REST,
209        IRC_CC_TYPE_GROUP,
210        IRC_CC_TYPE_ACCOUNT,
211        IRC_CC_TYPE_PROTOCOL,
212} irc_control_channel_type_t;
213
214struct irc_control_channel
215{
216        irc_control_channel_type_t type;
217        struct bee_group *group;
218        struct account *account;
219        struct prpl *protocol;
220        char modes[4];
221};
222
223extern const struct bee_ui_funcs irc_ui_funcs;
224
225typedef enum
226{
227        IRC_CDU_SILENT,
228        IRC_CDU_PART,
229        IRC_CDU_KICK,
230} irc_channel_del_user_type_t;
231
232/* These are a glued a little bit to the core/bee layer and a little bit to
233   IRC. The first user is OTR, and I guess at some point we'll get to shape
234   this a little bit more as other uses come up. */
235typedef struct irc_plugin
236{
237        /* Called at the end of irc_new(). Can be used to add settings, etc. */
238        gboolean (*irc_new)( irc_t *irc );
239        /* At the end of irc_free(). */
240        void (*irc_free)( irc_t *irc );
241       
242        /* Problem with the following two functions is ordering if multiple
243           plugins are handling them. Let's keep fixing that problem for
244           whenever it becomes important. */
245       
246        /* Called by bee_irc_user_privmsg_cb(). Return NULL if you want to
247           abort sending the msg. */
248        char* (*filter_msg_out)( irc_user_t *iu, char *msg, int flags );
249        /* Called by bee_irc_user_msg(). Return NULL if you swallowed the
250           message and don't want anything to go to the user. */
251        char* (*filter_msg_in)( irc_user_t *iu, char *msg, int flags );
252       
253        /* From storage.c functions. Ideally these should not be used
254           and instead data should be stored in settings which will get
255           saved automatically. Consider these deprecated! */
256        void (*storage_load)( irc_t *irc );
257        void (*storage_save)( irc_t *irc );
258        void (*storage_remove)( const char *nick );
259} irc_plugin_t;
260
261extern GSList *irc_plugins; /* struct irc_plugin */
262
263/* irc.c */
264extern GSList *irc_connection_list;
265
266irc_t *irc_new( int fd );
267void irc_abort( irc_t *irc, int immed, char *format, ... ) G_GNUC_PRINTF( 3, 4 );
268void irc_free( irc_t *irc );
269void irc_setpass (irc_t *irc, const char *pass);
270
271void irc_process( irc_t *irc );
272char **irc_parse_line( char *line );
273char *irc_build_line( char **cmd );
274
275void irc_write( irc_t *irc, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
276void irc_write_all( int now, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
277void irc_vawrite( irc_t *irc, char *format, va_list params );
278
279void irc_flush( irc_t *irc );
280void irc_switch_fd( irc_t *irc, int fd );
281void irc_sync( irc_t *irc );
282void irc_desync( irc_t *irc );
283
284int irc_check_login( irc_t *irc );
285
286void irc_umode_set( irc_t *irc, const char *s, gboolean allow_priv );
287
288void register_irc_plugin( const struct irc_plugin *p );
289
290/* irc_channel.c */
291irc_channel_t *irc_channel_new( irc_t *irc, const char *name );
292irc_channel_t *irc_channel_by_name( irc_t *irc, const char *name );
293irc_channel_t *irc_channel_get( irc_t *irc, char *id );
294int irc_channel_free( irc_channel_t *ic );
295void irc_channel_free_soon( irc_channel_t *ic );
296int irc_channel_add_user( irc_channel_t *ic, irc_user_t *iu );
297int irc_channel_del_user( irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg );
298irc_channel_user_t *irc_channel_has_user( irc_channel_t *ic, irc_user_t *iu );
299struct irc_channel *irc_channel_with_user( irc_t *irc, irc_user_t *iu );
300int irc_channel_set_topic( irc_channel_t *ic, const char *topic, const irc_user_t *who );
301void irc_channel_user_set_mode( irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags );
302void irc_channel_set_mode( irc_channel_t *ic, const char *s );
303void irc_channel_auto_joins( irc_t *irc, struct account *acc );
304void irc_channel_printf( irc_channel_t *ic, char *format, ... );
305gboolean irc_channel_name_ok( const char *name );
306void irc_channel_name_strip( char *name );
307int irc_channel_name_cmp( const char *a_, const char *b_ );
308void irc_channel_update_ops( irc_channel_t *ic, char *value );
309char *set_eval_irc_channel_ops( struct set *set, char *value );
310gboolean irc_channel_wants_user( irc_channel_t *ic, irc_user_t *iu );
311
312/* irc_commands.c */
313void irc_exec( irc_t *irc, char **cmd );
314
315/* irc_send.c */
316void irc_send_num( irc_t *irc, int code, char *format, ... ) G_GNUC_PRINTF( 3, 4 );
317void irc_send_login( irc_t *irc );
318void irc_send_motd( irc_t *irc );
319void irc_usermsg( irc_t *irc, char *format, ... );
320void irc_send_join( irc_channel_t *ic, irc_user_t *iu );
321void irc_send_part( irc_channel_t *ic, irc_user_t *iu, const char *reason );
322void irc_send_quit( irc_user_t *iu, const char *reason );
323void irc_send_kick( irc_channel_t *ic, irc_user_t *iu, irc_user_t *kicker, const char *reason );
324void irc_send_names( irc_channel_t *ic );
325void irc_send_topic( irc_channel_t *ic, gboolean topic_change );
326void irc_send_whois( irc_user_t *iu );
327void irc_send_who( irc_t *irc, GSList *l, const char *channel );
328void irc_send_msg( irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix );
329void irc_send_msg_raw( irc_user_t *iu, const char *type, const char *dst, const char *msg );
330void irc_send_msg_f( irc_user_t *iu, const char *type, const char *dst, const char *format, ... ) G_GNUC_PRINTF( 4, 5 );
331void irc_send_nick( irc_user_t *iu, const char *new );
332void irc_send_channel_user_mode_diff( irc_channel_t *ic, irc_user_t *iu,
333                                      irc_channel_user_flags_t old, irc_channel_user_flags_t new );
334void irc_send_invite( irc_user_t *iu, irc_channel_t *ic );
335
336/* irc_user.c */
337irc_user_t *irc_user_new( irc_t *irc, const char *nick );
338int irc_user_free( irc_t *irc, irc_user_t *iu );
339irc_user_t *irc_user_by_name( irc_t *irc, const char *nick );
340int irc_user_set_nick( irc_user_t *iu, const char *new );
341gint irc_user_cmp( gconstpointer a_, gconstpointer b_ );
342const char *irc_user_get_away( irc_user_t *iu );
343void irc_user_quit( irc_user_t *iu, const char *msg );
344
345/* irc_util.c */
346char *set_eval_timezone( struct set *set, char *value );
347char *irc_format_timestamp( irc_t *irc, time_t msg_ts );
348
349/* irc_im.c */
350void bee_irc_channel_update( irc_t *irc, irc_channel_t *ic, irc_user_t *iu );
351void bee_irc_user_nick_reset( irc_user_t *iu );
352
353#endif
Note: See TracBrowser for help on using the repository browser.