ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/modules/m_accept.c
(Generate patch)

Comparing:
ircd-hybrid/modules/m_accept.c (file contents), Revision 32 by knight, Sun Oct 2 20:41:23 2005 UTC vs.
ircd-hybrid/branches/8.2.x/modules/m_accept.c (file contents), Revision 4012 by michael, Thu Jun 19 18:29:02 2014 UTC

# Line 1 | Line 1
1   /*
2 < *  ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 < *  m_accept.c: Allows a user to talk to a +g user.
2 > *  ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3   *
4 < *  Copyright (C) 2002 by the past and present ircd coders, and others.
4 > *  Copyright (c) 2000-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
# Line 18 | Line 17
17   *  along with this program; if not, write to the Free Software
18   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
19   *  USA
20 < *
21 < *  $Id$
20 > */
21 >
22 > /*! \file m_accept.c
23 > * \brief Includes required functions for processing the ACCEPT command.
24 > * \version $Id$
25   */
26  
27   #include "stdinc.h"
26 #include "handlers.h"
28   #include "client.h"
29   #include "irc_string.h"
29 #include "sprintf_irc.h"
30 #include "hash.h"       /* for find_client() */
30   #include "ircd.h"
31   #include "list.h"
32   #include "numeric.h"
33 < #include "s_conf.h"
35 < #include "s_serv.h"
33 > #include "conf.h"
34   #include "send.h"
37 #include "msg.h"
35   #include "parse.h"
39 #include "s_user.h"
36   #include "modules.h"
37 + #include "memory.h"
38  
42 static void m_accept(struct Client *, struct Client *, int, char *[]);
43 static void build_nicklist(struct Client *, char *, char *, char *);
44 static void add_accept(struct Client *, struct Client *);
45 static void list_accepts(struct Client *);
46
47 struct Message accept_msgtab = {
48  "ACCEPT", 0, 0, 0, 0, MFLG_SLOW, 0,
49  {m_unregistered, m_accept, m_ignore, m_ignore, m_accept, m_ignore}
50 };
51
52 #ifndef STATIC_MODULES
53 void
54 _modinit(void)
55 {
56  mod_add_cmd(&accept_msgtab);
57 }
58
59 void
60 _moddeinit(void)
61 {
62  mod_del_cmd(&accept_msgtab);
63 }
39  
40 < const char *_version = "$Revision$";
41 < #endif
42 <
43 < /*
69 < * m_accept - ACCEPT command handler
70 < *      parv[0] = sender prefix
71 < *      parv[1] = servername
40 > /*! \brief Creates and sends a list of nick!user\@host masks a Client
41 > *         has on its acceptlist.
42 > *
43 > * \param source_p The actual Client the list will be sent to.
44   */
45   static void
46 < m_accept(struct Client *client_p, struct Client *source_p,
75 <         int parc, char *parv[])
46 > list_accepts(struct Client *source_p)
47   {
48 <  char *nick;
49 <  char *p = NULL;
50 <  char addbuf[IRCD_BUFSIZE] = { '\0' };
51 <  char delbuf[IRCD_BUFSIZE] = { '\0' };
81 <  struct Client *target_p = NULL;
82 <  int accept_num;
83 <  
84 <  if ((parc < 2) || (*parv[1] == '*'))
85 <  {
86 <    list_accepts(source_p);
87 <    return;
88 <  }
89 <
90 <  build_nicklist(source_p, addbuf, delbuf, parv[1]);
48 >  int len = 0;
49 >  char nicks[IRCD_BUFSIZE] = "";
50 >  char *t = nicks;
51 >  const dlink_node *ptr = NULL;
52  
53 <  /* parse the delete list */
54 <  for (nick = strtoken(&p, delbuf, ","); nick != NULL;
55 <       nick = strtoken(&p, NULL, ","))
56 <  {
57 <    /* shouldnt happen, but lets be paranoid */
58 <    if (((target_p = find_client(nick)) == NULL) || !IsClient(target_p))
59 <    {
60 <      sendto_one(source_p, form_str(ERR_NOSUCHNICK),
61 <                 me.name, source_p->name, nick);
62 <      continue;
102 <    }
53 >  /* :me.name 281 source_p->name :n1!u1@h1 n2!u2@2 ...\r\n */
54 >  /* 1       23456              78                    9 10 */
55 >  len = strlen(me.name) + strlen(source_p->name) + 10;
56 >
57 >  DLINK_FOREACH(ptr, source_p->localClient->acceptlist.head)
58 >  {
59 >    const struct split_nuh_item *accept_p = ptr->data;
60 >    size_t masklen = strlen(accept_p->nickptr) +
61 >                     strlen(accept_p->userptr) +
62 >                     strlen(accept_p->hostptr) + 2;  /* +2 for !@ */
63  
64 <    /* user isnt on clients accept list */
105 <    if (!accept_message(target_p, source_p))
64 >    if ((t - nicks) + masklen + len  > IRCD_BUFSIZE)
65      {
66 <      sendto_one(source_p, form_str(ERR_ACCEPTNOT),
67 <                 me.name, source_p->name, target_p->name);
68 <      continue;
66 >      *(t - 1) = '\0';
67 >      sendto_one_numeric(source_p, &me, RPL_ACCEPTLIST, nicks);
68 >      t = nicks;
69      }
70  
71 <    del_from_accept(target_p, source_p);
71 >    t += sprintf(t, "%s!%s@%s ",
72 >                 accept_p->nickptr,
73 >                 accept_p->userptr, accept_p->hostptr);
74    }
75  
76 <  /* get the number of accepts they have */
116 <  accept_num = dlink_list_length(&source_p->allow_list);
117 <
118 <  /* parse the add list */
119 <  for (nick = strtoken(&p, addbuf, ","); nick;
120 <       nick = strtoken(&p, NULL, ","), accept_num++)
76 >  if (nicks[0])
77    {
78 <    /* shouldnt happen, but lets be paranoid */
79 <    if (((target_p = find_client(nick)) == NULL) || !IsClient(target_p))
124 <    {
125 <      sendto_one(source_p, form_str(ERR_NOSUCHNICK),
126 <                 me.name, source_p->name, nick);
127 <      continue;
128 <    }
129 <
130 <    /* user is already on clients accept list */
131 <    if (accept_message(target_p, source_p))
132 <    {
133 <      sendto_one(source_p, form_str(ERR_ACCEPTEXIST),
134 <                 me.name, source_p->name, target_p->name);
135 <      continue;
136 <    }
137 <
138 <    if (accept_num >= ConfigFileEntry.max_accept)
139 <    {
140 <      sendto_one(source_p, form_str(ERR_ACCEPTFULL),
141 <                 me.name, source_p->name);
142 <      return;
143 <    }
144 <      
145 <    /* why is this here? */
146 <    /* del_from accept(target_p, source_p); */
147 <    add_accept(source_p, target_p);
78 >    *(t - 1) = '\0';
79 >    sendto_one_numeric(source_p, &me, RPL_ACCEPTLIST, nicks);
80    }
81 +
82 +  sendto_one_numeric(source_p, &me, RPL_ENDOFACCEPT);
83   }
84  
85 < /* build_nicklist()
85 > /*! \brief Allocates and adds a split_nuh_item holding a nick!user\@host
86 > *         mask to a Client's acceptlist.
87   *
88 < * input        - pointer to client
89 < *              - pointer to addbuffer
155 < *              - pointer to remove buffer
156 < *              - pointer to list of nicks
157 < * output       -
158 < * side effects - addbuf/delbuf are modified to give valid nicks
88 > * \param nuh      A split_nuh_item already prepared with required masks.
89 > * \param source_p The actual Client the new accept is added to.
90   */
91   static void
92 < build_nicklist(struct Client *source_p, char *addbuf,
162 <               char *delbuf, char *nicks)
92 > add_accept(const struct split_nuh_item *nuh, struct Client *source_p)
93   {
94 <  char *name = NULL;
165 <  char *p = NULL;
166 <  char *buf_p = NULL;
167 <  struct Client *target_p = NULL;
94 >  struct split_nuh_item *accept_p = MyCalloc(sizeof(*accept_p));
95  
96 <  /* build list of clients to add into addbuf, clients to remove in delbuf */
97 <  for (name = strtoken(&p, nicks, ","); name;
98 <       name = strtoken(&p, NULL, ","))
172 <  {
173 <    if (*name == '-')
174 <      buf_p = delbuf, ++name;
175 <    else
176 <      buf_p = addbuf;
96 >  accept_p->nickptr = xstrdup(nuh->nickptr);
97 >  accept_p->userptr = xstrdup(nuh->userptr);
98 >  accept_p->hostptr = xstrdup(nuh->hostptr);
99  
100 <    if (((target_p = find_client(name)) == NULL) || !IsClient(target_p))
179 <    {
180 <      sendto_one(source_p, form_str(ERR_NOSUCHNICK),
181 <                 me.name, source_p->name, name);
182 <      continue;
183 <    }
100 >  dlinkAdd(accept_p, &accept_p->node, &source_p->localClient->acceptlist);
101  
185    if (*buf_p)
186      strlcat(buf_p, ",", IRCD_BUFSIZE);
187    strlcat(buf_p, name, IRCD_BUFSIZE);
188  }
189 }
190
191 /* add_accept()
192 *
193 * input        - pointer to clients accept list to add to
194 *              - pointer to client to add
195 * output       - none
196 * side effects - target is added to clients list
197 */
198 static void
199 add_accept(struct Client *source_p, struct Client *target_p)
200 {
201  dlinkAdd(target_p, make_dlink_node(), &source_p->allow_list);
202  dlinkAdd(source_p, make_dlink_node(), &target_p->on_allow_list);
102    list_accepts(source_p);
103   }
104  
105 < /* list_accepts()
105 > /*! \brief ACCEPT command handler
106   *
107 < * input        - pointer to client
108 < * output       - none
109 < * side effects - print accept list to client
107 > * \param source_p Pointer to allocated Client struct from which the message
108 > *                 originally comes from.  This can be a local or remote client.
109 > * \param parc     Integer holding the number of supplied arguments.
110 > * \param parv     Argument vector where parv[0] .. parv[parc-1] are non-NULL
111 > *                 pointers.
112 > * \note Valid arguments for this command are:
113 > *      - parv[0] = command
114 > *      - parv[1] = comma-separated list of masks to be accepted or removed
115   */
116 < static void
117 < list_accepts(struct Client *source_p)
116 > static int
117 > m_accept(struct Client *source_p, int parc, char *parv[])
118   {
119 <  int len = 0;
120 <  char nicks[IRCD_BUFSIZE] = { '\0' };
121 <  char *t = nicks;
122 <  const dlink_node *ptr = NULL;
123 <
124 <  len = strlen(me.name) + strlen(source_p->name) + 12;
119 >  char *mask = NULL;
120 >  char *p = NULL;
121 >  char nick[NICKLEN + 1] = "";
122 >  char user[USERLEN + 1] = "";
123 >  char host[HOSTLEN + 1] = "";
124 >  struct split_nuh_item nuh;
125 >  struct split_nuh_item *accept_p = NULL;
126  
127 <  DLINK_FOREACH(ptr, source_p->allow_list.head)
127 >  if (EmptyString(parv[1]) || !strcmp(parv[1], "*"))
128    {
129 <    const struct Client *target_p = ptr->data;
129 >    list_accepts(source_p);
130 >    return 0;
131 >  }
132  
133 <    if ((t - nicks) + strlen(target_p->name) + len > IRCD_BUFSIZE)
133 >  for (mask = strtoken(&p, parv[1], ","); mask;
134 >       mask = strtoken(&p,    NULL, ","))
135 >  {
136 >    if (*mask == '-' && *++mask)
137      {
138 <      *(t - 1) = '\0';
139 <      sendto_one(source_p, form_str(RPL_ACCEPTLIST),
140 <                 me.name, source_p->name, nicks);
141 <      t = nicks;
138 >      nuh.nuhmask  = mask;
139 >      nuh.nickptr  = nick;
140 >      nuh.userptr  = user;
141 >      nuh.hostptr  = host;
142 >
143 >      nuh.nicksize = sizeof(nick);
144 >      nuh.usersize = sizeof(user);
145 >      nuh.hostsize = sizeof(host);
146 >
147 >      split_nuh(&nuh);
148 >
149 >      if ((accept_p = find_accept(nick, user, host, source_p, irccmp)) == NULL)
150 >      {
151 >        sendto_one_numeric(source_p, &me, ERR_ACCEPTNOT, nick, user, host);
152 >        continue;
153 >      }
154 >
155 >      del_accept(accept_p, source_p);
156      }
157 +    else if (*mask)
158 +    {
159 +      if (dlink_list_length(&source_p->localClient->acceptlist) >=
160 +          ConfigFileEntry.max_accept)
161 +      {
162 +        sendto_one_numeric(source_p, &me, ERR_ACCEPTFULL);
163 +        return 0;
164 +      }
165  
166 <    t += ircsprintf(t, "%s ", target_p->name);
167 <  }
166 >      nuh.nuhmask  = mask;
167 >      nuh.nickptr  = nick;
168 >      nuh.userptr  = user;
169 >      nuh.hostptr  = host;
170  
171 <  if (nicks[0] != '\0')
172 <  {
173 <    *(t - 1) = '\0';
174 <    sendto_one(source_p, form_str(RPL_ACCEPTLIST),
175 <               me.name, source_p->name, nicks);
171 >      nuh.nicksize = sizeof(nick);
172 >      nuh.usersize = sizeof(user);
173 >      nuh.hostsize = sizeof(host);
174 >
175 >      split_nuh(&nuh);
176 >
177 >      if ((accept_p = find_accept(nick, user, host, source_p, irccmp)))
178 >      {
179 >        sendto_one_numeric(source_p, &me, ERR_ACCEPTEXIST, nick, user, host);
180 >        continue;
181 >      }
182 >
183 >      add_accept(&nuh, source_p);
184 >    }
185    }
186  
187 <  sendto_one(source_p, form_str(RPL_ENDOFACCEPT),
188 <             me.name, source_p->name);
187 >  return 0;
188 > }
189 >
190 > static struct Message accept_msgtab =
191 > {
192 >  "ACCEPT", 0, 0, 0, MAXPARA, MFLG_SLOW, 0,
193 >  { m_unregistered, m_accept, m_ignore, m_ignore, m_accept, m_ignore }
194 > };
195 >
196 > static void
197 > module_init(void)
198 > {
199 >  mod_add_cmd(&accept_msgtab);
200   }
201 +
202 + static void
203 + module_exit(void)
204 + {
205 +  mod_del_cmd(&accept_msgtab);
206 + }
207 +
208 + struct module module_entry =
209 + {
210 +  .node    = { NULL, NULL, NULL },
211 +  .name    = NULL,
212 +  .version = "$Revision$",
213 +  .handle  = NULL,
214 +  .modinit = module_init,
215 +  .modexit = module_exit,
216 +  .flags   = 0
217 + };

Comparing:
ircd-hybrid/modules/m_accept.c (property svn:keywords), Revision 32 by knight, Sun Oct 2 20:41:23 2005 UTC vs.
ircd-hybrid/branches/8.2.x/modules/m_accept.c (property svn:keywords), Revision 4012 by michael, Thu Jun 19 18:29:02 2014 UTC

# Line 1 | Line 1
1 < Revision
1 > Id Revision

Diff Legend

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