ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/ermyth/modules/contrib/cs_userinfo.C
Revision: 1.1
Committed: Thu Jul 19 08:24:53 2007 UTC (19 years, 3 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Log Message:
initial import. the most important changes since Atheme are:
- fixed many memory leaks
- fixed many bugs
- converted to C++ and use more STL containers
- added a (not very enhanced yet) perl module
- greatly improved XML-RPC speed
- added a JSON-RPC module with code from json-cpp
- added a valgrind memcheck module to operserv
- added a more object oriented base64 implementation
- added a specialised unit test framework
- improved stability
- use gettimeofday() if available
- reworked adding/removing commands
- MemoServ IGNORE DEL can now remove indices

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * Copyright © 2007 Jilles Tjoelker, et al
3     * Rights to this code are as documented in doc/LICENSE.
4     *
5     * Per-channel userinfo thingie
6     *
7     * $Id: cs_userinfo.c 8027 2007-04-02 10:47:18Z nenolod $
8     */
9    
10     #include "atheme.h"
11     #include <account/mychan.h>
12     #include <account/myuser.h>
13     #include <account/chanacs.h>
14    
15     DECLARE_MODULE_V1 ("chanserv/userinfo", false, _modinit, _moddeinit, "$Id: cs_userinfo.c 8027 2007-04-02 10:47:18Z nenolod $", "Atheme Development Group <http://www.atheme.org>");
16    
17     cmdvec *cs_cmdtree;
18     helpvec *cs_helptree;
19    
20     static void userinfo_check_join (void *vptr);
21     static void cs_cmd_userinfo (sourceinfo_t *si, int parc, char *parv[]);
22    
23     command_t cs_userinfo = { "USERINFO", N_("Sets a userinfo message."),
24     AC_NONE, 3, cs_cmd_userinfo
25     };
26    
27     void
28     _modinit (module_t *m)
29     {
30     MODULE_USE_SYMBOL_T (cs_cmdtree, cmdvec, "chanserv/main", "cs_cmdtree");
31     MODULE_USE_SYMBOL_T (cs_helptree, helpvec, "chanserv/main", "cs_helptree");
32    
33     hook_add_event ("channel_join");
34     hook_add_hook ("channel_join", userinfo_check_join);
35     cs_cmdtree << cs_userinfo;
36     help_addentry (cs_helptree, "USERINFO", "help/cservice/userinfo", NULL);
37     }
38    
39     void
40     _moddeinit (void)
41     {
42     hook_del_hook ("channel_join", userinfo_check_join);
43     cs_cmdtree >> cs_userinfo;
44     help_delentry (cs_helptree, "USERINFO");
45     }
46    
47     /* USERINFO <channel> [user] [message] */
48     static void
49     cs_cmd_userinfo (sourceinfo_t *si, int parc, char *parv[])
50     {
51     node_t *n;
52     myuser_t *mu;
53     mychan_t *mc;
54     chanacs_t *ca;
55     metadata *md;
56     unsigned int restrictflags;
57    
58     if (parc < 1)
59     {
60     command_fail (si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "USERINFO");
61     command_fail (si, fault_needmoreparams, _("Syntax: USERINFO <channel> [target] [info]"));
62     return;
63     }
64    
65     mc = mychan_find (parv[0]);
66     if (!mc)
67     {
68     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), parv[0]);
69     return;
70     }
71    
72     if (mc->find_metadata ("private:close:closer") && !has_priv (si, PRIV_CHAN_AUSPEX))
73     {
74     command_fail (si, fault_noprivs, _("\2%s\2 is closed."), mc->name);
75     return;
76     }
77    
78     restrictflags = chanacs_source_flags (mc, si);
79    
80     if (parc == 1)
81     {
82     if (!(restrictflags & CA_ACLVIEW))
83     {
84     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
85     return;
86     }
87     command_success_nodata (si, _("Nickname Info"));
88     command_success_nodata (si, "------------------- ---------------");
89    
90     LIST_FOREACH (n, mc->chanacs.head)
91     {
92     ca = static_cast<chanacs_t *> (n->data);
93     if (ca->myuser == NULL)
94     continue;
95     md = ca->find_metadata ("userinfo");
96     if (md == NULL)
97     continue;
98     command_success_nodata (si, "%-19s %s", ca->myuser->name, md->value);
99     }
100    
101     command_success_nodata (si, "------------------- ---------------");
102     command_success_nodata (si, _("End of \2%s\2 USERINFO listing."), mc->name);
103     logcommand (si, CMDLOG_GET, "%s USERINFO", mc->name);
104     }
105     else
106     {
107     if (!(restrictflags & CA_FLAGS))
108     {
109     command_fail (si, fault_noprivs, _("You are not authorized to perform this operation."));
110     return;
111     }
112     mu = myuser_find_ext (parv[1]);
113     if (mu == NULL)
114     {
115     command_fail (si, fault_nosuch_target, _("\2%s\2 is not registered."), parv[1]);
116     return;
117     }
118     ca = chanacs_find (mc, mu, 0);
119     if (ca == NULL || ca->level & CA_AKICK)
120     {
121     command_fail (si, fault_nosuch_target, _("\2%s\2 has no access to \2%s\2."), mu->name, mc->name);
122     return;
123     }
124     if (ca->level & ~allow_flags (restrictflags))
125     {
126     command_fail (si, fault_noprivs, _("You are not authorized to modify the access entry for \2%s\2 on \2%s\2."), mu->name, mc->name);
127     return;
128     }
129     if (parc == 2)
130     {
131     ca->del_metadata ("userinfo");
132     command_success_nodata (si, _("Deleted userinfo for \2%s\2 on \2%s\2."), mu->name, mc->name);
133     logcommand (si, CMDLOG_SET, "%s USERINFO %s", mc->name, mu->name);
134     return;
135     }
136    
137     ca->add_metadata ("userinfo", parv[2]);
138     command_success_nodata (si, _("Added userinfo for \2%s\2 on \2%s\2."), mu->name, mc->name);
139     logcommand (si, CMDLOG_SET, "%s USERINFO %s %s", mc->name, mu->name, parv[2]);
140     }
141     return;
142     }
143    
144     static void
145     userinfo_check_join (void *vptr)
146     {
147     chanuser_t *cu = ((hook_channel_joinpart_t *) vptr)->cu;
148     myuser_t *mu;
149     mychan_t *mc;
150     chanacs_t *ca;
151     metadata *md;
152    
153     if (cu == NULL)
154     return;
155     if (!(cu->user->server->flags & SF_EOB))
156     return;
157     mu = cu->user->myuser;
158     mc = mychan_find (cu->chan->name);
159     if (mu == NULL || mc == NULL)
160     return;
161     ca = chanacs_find (mc, mu, 0);
162     if (ca == NULL || ca->level & CA_AKICK)
163     return;
164     if (!(md = ca->find_metadata ("userinfo")))
165     return;
166     msg (chansvs.nick, cu->chan->name, "[%s] %s", cu->user->nick, md->value);
167     }