~apparmor-dev/apparmor/apparmor-ubuntu-citrain-trusty

« back to all changes in this revision

Viewing changes to parser/parser.h

  • Committer: Seth Arnold
  • Date: 2014-03-12 02:05:16 UTC
  • mto: This revision was merged to the branch mainline in revision 1496.
  • Revision ID: seth.arnold@canonical.com-20140312020516-zjike3pmw6hi861h
[ Jamie Strandboge ]
 * debian/debhelper/dh_apparmor: exit with error if aa-easyprof does not
   exist
 * debian/control: drop Depends on apparmor-easyprof to Suggests for
   dh-apparmor
[ Seth Arnold, Jamie Strandboge, Steve Beattie, John Johansen, Tyler Hicks ]
* New upstream snapshot (LP: #1278702, #1061693, #1285653) dropping very
  large Ubuntu delta and fixing the following bugs:
  - Adjust fonts abstraction for libthai (LP: #1278702)
  - Support translated XDG user directories (LP: #1061693)
  - Adjust abstractions/web-data to include /var/www/html (LP: #1285653)
    Refresh 0002-add-debian-integration-to-lighttpd.patch to include
    /etc/lighttpd/conf-available/*.conf
  - Adjust debian/libapparmor1.symbols to reflect new upstream versioning
    for the aa_query_label() function
  - Raise exceptions in Python bindings when something fails
* ship new Python replacements for previous Perl-based tools
  - debian/apparmor-utils.install: remove usr/share/perl5/Immunix/*.pm and add
    usr/sbin/aa-autodep, usr/sbin/aa-cleanprof and usr/sbin/aa-mergeprof
  - debian/control:
    + remove various Perl dependencies
    + add python-apparmor and python3-apparmor
    + python3-apparmor Breaks: apparmor-easyprof to move the file since it
      ships dist-packages/apparmor/__init__.py now
  - debian/apparmor-utils.manpages: ship new manpages for aa-cleanprof and
    aa-mergeprof
  - debian/rules: build and install Python tools
* debian/apparmor.install:
  - install apparmorfs, dovecot, kernelvars, securityfs, sys,
    and xdg-user-dirs tunables and xdg-user-dirs.d directory
* debian/apparmor.dirs:
  - install /etc/apparmor.d/tunables/xdg-user-dirs.d
* debian/apparmor.postinst: create xdg-user-dirs.d
* debian/apparmor.postrm: remove xdg-user-dirs.d
* Remaining patches:
  - 0001-add-chromium-browser.patch
  - 0002-add-debian-integration-to-lighttpd.patch
  - 0003-ubuntu-manpage-updates.patch
  - 0004-libapparmor-layout-deb.patch (renamed from 0008)
  - 0005-libapparmor-mention-dbus-method-in-getcon-man.patch (renamed from
    0068)
  - 0006-etc-writable.patch (renamed from 0070)
  - 0007-aa-utils_are_bilingual.patch (renamed from 0077)
  - 0008-remove-ptrace.patch
  - 0009-convert-to-rules.patch
  - 0010-list-fns.patch
  - 0011-parse-mode.patch
  - 0012-add-decimal-interp.patch
  - 0013-policy_mediates.patch
  - 0014-fix-failpath.patch
  - 0015-feature_file.patch
  - 0016-fix-network.patch
  - 0017-aare-to-class.patch
  - 0018-add-mediation-unix.patch
  - 0019-parser_version.patch
  - 0020-caching.patch
  - 0021-label-class.patch
  - 0022-signal.patch
  - 0023-fix-lexer-debug.patch
  - 0024-ptrace.patch
  - 0025-use-diff-encode.patch
  - 0026-fix-serialize.patch
  - 0027-fix-af.patch
  - 0028-opt_arg.patch
  - 0029-tests-cond-dbus.patch
  - 0030-tests.diff
* Move manpages from libapparmor1 to libapparmor-dev
  - debian/libapparmor-dev.manpages: install aa_change_hat.2,
    aa_change_profile.2, aa_find_mountpoint.2, aa_getcon.2
  - debian/control: libapparmor-dev Replaces: and Breaks: libapparmor1
* Move /usr/lib/python3/dist-packages/apparmor/__init__.py from
  apparmor-easyprof to python3-apparmor
  - debian/control: python3-apparmor Breaks: apparmor-easyprof
  - debian/apparmor-easyprof.install: remove
    usr/lib/python*.*/site-packages/apparmor*
* New profiles and abstractions:
  - debian/apparmor.install: tunables/dovecot, tunables/kernelvars,
    tunables/xdg-user-dirs, tunables/xdg-user-dirs.d
* Test merge from upstream new pyutils branch (rev 2385)

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
#ifndef __AA_PARSER_H
23
23
#define __AA_PARSER_H
24
24
 
 
25
 
 
26
#include <string.h>
25
27
#include <netinet/in.h>
26
28
#include <sys/resource.h>
27
29
#include "immunix.h"
28
30
#include "libapparmor_re/apparmor_re.h"
29
31
#include "libapparmor_re/aare_rules.h"
30
32
 
 
33
using namespace std;
 
34
 
 
35
#include <set>
 
36
class Profile;
 
37
 
31
38
struct mnt_ent;
32
39
 
33
40
/* Global variable to pass token to lexer.  Will be replaced by parameter
37
44
 
38
45
typedef enum pattern_t pattern_t;
39
46
 
40
 
struct flagval {
41
 
        int hat;
42
 
        int complain;
43
 
        int audit;
44
 
        int path;
 
47
struct prefixes {
 
48
        int audit;
 
49
        int deny;
 
50
        int owner;
45
51
};
46
52
 
 
53
 
47
54
struct named_transition {
48
55
        int present;
49
 
        char *namespace;
 
56
        char *ns;
50
57
        char *name;
51
58
};
52
59
 
69
76
};
70
77
 
71
78
struct cod_entry {
72
 
        char *namespace;
 
79
        char *ns;
73
80
        char *name;
74
81
        char *link_name;
75
82
        char *nt_name;
76
 
        struct codomain *codomain;      /* Special codomain defined
 
83
        Profile *prof;                  /* Special profile defined
77
84
                                         * just for this executable */
78
85
        int mode;                       /* mode is 'or' of AA_* bits */
79
86
        int audit;                      /* audit flags for mode */
108
115
        struct alt_name *next;
109
116
};
110
117
 
111
 
struct codomain {
112
 
        char *namespace;
113
 
        char *name;                             /* codomain name */
114
 
        char *attachment;
115
 
        struct alt_name *altnames;
116
 
        void *xmatch;
117
 
        size_t xmatch_size;
118
 
        int xmatch_len;
119
 
 
120
 
        /* char *sub_name; */                   /* subdomain name or NULL */
121
 
        /* int default_deny; */                 /* TRUE or FALSE */
122
 
        int local;
123
 
        int local_mode;                         /* true if local, not hat */
124
 
        int local_audit;
125
 
 
126
 
        struct codomain *parent;
127
 
 
128
 
        struct flagval flags;
129
 
 
130
 
        uint64_t capabilities;
131
 
        uint64_t audit_caps;
132
 
        uint64_t deny_caps;
133
 
        uint64_t quiet_caps;
134
 
 
135
 
        unsigned int *network_allowed;          /* array of type masks
136
 
                                                 * indexed by AF_FAMILY */
137
 
        unsigned int *audit_network;
138
 
        unsigned int *deny_network;
139
 
        unsigned int *quiet_network;
140
 
 
141
 
        struct aa_rlimits rlimits;
142
 
 
143
 
        char *exec_table[AA_EXEC_COUNT];
144
 
        struct cod_entry *entries;
145
 
        struct mnt_entry *mnt_ents;
146
 
 
147
 
        void *hat_table;
148
 
        //struct codomain *next;
149
 
 
150
 
        aare_ruleset_t *dfarules;
151
 
        int dfarule_count;
152
 
        void *dfa;
153
 
        size_t dfa_size;
154
 
 
155
 
        aare_ruleset_t *policy_rules;
156
 
        int policy_rule_count;
157
 
        void *policy_dfa;
158
 
        size_t policy_dfa_size;
159
 
};
160
 
 
161
118
struct sd_hat {
162
119
        char *hat_name;
163
120
        unsigned int hat_magic;
202
159
#define OPTION_STDOUT   4
203
160
#define OPTION_OFILE    5
204
161
 
205
 
#define AARE_NONE 0
206
 
#define AARE_DFA 2
207
 
 
208
162
#define BOOL int
209
163
 
210
 
#define FLAG_CHANGEHAT_1_4  2
211
 
#define FLAG_CHANGEHAT_1_5  3
212
 
 
213
164
extern int preprocess_only;
214
165
 
215
166
#define PATH_CHROOT_REL 0x1
260
211
                ___tmp->next = (LISTB);         \
261
212
        } while (0)
262
213
 
 
214
#define DUP_STRING(orig, new, field, fail_target) \
 
215
        do {                                                                    \
 
216
                (new)->field = ((orig)->field) ? strdup((orig)->field) : NULL;  \
 
217
                if (((orig)->field) && !((new)->field))                         \
 
218
                                goto fail_target;                               \
 
219
        } while (0)
 
220
 
263
221
/* from parser_common.c */
264
 
extern int regex_type;
265
222
extern int perms_create;
266
223
extern int net_af_max_override;
267
224
extern int kernel_load;
268
225
extern int kernel_supports_network;
269
226
extern int kernel_supports_mount;
270
 
extern int flag_changehat_version;
 
227
extern int kernel_supports_dbus;
271
228
extern int conf_verbose;
272
229
extern int conf_quiet;
273
230
extern int names_only;
274
231
extern int option;
275
232
extern int current_lineno;
276
233
extern dfaflags_t dfaflags;
277
 
extern char *progname;
 
234
extern const char *progname;
278
235
extern char *subdomainbase;
279
236
extern char *profilename;
280
 
extern char *profile_namespace;
 
237
extern char *profile_ns;
281
238
extern char *current_filename;
282
239
extern FILE *ofile;
283
240
extern int read_implies_exec;
284
 
extern void pwarn(char *fmt, ...) __attribute__((__format__(__printf__, 1, 2)));
 
241
extern void pwarn(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2)));
285
242
 
286
243
/* from parser_main (cannot be used in tst builds) */
287
244
extern int force_complain;
296
253
extern int yylex(void);
297
254
 
298
255
/* parser_include.c */
299
 
extern char *basedir;
 
256
extern const char *basedir;
300
257
 
301
258
/* parser_regex.c */
302
 
extern int process_regex(struct codomain *cod);
 
259
extern int process_regex(Profile *prof);
303
260
extern int post_process_entry(struct cod_entry *entry);
 
261
extern int process_dbus(Profile *prof);
 
262
 
304
263
extern void reset_regex(void);
305
264
 
306
 
extern int process_policydb(struct codomain *cod);
 
265
extern int process_policydb(Profile *prof);
307
266
 
308
 
extern int process_policy_ents(struct codomain *cod);
 
267
extern int process_policy_ents(Profile *prof);
309
268
 
310
269
/* parser_variable.c */
311
 
extern int process_variables(struct codomain *cod);
312
 
extern struct var_string *split_out_var(char *string);
 
270
extern int process_variables(Profile *prof);
 
271
extern struct var_string *split_out_var(const char *string);
313
272
extern void free_var_string(struct var_string *var);
314
273
 
315
274
/* parser_misc.c */
 
275
extern int is_blacklisted(const char *name, const char *path);
316
276
extern struct value_list *new_value_list(char *value);
317
277
extern struct value_list *dup_value_list(struct value_list *list);
318
278
extern void free_value_list(struct value_list *list);
319
279
extern void print_value_list(struct value_list *list);
320
280
extern struct cond_entry *new_cond_entry(char *name, int eq, struct value_list *list);
321
281
extern void free_cond_entry(struct cond_entry *ent);
 
282
extern void free_cond_list(struct cond_entry *ents);
322
283
extern void print_cond_entry(struct cond_entry *ent);
323
 
extern char *processid(char *string, int len);
324
 
extern char *processquoted(char *string, int len);
325
 
extern char *processunquoted(char *string, int len);
 
284
extern char *processid(const char *string, int len);
 
285
extern char *processquoted(const char *string, int len);
 
286
extern char *processunquoted(const char *string, int len);
326
287
extern int get_keyword_token(const char *keyword);
327
288
extern int name_to_capability(const char *keyword);
328
289
extern int get_rlimit(const char *name);
329
290
extern char *process_var(const char *var);
330
291
extern int parse_mode(const char *mode);
331
 
extern struct cod_entry *new_entry(char *namespace, char *id, int mode,
332
 
                                   char *link_id);
 
292
extern int parse_dbus_mode(const char *str_mode, int *mode, int fail);
 
293
extern struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id);
333
294
extern struct aa_network_entry *new_network_ent(unsigned int family,
334
295
                                                unsigned int type,
335
296
                                                unsigned int protocol);
