ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/ermyth/src/authcookie.C
Revision: 1.3
Committed: Sat Jul 21 13:23:21 2007 UTC (16 years, 10 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.2: +1 -1 lines
Log Message:
- added rcsid to some files
- more documentation tweaks
- made most protocol commands local to phandler.C
- added ircd metadata (inspircd only for now)
- added inspircd swhois support

File Contents

# User Rev Content
1 pippijn 1.1 /*
2     * authcookie.C: Remote authentication ticket management
3 pippijn 1.2 * Rights to this code are documented in doc/pod/license.pod.
4 pippijn 1.1 *
5     * Copyright © 2005-2007 Atheme Project (http://www.atheme.org)
6     */
7    
8 pippijn 1.3 static char const rcsid[] = "$Id$";
9 pippijn 1.1
10     #include "atheme.h"
11     #include "authcookie.h"
12    
13     list_t authcookie_list;
14     static BlockHeap *authcookie_heap;
15    
16     void
17     authcookie_init (void)
18     {
19     authcookie_heap = BlockHeapCreate (sizeof (authcookie_t), 1024);
20    
21     if (!authcookie_heap)
22     {
23     slog (LG_ERROR, "authcookie_init(): cannot initialize block allocator.");
24     exit (EXIT_FAILURE);
25     }
26     }
27    
28     /*
29     * authcookie_create()
30     *
31     * Inputs:
32     * account associated with the authcookie
33     *
34     * Outputs:
35     * pointer to new authcookie
36     *
37     * Side Effects:
38     * an authcookie ticket is created, and validated.
39     */
40     authcookie_t *
41     authcookie_create (myuser_t *mu)
42     {
43     authcookie_t *au = static_cast<authcookie_t *> (BlockHeapAlloc (authcookie_heap));
44    
45     au->ticket = gen_pw (20);
46     au->myuser = mu;
47     au->expire = NOW + 3600;
48    
49     node_add (au, &au->node, &authcookie_list);
50    
51     return au;
52     }
53    
54     /*
55     * authcookie_find()
56     *
57     * Inputs:
58     * either the ticket string, the myuser_t it is associated with, or both
59     *
60     * Outputs:
61     * the authcookie ticket for this object, if any
62     *
63     * Side Effects:
64     * none
65     */
66     authcookie_t *
67     authcookie_find (char *ticket, myuser_t *myuser)
68     {
69     node_t *n;
70     authcookie_t *ac;
71    
72     /* at least one must be specified */
73     return_val_if_fail (ticket != NULL || myuser != NULL, NULL);
74    
75     if (!myuser) /* must have ticket */
76     {
77     LIST_FOREACH (n, authcookie_list.head)
78     {
79     ac = static_cast<authcookie_t *> (n->data);
80    
81     if (!strcmp (ac->ticket, ticket))
82     return ac;
83     }
84     }
85     else if (!ticket) /* must have myuser */
86     {
87     LIST_FOREACH (n, authcookie_list.head)
88     {
89     ac = static_cast<authcookie_t *> (n->data);
90    
91     if (ac->myuser == myuser)
92     return ac;
93     }
94     }
95     else /* must have both */
96     {
97     LIST_FOREACH (n, authcookie_list.head)
98     {
99     ac = static_cast<authcookie_t *> (n->data);
100    
101     if (ac->myuser == myuser && !strcmp (ac->ticket, ticket))
102     return ac;
103     }
104     }
105    
106     return NULL;
107     }
108    
109     /*
110     * authcookie_destroy()
111     *
112     * Inputs:
113     * an authcookie to destroy
114     *
115     * Outputs:
116     * none
117     *
118     * Side Effects:
119     * an authcookie is destroyed
120     */
121     void
122     authcookie_destroy (authcookie_t *ac)
123     {
124     return_if_fail (ac != NULL);
125    
126     node_del (&ac->node, &authcookie_list);
127     free (ac->ticket);
128     BlockHeapFree (authcookie_heap, ac);
129     }
130    
131     /*
132     * authcookie_destroy_all()
133     *
134     * Inputs:
135     * a myuser_t pointer
136     *
137     * Outputs:
138     * none
139     *
140     * Side Effects:
141     * all authcookies for the user are destroyed
142     */
143     void
144     authcookie_destroy_all (myuser_t *mu)
145     {
146     node_t *n, *tn;
147     authcookie_t *ac;
148    
149     LIST_FOREACH_SAFE (n, tn, authcookie_list.head)
150     {
151     ac = static_cast<authcookie_t *> (n->data);
152    
153     if (ac->myuser == mu)
154     authcookie_destroy (ac);
155     }
156     }
157    
158     /*
159     * authcookie_expire()
160     *
161     * Inputs:
162     * unused arg because this is an event function
163     *
164     * Outputs:
165     * none
166     *
167     * Side Effects:
168     * expired authcookies are destroyed
169     */
170     void
171     authcookie_expire (void *arg)
172     {
173     authcookie_t *ac;
174     node_t *n, *tn;
175    
176     (void) arg;
177     LIST_FOREACH_SAFE (n, tn, authcookie_list.head)
178     {
179     ac = static_cast<authcookie_t *> (n->data);
180    
181     if (ac->expire <= NOW)
182     authcookie_destroy (ac);
183     }
184     }
185    
186     /*
187     * authcookie_validate()
188     *
189     * Inputs:
190     * a ticket and myuser pair that needs to be validated
191     *
192     * Outputs:
193     * true if the authcookie is valid,
194     * otherwise false
195     *
196     * Side Effects:
197     * expired authcookies are destroyed here
198     */
199     bool
200     authcookie_validate (char *ticket, myuser_t *myuser)
201     {
202     authcookie_t *ac = authcookie_find (ticket, myuser);
203    
204     if (ac == NULL)
205     return false;
206    
207     if (ac->expire <= NOW)
208     {
209     authcookie_destroy (ac);
210     return false;
211     }
212    
213     return true;
214     }
215    
216     /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
217     * vim:ts=8
218     * vim:sw=8
219     * vim:noexpandtab
220     */