1 /*
2  * Copyright (c) 2005-2009 Atheme Development Group
3  * Rights to this code are as documented in doc/LICENSE.
4  *
5  * Data structures for account information.
6  *
7  */
8 
9 #ifndef ACCOUNT_H
10 #define ACCOUNT_H
11 
12 #include "entity.h"
13 
14 typedef struct mycertfp_ mycertfp_t;
15 typedef struct myuser_name_ myuser_name_t;
16 typedef struct chanacs_ chanacs_t;
17 typedef struct kline_ kline_t;
18 typedef struct xline_ xline_t;
19 typedef struct qline_ qline_t;
20 typedef struct mymemo_ mymemo_t;
21 typedef struct svsignore_ svsignore_t;
22 
23 /* kline list struct */
24 struct kline_ {
25   char *user;
26   char *host;
27   char *reason;
28   char *setby;
29 
30   unsigned long number;
31   long duration;
32   time_t settime;
33   time_t expires;
34 };
35 
36 /* xline list struct */
37 struct xline_ {
38   char *realname;
39   char *reason;
40   char *setby;
41 
42   unsigned int number;
43   long duration;
44   time_t settime;
45   time_t expires;
46 };
47 
48 /* qline list struct */
49 struct qline_ {
50   char *mask;
51   char *reason;
52   char *setby;
53 
54   unsigned int number;
55   long duration;
56   time_t settime;
57   time_t expires;
58 };
59 
60 /* services ignore struct */
61 struct svsignore_ {
62   svsignore_t *svsignore;
63 
64   char *mask;
65   time_t settime;
66   char *setby;
67   char *reason;
68 };
69 
70 /* services accounts */
71 struct myuser_
72 {
73   myentity_t ent;
74   char pass[PASSLEN];
75 
76   stringref email;
77   stringref email_canonical;
78 
79   mowgli_list_t logins; /* user_t's currently logged in to this */
80   time_t registered;
81   time_t lastlogin;
82 
83   soper_t *soper;
84 
85   unsigned int flags;
86 
87   mowgli_list_t memos; /* store memos */
88   unsigned short memoct_new;
89   unsigned short memo_ratelimit_num; /* memos sent recently */
90   time_t memo_ratelimit_time; /* last time a memo was sent */
91   mowgli_list_t memo_ignores;
92 
93   mowgli_list_t access_list;
94   mowgli_list_t nicks; /* registered nicks, must include mu->name if nonempty */
95 
96   language_t *language;
97 
98   mowgli_list_t cert_fingerprints;
99 };
100 
101 /* Keep this synchronized with mu_flags in libathemecore/flags.c */
102 #define MU_HOLD        0x00000001
103 #define MU_NEVEROP     0x00000002
104 #define MU_NOOP        0x00000004
105 #define MU_WAITAUTH    0x00000008
106 #define MU_HIDEMAIL    0x00000010
107 #define MU_NOMEMO      0x00000040
108 #define MU_EMAILMEMOS  0x00000080
109 #define MU_CRYPTPASS   0x00000100
110 #define MU_NOBURSTLOGIN 0x00000400
111 #define MU_ENFORCE     0x00000800 /* XXX limited use at this time */
112 #define MU_USE_PRIVMSG 0x00001000 /* use PRIVMSG */
113 #define MU_PRIVATE     0x00002000
114 #define MU_QUIETCHG    0x00004000
115 #define MU_NOGREET     0x00008000
116 #define MU_REGNOLIMIT  0x00010000
117 #define MU_NEVERGROUP  0x00020000
118 #define MU_PENDINGLOGIN 0x00040000
119 #define MU_NOPASSWORD  0x00080000
120 
121 /* memoserv rate limiting parameters */
122 #define MEMO_MAX_NUM   5
123 #define MEMO_MAX_TIME  180
124 
125 /* registered nick */
126 struct mynick_
127 {
128   object_t parent;
129 
130   char nick[NICKLEN];
131 
132   myuser_t *owner;
133 
134   time_t registered;
135   time_t lastseen;
136 
137   mowgli_node_t node; /* for myuser_t.nicks */
138 };
139 
140 /* record about a name that used to exist */
141 struct myuser_name_
142 {
143   object_t parent;
144 
145   char name[NICKLEN];
146 };
147 
148 struct mycertfp_
149 {
150   myuser_t *mu;
151 
152   char *certfp;
153 
154   mowgli_node_t node;
155 };
156 
157 struct mychan_
158 {
159   object_t parent;
160 
161   stringref name;
162 
163   channel_t *chan;
164   mowgli_list_t chanacs;
165   time_t registered;
166   time_t used;
167 
168   unsigned int mlock_on;
169   unsigned int mlock_off;
170   unsigned int mlock_limit;
171   char *mlock_key;
172 
173   unsigned int flags;
174 };
175 
176 /* Keep this synchronized with mc_flags in libathemecore/flags.c */
177 #define MC_HOLD        0x00000001
178 #define MC_NOOP        0x00000002
179 #define MC_LIMITFLAGS  0x00000004
180 #define MC_SECURE      0x00000008
181 #define MC_VERBOSE     0x00000010
182 #define MC_RESTRICTED  0x00000020
183 #define MC_KEEPTOPIC   0x00000040
184 #define MC_VERBOSE_OPS 0x00000080
185 #define MC_TOPICLOCK   0x00000100
186 #define MC_GUARD       0x00000200
187 #define MC_PRIVATE     0x00000400
188 #define MC_NOSYNC      0x00000800
189 #define MC_ANTIFLOOD   0x00001000
190 #define MC_PUBACL      0x00002000
191 
192 /* The following are temporary state */
193 #define MC_INHABIT     0x80000000 /* we're on channel to enforce akick/staffonly/close */
194 #define MC_MLOCK_CHECK 0x40000000 /* we need to check mode locks */
195 #define MC_FORCEVERBOSE 0x20000000 /* fantasy cmd in progress, be verbose */
196 #define MC_RECREATED   0x10000000 /* created with new channelTS */
197 
198 #define MC_VERBOSE_MASK (MC_VERBOSE | MC_VERBOSE_OPS)
199 
200 /* struct for channel access list */
201 struct chanacs_
202 {
203 	object_t parent;
204 
205 	myentity_t *entity;
206 	mychan_t *mychan;
207 	char     *host;
208 	unsigned int  level;
209 	time_t    tmodified;
210 
211 	mowgli_node_t    cnode;
212 	mowgli_node_t    unode;
213 
214 	stringref setter;
215 };
216 
217 /* the new atheme-style channel flags */
218 #define CA_VOICE         0x00000001 /* Ability to use voice/devoice command. */
219 #define CA_AUTOVOICE     0x00000002 /* Gain voice automatically upon entry. */
220 #define CA_OP            0x00000004 /* Ability to use op/deop command. */
221 #define CA_AUTOOP        0x00000008 /* Gain ops automatically upon entry. */
222 #define CA_TOPIC         0x00000010 /* Ability to use /msg X topic */
223 #define CA_SET           0x00000020 /* Ability to use /msg X set */
224 #define CA_REMOVE        0x00000040 /* Ability to use /msg X kick */
225 #define CA_INVITE        0x00000080 /* Ability to use /msg X invite */
226 #define CA_RECOVER       0x00000100 /* Ability to use /msg X recover */
227 #define CA_FLAGS         0x00000200 /* Ability to write to channel flags table */
228 #define CA_HALFOP	 0x00000400 /* Ability to use /msg X halfop */
229 #define CA_AUTOHALFOP	 0x00000800 /* Gain halfops automatically upon entry. */
230 #define CA_ACLVIEW	 0x00001000 /* Can view access lists */
231 #define CA_FOUNDER	 0x00002000 /* Is a channel founder */
232 #define CA_USEPROTECT	 0x00004000 /* Ability to use /msg X protect */
233 #define CA_USEOWNER	 0x00008000 /* Ability to use /msg X owner */
234 #define CA_EXEMPT	 0x00010000 /* Exempt from akick, can use /msg X unban on self */
235 
236 /*#define CA_SUSPENDED	 0x40000000 * Suspended access entry (not yet implemented) */
237 #define CA_AKICK         0x80000000 /* Automatic kick */
238 
239 #define CA_NONE          0x0
240 
241 /* xOP defaults, compatible with Atheme 0.3 */
242 #define CA_VOP_DEF       (CA_VOICE | CA_AUTOVOICE | CA_ACLVIEW)
243 #define CA_HOP_DEF	 (CA_VOICE | CA_HALFOP | CA_AUTOHALFOP | CA_TOPIC | CA_ACLVIEW)
244 #define CA_AOP_DEF       (CA_VOICE | CA_HALFOP | CA_OP | CA_AUTOOP | CA_TOPIC | CA_ACLVIEW)
245 #define CA_SOP_DEF       (CA_AOP_DEF | CA_SET | CA_REMOVE | CA_INVITE)
246 
247 /* special values for founder/successor -- jilles */
248 /* used in shrike flatfile conversion: */
249 #define CA_SUCCESSOR_0   (CA_VOICE | CA_OP | CA_AUTOOP | CA_TOPIC | CA_SET | CA_REMOVE | CA_INVITE | CA_RECOVER | CA_FLAGS | CA_HALFOP | CA_ACLVIEW | CA_USEPROTECT)
250 /* granted to new founder on transfer etc: */
251 #define CA_FOUNDER_0     (CA_SUCCESSOR_0 | CA_FLAGS | CA_USEOWNER | CA_FOUNDER)
252 /* granted to founder on new channel: */
253 #define CA_INITIAL       (CA_FOUNDER_0 | CA_AUTOOP)
254 
255 /* joining with one of these flags updates used time */
256 #define CA_USEDUPDATE    (CA_VOICE | CA_OP | CA_AUTOOP | CA_SET | CA_REMOVE | CA_RECOVER | CA_FLAGS | CA_HALFOP | CA_AUTOHALFOP | CA_FOUNDER | CA_USEPROTECT | CA_USEOWNER)
257 /* "high" privs (for MC_LIMITFLAGS) */
258 #define CA_HIGHPRIVS     (CA_SET | CA_RECOVER | CA_FLAGS)
259 #define CA_ALLPRIVS      (CA_VOICE | CA_AUTOVOICE | CA_OP | CA_AUTOOP | CA_TOPIC | CA_SET | CA_REMOVE | CA_INVITE | CA_RECOVER | CA_FLAGS | CA_HALFOP | CA_AUTOHALFOP | CA_ACLVIEW | CA_FOUNDER | CA_USEPROTECT | CA_USEOWNER | CA_EXEMPT)
260 #define CA_ALL_ALL       (CA_ALLPRIVS | CA_AKICK)
261 
262 /* old CA_ flags */
263 #define OLD_CA_AOP           (CA_VOICE | CA_OP | CA_AUTOOP | CA_TOPIC)
264 
265 /* shrike CA_ flags */
266 #define SHRIKE_CA_VOP           0x00000002
267 #define SHRIKE_CA_AOP           0x00000004
268 #define SHRIKE_CA_SOP           0x00000008
269 #define SHRIKE_CA_FOUNDER       0x00000010
270 #define SHRIKE_CA_SUCCESSOR     0x00000020
271 
272 /* struct for account memos */
273 struct mymemo_ {
274 	char	 sender[NICKLEN];
275 	char 	 text[MEMOLEN];
276 	time_t	 sent;
277 	unsigned int status;
278 };
279 
280 /* memo status flags */
281 #define MEMO_READ          0x00000001
282 #define MEMO_CHANNEL       0x00000002
283 
284 /* account related hooks */
285 typedef struct {
286 	mychan_t *mc;
287 	sourceinfo_t *si;
288 } hook_channel_req_t;
289 
290 typedef struct {
291 	chanacs_t *ca;
292 	sourceinfo_t *si;
293 	myentity_t *parent;
294 	unsigned int oldlevel;
295 	unsigned int newlevel;
296 	int approved;
297 } hook_channel_acl_req_t;
298 
299 typedef struct {
300 	mychan_t *mc;
301 	myuser_t *mu;
302 } hook_channel_succession_req_t;
303 
304 typedef struct {
305 	union {
306 		mychan_t *mc;
307 		myuser_t *mu;
308 		mynick_t *mn;
309 	} data;
310 	int do_expire;	/* Write zero here to disallow expiry */
311 } hook_expiry_req_t;
312 
313 typedef struct {
314 	sourceinfo_t *si;
315 	const char *name;
316 	channel_t *chan;
317 	int approved; /* Write non-zero here to disallow the registration */
318 } hook_channel_register_check_t;
319 
320 typedef struct {
321 	sourceinfo_t *si;
322 	myuser_t *mu;
323 	mynick_t *mn;
324 } hook_user_req_t;
325 
326 typedef struct {
327 	sourceinfo_t *si;
328 	const char *account; /* or nick */
329 	const char *email;
330 	const char *password;
331 	int approved; /* Write non-zero here to disallow the registration */
332 } hook_user_register_check_t;
333 
334 typedef struct {
335 	sourceinfo_t *si;
336 	myuser_t *mu;
337 	bool allowed;
338 } hook_user_login_check_t;
339 
340 typedef struct {
341 	user_t *u;
342 	mynick_t *mn;
343 } hook_nick_enforce_t;
344 
345 typedef struct {
346 	myuser_t *target;
347 	const char *name;
348 	char *value;
349 } hook_metadata_change_t;
350 
351 typedef struct {
352 	myuser_t *mu;
353 	const char *oldname;
354 } hook_user_rename_t;
355 
356 typedef struct {
357 	sourceinfo_t *si;
358 	const char *nick;
359 } hook_info_noexist_req_t;
360 
361 typedef struct {
362 	sourceinfo_t *si;
363 	myuser_t *mu;
364 	int allowed;
365 } hook_user_needforce_t;
366 
367 /* pmodule.c XXX */
368 E bool backend_loaded;
369 
370 /* dbhandler.c */
371 E void (*db_save)(void *arg);
372 E void (*db_load)(const char *arg);
373 
374 /* function.c */
375 E bool is_founder(mychan_t *mychan, myentity_t *myuser);
376 
377 /* node.c */
378 E mowgli_list_t klnlist;
379 
380 E kline_t *kline_add_with_id(const char *user, const char *host, const char *reason, long duration, const char *setby, unsigned long id);
381 E kline_t *kline_add(const char *user, const char *host, const char *reason, long duration, const char *setby);
382 E kline_t *kline_add_user(user_t *user, const char *reason, long duration, const char *setby);
383 E void kline_delete(kline_t *k);
384 E kline_t *kline_find(const char *user, const char *host);
385 E kline_t *kline_find_num(unsigned long number);
386 E kline_t *kline_find_user(user_t *u);
387 E void kline_expire(void *arg);
388 
389 E mowgli_list_t xlnlist;
390 
391 E xline_t *xline_add(const char *realname, const char *reason, long duration, const char *setby);
392 E void xline_delete(const char *realname);
393 E xline_t *xline_find(const char *realname);
394 E xline_t *xline_find_num(unsigned int number);
395 E xline_t *xline_find_user(user_t *u);
396 E void xline_expire(void *arg);
397 
398 E mowgli_list_t qlnlist;
399 
400 E qline_t *qline_add(const char *mask, const char *reason, long duration, const char *setby);
401 E void qline_delete(const char *mask);
402 E qline_t *qline_find(const char *mask);
403 E qline_t *qline_find_match(const char *mask);
404 E qline_t *qline_find_num(unsigned int number);
405 E qline_t *qline_find_user(user_t *u);
406 E qline_t *qline_find_channel(channel_t *c);
407 E void qline_expire(void *arg);
408 
409 /* account.c */
410 E mowgli_patricia_t *nicklist;
411 E mowgli_patricia_t *oldnameslist;
412 E mowgli_patricia_t *mclist;
413 
414 E void init_accounts(void);
415 
416 E myuser_t *myuser_add(const char *name, const char *pass, const char *email, unsigned int flags);
417 E myuser_t *myuser_add_id(const char *id, const char *name, const char *pass, const char *email, unsigned int flags);
418 E void myuser_delete(myuser_t *mu);
419 //inline myuser_t *myuser_find(const char *name);
420 E void myuser_rename(myuser_t *mu, const char *name);
421 E void myuser_set_email(myuser_t *mu, const char *newemail);
422 E myuser_t *myuser_find_ext(const char *name);
423 E void myuser_notice(const char *from, myuser_t *target, const char *fmt, ...) PRINTFLIKE(3, 4);
424 
425 E bool myuser_access_verify(user_t *u, myuser_t *mu);
426 E bool myuser_access_add(myuser_t *mu, const char *mask);
427 E char *myuser_access_find(myuser_t *mu, const char *mask);
428 E void myuser_access_delete(myuser_t *mu, const char *mask);
429 
430 E mynick_t *mynick_add(myuser_t *mu, const char *name);
431 E void mynick_delete(mynick_t *mn);
432 //inline mynick_t *mynick_find(const char *name);
433 
434 E myuser_name_t *myuser_name_add(const char *name);
435 //inline myuser_name_t *myuser_name_find(const char *name);
436 E void myuser_name_remember(const char *name, myuser_t *mu);
437 E void myuser_name_restore(const char *name, myuser_t *mu);
438 
439 E mycertfp_t *mycertfp_add(myuser_t *mu, const char *certfp);
440 E void mycertfp_delete(mycertfp_t *mcfp);
441 E mycertfp_t *mycertfp_find(const char *certfp);
442 
443 E mychan_t *mychan_add(char *name);
444 //inline mychan_t *mychan_find(const char *name);
445 E bool mychan_isused(mychan_t *mc);
446 E unsigned int mychan_num_founders(mychan_t *mc);
447 E const char *mychan_founder_names(mychan_t *mc);
448 E myuser_t *mychan_pick_candidate(mychan_t *mc, unsigned int minlevel);
449 E myuser_t *mychan_pick_successor(mychan_t *mc);
450 E const char *mychan_get_mlock(mychan_t *mc);
451 E const char *mychan_get_sts_mlock(mychan_t *mc);
452 
453 E chanacs_t *chanacs_add(mychan_t *mychan, myentity_t *myuser, unsigned int level, time_t ts, myentity_t *setter);
454 E chanacs_t *chanacs_add_host(mychan_t *mychan, const char *host, unsigned int level, time_t ts, myentity_t *setter);
455 
456 E chanacs_t *chanacs_find(mychan_t *mychan, myentity_t *myuser, unsigned int level);
457 E unsigned int chanacs_entity_flags(mychan_t *mychan, myentity_t *myuser);
458 //inline bool chanacs_entity_has_flag(mychan_t *mychan, myentity_t *mt, unsigned int level)
459 E chanacs_t *chanacs_find_literal(mychan_t *mychan, myentity_t *myuser, unsigned int level);
460 E chanacs_t *chanacs_find_host(mychan_t *mychan, const char *host, unsigned int level);
461 E unsigned int chanacs_host_flags(mychan_t *mychan, const char *host);
462 E chanacs_t *chanacs_find_host_literal(mychan_t *mychan, const char *host, unsigned int level);
463 E chanacs_t *chanacs_find_host_by_user(mychan_t *mychan, user_t *u, unsigned int level);
464 E chanacs_t *chanacs_find_by_mask(mychan_t *mychan, const char *mask, unsigned int level);
465 E bool chanacs_user_has_flag(mychan_t *mychan, user_t *u, unsigned int level);
466 E unsigned int chanacs_user_flags(mychan_t *mychan, user_t *u);
467 //inline bool chanacs_source_has_flag(mychan_t *mychan, sourceinfo_t *si, unsigned int level);
468 E unsigned int chanacs_source_flags(mychan_t *mychan, sourceinfo_t *si);
469 
470 E chanacs_t *chanacs_open(mychan_t *mychan, myentity_t *mt, const char *hostmask, bool create, myentity_t *setter);
471 //inline void chanacs_close(chanacs_t *ca);
472 E bool chanacs_modify(chanacs_t *ca, unsigned int *addflags, unsigned int *removeflags, unsigned int restrictflags);
473 E bool chanacs_modify_simple(chanacs_t *ca, unsigned int addflags, unsigned int removeflags);
474 
475 //inline bool chanacs_is_table_full(chanacs_t *ca);
476 
477 E bool chanacs_change(mychan_t *mychan, myentity_t *mt, const char *hostmask, unsigned int *addflags, unsigned int *removeflags, unsigned int restrictflags, myentity_t *setter);
478 E bool chanacs_change_simple(mychan_t *mychan, myentity_t *mt, const char *hostmask, unsigned int addflags, unsigned int removeflags, myentity_t *setter);
479 
480 E void expire_check(void *arg);
481 /* Check the database for (version) problems common to all backends */
482 E void db_check(void);
483 
484 /* svsignore.c */
485 E mowgli_list_t svs_ignore_list;
486 
487 E svsignore_t *svsignore_find(user_t *user);
488 E svsignore_t *svsignore_add(const char *mask, const char *reason);
489 E void svsignore_delete(svsignore_t *svsignore);
490 
491 #include "entity-validation.h"
492 
493 #endif
494 
495 // vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs ts=8 sw=8 noexpandtab
496