*/
#include "includes.h"
+#include "smbd/smbd.h"
#include "smbd/globals.h"
-#include "../librpc/gen_ndr/cli_samr.h"
+#include "rpc_client/rpc_client.h"
+#include "../librpc/gen_ndr/ndr_samr_c.h"
#include "../librpc/gen_ndr/ndr_spoolss_c.h"
#include "rpc_client/cli_spoolss.h"
#include "rpc_client/init_spoolss.h"
#include "../librpc/gen_ndr/ndr_srvsvc_c.h"
-#include "../librpc/gen_ndr/srv_samr.h"
-#include "../librpc/gen_ndr/srv_srvsvc.h"
#include "../librpc/gen_ndr/rap.h"
#include "../lib/util/binsearch.h"
#include "../libcli/auth/libcli_auth.h"
#include "rpc_client/init_lsa.h"
-#include "rpc_server/rpc_ncacn_np.h"
#include "../libcli/security/security.h"
+#include "printing.h"
+#include "passdb/machine_sid.h"
+#include "auth.h"
+#include "rpc_server/rpc_ncacn_np.h"
#ifdef CHECK_TYPES
#undef CHECK_TYPES
}
buf = talloc_sub_advanced(ctx,
lp_servicename(SNUM(conn)),
- conn->server_info->unix_name,
+ conn->session_info->unix_name,
conn->connectpath,
- conn->server_info->utok.gid,
- conn->server_info->sanitized_username,
- conn->server_info->info3->base.domain.string,
+ conn->session_info->utok.gid,
+ conn->session_info->sanitized_username,
+ conn->session_info->info3->base.domain.string,
buf);
if (!buf) {
*p_space_remaining = 0;
}
buf = talloc_sub_advanced(ctx,
lp_servicename(SNUM(conn)),
- conn->server_info->unix_name,
+ conn->session_info->unix_name,
conn->connectpath,
- conn->server_info->utok.gid,
- conn->server_info->sanitized_username,
- conn->server_info->info3->base.domain.string,
+ conn->session_info->utok.gid,
+ conn->session_info->sanitized_username,
+ conn->session_info->info3->base.domain.string,
buf);
if (!buf) {
return 0;
{
int i;
fstring location;
- trim_string((char *)driver->driver_path, "\\print$\\WIN40\\0\\", 0);
- trim_string((char *)driver->data_file, "\\print$\\WIN40\\0\\", 0);
- trim_string((char *)driver->help_file, "\\print$\\WIN40\\0\\", 0);
+ trim_string(discard_const_p(char, driver->driver_path), "\\print$\\WIN40\\0\\", 0);
+ trim_string(discard_const_p(char, driver->data_file), "\\print$\\WIN40\\0\\", 0);
+ trim_string(discard_const_p(char, driver->help_file), "\\print$\\WIN40\\0\\", 0);
PACKI(desc, "W", 0x0400); /* don't know */
PACKS(desc, "z", driver->driver_name); /* long printer name */
for ( i=0; i<count && driver->dependent_files && *driver->dependent_files[i]; i++)
{
- trim_string((char *)driver->dependent_files[i], "\\print$\\WIN40\\0\\", 0);
+ trim_string(discard_const_p(char, driver->dependent_files[i]), "\\print$\\WIN40\\0\\", 0);
PACKS(desc,"z",driver->dependent_files[i]); /* driver files to copy */
DEBUG(3,("Dependent File: %s:\n", driver->dependent_files[i]));
}
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
subcntarr[i] = num_jobs;
subcnt += subcntarr[i];
- if (b && is_valid_policy_hnd(&handle)) {
- dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
- }
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
if (init_package(&desc,queuecnt,subcnt)) {
Get info level for a server list query.
****************************************************************************/
-static bool check_server_info(int uLevel, char* id)
+static bool check_session_info(int uLevel, char* id)
{
switch( uLevel ) {
case 0:
number of entries.
******************************************************************/
-static int get_server_info(uint32 servertype,
+static int get_session_info(uint32 servertype,
struct srv_info_struct **servers,
const char *domain)
{
alloced += 10;
*servers = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
if (!*servers) {
- DEBUG(0,("get_server_info: failed to enlarge servers info struct!\n"));
+ DEBUG(0,("get_session_info: failed to enlarge servers info struct!\n"));
TALLOC_FREE(lines);
return 0;
}
static int srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2)
{
- return StrCaseCmp(s1->name,s2->name);
+ return strcasecmp_m(s1->name,s2->name);
}
/****************************************************************************
if (!prefix_ok(str1,"WrLehD")) {
return False;
}
- if (!check_server_info(uLevel,str2)) {
+ if (!check_session_info(uLevel,str2)) {
return False;
}
DEBUG(4, ("domain [%s]\n", domain));
if (lp_browse_list()) {
- total = get_server_info(servertype,&servers,domain);
+ total = get_session_info(servertype,&servers,domain);
}
data_len = fixed_len = string_len = 0;
* the server will return a list of servers that exist on
* the network greater than or equal to the FirstNameToReturn.
*/
- int ret = StrCaseCmp(n1, n2);
+ int ret = strcasecmp_m(n1, n2);
if (ret <= 0) {
return 0;
if (strcmp(str1, "WrLehDzz") != 0) {
return false;
}
- if (!check_server_info(uLevel,str2)) {
+ if (!check_session_info(uLevel,str2)) {
return False;
}
domain, first_name));
if (lp_browse_list()) {
- total = get_server_info(servertype,&servers,domain);
+ total = get_session_info(servertype,&servers,domain);
}
data_len = fixed_len = string_len = 0;
*/
for (;first > 0;) {
int ret;
- ret = StrCaseCmp(first_name,
+ ret = strcasecmp_m(first_name,
servers[first-1].name);
if (ret > 0) {
break;
int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
int snum;
- if (!str1 || !str2 || !netname || !p) {
+ if (!str1 || !str2 || !netname_in || !p) {
return False;
}
/* Ensure all the usershares are loaded. */
become_root();
load_registry_shares();
- count = load_usershare_shares();
+ count = load_usershare_shares(sconn);
unbecome_root();
data_len = fixed_len = string_len = 0;
return false;
}
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_srvsvc.syntax_id,
- conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
uint32_t resume_handle;
struct rpc_pipe_client *samr_pipe;
struct policy_handle samr_handle, domain_handle;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b;
if (!str1 || !str2 || !p) {
return False;
return False;
}
- status = rpc_pipe_open_internal(
+ status = rpc_pipe_open_interface(
talloc_tos(), &ndr_table_samr.syntax_id,
- conn->server_info, &conn->sconn->client_id,
+ conn->session_info, &conn->sconn->client_id,
conn->sconn->msg_ctx, &samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
return false;
}
- status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
- SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
+ b = samr_pipe->binding_handle;
+
+ status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(),
+ SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
nt_errstr(status)));
return false;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
+ nt_errstr(result)));
+ return false;
+ }
- status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
+ status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
- get_global_sam_sid(), &domain_handle);
+ get_global_sam_sid(), &domain_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
nt_errstr(status)));
- rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
+ return false;
+ }
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
+ nt_errstr(result)));
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
return false;
}
struct samr_SamArray *sam_entries;
uint32_t num_entries;
- status = rpccli_samr_EnumDomainGroups(samr_pipe, talloc_tos(),
+ status = dcerpc_samr_EnumDomainGroups(b, talloc_tos(),
&domain_handle,
&resume_handle,
&sam_entries, 1,
- &num_entries);
+ &num_entries,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(10, ("rpccli_samr_EnumDomainGroups returned "
+ DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
"%s\n", nt_errstr(status)));
break;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ status = result;
+ DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
+ "%s\n", nt_errstr(result)));
+ break;
+ }
if (num_entries == 0) {
- DEBUG(10, ("rpccli_samr_EnumDomainGroups returned "
+ DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned "
"no entries -- done\n"));
break;
}
TALLOC_FREE(sam_entries);
}
- rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
- rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
*rdata_len = PTR_DIFF(p,*rdata);
struct lsa_Strings names;
struct samr_Ids type, rid;
struct samr_RidWithAttributeArray *rids;
- NTSTATUS status;
+ NTSTATUS status, result;
+ struct dcerpc_binding_handle *b;
if (!str1 || !str2 || !UserName || !p) {
return False;
p = *rdata;
endp = *rdata + *rdata_len;
- status = rpc_pipe_open_internal(
+ status = rpc_pipe_open_interface(
talloc_tos(), &ndr_table_samr.syntax_id,
- conn->server_info, &conn->sconn->client_id,
+ conn->session_info, &conn->sconn->client_id,
conn->sconn->msg_ctx, &samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
return false;
}
- status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
- SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
+ b = samr_pipe->binding_handle;
+
+ status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(),
+ SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
nt_errstr(status)));
return false;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
+ nt_errstr(result)));
+ return false;
+ }
- status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
+ status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
- get_global_sam_sid(), &domain_handle);
+ get_global_sam_sid(), &domain_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
nt_errstr(status)));
goto close_sam;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
+ nt_errstr(result)));
+ goto close_sam;
+ }
name.string = UserName;
- status = rpccli_samr_LookupNames(samr_pipe, talloc_tos(),
+ status = dcerpc_samr_LookupNames(b, talloc_tos(),
&domain_handle, 1, &name,
- &rid, &type);
+ &rid, &type,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
nt_errstr(status)));
goto close_domain;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
+ nt_errstr(result)));
+ goto close_domain;
+ }
if (type.ids[0] != SID_NAME_USER) {
DEBUG(10, ("%s is a %s, not a user\n", UserName,
goto close_domain;
}
- status = rpccli_samr_OpenUser(samr_pipe, talloc_tos(),
+ status = dcerpc_samr_OpenUser(b, talloc_tos(),
&domain_handle,
SAMR_USER_ACCESS_GET_GROUPS,
- rid.ids[0], &user_handle);
+ rid.ids[0], &user_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
nt_errstr(status)));
goto close_domain;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
+ nt_errstr(result)));
+ goto close_domain;
+ }
- status = rpccli_samr_GetGroupsForUser(samr_pipe, talloc_tos(),
- &user_handle, &rids);
+ status = dcerpc_samr_GetGroupsForUser(b, talloc_tos(),
+ &user_handle, &rids,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
nt_errstr(status)));
goto close_user;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n",
+ nt_errstr(result)));
+ goto close_user;
+ }
for (i=0; i<rids->count; i++) {
- status = rpccli_samr_LookupRids(samr_pipe, talloc_tos(),
+ status = dcerpc_samr_LookupRids(b, talloc_tos(),
&domain_handle,
1, &rids->rids[i].rid,
- &names, &type);
- if (NT_STATUS_IS_OK(status) && (names.count == 1)) {
+ &names, &type,
+ &result);
+ if (NT_STATUS_IS_OK(status) && NT_STATUS_IS_OK(result) && (names.count == 1)) {
strlcpy(p, names.names[0].string, PTR_DIFF(endp,p));
p += 21;
count++;
ret = True;
close_user:
- rpccli_samr_Close(samr_pipe, talloc_tos(), &user_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &user_handle, &result);
close_domain:
- rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
close_sam:
- rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
return ret;
}
struct rpc_pipe_client *samr_pipe;
struct policy_handle samr_handle, domain_handle;
- NTSTATUS status;
+ NTSTATUS status, result;
char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
char *endp = NULL;
+ struct dcerpc_binding_handle *b;
+
if (!str1 || !str2 || !p) {
return False;
}
p = *rdata;
endp = *rdata + *rdata_len;
- status = rpc_pipe_open_internal(
+ status = rpc_pipe_open_interface(
talloc_tos(), &ndr_table_samr.syntax_id,
- conn->server_info, &conn->sconn->client_id,
+ conn->session_info, &conn->sconn->client_id,
conn->sconn->msg_ctx, &samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
return false;
}
- status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(),
- SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle);
+ b = samr_pipe->binding_handle;
+
+ status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(),
+ SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
nt_errstr(status)));
return false;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n",
+ nt_errstr(result)));
+ return false;
+ }
- status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle,
+ status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle,
SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS,
- get_global_sam_sid(), &domain_handle);
+ get_global_sam_sid(), &domain_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
nt_errstr(status)));
- rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
+ return false;
+ }
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n",
+ nt_errstr(result)));
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
return false;
}
struct samr_SamArray *sam_entries;
uint32_t num_entries;
- status = rpccli_samr_EnumDomainUsers(samr_pipe, talloc_tos(),
+ status = dcerpc_samr_EnumDomainUsers(b, talloc_tos(),
&domain_handle,
&resume_handle,
0, &sam_entries, 1,
- &num_entries);
+ &num_entries,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(10, ("rpccli_samr_EnumDomainUsers returned "
+ DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
"%s\n", nt_errstr(status)));
break;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
+ "%s\n", nt_errstr(result)));
+ break;
+ }
if (num_entries == 0) {
- DEBUG(10, ("rpccli_samr_EnumDomainUsers returned "
+ DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned "
"no entries -- done\n"));
break;
}
TALLOC_FREE(sam_entries);
}
- rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle);
- rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle);
+ dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result);
+ dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result);
*rdata_len = PTR_DIFF(p,*rdata);
fstring user;
fstring pass1,pass2;
TALLOC_CTX *mem_ctx = talloc_tos();
- NTSTATUS status;
+ NTSTATUS status, result;
struct rpc_pipe_client *cli = NULL;
struct policy_handle connect_handle, domain_handle, user_handle;
struct lsa_String domain_name;
uint32_t rid;
int encrypted;
int min_pwd_length;
+ struct dcerpc_binding_handle *b = NULL;
/* Skip 2 strings. */
p = skip_string(param,tpscnt,np);
ZERO_STRUCT(domain_handle);
ZERO_STRUCT(user_handle);
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
- conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
goto out;
}
- status = rpccli_samr_Connect2(cli, mem_ctx,
- global_myname(),
+ b = cli->binding_handle;
+
+ status = dcerpc_samr_Connect2(b, mem_ctx,
+ lp_netbios_name(),
SAMR_ACCESS_CONNECT_TO_SERVER |
SAMR_ACCESS_ENUM_DOMAINS |
SAMR_ACCESS_LOOKUP_DOMAIN,
- &connect_handle);
+ &connect_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
init_lsa_String(&domain_name, get_global_sam_name());
- status = rpccli_samr_LookupDomain(cli, mem_ctx,
+ status = dcerpc_samr_LookupDomain(b, mem_ctx,
&connect_handle,
&domain_name,
- &domain_sid);
+ &domain_sid,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
- status = rpccli_samr_OpenDomain(cli, mem_ctx,
+ status = dcerpc_samr_OpenDomain(b, mem_ctx,
&connect_handle,
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
domain_sid,
- &domain_handle);
+ &domain_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
init_lsa_String(&names, user);
- status = rpccli_samr_LookupNames(cli, mem_ctx,
+ status = dcerpc_samr_LookupNames(b, mem_ctx,
&domain_handle,
1,
&names,
&rids,
- &types);
+ &types,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
if (rids.count != 1) {
errcode = W_ERROR_V(WERR_NO_SUCH_USER);
rid = rids.ids[0];
- status = rpccli_samr_OpenUser(cli, mem_ctx,
+ status = dcerpc_samr_OpenUser(b, mem_ctx,
&domain_handle,
SAMR_USER_ACCESS_CHANGE_PASSWORD,
rid,
- &user_handle);
+ &user_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
if (encrypted == 0) {
E_deshash(pass1, old_lm_hash.hash);
memcpy(new_lm_hash.hash, pass1, MIN(strlen(pass2), 16));
}
- status = rpccli_samr_ChangePasswordUser(cli, mem_ctx,
+ status = dcerpc_samr_ChangePasswordUser(b, mem_ctx,
&user_handle,
true, /* lm_present */
&old_lm_hash,
false, /* cross1_present */
NULL, /* nt_cross */
false, /* cross2_present */
- NULL); /* lm_cross */
+ NULL, /* lm_cross */
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
errcode = NERR_Success;
out:
- if (cli && is_valid_policy_hnd(&user_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &user_handle);
+ if (b && is_valid_policy_hnd(&user_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
}
- if (cli && is_valid_policy_hnd(&domain_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &domain_handle);
+ if (b && is_valid_policy_hnd(&domain_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
}
- if (cli && is_valid_policy_hnd(&connect_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &connect_handle);
+ if (b && is_valid_policy_hnd(&connect_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
}
memset((char *)pass1,'\0',sizeof(fstring));
char *p = get_safe_str_ptr(param,tpscnt,param,2);
TALLOC_CTX *mem_ctx = talloc_tos();
- NTSTATUS status;
+ NTSTATUS status, result;
struct rpc_pipe_client *cli = NULL;
struct lsa_AsciiString server, account;
struct samr_CryptPassword password;
struct samr_Password hash;
int errcode = NERR_badpass;
int bufsize;
+ struct dcerpc_binding_handle *b;
*rparam_len = 4;
*rparam = smb_realloc_limit(*rparam,*rparam_len);
memcpy(password.data, data, 516);
memcpy(hash.hash, data+516, 16);
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
- conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
goto out;
}
- init_lsa_AsciiString(&server, global_myname());
+ b = cli->binding_handle;
+
+ init_lsa_AsciiString(&server, lp_netbios_name());
init_lsa_AsciiString(&account, user);
- status = rpccli_samr_OemChangePasswordUser2(cli, mem_ctx,
+ status = dcerpc_samr_OemChangePasswordUser2(b, mem_ctx,
&server,
&account,
&password,
- &hash);
+ &hash,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
errcode = NERR_Success;
out:
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
p = *rdata;
p2 = p + struct_len;
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_srvsvc.syntax_id,
- conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
p += 4;
SIVAL(p,0,PTR_DIFF(p2,*rdata));
- strlcpy(p2,conn->server_info->sanitized_username,PTR_DIFF(endp,p2));
+ strlcpy(p2,conn->session_info->sanitized_username,PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
}
p += 4;
- SCVAL(p,0,lp_major_announce_version()); /* system version - e.g 4 in 4.1 */
- SCVAL(p,1,lp_minor_announce_version()); /* system version - e.g .1 in 4.1 */
+ SCVAL(p,0,SAMBA_MAJOR_NBT_ANNOUNCE_VERSION); /* system version - e.g 4 in 4.1 */
+ SCVAL(p,1,SAMBA_MINOR_NBT_ANNOUNCE_VERSION); /* system version - e.g .1 in 4.1 */
p += 2;
SIVAL(p,0,PTR_DIFF(p2,*rdata));
const char *level_string;
TALLOC_CTX *mem_ctx = talloc_tos();
- NTSTATUS status;
+ NTSTATUS status, result;
struct rpc_pipe_client *cli = NULL;
struct policy_handle connect_handle, domain_handle, user_handle;
struct lsa_String domain_name;
int errcode = W_ERROR_V(WERR_USER_NOT_FOUND);
uint32_t rid;
union samr_UserInfo *info;
+ struct dcerpc_binding_handle *b = NULL;
if (!str1 || !str2 || !UserName || !p) {
return False;
ZERO_STRUCT(domain_handle);
ZERO_STRUCT(user_handle);
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
- conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
goto out;
}
- status = rpccli_samr_Connect2(cli, mem_ctx,
- global_myname(),
+ b = cli->binding_handle;
+
+ status = dcerpc_samr_Connect2(b, mem_ctx,
+ lp_netbios_name(),
SAMR_ACCESS_CONNECT_TO_SERVER |
SAMR_ACCESS_ENUM_DOMAINS |
SAMR_ACCESS_LOOKUP_DOMAIN,
- &connect_handle);
+ &connect_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
init_lsa_String(&domain_name, get_global_sam_name());
- status = rpccli_samr_LookupDomain(cli, mem_ctx,
+ status = dcerpc_samr_LookupDomain(b, mem_ctx,
&connect_handle,
&domain_name,
- &domain_sid);
+ &domain_sid,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
- status = rpccli_samr_OpenDomain(cli, mem_ctx,
+ status = dcerpc_samr_OpenDomain(b, mem_ctx,
&connect_handle,
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
domain_sid,
- &domain_handle);
+ &domain_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
init_lsa_String(&names, UserName);
- status = rpccli_samr_LookupNames(cli, mem_ctx,
+ status = dcerpc_samr_LookupNames(b, mem_ctx,
&domain_handle,
1,
&names,
&rids,
- &types);
+ &types,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
if (rids.count != 1) {
errcode = W_ERROR_V(WERR_NO_SUCH_USER);
rid = rids.ids[0];
- status = rpccli_samr_OpenUser(cli, mem_ctx,
+ status = dcerpc_samr_OpenUser(b, mem_ctx,
&domain_handle,
SAMR_USER_ACCESS_GET_LOCALE |
SAMR_USER_ACCESS_GET_LOGONINFO |
SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP |
SEC_STD_READ_CONTROL,
rid,
- &user_handle);
+ &user_handle,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
- status = rpccli_samr_QueryUserInfo2(cli, mem_ctx,
+ status = dcerpc_samr_QueryUserInfo2(b, mem_ctx,
&user_handle,
UserAllInformation,
- &info);
+ &info,
+ &result);
if (!NT_STATUS_IS_OK(status)) {
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ if (!NT_STATUS_IS_OK(result)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(result));
+ goto out;
+ }
memset(p,0,21);
fstrcpy(p+usri11_name,UserName); /* 21 bytes - user name */
out:
*rdata_len = PTR_DIFF(p2,*rdata);
- if (cli && is_valid_policy_hnd(&user_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &user_handle);
+ if (b && is_valid_policy_hnd(&user_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
}
- if (cli && is_valid_policy_hnd(&domain_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &domain_handle);
+ if (b && is_valid_policy_hnd(&domain_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
}
- if (cli && is_valid_policy_hnd(&connect_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &connect_handle);
+ if (b && is_valid_policy_hnd(&connect_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
}
SSVAL(*rparam,0,errcode);
if(vuser != NULL) {
DEBUG(3,(" Username of UID %d is %s\n",
- (int)vuser->server_info->utok.uid,
- vuser->server_info->unix_name));
+ (int)vuser->session_info->utok.uid,
+ vuser->session_info->unix_name));
}
uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
PACKS(&desc,"z",lp_workgroup());/* domain */
PACKS(&desc,"z", vuser ?
- vuser->server_info->info3->base.logon_script.string
+ vuser->session_info->info3->base.logon_script.string
: ""); /* script path */
PACKI(&desc,"D",0x00000000); /* reserved */
}
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
status = rpc_pipe_open_interface(conn,
&ndr_table_spoolss.syntax_id,
- conn->server_info,
+ conn->session_info,
&conn->sconn->client_id,
conn->sconn->msg_ctx,
&cli);
char *p = skip_string(param,tpscnt,str2);
int uLevel;
struct pack_desc desc;
- struct sessionid *session_list;
- int i, num_sessions;
+ int i;
+
+ TALLOC_CTX *mem_ctx = talloc_tos();
+ WERROR werr;
+ NTSTATUS status;
+ struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
+ struct srvsvc_NetSessInfoCtr info_ctr;
+ uint32_t totalentries, resume_handle = 0;
+ uint32_t count = 0;
if (!str1 || !str2 || !p) {
return False;
}
- memset((char *)&desc,'\0',sizeof(desc));
+ ZERO_STRUCT(desc);
uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
return False;
}
- num_sessions = list_sessions(talloc_tos(), &session_list);
+ status = rpc_pipe_open_interface(conn,
+ &ndr_table_srvsvc.syntax_id,
+ conn->session_info,
+ &conn->sconn->client_id,
+ conn->sconn->msg_ctx,
+ &cli);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("RNetSessionEnum: could not connect to srvsvc: %s\n",
+ nt_errstr(status)));
+ desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+ goto out;
+ }
+ b = cli->binding_handle;
+
+ info_ctr.level = 1;
+ info_ctr.ctr.ctr1 = talloc_zero(talloc_tos(), struct srvsvc_NetSessCtr1);
+ if (info_ctr.ctr.ctr1 == NULL) {
+ desc.errcode = W_ERROR_V(WERR_NOMEM);
+ goto out;
+ }
+
+ status = dcerpc_srvsvc_NetSessEnum(b, mem_ctx,
+ cli->srv_name_slash,
+ NULL, /* client */
+ NULL, /* user */
+ &info_ctr,
+ (uint32_t)-1, /* max_buffer */
+ &totalentries,
+ &resume_handle,
+ &werr);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
+ nt_errstr(status)));
+ desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+ goto out;
+ }
+ if (!W_ERROR_IS_OK(werr)) {
+ DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
+ win_errstr(werr)));
+ desc.errcode = W_ERROR_V(werr);
+ goto out;
+ }
+
+ count = info_ctr.ctr.ctr1->count;
+
+ out:
if (mdrcnt > 0) {
*rdata = smb_realloc_limit(*rdata,mdrcnt);
if (!*rdata) {
return False;
}
}
- memset((char *)&desc,'\0',sizeof(desc));
+
desc.base = *rdata;
desc.buflen = mdrcnt;
desc.format = str2;
- if (!init_package(&desc,num_sessions,0)) {
+ if (!init_package(&desc, count,0)) {
return False;
}
- for(i=0; i<num_sessions; i++) {
- PACKS(&desc, "z", session_list[i].remote_machine);
- PACKS(&desc, "z", session_list[i].username);
+ for(i=0; i < count; i++) {
+ PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].client);
+ PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].user);
PACKI(&desc, "W", 1); /* num conns */
- PACKI(&desc, "W", 0); /* num opens */
+ PACKI(&desc, "W", info_ctr.ctr.ctr1->array[i].num_open);
PACKI(&desc, "W", 1); /* num users */
PACKI(&desc, "D", 0); /* session time */
PACKI(&desc, "D", 0); /* idle time */
}
SSVALS(*rparam,0,desc.errcode);
SSVAL(*rparam,2,0); /* converter */
- SSVAL(*rparam,4,num_sessions); /* count */
+ SSVAL(*rparam,4, count); /* count */
DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode));
if (api_commands[i].auth_user && lp_restrict_anonymous()) {
user_struct *user = get_valid_user_struct(req->sconn, vuid);
- if (!user || user->server_info->guest) {
+ if (!user || user->session_info->guest) {
reply_nterror(req, NT_STATUS_ACCESS_DENIED);
return;
}