/**************************************************************************** set the security descriptor for a open file ****************************************************************************/ bool cli_set_secdesc(struct cli_state *cli, uint16_t fnum, SEC_DESC *sd) { char param[8]; char *rparam=NULL, *rdata=NULL; unsigned int rparam_count=0, rdata_count=0; uint32 sec_info = 0; TALLOC_CTX *frame = talloc_stackframe(); bool ret = False; uint8 *data; size_t len; NTSTATUS status; status = marshall_sec_desc(talloc_tos(), sd, &data, &len); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("marshall_sec_desc failed: %s\n", nt_errstr(status))); goto cleanup; } SIVAL(param, 0, fnum); if (sd->dacl) sec_info |= DACL_SECURITY_INFORMATION; if (sd->owner_sid) sec_info |= OWNER_SECURITY_INFORMATION; if (sd->group_sid) sec_info |= GROUP_SECURITY_INFORMATION; SSVAL(param, 4, sec_info); if (!cli_send_nt_trans(cli, NT_TRANSACT_SET_SECURITY_DESC, 0, NULL, 0, 0, param, 8, 0, (char *)data, len, 0)) { DEBUG(1,("Failed to send NT_TRANSACT_SET_SECURITY_DESC\n")); goto cleanup; } if (!cli_receive_nt_trans(cli, &rparam, &rparam_count, &rdata, &rdata_count)) { DEBUG(1,("NT_TRANSACT_SET_SECURITY_DESC failed\n")); goto cleanup; } ret = True; cleanup: SAFE_FREE(rparam); SAFE_FREE(rdata); TALLOC_FREE(frame); return ret; }
bool set_share_security(const char *share_name, struct security_descriptor *psd) { TALLOC_CTX *frame = talloc_stackframe(); char *key; bool ret = False; TDB_DATA blob; NTSTATUS status; char *c_share_name = canonicalize_servicename(frame, share_name); if (!c_share_name) { goto out; } if (!share_info_db_init()) { goto out; } status = marshall_sec_desc(frame, psd, &blob.dptr, &blob.dsize); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("marshall_sec_desc failed: %s\n", nt_errstr(status))); goto out; } if (!(key = talloc_asprintf(frame, SHARE_SECURITY_DB_KEY_PREFIX_STR "%s", c_share_name))) { DEBUG(0, ("talloc_asprintf failed\n")); goto out; } status = dbwrap_trans_store(share_db, string_term_tdb_data(key), blob, TDB_REPLACE); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("set_share_security: Failed to store secdesc for " "%s: %s\n", share_name, nt_errstr(status))); goto out; } DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name )); ret = True; out: TALLOC_FREE(frame); return ret; }
/**************************************************************************** set the security descriptor for a open file ****************************************************************************/ NTSTATUS cli_set_security_descriptor(struct cli_state *cli, uint16_t fnum, uint32_t sec_info, const struct security_descriptor *sd) { uint8_t param[8]; uint8 *data; size_t len; NTSTATUS status; if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { return cli_smb2_set_security_descriptor(cli, fnum, sec_info, sd); } status = marshall_sec_desc(talloc_tos(), sd, &data, &len); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("marshall_sec_desc failed: %s\n", nt_errstr(status))); return status; } SIVAL(param, 0, fnum); SIVAL(param, 4, sec_info); status = cli_trans(talloc_tos(), cli, SMBnttrans, NULL, -1, /* name, fid */ NT_TRANSACT_SET_SECURITY_DESC, 0, NULL, 0, 0, /* setup */ param, 8, 0, /* param */ data, len, 0, /* data */ NULL, /* recv_flags2 */ NULL, 0, NULL, /* rsetup */ NULL, 0, NULL, /* rparam */ NULL, 0, NULL); /* rdata */ TALLOC_FREE(data); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Failed to send NT_TRANSACT_SET_SECURITY_DESC: %s\n", nt_errstr(status))); } return status; }
/**************************************************************************** set the security descriptor for a open file ****************************************************************************/ NTSTATUS cli_set_secdesc(struct cli_state *cli, uint16_t fnum, struct security_descriptor *sd) { uint8_t param[8]; uint32 sec_info = 0; uint8 *data; size_t len; NTSTATUS status; status = marshall_sec_desc(talloc_tos(), sd, &data, &len); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("marshall_sec_desc failed: %s\n", nt_errstr(status))); return status; } SIVAL(param, 0, fnum); if (sd->dacl) sec_info |= SECINFO_DACL; if (sd->owner_sid) sec_info |= SECINFO_OWNER; if (sd->group_sid) sec_info |= SECINFO_GROUP; SSVAL(param, 4, sec_info); status = cli_trans(talloc_tos(), cli, SMBnttrans, NULL, -1, /* name, fid */ NT_TRANSACT_SET_SECURITY_DESC, 0, NULL, 0, 0, /* setup */ param, 8, 0, /* param */ data, len, 0, /* data */ NULL, /* recv_flags2 */ NULL, 0, NULL, /* rsetup */ NULL, 0, NULL, /* rparam */ NULL, 0, NULL); /* rdata */ TALLOC_FREE(data); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Failed to send NT_TRANSACT_SET_SECURITY_DESC: %s\n", nt_errstr(status))); } return status; }
bool set_share_security(const char *share_name, SEC_DESC *psd) { TALLOC_CTX *frame; char *key; bool ret = False; TDB_DATA blob; NTSTATUS status; if (!share_info_db_init()) { return False; } frame = talloc_stackframe(); status = marshall_sec_desc(frame, psd, &blob.dptr, &blob.dsize); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("marshall_sec_desc failed: %s\n", nt_errstr(status))); goto out; } if (!(key = talloc_asprintf(frame, "SECDESC/%s", share_name))) { DEBUG(0, ("talloc_asprintf failed\n")); goto out; } status = dbwrap_trans_store(share_db, string_term_tdb_data(key), blob, TDB_REPLACE); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("set_share_security: Failed to store secdesc for " "%s: %s\n", share_name, nt_errstr(status))); goto out; } DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name )); ret = True; out: TALLOC_FREE(frame); return ret; }
static void fill_in_printer_values( NT_PRINTER_INFO_LEVEL_2 *info2, REGVAL_CTR *values ) { struct spoolss_DeviceMode *devmode; UNISTR2 data; char *p; uint32 printer_status = PRINTER_STATUS_OK; regval_ctr_addvalue( values, "Attributes", REG_DWORD, (char*)&info2->attributes, sizeof(info2->attributes) ); regval_ctr_addvalue( values, "Priority", REG_DWORD, (char*)&info2->priority, sizeof(info2->attributes) ); regval_ctr_addvalue( values, "ChangeID", REG_DWORD, (char*)&info2->changeid, sizeof(info2->changeid) ); regval_ctr_addvalue( values, "Default Priority", REG_DWORD, (char*)&info2->default_priority, sizeof(info2->default_priority) ); /* lie and say everything is ok since we don't want to call print_queue_length() to get the real status */ regval_ctr_addvalue( values, "Status", REG_DWORD, (char*)&printer_status, sizeof(info2->status) ); regval_ctr_addvalue( values, "StartTime", REG_DWORD, (char*)&info2->starttime, sizeof(info2->starttime) ); regval_ctr_addvalue( values, "UntilTime", REG_DWORD, (char*)&info2->untiltime, sizeof(info2->untiltime) ); /* strip the \\server\ from this string */ if ( !(p = strrchr( info2->printername, '\\' ) ) ) p = info2->printername; else p++; init_unistr2( &data, p, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Name", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->location, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Location", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->comment, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Description", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->parameters, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Parameters", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->portname, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Port", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->sharename, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Share Name", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->drivername, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Printer Driver", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->sepfile, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Separator File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, "WinPrint", UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Print Processor", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, "RAW", UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Datatype", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); /* stream the device mode */ devmode = construct_dev_mode(values,info2->sharename); if (devmode) { DATA_BLOB blob; enum ndr_err_code ndr_err; ndr_err = ndr_push_struct_blob(&blob, values, NULL, devmode, (ndr_push_flags_fn_t)ndr_push_spoolss_DeviceMode); if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { regval_ctr_addvalue(values, "Default Devmode", REG_BINARY, (const char *)blob.data, blob.length); } } /* stream the printer security descriptor */ if (info2->secdesc_buf && info2->secdesc_buf->sd && info2->secdesc_buf->sd_size) { NTSTATUS status; DATA_BLOB blob; status = marshall_sec_desc(values, info2->secdesc_buf->sd, &blob.data, &blob.length); if (NT_STATUS_IS_OK(status)) { regval_ctr_addvalue(values, "Security", REG_BINARY, (const char *)blob.data, blob.length); } } return; }