a892e97b38ac8512a18e6aca76f0ac0648859ef2
[debian/sudo] / plugins / sudoers / parse.h
1 /*
2  * Copyright (c) 1996, 1998-2000, 2004, 2007-2013
3  *      Todd C. Miller <Todd.Miller@courtesan.com>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #ifndef _SUDOERS_PARSE_H
19 #define _SUDOERS_PARSE_H
20
21 #undef UNSPEC
22 #define UNSPEC  -1
23 #undef DENY
24 #define DENY     0
25 #undef ALLOW
26 #define ALLOW    1
27 #undef IMPLIED
28 #define IMPLIED  2
29
30 #define SUDO_DIGEST_SHA224      0
31 #define SUDO_DIGEST_SHA256      1
32 #define SUDO_DIGEST_SHA384      2
33 #define SUDO_DIGEST_SHA512      3
34 #define SUDO_DIGEST_INVALID     4
35
36 struct sudo_digest {
37     int digest_type;
38     char *digest_str;
39 };
40
41 /*
42  * A command with option args and digest.
43  * XXX - merge into struct member
44  */
45 struct sudo_command {
46     char *cmnd;
47     char *args;
48     struct sudo_digest *digest;
49 };
50
51 /*
52  * Tags associated with a command.
53  * Possible values: true, false, IMPLIED, UNSPEC.
54  */
55 struct cmndtag {
56     __signed int nopasswd: 3;
57     __signed int noexec: 3;
58     __signed int setenv: 3;
59     __signed int log_input: 3;
60     __signed int log_output: 3;
61 };
62
63 /*
64  * SELinux-specific container struct.
65  * Currently just contains a role and type.
66  */
67 struct selinux_info {
68     char *role;
69     char *type;
70 };
71
72 /*
73  * Solaris privileges container struct
74  * Currently just contains permitted and limit privileges.
75  * It could have PFEXEC and PRIV_AWARE flags added in the future.
76  */
77 struct solaris_privs_info {
78     char *privs;
79     char *limitprivs;
80 };
81
82 /*
83  * The parsed sudoers file is stored as a collection of linked lists,
84  * modelled after the yacc grammar.
85  *
86  * Other than the alias struct, which is stored in a red-black tree,
87  * the data structure used is basically a doubly-linked tail queue without
88  * a separate head struct--the first entry acts as the head where the prev
89  * pointer does double duty as the tail pointer.  This makes it possible
90  * to trivally append sub-lists.  In addition, the prev pointer is always
91  * valid (even if it points to itself).  Unlike a circle queue, the next
92  * pointer of the last entry is NULL and does not point back to the head.
93  *
94  * Note that each list struct must contain a "prev" and "next" pointer as
95  * the first two members of the struct (in that order).
96  */
97
98 /*
99  * Tail queue list head structure.
100  */
101 TQ_DECLARE(defaults)
102 TQ_DECLARE(userspec)
103 TQ_DECLARE(member)
104 TQ_DECLARE(privilege)
105 TQ_DECLARE(cmndspec)
106
107 /*
108  * Structure describing a user specification and list thereof.
109  */
110 struct userspec {
111     struct userspec *prev, *next;
112     struct member_list users;           /* list of users */
113     struct privilege_list privileges;   /* list of privileges */
114 };
115
116 /*
117  * Structure describing a privilege specification.
118  */
119 struct privilege {
120     struct privilege *prev, *next;
121     struct member_list hostlist;        /* list of hosts */
122     struct cmndspec_list cmndlist;      /* list of Cmnd_Specs */
123 };
124
125 /*
126  * Structure describing a linked list of Cmnd_Specs.
127  */
128 struct cmndspec {
129     struct cmndspec *prev, *next;
130     struct member_list runasuserlist;   /* list of runas users */
131     struct member_list runasgrouplist;  /* list of runas groups */
132     struct member *cmnd;                /* command to allow/deny */
133     char *digest;                       /* optional command digest */
134     struct cmndtag tags;                /* tag specificaion */
135 #ifdef HAVE_SELINUX
136     char *role, *type;                  /* SELinux role and type */
137 #endif
138 #ifdef HAVE_PRIV_SET
139     char *privs, *limitprivs;           /* Solaris privilege sets */
140 #endif
141 };
142
143 /*
144  * Generic structure to hold users, hosts, commands.
145  */
146 struct member {
147     struct member *prev, *next;
148     char *name;                         /* member name */
149     short type;                         /* type (see gram.h) */
150     short negated;                      /* negated via '!'? */
151 };
152
153 struct runascontainer {
154     struct member *runasusers;
155     struct member *runasgroups;
156 };
157
158 /*
159  * Generic structure to hold {User,Host,Runas,Cmnd}_Alias
160  * Aliases are stored in a red-black tree, sorted by name and type.
161  */
162 struct alias {
163     char *name;                         /* alias name */
164     unsigned short type;                /* {USER,HOST,RUNAS,CMND}ALIAS */
165     bool used;                          /* "used" flag for cycle detection */
166     struct member_list members;         /* list of alias members */
167 };
168
169 /*
170  * Structure describing a Defaults entry and a list thereof.
171  */
172 struct defaults {
173     struct defaults *prev, *next;
174     char *var;                          /* variable name */
175     char *val;                          /* variable value */
176     struct member_list binding;         /* user/host/runas binding */
177     int type;                           /* DEFAULTS{,_USER,_RUNAS,_HOST} */
178     int op;                             /* true, false, '+', '-' */
179 };
180
181 /*
182  * Parsed sudoers info.
183  */
184 extern struct userspec_list userspecs;
185 extern struct defaults_list defaults;
186
187 /* alias.c */
188 bool no_aliases(void);
189 char *alias_add(char *name, int type, struct member *members);
190 int alias_compare(const void *a1, const void *a2);
191 struct alias *alias_get(char *name, int type);
192 struct alias *alias_remove(char *name, int type);
193 void alias_apply(int (*func)(void *, void *), void *cookie);
194 void alias_free(void *a);
195 void alias_put(struct alias *a);
196 void init_aliases(void);
197
198 /* gram.c */
199 void init_parser(const char *, bool);
200
201 /* match_addr.c */
202 bool addr_matches(char *n);
203
204 /* match.c */
205 bool command_matches(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest);
206 bool group_matches(char *sudoers_group, struct group *gr);
207 bool hostname_matches(char *shost, char *lhost, char *pattern);
208 bool netgr_matches(char *netgr, char *lhost, char *shost, char *user);
209 bool usergr_matches(char *group, char *user, struct passwd *pw);
210 bool userpw_matches(char *sudoers_user, char *user, struct passwd *pw);
211 int cmnd_matches(struct member *m);
212 int cmndlist_matches(struct member_list *list);
213 int hostlist_matches(struct member_list *list);
214 int runaslist_matches(struct member_list *user_list, struct member_list *group_list, struct member **matching_user, struct member **matching_group);
215 int userlist_matches(struct passwd *pw, struct member_list *list);
216
217 /* toke.c */
218 void init_lexer(void);
219
220 /* hexchar.c */
221 int hexchar(const char *s);
222
223 /* base64.c */
224 size_t base64_decode(const char *str, unsigned char *dst, size_t dsize);
225
226 #endif /* _SUDOERS_PARSE_H */