summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/profiles.c99
1 files changed, 88 insertions, 11 deletions
diff --git a/source3/utils/profiles.c b/source3/utils/profiles.c
index e5c00cf6e4..d12ddbe331 100644
--- a/source3/utils/profiles.c
+++ b/source3/utils/profiles.c
@@ -391,6 +391,8 @@ typedef struct acl_struct {
#define OFF(f) (0x1000 + (f) + 4)
+void print_sid(DOM_SID *sid);
+
/* Compare two SIDs for equality */
int compare_sid(DOM_SID *s1, DOM_SID *s2)
{
@@ -407,6 +409,45 @@ int compare_sid(DOM_SID *s1, DOM_SID *s2)
}
+/*
+ * Quick and dirty to read a SID in S-1-5-21-x-y-z-rid format and
+ * construct a DOM_SID
+ */
+int get_sid(DOM_SID *sid, char *sid_str)
+{
+ int i = 0, auth;
+ char *lstr;
+
+ if (strncmp(sid_str, "S-1-5", 5)) {
+ fprintf(stderr, "Does not conform to S-1-5...: %s\n", sid_str);
+ return 0;
+ }
+
+ /* We only allow strings of form S-1-5... */
+
+ sid->sid_rev_num = 1;
+ sid->id_auth[5] = 5;
+
+ lstr = sid_str + 5;
+
+ while (1) {
+ if (!lstr || !lstr[0] || sscanf(lstr, "-%d", &auth) == 0) {
+ if (i < 4) {
+ fprintf(stderr, "Not of form -d-d...: %s, %u\n", lstr, i);
+ return 0;
+ }
+ sid->num_auths=i;
+ print_sid(sid);
+ return 1;
+ }
+
+ sid->sub_auths[i++] = auth;
+ lstr = strchr(lstr + 1, '-');
+ }
+
+ return 1;
+}
+
/*
* Replace SID1, component by component with SID2
* Assumes will never be called with unequal length SIDS
@@ -449,12 +490,12 @@ void print_acl(ACL *acl, char *prefix)
}
}
-void usage(void)
+void usage(voi)
{
fprintf(stderr, "usage: profiles [-c <OLD-SID> -n <NEW-SID>] <profilefile>\n");
fprintf(stderr, "Version: %s\n", VERSION);
- fprintf(stderr, "\n\t-c S-1-5-21-z-y-x-oldrid provides SID to change");
- fprintf(stderr, "\n\t-n S-1-5-21-a-b-c-newrid provides SID to change to");
+ fprintf(stderr, "\n\t-c S-1-5-21-z-y-x-oldrid - provides SID to change");
+ fprintf(stderr, "\n\t-n S-1-5-21-a-b-c-newrid - provides SID to change to");
fprintf(stderr, "\n\t\tBoth must be present if the other is.");
fprintf(stderr, "\n\t\tIf neither present, just report the SIDs found\n");
}
@@ -463,7 +504,10 @@ DOM_SID old_sid, new_sid;
int main(int argc, char *argv[])
{
- int i, fd, aces, start = 0;
+ extern char *optarg;
+ extern int optind;
+ int opt;
+ int i, fd, aces, start = 0, change = 0, new = 0;
int verbose = 0;
int process_sids = 0;
void *base;
@@ -486,16 +530,49 @@ int main(int argc, char *argv[])
* Now, process the arguments
*/
- fd = open(argv[1], O_RDWR, 0000);
+ while ((opt = getopt(argc, argv, "c:n:")) != EOF) {
+ switch (opt) {
+ case 'c':
+ change = 1;
+ if (!get_sid(&old_sid, optarg)) {
+ fprintf(stderr, "Argument to -c should be a SID in form of S-1-5-...\n");
+ usage();
+ exit(254);
+ }
+ break;
+
+ case 'n':
+ new = 1;
+ if (!get_sid(&new_sid, optarg)) {
+ fprintf(stderr, "Argument to -n should be a SID in form of S-1-5-...\n");
+ usage();
+ exit(253);
+ }
+
+ break;
+
+ default:
+ usage();
+ exit(255);
+ }
+ }
+
+ if ((!change & new) || (change & !new)) {
+ fprintf(stderr, "You must specify both -c and -n if one or the other is set!\n");
+ usage();
+ exit(252);
+ }
+
+ fd = open(argv[optind], O_RDWR, 0000);
if (fd < 0) {
- fprintf(stderr, "Could not open %s: %s\n", argv[1],
+ fprintf(stderr, "Could not open %s: %s\n", argv[optind],
strerror(errno));
exit(2);
}
if (fstat(fd, &sbuf) < 0) {
- fprintf(stderr, "Could not stat file %s, %s\n", argv[1],
+ fprintf(stderr, "Could not stat file %s, %s\n", argv[optind],
strerror(errno));
exit(3);
}
@@ -508,7 +585,7 @@ int main(int argc, char *argv[])
base = mmap(&start, sbuf.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if ((int)base == -1) {
- fprintf(stderr, "Could not mmap file: %s, %s\n", argv[1],
+ fprintf(stderr, "Could not mmap file: %s, %s\n", argv[optind],
strerror(errno));
exit(4);
}
@@ -518,7 +595,7 @@ int main(int argc, char *argv[])
if (verbose) fprintf(stdout, "Registry file size: %u\n", sbuf.st_size);
if (regf_hdr->REGF_ID != REG_REGF_ID) {
- fprintf(stderr, "Incorrect Registry file (doesn't have header ID): %s\n", argv[1]);
+ fprintf(stderr, "Incorrect Registry file (doesn't have header ID): %s\n", argv[optind]);
exit(5);
}
@@ -532,7 +609,7 @@ int main(int argc, char *argv[])
*/
if (hbin_hdr->HBIN_ID != REG_HBIN_ID) {
- fprintf(stderr, "Incorrect hbin hdr: %s\n", argv[1]);
+ fprintf(stderr, "Incorrect hbin hdr: %s\n", argv[optind]);
exit(6);
}
@@ -542,7 +619,7 @@ int main(int argc, char *argv[])
nk_hdr = (NK_HDR *)(base + 0x1000 + regf_hdr->first_key + 4);
if (nk_hdr->NK_ID != REG_NK_ID) {
- fprintf(stderr, "Incorrect NK Header: %s\n", argv[1]);
+ fprintf(stderr, "Incorrect NK Header: %s\n", argv[optind]);
exit(7);
}