ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/user.c
(Generate patch)

Comparing ircd-hybrid/trunk/src/s_user.c (file contents):
Revision 3271 by michael, Sun Mar 30 13:44:07 2014 UTC vs.
Revision 3272 by michael, Sun Apr 6 11:34:14 2014 UTC

# Line 51 | Line 51
51   #include "watch.h"
52  
53   static char umode_buffer[IRCD_BUFSIZE];
54
55 static void user_welcome(struct Client *);
56 static void report_and_set_user_flags(struct Client *, const struct MaskItem *);
57 static int check_xline(struct Client *);
58 static void introduce_client(struct Client *);
54   static const char *uid_get(void);
55  
56   /* Used for building up the isupport string,
57   * used with init_isupport, add_isupport, delete_isupport
58   */
64
59   struct Isupport
60   {
61    dlink_node node;
# Line 224 | Line 218 | show_isupport(struct Client *source_p)
218      sendto_one_numeric(source_p, &me, RPL_ISUPPORT, ptr->data);
219   }
220  
221 +
222 + /* report_and_set_user_flags()
223 + *
224 + * inputs       - pointer to source_p
225 + *              - pointer to conf for this user
226 + * output       - NONE
227 + * side effects - Report to user any special flags
228 + *                they are getting, and set them.
229 + */
230 + static void
231 + report_and_set_user_flags(struct Client *source_p, const struct MaskItem *conf)
232 + {
233 +  /* If this user is being spoofed, tell them so */
234 +  if (IsConfDoSpoofIp(conf))
235 +    sendto_one_notice(source_p, &me, ":*** Spoofing your IP. Congrats.");
236 +
237 +  /* If this user is in the exception class, Set it "E lined" */
238 +  if (IsConfExemptKline(conf))
239 +  {
240 +    SetExemptKline(source_p);
241 +    sendto_one_notice(source_p, &me, ":*** You are exempt from K/D/G lines. Congrats.");
242 +  }
243 +
244 +  /*
245 +   * The else here is to make sure that G line exempt users
246 +   * do not get noticed twice.
247 +   */
248 +  else if (IsConfExemptGline(conf))
249 +  {
250 +    SetExemptGline(source_p);
251 +    sendto_one_notice(source_p, &me, ":*** You are exempt from G lines. Congrats.");
252 +  }
253 +
254 +  if (IsConfExemptResv(conf))
255 +  {
256 +    SetExemptResv(source_p);
257 +    sendto_one_notice(source_p, &me, ":*** You are exempt from resvs. Congrats.");
258 +  }
259 +
260 +  /* If this user is exempt from user limits set it "F lined" */
261 +  if (IsConfExemptLimits(conf))
262 +  {
263 +    SetExemptLimits(source_p);
264 +    sendto_one_notice(source_p, &me, ":*** You are exempt from user limits. Congrats.");
265 +  }
266 +
267 +  if (IsConfCanFlood(conf))
268 +  {
269 +    SetCanFlood(source_p);
270 +    sendto_one_notice(source_p, &me, ":*** You are exempt from flood "
271 +                      "protection, aren't you fearsome.");
272 +  }
273 + }
274 +
275 + /* introduce_client()
276 + *
277 + * inputs       - source_p
278 + * output       - NONE
279 + * side effects - This common function introduces a client to the rest
280 + *                of the net, either from a local client connect or
281 + *                from a remote connect.
282 + */
283 + static void
284 + introduce_client(struct Client *source_p)
285 + {
286 +  dlink_node *ptr = NULL;
287 +  char ubuf[IRCD_BUFSIZE] = "";
288 +
289 +  if (MyClient(source_p))
290 +    send_umode(source_p, source_p, 0, SEND_UMODES, ubuf);
291 +  else
292 +    send_umode(NULL, source_p, 0, SEND_UMODES, ubuf);
293 +
294 +  watch_check_hash(source_p, RPL_LOGON);
295 +
296 +  if (ubuf[0] == '\0')
297 +  {
298 +    ubuf[0] = '+';
299 +    ubuf[1] = '\0';
300 +  }
301 +
302 +  DLINK_FOREACH(ptr, serv_list.head)
303 +  {
304 +    struct Client *server = ptr->data;
305 +
306 +    if (server == source_p->from)
307 +      continue;
308 +
309 +    if (IsCapable(server, CAP_SVS))
310 +      sendto_one(server, ":%s UID %s %d %lu %s %s %s %s %s %s :%s",
311 +                 source_p->servptr->id,
312 +                 source_p->name, source_p->hopcount+1,
313 +                 (unsigned long)source_p->tsinfo,
314 +                 ubuf, source_p->username, source_p->host,
315 +                 (MyClient(source_p) && IsIPSpoof(source_p)) ?
316 +                 "0" : source_p->sockhost, source_p->id,
317 +                 source_p->svid,
318 +                 source_p->info);
319 +    else
320 +      sendto_one(server, ":%s UID %s %d %lu %s %s %s %s %s :%s",
321 +                 source_p->servptr->id,
322 +                 source_p->name, source_p->hopcount+1,
323 +                 (unsigned long)source_p->tsinfo,
324 +                 ubuf, source_p->username, source_p->host,
325 +                 (MyClient(source_p) && IsIPSpoof(source_p)) ?
326 +                 "0" : source_p->sockhost, source_p->id, source_p->info);
327 +
328 +    if (!EmptyString(source_p->certfp))
329 +      sendto_one(server, ":%s CERTFP %s", source_p->id, source_p->certfp);
330 +  }
331 + }
332 +
333 + /* user_welcome()
334 + *
335 + * inputs       - client pointer to client to welcome
336 + * output       - NONE
337 + * side effects -
338 + */
339 + static void
340 + user_welcome(struct Client *source_p)
341 + {
342 + #if defined(__TIME__) && defined(__DATE__)
343 +  static const char built_date[] = __DATE__ " at " __TIME__;
344 + #else
345 +  static const char built_date[] = "unknown";
346 + #endif
347 +
348 + #ifdef HAVE_LIBCRYPTO
349 +  if (HasFlag(source_p, FLAGS_SSL))
350 +  {
351 +    AddUMode(source_p, UMODE_SSL);
352 +    sendto_one_notice(source_p, &me, ":*** Connected securely via %s",
353 +                      ssl_get_cipher(source_p->localClient->fd.ssl));
354 +  }
355 + #endif
356 +
357 +  sendto_one_numeric(source_p, &me, RPL_WELCOME, ServerInfo.network_name,
358 +                     source_p->name);
359 +  sendto_one_numeric(source_p, &me, RPL_YOURHOST,
360 +                     get_listener_name(source_p->localClient->listener), ircd_version);
361 +  sendto_one_numeric(source_p, &me, RPL_CREATED, built_date);
362 +  sendto_one_numeric(source_p, &me, RPL_MYINFO, me.name, ircd_version, umode_buffer);
363 +  show_isupport(source_p);
364 +
365 +  if (source_p->id[0])
366 +    sendto_one_numeric(source_p, &me, RPL_YOURID, source_p->id);
367 +
368 +  show_lusers(source_p);
369 +  motd_signon(source_p);
370 + }
371 +
372 + /* check_xline()
373 + *
374 + * inputs       - pointer to client to test
375 + * outupt       - 1 if exiting 0 if ok
376 + * side effects -
377 + */
378 + static int
379 + check_xline(struct Client *source_p)
380 + {
381 +  struct MaskItem *conf = NULL;
382 +  const char *reason = NULL;
383 +
384 +  if ((conf = find_matching_name_conf(CONF_XLINE, source_p->info, NULL, NULL, 0)))
385 +  {
386 +    ++conf->count;
387 +
388 +    if (conf->reason)
389 +      reason = conf->reason;
390 +    else
391 +      reason = CONF_NOREASON;
392 +
393 +    sendto_realops_flags(UMODE_REJ, L_ALL, SEND_NOTICE,
394 +                         "X-line Rejecting [%s] [%s], user %s [%s]",
395 +                         source_p->info, reason,
396 +                         get_client_name(source_p, HIDE_IP),
397 +                         source_p->sockhost);
398 +
399 +    ++ServerStats.is_ref;
400 +    exit_client(source_p, "Bad user info");
401 +    return 1;
402 +  }
403 +
404 +  return 0;
405 + }
406 +
407   /*
408   ** register_local_user
409   **      This function is called when both NICK and USER messages
# Line 526 | Line 706 | register_remote_user(struct Client *sour
706    introduce_client(source_p);
707   }
708  
529 /* introduce_client()
530 *
531 * inputs       - source_p
532 * output       - NONE
533 * side effects - This common function introduces a client to the rest
534 *                of the net, either from a local client connect or
535 *                from a remote connect.
536 */
537 static void
538 introduce_client(struct Client *source_p)
539 {
540  dlink_node *ptr = NULL;
541  char ubuf[IRCD_BUFSIZE] = "";
542
543  if (MyClient(source_p))
544    send_umode(source_p, source_p, 0, SEND_UMODES, ubuf);
545  else
546    send_umode(NULL, source_p, 0, SEND_UMODES, ubuf);
547
548  watch_check_hash(source_p, RPL_LOGON);
549
550  if (ubuf[0] == '\0')
551  {
552    ubuf[0] = '+';
553    ubuf[1] = '\0';
554  }
555
556  DLINK_FOREACH(ptr, serv_list.head)
557  {
558    struct Client *server = ptr->data;
559
560    if (server == source_p->from)
561      continue;
562
563    if (IsCapable(server, CAP_SVS))
564      sendto_one(server, ":%s UID %s %d %lu %s %s %s %s %s %s :%s",
565                 source_p->servptr->id,
566                 source_p->name, source_p->hopcount+1,
567                 (unsigned long)source_p->tsinfo,
568                 ubuf, source_p->username, source_p->host,
569                 (MyClient(source_p) && IsIPSpoof(source_p)) ?
570                 "0" : source_p->sockhost, source_p->id,
571                 source_p->svid,
572                 source_p->info);
573    else
574      sendto_one(server, ":%s UID %s %d %lu %s %s %s %s %s :%s",
575                 source_p->servptr->id,
576                 source_p->name, source_p->hopcount+1,
577                 (unsigned long)source_p->tsinfo,
578                 ubuf, source_p->username, source_p->host,
579                 (MyClient(source_p) && IsIPSpoof(source_p)) ?
580                 "0" : source_p->sockhost, source_p->id, source_p->info);
581
582    if (!EmptyString(source_p->certfp))
583      sendto_one(server, ":%s CERTFP %s", source_p->id, source_p->certfp);
584  }
585 }
586
709   /* valid_hostname()
710   *
711   * Inputs       - pointer to hostname
# Line 692 | Line 814 | valid_nickname(const char *nickname, con
814    return p - nickname <= NICKLEN;
815   }
816  
695 /* report_and_set_user_flags()
696 *
697 * inputs       - pointer to source_p
698 *              - pointer to conf for this user
699 * output       - NONE
700 * side effects - Report to user any special flags
701 *                they are getting, and set them.
702 */
703 static void
704 report_and_set_user_flags(struct Client *source_p, const struct MaskItem *conf)
705 {
706  /* If this user is being spoofed, tell them so */
707  if (IsConfDoSpoofIp(conf))
708    sendto_one_notice(source_p, &me, ":*** Spoofing your IP. Congrats.");
709
710  /* If this user is in the exception class, Set it "E lined" */
711  if (IsConfExemptKline(conf))
712  {
713    SetExemptKline(source_p);
714    sendto_one_notice(source_p, &me, ":*** You are exempt from K/D/G lines. Congrats.");
715  }
716
717  /*
718   * The else here is to make sure that G line exempt users
719   * do not get noticed twice.
720   */
721  else if (IsConfExemptGline(conf))
722  {
723    SetExemptGline(source_p);
724    sendto_one_notice(source_p, &me, ":*** You are exempt from G lines. Congrats.");
725  }
726
727  if (IsConfExemptResv(conf))
728  {
729    SetExemptResv(source_p);
730    sendto_one_notice(source_p, &me, ":*** You are exempt from resvs. Congrats.");
731  }
732
733  /* If this user is exempt from user limits set it "F lined" */
734  if (IsConfExemptLimits(conf))
735  {
736    SetExemptLimits(source_p);
737    sendto_one_notice(source_p, &me, ":*** You are exempt from user limits. Congrats.");
738  }
739
740  if (IsConfCanFlood(conf))
741  {
742    SetCanFlood(source_p);
743    sendto_one_notice(source_p, &me, ":*** You are exempt from flood "
744                      "protection, aren't you fearsome.");
745  }
746 }
747
817   /* set_user_mode()
818   *
819   * added 15/10/91 By Darren Reed.
# Line 1062 | Line 1131 | user_set_hostmask(struct Client *target_
1131                                   target_p->host, target_p->away);
1132   }
1133  
1065 /* user_welcome()
1066 *
1067 * inputs       - client pointer to client to welcome
1068 * output       - NONE
1069 * side effects -
1070 */
1071 static void
1072 user_welcome(struct Client *source_p)
1073 {
1074 #if defined(__TIME__) && defined(__DATE__)
1075  static const char built_date[] = __DATE__ " at " __TIME__;
1076 #else
1077  static const char built_date[] = "unknown";
1078 #endif
1079
1080 #ifdef HAVE_LIBCRYPTO
1081  if (HasFlag(source_p, FLAGS_SSL))
1082  {
1083    AddUMode(source_p, UMODE_SSL);
1084    sendto_one_notice(source_p, &me, ":*** Connected securely via %s",
1085                      ssl_get_cipher(source_p->localClient->fd.ssl));
1086  }
1087 #endif
1088
1089  sendto_one_numeric(source_p, &me, RPL_WELCOME, ServerInfo.network_name,
1090                     source_p->name);
1091  sendto_one_numeric(source_p, &me, RPL_YOURHOST,
1092                     get_listener_name(source_p->localClient->listener), ircd_version);
1093  sendto_one_numeric(source_p, &me, RPL_CREATED, built_date);
1094  sendto_one_numeric(source_p, &me, RPL_MYINFO, me.name, ircd_version, umode_buffer);
1095  show_isupport(source_p);
1096
1097  if (source_p->id[0])
1098    sendto_one_numeric(source_p, &me, RPL_YOURID, source_p->id);
1099
1100  show_lusers(source_p);
1101  motd_signon(source_p);
1102 }
1103
1104 /* check_xline()
1105 *
1106 * inputs       - pointer to client to test
1107 * outupt       - 1 if exiting 0 if ok
1108 * side effects -
1109 */
1110 static int
1111 check_xline(struct Client *source_p)
1112 {
1113  struct MaskItem *conf = NULL;
1114  const char *reason = NULL;
1115
1116  if ((conf = find_matching_name_conf(CONF_XLINE, source_p->info, NULL, NULL, 0)))
1117  {
1118    ++conf->count;
1119
1120    if (conf->reason)
1121      reason = conf->reason;
1122    else
1123      reason = CONF_NOREASON;
1124
1125    sendto_realops_flags(UMODE_REJ, L_ALL, SEND_NOTICE,
1126                         "X-line Rejecting [%s] [%s], user %s [%s]",
1127                         source_p->info, reason,
1128                         get_client_name(source_p, HIDE_IP),
1129                         source_p->sockhost);
1130
1131    ++ServerStats.is_ref;
1132    exit_client(source_p, "Bad user info");
1133    return 1;
1134  }
1135
1136  return 0;
1137 }
1138
1134   /* oper_up()
1135   *
1136   * inputs       - pointer to given client to oper

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)