diff options
Diffstat (limited to 'source/utils')
-rw-r--r-- | source/utils/editreg.c | 111 | ||||
-rw-r--r-- | source/utils/net_groupmap.c | 5 | ||||
-rw-r--r-- | source/utils/net_help.c | 1 | ||||
-rw-r--r-- | source/utils/net_idmap.c | 54 | ||||
-rw-r--r-- | source/utils/net_rpc.c | 81 | ||||
-rw-r--r-- | source/utils/net_rpc_printer.c | 9 | ||||
-rw-r--r-- | source/utils/net_rpc_samsync.c | 131 | ||||
-rw-r--r-- | source/utils/ntlm_auth.c | 2 | ||||
-rw-r--r-- | source/utils/pdbedit.c | 89 | ||||
-rw-r--r-- | source/utils/smbcacls.c | 12 | ||||
-rw-r--r-- | source/utils/smbget.c | 8 | ||||
-rw-r--r-- | source/utils/smbpasswd.c | 3 | ||||
-rw-r--r-- | source/utils/status.c | 36 |
13 files changed, 438 insertions, 104 deletions
diff --git a/source/utils/editreg.c b/source/utils/editreg.c index a0cfa2bb07d..9123de18c87 100644 --- a/source/utils/editreg.c +++ b/source/utils/editreg.c @@ -302,6 +302,7 @@ Hope this helps.... (Although it was "fun" for me to uncover this things, *************************************************************************/ +#ifdef STANDALONE #include <stdio.h> #include <stdlib.h> #include <errno.h> @@ -315,6 +316,10 @@ Hope this helps.... (Although it was "fun" for me to uncover this things, #define False 0 #define True 1 +#else /* STANDALAONE */ +#include "includes.h" +#endif /* STANDALONE */ + #define REG_KEY_LIST_SIZE 10 /* @@ -743,7 +748,7 @@ int nt_key_iterator(REGF *regf, REG_KEY *key_tree, int bf, const char *path, return 0; } - new_path = (char *)malloc(path_len + 1 + strlen(key_tree->name) + 1); + new_path = (char *)SMB_MALLOC(path_len + 1 + strlen(key_tree->name) + 1); if (!new_path) return 0; /* Errors? */ new_path[0] = '\0'; strcat(new_path, path); @@ -812,7 +817,7 @@ REG_KEY *nt_find_key_by_name(REG_KEY *tree, char *key) if (!tree || !key || !*key) return NULL; - lname = strdup(key); + lname = SMB_STRDUP(key); if (!lname) return NULL; /* @@ -1041,7 +1046,7 @@ void *str_to_val(int type, char *val, int *len) return (void *)val; case REG_TYPE_DWORD: - dwordp = (unsigned int *)malloc(sizeof(unsigned int)); + dwordp = SMB_MALLOC_P(unsigned int); if (!dwordp) return NULL; /* Allow for ddddd and 0xhhhhh and 0ooooo */ if (strncmp(val, "0x", 2) == 0 || strncmp(val, "0X", 2) == 0) { @@ -1096,11 +1101,11 @@ VAL_KEY *nt_add_reg_value(REG_KEY *key, char *name, int type, char *value) * If we get here, the name was not found, so insert it */ - tmp = (VAL_KEY *)malloc(sizeof(VAL_KEY)); + tmp = SMB_MALLOC_P(VAL_KEY); if (!tmp) goto error; memset(tmp, 0, sizeof(VAL_KEY)); - tmp->name = strdup(name); + tmp->name = SMB_STRDUP(name); tmp->has_name = True; if (!tmp->name) goto error; tmp->data_type = type; @@ -1113,7 +1118,7 @@ VAL_KEY *nt_add_reg_value(REG_KEY *key, char *name, int type, char *value) * Allocate some more space */ - if ((key->values = (VAL_LIST *)realloc(key->values, sizeof(VAL_LIST) + + if ((key->values = (VAL_LIST *)SMB_REALLOC_ARRAY(key->values, sizeof(VAL_LIST) + key->values->val_count - 1 + REG_KEY_LIST_SIZE))) { key->values->max_vals += REG_KEY_LIST_SIZE; @@ -1178,7 +1183,7 @@ int sid_string_to_sid(sid_t **sid, const char *sid_str) int i = 0, auth; const char *lstr; - *sid = (sid_t *)malloc(sizeof(sid_t)); + *sid = SMB_MALLOC_P(sid_t); if (!*sid) return 0; memset(*sid, 0, sizeof(sid_t)); @@ -1221,7 +1226,7 @@ ACE *nt_create_ace(int type, int flags, unsigned int perms, const char *sid) { ACE *ace; - ace = (ACE *)malloc(sizeof(ACE)); + ace = SMB_MALLOC_P(ACE); if (!ace) goto error; ace->type = type; ace->flags = flags; @@ -1243,7 +1248,7 @@ ACL *nt_create_default_acl(REGF *regf) { ACL *acl; - acl = (ACL *)malloc(sizeof(ACL) + 7*sizeof(ACE *)); + acl = (ACL *)SMB_MALLOC(sizeof(ACL) + 7*sizeof(ACE *)); if (!acl) goto error; acl->rev = 2; @@ -1282,7 +1287,7 @@ SEC_DESC *nt_create_def_sec_desc(REGF *regf) { SEC_DESC *tmp; - tmp = (SEC_DESC *)malloc(sizeof(SEC_DESC)); + tmp = SMB_MALLOC_P(SEC_DESC); if (!tmp) return NULL; tmp->rev = 1; @@ -1321,7 +1326,7 @@ KEY_SEC_DESC *nt_create_init_sec(REGF *regf) { KEY_SEC_DESC *tsec = NULL; - tsec = (KEY_SEC_DESC *)malloc(sizeof(KEY_SEC_DESC)); + tsec = SMB_MALLOC_P(KEY_SEC_DESC); if (!tsec) return NULL; tsec->ref_cnt = 1; @@ -1349,13 +1354,13 @@ REG_KEY *nt_add_reg_key_list(REGF *regf, REG_KEY *key, char * name, int create) list = key->sub_keys; if (!list) { /* Create an empty list */ - list = (KEY_LIST *)malloc(sizeof(KEY_LIST) + (REG_KEY_LIST_SIZE - 1) * sizeof(REG_KEY *)); + list = (KEY_LIST *)SMB_MALLOC(sizeof(KEY_LIST) + (REG_KEY_LIST_SIZE - 1) * sizeof(REG_KEY *)); list->key_count = 0; list->max_keys = REG_KEY_LIST_SIZE; } - lname = strdup(name); + lname = SMB_STRDUP(name); if (!lname) return NULL; c1 = lname; @@ -1382,7 +1387,7 @@ REG_KEY *nt_add_reg_key_list(REGF *regf, REG_KEY *key, char * name, int create) list->key_count++; } else { /* Create more space in the list ... */ - if (!(list = (KEY_LIST *)realloc(list, sizeof(KEY_LIST) + + if (!(list = (KEY_LIST *)SMB_REALLOC(list, sizeof(KEY_LIST) + (list->max_keys + REG_KEY_LIST_SIZE - 1) * sizeof(REG_KEY *)))) goto error; @@ -1400,11 +1405,11 @@ REG_KEY *nt_add_reg_key_list(REGF *regf, REG_KEY *key, char * name, int create) * We want to create the key, and then do the rest */ - tmp = (REG_KEY *)malloc(sizeof(REG_KEY)); + tmp = SMB_MALLOC_P(REG_KEY); memset(tmp, 0, sizeof(REG_KEY)); - tmp->name = strdup(c1); + tmp->name = SMB_STRDUP(c1); if (!tmp->name) goto error; tmp->owner = key; tmp->type = REG_SUB_KEY; @@ -1447,7 +1452,7 @@ REG_KEY *nt_add_reg_key(REGF *regf, char *name, int create) */ if (!regf || !name || !*name) return NULL; - lname = strdup(name); + lname = SMB_STRDUP(name); if (!lname) return NULL; c1 = lname; @@ -1464,10 +1469,10 @@ REG_KEY *nt_add_reg_key(REGF *regf, char *name, int create) if (!regf->root) { - tmp = (REG_KEY *)malloc(sizeof(REG_KEY)); + tmp = SMB_MALLOC_P(REG_KEY); if (!tmp) goto error; memset(tmp, 0, sizeof(REG_KEY)); - tmp->name = strdup(c1); + tmp->name = SMB_STRDUP(c1); if (!tmp->name) goto error; tmp->security = nt_create_init_sec(regf); if (!tmp->security) goto error; @@ -1638,13 +1643,13 @@ REG_KEY *nt_get_key_tree(REGF *regf, NK_HDR *nk_hdr, int size, REG_KEY *parent); static int nt_set_regf_input_file(REGF *regf, char *filename) { - return ((regf->regfile_name = strdup(filename)) != NULL); + return ((regf->regfile_name = SMB_STRDUP(filename)) != NULL); } static int nt_set_regf_output_file(REGF *regf, char *filename) { - return ((regf->outfile_name = strdup(filename)) != NULL); + return ((regf->outfile_name = SMB_STRDUP(filename)) != NULL); } /* Create a regf structure and init it */ @@ -1652,7 +1657,7 @@ int nt_set_regf_output_file(REGF *regf, char *filename) static REGF *nt_create_regf(void) { - REGF *tmp = (REGF *)malloc(sizeof(REGF)); + REGF *tmp = SMB_MALLOC_P(REGF); if (!tmp) return tmp; memset(tmp, 0, sizeof(REGF)); tmp->owner_sid_str = def_owner_sid_str; @@ -1746,7 +1751,7 @@ static SK_MAP *alloc_sk_map_entry(REGF *regf, KEY_SEC_DESC *tmp, int sk_off) { if (!regf->sk_map) { /* Allocate a block of 10 */ - regf->sk_map = (SK_MAP *)malloc(sizeof(SK_MAP) * 10); + regf->sk_map = SMB_MALLOC_ARRAY(SK_MAP, 10); if (!regf->sk_map) { free(tmp); return NULL; @@ -1759,7 +1764,7 @@ SK_MAP *alloc_sk_map_entry(REGF *regf, KEY_SEC_DESC *tmp, int sk_off) else { /* Simply allocate a new slot, unless we have to expand the list */ int ndx = regf->sk_count; if (regf->sk_count >= regf->sk_map_size) { - regf->sk_map = (SK_MAP *)realloc(regf->sk_map, + regf->sk_map = (SK_MAP *)SMB_REALLOC(regf->sk_map, (regf->sk_map_size + 10)*sizeof(SK_MAP)); if (!regf->sk_map) { free(tmp); @@ -1811,7 +1816,7 @@ KEY_SEC_DESC *lookup_create_sec_key(REGF *regf, SK_MAP *sk_map, int sk_off) return tmp; } else { /* Allocate a new one */ - tmp = (KEY_SEC_DESC *)malloc(sizeof(KEY_SEC_DESC)); + tmp = SMB_MALLOC_P(KEY_SEC_DESC); if (!tmp) { return NULL; } @@ -1831,7 +1836,7 @@ KEY_SEC_DESC *lookup_create_sec_key(REGF *regf, SK_MAP *sk_map, int sk_off) static sid_t *dup_sid(sid_t *sid) { - sid_t *tmp = (sid_t *)malloc(sizeof(sid_t)); + sid_t *tmp = SMB_MALLOC_P(sid_t); int i; if (!tmp) return NULL; @@ -1854,7 +1859,7 @@ ACE *dup_ace(REG_ACE *ace) { ACE *tmp = NULL; - tmp = (ACE *)malloc(sizeof(ACE)); + tmp = SMB_MALLOC_P(ACE); if (!tmp) return NULL; @@ -1877,7 +1882,7 @@ ACL *dup_acl(REG_ACL *acl) num_aces = IVAL(&acl->num_aces); - tmp = (ACL *)malloc(sizeof(ACL) + (num_aces - 1)*sizeof(ACE *)); + tmp = (ACL *)SMB_MALLOC(sizeof(ACL) + (num_aces - 1)*sizeof(ACE *)); if (!tmp) return NULL; tmp->num_aces = num_aces; @@ -1900,7 +1905,7 @@ SEC_DESC *process_sec_desc(REGF *regf, REG_SEC_DESC *sec_desc) { SEC_DESC *tmp = NULL; - tmp = (SEC_DESC *)malloc(sizeof(SEC_DESC)); + tmp = SMB_MALLOC_P(SEC_DESC); if (!tmp) { return NULL; @@ -1989,7 +1994,7 @@ KEY_SEC_DESC *process_sk(REGF *regf, SK_HDR *sk_hdr, int sk_off, int size) */ if (!tmp) { - tmp = (KEY_SEC_DESC *)malloc(sizeof(KEY_SEC_DESC)); + tmp = SMB_MALLOC_P(KEY_SEC_DESC); if (!tmp) return NULL; memset(tmp, 0, sizeof(KEY_SEC_DESC)); @@ -2055,7 +2060,7 @@ VAL_KEY *process_vk(REGF *regf, VK_HDR *vk_hdr, int size) dat_len = IVAL(&vk_hdr->dat_len); /* If top bit, offset contains data */ dat_off = IVAL(&vk_hdr->dat_off); - tmp = (VAL_KEY *)malloc(sizeof(VAL_KEY)); + tmp = SMB_MALLOC_P(VAL_KEY); if (!tmp) { goto error; } @@ -2065,7 +2070,7 @@ VAL_KEY *process_vk(REGF *regf, VK_HDR *vk_hdr, int size) if (flag & 0x01) { strncpy(val_name, vk_hdr->dat_name, nam_len); - tmp->name = strdup(val_name); + tmp->name = SMB_STRDUP(val_name); if (!tmp->name) { goto error; } @@ -2079,7 +2084,7 @@ VAL_KEY *process_vk(REGF *regf, VK_HDR *vk_hdr, int size) if (dat_len) { - char *dtmp = (char *)malloc(dat_len&0x7FFFFFFF); + char *dtmp = (char *)SMB_MALLOC(dat_len&0x7FFFFFFF); if (!dtmp) { goto error; @@ -2138,7 +2143,7 @@ VAL_LIST *process_vl(REGF *regf, VL_TYPE vl, int count, int size) return NULL; } - tmp = (VAL_LIST *)malloc(sizeof(VAL_LIST) + (count - 1) * sizeof(VAL_KEY *)); + tmp = (VAL_LIST *)SMB_MALLOC(sizeof(VAL_LIST) + (count - 1) * sizeof(VAL_KEY *)); if (!tmp) { goto error; } @@ -2188,7 +2193,7 @@ KEY_LIST *process_lf(REGF *regf, LF_HDR *lf_hdr, int size, REG_KEY *parent) /* Now, we should allocate a KEY_LIST struct and fill it in ... */ - tmp = (KEY_LIST *)malloc(sizeof(KEY_LIST) + (count - 1) * sizeof(REG_KEY *)); + tmp = (KEY_LIST *)SMB_MALLOC(sizeof(KEY_LIST) + (count - 1) * sizeof(REG_KEY *)); if (!tmp) { goto error; } @@ -2266,7 +2271,7 @@ REG_KEY *nt_get_key_tree(REGF *regf, NK_HDR *nk_hdr, int size, REG_KEY *parent) assert(name_len < sizeof(key_name)); /* Allocate the key struct now */ - tmp = (REG_KEY *)malloc(sizeof(REG_KEY)); + tmp = SMB_MALLOC_P(REG_KEY); if (!tmp) return tmp; memset(tmp, 0, sizeof(REG_KEY)); @@ -2277,7 +2282,7 @@ REG_KEY *nt_get_key_tree(REGF *regf, NK_HDR *nk_hdr, int size, REG_KEY *parent) if (verbose) fprintf(stdout, "Key name: %s\n", key_name); - tmp->name = strdup(key_name); + tmp->name = SMB_STRDUP(key_name); if (!tmp->name) { goto error; } @@ -2305,7 +2310,7 @@ REG_KEY *nt_get_key_tree(REGF *regf, NK_HDR *nk_hdr, int size, REG_KEY *parent) * XXX: FIXME */ - tmp->class_name = strdup(cls_name); + tmp->class_name = SMB_STRDUP(cls_name); if (!tmp->class_name) { goto error; } @@ -2493,10 +2498,10 @@ HBIN_BLK *nt_create_hbin_blk(REGF *regf, int size) size = (size + (REGF_HDR_BLKSIZ - 1)) & ~(REGF_HDR_BLKSIZ - 1); - tmp = (HBIN_BLK *)malloc(sizeof(HBIN_BLK)); + tmp = (HBIN_BLK *)SMB_MALLOC_P(HBIN_BLK); memset(tmp, 0, sizeof(HBIN_BLK)); - tmp->data = malloc(size); + tmp->data = SMB_MALLOC(size); if (!tmp->data) goto error; memset(tmp->data, 0, size); /* Make it pristine */ @@ -2983,13 +2988,13 @@ REGF_HDR *nt_get_reg_header(REGF *regf) { HBIN_BLK *tmp = NULL; - tmp = (HBIN_BLK *)malloc(sizeof(HBIN_BLK)); + tmp = SMB_MALLOC_P(HBIN_BLK); if (!tmp) return 0; memset(tmp, 0, sizeof(HBIN_BLK)); tmp->type = REG_OUTBLK_HDR; tmp->size = REGF_HDR_BLKSIZ; - tmp->data = malloc(REGF_HDR_BLKSIZ); + tmp->data = SMB_MALLOC(REGF_HDR_BLKSIZ); if (!tmp->data) goto error; memset(tmp->data, 0, REGF_HDR_BLKSIZ); /* Make it pristine, unlike Windows */ @@ -3163,7 +3168,7 @@ void print_line(struct cmd_line *cl) if (!cl) return; - if ((pl = malloc(cl->line_len + 1)) == NULL) { + if ((pl = SMB_MALLOC(cl->line_len + 1)) == NULL) { fprintf(stderr, "Unable to allocate space to print line: %s\n", strerror(errno)); exit(1); @@ -3187,7 +3192,7 @@ void print_line(struct cmd_line *cl) static struct cmd_line *get_cmd_line(int fd) { - struct cmd_line *cl = (CMD_LINE *)malloc(sizeof(CMD_LINE)); + struct cmd_line *cl = SMB_MALLOC_P(CMD_LINE); int i = 0, rc; unsigned char ch; @@ -3203,7 +3208,7 @@ struct cmd_line *get_cmd_line(int fd) * Allocate some space for the line. We extend later if needed. */ - if ((cl->line = (char *)malloc(INIT_ALLOC)) == NULL) { + if ((cl->line = (char *)SMB_MALLOC(INIT_ALLOC)) == NULL) { fprintf(stderr, "Unable to allocate initial space for line: %s\n", strerror(errno)); exit(1); @@ -3220,7 +3225,7 @@ struct cmd_line *get_cmd_line(int fd) /* * Allocate some more memory */ - if ((cl->line = realloc(cl->line, cl->len + INIT_ALLOC)) == NULL) { + if ((cl->line = SMB_REALLOC(cl->line, cl->len + INIT_ALLOC)) == NULL) { fprintf(stderr, "Unable to realloc space for line: %s\n", strerror(errno)); exit(1); @@ -3260,7 +3265,7 @@ static char *dup_str(char *s, int len) { char *nstr; - nstr = (char *)malloc(len + 1); + nstr = (char *)SMB_MALLOC(len + 1); if (nstr) { memcpy(nstr, s, len); nstr[len] = 0; @@ -3406,7 +3411,7 @@ char *parse_key(struct cmd_line *cl, int *cmd) start = 2; *cmd = CMD_DEL_KEY; } - tmp = malloc(cl->line_len - 1 - start + 1); + tmp = SMB_MALLOC(cl->line_len - 1 - start + 1); if (!tmp) return tmp; /* Bail out on no mem ... FIXME */ strncpy(tmp, &cl->line[start], cl->line_len - 1 - start); tmp[cl->line_len - 1 - start] = 0; @@ -3545,7 +3550,7 @@ CMD *regedit4_get_cmd(int fd) struct cmd_line *cl = NULL; struct val_spec_list *vl = NULL; - if ((cmd = (struct command_s *)malloc(sizeof(struct command_s))) == NULL) { + if ((cmd = SMB_MALLOC_P(struct command_s)) == NULL) { fprintf(stderr, "Unable to malloc space for command: %s\n", strerror(errno)); exit(1); @@ -3593,7 +3598,7 @@ CMD *regedit4_get_cmd(int fd) * There could be a \ on the end which we need to * handle at some time */ - vl = (struct val_spec_list *)malloc(sizeof(struct val_spec_list)); + vl = SMB_MALLOC_P(struct val_spec_list); if (!vl) goto error; vl->next = NULL; vl->val = NULL; @@ -3718,7 +3723,7 @@ CMD_FILE *cmd_file_create(char *file) return NULL; } - tmp = (CMD_FILE *)malloc(sizeof(CMD_FILE)); + tmp = SMB_MALLOC_P(CMD_FILE); if (!tmp) { return NULL; } @@ -3727,7 +3732,7 @@ CMD_FILE *cmd_file_create(char *file) * Let's fill in some of the fields; */ - tmp->name = strdup(file); + tmp->name = SMB_STRDUP(file); if ((tmp->fd = open(file, O_RDONLY, 666)) < 0) { free(tmp); @@ -3985,7 +3990,7 @@ int main(int argc, char *argv[]) break; case 'O': - def_owner_sid_str = strdup(optarg); + def_owner_sid_str = SMB_STRDUP(optarg); regf_opt += 2; if (!sid_string_to_sid(&lsid, def_owner_sid_str)) { fprintf(stderr, "Default Owner SID: %s is incorrectly formatted\n", diff --git a/source/utils/net_groupmap.c b/source/utils/net_groupmap.c index 3431196b1e6..c6391a65feb 100644 --- a/source/utils/net_groupmap.c +++ b/source/utils/net_groupmap.c @@ -113,6 +113,9 @@ static int net_groupmap_list(int argc, const char **argv) int i; fstring ntgroup = ""; fstring sid_string = ""; + + if (opt_verbose || opt_long_list_entries) + long_list = True; /* get the options */ for ( i=0; i<argc; i++ ) { @@ -689,7 +692,7 @@ static int net_groupmap_memberships(int argc, const char **argv) return -1; } - if (!pdb_enum_alias_memberships(&member, &aliases, &num)) { + if (!pdb_enum_alias_memberships(&member, 1, &aliases, &num)) { d_printf("Could not list memberships for sid %s: %s\n", argv[0], nt_errstr(result)); return -1; diff --git a/source/utils/net_help.c b/source/utils/net_help.c index cc5208b821f..8286e853216 100644 --- a/source/utils/net_help.c +++ b/source/utils/net_help.c @@ -100,6 +100,7 @@ int net_help_group(int argc, const char **argv) net_common_flags_usage(argc, argv); d_printf("\t-C or --comment=<comment>\tdescriptive comment (for add only)\n"); d_printf("\t-c or --container=<container>\tLDAP container, defaults to cn=Users (for add in ADS only)\n"); + d_printf("\t-L or --localgroup\t\tWhen adding groups, create a local group (alias)\n"); return -1; } diff --git a/source/utils/net_idmap.c b/source/utils/net_idmap.c index b4f4cdb0a8c..f7ebd94f346 100644 --- a/source/utils/net_idmap.c +++ b/source/utils/net_idmap.c @@ -235,6 +235,57 @@ static int net_idmap_restore(int argc, const char **argv) return NT_STATUS_IS_OK(net_idmap_fixup_hwm()) ? 0 : -1; } +/*********************************************************** + Delete a SID mapping from a winbindd_idmap.tdb + **********************************************************/ +static int net_idmap_delete(int argc, const char **argv) +{ + TDB_CONTEXT *idmap_tdb; + TDB_DATA key, data; + fstring sid; + + if (argc != 2) + return net_help_idmap(argc, argv); + + idmap_tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDWR, 0); + + if (idmap_tdb == NULL) { + d_printf("Could not open idmap: %s\n", argv[0]); + return -1; + } + + fstrcpy(sid, argv[1]); + + if (strncmp(sid, "S-1-5-", strlen("S-1-5-")) != 0) { + d_printf("Can only delete SIDs, %s is does not start with " + "S-1-5-\n", sid); + return -1; + } + + key.dptr = sid; + key.dsize = strlen(key.dptr)+1; + + data = tdb_fetch(idmap_tdb, key); + + if (data.dptr == NULL) { + d_printf("Could not find sid %s\n", argv[1]); + return -1; + } + + if (tdb_delete(idmap_tdb, key) != 0) { + d_printf("Could not delete key %s\n", argv[1]); + return -1; + } + + if (tdb_delete(idmap_tdb, data) != 0) { + d_printf("Could not delete key %s\n", data.dptr); + return -1; + } + + return 0; +} + + int net_help_idmap(int argc, const char **argv) { d_printf("net idmap dump filename"\ @@ -243,6 +294,8 @@ int net_help_idmap(int argc, const char **argv) d_printf("net idmap restore"\ "\n Restore entries from stdin to current local idmap\n"); + /* Deliberately *not* document net idmap delete */ + return -1; } @@ -254,6 +307,7 @@ int net_idmap(int argc, const char **argv) struct functable func[] = { {"dump", net_idmap_dump}, {"restore", net_idmap_restore}, + {"delete", net_idmap_delete}, {"help", net_help_idmap}, {NULL, NULL} }; diff --git a/source/utils/net_rpc.c b/source/utils/net_rpc.c index e40eeb44f72..4c5544aa973 100644 --- a/source/utils/net_rpc.c +++ b/source/utils/net_rpc.c @@ -3974,9 +3974,10 @@ static NTSTATUS rpc_shutdown_abort_internals(const DOM_SID *domain_sid, result = cli_shutdown_abort(cli, mem_ctx); - if (NT_STATUS_IS_OK(result)) + if (NT_STATUS_IS_OK(result)) { + d_printf("\nShutdown successfully aborted\n"); DEBUG(5,("cmd_shutdown_abort: query succeeded\n")); - else + } else DEBUG(5,("cmd_shutdown_abort: query failed\n")); return result; @@ -4009,9 +4010,10 @@ static NTSTATUS rpc_reg_shutdown_abort_internals(const DOM_SID *domain_sid, result = cli_reg_abort_shutdown(cli, mem_ctx); - if (NT_STATUS_IS_OK(result)) + if (NT_STATUS_IS_OK(result)) { + d_printf("\nShutdown successfully aborted\n"); DEBUG(5,("cmd_reg_abort_shutdown: query succeeded\n")); - else + } else DEBUG(5,("cmd_reg_abort_shutdown: query failed\n")); return result; @@ -4044,7 +4046,7 @@ static int rpc_shutdown_abort(int argc, const char **argv) } /** - * Shut down a remote RPC Server + * Shut down a remote RPC Server via initshutdown pipe * * All parameters are provided by the run_rpc_command function, except for * argc, argv which are passes through. @@ -4059,10 +4061,57 @@ static int rpc_shutdown_abort(int argc, const char **argv) * @return Normal NTSTATUS return. **/ -static NTSTATUS rpc_shutdown_internals(const DOM_SID *domain_sid, - const char *domain_name, - struct cli_state *cli, TALLOC_CTX *mem_ctx, - int argc, const char **argv) +static NTSTATUS rpc_init_shutdown_internals(const DOM_SID *domain_sid, + const char *domain_name, + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv) +{ + NTSTATUS result = NT_STATUS_UNSUCCESSFUL; + const char *msg = "This machine will be shutdown shortly"; + uint32 timeout = 20; + + if (opt_comment) { + msg = opt_comment; + } + if (opt_timeout) { + timeout = opt_timeout; + } + + /* create an entry */ + result = cli_shutdown_init(cli, mem_ctx, msg, timeout, opt_reboot, + opt_force); + + if (NT_STATUS_IS_OK(result)) { + d_printf("\nShutdown of remote machine succeeded\n"); + DEBUG(5,("Shutdown of remote machine succeeded\n")); + } else + DEBUG(0,("Shutdown of remote machine failed!\n")); + + return result; +} + +/** + * Shut down a remote RPC Server via winreg pipe + * + * All parameters are provided by the run_rpc_command function, except for + * argc, argv which are passes through. + * + * @param domain_sid The domain sid aquired from the remote server + * @param cli A cli_state connected to the server. + * @param mem_ctx Talloc context, destoyed on compleation of the function. + * @param argc Standard main() style argc + * @param argc Standard main() style argv. Initial components are already + * stripped + * + * @return Normal NTSTATUS return. + **/ + +static NTSTATUS rpc_reg_shutdown_internals(const DOM_SID *domain_sid, + const char *domain_name, + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv) { NTSTATUS result = NT_STATUS_UNSUCCESSFUL; const char *msg = "This machine will be shutdown shortly"; @@ -4102,8 +4151,10 @@ static NTSTATUS rpc_shutdown_internals(const DOM_SID *domain_sid, /* create an entry */ result = cli_reg_shutdown(cli, mem_ctx, msg, timeout, opt_reboot, opt_force); - if (NT_STATUS_IS_OK(result)) + if (NT_STATUS_IS_OK(result)) { + d_printf("\nShutdown of remote machine succeeded\n"); DEBUG(5,("Shutdown of remote machine succeeded\n")); + } else DEBUG(0,("Shutdown of remote machine failed!\n")); @@ -4122,7 +4173,15 @@ static NTSTATUS rpc_shutdown_internals(const DOM_SID *domain_sid, static int rpc_shutdown(int argc, const char **argv) { - return run_rpc_command(NULL, PI_WINREG, 0, rpc_shutdown_internals, + int rc = run_rpc_command(NULL, PI_SHUTDOWN, 0, + rpc_init_shutdown_internals, + argc, argv); + if (rc == 0) + return rc; + + DEBUG(1, ("initshutdown pipe didn't work, trying winreg pipe\n")); + + return run_rpc_command(NULL, PI_WINREG, 0, rpc_reg_shutdown_internals, argc, argv); } diff --git a/source/utils/net_rpc_printer.c b/source/utils/net_rpc_printer.c index a48fd9fb11b..456a29287fd 100644 --- a/source/utils/net_rpc_printer.c +++ b/source/utils/net_rpc_printer.c @@ -305,7 +305,7 @@ net_copy_fileattr(TALLOC_CTX *mem_ctx, int fnum_dst = 0; SEC_DESC *sd = NULL; uint16 attr; - time_t atime, ctime, mtime; + time_t f_atime, f_ctime, f_mtime; if (!copy_timestamps && !copy_acls && !copy_attrs) @@ -346,7 +346,7 @@ net_copy_fileattr(TALLOC_CTX *mem_ctx, /* get file attributes */ if (!cli_getattrE(cli_share_src, fnum_src, &attr, NULL, - &ctime, &atime, &mtime)) { + &f_ctime, &f_atime, &f_mtime)) { DEBUG(0,("failed to get file-attrs: %s\n", cli_errstr(cli_share_src))); nt_status = cli_nt_error(cli_share_src); @@ -368,7 +368,7 @@ net_copy_fileattr(TALLOC_CTX *mem_ctx, if (copy_timestamps) { /* set timestamps */ - if (!cli_setattrE(cli_share_dst, fnum_dst, ctime, atime, mtime)) { + if (!cli_setattrE(cli_share_dst, fnum_dst, f_ctime, f_atime, f_mtime)) { DEBUG(0,("failed to set file-attrs (timestamps): %s\n", cli_errstr(cli_share_dst))); nt_status = cli_nt_error(cli_share_dst); @@ -1312,7 +1312,7 @@ static NTSTATUS rpc_printer_publish_internals_args(struct cli_state *cli, TALLOC POLICY_HND hnd; BOOL got_hnd = False; WERROR result; - char *action_str; + const char *action_str; if (!get_printer_info(cli, mem_ctx, 2, argc, argv, &num_printers, &ctr)) return nt_status; @@ -1348,6 +1348,7 @@ static NTSTATUS rpc_printer_publish_internals_args(struct cli_state *cli, TALLOC action_str = "unpublished"; break; default: + action_str = "unknown action"; printf("unkown action: %d\n", action); break; } diff --git a/source/utils/net_rpc_samsync.c b/source/utils/net_rpc_samsync.c index b31087927a1..e8a110d083e 100644 --- a/source/utils/net_rpc_samsync.c +++ b/source/utils/net_rpc_samsync.c @@ -36,6 +36,45 @@ static void display_group_mem_info(uint32 rid, SAM_GROUP_MEM_INFO *g) d_printf("\n"); } + +static const char *display_time(NTTIME *nttime) +{ + static fstring string; + + float high; + float low; + int sec; + int days, hours, mins, secs; + int offset = 1; + + if (nttime->high==0 && nttime->low==0) + return "Now"; + + if (nttime->high==0x80000000 && nttime->low==0) + return "Never"; + + high = 65536; + high = high/10000; + high = high*65536; + high = high/1000; + high = high * (~nttime->high); + + low = ~nttime->low; + low = low/(1000*1000*10); + + sec=high+low; + sec+=offset; + + days=sec/(60*60*24); + hours=(sec - (days*60*60*24)) / (60*60); + mins=(sec - (days*60*60*24) - (hours*60*60) ) / 60; + secs=sec - (days*60*60*24) - (hours*60*60) - (mins*60); + + fstr_sprintf(string, "%u days, %u hours, %u minutes, %u seconds", days, hours, mins, secs); + return (string); +} + + static void display_alias_info(uint32 rid, SAM_ALIAS_INFO *a) { d_printf("Alias '%s' ", unistr2_static(&a->uni_als_name)); @@ -81,7 +120,25 @@ static void display_account_info(uint32 rid, SAM_ACCOUNT_INFO *a) static void display_domain_info(SAM_DOMAIN_INFO *a) { + time_t u_logout; + + u_logout = nt_time_to_unix_abs((NTTIME *)&a->force_logoff); + d_printf("Domain name: %s\n", unistr2_static(&a->uni_dom_name)); + + d_printf("Minimal Password Length: %d\n", a->min_pwd_len); + d_printf("Password History Length: %d\n", a->pwd_history_len); + + d_printf("Force Logoff: %d\n", (int)u_logout); + + d_printf("Max Password Age: %s\n", display_time((NTTIME *)&a->max_pwd_age)); + d_printf("Min Password Age: %s\n", display_time((NTTIME *)&a->min_pwd_age)); + + d_printf("Lockout Time: %s\n", display_time((NTTIME *)&a->account_lockout.lockout_duration)); + d_printf("Lockout Reset Time: %s\n", display_time((NTTIME *)&a->account_lockout.reset_count)); + + d_printf("Bad Attempt Lockout: %d\n", a->account_lockout.bad_attempt_lockout); + d_printf("User must logon to change password: %d\n", a->logon_chgpass); } static void display_group_info(uint32 rid, SAM_GROUP_INFO *a) @@ -322,6 +379,14 @@ sam_account_from_delta(SAM_ACCOUNT *account, SAM_ACCOUNT_INFO *delta) pdb_set_profile_path(account, new_string, PDB_CHANGED); } + if (delta->hdr_parameters.buffer) { + old_string = pdb_get_munged_dial(account); + new_string = unistr2_static(&delta->uni_parameters); + + if (STRING_CHANGED) + pdb_set_munged_dial(account, new_string, PDB_CHANGED); + } + /* User and group sid */ if (pdb_get_user_rid(account) != delta->user_rid) pdb_set_user_sid_from_rid(account, delta->user_rid, PDB_CHANGED); @@ -347,8 +412,11 @@ sam_account_from_delta(SAM_ACCOUNT *account, SAM_ACCOUNT_INFO *delta) pdb_set_logon_divs(account, delta->logon_divs, PDB_CHANGED); /* TODO: logon hours */ - /* TODO: bad password count */ - /* TODO: logon count */ + if (pdb_get_bad_password_count(account) != delta->bad_pwd_count) + pdb_set_bad_password_count(account, delta->bad_pwd_count, PDB_CHANGED); + + if (pdb_get_logon_count(account) != delta->logon_count) + pdb_set_logon_count(account, delta->logon_count, PDB_CHANGED); if (!nt_time_is_zero(&delta->pwd_last_set_time)) { unix_time = nt_time_to_unix(&delta->pwd_last_set_time); @@ -795,7 +863,7 @@ fetch_alias_mem(uint32 rid, SAM_ALIAS_MEM_INFO *delta, DOM_SID dom_sid) return NT_STATUS_NO_MEMORY; } - nt_members = talloc_zero(t, sizeof(char *) * delta->num_members); + nt_members = TALLOC_ZERO_ARRAY(t, char *, delta->num_members); for (i=0; i<delta->num_members; i++) { NTSTATUS nt_status; @@ -886,6 +954,58 @@ fetch_alias_mem(uint32 rid, SAM_ALIAS_MEM_INFO *delta, DOM_SID dom_sid) return NT_STATUS_OK; } +static NTSTATUS fetch_domain_info(uint32 rid, SAM_DOMAIN_INFO *delta) +{ + time_t u_max_age, u_min_age, u_logout, u_lockoutreset, u_lockouttime; + NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL; + pstring domname; + + u_max_age = nt_time_to_unix_abs((NTTIME *)&delta->max_pwd_age); + u_min_age = nt_time_to_unix_abs((NTTIME *)&delta->min_pwd_age); + u_logout = nt_time_to_unix_abs((NTTIME *)&delta->force_logoff); + u_lockoutreset = nt_time_to_unix_abs((NTTIME *)&delta->account_lockout.reset_count); + u_lockouttime = nt_time_to_unix_abs((NTTIME *)&delta->account_lockout.lockout_duration); + + unistr2_to_ascii(domname, &delta->uni_dom_name, sizeof(domname) - 1); + + /* we don't handle BUILTIN account policies */ + if (!strequal(domname, get_global_sam_name())) { + printf("skipping SAM_DOMAIN_INFO delta for '%s' (is not my domain)\n", domname); + return NT_STATUS_OK; + } + + + if (!account_policy_set(AP_PASSWORD_HISTORY, delta->pwd_history_len)) + return nt_status; + + if (!account_policy_set(AP_MIN_PASSWORD_LEN, delta->min_pwd_len)) + return nt_status; + + if (!account_policy_set(AP_MAX_PASSWORD_AGE, (uint32)u_max_age)) + return nt_status; + + if (!account_policy_set(AP_MIN_PASSWORD_AGE, (uint32)u_min_age)) + return nt_status; + + if (!account_policy_set(AP_TIME_TO_LOGOUT, (uint32)u_logout)) + return nt_status; + + if (!account_policy_set(AP_BAD_ATTEMPT_LOCKOUT, delta->account_lockout.bad_attempt_lockout)) + return nt_status; + + if (!account_policy_set(AP_RESET_COUNT_TIME, (uint32)u_lockoutreset/60)) + return nt_status; + + if (!account_policy_set(AP_LOCK_ACCOUNT_DURATION, (uint32)u_lockouttime/60)) + return nt_status; + + if (!account_policy_set(AP_USER_MUST_LOGON_TO_CHG_PASS, delta->logon_chgpass)) + return nt_status; + + return NT_STATUS_OK; +} + + static void fetch_sam_entry(SAM_DELTA_HDR *hdr_delta, SAM_DELTA_CTR *delta, DOM_SID dom_sid) @@ -911,10 +1031,11 @@ fetch_sam_entry(SAM_DELTA_HDR *hdr_delta, SAM_DELTA_CTR *delta, fetch_alias_mem(hdr_delta->target_rid, &delta->als_mem_info, dom_sid); break; - /* The following types are recognised but not handled */ case SAM_DELTA_DOMAIN_INFO: - d_printf("SAM_DELTA_DOMAIN_INFO not handled\n"); + fetch_domain_info(hdr_delta->target_rid, + &delta->domain_info); break; + /* The following types are recognised but not handled */ case SAM_DELTA_RENAME_GROUP: d_printf("SAM_DELTA_RENAME_GROUP not handled\n"); break; diff --git a/source/utils/ntlm_auth.c b/source/utils/ntlm_auth.c index 3d55c373558..0468b671afa 100644 --- a/source/utils/ntlm_auth.c +++ b/source/utils/ntlm_auth.c @@ -753,7 +753,7 @@ static void offer_gss_spnego_mechs(void) { /* Server negTokenInit (mech offerings) */ spnego.type = SPNEGO_NEG_TOKEN_INIT; - spnego.negTokenInit.mechTypes = SMB_XMALLOC_ARRAY(char *, 3); + spnego.negTokenInit.mechTypes = SMB_XMALLOC_ARRAY(const char *, 3); #ifdef HAVE_KRB5 spnego.negTokenInit.mechTypes[0] = smb_xstrdup(OID_KERBEROS5_OLD); spnego.negTokenInit.mechTypes[1] = smb_xstrdup(OID_NTLMSSP); diff --git a/source/utils/pdbedit.c b/source/utils/pdbedit.c index 2e8d0d6d96f..ff08642f407 100644 --- a/source/utils/pdbedit.c +++ b/source/utils/pdbedit.c @@ -26,8 +26,8 @@ #define BIT_BACKEND 0x00000004 #define BIT_VERBOSE 0x00000008 #define BIT_SPSTYLE 0x00000010 -#define BIT_RESERV_1 0x00000020 -#define BIT_RESERV_2 0x00000040 +#define BIT_CAN_CHANGE 0x00000020 +#define BIT_MUST_CHANGE 0x00000040 #define BIT_RESERV_3 0x00000080 #define BIT_FULLNAME 0x00000100 #define BIT_HOMEDIR 0x00000200 @@ -52,7 +52,7 @@ #define BIT_LOGONHOURS 0x10000000 #define MASK_ALWAYS_GOOD 0x0000001F -#define MASK_USER_GOOD 0x00401F00 +#define MASK_USER_GOOD 0x00401F60 /********************************************************* Add all currently available users to another db @@ -302,7 +302,8 @@ static int set_user_info (struct pdb_context *in, const char *username, const char *drive, const char *script, const char *profile, const char *account_control, const char *user_sid, const char *group_sid, - const BOOL badpw, const BOOL hours) + const BOOL badpw, const BOOL hours, + time_t pwd_can_change, time_t pwd_must_change) { BOOL updated_autolock = False, updated_badpw = False; SAM_ACCOUNT *sam_pwent=NULL; @@ -326,7 +327,15 @@ static int set_user_info (struct pdb_context *in, const char *username, pdb_set_hours(sam_pwent, hours_array, PDB_CHANGED); } - + + if (pwd_can_change != -1) { + pdb_set_pass_can_change_time(sam_pwent, pwd_can_change, PDB_CHANGED); + } + + if (pwd_must_change != -1) { + pdb_set_pass_must_change_time(sam_pwent, pwd_must_change, PDB_CHANGED); + } + if (!pdb_update_autolock_flag(sam_pwent, &updated_autolock)) { DEBUG(2,("pdb_update_autolock_flag failed.\n")); } @@ -650,6 +659,9 @@ int main (int argc, char **argv) BOOL account_policy_value_set = False; static BOOL badpw_reset = False; static BOOL hours_reset = False; + static char *pwd_can_change_time = NULL; + static char *pwd_must_change_time = NULL; + static char *pwd_time_format = NULL; struct pdb_context *bin; struct pdb_context *bout; @@ -682,6 +694,9 @@ int main (int argc, char **argv) {"force-initialized-passwords", 0, POPT_ARG_NONE, &force_initialised_password, 0, "Force initialization of corrupt password strings in a passdb backend", NULL}, {"bad-password-count-reset", 'z', POPT_ARG_NONE, &badpw_reset, 0, "reset bad password count", NULL}, {"logon-hours-reset", 'Z', POPT_ARG_NONE, &hours_reset, 0, "reset logon hours", NULL}, + {"pwd-can-change-time", 0, POPT_ARG_STRING, &pwd_can_change_time, 0, "Set password can change time (unix time if time format no provided)", NULL }, + {"pwd-must-change-time", 0, POPT_ARG_STRING, &pwd_must_change_time, 0, "Set password can change time (unix time if time format no provided)", NULL }, + {"time-format", 0, POPT_ARG_STRING, &pwd_time_format, 0, "The time format for time parameters", NULL }, POPT_COMMON_SAMBA POPT_TABLEEND }; @@ -736,7 +751,9 @@ int main (int argc, char **argv) (backend_in ? BIT_IMPORT : 0) + (backend_out ? BIT_EXPORT : 0) + (badpw_reset ? BIT_BADPWRESET : 0) + - (hours_reset ? BIT_LOGONHOURS : 0); + (hours_reset ? BIT_LOGONHOURS : 0) + + (pwd_can_change_time ? BIT_CAN_CHANGE: 0) + + (pwd_must_change_time ? BIT_MUST_CHANGE: 0); if (setparms & BIT_BACKEND) { if (!NT_STATUS_IS_OK(make_pdb_context_string(&bdef, backend))) { @@ -887,13 +904,71 @@ int main (int argc, char **argv) /* account modification operations */ if (!(checkparms & ~(BIT_MODIFY + BIT_USER))) { + time_t pwd_can_change = -1; + time_t pwd_must_change = -1; + char *errstr; + + if (pwd_can_change_time) { + errstr = "can"; + if (pwd_time_format) { + struct tm tm; + char *ret; + + memset(&tm, 0, sizeof(struct tm)); + ret = strptime(pwd_can_change_time, pwd_time_format, &tm); + if (ret == NULL || *ret != '\0') { + goto error; + } + + pwd_can_change = mktime(&tm); + + if (pwd_can_change == -1) { + goto error; + } + } else { /* assume it is unix time */ + errno = 0; + pwd_can_change = strtol(pwd_can_change_time, NULL, 10); + if (errno) { + goto error; + } + } + } + if (pwd_must_change_time) { + errstr = "must"; + if (pwd_time_format) { + struct tm tm; + char *ret; + + memset(&tm, 0, sizeof(struct tm)); + ret = strptime(pwd_must_change_time, pwd_time_format, &tm); + if (ret == NULL || *ret != '\0') { + goto error; + } + + pwd_must_change = mktime(&tm); + + if (pwd_must_change == -1) { + goto error; + } + } else { /* assume it is unix time */ + errno = 0; + pwd_must_change = strtol(pwd_must_change_time, NULL, 10); + if (errno) { + goto error; + } + } + } return set_user_info (bdef, user_name, full_name, home_dir, home_drive, logon_script, profile_path, account_control, user_sid, group_sid, - badpw_reset, hours_reset); + badpw_reset, hours_reset, + pwd_can_change, pwd_must_change); +error: + fprintf (stderr, "Error parsing the time in pwd-%s-change-time!\n", errstr); + return -1; } } diff --git a/source/utils/smbcacls.c b/source/utils/smbcacls.c index 3963adb9f0c..048ec8dc3ef 100644 --- a/source/utils/smbcacls.c +++ b/source/utils/smbcacls.c @@ -657,6 +657,14 @@ static int cacl_set(struct cli_state *cli, char *filename, } } + if (sd->owner_sid) { + old->owner_sid = sd->owner_sid; + } + + if (sd->grp_sid) { + old->grp_sid = sd->grp_sid; + } + break; case SMB_ACL_ADD: @@ -674,7 +682,7 @@ static int cacl_set(struct cli_state *cli, char *filename, sort_acl(old->dacl); /* Create new security descriptor and set it */ - sd = make_sec_desc(ctx,old->revision, old->type, NULL, NULL, + sd = make_sec_desc(ctx,old->revision, old->type, old->owner_sid, old->grp_sid, NULL, old->dacl, &sd_size); fnum = cli_nt_create(cli, filename, WRITE_DAC_ACCESS); @@ -761,7 +769,7 @@ static struct cli_state *connect_one(const char *share) ctx=talloc_init("main"); - /* set default debug level to 0 regardless of what smb.conf sets */ + /* set default debug level to 1 regardless of what smb.conf sets */ setup_logging( "smbcacls", True ); DEBUGLEVEL_CLASS[DBGC_ALL] = 1; dbf = x_stderr; diff --git a/source/utils/smbget.c b/source/utils/smbget.c index 64630bba8fd..2aca3001a36 100644 --- a/source/utils/smbget.c +++ b/source/utils/smbget.c @@ -128,7 +128,7 @@ int smb_download_dir(const char *base, const char *name, int resume) while(*relname == '/')relname++; mkdir(relname, 0755); - tmpname = strdup(name); + tmpname = SMB_STRDUP(name); while((dirent = smbc_readdir(dirhandle))) { char *newname; @@ -231,7 +231,7 @@ void print_progress(const char *name, time_t start, time_t now, off_t start_pos, int required = strlen(name), available = columns - len - strlen("[] "); if(required > available) asprintf(&filename, "...%s", name + required - available + 3); else filename = strndup(name, available); - } else filename = strdup(name); + } else filename = SMB_STRDUP(name); fprintf(stderr, "\r[%s] %s", filename, status); @@ -376,7 +376,7 @@ int smb_download_file(const char *base, const char *name, int recursive, int res offset_check = 0; } - readbuf = malloc(blocksize); + readbuf = SMB_MALLOC(blocksize); /* Now, download all bytes from offset_download to the end */ for(curpos = offset_download; curpos < remotestat.st_size; curpos+=blocksize) { @@ -487,7 +487,7 @@ int readrcfile(const char *name, const struct poptOption long_options[]) break; case POPT_ARG_STRING: stringdata = (char **)long_options[i].arg; - *stringdata = strdup(val); + *stringdata = SMB_STRDUP(val); break; default: fprintf(stderr, "Invalid variable %s at line %d in %s\n", var, lineno, name); diff --git a/source/utils/smbpasswd.c b/source/utils/smbpasswd.c index 74480f5fc53..90c3ce4d2e2 100644 --- a/source/utils/smbpasswd.c +++ b/source/utils/smbpasswd.c @@ -433,7 +433,8 @@ static int process_root(int local_flags) pdb_init_sam(&sampass); ret = pdb_getsampwnam(sampass, user_name); - if((sampass != False) && (pdb_get_lanman_passwd(sampass) == NULL)) { + if((ret) && + (pdb_get_lanman_passwd(sampass) == NULL)) { local_flags |= LOCAL_SET_PASSWORD; } pdb_free_sam(&sampass); diff --git a/source/utils/status.c b/source/utils/status.c index 122c6193f91..cae4e07975a 100644 --- a/source/utils/status.c +++ b/source/utils/status.c @@ -36,7 +36,7 @@ #include "includes.h" #define SMB_MAXPIDS 2048 -static pstring Ucrit_username = ""; /* added by OH */ +static uid_t Ucrit_uid = 0; /* added by OH */ static pid_t Ucrit_pid[SMB_MAXPIDS]; /* Ugly !!! */ /* added by OH */ static int Ucrit_MaxPid=0; /* added by OH */ static unsigned int Ucrit_IsActive = 0; /* added by OH */ @@ -46,24 +46,23 @@ static int shares_only = 0; /* Added by RJS */ static int locks_only = 0; /* Added by RJS */ static BOOL processes_only=False; static int show_brl; +static BOOL numeric_only = False; const char *username = NULL; /* added by OH */ -static void Ucrit_addUsername(const char *username) +static void Ucrit_addUid(uid_t uid) { - pstrcpy(Ucrit_username, username); - - if ( strlen(Ucrit_username) > 0 ) - Ucrit_IsActive = 1; + Ucrit_uid = uid; + Ucrit_IsActive = 1; } -static unsigned int Ucrit_checkUsername(const char *username) +static unsigned int Ucrit_checkUid(uid_t uid) { if ( !Ucrit_IsActive ) return 1; - if ( strcmp(Ucrit_username,username) == 0 ) + if ( uid == Ucrit_uid ) return 1; return 0; @@ -91,7 +90,7 @@ static BOOL Ucrit_addPid( pid_t pid ) if ( Ucrit_MaxPid >= SMB_MAXPIDS ) { d_printf("ERROR: More than %d pids for user %s!\n", - SMB_MAXPIDS, Ucrit_username); + SMB_MAXPIDS, uidtoname(Ucrit_uid)); return False; } @@ -538,7 +537,7 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *st if (crec.cnum == -1) return 0; - if (!process_exists(crec.pid) || !Ucrit_checkUsername(uidtoname(crec.uid))) { + if (!process_exists(crec.pid) || !Ucrit_checkUid(crec.uid)) { return 0; } @@ -553,21 +552,27 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *st static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) { struct sessionid sessionid; + fstring uid_str, gid_str; if (dbuf.dsize != sizeof(sessionid)) return 0; memcpy(&sessionid, dbuf.dptr, sizeof(sessionid)); - if (!process_exists(sessionid.pid) || !Ucrit_checkUsername(uidtoname(sessionid.uid))) { + if (!process_exists(sessionid.pid) || !Ucrit_checkUid(sessionid.uid)) { return 0; } Ucrit_addPid( sessionid.pid ); + fstr_sprintf(uid_str, "%d", sessionid.uid); + fstr_sprintf(gid_str, "%d", sessionid.gid); + d_printf("%5d %-12s %-12s %-12s (%s)\n", - (int)sessionid.pid, uidtoname(sessionid.uid), gidtoname(sessionid.gid), - sessionid.remote_machine, sessionid.hostname); + (int)sessionid.pid, + numeric_only ? uid_str : uidtoname(sessionid.uid), + numeric_only ? gid_str : gidtoname(sessionid.gid), + sessionid.remote_machine, sessionid.hostname); return 0; } @@ -594,6 +599,7 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo {"profile", 'P', POPT_ARG_NONE, &profile_only, 'P', "Do profiling" }, #endif /* WITH_PROFILE */ {"byterange", 'B', POPT_ARG_NONE, &show_brl, 'B', "Include byte range locks"}, + {"numeric", 'n', POPT_ARG_NONE, &numeric_only, 'n', "Numeric uid/gid"}, POPT_COMMON_SAMBA POPT_TABLEEND }; @@ -613,7 +619,7 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo while ((c = poptGetNextOpt(pc)) != -1) { switch (c) { case 'u': - Ucrit_addUsername(poptGetOptArg(pc)); + Ucrit_addUid(nametouid(poptGetOptArg(pc))); break; } } @@ -625,7 +631,7 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo show_shares = !(processes_only || locks_only || profile_only) || shares_only; if ( username ) - Ucrit_addUsername( username ); + Ucrit_addUid( nametouid(username) ); if (verbose) { d_printf("using configfile = %s\n", dyn_CONFIGFILE); |