ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/ermyth/src/account.C
Revision: 1.8
Committed: Sun Sep 16 18:54:44 2007 UTC (16 years, 8 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.7: +7 -3 lines
Log Message:
#defines to enum

File Contents

# Content
1 /**
2 * account.C: Account management
3 *
4 * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team
5 * Rights to this code are as documented in COPYING.
6 *
7 *
8 * Portions of this file were derived from sources bearing the following license:
9 * Rights to this code are documented in doc/pod/license.pod.
10 * Copyright © 2005-2007 Atheme Project (http://www.atheme.org)
11 */
12
13 static char const rcsid[] = "$Id: account.C,v 1.7 2007-09-09 20:05:52 pippijn Exp $";
14
15 #include <boost/foreach.hpp>
16
17 #include "atheme.h"
18 #include <account/myuser.h>
19 #include <account/mynick.h>
20 #include <account/mychan.h>
21 #include <account/chanacs.h>
22 #include "uplink.h" /* XXX, for sendq_flush(curr_uplink->conn); */
23 #include "datastream.h"
24 #include "privs.h"
25
26 /*
27 * init_accounts()
28 *
29 * Initializes the accounts DTree.
30 *
31 * Inputs:
32 * - none
33 *
34 * Outputs:
35 * - none
36 *
37 * Side Effects:
38 * - if the DTree initialization fails, services will abort.
39 */
40 void
41 init_accounts (void)
42 {
43 #if 0
44 myuser_heap = BlockHeapCreate (sizeof (myuser_t), HEAP_USER);
45 mynick_heap = BlockHeapCreate (sizeof (myuser_t), HEAP_USER);
46 mychan_heap = BlockHeapCreate (sizeof (mychan_t), HEAP_CHANNEL);
47 chanacs_heap = BlockHeapCreate (sizeof (chanacs_t), HEAP_CHANUSER);
48 metadata_heap = BlockHeapCreate (sizeof (metadata_t), HEAP_CHANUSER);
49 #endif
50 }
51
52 static int
53 expire_myuser_cb (myuser_t::pair_type &mup)
54 {
55 myuser_t *mu = mup.second;
56
57 /* If they're logged in, update lastlogin time.
58 * To decrease db traffic, may want to only do
59 * this if the account would otherwise be
60 * deleted. -- jilles
61 */
62 if (!mu->logins.empty ())
63 {
64 mu->lastlogin = NOW;
65 return 0;
66 }
67
68 if (MU_HOLD & mu->flags)
69 return 0;
70
71 if (((NOW - mu->lastlogin) >= nicksvs.expiry) || ((mu->flags & MU_WAITAUTH) && (NOW - mu->registered >= 86400)))
72 {
73 /* Don't expire accounts with privs on them in atheme.conf,
74 * otherwise someone can reregister
75 * them and take the privs -- jilles */
76 if (is_conf_soper (mu))
77 return 0;
78
79 snoop (_("EXPIRE: \2%s\2 from \2%s\2 "), mu->name, mu->email);
80 slog (LG_REGISTER, "expire_check(): expiring account %s (unused %ds, email %s, nicks %d, chanacs %d)", mu->name, (int) (NOW - mu->lastlogin), mu->email, LIST_LENGTH (&mu->nicks), LIST_LENGTH (&mu->chanacs));
81 mu->refcnt_dec ();
82 }
83
84 return 0;
85 }
86
87 void
88 expire_check (void *arg)
89 {
90 mynick_t *mn;
91 mychan_t *mc;
92 user_t *u;
93
94 /* Let them know about this and the likely subsequent db_save()
95 * right away -- jilles */
96 sendq_flush (curr_uplink->conn);
97
98 if (nicksvs.expiry != 0)
99 {
100 std::for_each (myuser_t::map.begin (), myuser_t::map.end (), expire_myuser_cb);
101
102 foreach (mynick_t::pair_type &mnp, mynick_t::map)
103 {
104 mn = mnp.second;
105 if ((NOW - mn->lastseen) >= nicksvs.expiry)
106 {
107 if (MU_HOLD & mn->owner->flags)
108 continue;
109
110 /* do not drop main nick like this */
111 if (!irccasecmp (mn->nick, mn->owner->name))
112 continue;
113
114 u = user_find_named (mn->nick);
115 if (u != NULL && u->myuser == mn->owner)
116 {
117 /* still logged in, bleh */
118 mn->lastseen = NOW;
119 mn->owner->lastlogin = NOW;
120 continue;
121 }
122
123 snoop (_("EXPIRE: \2%s\2 from \2%s\2"), mn->nick, mn->owner->name);
124 slog (LG_REGISTER, "expire_check(): expiring nick %s (unused %ds, account %s)", mn->nick, NOW - mn->lastseen, mn->owner->name);
125 mn->refcnt_dec ();
126 }
127 }
128 }
129
130 if (chansvs.expiry != 0)
131 {
132 foreach (mychan_t::pair_type &mp, mychan_t::map)
133 {
134 mc = mp.second;
135 if ((NOW - mc->used) >= 86400 - 3660)
136 {
137 /* keep last used time accurate to
138 * within a day, making sure an active
139 * channel will never get "Last used"
140 * in /cs info -- jilles */
141 if (mc->isused ())
142 {
143 mc->used = NOW;
144 slog (LG_DEBUG, "expire_check(): updating last used time on %s because it appears to be still in use", mc->name);
145 continue;
146 }
147 }
148
149 if ((NOW - mc->used) >= chansvs.expiry)
150 {
151 if (MC_HOLD & mc->flags)
152 continue;
153
154 snoop (_("EXPIRE: \2%s\2 from \2%s\2"), mc->name, mc->founder_names ());
155 slog (LG_REGISTER, "expire_check(): expiring channel %s (unused %ds, founder %s, chanacs %d)",
156 mc->name,
157 NOW - mc->used,
158 mc->founder_names (),
159 LIST_LENGTH (&mc->chanacs));
160
161 mc->callback.drop (mc);
162 if ((config_options.chan && irccasecmp (mc->name, config_options.chan)) || !config_options.chan)
163 part (mc->name, chansvs.nick);
164
165 mc->refcnt_dec ();
166 }
167 }
168 }
169 }
170
171 static int
172 check_myuser_cb (myuser_t::pair_type &mup)
173 {
174 myuser_t *mu = mup.second;
175 mynick_t *mn;
176
177 if (MU_OLD_ALIAS & mu->flags)
178 {
179 slog (LG_REGISTER, "db_check(): converting previously linked nick %s to a standalone nick", mu->name);
180 mu->flags &= ~MU_OLD_ALIAS;
181 mu->del_metadata ("private:alias:parent");
182 }
183
184 if (!nicksvs.no_nick_ownership)
185 {
186 mn = mynick_t::find (mu->name);
187 if (mn == NULL)
188 {
189 slog (LG_REGISTER, "db_check(): adding missing nick %s", mu->name);
190 mn = mynick_t::create (mu, mu->name);
191 mn->registered = mu->registered;
192 mn->lastseen = mu->lastlogin;
193 }
194 else if (mn->owner != mu)
195 {
196 slog (LG_REGISTER, "db_check(): replacing nick %s owned by %s with %s", mn->nick, mn->owner->name, mu->name);
197 mn->refcnt_dec ();
198 mn = mynick_t::create (mu, mu->name);
199 mn->registered = mu->registered;
200 mn->lastseen = mu->lastlogin;
201 }
202 }
203
204 return 0;
205 }
206
207 void
208 db_check ()
209 {
210 std::for_each (myuser_t::map.begin (), myuser_t::map.end (), check_myuser_cb);
211 }