-/*
+/*
Unix SMB/CIFS implementation.
Inter-process communication and named pipe handling
Copyright (C) Andrew Tridgell 1992-1998
*/
#include "includes.h"
+#include "smbd/smbd.h"
#include "smbd/globals.h"
-#include "../librpc/gen_ndr/cli_samr.h"
-#include "../librpc/gen_ndr/cli_spoolss.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/cli_srvsvc.h"
-#include "../librpc/gen_ndr/srv_samr.h"
-#include "../librpc/gen_ndr/srv_srvsvc.h"
+#include "../librpc/gen_ndr/ndr_srvsvc_c.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 "../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
return val;
}
-static bool api_Unsupported(connection_struct *conn, uint16 vuid,
+static bool api_Unsupported(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt, int mprcnt,
char **rdata, char **rparam,
int *rdata_len, int *rparam_len);
-static bool api_TooSmall(connection_struct *conn, uint16 vuid, char *param, char *data,
+static bool api_TooSmall(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid, char *param, char *data,
int mdrcnt, int mprcnt,
char **rdata, char **rparam,
int *rdata_len, int *rparam_len);
*p_space_remaining = 0;
return 0;
}
- buf = talloc_string_sub(ctx, buf,"%S",lp_servicename(snum));
+ buf = talloc_string_sub(ctx, buf,"%S", lp_servicename(ctx, snum));
if (!buf) {
*p_space_remaining = 0;
return 0;
}
buf = talloc_sub_advanced(ctx,
- lp_servicename(SNUM(conn)),
- conn->server_info->unix_name,
+ lp_servicename(ctx, SNUM(conn)),
+ conn->session_info->unix_info->unix_name,
conn->connectpath,
- conn->server_info->utok.gid,
- conn->server_info->sanitized_username,
- pdb_get_domain(conn->server_info->sam_account),
+ conn->session_info->unix_token->gid,
+ conn->session_info->unix_info->sanitized_username,
+ conn->session_info->info->domain_name,
buf);
if (!buf) {
*p_space_remaining = 0;
return 0;
}
l = push_ascii(*dst,buf,*p_space_remaining, STR_TERMINATE);
- if (l == -1) {
+ if (l == 0) {
return 0;
}
(*dst) += l;
return 0;
}
l = push_ascii(*dst,src,*n, STR_TERMINATE);
- if (l == -1) {
+ if (l == 0) {
return 0;
}
(*dst) += l;
if (!buf) {
return 0;
}
- buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(snum));
+ buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(ctx, snum));
if (!buf) {
return 0;
}
buf = talloc_sub_advanced(ctx,
- lp_servicename(SNUM(conn)),
- conn->server_info->unix_name,
+ lp_servicename(ctx, SNUM(conn)),
+ conn->session_info->unix_info->unix_name,
conn->connectpath,
- conn->server_info->utok.gid,
- conn->server_info->sanitized_username,
- pdb_get_domain(conn->server_info->sam_account),
+ conn->session_info->unix_token->gid,
+ conn->session_info->unix_info->sanitized_username,
+ conn->session_info->info->domain_name,
buf);
if (!buf) {
return 0;
int buflen; /* remaining size for fixed part; on init: length of base */
int subcount; /* count of substructures */
char *structbuf; /* pointer into buffer for remaining fixed part */
- int stringlen; /* remaining size for variable part */
+ int stringlen; /* remaining size for variable part */
char *stringbuf; /* pointer into buffer for remaining variable part */
int neededlen; /* total needed size */
int usedlen; /* total used size (usedlen <= neededlen and usedlen <= buflen) */
int needed=0, stringneeded;
const char *str=NULL;
int is_string=0, stringused;
- int32 temp;
+ int32_t temp;
va_start(args,p);
{
char *s = va_arg(args,char*);
if (p->buflen >= needed) {
- StrnCpy(p->structbuf,s?s:"",needed-1);
+ strlcpy(p->structbuf,s?s:"",needed);
}
}
break;
#define RAP_QUEUE_STATUS_PAUSED 1
#define RAP_QUEUE_STATUS_ERROR 2
-/* turn a print job status into a on the wire status
+/* turn a print job status into a on the wire status
*/
static int printj_spoolss_status(int v)
{
return 0;
}
-/* turn a print queue status into a on the wire status
+/* turn a print queue status into a on the wire status
*/
static int printq_spoolss_status(int v)
{
{
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]));
}
return result;
}
-static bool api_DosPrintQGetInfo(connection_struct *conn, uint16 vuid,
+static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
TALLOC_CTX *mem_ctx = talloc_tos();
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_DevmodeContainer devmode_ctr;
union spoolss_DriverInfo driver_info;
- union spoolss_JobInfo *job_info;
+ union spoolss_JobInfo *job_info = NULL;
union spoolss_PrinterInfo printer_info;
if (!str1 || !str2 || !p) {
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ if (QueueName == NULL || (strlen(QueueName) < 1)) {
+ desc.errcode = W_ERROR_V(WERR_INVALID_PARAMETER);
+ goto out;
+ }
+
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_DosPrintQGetInfo: could not connect to spoolss: %s\n",
nt_errstr(status)));
desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
QueueName,
"RAW",
devmode_ctr,
desc.errcode = ERRbuftoosmall;
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
*rdata_len = desc.usedlen;
View list of all print jobs on all queues.
****************************************************************************/
-static bool api_DosPrintQEnum(connection_struct *conn, uint16 vuid,
+static bool api_DosPrintQEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt, int mprcnt,
TALLOC_CTX *mem_ctx = talloc_tos();
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct spoolss_DevmodeContainer devmode_ctr;
uint32_t num_printers;
union spoolss_PrinterInfo *printer_info;
return(True);
}
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_DosPrintQEnum: could not connect to spoolss: %s\n",
nt_errstr(status)));
desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
werr = rpccli_spoolss_enumprinters(cli, mem_ctx,
PRINTER_ENUM_LOCAL,
ZERO_STRUCT(handle);
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
printername,
"RAW",
devmode_ctr,
subcntarr[i] = num_jobs;
subcnt += subcntarr[i];
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
- }
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
if (init_package(&desc,queuecnt,subcnt)) {
}
}
- SAFE_FREE(subcntarr);
out:
+ SAFE_FREE(subcntarr);
*rdata_len = desc.usedlen;
*rparam_len = 8;
*rparam = smb_realloc_limit(*rparam,*rparam_len);
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:
return False;
}
break;
- default:
+ default:
return False;
}
return True;
struct srv_info_struct {
fstring name;
- uint32 type;
+ uint32_t type;
fstring comment;
fstring domain;
bool server_added;
number of entries.
******************************************************************/
-static int get_server_info(uint32 servertype,
+static int get_session_info(uint32_t servertype,
struct srv_info_struct **servers,
const char *domain)
{
char **lines;
bool local_list_only;
int i;
+ char *slist_cache_path = cache_path(talloc_tos(), SERVER_LIST);
+ if (slist_cache_path == NULL) {
+ return 0;
+ }
- lines = file_lines_load(cache_path(SERVER_LIST), NULL, 0, NULL);
+ lines = file_lines_load(slist_cache_path, NULL, 0, NULL);
if (!lines) {
- DEBUG(4,("Can't open %s - %s\n",cache_path(SERVER_LIST),strerror(errno)));
+ DEBUG(4, ("Can't open %s - %s\n",
+ slist_cache_path, strerror(errno)));
+ TALLOC_FREE(slist_cache_path);
return 0;
}
+ TALLOC_FREE(slist_cache_path);
/* request for everything is code for request all servers */
if (servertype == SV_TYPE_ALL) {
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;
}
ok = False;
}
- if ((servertype & SV_TYPE_DOMAIN_ENUM) !=
+ if ((servertype & SV_TYPE_DOMAIN_ENUM) !=
(s->type & SV_TYPE_DOMAIN_ENUM)) {
DEBUG(4,("s: dom mismatch "));
ok = False;
Fill in a server info structure.
******************************************************************/
-static int fill_srv_info(struct srv_info_struct *service,
- int uLevel, char **buf, int *buflen,
+static int fill_srv_info(struct srv_info_struct *service,
+ int uLevel, char **buf, int *buflen,
char **stringbuf, int *stringspace, char *baseaddr)
{
int struct_len;
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);
}
/****************************************************************************
extracted from lists saved by nmbd on the local host.
****************************************************************************/
-static bool api_RNetServerEnum2(connection_struct *conn, uint16 vuid,
+static bool api_RNetServerEnum2(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
- int mdrcnt, int mprcnt, char **rdata,
+ int mdrcnt, int mprcnt, char **rdata,
char **rparam, int *rdata_len, int *rparam_len)
{
char *str1 = get_safe_str_ptr(param, tpscnt, param, 2);
char *p = skip_string(param,tpscnt,str2);
int uLevel = get_safe_SVAL(param, tpscnt, p, 0, -1);
int buf_len = get_safe_SVAL(param,tpscnt, p, 2, 0);
- uint32 servertype = get_safe_IVAL(param,tpscnt,p,4, 0);
+ uint32_t servertype = get_safe_IVAL(param,tpscnt,p,4, 0);
char *p2;
int data_len, fixed_len, string_len;
int f_len = 0, s_len = 0;
}
/* If someone sets SV_TYPE_LOCAL_LIST_ONLY but hasn't set
- any other bit (they may just set this bit on its own) they
- want all the locally seen servers. However this bit can be
- set on its own so set the requested servers to be
+ any other bit (they may just set this bit on its own) they
+ want all the locally seen servers. However this bit can be
+ set on its own so set the requested servers to be
ALL - DOMAIN_ENUM. */
if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) && !(servertype & SV_TYPE_DOMAIN_ENUM)) {
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;
return ret;
}
-static bool api_RNetServerEnum3(connection_struct *conn, uint16 vuid,
+static bool api_RNetServerEnum3(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt, int mprcnt, char **rdata,
char *p = skip_string(param,tpscnt,str2);
int uLevel = get_safe_SVAL(param, tpscnt, p, 0, -1);
int buf_len = get_safe_SVAL(param,tpscnt, p, 2, 0);
- uint32 servertype = get_safe_IVAL(param,tpscnt,p,4, 0);
+ uint32_t servertype = get_safe_IVAL(param,tpscnt,p,4, 0);
char *p2;
int data_len, fixed_len, string_len;
int f_len = 0, s_len = 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;
command 0x34 - suspected of being a "Lookup Names" stub api
****************************************************************************/
-static bool api_RNetGroupGetUsers(connection_struct *conn, uint16 vuid,
+static bool api_RNetGroupGetUsers(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
- int mdrcnt, int mprcnt, char **rdata,
+ int mdrcnt, int mprcnt, char **rdata,
char **rparam, int *rdata_len, int *rparam_len)
{
char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
len = 0;
if (uLevel > 0) {
- len += StrlenExpanded(conn,snum,lp_comment(snum));
+ len += StrlenExpanded(conn,snum,lp_comment(talloc_tos(), snum));
}
if (uLevel > 1) {
- len += strlen(lp_pathname(snum)) + 1;
+ len += strlen(lp_path(talloc_tos(), snum)) + 1;
}
if (buflen) {
*buflen = struct_len;
baseaddr = p;
}
- push_ascii(p,lp_servicename(snum),13, STR_TERMINATE);
+ push_ascii(p,lp_servicename(talloc_tos(), snum),13, STR_TERMINATE);
if (uLevel > 0) {
int type;
SCVAL(p,13,0);
type = STYPE_DISKTREE;
- if (lp_print_ok(snum)) {
+ if (lp_printable(snum)) {
type = STYPE_PRINTQ;
}
if (strequal("IPC",lp_fstype(snum))) {
}
SSVAL(p,14,type); /* device type */
SIVAL(p,16,PTR_DIFF(p2,baseaddr));
- len += CopyExpanded(conn,snum,&p2,lp_comment(snum),&l2);
+ len += CopyExpanded(conn,snum,&p2,lp_comment(talloc_tos(),snum),&l2);
}
if (uLevel > 1) {
SSVALS(p,22,-1); /* max uses */
SSVAL(p,24,1); /* current uses */
SIVAL(p,26,PTR_DIFF(p2,baseaddr)); /* local pathname */
- len += CopyAndAdvance(&p2,lp_pathname(snum),&l2);
+ len += CopyAndAdvance(&p2,lp_path(talloc_tos(),snum),&l2);
memset(p+30,0,SHPWLEN+2); /* passwd (reserved), pad field */
}
return len;
}
-static bool api_RNetShareGetInfo(connection_struct *conn,uint16 vuid,
+static bool api_RNetShareGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
{
char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
char *str2 = skip_string(param,tpscnt,str1);
- char *netname = skip_string(param,tpscnt,str2);
+ char *netname_in = skip_string(param,tpscnt,str2);
+ char *netname = NULL;
char *p = skip_string(param,tpscnt,netname);
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;
}
- snum = find_service(netname);
- if (snum < 0) {
+ snum = find_service(talloc_tos(), netname_in, &netname);
+ if (snum < 0 || !netname) {
return False;
}
Share names longer than 12 bytes must be skipped.
****************************************************************************/
-static bool api_RNetShareEnum( connection_struct *conn, uint16 vuid,
+static bool api_RNetShareEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,
/* Ensure all the usershares are loaded. */
become_root();
+ delete_and_reload_printers();
load_registry_shares();
- count = load_usershare_shares();
+ count = load_usershare_shares(NULL, connections_snum_used);
unbecome_root();
data_len = fixed_len = string_len = 0;
if (!(lp_browseable(i) && lp_snum_ok(i))) {
continue;
}
- push_ascii_fstring(servicename_dos, lp_servicename(i));
+ push_ascii_fstring(servicename_dos, lp_servicename(talloc_tos(), i));
/* Maximum name length = 13. */
if( lp_browseable( i ) && lp_snum_ok( i ) && (strlen(servicename_dos) < 13)) {
total++;
continue;
}
- push_ascii_fstring(servicename_dos, lp_servicename(i));
+ push_ascii_fstring(servicename_dos,
+ lp_servicename(talloc_tos(), i));
if (lp_browseable(i) && lp_snum_ok(i) && (strlen(servicename_dos) < 13)) {
if (fill_share_info( conn,i,uLevel,&p,&f_len,&p2,&s_len,*rdata ) < 0) {
break;
Add a share
****************************************************************************/
-static bool api_RNetShareAdd(connection_struct *conn,uint16 vuid,
+static bool api_RNetShareAdd(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
struct rpc_pipe_client *cli = NULL;
union srvsvc_NetShareInfo info;
struct srvsvc_NetShareInfo2 info2;
+ struct dcerpc_binding_handle *b;
if (!str1 || !str2 || !p) {
return False;
return false;
}
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_srvsvc.syntax_id,
- rpc_srvsvc_dispatch, conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
&cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_RNetShareAdd: could not connect to srvsvc: %s\n",
goto out;
}
+ b = cli->binding_handle;
+
info2.name = sharename;
info2.type = STYPE_DISKTREE;
info2.comment = comment;
info.info2 = &info2;
- status = rpccli_srvsvc_NetShareAdd(cli, mem_ctx,
+ status = dcerpc_srvsvc_NetShareAdd(b, mem_ctx,
cli->srv_name_slash,
2,
&info,
view list of groups available
****************************************************************************/
-static bool api_RNetGroupEnum(connection_struct *conn,uint16 vuid,
+static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
uint32_t num_groups;
uint32_t resume_handle;
- struct rpc_pipe_client *samr_pipe;
+ struct rpc_pipe_client *samr_pipe = NULL;
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;
}
- /* parameters
+ /* parameters
* W-> resume context (number of users to skip)
- * r -> return parameter pointer to receive buffer
+ * r -> return parameter pointer to receive buffer
* L -> length of receive buffer
* e -> return parameter number of entries
* h -> return parameter total number of users
return False;
}
- status = rpc_pipe_open_internal(
- talloc_tos(), &ndr_table_samr.syntax_id, rpc_samr_dispatch,
- conn->server_info, &samr_pipe);
+ status = rpc_pipe_open_interface(
+ talloc_tos(), &ndr_table_samr,
+ conn->session_info, conn->sconn->remote_address,
+ conn->sconn->local_address, conn->sconn->msg_ctx, &samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
nt_errstr(status)));
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);
Get groups that a user is a member of.
******************************************************************/
-static bool api_NetUserGetGroups(connection_struct *conn,uint16 vuid,
+static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
uint32_t i;
char *endp = NULL;
- struct rpc_pipe_client *samr_pipe;
+ struct rpc_pipe_client *samr_pipe = NULL;
struct policy_handle samr_handle, domain_handle, user_handle;
struct lsa_String name;
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(
- talloc_tos(), &ndr_table_samr.syntax_id, rpc_samr_dispatch,
- conn->server_info, &samr_pipe);
+ status = rpc_pipe_open_interface(
+ talloc_tos(), &ndr_table_samr,
+ conn->session_info, conn->sconn->remote_address,
+ conn->sconn->local_address, conn->sconn->msg_ctx, &samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
nt_errstr(status)));
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 (rid.count != 1) {
+ status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+ goto close_domain;
+ }
+ if (type.count != 1) {
+ status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+ 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;
}
Get all users.
******************************************************************/
-static bool api_RNetUserEnum(connection_struct *conn, uint16 vuid,
+static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
int i, resume_context, cli_buf_size;
uint32_t resume_handle;
- struct rpc_pipe_client *samr_pipe;
+ struct rpc_pipe_client *samr_pipe = NULL;
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(
- talloc_tos(), &ndr_table_samr.syntax_id, rpc_samr_dispatch,
- conn->server_info, &samr_pipe);
+ status = rpc_pipe_open_interface(
+ talloc_tos(), &ndr_table_samr,
+ conn->session_info, conn->sconn->remote_address,
+ conn->sconn->local_address, conn->sconn->msg_ctx, &samr_pipe);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
nt_errstr(status)));
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);
Get the time of day info.
****************************************************************************/
-static bool api_NetRemoteTOD(connection_struct *conn,uint16 vuid,
+static bool api_NetRemoteTOD(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
by NT in a "net time" operation,
it seems to ignore the one below */
- /* the client expects to get localtime, not GMT, in this bit
+ /* the client expects to get localtime, not GMT, in this bit
(I think, this needs testing) */
t = localtime(&unixdate);
if (!t) {
return True;
}
-/****************************************************************************
- Set the user password.
-*****************************************************************************/
-
-static bool api_SetUserPassword(connection_struct *conn,uint16 vuid,
- char *param, int tpscnt,
- char *data, int tdscnt,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *np = get_safe_str_ptr(param,tpscnt,param,2);
- char *p = NULL;
- fstring user;
- fstring pass1,pass2;
- TALLOC_CTX *mem_ctx = talloc_tos();
- NTSTATUS status;
- struct rpc_pipe_client *cli = NULL;
- struct policy_handle connect_handle, domain_handle, user_handle;
- struct lsa_String domain_name;
- struct dom_sid2 *domain_sid;
- struct lsa_String names;
- struct samr_Ids rids;
- struct samr_Ids types;
- struct samr_Password old_lm_hash;
- struct samr_Password new_lm_hash;
- int errcode = NERR_badpass;
- uint32_t rid;
- int encrypted;
- int min_pwd_length;
-
- /* Skip 2 strings. */
- p = skip_string(param,tpscnt,np);
- p = skip_string(param,tpscnt,p);
-
- if (!np || !p) {
- return False;
- }
-
- /* Do we have a string ? */
- if (skip_string(param,tpscnt,p) == NULL) {
- return False;
- }
- pull_ascii_fstring(user,p);
-
- p = skip_string(param,tpscnt,p);
- if (!p) {
- return False;
- }
-
- memset(pass1,'\0',sizeof(pass1));
- memset(pass2,'\0',sizeof(pass2));
- /*
- * We use 31 here not 32 as we're checking
- * the last byte we want to access is safe.
- */
- if (!is_offset_safe(param,tpscnt,p,31)) {
- return False;
- }
- memcpy(pass1,p,16);
- memcpy(pass2,p+16,16);
-
- encrypted = get_safe_SVAL(param,tpscnt,p+32,0,-1);
- if (encrypted == -1) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
- goto out;
- }
-
- min_pwd_length = get_safe_SVAL(param,tpscnt,p+34,0,-1);
- if (min_pwd_length == -1) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
- goto out;
- }
-
- *rparam_len = 4;
- *rparam = smb_realloc_limit(*rparam,*rparam_len);
- if (!*rparam) {
- return False;
- }
-
- *rdata_len = 0;
-
- DEBUG(3,("Set password for <%s> (encrypted: %d, min_pwd_length: %d)\n",
- user, encrypted, min_pwd_length));
-
- ZERO_STRUCT(connect_handle);
- ZERO_STRUCT(domain_handle);
- ZERO_STRUCT(user_handle);
-
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
- rpc_samr_dispatch, conn->server_info,
- &cli);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0,("api_SetUserPassword: could not connect to samr: %s\n",
- nt_errstr(status)));
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- status = rpccli_samr_Connect2(cli, mem_ctx,
- global_myname(),
- SAMR_ACCESS_CONNECT_TO_SERVER |
- SAMR_ACCESS_ENUM_DOMAINS |
- SAMR_ACCESS_LOOKUP_DOMAIN,
- &connect_handle);
- if (!NT_STATUS_IS_OK(status)) {
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- init_lsa_String(&domain_name, get_global_sam_name());
-
- status = rpccli_samr_LookupDomain(cli, mem_ctx,
- &connect_handle,
- &domain_name,
- &domain_sid);
- if (!NT_STATUS_IS_OK(status)) {
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- status = rpccli_samr_OpenDomain(cli, mem_ctx,
- &connect_handle,
- SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
- domain_sid,
- &domain_handle);
- if (!NT_STATUS_IS_OK(status)) {
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- init_lsa_String(&names, user);
-
- status = rpccli_samr_LookupNames(cli, mem_ctx,
- &domain_handle,
- 1,
- &names,
- &rids,
- &types);
- if (!NT_STATUS_IS_OK(status)) {
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- if (rids.count != 1) {
- errcode = W_ERROR_V(WERR_NO_SUCH_USER);
- goto out;
- }
- if (rids.count != types.count) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
- goto out;
- }
- if (types.ids[0] != SID_NAME_USER) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
- goto out;
- }
-
- rid = rids.ids[0];
-
- status = rpccli_samr_OpenUser(cli, mem_ctx,
- &domain_handle,
- SAMR_USER_ACCESS_CHANGE_PASSWORD,
- rid,
- &user_handle);
- if (!NT_STATUS_IS_OK(status)) {
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- if (encrypted == 0) {
- E_deshash(pass1, old_lm_hash.hash);
- E_deshash(pass2, new_lm_hash.hash);
- } else {
- ZERO_STRUCT(old_lm_hash);
- ZERO_STRUCT(new_lm_hash);
- memcpy(old_lm_hash.hash, pass1, MIN(strlen(pass1), 16));
- memcpy(new_lm_hash.hash, pass1, MIN(strlen(pass2), 16));
- }
-
- status = rpccli_samr_ChangePasswordUser(cli, mem_ctx,
- &user_handle,
- true, /* lm_present */
- &old_lm_hash,
- &new_lm_hash,
- false, /* nt_present */
- NULL, /* old_nt_crypted */
- NULL, /* new_nt_crypted */
- false, /* cross1_present */
- NULL, /* nt_cross */
- false, /* cross2_present */
- NULL); /* lm_cross */
- if (!NT_STATUS_IS_OK(status)) {
- errcode = W_ERROR_V(ntstatus_to_werror(status));
- goto out;
- }
-
- errcode = NERR_Success;
- out:
-
- if (cli && is_valid_policy_hnd(&user_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &user_handle);
- }
- if (cli && is_valid_policy_hnd(&domain_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &domain_handle);
- }
- if (cli && is_valid_policy_hnd(&connect_handle)) {
- rpccli_samr_Close(cli, mem_ctx, &connect_handle);
- }
-
- memset((char *)pass1,'\0',sizeof(fstring));
- memset((char *)pass2,'\0',sizeof(fstring));
-
- SSVAL(*rparam,0,errcode);
- SSVAL(*rparam,2,0); /* converter word */
- return(True);
-}
-
/****************************************************************************
Set the user password (SamOEM version - gets plaintext).
****************************************************************************/
-static bool api_SamOEMChangePassword(connection_struct *conn,uint16 vuid,
+static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
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);
DEBUG(3,("api_SamOEMChangePassword: Change password for <%s>\n",user));
if (tdscnt != 532) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
+ errcode = W_ERROR_V(WERR_INVALID_PARAMETER);
goto out;
}
bufsize = get_safe_SVAL(param,tpscnt,p,0,-1);
if (bufsize != 532) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
+ errcode = W_ERROR_V(WERR_INVALID_PARAMETER);
goto out;
}
memcpy(password.data, data, 516);
memcpy(hash.hash, data+516, 16);
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_samr.syntax_id,
- rpc_samr_dispatch, conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
&cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_SamOEMChangePassword: could not connect to samr: %s\n",
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:
/****************************************************************************
delete a print job
- Form: <W> <>
+ Form: <W> <>
****************************************************************************/
-static bool api_RDosPrintJobDel(connection_struct *conn,uint16 vuid,
+static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
- uint32 jobid;
+ uint32_t jobid;
fstring sharename;
int errcode;
WERROR werr = WERR_OK;
TALLOC_CTX *mem_ctx = talloc_tos();
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_DevmodeContainer devmode_ctr;
enum spoolss_JobControl command;
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_RDosPrintJobDel: could not connect to spoolss: %s\n",
nt_errstr(status)));
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
sharename,
"RAW",
devmode_ctr,
goto out;
}
- status = rpccli_spoolss_SetJob(cli, mem_ctx,
+ status = dcerpc_spoolss_SetJob(b, mem_ctx,
&handle,
jobid,
NULL, /* unique ptr ctr */
}
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
- SSVAL(*rparam,0,errcode);
+ SSVAL(*rparam,0,errcode);
SSVAL(*rparam,2,0); /* converter word */
return(True);
Purge a print queue - or pause or resume it.
****************************************************************************/
-static bool api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid,
+static bool api_WPrintQueueCtrl(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
TALLOC_CTX *mem_ctx = talloc_tos();
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_SetPrinterInfoCtr info_ctr;
struct spoolss_DevmodeContainer devmode_ctr;
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_WPrintQueueCtrl: could not connect to spoolss: %s\n",
nt_errstr(status)));
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
QueueName,
NULL,
devmode_ctr,
- SEC_FLAG_MAXIMUM_ALLOWED,
+ PRINTER_ACCESS_ADMINISTER,
&handle,
&werr);
if (!NT_STATUS_IS_OK(status)) {
ZERO_STRUCT(info_ctr);
ZERO_STRUCT(secdesc_ctr);
- status = rpccli_spoolss_SetPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_SetPrinter(b, mem_ctx,
&handle,
&info_ctr,
&devmode_ctr,
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
SSVAL(*rparam,0,errcode);
set the property of a print job (undocumented?)
? function = 0xb -> set name of print job
? function = 0x6 -> move print job up/down
- Form: <WWsTP> <WWzWWDDzzzzzzzzzzlz>
- or <WWsTP> <WB21BB16B10zWWzDDz>
+ Form: <WWsTP> <WWzWWDDzzzzzzzzzzlz>
+ or <WWsTP> <WB21BB16B10zWWzDDz>
****************************************************************************/
static int check_printjob_info(struct pack_desc* desc,
return True;
}
-static bool api_PrintJobInfo(connection_struct *conn, uint16 vuid,
+static bool api_PrintJobInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
- uint32 jobid;
+ uint32_t jobid;
fstring sharename;
int uLevel = get_safe_SVAL(param,tpscnt,p,2,-1);
int function = get_safe_SVAL(param,tpscnt,p,4,-1);
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_DevmodeContainer devmode_ctr;
struct spoolss_JobInfoContainer ctr;
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_PrintJobInfo: could not connect to spoolss: %s\n",
nt_errstr(status)));
errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
sharename,
"RAW",
devmode_ctr,
ctr.level = 1;
ctr.info.info1 = &info1;
- status = rpccli_spoolss_SetJob(cli, mem_ctx,
+ status = dcerpc_spoolss_SetJob(b, mem_ctx,
&handle,
jobid,
&ctr,
errcode = NERR_Success;
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
SSVALS(*rparam,0,errcode);
Get info about the server.
****************************************************************************/
-static bool api_RNetServerGetInfo(connection_struct *conn,uint16 vuid,
+static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
struct rpc_pipe_client *cli = NULL;
union srvsvc_NetSrvInfo info;
int errcode;
+ struct dcerpc_binding_handle *b;
if (!str1 || !str2 || !p) {
return False;
p = *rdata;
p2 = p + struct_len;
- status = rpc_pipe_open_internal(mem_ctx, &ndr_table_srvsvc.syntax_id,
- rpc_srvsvc_dispatch, conn->server_info,
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
&cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_RNetServerGetInfo: could not connect to srvsvc: %s\n",
goto out;
}
- status = rpccli_srvsvc_NetSrvGetInfo(cli, mem_ctx,
+ b = cli->binding_handle;
+
+ status = dcerpc_srvsvc_NetSrvGetInfo(b, mem_ctx,
NULL,
101,
&info,
}
if (info.info101 == NULL) {
- errcode = W_ERROR_V(WERR_INVALID_PARAM);
+ errcode = W_ERROR_V(WERR_INVALID_PARAMETER);
goto out;
}
if (uLevel != 20) {
- srvstr_push(NULL, 0, p, info.info101->server_name, 16,
- STR_ASCII|STR_UPPER|STR_TERMINATE);
+ size_t len = 0;
+ status = srvstr_push(NULL, 0, p, info.info101->server_name, 16,
+ STR_ASCII|STR_UPPER|STR_TERMINATE, &len);
+ if (!NT_STATUS_IS_OK(status)) {
+ errcode = W_ERROR_V(ntstatus_to_werror(status));
+ goto out;
+ }
}
p += 16;
if (uLevel > 0) {
Get info about the server.
****************************************************************************/
-static bool api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid,
+static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* host name */
strlcpy(p2,get_local_machine_name(),PTR_DIFF(endp,p2));
- strupper_m(p2);
+ if (!strupper_m(p2)) {
+ return false;
+ }
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
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->unix_info->sanitized_username,PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* login domain */
strlcpy(p2,lp_workgroup(),PTR_DIFF(endp,p2));
- strupper_m(p2);
+ if (!strupper_m(p2)) {
+ return false;
+ }
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));
get info about a user
struct user_info_11 {
- char usri11_name[21]; 0-20
- char usri11_pad; 21
- char *usri11_comment; 22-25
+ char usri11_name[21]; 0-20
+ char usri11_pad; 21
+ char *usri11_comment; 22-25
char *usri11_usr_comment; 26-29
unsigned short usri11_priv; 30-31
unsigned long usri11_auth_flags; 32-35
****************************************************************************/
-#define usri11_name 0
+#define usri11_name 0
#define usri11_pad 21
#define usri11_comment 22
#define usri11_usr_comment 26
#define usri11_code_page 84
#define usri11_end 86
-#define USER_PRIV_GUEST 0
-#define USER_PRIV_USER 1
-#define USER_PRIV_ADMIN 2
-
-#define AF_OP_PRINT 0
-#define AF_OP_COMM 1
-#define AF_OP_SERVER 2
-#define AF_OP_ACCOUNTS 3
-
-
-static bool api_RNetUserGetInfo(connection_struct *conn, uint16 vuid,
+static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
char **rdata,char **rparam,
int *rdata_len,int *rparam_len)
{
- struct smbd_server_connection *sconn = smbd_server_conn;
char *str1 = get_safe_str_ptr(param,tpscnt,param,2);
char *str2 = skip_string(param,tpscnt,str1);
char *UserName = skip_string(param,tpscnt,str2);
char *endp;
const char *level_string;
- /* get NIS home of a previously validated user - simeon */
- /* With share level security vuid will always be zero.
- Don't depend on vuser being non-null !!. JRA */
- user_struct *vuser = get_valid_user_struct(sconn, vuid);
- if(vuser != NULL) {
- DEBUG(3,(" Username of UID %d is %s\n",
- (int)vuser->server_info->utok.uid,
- vuser->server_info->unix_name));
- }
+ TALLOC_CTX *mem_ctx = talloc_tos();
+ NTSTATUS status, result;
+ struct rpc_pipe_client *cli = NULL;
+ struct policy_handle connect_handle, domain_handle, user_handle;
+ struct lsa_String domain_name;
+ struct dom_sid2 *domain_sid;
+ struct lsa_String names;
+ struct samr_Ids rids;
+ struct samr_Ids types;
+ int errcode = W_ERROR_V(WERR_NERR_USERNOTFOUND);
+ uint32_t rid;
+ union samr_UserInfo *info;
+ struct dcerpc_binding_handle *b = NULL;
if (!str1 || !str2 || !UserName || !p) {
return False;
return False;
}
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
-
p = *rdata;
endp = *rdata + *rdata_len;
p2 = get_safe_ptr(*rdata,*rdata_len,p,usri11_end);
return False;
}
+ ZERO_STRUCT(connect_handle);
+ ZERO_STRUCT(domain_handle);
+ ZERO_STRUCT(user_handle);
+
+ status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("api_RNetUserGetInfo: could not connect to samr: %s\n",
+ nt_errstr(status)));
+ errcode = W_ERROR_V(ntstatus_to_werror(status));
+ goto out;
+ }
+
+ 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,
+ &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 = dcerpc_samr_LookupDomain(b, mem_ctx,
+ &connect_handle,
+ &domain_name,
+ &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 = dcerpc_samr_OpenDomain(b, mem_ctx,
+ &connect_handle,
+ SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
+ domain_sid,
+ &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 = dcerpc_samr_LookupNames(b, mem_ctx,
+ &domain_handle,
+ 1,
+ &names,
+ &rids,
+ &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);
+ goto out;
+ }
+ if (rids.count != types.count) {
+ errcode = W_ERROR_V(WERR_INVALID_PARAMETER);
+ goto out;
+ }
+ if (types.ids[0] != SID_NAME_USER) {
+ errcode = W_ERROR_V(WERR_INVALID_PARAMETER);
+ goto out;
+ }
+
+ rid = rids.ids[0];
+
+ status = dcerpc_samr_OpenUser(b, mem_ctx,
+ &domain_handle,
+ SAMR_USER_ACCESS_GET_LOCALE |
+ SAMR_USER_ACCESS_GET_LOGONINFO |
+ SAMR_USER_ACCESS_GET_ATTRIBUTES |
+ SAMR_USER_ACCESS_GET_GROUPS |
+ SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP |
+ SEC_STD_READ_CONTROL,
+ rid,
+ &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 = dcerpc_samr_QueryUserInfo2(b, mem_ctx,
+ &user_handle,
+ UserAllInformation,
+ &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 */
/* EEK! the cifsrap.txt doesn't have this in!!!! */
SIVAL(p,usri11_full_name,PTR_DIFF(p2,p)); /* full name */
- strlcpy(p2,((vuser != NULL)
- ? pdb_get_fullname(vuser->server_info->sam_account)
- : UserName),PTR_DIFF(endp,p2));
+ strlcpy(p2,info->info21.full_name.string,PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
}
if (uLevel == 11) {
- const char *homedir = "";
- if (vuser != NULL) {
- homedir = pdb_get_homedir(
- vuser->server_info->sam_account);
- }
+ const char *homedir = info->info21.home_directory.string;
/* modelled after NTAS 3.51 reply */
SSVAL(p,usri11_priv,
(get_current_uid(conn) == sec_initial_uid())?
(get_current_uid(conn) == sec_initial_uid())?
USER_PRIV_ADMIN:USER_PRIV_USER);
SIVAL(p,44,PTR_DIFF(p2,*rdata)); /* home dir */
- strlcpy(p2, vuser ? pdb_get_homedir(
- vuser->server_info->sam_account) : "",
+ strlcpy(p2, info->info21.home_directory.string,
PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
*p2++ = 0;
SSVAL(p,52,0); /* flags */
SIVAL(p,54,PTR_DIFF(p2,*rdata)); /* script_path */
- strlcpy(p2, vuser ? pdb_get_logon_script(
- vuser->server_info->sam_account) : "",
+ strlcpy(p2, info->info21.logon_script.string,
PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
}
if (uLevel == 2) {
- SIVAL(p,60,0); /* auth_flags */
- SIVAL(p,64,PTR_DIFF(p2,*rdata)); /* full_name */
- strlcpy(p2,((vuser != NULL)
- ? pdb_get_fullname(vuser->server_info->sam_account)
- : UserName),PTR_DIFF(endp,p2));
+ SIVAL(p,58,0); /* auth_flags */
+ SIVAL(p,62,PTR_DIFF(p2,*rdata)); /* full_name */
+ strlcpy(p2,info->info21.full_name.string,PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
}
- SIVAL(p,68,0); /* urs_comment */
- SIVAL(p,72,PTR_DIFF(p2,*rdata)); /* parms */
+ SIVAL(p,66,0); /* urs_comment */
+ SIVAL(p,70,PTR_DIFF(p2,*rdata)); /* parms */
strlcpy(p2,"",PTR_DIFF(endp,p2));
p2 = skip_string(*rdata,*rdata_len,p2);
if (!p2) {
return False;
}
- SIVAL(p,76,0); /* workstations */
- SIVAL(p,80,0); /* last_logon */
- SIVAL(p,84,0); /* last_logoff */
- SIVALS(p,88,-1); /* acct_expires */
- SIVALS(p,92,-1); /* max_storage */
- SSVAL(p,96,168); /* units_per_week */
- SIVAL(p,98,PTR_DIFF(p2,*rdata)); /* logon_hours */
+ SIVAL(p,74,0); /* workstations */
+ SIVAL(p,78,0); /* last_logon */
+ SIVAL(p,82,0); /* last_logoff */
+ SIVALS(p,86,-1); /* acct_expires */
+ SIVALS(p,90,-1); /* max_storage */
+ SSVAL(p,94,168); /* units_per_week */
+ SIVAL(p,96,PTR_DIFF(p2,*rdata)); /* logon_hours */
memset(p2,-1,21);
p2 += 21;
- SSVALS(p,102,-1); /* bad_pw_count */
- SSVALS(p,104,-1); /* num_logons */
- SIVAL(p,106,PTR_DIFF(p2,*rdata)); /* logon_server */
+ SSVALS(p,100,-1); /* bad_pw_count */
+ SSVALS(p,102,-1); /* num_logons */
+ SIVAL(p,104,PTR_DIFF(p2,*rdata)); /* logon_server */
{
TALLOC_CTX *ctx = talloc_tos();
int space_rem = *rdata_len - (p2 - *rdata);
if (!p2) {
return False;
}
- SSVAL(p,110,49); /* country_code */
- SSVAL(p,112,860); /* code page */
+ SSVAL(p,108,49); /* country_code */
+ SSVAL(p,110,860); /* code page */
}
}
+ errcode = NERR_Success;
+
+ out:
*rdata_len = PTR_DIFF(p2,*rdata);
+ if (b && is_valid_policy_hnd(&user_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &user_handle, &result);
+ }
+ if (b && is_valid_policy_hnd(&domain_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result);
+ }
+ if (b && is_valid_policy_hnd(&connect_handle)) {
+ dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result);
+ }
+
+ SSVAL(*rparam,0,errcode);
+ SSVAL(*rparam,2,0); /* converter word */
SSVAL(*rparam,4,*rdata_len); /* is this right?? */
return(True);
}
-static bool api_WWkstaUserLogon(connection_struct *conn,uint16 vuid,
+static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
char **rdata,char **rparam,
int *rdata_len,int *rparam_len)
{
- struct smbd_server_connection *sconn = smbd_server_conn;
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* name;
/* With share level security vuid will always be zero.
Don't depend on vuser being non-null !!. JRA */
- user_struct *vuser = get_valid_user_struct(sconn, vuid);
+ struct user_struct *vuser = get_valid_user_struct(sconn, vuid);
if (!str1 || !str2 || !p) {
return False;
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->unix_token->uid,
+ vuser->session_info->unix_info->unix_name));
}
uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
fstring mypath;
fstrcpy(mypath,"\\\\");
fstrcat(mypath,get_local_machine_name());
- strupper_m(mypath);
+ if (!strupper_m(mypath)) {
+ return false;
+ }
PACKS(&desc,"z",mypath); /* computer */
}
PACKS(&desc,"z",lp_workgroup());/* domain */
- PACKS(&desc,"z", vuser ? pdb_get_logon_script(
- vuser->server_info->sam_account) : ""); /* script path */
+ PACKS(&desc,"z", vuser ?
+ vuser->session_info->info->logon_script
+ : ""); /* script path */
PACKI(&desc,"D",0x00000000); /* reserved */
}
api_WAccessGetUserPerms
****************************************************************************/
-static bool api_WAccessGetUserPerms(connection_struct *conn,uint16 vuid,
+static bool api_WAccessGetUserPerms(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
api_WPrintJobEnumerate
****************************************************************************/
-static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid,
+static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
char *p = skip_string(param,tpscnt,str2);
int uLevel;
fstring sharename;
- uint32 jobid;
+ uint32_t jobid;
struct pack_desc desc;
char *tmpdata=NULL;
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_DevmodeContainer devmode_ctr;
union spoolss_JobInfo info;
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_WPrintJobGetInfo: could not connect to spoolss: %s\n",
nt_errstr(status)));
desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
sharename,
"RAW",
devmode_ctr,
*rdata_len = 0;
}
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
*rparam_len = 6;
return True;
}
-static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid,
+static bool api_WPrintJobEnumerate(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_DevmodeContainer devmode_ctr;
- uint32_t count;
+ uint32_t count = 0;
union spoolss_JobInfo *info;
if (!str1 || !str2 || !p) {
return False; /* defined only for uLevel 0,1,2 */
}
- if (!check_printjob_info(&desc,uLevel,str2)) {
+ if (!check_printjob_info(&desc,uLevel,str2)) {
return False;
}
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_WPrintJobEnumerate: could not connect to spoolss: %s\n",
nt_errstr(status)));
desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
name,
NULL,
devmode_ctr,
- SEC_FLAG_MAXIMUM_ALLOWED,
+ PRINTER_ACCESS_USE,
&handle,
&werr);
if (!NT_STATUS_IS_OK(status)) {
}
}
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
*rdata_len = desc.usedlen;
return False;
}
if (id == NULL || strcmp(desc->format,id) != 0) {
- DEBUG(0,("check_printdest_info: invalid string %s\n",
+ DEBUG(0,("check_printdest_info: invalid string %s\n",
id ? id : "<NULL>" ));
return False;
}
strncpy(buf, info2->printername, sizeof(buf)-1);
buf[sizeof(buf)-1] = 0;
- strupper_m(buf);
+ (void)strupper_m(buf);
if (uLevel <= 1) {
PACKS(desc,"B9",buf); /* szName */
}
}
-static bool api_WPrintDestGetInfo(connection_struct *conn, uint16 vuid,
+static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *cli = NULL;
+ struct dcerpc_binding_handle *b = NULL;
struct policy_handle handle;
struct spoolss_DevmodeContainer devmode_ctr;
union spoolss_PrinterInfo info;
ZERO_STRUCT(handle);
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_WPrintDestGetInfo: could not connect to spoolss: %s\n",
nt_errstr(status)));
desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
goto out;
}
+ b = cli->binding_handle;
ZERO_STRUCT(devmode_ctr);
- status = rpccli_spoolss_OpenPrinter(cli, mem_ctx,
+ status = dcerpc_spoolss_OpenPrinter(b, mem_ctx,
PrinterName,
NULL,
devmode_ctr,
- SEC_FLAG_MAXIMUM_ALLOWED,
+ PRINTER_ACCESS_USE,
&handle,
&werr);
if (!NT_STATUS_IS_OK(status)) {
}
out:
- if (cli && is_valid_policy_hnd(&handle)) {
- rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL);
+ if (b && is_valid_policy_hnd(&handle)) {
+ dcerpc_spoolss_ClosePrinter(b, mem_ctx, &handle, &werr);
}
*rdata_len = desc.usedlen;
return True;
}
-static bool api_WPrintDestEnum(connection_struct *conn, uint16 vuid,
+static bool api_WPrintDestEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
queuecnt = 0;
- status = rpc_connect_spoolss_pipe(conn, &cli);
+ status = rpc_pipe_open_interface(mem_ctx,
+ &ndr_table_spoolss,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ conn->sconn->msg_ctx,
+ &cli);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("api_WPrintDestEnum: could not connect to spoolss: %s\n",
nt_errstr(status)));
desc.base = *rdata;
desc.buflen = mdrcnt;
- if (init_package(&desc,queuecnt,0)) {
+ if (init_package(&desc,queuecnt,0)) {
succnt = 0;
n = 0;
for (i = 0; i < count; i++) {
return True;
}
-static bool api_WPrintDriverEnum(connection_struct *conn, uint16 vuid,
+static bool api_WPrintDriverEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
return True;
}
-static bool api_WPrintQProcEnum(connection_struct *conn, uint16 vuid,
+static bool api_WPrintQProcEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
return True;
}
-static bool api_WPrintPortEnum(connection_struct *conn, uint16 vuid,
+static bool api_WPrintPortEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
List open sessions
****************************************************************************/
-static bool api_RNetSessionEnum(connection_struct *conn, uint16 vuid,
+static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt,int mprcnt,
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(mem_ctx,
+ &ndr_table_srvsvc,
+ conn->session_info,
+ conn->sconn->remote_address,
+ conn->sconn->local_address,
+ 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_NOT_ENOUGH_MEMORY);
+ 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));
The buffer was too small.
****************************************************************************/
-static bool api_TooSmall(connection_struct *conn,uint16 vuid, char *param, char *data,
+static bool api_TooSmall(struct smbd_server_connection *sconn,
+ connection_struct *conn,uint64_t vuid, char *param, char *data,
int mdrcnt, int mprcnt,
char **rdata, char **rparam,
int *rdata_len, int *rparam_len)
The request is not supported.
****************************************************************************/
-static bool api_Unsupported(connection_struct *conn, uint16 vuid,
+static bool api_Unsupported(struct smbd_server_connection *sconn,
+ connection_struct *conn, uint64_t vuid,
char *param, int tpscnt,
char *data, int tdscnt,
int mdrcnt, int mprcnt,
static const struct {
const char *name;
int id;
- bool (*fn)(connection_struct *, uint16,
+ bool (*fn)(struct smbd_server_connection *sconn,
+ connection_struct *, uint64_t,
char *, int,
char *, int,
int,int,char **,char **,int *,int *);
bool auth_user; /* Deny anonymous access? */
} api_commands[] = {
- {"RNetShareEnum", RAP_WshareEnum, api_RNetShareEnum, True},
- {"RNetShareGetInfo", RAP_WshareGetInfo, api_RNetShareGetInfo},
- {"RNetShareAdd", RAP_WshareAdd, api_RNetShareAdd},
- {"RNetSessionEnum", RAP_WsessionEnum, api_RNetSessionEnum, True},
- {"RNetServerGetInfo", RAP_WserverGetInfo, api_RNetServerGetInfo},
- {"RNetGroupEnum", RAP_WGroupEnum, api_RNetGroupEnum, True},
- {"RNetGroupGetUsers", RAP_WGroupGetUsers, api_RNetGroupGetUsers, True},
- {"RNetUserEnum", RAP_WUserEnum, api_RNetUserEnum, True},
- {"RNetUserGetInfo", RAP_WUserGetInfo, api_RNetUserGetInfo},
- {"NetUserGetGroups", RAP_WUserGetGroups, api_NetUserGetGroups},
- {"NetWkstaGetInfo", RAP_WWkstaGetInfo, api_NetWkstaGetInfo},
- {"DosPrintQEnum", RAP_WPrintQEnum, api_DosPrintQEnum, True},
- {"DosPrintQGetInfo", RAP_WPrintQGetInfo, api_DosPrintQGetInfo},
- {"WPrintQueuePause", RAP_WPrintQPause, api_WPrintQueueCtrl},
- {"WPrintQueueResume", RAP_WPrintQContinue, api_WPrintQueueCtrl},
- {"WPrintJobEnumerate",RAP_WPrintJobEnum, api_WPrintJobEnumerate},
- {"WPrintJobGetInfo", RAP_WPrintJobGetInfo, api_WPrintJobGetInfo},
- {"RDosPrintJobDel", RAP_WPrintJobDel, api_RDosPrintJobDel},
- {"RDosPrintJobPause", RAP_WPrintJobPause, api_RDosPrintJobDel},
- {"RDosPrintJobResume",RAP_WPrintJobContinue, api_RDosPrintJobDel},
- {"WPrintDestEnum", RAP_WPrintDestEnum, api_WPrintDestEnum},
- {"WPrintDestGetInfo", RAP_WPrintDestGetInfo, api_WPrintDestGetInfo},
- {"NetRemoteTOD", RAP_NetRemoteTOD, api_NetRemoteTOD},
- {"WPrintQueuePurge", RAP_WPrintQPurge, api_WPrintQueueCtrl},
- {"NetServerEnum2", RAP_NetServerEnum2, api_RNetServerEnum2}, /* anon OK */
- {"NetServerEnum3", RAP_NetServerEnum3, api_RNetServerEnum3}, /* anon OK */
- {"WAccessGetUserPerms",RAP_WAccessGetUserPerms,api_WAccessGetUserPerms},
- {"SetUserPassword", RAP_WUserPasswordSet2, api_SetUserPassword},
- {"WWkstaUserLogon", RAP_WWkstaUserLogon, api_WWkstaUserLogon},
- {"PrintJobInfo", RAP_WPrintJobSetInfo, api_PrintJobInfo},
- {"WPrintDriverEnum", RAP_WPrintDriverEnum, api_WPrintDriverEnum},
- {"WPrintQProcEnum", RAP_WPrintQProcessorEnum,api_WPrintQProcEnum},
- {"WPrintPortEnum", RAP_WPrintPortEnum, api_WPrintPortEnum},
- {"SamOEMChangePassword",RAP_SamOEMChgPasswordUser2_P,api_SamOEMChangePassword}, /* anon OK */
- {NULL, -1, api_Unsupported}
- /* The following RAP calls are not implemented by Samba:
-
- RAP_WFileEnum2 - anon not OK
- */
+ {
+ .name = "RNetShareEnum",
+ .id = RAP_WshareEnum,
+ .fn = api_RNetShareEnum,
+ .auth_user = true,
+ },
+ {
+ .name = "RNetShareGetInfo",
+ .id = RAP_WshareGetInfo,
+ .fn = api_RNetShareGetInfo
+ },
+ {
+ .name = "RNetShareAdd",
+ .id = RAP_WshareAdd,
+ .fn = api_RNetShareAdd
+ },
+ {
+ .name = "RNetSessionEnum",
+ .id = RAP_WsessionEnum,
+ .fn = api_RNetSessionEnum,
+ .auth_user = true,
+ },
+ {
+ .name = "RNetServerGetInfo",
+ .id = RAP_WserverGetInfo,
+ .fn = api_RNetServerGetInfo
+ },
+ {
+ .name = "RNetGroupEnum",
+ .id = RAP_WGroupEnum,
+ .fn = api_RNetGroupEnum, True
+ },
+ {
+ .name = "RNetGroupGetUsers",
+ .id = RAP_WGroupGetUsers,
+ .fn = api_RNetGroupGetUsers,
+ .auth_user = true},
+ {
+ .name = "RNetUserEnum",
+ .id = RAP_WUserEnum,
+ .fn = api_RNetUserEnum,
+ .auth_user = true,
+ },
+ {
+ .name = "RNetUserGetInfo",
+ .id = RAP_WUserGetInfo,
+ .fn = api_RNetUserGetInfo
+ },
+ {
+ .name = "NetUserGetGroups",
+ .id = RAP_WUserGetGroups,
+ .fn = api_NetUserGetGroups
+ },
+ {
+ .name = "NetWkstaGetInfo",
+ .id = RAP_WWkstaGetInfo,
+ .fn = api_NetWkstaGetInfo
+ },
+ {
+ .name = "DosPrintQEnum",
+ .id = RAP_WPrintQEnum,
+ .fn = api_DosPrintQEnum,
+ .auth_user = true,
+ },
+ {
+ .name = "DosPrintQGetInfo",
+ .id = RAP_WPrintQGetInfo,
+ .fn = api_DosPrintQGetInfo
+ },
+ {
+ .name = "WPrintQueuePause",
+ .id = RAP_WPrintQPause,
+ .fn = api_WPrintQueueCtrl
+ },
+ {
+ .name = "WPrintQueueResume",
+ .id = RAP_WPrintQContinue,
+ .fn = api_WPrintQueueCtrl
+ },
+ {
+ .name = "WPrintJobEnumerate",
+ .id = RAP_WPrintJobEnum,
+ .fn = api_WPrintJobEnumerate
+ },
+ {
+ .name = "WPrintJobGetInfo",
+ .id = RAP_WPrintJobGetInfo,
+ .fn = api_WPrintJobGetInfo
+ },
+ {
+ .name = "RDosPrintJobDel",
+ .id = RAP_WPrintJobDel,
+ .fn = api_RDosPrintJobDel
+ },
+ {
+ .name = "RDosPrintJobPause",
+ .id = RAP_WPrintJobPause,
+ .fn = api_RDosPrintJobDel
+ },
+ {
+ .name = "RDosPrintJobResume",
+ .id = RAP_WPrintJobContinue,
+ .fn = api_RDosPrintJobDel
+ },
+ {
+ .name = "WPrintDestEnum",
+ .id = RAP_WPrintDestEnum,
+ .fn = api_WPrintDestEnum
+ },
+ {
+ .name = "WPrintDestGetInfo",
+ .id = RAP_WPrintDestGetInfo,
+ .fn = api_WPrintDestGetInfo
+ },
+ {
+ .name = "NetRemoteTOD",
+ .id = RAP_NetRemoteTOD,
+ .fn = api_NetRemoteTOD
+ },
+ {
+ .name = "WPrintQueuePurge",
+ .id = RAP_WPrintQPurge,
+ .fn = api_WPrintQueueCtrl
+ },
+ {
+ .name = "NetServerEnum2",
+ .id = RAP_NetServerEnum2,
+ .fn = api_RNetServerEnum2
+ }, /* anon OK */
+ {
+ .name = "NetServerEnum3",
+ .id = RAP_NetServerEnum3,
+ .fn = api_RNetServerEnum3
+ }, /* anon OK */
+ {
+ .name = "WAccessGetUserPerms",
+ .id = RAP_WAccessGetUserPerms,
+ .fn = api_WAccessGetUserPerms
+ },
+ {
+ .name = "WWkstaUserLogon",
+ .id = RAP_WWkstaUserLogon,
+ .fn = api_WWkstaUserLogon
+ },
+ {
+ .name = "PrintJobInfo",
+ .id = RAP_WPrintJobSetInfo,
+ .fn = api_PrintJobInfo
+ },
+ {
+ .name = "WPrintDriverEnum",
+ .id = RAP_WPrintDriverEnum,
+ .fn = api_WPrintDriverEnum
+ },
+ {
+ .name = "WPrintQProcEnum",
+ .id = RAP_WPrintQProcessorEnum,
+ .fn = api_WPrintQProcEnum
+ },
+ {
+ .name = "WPrintPortEnum",
+ .id = RAP_WPrintPortEnum,
+ .fn = api_WPrintPortEnum
+ },
+ {
+ .name = "SamOEMChangePassword",
+ .id = RAP_SamOEMChgPasswordUser2_P,
+ .fn = api_SamOEMChangePassword
+ }, /* anon OK */
+ {
+ .name = NULL,
+ .id = -1,
+ .fn = api_Unsupported}
+ /*
+ * The following RAP calls are not implemented by Samba:
+ * RAP_WFileEnum2 - anon not OK
+ */
};
Handle remote api calls.
****************************************************************************/
-void api_reply(connection_struct *conn, uint16 vuid,
+void api_reply(connection_struct *conn, uint64_t vuid,
struct smb_request *req,
char *data, char *params,
int tdscnt, int tpscnt,
int mdrcnt, int mprcnt)
{
- struct smbd_server_connection *sconn = smbd_server_conn;
int api_command;
char *rdata = NULL;
char *rparam = NULL;
/* Check whether this api call can be done anonymously */
if (api_commands[i].auth_user && lp_restrict_anonymous()) {
- user_struct *user = get_valid_user_struct(sconn, vuid);
+ struct user_struct *user = get_valid_user_struct(req->sconn, vuid);
- if (!user || user->server_info->guest) {
+ if (!user || security_session_user_level(user->session_info, NULL) < SECURITY_USER) {
reply_nterror(req, NT_STATUS_ACCESS_DENIED);
return;
}
return;
}
- reply = api_commands[i].fn(conn,
+ reply = api_commands[i].fn(req->sconn, conn,
vuid,
params,tpscnt, /* params + length */
data,tdscnt, /* data + length */
if (rdata_len > mdrcnt || rparam_len > mprcnt) {
- reply = api_TooSmall(conn,vuid,params,data,mdrcnt,mprcnt,
+ reply = api_TooSmall(req->sconn,conn,vuid,params,data,
+ mdrcnt,mprcnt,
&rdata,&rparam,&rdata_len,&rparam_len);
}
/* if we get False back then it's actually unsupported */
if (!reply) {
- reply = api_Unsupported(conn,vuid,params,tpscnt,data,tdscnt,mdrcnt,mprcnt,
+ reply = api_Unsupported(req->sconn,conn,vuid,params,tpscnt,
+ data,
+ tdscnt,mdrcnt,mprcnt,
&rdata,&rparam,&rdata_len,&rparam_len);
}