diff options
Diffstat (limited to 'source3/rpc_server')
-rw-r--r-- | source3/rpc_server/srv_netlog_nt.c | 186 | ||||
-rw-r--r-- | source3/rpc_server/srv_ntsvcs_nt.c | 14 | ||||
-rw-r--r-- | source3/rpc_server/srv_pipe.c | 23 | ||||
-rw-r--r-- | source3/rpc_server/srv_samr_nt.c | 9 | ||||
-rw-r--r-- | source3/rpc_server/srv_spoolss_nt.c | 32 |
5 files changed, 158 insertions, 106 deletions
diff --git a/source3/rpc_server/srv_netlog_nt.c b/source3/rpc_server/srv_netlog_nt.c index 9169c74534..491754f76a 100644 --- a/source3/rpc_server/srv_netlog_nt.c +++ b/source3/rpc_server/srv_netlog_nt.c @@ -116,103 +116,105 @@ WERROR _netr_LogonControl2Ex(pipes_struct *p, const char *fn; switch (p->hdr_req.opnum) { - case NDR_NETR_LOGONCONTROL: - fn = "_netr_LogonControl"; - break; - case NDR_NETR_LOGONCONTROL2: - fn = "_netr_LogonControl2"; - break; - case NDR_NETR_LOGONCONTROL2EX: - fn = "_netr_LogonControl2Ex"; - break; - default: - return WERR_INVALID_PARAM; + case NDR_NETR_LOGONCONTROL: + fn = "_netr_LogonControl"; + break; + case NDR_NETR_LOGONCONTROL2: + fn = "_netr_LogonControl2"; + break; + case NDR_NETR_LOGONCONTROL2EX: + fn = "_netr_LogonControl2Ex"; + break; + default: + return WERR_INVALID_PARAM; } tc_status = WERR_NO_SUCH_DOMAIN; switch (r->in.function_code) { - case NETLOGON_CONTROL_TC_QUERY: - domain = r->in.data->domain; + case NETLOGON_CONTROL_TC_QUERY: + domain = r->in.data->domain; - if ( !is_trusted_domain( domain ) ) - break; + if (!is_trusted_domain(domain)) { + break; + } - if ( !get_dc_name( domain, NULL, dc_name2, &dc_ss ) ) { - tc_status = WERR_NO_LOGON_SERVERS; - break; - } + if (!get_dc_name(domain, NULL, dc_name2, &dc_ss)) { + tc_status = WERR_NO_LOGON_SERVERS; + break; + } - dc_name = talloc_asprintf(p->mem_ctx, "\\\\%s", dc_name2); - if (!dc_name) { - return WERR_NOMEM; - } + dc_name = talloc_asprintf(p->mem_ctx, "\\\\%s", dc_name2); + if (!dc_name) { + return WERR_NOMEM; + } - tc_status = WERR_OK; + tc_status = WERR_OK; - break; + break; - case NETLOGON_CONTROL_REDISCOVER: - domain = r->in.data->domain; + case NETLOGON_CONTROL_REDISCOVER: + domain = r->in.data->domain; - if ( !is_trusted_domain( domain ) ) - break; + if (!is_trusted_domain(domain)) { + break; + } - if ( !get_dc_name( domain, NULL, dc_name2, &dc_ss ) ) { - tc_status = WERR_NO_LOGON_SERVERS; - break; - } + if (!get_dc_name(domain, NULL, dc_name2, &dc_ss)) { + tc_status = WERR_NO_LOGON_SERVERS; + break; + } - dc_name = talloc_asprintf(p->mem_ctx, "\\\\%s", dc_name2); - if (!dc_name) { - return WERR_NOMEM; - } + dc_name = talloc_asprintf(p->mem_ctx, "\\\\%s", dc_name2); + if (!dc_name) { + return WERR_NOMEM; + } - tc_status = WERR_OK; + tc_status = WERR_OK; - break; + break; - default: - /* no idea what this should be */ - DEBUG(0,("%s: unimplemented function level [%d]\n", - fn, r->in.function_code)); - return WERR_UNKNOWN_LEVEL; + default: + /* no idea what this should be */ + DEBUG(0,("%s: unimplemented function level [%d]\n", + fn, r->in.function_code)); + return WERR_UNKNOWN_LEVEL; } /* prepare the response */ switch (r->in.level) { - case 1: - info1 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_1); - W_ERROR_HAVE_NO_MEMORY(info1); + case 1: + info1 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_1); + W_ERROR_HAVE_NO_MEMORY(info1); - info1->flags = flags; - info1->pdc_connection_status = pdc_connection_status; + info1->flags = flags; + info1->pdc_connection_status = pdc_connection_status; - r->out.query->info1 = info1; - break; - case 2: - info2 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_2); - W_ERROR_HAVE_NO_MEMORY(info2); + r->out.query->info1 = info1; + break; + case 2: + info2 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_2); + W_ERROR_HAVE_NO_MEMORY(info2); - info2->flags = flags; - info2->pdc_connection_status = pdc_connection_status; - info2->trusted_dc_name = dc_name; - info2->tc_connection_status = tc_status; + info2->flags = flags; + info2->pdc_connection_status = pdc_connection_status; + info2->trusted_dc_name = dc_name; + info2->tc_connection_status = tc_status; - r->out.query->info2 = info2; - break; - case 3: - info3 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_3); - W_ERROR_HAVE_NO_MEMORY(info3); + r->out.query->info2 = info2; + break; + case 3: + info3 = TALLOC_ZERO_P(p->mem_ctx, struct netr_NETLOGON_INFO_3); + W_ERROR_HAVE_NO_MEMORY(info3); - info3->flags = flags; - info3->logon_attempts = logon_attempts; + info3->flags = flags; + info3->logon_attempts = logon_attempts; - r->out.query->info3 = info3; - break; - default: - return WERR_UNKNOWN_LEVEL; + r->out.query->info3 = info3; + break; + default: + return WERR_UNKNOWN_LEVEL; } if (lp_server_role() == ROLE_DOMAIN_BDC) { @@ -229,20 +231,47 @@ WERROR _netr_LogonControl2Ex(pipes_struct *p, WERROR _netr_NetrEnumerateTrustedDomains(pipes_struct *p, struct netr_NetrEnumerateTrustedDomains *r) { - struct netr_Blob trusted_domains_blob; + NTSTATUS status; DATA_BLOB blob; + struct trustdom_info **domains; + uint32_t num_domains; + const char **trusted_domains; + int i; DEBUG(6,("_netr_NetrEnumerateTrustedDomains: %d\n", __LINE__)); /* set up the Trusted Domain List response */ - blob = data_blob_talloc_zero(p->mem_ctx, 2); - trusted_domains_blob.data = blob.data; - trusted_domains_blob.length = blob.length; + become_root(); + status = pdb_enum_trusteddoms(p->mem_ctx, &num_domains, &domains); + unbecome_root(); - DEBUG(6,("_netr_NetrEnumerateTrustedDomains: %d\n", __LINE__)); + if (!NT_STATUS_IS_OK(status)) { + return ntstatus_to_werror(status); + } + + trusted_domains = talloc_zero_array(p->mem_ctx, const char *, num_domains + 1); + if (!trusted_domains) { + return WERR_NOMEM; + } + + for (i = 0; i < num_domains; i++) { + trusted_domains[i] = talloc_strdup(trusted_domains, domains[i]->name); + if (!trusted_domains[i]) { + TALLOC_FREE(trusted_domains); + return WERR_NOMEM; + } + } + + if (!push_reg_multi_sz(trusted_domains, &blob, trusted_domains)) { + TALLOC_FREE(trusted_domains); + return WERR_NOMEM; + } - *r->out.trusted_domains_blob = trusted_domains_blob; + r->out.trusted_domains_blob->data = blob.data; + r->out.trusted_domains_blob->length = blob.length; + + DEBUG(6,("_netr_NetrEnumerateTrustedDomains: %d\n", __LINE__)); return WERR_OK; } @@ -252,7 +281,7 @@ WERROR _netr_NetrEnumerateTrustedDomains(pipes_struct *p, ******************************************************************/ static NTSTATUS get_md4pw(struct samr_Password *md4pw, const char *mach_acct, - uint16_t sec_chan_type, struct dom_sid *sid) + enum netr_SchannelType sec_chan_type, struct dom_sid *sid) { struct samu *sampass = NULL; const uint8 *pass; @@ -798,6 +827,7 @@ NTSTATUS _netr_ServerPasswordSet2(pipes_struct *p, struct samu *sampass; DATA_BLOB plaintext; struct samr_CryptPassword password_buf; + struct samr_Password nt_hash; become_root(); status = netr_creds_server_step_check(p, p->mem_ctx, @@ -823,6 +853,8 @@ NTSTATUS _netr_ServerPasswordSet2(pipes_struct *p, return NT_STATUS_WRONG_PASSWORD; } + mdfour(nt_hash.hash, plaintext.data, plaintext.length); + status = netr_find_machine_account(p->mem_ctx, creds->account_name, &sampass); @@ -832,8 +864,8 @@ NTSTATUS _netr_ServerPasswordSet2(pipes_struct *p, status = netr_set_machine_account_password(sampass, sampass, - &plaintext, NULL, + &nt_hash, NULL); TALLOC_FREE(sampass); return status; diff --git a/source3/rpc_server/srv_ntsvcs_nt.c b/source3/rpc_server/srv_ntsvcs_nt.c index 553707bfe5..357478f274 100644 --- a/source3/rpc_server/srv_ntsvcs_nt.c +++ b/source3/rpc_server/srv_ntsvcs_nt.c @@ -76,9 +76,8 @@ WERROR _PNP_GetDeviceList(pipes_struct *p, { char *devicepath; uint32_t size = 0; - char **multi_sz = NULL; - size_t multi_sz_len; - uint16_t *multi_sz_buf; + const char **multi_sz = NULL; + DATA_BLOB blob; if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) && (!r->in.filter)) { @@ -95,23 +94,22 @@ WERROR _PNP_GetDeviceList(pipes_struct *p, return WERR_CM_BUFFER_SMALL; } - multi_sz = talloc_zero_array(p->mem_ctx, char *, 2); + multi_sz = talloc_zero_array(p->mem_ctx, const char *, 2); if (!multi_sz) { return WERR_NOMEM; } multi_sz[0] = devicepath; - multi_sz_len = regval_build_multi_sz(multi_sz, &multi_sz_buf); - if (!multi_sz_len) { + if (!push_reg_multi_sz(multi_sz, &blob, multi_sz)) { return WERR_NOMEM; } - if (*r->in.length < multi_sz_len/2) { + if (*r->in.length < blob.length/2) { return WERR_CM_BUFFER_SMALL; } - memcpy(r->out.buffer, multi_sz_buf, multi_sz_len); + memcpy(r->out.buffer, blob.data, blob.length); return WERR_OK; } diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index 8611be49e3..a246b6db50 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -1092,6 +1092,7 @@ bool is_known_pipename(const char *cli_filename, struct ndr_syntax_id *syntax) { const char *pipename = cli_filename; int i; + NTSTATUS status; if (strnequal(pipename, "\\PIPE\\", 6)) { pipename += 5; @@ -1113,7 +1114,27 @@ bool is_known_pipename(const char *cli_filename, struct ndr_syntax_id *syntax) } } - DEBUG(10, ("is_known_pipename: %s unknown\n", cli_filename)); + status = smb_probe_module("rpc", pipename); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(10, ("is_known_pipename: %s unknown\n", cli_filename)); + return false; + } + DEBUG(10, ("is_known_pipename: %s loaded dynamically\n", pipename)); + + /* + * Scan the list again for the interface id + */ + + for (i=0; i<rpc_lookup_size; i++) { + if (strequal(pipename, rpc_lookup[i].pipe.clnt)) { + *syntax = rpc_lookup[i].rpc_interface; + return true; + } + } + + DEBUG(10, ("is_known_pipename: pipe %s did not register itself!\n", + pipename)); + return false; } diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c index 9e95c48033..10b7d42d46 100644 --- a/source3/rpc_server/srv_samr_nt.c +++ b/source3/rpc_server/srv_samr_nt.c @@ -2023,9 +2023,9 @@ NTSTATUS _samr_ChangePasswordUser3(pipes_struct *p, NTSTATUS status; fstring user_name; const char *wks = NULL; - uint32 reject_reason; + enum samPwdChangeReason reject_reason; struct samr_DomInfo1 *dominfo = NULL; - struct samr_ChangeReject *reject = NULL; + struct userPwdChangeFailureInformation *reject = NULL; uint32_t tmp; DEBUG(5,("_samr_ChangePasswordUser3: %d\n", __LINE__)); @@ -2070,7 +2070,8 @@ NTSTATUS _samr_ChangePasswordUser3(pipes_struct *p, return NT_STATUS_NO_MEMORY; } - reject = TALLOC_ZERO_P(p->mem_ctx, struct samr_ChangeReject); + reject = TALLOC_ZERO_P(p->mem_ctx, + struct userPwdChangeFailureInformation); if (!reject) { return NT_STATUS_NO_MEMORY; } @@ -2105,7 +2106,7 @@ NTSTATUS _samr_ChangePasswordUser3(pipes_struct *p, dominfo->password_properties |= DOMAIN_PASSWORD_COMPLEX; } - reject->reason = reject_reason; + reject->extendedFailureReason = reject_reason; *r->out.dominfo = dominfo; *r->out.reject = reject; diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index a81b5772c0..682a59b5a8 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -6074,7 +6074,7 @@ static WERROR update_printer(pipes_struct *p, struct policy_handle *handle, NT_PRINTER_INFO_LEVEL *printer = NULL, *old_printer = NULL; Printer_entry *Printer = find_printer_index_by_hnd(p, handle); WERROR result; - UNISTR2 buffer; + DATA_BLOB buffer; fstring asc_buffer; DEBUG(8,("update_printer\n")); @@ -6184,17 +6184,17 @@ static WERROR update_printer(pipes_struct *p, struct policy_handle *handle, */ if (!strequal(printer->info_2->comment, old_printer->info_2->comment)) { - init_unistr2( &buffer, printer->info_2->comment, UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, printer->info_2->comment); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "description", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); notify_printer_comment(snum, printer->info_2->comment); } if (!strequal(printer->info_2->sharename, old_printer->info_2->sharename)) { - init_unistr2( &buffer, printer->info_2->sharename, UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, printer->info_2->sharename); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "shareName", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); notify_printer_sharename(snum, printer->info_2->sharename); } @@ -6208,25 +6208,25 @@ static WERROR update_printer(pipes_struct *p, struct policy_handle *handle, pname = printer->info_2->printername; - init_unistr2( &buffer, pname, UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, pname); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "printerName", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); notify_printer_printername( snum, pname ); } if (!strequal(printer->info_2->portname, old_printer->info_2->portname)) { - init_unistr2( &buffer, printer->info_2->portname, UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, printer->info_2->portname); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "portName", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); notify_printer_port(snum, printer->info_2->portname); } if (!strequal(printer->info_2->location, old_printer->info_2->location)) { - init_unistr2( &buffer, printer->info_2->location, UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, printer->info_2->location); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "location", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); notify_printer_location(snum, printer->info_2->location); } @@ -6234,17 +6234,17 @@ static WERROR update_printer(pipes_struct *p, struct policy_handle *handle, /* here we need to update some more DsSpooler keys */ /* uNCName, serverName, shortServerName */ - init_unistr2( &buffer, global_myname(), UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, global_myname()); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "serverName", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "shortServerName", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); slprintf( asc_buffer, sizeof(asc_buffer)-1, "\\\\%s\\%s", global_myname(), printer->info_2->sharename ); - init_unistr2( &buffer, asc_buffer, UNI_STR_TERMINATE); + push_reg_sz(talloc_tos(), &buffer, asc_buffer); set_printer_dataex( printer, SPOOL_DSSPOOLER_KEY, "uNCName", - REG_SZ, (uint8_t *)buffer.buffer, buffer.uni_str_len*2 ); + REG_SZ, buffer.data, buffer.length); /* Update printer info */ result = mod_a_printer(printer, 2); |