summaryrefslogtreecommitdiff
path: root/source4/lib/policy
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2007-08-26 15:16:40 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 15:02:34 -0500
commitb409d4120f9ae451f93a2322267c0f346531d9f3 (patch)
tree04ac2189f16db99537c36320a9d9e7c3c9d43b6f /source4/lib/policy
parent8e789517b723955f1530837058d5e9fe98aba19f (diff)
downloadsamba-b409d4120f9ae451f93a2322267c0f346531d9f3.tar.gz
samba-b409d4120f9ae451f93a2322267c0f346531d9f3.tar.bz2
samba-b409d4120f9ae451f93a2322267c0f346531d9f3.zip
r24667: Finally merge the registry improvements that Wilco Baan Hofman and I have
been working on for at least half a year now. Contains the following improvements: * proper layering (finally!) for the registry library. Distinction is now made between 'real' backends (local, remote, wine, etc) and the low-level hive backends (regf, creg, ldb, ...) that are only used by the local registry backend * tests for all important hive and registry operations * re-enable RPC-WINREG tests (still needs more work though, as some return values aren't checked yet) * write support for REGF files * dir backend now supports setting/reading values, creating keys * support for storing security descriptors * remove CREG backend as it was incomplete, didn't match the data model and wasn't used at all anyway * support for parsing ADM files as used by the policy editor (see lib/policy) * support for parsing PREG files (format used by .POL files) * new streaming interface for registry diffs (improves speed and memory usage for regdiff/regpatch significantly) ... and fixes a large number of bugs in the registry code (This used to be commit 7a1eec6358bc863dfc671c542b7185d3e39d7b5a)
Diffstat (limited to 'source4/lib/policy')
-rw-r--r--source4/lib/policy/adm.h48
-rw-r--r--source4/lib/policy/config.mk12
-rw-r--r--source4/lib/policy/dumpadm.c54
-rw-r--r--source4/lib/policy/lex.l142
-rw-r--r--source4/lib/policy/parse_adm.y138
5 files changed, 394 insertions, 0 deletions
diff --git a/source4/lib/policy/adm.h b/source4/lib/policy/adm.h
new file mode 100644
index 0000000000..5751261824
--- /dev/null
+++ b/source4/lib/policy/adm.h
@@ -0,0 +1,48 @@
+/*
+ Unix SMB/CIFS implementation.
+ Copyright (C) 2006 Wilco Baan Hofman <wilco@baanhofman.nl>
+ Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ADM_H__
+#define __ADM_H__
+
+struct adm_file {
+ struct adm_class *classes;
+};
+
+struct adm_class {
+ struct adm_category *categories;
+};
+
+struct adm_category {
+ struct adm_category *subcategories;
+ struct adm_policy *policies;
+};
+
+struct adm_policy {
+ struct adm_part *parts;
+
+};
+
+struct adm_part {
+
+};
+
+struct adm_file *adm_read_file(const char *);
+
+#endif /* __ADM_H__ */
diff --git a/source4/lib/policy/config.mk b/source4/lib/policy/config.mk
new file mode 100644
index 0000000000..f404d58377
--- /dev/null
+++ b/source4/lib/policy/config.mk
@@ -0,0 +1,12 @@
+[LIBRARY::LIBPOLICY]
+CFLAGS = -Iheimdal/lib/roken
+OBJ_FILES = lex.o parse_adm.o
+PRIVATE_DEPENDENCIES = LIBSAMBA-UTIL LIBSAMBA-CONFIG LIBTALLOC CHARSET
+
+lib/policy/lex.l: lib/policy/parse_adm.h
+
+lib/policy/parse_adm.h: lib/policy/parse_adm.c
+
+[BINARY::dumpadm]
+OBJ_FILES = dumpadm.o
+PRIVATE_DEPENDENCIES = LIBPOLICY LIBPOPT LIBSAMBA-CONFIG LIBTALLOC LIBSAMBA-UTIL CHARSET
diff --git a/source4/lib/policy/dumpadm.c b/source4/lib/policy/dumpadm.c
new file mode 100644
index 0000000000..aba09150d7
--- /dev/null
+++ b/source4/lib/policy/dumpadm.c
@@ -0,0 +1,54 @@
+/*
+ Unix SMB/CIFS implementation.
+ Copyright (C) 2006 Wilco Baan Hofman <wilco@baanhofman.nl>
+ Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "lib/popt/popt.h"
+#include "lib/policy/adm.h"
+
+int main(int argc, char **argv)
+{
+ BOOL ret = True;
+ poptContext pc;
+ struct poptOption long_options[] = {
+ POPT_AUTOHELP
+ { 0, 0, 0, 0 }
+ };
+
+ pc = poptGetContext(argv[0], argc, (const char **)argv, long_options, 0);
+
+ poptSetOtherOptionHelp(pc, "<ADM-FILE> ...");
+
+ while ((poptGetNextOpt(pc) != -1))
+
+ if(!poptPeekArg(pc)) {
+ poptPrintUsage(pc, stderr, 0);
+ exit(1);
+ }
+
+ while (poptPeekArg(pc)) {
+ const char *name = poptGetArg(pc);
+
+ adm_read_file(name);
+ }
+
+ poptFreeContext(pc);
+
+ return ret;
+}
diff --git a/source4/lib/policy/lex.l b/source4/lib/policy/lex.l
new file mode 100644
index 0000000000..1157bca2f7
--- /dev/null
+++ b/source4/lib/policy/lex.l
@@ -0,0 +1,142 @@
+/*
+ Unix SMB/CIFS implementation.
+ Copyright (C) 2006 Wilco Baan Hofman <wilco@baanhofman.nl>
+ Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+
+%{
+#include "includes.h"
+#include "lib/policy/parse_adm.h"
+void error_message (const char *format, ...);
+int yyparse (void);
+
+static int lineno = 1;
+static bool utf16 = false;
+
+#define YY_INPUT(buf,result,max_size) \
+{ \
+ if (utf16) { \
+ uint16_t v; \
+ if (fread(&v, 2, 1, yyin) < 1) \
+ result = YY_NULL; \
+ else \
+ result = push_codepoint(buf, v); \
+ } else { \
+ int c = getc(yyin); \
+ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
+ } \
+}
+
+%}
+
+%%
+
+ACTIONLIST { return ACTIONLIST; }
+CATEGORY { return CATEGORY; }
+CHECKBOX { return CHECKBOX; }
+CLASS { return CLASS; }
+DELETE { return DEL; }
+DEFAULT { return DEFAULT; }
+DROPDOWNLIST { return DROPDOWNLIST; }
+EDITTEXT { return EDITTEXT; }
+END { return END; }
+EXPLAIN { return EXPLAIN; }
+ITEMLIST { return ITEMLIST; }
+KEYNAME { return KEYNAME; }
+MACHINE { return MACHINE; }
+MIN { return MINIMUM; }
+MAX { return MAXIMUM; }
+NAME { return NAME; }
+NUMERIC { return NUMERIC; }
+PART { return PART; }
+POLICY { return POLICY; }
+REQUIRED { return REQUIRED; }
+SPIN { return SPIN; }
+SUPPORTED { return SUPPORTED; }
+TEXT { return TEXT; }
+USER { return USER; }
+VALUE { return VALUE; }
+VALUENAME { return VALUENAME; }
+VALUEON { return VALUEON; }
+VALUEOFF { return VALUEOFF; }
+= { return EQUALS; }
+\[strings\] { return STRINGSSECTION; }
+
+[0-9]+ {
+ char *e, *y = yytext;
+ yylval.integer = strtol((const char *)yytext, &e, 0);
+ if(e == y)
+ error_message("malformed constant (%s)", yytext);
+ else
+ return INTEGER;
+ }
+
+[A-Za-z\\{}][{}\-\\A-Za-z0-9_]* {
+ yylval.text = strdup ((const char *)yytext);
+ return LITERAL;
+ }
+
+"!!"[A-Za-z][-A-Za-z0-9_]* {
+ yylval.text = strdup ((const char *)yytext);
+ return LOOKUPLITERAL;
+ }
+[ \t]+
+\n { lineno++; }
+;[^\n]*\n { lineno++; }
+\"([^\n]+)\n { lineno++; yylval.text = strdup((const char *)yytext); return LITERAL; }
+%%
+
+#ifndef yywrap /* XXX */
+int
+yywrap ()
+{
+ return 1;
+}
+#endif
+
+
+void
+error_message (const char *format, ...)
+{
+ va_list args;
+
+ va_start (args, format);
+ fprintf (stderr, "%d:", lineno);
+ vfprintf (stderr, format, args);
+ va_end (args);
+}
+
+struct adm_file *adm_read_file(const char *file)
+{
+ uint8_t c[2];
+ yyin = fopen(file, "r");
+ if (yyin == NULL)
+ return NULL;
+
+ c[0] = getc(yyin);
+ c[1] = getc(yyin);
+ if (c[0] == 0xff && c[1] == 0xfe) {
+ utf16 = true;
+ } else {
+ rewind(yyin);
+ }
+
+ yyparse();
+
+ return NULL; /* FIXME */
+}
diff --git a/source4/lib/policy/parse_adm.y b/source4/lib/policy/parse_adm.y
new file mode 100644
index 0000000000..450625f58a
--- /dev/null
+++ b/source4/lib/policy/parse_adm.y
@@ -0,0 +1,138 @@
+/*
+ Unix SMB/CIFS implementation.
+ Copyright (C) 2006 Wilco Baan Hofman <wilco@baanhofman.nl>
+ Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ For more information on the .ADM file format:
+ http://msdn2.microsoft.com/en-us/library/aa372405.aspx
+*/
+
+%{
+#include "config.h"
+void error_message (const char *format, ...);
+int yyparse (void);
+void yyerror (const char *s);
+extern int yylex (void);
+
+%}
+
+%union {
+ char *text;
+ int integer;
+}
+
+%token CATEGORY
+%token CLASS
+%token USER
+%token MACHINE
+%token POLICY
+%token KEYNAME
+%token EXPLAIN
+%token VALUENAME
+%token VALUEON VALUEOFF
+%token PART
+%token ITEMLIST
+%token NAME
+%token VALUE
+%token NUMERIC EDITTEXT TEXT DROPDOWNLIST CHECKBOX
+%token MINIMUM MAXIMUM DEFAULT
+%token END
+%token ACTIONLIST
+%token DEL
+%token SUPPORTED
+%token <text> LITERAL
+%token <integer> INTEGER
+%token <text> LOOKUPLITERAL
+%token CLIENTEXT
+%token REQUIRED
+%token NOSORT
+%token SPIN
+%token EQUALS
+%token STRINGSSECTION
+
+%start admfile
+
+%%
+
+admfile: classes strings;
+
+classes: /* empty */ | class classes;
+
+class: CLASS classvalue categories;
+classvalue: USER|MACHINE;
+
+categories: /* empty */ | category categories;
+
+string: LITERAL | LOOKUPLITERAL;
+
+category: CATEGORY string categoryitems END CATEGORY;
+
+categoryitem: explain | category | policy | keyname;
+categoryitems: categoryitem categoryitems | /* empty */ ;
+
+policy: POLICY string policyitems END POLICY;
+policyitem: explain | keyname | valuename | valueon | valueoff | min | max | defaultvalue | supported | part;
+policyitems: policyitem policyitems | /* empty */;
+
+valuetype: NUMERIC | EDITTEXT | TEXT | DROPDOWNLIST | CHECKBOX;
+
+part: PART string valuetype partitems END PART;
+
+spin: SPIN INTEGER;
+
+partitem: keyname | valuename | valueon | valueoff | min | max | defaultvalue | itemlist | REQUIRED | spin;
+partitems: partitem partitems | /* empty */;
+
+min: MINIMUM INTEGER;
+max: MAXIMUM INTEGER;
+defaultvalue: DEFAULT INTEGER;
+
+explain: EXPLAIN string;
+value: DEL | NUMERIC INTEGER;
+
+valueon: VALUEON value;
+valueoff: VALUEOFF value;
+
+valuename: VALUENAME string;
+keyname: KEYNAME string;
+
+itemlist: ITEMLIST items END ITEMLIST;
+itemname: NAME string;
+itemvalue: VALUE value;
+
+item: itemname | itemvalue | DEFAULT | actionlist;
+items: /* empty */ | item items;
+
+supported: SUPPORTED string;
+
+actionlist: ACTIONLIST actions END ACTIONLIST;
+actions: valuename actions | itemvalue actions | /* empty */;
+
+variable: LITERAL EQUALS LITERAL;
+variables: variable variables | /* empty */;
+strings: STRINGSSECTION variables;
+
+%%
+
+void
+yyerror (const char *s)
+{
+ error_message ("%s\n", s);
+}
+
+
+