User GDBM instead of QDBM.
[cascardo/rnetproxy.git] / usermap.c
1 /*
2 ** Copyright (C) 2006 Thadeu Lima de Souza Cascardo <cascardo@minaslivre.org>
3 ** Copyright (C) 2009 Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
4 **  
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **  
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ** GNU General Public License for more details.
14 **  
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 **  
19 */
20
21 #include <string.h>
22 #include <gdbm.h>
23 #include <stdlib.h>
24 #include "usermap.h"
25
26 int
27 usermap_perm (char *user)
28 {
29   GDBM_FILE allow_db = NULL;
30   GDBM_FILE deny_db = NULL;
31   int allow = 0;
32   int deny = 0;
33   datum key;
34   key.dptr = user;
35   key.dsize = strlen (user);
36   int allow_users = 0;
37   allow_db = gdbm_open ("/var/lib/popproxy/allow.db",
38                         0, GDBM_READER, 0, NULL);
39   deny_db = gdbm_open ("/var/lib/popproxy/deny.db",
40                        0, GDBM_READER, 0, NULL);
41   if (allow_db)
42     {
43       datum allow_fk;
44       allow = gdbm_exists (allow_db, key);
45       allow_fk = gdbm_firstkey (allow_db);
46       if (allow_fk.dptr)
47         {
48           allow_users = 1;
49           free (allow_fk.dptr);
50         }
51       gdbm_close (allow_db);
52     }
53   if (deny_db)
54     {
55       deny = gdbm_exists (deny_db, key);
56       gdbm_close (deny_db);
57     }
58   if (deny)
59     return ACCESS_DENY;
60   if (allow)
61     return ACCESS_ALLOW;
62   if (allow_users == 0)
63     return ACCESS_ALLOW;
64   return ACCESS_DENY;
65 }