1 /*
2  * Copyright (C) 2003-2004 E. Will et al.
3  * Copyright (C) 2005-2006 Atheme Development Group
4  * Rights to this code are as documented in doc/LICENSE.
5  *
6  * Misc tools
7  *
8  */
9 
10 #ifndef ATHEME_TOOLS_H
11 #define ATHEME_TOOLS_H
12 
13 /* email stuff */
14 E int sendemail(user_t *u, myuser_t *mu, const char *type, const char *email, const char *param);
15 
16 /* email types (meaning of param argument) */
17 #define EMAIL_REGISTER	"register"	/* register an account/nick (verification code) */
18 #define EMAIL_SENDPASS	"sendpass"	/* send a password to a user (password) */
19 #define EMAIL_SETEMAIL	"setemail"	/* change email address (verification code) */
20 #define EMAIL_MEMO	"memo"		/* emailed memos (memo text) */
21 #define EMAIL_SETPASS	"setpass"	/* send a password change key (verification code) */
22 
23 /* arc4random.c */
24 #ifndef HAVE_ARC4RANDOM
25 E void arc4random_stir(void);
26 E void arc4random_addrandom(unsigned char *dat, int datlen);
27 E unsigned int arc4random(void);
28 #ifndef HAVE_ARC4RANDOM_BUF
29 E void arc4random_buf(void *buf, size_t n);
30 #endif /* !HAVE_ARC4RANDOM_BUF */
31 #endif /* !HAVE_ARC4RANDOM */
32 
33 /* explicit_bzero.c */
34 #ifndef HAVE_EXPLICIT_BZERO
35 E void explicit_bzero(void *p, size_t n);
36 #endif /* !HAVE_EXPLICIT_BZERO */
37 
38 /* cidr.c */
39 E int valid_ip_or_mask(const char *src);
40 
41 typedef enum {
42 	LOG_ANY = 0,
43 	LOG_INTERACTIVE = 1, /* IRC channels */
44 	LOG_NONINTERACTIVE = 2 /* files */
45 } log_type_t;
46 
47 typedef struct logfile_ logfile_t;
48 
49 /* logstreams API --nenolod */
50 typedef void (*log_write_func_t)(logfile_t *lf, const char *buf);
51 
52 /* logger.c */
53 struct logfile_ {
54 	object_t parent;
55 	mowgli_node_t node;
56 
57 	void *log_file;		/* opaque: can either be mychan_t or FILE --nenolod */
58 	char *log_path;
59 	unsigned int log_mask;
60 
61 	log_write_func_t write_func;
62 	log_type_t log_type;
63 };
64 
65 E char *log_path; /* contains path to default log. */
66 E int log_force;
67 
68 E logfile_t *logfile_new(const char *log_path_, unsigned int log_mask);
69 E void logfile_register(logfile_t *lf);
70 E void logfile_unregister(logfile_t *lf);
71 
72 /* general */
73 #define LG_NONE         0x00000001      /* don't log                */
74 #define LG_INFO         0x00000002      /* log general info         */
75 #define LG_ERROR        0x00000004      /* log real important stuff */
76 #define LG_IOERROR      0x00000008      /* log I/O errors. */
77 #define LG_DEBUG        0x00000010      /* log debugging stuff      */
78 #define LG_VERBOSE	0x00000020	/* log a bit more verbosely than INFO or REGISTER, but not as much as DEBUG */
79 /* commands */
80 #define LG_CMD_ADMIN    0x00000100 /* oper-only commands */
81 #define LG_CMD_REGISTER 0x00000200 /* register/drop */
82 #define LG_CMD_SET      0x00000400 /* change properties of static data */
83 #define LG_CMD_DO       0x00000800 /* change properties of dynamic data */
84 #define LG_CMD_LOGIN    0x00001000 /* login/logout */
85 #define LG_CMD_GET      0x00002000 /* query information */
86 #define LG_CMD_REQUEST	0x00004000 /* requests made by users */
87 /* other */
88 #define LG_NETWORK      0x00010000 /* netsplit/netjoin */
89 #define LG_WALLOPS      0x00020000 /* NOTYET wallops from opers/other servers */
90 #define LG_RAWDATA      0x00040000 /* all data sent/received */
91 #define LG_REGISTER     0x00080000 /* all registration related messages */
92 #define LG_WARN1        0x00100000 /* NOTYET messages formerly walloped */
93 #define LG_WARN2        0x00200000 /* NOTYET messages formerly snooped */
94 #define LG_DENYCMD	0x00400000 /* commands denied by security policy */
95 
96 #define LG_CMD_ALL      0x0000FF00
97 #define LG_ALL          0x7FFFFFFF /* XXX cannot use bit 31 as it would then be equal to TOKEN_UNMATCHED */
98 
99 /* aliases for use with logcommand() */
100 #define CMDLOG_ADMIN    LG_CMD_ADMIN
101 #define CMDLOG_REGISTER (LG_CMD_REGISTER | LG_REGISTER)
102 #define CMDLOG_SET      LG_CMD_SET
103 #define CMDLOG_REQUEST	LG_CMD_REQUEST
104 #define CMDLOG_DO       LG_CMD_DO
105 #define CMDLOG_LOGIN    LG_CMD_LOGIN
106 #define CMDLOG_GET      LG_CMD_GET
107 
108 E void log_open(void);
109 E void log_shutdown(void);
110 E bool log_debug_enabled(void);
111 E void log_master_set_mask(unsigned int mask);
112 E logfile_t *logfile_find_mask(unsigned int log_mask);
113 E void slog(unsigned int level, const char *fmt, ...) PRINTFLIKE(2, 3);
114 E void logcommand(sourceinfo_t *si, int level, const char *fmt, ...) PRINTFLIKE(3, 4);
115 E void logcommand_user(service_t *svs, user_t *source, int level, const char *fmt, ...) PRINTFLIKE(4, 5);
116 E void logcommand_external(service_t *svs, const char *type, connection_t *source, const char *sourcedesc, myuser_t *login, int level, const char *fmt, ...) PRINTFLIKE(7, 8);
117 
118 /* function.c */
119 
120 typedef void (*email_canonicalizer_t)(char email[EMAILLEN + 1], void *user_data);
121 
122 typedef struct {
123 	email_canonicalizer_t func;
124 	void *user_data;
125 	mowgli_node_t node;
126 } email_canonicalizer_item_t;
127 
128 /* misc string stuff */
129 E char *random_string(int sz);
130 E void create_challenge(sourceinfo_t *si, const char *name, int v, char *dest);
131 E void tb2sp(char *line);
132 E char *replace(char *s, int size, const char *old, const char *new);
133 E const char *number_to_string(int num);
134 E int validemail(const char *email);
135 E stringref canonicalize_email(const char *email);
136 E void canonicalize_email_case(char email[EMAILLEN + 1], void *user_data);
137 E void register_email_canonicalizer(email_canonicalizer_t func, void *user_data);
138 E void unregister_email_canonicalizer(email_canonicalizer_t func, void *user_data);
139 E bool email_within_limits(const char *email);
140 E bool validhostmask(const char *host);
141 E char *pretty_mask(char *mask);
142 E bool validtopic(const char *topic);
143 E bool has_ctrl_chars(const char *text);
144 E char *sbytes(float x);
145 E float bytes(float x);
146 
147 E unsigned long makekey(void);
148 E int srename(const char *old_fn, const char *new_fn);
149 
150 /* time stuff */
151 #if HAVE_GETTIMEOFDAY
152 E void s_time(struct timeval *sttime);
153 E void e_time(struct timeval sttime, struct timeval *ttime);
154 E int tv2ms(struct timeval *tv);
155 #endif
156 E char *time_ago(time_t event);
157 E char *timediff(time_t seconds);
158 
159 #ifndef timersub
160 #define timersub(tvp, uvp, vvp)                                         \
161         do {                                                            \
162                 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;          \
163                 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;       \
164                 if ((vvp)->tv_usec < 0) {                               \
165                         (vvp)->tv_sec--;                                \
166                         (vvp)->tv_usec += 1000000;                      \
167                 }                                                       \
168         } while (0)
169 #endif
170 
171 /* tokenize.c */
172 E int sjtoken(char *message, char delimiter, char **parv);
173 E int tokenize(char *message, char **parv);
174 
175 /* ubase64.c */
176 E const char *uinttobase64(char *buf, uint64_t v, int64_t count);
177 E unsigned int base64touint(const char *buf);
178 E void decode_p10_ip(const char *b64, char ipstring[HOSTIPLEN]);
179 
180 /* sharedheap.c */
181 E mowgli_heap_t *sharedheap_get(size_t size);
182 E void sharedheap_unref(mowgli_heap_t *heap);
183 E char *combine_path(const char *parent, const char *child);
184 
185 #if !HAVE_VSNPRINTF
186 int rpl_vsnprintf(char *, size_t, const char *, va_list);
187 #endif
188 #if !HAVE_SNPRINTF
189 int rpl_snprintf(char *, size_t, const char *, ...);
190 #endif
191 #if !HAVE_VASPRINTF
192 int rpl_vasprintf(char **, const char *, va_list);
193 #endif
194 #if !HAVE_ASPRINTF
195 int rpl_asprintf(char **, const char *, ...);
196 #endif
197 
198 #endif
199 
200 /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
201  * vim:ts=8
202  * vim:sw=8
203  * vim:noexpandtab
204  */
205