338
299
                                              const char *protocol);
339
300
extern size_t get_af_max(void);
340
301
 
341
 
extern void debug_cod_list(struct codomain *list);
342
302
/* returns -1 if value != true or false, otherwise 0 == false, 1 == true */
343
303
extern int str_to_boolean(const char* str);
344
304
extern struct cod_entry *copy_cod_entry(struct cod_entry *cod);
345
305
extern void free_cod_entries(struct cod_entry *list);
346
306
extern void free_mnt_entries(struct mnt_entry *list);
 
307
extern void free_dbus_entries(struct dbus_entry *list);
 
308
extern void __debug_capabilities(uint64_t capset, const char *name);
 
309
void __debug_network(unsigned int *array, const char *name);
 
310
void debug_cod_entries(struct cod_entry *list);
 
311
 
347
312
 
348
313
/* parser_symtab.c */
349
314
struct set_value {;
362
327
 
363
328
/* parser_alias.c */
364
329
extern int new_alias(const char *from, const char *to);
365
 
extern void replace_aliases(struct codomain *cod);
 
330
extern int replace_profile_aliases(Profile *prof);
366
331
extern void free_aliases(void);
367
332
 
368
333
/* parser_merge.c */
369
 
extern int codomain_merge_rules(struct codomain *cod);
 
334
extern int profile_merge_rules(Profile *prof);
370
335
 
371
336
/* parser_interface.c */
372
337
typedef struct __sdserialize sd_serialize;
373
 
extern int load_codomain(int option, struct codomain *cod);
374
 
extern int sd_serialize_profile(sd_serialize *p, struct codomain *cod,
 
338
extern int load_profile(int option, Profile *prof);
 
339
extern int sd_serialize_profile(sd_serialize *p, Profile *prof,
375
340
                                int flatten);
376
341
extern int sd_load_buffer(int option, char *buffer, int size);
377
342
extern int cache_fd;
378
343
 
379
344
 
380
345
/* parser_policy.c */
381
 
extern void add_to_list(struct codomain *codomain);
382
 
extern void add_hat_to_policy(struct codomain *policy, struct codomain *hat);
383
 
extern void add_entry_to_policy(struct codomain *policy, struct cod_entry *entry);
384
 
extern void post_process_file_entries(struct codomain *cod);
385
 
extern void post_process_mnt_entries(struct codomain *cod);
 
346
extern void add_to_list(Profile *profile);
 
347
extern void add_hat_to_policy(Profile *policy, Profile *hat);
 
348
extern void add_entry_to_policy(Profile *policy, struct cod_entry *entry);
 
349
extern void post_process_file_entries(Profile *prof);
 
350
extern void post_process_mnt_entries(Profile *prof);
386
351
extern int post_process_policy(int debug_only);
387
 
extern int process_hat_regex(struct codomain *cod);
388
 
extern int process_hat_variables(struct codomain *cod);
389
 
extern int process_hat_policydb(struct codomain *cod);
 
352
extern int process_profile_regex(Profile *prof);
 
353
extern int process_profile_variables(Profile *prof);
 
354
extern int process_profile_policydb(Profile *prof);
390
355
extern int post_merge_rules(void);
391
 
extern int merge_hat_rules(struct codomain *cod);
392
 
extern struct codomain *merge_policy(struct codomain *a, struct codomain *b);
 
356
extern int merge_hat_rules(Profile *prof);
 
357
extern Profile *merge_policy(Profile *a, Profile *b);
393
358
extern int load_policy(int option);
394
 
extern int load_hats(sd_serialize *p, struct codomain *cod);
395
 
extern int load_flattened_hats(struct codomain *cod);
396
 
extern void free_policy(struct codomain *cod);
397
 
extern void dump_policy(void);
398
 
extern void dump_policy_hats(struct codomain *cod);
 
359
extern int load_hats(sd_serialize *p, Profile *prof);
 
360
extern int load_flattened_hats(Profile *prof, int option);
 
361
extern void dump_policy_hats(Profile *prof);
399
362
extern void dump_policy_names(void);
400
 
extern int die_if_any_regex(void);
 
363
void dump_policy(void);
 
364
 
401
365
void free_policies(void);
402
366
 
403
 
#ifdef UNIT_TEST
404
 
/* For the unit-test builds, we must include function stubs for stuff that
405
 
 * only exists in the excluded object files; everything else should live
406
 
 * in parser_common.c.
407
 
 */
408
 
 
409
 
/* parser_yacc.y */
410
 
void yyerror(const char *msg, ...)
411
 
{
412
 
        va_list arg;
413
 
        char buf[PATH_MAX];
414
 
 
415
 
        va_start(arg, msg);
416
 
        vsnprintf(buf, sizeof(buf), msg, arg);
417
 
        va_end(arg);
418
 
 
419
 
        PERROR(_("AppArmor parser error: %s\n"), buf);
420
 
 
421
 
        exit(1);
422
 
}
423
 
 
424
 
#define MY_TEST(statement, error)               \
425
 
        if (!(statement)) {                     \
426
 
                PERROR("FAIL: %s\n", error);    \
427
 
                rc = 1;                         \
428
 
        }
429
 
 
430
 
#endif
431
 
 
432
367
#endif /** __AA_PARSER_H */