Commit | Line | Data |
---|---|---|
5df73aeb RK |
1 | /* |
2 | * This file is part of DisOrder | |
3 | * Copyright (C) 2007 Richard Kettlewell | |
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, but | |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * 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 | |
18 | * USA | |
19 | */ | |
20 | /** @file lib/rights.c | |
21 | * @brief User rights | |
22 | */ | |
23 | ||
24 | #include <config.h> | |
25 | #include "types.h" | |
26 | ||
27 | #include <string.h> | |
28 | ||
29 | #include "mem.h" | |
30 | #include "log.h" | |
31 | #include "configuration.h" | |
32 | #include "rights.h" | |
33 | #include "vector.h" | |
34 | ||
35 | static const struct { | |
36 | rights_type bit; | |
37 | const char *name; | |
38 | } rights_names[] = { | |
39 | { RIGHT_READ, "read" }, | |
40 | { RIGHT_PLAY, "play" }, | |
41 | { RIGHT_MOVE_ANY, "move any" }, | |
42 | { RIGHT_MOVE_MINE, "move mine" }, | |
43 | { RIGHT_MOVE_RANDOM, "move random" }, | |
44 | { RIGHT_REMOVE_ANY, "remove any" }, | |
45 | { RIGHT_REMOVE_MINE, "remove mine" }, | |
46 | { RIGHT_REMOVE_RANDOM, "remove random" }, | |
47 | { RIGHT_SCRATCH_ANY, "scratch any" }, | |
48 | { RIGHT_SCRATCH_MINE, "scratch mine" }, | |
49 | { RIGHT_SCRATCH_RANDOM, "scratch random" }, | |
50 | { RIGHT_VOLUME, "volume" }, | |
51 | { RIGHT_ADMIN, "admin" }, | |
52 | { RIGHT_RESCAN, "rescan" }, | |
53 | { RIGHT_REGISTER, "register" }, | |
54 | { RIGHT_USERINFO, "userinfo" }, | |
55 | { RIGHT_PREFS, "prefs" }, | |
eb5dc014 RK |
56 | { RIGHT_GLOBAL_PREFS, "global prefs" }, |
57 | { RIGHT_PAUSE, "pause" } | |
5df73aeb RK |
58 | }; |
59 | #define NRIGHTS (sizeof rights_names / sizeof *rights_names) | |
60 | ||
61 | /** @brief Convert a rights word to a string */ | |
62 | char *rights_string(rights_type r) { | |
63 | struct dynstr d[1]; | |
64 | size_t n; | |
65 | ||
66 | dynstr_init(d); | |
67 | for(n = 0; n < NRIGHTS; ++n) { | |
68 | if(r & rights_names[n].bit) { | |
69 | if(d->nvec) | |
70 | dynstr_append(d, ','); | |
71 | dynstr_append_string(d, rights_names[n].name); | |
72 | } | |
73 | } | |
74 | dynstr_terminate(d); | |
75 | return d->vec; | |
76 | } | |
77 | ||
5df73aeb RK |
78 | /** @brief Parse a rights list |
79 | * @param s Rights list in string form | |
80 | * @param rp Where to store rights, or NULL to just validate | |
81 | * @return 0 on success, non-0 if @p s is not valid | |
82 | */ | |
83 | int parse_rights(const char *s, rights_type *rp) { | |
84 | rights_type r = 0; | |
85 | const char *t; | |
86 | size_t n, l; | |
87 | ||
88 | if(!*s) { | |
89 | /* You can't have no rights */ | |
90 | error(0, "empty rights string"); | |
91 | return -1; | |
92 | } | |
93 | while(*s) { | |
94 | t = strchr(s, ','); | |
95 | if(!t) | |
96 | t = s + strlen(s); | |
97 | l = (size_t)(t - s); | |
98 | if(l == 3 && !strncmp(s, "all", 3)) | |
99 | r = RIGHTS__MASK; | |
100 | else { | |
101 | for(n = 0; n < NRIGHTS; ++n) | |
102 | if(strlen(rights_names[n].name) == l | |
103 | && !strncmp(rights_names[n].name, s, l)) | |
104 | break; | |
105 | if(n >= NRIGHTS) { | |
106 | error(0, "unknown user right '%.*s'", (int)l, s); | |
107 | return -1; | |
108 | } | |
109 | r |= rights_names[n].bit; | |
110 | } | |
111 | s = t; | |
112 | if(*s == ',') | |
113 | ++s; | |
114 | } | |
115 | if(rp) | |
116 | *rp = r; | |
117 | return 0; | |
118 | } | |
119 | ||
120 | /* | |
121 | Local Variables: | |
122 | c-basic-offset:2 | |
123 | comment-column:40 | |
124 | fill-column:79 | |
125 | indent-tabs-mode:nil | |
126 | End: | |
127 | */ |