ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/nickserv/vhost.C
Revision: 1.7
Committed: Wed Sep 5 11:23:14 2007 UTC (19 years, 1 month ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.6: +5 -5 lines
Log Message:
removed GPLed code and put license back to BSD

File Contents

# User Rev Content
1 pippijn 1.1 /*
2 pippijn 1.4 * Copyright © 2005 William Pitcock <nenolod -at- nenolod.net>
3 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
4 pippijn 1.1 *
5     * Allows setting a vhost on an account
6     *
7 pippijn 1.7 * $Id: vhost.C,v 1.6 2007-08-30 19:56:24 pippijn Exp $
8 pippijn 1.1 */
9    
10     #include "atheme.h"
11 pippijn 1.4 #include <ermyth/module.h>
12 pippijn 1.1 #include <account/myuser.h>
13 pippijn 1.4 #include <boost/foreach.hpp>
14 pippijn 1.1
15 pippijn 1.7 static char const rcsid[] = "$Id: vhost.C,v 1.6 2007-08-30 19:56:24 pippijn Exp $";
16 pippijn 1.1
17 pippijn 1.4 REGISTER_MODULE ("nickserv/vhost", false, "The Ermyth Team <http://ermyth.schmorp.de>");
18 pippijn 1.1
19 pippijn 1.4 E cmdvec ns_cmdtree;
20     E helpvec ns_helptree;
21 pippijn 1.1
22     static void ns_cmd_vhost (sourceinfo_t *si, int parc, char *parv[]);
23     static void ns_cmd_listvhost (sourceinfo_t *si, int parc, char *parv[]);
24    
25 pippijn 1.4 command_t const ns_vhost = { "VHOST", N_("Manages user virtualhosts."), PRIV_USER_VHOST, 2, ns_cmd_vhost };
26     command_t const ns_listvhost = { "LISTVHOST", N_("Lists user virtualhosts."), PRIV_USER_AUSPEX, 1, ns_cmd_listvhost };
27 pippijn 1.1
28     static void
29     do_sethost_all (myuser_t *mu, char *host)
30     {
31     user_t *u;
32     myuser_t::login_vector::iterator it, it_end;
33    
34     for (it = mu->logins.begin (), it_end = mu->logins.end (); it != it_end; ++it)
35     {
36     u = *it;
37    
38     if (!strcmp (u->vhost, host))
39     continue;
40     strlcpy (u->vhost, host, HOSTLEN);
41 pippijn 1.4 phandler->sethost_sts (nicksvs.nick, u->nick, u->vhost);
42 pippijn 1.1 }
43     }
44    
45     static void
46     do_sethost (user_t *u, char *host)
47     {
48     if (!strcmp (u->vhost, host))
49     return;
50     strlcpy (u->vhost, host, HOSTLEN);
51 pippijn 1.4 phandler->sethost_sts (nicksvs.nick, u->nick, u->vhost);
52 pippijn 1.1 }
53    
54     static void
55     do_restorehost_all (myuser_t *mu)
56     {
57     user_t *u;
58     myuser_t::login_vector::iterator it, it_end;
59    
60     for (it = mu->logins.begin (), it_end = mu->logins.end (); it != it_end; ++it)
61     {
62     u = *it;
63    
64     if (!strcmp (u->vhost, u->host))
65     continue;
66     strlcpy (u->vhost, u->host, HOSTLEN);
67 pippijn 1.4 phandler->sethost_sts (nicksvs.nick, u->nick, u->host);
68 pippijn 1.1 }
69     }
70    
71     /* VHOST <nick> [host] */
72     static void
73     ns_cmd_vhost (sourceinfo_t *si, int parc, char *parv[])
74     {
75     char *target = parv[0];
76     char *host = parv[1];
77     myuser_t *mu;
78     char *p;
79    
80     if (!target)
81     {
82 pippijn 1.6 command_fail (si, fault::needmoreparams, STR_INVALID_PARAMS, "VHOST");
83     command_fail (si, fault::needmoreparams, _("Syntax: VHOST <nick> [vhost]"));
84 pippijn 1.1 return;
85     }
86    
87     /* find the user... */
88 pippijn 1.5 if (!(mu = myuser_t::find_ext (target)))
89 pippijn 1.1 {
90 pippijn 1.6 command_fail (si, fault::nosuch_target, _("\2%s\2 is not registered."), target);
91 pippijn 1.1 return;
92     }
93    
94     /* deletion action */
95     if (!host)
96     {
97     mu->del_metadata ("private:usercloak");
98     command_success_nodata (si, _("Deleted vhost for \2%s\2."), mu->name);
99     snoop ("VHOST:REMOVE: \2%s\2 by \2%s\2", mu->name, get_oper_name (si));
100     logcommand (si, CMDLOG_ADMIN, "VHOST REMOVE %s", mu->name);
101     do_restorehost_all (mu);
102     return;
103     }
104    
105     /* Never ever allow @!?* as they have special meaning in all ircds */
106     /* Empty, space anywhere and colon at the start break the protocol */
107     if (strchr (host, '@') || strchr (host, '!') || strchr (host, '?') || strchr (host, '*') || strchr (host, ' ') || *host == ':' || *host == '\0')
108     {
109 pippijn 1.6 command_fail (si, fault::badparams, _("The vhost provided contains invalid characters."));
110 pippijn 1.1 return;
111     }
112     if (strlen (host) >= HOSTLEN)
113     {
114 pippijn 1.6 command_fail (si, fault::badparams, _("The vhost provided is too long."));
115 pippijn 1.1 return;
116     }
117     p = strrchr (host, '/');
118     if (p != NULL && isdigit (p[1]))
119     {
120 pippijn 1.6 command_fail (si, fault::badparams, _("The vhost provided looks like a CIDR mask."));
121 pippijn 1.1 return;
122     }
123     /* XXX more checks here, perhaps as a configurable regexp? */
124    
125     mu->add_metadata ("private:usercloak", host);
126     command_success_nodata (si, _("Assigned vhost \2%s\2 to \2%s\2."), host, mu->name);
127     snoop ("VHOST:ASSIGN: \2%s\2 to \2%s\2 by \2%s\2", host, mu->name, get_oper_name (si));
128     logcommand (si, CMDLOG_ADMIN, "VHOST ASSIGN %s %s", mu->name, host);
129     do_sethost_all (mu, host);
130     return;
131     }
132    
133     static void
134     ns_cmd_listvhost (sourceinfo_t *si, int parc, char *parv[])
135     {
136 pippijn 1.4 char const * const pattern = parc >= 1 ? parv[0] : "*";
137 pippijn 1.1 myuser_t *mu;
138 pippijn 1.7 metadata *md;
139 pippijn 1.1 int matches = 0;
140    
141     snoop ("LISTVHOST: \2%s\2 by \2%s\2", pattern, get_oper_name (si));
142 pippijn 1.7 foreach (myuser_t::pair_type &mup, myuser_t::map)
143 pippijn 1.4 {
144     mu = mup.second;
145     md = mu->find_metadata ("private:usercloak");
146     if (md == NULL)
147     continue;
148     if (!match (pattern, md->value))
149     {
150     command_success_nodata (si, "- %-30s %s", mu->name, md->value);
151     matches++;
152     }
153     }
154    
155 pippijn 1.1 logcommand (si, CMDLOG_ADMIN, "LISTVHOST %s (%d matches)", pattern, matches);
156     if (matches == 0)
157     command_success_nodata (si, _("No vhosts matched pattern \2%s\2"), pattern);
158     else
159     command_success_nodata (si, ngettext (N_("\2%d\2 match for pattern \2%s\2"), N_("\2%d\2 matches for pattern \2%s\2"), matches), matches, pattern);
160     }
161    
162     static void
163 pippijn 1.4 vhost_on_identify (user_t *u)
164 pippijn 1.1 {
165     myuser_t *mu = u->myuser;
166 pippijn 1.7 metadata *md;
167 pippijn 1.1
168     /* NO CLOAK?!*$*%*&&$(!& */
169     if (!(md = mu->find_metadata ("private:usercloak")))
170     return;
171    
172     do_sethost (u, md->value);
173     }
174 pippijn 1.4
175     bool
176     _modinit (module *m)
177     {
178     user_t::callback.identify.attach (vhost_on_identify);
179    
180     ns_cmdtree << ns_vhost;
181     ns_cmdtree << ns_listvhost;
182    
183     help_addentry (ns_helptree, "VHOST", "help/nickserv/vhost", NULL);
184     help_addentry (ns_helptree, "LISTVHOST", "help/nickserv/listvhost", NULL);
185    
186     return true;
187     }
188    
189     void
190     _moddeinit (void)
191     {
192     user_t::callback.identify.detach (vhost_on_identify);
193    
194     ns_cmdtree >> ns_vhost;
195     ns_cmdtree >> ns_listvhost;
196    
197     help_delentry (ns_helptree, "VHOST");
198     help_delentry (ns_helptree, "LISTVHOST");
199     }