diff options
-rw-r--r-- | source3/sam/idmap_tdb.c | 43 | ||||
-rw-r--r-- | source3/utils/net.c | 70 | ||||
-rw-r--r-- | source3/utils/net_help.c | 3 |
3 files changed, 115 insertions, 1 deletions
diff --git a/source3/sam/idmap_tdb.c b/source3/sam/idmap_tdb.c index 01d198e8d5..ecef98d380 100644 --- a/source3/sam/idmap_tdb.c +++ b/source3/sam/idmap_tdb.c @@ -117,6 +117,47 @@ static NTSTATUS db_allocate_id(unid_t *id, int id_type) return NT_STATUS_OK; } +/* Set the HWM if necessary */ +/* This is not transaction safe, but the tdb should be locked + in db_set_mapping anyway. */ +static NTSTATUS db_adjust_hwm(unid_t id, int id_type) +{ + int32 hwm; + + switch (id_type & ID_TYPEMASK) { + case ID_USERID: + hwm = tdb_fetch_int32(idmap_tdb, HWM_USER); + if (hwm == -1) + return NT_STATUS_INTERNAL_DB_ERROR; + + if ((id.uid < hwm) || (id.uid > idmap_state.uid_high)) + return NT_STATUS_OK; + + if (tdb_store_int32(idmap_tdb, HWM_USER, id.uid+1) != 0) + return NT_STATUS_UNSUCCESSFUL; + + break; + + case ID_GROUPID: + hwm = tdb_fetch_int32(idmap_tdb, HWM_GROUP); + if (hwm == -1) + return NT_STATUS_INTERNAL_DB_ERROR; + + if ((id.gid < hwm) || (id.gid > idmap_state.gid_high)) + return NT_STATUS_OK; + + if (tdb_store_int32(idmap_tdb, HWM_GROUP, id.gid+1) != 0) + return NT_STATUS_UNSUCCESSFUL; + + break; + + default: + return NT_STATUS_INVALID_PARAMETER; + } + + return NT_STATUS_OK; +} + /* Get a sid from an id */ static NTSTATUS db_get_sid_from_id(DOM_SID *sid, unid_t id, int id_type) { @@ -283,7 +324,7 @@ static NTSTATUS db_set_mapping(const DOM_SID *sid, unid_t id, int id_type) DEBUG(0, ("idb_set_mapping: tdb_store 2 error: %s\n", tdb_errorstr(idmap_tdb))); return NT_STATUS_UNSUCCESSFUL; } - return NT_STATUS_OK; + return db_adjust_hwm(id, id_type); } /***************************************************************************** diff --git a/source3/utils/net.c b/source3/utils/net.c index d8f3264840..2b1609e225 100644 --- a/source3/utils/net.c +++ b/source3/utils/net.c @@ -376,6 +376,16 @@ static int net_idmap_dump_one_entry(TDB_CONTEXT *tdb, TDB_DATA data, void *unused) { + if (strcmp(key.dptr, "USER HWM") == 0) { + printf("USER HWM %d\n", IVAL(data.dptr,0)); + return 0; + } + + if (strcmp(key.dptr, "GROUP HWM") == 0) { + printf("GROUP HWM %d\n", IVAL(data.dptr,0)); + return 0; + } + if (strncmp(key.dptr, "S-", 2) != 0) return 0; @@ -408,6 +418,63 @@ static int net_idmap_dump(int argc, const char **argv) } /*********************************************************** + Write entries from stdin to current local idmap + **********************************************************/ +static int net_idmap_restore(int argc, const char **argv) +{ + if (!idmap_init()) { + d_printf("Could not init idmap\n"); + return -1; + } + + while (!feof(stdin)) { + fstring line, sid_string; + int len; + unid_t id; + int type = ID_EMPTY; + DOM_SID sid; + + if (fgets(line, sizeof(line)-1, stdin) == NULL) + break; + + len = strlen(line); + + if ( (len > 0) && (line[len-1] == '\n') ) + line[len-1] = '\0'; + + if (sscanf(line, "GID %d %s", &id.gid, sid_string) == 2) { + type = ID_GROUPID; + } + + if (sscanf(line, "UID %d %s", &id.uid, sid_string) == 2) { + type = ID_USERID; + } + + if (type == ID_EMPTY) { + d_printf("ignoring invalid line [%s]\n", line); + continue; + } + + if (!string_to_sid(&sid, sid_string)) { + d_printf("ignoring invalid sid [%s]\n", sid_string); + continue; + } + + if (!NT_STATUS_IS_OK(idmap_set_mapping(&sid, id, type))) { + d_printf("Could not set mapping of %s %d to sid %s\n", + (type == ID_GROUPID) ? "GID" : "UID", + (type == ID_GROUPID) ? id.gid : id.uid, + sid_string_static(&sid)); + continue; + } + + } + + idmap_close(); + return 0; +} + +/*********************************************************** Look at the current idmap **********************************************************/ static int net_idmap(int argc, const char **argv) @@ -418,6 +485,9 @@ static int net_idmap(int argc, const char **argv) if ( !StrCaseCmp( argv[0], "dump" ) ) return net_idmap_dump(argc-1, argv+1); + if ( !StrCaseCmp( argv[0], "restore" ) ) + return net_idmap_restore(argc-1, argv+1); + return net_help_idmap( argc, argv ); } diff --git a/source3/utils/net_help.c b/source3/utils/net_help.c index 16db55480e..941baf3378 100644 --- a/source3/utils/net_help.c +++ b/source3/utils/net_help.c @@ -123,6 +123,9 @@ int net_help_idmap(int argc, const char **argv) d_printf("net idmap dump filename"\ "\n Dump current id mapping\n"); + d_printf("net idmap restore"\ + "\n Restore entries from stdin to current local idmap\n"); + return -1; } |