source: irc.h @ 4466e3e

Last change on this file since 4466e3e was 8e6ecfe, checked in by Dennis Kaarsemaker <dennis@…>, at 2016-03-25T18:07:53Z

Authentication: scaffolding for multiple authentication backends

Instead of always putting users passwords in XML files, allow site
admins to configure a different authentication method to integrate
authentication with other systems.

This doesn't add any authentication backends yet, merely the
scaffolding. Notably:

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