ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_info.c
Revision: 4967
Committed: Mon Dec 1 14:34:29 2014 UTC (10 years, 8 months ago) by michael
Content type: text/x-csrc
File size: 19085 byte(s)
Log Message:
- general::hide_spoof_ips is now deprecated

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 *
4 * Copyright (c) 1997-2014 ircd-hybrid development team
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
19 * USA
20 */
21
22 /*! \file m_info.c
23 * \brief Includes required functions for processing the INFO command.
24 * \version $Id$
25 */
26
27 #include "stdinc.h"
28 #include "list.h"
29 #include "client.h"
30 #include "ircd.h"
31 #include "numeric.h"
32 #include "misc.h"
33 #include "server.h"
34 #include "send.h"
35 #include "conf.h"
36 #include "parse.h"
37 #include "modules.h"
38
39
40 /* Types for output_type in InfoStruct */
41 enum
42 {
43 OUTPUT_STRING = 1 << 0, /* Output option as %s w/ dereference */
44 OUTPUT_STRING_PTR = 1 << 1, /* Output option as %s w/out deference */
45 OUTPUT_DECIMAL = 1 << 2, /* Output option as decimal (%d) */
46 OUTPUT_BOOLEAN = 1 << 3, /* Output option as "ON" or "OFF" */
47 OUTPUT_BOOLEAN_YN = 1 << 4, /* Output option as "YES" or "NO" */
48 OUTPUT_BOOLEAN2 = 1 << 5 /* Output option as "YES/NO/MASKED" */
49 };
50
51 /*
52 * jdc -- Structure for our configuration value table
53 */
54 struct InfoStruct
55 {
56 const char *name; /* Displayed variable name */
57 const unsigned int output_type; /* Type of output. See enum above */
58 const void *option; /* Pointer reference to the value */
59 const char *desc; /* ASCII description of the variable */
60 };
61
62 static const struct InfoStruct info_table[] =
63 {
64 /* --[ START OF TABLE ]-------------------------------------------- */
65
66 {
67 "DPATH",
68 OUTPUT_STRING,
69 &ConfigGeneral.dpath,
70 "Root directory of installation"
71 },
72 {
73 "SPATH",
74 OUTPUT_STRING,
75 &ConfigGeneral.spath,
76 "Path to server executable"
77 },
78 {
79 "MPATH",
80 OUTPUT_STRING,
81 &ConfigGeneral.mpath,
82 "Path to main motd (Message of the Day) file"
83 },
84 {
85 "CPATH",
86 OUTPUT_STRING,
87 &ConfigGeneral.configfile,
88 "Path to main configuration file"
89 },
90 {
91 "DLPATH",
92 OUTPUT_STRING,
93 &ConfigGeneral.dlinefile,
94 "Path to D-line database file"
95 },
96 {
97 "KPATH",
98 OUTPUT_STRING,
99 &ConfigGeneral.klinefile,
100 "Path to K-line database file"
101 },
102 {
103 "GPATH",
104 OUTPUT_STRING,
105 &ConfigGeneral.glinefile,
106 "Path to G-line database file"
107 },
108 {
109 "XPATH",
110 OUTPUT_STRING,
111 &ConfigGeneral.xlinefile,
112 "Path to X-line database file"
113 },
114 {
115 "RESVPATH",
116 OUTPUT_STRING,
117 &ConfigGeneral.resvfile,
118 "Path to resv database file"
119 },
120 {
121 "network_name",
122 OUTPUT_STRING,
123 &ConfigServerInfo.network_name,
124 "Network name"
125 },
126 {
127 "network_desc",
128 OUTPUT_STRING,
129 &ConfigServerInfo.network_desc,
130 "Network description"
131 },
132 {
133 "hub",
134 OUTPUT_BOOLEAN_YN,
135 &ConfigServerInfo.hub,
136 "Server is a hub"
137 },
138 {
139 "max_clients",
140 OUTPUT_DECIMAL,
141 &ConfigServerInfo.max_clients,
142 "Maximum number of clients permitted simultaneously on this server"
143 },
144 {
145 "max_nick_length",
146 OUTPUT_DECIMAL,
147 &ConfigServerInfo.max_nick_length,
148 "Maximum nickname length"
149 },
150 {
151 "max_topic_length",
152 OUTPUT_DECIMAL,
153 &ConfigServerInfo.max_topic_length,
154 "Maximum topic length"
155 },
156 {
157 "use_logging",
158 OUTPUT_BOOLEAN_YN,
159 &ConfigLog.use_logging,
160 "Enable logging"
161 },
162 {
163 "disable_fake_channels",
164 OUTPUT_BOOLEAN_YN,
165 &ConfigChannel.disable_fake_channels,
166 "Forbids channels with special ASCII characters in their name"
167 },
168 {
169 "invite_client_count",
170 OUTPUT_DECIMAL,
171 &ConfigChannel.invite_client_count,
172 "How many INVITE attempts are permitted in invite_client_time"
173 },
174
175 {
176 "invite_client_time",
177 OUTPUT_DECIMAL,
178 &ConfigChannel.invite_client_time,
179 "How many invite_client_count invites are allowed in this time"
180 },
181 {
182 "knock_client_count",
183 OUTPUT_DECIMAL,
184 &ConfigChannel.knock_client_count,
185 "How many KNOCK attempts are permitted in knock_client_time"
186 },
187 {
188 "knock_client_time",
189 OUTPUT_DECIMAL,
190 &ConfigChannel.knock_client_time,
191 "How many knock_client_count knocks are allowed in this time"
192 },
193 {
194 "knock_delay_channel",
195 OUTPUT_DECIMAL,
196 &ConfigChannel.knock_delay_channel,
197 "Delay between KNOCK attempts to a channel"
198 },
199 {
200 "max_channels",
201 OUTPUT_DECIMAL,
202 &ConfigChannel.max_channels,
203 "Maximum number of channels a user can join"
204 },
205 {
206 "max_bans",
207 OUTPUT_DECIMAL,
208 &ConfigChannel.max_bans,
209 "Total +b/e/I modes allowed in a channel"
210 },
211 {
212 "default_split_user_count",
213 OUTPUT_DECIMAL,
214 &ConfigChannel.default_split_user_count,
215 "Startup value of SPLITUSERS"
216 },
217 {
218 "default_split_server_count",
219 OUTPUT_DECIMAL,
220 &ConfigChannel.default_split_server_count,
221 "Startup value of SPLITNUM"
222 },
223 {
224 "no_create_on_split",
225 OUTPUT_BOOLEAN_YN,
226 &ConfigChannel.no_create_on_split,
227 "Disallow creation of channels when split"
228 },
229 {
230 "no_join_on_split",
231 OUTPUT_BOOLEAN_YN,
232 &ConfigChannel.no_join_on_split,
233 "Disallow joining channels when split"
234 },
235 {
236 "flatten_links",
237 OUTPUT_BOOLEAN_YN,
238 &ConfigServerHide.flatten_links,
239 "Flatten /links list"
240 },
241 {
242 "links_delay",
243 OUTPUT_DECIMAL,
244 &ConfigServerHide.links_delay,
245 "Links rehash delay"
246 },
247 {
248 "hidden",
249 OUTPUT_BOOLEAN_YN,
250 &ConfigServerHide.hidden,
251 "Hide this server from a flattened /links on remote servers"
252 },
253 {
254 "hide_servers",
255 OUTPUT_BOOLEAN_YN,
256 &ConfigServerHide.hide_servers,
257 "Hide servernames from users"
258 },
259 {
260 "hide_services",
261 OUTPUT_BOOLEAN_YN,
262 &ConfigServerHide.hide_services,
263 "Hides the location of services server"
264 },
265 {
266 "hidden_name",
267 OUTPUT_STRING,
268 &ConfigServerHide.hidden_name,
269 "Server name users see if hide_servers = yes"
270 },
271 {
272 "hide_server_ips",
273 OUTPUT_BOOLEAN_YN,
274 &ConfigServerHide.hide_server_ips,
275 "Prevent people from seeing server IP addresses"
276 },
277 {
278 "away_count",
279 OUTPUT_DECIMAL,
280 &ConfigGeneral.away_count,
281 "How many AWAY attempts are permitted in away_time"
282 },
283 {
284 "away_time",
285 OUTPUT_DECIMAL,
286 &ConfigGeneral.away_time,
287 "How many away_count aways are allowed in this time"
288 },
289 {
290 "gline_min_cidr",
291 OUTPUT_DECIMAL,
292 &ConfigGeneral.gline_min_cidr,
293 "Minimum required length of a CIDR bitmask for IPv4 G-Lines"
294 },
295 {
296 "gline_min_cidr6",
297 OUTPUT_DECIMAL,
298 &ConfigGeneral.gline_min_cidr6,
299 "Minimum required length of a CIDR bitmask for IPv6 G-Lines"
300 },
301 {
302 "invisible_on_connect",
303 OUTPUT_BOOLEAN_YN,
304 &ConfigGeneral.invisible_on_connect,
305 "Automatically set mode +i on connecting users"
306 },
307 {
308 "kill_chase_time_limit",
309 OUTPUT_DECIMAL,
310 &ConfigGeneral.kill_chase_time_limit,
311 "Nick Change Tracker for KILL"
312 },
313 {
314 "ignore_bogus_ts",
315 OUTPUT_BOOLEAN_YN,
316 &ConfigGeneral.ignore_bogus_ts,
317 "Ignore bogus timestamps from other servers"
318 },
319 {
320 "cycle_on_host_change",
321 OUTPUT_BOOLEAN_YN,
322 &ConfigGeneral.cycle_on_host_change,
323 "Send a fake QUIT/JOIN combination on host change"
324 },
325 {
326 "disable_auth",
327 OUTPUT_BOOLEAN_YN,
328 &ConfigGeneral.disable_auth,
329 "Completely disable ident lookups"
330 },
331 {
332 "disable_remote_commands",
333 OUTPUT_BOOLEAN_YN,
334 &ConfigServerHide.disable_remote_commands,
335 "Prevent users issuing commands on remote servers"
336 },
337 {
338 "tkline_expire_notices",
339 OUTPUT_BOOLEAN_YN,
340 &ConfigGeneral.tkline_expire_notices,
341 "Show temporary kline/xline expire notices"
342 },
343 {
344 "default_floodcount",
345 OUTPUT_DECIMAL,
346 &ConfigGeneral.default_floodcount,
347 "Startup value of FLOODCOUNT"
348 },
349 {
350 "failed_oper_notice",
351 OUTPUT_BOOLEAN_YN,
352 &ConfigGeneral.failed_oper_notice,
353 "Inform opers if someone tries to /oper with the wrong password"
354 },
355 {
356 "dots_in_ident",
357 OUTPUT_DECIMAL,
358 &ConfigGeneral.dots_in_ident,
359 "Number of permissable dots in an ident"
360 },
361 {
362 "min_nonwildcard",
363 OUTPUT_DECIMAL,
364 &ConfigGeneral.min_nonwildcard,
365 "Minimum non-wildcard chars in K/G lines"
366 },
367 {
368 "min_nonwildcard_simple",
369 OUTPUT_DECIMAL,
370 &ConfigGeneral.min_nonwildcard_simple,
371 "Minimum non-wildcards in gecos bans"
372 },
373 {
374 "max_accept",
375 OUTPUT_DECIMAL,
376 &ConfigGeneral.max_accept,
377 "Maximum nicknames on accept list"
378 },
379 {
380 "anti_nick_flood",
381 OUTPUT_BOOLEAN_YN,
382 &ConfigGeneral.anti_nick_flood,
383 "NICK flood protection"
384 },
385 {
386 "max_nick_time",
387 OUTPUT_DECIMAL,
388 &ConfigGeneral.max_nick_time,
389 "NICK flood protection time interval"
390 },
391 {
392 "max_nick_changes",
393 OUTPUT_DECIMAL,
394 &ConfigGeneral.max_nick_changes,
395 "NICK change threshhold setting"
396 },
397 {
398 "anti_spam_exit_message_time",
399 OUTPUT_DECIMAL,
400 &ConfigGeneral.anti_spam_exit_message_time,
401 "Duration a client must be connected for to have an exit message"
402 },
403 {
404 "ts_warn_delta",
405 OUTPUT_DECIMAL,
406 &ConfigGeneral.ts_warn_delta,
407 "Maximum permitted TS delta before displaying a warning"
408 },
409 {
410 "ts_max_delta",
411 OUTPUT_DECIMAL,
412 &ConfigGeneral.ts_max_delta,
413 "Maximum permitted TS delta from another server"
414 },
415 {
416 "warn_no_connect_block",
417 OUTPUT_BOOLEAN_YN,
418 &ConfigGeneral.warn_no_connect_block,
419 "Display warning if connecting server lacks a connect{} block"
420 },
421 {
422 "stats_e_disabled",
423 OUTPUT_BOOLEAN_YN,
424 &ConfigGeneral.stats_e_disabled,
425 "Whether or not STATS e is disabled"
426 },
427 {
428 "stats_o_oper_only",
429 OUTPUT_BOOLEAN_YN,
430 &ConfigGeneral.stats_o_oper_only,
431 "STATS O output is only shown to operators"
432 },
433 {
434 "stats_P_oper_only",
435 OUTPUT_BOOLEAN_YN,
436 &ConfigGeneral.stats_P_oper_only,
437 "STATS P is only shown to operators"
438 },
439 {
440 "stats_u_oper_only",
441 OUTPUT_BOOLEAN_YN,
442 &ConfigGeneral.stats_u_oper_only,
443 "STATS u is only shown to operators"
444 },
445 {
446 "stats_i_oper_only",
447 OUTPUT_BOOLEAN2,
448 &ConfigGeneral.stats_i_oper_only,
449 "STATS I output is only shown to operators"
450 },
451 {
452 "stats_k_oper_only",
453 OUTPUT_BOOLEAN2,
454 &ConfigGeneral.stats_k_oper_only,
455 "STATS K output is only shown to operators"
456 },
457 {
458 "caller_id_wait",
459 OUTPUT_DECIMAL,
460 &ConfigGeneral.caller_id_wait,
461 "Minimum delay between notifying UMODE +g users of messages"
462 },
463 {
464 "opers_bypass_callerid",
465 OUTPUT_BOOLEAN_YN,
466 &ConfigGeneral.opers_bypass_callerid,
467 "Allows IRC operators to message users who are +g (callerid)"
468 },
469 {
470 "pace_wait_simple",
471 OUTPUT_DECIMAL,
472 &ConfigGeneral.pace_wait_simple,
473 "Minimum delay between less intensive commands"
474 },
475 {
476 "pace_wait",
477 OUTPUT_DECIMAL,
478 &ConfigGeneral.pace_wait,
479 "Minimum delay between uses of certain commands"
480 },
481 {
482 "short_motd",
483 OUTPUT_BOOLEAN_YN,
484 &ConfigGeneral.short_motd,
485 "Do not show MOTD; only tell clients they should read it"
486 },
487 {
488 "ping_cookie",
489 OUTPUT_BOOLEAN_YN,
490 &ConfigGeneral.ping_cookie,
491 "Require ping cookies to connect"
492 },
493 {
494 "no_oper_flood",
495 OUTPUT_BOOLEAN_YN,
496 &ConfigGeneral.no_oper_flood,
497 "Reduce flood control for operators"
498 },
499 {
500 "true_no_oper_flood",
501 OUTPUT_BOOLEAN_YN,
502 &ConfigGeneral.true_no_oper_flood,
503 "Completely disable flood control for operators"
504 },
505 {
506 "oper_pass_resv",
507 OUTPUT_BOOLEAN_YN,
508 &ConfigGeneral.oper_pass_resv,
509 "Opers can over-ride RESVs"
510 },
511 {
512 "max_targets",
513 OUTPUT_DECIMAL,
514 &ConfigGeneral.max_targets,
515 "The maximum number of PRIVMSG/NOTICE targets"
516 },
517 {
518 "throttle_count",
519 OUTPUT_DECIMAL,
520 &ConfigGeneral.throttle_count,
521 "Number of connects in throttle_time before connections are blocked"
522 },
523 {
524 "throttle_time",
525 OUTPUT_DECIMAL,
526 &ConfigGeneral.throttle_time,
527 "Minimum time between client reconnects"
528 },
529 {
530 "gline_enable",
531 OUTPUT_BOOLEAN_YN,
532 &ConfigGeneral.glines,
533 "G-line (network-wide K-line) support"
534 },
535 {
536 "gline_duration",
537 OUTPUT_DECIMAL,
538 &ConfigGeneral.gline_time,
539 "Expiry time for G-lines"
540 },
541 {
542 "gline_request_duration",
543 OUTPUT_DECIMAL,
544 &ConfigGeneral.gline_request_time,
545 "Expiry time for pending G-lines"
546 },
547
548 /* --[ END OF TABLE ]---------------------------------------------- */
549 {
550 NULL,
551 0,
552 NULL,
553 0
554 }
555 };
556
557 /* send_birthdate_online_time()
558 *
559 * inputs - client pointer to send to
560 * output - NONE
561 * side effects - birthdate and online time are sent
562 */
563 static void
564 send_birthdate_online_time(struct Client *source_p)
565 {
566 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
567 ":On-line since %s",
568 myctime(me.connection->firsttime));
569 }
570
571 /* send_conf_options()
572 *
573 * inputs - client pointer to send to
574 * output - NONE
575 * side effects - send config options to client
576 */
577 static void
578 send_conf_options(struct Client *source_p)
579 {
580 /*
581 * Parse the info_table[] and do the magic.
582 */
583 for (const struct InfoStruct *iptr = info_table; iptr->name; ++iptr)
584 {
585 switch (iptr->output_type)
586 {
587 /* For "char *" references */
588 case OUTPUT_STRING:
589 {
590 const char *option = *((const char *const *)iptr->option);
591
592 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
593 ":%-30s %-5s [%s]",
594 iptr->name, option ? option : "NONE",
595 iptr->desc ? iptr->desc : "<none>");
596 break;
597 }
598
599 /* For "char foo[]" references */
600 case OUTPUT_STRING_PTR:
601 {
602 const char *option = iptr->option;
603
604 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
605 ":%-30s %-5s [%s]",
606 iptr->name, option ? option : "NONE",
607 iptr->desc ? iptr->desc : "<none>");
608 break;
609 }
610
611 /* Output info_table[i].option as a decimal value. */
612 case OUTPUT_DECIMAL:
613 {
614 const int option = *((const int *const)iptr->option);
615
616 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
617 ":%-30s %-5d [%s]",
618 iptr->name, option, iptr->desc ? iptr->desc : "<none>");
619 break;
620 }
621
622 /* Output info_table[i].option as "ON" or "OFF" */
623 case OUTPUT_BOOLEAN:
624 {
625 const int option = *((const int *const)iptr->option);
626
627 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
628 ":%-30s %-5s [%s]",
629 iptr->name, option ? "ON" : "OFF",
630 iptr->desc ? iptr->desc : "<none>");
631
632 break;
633 }
634
635 /* Output info_table[i].option as "YES" or "NO" */
636 case OUTPUT_BOOLEAN_YN:
637 {
638 const int option = *((const int *const)iptr->option);
639
640 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
641 ":%-30s %-5s [%s]",
642 iptr->name, option ? "YES" : "NO",
643 iptr->desc ? iptr->desc : "<none>");
644 break;
645 }
646
647 case OUTPUT_BOOLEAN2:
648 {
649 const int option = *((const int *const)iptr->option);
650
651 sendto_one_numeric(source_p, &me, RPL_INFO|SND_EXPLICIT,
652 ":%-30s %-5s [%s]",
653 iptr->name, option ? ((option == 1) ? "MASK" : "YES") : "NO",
654 iptr->desc ? iptr->desc : "<none>");
655 break;
656 }
657 }
658 }
659
660 sendto_one_numeric(source_p, &me, RPL_INFO, "");
661 }
662
663 /* send_info_text()
664 *
665 * inputs - client pointer to send info text to
666 * output - NONE
667 * side effects - info text is sent to client
668 */
669 static void
670 send_info_text(struct Client *source_p)
671 {
672 sendto_realops_flags(UMODE_SPY, L_ALL, SEND_NOTICE,
673 "INFO requested by %s (%s@%s) [%s]",
674 source_p->name, source_p->username,
675 source_p->host, source_p->servptr->name);
676
677 for (const char **text = infotext; *text; ++text)
678 {
679 const char *line = *text;
680
681 if (*line == '\0')
682 line = " ";
683
684 sendto_one_numeric(source_p, &me, RPL_INFO, line);
685 }
686
687 if (HasUMode(source_p, UMODE_OPER))
688 send_conf_options(source_p);
689
690 send_birthdate_online_time(source_p);
691
692 sendto_one_numeric(source_p, &me, RPL_ENDOFINFO);
693 }
694
695 /*! \brief INFO command handler
696 *
697 * \param source_p Pointer to allocated Client struct from which the message
698 * originally comes from. This can be a local or remote client.
699 * \param parc Integer holding the number of supplied arguments.
700 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
701 * pointers.
702 * \note Valid arguments for this command are:
703 * - parv[0] = command
704 * - parv[1] = nickname/servername
705 */
706 static int
707 m_info(struct Client *source_p, int parc, char *parv[])
708 {
709 static time_t last_used = 0;
710
711 if ((last_used + ConfigGeneral.pace_wait) > CurrentTime)
712 {
713 sendto_one_numeric(source_p, &me, RPL_LOAD2HI, "INFO");
714 return 0;
715 }
716
717 last_used = CurrentTime;
718
719 if (!ConfigServerHide.disable_remote_commands)
720 if (hunt_server(source_p, ":%s INFO :%s", 1, parc, parv) != HUNTED_ISME)
721 return 0;
722
723 send_info_text(source_p);
724 return 0;
725 }
726
727 /*! \brief INFO command handler
728 *
729 * \param source_p Pointer to allocated Client struct from which the message
730 * originally comes from. This can be a local or remote client.
731 * \param parc Integer holding the number of supplied arguments.
732 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
733 * pointers.
734 * \note Valid arguments for this command are:
735 * - parv[0] = command
736 * - parv[1] = nickname/servername
737 */
738 static int
739 ms_info(struct Client *source_p, int parc, char *parv[])
740 {
741 if (hunt_server(source_p, ":%s INFO :%s", 1, parc, parv) != HUNTED_ISME)
742 return 0;
743
744 send_info_text(source_p);
745 return 0;
746 }
747
748 static struct Message info_msgtab =
749 {
750 "INFO", NULL, 0, 0, 0, MAXPARA, MFLG_SLOW, 0,
751 { m_unregistered, m_info, ms_info, m_ignore, ms_info, m_ignore }
752 };
753
754 static void
755 module_init(void)
756 {
757 mod_add_cmd(&info_msgtab);
758 }
759
760 static void
761 module_exit(void)
762 {
763 mod_del_cmd(&info_msgtab);
764 }
765
766 struct module module_entry =
767 {
768 .node = { NULL, NULL, NULL },
769 .name = NULL,
770 .version = "$Revision$",
771 .handle = NULL,
772 .modinit = module_init,
773 .modexit = module_exit,
774 .flags = 0
775 };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision