diff options
Diffstat (limited to 'source3')
86 files changed, 6708 insertions, 6949 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index a6e8dd32d9..c088602baa 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -129,12 +129,12 @@ LIBMSRPC_OBJ = libsmb/cli_lsarpc.o libsmb/cli_samr.o libsmb/cli_spoolss.o \ rpc_client/cli_pipe.o RPC_SERVER_OBJ = rpc_server/srv_lsa.o rpc_server/srv_lsa_nt.o \ - rpc_server/srv_lsa_hnd.o rpc_server/srv_netlog.o \ + rpc_server/srv_lsa_hnd.o rpc_server/srv_netlog.o rpc_server/srv_netlog_nt.o \ rpc_server/srv_pipe_hnd.o rpc_server/srv_reg.o rpc_server/srv_reg_nt.o \ - rpc_server/srv_samr.o rpc_server/srv_srvsvc.o rpc_server/srv_srvsvc_nt.o \ + rpc_server/srv_samr.o rpc_server/srv_samr_nt.o rpc_server/srv_srvsvc.o rpc_server/srv_srvsvc_nt.o \ rpc_server/srv_util.o rpc_server/srv_wkssvc.o rpc_server/srv_wkssvc_nt.o \ rpc_server/srv_pipe.o rpc_server/srv_dfs.o rpc_server/srv_dfs_nt.o \ - rpc_server/srv_spoolss.o rpc_server/srv_spoolss_nt.o + rpc_server/srv_spoolss.o rpc_server/srv_spoolss_nt.o # this includes only the low level parse code, not stuff # that requires knowledge of security contexts @@ -150,7 +150,7 @@ RPC_PARSE_OBJ = rpc_parse/parse_lsa.o rpc_parse/parse_net.o \ RPC_PARSE_NEW_OBJ = rpc_parse/parse_lsa.o rpc_parse/parse_net.o \ rpc_parse/parse_reg.o rpc_parse/parse_rpc.o \ - rpc_parse/parse_srv.o rpc_parse/parse_samr_new.o \ + rpc_parse/parse_srv.o \ rpc_parse/parse_wks.o \ rpc_parse/parse_spoolss.o rpc_parse/parse_dfs.o \ rpc_parse/parse_creds.o diff --git a/source3/include/ntdomain.h b/source3/include/ntdomain.h index 0ae48169fb..a3fd51948d 100644 --- a/source3/include/ntdomain.h +++ b/source3/include/ntdomain.h @@ -152,6 +152,27 @@ struct msrpc_state uint32 pid; }; +/* + * Handle database - stored per pipe. + */ + +struct policy +{ + struct policy *next, *prev; + struct pipes_struct *p; + + POLICY_HND pol_hnd; + + void *data_ptr; + void (*free_fn)(void *); + +}; + +struct handle_list { + struct policy *Policy; + size_t count; +}; + typedef struct pipes_struct { struct pipes_struct *next, *prev; @@ -224,6 +245,10 @@ typedef struct pipes_struct /* talloc context to use when allocating memory on this pipe. */ TALLOC_CTX *mem_ctx; + + /* handle database to use on this pipe. */ + struct handle_list pipe_handles; + } pipes_struct; struct api_struct @@ -265,11 +290,7 @@ struct acct_info #include "rpc_lsa.h" #include "rpc_netlogon.h" #include "rpc_reg.h" -#if OLD_NTDOMAIN -#include "rpc_samr_old.h" -#else #include "rpc_samr.h" -#endif #include "rpc_srvsvc.h" #include "rpc_wkssvc.h" #include "rpc_spoolss.h" diff --git a/source3/include/proto.h b/source3/include/proto.h index 3a889ef7e9..6f37f8ffc9 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -26,6 +26,7 @@ BOOL check_access(int sock, char *allow_list, char *deny_list); /*The following definitions come from lib/bitmap.c */ struct bitmap *bitmap_allocate(int n); +void bitmap_free(struct bitmap *bm); BOOL bitmap_set(struct bitmap *bm, unsigned i); BOOL bitmap_clear(struct bitmap *bm, unsigned i); BOOL bitmap_query(struct bitmap *bm, unsigned i); @@ -178,7 +179,6 @@ BOOL msrpc_establish_connection(struct msrpc_state *msrpc, /*The following definitions come from lib/msrpc_use.c */ -#if OLD_NTDOMAIN void init_msrpc_use(void); void free_msrpc_use(void); struct msrpc_state *msrpc_use_add(const char* pipe_name, @@ -190,7 +190,6 @@ BOOL msrpc_use_del(const char* pipe_name, BOOL force_close, BOOL *connection_closed); void msrpc_net_use_enum(uint32 *num_cons, struct use_info ***use); -#endif /*The following definitions come from lib/pidfile.c */ @@ -218,377 +217,10 @@ void CatchChildLeaveStatus(void); int vslprintf(char *str, int n, char *format, va_list ap); -/*The following definitions come from libsmb/cliconnect.c */ - -BOOL cli_session_setup(struct cli_state *cli, - char *user, - char *pass, int passlen, - char *ntpass, int ntpasslen, - char *workgroup); -BOOL cli_ulogoff(struct cli_state *cli); -BOOL cli_send_tconX(struct cli_state *cli, - char *share, char *dev, char *pass, int passlen); -BOOL cli_tdis(struct cli_state *cli); -void cli_negprot_send(struct cli_state *cli); -BOOL cli_negprot(struct cli_state *cli); -BOOL cli_session_request(struct cli_state *cli, - struct nmb_name *calling, struct nmb_name *called); -BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip); -BOOL cli_reestablish_connection(struct cli_state *cli); -BOOL cli_establish_connection(struct cli_state *cli, - char *dest_host, struct in_addr *dest_ip, - struct nmb_name *calling, struct nmb_name *called, - char *service, char *service_type, - BOOL do_shutdown, BOOL do_tcon); -BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost, - struct in_addr *pdest_ip); - -/*The following definitions come from libsmb/clidgram.c */ - -int cli_send_mailslot(int dgram_sock, BOOL unique, char *mailslot, - char *buf, int len, - const char *srcname, int src_type, - const char *dstname, int dest_type, - struct in_addr dest_ip, struct in_addr src_ip, - int dest_port, int src_port); -int cli_get_response(int dgram_sock, BOOL unique, char *mailslot, char *buf, int bufsiz); -int cli_get_backup_list(const char *myname, const char *send_to_name); -int cli_get_backup_server(char *my_name, char *target, char *servername, int namesize); - -/*The following definitions come from libsmb/clientgen.c */ - -int cli_set_port(struct cli_state *cli, int port); -BOOL cli_receive_smb(struct cli_state *cli); -BOOL cli_send_smb(struct cli_state *cli); -void cli_setup_packet(struct cli_state *cli); -void cli_setup_bcc(struct cli_state *cli, void *p); -void cli_init_creds(struct cli_state *cli, const struct ntuser_creds *usr); -struct cli_state *cli_initialise(struct cli_state *cli); -void cli_shutdown(struct cli_state *cli); -void cli_sockopt(struct cli_state *cli, char *options); -uint16 cli_setpid(struct cli_state *cli, uint16 pid); - -/*The following definitions come from libsmb/clierror.c */ - -char *cli_errstr(struct cli_state *cli); -int cli_error(struct cli_state *cli, uint8 *eclass, uint32 *num, uint32 *nt_rpc_error); - -/*The following definitions come from libsmb/clifile.c */ - -BOOL cli_rename(struct cli_state *cli, char *fname_src, char *fname_dst); -BOOL cli_unlink(struct cli_state *cli, char *fname); -BOOL cli_mkdir(struct cli_state *cli, char *dname); -BOOL cli_rmdir(struct cli_state *cli, char *dname); -int cli_nt_create(struct cli_state *cli, char *fname, uint32 DesiredAccess); -int cli_open(struct cli_state *cli, char *fname, int flags, int share_mode); -BOOL cli_close(struct cli_state *cli, int fnum); -BOOL cli_lock(struct cli_state *cli, int fnum, - uint32 offset, uint32 len, int timeout, enum brl_type lock_type); -BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len); -BOOL cli_lock64(struct cli_state *cli, int fnum, - SMB_BIG_UINT offset, SMB_BIG_UINT len, int timeout, enum brl_type lock_type); -BOOL cli_unlock64(struct cli_state *cli, int fnum, SMB_BIG_UINT offset, SMB_BIG_UINT len); -BOOL cli_getattrE(struct cli_state *cli, int fd, - uint16 *attr, size_t *size, - time_t *c_time, time_t *a_time, time_t *m_time); -BOOL cli_getatr(struct cli_state *cli, char *fname, - uint16 *attr, size_t *size, time_t *t); -BOOL cli_setatr(struct cli_state *cli, char *fname, uint16 attr, time_t t); -BOOL cli_chkpath(struct cli_state *cli, char *path); -BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail); - -/*The following definitions come from libsmb/clilist.c */ - -int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute, - void (*fn)(file_info *, const char *, void *), void *state); -int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute, - void (*fn)(file_info *, const char *, void *), void *state); -int cli_list(struct cli_state *cli,const char *Mask,uint16 attribute, - void (*fn)(file_info *, const char *, void *), void *state); - -/*The following definitions come from libsmb/cli_lsarpc.c */ - -struct cli_state *cli_lsa_initialise(struct cli_state *cli, char *system_name, - struct ntuser_creds *creds); -void cli_lsa_shutdown(struct cli_state *cli); -uint32 cli_lsa_open_policy(struct cli_state *cli, BOOL sec_qos, - uint32 des_access, POLICY_HND *pol); -uint32 cli_lsa_close(struct cli_state *cli, POLICY_HND *pol); -uint32 cli_lsa_lookup_sids(struct cli_state *cli, POLICY_HND *pol, - int num_sids, DOM_SID *sids, char ***names, - uint32 **types, int *num_names); -uint32 cli_lsa_lookup_names(struct cli_state *cli, POLICY_HND *pol, - int num_names, char **names, DOM_SID **sids, - uint32 **types, int *num_sids); -uint32 cli_lsa_query_info_policy(struct cli_state *cli, POLICY_HND *pol, - uint16 info_class, fstring domain_name, - DOM_SID * domain_sid); -uint32 cli_lsa_enum_trust_dom(struct cli_state *cli, POLICY_HND *pol, - uint32 *enum_ctx, uint32 *num_domains, - char ***domain_names, DOM_SID **domain_sids); - -/*The following definitions come from libsmb/climessage.c */ - -BOOL cli_message_start(struct cli_state *cli, char *host, char *username, - int *grp); -BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp); -BOOL cli_message_end(struct cli_state *cli, int grp); - -/*The following definitions come from libsmb/cliprint.c */ - -int cli_print_queue(struct cli_state *cli, - void (*fn)(struct print_job_info *)); -int cli_printjob_del(struct cli_state *cli, int job); - -/*The following definitions come from libsmb/clirap.c */ - -BOOL cli_api_pipe(struct cli_state *cli, char *pipe_name, - uint16 *setup, uint32 setup_count, uint32 max_setup_count, - char *params, uint32 param_count, uint32 max_param_count, - char *data, uint32 data_count, uint32 max_data_count, - char **rparam, uint32 *rparam_count, - char **rdata, uint32 *rdata_count); -BOOL cli_api(struct cli_state *cli, - char *param, int prcnt, int mprcnt, - char *data, int drcnt, int mdrcnt, - char **rparam, int *rprcnt, - char **rdata, int *rdrcnt); -BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation); -int cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *, void *), void *state); -BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype, - void (*fn)(const char *, uint32, const char *, void *), - void *state); -BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password, - const char *old_password); -BOOL cli_qpathinfo(struct cli_state *cli, const char *fname, - time_t *c_time, time_t *a_time, time_t *m_time, - size_t *size, uint16 *mode); -BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, - time_t *c_time, time_t *a_time, time_t *m_time, - time_t *w_time, size_t *size, uint16 *mode, - SMB_INO_T *ino); -BOOL cli_qfileinfo(struct cli_state *cli, int fnum, - uint16 *mode, size_t *size, - time_t *c_time, time_t *a_time, time_t *m_time, - time_t *w_time, SMB_INO_T *ino); - -/*The following definitions come from libsmb/clireadwrite.c */ - -size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t size); -ssize_t cli_write(struct cli_state *cli, - int fnum, uint16 write_mode, - char *buf, off_t offset, size_t size); -ssize_t cli_smbwrite(struct cli_state *cli, - int fnum, char *buf, off_t offset, size_t size1); - -/*The following definitions come from libsmb/cli_samr.c */ - -#if NEW_NTDOMAIN -struct cli_state *cli_samr_initialise(struct cli_state *cli, char *system_name, - struct ntuser_creds *creds); -void cli_samr_shutdown(struct cli_state *cli); -uint32 cli_samr_connect(struct cli_state *cli, char *srv_name, - uint32 access_mask, POLICY_HND *connect_pol); -uint32 cli_samr_close(struct cli_state *cli, POLICY_HND *connect_pol); -uint32 cli_samr_open_domain(struct cli_state *cli, POLICY_HND *connect_pol, - uint32 access_mask, DOM_SID *domain_sid, - POLICY_HND *domain_pol); -uint32 cli_samr_open_user(struct cli_state *cli, POLICY_HND *domain_pol, - uint32 access_mask, uint32 user_rid, - POLICY_HND *user_pol); -uint32 cli_samr_open_group(struct cli_state *cli, POLICY_HND *domain_pol, - uint32 access_mask, uint32 group_rid, - POLICY_HND *group_pol); -uint32 cli_samr_query_userinfo(struct cli_state *cli, POLICY_HND *user_pol, - uint16 switch_value, SAM_USERINFO_CTR *ctr); -uint32 cli_samr_query_groupinfo(struct cli_state *cli, POLICY_HND *group_pol, - uint32 info_level, GROUP_INFO_CTR *ctr); -uint32 cli_samr_query_usergroups(struct cli_state *cli, POLICY_HND *user_pol, - uint32 *num_groups, DOM_GID **gid); -uint32 cli_samr_query_groupmem(struct cli_state *cli, POLICY_HND *group_pol, - uint32 *num_mem, uint32 **rid, uint32 **attr); -#endif - -/*The following definitions come from libsmb/clisecdesc.c */ - -SEC_DESC *cli_query_secdesc(struct cli_state *cli,int fd); -BOOL cli_set_secdesc(struct cli_state *cli,int fd, SEC_DESC *sd); - -/*The following definitions come from libsmb/cli_spoolss.c */ - -struct cli_state *cli_spoolss_initialise(struct cli_state *cli, - char *system_name, - struct ntuser_creds *creds); -void cli_spoolss_shutdown(struct cli_state *cli); -uint32 cli_spoolss_open_printer_ex(struct cli_state *cli, char *printername, - char *datatype, uint32 access_required, - char *station, char *username, - POLICY_HND *pol); -uint32 cli_spoolss_closeprinter(struct cli_state *cli, POLICY_HND *pol); -uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, - uint32 level, int *returned, - PRINTER_INFO_CTR *ctr); -uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, - int *returned, PORT_INFO_CTR *ctr); -uint32 cli_spoolss_getprinter(struct cli_state *cli, POLICY_HND *pol, - uint32 level, PRINTER_INFO_CTR *ctr); - -/*The following definitions come from libsmb/clistr.c */ - -int clistr_push(struct cli_state *cli, void *dest, const char *src, int dest_len, int flags); -int clistr_push_size(struct cli_state *cli, const void *dest, const char *src, int dest_len, int flags); -int clistr_pull(struct cli_state *cli, char *dest, const void *src, int dest_len, int src_len, int flags); -int clistr_pull_size(struct cli_state *cli, const void *src, int src_len); -int clistr_align(struct cli_state *cli, int offset); - -/*The following definitions come from libsmb/clitrans.c */ - -BOOL cli_send_trans(struct cli_state *cli, int trans, - char *pipe_name, - int fid, int flags, - uint16 *setup, int lsetup, int msetup, - char *param, int lparam, int mparam, - char *data, int ldata, int mdata); -BOOL cli_receive_trans(struct cli_state *cli,int trans, - char **param, int *param_len, - char **data, int *data_len); -BOOL cli_send_nt_trans(struct cli_state *cli, - int function, - int flags, - uint16 *setup, int lsetup, int msetup, - char *param, int lparam, int mparam, - char *data, int ldata, int mdata); -BOOL cli_receive_nt_trans(struct cli_state *cli, - char **param, int *param_len, - char **data, int *data_len); - -/*The following definitions come from libsmb/credentials.c */ - -char *credstr(uchar *cred); -void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass, - uchar session_key[8]); -void cred_create(uchar session_key[8], DOM_CHAL *stor_cred, UTIME timestamp, - DOM_CHAL *cred); -int cred_assert(DOM_CHAL *cred, uchar session_key[8], DOM_CHAL *stored_cred, - UTIME timestamp); -BOOL clnt_deal_with_creds(uchar sess_key[8], - DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred); -BOOL deal_with_creds(uchar sess_key[8], - DOM_CRED *sto_clnt_cred, - DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred); - -/*The following definitions come from libsmb/namequery.c */ - -struct node_status *name_status_query(int fd,struct nmb_name *name, - struct in_addr to_ip, int *num_names); -BOOL name_status_find(int type, struct in_addr to_ip, char *name); -BOOL name_register(int fd, const char *name, int name_type, - struct in_addr name_ip, int opcode, - BOOL bcast, - struct in_addr to_ip, int *count); -struct in_addr *name_query(int fd,const char *name,int name_type, - BOOL bcast,BOOL recurse, - struct in_addr to_ip, int *count); -FILE *startlmhosts(char *fname); -BOOL getlmhostsent( FILE *fp, pstring name, int *name_type, struct in_addr *ipaddr); -void endlmhosts(FILE *fp); -BOOL name_register_wins(const char *name, int name_type); -BOOL name_resolve_bcast(const char *name, int name_type, - struct in_addr **return_ip_list, int *return_count); -BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type); -BOOL resolve_srv_name(const char* srv_name, fstring dest_host, - struct in_addr *ip); -BOOL find_master_ip(char *group, struct in_addr *master_ip); -BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pdc_ip, char *ret_name); -BOOL get_dc_list(BOOL pdc_only, char *group, struct in_addr **ip_list, int *count); - -/*The following definitions come from libsmb/nmblib.c */ - -void debug_nmb_packet(struct packet_struct *p); -char *nmb_namestr(struct nmb_name *n); -struct packet_struct *copy_packet(struct packet_struct *packet); -void free_packet(struct packet_struct *packet); -struct packet_struct *parse_packet(char *buf,int length, - enum packet_type packet_type); -struct packet_struct *read_packet(int fd,enum packet_type packet_type); -void make_nmb_name( struct nmb_name *n, const char *name, int type); -BOOL nmb_name_equal(struct nmb_name *n1, struct nmb_name *n2); -int build_packet(char *buf, struct packet_struct *p); -BOOL send_packet(struct packet_struct *p); -struct packet_struct *receive_packet(int fd,enum packet_type type,int t); -struct packet_struct *receive_nmb_packet(int fd, int t, int trn_id); -struct packet_struct *receive_dgram_packet(int fd, int t, char *mailslot_name); -BOOL match_mailslot_name(struct packet_struct *p, char *mailslot_name); -void sort_query_replies(char *data, int n, struct in_addr ip); -char *dns_to_netbios_name(char *dns_name); -int name_mangle( char *In, char *Out, char name_type ); -int name_extract(char *buf,int ofs,char *name); -int name_len(char *s1); - -/*The following definitions come from libsmb/nterr.c */ - -BOOL get_safe_nt_error_msg(uint32 nt_code,char *msg, size_t len); -char *get_nt_error_msg(uint32 nt_code); - -/*The following definitions come from libsmb/passchange.c */ - -BOOL remote_password_change(const char *remote_machine, const char *user_name, - const char *old_passwd, const char *new_passwd, - char *err_str, size_t err_str_len); - -/*The following definitions come from libsmb/pwd_cache.c */ - -void pwd_init(struct pwd_info *pwd); -BOOL pwd_is_nullpwd(const struct pwd_info *pwd); -BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2); -void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt); -void pwd_set_nullpwd(struct pwd_info *pwd); -void pwd_set_cleartext(struct pwd_info *pwd, char *clr); -void pwd_get_cleartext(struct pwd_info *pwd, char *clr); -void pwd_set_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]); -void pwd_get_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]); -void pwd_make_lm_nt_16(struct pwd_info *pwd, char *clr); -void pwd_make_lm_nt_owf(struct pwd_info *pwd, uchar cryptkey[8]); -void pwd_get_lm_nt_owf(struct pwd_info *pwd, uchar lm_owf[24], uchar nt_owf[24]); - /*The following definitions come from lib/smbrun.c */ int smbrun(char *cmd,char *outfile,BOOL shared); -/*The following definitions come from libsmb/smbdes.c */ - -void E_P16(unsigned char *p14,unsigned char *p16); -void E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24); -void D_P16(unsigned char *p14, unsigned char *in, unsigned char *out); -void E_old_pw_hash( unsigned char *p14, unsigned char *in, unsigned char *out); -void cred_hash1(unsigned char *out,unsigned char *in,unsigned char *key); -void cred_hash2(unsigned char *out,unsigned char *in,unsigned char *key); -void cred_hash3(unsigned char *out,unsigned char *in,unsigned char *key, int forw); -void SamOEMhash( unsigned char *data, unsigned char *key, int val); - -/*The following definitions come from libsmb/smbencrypt.c */ - -void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24); -void E_md4hash(uchar *passwd, uchar *p16); -void nt_lm_owf_gen(char *pwd, uchar nt_p16[16], uchar p16[16]); -void SMBOWFencrypt(uchar passwd[16], uchar *c8, uchar p24[24]); -void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24]); -void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24); -BOOL make_oem_passwd_hash(char data[516], const char *passwd, uchar old_pw_hash[16], BOOL unicode); -BOOL decode_pw_buffer(char buffer[516], char *new_pwrd, - int new_pwrd_size, uint32 *new_pw_len); - -/*The following definitions come from libsmb/smberr.c */ - -char *smb_errstr(char *inbuf); - -/*The following definitions come from libsmb/unexpected.c */ - -void unexpected_packet(struct packet_struct *p); -void clear_unexpected(time_t t); -struct packet_struct *receive_unexpected(enum packet_type packet_type, int id, - char *mailslot_name); - /*The following definitions come from lib/snprintf.c */ @@ -772,23 +404,6 @@ BOOL user_in_group_list(char *user,char *gname); BOOL user_in_list(char *user,char *list); struct passwd *smb_getpwnam(char *user, BOOL allow_change); -/*The following definitions come from lib/util_array.c */ - -void free_void_array(uint32 num_entries, void **entries, - void(free_item)(void*)); -void* add_copy_to_array(uint32 *len, void ***array, const void *item, - void*(item_dup)(const void*), BOOL alloc_anyway); -void* add_item_to_array(uint32 *len, void ***array, void *item); -void free_use_info_array(uint32 num_entries, struct use_info **entries); -struct use_info* add_use_info_to_array(uint32 *len, struct use_info ***array, - const struct use_info *name); -void free_char_array(uint32 num_entries, char **entries); -char* add_chars_to_array(uint32 *len, char ***array, const char *name); -void free_uint32_array(uint32 num_entries, uint32 **entries); -uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name); -void free_sid_array(uint32 num_entries, DOM_SID **entries); -DOM_SID* add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid); - /*The following definitions come from lib/util.c */ char *tmpdir(void); @@ -857,6 +472,23 @@ BOOL ms_has_wild(char *s); BOOL mask_match(char *string, char *pattern, BOOL is_case_sensitive); int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6); +/*The following definitions come from lib/util_array.c */ + +void free_void_array(uint32 num_entries, void **entries, + void(free_item)(void*)); +void* add_copy_to_array(uint32 *len, void ***array, const void *item, + void*(item_dup)(const void*), BOOL alloc_anyway); +void* add_item_to_array(uint32 *len, void ***array, void *item); +void free_use_info_array(uint32 num_entries, struct use_info **entries); +struct use_info* add_use_info_to_array(uint32 *len, struct use_info ***array, + const struct use_info *name); +void free_char_array(uint32 num_entries, char **entries); +char* add_chars_to_array(uint32 *len, char ***array, const char *name); +void free_uint32_array(uint32 num_entries, uint32 **entries); +uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name); +void free_sid_array(uint32 num_entries, DOM_SID **entries); +DOM_SID* add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid); + /*The following definitions come from lib/util_file.c */ BOOL do_file_lock(int fd, int waitsecs, int type); @@ -1083,6 +715,371 @@ struct in_addr wins_srv_ip( void ); void wins_srv_died( struct in_addr boothill_ip ); unsigned long wins_srv_count( void ); +/*The following definitions come from libsmb/cli_lsarpc.c */ + +struct cli_state *cli_lsa_initialise(struct cli_state *cli, char *system_name, + struct ntuser_creds *creds); +void cli_lsa_shutdown(struct cli_state *cli); +uint32 cli_lsa_open_policy(struct cli_state *cli, BOOL sec_qos, + uint32 des_access, POLICY_HND *pol); +uint32 cli_lsa_close(struct cli_state *cli, POLICY_HND *pol); +uint32 cli_lsa_lookup_sids(struct cli_state *cli, POLICY_HND *pol, + int num_sids, DOM_SID *sids, char ***names, + uint32 **types, int *num_names); +uint32 cli_lsa_lookup_names(struct cli_state *cli, POLICY_HND *pol, + int num_names, char **names, DOM_SID **sids, + uint32 **types, int *num_sids); +uint32 cli_lsa_query_info_policy(struct cli_state *cli, POLICY_HND *pol, + uint16 info_class, fstring domain_name, + DOM_SID * domain_sid); +uint32 cli_lsa_enum_trust_dom(struct cli_state *cli, POLICY_HND *pol, + uint32 *enum_ctx, uint32 *num_domains, + char ***domain_names, DOM_SID **domain_sids); + +/*The following definitions come from libsmb/cli_samr.c */ + +struct cli_state *cli_samr_initialise(struct cli_state *cli, char *system_name, + struct ntuser_creds *creds); +void cli_samr_shutdown(struct cli_state *cli); +uint32 cli_samr_connect(struct cli_state *cli, char *srv_name, + uint32 access_mask, POLICY_HND *connect_pol); +uint32 cli_samr_close(struct cli_state *cli, POLICY_HND *connect_pol); +uint32 cli_samr_open_domain(struct cli_state *cli, POLICY_HND *connect_pol, + uint32 access_mask, DOM_SID *domain_sid, + POLICY_HND *domain_pol); +uint32 cli_samr_open_user(struct cli_state *cli, POLICY_HND *domain_pol, + uint32 access_mask, uint32 user_rid, + POLICY_HND *user_pol); +uint32 cli_samr_open_group(struct cli_state *cli, POLICY_HND *domain_pol, + uint32 access_mask, uint32 group_rid, + POLICY_HND *group_pol); +uint32 cli_samr_query_userinfo(struct cli_state *cli, POLICY_HND *user_pol, + uint16 switch_value, SAM_USERINFO_CTR *ctr); +uint32 cli_samr_query_groupinfo(struct cli_state *cli, POLICY_HND *group_pol, + uint32 info_level, GROUP_INFO_CTR *ctr); +uint32 cli_samr_query_usergroups(struct cli_state *cli, POLICY_HND *user_pol, + uint32 *num_groups, DOM_GID **gid); +uint32 cli_samr_query_groupmem(struct cli_state *cli, POLICY_HND *group_pol, + uint32 *num_mem, uint32 **rid, uint32 **attr); + +/*The following definitions come from libsmb/cli_spoolss.c */ + +struct cli_state *cli_spoolss_initialise(struct cli_state *cli, + char *system_name, + struct ntuser_creds *creds); +void cli_spoolss_shutdown(struct cli_state *cli); +uint32 cli_spoolss_open_printer_ex(struct cli_state *cli, char *printername, + char *datatype, uint32 access_required, + char *station, char *username, + POLICY_HND *pol); +uint32 cli_spoolss_closeprinter(struct cli_state *cli, POLICY_HND *pol); +uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, + uint32 level, int *returned, + PRINTER_INFO_CTR *ctr); +uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, + int *returned, PORT_INFO_CTR *ctr); +uint32 cli_spoolss_getprinter(struct cli_state *cli, POLICY_HND *pol, + uint32 level, PRINTER_INFO_CTR *ctr); + +/*The following definitions come from libsmb/cliconnect.c */ + +BOOL cli_session_setup(struct cli_state *cli, + char *user, + char *pass, int passlen, + char *ntpass, int ntpasslen, + char *workgroup); +BOOL cli_ulogoff(struct cli_state *cli); +BOOL cli_send_tconX(struct cli_state *cli, + char *share, char *dev, char *pass, int passlen); +BOOL cli_tdis(struct cli_state *cli); +void cli_negprot_send(struct cli_state *cli); +BOOL cli_negprot(struct cli_state *cli); +BOOL cli_session_request(struct cli_state *cli, + struct nmb_name *calling, struct nmb_name *called); +BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip); +BOOL cli_reestablish_connection(struct cli_state *cli); +BOOL cli_establish_connection(struct cli_state *cli, + char *dest_host, struct in_addr *dest_ip, + struct nmb_name *calling, struct nmb_name *called, + char *service, char *service_type, + BOOL do_shutdown, BOOL do_tcon); +BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost, + struct in_addr *pdest_ip); + +/*The following definitions come from libsmb/clidgram.c */ + +int cli_send_mailslot(int dgram_sock, BOOL unique, char *mailslot, + char *buf, int len, + const char *srcname, int src_type, + const char *dstname, int dest_type, + struct in_addr dest_ip, struct in_addr src_ip, + int dest_port, int src_port); +int cli_get_response(int dgram_sock, BOOL unique, char *mailslot, char *buf, int bufsiz); +int cli_get_backup_list(const char *myname, const char *send_to_name); +int cli_get_backup_server(char *my_name, char *target, char *servername, int namesize); + +/*The following definitions come from libsmb/clientgen.c */ + +int cli_set_port(struct cli_state *cli, int port); +BOOL cli_receive_smb(struct cli_state *cli); +BOOL cli_send_smb(struct cli_state *cli); +void cli_setup_packet(struct cli_state *cli); +void cli_setup_bcc(struct cli_state *cli, void *p); +void cli_init_creds(struct cli_state *cli, const struct ntuser_creds *usr); +struct cli_state *cli_initialise(struct cli_state *cli); +void cli_shutdown(struct cli_state *cli); +void cli_sockopt(struct cli_state *cli, char *options); +uint16 cli_setpid(struct cli_state *cli, uint16 pid); + +/*The following definitions come from libsmb/clierror.c */ + +char *cli_errstr(struct cli_state *cli); +int cli_error(struct cli_state *cli, uint8 *eclass, uint32 *num, uint32 *nt_rpc_error); + +/*The following definitions come from libsmb/clifile.c */ + +BOOL cli_rename(struct cli_state *cli, char *fname_src, char *fname_dst); +BOOL cli_unlink(struct cli_state *cli, char *fname); +BOOL cli_mkdir(struct cli_state *cli, char *dname); +BOOL cli_rmdir(struct cli_state *cli, char *dname); +int cli_nt_create(struct cli_state *cli, char *fname, uint32 DesiredAccess); +int cli_open(struct cli_state *cli, char *fname, int flags, int share_mode); +BOOL cli_close(struct cli_state *cli, int fnum); +BOOL cli_lock(struct cli_state *cli, int fnum, + uint32 offset, uint32 len, int timeout, enum brl_type lock_type); +BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len); +BOOL cli_lock64(struct cli_state *cli, int fnum, + SMB_BIG_UINT offset, SMB_BIG_UINT len, int timeout, enum brl_type lock_type); +BOOL cli_unlock64(struct cli_state *cli, int fnum, SMB_BIG_UINT offset, SMB_BIG_UINT len); +BOOL cli_getattrE(struct cli_state *cli, int fd, + uint16 *attr, size_t *size, + time_t *c_time, time_t *a_time, time_t *m_time); +BOOL cli_getatr(struct cli_state *cli, char *fname, + uint16 *attr, size_t *size, time_t *t); +BOOL cli_setatr(struct cli_state *cli, char *fname, uint16 attr, time_t t); +BOOL cli_chkpath(struct cli_state *cli, char *path); +BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail); + +/*The following definitions come from libsmb/clilist.c */ + +int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute, + void (*fn)(file_info *, const char *, void *), void *state); +int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute, + void (*fn)(file_info *, const char *, void *), void *state); +int cli_list(struct cli_state *cli,const char *Mask,uint16 attribute, + void (*fn)(file_info *, const char *, void *), void *state); + +/*The following definitions come from libsmb/climessage.c */ + +BOOL cli_message_start(struct cli_state *cli, char *host, char *username, + int *grp); +BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp); +BOOL cli_message_end(struct cli_state *cli, int grp); + +/*The following definitions come from libsmb/cliprint.c */ + +int cli_print_queue(struct cli_state *cli, + void (*fn)(struct print_job_info *)); +int cli_printjob_del(struct cli_state *cli, int job); + +/*The following definitions come from libsmb/clirap.c */ + +BOOL cli_api_pipe(struct cli_state *cli, char *pipe_name, + uint16 *setup, uint32 setup_count, uint32 max_setup_count, + char *params, uint32 param_count, uint32 max_param_count, + char *data, uint32 data_count, uint32 max_data_count, + char **rparam, uint32 *rparam_count, + char **rdata, uint32 *rdata_count); +BOOL cli_api(struct cli_state *cli, + char *param, int prcnt, int mprcnt, + char *data, int drcnt, int mdrcnt, + char **rparam, int *rprcnt, + char **rdata, int *rdrcnt); +BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation); +int cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *, void *), void *state); +BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype, + void (*fn)(const char *, uint32, const char *, void *), + void *state); +BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password, + const char *old_password); +BOOL cli_qpathinfo(struct cli_state *cli, const char *fname, + time_t *c_time, time_t *a_time, time_t *m_time, + size_t *size, uint16 *mode); +BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, + time_t *c_time, time_t *a_time, time_t *m_time, + time_t *w_time, size_t *size, uint16 *mode, + SMB_INO_T *ino); +BOOL cli_qfileinfo(struct cli_state *cli, int fnum, + uint16 *mode, size_t *size, + time_t *c_time, time_t *a_time, time_t *m_time, + time_t *w_time, SMB_INO_T *ino); + +/*The following definitions come from libsmb/clireadwrite.c */ + +size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t size); +ssize_t cli_write(struct cli_state *cli, + int fnum, uint16 write_mode, + char *buf, off_t offset, size_t size); +ssize_t cli_smbwrite(struct cli_state *cli, + int fnum, char *buf, off_t offset, size_t size1); + +/*The following definitions come from libsmb/clisecdesc.c */ + +SEC_DESC *cli_query_secdesc(struct cli_state *cli,int fd); +BOOL cli_set_secdesc(struct cli_state *cli,int fd, SEC_DESC *sd); + +/*The following definitions come from libsmb/clistr.c */ + +int clistr_push(struct cli_state *cli, void *dest, const char *src, int dest_len, int flags); +int clistr_push_size(struct cli_state *cli, const void *dest, const char *src, int dest_len, int flags); +int clistr_pull(struct cli_state *cli, char *dest, const void *src, int dest_len, int src_len, int flags); +int clistr_pull_size(struct cli_state *cli, const void *src, int src_len); +int clistr_align(struct cli_state *cli, int offset); + +/*The following definitions come from libsmb/clitrans.c */ + +BOOL cli_send_trans(struct cli_state *cli, int trans, + char *pipe_name, + int fid, int flags, + uint16 *setup, int lsetup, int msetup, + char *param, int lparam, int mparam, + char *data, int ldata, int mdata); +BOOL cli_receive_trans(struct cli_state *cli,int trans, + char **param, int *param_len, + char **data, int *data_len); +BOOL cli_send_nt_trans(struct cli_state *cli, + int function, + int flags, + uint16 *setup, int lsetup, int msetup, + char *param, int lparam, int mparam, + char *data, int ldata, int mdata); +BOOL cli_receive_nt_trans(struct cli_state *cli, + char **param, int *param_len, + char **data, int *data_len); + +/*The following definitions come from libsmb/credentials.c */ + +char *credstr(uchar *cred); +void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass, + uchar session_key[8]); +void cred_create(uchar session_key[8], DOM_CHAL *stor_cred, UTIME timestamp, + DOM_CHAL *cred); +int cred_assert(DOM_CHAL *cred, uchar session_key[8], DOM_CHAL *stored_cred, + UTIME timestamp); +BOOL clnt_deal_with_creds(uchar sess_key[8], + DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred); +BOOL deal_with_creds(uchar sess_key[8], + DOM_CRED *sto_clnt_cred, + DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred); + +/*The following definitions come from libsmb/namequery.c */ + +struct node_status *name_status_query(int fd,struct nmb_name *name, + struct in_addr to_ip, int *num_names); +BOOL name_status_find(int type, struct in_addr to_ip, char *name); +BOOL name_register(int fd, const char *name, int name_type, + struct in_addr name_ip, int opcode, + BOOL bcast, + struct in_addr to_ip, int *count); +struct in_addr *name_query(int fd,const char *name,int name_type, + BOOL bcast,BOOL recurse, + struct in_addr to_ip, int *count); +FILE *startlmhosts(char *fname); +BOOL getlmhostsent( FILE *fp, pstring name, int *name_type, struct in_addr *ipaddr); +void endlmhosts(FILE *fp); +BOOL name_register_wins(const char *name, int name_type); +BOOL name_resolve_bcast(const char *name, int name_type, + struct in_addr **return_ip_list, int *return_count); +BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type); +BOOL resolve_srv_name(const char* srv_name, fstring dest_host, + struct in_addr *ip); +BOOL find_master_ip(char *group, struct in_addr *master_ip); +BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pdc_ip, char *ret_name); +BOOL get_dc_list(BOOL pdc_only, char *group, struct in_addr **ip_list, int *count); + +/*The following definitions come from libsmb/nmblib.c */ + +void debug_nmb_packet(struct packet_struct *p); +char *nmb_namestr(struct nmb_name *n); +struct packet_struct *copy_packet(struct packet_struct *packet); +void free_packet(struct packet_struct *packet); +struct packet_struct *parse_packet(char *buf,int length, + enum packet_type packet_type); +struct packet_struct *read_packet(int fd,enum packet_type packet_type); +void make_nmb_name( struct nmb_name *n, const char *name, int type); +BOOL nmb_name_equal(struct nmb_name *n1, struct nmb_name *n2); +int build_packet(char *buf, struct packet_struct *p); +BOOL send_packet(struct packet_struct *p); +struct packet_struct *receive_packet(int fd,enum packet_type type,int t); +struct packet_struct *receive_nmb_packet(int fd, int t, int trn_id); +struct packet_struct *receive_dgram_packet(int fd, int t, char *mailslot_name); +BOOL match_mailslot_name(struct packet_struct *p, char *mailslot_name); +void sort_query_replies(char *data, int n, struct in_addr ip); +char *dns_to_netbios_name(char *dns_name); +int name_mangle( char *In, char *Out, char name_type ); +int name_extract(char *buf,int ofs,char *name); +int name_len(char *s1); + +/*The following definitions come from libsmb/nterr.c */ + +BOOL get_safe_nt_error_msg(uint32 nt_code,char *msg, size_t len); +char *get_nt_error_msg(uint32 nt_code); + +/*The following definitions come from libsmb/passchange.c */ + +BOOL remote_password_change(const char *remote_machine, const char *user_name, + const char *old_passwd, const char *new_passwd, + char *err_str, size_t err_str_len); + +/*The following definitions come from libsmb/pwd_cache.c */ + +void pwd_init(struct pwd_info *pwd); +BOOL pwd_is_nullpwd(const struct pwd_info *pwd); +BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2); +void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt); +void pwd_set_nullpwd(struct pwd_info *pwd); +void pwd_set_cleartext(struct pwd_info *pwd, char *clr); +void pwd_get_cleartext(struct pwd_info *pwd, char *clr); +void pwd_set_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]); +void pwd_get_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]); +void pwd_make_lm_nt_16(struct pwd_info *pwd, char *clr); +void pwd_make_lm_nt_owf(struct pwd_info *pwd, uchar cryptkey[8]); +void pwd_get_lm_nt_owf(struct pwd_info *pwd, uchar lm_owf[24], uchar nt_owf[24]); + +/*The following definitions come from libsmb/smbdes.c */ + +void E_P16(unsigned char *p14,unsigned char *p16); +void E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24); +void D_P16(unsigned char *p14, unsigned char *in, unsigned char *out); +void E_old_pw_hash( unsigned char *p14, unsigned char *in, unsigned char *out); +void cred_hash1(unsigned char *out,unsigned char *in,unsigned char *key); +void cred_hash2(unsigned char *out,unsigned char *in,unsigned char *key); +void cred_hash3(unsigned char *out,unsigned char *in,unsigned char *key, int forw); +void SamOEMhash( unsigned char *data, unsigned char *key, int val); + +/*The following definitions come from libsmb/smbencrypt.c */ + +void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24); +void E_md4hash(uchar *passwd, uchar *p16); +void nt_lm_owf_gen(char *pwd, uchar nt_p16[16], uchar p16[16]); +void SMBOWFencrypt(uchar passwd[16], uchar *c8, uchar p24[24]); +void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24]); +void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24); +BOOL make_oem_passwd_hash(char data[516], const char *passwd, uchar old_pw_hash[16], BOOL unicode); +BOOL decode_pw_buffer(char buffer[516], char *new_pwrd, + int new_pwrd_size, uint32 *new_pw_len); + +/*The following definitions come from libsmb/smberr.c */ + +char *smb_errstr(char *inbuf); + +/*The following definitions come from libsmb/unexpected.c */ + +void unexpected_packet(struct packet_struct *p); +void clear_unexpected(time_t t); +struct packet_struct *receive_unexpected(enum packet_type packet_type, int id, + char *mailslot_name); + /*The following definitions come from locking/brlock.c */ void brl_init(int read_only); @@ -1169,6 +1166,9 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question, struct name_record **n); void kill_async_dns_child(void); +/*The following definitions come from nmbd/nmbd.c */ + + /*The following definitions come from nmbd/nmbd_become_dmb.c */ void add_domain_names(time_t t); @@ -1199,9 +1199,6 @@ void announce_and_sync_with_domain_master_browser( struct subnet_record *subrec, void collect_all_workgroup_names_from_wins_server(time_t t); void sync_all_dmbs(time_t t); -/*The following definitions come from nmbd/nmbd.c */ - - /*The following definitions come from nmbd/nmbd_elections.c */ void check_master_browser_exists(time_t t); @@ -1963,7 +1960,6 @@ BOOL parse_lpq_entry(int snum,char *line, /*The following definitions come from printing/nt_printing.c */ -#if OLD_NTDOMAIN BOOL nt_printing_init(void); int get_ntforms(nt_forms_struct **list); int write_ntforms(nt_forms_struct **list, int number); @@ -2002,7 +1998,6 @@ void map_printer_permissions(SEC_DESC *sd); BOOL print_access_check(struct current_user *user, int snum, int access_type); BOOL print_time_access_check(int snum); uint32 printer_write_default_dev(int snum, const PRINTER_DEFAULT *printer_default); -#endif /*The following definitions come from printing/pcap.c */ @@ -2014,16 +2009,18 @@ void pcap_printer_fn(void (*fn)(char *, char *)); void cups_printer_fn(void (*fn)(char *, char *)); int cups_printername_ok(char *name); +/*The following definitions come from printing/print_svid.c */ + +void sysv_printer_fn(void (*fn)(char *, char *)); +int sysv_printername_ok(char *name); + /*The following definitions come from printing/printfsp.c */ -#if OLD_NTDOMAIN files_struct *print_fsp_open(connection_struct *conn,char *jobname); void print_fsp_end(files_struct *fsp, BOOL normal_close); -#endif /*The following definitions come from printing/printing.c */ -#if OLD_NTDOMAIN BOOL print_backend_init(void); BOOL print_job_exists(int jobid); int print_job_snum(int jobid); @@ -2044,12 +2041,6 @@ int print_queue_snum(char *qname); BOOL print_queue_pause(struct current_user *user, int snum, int *errcode); BOOL print_queue_resume(struct current_user *user, int snum, int *errcode); BOOL print_queue_purge(struct current_user *user, int snum, int *errcode); -#endif - -/*The following definitions come from printing/print_svid.c */ - -void sysv_printer_fn(void (*fn)(char *, char *)); -int sysv_printername_ok(char *name); /*The following definitions come from profile/profile.c */ @@ -2170,7 +2161,6 @@ BOOL do_reg_close(struct cli_state *cli, POLICY_HND *hnd); /*The following definitions come from rpc_client/cli_samr.c */ -#if OLD_NTDOMAIN BOOL get_samr_query_usergroups(struct cli_state *cli, POLICY_HND *pol_open_domain, uint32 user_rid, uint32 *num_groups, DOM_GID *gid); @@ -2209,7 +2199,6 @@ BOOL do_samr_query_usergroups(struct cli_state *cli, BOOL do_samr_query_userinfo(struct cli_state *cli, POLICY_HND *pol, uint16 switch_value, void* usr); BOOL do_samr_close(struct cli_state *cli, POLICY_HND *hnd); -#endif /*The following definitions come from rpc_client/cli_spoolss_notify.c */ @@ -2263,17 +2252,6 @@ BOOL do_wks_query_info(struct cli_state *cli, char *server_name, uint32 switch_value, WKS_INFO_100 *wks100); -/*The following definitions come from rpcclient/cmd_lsarpc.c */ - - -/*The following definitions come from rpcclient/cmd_samr.c */ - -#if NEW_NTDOMAIN -#endif - -/*The following definitions come from rpcclient/cmd_spoolss.c */ - - /*The following definitions come from rpc_client/ncacn_np_use.c */ BOOL ncacn_np_use_del(const char *srv_name, const char *pipe_name, @@ -2287,12 +2265,6 @@ struct ncacn_np *ncacn_np_use_add(const char *pipe_name, const struct ntuser_creds *ntc, BOOL reuse, BOOL *is_new_connection); -/*The following definitions come from rpcclient/rpcclient.c */ - -void fetch_domain_sid(void); -void init_rpcclient_creds(struct ntuser_creds *creds); -void add_command_set(struct cmd_set *cmd_set); - /*The following definitions come from rpc_parse/parse_creds.c */ BOOL make_creds_unix(CREDS_UNIX *r_u, const char* user_name, @@ -2531,13 +2503,12 @@ void init_sam_info(DOM_SAM_INFO *sam, char *logon_srv, char *comp_name, DOM_CRED *clnt_cred, DOM_CRED *rtn_cred, uint16 logon_level, NET_ID_INFO_CTR *ctr); -void init_net_user_info3(NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, +void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, uint16 logon_count, uint16 bad_pw_count, uint32 num_groups, DOM_GID *gids, uint32 user_flgs, char *sess_key, char *logon_srv, char *logon_dom, DOM_SID *dom_sid, char *other_sids); -void free_user_info3(NET_USER_INFO_3 *usr); BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth); BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth); BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth); @@ -2716,273 +2687,459 @@ BOOL smb_io_rpc_auth_ntlmssp_chk(char *desc, RPC_AUTH_NTLMSSP_CHK *chk, prs_stru /*The following definitions come from rpc_parse/parse_samr.c */ -#if OLD_NTDOMAIN -void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND *q_c, POLICY_HND *hnd); -BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int depth); -BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int depth); -void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u, - POLICY_HND *connect_pol, - uint32 access_mask, DOM_SID *sid); -BOOL samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN *q_u, prs_struct *ps, int depth); -BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, int depth); -void init_samr_q_unknown_2c(SAMR_Q_UNKNOWN_2C *q_u, POLICY_HND *user_pol); -BOOL samr_io_q_unknown_2c(char *desc, SAMR_Q_UNKNOWN_2C *q_u, prs_struct *ps, int depth); -void init_samr_r_unknown_2c(SAMR_R_UNKNOWN_2C *q_u, uint32 status); -BOOL samr_io_r_unknown_2c(char *desc, SAMR_R_UNKNOWN_2C *r_u, prs_struct *ps, int depth); -void init_samr_q_unknown_3(SAMR_Q_UNKNOWN_3 *q_u, - POLICY_HND *user_pol, uint16 switch_value); -BOOL samr_io_q_unknown_3(char *desc, SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int depth); -void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u, - POLICY_HND *domain_pol, uint16 switch_value); -BOOL samr_io_q_query_dom_info(char *desc, SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_struct *ps, int depth); -BOOL init_unk_info1(SAM_UNK_INFO_1 *u_1); -void init_unk_info2(SAM_UNK_INFO_2 *u_2, char *domain, char *server); -BOOL sam_io_unk_info2(char *desc, SAM_UNK_INFO_2 *u_2, prs_struct *ps, int depth); -BOOL init_unk_info3(SAM_UNK_INFO_3 * u_3); -BOOL init_unk_info6(SAM_UNK_INFO_6 * u_6); -BOOL init_unk_info7(SAM_UNK_INFO_7 *u_7); -BOOL init_unk_info12(SAM_UNK_INFO_12 * u_12); -void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u, - uint16 switch_value, SAM_UNK_CTR *ctr, - uint32 status); -BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_struct *ps, int depth); -void init_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid); -void init_samr_r_unknown_3(SAMR_R_UNKNOWN_3 *r_u, - uint16 unknown_2, uint16 unknown_3, - uint32 unknown_4, uint16 unknown_6, uint16 unknown_7, - int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS], - uint32 status); -BOOL samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int depth); -void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol, - uint16 req_num_entries, uint16 unk_0, - uint16 acb_mask, uint16 unk_1, uint32 size); -BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth); -void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u, - uint16 total_num_entries, uint16 unk_0, - uint32 num_sam_entries, SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], uint32 status); -BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth); -void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol, uint32 size); -BOOL samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth); -void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, - uint32 num_sam_entries, SAM_USER_INFO_21 grps[MAX_SAM_ENTRIES], - uint32 status); -BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth); -void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol, - uint16 switch_level, uint32 start_idx, uint32 size); -BOOL samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth); -void init_sam_info_2(SAM_INFO_2 *sam, uint32 acb_mask, - uint32 start_idx, uint32 num_sam_entries, - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]); -void init_sam_info_1(SAM_INFO_1 *sam, uint32 acb_mask, - uint32 start_idx, uint32 num_sam_entries, - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]); -void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u, - uint16 switch_level, SAM_INFO_CTR *ctr, uint32 status); -BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth); -void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol, - uint16 switch_level, uint32 start_idx, uint32 size); -BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth); -void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u, - uint32 start_idx, uint32 num_sam_entries, - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], - uint32 status); -BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth); -void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e, - POLICY_HND *pol, - uint16 switch_level); -BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth); -void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u, uint32 switch_level, - char* alias, char* alias_desc); -BOOL samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth); -BOOL samr_io_q_lookup_ids(char *desc, SAMR_Q_LOOKUP_IDS *q_u, prs_struct *ps, int depth); -void init_samr_r_lookup_ids(SAMR_R_LOOKUP_IDS *r_u, - uint32 num_rids, uint32 *rid, uint32 status); -BOOL samr_io_r_lookup_ids(char *desc, SAMR_R_LOOKUP_IDS *r_u, prs_struct *ps, int depth); -BOOL samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth); -void init_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u, - uint32 num_rids, uint32 *rid, enum SID_NAME_USE *type, uint32 status); -BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth); -BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps, int depth); -void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u, - uint32 num_aliases, fstring *als_name, uint32 *num_als_usrs, - uint32 status); -BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS *r_u, prs_struct *ps, int depth); -void init_samr_q_open_user(SAMR_Q_OPEN_USER *q_u, POLICY_HND *pol, - uint32 access_mask, uint32 rid); -BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER *q_u, - prs_struct *ps, int depth); -BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth); -void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u, - POLICY_HND *hnd); -BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth); -void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u, - uint32 num_gids, DOM_GID *gid, uint32 status); -BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth); -void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u, - POLICY_HND *hnd, uint16 switch_value); -BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth); -void init_sam_user_info10(SAM_USER_INFO_10 *usr, - uint32 acb_info); -BOOL sam_io_user_info10(char *desc, SAM_USER_INFO_10 *usr, prs_struct *ps, int depth); -void init_sam_user_info11(SAM_USER_INFO_11 *usr, - NTTIME *expiry, - char *mach_acct, - uint32 rid_user, - uint32 rid_group, - uint16 acct_ctrl); -BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int depth); -void init_sam_user_info21(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw); -void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u, - uint16 switch_value, void *info, uint32 status); -BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, - prs_struct *ps, int depth); -BOOL samr_io_q_create_user(char *desc, SAMR_Q_CREATE_USER *q_u, prs_struct *ps, int depth); -BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER *r_u, prs_struct *ps, int depth); -void init_samr_q_connect(SAMR_Q_CONNECT *q_u, char *srv_name, - uint32 access_mask); -BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth); -BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int depth); -void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON *q_u); -BOOL samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON *q_u, prs_struct *ps, int depth); -BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON *r_u, prs_struct *ps, int depth); -void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u, - uint32 unknown_0, uint32 rid); -BOOL samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth); -BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth); -void init_samr_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u, - POLICY_HND *pol, uint32 rid, - uint32 num_gids, uint32 *gid); -void init_samr_q_unknown_21(SAMR_Q_UNKNOWN_21 *q_c, - POLICY_HND *hnd, uint16 unk_1, uint16 unk_2); -void init_samr_q_unknown_13(SAMR_Q_UNKNOWN_13 *q_c, - POLICY_HND *hnd, uint16 unk_1, uint16 unk_2); -void init_samr_q_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, char *srv_name); -BOOL samr_io_q_unknown_38(char *desc, SAMR_Q_UNKNOWN_38 *q_u, prs_struct *ps, int depth); -void init_samr_r_unknown_38(SAMR_R_UNKNOWN_38 *r_u); -BOOL samr_io_r_unknown_38(char *desc, SAMR_R_UNKNOWN_38 *r_u, prs_struct *ps, int depth); -void init_enc_passwd(SAMR_ENC_PASSWD *pwd, char pass[512]); -BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth); -void init_enc_hash(SAMR_ENC_HASH *hsh, uchar hash[16]); -BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth); -void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u, - char *dest_host, char *user_name, - char nt_newpass[516], uchar nt_oldhash[16], - char lm_newpass[516], uchar lm_oldhash[16]); -BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER *q_u, prs_struct *ps, int depth); -void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER *r_u, uint32 status); -BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct *ps, int depth); -BOOL samr_io_q_lookup_domain(char* desc, SAMR_Q_LOOKUP_DOMAIN* q_u, prs_struct *ps, int depth); -BOOL init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u, - DOM_SID *dom_sid, uint32 status); -BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN * r_u, - prs_struct *ps, int depth); -BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS * q_e, - prs_struct *ps, int depth); -BOOL init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u, - uint32 next_idx, fstring* domains, uint32 num_sam_entries); -BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u, - prs_struct *ps, int depth); -void free_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr); -BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps, int depth); -void free_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u); -BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO *r_u, prs_struct *ps, int depth); -BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 *q_u, prs_struct *ps, int depth); -void free_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u); -BOOL make_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 *r_u, uint32 status); -BOOL samr_io_r_set_userinfo2(char *desc, SAMR_R_SET_USERINFO2 *r_u, prs_struct *ps, int depth); -#endif - -/*The following definitions come from rpc_parse/parse_samr_new.c */ - -#if NEW_NTDOMAIN -BOOL init_samr_q_connect(SAMR_Q_CONNECT * q_u, char *srv_name, - uint32 access_mask); -BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT * q_u, prs_struct *ps, - int depth); -BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT * r_u, prs_struct *ps, - int depth); -BOOL init_samr_q_close_hnd(SAMR_Q_CLOSE_HND * q_c, POLICY_HND *hnd); +void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND * q_c, POLICY_HND *hnd); BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND * q_u, prs_struct *ps, int depth); BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND * r_u, prs_struct *ps, int depth); -BOOL init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN * q_u, - POLICY_HND *connect_pol, uint32 access_mask, +void init_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN * q_u, + POLICY_HND *pol, char *dom_name); +BOOL samr_io_q_lookup_domain(char *desc, SAMR_Q_LOOKUP_DOMAIN * q_u, + prs_struct *ps, int depth); +void init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u, + DOM_SID *dom_sid, uint32 status); +BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN * r_u, + prs_struct *ps, int depth); +void init_samr_q_unknown_2d(SAMR_Q_UNKNOWN_2D * q_u, POLICY_HND *dom_pol, DOM_SID *sid); +BOOL samr_io_q_unknown_2d(char *desc, SAMR_Q_UNKNOWN_2D * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_unknown_2d(char *desc, SAMR_R_UNKNOWN_2D * r_u, + prs_struct *ps, int depth); +void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN * q_u, + POLICY_HND *pol, uint32 flags, DOM_SID *sid); BOOL samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN * q_u, prs_struct *ps, int depth); BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN * r_u, prs_struct *ps, int depth); -BOOL init_samr_q_open_user(SAMR_Q_OPEN_USER * q_u, POLICY_HND *pol, - uint32 access_mask, uint32 rid); -BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER * q_u, - prs_struct *ps, int depth); -BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER * r_u, - prs_struct *ps, int depth); -BOOL init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO * q_u, - POLICY_HND *hnd, uint16 switch_value); -BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO * q_u, +void init_samr_q_get_usrdom_pwinfo(SAMR_Q_GET_USRDOM_PWINFO * q_u, + POLICY_HND *user_pol); +BOOL samr_io_q_get_usrdom_pwinfo(char *desc, SAMR_Q_GET_USRDOM_PWINFO * q_u, + prs_struct *ps, int depth); +void init_samr_r_get_usrdom_pwinfo(SAMR_R_GET_USRDOM_PWINFO *r_u, uint32 status); +BOOL samr_io_r_get_usrdom_pwinfo(char *desc, SAMR_R_GET_USRDOM_PWINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ * q_u, + POLICY_HND *user_pol, uint32 sec_info); +BOOL samr_io_q_query_sec_obj(char *desc, SAMR_Q_QUERY_SEC_OBJ * q_u, + prs_struct *ps, int depth); +void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO * q_u, + POLICY_HND *domain_pol, uint16 switch_value); +BOOL samr_io_q_query_dom_info(char *desc, SAMR_Q_QUERY_DOMAIN_INFO * q_u, prs_struct *ps, int depth); -BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO * r_u, +void init_unk_info3(SAM_UNK_INFO_3 * u_3); +void init_unk_info6(SAM_UNK_INFO_6 * u_6); +void init_unk_info7(SAM_UNK_INFO_7 * u_7); +void init_unk_info12(SAM_UNK_INFO_12 * u_12); +void init_unk_info2(SAM_UNK_INFO_2 * u_2, + char *domain, char *server, + uint32 seq_num); +void init_unk_info1(SAM_UNK_INFO_1 * u_1); +void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO * r_u, + uint16 switch_value, SAM_UNK_CTR * ctr, + uint32 status); +BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO * r_u, prs_struct *ps, int depth); -BOOL samr_io_userinfo_ctr(char *desc, SAM_USERINFO_CTR * ctr, - prs_struct *ps, int depth); -void free_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr); -BOOL sam_io_user_info10(char *desc, SAM_USER_INFO_10 * usr, - prs_struct *ps, int depth); -BOOL init_sam_user_info11(SAM_USER_INFO_11 * usr, - NTTIME * expiry, - char *mach_acct, - uint32 rid_user, uint32 rid_group, uint16 acct_ctrl); -BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 * usr, - prs_struct *ps, int depth); -BOOL sam_io_user_info12(char *desc, SAM_USER_INFO_12 * u, - prs_struct *ps, int depth); -BOOL sam_io_user_info21(char *desc, SAM_USER_INFO_21 * usr, - prs_struct *ps, int depth); -BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 * usr, - prs_struct *ps, int depth); -BOOL init_sam_user_info24(SAM_USER_INFO_24 * usr, - const char newpass[516], uint16 passlen); -BOOL sam_io_user_info24(char *desc, SAM_USER_INFO_24 * usr, - prs_struct *ps, int depth); -BOOL sam_io_logon_hrs(char *desc, LOGON_HRS * hrs, prs_struct *ps, - int depth); -BOOL init_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO * q_e, +BOOL samr_io_r_query_sec_obj(char *desc, SAMR_R_QUERY_SEC_OBJ * r_u, + prs_struct *ps, int depth); +void init_sam_entry(SAM_ENTRY * sam, uint32 len_sam_name, uint32 rid); +void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS * q_e, POLICY_HND *pol, + uint32 start_idx, + uint16 acb_mask, uint16 unk_1, uint32 size); +BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS * q_e, + prs_struct *ps, int depth); +void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS * r_u, + uint32 next_idx, uint32 num_sam_entries); +BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS * r_u, + prs_struct *ps, int depth); +void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO * q_e, POLICY_HND *pol, + uint16 switch_level, uint32 start_idx, + uint32 max_entries); +BOOL samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO * q_e, + prs_struct *ps, int depth); +void init_sam_dispinfo_1(SAM_DISPINFO_1 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]); +void init_sam_dispinfo_2(SAM_DISPINFO_2 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]); +void init_sam_dispinfo_3(SAM_DISPINFO_3 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + DOMAIN_GRP * grp); +void init_sam_dispinfo_4(SAM_DISPINFO_4 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]); +void init_sam_dispinfo_5(SAM_DISPINFO_5 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + DOMAIN_GRP * grp); +void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO * r_u, + uint32 num_entries, uint32 data_size, + uint16 switch_level, SAM_DISPINFO_CTR * ctr, + uint32 status); +BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_open_group(SAMR_Q_OPEN_GROUP * q_c, + POLICY_HND *hnd, + uint32 access_mask, uint32 rid); +BOOL samr_io_q_open_group(char *desc, SAMR_Q_OPEN_GROUP * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_open_group(char *desc, SAMR_R_OPEN_GROUP * r_u, + prs_struct *ps, int depth); +void init_samr_group_info1(GROUP_INFO1 * gr1, + char *acct_name, char *acct_desc, + uint32 num_members); +BOOL samr_io_group_info1(char *desc, GROUP_INFO1 * gr1, + prs_struct *ps, int depth); +void init_samr_group_info4(GROUP_INFO4 * gr4, char *acct_desc); +BOOL samr_io_group_info4(char *desc, GROUP_INFO4 * gr4, + prs_struct *ps, int depth); +void init_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP * q_e, + POLICY_HND *pol, char *acct_desc, + uint32 access_mask); +BOOL samr_io_q_create_dom_group(char *desc, SAMR_Q_CREATE_DOM_GROUP * q_e, + prs_struct *ps, int depth); +BOOL samr_io_r_create_dom_group(char *desc, SAMR_R_CREATE_DOM_GROUP * r_u, + prs_struct *ps, int depth); +void init_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP * q_c, + POLICY_HND *hnd); +BOOL samr_io_q_delete_dom_group(char *desc, SAMR_Q_DELETE_DOM_GROUP * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_delete_dom_group(char *desc, SAMR_R_DELETE_DOM_GROUP * r_u, + prs_struct *ps, int depth); +void init_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM * q_e, + POLICY_HND *pol, uint32 rid); +BOOL samr_io_q_del_groupmem(char *desc, SAMR_Q_DEL_GROUPMEM * q_e, + prs_struct *ps, int depth); +void init_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM * r_u, POLICY_HND *pol, + uint32 status); +BOOL samr_io_r_del_groupmem(char *desc, SAMR_R_DEL_GROUPMEM * r_u, + prs_struct *ps, int depth); +void init_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM * q_e, + POLICY_HND *pol, uint32 rid); +BOOL samr_io_q_add_groupmem(char *desc, SAMR_Q_ADD_GROUPMEM * q_e, + prs_struct *ps, int depth); +void init_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM * r_u, POLICY_HND *pol, + uint32 status); +BOOL samr_io_r_add_groupmem(char *desc, SAMR_R_ADD_GROUPMEM * r_u, + prs_struct *ps, int depth); +void init_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO * q_e, + POLICY_HND *pol, GROUP_INFO_CTR * ctr); +BOOL samr_io_q_set_groupinfo(char *desc, SAMR_Q_SET_GROUPINFO * q_e, + prs_struct *ps, int depth); +void init_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO * r_u, uint32 status); +BOOL samr_io_r_set_groupinfo(char *desc, SAMR_R_SET_GROUPINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO * q_e, POLICY_HND *pol, uint16 switch_level); BOOL samr_io_q_query_groupinfo(char *desc, SAMR_Q_QUERY_GROUPINFO * q_e, prs_struct *ps, int depth); +void init_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO * r_u, + GROUP_INFO_CTR * ctr, uint32 status); BOOL samr_io_r_query_groupinfo(char *desc, SAMR_R_QUERY_GROUPINFO * r_u, prs_struct *ps, int depth); -BOOL samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u, - POLICY_HND *hnd); -BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS * q_u, - prs_struct *ps, int depth); -BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS * r_u, - prs_struct *ps, int depth); -BOOL init_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM * q_c, POLICY_HND *hnd); +void init_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM * q_c, POLICY_HND *hnd); BOOL samr_io_q_query_groupmem(char *desc, SAMR_Q_QUERY_GROUPMEM * q_u, prs_struct *ps, int depth); +void init_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM * r_u, + uint32 num_entries, uint32 *rid, + uint32 *attr, uint32 status); BOOL samr_io_r_query_groupmem(char *desc, SAMR_R_QUERY_GROUPMEM * r_u, prs_struct *ps, int depth); -void samr_free_r_query_groupmem(SAMR_R_QUERY_GROUPMEM * r_u); -BOOL samr_group_info_ctr(char *desc, GROUP_INFO_CTR * ctr, prs_struct *ps, - int depth); +void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u, + POLICY_HND *hnd); +BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS * q_u, + prs_struct *ps, int depth); +void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS * r_u, + uint32 num_gids, DOM_GID * gid, + uint32 status); BOOL samr_io_gids(char *desc, uint32 *num_gids, DOM_GID ** gid, prs_struct *ps, int depth); -BOOL samr_io_group_info1(char *desc, GROUP_INFO1 * gr1, +BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS * r_u, + prs_struct *ps, int depth); +void init_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS * q_e, + POLICY_HND *pol, + uint32 start_idx, uint32 size); +BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS * q_e, + prs_struct *ps, int depth); +void init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u, + uint32 next_idx, uint32 num_sam_entries); +BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u, + prs_struct *ps, int depth); +void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS * q_e, + POLICY_HND *pol, + uint32 start_idx, uint32 size); +BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS * q_e, + prs_struct *ps, int depth); +void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS * r_u, + uint32 next_idx, uint32 num_sam_entries); +BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS * r_u, + prs_struct *ps, int depth); +void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES * q_e, + POLICY_HND *pol, uint32 start_idx, + uint32 size); +BOOL samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES * q_e, + prs_struct *ps, int depth); +void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, uint32 next_idx, uint32 num_sam_entries); +BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES * r_u, + prs_struct *ps, int depth); +void init_samr_alias_info3(ALIAS_INFO3 * al3, char *acct_desc); +BOOL samr_io_alias_info3(char *desc, ALIAS_INFO3 * al3, prs_struct *ps, int depth); -BOOL samr_io_group_info4(char *desc, GROUP_INFO4 * gr4, +BOOL samr_alias_info_ctr(char *desc, ALIAS_INFO_CTR * ctr, prs_struct *ps, int depth); -BOOL init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u, - POLICY_HND *hnd); -BOOL init_samr_q_open_group(SAMR_Q_OPEN_GROUP * q_c, POLICY_HND *hnd, - uint32 access_mask, uint32 rid); -BOOL samr_io_q_open_group(char *desc, SAMR_Q_OPEN_GROUP * q_u, +void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO * q_e, + POLICY_HND *pol, uint16 switch_level); +BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO * q_e, + prs_struct *ps, int depth); +void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO * r_u, + ALIAS_INFO_CTR * ctr, uint32 status); +BOOL samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO * q_u, + POLICY_HND *hnd, ALIAS_INFO_CTR * ctr); +BOOL samr_io_q_set_aliasinfo(char *desc, SAMR_Q_SET_ALIASINFO * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_set_aliasinfo(char *desc, SAMR_R_SET_ALIASINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES * q_u, + POLICY_HND *hnd, + uint32 num_sids, + uint32 *ptr_sid, DOM_SID2 * sid); +BOOL samr_io_q_query_useraliases(char *desc, SAMR_Q_QUERY_USERALIASES * q_u, + prs_struct *ps, int depth); +void init_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES * r_u, + uint32 num_rids, uint32 *rid, + uint32 status); +BOOL samr_io_rids(char *desc, uint32 *num_rids, uint32 **rid, + prs_struct *ps, int depth); +BOOL samr_io_r_query_useraliases(char *desc, SAMR_R_QUERY_USERALIASES * r_u, + prs_struct *ps, int depth); +void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS * q_u, POLICY_HND *pol, + uint32 unknown_0, uint32 rid); +BOOL samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS * q_u, prs_struct *ps, int depth); -BOOL samr_io_r_open_group(char *desc, SAMR_R_OPEN_GROUP * r_u, +BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS * r_u, prs_struct *ps, int depth); -#endif +void init_samr_q_lookup_rids(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_RIDS * q_u, + POLICY_HND *pol, uint32 flags, + uint32 num_rids, uint32 *rid); +BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS * q_u, + prs_struct *ps, int depth); +void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS * r_u, + uint32 num_names, UNIHDR * hdr_name, + UNISTR2 *uni_name, uint32 *type); +BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS * r_u, + prs_struct *ps, int depth); +void init_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS * q_u, POLICY_HND *hnd); +BOOL samr_io_q_delete_alias(char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_delete_alias(char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u, + prs_struct *ps, int depth); +void init_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS * q_u, + POLICY_HND *hnd, char *acct_desc); +BOOL samr_io_q_create_dom_alias(char *desc, SAMR_Q_CREATE_DOM_ALIAS * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_create_dom_alias(char *desc, SAMR_R_CREATE_DOM_ALIAS * r_u, + prs_struct *ps, int depth); +void init_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM * q_u, POLICY_HND *hnd, + DOM_SID *sid); +BOOL samr_io_q_add_aliasmem(char *desc, SAMR_Q_ADD_ALIASMEM * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_add_aliasmem(char *desc, SAMR_R_ADD_ALIASMEM * r_u, + prs_struct *ps, int depth); +void init_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM * q_u, POLICY_HND *hnd, + DOM_SID *sid); +BOOL samr_io_q_del_aliasmem(char *desc, SAMR_Q_DEL_ALIASMEM * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_del_aliasmem(char *desc, SAMR_R_DEL_ALIASMEM * r_u, + prs_struct *ps, int depth); +void init_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS * q_c, + POLICY_HND *hnd); +BOOL samr_io_q_delete_dom_alias(char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u, + prs_struct *ps, int depth); +void init_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS * r_u, + uint32 status); +BOOL samr_io_r_delete_dom_alias(char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u, + prs_struct *ps, int depth); +void init_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM * q_c, + POLICY_HND *hnd); +BOOL samr_io_q_query_aliasmem(char *desc, SAMR_Q_QUERY_ALIASMEM * q_u, + prs_struct *ps, int depth); +void init_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM * r_u, + uint32 num_sids, DOM_SID2 * sid, + uint32 status); +BOOL samr_io_r_query_aliasmem(char *desc, SAMR_R_QUERY_ALIASMEM * r_u, + prs_struct *ps, int depth); +void init_samr_q_lookup_names(SAMR_Q_LOOKUP_NAMES * q_u, + POLICY_HND *pol, uint32 flags, + uint32 num_names, char **name); +BOOL samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES * q_u, + prs_struct *ps, int depth); +void init_samr_r_lookup_names(TALLOC_CTX *ctx, SAMR_R_LOOKUP_NAMES * r_u, + uint32 num_rids, + uint32 *rid, uint32 *type, + uint32 status); +BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES * r_u, + prs_struct *ps, int depth); +void init_samr_q_delete_dom_user(SAMR_Q_DELETE_DOM_USER * q_c, + POLICY_HND *hnd); +BOOL samr_io_q_delete_dom_user(char *desc, SAMR_Q_DELETE_DOM_USER * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_delete_dom_user(char *desc, SAMR_R_DELETE_DOM_USER * r_u, + prs_struct *ps, int depth); +void init_samr_q_open_user(SAMR_Q_OPEN_USER * q_u, + POLICY_HND *pol, + uint32 access_mask, uint32 rid); +BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER * r_u, + prs_struct *ps, int depth); +void init_samr_q_create_user(SAMR_Q_CREATE_USER * q_u, + POLICY_HND *pol, + char *name, + uint32 acb_info, uint32 access_mask); +BOOL samr_io_q_create_user(char *desc, SAMR_Q_CREATE_USER * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER * r_u, + prs_struct *ps, int depth); +void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO * q_u, + POLICY_HND *hnd, uint16 switch_value); +BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO * q_u, + prs_struct *ps, int depth); +void init_sam_user_info12(SAM_USER_INFO_12 * usr, + uint8 lm_pwd[16], uint8 nt_pwd[16]); +void init_sam_user_info10(SAM_USER_INFO_10 * usr, uint32 acb_info); +void init_sam_user_info11(SAM_USER_INFO_11 * usr, + NTTIME * expiry, + char *mach_acct, + uint32 rid_user, uint32 rid_group, uint16 acct_ctrl); +void init_sam_user_info24(SAM_USER_INFO_24 * usr, + char newpass[516], uint16 passlen); +void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */ + NTTIME * logoff_time, /* all zeros */ + NTTIME * kickoff_time, /* all zeros */ + NTTIME * pass_last_set_time, /* all zeros */ + NTTIME * pass_can_change_time, /* all zeros */ + NTTIME * pass_must_change_time, /* all zeros */ + UNISTR2 *user_name, + UNISTR2 *full_name, + UNISTR2 *home_dir, + UNISTR2 *dir_drive, + UNISTR2 *log_scr, + UNISTR2 *prof_path, + UNISTR2 *desc, + UNISTR2 *wkstas, + UNISTR2 *unk_str, + UNISTR2 *mung_dial, + uint32 user_rid, /* 0x0000 0000 */ + uint32 group_rid, + uint32 acb_info, + uint32 unknown_3, + uint16 logon_divs, + LOGON_HRS * hrs, + uint32 unknown_5, + char newpass[516], uint32 unknown_6); +void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */ + NTTIME * logoff_time, /* all zeros */ + NTTIME * kickoff_time, /* all zeros */ + NTTIME * pass_last_set_time, /* all zeros */ + NTTIME * pass_can_change_time, /* all zeros */ + NTTIME * pass_must_change_time, /* all zeros */ + char *user_name, /* NULL */ + char *full_name, + char *home_dir, char *dir_drive, char *log_scr, + char *prof_path, char *desc, char *wkstas, + char *unk_str, char *mung_dial, uint32 user_rid, /* 0x0000 0000 */ + uint32 group_rid, uint32 acb_info, + uint32 unknown_3, uint16 logon_divs, + LOGON_HRS * hrs, uint32 unknown_5, + char newpass[516], uint32 unknown_6); +void init_sam_user_info21W(SAM_USER_INFO_21 * usr, + NTTIME * logon_time, + NTTIME * logoff_time, + NTTIME * kickoff_time, + NTTIME * pass_last_set_time, + NTTIME * pass_can_change_time, + NTTIME * pass_must_change_time, + UNISTR2 *user_name, + UNISTR2 *full_name, + UNISTR2 *home_dir, + UNISTR2 *dir_drive, + UNISTR2 *log_scr, + UNISTR2 *prof_path, + UNISTR2 *desc, + UNISTR2 *wkstas, + UNISTR2 *unk_str, + UNISTR2 *mung_dial, + uchar lm_pwd[16], + uchar nt_pwd[16], + uint32 user_rid, + uint32 group_rid, + uint32 acb_info, + uint32 unknown_3, + uint16 logon_divs, + LOGON_HRS * hrs, + uint32 unknown_5, uint32 unknown_6); +void init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw); +uint32 make_samr_userinfo_ctr_usr21(TALLOC_CTX *ctx, SAM_USERINFO_CTR * ctr, + uint16 switch_value, + SAM_USER_INFO_21 * usr); +void init_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr, uchar * sess_key, + uint16 switch_value, void *info); +void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO * r_u, + SAM_USERINFO_CTR * ctr, uint32 status); +BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u, + POLICY_HND *hnd, unsigned char sess_key[16], + uint16 switch_value, void *info); +BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO * q_u, + prs_struct *ps, int depth); +void init_samr_r_set_userinfo(SAMR_R_SET_USERINFO * r_u, uint32 status); +BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO * r_u, + prs_struct *ps, int depth); +void init_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 * q_u, + POLICY_HND *hnd, unsigned char sess_key[16], + uint16 switch_value, SAM_USERINFO_CTR * ctr); +BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 * q_u, + prs_struct *ps, int depth); +void init_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 * r_u, uint32 status); +BOOL samr_io_r_set_userinfo2(char *desc, SAMR_R_SET_USERINFO2 * r_u, + prs_struct *ps, int depth); +void init_samr_q_connect(SAMR_Q_CONNECT * q_u, + char *srv_name, uint32 access_mask); +BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT * r_u, + prs_struct *ps, int depth); +void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON * q_u); +BOOL samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON * r_u, + prs_struct *ps, int depth); +void init_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO * q_u, + char *srv_name); +BOOL samr_io_q_get_dom_pwinfo(char *desc, SAMR_Q_GET_DOM_PWINFO * q_u, + prs_struct *ps, int depth); +BOOL samr_io_r_get_dom_pwinfo(char *desc, SAMR_R_GET_DOM_PWINFO * r_u, + prs_struct *ps, int depth); +void init_enc_passwd(SAMR_ENC_PASSWD * pwd, char pass[512]); +BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD * pwd, + prs_struct *ps, int depth); +void init_enc_hash(SAMR_ENC_HASH * hsh, uchar hash[16]); +BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH * hsh, + prs_struct *ps, int depth); +void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER * q_u, + char *dest_host, char *user_name, + char nt_newpass[516], + uchar nt_oldhash[16], + char lm_newpass[516], + uchar lm_oldhash[16]); +BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER * q_u, + prs_struct *ps, int depth); +void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER * r_u, uint32 status); +BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER * r_u, + prs_struct *ps, int depth); /*The following definitions come from rpc_parse/parse_sec.c */ @@ -3234,8 +3391,6 @@ void init_srv_q_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n, uint32 preferred_len, ENUM_HND *hnd); BOOL srv_io_q_net_share_enum(char *desc, SRV_Q_NET_SHARE_ENUM *q_n, prs_struct *ps, int depth); BOOL srv_io_r_net_share_enum(char *desc, SRV_R_NET_SHARE_ENUM *r_n, prs_struct *ps, int depth); -void free_srv_q_net_share_get_info(SRV_Q_NET_SHARE_GET_INFO *q_n); -void free_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n); BOOL srv_io_q_net_share_get_info(char *desc, SRV_Q_NET_SHARE_GET_INFO *q_n, prs_struct *ps, int depth); BOOL srv_io_r_net_share_get_info(char *desc, SRV_R_NET_SHARE_GET_INFO *r_n, prs_struct *ps, int depth); void init_srv_sess_info0_str(SESS_INFO_0_STR *ss0, char *name); @@ -3276,6 +3431,7 @@ void init_srv_q_net_file_enum(SRV_Q_NET_FILE_ENUM *q_n, ENUM_HND *hnd); BOOL srv_io_q_net_file_enum(char *desc, SRV_Q_NET_FILE_ENUM *q_n, prs_struct *ps, int depth); BOOL srv_io_r_net_file_enum(char *desc, SRV_R_NET_FILE_ENUM *r_n, prs_struct *ps, int depth); +void init_srv_info_100(SRV_INFO_100 *sv100, uint32 platform_id, char *name); void init_srv_info_101(SRV_INFO_101 *sv101, uint32 platform_id, char *name, uint32 ver_major, uint32 ver_minor, uint32 srv_type, char *comment); @@ -3324,28 +3480,18 @@ uint32 _dfs_get_info(pipes_struct *p, DFS_Q_DFS_GET_INFO *q_u, DFS_R_DFS_GET_INF /*The following definitions come from rpc_server/srv_lsa.c */ -#if OLD_NTDOMAIN BOOL api_ntlsa_rpc(pipes_struct *p); -#endif /*The following definitions come from rpc_server/srv_lsa_hnd.c */ -#if OLD_NTDOMAIN -void create_policy_handle(POLICY_HND *hnd, uint32 *hnd_low, uint32 *hnd_high); -void init_lsa_policy_hnd(void); -BOOL open_lsa_policy_hnd(POLICY_HND *hnd); -int find_lsa_policy_by_hnd(POLICY_HND *hnd); -BOOL set_lsa_policy_samr_pol_status(POLICY_HND *hnd, uint32 pol_status); -BOOL set_lsa_policy_samr_sid(POLICY_HND *hnd, DOM_SID *sid); -BOOL get_lsa_policy_samr_sid(POLICY_HND *hnd, DOM_SID *sid); -uint32 get_lsa_policy_samr_rid(POLICY_HND *hnd); -BOOL set_lsa_policy_reg_name(POLICY_HND *hnd, fstring name); -BOOL close_lsa_policy_hnd(POLICY_HND *hnd); -#endif +void init_pipe_handles(pipes_struct *p); +BOOL create_policy_hnd(pipes_struct *p, POLICY_HND *hnd, void (*free_fn)(void *), void *data_ptr); +BOOL find_policy_by_hnd(pipes_struct *p, POLICY_HND *hnd, void **data_p); +BOOL close_policy_hnd(pipes_struct *p, POLICY_HND *hnd); +void close_policy_by_pipe(pipes_struct *p); /*The following definitions come from rpc_server/srv_lsa_nt.c */ -#if OLD_NTDOMAIN uint32 _lsa_open_policy2(pipes_struct *p, LSA_Q_OPEN_POL2 *q_u, LSA_R_OPEN_POL2 *r_u); uint32 _lsa_open_policy(pipes_struct *p, LSA_Q_OPEN_POL *q_u, LSA_R_OPEN_POL *r_u); uint32 _lsa_enum_trust_dom(pipes_struct *p, LSA_Q_ENUM_TRUST_DOM *q_u, LSA_R_ENUM_TRUST_DOM *r_u); @@ -3354,17 +3500,23 @@ uint32 _lsa_lookup_sids(pipes_struct *p, LSA_Q_LOOKUP_SIDS *q_u, LSA_R_LOOKUP_SI uint32 _lsa_lookup_names(pipes_struct *p,LSA_Q_LOOKUP_NAMES *q_u, LSA_R_LOOKUP_NAMES *r_u); uint32 _lsa_close(pipes_struct *p, LSA_Q_CLOSE *q_u, LSA_R_CLOSE *r_u); uint32 _lsa_open_secret(pipes_struct *p, LSA_Q_OPEN_SECRET *q_u, LSA_R_OPEN_SECRET *r_u); -#endif /*The following definitions come from rpc_server/srv_netlog.c */ -#if OLD_NTDOMAIN BOOL api_netlog_rpc(pipes_struct *p); -#endif + +/*The following definitions come from rpc_server/srv_netlog_nt.c */ + +uint32 _net_logon_ctrl2(pipes_struct *p, NET_Q_LOGON_CTRL2 *q_u, NET_R_LOGON_CTRL2 *r_u); +uint32 _net_trust_dom_list(pipes_struct *p, NET_Q_TRUST_DOM_LIST *q_u, NET_R_TRUST_DOM_LIST *r_u); +uint32 _net_req_chal(pipes_struct *p, NET_Q_REQ_CHAL *q_u, NET_R_REQ_CHAL *r_u); +uint32 _net_auth_2(pipes_struct *p, NET_Q_AUTH_2 *q_u, NET_R_AUTH_2 *r_u); +uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_u); +uint32 _net_sam_logoff(pipes_struct *p, NET_Q_SAM_LOGOFF *q_u, NET_R_SAM_LOGOFF *r_u); +uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_u); /*The following definitions come from rpc_server/srv_pipe.c */ -#if OLD_NTDOMAIN BOOL create_next_pdu(pipes_struct *p); BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p); BOOL setup_fault_pdu(pipes_struct *p); @@ -3375,16 +3527,17 @@ BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in); BOOL api_pipe_request(pipes_struct *p); BOOL api_rpcTNP(pipes_struct *p, char *rpc_name, struct api_struct *api_rpc_cmds); -#endif /*The following definitions come from rpc_server/srv_pipe_hnd.c */ -#if OLD_NTDOMAIN +pipes_struct *get_first_pipe(void); +pipes_struct *get_next_pipe(pipes_struct *p); void set_pipe_handle_offset(int max_open_files); void reset_chain_p(void); void init_rpc_pipe_hnd(void); pipes_struct *open_rpc_pipe_p(char *pipe_name, connection_struct *conn, uint16 vuid); +void free_pipe_context(pipes_struct *p); ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n); ssize_t read_from_pipe(pipes_struct *p, char *data, size_t n); BOOL wait_rpc_pipe_hnd_state(pipes_struct *p, uint16 priority); @@ -3392,39 +3545,72 @@ BOOL set_rpc_pipe_hnd_state(pipes_struct *p, uint16 device_state); BOOL close_rpc_pipe_hnd(pipes_struct *p, connection_struct *conn); pipes_struct *get_rpc_pipe_p(char *buf, int where); pipes_struct *get_rpc_pipe(int pnum); -#endif /*The following definitions come from rpc_server/srv_reg.c */ -#if OLD_NTDOMAIN BOOL api_reg_rpc(pipes_struct *p); -#endif /*The following definitions come from rpc_server/srv_reg_nt.c */ -#if OLD_NTDOMAIN uint32 _reg_close(pipes_struct *p, REG_Q_CLOSE *q_u, REG_R_CLOSE *r_u); uint32 _reg_open(pipes_struct *p, REG_Q_OPEN_HKLM *q_u, REG_R_OPEN_HKLM *r_u); uint32 _reg_open_entry(pipes_struct *p, REG_Q_OPEN_ENTRY *q_u, REG_R_OPEN_ENTRY *r_u); uint32 _reg_info(pipes_struct *p, REG_Q_INFO *q_u, REG_R_INFO *r_u); -#endif /*The following definitions come from rpc_server/srv_samr.c */ -#if OLD_NTDOMAIN BOOL api_samr_rpc(pipes_struct *p); -#endif + +/*The following definitions come from rpc_server/srv_samr_nt.c */ + +uint32 _samr_close_hnd(pipes_struct *p, SAMR_Q_CLOSE_HND *q_u, SAMR_R_CLOSE_HND *r_u); +uint32 _samr_open_domain(pipes_struct *p, SAMR_Q_OPEN_DOMAIN *q_u, SAMR_R_OPEN_DOMAIN *r_u); +uint32 _samr_get_usrdom_pwinfo(pipes_struct *p, SAMR_Q_GET_USRDOM_PWINFO *q_u, SAMR_R_GET_USRDOM_PWINFO *r_u); +uint32 _samr_query_sec_obj(pipes_struct *p, SAMR_Q_QUERY_SEC_OBJ *q_u, SAMR_R_QUERY_SEC_OBJ *r_u); +uint32 _samr_enum_dom_users(pipes_struct *p, SAMR_Q_ENUM_DOM_USERS *q_u, SAMR_R_ENUM_DOM_USERS *r_u); +uint32 _samr_enum_dom_groups(pipes_struct *p, SAMR_Q_ENUM_DOM_GROUPS *q_u, SAMR_R_ENUM_DOM_GROUPS *r_u); +uint32 _samr_enum_dom_aliases(pipes_struct *p, SAMR_Q_ENUM_DOM_ALIASES *q_u, SAMR_R_ENUM_DOM_ALIASES *r_u); +uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_QUERY_DISPINFO *r_u); +uint32 _samr_query_aliasinfo(pipes_struct *p, SAMR_Q_QUERY_ALIASINFO *q_u, SAMR_R_QUERY_ALIASINFO *r_u); +uint32 _samr_lookup_names(pipes_struct *p, SAMR_Q_LOOKUP_NAMES *q_u, SAMR_R_LOOKUP_NAMES *r_u); +uint32 _samr_chgpasswd_user(pipes_struct *p, SAMR_Q_CHGPASSWD_USER *q_u, SAMR_R_CHGPASSWD_USER *r_u); +uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP_RIDS *r_u); +uint32 _api_samr_open_user(pipes_struct *p, SAMR_Q_OPEN_USER *q_u, SAMR_R_OPEN_USER *r_u); +uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_QUERY_USERINFO *r_u); +uint32 _samr_query_usergroups(pipes_struct *p, SAMR_Q_QUERY_USERGROUPS *q_u, SAMR_R_QUERY_USERGROUPS *r_u); +uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR_R_QUERY_DOMAIN_INFO *r_u); +uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CREATE_USER *r_u); +uint32 _samr_connect_anon(pipes_struct *p, SAMR_Q_CONNECT_ANON *q_u, SAMR_R_CONNECT_ANON *r_u); +uint32 _samr_connect(pipes_struct *p, SAMR_Q_CONNECT *q_u, SAMR_R_CONNECT *r_u); +uint32 _samr_lookup_domain(pipes_struct *p, SAMR_Q_LOOKUP_DOMAIN *q_u, SAMR_R_LOOKUP_DOMAIN *r_u); +uint32 _samr_enum_domains(pipes_struct *p, SAMR_Q_ENUM_DOMAINS *q_u, SAMR_R_ENUM_DOMAINS *r_u); +uint32 _api_samr_open_alias(pipes_struct *p, SAMR_Q_OPEN_ALIAS *q_u, SAMR_R_OPEN_ALIAS *r_u); +uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_USERINFO *r_u); +uint32 _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_SET_USERINFO2 *r_u); +uint32 _samr_query_useraliases(pipes_struct *p, SAMR_Q_QUERY_USERALIASES *q_u, SAMR_R_QUERY_USERALIASES *r_u); +uint32 _samr_query_aliasmem(pipes_struct *p, SAMR_Q_QUERY_ALIASMEM *q_u, SAMR_R_QUERY_ALIASMEM *r_u); +uint32 _samr_query_groupmem(pipes_struct *p, SAMR_Q_QUERY_GROUPMEM *q_u, SAMR_R_QUERY_GROUPMEM *r_u); +uint32 _samr_add_aliasmem(pipes_struct *p, SAMR_Q_ADD_ALIASMEM *q_u, SAMR_R_ADD_ALIASMEM *r_u); +uint32 _samr_del_aliasmem(pipes_struct *p, SAMR_Q_DEL_ALIASMEM *q_u, SAMR_R_DEL_ALIASMEM *r_u); +uint32 _samr_add_groupmem(pipes_struct *p, SAMR_Q_ADD_GROUPMEM *q_u, SAMR_R_ADD_GROUPMEM *r_u); +uint32 _samr_del_groupmem(pipes_struct *p, SAMR_Q_DEL_GROUPMEM *q_u, SAMR_R_DEL_GROUPMEM *r_u); +uint32 _samr_delete_dom_user(pipes_struct *p, SAMR_Q_DELETE_DOM_USER *q_u, SAMR_R_DELETE_DOM_USER *r_u ); +uint32 _samr_delete_dom_group(pipes_struct *p, SAMR_Q_DELETE_DOM_GROUP *q_u, SAMR_R_DELETE_DOM_GROUP *r_u); +uint32 _samr_delete_dom_alias(pipes_struct *p, SAMR_Q_DELETE_DOM_ALIAS *q_u, SAMR_R_DELETE_DOM_ALIAS *r_u); +uint32 _samr_create_dom_group(pipes_struct *p, SAMR_Q_CREATE_DOM_GROUP *q_u, SAMR_R_CREATE_DOM_GROUP *r_u); +uint32 _samr_create_dom_alias(pipes_struct *p, SAMR_Q_CREATE_DOM_ALIAS *q_u, SAMR_R_CREATE_DOM_ALIAS *r_u); +uint32 _samr_query_groupinfo(pipes_struct *p, SAMR_Q_QUERY_GROUPINFO *q_u, SAMR_R_QUERY_GROUPINFO *r_u); +uint32 _samr_set_groupinfo(pipes_struct *p, SAMR_Q_SET_GROUPINFO *q_u, SAMR_R_SET_GROUPINFO *r_u); +uint32 _samr_get_dom_pwinfo(pipes_struct *p, SAMR_Q_GET_DOM_PWINFO *q_u, SAMR_R_GET_DOM_PWINFO *r_u); +uint32 _samr_open_group(pipes_struct *p, SAMR_Q_OPEN_GROUP *q_u, SAMR_R_OPEN_GROUP *r_u); +uint32 _samr_unknown_2d(pipes_struct *p, SAMR_Q_UNKNOWN_2D *q_u, SAMR_R_UNKNOWN_2D *r_u); /*The following definitions come from rpc_server/srv_spoolss.c */ -#if OLD_NTDOMAIN BOOL api_spoolss_rpc(pipes_struct *p); -#endif /*The following definitions come from rpc_server/srv_spoolss_nt.c */ -#if OLD_NTDOMAIN -void init_printer_hnd(void); void srv_spoolss_receive_message(int msg_type, pid_t src, void *buf, size_t len); uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, SPOOL_R_OPEN_PRINTER_EX *r_u); BOOL convert_devicemode(char *printername, const DEVICEMODE *devmode, @@ -3466,17 +3652,13 @@ uint32 _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS uint32 _spoolss_enumprintprocdatatypes(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u); uint32 _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_u, SPOOL_R_ENUMPRINTMONITORS *r_u); uint32 _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_u); -#endif /*The following definitions come from rpc_server/srv_srvsvc.c */ -#if OLD_NTDOMAIN BOOL api_srvsvc_rpc(pipes_struct *p); -#endif /*The following definitions come from rpc_server/srv_srvsvc_nt.c */ -#if OLD_NTDOMAIN uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u); uint32 _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u); uint32 _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u); @@ -3484,46 +3666,51 @@ uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u); uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u); uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u); -#endif /*The following definitions come from rpc_server/srv_util.c */ -#if OLD_NTDOMAIN -int make_dom_gids(char *gids_str, DOM_GID **ppgids); +int make_dom_gids(TALLOC_CTX *ctx, char *gids_str, DOM_GID **ppgids); void get_domain_user_groups(char *domain_groups, char *user); -uint32 lookup_group_name(uint32 rid, char *group_name, uint32 *type); -uint32 lookup_alias_name(uint32 rid, char *alias_name, uint32 *type); -uint32 lookup_user_name(uint32 rid, char *user_name, uint32 *type); -uint32 lookup_group_rid(char *group_name, uint32 *rid); -uint32 lookup_alias_rid(char *alias_name, uint32 *rid); -uint32 lookup_user_rid(char *user_name, uint32 *rid); -#endif +uint32 local_lookup_group_name(uint32 rid, char *group_name, uint32 *type); +uint32 local_lookup_alias_name(uint32 rid, char *alias_name, uint32 *type); +uint32 local_lookup_user_name(uint32 rid, char *user_name, uint32 *type); +uint32 local_lookup_group_rid(char *group_name, uint32 *rid); +uint32 local_lookup_alias_rid(char *alias_name, uint32 *rid); +uint32 local_lookup_user_rid(char *user_name, uint32 *rid); /*The following definitions come from rpc_server/srv_wkssvc.c */ -#if OLD_NTDOMAIN BOOL api_wkssvc_rpc(pipes_struct *p); -#endif /*The following definitions come from rpc_server/srv_wkssvc_nt.c */ -#if OLD_NTDOMAIN uint32 _wks_query_info(pipes_struct *p, WKS_Q_QUERY_INFO *q_u, WKS_R_QUERY_INFO *r_u); -#endif + +/*The following definitions come from rpcclient/cmd_lsarpc.c */ + + +/*The following definitions come from rpcclient/cmd_samr.c */ + + +/*The following definitions come from rpcclient/cmd_spoolss.c */ + + +/*The following definitions come from rpcclient/rpcclient.c */ + +void fetch_domain_sid(void); +void init_rpcclient_creds(struct ntuser_creds *creds); +void add_command_set(struct cmd_set *cmd_set); /*The following definitions come from smbd/blocking.c */ -#if OLD_NTDOMAIN BOOL push_blocking_lock_request( char *inbuf, int length, int lock_timeout, int lock_num); void remove_pending_lock_requests_by_fid(files_struct *fsp); void remove_pending_lock_requests_by_mid(int mid); BOOL blocking_locks_pending(void); void process_blocking_lock_queue(time_t t); -#endif /*The following definitions come from smbd/chgpasswd.c */ -#if OLD_NTDOMAIN BOOL chgpasswd(char *name, char *oldpass, char *newpass, BOOL as_root); BOOL chgpasswd(char *name, char *oldpass, char *newpass, BOOL as_root); BOOL check_lanman_password(char *user, uchar * pass1, @@ -3542,17 +3729,13 @@ BOOL change_oem_password(SAM_ACCOUNT *hnd, char *new_passwd, BOOL override); BOOL check_plaintext_password(char *user, char *old_passwd, int old_passwd_size, SAM_ACCOUNT **hnd); -#endif /*The following definitions come from smbd/close.c */ -#if OLD_NTDOMAIN int close_file(files_struct *fsp, BOOL normal_close); -#endif /*The following definitions come from smbd/conn.c */ -#if OLD_NTDOMAIN void conn_init(void); int conn_num_open(void); BOOL conn_snum_used(int snum); @@ -3561,7 +3744,6 @@ connection_struct *conn_new(void); void conn_close_all(void); BOOL conn_idle_all(time_t t, int deadtime); void conn_free(connection_struct *conn); -#endif /*The following definitions come from smbd/connection.c */ @@ -3576,7 +3758,6 @@ SMB_BIG_UINT sys_disk_free(char *path, BOOL small_query, /*The following definitions come from smbd/dir.c */ -#if OLD_NTDOMAIN void init_dptrs(void); char *dptr_path(int key); char *dptr_wcard(int key); @@ -3602,29 +3783,23 @@ int TellDir(void *p); void DirCacheAdd( char *path, char *name, char *dname, int snum ); char *DirCacheCheck( char *path, char *name, int snum ); void DirCacheFlush(int snum); -#endif /*The following definitions come from smbd/dosmode.c */ -#if OLD_NTDOMAIN mode_t unix_mode(connection_struct *conn,int dosmode,const char *fname); int dos_mode(connection_struct *conn,char *path,SMB_STRUCT_STAT *sbuf); int file_chmod(connection_struct *conn,char *fname,int dosmode,SMB_STRUCT_STAT *st); int file_utime(connection_struct *conn, char *fname, struct utimbuf *times); BOOL set_filetime(connection_struct *conn, char *fname, time_t mtime); -#endif /*The following definitions come from smbd/error.c */ -#if OLD_NTDOMAIN int cached_error_packet(char *inbuf,char *outbuf,files_struct *fsp,int line); int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int line); int error_packet(char *inbuf,char *outbuf,int error_class,uint32 error_code,int line); -#endif /*The following definitions come from smbd/fileio.c */ -#if OLD_NTDOMAIN SMB_OFF_T seek_file(files_struct *fsp,SMB_OFF_T pos); BOOL read_from_write_cache(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n); ssize_t read_file(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n); @@ -3633,19 +3808,15 @@ void delete_write_cache(files_struct *fsp); void set_filelen_write_cache(files_struct *fsp, SMB_OFF_T file_size); ssize_t flush_write_cache(files_struct *fsp, enum flush_reason_enum reason); void sync_file(connection_struct *conn, files_struct *fsp); -#endif /*The following definitions come from smbd/filename.c */ -#if OLD_NTDOMAIN BOOL unix_convert(char *name,connection_struct *conn,char *saved_last_component, BOOL *bad_path, SMB_STRUCT_STAT *pst); BOOL check_name(char *name,connection_struct *conn); -#endif /*The following definitions come from smbd/files.c */ -#if OLD_NTDOMAIN files_struct *file_new(void ); void file_close_conn(connection_struct *conn); void file_init(void); @@ -3661,24 +3832,19 @@ files_struct *file_fsp(char *buf, int where); void file_chain_reset(void); void file_chain_save(void); void file_chain_restore(void); -#endif /*The following definitions come from smbd/ipc.c */ -#if OLD_NTDOMAIN void send_trans_reply(char *outbuf, char *rparam, int rparam_len, char *rdata, int rdata_len, BOOL buffer_too_large); int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int bufsize); -#endif /*The following definitions come from smbd/lanman.c */ -#if OLD_NTDOMAIN int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data,char *params, int tdscnt,int tpscnt,int mdrcnt,int mprcnt); -#endif /*The following definitions come from smbd/mangle.c */ @@ -3691,7 +3857,6 @@ BOOL name_map_mangle(char *OutName, BOOL need83, BOOL cache83, int snum); /*The following definitions come from smbd/message.c */ -#if OLD_NTDOMAIN int reply_sends(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); int reply_sendstrt(connection_struct *conn, @@ -3700,15 +3865,12 @@ int reply_sendtxt(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); int reply_sendend(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -#endif /*The following definitions come from smbd/negprot.c */ -#if OLD_NTDOMAIN int reply_negprot(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -#endif /*The following definitions come from smbd/noquotas.c */ @@ -3716,7 +3878,6 @@ BOOL disk_quotas(char *path,SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT /*The following definitions come from smbd/notify.c */ -#if OLD_NTDOMAIN void remove_pending_change_notify_requests_by_fid(files_struct *fsp); void remove_pending_change_notify_requests_by_mid(int mid); void remove_pending_change_notify_requests_by_filename(files_struct *fsp); @@ -3724,23 +3885,17 @@ int change_notify_timeout(void); BOOL process_pending_change_notify_queue(time_t t); BOOL change_notify_set(char *inbuf, files_struct *fsp, connection_struct *conn, uint32 flags); BOOL init_change_notify(void); -#endif /*The following definitions come from smbd/notify_hash.c */ -#if OLD_NTDOMAIN struct cnotify_fns *hash_notify_init(void) ; -#endif /*The following definitions come from smbd/notify_kernel.c */ -#if OLD_NTDOMAIN struct cnotify_fns *kernel_notify_init(void) ; -#endif /*The following definitions come from smbd/nttrans.c */ -#if OLD_NTDOMAIN void fail_next_srvsvc_open(void); BOOL should_fail_next_srvsvc_open(const char *pipename); int reply_ntcreate_and_X(connection_struct *conn, @@ -3751,11 +3906,9 @@ int reply_nttranss(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); int reply_nttrans(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -#endif /*The following definitions come from smbd/open.c */ -#if OLD_NTDOMAIN int fd_close(struct connection_struct *conn, files_struct *fsp); files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf, int share_mode,int ofun, mode_t mode,int oplock_request, int *Access,int *action); @@ -3764,11 +3917,9 @@ files_struct *open_file_stat(connection_struct *conn, char *fname, files_struct *open_directory(connection_struct *conn, char *fname, SMB_STRUCT_STAT *psbuf, int smb_ofun, mode_t unixmode, int *action); BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op); -#endif /*The following definitions come from smbd/oplock.c */ -#if OLD_NTDOMAIN int32 get_number_of_exclusive_open_oplocks(void); BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeout); BOOL set_file_oplock(files_struct *fsp, int oplock_type); @@ -3782,23 +3933,17 @@ BOOL request_oplock_break(share_mode_entry *share_entry, BOOL attempt_close_oplocked_file(files_struct *fsp); void release_level_2_oplocks_on_change(files_struct *fsp); BOOL init_oplocks(void); -#endif /*The following definitions come from smbd/oplock_irix.c */ -#if OLD_NTDOMAIN struct kernel_oplocks *irix_init_kernel_oplocks(void) ; -#endif /*The following definitions come from smbd/oplock_linux.c */ -#if OLD_NTDOMAIN struct kernel_oplocks *linux_init_kernel_oplocks(void) ; -#endif /*The following definitions come from smbd/password.c */ -#if OLD_NTDOMAIN void generate_next_challenge(char *challenge); BOOL set_challenge(unsigned char *challenge); user_struct *get_valid_user_struct(uint16 vuid); @@ -3828,31 +3973,25 @@ BOOL domain_client_validate( char *user, char *domain, char *smb_apasswd, int smb_apasslen, char *smb_ntpasswd, int smb_ntpasslen, BOOL *user_exists); -#endif /*The following definitions come from smbd/pipes.c */ -#if OLD_NTDOMAIN int reply_open_pipe_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); int reply_pipe_write(char *inbuf,char *outbuf,int length,int dum_bufsize); int reply_pipe_write_and_X(char *inbuf,char *outbuf,int length,int bufsize); int reply_pipe_read_and_X(char *inbuf,char *outbuf,int length,int bufsize); int reply_pipe_close(connection_struct *conn, char *inbuf,char *outbuf); -#endif /*The following definitions come from smbd/posix_acls.c */ -#if OLD_NTDOMAIN size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc); BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd); int chmod_acl(char *name, mode_t mode); int fchmod_acl(int fd, mode_t mode); -#endif /*The following definitions come from smbd/process.c */ -#if OLD_NTDOMAIN BOOL push_oplock_pending_smb_message(char *buf, int msg_len); BOOL receive_next_smb(char *inbuf, int bufsize, int timeout); void respond_to_all_remaining_local_messages(void); @@ -3862,11 +4001,9 @@ void construct_reply_common(char *inbuf,char *outbuf); int chain_reply(char *inbuf,char *outbuf,int size,int bufsize); void check_reload(int t); void smbd_process(void); -#endif /*The following definitions come from smbd/reply.c */ -#if OLD_NTDOMAIN int reply_special(char *inbuf,char *outbuf); int reply_tcon(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); @@ -3938,11 +4075,9 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -#endif /*The following definitions come from smbd/sec_ctx.c */ -#if OLD_NTDOMAIN int get_current_groups(int *p_ngroups, gid_t **p_groups); void delete_nt_token(NT_USER_TOKEN **pptoken); NT_USER_TOKEN *dup_nt_token(NT_USER_TOKEN *ptoken); @@ -3952,26 +4087,21 @@ void set_sec_ctx(uid_t uid, gid_t gid, int ngroups, gid_t *groups, NT_USER_TOKEN void set_root_sec_ctx(void); BOOL pop_sec_ctx(void); void init_sec_ctx(void); -#endif /*The following definitions come from smbd/server.c */ -#if OLD_NTDOMAIN int smbd_server_fd(void); void smbd_set_server_fd(int fd); BOOL reload_services(BOOL test); void exit_server(char *reason); -#endif /*The following definitions come from smbd/service.c */ -#if OLD_NTDOMAIN BOOL become_service(connection_struct *conn,BOOL do_chdir); int add_home_service(char *service, char *homedir); int find_service(char *service); connection_struct *make_connection(char *service,char *user,char *password, int pwlen, char *dev,uint16 vuid, int *ecode); void close_cnum(connection_struct *conn, uint16 vuid); -#endif /*The following definitions come from smbd/srvstr.c */ @@ -4000,7 +4130,6 @@ BOOL reset_stat_cache( void ); /*The following definitions come from smbd/trans2.c */ -#if OLD_NTDOMAIN int reply_findclose(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); int reply_findnclose(connection_struct *conn, @@ -4009,11 +4138,9 @@ int reply_transs2(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); int reply_trans2(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -#endif /*The following definitions come from smbd/uid.c */ -#if OLD_NTDOMAIN BOOL become_guest(void); BOOL become_user(connection_struct *conn, uint16 vuid); BOOL unbecome_user(void ); @@ -4027,32 +4154,9 @@ DOM_SID *uid_to_sid(DOM_SID *psid, uid_t uid); DOM_SID *gid_to_sid(DOM_SID *psid, gid_t gid); BOOL sid_to_uid(DOM_SID *psid, uid_t *puid, enum SID_NAME_USE *sidtype); BOOL sid_to_gid(DOM_SID *psid, gid_t *pgid, enum SID_NAME_USE *sidtype); -#endif - -/*The following definitions come from smbd/vfs.c */ - -#if OLD_NTDOMAIN -int vfs_init_default(connection_struct *conn); -BOOL vfs_init_custom(connection_struct *conn); -BOOL vfs_directory_exist(connection_struct *conn, char *dname, SMB_STRUCT_STAT *st); -int vfs_mkdir(connection_struct *conn, char *fname, mode_t mode); -char *vfs_getwd(connection_struct *conn, char *unix_path); -BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf); -ssize_t vfs_read_data(files_struct *fsp, char *buf, size_t byte_count); -ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N); -int vfs_set_filelen(files_struct *fsp, SMB_OFF_T len); -SMB_OFF_T vfs_transfer_file(int in_fd, files_struct *in_fsp, - int out_fd, files_struct *out_fsp, - SMB_OFF_T n, char *header, int headlen, int align); -char *vfs_readdirname(connection_struct *conn, void *p); -int vfs_ChDir(connection_struct *conn, char *path); -char *vfs_GetWd(connection_struct *conn, char *path); -BOOL reduce_name(connection_struct *conn, char *s,char *dir,BOOL widelinks); -#endif /*The following definitions come from smbd/vfs-wrap.c */ -#if OLD_NTDOMAIN int vfswrap_dummy_connect(connection_struct *conn, char *service, char *user); void vfswrap_dummy_disconnect(connection_struct *conn); SMB_BIG_UINT vfswrap_disk_free(connection_struct *conn, char *path, BOOL small_query, SMB_BIG_UINT *bsize, @@ -4086,7 +4190,25 @@ BOOL vfswrap_fset_nt_acl(files_struct *fsp, int fd, uint32 security_info_sent, S BOOL vfswrap_set_nt_acl(files_struct *fsp, char *name, uint32 security_info_sent, SEC_DESC *psd); int vfswrap_chmod_acl(connection_struct *conn, char *name, mode_t mode); int vfswrap_fchmod_acl(files_struct *fsp, int fd, mode_t mode); -#endif + +/*The following definitions come from smbd/vfs.c */ + +int vfs_init_default(connection_struct *conn); +BOOL vfs_init_custom(connection_struct *conn); +BOOL vfs_directory_exist(connection_struct *conn, char *dname, SMB_STRUCT_STAT *st); +int vfs_mkdir(connection_struct *conn, char *fname, mode_t mode); +char *vfs_getwd(connection_struct *conn, char *unix_path); +BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf); +ssize_t vfs_read_data(files_struct *fsp, char *buf, size_t byte_count); +ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N); +int vfs_set_filelen(files_struct *fsp, SMB_OFF_T len); +SMB_OFF_T vfs_transfer_file(int in_fd, files_struct *in_fsp, + int out_fd, files_struct *out_fsp, + SMB_OFF_T n, char *header, int headlen, int align); +char *vfs_readdirname(connection_struct *conn, void *p); +int vfs_ChDir(connection_struct *conn, char *path); +char *vfs_GetWd(connection_struct *conn, char *path); +BOOL reduce_name(connection_struct *conn, char *s,char *dir,BOOL widelinks); /*The following definitions come from smbwrapper/realcalls.c */ diff --git a/source3/include/rpc_client_proto.h b/source3/include/rpc_client_proto.h index 210a352cf4..aa22b1996a 100644 --- a/source3/include/rpc_client_proto.h +++ b/source3/include/rpc_client_proto.h @@ -126,7 +126,6 @@ BOOL do_reg_close(struct cli_state *cli, POLICY_HND *hnd); /*The following definitions come from rpc_client/cli_samr.c */ -#if OLD_NTDOMAIN BOOL get_samr_query_usergroups(struct cli_state *cli, POLICY_HND *pol_open_domain, uint32 user_rid, uint32 *num_groups, DOM_GID *gid); @@ -165,7 +164,6 @@ BOOL do_samr_query_usergroups(struct cli_state *cli, BOOL do_samr_query_userinfo(struct cli_state *cli, POLICY_HND *pol, uint16 switch_value, void* usr); BOOL do_samr_close(struct cli_state *cli, POLICY_HND *hnd); -#endif /*The following definitions come from rpc_client/cli_spoolss_notify.c */ diff --git a/source3/include/rpc_lsa.h b/source3/include/rpc_lsa.h index 186f8f1115..ad7fa31365 100644 --- a/source3/include/rpc_lsa.h +++ b/source3/include/rpc_lsa.h @@ -28,6 +28,7 @@ enum SID_NAME_USE { + SID_NAME_USE_NONE = 0,/* NOTUSED */ SID_NAME_USER = 1, /* user */ SID_NAME_DOM_GRP = 2, /* domain group */ SID_NAME_DOMAIN = 3, /* domain: don't know what this is */ diff --git a/source3/include/rpc_samr.h b/source3/include/rpc_samr.h index 3438e44abe..15705a1b6c 100644 --- a/source3/include/rpc_samr.h +++ b/source3/include/rpc_samr.h @@ -24,8 +24,10 @@ #ifndef _RPC_SAMR_H /* _RPC_SAMR_H */ #define _RPC_SAMR_H + #include "rpc_misc.h" + /******************************************************************* the following information comes from a QuickView on samsrv.dll, and gives an idea of exactly what is needed: @@ -142,6 +144,8 @@ SamrTestPrivateFunctionsUser #define SAMR_CONNECT 0x39 #define SAMR_SET_USERINFO 0x3A + + typedef struct logon_hours_info { uint32 len; /* normally 21 bytes */ @@ -213,8 +217,6 @@ typedef struct sam_user_info_23 typedef struct sam_user_info_24 { uint8 pass[516]; - uint16 unk_0; - } SAM_USER_INFO_24; @@ -395,7 +397,7 @@ typedef struct q_samr_query_sec_obj_info typedef struct r_samr_query_sec_obj_info { uint32 ptr; - SEC_DESC_BUF buf; + SEC_DESC_BUF *buf; uint32 status; /* return status */ @@ -537,15 +539,24 @@ typedef struct r_samr_lookup_domain_info } SAMR_R_LOOKUP_DOMAIN; + +/**************************************************************************** +SAMR_Q_OPEN_DOMAIN - unknown_0 values seen associated with SIDs: + +0x0000 03f1 and a specific domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0 +0x0000 0200 and a specific domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0 +*****************************************************************************/ + /* SAMR_Q_OPEN_DOMAIN */ typedef struct q_samr_open_domain_info { - POLICY_HND connect_pol; /* Policy handle */ - uint32 access_mask; /* Requested permissions */ - DOM_SID2 dom_sid; /* Domain SID */ + POLICY_HND pol; /* policy handle */ + uint32 flags; /* 0x2000 0000; 0x0000 0211; 0x0000 0280; 0x0000 0200 - flags? */ + DOM_SID2 dom_sid; /* domain SID */ } SAMR_Q_OPEN_DOMAIN; + /* SAMR_R_OPEN_DOMAIN - probably an open */ typedef struct r_samr_open_domain_info { @@ -1072,7 +1083,7 @@ typedef struct alias_info_ctr typedef struct r_samr_query_aliasinfo_info { uint32 ptr; - ALIAS_INFO_CTR *ctr; + ALIAS_INFO_CTR ctr; uint32 status; @@ -1083,7 +1094,7 @@ typedef struct r_samr_query_aliasinfo_info typedef struct q_samr_set_alias_info { POLICY_HND alias_pol; /* policy handle */ - ALIAS_INFO_CTR *ctr; + ALIAS_INFO_CTR ctr; } SAMR_Q_SET_ALIASINFO; @@ -1449,7 +1460,7 @@ typedef struct q_samr_open_group_info /* SAMR_R_OPEN_GROUP - probably an open */ typedef struct r_samr_open_group_info { - POLICY_HND group_pol; /* policy handle */ + POLICY_HND pol; /* policy handle */ uint32 status; /* return status */ } SAMR_R_OPEN_GROUP; @@ -1585,6 +1596,7 @@ typedef struct r_samr_get_dom_pwinfo { uint16 unk_0; uint16 unk_1; + uint16 unk_2; uint32 status; } SAMR_R_GET_DOM_PWINFO; diff --git a/source3/include/rpc_srvsvc.h b/source3/include/rpc_srvsvc.h index 96961cbd2f..b18c70bf25 100644 --- a/source3/include/rpc_srvsvc.h +++ b/source3/include/rpc_srvsvc.h @@ -470,6 +470,16 @@ typedef struct r_net_file_enum_info } SRV_R_NET_FILE_ENUM; +/* SRV_INFO_100 */ +typedef struct srv_info_100_info +{ + uint32 platform_id; /* 0x500 */ + uint32 ptr_name; /* pointer to server name */ + + UNISTR2 uni_name; /* server name "server" */ + +} SRV_INFO_100; + /* SRV_INFO_101 */ typedef struct srv_info_101_info { @@ -518,6 +528,7 @@ typedef struct srv_info_ctr_info { SRV_INFO_102 sv102; /* server info level 102 */ SRV_INFO_101 sv101; /* server info level 101 */ + SRV_INFO_100 sv100; /* server info level 100 */ } srv; diff --git a/source3/lib/bitmap.c b/source3/lib/bitmap.c index 1813d63ff7..7625f52909 100644 --- a/source3/lib/bitmap.c +++ b/source3/lib/bitmap.c @@ -51,6 +51,21 @@ struct bitmap *bitmap_allocate(int n) } /**************************************************************************** +free a bitmap. +****************************************************************************/ + +void bitmap_free(struct bitmap *bm) +{ + if (!bm) + return; + + if(bm->b) + free(bm->b); + + free(bm); +} + +/**************************************************************************** set a bit in a bitmap ****************************************************************************/ BOOL bitmap_set(struct bitmap *bm, unsigned i) diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index 7fedc282ba..4a3d7090e3 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -19,9 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include "includes.h" - #define CTRLZ 26 extern int DEBUGLEVEL; diff --git a/source3/lib/debug.c b/source3/lib/debug.c index 2ba35c00db..27fa80ca3f 100644 --- a/source3/lib/debug.c +++ b/source3/lib/debug.c @@ -234,13 +234,13 @@ void debug_message(int msg_type, pid_t src, void *buf, size_t len) /* Set the new DEBUGLEVEL_CLASS array from the pased array */ memcpy(DEBUGLEVEL_CLASS, buf, sizeof(DEBUGLEVEL_CLASS)); - DEBUG(3,("INFO: Debug class %s level = %d (pid %d from pid %d)\n", + DEBUG(1,("INFO: Debug class %s level = %d (pid %d from pid %d)\n", classname_table[DBGC_ALL], DEBUGLEVEL_CLASS[DBGC_ALL], getpid(), (int)src)); for (i=1; i<DBGC_LAST; i++) { if (DEBUGLEVEL_CLASS[i]) - DEBUGADD(3,("INFO: Debug class %s level = %d\n", + DEBUGADD(1,("INFO: Debug class %s level = %d\n", classname_table[i], DEBUGLEVEL_CLASS[i])); } } @@ -263,6 +263,11 @@ void setup_logging(char *pname, BOOL interactive) { message_register(MSG_DEBUG, debug_message); + /* reset to allow multiple setup calls, going from interactive to + non-interactive */ + stdout_logging = False; + dbf = NULL; + if (interactive) { stdout_logging = True; dbf = stdout; diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 19496bd426..ab02d1253b 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -78,10 +78,7 @@ return current debug level ****************************************************************************/ void debuglevel_message(int msg_type, pid_t src, void *buf, size_t len) { - int level; - DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %d\n",src)); - level = DEBUGLEVEL; message_send_pid(src, MSG_DEBUGLEVEL, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS), True); } diff --git a/source3/lib/msrpc_use.c b/source3/lib/msrpc_use.c index 90fac637b3..3451b6ec59 100644 --- a/source3/lib/msrpc_use.c +++ b/source3/lib/msrpc_use.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -327,6 +325,3 @@ void msrpc_net_use_enum(uint32 *num_cons, struct use_info ***use) add_use_info_to_array(num_cons, use, &item); } } - - -#undef OLD_NTDOMAIN diff --git a/source3/lib/slprintf.c b/source3/lib/slprintf.c index ed7113c865..be81b4aa12 100644 --- a/source3/lib/slprintf.c +++ b/source3/lib/slprintf.c @@ -78,7 +78,6 @@ va_dcl char *format; #endif va_list ap; - int ret; pstring str; #ifdef HAVE_STDARG_H @@ -90,7 +89,7 @@ va_dcl #endif str[0] = 0; - ret = vslprintf(str,sizeof(str),format,ap); + vslprintf(str,sizeof(str),format,ap); va_end(ap); return write(fd, str, strlen(str)); } diff --git a/source3/lib/util.c b/source3/lib/util.c index 8ad2cfd713..3811d81866 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -359,7 +359,7 @@ void set_message_bcc(char *buf,int num_bytes) ********************************************************************/ void set_message_end(void *outbuf,void *end_ptr) { - set_message_bcc(outbuf,PTR_DIFF(end_ptr,smb_buf(outbuf))); + set_message_bcc((char *)outbuf,PTR_DIFF(end_ptr,smb_buf((char *)outbuf))); } /******************************************************************* diff --git a/source3/libsmb/cli_samr.c b/source3/libsmb/cli_samr.c index d4540b15c5..cf11110bd3 100644 --- a/source3/libsmb/cli_samr.c +++ b/source3/libsmb/cli_samr.c @@ -1,4 +1,3 @@ -#define NEW_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 2.2 @@ -519,5 +518,3 @@ uint32 cli_samr_query_groupmem(struct cli_state *cli, POLICY_HND *group_pol, return result; } - -#undef NEW_NTDOMAIN diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 5c3dae02c0..175ab5c9b0 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -118,13 +118,11 @@ delete a record if it is for a dead process static int delete_fn(TDB_CONTEXT *ttdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state) { struct lock_struct *locks; - struct lock_key *key; int count, i; tdb_chainlock(tdb, kbuf); locks = (struct lock_struct *)dbuf.dptr; - key = (struct lock_key *)kbuf.dptr; count = dbuf.dsize / sizeof(*locks); for (i=0; i<count; i++) { diff --git a/source3/locking/locking.c b/source3/locking/locking.c index b3601e8752..118d59cc10 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -396,7 +396,6 @@ BOOL set_share_mode(files_struct *fsp, uint16 port, uint16 op_type) { TDB_DATA dbuf; struct locking_data *data; - share_mode_entry *shares; char *p=NULL; int size; @@ -410,12 +409,11 @@ BOOL set_share_mode(files_struct *fsp, uint16 port, uint16 op_type) pstrcat(fname, "/"); pstrcat(fname, fsp->fsp_name); - size = sizeof(*data) + sizeof(*shares) + strlen(fname) + 1; + size = sizeof(*data) + sizeof(share_mode_entry) + strlen(fname) + 1; p = (char *)malloc(size); data = (struct locking_data *)p; - shares = (share_mode_entry *)(p + sizeof(*data)); data->num_share_mode_entries = 1; - pstrcpy(p + sizeof(*data) + sizeof(*shares), fname); + pstrcpy(p + sizeof(*data) + sizeof(share_mode_entry), fname); fill_share_mode(p + sizeof(*data), fsp, port, op_type); dbuf.dptr = p; dbuf.dsize = size; @@ -426,14 +424,13 @@ BOOL set_share_mode(files_struct *fsp, uint16 port, uint16 op_type) /* we're adding to an existing entry - this is a bit fiddly */ data = (struct locking_data *)dbuf.dptr; - shares = (share_mode_entry *)(dbuf.dptr + sizeof(*data)); data->num_share_mode_entries++; - size = dbuf.dsize + sizeof(*shares); + size = dbuf.dsize + sizeof(share_mode_entry); p = malloc(size); memcpy(p, dbuf.dptr, sizeof(*data)); fill_share_mode(p + sizeof(*data), fsp, port, op_type); - memcpy(p + sizeof(*data) + sizeof(*shares), dbuf.dptr + sizeof(*data), + memcpy(p + sizeof(*data) + sizeof(share_mode_entry), dbuf.dptr + sizeof(*data), dbuf.dsize - sizeof(*data)); free(dbuf.dptr); dbuf.dptr = p; diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index 428dd004ee..949f4b0498 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -1687,8 +1687,3 @@ BOOL pdb_set_lanman_passwd (SAM_ACCOUNT *sampass, BYTE *pwd) return True; } - - - - - diff --git a/source3/printing/load.c b/source3/printing/load.c index 275ffa21ed..c4fc3377c3 100644 --- a/source3/printing/load.c +++ b/source3/printing/load.c @@ -48,9 +48,9 @@ static void add_auto_printers(void) printers = lp_servicenumber(PRINTERS_NAME); if (printers < 0) { - free(str); - return; - } + free(str); + return; + } for (p=strtok(str,LIST_SEP);p;p=strtok(NULL,LIST_SEP)) { if (lp_servicenumber(p) >= 0) continue; @@ -60,7 +60,7 @@ static void add_auto_printers(void) } } - free(str); + free(str); } /*************************************************************************** diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index e491d9a6b9..f5c4a234ee 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -1089,7 +1088,6 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, struct passwd *pass; int ecode; int ver = 0; - int outsize = 0; int i; *perr = 0; @@ -1175,7 +1173,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, slprintf(new_name, sizeof(new_name), "%s/%s", architecture, driver->driverpath); slprintf(old_name, sizeof(old_name), "%s/%s", new_dir, driver->driverpath); if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) { - if ((outsize = rename_internals(conn, inbuf, outbuf, new_name, old_name, True)) != 0) { + if (rename_internals(conn, inbuf, outbuf, new_name, old_name, True) != 0) { DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n", new_name, old_name)); *perr = (uint32)SVAL(outbuf,smb_err); @@ -1192,7 +1190,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, slprintf(new_name, sizeof(new_name), "%s/%s", architecture, driver->datafile); slprintf(old_name, sizeof(old_name), "%s/%s", new_dir, driver->datafile); if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) { - if ((outsize = rename_internals(conn, inbuf, outbuf, new_name, old_name, True)) != 0) { + if (rename_internals(conn, inbuf, outbuf, new_name, old_name, True) != 0) { DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n", new_name, old_name)); *perr = (uint32)SVAL(outbuf,smb_err); @@ -1211,7 +1209,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, slprintf(new_name, sizeof(new_name), "%s/%s", architecture, driver->configfile); slprintf(old_name, sizeof(old_name), "%s/%s", new_dir, driver->configfile); if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) { - if ((outsize = rename_internals(conn, inbuf, outbuf, new_name, old_name, True)) != 0) { + if (rename_internals(conn, inbuf, outbuf, new_name, old_name, True) != 0) { DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n", new_name, old_name)); *perr = (uint32)SVAL(outbuf,smb_err); @@ -1231,7 +1229,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, slprintf(new_name, sizeof(new_name), "%s/%s", architecture, driver->helpfile); slprintf(old_name, sizeof(old_name), "%s/%s", new_dir, driver->helpfile); if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) { - if ((outsize = rename_internals(conn, inbuf, outbuf, new_name, old_name, True)) != 0) { + if (rename_internals(conn, inbuf, outbuf, new_name, old_name, True) != 0) { DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n", new_name, old_name)); *perr = (uint32)SVAL(outbuf,smb_err); @@ -1260,7 +1258,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, slprintf(new_name, sizeof(new_name), "%s/%s", architecture, driver->dependentfiles[i]); slprintf(old_name, sizeof(old_name), "%s/%s", new_dir, driver->dependentfiles[i]); if (ver != -1 && (ver=file_version_is_newer(conn, new_name, old_name)) > 0) { - if ((outsize = rename_internals(conn, inbuf, outbuf, new_name, old_name, True)) != 0) { + if (rename_internals(conn, inbuf, outbuf, new_name, old_name, True) != 0) { DEBUG(0,("move_driver_to_download_area: Unable to rename [%s] to [%s]\n", new_name, old_name)); *perr = (uint32)SVAL(outbuf,smb_err); @@ -3195,4 +3193,3 @@ uint32 printer_write_default_dev(int snum, const PRINTER_DEFAULT *printer_defaul free_a_printer(&printer, 2); return result; } -#undef OLD_NTDOMAIN diff --git a/source3/printing/printfsp.c b/source3/printing/printfsp.c index c87fb9754f..efb97be919 100644 --- a/source3/printing/printfsp.c +++ b/source3/printing/printfsp.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 3.0 @@ -98,5 +96,3 @@ void print_fsp_end(files_struct *fsp, BOOL normal_close) string_free(&fsp->fsp_name); } } - -#undef OLD_NTDOMAIN diff --git a/source3/printing/printing.c b/source3/printing/printing.c index e771e93600..241135f744 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 3.0 @@ -792,14 +791,12 @@ BOOL print_job_resume(struct current_user *user, int jobid, int *errcode) char *printer_name; int snum, ret; fstring jobstr; - BOOL owner; if (!pjob || !user) return False; if (!pjob->spooled || pjob->sysjob == -1) return False; snum = print_job_snum(jobid); - owner = is_owner(user, jobid); if (!is_owner(user, jobid) && !print_access_check(user, snum, JOB_ACCESS_ADMINISTER)) { @@ -1401,4 +1398,3 @@ BOOL print_queue_purge(struct current_user *user, int snum, int *errcode) return True; } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_client/cli_samr.c b/source3/rpc_client/cli_samr.c index eb9032f7ce..a0e9ab6a00 100644 --- a/source3/rpc_client/cli_samr.c +++ b/source3/rpc_client/cli_samr.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -63,6 +62,9 @@ BOOL get_samr_query_usergroups(struct cli_state *cli, return do_samr_close(cli, &pol_open_user); } +#if 0 +/* DOES NOT COMPILE WITH THE NEW SAMR PARSE CODE. JRA. */ + /**************************************************************************** do a SAMR query user info ****************************************************************************/ @@ -97,6 +99,7 @@ BOOL get_samr_query_userinfo(struct cli_state *cli, return do_samr_close(cli, &pol_open_user); } +#endif /**************************************************************************** do a SAMR change user password command @@ -156,6 +159,10 @@ BOOL do_samr_chgpasswd_user(struct cli_state *cli, return True; } +#if 0 + +/* CURRENTLY THIS DOESN'T COMPILE AND IS NOT USED ANYWHERE. JRA. */ + /**************************************************************************** do a SAMR unknown 0x38 command ****************************************************************************/ @@ -208,6 +215,7 @@ BOOL do_samr_unknown_38(struct cli_state *cli, char *srv_name) return True; } +#endif /**************************************************************************** do a SAMR unknown 0x8 command @@ -266,6 +274,10 @@ BOOL do_samr_query_dom_info(struct cli_state *cli, return True; } +#if 0 + +/* CURRENTLY DOESN'T COMPILE WITH THE NEW SAMR PARSE CODE. JRA */ + /**************************************************************************** do a SAMR enumerate users ****************************************************************************/ @@ -356,6 +368,7 @@ BOOL do_samr_enum_dom_users(struct cli_state *cli, return True; } +#endif /**************************************************************************** do a SAMR Connect @@ -541,6 +554,10 @@ BOOL do_samr_open_domain(struct cli_state *cli, return True; } +#if 0 + +/* CURRENTLY DOES NOT COMPILE AND IS NOT USED ANYWHERE. JRA. */ + /**************************************************************************** do a SAMR Query Unknown 12 ****************************************************************************/ @@ -621,6 +638,7 @@ BOOL do_samr_query_unknown_12(struct cli_state *cli, return True; } +#endif /**************************************************************************** do a SAMR Query User Groups @@ -684,6 +702,10 @@ BOOL do_samr_query_usergroups(struct cli_state *cli, return True; } +#if 0 + +/* CURRENTLY DOES NOT COMPILE WITH THE NEW SAMR PARSE CODE. JRA */ + /**************************************************************************** do a SAMR Query User Info ****************************************************************************/ @@ -756,6 +778,8 @@ BOOL do_samr_query_userinfo(struct cli_state *cli, return True; } +#endif + /**************************************************************************** do a SAMR Close ****************************************************************************/ @@ -820,5 +844,3 @@ BOOL do_samr_close(struct cli_state *cli, POLICY_HND *hnd) return True; } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_parse/parse_dfs.c b/source3/rpc_parse/parse_dfs.c index e1d88ab509..6bae2ae4a6 100644 --- a/source3/rpc_parse/parse_dfs.c +++ b/source3/rpc_parse/parse_dfs.c @@ -411,7 +411,7 @@ BOOL dfs_io_dfs_info_ctr(char* desc, DFS_INFO_CTR* ctr, uint32 num_entries, uint return False; if(!prs_uint32("ptr_comment", ps, depth, &ctr->dfs.info3[i].ptr_comment)) return False; - if(!prs_uint32("state", ps, depth, &ctr->dfs.info3[i].state)); + if(!prs_uint32("state", ps, depth, &ctr->dfs.info3[i].state)) return False; if(!prs_uint32("num_storages", ps, depth, &ctr->dfs.info3[i].num_storages)) return False; diff --git a/source3/rpc_parse/parse_lsa.c b/source3/rpc_parse/parse_lsa.c index d86df0ee11..98ef3fd0ee 100644 --- a/source3/rpc_parse/parse_lsa.c +++ b/source3/rpc_parse/parse_lsa.c @@ -591,17 +591,16 @@ BOOL lsa_io_r_enum_trust_dom(char *desc, LSA_R_ENUM_TRUST_DOM *r_e, num_domains = r_e->num_domains2; - if (!(r_e->hdr_domain_name = (UNIHDR2 *) - malloc(sizeof(UNIHDR2) * num_domains))) - return False; + if (UNMARSHALLING(ps)) { + if (!(r_e->hdr_domain_name = (UNIHDR2 *)prs_alloc_mem(ps,sizeof(UNIHDR2) * num_domains))) + return False; - if (!(r_e->uni_domain_name = (UNISTR2 *) - malloc(sizeof(UNISTR2) * num_domains))) - return False; + if (!(r_e->uni_domain_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2) * num_domains))) + return False; - if (!(r_e->domain_sid = (DOM_SID2 *) - malloc(sizeof(DOM_SID2) * num_domains))) - return False; + if (!(r_e->domain_sid = (DOM_SID2 *)prs_alloc_mem(ps,sizeof(DOM_SID2) * num_domains))) + return False; + } for (i = 0; i < num_domains; i++) { if(!smb_io_unihdr2 ("", &r_e->hdr_domain_name[i], ps, diff --git a/source3/rpc_parse/parse_net.c b/source3/rpc_parse/parse_net.c index bde8c01240..f1ff965df2 100644 --- a/source3/rpc_parse/parse_net.c +++ b/source3/rpc_parse/parse_net.c @@ -627,7 +627,7 @@ BOOL net_io_r_srv_pwset(char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int de Init DOM_SID2 array from a string containing multiple sids *************************************************************************/ -static int init_dom_sid2s(char *sids_str, DOM_SID2 **ppsids) +static int init_dom_sid2s(TALLOC_CTX *ctx, char *sids_str, DOM_SID2 **ppsids) { char *ptr; pstring s2; @@ -647,7 +647,7 @@ static int init_dom_sid2s(char *sids_str, DOM_SID2 **ppsids) ; /* Now allocate space for them. */ - *ppsids = (DOM_SID2 *)malloc(count * sizeof(DOM_SID2)); + *ppsids = (DOM_SID2 *)talloc_zero(ctx, count * sizeof(DOM_SID2)); if (*ppsids == NULL) return 0; @@ -936,14 +936,22 @@ void init_sam_info(DOM_SAM_INFO *sam, Reads or writes a DOM_SAM_INFO structure. ********************************************************************/ -static BOOL net_io_id_info_ctr(char *desc, NET_ID_INFO_CTR *ctr, prs_struct *ps, int depth) +static BOOL net_io_id_info_ctr(char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth) { - if (ctr == NULL) - return False; + NET_ID_INFO_CTR *ctr = *pp_ctr; prs_debug(ps, depth, desc, "smb_io_sam_info"); depth++; + if (UNMARSHALLING(ps)) { + ctr = *pp_ctr = (NET_ID_INFO_CTR *)prs_alloc_mem(ps, sizeof(NET_ID_INFO_CTR)); + if (ctr == NULL) + return False; + } + + if (ctr == NULL) + return False; + /* don't 4-byte align here! */ if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value)) @@ -993,8 +1001,8 @@ static BOOL smb_io_sam_info(char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int d if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level)) return False; - if (sam->logon_level != 0 && sam->ctr != NULL) { - if(!net_io_id_info_ctr("logon_info", sam->ctr, ps, depth)) + if (sam->logon_level != 0) { + if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth)) return False; } @@ -1005,7 +1013,7 @@ static BOOL smb_io_sam_info(char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int d Init *************************************************************************/ -void init_net_user_info3(NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, +void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, uint16 logon_count, uint16 bad_pw_count, uint32 num_groups, DOM_GID *gids, uint32 user_flgs, char *sess_key, @@ -1090,7 +1098,7 @@ void init_net_user_info3(NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, memset((char *)usr->padding, '\0', sizeof(usr->padding)); - num_other_sids = init_dom_sid2s(other_sids, &usr->other_sids); + num_other_sids = init_dom_sid2s(ctx, other_sids, &usr->other_sids); usr->num_other_sids = num_other_sids; usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0; @@ -1105,7 +1113,7 @@ void init_net_user_info3(NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, usr->num_groups2 = num_groups; if (num_groups > 0) { - usr->gids = (DOM_GID *)malloc(sizeof(DOM_GID) * num_groups); + usr->gids = (DOM_GID *)talloc_zero(ctx,sizeof(DOM_GID) * num_groups); if (usr->gids == NULL) return; for (i = 0; i < num_groups; i++) @@ -1120,16 +1128,6 @@ void init_net_user_info3(NET_USER_INFO_3 *usr, SAM_ACCOUNT *sampw, } /******************************************************************* - Delete any memory allocated by init_user_info_3... -********************************************************************/ - -void free_user_info3(NET_USER_INFO_3 *usr) -{ - safe_free(usr->gids); - safe_free(usr->other_sids); -} - -/******************************************************************* This code has been modified to cope with a NET_USER_INFO_2 - which is exactly the same as a NET_USER_INFO_3, minus the other sids parameters. We use validation level to determine if we're marshalling a info 2 or diff --git a/source3/rpc_parse/parse_samr.c b/source3/rpc_parse/parse_samr.c index 462c9ed199..5cfa84ff3d 100644 --- a/source3/rpc_parse/parse_samr.c +++ b/source3/rpc_parse/parse_samr.c @@ -1,11 +1,12 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, - * Copyright (C) Paul Ashton 1997. + * Copyright (C) Andrew Tridgell 1992-2000, + * Copyright (C) Luke Kenneth Casson Leighton 1996-2000, + * Copyright (C) Paul Ashton 1997-2000, + * Copyright (C) Elrond 2000, + * Copyright (C) Jeremy Allison 2001 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,26 +23,31 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + #include "includes.h" +#include "rpc_parse.h" +#include "rpc_client.h" +#include "nterr.h" extern int DEBUGLEVEL; /******************************************************************* - Inits a SAMR_Q_CLOSE_HND structure. +inits a SAMR_Q_CLOSE_HND structure. ********************************************************************/ -void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND *q_c, POLICY_HND *hnd) +void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND * q_c, POLICY_HND *hnd) { - DEBUG(5,("init_samr_q_close_hnd\n")); - - memcpy(&q_c->pol, hnd, sizeof(q_c->pol)); + DEBUG(5, ("init_samr_q_close_hnd\n")); + + q_c->pol = *hnd; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; @@ -52,19 +58,15 @@ BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - - return True; + return smb_io_pol_hnd("pol", &q_u->pol, ps, depth); } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; @@ -77,8 +79,6 @@ BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth)) return False; - if(!prs_align(ps)) - return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -86,74 +86,93 @@ BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int return True; } - /******************************************************************* - Reads or writes a structure. +inits a SAMR_Q_LOOKUP_DOMAIN structure. ********************************************************************/ -void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u, - POLICY_HND *connect_pol, - uint32 access_mask, DOM_SID *sid) +void init_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN * q_u, + POLICY_HND *pol, char *dom_name) { - DEBUG(5,("samr_init_q_open_domain\n")); + int len_name = strlen(dom_name); - q_u->pol = *connect_pol; - q_u->access_mask = access_mask; - init_dom_sid2(&q_u->dom_sid, sid); + DEBUG(5, ("init_samr_q_lookup_domain\n")); + + q_u->connect_pol = *pol; + + init_uni_hdr(&q_u->hdr_domain, len_name); + init_unistr2(&q_u->uni_domain, dom_name, len_name); } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ - -BOOL samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_lookup_domain(char *desc, SAMR_Q_LOOKUP_DOMAIN * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_open_domain"); + prs_debug(ps, depth, desc, "samr_io_q_lookup_domain"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) - return False; - if(!prs_align(ps)) + if(!smb_io_pol_hnd("connect_pol", &q_u->connect_pol, ps, depth)) return False; - if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) + if(!smb_io_unihdr("hdr_domain", &q_u->hdr_domain, ps, depth)) return False; - if(!smb_io_dom_sid2("sid", &q_u->dom_sid, ps, depth)) - return False; - if(!prs_align(ps)) + if(!smb_io_unistr2("uni_domain", &q_u->uni_domain, q_u->hdr_domain.buffer, ps, depth)) return False; return True; } +/******************************************************************* +inits a SAMR_R_LOOKUP_DOMAIN structure. +********************************************************************/ + +void init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u, + DOM_SID *dom_sid, uint32 status) +{ + DEBUG(5, ("init_samr_r_lookup_domain\n")); + + r_u->status = status; + r_u->ptr_sid = 0; + if (status == 0x0) { + r_u->ptr_sid = 1; + init_dom_sid2(&r_u->dom_sid, dom_sid); + } +} /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_open_domain"); + prs_debug(ps, depth, desc, "samr_io_r_lookup_domain"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("domain_pol", &r_u->domain_pol, ps, depth)) - return False; - if(!prs_align(ps)) + if(!prs_uint32("ptr", ps, depth, &r_u->ptr_sid)) return False; + if (r_u->ptr_sid != 0) { + if(!smb_io_dom_sid2("sid", &r_u->dom_sid, ps, depth)) + return False; + if(!prs_align(ps)) + return False; + } + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -161,34 +180,39 @@ BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -void init_samr_q_unknown_2c(SAMR_Q_UNKNOWN_2C *q_u, POLICY_HND *user_pol) +void init_samr_q_unknown_2d(SAMR_Q_UNKNOWN_2D * q_u, POLICY_HND *dom_pol, DOM_SID *sid) { - DEBUG(5,("samr_init_q_unknown_2c\n")); + DEBUG(5, ("samr_init_samr_q_unknown_2d\n")); - memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol)); + q_u->dom_pol = *dom_pol; + init_dom_sid2(&q_u->sid, sid); } - /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_unknown_2c(char *desc, SAMR_Q_UNKNOWN_2C *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_unknown_2d(char *desc, SAMR_Q_UNKNOWN_2D * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_unknown_2c"); + prs_debug(ps, depth, desc, "samr_io_q_unknown_2d"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth)) + if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth)) + return False; + + if(!smb_io_dom_sid2("sid", &q_u->sid, ps, depth)) return False; + if(!prs_align(ps)) return False; @@ -196,282 +220,263 @@ BOOL samr_io_q_unknown_2c(char *desc, SAMR_Q_UNKNOWN_2C *q_u, prs_struct *ps, i } /******************************************************************* - Inits a structure. -********************************************************************/ - -void init_samr_r_unknown_2c(SAMR_R_UNKNOWN_2C *q_u, uint32 status) -{ - DEBUG(5,("samr_init_r_unknown_2c\n")); - - q_u->unknown_0 = 0x00160000; - q_u->unknown_1 = 0x00000000; - q_u->status = status; -} - - -/******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_unknown_2c(char *desc, SAMR_R_UNKNOWN_2C *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_unknown_2d(char *desc, SAMR_R_UNKNOWN_2D * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_unknown_2c"); + prs_debug(ps, depth, desc, "samr_io_r_unknown_2d"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("unknown_0", ps, depth, &r_u->unknown_0)) - return False; - if(!prs_uint32("unknown_1", ps, depth, &r_u->unknown_1)) - return False; - if(!prs_uint32("status ", ps, depth, &r_u->status)) + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; } /******************************************************************* - Inits a SAMR_Q_UNKNOWN_3 structure. +reads or writes a structure. ********************************************************************/ -void init_samr_q_unknown_3(SAMR_Q_UNKNOWN_3 *q_u, - POLICY_HND *user_pol, uint16 switch_value) +void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN * q_u, + POLICY_HND *pol, uint32 flags, + DOM_SID *sid) { - DEBUG(5,("samr_init_q_unknown_3\n")); + DEBUG(5, ("samr_init_samr_q_open_domain\n")); - memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol)); - q_u->switch_value = switch_value; + q_u->pol = *pol; + q_u->flags = flags; + init_dom_sid2(&q_u->dom_sid, sid); } - /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_unknown_3(char *desc, SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_unknown_3"); + prs_debug(ps, depth, desc, "samr_io_q_open_domain"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth)) + if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) return False; - if(!prs_align(ps)) + if(!prs_uint32("flags", ps, depth, &q_u->flags)) return False; - if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) + if(!smb_io_dom_sid2("sid", &q_u->dom_sid, ps, depth)) + return False; + + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; + + prs_debug(ps, depth, desc, "samr_io_r_open_domain"); + depth++; + if(!prs_align(ps)) return False; + if(!smb_io_pol_hnd("domain_pol", &r_u->domain_pol, ps, depth)) + return False; + + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + return True; } /******************************************************************* - Inits a SAMR_Q_QUERY_DOMAIN_INFO structure. +reads or writes a structure. ********************************************************************/ -void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u, - POLICY_HND *domain_pol, uint16 switch_value) +void init_samr_q_get_usrdom_pwinfo(SAMR_Q_GET_USRDOM_PWINFO * q_u, + POLICY_HND *user_pol) { - DEBUG(5,("init_samr_q_query_dom_info\n")); + DEBUG(5, ("samr_init_samr_q_get_usrdom_pwinfo\n")); - memcpy(&q_u->domain_pol, domain_pol, sizeof(q_u->domain_pol)); - q_u->switch_value = switch_value; + q_u->user_pol = *user_pol; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_query_dom_info(char *desc, SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_get_usrdom_pwinfo(char *desc, SAMR_Q_GET_USRDOM_PWINFO * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_query_dom_info"); + prs_debug(ps, depth, desc, "samr_io_q_get_usrdom_pwinfo"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - - if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) - return False; - - return True; + return smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth); } /******************************************************************* -Inits a structure. + Init. ********************************************************************/ -BOOL init_unk_info1(SAM_UNK_INFO_1 *u_1) -{ - if (u_1 == NULL) - return False; - memset(u_1->padding, 0, sizeof(u_1->padding)); /* 12 bytes zeros */ - u_1->unknown_1 = 0x80000000; - u_1->unknown_2 = 0x00000000; +void init_samr_r_get_usrdom_pwinfo(SAMR_R_GET_USRDOM_PWINFO *r_u, uint32 status) +{ + DEBUG(5, ("init_samr_r_get_usrdom_pwinfo\n")); + + r_u->unknown_0 = 0x0000; + r_u->unknown_1 = 0x0015; + r_u->unknown_2 = 0x00000000; - return True; + r_u->status = status; } /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL sam_io_unk_info1(char *desc, SAM_UNK_INFO_1 *u_1, prs_struct *ps, int depth) + +BOOL samr_io_r_get_usrdom_pwinfo(char *desc, SAMR_R_GET_USRDOM_PWINFO * r_u, + prs_struct *ps, int depth) { - if (u_1 == NULL) + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "sam_io_unk_info1"); + prs_debug(ps, depth, desc, "samr_io_r_get_usrdom_pwinfo"); depth++; - if(!prs_uint8s(False, "padding", ps, depth, u_1->padding, sizeof(u_1->padding))) + if(!prs_align(ps)) return False; - if(!prs_uint32("unknown_1", ps, depth, &u_1->unknown_1)) /* 0x8000 0000 */ + if(!prs_uint16("unknown_0", ps, depth, &r_u->unknown_0)) return False; - if(!prs_uint32("unknown_2", ps, depth, &u_1->unknown_2)) /* 0x0000 0000 */ + if(!prs_uint16("unknown_1", ps, depth, &r_u->unknown_1)) return False; - - if(!prs_align(ps)) + if(!prs_uint32("unknown_2", ps, depth, &r_u->unknown_2)) + return False; + if(!prs_uint32("status ", ps, depth, &r_u->status)) return False; return True; } /******************************************************************* - Inits a structure. +reads or writes a structure. ********************************************************************/ -void init_unk_info2(SAM_UNK_INFO_2 *u_2, char *domain, char *server) +void init_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ * q_u, + POLICY_HND *user_pol, uint32 sec_info) { - int len_domain = strlen(domain)+1; - int len_server = strlen(server)+1; - - u_2->unknown_0 = 0x00000000; - u_2->unknown_1 = 0x80000000; - u_2->unknown_2 = 0x00000000; - - u_2->ptr_0 = 1; - init_uni_hdr(&u_2->hdr_domain, len_domain); - init_uni_hdr(&u_2->hdr_server, len_server); + DEBUG(5, ("samr_init_samr_q_query_sec_obj\n")); - u_2->seq_num = 0x10000000; - u_2->unknown_3 = 0x00000000; - - u_2->unknown_4 = 0x00000001; - u_2->unknown_5 = 0x00000003; - u_2->unknown_6 = 0x00000001; - u_2->num_domain_usrs = 0x00000008; - u_2->num_domain_grps = 0x00000003; - u_2->num_local_grps = 0x00000003; - - memset(u_2->padding, 0, sizeof(u_2->padding)); /* 12 bytes zeros */ - - init_unistr2(&u_2->uni_domain, domain, len_domain); - init_unistr2(&u_2->uni_server, server, len_server); + q_u->user_pol = *user_pol; + q_u->sec_info = sec_info; } + /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL sam_io_unk_info2(char *desc, SAM_UNK_INFO_2 *u_2, prs_struct *ps, int depth) +BOOL samr_io_q_query_sec_obj(char *desc, SAMR_Q_QUERY_SEC_OBJ * q_u, + prs_struct *ps, int depth) { - if (u_2 == NULL) + if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "sam_io_unk_info2"); + prs_debug(ps, depth, desc, "samr_io_q_query_sec_obj"); depth++; - if(!prs_uint32("unknown_0", ps, depth, &u_2->unknown_0)) /* 0x0000 0000 */ - return False; - if(!prs_uint32("unknown_1", ps, depth, &u_2->unknown_1)) /* 0x8000 0000 */ - return False; - if(!prs_uint32("unknown_2", ps, depth, &u_2->unknown_2)) /* 0x0000 0000 */ + if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_0", ps, depth, &u_2->ptr_0)) /* pointer to unknown structure */ - return False; - if(!smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth)) /* domain name unicode header */ + if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth)) return False; - if(!smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth)) /* server name unicode header */ + + if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info)) return False; - /* put all the data in here, at the moment, including what the above - pointer is referring to - */ + return True; +} - if(!prs_uint32("seq_num ", ps, depth, &u_2->seq_num )) /* 0x0000 0099 or 0x1000 0000 */ - return False; - if(!prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3 )) /* 0x0000 0000 */ - return False; - - if(!prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4 )) /* 0x0000 0001 */ - return False; - if(!prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5 )) /* 0x0000 0003 */ - return False; - if(!prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6 )) /* 0x0000 0001 */ - return False; - if(!prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs )) /* 0x0000 0008 */ - return False; - if(!prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps)) /* 0x0000 0003 */ - return False; - if(!prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps)) /* 0x0000 0003 */ - return False; +/******************************************************************* +reads or writes a structure. +********************************************************************/ - if(!prs_uint8s(False, "padding", ps, depth, u_2->padding, sizeof(u_2->padding))) /* 12 bytes zeros */ - return False; +void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO * q_u, + POLICY_HND *domain_pol, uint16 switch_value) +{ + DEBUG(5, ("samr_init_samr_q_query_dom_info\n")); - if(!smb_io_unistr2( "uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth)) /* domain name unicode string */ + q_u->domain_pol = *domain_pol; + q_u->switch_value = switch_value; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_query_dom_info(char *desc, SAMR_Q_QUERY_DOMAIN_INFO * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) return False; + + prs_debug(ps, depth, desc, "samr_io_q_query_dom_info"); + depth++; + if(!prs_align(ps)) return False; - if(!smb_io_unistr2( "uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth)) /* server name unicode string */ + if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth)) return False; - if(!prs_align(ps)) + if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) return False; return True; } + /******************************************************************* -Inits a structure. +inits a structure. ********************************************************************/ -BOOL init_unk_info3(SAM_UNK_INFO_3 * u_3) -{ - if (u_3 == NULL) - return False; +void init_unk_info3(SAM_UNK_INFO_3 * u_3) +{ u_3->unknown_0 = 0x00000000; u_3->unknown_1 = 0x80000000; - - return True; } /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL sam_io_unk_info3(char *desc, SAM_UNK_INFO_3 *u_3, prs_struct *ps, int depth) + +static BOOL sam_io_unk_info3(char *desc, SAM_UNK_INFO_3 * u_3, + prs_struct *ps, int depth) { if (u_3 == NULL) return False; @@ -484,31 +489,26 @@ static BOOL sam_io_unk_info3(char *desc, SAM_UNK_INFO_3 *u_3, prs_struct *ps, in if(!prs_uint32("unknown_1", ps, depth, &u_3->unknown_1)) /* 0x8000 0000 */ return False; - if(!prs_align(ps)) - return False; - return True; } /******************************************************************* -Inits a structure. +inits a structure. ********************************************************************/ -BOOL init_unk_info6(SAM_UNK_INFO_6 * u_6) -{ - if (u_6 == NULL) - return False; +void init_unk_info6(SAM_UNK_INFO_6 * u_6) +{ u_6->unknown_0 = 0x00000000; u_6->ptr_0 = 1; memset(u_6->padding, 0, sizeof(u_6->padding)); /* 12 bytes zeros */ - - return True; } /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 *u_6, prs_struct *ps, int depth) + +static BOOL sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 * u_6, + prs_struct *ps, int depth) { if (u_6 == NULL) return False; @@ -516,36 +516,31 @@ static BOOL sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 *u_6, prs_struct *ps, in prs_debug(ps, depth, desc, "sam_io_unk_info6"); depth++; - if(!prs_uint32("unknown_0", ps, depth, &u_6->unknown_0)) /* 0x0000 0000 */ + if(!prs_uint32("unknown_0", ps, depth, &u_6->unknown_0)) /* 0x0000 0000 */ return False; - if(!prs_uint32("ptr_0", ps, depth, &u_6->ptr_0)) /* pointer to unknown structure */ + if(!prs_uint32("ptr_0", ps, depth, &u_6->ptr_0)) /* pointer to unknown structure */ return False; if(!prs_uint8s(False, "padding", ps, depth, u_6->padding, sizeof(u_6->padding))) /* 12 bytes zeros */ return False; - if(!prs_align(ps)) - return False; - return True; } /******************************************************************* -Inits a structure. +inits a structure. ********************************************************************/ -BOOL init_unk_info7(SAM_UNK_INFO_7 *u_7) -{ - if (u_7 == NULL) - return False; +void init_unk_info7(SAM_UNK_INFO_7 * u_7) +{ u_7->unknown_0 = 0x0003; - - return True; } /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 *u_7, prs_struct *ps, int depth) + +static BOOL sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 * u_7, + prs_struct *ps, int depth) { if (u_7 == NULL) return False; @@ -553,37 +548,32 @@ static BOOL sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 *u_7, prs_struct *ps, in prs_debug(ps, depth, desc, "sam_io_unk_info7"); depth++; - if(!prs_uint16("unknown_0", ps, depth, &u_7->unknown_0)) /* 0x0003 */ - return False; - if(!prs_align(ps)) + if(!prs_uint16("unknown_0", ps, depth, &u_7->unknown_0)) /* 0x0003 */ return False; return True; } /******************************************************************* -Inits a structure. +inits a structure. ********************************************************************/ -BOOL init_unk_info12(SAM_UNK_INFO_12 * u_12) -{ - if (u_12 == NULL) - return False; +void init_unk_info12(SAM_UNK_INFO_12 * u_12) +{ u_12->unknown_0 = 0xcf1dcc00; u_12->unknown_1 = 0xfffffffb; u_12->unknown_2 = 0xcf1dcc00; u_12->unknown_3 = 0xfffffffb; u_12->unknown_4 = 0x8a880000; - - return True; } /******************************************************************* reads or writes a structure. ********************************************************************/ + static BOOL sam_io_unk_info12(char *desc, SAM_UNK_INFO_12 * u_12, - prs_struct *ps, int depth) + prs_struct *ps, int depth) { if (u_12 == NULL) return False; @@ -602,323 +592,247 @@ static BOOL sam_io_unk_info12(char *desc, SAM_UNK_INFO_12 * u_12, if(!prs_uint32("unknown_4", ps, depth, &u_12->unknown_4)) return False; - if(!prs_align(ps)) - return False; - return True; } /******************************************************************* - Inits a SAMR_R_QUERY_DOMAIN_INFO structure. +inits a structure. ********************************************************************/ - -void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u, - uint16 switch_value, SAM_UNK_CTR *ctr, - uint32 status) +void init_unk_info2(SAM_UNK_INFO_2 * u_2, + char *domain, char *server, + uint32 seq_num) { - DEBUG(5,("init_samr_r_query_dom_info\n")); + int len_domain = strlen(domain); + int len_server = strlen(server); - r_u->ptr_0 = 0; - r_u->switch_value = 0; - r_u->status = status; /* return status */ + u_2->unknown_0 = 0x00000000; + u_2->unknown_1 = 0x80000000; + u_2->unknown_2 = 0x00000000; - if (status == 0) { - r_u->switch_value = switch_value; - r_u->ptr_0 = 1; - r_u->ctr = ctr; - } + u_2->ptr_0 = 1; + init_uni_hdr(&u_2->hdr_domain, len_domain); + init_uni_hdr(&u_2->hdr_server, len_server); + + u_2->seq_num = seq_num; + u_2->unknown_3 = 0x00000000; + + u_2->unknown_4 = 0x00000001; + u_2->unknown_5 = 0x00000003; + u_2->unknown_6 = 0x00000001; + u_2->num_domain_usrs = MAX_SAM_ENTRIES; + u_2->num_domain_grps = MAX_SAM_ENTRIES; + u_2->num_local_grps = MAX_SAM_ENTRIES; + + memset(u_2->padding, 0, sizeof(u_2->padding)); /* 12 bytes zeros */ + + init_unistr2(&u_2->uni_domain, domain, len_domain); + init_unistr2(&u_2->uni_server, server, len_server); } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_struct *ps, int depth) +static BOOL sam_io_unk_info2(char *desc, SAM_UNK_INFO_2 * u_2, + prs_struct *ps, int depth) { - if (r_u == NULL) + if (u_2 == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_query_dom_info"); + prs_debug(ps, depth, desc, "sam_io_unk_info2"); depth++; - if(!prs_align(ps)) + if(!prs_uint32("unknown_0", ps, depth, &u_2->unknown_0)) /* 0x0000 0000 */ return False; - - if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0)) + if(!prs_uint32("unknown_1", ps, depth, &u_2->unknown_1)) /* 0x8000 0000 */ return False; - - if (r_u->ptr_0 != 0 && r_u->ctr != NULL) { - if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value)) - return False; - if(!prs_align(ps)) - return False; - - switch (r_u->switch_value) { - case 0x01: - if(!sam_io_unk_info1("unk_inf1", &r_u->ctr->info.inf1, ps, depth)) - return False; - break; - case 0x02: - if(!sam_io_unk_info2("unk_inf2", &r_u->ctr->info.inf2, ps, depth)) - return False; - break; - case 0x03: - if(!sam_io_unk_info3("unk_inf3", &r_u->ctr->info.inf3, ps, depth)) - return False; - break; - case 0x06: - if(!sam_io_unk_info6("unk_inf6", &r_u->ctr->info.inf6, ps, depth)) - return False; - break; - case 0x07: - if(!sam_io_unk_info7("unk_inf7", &r_u->ctr->info.inf7, ps, depth)) - return False; - break; - case 0x0c: - if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth)) - return False; - break; - default: - DEBUG(3,("samr_io_r_query_dom_info: unknown switch level 0x%x\n", - r_u->switch_value)); - return False; - } - } - - if(!prs_uint32("status", ps, depth, &r_u->status)) + if(!prs_uint32("unknown_2", ps, depth, &u_2->unknown_2)) /* 0x0000 0000 */ return False; - return True; -} - - -/******************************************************************* - Inits a DOM_SID3 structure. - Calculate length by adding up the size of the components. - ********************************************************************/ - -void init_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid) -{ - sid3->sid = *sid; - sid3->len = 2 + 8 + sid3->sid.num_auths * 4; -} - -/******************************************************************* - Reads or writes a SAM_SID3 structure. - - this one's odd, because the length (in bytes) is specified at the beginning. - the length _includes_ the length of the length, too :-) + if(!prs_uint32("ptr_0", ps, depth, &u_2->ptr_0)) + return False; + if(!smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth)) + return False; + if(!smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth)) + return False; -********************************************************************/ + /* put all the data in here, at the moment, including what the above + pointer is referring to + */ -static BOOL sam_io_dom_sid3(char *desc, DOM_SID3 *sid3, prs_struct *ps, int depth) -{ - if (sid3 == NULL) + if(!prs_uint32("seq_num ", ps, depth, &u_2->seq_num)) /* 0x0000 0099 or 0x1000 0000 */ + return False; + if(!prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3)) /* 0x0000 0000 */ return False; - prs_debug(ps, depth, desc, "sam_io_dom_sid3"); - depth++; + if(!prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4)) /* 0x0000 0001 */ + return False; + if(!prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5)) /* 0x0000 0003 */ + return False; + if(!prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6)) /* 0x0000 0001 */ + return False; + if(!prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs)) + return False; + if(!prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps)) + return False; + if(!prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps)) + return False; - if(!prs_uint16("len", ps, depth, &sid3->len)) + if(!prs_uint8s(False, "padding", ps, depth, u_2->padding,sizeof(u_2->padding))) return False; - if(!prs_align(ps)) + + if(!smb_io_unistr2("uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth)) return False; - if(!smb_io_dom_sid("", &sid3->sid, ps, depth)) + if(!smb_io_unistr2("uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth)) return False; return True; } /******************************************************************* - Inits a SAMR_R_UNKNOWN3 structure. - -unknown_2 : 0x0001 -unknown_3 : 0x8004 - -unknown_4,5 : 0x0000 0014 - -unknown_6 : 0x0002 -unknown_7 : 0x5800 or 0x0070 - +inits a structure. ********************************************************************/ -static void init_sam_sid_stuff(SAM_SID_STUFF *stf, - uint16 unknown_2, uint16 unknown_3, - uint32 unknown_4, uint16 unknown_6, uint16 unknown_7, - int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS]) +void init_unk_info1(SAM_UNK_INFO_1 * u_1) { - stf->unknown_2 = unknown_2; - stf->unknown_3 = unknown_3; - - memset((char *)stf->padding1, '\0', sizeof(stf->padding1)); - - stf->unknown_4 = unknown_4; - stf->unknown_5 = unknown_4; - - stf->unknown_6 = unknown_6; - stf->unknown_7 = unknown_7; - - stf->num_sids = num_sid3s; - - stf->padding2 = 0x0000; - - memcpy(stf->sid, sid3, sizeof(DOM_SID3) * num_sid3s); + memset(u_1->padding, 0, sizeof(u_1->padding)); /* 12 bytes zeros */ + u_1->unknown_1 = 0x80000000; + u_1->unknown_2 = 0x00000000; } /******************************************************************* - Reads or writes a SAM_SID_STUFF structure. +reads or writes a structure. ********************************************************************/ -static BOOL sam_io_sid_stuff(char *desc, SAM_SID_STUFF *stf, prs_struct *ps, int depth) +static BOOL sam_io_unk_info1(char *desc, SAM_UNK_INFO_1 * u_1, + prs_struct *ps, int depth) { - int i; - - if (stf == NULL) - return False; - - DEBUG(5,("init_sam_sid_stuff\n")); + if (u_1 == NULL) + return False; - if(!prs_uint16("unknown_2", ps, depth, &stf->unknown_2)) - return False; - if(!prs_uint16("unknown_3", ps, depth, &stf->unknown_3)) - return False; + prs_debug(ps, depth, desc, "sam_io_unk_info1"); + depth++; - if(!prs_uint8s(False, "padding1", ps, depth, stf->padding1, sizeof(stf->padding1))) + if(!prs_uint8s(False, "padding", ps, depth, u_1->padding, sizeof(u_1->padding))) return False; - if(!prs_uint32("unknown_4", ps, depth, &stf->unknown_4)) - return False; - if(!prs_uint32("unknown_5", ps, depth, &stf->unknown_5)) + if(!prs_uint32("unknown_1", ps, depth, &u_1->unknown_1)) /* 0x8000 0000 */ return False; - if(!prs_uint16("unknown_6", ps, depth, &stf->unknown_6)) - return False; - if(!prs_uint16("unknown_7", ps, depth, &stf->unknown_7)) + if(!prs_uint32("unknown_2", ps, depth, &u_1->unknown_2)) /* 0x0000 0000 */ return False; - if(!prs_uint32("num_sids ", ps, depth, &stf->num_sids )) - return False; - if(!prs_uint16("padding2 ", ps, depth, &stf->padding2 )) - return False; - - SMB_ASSERT_ARRAY(stf->sid, stf->num_sids); - - for (i = 0; i < stf->num_sids; i++) { - if(!sam_io_dom_sid3("", &(stf->sid[i]), ps, depth)) - return False; - } - return True; } /******************************************************************* - Inits or writes a SAMR_R_UNKNOWN3 structure. +inits a SAMR_R_QUERY_DOMAIN_INFO structure. ********************************************************************/ -void init_samr_r_unknown_3(SAMR_R_UNKNOWN_3 *r_u, - uint16 unknown_2, uint16 unknown_3, - uint32 unknown_4, uint16 unknown_6, uint16 unknown_7, - int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS], +void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO * r_u, + uint16 switch_value, SAM_UNK_CTR * ctr, uint32 status) { - DEBUG(5,("samr_init_r_unknown_3\n")); + DEBUG(5, ("init_samr_r_query_dom_info\n")); r_u->ptr_0 = 0; - r_u->ptr_1 = 0; + r_u->switch_value = 0; + r_u->status = status; /* return status */ - if (status == 0x0) { + if (status == 0) { + r_u->switch_value = switch_value; r_u->ptr_0 = 1; - r_u->ptr_1 = 1; - init_sam_sid_stuff(&(r_u->sid_stuff), unknown_2, unknown_3, - unknown_4, unknown_6, unknown_7, - num_sid3s, sid3); + r_u->ctr = ctr; } - - r_u->status = status; } /******************************************************************* - Reads or writes a SAMR_R_UNKNOWN_3 structure. - -this one's odd, because the daft buggers use a different mechanism -for writing out the array of sids. they put the number of sids in -only one place: they've calculated the length of each sid and jumped -by that amount. then, retrospectively, the length of the whole buffer -is put at the beginning of the data stream. - -wierd. - +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO * r_u, + prs_struct *ps, int depth) { - int ptr_len0=0; - int ptr_len1=0; - int ptr_sid_stuff = 0; - - if (r_u == NULL) + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_unknown_3"); + prs_debug(ps, depth, desc, "samr_io_r_query_dom_info"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0)) + if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0)) return False; - if (ps->io) { - /* reading. do the length later */ - if(!prs_uint32("sid_stuff_len0", ps, depth, &r_u->sid_stuff_len0)) + if (r_u->ptr_0 != 0 && r_u->ctr != NULL) { + if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value)) return False; - } else { - /* storing */ - ptr_len0 = prs_offset(ps); - if(!prs_set_offset(ps, ptr_len0 + 4)) + if(!prs_align(ps)) return False; - } - if (r_u->ptr_0 != 0) { - if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1)) - return False; - if (ps->io) { - /* reading. do the length later */ - if(!prs_uint32("sid_stuff_len1", ps, depth, &r_u->sid_stuff_len1)) + switch (r_u->switch_value) { + case 0x0c: + if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth)) + return False; + break; + case 0x07: + if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth)) return False; - } else { - /* storing */ - ptr_len1 = prs_offset(ps); - if(!prs_set_offset(ps, ptr_len1 + 4)) + break; + case 0x06: + if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth)) return False; - } - - if (r_u->ptr_1 != 0) { - ptr_sid_stuff = prs_offset(ps); - if(!sam_io_sid_stuff("", &r_u->sid_stuff, ps, depth)) + break; + case 0x03: + if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth)) + return False; + break; + case 0x02: + if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth)) + return False; + break; + case 0x01: + if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth)) return False; + break; + default: + DEBUG(0, ("samr_io_r_query_dom_info: unknown switch level 0x%x\n", + r_u->switch_value)); + r_u->status = NT_STATUS_INVALID_INFO_CLASS; + return False; } } + + if(!prs_align(ps)) + return False; - if (!(ps->io)) { - /* storing not reading. do the length, now. */ + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; +} - if (ptr_sid_stuff != 0) { - int old_len = prs_offset(ps); - uint32 sid_stuff_len = old_len - ptr_sid_stuff; +/******************************************************************* +reads or writes a SAMR_R_QUERY_SEC_OBJ structure. +********************************************************************/ - if(!prs_set_offset(ps, ptr_len0)) - return False; - if(!prs_uint32("sid_stuff_len0", ps, depth, &sid_stuff_len)) - return False; +BOOL samr_io_r_query_sec_obj(char *desc, SAMR_R_QUERY_SEC_OBJ * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_query_sec_obj"); + depth++; - if(!prs_set_offset(ps, ptr_len1)) - return False; - if(!prs_uint32("sid_stuff_len1", ps, depth, &sid_stuff_len)) - return False; + if(!prs_align(ps)) + return False; - if(!prs_set_offset(ps, old_len)) - return False; - } + if(!prs_uint32("ptr", ps, depth, &r_u->ptr)) + return False; + if (r_u->ptr != 0) { + if(!sec_io_desc_buf("sec", &r_u->buf, ps, depth)) + return False; } if(!prs_uint32("status", ps, depth, &r_u->status)) @@ -928,11 +842,12 @@ BOOL samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int } /******************************************************************* - Reads or writes a SAM_STR1 structure. +reads or writes a SAM_STR1 structure. ********************************************************************/ -static BOOL sam_io_sam_str1(char *desc, SAM_STR1 *sam, uint32 acct_buf, - uint32 name_buf, uint32 desc_buf, prs_struct *ps, int depth) +static BOOL sam_io_sam_str1(char *desc, SAM_STR1 * sam, uint32 acct_buf, + uint32 name_buf, uint32 desc_buf, + prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -942,31 +857,35 @@ static BOOL sam_io_sam_str1(char *desc, SAM_STR1 *sam, uint32 acct_buf, if(!prs_align(ps)) return False; - - if(!smb_io_unistr2("unistr2", &sam->uni_acct_name, acct_buf, ps, depth)) /* account name unicode string */ + if (!smb_io_unistr2("name", &sam->uni_acct_name, acct_buf, ps, depth)) return False; - if(!smb_io_unistr2("unistr2", &sam->uni_full_name, name_buf, ps, depth)) /* full name unicode string */ + + if (!smb_io_unistr2("desc", &sam->uni_acct_desc, desc_buf, ps, depth)) return False; - if(!smb_io_unistr2("unistr2", &sam->uni_acct_desc, desc_buf, ps, depth)) /* account description unicode string */ + + if (!smb_io_unistr2("full", &sam->uni_full_name, name_buf, ps, depth)) return False; return True; } /******************************************************************* - Inits a SAM_ENTRY1 structure. +inits a SAM_ENTRY1 structure. ********************************************************************/ -static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx, - uint32 len_sam_name, uint32 len_sam_full, uint32 len_sam_desc, - uint32 rid_user, uint16 acb_info) +static void init_sam_entry1(SAM_ENTRY1 * sam, uint32 user_idx, + uint32 len_sam_name, uint32 len_sam_full, + uint32 len_sam_desc, uint32 rid_user, + uint16 acb_info) { - DEBUG(5,("init_sam_entry1\n")); + DEBUG(5, ("init_sam_entry1\n")); + + ZERO_STRUCTP(sam); sam->user_idx = user_idx; sam->rid_user = rid_user; sam->acb_info = acb_info; - sam->pad = 0; + sam->pad = 0; init_uni_hdr(&sam->hdr_acct_name, len_sam_name); init_uni_hdr(&sam->hdr_user_name, len_sam_full); @@ -974,10 +893,11 @@ static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx, } /******************************************************************* - Reads or writes a SAM_ENTRY1 structure. +reads or writes a SAM_ENTRY1 structure. ********************************************************************/ -static BOOL sam_io_sam_entry1(char *desc, SAM_ENTRY1 *sam, prs_struct *ps, int depth) +static BOOL sam_io_sam_entry1(char *desc, SAM_ENTRY1 * sam, + prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -998,21 +918,22 @@ static BOOL sam_io_sam_entry1(char *desc, SAM_ENTRY1 *sam, prs_struct *ps, int if(!prs_uint16("pad ", ps, depth, &sam->pad)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_acct_name, ps, depth)) /* account name unicode string header */ + if (!smb_io_unihdr("hdr_acct_name", &sam->hdr_acct_name, ps, depth)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_user_name, ps, depth)) /* account name unicode string header */ + if (!smb_io_unihdr("hdr_user_desc", &sam->hdr_user_desc, ps, depth)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_user_desc, ps, depth)) /* account name unicode string header */ + if (!smb_io_unihdr("hdr_user_name", &sam->hdr_user_name, ps, depth)) return False; return True; } /******************************************************************* - Reads or writes a SAM_STR2 structure. +reads or writes a SAM_STR2 structure. ********************************************************************/ -static BOOL sam_io_sam_str2(char *desc, SAM_STR2 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth) +static BOOL sam_io_sam_str2(char *desc, SAM_STR2 * sam, uint32 acct_buf, + uint32 desc_buf, prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -1023,38 +944,38 @@ static BOOL sam_io_sam_str2(char *desc, SAM_STR2 *sam, uint32 acct_buf, uint32 if(!prs_align(ps)) return False; - if(!smb_io_unistr2("unistr2", &sam->uni_srv_name, acct_buf, ps, depth)) /* account name unicode string */ + if(!smb_io_unistr2("uni_srv_name", &sam->uni_srv_name, acct_buf, ps, depth)) /* account name unicode string */ return False; - if(!smb_io_unistr2("unistr2", &sam->uni_srv_desc, desc_buf, ps, depth)) /* account description unicode string */ + if(!smb_io_unistr2("uni_srv_desc", &sam->uni_srv_desc, desc_buf, ps, depth)) /* account desc unicode string */ return False; return True; } /******************************************************************* - Inits a SAM_ENTRY2 structure. +inits a SAM_ENTRY2 structure. ********************************************************************/ - -static void init_sam_entry2(SAM_ENTRY2 *sam, uint32 user_idx, - uint32 len_sam_name, uint32 len_sam_desc, - uint32 rid_user, uint16 acb_info) +static void init_sam_entry2(SAM_ENTRY2 * sam, uint32 user_idx, + uint32 len_sam_name, uint32 len_sam_desc, + uint32 rid_user, uint16 acb_info) { - DEBUG(5,("init_sam_entry2\n")); + DEBUG(5, ("init_sam_entry2\n")); sam->user_idx = user_idx; sam->rid_user = rid_user; sam->acb_info = acb_info; - sam->pad = 0; + sam->pad = 0; init_uni_hdr(&sam->hdr_srv_name, len_sam_name); init_uni_hdr(&sam->hdr_srv_desc, len_sam_desc); } /******************************************************************* - Reads or writes a SAM_ENTRY2 structure. +reads or writes a SAM_ENTRY2 structure. ********************************************************************/ -static BOOL sam_io_sam_entry2(char *desc, SAM_ENTRY2 *sam, prs_struct *ps, int depth) +static BOOL sam_io_sam_entry2(char *desc, SAM_ENTRY2 * sam, + prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -1075,19 +996,20 @@ static BOOL sam_io_sam_entry2(char *desc, SAM_ENTRY2 *sam, prs_struct *ps, int if(!prs_uint16("pad ", ps, depth, &sam->pad)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_srv_name, ps, depth)) /* account name unicode string header */ + if(!smb_io_unihdr("unihdr", &sam->hdr_srv_name, ps, depth)) /* account name unicode string header */ return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_srv_desc, ps, depth)) /* account name unicode string header */ + if(!smb_io_unihdr("unihdr", &sam->hdr_srv_desc, ps, depth)) /* account name unicode string header */ return False; return True; } /******************************************************************* - Reads or writes a SAM_STR3 structure. +reads or writes a SAM_STR3 structure. ********************************************************************/ -static BOOL sam_io_sam_str3(char *desc, SAM_STR3 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth) +static BOOL sam_io_sam_str3(char *desc, SAM_STR3 * sam, uint32 acct_buf, + uint32 desc_buf, prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -1098,37 +1020,38 @@ static BOOL sam_io_sam_str3(char *desc, SAM_STR3 *sam, uint32 acct_buf, uint32 if(!prs_align(ps)) return False; - if(!smb_io_unistr2("unistr2", &sam->uni_grp_name, acct_buf, ps, depth)) /* account name unicode string */ + if(!smb_io_unistr2("uni_grp_name", &sam->uni_grp_name, acct_buf, ps, depth)) /* account name unicode string */ return False; - if(!smb_io_unistr2("unistr2", &sam->uni_grp_desc, desc_buf, ps, depth)) /* account description unicode string */ + if(!smb_io_unistr2("uni_grp_desc", &sam->uni_grp_desc, desc_buf, ps, depth)) /* account desc unicode string */ return False; return True; } /******************************************************************* - Inits a SAM_ENTRY3 structure. +inits a SAM_ENTRY3 structure. ********************************************************************/ -static void init_sam_entry3(SAM_ENTRY3 *sam, uint32 grp_idx, - uint32 len_grp_name, uint32 len_grp_desc, uint32 rid_grp) +static void init_sam_entry3(SAM_ENTRY3 * sam, uint32 grp_idx, + uint32 len_grp_name, uint32 len_grp_desc, + uint32 rid_grp) { - DEBUG(5,("init_sam_entry3\n")); + DEBUG(5, ("init_sam_entry3\n")); - ZERO_STRUCTP(sam); sam->grp_idx = grp_idx; sam->rid_grp = rid_grp; - sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */ + sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */ init_uni_hdr(&sam->hdr_grp_name, len_grp_name); init_uni_hdr(&sam->hdr_grp_desc, len_grp_desc); } /******************************************************************* - Reads or writes a SAM_ENTRY3 structure. +reads or writes a SAM_ENTRY3 structure. ********************************************************************/ -static BOOL sam_io_sam_entry3(char *desc, SAM_ENTRY3 *sam, prs_struct *ps, int depth) +static BOOL sam_io_sam_entry3(char *desc, SAM_ENTRY3 * sam, + prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -1147,31 +1070,108 @@ static BOOL sam_io_sam_entry3(char *desc, SAM_ENTRY3 *sam, prs_struct *ps, int if(!prs_uint32("attr ", ps, depth, &sam->attr)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_grp_name, ps, depth)) /* account name unicode string header */ + if(!smb_io_unihdr("unihdr", &sam->hdr_grp_name, ps, depth)) /* account name unicode string header */ + return False; + if(!smb_io_unihdr("unihdr", &sam->hdr_grp_desc, ps, depth)) /* account name unicode string header */ + return False; + + return True; +} + +/******************************************************************* +inits a SAM_ENTRY4 structure. +********************************************************************/ + +static void init_sam_entry4(SAM_ENTRY4 * sam, uint32 user_idx, + uint32 len_acct_name) +{ + DEBUG(5, ("init_sam_entry4\n")); + + sam->user_idx = user_idx; + init_str_hdr(&sam->hdr_acct_name, len_acct_name, len_acct_name, + len_acct_name != 0); +} + +/******************************************************************* +reads or writes a SAM_ENTRY4 structure. +********************************************************************/ + +static BOOL sam_io_sam_entry4(char *desc, SAM_ENTRY4 * sam, + prs_struct *ps, int depth) +{ + if (sam == NULL) + return False; + + prs_debug(ps, depth, desc, "sam_io_sam_entry4"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("user_idx", ps, depth, &sam->user_idx)) + return False; + if(!smb_io_strhdr("strhdr", &sam->hdr_acct_name, ps, depth)) + return False; + + return True; +} + +/******************************************************************* +inits a SAM_ENTRY5 structure. +********************************************************************/ + +static void init_sam_entry5(SAM_ENTRY5 * sam, uint32 grp_idx, + uint32 len_grp_name) +{ + DEBUG(5, ("init_sam_entry5\n")); + + sam->grp_idx = grp_idx; + init_str_hdr(&sam->hdr_grp_name, len_grp_name, len_grp_name, + len_grp_name != 0); +} + +/******************************************************************* +reads or writes a SAM_ENTRY5 structure. +********************************************************************/ + +static BOOL sam_io_sam_entry5(char *desc, SAM_ENTRY5 * sam, + prs_struct *ps, int depth) +{ + if (sam == NULL) + return False; + + prs_debug(ps, depth, desc, "sam_io_sam_entry5"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_grp_desc, ps, depth)) /* account name unicode string header */ + if(!smb_io_strhdr("strhdr", &sam->hdr_grp_name, ps, depth)) return False; return True; } /******************************************************************* - Inits a SAM_ENTRY structure. +inits a SAM_ENTRY structure. ********************************************************************/ -static void init_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid) +void init_sam_entry(SAM_ENTRY * sam, uint32 len_sam_name, uint32 rid) { - DEBUG(5,("init_sam_entry\n")); + DEBUG(10, ("init_sam_entry: %d %d\n", len_sam_name, rid)); sam->rid = rid; init_uni_hdr(&sam->hdr_name, len_sam_name); } /******************************************************************* - Reads or writes a SAM_ENTRY structure. +reads or writes a SAM_ENTRY structure. ********************************************************************/ -static BOOL sam_io_sam_entry(char *desc, SAM_ENTRY *sam, prs_struct *ps, int depth) +static BOOL sam_io_sam_entry(char *desc, SAM_ENTRY * sam, + prs_struct *ps, int depth) { if (sam == NULL) return False; @@ -1183,37 +1183,36 @@ static BOOL sam_io_sam_entry(char *desc, SAM_ENTRY *sam, prs_struct *ps, int de return False; if(!prs_uint32("rid", ps, depth, &sam->rid)) return False; - if(!smb_io_unihdr("unihdr", &sam->hdr_name, ps, depth)) /* account name unicode string header */ + if(!smb_io_unihdr("unihdr", &sam->hdr_name, ps, depth)) /* account name unicode string header */ return False; return True; } - /******************************************************************* - Inits a SAMR_Q_ENUM_DOM_USERS structure. +inits a SAMR_Q_ENUM_DOM_USERS structure. ********************************************************************/ -void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol, - uint16 req_num_entries, uint16 unk_0, +void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS * q_e, POLICY_HND *pol, + uint32 start_idx, uint16 acb_mask, uint16 unk_1, uint32 size) { - DEBUG(5,("init_q_enum_dom_users\n")); + DEBUG(5, ("init_samr_q_enum_dom_users\n")); - memcpy(&q_e->pol, pol, sizeof(*pol)); + q_e->pol = *pol; - q_e->req_num_entries = req_num_entries; /* zero indicates lots */ - q_e->unknown_0 = unk_0; /* this gets returned in the response */ - q_e->acb_mask = acb_mask; + q_e->start_idx = start_idx; /* zero indicates lots */ + q_e->acb_mask = acb_mask; q_e->unknown_1 = unk_1; q_e->max_size = size; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth) +BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS * q_e, + prs_struct *ps, int depth) { if (q_e == NULL) return False; @@ -1224,25 +1223,17 @@ BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struc if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - - if(!prs_uint16("req_num_entries", ps, depth, &q_e->req_num_entries)) - return False; - if(!prs_uint16("unknown_0 ", ps, depth, &q_e->unknown_0)) + if(!smb_io_pol_hnd("domain_pol", &q_e->pol, ps, depth)) return False; - if(!prs_uint16("acb_mask ", ps, depth, &q_e->acb_mask)) + if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx)) return False; - if(!prs_uint16("unknown_1 ", ps, depth, &q_e->unknown_1)) + if(!prs_uint16("acb_mask ", ps, depth, &q_e->acb_mask)) return False; - - if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) + if(!prs_uint16("unknown_1", ps, depth, &q_e->unknown_1)) return False; - if(!prs_align(ps)) + if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) return False; return True; @@ -1250,60 +1241,38 @@ BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struc /******************************************************************* - Inits a SAMR_R_ENUM_DOM_USERS structure. +inits a SAMR_R_ENUM_DOM_USERS structure. ********************************************************************/ -void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u, - uint16 total_num_entries, uint16 unk_0, - uint32 num_sam_entries, SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], uint32 status) +void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS * r_u, + uint32 next_idx, uint32 num_sam_entries) { - int i; - - DEBUG(5,("init_samr_r_enum_dom_users\n")); + DEBUG(5, ("init_samr_r_enum_dom_users\n")); - if (num_sam_entries >= MAX_SAM_ENTRIES) { - num_sam_entries = MAX_SAM_ENTRIES; - DEBUG(5,("limiting number of entries to %d\n", - num_sam_entries)); - } + r_u->next_idx = next_idx; - r_u->total_num_entries = total_num_entries; - r_u->unknown_0 = unk_0; - - if (total_num_entries > 0) { + if (num_sam_entries != 0) { r_u->ptr_entries1 = 1; r_u->ptr_entries2 = 1; r_u->num_entries2 = num_sam_entries; r_u->num_entries3 = num_sam_entries; - SMB_ASSERT_ARRAY(r_u->sam, num_sam_entries); - SMB_ASSERT_ARRAY(r_u->uni_acct_name, num_sam_entries); - - for (i = 0; i < num_sam_entries; i++) { - init_sam_entry(&(r_u->sam[i]), - pass[i].uni_user_name.uni_str_len, - pass[i].user_rid); - - copy_unistr2(&r_u->uni_acct_name[i], &(pass[i].uni_user_name)); - } - r_u->num_entries4 = num_sam_entries; } else { r_u->ptr_entries1 = 0; r_u->num_entries2 = num_sam_entries; r_u->ptr_entries2 = 1; } - - r_u->status = status; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS * r_u, + prs_struct *ps, int depth) { - int i; + uint32 i; if (r_u == NULL) return False; @@ -1314,14 +1283,12 @@ BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struc if(!prs_align(ps)) return False; - if(!prs_uint16("total_num_entries", ps, depth, &r_u->total_num_entries)) - return False; - if(!prs_uint16("unknown_0 ", ps, depth, &r_u->unknown_0)) + if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx)) return False; if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1)) return False; - if (r_u->total_num_entries != 0 && r_u->ptr_entries1 != 0) { + if (r_u->ptr_entries1 != 0) { if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) return False; if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2)) @@ -1329,28 +1296,35 @@ BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struc if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3)) return False; - SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries2); + if (UNMARSHALLING(ps) && (r_u->num_entries2 != 0)) { + r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2); + r_u->uni_acct_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2); + } + + if ((r_u->sam == NULL || r_u->uni_acct_name == NULL) && r_u->num_entries2 != 0) { + DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_USERS\n")); + r_u->num_entries4 = 0; + r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED; + return False; + } for (i = 0; i < r_u->num_entries2; i++) { if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth)) return False; } - SMB_ASSERT_ARRAY(r_u->uni_acct_name, r_u->num_entries2); - for (i = 0; i < r_u->num_entries2; i++) { - if(!smb_io_unistr2("", &r_u->uni_acct_name[i], - r_u->sam[i].hdr_name.buffer, ps, depth)) + if(!smb_io_unistr2("", &r_u->uni_acct_name[i],r_u->sam[i].hdr_name.buffer, ps,depth)) return False; } - if(!prs_align(ps)) - return False; - - if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) - return False; } + if(!prs_align(ps)) + return False; + + if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) + return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -1358,289 +1332,359 @@ BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struc } /******************************************************************* - Inits a SAMR_Q_ENUM_DOM_ALIASES structure. +inits a SAMR_Q_QUERY_DISPINFO structure. ********************************************************************/ -void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol, uint32 size) +void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO * q_e, POLICY_HND *pol, + uint16 switch_level, uint32 start_idx, + uint32 max_entries) { - DEBUG(5,("init_q_enum_dom_aliases\n")); + DEBUG(5, ("init_samr_q_query_dispinfo\n")); - memcpy(&q_e->pol, pol, sizeof(*pol)); + q_e->domain_pol = *pol; - q_e->unknown_0 = 0; - q_e->max_size = size; -} + q_e->switch_level = switch_level; + q_e->start_idx = start_idx; + q_e->max_entries = max_entries; + q_e->max_size = 0xffff; /* Not especially useful */ +} /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth) +BOOL samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO * q_e, + prs_struct *ps, int depth) { if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases"); + prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) + if(!smb_io_pol_hnd("domain_pol", &q_e->domain_pol, ps, depth)) + return False; + + if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level)) return False; if(!prs_align(ps)) return False; - if(!prs_uint32("unknown_0", ps, depth, &q_e->unknown_0)) + if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx)) return False; - if(!prs_uint32("max_size ", ps, depth, &q_e->max_size )) + if(!prs_uint32("max_entries ", ps, depth, &q_e->max_entries)) return False; - - if(!prs_align(ps)) + if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) return False; return True; } - /******************************************************************* - Inits a SAMR_R_ENUM_DOM_ALIASES structure. +inits a SAM_DISPINFO_1 structure. ********************************************************************/ -void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, - uint32 num_sam_entries, SAM_USER_INFO_21 grps[MAX_SAM_ENTRIES], - uint32 status) +void init_sam_dispinfo_1(SAM_DISPINFO_1 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]) { - int i; + uint32 len_sam_name, len_sam_full, len_sam_desc; + uint32 max_entries, max_data_size; + uint32 dsize = 0; + uint32 i; - DEBUG(5,("init_samr_r_enum_dom_aliases\n")); + ZERO_STRUCTP(sam); - if (num_sam_entries >= MAX_SAM_ENTRIES) { - num_sam_entries = MAX_SAM_ENTRIES; - DEBUG(5,("limiting number of entries to %d\n", - num_sam_entries)); - } + max_entries = *num_entries; + max_data_size = *data_size; - r_u->num_entries = num_sam_entries; + DEBUG(5, ("init_sam_dispinfo_1: max_entries: %d max_dsize: 0x%x\n", + max_entries, max_data_size)); - if (num_sam_entries > 0) { - r_u->ptr_entries = 1; - r_u->num_entries2 = num_sam_entries; - r_u->ptr_entries2 = 1; - r_u->num_entries3 = num_sam_entries; - - SMB_ASSERT_ARRAY(r_u->sam, num_sam_entries); + for (i = 0; (i < max_entries) && (dsize < max_data_size); i++) { + len_sam_name = pass[i].uni_user_name.uni_str_len; + len_sam_full = pass[i].uni_full_name.uni_str_len; + len_sam_desc = pass[i].uni_acct_desc.uni_str_len; - for (i = 0; i < num_sam_entries; i++) { - init_sam_entry(&r_u->sam[i], - grps[i].uni_user_name.uni_str_len, - grps[i].user_rid); + init_sam_entry1(&sam->sam[i], start_idx + i + 1, + len_sam_name, len_sam_full, len_sam_desc, + pass[i].user_rid, pass[i].acb_info); - copy_unistr2(&r_u->uni_grp_name[i], &(grps[i].uni_user_name)); - } + copy_unistr2(&sam->str[i].uni_acct_name, &pass[i].uni_user_name); + copy_unistr2(&sam->str[i].uni_full_name, &pass[i].uni_full_name); + copy_unistr2(&sam->str[i].uni_acct_desc, &pass[i].uni_acct_desc); - r_u->num_entries4 = num_sam_entries; - } else { - r_u->ptr_entries = 0; + dsize += sizeof(SAM_ENTRY1); + dsize += len_sam_name + len_sam_full + len_sam_desc; } - r_u->status = status; + *num_entries = i; + *data_size = dsize; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth) +static BOOL sam_io_sam_dispinfo_1(char *desc, SAM_DISPINFO_1 * sam, + uint32 num_entries, + prs_struct *ps, int depth) { - int i; + uint32 i; - if (r_u == NULL) + if (sam == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases"); + prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_1"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries)) - return False; - if(!prs_uint32("ptr_entries", ps, depth, &r_u->ptr_entries)) - return False; + SMB_ASSERT_ARRAY(sam->sam, num_entries); - if (r_u->num_entries != 0 && r_u->ptr_entries != 0) { - if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) - return False; - if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2)) + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_entry1("", &sam->sam[i], ps, depth)) return False; - if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3)) + } + + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_str1("", &sam->str[i], + sam->sam[i].hdr_acct_name.buffer, + sam->sam[i].hdr_user_name.buffer, + sam->sam[i].hdr_user_desc.buffer, ps, depth)) return False; + } - SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries); + return True; +} - for (i = 0; i < r_u->num_entries; i++) { - if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth)) - return False; - } +/******************************************************************* +inits a SAM_DISPINFO_2 structure. +********************************************************************/ - for (i = 0; i < r_u->num_entries; i++) { - if(!smb_io_unistr2("", &r_u->uni_grp_name[i], r_u->sam[i].hdr_name.buffer, ps, depth)) - return False; - } +void init_sam_dispinfo_2(SAM_DISPINFO_2 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]) +{ + uint32 len_sam_name, len_sam_desc; + uint32 max_entries, max_data_size; + uint32 dsize = 0; + uint32 i; - if(!prs_align(ps)) - return False; + DEBUG(5, ("init_sam_dispinfo_2\n")); - if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) - return False; + ZERO_STRUCTP(sam); + + max_entries = *num_entries; + max_data_size = *data_size; + + for (i = 0; (i < max_entries) && (dsize < max_data_size); i++) { + len_sam_name = pass[i].uni_user_name.uni_str_len; + len_sam_desc = pass[i].uni_acct_desc.uni_str_len; + + init_sam_entry2(&sam->sam[i], start_idx + i + 1, + len_sam_name, len_sam_desc, + pass[i].user_rid, pass[i].acb_info); + + copy_unistr2(&sam->str[i].uni_srv_name, + &pass[i].uni_user_name); + copy_unistr2(&sam->str[i].uni_srv_desc, + &pass[i].uni_acct_desc); + + dsize += sizeof(SAM_ENTRY2); + dsize += len_sam_name + len_sam_desc; } - if(!prs_uint32("status", ps, depth, &r_u->status)) + *num_entries = i; + *data_size = dsize; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +static BOOL sam_io_sam_dispinfo_2(char *desc, SAM_DISPINFO_2 * sam, + uint32 num_entries, + prs_struct *ps, int depth) +{ + uint32 i; + + if (sam == NULL) + return False; + + prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_2"); + depth++; + + if(!prs_align(ps)) return False; + SMB_ASSERT_ARRAY(sam->sam, num_entries); + + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_entry2("", &sam->sam[i], ps, depth)) + return False; + } + + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_str2("", &sam->str[i], + sam->sam[i].hdr_srv_name.buffer, + sam->sam[i].hdr_srv_desc.buffer, ps, depth)) + return False; + } + return True; } - /******************************************************************* - Inits a SAMR_Q_QUERY_DISPINFO structure. +inits a SAM_DISPINFO_3 structure. ********************************************************************/ -void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol, - uint16 switch_level, uint32 start_idx, uint32 size) +void init_sam_dispinfo_3(SAM_DISPINFO_3 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + DOMAIN_GRP * grp) { - DEBUG(5,("init_q_query_dispinfo\n")); + uint32 len_sam_name, len_sam_desc; + uint32 max_entries, max_data_size; + uint32 dsize = 0; + uint32 i; - memcpy(&q_e->pol, pol, sizeof(*pol)); + DEBUG(5, ("init_sam_dispinfo_3\n")); - q_e->switch_level = switch_level; + ZERO_STRUCTP(sam); - q_e->start_idx = start_idx; - q_e->max_entries = 0; - q_e->max_size = size; + max_entries = *num_entries; + max_data_size = *data_size; + + for (i = 0; (i < max_entries) && (dsize < max_data_size); i++) { + len_sam_name = strlen(grp[i].name); + len_sam_desc = strlen(grp[i].comment); + + init_sam_entry3(&sam->sam[i], start_idx + i + 1, len_sam_name, len_sam_desc, grp[i].rid); + + init_unistr2(&sam->str[i].uni_grp_name, grp[i].name, len_sam_name); + init_unistr2(&sam->str[i].uni_grp_desc, grp[i].comment, len_sam_desc); + + dsize += sizeof(SAM_ENTRY3); + dsize += (len_sam_name + len_sam_desc) * 2; + dsize += 14; + } + + *num_entries = i; + *data_size = dsize; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth) +static BOOL sam_io_sam_dispinfo_3(char *desc, SAM_DISPINFO_3 * sam, + uint32 num_entries, + prs_struct *ps, int depth) { - if (q_e == NULL) + uint32 i; + + if (sam == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo"); + prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_3"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) - return False; - if(!prs_align(ps)) - return False; + SMB_ASSERT_ARRAY(sam->sam, num_entries); - if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level)) - return False; -#if 0 - if(!prs_uint16("unknown_0 ", ps, depth, &q_e->unknown_0)) - return False; -#else - prs_align(ps); -#endif - if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx)) - return False; - if(!prs_uint32("max_entries ", ps, depth, &q_e->max_entries)) - return False; - if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) - return False; + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_entry3("", &sam->sam[i], ps, depth)) + return False; + } - if(!prs_align(ps)) - return False; + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_str3("", &sam->str[i], + sam->sam[i].hdr_grp_name.buffer, + sam->sam[i].hdr_grp_desc.buffer, ps, depth)) + return False; + } return True; } - /******************************************************************* - Inits a SAM_INFO_2 structure. +inits a SAM_DISPINFO_4 structure. ********************************************************************/ -void init_sam_info_2(SAM_INFO_2 *sam, uint32 acb_mask, - uint32 start_idx, uint32 num_sam_entries, - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]) +void init_sam_dispinfo_4(SAM_DISPINFO_4 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]) { - int i; - int entries_added; - - DEBUG(5,("init_sam_info_2\n")); - - if (num_sam_entries >= MAX_SAM_ENTRIES) { - num_sam_entries = MAX_SAM_ENTRIES; - DEBUG(5,("limiting number of entries to %d\n", - num_sam_entries)); - } + fstring sam_name; + uint32 len_sam_name; + uint32 max_entries, max_data_size; + uint32 dsize = 0; + uint32 i; - for (i = start_idx, entries_added = 0; i < num_sam_entries; i++) { - if ((pass[i].acb_info & acb_mask) == acb_mask) { - init_sam_entry2(&sam->sam[entries_added], - start_idx + entries_added + 1, - pass[i].uni_user_name.uni_str_len, - pass[i].uni_acct_desc.uni_str_len, - pass[i].user_rid, - pass[i].acb_info); + DEBUG(5, ("init_sam_dispinfo_4\n")); - copy_unistr2(&sam->str[entries_added].uni_srv_name, &pass[i].uni_user_name); - copy_unistr2(&sam->str[entries_added].uni_srv_desc, &pass[i].uni_acct_desc); + ZERO_STRUCTP(sam); - entries_added++; - } + max_entries = *num_entries; + max_data_size = *data_size; - sam->num_entries = entries_added; - sam->ptr_entries = 1; - sam->num_entries2 = entries_added; + for (i = 0; (i < max_entries) && (dsize < max_data_size); i++) { + len_sam_name = pass[i].uni_user_name.uni_str_len; + + init_sam_entry4(&sam->sam[i], start_idx + i + 1, + len_sam_name); + + unistr2_to_ascii(sam_name, &pass[i].uni_user_name, + sizeof(sam_name)); + init_string2(&sam->str[i].acct_name, sam_name, + len_sam_name); + + dsize += sizeof(SAM_ENTRY4); + dsize += len_sam_name; } + + *num_entries = i; + *data_size = dsize; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -static BOOL sam_io_sam_info_2(char *desc, SAM_INFO_2 *sam, prs_struct *ps, int depth) +static BOOL sam_io_sam_dispinfo_4(char *desc, SAM_DISPINFO_4 * sam, + uint32 num_entries, + prs_struct *ps, int depth) { - int i; + uint32 i; if (sam == NULL) return False; - prs_debug(ps, depth, desc, "sam_io_sam_info_2"); + prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_4"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("num_entries ", ps, depth, &sam->num_entries)) - return False; - if(!prs_uint32("ptr_entries ", ps, depth, &sam->ptr_entries)) - return False; - - if(!prs_uint32("num_entries2 ", ps, depth, &sam->num_entries2)) - return False; - - SMB_ASSERT_ARRAY(sam->sam, sam->num_entries); + SMB_ASSERT_ARRAY(sam->sam, num_entries); - for (i = 0; i < sam->num_entries; i++) { - if(!sam_io_sam_entry2("", &sam->sam[i], ps, depth)) + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_entry4("", &sam->sam[i], ps, depth)) return False; } - for (i = 0; i < sam->num_entries; i++) { - if(!sam_io_sam_str2 ("", &sam->str[i], - sam->sam[i].hdr_srv_name.buffer, - sam->sam[i].hdr_srv_desc.buffer, - ps, depth)) + for (i = 0; i < num_entries; i++) { + if(!smb_io_string2("acct_name", &sam->str[i].acct_name, + sam->sam[i].hdr_acct_name.buffer, ps, depth)) + return False; + if(!prs_align(ps)) return False; } @@ -1648,121 +1692,113 @@ static BOOL sam_io_sam_info_2(char *desc, SAM_INFO_2 *sam, prs_struct *ps, int } /******************************************************************* - Inits a SAM_INFO_1 structure. +inits a SAM_DISPINFO_5 structure. ********************************************************************/ -void init_sam_info_1(SAM_INFO_1 *sam, uint32 acb_mask, - uint32 start_idx, uint32 num_sam_entries, - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]) +void init_sam_dispinfo_5(SAM_DISPINFO_5 * sam, uint32 *num_entries, + uint32 *data_size, uint32 start_idx, + DOMAIN_GRP * grp) { - int i; - int entries_added; + uint32 len_sam_name; + uint32 max_entries, max_data_size; + uint32 dsize = 0; + uint32 i; - DEBUG(5,("init_sam_info_1\n")); + DEBUG(5, ("init_sam_dispinfo_5\n")); - if (num_sam_entries >= MAX_SAM_ENTRIES) { - num_sam_entries = MAX_SAM_ENTRIES; - DEBUG(5,("limiting number of entries to %d\n", - num_sam_entries)); - } - DEBUG(5,("num_sam_entries: %u, start_idx: %u\n",num_sam_entries, - num_sam_entries)); - - for (i = 0, entries_added = 0; - i < num_sam_entries; i++) { - if ((pass[i].acb_info & acb_mask) == acb_mask) { - init_sam_entry1(&sam->sam[entries_added], - start_idx + entries_added + 1, - pass[i].uni_user_name.uni_str_len, - pass[i].uni_full_name.uni_str_len, - pass[i].uni_acct_desc.uni_str_len, - pass[i].user_rid, - pass[i].acb_info); - - copy_unistr2(&sam->str[entries_added].uni_acct_name, &pass[i].uni_user_name); - copy_unistr2(&sam->str[entries_added].uni_full_name, &pass[i].uni_full_name); - copy_unistr2(&sam->str[entries_added].uni_acct_desc, &pass[i].uni_acct_desc); - - entries_added++; - } - } + ZERO_STRUCTP(sam); - sam->num_entries = entries_added; - sam->ptr_entries = 1; - sam->num_entries2 = entries_added; + max_entries = *num_entries; + max_data_size = *data_size; + + for (i = 0; (i < max_entries) && (dsize < max_data_size); i++) { + len_sam_name = strlen(grp[i].name); + + init_sam_entry5(&sam->sam[i], start_idx + i + 1, + len_sam_name); + + init_string2(&sam->str[i].grp_name, grp[i].name, + len_sam_name); + + dsize += sizeof(SAM_ENTRY5); + dsize += len_sam_name; + } + + *num_entries = i; + *data_size = dsize; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -static BOOL sam_io_sam_info_1(char *desc, SAM_INFO_1 *sam, prs_struct *ps, int depth) +static BOOL sam_io_sam_dispinfo_5(char *desc, SAM_DISPINFO_5 * sam, + uint32 num_entries, + prs_struct *ps, int depth) { - int i; + uint32 i; if (sam == NULL) return False; - prs_debug(ps, depth, desc, "sam_io_sam_info_1"); + prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_5"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("num_entries ", ps, depth, &sam->num_entries)) - return False; - if(!prs_uint32("ptr_entries ", ps, depth, &sam->ptr_entries)) - return False; - - if(!prs_uint32("num_entries2 ", ps, depth, &sam->num_entries2)) - return False; - - SMB_ASSERT_ARRAY(sam->sam, sam->num_entries); + SMB_ASSERT_ARRAY(sam->sam, num_entries); - for (i = 0; i < sam->num_entries; i++) { - if(!sam_io_sam_entry1("", &sam->sam[i], ps, depth)) + for (i = 0; i < num_entries; i++) { + if(!sam_io_sam_entry5("", &sam->sam[i], ps, depth)) return False; } - for (i = 0; i < sam->num_entries; i++) { - if(!sam_io_sam_str1 ("", &sam->str[i], - sam->sam[i].hdr_acct_name.buffer, - sam->sam[i].hdr_user_name.buffer, - sam->sam[i].hdr_user_desc.buffer, - ps, depth)) - return False; + for (i = 0; i < num_entries; i++) { + if(!smb_io_string2("grp_name", &sam->str[i].grp_name, + sam->sam[i].hdr_grp_name.buffer, ps, depth)) + return False; + if(!prs_align(ps)) + return False; } return True; } /******************************************************************* - Inits a SAMR_R_QUERY_DISPINFO structure. +inits a SAMR_R_QUERY_DISPINFO structure. ********************************************************************/ -void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u, - uint16 switch_level, SAM_INFO_CTR *ctr, uint32 status) +void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO * r_u, + uint32 num_entries, uint32 data_size, + uint16 switch_level, SAM_DISPINFO_CTR * ctr, + uint32 status) { - DEBUG(5,("init_samr_r_query_dispinfo\n")); + DEBUG(5, ("init_samr_r_query_dispinfo: level %d\n", switch_level)); - if (status == 0x0 || status == 0x105) { - r_u->unknown_0 = 0x0000001; - r_u->unknown_1 = 0x0000001; - } else { - r_u->unknown_0 = 0x0; - r_u->unknown_1 = 0x0; - } + r_u->total_size = data_size; /* not calculated */ + r_u->data_size = data_size; r_u->switch_level = switch_level; + r_u->num_entries = num_entries; + + if (num_entries==0) + r_u->ptr_entries = 0; + else + r_u->ptr_entries = 1; + + r_u->num_entries2 = num_entries; r_u->ctr = ctr; + r_u->status = status; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; @@ -1773,30 +1809,67 @@ BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struc if(!prs_align(ps)) return False; - if(!prs_uint32("unknown_0 ", ps, depth, &r_u->unknown_0)) + if(!prs_uint32("total_size ", ps, depth, &r_u->total_size)) return False; - if(!prs_uint32("unknown_1 ", ps, depth, &r_u->unknown_1)) + if(!prs_uint32("data_size ", ps, depth, &r_u->data_size)) return False; - if(!prs_uint16("switch_level ", ps, depth, &r_u->switch_level)) + if(!prs_uint16("switch_level", ps, depth, &r_u->switch_level)) return False; - if(!prs_align(ps)) return False; + if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries)) + return False; + if(!prs_uint32("ptr_entries ", ps, depth, &r_u->ptr_entries)) + return False; + + if (r_u->ptr_entries==0) { + if(!prs_align(ps)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; + } + + if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) + return False; + switch (r_u->switch_level) { case 0x1: - if(!sam_io_sam_info_1("users", r_u->ctr->sam.info1, ps, depth)) + if(!sam_io_sam_dispinfo_1("users", r_u->ctr->sam.info1, + r_u->num_entries, ps, depth)) return False; break; case 0x2: - if(!sam_io_sam_info_2("servers", r_u->ctr->sam.info2, ps, depth)) + if(!sam_io_sam_dispinfo_2("servers", r_u->ctr->sam.info2, + r_u->num_entries, ps, depth)) + return False; + break; + case 0x3: + if(!sam_io_sam_dispinfo_3("groups", r_u->ctr->sam.info3, + r_u->num_entries, ps, depth)) + return False; + break; + case 0x4: + if(!sam_io_sam_dispinfo_4("user list", + r_u->ctr->sam.info4, + r_u->num_entries, ps, depth)) + return False; + break; + case 0x5: + if(!sam_io_sam_dispinfo_5("group list", + r_u->ctr->sam.info5, + r_u->num_entries, ps, depth)) return False; break; default: - DEBUG(5,("samr_io_r_query_dispinfo: unknown switch value\n")); + DEBUG(0,("samr_io_r_query_dispinfo: unknown switch value\n")); break; } - + + if(!prs_align(ps)) + return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -1804,196 +1877,241 @@ BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struc } /******************************************************************* - Inits a SAMR_Q_ENUM_DOM_GROUPS structure. +inits a SAMR_Q_OPEN_GROUP structure. ********************************************************************/ -void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol, - uint16 switch_level, uint32 start_idx, uint32 size) +void init_samr_q_open_group(SAMR_Q_OPEN_GROUP * q_c, + POLICY_HND *hnd, + uint32 access_mask, uint32 rid) { - DEBUG(5,("init_q_enum_dom_groups\n")); - - memcpy(&q_e->pol, pol, sizeof(*pol)); + DEBUG(5, ("init_samr_q_open_group\n")); - q_e->switch_level = switch_level; - - q_e->unknown_0 = 0; - q_e->start_idx = start_idx; - q_e->unknown_1 = 0x000007d0; - q_e->max_size = size; + q_c->domain_pol = *hnd; + q_c->access_mask = access_mask; + q_c->rid_group = rid; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth) +BOOL samr_io_q_open_group(char *desc, SAMR_Q_OPEN_GROUP * q_u, + prs_struct *ps, int depth) { - if (q_e == NULL) + if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups"); + prs_debug(ps, depth, desc, "samr_io_q_open_group"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) - return False; - if(!prs_align(ps)) + if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth)) return False; - if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level)) + if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) return False; - if(!prs_uint16("unknown_0 ", ps, depth, &q_e->unknown_0)) + if(!prs_uint32("rid_group", ps, depth, &q_u->rid_group)) return False; - if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx)) + + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_open_group(char *desc, SAMR_R_OPEN_GROUP * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; - if(!prs_uint32("unknown_1 ", ps, depth, &q_e->unknown_1)) + + prs_debug(ps, depth, desc, "samr_io_r_open_group"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) + + if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth)) return False; - if(!prs_align(ps)) + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; } - /******************************************************************* - Inits a SAMR_R_ENUM_DOM_GROUPS structure. +inits a GROUP_INFO1 structure. ********************************************************************/ -void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u, - uint32 start_idx, uint32 num_sam_entries, - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], - uint32 status) +void init_samr_group_info1(GROUP_INFO1 * gr1, + char *acct_name, char *acct_desc, + uint32 num_members) { - int i; - int entries_added; + int desc_len = acct_desc != NULL ? strlen(acct_desc) : 0; + int acct_len = acct_name != NULL ? strlen(acct_name) : 0; - DEBUG(5,("init_samr_r_enum_dom_groups\n")); + DEBUG(5, ("init_samr_group_info1\n")); - if (num_sam_entries >= MAX_SAM_ENTRIES) { - num_sam_entries = MAX_SAM_ENTRIES; - DEBUG(5,("limiting number of entries to %d\n", - num_sam_entries)); - } + init_uni_hdr(&gr1->hdr_acct_name, acct_len); - if (status == 0x0) { - for (i = start_idx, entries_added = 0; i < num_sam_entries; i++) { - init_sam_entry3(&r_u->sam[entries_added], - start_idx + entries_added + 1, - pass[i].uni_user_name.uni_str_len, - pass[i].uni_acct_desc.uni_str_len, - pass[i].user_rid); - - copy_unistr2(&r_u->str[entries_added].uni_grp_name, - &pass[i].uni_user_name); - copy_unistr2(&r_u->str[entries_added].uni_grp_desc, - &pass[i].uni_acct_desc); - - entries_added++; - } + gr1->unknown_1 = 0x3; + gr1->num_members = num_members; - if (entries_added > 0) { - r_u->unknown_0 = 0x0000492; - r_u->unknown_1 = 0x000049a; - } else { - r_u->unknown_0 = 0x0; - r_u->unknown_1 = 0x0; - } - r_u->switch_level = 3; - r_u->num_entries = entries_added; - r_u->ptr_entries = 1; - r_u->num_entries2 = entries_added; - } else { - r_u->switch_level = 0; - } + init_uni_hdr(&gr1->hdr_acct_desc, desc_len); - r_u->status = status; + init_unistr2(&gr1->uni_acct_name, acct_name, acct_len); + init_unistr2(&gr1->uni_acct_desc, acct_desc, desc_len); } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth) +BOOL samr_io_group_info1(char *desc, GROUP_INFO1 * gr1, + prs_struct *ps, int depth) { - int i; - - if (r_u == NULL) + if (gr1 == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups"); + prs_debug(ps, depth, desc, "samr_io_group_info1"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("unknown_0 ", ps, depth, &r_u->unknown_0)) + if(!smb_io_unihdr("hdr_acct_name", &gr1->hdr_acct_name, ps, depth)) return False; - if(!prs_uint32("unknown_1 ", ps, depth, &r_u->unknown_1)) + + if(!prs_uint32("unknown_1", ps, depth, &gr1->unknown_1)) return False; - if(!prs_uint32("switch_level ", ps, depth, &r_u->switch_level)) + if(!prs_uint32("num_members", ps, depth, &gr1->num_members)) return False; - if (r_u->switch_level != 0) { - if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries)) - return False; - if(!prs_uint32("ptr_entries ", ps, depth, &r_u->ptr_entries)) - return False; + if(!smb_io_unihdr("hdr_acct_desc", &gr1->hdr_acct_desc, ps, depth)) + return False; - if(!prs_uint32("num_entries2 ", ps, depth, &r_u->num_entries2)) - return False; + if(!smb_io_unistr2("uni_acct_name", &gr1->uni_acct_name, + gr1->hdr_acct_name.buffer, ps, depth)) + return False; - SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries); + if(!smb_io_unistr2("uni_acct_desc", &gr1->uni_acct_desc, + gr1->hdr_acct_desc.buffer, ps, depth)) + return False; - for (i = 0; i < r_u->num_entries; i++) { - if(!sam_io_sam_entry3("", &r_u->sam[i], ps, depth)) - return False; - } + return True; +} - for (i = 0; i < r_u->num_entries; i++) { - if(!sam_io_sam_str3 ("", &r_u->str[i], - r_u->sam[i].hdr_grp_name.buffer, - r_u->sam[i].hdr_grp_desc.buffer, - ps, depth)) - return False; - } - } +/******************************************************************* +inits a GROUP_INFO4 structure. +********************************************************************/ - if(!prs_uint32("status", ps, depth, &r_u->status)) +void init_samr_group_info4(GROUP_INFO4 * gr4, char *acct_desc) +{ + int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0; + + DEBUG(5, ("init_samr_group_info4\n")); + + init_uni_hdr(&gr4->hdr_acct_desc, acct_len); + init_unistr2(&gr4->uni_acct_desc, acct_desc, acct_len); +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_group_info4(char *desc, GROUP_INFO4 * gr4, + prs_struct *ps, int depth) +{ + if (gr4 == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_group_info4"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!smb_io_unihdr("hdr_acct_desc", &gr4->hdr_acct_desc, ps, depth)) + return False; + if(!smb_io_unistr2("uni_acct_desc", &gr4->uni_acct_desc, + gr4->hdr_acct_desc.buffer, ps, depth)) + return False; + + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +static BOOL samr_group_info_ctr(char *desc, GROUP_INFO_CTR * ctr, + prs_struct *ps, int depth) +{ + if (ctr == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_group_info_ctr"); + depth++; + + if(!prs_uint16("switch_value1", ps, depth, &ctr->switch_value1)) + return False; + if(!prs_uint16("switch_value2", ps, depth, &ctr->switch_value2)) return False; + switch (ctr->switch_value1) { + case 1: + if(!samr_io_group_info1("group_info1", + &ctr->group.info1, ps, depth)) + return False; + break; + case 4: + if(!samr_io_group_info4("group_info4", + &ctr->group.info4, ps, depth)) + return False; + break; + default: + DEBUG(0,("samr_group_info_ctr: unsupported switch level\n")); + break; + } + return True; } /******************************************************************* - Inits a SAMR_Q_QUERY_ALIASINFO structure. +inits a SAMR_Q_CREATE_DOM_GROUP structure. ********************************************************************/ -void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e, - POLICY_HND *pol, - uint16 switch_level) +void init_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP * q_e, + POLICY_HND *pol, char *acct_desc, + uint32 access_mask) { - DEBUG(5,("init_q_query_aliasinfo\n")); + int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0; - memcpy(&q_e->pol, pol, sizeof(*pol)); + DEBUG(5, ("init_samr_q_create_dom_group\n")); - q_e->switch_level = switch_level; + q_e->pol = *pol; + + init_uni_hdr(&q_e->hdr_acct_desc, acct_len); + init_unistr2(&q_e->uni_acct_desc, acct_desc, acct_len); + + q_e->access_mask = access_mask; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth) +BOOL samr_io_q_create_dom_group(char *desc, SAMR_Q_CREATE_DOM_GROUP * q_e, + prs_struct *ps, int depth) { if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo"); + prs_debug(ps, depth, desc, "samr_io_q_create_dom_group"); depth++; if(!prs_align(ps)) @@ -2001,241 +2119,315 @@ BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_str if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) return False; - if(!prs_align(ps)) + + if(!smb_io_unihdr("hdr_acct_desc", &q_e->hdr_acct_desc, ps, depth)) + return False; + if(!smb_io_unistr2("uni_acct_desc", &q_e->uni_acct_desc, + q_e->hdr_acct_desc.buffer, ps, depth)) return False; - if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level)) + if(!prs_align(ps)) + return False; + if(!prs_uint32("access", ps, depth, &q_e->access_mask)) return False; return True; } /******************************************************************* - Inits a SAMR_R_QUERY_ALIASINFO structure. +reads or writes a structure. ********************************************************************/ -void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u, uint32 switch_level, - char* alias, char* alias_desc) - +BOOL samr_io_r_create_dom_group(char *desc, SAMR_R_CREATE_DOM_GROUP * r_u, + prs_struct *ps, int depth) { - int alias_desc_len, alias_len; + if (r_u == NULL) + return False; - if(r_u == NULL) - return; + prs_debug(ps, depth, desc, "samr_io_r_create_dom_group"); + depth++; - alias_len = alias?strlen(alias)+1:0; - alias_desc_len = alias_desc?strlen(alias_desc)+1:0; + if(!prs_align(ps)) + return False; - DEBUG(5,("init_samr_r_query_aliasinfo\n")); + if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth)) + return False; - r_u->switch_value = switch_level; + if(!prs_uint32("rid ", ps, depth, &r_u->rid)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; - if(r_u->status == 0) - { - switch(switch_level) - { - case 1: - { - r_u->ptr = 1; - init_uni_hdr(&r_u->alias.info1.hdr_alias_name, alias_len); - init_unistr2(&r_u->alias.info1.uni_alias_name, alias, alias_len); - r_u->alias.info1.switch_value_1 = switch_level; - init_uni_hdr(&r_u->alias.info1.hdr_alias_desc, alias_desc_len); - init_unistr2(&r_u->alias.info1.uni_alias_desc, alias_desc, alias_desc_len); - break; - } - case 3: - { - r_u->ptr = 1; - init_uni_hdr(&r_u->alias.info3.hdr_acct_desc, alias_desc_len); - init_unistr2(&r_u->alias.info3.uni_acct_desc, alias_desc, alias_desc_len); - break; - } - default: - { - r_u->status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS; - } - } - } + return True; } - +/******************************************************************* +inits a SAMR_Q_DELETE_DOM_GROUP structure. +********************************************************************/ + +void init_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP * q_c, + POLICY_HND *hnd) +{ + DEBUG(5, ("init_samr_q_delete_dom_group\n")); + + q_c->group_pol = *hnd; +} /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth) +BOOL samr_io_q_delete_dom_group(char *desc, SAMR_Q_DELETE_DOM_GROUP * q_u, + prs_struct *ps, int depth) { - if (r_u == NULL) - return False; + if (q_u == NULL) + return False; - prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo"); - depth++; + prs_debug(ps, depth, desc, "samr_io_q_delete_dom_group"); + depth++; - if(!prs_align(ps)) - return False; + if(!prs_align(ps)) + return False; - if(!prs_uint32("ptr ", ps, depth, &r_u->ptr)) - return False; - - if (r_u->ptr != 0) { - if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value)) - return False; - if(!prs_align(ps)) - return False; - - if (r_u->switch_value != 0) { - switch (r_u->switch_value) { - case 1: - smb_io_unihdr("",&r_u->alias.info1.hdr_alias_name, ps, depth); - prs_uint32("switch_value_1", ps, depth, &r_u->alias.info1.switch_value_1); - smb_io_unihdr("",&r_u->alias.info1.hdr_alias_desc, ps, depth); - - smb_io_unistr2("", &r_u->alias.info1.uni_alias_name, - r_u->alias.info1.hdr_alias_name.buffer, ps, depth); - smb_io_unistr2("", &r_u->alias.info1.uni_alias_desc, - r_u->alias.info1.hdr_alias_desc.buffer, ps, depth); - break; - case 3: - if(!smb_io_unihdr ("", &r_u->alias.info3.hdr_acct_desc, ps, depth)) - return False; - if(!smb_io_unistr2("", &r_u->alias.info3.uni_acct_desc, - r_u->alias.info3.hdr_acct_desc.buffer, ps, depth)) - return False; - break; - default: - DEBUG(4,("samr_io_r_query_aliasinfo: unsupported switch level\n")); - break; - } - } - } + if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth)) + return False; + + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_delete_dom_group(char *desc, SAMR_R_DELETE_DOM_GROUP * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_delete_dom_group"); + depth++; - if(!prs_align(ps)) - return False; + if(!prs_align(ps)) + return False; - if(!prs_uint32("status", ps, depth, &r_u->status)) - return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; - return True; + return True; } /******************************************************************* - Reads or writes a SAMR_Q_LOOKUP_IDS structure. +inits a SAMR_Q_DEL_GROUPMEM structure. ********************************************************************/ -BOOL samr_io_q_lookup_ids(char *desc, SAMR_Q_LOOKUP_IDS *q_u, prs_struct *ps, int depth) +void init_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM * q_e, + POLICY_HND *pol, uint32 rid) { - fstring tmp; - int i; + DEBUG(5, ("init_samr_q_del_groupmem\n")); - if (q_u == NULL) + q_e->pol = *pol; + q_e->rid = rid; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_del_groupmem(char *desc, SAMR_Q_DEL_GROUPMEM * q_e, + prs_struct *ps, int depth) +{ + if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_lookup_ids"); + prs_debug(ps, depth, desc, "samr_io_q_del_groupmem"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &(q_u->pol), ps, depth)) + if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) return False; - if(!prs_align(ps)) + + if(!prs_uint32("rid", ps, depth, &q_e->rid)) return False; - if(!prs_uint32("num_sids1", ps, depth, &q_u->num_sids1)) + return True; +} + +/******************************************************************* +inits a SAMR_R_DEL_GROUPMEM structure. +********************************************************************/ + +void init_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM * r_u, POLICY_HND *pol, + uint32 status) +{ + DEBUG(5, ("init_samr_r_del_groupmem\n")); + + r_u->status = status; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_del_groupmem(char *desc, SAMR_R_DEL_GROUPMEM * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; - if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) + + prs_debug(ps, depth, desc, "samr_io_r_del_groupmem"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_uint32("num_sids2", ps, depth, &q_u->num_sids2)) + + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; - SMB_ASSERT_ARRAY(q_u->ptr_sid, q_u->num_sids2); + return True; +} - for (i = 0; i < q_u->num_sids2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i); - if(!prs_uint32(tmp, ps, depth, &q_u->ptr_sid[i])) - return False; - } +/******************************************************************* +inits a SAMR_Q_ADD_GROUPMEM structure. +********************************************************************/ - for (i = 0; i < q_u->num_sids2; i++) { - if (q_u->ptr_sid[i] != 0) { - slprintf(tmp, sizeof(tmp)-1, "sid[%02d]", i); - if(!smb_io_dom_sid2(tmp, &q_u->sid[i], ps, depth)) - return False; - } - } +void init_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM * q_e, + POLICY_HND *pol, uint32 rid) +{ + DEBUG(5, ("init_samr_q_add_groupmem\n")); + + q_e->pol = *pol; + q_e->rid = rid; + q_e->unknown = 0x0005; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_add_groupmem(char *desc, SAMR_Q_ADD_GROUPMEM * q_e, + prs_struct *ps, int depth) +{ + if (q_e == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_q_add_groupmem"); + depth++; if(!prs_align(ps)) return False; + if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) + return False; + + if(!prs_uint32("rid ", ps, depth, &q_e->rid)) + return False; + if(!prs_uint32("unknown", ps, depth, &q_e->unknown)) + return False; + return True; } /******************************************************************* - Inits a SAMR_R_LOOKUP_IDS structure. +inits a SAMR_R_ADD_GROUPMEM structure. ********************************************************************/ -void init_samr_r_lookup_ids(SAMR_R_LOOKUP_IDS *r_u, - uint32 num_rids, uint32 *rid, uint32 status) +void init_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM * r_u, POLICY_HND *pol, + uint32 status) { - int i; + DEBUG(5, ("init_samr_r_add_groupmem\n")); - DEBUG(5,("init_samr_r_lookup_ids\n")); + r_u->status = status; +} - if (status == 0x0) { - r_u->num_entries = num_rids; - r_u->ptr = 1; - r_u->num_entries2 = num_rids; +/******************************************************************* +reads or writes a structure. +********************************************************************/ - SMB_ASSERT_ARRAY(r_u->rid, num_rids); +BOOL samr_io_r_add_groupmem(char *desc, SAMR_R_ADD_GROUPMEM * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; - for (i = 0; i < num_rids; i++) { - r_u->rid[i] = rid[i]; - } - } else { - r_u->num_entries = 0; - r_u->ptr = 0; - r_u->num_entries2 = 0; - } + prs_debug(ps, depth, desc, "samr_io_r_add_groupmem"); + depth++; - r_u->status = status; + if(!prs_align(ps)) + return False; + + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; } /******************************************************************* - Reads or writes a structure. +inits a SAMR_Q_SET_GROUPINFO structure. ********************************************************************/ -BOOL samr_io_r_lookup_ids(char *desc, SAMR_R_LOOKUP_IDS *r_u, prs_struct *ps, int depth) +void init_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO * q_e, + POLICY_HND *pol, GROUP_INFO_CTR * ctr) { - fstring tmp; - int i; + DEBUG(5, ("init_samr_q_set_groupinfo\n")); - if (r_u == NULL) + q_e->pol = *pol; + q_e->ctr = ctr; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_set_groupinfo(char *desc, SAMR_Q_SET_GROUPINFO * q_e, + prs_struct *ps, int depth) +{ + if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_lookup_ids"); + prs_debug(ps, depth, desc, "samr_io_q_set_groupinfo"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries)) + if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) return False; - if(!prs_uint32("ptr ", ps, depth, &r_u->ptr)) + + if(!samr_group_info_ctr("ctr", q_e->ctr, ps, depth)) return False; - if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) + + return True; +} + +/******************************************************************* +inits a SAMR_R_SET_GROUPINFO structure. +********************************************************************/ + +void init_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO * r_u, uint32 status) +{ + DEBUG(5, ("init_samr_r_set_groupinfo\n")); + + r_u->status = status; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_set_groupinfo(char *desc, SAMR_R_SET_GROUPINFO * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; - if (r_u->num_entries != 0) { - SMB_ASSERT_ARRAY(r_u->rid, r_u->num_entries2); + prs_debug(ps, depth, desc, "samr_io_r_set_groupinfo"); + depth++; - for (i = 0; i < r_u->num_entries2; i++) { - slprintf(tmp, sizeof(tmp)-1, "rid[%02d]", i); - if(!prs_uint32(tmp, ps, depth, &r_u->rid[i])) - return False; - } - } + if(!prs_align(ps)) + return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -2244,145 +2436,214 @@ BOOL samr_io_r_lookup_ids(char *desc, SAMR_R_LOOKUP_IDS *r_u, prs_struct *ps, i } /******************************************************************* - Reads or writes a structure. +inits a SAMR_Q_QUERY_GROUPINFO structure. ********************************************************************/ -BOOL samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth) +void init_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO * q_e, + POLICY_HND *pol, uint16 switch_level) { - int i; + DEBUG(5, ("init_samr_q_query_groupinfo\n")); - if (q_u == NULL) - return False; + q_e->pol = *pol; - prs_debug(ps, depth, desc, "samr_io_q_lookup_names"); - depth++; + q_e->switch_level = switch_level; +} - prs_align(ps); +/******************************************************************* +reads or writes a structure. +********************************************************************/ - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) +BOOL samr_io_q_query_groupinfo(char *desc, SAMR_Q_QUERY_GROUPINFO * q_e, + prs_struct *ps, int depth) +{ + if (q_e == NULL) return False; + + prs_debug(ps, depth, desc, "samr_io_q_query_groupinfo"); + depth++; + if(!prs_align(ps)) return False; - if(!prs_uint32("num_names1", ps, depth, &q_u->num_names1)) + if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) return False; - if(!prs_uint32("flags ", ps, depth, &q_u->flags)) + + if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level)) return False; - if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) + + return True; +} + +/******************************************************************* +inits a SAMR_R_QUERY_GROUPINFO structure. +********************************************************************/ + +void init_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO * r_u, + GROUP_INFO_CTR * ctr, uint32 status) +{ + DEBUG(5, ("init_samr_r_query_groupinfo\n")); + + r_u->ptr = (status == 0x0 && ctr != NULL) ? 1 : 0; + r_u->ctr = ctr; + r_u->status = status; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_query_groupinfo(char *desc, SAMR_R_QUERY_GROUPINFO * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; - if(!prs_uint32("num_names2", ps, depth, &q_u->num_names2)) + + prs_debug(ps, depth, desc, "samr_io_r_query_groupinfo"); + depth++; + + if(!prs_align(ps)) return False; - SMB_ASSERT_ARRAY(q_u->hdr_name, q_u->num_names2); + if(!prs_uint32("ptr", ps, depth, &r_u->ptr)) + return False; - for (i = 0; i < q_u->num_names2; i++) { - if(!smb_io_unihdr ("", &q_u->hdr_name[i], ps, depth)) - return False; - } - for (i = 0; i < q_u->num_names2; i++) { - if(!smb_io_unistr2("", &q_u->uni_name[i], q_u->hdr_name[i].buffer, ps, depth)) + if (r_u->ptr != 0) { + if(!samr_group_info_ctr("ctr", r_u->ctr, ps, depth)) return False; } + if(!prs_align(ps)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + return True; } +/******************************************************************* +inits a SAMR_Q_QUERY_GROUPMEM structure. +********************************************************************/ + +void init_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM * q_c, POLICY_HND *hnd) +{ + DEBUG(5, ("init_samr_q_query_groupmem\n")); + + q_c->group_pol = *hnd; +} /******************************************************************* - Inits a SAMR_R_LOOKUP_NAMES structure. +reads or writes a structure. ********************************************************************/ -void init_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u, - uint32 num_rids, uint32 *rid, enum SID_NAME_USE *type, uint32 status) + +BOOL samr_io_q_query_groupmem(char *desc, SAMR_Q_QUERY_GROUPMEM * q_u, + prs_struct *ps, int depth) { - int i; + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_q_query_groupmem"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth)) + return False; - DEBUG(5,("init_samr_r_lookup_names\n")); + return True; +} + +/******************************************************************* +inits a SAMR_R_QUERY_GROUPMEM structure. +********************************************************************/ + +void init_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM * r_u, + uint32 num_entries, uint32 *rid, + uint32 *attr, uint32 status) +{ + DEBUG(5, ("init_samr_r_query_groupmem\n")); if (status == 0x0) { - r_u->num_types1 = num_rids; - r_u->ptr_types = 1; - r_u->num_types2 = num_rids; + r_u->ptr = 1; + r_u->num_entries = num_entries; - r_u->num_rids1 = num_rids; - r_u->ptr_rids = 1; - r_u->num_rids2 = num_rids; + r_u->ptr_attrs = attr != NULL ? 1 : 0; + r_u->ptr_rids = rid != NULL ? 1 : 0; - SMB_ASSERT_ARRAY(r_u->rid, num_rids); + r_u->num_rids = num_entries; + r_u->rid = rid; - for (i = 0; i < num_rids; i++) { - r_u->rid [i] = rid [i]; - r_u->type[i] = type[i]; - } + r_u->num_attrs = num_entries; + r_u->attr = attr; } else { - r_u->num_types1 = 0; - r_u->ptr_types = 0; - r_u->num_types2 = 0; - - r_u->num_rids1 = 0; - r_u->ptr_rids = 0; - r_u->num_rids2 = 0; + r_u->ptr = 0; + r_u->num_entries = 0; } r_u->status = status; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_query_groupmem(char *desc, SAMR_R_QUERY_GROUPMEM * r_u, + prs_struct *ps, int depth) { - int i; - fstring tmp; + uint32 i; if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_lookup_names"); + if (UNMARSHALLING(ps)) + ZERO_STRUCTP(r_u); + + prs_debug(ps, depth, desc, "samr_io_r_query_groupmem"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("num_rids1", ps, depth, &r_u->num_rids1)) + if(!prs_uint32("ptr", ps, depth, &r_u->ptr)) return False; - if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids )) + if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries)) return False; - if (r_u->ptr_rids != 0) { - if(!prs_uint32("num_rids2", ps, depth, &r_u->num_rids2)) + if (r_u->ptr != 0) { + if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids)) return False; - - if (r_u->num_rids2 != r_u->num_rids1) { - /* RPC fault */ + if(!prs_uint32("ptr_attrs", ps, depth, &r_u->ptr_attrs)) return False; - } - for (i = 0; i < r_u->num_rids2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i); - if(!prs_uint32(tmp, ps, depth, &r_u->rid[i])) + if (r_u->ptr_rids != 0) { + if(!prs_uint32("num_rids", ps, depth, &r_u->num_rids)) return False; - } - } - - if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1)) - return False; - if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types)) - return False; - - if (r_u->ptr_types != 0) { - if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2)) - return False; + if (UNMARSHALLING(ps) && r_u->num_rids != 0) { + r_u->rid = (uint32 *)prs_alloc_mem(ps,sizeof(r_u->rid[0])*r_u->num_rids); + if (r_u->rid == NULL) + return False; + } - if (r_u->num_types2 != r_u->num_types1) { - /* RPC fault */ - return False; + for (i = 0; i < r_u->num_rids; i++) { + if(!prs_uint32("", ps, depth, &r_u->rid[i])) + return False; + } } - for (i = 0; i < r_u->num_types2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i); - if(!prs_uint32(tmp, ps, depth, &r_u->type[i])) + if (r_u->ptr_attrs != 0) { + if(!prs_uint32("num_attrs", ps, depth, &r_u->num_attrs)) return False; + + if (UNMARSHALLING(ps) && r_u->num_attrs != 0) { + r_u->attr = (uint32 *)prs_alloc_mem(ps,sizeof(r_u->attr[0])*r_u->num_attrs); + if (r_u->attr == NULL) + return False; + } + + for (i = 0; i < r_u->num_attrs; i++) { + if(!prs_uint32("", ps, depth, &r_u->attr[i])) + return False; + } } } @@ -2393,18 +2654,28 @@ BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *p } /******************************************************************* - Reads or writes a structure. +inits a SAMR_Q_QUERY_USERGROUPS structure. ********************************************************************/ -BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps, int depth) +void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u, + POLICY_HND *hnd) { - int i; - fstring tmp; + DEBUG(5, ("init_samr_q_query_usergroups\n")); + + q_u->pol = *hnd; +} +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS * q_u, + prs_struct *ps, int depth) +{ if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_lookup_rids"); + prs_debug(ps, depth, desc, "samr_io_q_query_usergroups"); depth++; if(!prs_align(ps)) @@ -2412,206 +2683,381 @@ BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps, if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) return False; - if(!prs_align(ps)) - return False; - if(!prs_uint32("num_gids1", ps, depth, &q_u->num_gids1)) - return False; - if(!prs_uint32("rid ", ps, depth, &q_u->rid)) + return True; +} + +/******************************************************************* +inits a SAMR_R_QUERY_USERGROUPS structure. +********************************************************************/ + +void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS * r_u, + uint32 num_gids, DOM_GID * gid, + uint32 status) +{ + DEBUG(5, ("init_samr_r_query_usergroups\n")); + + if (status == 0) { + r_u->ptr_0 = 1; + r_u->num_entries = num_gids; + r_u->ptr_1 = (num_gids != 0) ? 1 : 0; + r_u->num_entries2 = num_gids; + + r_u->gid = gid; + } else { + r_u->ptr_0 = 0; + r_u->num_entries = 0; + r_u->ptr_1 = 0; + r_u->gid = NULL; + } + + r_u->status = status; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_gids(char *desc, uint32 *num_gids, DOM_GID ** gid, + prs_struct *ps, int depth) +{ + uint32 i; + if (gid == NULL) return False; - if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) + + prs_debug(ps, depth, desc, "samr_io_gids"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_uint32("num_gids2", ps, depth, &q_u->num_gids2)) + + if(!prs_uint32("num_gids", ps, depth, num_gids)) return False; - SMB_ASSERT_ARRAY(q_u->gid, q_u->num_gids2); + if ((*num_gids) != 0) { + if (UNMARSHALLING(ps)) { + (*gid) = (DOM_GID *)prs_alloc_mem(ps,sizeof(DOM_GID)*(*num_gids)); + } - for (i = 0; i < q_u->num_gids2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "gid[%02d] ", i); - if(!prs_uint32(tmp, ps, depth, &q_u->gid[i])) + if ((*gid) == NULL) { return False; + } + + for (i = 0; i < (*num_gids); i++) { + if(!smb_io_gid("gids", &(*gid)[i], ps, depth)) + return False; + } } return True; } /******************************************************************* - Inits a SAMR_R_UNKNOWN_12 structure. +reads or writes a structure. ********************************************************************/ -void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u, - uint32 num_aliases, fstring *als_name, uint32 *num_als_usrs, - uint32 status) +BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS * r_u, + prs_struct *ps, int depth) { - int i; + if (r_u == NULL) + return False; - DEBUG(5,("init_samr_r_lookup_rids\n")); + prs_debug(ps, depth, desc, "samr_io_r_query_usergroups"); + depth++; - if (status == 0x0) { - r_u->num_aliases1 = num_aliases; - r_u->ptr_aliases = 1; - r_u->num_aliases2 = num_aliases; + if(!prs_align(ps)) + return False; - r_u->num_als_usrs1 = num_aliases; - r_u->ptr_als_usrs = 1; - r_u->num_als_usrs2 = num_aliases; + if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0)) + return False; - SMB_ASSERT_ARRAY(r_u->hdr_als_name, num_aliases); + if (r_u->ptr_0 != 0) { + if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries)) + return False; + if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1)) + return False; - for (i = 0; i < num_aliases; i++) { - int als_len = als_name[i] != NULL ? strlen(als_name[i])+1 : 0; - init_uni_hdr(&r_u->hdr_als_name[i], als_len); - init_unistr2(&r_u->uni_als_name[i], als_name[i], als_len); - r_u->num_als_usrs[i] = num_als_usrs[i]; + if (r_u->num_entries != 0 && r_u->ptr_1 != 0) { + if(!samr_io_gids("gids", &r_u->num_entries2, &r_u->gid, ps, depth)) + return False; } - } else { - r_u->num_aliases1 = num_aliases; - r_u->ptr_aliases = 0; - r_u->num_aliases2 = num_aliases; - - r_u->num_als_usrs1 = num_aliases; - r_u->ptr_als_usrs = 0; - r_u->num_als_usrs2 = num_aliases; } - r_u->status = status; + if(!prs_align(ps)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; } /******************************************************************* - Reads or writes a structure. +inits a SAMR_Q_ENUM_DOMAINS structure. ********************************************************************/ -BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS *r_u, prs_struct *ps, int depth) +void init_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS * q_e, + POLICY_HND *pol, + uint32 start_idx, uint32 size) { - int i; - fstring tmp; + DEBUG(5, ("init_samr_q_enum_domains\n")); - if (r_u == NULL) + q_e->pol = *pol; + + q_e->start_idx = start_idx; + q_e->max_size = size; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS * q_e, + prs_struct *ps, int depth) +{ + if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_lookup_rids"); + prs_debug(ps, depth, desc, "samr_io_q_enum_domains"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("num_aliases1", ps, depth, &r_u->num_aliases1)) + if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) return False; - if(!prs_uint32("ptr_aliases ", ps, depth, &r_u->ptr_aliases )) + + if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx)) return False; - if(!prs_uint32("num_aliases2", ps, depth, &r_u->num_aliases2)) + if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) return False; - if (r_u->ptr_aliases != 0 && r_u->num_aliases1 != 0) { - SMB_ASSERT_ARRAY(r_u->hdr_als_name, r_u->num_aliases2); + return True; +} - for (i = 0; i < r_u->num_aliases2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "als_hdr[%02d] ", i); - if(!smb_io_unihdr ("", &r_u->hdr_als_name[i], ps, depth)) - return False; - } - for (i = 0; i < r_u->num_aliases2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "als_str[%02d] ", i); - if(!smb_io_unistr2("", &r_u->uni_als_name[i], r_u->hdr_als_name[i].buffer, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - } +/******************************************************************* +inits a SAMR_R_ENUM_DOMAINS structure. +********************************************************************/ + +void init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u, + uint32 next_idx, uint32 num_sam_entries) +{ + DEBUG(5, ("init_samr_r_enum_domains\n")); + + r_u->next_idx = next_idx; + + if (num_sam_entries != 0) { + r_u->ptr_entries1 = 1; + r_u->ptr_entries2 = 1; + r_u->num_entries2 = num_sam_entries; + r_u->num_entries3 = num_sam_entries; + + r_u->num_entries4 = num_sam_entries; + } else { + r_u->ptr_entries1 = 0; + r_u->num_entries2 = num_sam_entries; + r_u->ptr_entries2 = 1; } +} - if(!prs_align(ps)) +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u, + prs_struct *ps, int depth) +{ + uint32 i; + + if (r_u == NULL) return False; - if(!prs_uint32("num_als_usrs1", ps, depth, &r_u->num_als_usrs1)) + prs_debug(ps, depth, desc, "samr_io_r_enum_domains"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_als_usrs ", ps, depth, &r_u->ptr_als_usrs)) + + if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx)) return False; - if(!prs_uint32("num_als_usrs2", ps, depth, &r_u->num_als_usrs2)) + if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1)) return False; - if (r_u->ptr_als_usrs != 0 && r_u->num_als_usrs1 != 0) { - SMB_ASSERT_ARRAY(r_u->num_als_usrs, r_u->num_als_usrs2); + if (r_u->ptr_entries1 != 0) { + if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) + return False; + if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2)) + return False; + if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3)) + return False; + + if (UNMARSHALLING(ps)) { + r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2); + r_u->uni_dom_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2); + } + + if ((r_u->sam == NULL || r_u->uni_dom_name == NULL) && r_u->num_entries2 != 0) { + DEBUG(0, ("NULL pointers in SAMR_R_ENUM_DOMAINS\n")); + r_u->num_entries4 = 0; + r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED; + return False; + } + + for (i = 0; i < r_u->num_entries2; i++) { + fstring tmp; + slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i); + if(!sam_io_sam_entry(tmp, &r_u->sam[i], ps, depth)) + return False; + } - for (i = 0; i < r_u->num_als_usrs2; i++) { - slprintf(tmp, sizeof(tmp) - 1, "als_usrs[%02d] ", i); - if(!prs_uint32(tmp, ps, depth, &r_u->num_als_usrs[i])) + for (i = 0; i < r_u->num_entries2; i++) { + fstring tmp; + slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i); + if(!smb_io_unistr2(tmp, &r_u->uni_dom_name[i], + r_u->sam[i].hdr_name.buffer, ps, + depth)) return False; } + } + if(!prs_align(ps)) + return False; + if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) + return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; } - /******************************************************************* - Inits a SAMR_Q_OPEN_USER struct. +inits a SAMR_Q_ENUM_DOM_GROUPS structure. ********************************************************************/ -void init_samr_q_open_user(SAMR_Q_OPEN_USER *q_u, POLICY_HND *pol, - uint32 access_mask, uint32 rid) +void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS * q_e, + POLICY_HND *pol, + uint32 start_idx, uint32 size) { - DEBUG(5,("init_samr_q_open_user\n")); + DEBUG(5, ("init_samr_q_enum_dom_groups\n")); - q_u->domain_pol = *pol; - q_u->access_mask = access_mask; - q_u->user_rid = rid; + q_e->pol = *pol; + + q_e->start_idx = start_idx; + q_e->max_size = size; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER *q_u, - prs_struct *ps, int depth) +BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS * q_e, + prs_struct *ps, int depth) { - if (q_u == NULL) + if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_open_user"); + prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth)) - return False; - if(!prs_align(ps)) + if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth)) return False; - if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) - return False; - if(!prs_uint32("user_rid ", ps, depth, &q_u->user_rid)) + if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx)) return False; - - if(!prs_align(ps)) + if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) return False; return True; } /******************************************************************* - Reads or writes a structure. +inits a SAMR_R_ENUM_DOM_GROUPS structure. +********************************************************************/ + +void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS * r_u, + uint32 next_idx, uint32 num_sam_entries) +{ + DEBUG(5, ("init_samr_r_enum_dom_groups\n")); + + r_u->next_idx = next_idx; + + if (num_sam_entries != 0) { + r_u->ptr_entries1 = 1; + r_u->ptr_entries2 = 1; + r_u->num_entries2 = num_sam_entries; + r_u->num_entries3 = num_sam_entries; + + r_u->num_entries4 = num_sam_entries; + } else { + r_u->ptr_entries1 = 0; + r_u->num_entries2 = num_sam_entries; + r_u->ptr_entries2 = 1; + } +} + +/******************************************************************* +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS * r_u, + prs_struct *ps, int depth) { + uint32 i; + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_open_user"); + prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth)) + if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx)) return False; - if(!prs_align(ps)) + if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1)) return False; + if (r_u->ptr_entries1 != 0) { + if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) + return False; + if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2)) + return False; + if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3)) + return False; + + if (UNMARSHALLING(ps)) { + r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2); + r_u->uni_grp_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2); + } + + if ((r_u->sam == NULL || r_u->uni_grp_name == NULL) && r_u->num_entries2 != 0) { + DEBUG(0, + ("NULL pointers in SAMR_R_ENUM_DOM_GROUPS\n")); + r_u->num_entries4 = 0; + r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED; + return False; + } + + for (i = 0; i < r_u->num_entries2; i++) { + if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth)) + return False; + } + + for (i = 0; i < r_u->num_entries2; i++) { + if(!smb_io_unistr2("", &r_u->uni_grp_name[i], + r_u->sam[i].hdr_name.buffer, ps, depth)) + return False; + } + } + + if(!prs_align(ps)) + return False; + if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) + return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -2619,102 +3065,134 @@ BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int } /******************************************************************* - Inits a SAMR_Q_QUERY_USERGROUPS structure. +inits a SAMR_Q_ENUM_DOM_ALIASES structure. ********************************************************************/ -void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u, - POLICY_HND *hnd) +void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES * q_e, + POLICY_HND *pol, uint32 start_idx, + uint32 size) { - DEBUG(5,("init_samr_q_query_usergroups\n")); + DEBUG(5, ("init_samr_q_enum_dom_aliases\n")); + + q_e->pol = *pol; - memcpy(&q_u->pol, hnd, sizeof(q_u->pol)); + q_e->start_idx = start_idx; + q_e->max_size = size; } + /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES * q_e, + prs_struct *ps, int depth) { - if (q_u == NULL) + if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_query_usergroups"); + prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) + if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) return False; - if(!prs_align(ps)) + + if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx)) + return False; + if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) return False; return True; } /******************************************************************* - Inits a SAMR_R_QUERY_USERGROUPS structure. +inits a SAMR_R_ENUM_DOM_ALIASES structure. ********************************************************************/ -void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u, - uint32 num_gids, DOM_GID *gid, uint32 status) +void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, uint32 next_idx, uint32 num_sam_entries) { - DEBUG(5,("init_samr_r_query_usergroups\n")); + DEBUG(5, ("init_samr_r_enum_dom_aliases\n")); - if (status == 0x0) { - r_u->ptr_0 = 1; - r_u->num_entries = num_gids; - r_u->ptr_1 = 1; - r_u->num_entries2 = num_gids; + r_u->next_idx = next_idx; - r_u->gid = gid; + if (num_sam_entries != 0) { + r_u->ptr_entries1 = 1; + r_u->ptr_entries2 = 1; + r_u->num_entries2 = num_sam_entries; + r_u->num_entries3 = num_sam_entries; + + r_u->num_entries4 = num_sam_entries; } else { - r_u->ptr_0 = 0; - r_u->num_entries = 0; - r_u->ptr_1 = 0; + r_u->ptr_entries1 = 0; + r_u->num_entries2 = num_sam_entries; + r_u->ptr_entries2 = 1; } - - r_u->status = status; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES * r_u, + prs_struct *ps, int depth) { - int i; + uint32 i; if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_query_usergroups"); + prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0)) + if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx)) + return False; + if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1)) return False; - if (r_u->ptr_0 != 0) { - if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries)) + if (r_u->ptr_entries1 != 0) { + if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) return False; - if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1)) + if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2)) + return False; + if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3)) return False; - if (r_u->num_entries != 0) { - if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) + if (UNMARSHALLING(ps) && (r_u->num_entries2 > 0)) { + r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2); + r_u->uni_grp_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2); + } + + if (r_u->num_entries2 != 0 && + (r_u->sam == NULL || r_u->uni_grp_name == NULL)) { + DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_ALIASES\n")); + r_u->num_entries4 = 0; + r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED; + return False; + } + + for (i = 0; i < r_u->num_entries2; i++) { + if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth)) return False; + } - for (i = 0; i < r_u->num_entries2; i++) { - if(!smb_io_gid("", &r_u->gid[i], ps, depth)) - return False; - } + for (i = 0; i < r_u->num_entries2; i++) { + if(!smb_io_unistr2("", &r_u->uni_grp_name[i], + r_u->sam[i].hdr_name.buffer, ps, + depth)) + return False; } } + if(!prs_align(ps)) + return False; + if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) + return False; if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -2722,464 +3200,531 @@ BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_s } /******************************************************************* - Inits a SAMR_Q_QUERY_USERINFO structure. +inits a ALIAS_INFO3 structure. ********************************************************************/ -void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u, - POLICY_HND *hnd, uint16 switch_value) +void init_samr_alias_info3(ALIAS_INFO3 * al3, char *acct_desc) { - DEBUG(5,("init_samr_q_query_userinfo\n")); + int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0; - memcpy(&q_u->pol, hnd, sizeof(q_u->pol)); - q_u->switch_value = switch_value; + DEBUG(5, ("init_samr_alias_info3\n")); + + init_uni_hdr(&al3->hdr_acct_desc, acct_len); + init_unistr2(&al3->uni_acct_desc, acct_desc, acct_len); } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth) +BOOL samr_io_alias_info3(char *desc, ALIAS_INFO3 * al3, + prs_struct *ps, int depth) { - if (q_u == NULL) + if (al3 == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_query_userinfo"); + prs_debug(ps, depth, desc, "samr_io_alias_info3"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) + if(!smb_io_unihdr("hdr_acct_desc", &al3->hdr_acct_desc, ps, depth)) return False; - if(!prs_align(ps)) - return False; - - if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) /* 0x0015 or 0x0011 */ + if(!smb_io_unistr2("uni_acct_desc", &al3->uni_acct_desc, + al3->hdr_acct_desc.buffer, ps, depth)) return False; return True; } /******************************************************************* - Reads or writes a LOGON_HRS structure. +reads or writes a structure. ********************************************************************/ -static BOOL sam_io_logon_hrs(char *desc, LOGON_HRS *hrs, prs_struct *ps, int depth) +BOOL samr_alias_info_ctr(char *desc, ALIAS_INFO_CTR * ctr, + prs_struct *ps, int depth) { - if (hrs == NULL) + if (ctr == NULL) return False; - prs_debug(ps, depth, desc, "sam_io_logon_hrs"); + prs_debug(ps, depth, desc, "samr_alias_info_ctr"); depth++; - if(!prs_align(ps)) + if(!prs_uint16("switch_value1", ps, depth, &ctr->switch_value1)) return False; - - if(!prs_uint32 ("len ", ps, depth, &hrs->len)) + if(!prs_uint16("switch_value2", ps, depth, &ctr->switch_value2)) return False; - if (hrs->len > 64) { - DEBUG(5,("sam_io_logon_hrs: truncating length\n")); - hrs->len = 64; + switch (ctr->switch_value1) { + case 3: + if(!samr_io_alias_info3("alias_info3", &ctr->alias.info3, ps, depth)) + return False; + break; + default: + DEBUG(0,("samr_alias_info_ctr: unsupported switch level\n")); + break; } - if(!prs_uint8s (False, "hours", ps, depth, hrs->hours, hrs->len)) - return False; - return True; } /******************************************************************* - Inits a SAM_USER_INFO_10 structure. +inits a SAMR_Q_QUERY_ALIASINFO structure. ********************************************************************/ -void init_sam_user_info10(SAM_USER_INFO_10 *usr, - uint32 acb_info) +void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO * q_e, + POLICY_HND *pol, uint16 switch_level) { - DEBUG(5,("init_sam_user_info10\n")); + DEBUG(5, ("init_samr_q_query_aliasinfo\n")); - usr->acb_info = acb_info; + q_e->pol = *pol; + q_e->switch_level = switch_level; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL sam_io_user_info10(char *desc, SAM_USER_INFO_10 *usr, prs_struct *ps, int depth) +BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO * q_e, + prs_struct *ps, int depth) { - if (usr == NULL) + if (q_e == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_user_info10"); + prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("acb_info", ps, depth, &usr->acb_info)) + if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth)) + return False; + + if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level)) return False; return True; } /******************************************************************* - Inits a SAM_USER_INFO_11 structure. +inits a SAMR_R_QUERY_ALIASINFO structure. ********************************************************************/ -void init_sam_user_info11(SAM_USER_INFO_11 *usr, - NTTIME *expiry, - char *mach_acct, - uint32 rid_user, - uint32 rid_group, - uint16 acct_ctrl) - +void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO * r_u, + ALIAS_INFO_CTR * ctr, uint32 status) { - int len_mach_acct; + DEBUG(5, ("init_samr_r_query_aliasinfo\n")); - DEBUG(5,("init_sam_user_info11\n")); + r_u->ptr = (status == 0x0 && ctr != NULL) ? 1 : 0; + r_u->ctr = *ctr; + r_u->status = status; +} - len_mach_acct = strlen(mach_acct)+1; +/******************************************************************* +reads or writes a structure. +********************************************************************/ - memcpy(&usr->expiry,expiry, sizeof(usr->expiry)); /* expiry time or something? */ - memset((char *)usr->padding_1, '\0', sizeof(usr->padding_1)); /* 0 - padding 24 bytes */ +BOOL samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; - init_uni_hdr(&usr->hdr_mach_acct, len_mach_acct); /* unicode header for machine account */ - usr->padding_2 = 0; /* 0 - padding 4 bytes */ + prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo"); + depth++; - usr->ptr_1 = 1; /* pointer */ - memset((char *)usr->padding_3, '\0', sizeof(usr->padding_3)); /* 0 - padding 32 bytes */ - usr->padding_4 = 0; /* 0 - padding 4 bytes */ + if(!prs_align(ps)) + return False; - usr->ptr_2 = 1; /* pointer */ - usr->padding_5 = 0; /* 0 - padding 4 bytes */ + if(!prs_uint32("ptr", ps, depth, &r_u->ptr)) + return False; - usr->ptr_3 = 1; /* pointer */ - memset((char *)usr->padding_6, '\0', sizeof(usr->padding_6)); /* 0 - padding 32 bytes */ + if (r_u->ptr != 0) { + if(!samr_alias_info_ctr("ctr", &r_u->ctr, ps, depth)) + return False; + } - usr->rid_user = rid_user; - usr->rid_group = rid_group; + if(!prs_align(ps)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; - usr->acct_ctrl = acct_ctrl; - usr->unknown_3 = 0x0000; + return True; +} - usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */ - usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */ +/******************************************************************* +inits a SAMR_Q_SET_ALIASINFO structure. +********************************************************************/ - memset((char *)usr->padding_7, '\0', sizeof(usr->padding_7)); /* 0 - padding 16 bytes */ - usr->padding_8 = 0; /* 0 - padding 4 bytes */ - - init_unistr2(&usr->uni_mach_acct, mach_acct, len_mach_acct); /* unicode string for machine account */ +void init_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO * q_u, + POLICY_HND *hnd, ALIAS_INFO_CTR * ctr) +{ + DEBUG(5, ("init_samr_q_set_aliasinfo\n")); - memset((char *)usr->padding_9, '\0', sizeof(usr->padding_9)); /* 0 - padding 48 bytes */ + q_u->alias_pol = *hnd; + q_u->ctr = *ctr; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int depth) +BOOL samr_io_q_set_aliasinfo(char *desc, SAMR_Q_SET_ALIASINFO * q_u, + prs_struct *ps, int depth) { - if (usr == NULL) + if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_unknown_24"); + prs_debug(ps, depth, desc, "samr_io_q_set_aliasinfo"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint8s (False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0))) + if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth)) return False; - - if(!smb_io_time("time", &(usr->expiry), ps, depth)) + if(!samr_alias_info_ctr("ctr", &q_u->ctr, ps, depth)) return False; - if(!prs_uint8s (False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1))) - return False; + return True; +} - if(!smb_io_unihdr ("unihdr", &usr->hdr_mach_acct, ps, depth)) - return False; - if(!prs_uint32( "padding_2", ps, depth, &usr->padding_2)) - return False; +/******************************************************************* +reads or writes a structure. +********************************************************************/ - if(!prs_uint32( "ptr_1 ", ps, depth, &usr->ptr_1)) - return False; - if(!prs_uint8s (False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3))) - return False; - if(!prs_uint32( "padding_4", ps, depth, &usr->padding_4)) +BOOL samr_io_r_set_aliasinfo(char *desc, SAMR_R_SET_ALIASINFO * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; - if(!prs_uint32( "ptr_2 ", ps, depth, &usr->ptr_2)) - return False; - if(!prs_uint32( "padding_5", ps, depth, &usr->padding_5)) - return False; + prs_debug(ps, depth, desc, "samr_io_r_set_aliasinfo"); + depth++; - if(!prs_uint32( "ptr_3 ", ps, depth, &usr->ptr_3)) + if(!prs_align(ps)) return False; - if(!prs_uint8s(False, "padding_6", ps, depth, usr->padding_6, sizeof(usr->padding_6))) + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; - if(!prs_uint32( "rid_user ", ps, depth, &usr->rid_user)) - return False; - if(!prs_uint32( "rid_group", ps, depth, &usr->rid_group)) - return False; - if(!prs_uint16( "acct_ctrl", ps, depth, &usr->acct_ctrl)) - return False; - if(!prs_uint16( "unknown_3", ps, depth, &usr->unknown_3)) - return False; - if(!prs_uint16( "unknown_4", ps, depth, &usr->unknown_4)) - return False; - if(!prs_uint16( "unknown_5", ps, depth, &usr->unknown_5)) + return True; +} + +/******************************************************************* +inits a SAMR_Q_QUERY_USERALIASES structure. +********************************************************************/ + +void init_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES * q_u, + POLICY_HND *hnd, + uint32 num_sids, + uint32 *ptr_sid, DOM_SID2 * sid) +{ + DEBUG(5, ("init_samr_q_query_useraliases\n")); + + q_u->pol = *hnd; + + q_u->num_sids1 = num_sids; + q_u->ptr = 1; + q_u->num_sids2 = num_sids; + + q_u->ptr_sid = ptr_sid; + q_u->sid = sid; +} + +/******************************************************************* +reads or writes a SAMR_Q_QUERY_USERALIASES structure. +********************************************************************/ + +BOOL samr_io_q_query_useraliases(char *desc, SAMR_Q_QUERY_USERALIASES * q_u, + prs_struct *ps, int depth) +{ + fstring tmp; + uint32 i; + + if (q_u == NULL) return False; - if(!prs_uint8s (False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7))) + prs_debug(ps, depth, desc, "samr_io_q_query_useraliases"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_uint32( "padding_8", ps, depth, &usr->padding_8)) + + if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) return False; - - if(!smb_io_unistr2("unistr2", &usr->uni_mach_acct, True, ps, depth)) + + if(!prs_uint32("num_sids1", ps, depth, &q_u->num_sids1)) return False; - if(!prs_align(ps)) + if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) return False; - if(!prs_uint8s(False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9))) + if (q_u->ptr==0) + return True; + + if(!prs_uint32("num_sids2", ps, depth, &q_u->num_sids2)) return False; - return True; -} + if (UNMARSHALLING(ps) && (q_u->num_sids2 != 0)) { + q_u->ptr_sid = (uint32 *)prs_alloc_mem(ps,sizeof(q_u->ptr_sid[0])*q_u->num_sids2); + if (q_u->ptr_sid == NULL) + return False; -/************************************************************************* - init_sam_user_info21 + q_u->sid = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(q_u->sid[0]) * q_u->num_sids2); + if (q_u->sid == NULL) + return False; + } - unknown_3 = 0x00ff ffff - unknown_5 = 0x0002 0000 - unknown_6 = 0x0000 04ec - *************************************************************************/ + for (i = 0; i < q_u->num_sids2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i); + if(!prs_uint32(tmp, ps, depth, &q_u->ptr_sid[i])) + return False; + } -void init_sam_user_info21(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw) -{ - NTTIME logon_time, logoff_time, kickoff_time, - pass_last_set_time, pass_can_change_time, - pass_must_change_time; + for (i = 0; i < q_u->num_sids2; i++) { + if (q_u->ptr_sid[i] != 0) { + slprintf(tmp, sizeof(tmp) - 1, "sid[%02d]", i); + if(!smb_io_dom_sid2(tmp, &q_u->sid[i], ps, depth)) + return False; + } + } - int len_user_name, len_full_name, len_home_dir, - len_dir_drive, len_logon_script, len_profile_path, - len_description, len_workstations, len_unknown_str, - len_munged_dial; - - char* user_name = pdb_get_username(pw); - char* full_name = pdb_get_fullname(pw); - char* home_dir = pdb_get_homedir(pw); - char* dir_drive = pdb_get_dirdrive(pw); - char* logon_script = pdb_get_logon_script(pw); - char* profile_path = pdb_get_profile_path(pw); - char* description = pdb_get_acct_desc(pw); - char* workstations = pdb_get_workstations(pw); - char* munged_dial = pdb_get_munged_dial(pw); + return True; +} - len_user_name = user_name != NULL ? strlen(user_name )+1 : 0; - len_full_name = full_name != NULL ? strlen(full_name )+1 : 0; - len_home_dir = home_dir != NULL ? strlen(home_dir )+1 : 0; - len_dir_drive = dir_drive != NULL ? strlen(dir_drive )+1 : 0; - len_logon_script = logon_script != NULL ? strlen(logon_script)+1 : 0; - len_profile_path = profile_path != NULL ? strlen(profile_path)+1 : 0; - len_description = description != NULL ? strlen(description )+1 : 0; - len_workstations = workstations != NULL ? strlen(workstations)+1 : 0; - len_unknown_str = 0; - len_munged_dial = munged_dial != NULL ? strlen(munged_dial )+1 : 0; +/******************************************************************* +inits a SAMR_R_QUERY_USERALIASES structure. +********************************************************************/ +void init_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES * r_u, + uint32 num_rids, uint32 *rid, + uint32 status) +{ + DEBUG(5, ("init_samr_r_query_useraliases\n")); - /* Create NTTIME structs */ - unix_to_nt_time (&logon_time, pdb_get_logon_time(pw)); - unix_to_nt_time (&logoff_time, pdb_get_logoff_time(pw)); - unix_to_nt_time (&kickoff_time, pdb_get_kickoff_time(pw)); - unix_to_nt_time (&pass_last_set_time, pdb_get_pass_last_set_time(pw)); - unix_to_nt_time (&pass_can_change_time, pdb_get_pass_can_change_time(pw)); - unix_to_nt_time (&pass_must_change_time,pdb_get_pass_must_change_time(pw)); - - /* structure assignment */ - usr->logon_time = logon_time; - usr->logoff_time = logoff_time; - usr->kickoff_time = kickoff_time; - usr->pass_last_set_time = pass_last_set_time; - usr->pass_can_change_time = pass_can_change_time; - usr->pass_must_change_time = pass_must_change_time; + if (status == 0x0) { + r_u->num_entries = num_rids; + r_u->ptr = 1; + r_u->num_entries2 = num_rids; - init_uni_hdr(&usr->hdr_user_name, len_user_name); - init_uni_hdr(&usr->hdr_full_name, len_full_name); - init_uni_hdr(&usr->hdr_home_dir, len_home_dir); - init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive); - init_uni_hdr(&usr->hdr_logon_script, len_logon_script); - init_uni_hdr(&usr->hdr_profile_path, len_profile_path); - init_uni_hdr(&usr->hdr_acct_desc, len_description); - init_uni_hdr(&usr->hdr_workstations, len_workstations); - init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str); - init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial); + r_u->rid = rid; + } else { + r_u->num_entries = 0; + r_u->ptr = 0; + r_u->num_entries2 = 0; + } - memset((char *)usr->nt_pwd, '\0', sizeof(usr->nt_pwd)); - memset((char *)usr->lm_pwd, '\0', sizeof(usr->lm_pwd)); + r_u->status = status; +} - usr->user_rid = pdb_get_user_rid(pw); - usr->group_rid = pdb_get_group_rid(pw); - usr->acb_info = pdb_get_acct_ctrl(pw); - usr->unknown_3 = pdb_get_unknown3(pw); +/******************************************************************* +reads or writes a structure. +********************************************************************/ - usr->logon_divs = pdb_get_logon_divs(pw); - usr->ptr_logon_hrs = pdb_get_hours(pw) ? 1 : 0; - usr->unknown_5 = pdb_get_unknown5(pw); /* 0x0002 0000 */ +BOOL samr_io_rids(char *desc, uint32 *num_rids, uint32 **rid, + prs_struct *ps, int depth) +{ + fstring tmp; + uint32 i; + if (rid == NULL) + return False; - memset((char *)usr->padding1, '\0', sizeof(usr->padding1)); + prs_debug(ps, depth, desc, "samr_io_rids"); + depth++; - init_unistr2(&usr->uni_user_name, user_name, len_user_name); - init_unistr2(&usr->uni_full_name, full_name, len_full_name); - init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir); - init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive); - init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script); - init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path); - init_unistr2(&usr->uni_acct_desc, description, len_description); - init_unistr2(&usr->uni_workstations, workstations, len_workstations); - init_unistr2(&usr->uni_unknown_str, NULL, len_unknown_str); - init_unistr2(&usr->uni_munged_dial, munged_dial, len_munged_dial); + if(!prs_align(ps)) + return False; - usr->unknown_6 = pdb_get_unknown6(pw); - usr->padding4 = 0; + if(!prs_uint32("num_rids", ps, depth, num_rids)) + return False; - if (pdb_get_hours(pw)) - { - usr->logon_hrs.len = pdb_get_hours_len(pw); - memcpy(&(usr->logon_hrs.hours), pdb_get_hours(pw), MAX_HOURS_LEN); + if ((*num_rids) != 0) { + if (UNMARSHALLING(ps)) { + /* reading */ + (*rid) = (uint32 *)prs_alloc_mem(ps,sizeof(uint32)*(*num_rids)); + } + if ((*rid) == NULL) + return False; + + for (i = 0; i < (*num_rids); i++) { + slprintf(tmp, sizeof(tmp) - 1, "rid[%02d]", i); + if(!prs_uint32(tmp, ps, depth, &((*rid)[i]))) + return False; + } } - else - memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs)); -} + return True; +} /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -static BOOL sam_io_user_info21(char *desc, SAM_USER_INFO_21 *usr, prs_struct *ps, int depth) +BOOL samr_io_r_query_useraliases(char *desc, SAMR_R_QUERY_USERALIASES * r_u, + prs_struct *ps, int depth) { - if (usr == NULL) + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "sam_io_user_info21"); + prs_debug(ps, depth, desc, "samr_io_r_query_useraliases"); depth++; if(!prs_align(ps)) return False; - - if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth)) - return False; - if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth)) - return False; - if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth)) - return False; - if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth)) - return False; - if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth)) - return False; - if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth)) - return False; - if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */ - return False; - if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */ - return False; - if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */ - return False; - if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */ - return False; - if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */ - return False; - if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */ - return False; - if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account description */ + if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries)) return False; - if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* workstations user can log on from */ + if(!prs_uint32("ptr ", ps, depth, &r_u->ptr)) return False; - if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */ + + if (r_u->ptr != 0) { + if(!samr_io_rids("rids", &r_u->num_entries2, &r_u->rid, ps, depth)) + return False; + } + + if(!prs_align(ps)) return False; - if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* workstations user can log on from */ + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; - if(!prs_uint8s (False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd))) + return True; +} + +/******************************************************************* +inits a SAMR_Q_OPEN_ALIAS structure. +********************************************************************/ + +void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS * q_u, POLICY_HND *pol, + uint32 unknown_0, uint32 rid) +{ + DEBUG(5, ("init_samr_q_open_alias\n")); + + q_u->dom_pol = *pol; + + /* example values: 0x0000 0008 */ + q_u->unknown_0 = unknown_0; + + q_u->rid_alias = rid; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) return False; - if(!prs_uint8s (False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd))) + + prs_debug(ps, depth, desc, "samr_io_q_open_alias"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */ + if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth)) return False; - if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */ + + if(!prs_uint32("unknown_0", ps, depth, &q_u->unknown_0)) return False; - if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info)) /* Group ID */ + if(!prs_uint32("rid_alias", ps, depth, &q_u->rid_alias)) return False; - if(!prs_uint32("unknown_3 ", ps, depth, &usr->unknown_3)) - return False; - if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */ + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; + + prs_debug(ps, depth, desc, "samr_io_r_open_alias"); + depth++; + if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs)) - return False; - if(!prs_uint32("unknown_5 ", ps, depth, &usr->unknown_5)) + + if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth)) return False; - if(!prs_uint8s (False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1))) + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; - /* here begins pointed-to data */ + return True; +} - if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */ - return False; - if(!prs_align_needed(ps, usr->hdr_full_name.buffer)) - return False; - if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */ - return False; - if(!prs_align_needed(ps, usr->hdr_home_dir.buffer)) - return False; - if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */ - return False; - if(!prs_align_needed(ps, usr->hdr_dir_drive.buffer)) - return False; - if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */ - return False; - if(!prs_align_needed(ps, usr->hdr_logon_script.buffer)) - return False; - if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */ - return False; - if(!prs_align_needed(ps, usr->hdr_profile_path.buffer)) - return False; - if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */ - return False; - if(!prs_align_needed(ps, usr->hdr_acct_desc.buffer)) - return False; - if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user description unicode string */ +/******************************************************************* +inits a SAMR_Q_LOOKUP_RIDS structure. +********************************************************************/ + +void init_samr_q_lookup_rids(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_RIDS * q_u, + POLICY_HND *pol, uint32 flags, + uint32 num_rids, uint32 *rid) +{ + DEBUG(5, ("init_samr_q_lookup_rids\n")); + + q_u->pol = *pol; + + q_u->num_rids1 = num_rids; + q_u->flags = flags; + q_u->ptr = 0; + q_u->num_rids2 = num_rids; + q_u->rid = (uint32 *)talloc_zero(ctx, num_rids * sizeof(q_u->rid[0])); + if (q_u->rid == NULL) { + q_u->num_rids1 = 0; + q_u->num_rids2 = 0; + } +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS * q_u, + prs_struct *ps, int depth) +{ + uint32 i; + fstring tmp; + + if (q_u == NULL) return False; - if(!prs_align_needed(ps, usr->hdr_workstations.buffer)) + + prs_debug(ps, depth, desc, "samr_io_q_lookup_rids"); + depth++; + + if (UNMARSHALLING(ps)) + ZERO_STRUCTP(q_u); + + if(!prs_align(ps)) return False; - if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */ + + if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) return False; - if(!prs_align_needed(ps, usr->hdr_unknown_str.buffer)) + + if(!prs_uint32("num_rids1", ps, depth, &q_u->num_rids1)) return False; - if(!smb_io_unistr2("uni_user_comment", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */ + if(!prs_uint32("flags ", ps, depth, &q_u->flags)) return False; - if(!prs_align_needed(ps, usr->hdr_munged_dial.buffer)) + if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) return False; - if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */ + if(!prs_uint32("num_rids2", ps, depth, &q_u->num_rids2)) return False; - if (usr->ptr_logon_hrs) { - - if(!prs_align(ps)) - return False; - if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6)) - return False; - if(!prs_uint32("padding4 ", ps, depth, &usr->padding4)) + if (UNMARSHALLING(ps) && (q_u->num_rids2 != 0)) { + q_u->rid = (uint32 *)prs_alloc_mem(ps, sizeof(q_u->rid[0])*q_u->num_rids2); + if (q_u->rid == NULL) return False; + } - if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth)) + for (i = 0; i < q_u->num_rids2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i); + if(!prs_uint32(tmp, ps, depth, &q_u->rid[i])) return False; } @@ -3187,107 +3732,118 @@ static BOOL sam_io_user_info21(char *desc, SAM_USER_INFO_21 *usr, prs_struct *ps } /******************************************************************* - Inits a SAMR_R_QUERY_USERINFO structure. +inits a SAMR_R_LOOKUP_RIDS structure. ********************************************************************/ -void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u, - uint16 switch_value, void *info, uint32 status) +void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS * r_u, + uint32 num_names, UNIHDR * hdr_name, + UNISTR2 *uni_name, uint32 *type) { - DEBUG(5,("init_samr_r_query_userinfo\n")); - - r_u->ptr = 0; - r_u->switch_value = 0; + DEBUG(5, ("init_samr_r_lookup_rids\n")); - if (status == 0) { - r_u->switch_value = switch_value; + r_u->hdr_name = NULL; + r_u->uni_name = NULL; + r_u->type = NULL; - switch (switch_value) { - case 0x10: - r_u->ptr = 1; - r_u->info.id10 = (SAM_USER_INFO_10*)info; - break; + if (num_names != 0) { + r_u->num_names1 = num_names; + r_u->ptr_names = 1; + r_u->num_names2 = num_names; - case 0x11: - r_u->ptr = 1; - r_u->info.id11 = (SAM_USER_INFO_11*)info; - break; + r_u->num_types1 = num_names; + r_u->ptr_types = 1; + r_u->num_types2 = num_names; - case 21: - r_u->ptr = 1; - r_u->info.id21 = (SAM_USER_INFO_21*)info; - break; + r_u->hdr_name = hdr_name; + r_u->uni_name = uni_name; + r_u->type = type; + } else { + r_u->num_names1 = num_names; + r_u->ptr_names = 0; + r_u->num_names2 = num_names; - default: - DEBUG(4,("init_samr_r_query_aliasinfo: unsupported switch level\n")); - break; - } + r_u->num_types1 = num_names; + r_u->ptr_types = 0; + r_u->num_types2 = num_names; } - - r_u->status = status; /* return status */ } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, - prs_struct *ps, int depth) +BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS * r_u, + prs_struct *ps, int depth) { + uint32 i; + fstring tmp; if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_query_userinfo"); + prs_debug(ps, depth, desc, "samr_io_r_lookup_rids"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr ", ps, depth, &r_u->ptr)) - return False; - if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value)) + if(!prs_uint32("num_names1", ps, depth, &r_u->num_names1)) return False; - if(!prs_align(ps)) + if(!prs_uint32("ptr_names ", ps, depth, &r_u->ptr_names)) return False; - if (r_u->ptr != 0 && r_u->switch_value != 0) { - switch (r_u->switch_value) { - case 0x10: - if (r_u->info.id10 != NULL) { - if(!sam_io_user_info10("", r_u->info.id10, ps, depth)) - return False; - } else { - DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n")); + if (r_u->ptr_names != 0) { + + if(!prs_uint32("num_names2", ps, depth, &r_u->num_names2)) + return False; + + + if (UNMARSHALLING(ps) && (r_u->num_names2 != 0)) { + r_u->hdr_name = (UNIHDR *) prs_alloc_mem(ps, r_u->num_names2 * sizeof(r_u->hdr_name[0])); + if (r_u->hdr_name == NULL) return False; - } - break; -/* - case 0x11: - if (r_u->info.id11 != NULL) { - if(!sam_io_user_info11("", r_u->info.id11, ps, depth)) - return False; - } else { - DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n")); + + r_u->uni_name = (UNISTR2 *)prs_alloc_mem(ps, r_u->num_names2 * sizeof(r_u->uni_name[0])); + if (r_u->uni_name == NULL) return False; - } - break; -*/ - case 21: - if (r_u->info.id21 != NULL) { - if(!sam_io_user_info21("", r_u->info.id21, ps, depth)) - return False; - } else { - DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n")); + } + + for (i = 0; i < r_u->num_names2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "hdr[%02d] ", i); + if(!smb_io_unihdr("", &r_u->hdr_name[i], ps, depth)) + return False; + } + for (i = 0; i < r_u->num_names2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "str[%02d] ", i); + if(!smb_io_unistr2("", &r_u->uni_name[i], r_u->hdr_name[i].buffer, ps, depth)) return False; - } - break; - default: - DEBUG(2,("samr_io_r_query_userinfo: unknown switch level\n")); - break; } - } + } + if(!prs_align(ps)) return False; + if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1)) + return False; + if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types)) + return False; + + if (r_u->ptr_types != 0) { + + if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2)) + return False; + + if (UNMARSHALLING(ps) && (r_u->num_types2 != 0)) { + r_u->type = (uint32 *)prs_alloc_mem(ps, r_u->num_types2 * sizeof(r_u->type[0])); + if (r_u->type == NULL) + return False; + } + + for (i = 0; i < r_u->num_types2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i); + if(!prs_uint32(tmp, ps, depth, &r_u->type[i])) + return False; + } + } if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -3296,51 +3852,49 @@ BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, } /******************************************************************* - Reads or writes a structure. +inits a SAMR_Q_OPEN_ALIAS structure. ********************************************************************/ -BOOL samr_io_q_create_user(char *desc, SAMR_Q_CREATE_USER *q_u, prs_struct *ps, int depth) +void init_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS * q_u, POLICY_HND *hnd) { - if (q_u == NULL) - return False; + DEBUG(5, ("init_samr_q_delete_alias\n")); - prs_debug(ps, depth, desc, "samr_io_q_create_user"); - depth++; + q_u->alias_pol = *hnd; +} - if(!prs_align(ps)) - return False; +/******************************************************************* +reads or writes a structure. +********************************************************************/ - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) - return False; - if(!prs_align(ps)) +BOOL samr_io_q_delete_alias(char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) return False; - if(!smb_io_unihdr ("", &q_u->hdr_mach_acct, ps, depth)) - return False; - if(!smb_io_unistr2("", &q_u->uni_mach_acct, q_u->hdr_mach_acct.buffer, ps, depth)) - return False; + prs_debug(ps, depth, desc, "samr_io_q_delete_alias"); + depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("acb_info", ps, depth, &q_u->acb_info)) - return False; - if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) + if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth)) return False; return True; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_delete_alias(char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_unknown_32"); + prs_debug(ps, depth, desc, "samr_io_r_delete_alias"); depth++; if(!prs_align(ps)) @@ -3348,12 +3902,6 @@ BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER *r_u, prs_struct *ps, if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth)) return False; - - if(!prs_uint32("unknown_0", ps, depth, &r_u->unknown_0)) - return False; - if(!prs_uint32("user_rid", ps, depth, &r_u->user_rid)) - return False; - if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -3361,70 +3909,77 @@ BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER *r_u, prs_struct *ps, } /******************************************************************* - Inits a SAMR_Q_CONNECT structure. +inits a SAMR_Q_CREATE_DOM_ALIAS structure. ********************************************************************/ -void init_samr_q_connect(SAMR_Q_CONNECT *q_u, char *srv_name, - uint32 access_mask) +void init_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS * q_u, + POLICY_HND *hnd, char *acct_desc) { - int len_srv_name = strlen(srv_name); + int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0; - DEBUG(5,("init_q_connect\n")); + DEBUG(5, ("init_samr_q_create_dom_alias\n")); - /* make PDC server name \\server */ - q_u->ptr_srv_name = len_srv_name > 0; - init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name + 1); + q_u->dom_pol = *hnd; - q_u->access_mask = access_mask; + init_uni_hdr(&q_u->hdr_acct_desc, acct_len); + init_unistr2(&q_u->uni_acct_desc, acct_desc, acct_len); + + q_u->access_mask = 0x001f000f; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_create_dom_alias(char *desc, SAMR_Q_CREATE_DOM_ALIAS * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_connect"); + prs_debug(ps, depth, desc, "samr_io_q_create_dom_alias"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name)) + if(!smb_io_pol_hnd("dom_pol", &q_u->dom_pol, ps, depth)) return False; - if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth)) + + if(!smb_io_unihdr("hdr_acct_desc", &q_u->hdr_acct_desc, ps, depth)) + return False; + if(!smb_io_unistr2("uni_acct_desc", &q_u->uni_acct_desc, + q_u->hdr_acct_desc.buffer, ps, depth)) return False; if(!prs_align(ps)) return False; - - if(!prs_uint32("access_mask ", ps, depth, &q_u->access_mask)) + if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) return False; return True; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_create_dom_alias(char *desc, SAMR_R_CREATE_DOM_ALIAS * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_connect"); + prs_debug(ps, depth, desc, "samr_io_r_create_dom_alias"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth)) + if(!smb_io_pol_hnd("alias_pol", &r_u->alias_pol, ps, depth)) return False; - if(!prs_align(ps)) + + if(!prs_uint32("rid", ps, depth, &r_u->rid)) return False; if(!prs_uint32("status", ps, depth, &r_u->status)) @@ -3434,67 +3989,58 @@ BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int dep } /******************************************************************* - Inits a SAMR_Q_CONNECT_ANON structure. +inits a SAMR_Q_ADD_ALIASMEM structure. ********************************************************************/ -void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON *q_u) +void init_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM * q_u, POLICY_HND *hnd, + DOM_SID *sid) { - DEBUG(5,("init_q_connect_anon\n")); + DEBUG(5, ("init_samr_q_add_aliasmem\n")); - q_u->ptr = 1; - q_u->unknown_0 = 0x5c; /* server name (?!!) */ - q_u->unknown_1 = 0x01; - q_u->unknown_2 = 0x20; + q_u->alias_pol = *hnd; + init_dom_sid2(&q_u->sid, sid); } - /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_add_aliasmem(char *desc, SAMR_Q_ADD_ALIASMEM * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_connect_anon"); + prs_debug(ps, depth, desc, "samr_io_q_add_aliasmem"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) + if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth)) return False; - if(!prs_uint16("unknown_0", ps, depth, &q_u->unknown_0)) - return False; - if(!prs_uint16("unknown_1", ps, depth, &q_u->unknown_1)) - return False; - if(!prs_uint32("unknown_2", ps, depth, &q_u->unknown_2)) + if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth)) return False; return True; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_add_aliasmem(char *desc, SAMR_R_ADD_ALIASMEM * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_connect_anon"); + prs_debug(ps, depth, desc, "samr_io_r_add_aliasmem"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -3502,65 +4048,58 @@ BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON *r_u, prs_struct *p } /******************************************************************* - Inits a SAMR_Q_OPEN_ALIAS structure. +inits a SAMR_Q_DEL_ALIASMEM structure. ********************************************************************/ -void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u, - uint32 unknown_0, uint32 rid) -{ - DEBUG(5,("init_q_open_alias\n")); - /* example values: 0x0000 0008 */ - q_u->unknown_0 = unknown_0; +void init_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM * q_u, POLICY_HND *hnd, + DOM_SID *sid) +{ + DEBUG(5, ("init_samr_q_del_aliasmem\n")); - q_u->rid_alias = rid; + q_u->alias_pol = *hnd; + init_dom_sid2(&q_u->sid, sid); } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_del_aliasmem(char *desc, SAMR_Q_DEL_ALIASMEM * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_open_alias"); + prs_debug(ps, depth, desc, "samr_io_q_del_aliasmem"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("domain_pol", &(q_u->dom_pol), ps, depth)) - return False; - - if(!prs_uint32("unknown_0", ps, depth, &q_u->unknown_0)) + if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth)) return False; - if(!prs_uint32("rid_alias", ps, depth, &q_u->rid_alias)) + if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth)) return False; return True; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_del_aliasmem(char *desc, SAMR_R_DEL_ALIASMEM * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_open_alias"); + prs_debug(ps, depth, desc, "samr_io_r_del_aliasmem"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - if(!prs_uint32("status", ps, depth, &r_u->status)) return False; @@ -3568,587 +4107,1107 @@ BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, i } /******************************************************************* - Inits a SAMR_Q_UNKNOWN_12 structure. +inits a SAMR_Q_DELETE_DOM_ALIAS structure. +********************************************************************/ + +void init_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS * q_c, + POLICY_HND *hnd) +{ + DEBUG(5, ("init_samr_q_delete_dom_alias\n")); + + q_c->alias_pol = *hnd; +} + +/******************************************************************* +reads or writes a structure. ********************************************************************/ -void init_samr_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u, - POLICY_HND *pol, uint32 rid, - uint32 num_gids, uint32 *gid) +BOOL samr_io_q_delete_dom_alias(char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u, + prs_struct *ps, int depth) { - int i; + if (q_u == NULL) + return False; - DEBUG(5,("init_samr_q_lookup_rids\n")); + prs_debug(ps, depth, desc, "samr_io_q_delete_dom_alias"); + depth++; - memcpy(&q_u->pol, pol, sizeof(*pol)); + if(!prs_align(ps)) + return False; - q_u->num_gids1 = num_gids; - q_u->rid = rid; - q_u->ptr = 0; - q_u->num_gids2 = num_gids; + if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth)) + return False; - for (i = 0; i < num_gids; i++) { - q_u->gid[i] = gid[i]; - } + return True; } /******************************************************************* - Inits a SAMR_Q_UNKNOWN_21 structure. +inits a SAMR_R_DELETE_DOM_ALIAS structure. ********************************************************************/ -void init_samr_q_unknown_21(SAMR_Q_UNKNOWN_21 *q_c, - POLICY_HND *hnd, uint16 unk_1, uint16 unk_2) +void init_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS * r_u, + uint32 status) { - DEBUG(5,("init_samr_q_unknown_21\n")); + DEBUG(5, ("init_samr_r_delete_dom_alias\n")); - memcpy(&q_c->group_pol, hnd, sizeof(q_c->group_pol)); - q_c->unknown_1 = unk_1; - q_c->unknown_2 = unk_2; + r_u->status = status; } - /******************************************************************* - Inits a SAMR_Q_UNKNOWN_13 structure. +reads or writes a structure. ********************************************************************/ -void init_samr_q_unknown_13(SAMR_Q_UNKNOWN_13 *q_c, - POLICY_HND *hnd, uint16 unk_1, uint16 unk_2) +BOOL samr_io_r_delete_dom_alias(char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u, + prs_struct *ps, int depth) { - DEBUG(5,("init_samr_q_unknown_13\n")); + if (r_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_delete_dom_alias"); + depth++; + + if(!prs_align(ps)) + return False; - memcpy(&q_c->alias_pol, hnd, sizeof(q_c->alias_pol)); - q_c->unknown_1 = unk_1; - q_c->unknown_2 = unk_2; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; } /******************************************************************* - Inits a SAMR_Q_UNKNOWN_38 structure. +inits a SAMR_Q_QUERY_ALIASMEM structure. ********************************************************************/ -void init_samr_q_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, char *srv_name) -{ - int len_srv_name = strlen(srv_name)+1; - - DEBUG(5,("init_q_unknown_38\n")); - q_u->ptr = 1; - init_uni_hdr(&q_u->hdr_srv_name, len_srv_name); - init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name); +void init_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM * q_c, + POLICY_HND *hnd) +{ + DEBUG(5, ("init_samr_q_query_aliasmem\n")); + q_c->alias_pol = *hnd; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_unknown_38(char *desc, SAMR_Q_UNKNOWN_38 *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_query_aliasmem(char *desc, SAMR_Q_QUERY_ALIASMEM * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_unknown_38"); + prs_debug(ps, depth, desc, "samr_io_q_query_aliasmem"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr", ps, depth, &q_u->ptr)) + if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth)) return False; - if (q_u->ptr != 0) { - if(!smb_io_unihdr ("", &q_u->hdr_srv_name, ps, depth)) - return False; - if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->hdr_srv_name.buffer, ps, depth)) - return False; - } - return True; } /******************************************************************* - Inits a SAMR_R_UNKNOWN_38 structure. +inits a SAMR_R_QUERY_ALIASMEM structure. ********************************************************************/ -void init_samr_r_unknown_38(SAMR_R_UNKNOWN_38 *r_u) +void init_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM * r_u, + uint32 num_sids, DOM_SID2 * sid, + uint32 status) { - DEBUG(5,("init_r_unknown_38\n")); + DEBUG(5, ("init_samr_r_query_aliasmem\n")); + + if (status == 0) { + r_u->num_sids = num_sids; + r_u->ptr = (num_sids != 0) ? 1 : 0; + r_u->num_sids1 = num_sids; + + r_u->sid = sid; + } else { + r_u->ptr = 0; + r_u->num_sids = 0; + } - r_u->unk_0 = 0; - r_u->unk_1 = 0; - r_u->unk_2 = 0; - r_u->unk_3 = 0; + r_u->status = status; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_unknown_38(char *desc, SAMR_R_UNKNOWN_38 *r_u, prs_struct *ps, int depth) +BOOL samr_io_r_query_aliasmem(char *desc, SAMR_R_QUERY_ALIASMEM * r_u, + prs_struct *ps, int depth) { + uint32 i; + uint32 ptr_sid[MAX_LOOKUP_SIDS]; + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_unknown_38"); + prs_debug(ps, depth, desc, "samr_io_r_query_aliasmem"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint16("unk_0", ps, depth, &r_u->unk_0)) + if(!prs_uint32("num_sids ", ps, depth, &r_u->num_sids)) return False; + if(!prs_uint32("ptr", ps, depth, &r_u->ptr)) + return False; + + if (r_u->ptr != 0) { + SMB_ASSERT_ARRAY(ptr_sid, r_u->num_sids); + + if (r_u->num_sids != 0) { + if(!prs_uint32("num_sids1", ps, depth, &r_u->num_sids1)) + return False; + + for (i = 0; i < r_u->num_sids1; i++) { + ptr_sid[i] = 1; + if(!prs_uint32("", ps, depth, &ptr_sid[i])) + return False; + } + + for (i = 0; i < r_u->num_sids1; i++) { + if (ptr_sid[i] != 0) { + if(!smb_io_dom_sid2("", &r_u->sid[i], ps, depth)) + return False; + } + } + } + } + if(!prs_align(ps)) return False; - if(!prs_uint16("unk_1", ps, depth, &r_u->unk_1)) + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; +} + +/******************************************************************* +inits a SAMR_Q_LOOKUP_NAMES structure. +********************************************************************/ + +void init_samr_q_lookup_names(SAMR_Q_LOOKUP_NAMES * q_u, + POLICY_HND *pol, uint32 flags, + uint32 num_names, char **name) +{ + uint32 i; + + DEBUG(5, ("init_samr_q_lookup_names\n")); + + q_u->pol = *pol; + + q_u->num_names1 = num_names; + q_u->flags = flags; + q_u->ptr = 0; + q_u->num_names2 = num_names; + + for (i = 0; i < num_names; i++) { + int len_name = name[i] != NULL ? strlen(name[i]) : 0; + init_uni_hdr(&q_u->hdr_name[i], len_name); /* unicode header for user_name */ + init_unistr2(&q_u->uni_name[i], name[i], len_name); /* unicode string for machine account */ + } +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES * q_u, + prs_struct *ps, int depth) +{ + uint32 i; + + if (q_u == NULL) return False; + + prs_debug(ps, depth, desc, "samr_io_q_lookup_names"); + depth++; + + if (UNMARSHALLING(ps)) + ZERO_STRUCTP(q_u); + if(!prs_align(ps)) return False; - if(!prs_uint16("unk_2", ps, depth, &r_u->unk_2)) + + if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) return False; - if(!prs_align(ps)) + + if(!prs_uint32("num_names1", ps, depth, &q_u->num_names1)) return False; - if(!prs_uint16("unk_3", ps, depth, &r_u->unk_3)) + if(!prs_uint32("flags ", ps, depth, &q_u->flags)) return False; - if(!prs_align(ps)) + if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) + return False; + if(!prs_uint32("num_names2", ps, depth, &q_u->num_names2)) return False; + SMB_ASSERT_ARRAY(q_u->hdr_name, q_u->num_names2); + + for (i = 0; i < q_u->num_names2; i++) { + if(!smb_io_unihdr("", &q_u->hdr_name[i], ps, depth)) + return False; + } + + for (i = 0; i < q_u->num_names2; i++) { + if(!smb_io_unistr2("", &q_u->uni_name[i], q_u->hdr_name[i].buffer, ps, depth)) + return False; + } + return True; } /******************************************************************* -make a SAMR_ENC_PASSWD structure. +inits a SAMR_R_LOOKUP_NAMES structure. ********************************************************************/ -void init_enc_passwd(SAMR_ENC_PASSWD *pwd, char pass[512]) +void init_samr_r_lookup_names(TALLOC_CTX *ctx, SAMR_R_LOOKUP_NAMES * r_u, + uint32 num_rids, + uint32 *rid, uint32 *type, + uint32 status) { - pwd->ptr = 1; - memcpy(pwd->pass, pass, sizeof(pwd->pass)); + DEBUG(5, ("init_samr_r_lookup_names\n")); + + if ((status == 0) && (num_rids != 0)) { + uint32 i; + + r_u->num_types1 = num_rids; + r_u->ptr_types = 1; + r_u->num_types2 = num_rids; + + r_u->num_rids1 = num_rids; + r_u->ptr_rids = 1; + r_u->num_rids2 = num_rids; + + r_u->rids = (uint32 *)talloc_zero(ctx, sizeof(uint32)*num_rids); + r_u->types = (uint32 *)talloc_zero(ctx, sizeof(uint32)*num_rids); + + if (!r_u->rids || !r_u->types) + goto empty; + + for (i = 0; i < num_rids; i++) { + r_u->rids[i] = rid[i]; + r_u->types[i] = type[i]; + } + } else { + + empty: + r_u->num_types1 = 0; + r_u->ptr_types = 0; + r_u->num_types2 = 0; + + r_u->num_rids1 = 0; + r_u->ptr_rids = 0; + r_u->num_rids2 = 0; + + r_u->rids = NULL; + r_u->types = NULL; + } + + r_u->status = status; } /******************************************************************* - Reads or writes a SAMR_ENC_PASSWD structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth) +BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES * r_u, + prs_struct *ps, int depth) { - if (pwd == NULL) + uint32 i; + fstring tmp; + + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_enc_passwd"); + prs_debug(ps, depth, desc, "samr_io_r_lookup_names"); depth++; + if (UNMARSHALLING(ps)) + ZERO_STRUCTP(r_u); + if(!prs_align(ps)) return False; - if(!prs_uint32("ptr", ps, depth, &pwd->ptr)) + if(!prs_uint32("num_rids1", ps, depth, &r_u->num_rids1)) + return False; + if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids)) + return False; + + if (r_u->ptr_rids != 0) { + if(!prs_uint32("num_rids2", ps, depth, &r_u->num_rids2)) + return False; + + if (r_u->num_rids2 != r_u->num_rids1) { + /* RPC fault */ + return False; + } + + if (UNMARSHALLING(ps)) + r_u->rids = (uint32 *)prs_alloc_mem(ps, sizeof(uint32)*r_u->num_rids2); + + if (!r_u->rids) { + DEBUG(0, ("NULL rids in samr_io_r_lookup_names\n")); + return False; + } + + for (i = 0; i < r_u->num_rids2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i); + if(!prs_uint32(tmp, ps, depth, &r_u->rids[i])) + return False; + } + } + + if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1)) return False; - if(!prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass))) + if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types)) + return False; + + if (r_u->ptr_types != 0) { + if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2)) + return False; + + if (r_u->num_types2 != r_u->num_types1) { + /* RPC fault */ + return False; + } + + if (UNMARSHALLING(ps)) + r_u->types = (uint32 *)prs_alloc_mem(ps, sizeof(uint32)*r_u->num_types2); + + if (!r_u->types) { + DEBUG(0, ("NULL types in samr_io_r_lookup_names\n")); + return False; + } + + for (i = 0; i < r_u->num_types2; i++) { + slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i); + if(!prs_uint32(tmp, ps, depth, &r_u->types[i])) + return False; + } + } + + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; } /******************************************************************* - Inits a SAMR_ENC_HASH structure. +inits a SAMR_Q_DELETE_DOM_USER structure. ********************************************************************/ -void init_enc_hash(SAMR_ENC_HASH *hsh, uchar hash[16]) +void init_samr_q_delete_dom_user(SAMR_Q_DELETE_DOM_USER * q_c, + POLICY_HND *hnd) { - hsh->ptr = 1; - memcpy(hsh->hash, hash, sizeof(hsh->hash)); + DEBUG(5, ("init_samr_q_delete_dom_user\n")); + + q_c->user_pol = *hnd; } /******************************************************************* - Reads or writes a SAMR_ENC_HASH structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth) +BOOL samr_io_q_delete_dom_user(char *desc, SAMR_Q_DELETE_DOM_USER * q_u, + prs_struct *ps, int depth) { - if (hsh == NULL) + if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_enc_hash"); + prs_debug(ps, depth, desc, "samr_io_q_delete_dom_user"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr ", ps, depth, &hsh->ptr)) - return False; - if(!prs_uint8s(False, "hash", ps, depth, hsh->hash, sizeof(hsh->hash))) + if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth)) return False; return True; } /******************************************************************* - Inits a SAMR_R_UNKNOWN_38 structure. +reads or writes a structure. ********************************************************************/ -void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u, - char *dest_host, char *user_name, - char nt_newpass[516], uchar nt_oldhash[16], - char lm_newpass[516], uchar lm_oldhash[16]) +BOOL samr_io_r_delete_dom_user(char *desc, SAMR_R_DELETE_DOM_USER * r_u, + prs_struct *ps, int depth) { - int len_dest_host = strlen(dest_host)+1; - int len_user_name = strlen(user_name)+1; + if (r_u == NULL) + return False; - DEBUG(5,("init_samr_q_chgpasswd_user\n")); + prs_debug(ps, depth, desc, "samr_io_r_delete_dom_user"); + depth++; - q_u->ptr_0 = 1; - init_uni_hdr(&q_u->hdr_dest_host, len_dest_host); - init_unistr2(&q_u->uni_dest_host, dest_host, len_dest_host); - init_uni_hdr(&q_u->hdr_user_name, len_user_name); - init_unistr2(&q_u->uni_user_name, user_name, len_user_name); + if(!prs_align(ps)) + return False; - init_enc_passwd(&q_u->nt_newpass, nt_newpass); - init_enc_hash(&q_u->nt_oldhash, nt_oldhash); + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; - q_u->unknown = 0x01; + return True; +} - init_enc_passwd(&q_u->lm_newpass, lm_newpass); - init_enc_hash (&q_u->lm_oldhash, lm_oldhash); +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +void init_samr_q_open_user(SAMR_Q_OPEN_USER * q_u, + POLICY_HND *pol, + uint32 access_mask, uint32 rid) +{ + DEBUG(5, ("samr_init_samr_q_open_user\n")); + + q_u->domain_pol = *pol; + q_u->access_mask = access_mask; + q_u->user_rid = rid; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER *q_u, prs_struct *ps, int depth) +BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user"); + prs_debug(ps, depth, desc, "samr_io_q_open_user"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0)) + if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth)) return False; - if(!smb_io_unihdr ("", &q_u->hdr_dest_host, ps, depth)) - return False; - if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth)) - return False; - if(!smb_io_unihdr ("", &q_u->hdr_user_name, ps, depth)) + if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) return False; - if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer, ps, depth)) + if(!prs_uint32("user_rid ", ps, depth, &q_u->user_rid)) return False; - if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth)) - return False; - if(!samr_io_enc_hash ("nt_oldhash", &q_u->nt_oldhash, ps, depth)) + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) return False; - if(!prs_uint32("unknown", ps, depth, &q_u->unknown)) + prs_debug(ps, depth, desc, "samr_io_r_open_user"); + depth++; + + if(!prs_align(ps)) return False; - if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth)) + if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth)) return False; - if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth)) + + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; } + /******************************************************************* - Inits a SAMR_R_CHGPASSWD_USER structure. +reads or writes a structure. ********************************************************************/ -void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER *r_u, uint32 status) +void init_samr_q_create_user(SAMR_Q_CREATE_USER * q_u, + POLICY_HND *pol, + char *name, + uint32 acb_info, uint32 access_mask) { - DEBUG(5,("init_r_chgpasswd_user\n")); + int len_name; + len_name = strlen(name); - r_u->status = status; + DEBUG(5, ("samr_init_samr_q_create_user\n")); + + q_u->domain_pol = *pol; + + init_uni_hdr(&q_u->hdr_name, len_name); + init_unistr2(&q_u->uni_name, name, len_name); + + q_u->acb_info = acb_info; + q_u->access_mask = access_mask; } /******************************************************************* - Reads or writes a structure. +reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct *ps, int depth) +BOOL samr_io_q_create_user(char *desc, SAMR_Q_CREATE_USER * q_u, + prs_struct *ps, int depth) { - if (r_u == NULL) + if (q_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user"); + prs_debug(ps, depth, desc, "samr_io_q_create_user"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("status", ps, depth, &r_u->status)) + if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth)) + return False; + + if(!smb_io_unihdr("hdr_name", &q_u->hdr_name, ps, depth)) + return False; + if(!smb_io_unistr2("uni_name", &q_u->uni_name, q_u->hdr_name.buffer, ps, depth)) + return False; + + if(!prs_align(ps)) + return False; + if(!prs_uint32("acb_info ", ps, depth, &q_u->acb_info)) + return False; + if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) return False; return True; } -/********************************************************************** - Reads or writes a structure - **********************************************************************/ -BOOL samr_io_q_lookup_domain(char* desc, SAMR_Q_LOOKUP_DOMAIN* q_u, prs_struct *ps, int depth) +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER * r_u, + prs_struct *ps, int depth) { - if (q_u == NULL) + if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_lookup_domain"); + prs_debug(ps, depth, desc, "samr_io_r_create_user"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("connect_pol", &q_u->connect_pol, ps, depth)) + if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth)) return False; - if(!smb_io_unihdr("hdr_domain", &q_u->hdr_domain, ps, depth)) + if(!prs_uint32("unknown_0", ps, depth, &r_u->unknown_0)) return False; - - if(!smb_io_unistr2("uni_domain", &q_u->uni_domain, q_u->hdr_domain.buffer, ps, depth)) + if(!prs_uint32("user_rid ", ps, depth, &r_u->user_rid)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; -} +} /******************************************************************* -makes a SAMR_R_LOOKUP_DOMAIN structure. +inits a SAMR_Q_QUERY_USERINFO structure. ********************************************************************/ -BOOL init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u, - DOM_SID *dom_sid, uint32 status) + +void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO * q_u, + POLICY_HND *hnd, uint16 switch_value) { - if (r_u == NULL) + DEBUG(5, ("init_samr_q_query_userinfo\n")); + + q_u->pol = *hnd; + q_u->switch_value = switch_value; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) return False; - DEBUG(5, ("make_samr_r_lookup_domain\n")); + prs_debug(ps, depth, desc, "samr_io_q_query_userinfo"); + depth++; - r_u->status = status; - r_u->ptr_sid = 0; - if (status == 0x0) { - r_u->ptr_sid = 1; - init_dom_sid2(&r_u->dom_sid, dom_sid); - } + if(!prs_align(ps)) + return False; + + if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) + return False; + + if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) /* 0x0015 or 0x0011 */ + return False; return True; } /******************************************************************* -reads or writes a structure. +reads or writes a LOGON_HRS structure. ********************************************************************/ -BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN * r_u, - prs_struct *ps, int depth) + +static BOOL sam_io_logon_hrs(char *desc, LOGON_HRS * hrs, + prs_struct *ps, int depth) { - if (r_u == NULL) + if (hrs == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_lookup_domain"); + prs_debug(ps, depth, desc, "sam_io_logon_hrs"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr", ps, depth, &r_u->ptr_sid)) + if(!prs_uint32("len ", ps, depth, &hrs->len)) return False; - if (r_u->ptr_sid != 0) { - if(!smb_io_dom_sid2("sid", &r_u->dom_sid, ps, depth)) - return False; - if(!prs_align(ps)) - return False; + if (hrs->len > sizeof(hrs->hours)) { + DEBUG(3, ("sam_io_logon_hrs: truncating length from %d\n", hrs->len)); + hrs->len = sizeof(hrs->hours); } - if(!prs_uint32("status", ps, depth, &r_u->status)) + if(!prs_uint8s(False, "hours", ps, depth, hrs->hours, hrs->len)) return False; return True; -} +} + +/******************************************************************* +inits a SAM_USER_INFO_12 structure. +********************************************************************/ + +void init_sam_user_info12(SAM_USER_INFO_12 * usr, + uint8 lm_pwd[16], uint8 nt_pwd[16]) +{ + DEBUG(5, ("init_sam_user_info12\n")); + + usr->lm_pwd_active = + memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd)) ? 1 : 0; + usr->nt_pwd_active = + memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd)) ? 1 : 0; +} /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS * q_e, - prs_struct *ps, int depth) + +static BOOL sam_io_user_info12(char *desc, SAM_USER_INFO_12 * u, + prs_struct *ps, int depth) { - if (q_e == NULL) + if (u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_q_enum_domains"); + DEBUG(0, ("possible security breach!\n")); + + prs_debug(ps, depth, desc, "samr_io_r_user_info12"); depth++; if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth)) + if(!prs_uint8s(False, "lm_pwd", ps, depth, u->lm_pwd, sizeof(u->lm_pwd))) + return False; + if(!prs_uint8s(False, "nt_pwd", ps, depth, u->nt_pwd, sizeof(u->nt_pwd))) return False; - if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx)) + if(!prs_uint8("lm_pwd_active", ps, depth, &u->lm_pwd_active)) return False; - if(!prs_uint32("max_size ", ps, depth, &q_e->max_size)) + if(!prs_uint8("nt_pwd_active", ps, depth, &u->nt_pwd_active)) + return False; + + return True; +} + +/******************************************************************* +inits a SAM_USER_INFO_10 structure. +********************************************************************/ + +void init_sam_user_info10(SAM_USER_INFO_10 * usr, uint32 acb_info) +{ + DEBUG(5, ("init_sam_user_info10\n")); + + usr->acb_info = acb_info; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +static BOOL sam_io_user_info10(char *desc, SAM_USER_INFO_10 * usr, + prs_struct *ps, int depth) +{ + if (usr == NULL) return False; + prs_debug(ps, depth, desc, "samr_io_r_user_info10"); + depth++; + if(!prs_align(ps)) return False; + if(!prs_uint32("acb_info", ps, depth, &usr->acb_info)) + return False; + return True; -} +} /******************************************************************* -makes a SAMR_R_ENUM_DOMAINS structure. +inits a SAM_USER_INFO_11 structure. ********************************************************************/ -BOOL init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u, - uint32 next_idx, fstring* domains, uint32 num_sam_entries) + +void init_sam_user_info11(SAM_USER_INFO_11 * usr, + NTTIME * expiry, + char *mach_acct, + uint32 rid_user, uint32 rid_group, uint16 acct_ctrl) { - int i=0; + int len_mach_acct; - if (r_u == NULL) - return False; + DEBUG(5, ("init_sam_user_info11\n")); - DEBUG(5, ("init_samr_r_enum_domains\n")); + len_mach_acct = strlen(mach_acct); - r_u->next_idx = next_idx; + memcpy(&(usr->expiry), expiry, sizeof(usr->expiry)); /* expiry time or something? */ + ZERO_STRUCT(usr->padding_1); /* 0 - padding 24 bytes */ - r_u->uni_dom_name = (UNISTR2*) malloc(sizeof(UNISTR2) * num_sam_entries); - r_u->sam = (SAM_ENTRY*) malloc(sizeof(SAM_ENTRY) * num_sam_entries); - if(r_u->uni_dom_name == NULL || r_u->sam == NULL) - { - free(r_u->uni_dom_name); - free(r_u->sam); - r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED; - } + init_uni_hdr(&usr->hdr_mach_acct, len_mach_acct); /* unicode header for machine account */ + usr->padding_2 = 0; /* 0 - padding 4 bytes */ - if(r_u->status == 0) - for(i=0;i<num_sam_entries;i++) /* only two domains to send */ - { - init_unistr2(&r_u->uni_dom_name[i],domains[i], strlen(domains[i])+1); - init_sam_entry(&(r_u->sam[i]), strlen(domains[i])+1, 0); - } - else - { - num_sam_entries = 0; - } - - if (num_sam_entries != 0) - { - r_u->ptr_entries1 = 1; - r_u->ptr_entries2 = 1; - r_u->num_entries2 = num_sam_entries; - r_u->num_entries3 = num_sam_entries; - - r_u->num_entries4 = num_sam_entries; - } - else - { - r_u->ptr_entries1 = 0; - r_u->num_entries2 = num_sam_entries; - r_u->ptr_entries2 = 1; - } - - return True; + usr->ptr_1 = 1; /* pointer */ + ZERO_STRUCT(usr->padding_3); /* 0 - padding 32 bytes */ + usr->padding_4 = 0; /* 0 - padding 4 bytes */ + + usr->ptr_2 = 1; /* pointer */ + usr->padding_5 = 0; /* 0 - padding 4 bytes */ + + usr->ptr_3 = 1; /* pointer */ + ZERO_STRUCT(usr->padding_6); /* 0 - padding 32 bytes */ + + usr->rid_user = rid_user; + usr->rid_group = rid_group; + + usr->acct_ctrl = acct_ctrl; + usr->unknown_3 = 0x0000; + + usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */ + usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */ + + ZERO_STRUCT(usr->padding_7); /* 0 - padding 16 bytes */ + usr->padding_8 = 0; /* 0 - padding 4 bytes */ + + init_unistr2(&usr->uni_mach_acct, mach_acct, len_mach_acct); /* unicode string for machine account */ } /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u, - prs_struct *ps, int depth) -{ - uint32 i; - if (r_u == NULL) +static BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 * usr, + prs_struct *ps, int depth) +{ + if (usr == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_enum_domains"); + prs_debug(ps, depth, desc, "samr_io_r_unknown_11"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx)) + if(!prs_uint8s(False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0))) return False; - if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1)) + + if(!smb_io_time("time", &usr->expiry, ps, depth)) return False; - if (r_u->ptr_entries1 != 0) { + if(!prs_uint8s(False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1))) + return False; - if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2)) - return False; + if(!smb_io_unihdr("unihdr", &usr->hdr_mach_acct, ps, depth)) + return False; - if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2)) - return False; - if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3)) - return False; + if(!prs_uint32("padding_2", ps, depth, &usr->padding_2)) + return False; - if (UNMARSHALLING(ps)) { - r_u->sam = (SAM_ENTRY*) malloc(sizeof(SAM_ENTRY)* r_u->num_entries2); - r_u->uni_dom_name = (UNISTR2*) malloc(sizeof(UNISTR2)* r_u->num_entries2); - } + if(!prs_uint32("ptr_1 ", ps, depth, &usr->ptr_1)) + return False; + if(!prs_uint8s(False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3))) + return False; - if ((r_u->sam == NULL || r_u->uni_dom_name == NULL) && r_u->num_entries2 != 0) { - DEBUG(0, ("NULL pointers in SAMR_R_ENUM_DOMAINS\n")); - r_u->num_entries4 = 0; - r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED; - return False; - } + if(!prs_uint32("padding_4", ps, depth, &usr->padding_4)) + return False; - for (i = 0; i < r_u->num_entries2; i++) { - fstring tmp; - slprintf(tmp, sizeof(tmp) - 1, "domains[%d]", i); - if (!sam_io_sam_entry(tmp, &r_u->sam[i], ps, depth)) - return False; - } + if(!prs_uint32("ptr_2 ", ps, depth, &usr->ptr_2)) + return False; + if(!prs_uint32("padding_5", ps, depth, &usr->padding_5)) + return False; - for (i = 0; i < r_u->num_entries2; i++) { - fstring tmp; - slprintf(tmp, sizeof(tmp) - 1, "domains[%d]", i); - if(!smb_io_unistr2(tmp, &r_u->uni_dom_name[i], r_u->sam[i].hdr_name.buffer, ps, depth)) - return False; - if(!prs_align(ps)) - return False; - } + if(!prs_uint32("ptr_3 ", ps, depth, &usr->ptr_3)) + return False; + if(!prs_uint8s(False, "padding_6", ps, depth, usr->padding_6,sizeof(usr->padding_6))) + return False; - if(!prs_align(ps)) - return False; + if(!prs_uint32("rid_user ", ps, depth, &usr->rid_user)) + return False; + if(!prs_uint32("rid_group", ps, depth, &usr->rid_group)) + return False; + if(!prs_uint16("acct_ctrl", ps, depth, &usr->acct_ctrl)) + return False; + if(!prs_uint16("unknown_3", ps, depth, &usr->unknown_3)) + return False; + if(!prs_uint16("unknown_4", ps, depth, &usr->unknown_4)) + return False; + if(!prs_uint16("unknown_5", ps, depth, &usr->unknown_5)) + return False; - } + if(!prs_uint8s(False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7))) + return False; - if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4)) + if(!prs_uint32("padding_8", ps, depth, &(usr->padding_8))) return False; - if(!prs_uint32("status", ps, depth, &r_u->status)) + + if(!smb_io_unistr2("unistr2", &usr->uni_mach_acct, True, ps, depth)) + return False; + + if(!prs_align(ps)) + return False; + + if(!prs_uint8s(False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9))) return False; return True; } +/************************************************************************* + init_sam_user_infoa + + unknown_3 = 0x09f8 27fa + unknown_5 = 0x0001 0000 + unknown_6 = 0x0000 04ec + + *************************************************************************/ + +void init_sam_user_info24(SAM_USER_INFO_24 * usr, + char newpass[516], uint16 passlen) +{ + DEBUG(10, ("init_sam_user_info24: passlen: %d\n", passlen)); + memcpy(usr->pass, newpass, sizeof(usr->pass)); +} + /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL sam_io_user_info12(char *desc, SAM_USER_INFO_12 *u, prs_struct *ps, int depth) + +static BOOL sam_io_user_info24(char *desc, SAM_USER_INFO_24 * usr, + prs_struct *ps, int depth) { - if (u == NULL) + if (usr == NULL) return False; - DEBUG(0, ("possible security breach!\n")); - - prs_debug(ps, depth, desc, "samr_io_r_user_info12"); + prs_debug(ps, depth, desc, "sam_io_user_info24"); depth++; if(!prs_align(ps)) return False; - if(!prs_uint8s(False, "lm_pwd", ps, depth, u->lm_pwd, sizeof(u->lm_pwd))) - return False; - if(!prs_uint8s(False, "nt_pwd", ps, depth, u->nt_pwd, sizeof(u->nt_pwd))) - return False; - - if(!prs_uint8("lm_pwd_active", ps, depth, &u->lm_pwd_active)) - return False; - if(!prs_uint8("nt_pwd_active", ps, depth, &u->nt_pwd_active)) + if(!prs_uint8s(False, "password", ps, depth, usr->pass, sizeof(usr->pass))) return False; return True; } +/************************************************************************* + init_sam_user_info23 + + unknown_3 = 0x09f8 27fa + unknown_5 = 0x0001 0000 + unknown_6 = 0x0000 04ec + + *************************************************************************/ + +void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */ + NTTIME * logoff_time, /* all zeros */ + NTTIME * kickoff_time, /* all zeros */ + NTTIME * pass_last_set_time, /* all zeros */ + NTTIME * pass_can_change_time, /* all zeros */ + NTTIME * pass_must_change_time, /* all zeros */ + UNISTR2 *user_name, + UNISTR2 *full_name, + UNISTR2 *home_dir, + UNISTR2 *dir_drive, + UNISTR2 *log_scr, + UNISTR2 *prof_path, + UNISTR2 *desc, + UNISTR2 *wkstas, + UNISTR2 *unk_str, + UNISTR2 *mung_dial, + uint32 user_rid, /* 0x0000 0000 */ + uint32 group_rid, + uint32 acb_info, + uint32 unknown_3, + uint16 logon_divs, + LOGON_HRS * hrs, + uint32 unknown_5, + char newpass[516], uint32 unknown_6) +{ + int len_user_name = user_name != NULL ? user_name->uni_str_len : 0; + int len_full_name = full_name != NULL ? full_name->uni_str_len : 0; + int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0; + int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0; + int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0; + int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0; + int len_description = desc != NULL ? desc->uni_str_len : 0; + int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0; + int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0; + int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0; + + usr->logon_time = *logon_time; /* all zeros */ + usr->logoff_time = *logoff_time; /* all zeros */ + usr->kickoff_time = *kickoff_time; /* all zeros */ + usr->pass_last_set_time = *pass_last_set_time; /* all zeros */ + usr->pass_can_change_time = *pass_can_change_time; /* all zeros */ + usr->pass_must_change_time = *pass_must_change_time; /* all zeros */ + + init_uni_hdr(&usr->hdr_user_name, len_user_name); /* NULL */ + init_uni_hdr(&usr->hdr_full_name, len_full_name); + init_uni_hdr(&usr->hdr_home_dir, len_home_dir); + init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive); + init_uni_hdr(&usr->hdr_logon_script, len_logon_script); + init_uni_hdr(&usr->hdr_profile_path, len_profile_path); + init_uni_hdr(&usr->hdr_acct_desc, len_description); + init_uni_hdr(&usr->hdr_workstations, len_workstations); + init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str); + init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial); + + ZERO_STRUCT(usr->nt_pwd); + ZERO_STRUCT(usr->lm_pwd); + + usr->user_rid = user_rid; /* 0x0000 0000 */ + usr->group_rid = group_rid; + usr->acb_info = acb_info; + usr->unknown_3 = unknown_3; /* 09f8 27fa */ + + usr->logon_divs = logon_divs; /* should be 168 (hours/week) */ + usr->ptr_logon_hrs = hrs ? 1 : 0; + + ZERO_STRUCT(usr->padding1); + + usr->unknown_5 = unknown_5; /* 0x0001 0000 */ + + memcpy(usr->pass, newpass, sizeof(usr->pass)); + + copy_unistr2(&usr->uni_user_name, user_name); + copy_unistr2(&usr->uni_full_name, full_name); + copy_unistr2(&usr->uni_home_dir, home_dir); + copy_unistr2(&usr->uni_dir_drive, dir_drive); + copy_unistr2(&usr->uni_logon_script, log_scr); + copy_unistr2(&usr->uni_profile_path, prof_path); + copy_unistr2(&usr->uni_acct_desc, desc); + copy_unistr2(&usr->uni_workstations, wkstas); + copy_unistr2(&usr->uni_unknown_str, unk_str); + copy_unistr2(&usr->uni_munged_dial, mung_dial); + + usr->unknown_6 = unknown_6; /* 0x0000 04ec */ + usr->padding4 = 0; + + memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs)); +} + +/************************************************************************* + init_sam_user_info23 + + unknown_3 = 0x09f8 27fa + unknown_5 = 0x0001 0000 + unknown_6 = 0x0000 04ec + + *************************************************************************/ + +void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */ + NTTIME * logoff_time, /* all zeros */ + NTTIME * kickoff_time, /* all zeros */ + NTTIME * pass_last_set_time, /* all zeros */ + NTTIME * pass_can_change_time, /* all zeros */ + NTTIME * pass_must_change_time, /* all zeros */ + char *user_name, /* NULL */ + char *full_name, + char *home_dir, char *dir_drive, char *log_scr, + char *prof_path, char *desc, char *wkstas, + char *unk_str, char *mung_dial, uint32 user_rid, /* 0x0000 0000 */ + uint32 group_rid, uint32 acb_info, + uint32 unknown_3, uint16 logon_divs, + LOGON_HRS * hrs, uint32 unknown_5, + char newpass[516], uint32 unknown_6) +{ + int len_user_name = user_name != NULL ? strlen(user_name) : 0; + int len_full_name = full_name != NULL ? strlen(full_name) : 0; + int len_home_dir = home_dir != NULL ? strlen(home_dir) : 0; + int len_dir_drive = dir_drive != NULL ? strlen(dir_drive) : 0; + int len_logon_script = log_scr != NULL ? strlen(log_scr) : 0; + int len_profile_path = prof_path != NULL ? strlen(prof_path) : 0; + int len_description = desc != NULL ? strlen(desc) : 0; + int len_workstations = wkstas != NULL ? strlen(wkstas) : 0; + int len_unknown_str = unk_str != NULL ? strlen(unk_str) : 0; + int len_munged_dial = mung_dial != NULL ? strlen(mung_dial) : 0; + + usr->logon_time = *logon_time; /* all zeros */ + usr->logoff_time = *logoff_time; /* all zeros */ + usr->kickoff_time = *kickoff_time; /* all zeros */ + usr->pass_last_set_time = *pass_last_set_time; /* all zeros */ + usr->pass_can_change_time = *pass_can_change_time; /* all zeros */ + usr->pass_must_change_time = *pass_must_change_time; /* all zeros */ + + init_uni_hdr(&usr->hdr_user_name, len_user_name); /* NULL */ + init_uni_hdr(&usr->hdr_full_name, len_full_name); + init_uni_hdr(&usr->hdr_home_dir, len_home_dir); + init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive); + init_uni_hdr(&usr->hdr_logon_script, len_logon_script); + init_uni_hdr(&usr->hdr_profile_path, len_profile_path); + init_uni_hdr(&usr->hdr_acct_desc, len_description); + init_uni_hdr(&usr->hdr_workstations, len_workstations); + init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str); + init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial); + + ZERO_STRUCT(usr->nt_pwd); + ZERO_STRUCT(usr->lm_pwd); + + usr->user_rid = user_rid; /* 0x0000 0000 */ + usr->group_rid = group_rid; + usr->acb_info = acb_info; + usr->unknown_3 = unknown_3; /* 09f8 27fa */ + + usr->logon_divs = logon_divs; /* should be 168 (hours/week) */ + usr->ptr_logon_hrs = hrs ? 1 : 0; + + ZERO_STRUCT(usr->padding1); + + usr->unknown_5 = unknown_5; /* 0x0001 0000 */ + + memcpy(usr->pass, newpass, sizeof(usr->pass)); + + init_unistr2(&usr->uni_user_name, user_name, len_user_name); /* NULL */ + init_unistr2(&usr->uni_full_name, full_name, len_full_name); + init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir); + init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive); + init_unistr2(&usr->uni_logon_script, log_scr, len_logon_script); + init_unistr2(&usr->uni_profile_path, prof_path, len_profile_path); + init_unistr2(&usr->uni_acct_desc, desc, len_description); + init_unistr2(&usr->uni_workstations, wkstas, len_workstations); + init_unistr2(&usr->uni_unknown_str, unk_str, len_unknown_str); + init_unistr2(&usr->uni_munged_dial, mung_dial, len_munged_dial); + + usr->unknown_6 = unknown_6; /* 0x0000 04ec */ + usr->padding4 = 0; + + memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs)); +} + /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 *usr, prs_struct *ps, int depth) + +static BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 * usr, + prs_struct *ps, int depth) { if (usr == NULL) return False; @@ -4159,118 +5218,423 @@ static BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 *usr, prs_struct *ps if(!prs_align(ps)) return False; - if(!smb_io_time("logon_time", &usr->logon_time, ps, depth)) + if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth)) return False; - if(!smb_io_time("logoff_time", &usr->logoff_time, ps, depth)) + if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth)) return False; - if(!smb_io_time("kickoff_time", &usr->kickoff_time, ps, depth)) + if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth)) return False; - if(!smb_io_time("pass_last_set_time", &usr->pass_last_set_time, ps, depth)) + if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth)) return False; - if(!smb_io_time("pass_can_change_time", &usr->pass_can_change_time, ps, depth)) + if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth)) return False; if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth)) return False; - if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */ + if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */ return False; - if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */ + if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */ return False; - if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */ + if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */ return False; - if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */ + if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */ return False; if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */ return False; if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */ return False; - if(!smb_io_unihdr("hdr_acct_desc", &usr->hdr_acct_desc, ps, depth)) /* account desc */ + if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */ return False; if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */ return False; - if(!smb_io_unihdr("hdr_unknown_str", &usr->hdr_unknown_str, ps, depth)) /* unknown string */ + if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */ return False; - if(!smb_io_unihdr("hdr_munged_dial", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */ + if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */ return False; - if(!prs_uint8s(False, "lm_pwd", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd))) + if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd))) return False; - if(!prs_uint8s(False, "nt_pwd", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd))) + if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd))) return False; - if(!prs_uint32("user_rid", ps, depth, &usr->user_rid)) /* User ID */ + if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */ return False; - if(!prs_uint32("group_rid", ps, depth, &usr->group_rid)) /* Group ID */ + if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */ return False; - if(!prs_uint32("acb_info", ps, depth, &usr->acb_info)) + if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info)) return False; - if(!prs_uint32("unknown_3", ps, depth, &usr->unknown_3)) + if(!prs_uint32("unknown_3 ", ps, depth, &usr->unknown_3)) return False; - if(!prs_uint16("logon_divs", ps, depth, &usr->logon_divs)) /* logon divisions per week */ + if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */ return False; if(!prs_align(ps)) return False; - if(!prs_uint32("ptr_logon_hrs", ps, depth, &usr->ptr_logon_hrs)) + if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs)) return False; - if(!prs_uint8s(False, "padding1", ps, depth, usr->padding1, sizeof(usr->padding1))) + if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1))) return False; - if(!prs_uint32("unknown_5", ps, depth, &usr->unknown_5)) + if(!prs_uint32("unknown_5 ", ps, depth, &usr->unknown_5)) return False; - if(!prs_uint8s(False, "password", ps, depth, usr->pass, sizeof(usr->pass))) + if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass))) return False; /* here begins pointed-to data */ - if(!prs_align_needed(ps, usr->hdr_user_name.buffer)) + if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */ return False; - if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */ + + if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */ return False; - if(!prs_align_needed(ps, usr->hdr_full_name.buffer)) + + if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */ return False; - if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */ + + if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */ return False; - if(!prs_align_needed(ps, usr->hdr_home_dir.buffer)) + + if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */ + return False; + + if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */ return False; - if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */ + + if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */ return False; - if(!prs_align_needed(ps, usr->hdr_dir_drive.buffer)) + + if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */ return False; - if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */ + + if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */ return False; - if(!prs_align_needed(ps, usr->hdr_logon_script.buffer)) + + if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth)) return False; - if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */ + + /* ok, this is only guess-work (as usual) */ + if (usr->ptr_logon_hrs) { + if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6)) + return False; + if(!prs_uint32("padding4 ", ps, depth, &usr->padding4)) + return False; + if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth)) + return False; + } else if (UNMARSHALLING(ps)) { + usr->unknown_6 = 0; + usr->padding4 = 0; + } + + return True; +} + + +/************************************************************************* + init_sam_user_info21W + + unknown_3 = 0x00ff ffff + unknown_5 = 0x0002 0000 + unknown_6 = 0x0000 04ec + + *************************************************************************/ + +void init_sam_user_info21W(SAM_USER_INFO_21 * usr, + NTTIME * logon_time, + NTTIME * logoff_time, + NTTIME * kickoff_time, + NTTIME * pass_last_set_time, + NTTIME * pass_can_change_time, + NTTIME * pass_must_change_time, + UNISTR2 *user_name, + UNISTR2 *full_name, + UNISTR2 *home_dir, + UNISTR2 *dir_drive, + UNISTR2 *log_scr, + UNISTR2 *prof_path, + UNISTR2 *desc, + UNISTR2 *wkstas, + UNISTR2 *unk_str, + UNISTR2 *mung_dial, + uchar lm_pwd[16], + uchar nt_pwd[16], + uint32 user_rid, + uint32 group_rid, + uint32 acb_info, + uint32 unknown_3, + uint16 logon_divs, + LOGON_HRS * hrs, + uint32 unknown_5, uint32 unknown_6) +{ + int len_user_name = user_name != NULL ? user_name->uni_str_len : 0; + int len_full_name = full_name != NULL ? full_name->uni_str_len : 0; + int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0; + int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0; + int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0; + int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0; + int len_description = desc != NULL ? desc->uni_str_len : 0; + int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0; + int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0; + int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0; + + usr->logon_time = *logon_time; + usr->logoff_time = *logoff_time; + usr->kickoff_time = *kickoff_time; + usr->pass_last_set_time = *pass_last_set_time; + usr->pass_can_change_time = *pass_can_change_time; + usr->pass_must_change_time = *pass_must_change_time; + + init_uni_hdr(&usr->hdr_user_name, len_user_name); + init_uni_hdr(&usr->hdr_full_name, len_full_name); + init_uni_hdr(&usr->hdr_home_dir, len_home_dir); + init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive); + init_uni_hdr(&usr->hdr_logon_script, len_logon_script); + init_uni_hdr(&usr->hdr_profile_path, len_profile_path); + init_uni_hdr(&usr->hdr_acct_desc, len_description); + init_uni_hdr(&usr->hdr_workstations, len_workstations); + init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str); + init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial); + + memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd)); + memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd)); + + usr->user_rid = user_rid; + usr->group_rid = group_rid; + usr->acb_info = acb_info; + usr->unknown_3 = unknown_3; /* 0x00ff ffff */ + + usr->logon_divs = logon_divs; /* should be 168 (hours/week) */ + usr->ptr_logon_hrs = hrs ? 1 : 0; + usr->unknown_5 = unknown_5; /* 0x0002 0000 */ + + ZERO_STRUCT(usr->padding1); + + copy_unistr2(&usr->uni_user_name, user_name); + copy_unistr2(&usr->uni_full_name, full_name); + copy_unistr2(&usr->uni_home_dir, home_dir); + copy_unistr2(&usr->uni_dir_drive, dir_drive); + copy_unistr2(&usr->uni_logon_script, log_scr); + copy_unistr2(&usr->uni_profile_path, prof_path); + copy_unistr2(&usr->uni_acct_desc, desc); + copy_unistr2(&usr->uni_workstations, wkstas); + copy_unistr2(&usr->uni_unknown_str, unk_str); + copy_unistr2(&usr->uni_munged_dial, mung_dial); + + usr->unknown_6 = unknown_6; /* 0x0000 04ec */ + usr->padding4 = 0; + + memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs)); +} + +/************************************************************************* + init_sam_user_info21 + + unknown_3 = 0x00ff ffff + unknown_5 = 0x0002 0000 + unknown_6 = 0x0000 04ec + + *************************************************************************/ + +void init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw) +{ + NTTIME logon_time, logoff_time, kickoff_time, + pass_last_set_time, pass_can_change_time, + pass_must_change_time; + + int len_user_name, len_full_name, len_home_dir, + len_dir_drive, len_logon_script, len_profile_path, + len_description, len_workstations, len_unknown_str, + len_munged_dial; + + char* user_name = pdb_get_username(pw); + char* full_name = pdb_get_fullname(pw); + char* home_dir = pdb_get_homedir(pw); + char* dir_drive = pdb_get_dirdrive(pw); + char* logon_script = pdb_get_logon_script(pw); + char* profile_path = pdb_get_profile_path(pw); + char* description = pdb_get_acct_desc(pw); + char* workstations = pdb_get_workstations(pw); + char* munged_dial = pdb_get_munged_dial(pw); + + len_user_name = user_name != NULL ? strlen(user_name )+1 : 0; + len_full_name = full_name != NULL ? strlen(full_name )+1 : 0; + len_home_dir = home_dir != NULL ? strlen(home_dir )+1 : 0; + len_dir_drive = dir_drive != NULL ? strlen(dir_drive )+1 : 0; + len_logon_script = logon_script != NULL ? strlen(logon_script)+1 : 0; + len_profile_path = profile_path != NULL ? strlen(profile_path)+1 : 0; + len_description = description != NULL ? strlen(description )+1 : 0; + len_workstations = workstations != NULL ? strlen(workstations)+1 : 0; + len_unknown_str = 0; + len_munged_dial = munged_dial != NULL ? strlen(munged_dial )+1 : 0; + + + /* Create NTTIME structs */ + unix_to_nt_time (&logon_time, pdb_get_logon_time(pw)); + unix_to_nt_time (&logoff_time, pdb_get_logoff_time(pw)); + unix_to_nt_time (&kickoff_time, pdb_get_kickoff_time(pw)); + unix_to_nt_time (&pass_last_set_time, pdb_get_pass_last_set_time(pw)); + unix_to_nt_time (&pass_can_change_time, pdb_get_pass_can_change_time(pw)); + unix_to_nt_time (&pass_must_change_time,pdb_get_pass_must_change_time(pw)); + + /* structure assignment */ + usr->logon_time = logon_time; + usr->logoff_time = logoff_time; + usr->kickoff_time = kickoff_time; + usr->pass_last_set_time = pass_last_set_time; + usr->pass_can_change_time = pass_can_change_time; + usr->pass_must_change_time = pass_must_change_time; + + init_uni_hdr(&usr->hdr_user_name, len_user_name); + init_uni_hdr(&usr->hdr_full_name, len_full_name); + init_uni_hdr(&usr->hdr_home_dir, len_home_dir); + init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive); + init_uni_hdr(&usr->hdr_logon_script, len_logon_script); + init_uni_hdr(&usr->hdr_profile_path, len_profile_path); + init_uni_hdr(&usr->hdr_acct_desc, len_description); + init_uni_hdr(&usr->hdr_workstations, len_workstations); + init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str); + init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial); + + ZERO_STRUCT(usr->nt_pwd); + ZERO_STRUCT(usr->lm_pwd); + + usr->user_rid = pdb_get_user_rid(pw); + usr->group_rid = pdb_get_group_rid(pw); + usr->acb_info = pdb_get_acct_ctrl(pw); + usr->unknown_3 = pdb_get_unknown3(pw); + + usr->logon_divs = pdb_get_logon_divs(pw); + usr->ptr_logon_hrs = pdb_get_hours(pw) ? 1 : 0; + usr->unknown_5 = pdb_get_unknown5(pw); /* 0x0002 0000 */ + + ZERO_STRUCT(usr->padding1); + + init_unistr2(&usr->uni_user_name, user_name, len_user_name); + init_unistr2(&usr->uni_full_name, full_name, len_full_name); + init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir); + init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive); + init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script); + init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path); + init_unistr2(&usr->uni_acct_desc, description, len_description); + init_unistr2(&usr->uni_workstations, workstations, len_workstations); + init_unistr2(&usr->uni_unknown_str, NULL, len_unknown_str); + init_unistr2(&usr->uni_munged_dial, munged_dial, len_munged_dial); + + usr->unknown_6 = pdb_get_unknown6(pw); + usr->padding4 = 0; + + if (pdb_get_hours(pw)) { + usr->logon_hrs.len = pdb_get_hours_len(pw); + memcpy(&usr->logon_hrs.hours, pdb_get_hours(pw), MAX_HOURS_LEN); + } else + memset(&usr->logon_hrs, 0xff, sizeof(usr->logon_hrs)); +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +static BOOL sam_io_user_info21(char *desc, SAM_USER_INFO_21 * usr, + prs_struct *ps, int depth) +{ + if (usr == NULL) + return False; + + prs_debug(ps, depth, desc, "sam_io_user_info21"); + depth++; + + if(!prs_align(ps)) return False; - if(!prs_align_needed(ps, usr->hdr_profile_path.buffer)) + + if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth)) return False; - if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */ + if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth)) return False; - if(!prs_align_needed(ps, usr->hdr_acct_desc.buffer)) + if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps,depth)) return False; - if(!smb_io_unistr2("uni_acct_desc", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */ + if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth)) return False; - if(!prs_align_needed(ps, usr->hdr_workstations.buffer)) + if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps,depth)) return False; - if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */ + if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth)) + return False; + + if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */ + return False; + if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */ + return False; + if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */ + return False; + if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */ + return False; + if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */ + return False; + if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */ + return False; + if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */ + return False; + if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */ + return False; + if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */ + return False; + if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */ + return False; + + if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd))) + return False; + if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd))) + return False; + + if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */ + return False; + if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */ + return False; + if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info)) return False; - if(!prs_align_needed(ps, usr->hdr_unknown_str.buffer)) + + if(!prs_uint32("unknown_3 ", ps, depth, &usr->unknown_3)) + return False; + if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */ + return False; + if(!prs_align(ps)) + return False; + if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs)) + return False; + if(!prs_uint32("unknown_5 ", ps, depth, &usr->unknown_5)) + return False; + + if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1))) + return False; + + /* here begins pointed-to data */ + + if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name,usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */ + return False; + if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */ + return False; + if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */ return False; - if(!smb_io_unistr2("uni_unknown_str", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */ + if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */ return False; - if(!prs_align_needed(ps, usr->hdr_munged_dial.buffer)) + if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */ + return False; + if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */ return False; - if(!smb_io_unistr2("uni_munged_dial", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */ + if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */ + return False; + if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */ + return False; + if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */ + return False; + if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */ return False; /* ok, this is only guess-work (as usual) */ if (usr->ptr_logon_hrs) { if(!prs_align(ps)) return False; - if(!prs_uint32("unknown_6", ps, depth, &usr->unknown_6)) + if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6)) return False; - if(!prs_uint32("padding4", ps, depth, &usr->padding4)) + if(!prs_uint32("padding4 ", ps, depth, &usr->padding4)) return False; if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth)) return False; @@ -4283,36 +5647,123 @@ static BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 *usr, prs_struct *ps } /******************************************************************* -reads or writes a structure. +inits a SAM_USERINFO_CTR structure. ********************************************************************/ -static BOOL sam_io_user_info24(char *desc, SAM_USER_INFO_24 *usr, prs_struct *ps, int depth) + +uint32 make_samr_userinfo_ctr_usr21(TALLOC_CTX *ctx, SAM_USERINFO_CTR * ctr, + uint16 switch_value, + SAM_USER_INFO_21 * usr) { - if (usr == NULL) - return False; + DEBUG(5, ("init_samr_userinfo_ctr\n")); - prs_debug(ps, depth, desc, "sam_io_user_info24"); - depth++; + ctr->switch_value = switch_value; + ctr->info.id = NULL; - if(!prs_align(ps)) - return False; + switch (switch_value) { + case 0x10: + ctr->info.id10 = (SAM_USER_INFO_10 *)talloc_zero(ctx,sizeof(SAM_USER_INFO_10)); + if (ctr->info.id10 == NULL) + return NT_STATUS_NO_MEMORY; - if(!prs_uint8s(False, "password", ps, depth, usr->pass, sizeof(usr->pass))) - return False; + init_sam_user_info10(ctr->info.id10, usr->acb_info); + break; +#if 0 +/* whoops - got this wrong. i think. or don't understand what's happening. */ + case 0x11: + { + NTTIME expire; + info = (void *)&id11; + + expire.low = 0xffffffff; + expire.high = 0x7fffffff; + + ctr->info.id = (SAM_USER_INFO_11 *) talloc_zero(ctx,sizeof(*ctr->info.id11)); + init_sam_user_info11(ctr->info.id11, &expire, + "BROOKFIELDS$", /* name */ + 0x03ef, /* user rid */ + 0x201, /* group rid */ + 0x0080); /* acb info */ - return True; + break; + } +#endif + case 0x12: + ctr->info.id12 = (SAM_USER_INFO_12 *)talloc_zero(ctx,sizeof(SAM_USER_INFO_12)); + if (ctr->info.id12 == NULL) + return NT_STATUS_NO_MEMORY; + + init_sam_user_info12(ctr->info.id12, usr->lm_pwd, usr->nt_pwd); + break; + case 21: + { + SAM_USER_INFO_21 *cusr; + cusr = (SAM_USER_INFO_21 *)talloc_zero(ctx,sizeof(SAM_USER_INFO_21)); + ctr->info.id21 = cusr; + if (ctr->info.id21 == NULL) + return NT_STATUS_NO_MEMORY; + memcpy(cusr, usr, sizeof(*usr)); + memset(cusr->lm_pwd, 0, sizeof(cusr->lm_pwd)); + memset(cusr->nt_pwd, 0, sizeof(cusr->nt_pwd)); + break; + } + default: + DEBUG(4,("make_samr_userinfo_ctr: unsupported info\n")); + return NT_STATUS_INVALID_INFO_CLASS; + } + + return NT_STATUS_NOPROBLEMO; +} + +/******************************************************************* +inits a SAM_USERINFO_CTR structure. +********************************************************************/ + +void init_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr, uchar * sess_key, + uint16 switch_value, void *info) +{ + DEBUG(5, ("init_samr_userinfo_ctr\n")); + + ctr->switch_value = switch_value; + ctr->info.id = info; + + switch (switch_value) { + case 0x18: + SamOEMhash(ctr->info.id24->pass, sess_key, 1); + dump_data(100, (char *)sess_key, 16); + dump_data(100, (char *)ctr->info.id24->pass, 516); + break; + case 0x17: + SamOEMhash(ctr->info.id23->pass, sess_key, 1); + dump_data(100, (char *)sess_key, 16); + dump_data(100, (char *)ctr->info.id23->pass, 516); + break; + default: + DEBUG(4,("init_samr_userinfo_ctr: unsupported switch level\n")); + } } /******************************************************************* reads or writes a structure. ********************************************************************/ -static BOOL samr_io_userinfo_ctr(char *desc, SAM_USERINFO_CTR *ctr, prs_struct *ps, int depth) + +static BOOL samr_io_userinfo_ctr(char *desc, SAM_USERINFO_CTR **ppctr, + prs_struct *ps, int depth) { - if (ctr == NULL) - return False; + BOOL ret; + SAM_USERINFO_CTR *ctr; prs_debug(ps, depth, desc, "samr_io_userinfo_ctr"); depth++; + if (UNMARSHALLING(ps)) { + ctr = (SAM_USERINFO_CTR *)prs_alloc_mem(ps,sizeof(SAM_USERINFO_CTR)); + if (ctr == NULL) + return False; + *ppctr = ctr; + } else { + ctr = *ppctr; + } + /* lkclXXXX DO NOT ALIGN BEFORE READING SWITCH VALUE! */ if(!prs_uint16("switch_value", ps, depth, &ctr->switch_value)) @@ -4320,91 +5771,150 @@ static BOOL samr_io_userinfo_ctr(char *desc, SAM_USERINFO_CTR *ctr, prs_struct * if(!prs_align(ps)) return False; + ret = False; + switch (ctr->switch_value) { - case 0x10: - if (UNMARSHALLING(ps)) /* reading */ - ctr->info.id10 = (SAM_USER_INFO_10 *)malloc(sizeof(SAM_USER_INFO_10)); - if (ctr->info.id10 == NULL) { - DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n")); - return False; - } - if(!sam_io_user_info10("", ctr->info.id10, ps, depth)) - return False; - break; - case 0x11: - if (UNMARSHALLING(ps)) /* reading */ - ctr->info.id11 = (SAM_USER_INFO_11 *)malloc(sizeof(SAM_USER_INFO_11)); - if (ctr->info.id11 == NULL) { - DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n")); - return False; - } - if(!sam_io_user_info11("", ctr->info.id11, ps, depth)) - return False; - break; - case 0x12: - if (UNMARSHALLING(ps)) /* reading */ - ctr->info.id12 = (SAM_USER_INFO_12 *)malloc(sizeof(SAM_USER_INFO_12)); - if (ctr->info.id12 == NULL) { - DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n")); - return False; - } - if(!sam_io_user_info12("", ctr->info.id12, ps, depth)) - return False; - break; - case 21: - if (UNMARSHALLING(ps)) /* reading */ - ctr->info.id21 = (SAM_USER_INFO_21 *)malloc(sizeof(SAM_USER_INFO_21)); - if (ctr->info.id21 == NULL) { - DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n")); - return False; - } - if(!sam_io_user_info21("", ctr->info.id21, ps, depth)) - return False; - break; - case 23: - if (UNMARSHALLING(ps)) /* reading */ - ctr->info.id23 = (SAM_USER_INFO_23 *)malloc(sizeof(SAM_USER_INFO_23)); - if (ctr->info.id23 == NULL) { - DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n")); - return False; - } - if(!sam_io_user_info23("", ctr->info.id23, ps, depth)) - return False; - break; - case 24: - if (UNMARSHALLING(ps)) /* reading */ - ctr->info.id24 = (SAM_USER_INFO_24 *)malloc(sizeof(SAM_USER_INFO_24)); - if (ctr->info.id24 == NULL) { - DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n")); - return False; - } - if(!sam_io_user_info24("", ctr->info.id24, ps, depth)) - return False; - break; - default: - DEBUG(2, ("samr_io_userinfo_ctr: unknown switch level 0x%x\n", ctr->switch_value)); + case 0x10: + if (UNMARSHALLING(ps)) + ctr->info.id10 = (SAM_USER_INFO_10 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_10)); + if (ctr->info.id10 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); + return False; + } + ret = sam_io_user_info10("", ctr->info.id10, ps, depth); + break; + case 0x11: + if (UNMARSHALLING(ps)) + ctr->info.id11 = (SAM_USER_INFO_11 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_11)); + + if (ctr->info.id11 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); + return False; + } + ret = sam_io_user_info11("", ctr->info.id11, ps, depth); + break; + case 0x12: + if (UNMARSHALLING(ps)) + ctr->info.id12 = (SAM_USER_INFO_12 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_12)); + + if (ctr->info.id12 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); + return False; + } + ret = sam_io_user_info12("", ctr->info.id12, ps, depth); + break; + case 21: + if (UNMARSHALLING(ps)) + ctr->info.id21 = (SAM_USER_INFO_21 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_21)); + + if (ctr->info.id21 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); + return False; + } + ret = sam_io_user_info21("", ctr->info.id21, ps, depth); + break; + case 23: + if (UNMARSHALLING(ps)) + ctr->info.id23 = (SAM_USER_INFO_23 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_23)); + + if (ctr->info.id23 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); return False; + } + ret = sam_io_user_info23("", ctr->info.id23, ps, depth); + break; + case 24: + if (UNMARSHALLING(ps)) + ctr->info.id24 = (SAM_USER_INFO_24 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_24)); + + if (ctr->info.id24 == NULL) { + DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n")); + return False; + } + ret = sam_io_user_info24("", ctr->info.id24, ps, depth); + break; + default: + DEBUG(2, ("samr_io_userinfo_ctr: unknown switch level 0x%x\n", ctr->switch_value)); + ret = False; + break; + } + + return ret; +} + +/******************************************************************* +inits a SAMR_R_QUERY_USERINFO structure. +********************************************************************/ + +void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO * r_u, + SAM_USERINFO_CTR * ctr, uint32 status) +{ + DEBUG(5, ("init_samr_r_query_userinfo\n")); + + r_u->ptr = 0; + r_u->ctr = NULL; + + if (status == 0) { + r_u->ptr = 1; + r_u->ctr = ctr; + } + + r_u->status = status; /* return status */ +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; + prs_debug(ps, depth, desc, "samr_io_r_query_userinfo"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr", ps, depth, &r_u->ptr)) + return False; + + if (r_u->ptr != 0) { + if(!samr_io_userinfo_ctr("ctr", &r_u->ctr, ps, depth)) + return False; } + if(!prs_align(ps)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + return True; } /******************************************************************* -frees a structure. +inits a SAMR_Q_SET_USERINFO structure. ********************************************************************/ -void free_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr) + +void init_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u, + POLICY_HND *hnd, unsigned char sess_key[16], + uint16 switch_value, void *info) { - if (ctr == NULL) - return; - safe_free(ctr->info.id); - ctr->info.id = NULL; + DEBUG(5, ("init_samr_q_set_userinfo\n")); + + q_u->pol = *hnd; + q_u->switch_value = switch_value; + init_samr_userinfo_ctr(q_u->ctr, sess_key, switch_value, info); } /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps, int depth) + +BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; @@ -4415,31 +5925,33 @@ BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps if(!prs_align(ps)) return False; - if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth)) - return False; + smb_io_pol_hnd("pol", &(q_u->pol), ps, depth); if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) return False; - if(!samr_io_userinfo_ctr("ctr", q_u->ctr, ps, depth)) + if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth)) return False; return True; } /******************************************************************* -frees a structure. +inits a SAMR_R_SET_USERINFO structure. ********************************************************************/ -void free_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u) + +void init_samr_r_set_userinfo(SAMR_R_SET_USERINFO * r_u, uint32 status) { - if (q_u == NULL) - return; - free_samr_userinfo_ctr(q_u->ctr); + DEBUG(5, ("init_samr_r_set_userinfo\n")); + + r_u->status = status; /* return status */ } /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO *r_u, prs_struct *ps, int depth) + +BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; @@ -4457,9 +5969,39 @@ BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO *r_u, prs_struct *ps } /******************************************************************* +inits a SAMR_Q_SET_USERINFO2 structure. +********************************************************************/ + +void init_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 * q_u, + POLICY_HND *hnd, unsigned char sess_key[16], + uint16 switch_value, SAM_USERINFO_CTR * ctr) +{ + DEBUG(5, ("init_samr_q_set_userinfo2\n")); + + q_u->pol = *hnd; + q_u->switch_value = switch_value; + q_u->ctr = ctr; + + if (q_u->ctr != NULL) + q_u->ctr->switch_value = switch_value; + + switch (switch_value) { + case 0x12: + SamOEMhash(ctr->info.id12->lm_pwd, sess_key, 0); + SamOEMhash(ctr->info.id12->nt_pwd, sess_key, 0); + dump_data(100, (char *)sess_key, 16); + dump_data(100, (char *)ctr->info.id12->lm_pwd, 16); + dump_data(100, (char *)ctr->info.id12->nt_pwd, 16); + break; + } +} + +/******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 *q_u, prs_struct *ps, int depth) + +BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 * q_u, + prs_struct *ps, int depth) { if (q_u == NULL) return False; @@ -4475,31 +6017,89 @@ BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 *q_u, prs_struct * if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) return False; - if(!samr_io_userinfo_ctr("ctr", q_u->ctr, ps, depth)) + if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth)) return False; return True; } /******************************************************************* -frees a structure. +inits a SAMR_R_SET_USERINFO2 structure. ********************************************************************/ -void free_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u) + +void init_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 * r_u, uint32 status) { - free_samr_userinfo_ctr(q_u->ctr); + DEBUG(5, ("init_samr_r_set_userinfo2\n")); + + r_u->status = status; /* return status */ } /******************************************************************* -makes a SAMR_R_SET_USERINFO2 structure. +reads or writes a structure. ********************************************************************/ -BOOL make_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 *r_u, uint32 status) + +BOOL samr_io_r_set_userinfo2(char *desc, SAMR_R_SET_USERINFO2 * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - DEBUG(5, ("make_samr_r_set_userinfo2\n")); + prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2"); + depth++; - r_u->status = status; /* return status */ + if(!prs_align(ps)) + return False; + + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; +} + +/******************************************************************* +inits a SAMR_Q_CONNECT structure. +********************************************************************/ + +void init_samr_q_connect(SAMR_Q_CONNECT * q_u, + char *srv_name, uint32 access_mask) +{ + int len_srv_name = strlen(srv_name); + + DEBUG(5, ("init_samr_q_connect\n")); + + /* make PDC server name \\server */ + q_u->ptr_srv_name = len_srv_name > 0 ? 1 : 0; + init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name + 1); + + /* example values: 0x0000 0002 */ + q_u->access_mask = access_mask; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_q_connect"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name)) + return False; + if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth)) + return False; + + if(!prs_align(ps)) + return False; + if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) + return False; return True; } @@ -4507,22 +6107,366 @@ BOOL make_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 *r_u, uint32 status) /******************************************************************* reads or writes a structure. ********************************************************************/ -BOOL samr_io_r_set_userinfo2(char *desc, SAMR_R_SET_USERINFO2 *r_u, prs_struct *ps, int depth) + +BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT * r_u, + prs_struct *ps, int depth) { if (r_u == NULL) return False; - prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2"); + prs_debug(ps, depth, desc, "samr_io_r_connect"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth)) + return False; + + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; +} + +/******************************************************************* +inits a SAMR_Q_CONNECT_ANON structure. +********************************************************************/ + +void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON * q_u) +{ + DEBUG(5, ("init_samr_q_connect_anon\n")); + + q_u->ptr = 1; + q_u->unknown_0 = 0x5c; /* server name (?!!) */ + q_u->unknown_1 = 0x01; + q_u->access_mask = 0x20; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_q_connect_anon"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr ", ps, depth, &q_u->ptr)) + return False; + if(!prs_uint16("unknown_0", ps, depth, &q_u->unknown_0)) + return False; + if(!prs_uint16("unknown_1", ps, depth, &q_u->unknown_1)) + return False; + if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask)) + return False; + + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_connect_anon"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth)) + return False; + + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; +} + +/******************************************************************* +inits a SAMR_Q_GET_DOM_PWINFO structure. +********************************************************************/ + +void init_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO * q_u, + char *srv_name) +{ + int len_srv_name = strlen(srv_name); + + DEBUG(5, ("init_samr_q_get_dom_pwinfo\n")); + + q_u->ptr = 1; + init_uni_hdr(&q_u->hdr_srv_name, len_srv_name); + init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name); +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_get_dom_pwinfo(char *desc, SAMR_Q_GET_DOM_PWINFO * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_q_get_dom_pwinfo"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr", ps, depth, &q_u->ptr)) + return False; + if (q_u->ptr != 0) { + if(!smb_io_unihdr("", &q_u->hdr_srv_name, ps, depth)) + return False; + if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->hdr_srv_name.buffer, ps, depth)) + return False; + } + + return True; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_get_dom_pwinfo(char *desc, SAMR_R_GET_DOM_PWINFO * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_get_dom_pwinfo"); depth++; if(!prs_align(ps)) return False; + if(!prs_uint16("unk_0", ps, depth, &r_u->unk_0)) + return False; + if(!prs_align(ps)) + return False; + if(!prs_uint16("unk_1", ps, depth, &r_u->unk_1)) + return False; + if(!prs_align(ps)) + return False; + if(!prs_uint16("unk_2", ps, depth, &r_u->unk_2)) + return False; + if(!prs_align(ps)) + return False; + if(!prs_uint32("status", ps, depth, &r_u->status)) return False; return True; } +/******************************************************************* +make a SAMR_ENC_PASSWD structure. +********************************************************************/ + +void init_enc_passwd(SAMR_ENC_PASSWD * pwd, char pass[512]) +{ + ZERO_STRUCTP(pwd); + + if (pass == NULL) { + pwd->ptr = 0; + } else { + pwd->ptr = 1; + memcpy(pwd->pass, pass, sizeof(pwd->pass)); + } +} + +/******************************************************************* +reads or writes a SAMR_ENC_PASSWD structure. +********************************************************************/ + +BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD * pwd, + prs_struct *ps, int depth) +{ + if (pwd == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_enc_passwd"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr", ps, depth, &pwd->ptr)) + return False; + + if (pwd->ptr != 0) { + if(!prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass))) + return False; + } + + return True; +} + +/******************************************************************* +inits a SAMR_ENC_HASH structure. +********************************************************************/ + +void init_enc_hash(SAMR_ENC_HASH * hsh, uchar hash[16]) +{ + ZERO_STRUCTP(hsh); + + if (hash == NULL) { + hsh->ptr = 0; + } else { + hsh->ptr = 1; + memcpy(hsh->hash, hash, sizeof(hsh->hash)); + } +} + +/******************************************************************* +reads or writes a SAMR_ENC_HASH structure. +********************************************************************/ + +BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH * hsh, + prs_struct *ps, int depth) +{ + if (hsh == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_enc_hash"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr ", ps, depth, &hsh->ptr)) + return False; + if (hsh->ptr != 0) { + if(!prs_uint8s(False, "hash", ps, depth, hsh->hash,sizeof(hsh->hash))) + return False; + } + + return True; +} + +/******************************************************************* +inits a SAMR_R_GET_DOM_PWINFO structure. +********************************************************************/ + +void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER * q_u, + char *dest_host, char *user_name, + char nt_newpass[516], + uchar nt_oldhash[16], + char lm_newpass[516], + uchar lm_oldhash[16]) +{ + int len_dest_host = strlen(dest_host); + int len_user_name = strlen(user_name); + + DEBUG(5, ("init_samr_q_chgpasswd_user\n")); + + q_u->ptr_0 = 1; + init_uni_hdr(&q_u->hdr_dest_host, len_dest_host); + init_unistr2(&q_u->uni_dest_host, dest_host, len_dest_host); + init_uni_hdr(&q_u->hdr_user_name, len_user_name); + init_unistr2(&q_u->uni_user_name, user_name, len_user_name); + + init_enc_passwd(&q_u->nt_newpass, nt_newpass); + init_enc_hash(&q_u->nt_oldhash, nt_oldhash); + + q_u->unknown = 0x01; + + init_enc_passwd(&q_u->lm_newpass, lm_newpass); + init_enc_hash(&q_u->lm_oldhash, lm_oldhash); +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER * q_u, + prs_struct *ps, int depth) +{ + if (q_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0)) + return False; + + if(!smb_io_unihdr("", &q_u->hdr_dest_host, ps, depth)) + return False; + if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth)) + return False; + + if(!prs_align(ps)) + return False; + if(!smb_io_unihdr("", &q_u->hdr_user_name, ps, depth)) + return False; + if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer,ps, depth)) + return False; + + if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth)) + return False; + if(!samr_io_enc_hash("nt_oldhash", &q_u->nt_oldhash, ps, depth)) + return False; + + if(!prs_uint32("unknown", ps, depth, &q_u->unknown)) + return False; + + if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth)) + return False; + if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth)) + return False; + + return True; +} + +/******************************************************************* +inits a SAMR_R_CHGPASSWD_USER structure. +********************************************************************/ + +void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER * r_u, uint32 status) +{ + DEBUG(5, ("init_r_chgpasswd_user\n")); + + r_u->status = status; +} + +/******************************************************************* +reads or writes a structure. +********************************************************************/ + +BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER * r_u, + prs_struct *ps, int depth) +{ + if (r_u == NULL) + return False; + + prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user"); + depth++; -#undef OLD_NTDOMAIN + if(!prs_align(ps)) + return False; + + if(!prs_uint32("status", ps, depth, &r_u->status)) + return False; + + return True; +} diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index 0073f22cab..7a4f0b57ef 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -5387,6 +5387,7 @@ BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value, } DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len)); + dump_data(10, (char *)(*param)->data, (*param)->data_len); return True; } diff --git a/source3/rpc_parse/parse_srv.c b/source3/rpc_parse/parse_srv.c index 3db3161ed5..55a0cd95e5 100644 --- a/source3/rpc_parse/parse_srv.c +++ b/source3/rpc_parse/parse_srv.c @@ -427,28 +427,6 @@ BOOL srv_io_r_net_share_enum(char *desc, SRV_R_NET_SHARE_ENUM *r_n, prs_struct * } /******************************************************************* - Frees a SRV_Q_NET_SHARE_GET_INFO structure. -********************************************************************/ - -void free_srv_q_net_share_get_info(SRV_Q_NET_SHARE_GET_INFO *q_n) -{ - if(!q_n) - return; - memset(q_n, '\0', sizeof(SRV_Q_NET_SHARE_GET_INFO)); -} - -/******************************************************************* - Frees a SRV_R_NET_SHARE_GET_INFO structure. -********************************************************************/ - -void free_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n) -{ - if(!r_n) - return; - memset(r_n, '\0', sizeof(SRV_R_NET_SHARE_GET_INFO)); -} - -/******************************************************************* Reads or writes a structure. ********************************************************************/ @@ -1586,6 +1564,45 @@ BOOL srv_io_r_net_file_enum(char *desc, SRV_R_NET_FILE_ENUM *r_n, prs_struct *ps } /******************************************************************* + Inits a SRV_INFO_100 structure. + ********************************************************************/ + +void init_srv_info_100(SRV_INFO_100 *sv100, uint32 platform_id, char *name) +{ + DEBUG(5,("init_srv_info_100\n")); + + sv100->platform_id = platform_id; + init_buf_unistr2(&sv100->uni_name, &sv100->ptr_name, name); +} + +/******************************************************************* + Reads or writes a SRV_INFO_101 structure. + ********************************************************************/ + +static BOOL srv_io_info_100(char *desc, SRV_INFO_100 *sv100, prs_struct *ps, int depth) +{ + if (sv100 == NULL) + return False; + + prs_debug(ps, depth, desc, "srv_io_info_100"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("platform_id ", ps, depth, &sv100->platform_id)) + return False; + if(!prs_uint32("ptr_name ", ps, depth, &sv100->ptr_name)) + return False; + + if(!smb_io_unistr2("uni_name ", &sv100->uni_name, True, ps, depth)) + return False; + + return True; +} + + +/******************************************************************* Inits a SRV_INFO_101 structure. ********************************************************************/ @@ -1754,6 +1771,10 @@ static BOOL srv_io_info_ctr(char *desc, SRV_INFO_CTR *ctr, prs_struct *ps, int d if (ctr->ptr_srv_ctr != 0 && ctr->switch_value != 0 && ctr != NULL) { switch (ctr->switch_value) { + case 100: + if(!srv_io_info_100("sv100", &ctr->srv.sv100, ps, depth)) + return False; + break; case 101: if(!srv_io_info_101("sv101", &ctr->srv.sv101, ps, depth)) return False; diff --git a/source3/rpc_server/srv_lsa.c b/source3/rpc_server/srv_lsa.c index 3b6725ec3a..b6a8c745a4 100644 --- a/source3/rpc_server/srv_lsa.c +++ b/source3/rpc_server/srv_lsa.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -293,5 +292,3 @@ BOOL api_ntlsa_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_ntlsa_rpc", api_lsa_cmds); } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_lsa_hnd.c b/source3/rpc_server/srv_lsa_hnd.c index 10b9bef1be..bcc3878d86 100644 --- a/source3/rpc_server/srv_lsa_hnd.c +++ b/source3/rpc_server/srv_lsa_hnd.c @@ -1,11 +1,10 @@ -#define OLD_NTDOMAIN 1 - /* * Unix SMB/Netbios implementation. * Version 1.9. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, + * Copyright (C) Jeremy Allison 2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,266 +25,145 @@ extern int DEBUGLEVEL; +/* This is the max handles per pipe. */ #ifndef MAX_OPEN_POLS -#define MAX_OPEN_POLS 2048 +#define MAX_OPEN_POLS 256 #endif -struct reg_info -{ - /* for use by \PIPE\winreg */ - fstring name; /* name of registry key */ -}; - -struct samr_info -{ - /* for use by the \PIPE\samr policy */ - DOM_SID sid; - uint32 status; /* some sort of flag. best to record it. comes from opnum 0x39 */ -}; - -static struct policy -{ - struct policy *next, *prev; - int pnum; - BOOL open; - POLICY_HND pol_hnd; - - union { - struct samr_info samr; - struct reg_info reg; - } dev; -} *Policy; - -static struct bitmap *bmap; - -static uint32 pol_hnd_low = 0; -static uint32 pol_hnd_high = 0; - -/******************************************************************* - Creates a POLICY_HND structure. -********************************************************************/ - -void create_policy_handle(POLICY_HND *hnd, uint32 *hnd_low, uint32 *hnd_high) -{ - if (hnd == NULL) return; - - (*hnd_low)++; - if (*hnd_low == 0) (*hnd_high)++; - - ZERO_STRUCTP(hnd); - - SIVAL(&hnd->data1, 0 , 0); /* first bit must be null */ - SIVAL(&hnd->data2, 0 , *hnd_low ); /* second bit is incrementing */ - SSVAL(&hnd->data3, 0 , *hnd_high); /* second bit is incrementing */ - SSVAL(&hnd->data4, 0 , (*hnd_high>>16)); /* second bit is incrementing */ - SIVAL(hnd->data5, 0, time(NULL)); /* something random */ - SIVAL(hnd->data5, 4, sys_getpid()); /* something more random */ -} - /**************************************************************************** initialise policy handle states... ****************************************************************************/ -void init_lsa_policy_hnd(void) + +void init_pipe_handles(pipes_struct *p) { - bmap = bitmap_allocate(MAX_OPEN_POLS); - if (!bmap) { - exit_server("out of memory in init_lsa_policy_hnd\n"); - } + p->pipe_handles.Policy = NULL; + p->pipe_handles.count = 0; } /**************************************************************************** find first available policy slot. creates a policy handle for you. ****************************************************************************/ -BOOL open_lsa_policy_hnd(POLICY_HND *hnd) + +BOOL create_policy_hnd(pipes_struct *p, POLICY_HND *hnd, void (*free_fn)(void *), void *data_ptr) { - int i; - struct policy *p; + static uint32 pol_hnd_low = 0; + static uint32 pol_hnd_high = 0; - i = bitmap_find(bmap, 1); + struct policy *pol; - if (i == -1) { - DEBUG(0,("ERROR: out of Policy Handles!\n")); + if (p->pipe_handles.count > MAX_OPEN_POLS) { + DEBUG(0,("create_policy_hnd: ERROR: too many handles (%d) on this pipe.\n", (int)p->pipe_handles.count)); return False; } - p = (struct policy *)malloc(sizeof(*p)); - if (!p) { - DEBUG(0,("ERROR: out of memory!\n")); + pol = (struct policy *)malloc(sizeof(*p)); + if (!pol) { + DEBUG(0,("create_policy_hnd: ERROR: out of memory!\n")); return False; } - ZERO_STRUCTP(p); + ZERO_STRUCTP(pol); + + pol->p = p; + pol->data_ptr = data_ptr; + pol->free_fn = free_fn; - p->open = True; - p->pnum = i; + pol_hnd_low++; + if (pol_hnd_low == 0) (pol_hnd_high)++; - create_policy_handle(hnd, &pol_hnd_low, &pol_hnd_high); - p->pol_hnd = *hnd; + SIVAL(&pol->pol_hnd.data1, 0 , 0); /* first bit must be null */ + SIVAL(&pol->pol_hnd.data2, 0 , pol_hnd_low ); /* second bit is incrementing */ + SSVAL(&pol->pol_hnd.data3, 0 , pol_hnd_high); /* second bit is incrementing */ + SSVAL(&pol->pol_hnd.data4, 0 , (pol_hnd_high>>16)); /* second bit is incrementing */ + SIVAL(pol->pol_hnd.data5, 0, time(NULL)); /* something random */ + SIVAL(pol->pol_hnd.data5, 4, sys_getpid()); /* something more random */ - bitmap_set(bmap, i); + DLIST_ADD(p->pipe_handles.Policy, pol); + p->pipe_handles.count++; - DLIST_ADD(Policy, p); + *hnd = pol->pol_hnd; - DEBUG(4,("Opened policy hnd[%x] ", i)); - dump_data(4, (char *)hnd, sizeof(hnd)); + DEBUG(4,("Opened policy hnd[%d] ", (int)p->pipe_handles.count)); + dump_data(4, (char *)hnd, sizeof(*hnd)); return True; } /**************************************************************************** - find policy by handle + find policy by handle - internal version. ****************************************************************************/ -static struct policy *find_lsa_policy(POLICY_HND *hnd) -{ - struct policy *p; - for (p=Policy;p;p=p->next) { - if (memcmp(&p->pol_hnd, hnd, sizeof(*hnd)) == 0) { - DEBUG(4,("Found policy hnd[%x] ", p->pnum)); - dump_data(4, (char *)hnd, sizeof(hnd)); - return p; +static struct policy *find_policy_by_hnd_internal(pipes_struct *p, POLICY_HND *hnd, void **data_p) +{ + struct policy *pol; + size_t i; + + if (data_p) + *data_p = NULL; + + for (i = 0, pol=p->pipe_handles.Policy;pol;pol=pol->next, i++) { + if (memcmp(&pol->pol_hnd, hnd, sizeof(*hnd)) == 0) { + DEBUG(4,("Found policy hnd[%d] ", (int)i)); + dump_data(4, (char *)hnd, sizeof(*hnd)); + if (data_p) + *data_p = pol->data_ptr; + return pol; } } DEBUG(4,("Policy not found: ")); - dump_data(4, (char *)hnd, sizeof(hnd)); + dump_data(4, (char *)hnd, sizeof(*hnd)); return NULL; } /**************************************************************************** - find policy index by handle + find policy by handle ****************************************************************************/ -int find_lsa_policy_by_hnd(POLICY_HND *hnd) -{ - struct policy *p = find_lsa_policy(hnd); - return p?p->pnum:-1; -} - - -/**************************************************************************** - set samr pol status. absolutely no idea what this is. -****************************************************************************/ -BOOL set_lsa_policy_samr_pol_status(POLICY_HND *hnd, uint32 pol_status) +BOOL find_policy_by_hnd(pipes_struct *p, POLICY_HND *hnd, void **data_p) { - struct policy *p = find_lsa_policy(hnd); - - if (p && p->open) { - DEBUG(3,("Setting policy status=%x pnum=%x\n", - pol_status, p->pnum)); - - p->dev.samr.status = pol_status; - return True; - } - - DEBUG(3,("Error setting policy status=%x\n", - pol_status)); - return False; + return find_policy_by_hnd_internal(p, hnd, data_p) == NULL ? False : True; } /**************************************************************************** - set samr sid + Close a policy. ****************************************************************************/ -BOOL set_lsa_policy_samr_sid(POLICY_HND *hnd, DOM_SID *sid) -{ - fstring sidstr; - struct policy *p = find_lsa_policy(hnd); - if (p && p->open) { - DEBUG(3,("Setting policy sid=%s pnum=%x\n", - sid_to_string(sidstr, sid), p->pnum)); - - memcpy(&p->dev.samr.sid, sid, sizeof(*sid)); - return True; - } - - DEBUG(3,("Error setting policy sid=%s\n", - sid_to_string(sidstr, sid))); - return False; -} - -/**************************************************************************** - get samr sid -****************************************************************************/ -BOOL get_lsa_policy_samr_sid(POLICY_HND *hnd, DOM_SID *sid) +BOOL close_policy_hnd(pipes_struct *p, POLICY_HND *hnd) { - struct policy *p = find_lsa_policy(hnd); + struct policy *pol = find_policy_by_hnd_internal(p, hnd, NULL); - if (p != NULL && p->open) { - fstring sidstr; - memcpy(sid, &p->dev.samr.sid, sizeof(*sid)); - DEBUG(3,("Getting policy sid=%s pnum=%x\n", - sid_to_string(sidstr, sid), p->pnum)); - - return True; + if (!pol) { + DEBUG(3,("Error closing policy\n")); + return False; } - DEBUG(3,("Error getting policy\n")); - return False; -} + DEBUG(3,("Closed policy\n")); -/**************************************************************************** - get samr rid -****************************************************************************/ -uint32 get_lsa_policy_samr_rid(POLICY_HND *hnd) -{ - struct policy *p = find_lsa_policy(hnd); + if (pol->free_fn && pol->data_ptr) + (*pol->free_fn)(pol->data_ptr); - if (p && p->open) { - uint32 rid = p->dev.samr.sid.sub_auths[p->dev.samr.sid.num_auths-1]; - DEBUG(3,("Getting policy device rid=%x pnum=%x\n", - rid, p->pnum)); + pol->p->pipe_handles.count--; - return rid; - } + DLIST_REMOVE(pol->p->pipe_handles.Policy, pol); - DEBUG(3,("Error getting policy\n")); - return 0xffffffff; -} + ZERO_STRUCTP(pol); -/**************************************************************************** - set reg name -****************************************************************************/ -BOOL set_lsa_policy_reg_name(POLICY_HND *hnd, fstring name) -{ - struct policy *p = find_lsa_policy(hnd); - - if (p && p->open) { - DEBUG(3,("Setting policy pnum=%x name=%s\n", - p->pnum, name)); + free(pol); - fstrcpy(p->dev.reg.name, name); - return True; - } - - DEBUG(3,("Error setting policy name=%s\n", name)); - return False; + return True; } /**************************************************************************** - close an lsa policy + Close all the pipe handles. ****************************************************************************/ -BOOL close_lsa_policy_hnd(POLICY_HND *hnd) -{ - struct policy *p = find_lsa_policy(hnd); - if (!p) { - DEBUG(3,("Error closing policy\n")); - return False; - } - - DEBUG(3,("Closed policy name pnum=%x\n", p->pnum)); - - DLIST_REMOVE(Policy, p); - - bitmap_clear(bmap, p->pnum); - - ZERO_STRUCTP(p); - - free(p); +void close_policy_by_pipe(pipes_struct *p) +{ + while (p->pipe_handles.Policy) + close_policy_hnd(p, &p->pipe_handles.Policy->pol_hnd); - return True; + p->pipe_handles.Policy = NULL; + p->pipe_handles.count = 0; } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_lsa_nt.c b/source3/rpc_server/srv_lsa_nt.c index ee2f38b715..8e1d934309 100644 --- a/source3/rpc_server/srv_lsa_nt.c +++ b/source3/rpc_server/srv_lsa_nt.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -275,9 +274,6 @@ static void init_reply_lookup_sids(LSA_R_LOOKUP_SIDS *r_l, r_l->status = NT_STATUS_NO_PROBLEMO; } -static uint32 lsa_hnd_low = 0; -static uint32 lsa_hnd_high = 0; - /*************************************************************************** _lsa_open_policy2. ***************************************************************************/ @@ -287,7 +283,8 @@ uint32 _lsa_open_policy2(pipes_struct *p, LSA_Q_OPEN_POL2 *q_u, LSA_R_OPEN_POL2 /* lkclXXXX having decoded it, ignore all fields in the open policy! */ /* set up the LSA QUERY INFO response */ - create_policy_handle(&r_u->pol, &lsa_hnd_low, &lsa_hnd_high); + if (!create_policy_hnd(p, &r_u->pol, NULL, NULL)) + return NT_STATUS_OBJECT_NAME_NOT_FOUND; return NT_STATUS_NOPROBLEMO; } @@ -301,7 +298,8 @@ uint32 _lsa_open_policy(pipes_struct *p, LSA_Q_OPEN_POL *q_u, LSA_R_OPEN_POL *r_ /* lkclXXXX having decoded it, ignore all fields in the open policy! */ /* set up the LSA QUERY INFO response */ - create_policy_handle(&r_u->pol, &lsa_hnd_low, &lsa_hnd_high); + if (!create_policy_hnd(p, &r_u->pol, NULL, NULL)) + return NT_STATUS_OBJECT_NAME_NOT_FOUND; return NT_STATUS_NOPROBLEMO; } @@ -316,6 +314,9 @@ uint32 _lsa_enum_trust_dom(pipes_struct *p, LSA_Q_ENUM_TRUST_DOM *q_u, LSA_R_ENU char *dom_name = NULL; DOM_SID *dom_sid = NULL; + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) + return NT_STATUS_INVALID_HANDLE; + /* set up the LSA QUERY INFO response */ init_r_enum_trust_dom(r_u, enum_context, dom_name, dom_sid, dom_name != NULL ? NT_STATUS_NO_PROBLEMO : NT_STATUS_UNABLE_TO_FREE_VM); @@ -336,6 +337,9 @@ uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO r_u->status = NT_STATUS_NO_PROBLEMO; + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) + return NT_STATUS_INVALID_HANDLE; + switch (q_u->info_class) { case 0x02: { @@ -420,6 +424,9 @@ uint32 _lsa_lookup_sids(pipes_struct *p, LSA_Q_LOOKUP_SIDS *q_u, LSA_R_LOOKUP_SI LSA_TRANS_NAME_ENUM *names = NULL; uint32 mapped_count = 0; + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) + return NT_STATUS_INVALID_HANDLE; + ref = (DOM_R_REF *)talloc_zero(p->mem_ctx, sizeof(DOM_R_REF)); names = (LSA_TRANS_NAME_ENUM *)talloc_zero(p->mem_ctx, sizeof(LSA_TRANS_NAME_ENUM)); @@ -445,6 +452,9 @@ uint32 _lsa_lookup_names(pipes_struct *p,LSA_Q_LOOKUP_NAMES *q_u, LSA_R_LOOKUP_N DOM_RID2 *rids; uint32 mapped_count = 0; + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) + return NT_STATUS_INVALID_HANDLE; + ref = (DOM_R_REF *)talloc_zero(p->mem_ctx, sizeof(DOM_R_REF)); rids = (DOM_RID2 *)talloc_zero(p->mem_ctx, sizeof(DOM_RID2)*MAX_LOOKUP_SIDS); @@ -464,6 +474,10 @@ uint32 _lsa_lookup_names(pipes_struct *p,LSA_Q_LOOKUP_NAMES *q_u, LSA_R_LOOKUP_N uint32 _lsa_close(pipes_struct *p, LSA_Q_CLOSE *q_u, LSA_R_CLOSE *r_u) { + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) + return NT_STATUS_INVALID_HANDLE; + + close_policy_hnd(p, &q_u->pol); return NT_STATUS_NO_PROBLEMO; } @@ -475,4 +489,3 @@ uint32 _lsa_open_secret(pipes_struct *p, LSA_Q_OPEN_SECRET *q_u, LSA_R_OPEN_SECR { return NT_STATUS_OBJECT_NAME_NOT_FOUND; } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_netlog.c b/source3/rpc_server/srv_netlog.c index 8e2b3819cb..01d646bf57 100644 --- a/source3/rpc_server/srv_netlog.c +++ b/source3/rpc_server/srv_netlog.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -6,7 +5,7 @@ * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, * Copyright (C) Paul Ashton 1997. - * Copyright (C) Jeremy Allison 1998. + * Copyright (C) Jeremy Allison 1998-2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,344 +22,39 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* This is the interface to the netlogon pipe. */ + #include "includes.h" extern int DEBUGLEVEL; -extern BOOL sam_logon_in_ssb; -extern pstring samlogon_user; -extern pstring global_myname; -extern DOM_SID global_sam_sid; - -/************************************************************************* - init_net_r_req_chal: - *************************************************************************/ - -static void init_net_r_req_chal(NET_R_REQ_CHAL *r_c, - DOM_CHAL *srv_chal, int status) -{ - DEBUG(6,("init_net_r_req_chal: %d\n", __LINE__)); - memcpy(r_c->srv_chal.data, srv_chal->data, sizeof(srv_chal->data)); - r_c->status = status; -} - -/************************************************************************* - net_reply_req_chal: - *************************************************************************/ - -static BOOL net_reply_req_chal(NET_Q_REQ_CHAL *q_c, prs_struct *rdata, - DOM_CHAL *srv_chal, uint32 srv_time) -{ - NET_R_REQ_CHAL r_c; - - DEBUG(6,("net_reply_req_chal: %d\n", __LINE__)); - - /* set up the LSA REQUEST CHALLENGE response */ - init_net_r_req_chal(&r_c, srv_chal, srv_time); - - /* store the response in the SMB stream */ - if(!net_io_r_req_chal("", &r_c, rdata, 0)) { - DEBUG(0,("net_reply_req_chal: Failed to marshall NET_R_REQ_CHAL.\n")); - return False; - } - - DEBUG(6,("net_reply_req_chal: %d\n", __LINE__)); - - return True; -} - -/************************************************************************* - net_reply_logon_ctrl2: - *************************************************************************/ - -static BOOL net_reply_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, prs_struct *rdata, - uint32 flags, uint32 pdc_status, uint32 logon_attempts, - uint32 tc_status, char *trust_domain_name) -{ - NET_R_LOGON_CTRL2 r_l; - - DEBUG(6,("net_reply_logon_ctrl2: %d\n", __LINE__)); - - /* set up the Logon Control2 response */ - init_r_logon_ctrl2(&r_l, q_l->query_level, - flags, pdc_status, logon_attempts, - tc_status, trust_domain_name); - - /* store the response in the SMB stream */ - if(!net_io_r_logon_ctrl2("", &r_l, rdata, 0)) { - DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2.\n")); - return False; - } - - DEBUG(6,("net_reply_logon_ctrl2: %d\n", __LINE__)); - - return True; -} - -/************************************************************************* - net_reply_trust_dom_list: - *************************************************************************/ - -static BOOL net_reply_trust_dom_list(NET_Q_TRUST_DOM_LIST *q_t, prs_struct *rdata, - uint32 num_trust_domains, char *trust_domain_name) -{ - NET_R_TRUST_DOM_LIST r_t; - - DEBUG(6,("net_reply_trust_dom_list: %d\n", __LINE__)); - - /* set up the Trusted Domain List response */ - init_r_trust_dom(&r_t, num_trust_domains, trust_domain_name); - - /* store the response in the SMB stream */ - if(!net_io_r_trust_dom("", &r_t, rdata, 0)) { - DEBUG(0,("net_reply_trust_dom_list: Failed to marshall NET_R_TRUST_DOM_LIST.\n")); - return False; - } - - DEBUG(6,("net_reply_trust_dom_listlogon_ctrl2: %d\n", __LINE__)); - - return True; -} - -/************************************************************************* - init_net_r_auth_2: - *************************************************************************/ - -static void init_net_r_auth_2(NET_R_AUTH_2 *r_a, - DOM_CHAL *resp_cred, NEG_FLAGS *flgs, int status) -{ - memcpy(r_a->srv_chal.data, resp_cred->data, sizeof(resp_cred->data)); - memcpy(&r_a->srv_flgs, flgs, sizeof(r_a->srv_flgs)); - r_a->status = status; -} - -/************************************************************************ - net_reply_auth_2: - *************************************************************************/ - -static BOOL net_reply_auth_2(NET_Q_AUTH_2 *q_a, prs_struct *rdata, - DOM_CHAL *resp_cred, int status) -{ - NET_R_AUTH_2 r_a; - NEG_FLAGS srv_flgs; - - srv_flgs.neg_flags = 0x000001ff; - - /* set up the LSA AUTH 2 response */ - - init_net_r_auth_2(&r_a, resp_cred, &srv_flgs, status); - - /* store the response in the SMB stream */ - if(!net_io_r_auth_2("", &r_a, rdata, 0)) { - DEBUG(0,("net_reply_auth_2: Failed to marshall NET_R_AUTH_2.\n")); - return False; - } - - return True; -} - -/*********************************************************************************** - init_net_r_srv_pwset: - ***********************************************************************************/ - -static void init_net_r_srv_pwset(NET_R_SRV_PWSET *r_s, - DOM_CRED *srv_cred, int status) -{ - DEBUG(5,("init_net_r_srv_pwset: %d\n", __LINE__)); - - memcpy(&r_s->srv_cred, srv_cred, sizeof(r_s->srv_cred)); - r_s->status = status; - - DEBUG(5,("init_net_r_srv_pwset: %d\n", __LINE__)); -} - -/************************************************************************* - net_reply_srv_pwset: - *************************************************************************/ - -static BOOL net_reply_srv_pwset(NET_Q_SRV_PWSET *q_s, prs_struct *rdata, - DOM_CRED *srv_cred, int status) -{ - NET_R_SRV_PWSET r_s; - - DEBUG(5,("net_srv_pwset: %d\n", __LINE__)); - - /* set up the LSA Server Password Set response */ - init_net_r_srv_pwset(&r_s, srv_cred, status); - - /* store the response in the SMB stream */ - if(!net_io_r_srv_pwset("", &r_s, rdata, 0)) { - DEBUG(0,("net_reply_srv_pwset: Failed to marshall NET_R_SRV_PWSET.\n")); - return False; - } - - DEBUG(5,("net_srv_pwset: %d\n", __LINE__)); - - return True; -} - -/************************************************************************* - net_reply_sam_logon: - *************************************************************************/ - -static BOOL net_reply_sam_logon(NET_Q_SAM_LOGON *q_s, prs_struct *rdata, - DOM_CRED *srv_cred, NET_USER_INFO_3 *user_info, - uint32 status) -{ - NET_R_SAM_LOGON r_s; - - /* XXXX maybe we want to say 'no', reject the client's credentials */ - r_s.buffer_creds = 1; /* yes, we have valid server credentials */ - memcpy(&r_s.srv_creds, srv_cred, sizeof(r_s.srv_creds)); - - /* store the user information, if there is any. */ - r_s.user = user_info; - if (status == 0x0 && user_info != NULL && user_info->ptr_user_info != 0) - r_s.switch_value = 3; /* indicates type of validation user info */ - else - r_s.switch_value = 0; /* indicates no info */ - - r_s.status = status; - r_s.auth_resp = 1; /* authoritative response */ - - /* store the response in the SMB stream */ - if(!net_io_r_sam_logon("", &r_s, rdata, 0)) { - DEBUG(0,("net_reply_sam_logon: Failed to marshall NET_R_SAM_LOGON.\n")); - return False; - } - - return True; -} - - -/************************************************************************* - net_reply_sam_logoff: - *************************************************************************/ - -static BOOL net_reply_sam_logoff(NET_Q_SAM_LOGOFF *q_s, prs_struct *rdata, - DOM_CRED *srv_cred, - uint32 status) -{ - NET_R_SAM_LOGOFF r_s; - - /* XXXX maybe we want to say 'no', reject the client's credentials */ - r_s.buffer_creds = 1; /* yes, we have valid server credentials */ - memcpy(&r_s.srv_creds, srv_cred, sizeof(r_s.srv_creds)); - - r_s.status = status; - - /* store the response in the SMB stream */ - if(!net_io_r_sam_logoff("", &r_s, rdata, 0)) { - DEBUG(0,("net_reply_sam_logoff: Failed to marshall NET_R_SAM_LOGOFF.\n")); - return False; - } - - return True; -} - -/****************************************************************** - gets a machine password entry. checks access rights of the host. - ******************************************************************/ - -static BOOL get_md4pw(char *md4pw, char *mach_name, char *mach_acct) -{ - SAM_ACCOUNT *sampass = NULL; - BYTE *pass = NULL; - -#if 0 - /* - * Currently this code is redundent as we already have a filter - * by hostname list. What this code really needs to do is to - * get a hosts allowed/hosts denied list from the SAM database - * on a per user basis, and make the access decision there. - * I will leave this code here for now as a reminder to implement - * this at a later date. JRA. - */ - - if (!allow_access(lp_domain_hostsdeny(), lp_domain_hostsallow(), - client_name(), client_addr())) - { - DEBUG(0,("get_md4pw: Workstation %s denied access to domain\n", mach_acct)); - return False; - } -#endif /* 0 */ - - become_root(); - sampass = pdb_getsampwnam(mach_acct); - unbecome_root(); - - if ((sampass) != NULL && !(pdb_get_acct_ctrl(sampass) & ACB_DISABLED) && - ((pass=pdb_get_nt_passwd(sampass)) != NULL)) - { - memcpy(md4pw, pass, 16); - dump_data(5, md4pw, 16); - - return True; - } - DEBUG(0,("get_md4pw: Workstation %s: no account in domain\n", mach_acct)); - return False; -} - /************************************************************************* api_net_req_chal: *************************************************************************/ static BOOL api_net_req_chal(pipes_struct *p) { - NET_Q_REQ_CHAL q_r; - uint32 status = 0x0; - uint16 vuid = p->vuid; + NET_Q_REQ_CHAL q_u; + NET_R_REQ_CHAL r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - fstring mach_acct; - fstring mach_name; - - user_struct *vuser; - - DEBUG(5,("api_net_req_chal(%d): vuid %d\n", __LINE__, (int)vuid)); - - if ((vuser = get_valid_user_struct(vuid)) == NULL) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); /* grab the challenge... */ - if(!net_io_q_req_chal("", &q_r, data, 0)) { + if(!net_io_q_req_chal("", &q_u, data, 0)) { DEBUG(0,("api_net_req_chal: Failed to unmarshall NET_Q_REQ_CHAL.\n")); return False; } - fstrcpy(mach_acct, dos_unistrn2(q_r.uni_logon_clnt.buffer, - q_r.uni_logon_clnt.uni_str_len)); - - fstrcpy(mach_name, mach_acct); - strlower(mach_name); - - fstrcat(mach_acct, "$"); + r_u.status = _net_req_chal(p, &q_u, &r_u); - if (get_md4pw((char *)vuser->dc.md4pw, mach_name, mach_acct)) { - /* copy the client credentials */ - memcpy(vuser->dc.clnt_chal.data , q_r.clnt_chal.data, sizeof(q_r.clnt_chal.data)); - memcpy(vuser->dc.clnt_cred.challenge.data, q_r.clnt_chal.data, sizeof(q_r.clnt_chal.data)); - - /* create a server challenge for the client */ - /* Set these to random values. */ - generate_random_buffer(vuser->dc.srv_chal.data, 8, False); - - memcpy(vuser->dc.srv_cred.challenge.data, vuser->dc.srv_chal.data, 8); - - memset((char *)vuser->dc.sess_key, '\0', sizeof(vuser->dc.sess_key)); - - /* from client / server challenges and md4 password, generate sess key */ - cred_session_key(&(vuser->dc.clnt_chal), &(vuser->dc.srv_chal), - (char *)vuser->dc.md4pw, vuser->dc.sess_key); - } else { - /* lkclXXXX take a guess at a good error message to return :-) */ - status = NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT; - } - - /* construct reply. */ - if(!net_reply_req_chal(&q_r, rdata, &vuser->dc.srv_chal, status)) + /* store the response in the SMB stream */ + if(!net_io_r_req_chal("", &r_u, rdata, 0)) { + DEBUG(0,("api_net_req_chal: Failed to marshall NET_R_REQ_CHAL.\n")); return False; + } return True; } @@ -371,270 +65,90 @@ static BOOL api_net_req_chal(pipes_struct *p) static BOOL api_net_auth_2(pipes_struct *p) { - uint16 vuid = p->vuid; - NET_Q_AUTH_2 q_a; - uint32 status = 0x0; + NET_Q_AUTH_2 q_u; + NET_R_AUTH_2 r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - DOM_CHAL srv_cred; - UTIME srv_time; - - user_struct *vuser; - - if ((vuser = get_valid_user_struct(vuid)) == NULL) - return False; - - srv_time.time = 0; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); /* grab the challenge... */ - if(!net_io_q_auth_2("", &q_a, data, 0)) { + if(!net_io_q_auth_2("", &q_u, data, 0)) { DEBUG(0,("api_net_auth_2: Failed to unmarshall NET_Q_AUTH_2.\n")); return False; } - /* check that the client credentials are valid */ - if (cred_assert(&(q_a.clnt_chal), vuser->dc.sess_key, - &(vuser->dc.clnt_cred.challenge), srv_time)) { - - /* create server challenge for inclusion in the reply */ - cred_create(vuser->dc.sess_key, &(vuser->dc.srv_cred.challenge), srv_time, &srv_cred); - - /* copy the received client credentials for use next time */ - memcpy(vuser->dc.clnt_cred.challenge.data, q_a.clnt_chal.data, sizeof(q_a.clnt_chal.data)); - memcpy(vuser->dc.srv_cred .challenge.data, q_a.clnt_chal.data, sizeof(q_a.clnt_chal.data)); - } else { - status = NT_STATUS_ACCESS_DENIED; - } + r_u.status = _net_auth_2(p, &q_u, &r_u); - /* construct reply. */ - if(!net_reply_auth_2(&q_a, rdata, &srv_cred, status)) + /* store the response in the SMB stream */ + if(!net_io_r_auth_2("", &r_u, rdata, 0)) { + DEBUG(0,("api_net_auth_2: Failed to marshall NET_R_AUTH_2.\n")); return False; + } return True; } - /************************************************************************* api_net_srv_pwset: *************************************************************************/ static BOOL api_net_srv_pwset(pipes_struct *p) { - uint16 vuid = p->vuid; - NET_Q_SRV_PWSET q_a; - uint32 status = NT_STATUS_WRONG_PASSWORD; - DOM_CRED srv_cred; - pstring mach_acct; - SAM_ACCOUNT *sampass; - BOOL ret; - user_struct *vuser; + NET_Q_SRV_PWSET q_u; + NET_R_SRV_PWSET r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - if ((vuser = get_valid_user_struct(vuid)) == NULL) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); /* grab the challenge and encrypted password ... */ - if(!net_io_q_srv_pwset("", &q_a, data, 0)) { + if(!net_io_q_srv_pwset("", &q_u, data, 0)) { DEBUG(0,("api_net_srv_pwset: Failed to unmarshall NET_Q_SRV_PWSET.\n")); return False; } - /* checks and updates credentials. creates reply credentials */ - if (deal_with_creds(vuser->dc.sess_key, &(vuser->dc.clnt_cred), - &(q_a.clnt_id.cred), &srv_cred)) - { - memcpy(&(vuser->dc.srv_cred), &(vuser->dc.clnt_cred), sizeof(vuser->dc.clnt_cred)); - - DEBUG(5,("api_net_srv_pwset: %d\n", __LINE__)); - - pstrcpy(mach_acct, dos_unistrn2(q_a.clnt_id.login.uni_acct_name.buffer, - q_a.clnt_id.login.uni_acct_name.uni_str_len)); - - DEBUG(3,("Server Password Set Wksta:[%s]\n", mach_acct)); - - become_root(); - sampass = pdb_getsampwnam(mach_acct); - unbecome_root(); - - if (sampass != NULL) { - unsigned char pwd[16]; - int i; - - DEBUG(100,("Server password set : new given value was :\n")); - for(i = 0; i < 16; i++) - DEBUG(100,("%02X ", q_a.pwd[i])); - DEBUG(100,("\n")); - - cred_hash3( pwd, q_a.pwd, vuser->dc.sess_key, 0); - - /* lies! nt and lm passwords are _not_ the same: don't care */ - pdb_set_lanman_passwd (sampass, pwd); - pdb_set_nt_passwd (sampass, pwd); - pdb_set_acct_ctrl (sampass, ACB_WSTRUST); - - become_root(); - ret = pdb_update_sam_account (sampass,False); - unbecome_root(); - - if (ret) { - /* hooray! */ - status = 0x0; - } - } - - DEBUG(5,("api_net_srv_pwset: %d\n", __LINE__)); + r_u.status = _net_srv_pwset(p, &q_u, &r_u); - } else { - /* lkclXXXX take a guess at a sensible error code to return... */ - status = NT_STATUS_NETWORK_CREDENTIAL_CONFLICT; - } - - /* Construct reply. */ - if(!net_reply_srv_pwset(&q_a, rdata, &srv_cred, status)) + /* store the response in the SMB stream */ + if(!net_io_r_srv_pwset("", &r_u, rdata, 0)) { + DEBUG(0,("api_net_srv_pwset: Failed to marshall NET_R_SRV_PWSET.\n")); return False; + } return True; } - /************************************************************************* api_net_sam_logoff: *************************************************************************/ static BOOL api_net_sam_logoff(pipes_struct *p) { - uint16 vuid = p->vuid; - NET_Q_SAM_LOGOFF q_l; - NET_ID_INFO_CTR ctr; - DOM_CRED srv_cred; + NET_Q_SAM_LOGOFF q_u; + NET_R_SAM_LOGOFF r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - user_struct *vuser; - - if ((vuser = get_valid_user_struct(vuid)) == NULL) - return False; - - /* the DOM_ID_INFO_1 structure is a bit big. plus we might want to - dynamically allocate it inside net_io_q_sam_logon, at some point */ - q_l.sam_id.ctr = &ctr; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* grab the challenge... */ - if(!net_io_q_sam_logoff("", &q_l, data, 0)) { + if(!net_io_q_sam_logoff("", &q_u, data, 0)) { DEBUG(0,("api_net_sam_logoff: Failed to unmarshall NET_Q_SAM_LOGOFF.\n")); return False; } - /* checks and updates credentials. creates reply credentials */ - deal_with_creds(vuser->dc.sess_key, &vuser->dc.clnt_cred, - &q_l.sam_id.client.cred, &srv_cred); - memcpy(&vuser->dc.srv_cred, &vuser->dc.clnt_cred, sizeof(vuser->dc.clnt_cred)); + r_u.status = _net_sam_logoff(p, &q_u, &r_u); - /* construct reply. always indicate success */ - if(!net_reply_sam_logoff(&q_l, rdata, &srv_cred, 0x0)) + /* store the response in the SMB stream */ + if(!net_io_r_sam_logoff("", &r_u, rdata, 0)) { + DEBUG(0,("api_net_sam_logoff: Failed to marshall NET_R_SAM_LOGOFF.\n")); return False; - - return True; -} - -/************************************************************************* - net_login_interactive: - *************************************************************************/ - -static uint32 net_login_interactive(NET_ID_INFO_1 *id1, SAM_ACCOUNT *sampass, - user_struct *vuser) -{ - uint32 status = 0x0; - - char nt_pwd[16]; - char lm_pwd[16]; - unsigned char key[16]; - - memset(key, 0, 16); - memcpy(key, vuser->dc.sess_key, 8); - - memcpy(lm_pwd, id1->lm_owf.data, 16); - memcpy(nt_pwd, id1->nt_owf.data, 16); - -#ifdef DEBUG_PASSWORD - DEBUG(100,("key:")); - dump_data(100, (char *)key, 16); - - DEBUG(100,("lm owf password:")); - dump_data(100, lm_pwd, 16); - - DEBUG(100,("nt owf password:")); - dump_data(100, nt_pwd, 16); -#endif - - SamOEMhash((uchar *)lm_pwd, key, False); - SamOEMhash((uchar *)nt_pwd, key, False); - -#ifdef DEBUG_PASSWORD - DEBUG(100,("decrypt of lm owf password:")); - dump_data(100, lm_pwd, 16); - - DEBUG(100,("decrypt of nt owf password:")); - dump_data(100, nt_pwd, 16); -#endif - - if (memcmp(pdb_get_lanman_passwd(sampass) ,lm_pwd, 16) != 0 || - memcmp(pdb_get_nt_passwd(sampass) ,nt_pwd, 16) != 0) - { - status = NT_STATUS_WRONG_PASSWORD; } - return status; -} - -/************************************************************************* - net_login_network: - *************************************************************************/ - -static uint32 net_login_network(NET_ID_INFO_2 *id2, SAM_ACCOUNT *sampass) -{ - BYTE *nt_pwd, *lanman_pwd; - - DEBUG(5,("net_login_network: lm_len: %d nt_len: %d\n", - id2->hdr_lm_chal_resp.str_str_len, - id2->hdr_nt_chal_resp.str_str_len)); - - /* JRA. Check the NT password first if it exists - this is a higher quality - password, if it exists and it doesn't match - fail. */ - - nt_pwd = pdb_get_nt_passwd (sampass); - lanman_pwd = pdb_get_lanman_passwd (sampass); - if (id2->hdr_nt_chal_resp.str_str_len == 24 && - nt_pwd != NULL) - { - if(smb_password_check((char *)id2->nt_chal_resp.buffer, nt_pwd, - id2->lm_chal)) - return 0x0; - else - return NT_STATUS_WRONG_PASSWORD; - } - - /* lkclXXXX this is not a good place to put disabling of LM hashes in. - if that is to be done, first move this entire function into a - library routine that calls the two smb_password_check() functions. - if disabling LM hashes (which nt can do for security reasons) then - an attempt should be made to disable them everywhere (which nt does - not do, for various security-hole reasons). - */ - - if (id2->hdr_lm_chal_resp.str_str_len == 24 && - smb_password_check((char *)id2->lm_chal_resp.buffer, - lanman_pwd, id2->lm_chal)) - { - return 0x0; - } - - - /* oops! neither password check succeeded */ - - return NT_STATUS_WRONG_PASSWORD; + return True; } /************************************************************************* @@ -643,284 +157,94 @@ static uint32 net_login_network(NET_ID_INFO_2 *id2, SAM_ACCOUNT *sampass) static BOOL api_net_sam_logon(pipes_struct *p) { - uint16 vuid = p->vuid; - NET_Q_SAM_LOGON q_l; - NET_ID_INFO_CTR ctr; - NET_USER_INFO_3 usr_info; - uint32 status = 0x0; - DOM_CRED srv_cred; - SAM_ACCOUNT *sampass = NULL; - uint16 acct_ctrl; - UNISTR2 *uni_samlogon_user = NULL; - fstring nt_username; - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - user_struct *vuser = NULL; - - if ((vuser = get_valid_user_struct(vuid)) == NULL) - return False; - - ZERO_STRUCT(q_l); - ZERO_STRUCT(ctr); - ZERO_STRUCT(usr_info); - - q_l.sam_id.ctr = &ctr; + NET_Q_SAM_LOGON q_u; + NET_R_SAM_LOGON r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - if(!net_io_q_sam_logon("", &q_l, data, 0)) { + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if(!net_io_q_sam_logon("", &q_u, data, 0)) { DEBUG(0, ("api_net_sam_logon: Failed to unmarshall NET_Q_SAM_LOGON.\n")); return False; } - - /* checks and updates credentials. creates reply credentials */ - if (!deal_with_creds(vuser->dc.sess_key, &vuser->dc.clnt_cred, &q_l.sam_id.client.cred, &srv_cred)) - status = NT_STATUS_INVALID_HANDLE; - else - memcpy(&vuser->dc.srv_cred, &vuser->dc.clnt_cred, sizeof(vuser->dc.clnt_cred)); - - /* find the username */ - - if (status == 0) { - switch (q_l.sam_id.logon_level) { - case INTERACTIVE_LOGON_TYPE: - uni_samlogon_user = &q_l.sam_id.ctr->auth.id1.uni_user_name; - - DEBUG(3,("SAM Logon (Interactive). Domain:[%s]. ", lp_workgroup())); - break; - case NET_LOGON_TYPE: - uni_samlogon_user = &q_l.sam_id.ctr->auth.id2.uni_user_name; - - DEBUG(3,("SAM Logon (Network). Domain:[%s]. ", lp_workgroup())); - break; - default: - DEBUG(2,("SAM Logon: unsupported switch value\n")); - status = NT_STATUS_INVALID_INFO_CLASS; - break; - } /* end switch */ - } /* end if status == 0 */ - - /* check username exists */ - - if (status == 0) - { - pstrcpy(nt_username, dos_unistrn2(uni_samlogon_user->buffer, - uni_samlogon_user->uni_str_len)); - - DEBUG(3,("User:[%s]\n", nt_username)); - - /* - * Convert to a UNIX username. - */ - map_username(nt_username); - - /* get the account information */ - become_root(); - sampass = pdb_getsampwnam(nt_username); - unbecome_root(); - - acct_ctrl = pdb_get_acct_ctrl(sampass); - if (sampass == NULL) - status = NT_STATUS_NO_SUCH_USER; - else if (acct_ctrl & ACB_PWNOTREQ) - status = 0; - else if (acct_ctrl & ACB_DISABLED) - status = NT_STATUS_ACCOUNT_DISABLED; - } - - /* Validate password - if required. */ - - if ((status == 0) && !(acct_ctrl & ACB_PWNOTREQ)) { - switch (q_l.sam_id.logon_level) { - case INTERACTIVE_LOGON_TYPE: - /* interactive login. */ - status = net_login_interactive(&q_l.sam_id.ctr->auth.id1, - sampass, vuser); - break; - case NET_LOGON_TYPE: - /* network login. lm challenge and 24 byte responses */ - status = net_login_network(&q_l.sam_id.ctr->auth.id2, sampass); - break; - } - } - - /* lkclXXXX this is the point at which, if the login was - successful, that the SAM Local Security Authority should - record that the user is logged in to the domain. - */ - - /* return the profile plus other bits :-) */ - - if (status == 0) { - DOM_GID *gids = NULL; - int num_gids = 0; - pstring my_name; - pstring my_workgroup; - pstring domain_groups; - - /* set up pointer indicating user/password failed to be found */ - usr_info.ptr_user_info = 0; - - /* XXXX hack to get standard_sub_basic() to use sam logon username */ - /* possibly a better way would be to do a become_user() call */ - - /* - * All this information should be filled in from the - * passdb information - */ - sam_logon_in_ssb = True; - pstrcpy(samlogon_user, nt_username); - -#if 0 - gid = pdb_get_gid(sampass); - - pstrcpy(str, pdb_get_logon_script(sampass)); - standard_sub_advanced(-1, nt_username, "", gid, str); - pdb_set_logon_script(sampass, str); - - pstrcpy(str, pdb_get_profile_path(sampass)); - standard_sub_advanced(-1, nt_username, "", gid, str); - pdb_set_profile_path(sampass, str); - - pstrcpy(str, pdb_get_homedir(sampass)); - standard_sub_advanced(-1, nt_username, "", gid, str); - pdb_set_homedir(sampass, str); - - fstrcpy(full_name, "<Full Name>"); - if (lp_unix_realname()) - fstrcpy(full_name, pdb_get_fullname(sampass)); -#endif - - pstrcpy(my_workgroup, lp_workgroup()); - pstrcpy(my_name, global_myname); - strupper(my_name); - - - /* - * This is the point at which we get the group - * database - we should be getting the gid_t list - * from /etc/group and then turning the uids into - * rids and then into machine sids for this user. - * JRA. - */ - - get_domain_user_groups(domain_groups, nt_username); - - /* - * make_dom_gids allocates the gids array. JRA. - */ - gids = NULL; - num_gids = make_dom_gids(domain_groups, &gids); - - sam_logon_in_ssb = False; - - /* - * This next call is where the 'domain admin users' parameter - * gets mapped. I'm leaving it out for now. The user and group rid - * has already been mapped into the SAM_ACCOUNT struct. I don't - * think this should be overridden here. The correct solution - * is proper group memberships and mapping. --jerry - */ -#if 0 - if (pdb_name_to_rid(nt_username, &r_uid, &r_gid)) -#endif - init_net_user_info3(&usr_info, sampass, - 0, /* logon_count */ - 0, /* bad_pw_count */ - num_gids, /* uint32 num_groups */ - gids , /* DOM_GID *gids */ - 0x20 , /* uint32 user_flgs (?) */ - NULL, /* char sess_key[16] */ - my_name , /* char *logon_srv */ - my_workgroup, /* char *logon_dom */ - &global_sam_sid, /* DOM_SID *dom_sid */ - NULL); /* char *other_sids */ - -#if 0 - else - status = NT_STATUS_NO_SUCH_USER; -#endif - - /* Free any allocated groups array. */ - if(gids) - free((char *)gids); - } - - if(!net_reply_sam_logon(&q_l, rdata, &srv_cred, &usr_info, status)) { - free_user_info3(&usr_info); - return False; - } + + r_u.status = _net_sam_logon(p, &q_u, &r_u); - free_user_info3(&usr_info); + /* store the response in the SMB stream */ + if(!net_io_r_sam_logon("", &r_u, rdata, 0)) { + DEBUG(0,("api_net_sam_logon: Failed to marshall NET_R_SAM_LOGON.\n")); + return False; + } return True; } - /************************************************************************* api_net_trust_dom_list: *************************************************************************/ static BOOL api_net_trust_dom_list(pipes_struct *p) { - NET_Q_TRUST_DOM_LIST q_t; + NET_Q_TRUST_DOM_LIST q_u; + NET_R_TRUST_DOM_LIST r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - char *trusted_domain = "test_domain"; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); DEBUG(6,("api_net_trust_dom_list: %d\n", __LINE__)); /* grab the lsa trusted domain list query... */ - if(!net_io_q_trust_dom("", &q_t, data, 0)) { + if(!net_io_q_trust_dom("", &q_u, data, 0)) { DEBUG(0,("api_net_trust_dom_list: Failed to unmarshall NET_Q_TRUST_DOM_LIST.\n")); return False; } /* construct reply. */ - if(!net_reply_trust_dom_list(&q_t, rdata, 1, trusted_domain)) + r_u.status = _net_trust_dom_list(p, &q_u, &r_u); + + /* store the response in the SMB stream */ + if(!net_io_r_trust_dom("", &r_u, rdata, 0)) { + DEBUG(0,("net_reply_trust_dom_list: Failed to marshall NET_R_TRUST_DOM_LIST.\n")); return False; + } DEBUG(6,("api_net_trust_dom_list: %d\n", __LINE__)); return True; } - -/************************************************************************* - error messages cropping up when using nltest.exe... - *************************************************************************/ -#define ERROR_NO_SUCH_DOMAIN 0x54b -#define ERROR_NO_LOGON_SERVERS 0x51f - /************************************************************************* api_net_logon_ctrl2: *************************************************************************/ static BOOL api_net_logon_ctrl2(pipes_struct *p) { - NET_Q_LOGON_CTRL2 q_l; + NET_Q_LOGON_CTRL2 q_u; + NET_R_LOGON_CTRL2 r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* lkclXXXX - guess what - absolutely no idea what these are! */ - uint32 flags = 0x0; - uint32 pdc_connection_status = 0x0; - uint32 logon_attempts = 0x0; - uint32 tc_status = ERROR_NO_LOGON_SERVERS; - char *trusted_domain = "test_domain"; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); DEBUG(6,("api_net_logon_ctrl2: %d\n", __LINE__)); /* grab the lsa netlogon ctrl2 query... */ - if(!net_io_q_logon_ctrl2("", &q_l, data, 0)) { + if(!net_io_q_logon_ctrl2("", &q_u, data, 0)) { DEBUG(0,("api_net_logon_ctrl2: Failed to unmarshall NET_Q_LOGON_CTRL2.\n")); return False; } - /* construct reply. */ - if(!net_reply_logon_ctrl2(&q_l, rdata, - flags, pdc_connection_status, logon_attempts, - tc_status, trusted_domain)) + r_u.status = _net_logon_ctrl2(p, &q_u, &r_u); + + if(!net_io_r_logon_ctrl2("", &r_u, rdata, 0)) { + DEBUG(0,("net_reply_logon_ctrl2: Failed to marshall NET_R_LOGON_CTRL2.\n")); return False; + } DEBUG(6,("api_net_logon_ctrl2: %d\n", __LINE__)); @@ -950,4 +274,3 @@ BOOL api_netlog_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_netlog_rpc", api_net_cmds); } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_netlog_nt.c b/source3/rpc_server/srv_netlog_nt.c index 151c72499a..613f8f54b2 100644 --- a/source3/rpc_server/srv_netlog_nt.c +++ b/source3/rpc_server/srv_netlog_nt.c @@ -129,7 +129,8 @@ static void init_net_r_srv_pwset(NET_R_SRV_PWSET *r_s, static BOOL get_md4pw(char *md4pw, char *mach_acct) { - struct smb_passwd *smb_pass; + SAM_ACCOUNT *sampass = NULL; + BYTE *pass; #if 0 /* @@ -150,17 +151,18 @@ static BOOL get_md4pw(char *md4pw, char *mach_acct) #endif /* 0 */ become_root(); - smb_pass = getsmbpwnam(mach_acct); + sampass = pdb_getsampwnam(mach_acct); unbecome_root(); - - if ((smb_pass) != NULL && !(smb_pass->acct_ctrl & ACB_DISABLED) && - (smb_pass->smb_nt_passwd != NULL)) + + if ((sampass) != NULL && !(pdb_get_acct_ctrl(sampass) & ACB_DISABLED) && + ((pass=pdb_get_nt_passwd(sampass)) != NULL)) { - memcpy(md4pw, smb_pass->smb_nt_passwd, 16); + memcpy(md4pw, pass, 16); dump_data(5, md4pw, 16); - + return True; } + DEBUG(0,("get_md4pw: Workstation %s: no account in domain\n", mach_acct)); return False; } @@ -256,11 +258,11 @@ uint32 _net_auth_2(pipes_struct *p, NET_Q_AUTH_2 *q_u, NET_R_AUTH_2 *r_u) uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_u) { uint16 vuid = p->vuid; - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_WRONG_PASSWORD; DOM_CRED srv_cred; pstring mach_acct; - struct smb_passwd *smb_pass; - BOOL ret; + SAM_ACCOUNT *sampass; + BOOL ret = False; user_struct *vuser; unsigned char pwd[16]; int i; @@ -282,10 +284,10 @@ uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_ DEBUG(3,("Server Password Set Wksta:[%s]\n", mach_acct)); become_root(); - smb_pass = getsmbpwnam(mach_acct); + sampass = pdb_getsampwnam(mach_acct); unbecome_root(); - if (smb_pass == NULL) + if (sampass == NULL) return NT_STATUS_NO_SUCH_USER; DEBUG(100,("Server password set : new given value was :\n")); @@ -296,16 +298,16 @@ uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_ cred_hash3( pwd, q_u->pwd, vuser->dc.sess_key, 0); /* lies! nt and lm passwords are _not_ the same: don't care */ - smb_pass->smb_passwd = pwd; - smb_pass->smb_nt_passwd = pwd; - smb_pass->acct_ctrl = ACB_WSTRUST; - + pdb_set_lanman_passwd (sampass, pwd); + pdb_set_nt_passwd (sampass, pwd); + pdb_set_acct_ctrl (sampass, ACB_WSTRUST); + become_root(); - ret = mod_smbpwd_entry(smb_pass,False); + ret = pdb_update_sam_account (sampass,False); unbecome_root(); - - if (!ret) - status = NT_STATUS_WRONG_PASSWORD; + + if (ret) + status = NT_STATUS_NOPROBLEMO; /* set up the LSA Server Password Set response */ init_net_r_srv_pwset(r_u, &srv_cred, status); @@ -347,7 +349,7 @@ uint32 _net_sam_logoff(pipes_struct *p, NET_Q_SAM_LOGOFF *q_u, NET_R_SAM_LOGOFF net_login_interactive: *************************************************************************/ -static uint32 net_login_interactive(NET_ID_INFO_1 *id1, struct smb_passwd *smb_pass, user_struct *vuser) +static uint32 net_login_interactive(NET_ID_INFO_1 *id1, SAM_ACCOUNT *sampass, user_struct *vuser) { uint32 status = 0x0; @@ -383,9 +385,8 @@ static uint32 net_login_interactive(NET_ID_INFO_1 *id1, struct smb_passwd *smb_p dump_data(100, nt_pwd, 16); #endif - if (memcmp(smb_pass->smb_passwd , lm_pwd, 16) != 0 || - memcmp(smb_pass->smb_nt_passwd, nt_pwd, 16) != 0) - { + if (memcmp(pdb_get_lanman_passwd(sampass), lm_pwd, 16) != 0 || + memcmp(pdb_get_nt_passwd(sampass), nt_pwd, 16) != 0) { status = NT_STATUS_WRONG_PASSWORD; } @@ -396,8 +397,10 @@ static uint32 net_login_interactive(NET_ID_INFO_1 *id1, struct smb_passwd *smb_p _net_login_network: *************************************************************************/ -static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) +static uint32 net_login_network(NET_ID_INFO_2 *id2, SAM_ACCOUNT *sampass) { + BYTE *nt_pwd, *lanman_pwd; + DEBUG(5,("net_login_network: lm_len: %d nt_len: %d\n", id2->hdr_lm_chal_resp.str_str_len, id2->hdr_nt_chal_resp.str_str_len)); @@ -405,13 +408,13 @@ static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) /* JRA. Check the NT password first if it exists - this is a higher quality password, if it exists and it doesn't match - fail. */ - if (id2->hdr_nt_chal_resp.str_str_len == 24 && - smb_pass->smb_nt_passwd != NULL) - { + nt_pwd = pdb_get_nt_passwd(sampass); + lanman_pwd = pdb_get_lanman_passwd(sampass); + + if (id2->hdr_nt_chal_resp.str_str_len == 24 && nt_pwd) { if(smb_password_check((char *)id2->nt_chal_resp.buffer, - smb_pass->smb_nt_passwd, - id2->lm_chal)) - return 0x0; + nt_pwd, id2->lm_chal)) + return NT_STATUS_NOPROBLEMO; else return NT_STATUS_WRONG_PASSWORD; } @@ -424,14 +427,10 @@ static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) not do, for various security-hole reasons). */ - if (id2->hdr_lm_chal_resp.str_str_len == 24 && + if (id2->hdr_lm_chal_resp.str_str_len == 24 && lanman_pwd && smb_password_check((char *)id2->lm_chal_resp.buffer, - smb_pass->smb_passwd, - id2->lm_chal)) - { - return 0x0; - } - + lanman_pwd, id2->lm_chal)) + return NT_STATUS_NOPROBLEMO; /* oops! neither password check succeeded */ @@ -448,11 +447,10 @@ uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_ uint16 vuid = p->vuid; NET_USER_INFO_3 *usr_info = NULL; DOM_CRED srv_cred; - struct smb_passwd *smb_pass = NULL; - struct sam_passwd *sam_pass = NULL; + SAM_ACCOUNT *sampass = NULL; + uint16 acct_ctrl; UNISTR2 *uni_samlogon_user = NULL; fstring nt_username; - struct passwd *pw; user_struct *vuser = NULL; usr_info = (NET_USER_INFO_3 *)talloc(p->mem_ctx, sizeof(NET_USER_INFO_3)); @@ -499,33 +497,30 @@ uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_ map_username(nt_username); - /* - * Do any case conversions. - */ - - pw=Get_Pwnam(nt_username, True); - + /* get the account information */ become_root(); - sam_pass = getsam21pwnam(nt_username); - smb_pass = getsmbpwnam(nt_username); + sampass = pdb_getsampwnam(nt_username); unbecome_root(); - - if (smb_pass == NULL) + + if (sampass == NULL) return NT_STATUS_NO_SUCH_USER; - else if (smb_pass->acct_ctrl & ACB_DISABLED) + + acct_ctrl = pdb_get_acct_ctrl(sampass); + + if (acct_ctrl & ACB_DISABLED) return NT_STATUS_ACCOUNT_DISABLED; /* Validate password - if required. */ - if (!(smb_pass->acct_ctrl & ACB_PWNOTREQ)) { + if (!(acct_ctrl & ACB_PWNOTREQ)) { switch (q_u->sam_id.logon_level) { case INTERACTIVE_LOGON_TYPE: /* interactive login. */ - status = net_login_interactive(&q_u->sam_id.ctr->auth.id1, smb_pass, vuser); + status = net_login_interactive(&q_u->sam_id.ctr->auth.id1, sampass, vuser); break; case NET_LOGON_TYPE: /* network login. lm challenge and 24 byte responses */ - status = net_login_network(&q_u->sam_id.ctr->auth.id2, smb_pass); + status = net_login_network(&q_u->sam_id.ctr->auth.id2, sampass); break; } } @@ -538,58 +533,25 @@ uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_ record that the user is logged in to the domain. */ - /* return the profile plus other bits :-) */ - { DOM_GID *gids = NULL; int num_gids = 0; - NTTIME dummy_time; - pstring logon_script; - pstring profile_path; - pstring home_dir; - pstring home_drive; pstring my_name; pstring my_workgroup; pstring domain_groups; - uint32 r_uid; - uint32 r_gid; - fstring full_name; /* set up pointer indicating user/password failed to be found */ usr_info->ptr_user_info = 0; - dummy_time.low = 0xffffffff; - dummy_time.high = 0x7fffffff; - /* XXXX hack to get standard_sub_basic() to use sam logon username */ /* possibly a better way would be to do a become_user() call */ sam_logon_in_ssb = True; pstrcpy(samlogon_user, nt_username); - pstrcpy(logon_script, sam_pass->logon_script); - standard_sub_advanced(-1, nt_username, "", pw->pw_gid, logon_script); - - pstrcpy(profile_path, sam_pass->profile_path); - standard_sub_advanced(-1, nt_username, "", pw->pw_gid, profile_path); - pstrcpy(my_workgroup, lp_workgroup()); - - pstrcpy(home_drive, sam_pass->dir_drive); - standard_sub_advanced(-1, nt_username, "", pw->pw_gid, home_drive); - - pstrcpy(home_dir, sam_pass->home_dir); - standard_sub_advanced(-1, nt_username, "", pw->pw_gid, home_dir); - pstrcpy(my_name, global_myname); strupper(my_name); - pstrcpy(full_name, sam_pass->full_name ); - if( !*full_name ) { - fstrcpy(full_name, "<Full Name>"); - if (lp_unix_realname()) - fstrcpy(full_name, strtok(pw->pw_gecos, ",")); - } - /* * This is the point at which we get the group * database - we should be getting the gid_t list @@ -608,41 +570,17 @@ uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_ sam_logon_in_ssb = False; - if (pdb_name_to_rid(nt_username, &r_uid, &r_gid)) - init_net_user_info3(p->mem_ctx, usr_info, - &dummy_time, /* logon_time */ - &dummy_time, /* logoff_time */ - &dummy_time, /* kickoff_time */ - &dummy_time, /* pass_last_set_time */ - &dummy_time, /* pass_can_change_time */ - &dummy_time, /* pass_must_change_time */ - - nt_username , /* user_name */ - full_name, /* full_name */ - logon_script , /* logon_script */ - profile_path , /* profile_path */ - home_dir , /* home_dir */ - home_drive , /* dir_drive */ - - 0, /* logon_count */ - 0, /* bad_pw_count */ - - r_uid , /* RID user_id */ - r_gid , /* RID group_id */ - num_gids, /* uint32 num_groups */ - gids , /* DOM_GID *gids */ - 0x20 , /* uint32 user_flgs (?) */ - - NULL, /* char sess_key[16] */ - - my_name , /* char *logon_srv */ - my_workgroup, /* char *logon_dom */ - - &global_sam_sid, /* DOM_SID *dom_sid */ - NULL); /* char *other_sids */ - else - return NT_STATUS_NO_SUCH_USER; - + init_net_user_info3(p->mem_ctx, usr_info, sampass, + 0, /* logon_count */ + 0, /* bad_pw_count */ + num_gids, /* uint32 num_groups */ + gids , /* DOM_GID *gids */ + 0x20 , /* uint32 user_flgs (?) */ + NULL, /* char sess_key[16] */ + my_name , /* char *logon_srv */ + my_workgroup, /* char *logon_dom */ + &global_sam_sid, /* DOM_SID *dom_sid */ + NULL); /* char *other_sids */ } /* XXXX maybe we want to say 'no', reject the client's credentials */ diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index dcefeed8b9..bc5b2ab473 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -270,9 +269,9 @@ static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlm fstring domain; fstring wks; BOOL guest_user = False; - SAM_ACCOUNT *sam_pass = NULL; - BYTE null_smb_passwd[16]; - BYTE *smb_passwd_ptr = NULL; + SAM_ACCOUNT *sampass = NULL; + uchar null_smb_passwd[16]; + uchar *smb_passwd_ptr = NULL; DEBUG(5,("api_pipe_ntlmssp_verify: checking user details\n")); @@ -358,18 +357,6 @@ static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlm return False; } -/* unnecessary as the passdb validates the user before returning --jerry */ -#if 0 - /* - * Find the user in the unix password db. - */ - - if(!(pass = Get_Pwnam(pipe_user_name,True))) { - DEBUG(1,("Couldn't find user '%s' in UNIX password database.\n",pipe_user_name)); - return(False); - } - -#endif /* 0 */ if(!guest_user) { @@ -383,8 +370,8 @@ failed authentication on named pipe %s.\n", domain, pipe_user_name, wks, p->name return False; } - if(!(sam_pass = pdb_getsampwnam(pipe_user_name))) { - DEBUG(1,("api_pipe_ntlmssp_verify: Cannot find user %s in passdb.\n", + if(!(sampass = pdb_getsampwnam(pipe_user_name))) { + DEBUG(1,("api_pipe_ntlmssp_verify: Cannot find user %s in smb passwd database.\n", pipe_user_name)); unbecome_root(); return False; @@ -392,24 +379,18 @@ failed authentication on named pipe %s.\n", domain, pipe_user_name, wks, p->name unbecome_root(); - if (sam_pass == NULL) { - DEBUG(1,("api_pipe_ntlmssp_verify: Couldn't find user '%s' in passdb.\n", - pipe_user_name)); - return(False); - } - - /* Quit if the account was disabled. */ - if((pdb_get_acct_ctrl(sam_pass) & ACB_DISABLED) || !pdb_get_lanman_passwd(sam_pass)) { - DEBUG(1,("Account for user '%s' was disabled.\n", pipe_user_name)); - return(False); - } - - if(!pdb_get_nt_passwd(sam_pass)) { - DEBUG(1,("Account for user '%s' has no NT password hash.\n", pipe_user_name)); - return(False); - } - - smb_passwd_ptr = pdb_get_lanman_passwd(sam_pass); + /* Quit if the account was disabled. */ + if((pdb_get_acct_ctrl(sampass) & ACB_DISABLED) || !pdb_get_lanman_passwd(sampass)) { + DEBUG(1,("Account for user '%s' was disabled.\n", pipe_user_name)); + return(False); + } + + if(!pdb_get_nt_passwd(sampass)) { + DEBUG(1,("Account for user '%s' has no NT password hash.\n", pipe_user_name)); + return(False); + } + + smb_passwd_ptr = pdb_get_lanman_passwd(sampass); } /* @@ -459,18 +440,18 @@ failed authentication on named pipe %s.\n", domain, pipe_user_name, wks, p->name /* * Store the UNIX credential data (uid/gid pair) in the pipe structure. */ - p->pipe_user.uid = pdb_get_uid(sam_pass); - p->pipe_user.gid = pdb_get_gid(sam_pass); + + p->pipe_user.uid = pdb_get_uid(sampass); + p->pipe_user.gid = pdb_get_uid(sampass); /* Set up pipe user group membership. */ initialise_groups(pipe_user_name, p->pipe_user.uid, p->pipe_user.gid); get_current_groups( &p->pipe_user.ngroups, &p->pipe_user.groups); /* Create an NT_USER_TOKEN struct for this user. */ - p->pipe_user.nt_user_token = - create_nt_token(p->pipe_user.uid,p->pipe_user.gid, - p->pipe_user.ngroups, p->pipe_user.groups, - guest_user); + p->pipe_user.nt_user_token = create_nt_token(p->pipe_user.uid,p->pipe_user.gid, + p->pipe_user.ngroups, p->pipe_user.groups, + guest_user); p->ntlmssp_auth_validated = True; return True; @@ -1148,7 +1129,9 @@ BOOL api_pipe_request(pipes_struct *p) if (strequal(api_fd_commands[i].pipe_clnt_name, p->name) && api_fd_commands[i].fn != NULL) { DEBUG(3,("Doing \\PIPE\\%s\n", api_fd_commands[i].pipe_clnt_name)); + set_current_rpc_talloc(p->mem_ctx); ret = api_fd_commands[i].fn(p); + set_current_rpc_talloc(NULL); } } @@ -1222,7 +1205,7 @@ BOOL api_rpcTNP(pipes_struct *p, char *rpc_name, DEBUG(10, ("api_rpcTNP: rpc input buffer underflow (parse error?)\n")); if (data) { - prs_uint8s(False, "", &p->in_data.data, 0, data, + prs_uint8s(False, "", &p->in_data.data, 0, (unsigned char *)data, data_len); free(data); } @@ -1231,5 +1214,3 @@ BOOL api_rpcTNP(pipes_struct *p, char *rpc_name, return True; } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c index 5545071913..cd072122f3 100644 --- a/source3/rpc_server/srv_pipe_hnd.c +++ b/source3/rpc_server/srv_pipe_hnd.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -40,6 +39,20 @@ static int pipes_open; static pipes_struct *Pipes; static struct bitmap *bmap; +/**************************************************************************** + Pipe iterator functions. +****************************************************************************/ + +pipes_struct *get_first_pipe(void) +{ + return Pipes; +} + +pipes_struct *get_next_pipe(pipes_struct *p) +{ + return p->next; +} + /* this must be larger than the sum of the open files and directories */ static int pipe_handle_offset; @@ -135,7 +148,7 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name, next_pipe = (i+1) % MAX_OPEN_PIPES; for (p = Pipes; p; p = p->next) - DEBUG(5,("open pipes: name %s pnum=%x\n", p->name, p->pnum)); + DEBUG(5,("open_rpc_pipe_p: name %s pnum=%x\n", p->name, p->pnum)); p = (pipes_struct *)malloc(sizeof(*p)); @@ -150,6 +163,8 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name, return NULL; } + init_pipe_handles(p); + DLIST_ADD(Pipes, p); /* @@ -380,6 +395,23 @@ static ssize_t unmarshall_rpc_header(pipes_struct *p) } /**************************************************************************** + Call this to free any talloc'ed memory. Do this before and after processing + a complete PDU. +****************************************************************************/ + +void free_pipe_context(pipes_struct *p) +{ + if (p->mem_ctx) { + DEBUG(3,("free_pipe_context: destroying talloc pool of size %u\n", talloc_pool_size(p->mem_ctx) )); + talloc_destroy_pool(p->mem_ctx); + } else { + p->mem_ctx = talloc_init(); + if (p->mem_ctx == NULL) + p->fault_state = True; + } +} + +/**************************************************************************** Processes a request pdu. This will do auth processing if needed, and appends the data into the complete stream if the LAST flag is not set. ****************************************************************************/ @@ -487,9 +519,13 @@ authentication failed. Denying the request.\n", p->name)); * Process the complete data stream here. */ + free_pipe_context(p); + if(pipe_init_outgoing_data(p)) ret = api_pipe_request(p); + free_pipe_context(p); + /* * We have consumed the whole data stream. Set back to * marshalling and set the offset back to the start of @@ -780,23 +816,6 @@ returning %d bytes.\n", p->name, (unsigned int)p->out_data.current_pdu_len, out: - if(p->out_data.data_sent_length >= prs_offset(&p->out_data.rdata)) { - /* - * We have copied all possible data into the current_pdu. This RPC is finished. - * Reset the talloc context to free any allocated data from this RPC. - */ - - if (p->mem_ctx) { - DEBUG(3,("read_from_pipe: destroying talloc pool of size %u\n", talloc_pool_size(p->mem_ctx) )); - talloc_destroy_pool(p->mem_ctx); - } else { - p->mem_ctx = talloc_init(); - if (p->mem_ctx == NULL) - p->fault_state = True; - } - - } - return data_returned; } @@ -865,6 +884,9 @@ BOOL close_rpc_pipe_hnd(pipes_struct *p, connection_struct *conn) if (p->mem_ctx) talloc_destroy(p->mem_ctx); + /* Free the handles database. */ + close_policy_by_pipe(p); + bitmap_clear(bmap, p->pnum - pipe_handle_offset); pipes_open--; @@ -921,4 +943,3 @@ pipes_struct *get_rpc_pipe(int pnum) return NULL; } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_reg.c b/source3/rpc_server/srv_reg.c index 1ca9963cd4..65f0e2304c 100644 --- a/source3/rpc_server/srv_reg.c +++ b/source3/rpc_server/srv_reg.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -156,4 +155,3 @@ BOOL api_reg_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_reg_rpc", api_reg_cmds); } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_reg_nt.c b/source3/rpc_server/srv_reg_nt.c index 4bd97abb65..4f941e3e1b 100644 --- a/source3/rpc_server/srv_reg_nt.c +++ b/source3/rpc_server/srv_reg_nt.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -30,6 +29,19 @@ extern int DEBUGLEVEL; +struct reg_info +{ + /* for use by \PIPE\winreg */ + fstring name; /* name of registry key */ +}; + +static void free_reg_info(void *ptr) +{ + struct reg_info *info = (struct reg_info *)ptr; + + safe_free(info); +} + /******************************************************************* reg_reply_unknown_1 ********************************************************************/ @@ -40,7 +52,7 @@ uint32 _reg_close(pipes_struct *p, REG_Q_CLOSE *q_u, REG_R_CLOSE *r_u) ZERO_STRUCT(r_u->pol); /* close the policy handle */ - if (!close_lsa_policy_hnd(&q_u->pol)) + if (!close_policy_hnd(p, &q_u->pol)) return NT_STATUS_OBJECT_NAME_INVALID; return NT_STATUS_NOPROBLEMO; @@ -52,7 +64,7 @@ uint32 _reg_close(pipes_struct *p, REG_Q_CLOSE *q_u, REG_R_CLOSE *r_u) uint32 _reg_open(pipes_struct *p, REG_Q_OPEN_HKLM *q_u, REG_R_OPEN_HKLM *r_u) { - if (!open_lsa_policy_hnd(&r_u->pol)) + if (!create_policy_hnd(p, &r_u->pol, free_reg_info, NULL)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; return NT_STATUS_NOPROBLEMO; @@ -66,15 +78,13 @@ uint32 _reg_open_entry(pipes_struct *p, REG_Q_OPEN_ENTRY *q_u, REG_R_OPEN_ENTRY { POLICY_HND pol; fstring name; + struct reg_info *info = NULL; DEBUG(5,("reg_open_entry: %d\n", __LINE__)); - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) return NT_STATUS_INVALID_HANDLE; - if (!open_lsa_policy_hnd(&pol)) - return NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ - fstrcpy(name, dos_unistrn2(q_u->uni_name.buffer, q_u->uni_name.uni_str_len)); DEBUG(5,("reg_open_entry: %s\n", name)); @@ -84,7 +94,13 @@ uint32 _reg_open_entry(pipes_struct *p, REG_Q_OPEN_ENTRY *q_u, REG_R_OPEN_ENTRY !strequal(name, "System\\CurrentControlSet\\services\\Netlogon\\parameters\\")) return NT_STATUS_ACCESS_DENIED; - if (!set_lsa_policy_reg_name(&pol, name)) + if ((info = (struct reg_info *)malloc(sizeof(struct reg_info))) == NULL) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(info); + fstrcpy(info->name, name); + + if (!create_policy_hnd(p, &pol, free_reg_info, (void *)info)) return NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ init_reg_r_open_entry(r_u, &pol, NT_STATUS_NOPROBLEMO); @@ -110,7 +126,7 @@ uint32 _reg_info(pipes_struct *p, REG_Q_INFO *q_u, REG_R_INFO *r_u) DEBUG(5,("_reg_info: %d\n", __LINE__)); - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (find_policy_by_hnd(p, &q_u->pol, NULL) == -1) return NT_STATUS_INVALID_HANDLE; fstrcpy(name, dos_unistrn2(q_u->uni_type.buffer, q_u->uni_type.uni_str_len)); @@ -161,4 +177,3 @@ uint32 _reg_info(pipes_struct *p, REG_Q_INFO *q_u, REG_R_INFO *r_u) return status; } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_samr.c b/source3/rpc_server/srv_samr.c index 2f4143bd6a..828e2e5595 100644 --- a/source3/rpc_server/srv_samr.c +++ b/source3/rpc_server/srv_samr.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -7,6 +6,10 @@ * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, * Copyright (C) Paul Ashton 1997. * Copyright (C) Hewlett-Packard Company 1999. + * + * Split into interface and implementation modules by, + * + * Copyright (C) Jeremy Allison 2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,426 +26,40 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* + * This is the interface to the SAMR code. + */ + #include "includes.h" extern int DEBUGLEVEL; -extern fstring global_myworkgroup; -extern pstring global_myname; -extern DOM_SID global_sam_sid; - -extern rid_name domain_group_rids[]; -extern rid_name domain_alias_rids[]; -extern rid_name builtin_alias_rids[]; - -/******************************************************************* - This next function should be replaced with something that - dynamically returns the correct user info..... JRA. - ********************************************************************/ - -static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, - int *total_entries, int *num_entries, - int max_num_entries, uint16 acb_mask) -{ - SAM_ACCOUNT *pwd = NULL; - - (*num_entries) = 0; - (*total_entries) = 0; - - if (pw_buf == NULL) - return False; - - if (!pdb_setsampwent(False)) - { - DEBUG(0, ("get_sampwd_entries: Unable to open passdb.\n")); - return False; - } - - while ( ((pwd=pdb_getsampwent()) != NULL) && ((*num_entries) < max_num_entries) ) - { - int user_name_len; - - if (start_idx > 0) { - /* skip the requested number of entries. - not very efficient, but hey... - */ - start_idx--; - continue; - } - - user_name_len = strlen(pdb_get_username(pwd))+1; - init_unistr2(&(pw_buf[(*num_entries)].uni_user_name), pdb_get_username(pwd), user_name_len); - init_uni_hdr(&(pw_buf[(*num_entries)].hdr_user_name), user_name_len); - pw_buf[(*num_entries)].user_rid = pdb_get_user_rid(pwd); - memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); - - /* Now check if the NT compatible password is available. */ - if (pdb_get_nt_passwd(pwd) != NULL) - { - memcpy( pw_buf[(*num_entries)].nt_pwd , pdb_get_nt_passwd(pwd), 16); - } - - pw_buf[(*num_entries)].acb_info = pdb_get_acct_ctrl(pwd); - - DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x", - (*num_entries), pdb_get_username(pwd), - pdb_get_user_rid(pwd), pdb_get_acct_ctrl(pwd))); - - if (acb_mask == 0 || (pdb_get_acct_ctrl(pwd) & acb_mask)) - { - DEBUG(5,(" acb_mask %x accepts\n", acb_mask)); - (*num_entries)++; - } - else - { - DEBUG(5,(" acb_mask %x rejects\n", acb_mask)); - } - - (*total_entries)++; - } - - pdb_endsampwent(); - - return (*num_entries) > 0; -} - -/******************************************************************* - This function uses the username map file and tries to map a UNIX - user name to an DOS name. (Sort of the reverse of the - map_username() function.) Since more than one DOS name can map - to the UNIX name, to reverse the mapping you have to specify - which corresponding DOS name you want; that's where the name_idx - parameter comes in. Returns the string requested or NULL if it - fails or can't complete the request for any reason. This doesn't - handle group names (starting with '@') or names starting with - '+' or '&'. If they are encountered, they are skipped. -********************************************************************/ - -static char *unmap_unixname(char *unix_user_name, int name_idx) -{ - char *mapfile = lp_username_map(); - char **lines; - static pstring tok; - int i; - - if (!*unix_user_name) return NULL; - if (!*mapfile) return NULL; - - lines = file_lines_load(mapfile, NULL,False); - if (!lines) { - DEBUG(0,("unmap_unixname: can't open username map %s\n", mapfile)); - return NULL; - } - - DEBUG(5,("unmap_unixname: scanning username map %s, index: %d\n", mapfile, name_idx)); - - for (i=0; lines[i]; i++) { - char *unixname = lines[i]; - char *dosname = strchr(unixname,'='); - - if (!dosname) - continue; - - *dosname++ = 0; - - while (isspace(*unixname)) - unixname++; - if ('!' == *unixname) { - unixname++; - while (*unixname && isspace(*unixname)) - unixname++; - } - - if (!*unixname || strchr("#;",*unixname)) - continue; - - if (strncmp(unixname, unix_user_name, strlen(unix_user_name))) - continue; - - /* We have matched the UNIX user name */ - - while(next_token(&dosname, tok, LIST_SEP, sizeof(tok))) { - if (!strchr("@&+", *tok)) { - name_idx--; - if (name_idx < 0 ) { - break; - } - } - } - - if (name_idx >= 0) { - DEBUG(0,("unmap_unixname: index too high - not that many DOS names\n")); - file_lines_free(lines); - return NULL; - } else { - file_lines_free(lines); - return tok; - } - } - - DEBUG(0,("unmap_unixname: Couldn't find the UNIX user name\n")); - file_lines_free(lines); - return NULL; -} - -/******************************************************************* - This function sets up a list of users taken from the list of - users that UNIX knows about, as well as all the user names that - Samba maps to a valid UNIX user name. (This should work with - /etc/passwd or NIS.) -********************************************************************/ - -static BOOL get_passwd_entries(SAM_USER_INFO_21 *pw_buf, - int start_idx, - int *total_entries, int *num_entries, - int max_num_entries, - uint16 acb_mask) -{ - static struct passwd *pwd = NULL; - static uint32 pw_rid; - static BOOL orig_done = False; - static int current_idx = 0; - static int mapped_idx = 0; - char *sep; - - DEBUG(5, ("get_passwd_entries: retrieving a list of UNIX users\n")); - - (*num_entries) = 0; - (*total_entries) = 0; - - /* Skip all this stuff if we're in appliance mode */ - - if (lp_hide_local_users()) goto done; - - if (pw_buf == NULL) return False; - - if (current_idx == 0) { - sys_setpwent(); - } - - /* These two cases are inefficient, but should be called very rarely */ - /* they are the cases where the starting index isn't picking up */ - /* where we left off last time. It is efficient when it starts over */ - /* at zero though. */ - if (start_idx > current_idx) { - /* We aren't far enough; advance to start_idx */ - while (current_idx < start_idx) { - char *unmap_name; - - if(!orig_done) { - if ((pwd = sys_getpwent()) == NULL) break; - current_idx++; - orig_done = True; - } - - while (((unmap_name = unmap_unixname(pwd->pw_name, mapped_idx)) != NULL) && - (current_idx < start_idx)) { - current_idx++; - mapped_idx++; - } - - if (unmap_name == NULL) { - orig_done = False; - mapped_idx = 0; - } - } - } else if (start_idx < current_idx) { - /* We are already too far; start over and advance to start_idx */ - sys_endpwent(); - sys_setpwent(); - current_idx = 0; - mapped_idx = 0; - orig_done = False; - while (current_idx < start_idx) { - char *unmap_name; - - if(!orig_done) { - if ((pwd = sys_getpwent()) == NULL) break; - current_idx++; - orig_done = True; - } - - while (((unmap_name = unmap_unixname(pwd->pw_name, mapped_idx)) != NULL) && - (current_idx < start_idx)) { - current_idx++; - mapped_idx++; - } - - if (unmap_name == NULL) { - orig_done = False; - mapped_idx = 0; - } - } - } - - sep = lp_winbind_separator(); - - /* now current_idx == start_idx */ - while ((*num_entries) < max_num_entries) { - int user_name_len; - char *unmap_name; - - /* This does the original UNIX user itself */ - if(!orig_done) { - if ((pwd = sys_getpwent()) == NULL) break; - - /* Don't enumerate winbind users as they are not local */ - - if (strchr(pwd->pw_name, *sep) != NULL) { - continue; - } - - user_name_len = strlen(pwd->pw_name); - pw_rid = pdb_uid_to_user_rid(pwd->pw_uid); - ZERO_STRUCTP(&pw_buf[(*num_entries)]); - init_unistr2(&(pw_buf[(*num_entries)].uni_user_name), pwd->pw_name, user_name_len); - init_uni_hdr(&(pw_buf[(*num_entries)].hdr_user_name), user_name_len); - pw_buf[(*num_entries)].user_rid = pw_rid; - memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); - - pw_buf[(*num_entries)].acb_info = ACB_NORMAL; - - DEBUG(5, ("get_passwd_entries: entry idx %d user %s, rid 0x%x\n", (*num_entries), pwd->pw_name, pw_rid)); - - (*num_entries)++; - (*total_entries)++; - current_idx++; - orig_done = True; - } - - /* This does all the user names that map to the UNIX user */ - while (((unmap_name = unmap_unixname(pwd->pw_name, mapped_idx)) != NULL) && - (*num_entries < max_num_entries)) { - user_name_len = strlen(unmap_name); - ZERO_STRUCTP(&pw_buf[(*num_entries)]); - init_unistr2(&(pw_buf[(*num_entries)].uni_user_name), unmap_name, user_name_len); - init_uni_hdr(&(pw_buf[(*num_entries)].hdr_user_name), user_name_len); - pw_buf[(*num_entries)].user_rid = pw_rid; - memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); - - pw_buf[(*num_entries)].acb_info = ACB_NORMAL; - - DEBUG(5, ("get_passwd_entries: entry idx %d user %s, rid 0x%x\n", (*num_entries), pwd->pw_name, pw_rid)); - - (*num_entries)++; - (*total_entries)++; - current_idx++; - mapped_idx++; - } - - if (unmap_name == NULL) { - /* done with 'aliases', go on to next UNIX user */ - orig_done = False; - mapped_idx = 0; - } - } - - if (pwd == NULL) { - /* totally done, reset everything */ - sys_endpwent(); - current_idx = 0; - mapped_idx = 0; - } - -done: - return (*num_entries) > 0; -} - -/******************************************************************* - samr_reply_unknown_1 - ********************************************************************/ -static BOOL samr_reply_close_hnd(SAMR_Q_CLOSE_HND *q_u, - prs_struct *rdata) -{ - SAMR_R_CLOSE_HND r_u; - - /* set up the SAMR unknown_1 response */ - ZERO_STRUCT(r_u.pol); - - /* close the policy handle */ - if (close_lsa_policy_hnd(&(q_u->pol))) - { - r_u.status = 0; - } - else - { - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_INVALID; - } - - DEBUG(5,("samr_reply_close_hnd: %d\n", __LINE__)); - - /* store the response in the SMB stream */ - if(!samr_io_r_close_hnd("", &r_u, rdata, 0)) - return False; - - DEBUG(5,("samr_reply_close_hnd: %d\n", __LINE__)); - - return True; -} - /******************************************************************* api_samr_close_hnd ********************************************************************/ + static BOOL api_samr_close_hnd(pipes_struct *p) { SAMR_Q_CLOSE_HND q_u; + SAMR_R_CLOSE_HND r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr unknown 1 */ - if(!samr_io_q_close_hnd("", &q_u, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. always indicate success */ - if(!samr_reply_close_hnd(&q_u, rdata)) + if(!samr_io_q_close_hnd("", &q_u, data, 0)) { + DEBUG(0,("api_samr_close_hnd: unable to unmarshall SAMR_Q_CLOSE_HND.\n")); return False; - - return True; -} - - -/******************************************************************* - samr_reply_open_domain - ********************************************************************/ -static BOOL samr_reply_open_domain(SAMR_Q_OPEN_DOMAIN *q_u, - prs_struct *rdata) -{ - SAMR_R_OPEN_DOMAIN r_u; - BOOL pol_open = False; - - r_u.status = 0x0; - - /* find the connection policy handle. */ - if (r_u.status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - r_u.status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; } - /* get a (unique) handle. open a policy on it. */ - if (r_u.status == 0x0 && !(pol_open = open_lsa_policy_hnd(&(r_u.domain_pol)))) - { - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND; - } - - /* associate the domain SID with the (unique) handle. */ - if (r_u.status == 0x0 && !set_lsa_policy_samr_sid(&(r_u.domain_pol), &(q_u->dom_sid.sid))) - { - /* oh, whoops. don't know what error message to return, here */ - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND; - } - - if (r_u.status != 0 && pol_open) - { - close_lsa_policy_hnd(&(r_u.domain_pol)); - } - - DEBUG(5,("samr_open_domain: %d\n", __LINE__)); + r_u.status = _samr_close_hnd(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_open_domain("", &r_u, rdata, 0)) + if(!samr_io_r_close_hnd("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_close_hnd: unable to marshall SAMR_R_CLOSE_HND.\n")); return False; - - DEBUG(5,("samr_open_domain: %d\n", __LINE__)); + } return True; } @@ -450,569 +67,189 @@ static BOOL samr_reply_open_domain(SAMR_Q_OPEN_DOMAIN *q_u, /******************************************************************* api_samr_open_domain ********************************************************************/ + static BOOL api_samr_open_domain(pipes_struct *p) { SAMR_Q_OPEN_DOMAIN q_u; + SAMR_R_OPEN_DOMAIN r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open */ - if(!samr_io_q_open_domain("", &q_u, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. always indicate success */ - if(!samr_reply_open_domain(&q_u, rdata)) + if(!samr_io_q_open_domain("", &q_u, data, 0)) { + DEBUG(0,("api_samr_open_domain: unable to unmarshall SAMR_Q_OPEN_DOMAIN.\n")); return False; - - return True; -} - - -/******************************************************************* - samr_reply_unknown_2c - ********************************************************************/ -static BOOL samr_reply_unknown_2c(SAMR_Q_UNKNOWN_2C *q_u, - prs_struct *rdata) -{ - SAMR_R_UNKNOWN_2C r_u; - uint32 status = 0x0; - - /* find the policy handle. open a policy on it. */ - if (status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->user_pol)) == -1)) - { - status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - /* find the user's rid */ - if ((status == 0x0) && (get_lsa_policy_samr_rid(&(q_u->user_pol)) == 0xffffffff)) - { - status = NT_STATUS_OBJECT_TYPE_MISMATCH; } - init_samr_r_unknown_2c(&r_u, status); - - DEBUG(5,("samr_unknown_2c: %d\n", __LINE__)); + r_u.status = _samr_open_domain(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_unknown_2c("", &r_u, rdata, 0)) + if(!samr_io_r_open_domain("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_open_domain: unable to marshall SAMR_R_OPEN_DOMAIN.\n")); return False; - - DEBUG(5,("samr_unknown_2c: %d\n", __LINE__)); + } return True; } /******************************************************************* - api_samr_unknown_2c + api_samr_get_usrdom_pwinfo ********************************************************************/ -static BOOL api_samr_unknown_2c(pipes_struct *p) + +static BOOL api_samr_get_usrdom_pwinfo(pipes_struct *p) { - SAMR_Q_UNKNOWN_2C q_u; + SAMR_Q_GET_USRDOM_PWINFO q_u; + SAMR_R_GET_USRDOM_PWINFO r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open */ - if(!samr_io_q_unknown_2c("", &q_u, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. always indicate success */ - if(!samr_reply_unknown_2c(&q_u, rdata)) + if(!samr_io_q_get_usrdom_pwinfo("", &q_u, data, 0)) return False; - return True; -} - - -/******************************************************************* - samr_reply_unknown_3 - ********************************************************************/ -static BOOL samr_reply_unknown_3(SAMR_Q_UNKNOWN_3 *q_u, - prs_struct *rdata) -{ - SAMR_R_UNKNOWN_3 r_u; - DOM_SID3 sid[MAX_SAM_SIDS]; - uint32 rid; - uint32 status; - - status = 0x0; - - /* find the policy handle. open a policy on it. */ - if (status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->user_pol)) == -1)) - { - status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - /* find the user's rid */ - if (status == 0x0 && (rid = get_lsa_policy_samr_rid(&(q_u->user_pol))) == 0xffffffff) - { - status = NT_STATUS_OBJECT_TYPE_MISMATCH; - } - - if (status == 0x0) - { - DOM_SID user_sid; - DOM_SID everyone_sid; - - user_sid = global_sam_sid; - - SMB_ASSERT_ARRAY(user_sid.sub_auths, user_sid.num_auths+1); - - /* - * Add the user RID. - */ - user_sid.sub_auths[user_sid.num_auths++] = rid; - - string_to_sid(&everyone_sid, "S-1-1"); - - /* maybe need another 1 or 2 (S-1-5-0x20-0x220 and S-1-5-20-0x224) */ - /* these two are DOMAIN_ADMIN and DOMAIN_ACCT_OP group RIDs */ - init_dom_sid3(&(sid[0]), 0x035b, 0x0002, &everyone_sid); - init_dom_sid3(&(sid[1]), 0x0044, 0x0002, &user_sid); - } - - init_samr_r_unknown_3(&r_u, - 0x0001, 0x8004, - 0x00000014, 0x0002, 0x0070, - 2, sid, status); - - DEBUG(5,("samr_unknown_3: %d\n", __LINE__)); + r_u.status = _samr_get_usrdom_pwinfo(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_unknown_3("", &r_u, rdata, 0)) + if(!samr_io_r_get_usrdom_pwinfo("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_unknown_3: %d\n", __LINE__)); - return True; } /******************************************************************* - api_samr_unknown_3 + api_samr_query_sec_obj ********************************************************************/ -static BOOL api_samr_unknown_3(pipes_struct *p) + +static BOOL api_samr_query_sec_obj(pipes_struct *p) { - SAMR_Q_UNKNOWN_3 q_u; + SAMR_Q_QUERY_SEC_OBJ q_u; + SAMR_R_QUERY_SEC_OBJ r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open */ - if(!samr_io_q_unknown_3("", &q_u, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. always indicate success */ - if(!samr_reply_unknown_3(&q_u, rdata)) + if(!samr_io_q_query_sec_obj("", &q_u, data, 0)) return False; - return True; -} - + r_u.status = _samr_query_sec_obj(p, &q_u, &r_u); -/******************************************************************* - samr_reply_enum_dom_users - ********************************************************************/ -static BOOL samr_reply_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_u, - prs_struct *rdata) -{ - SAMR_R_ENUM_DOM_USERS r_e; - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]; - int num_entries; - int total_entries; - - ZERO_STRUCT(r_e); - - r_e.status = 0x0; - r_e.total_num_entries = 0; - - /* find the policy handle. open a policy on it. */ - if (r_e.status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - r_e.status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - DEBUG(5,("samr_reply_enum_dom_users: %d\n", __LINE__)); - - become_root(); - get_sampwd_entries(pass, 0, &total_entries, &num_entries, MAX_SAM_ENTRIES, q_u->acb_mask); - unbecome_root(); - - init_samr_r_enum_dom_users(&r_e, total_entries, - q_u->unknown_0, num_entries, - pass, r_e.status); - - /* store the response in the SMB stream */ - if(!samr_io_r_enum_dom_users("", &r_e, rdata, 0)) + if(!samr_io_r_query_sec_obj("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_enum_dom_users: %d\n", __LINE__)); - return True; } /******************************************************************* api_samr_enum_dom_users ********************************************************************/ + static BOOL api_samr_enum_dom_users(pipes_struct *p) { - SAMR_Q_ENUM_DOM_USERS q_e; + SAMR_Q_ENUM_DOM_USERS q_u; + SAMR_R_ENUM_DOM_USERS r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open */ - if(!samr_io_q_enum_dom_users("", &q_e, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. */ - if(!samr_reply_enum_dom_users(&q_e, rdata)) + /* grab the samr open */ + if(!samr_io_q_enum_dom_users("", &q_u, data, 0)) return False; - return True; -} - -/******************************************************************* - samr_reply_enum_dom_groups - ********************************************************************/ -static BOOL samr_reply_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_u, - prs_struct *rdata) -{ - SAMR_R_ENUM_DOM_GROUPS r_e; - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]; - int num_entries; - BOOL got_grps; - char *dummy_group = "Domain Admins"; - - ZERO_STRUCT(r_e); - - r_e.status = 0x0; - r_e.num_entries = 0; - - /* find the policy handle. open a policy on it. */ - if (r_e.status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - r_e.status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - DEBUG(5,("samr_reply_enum_dom_groups: %d\n", __LINE__)); - - got_grps = True; - num_entries = 1; - ZERO_STRUCTP(&pass[0]); - init_unistr2(&(pass[0].uni_user_name), dummy_group, strlen(dummy_group)+1); - pass[0].user_rid = DOMAIN_GROUP_RID_ADMINS; - - if (r_e.status == 0 && got_grps) - { - init_samr_r_enum_dom_groups(&r_e, q_u->start_idx, num_entries, pass, r_e.status); - } + r_u.status = _samr_enum_dom_users(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_enum_dom_groups("", &r_e, rdata, 0)) + if(!samr_io_r_enum_dom_users("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_enum_dom_groups: %d\n", __LINE__)); - return True; } /******************************************************************* api_samr_enum_dom_groups ********************************************************************/ + static BOOL api_samr_enum_dom_groups(pipes_struct *p) { - SAMR_Q_ENUM_DOM_GROUPS q_e; + SAMR_Q_ENUM_DOM_GROUPS q_u; + SAMR_R_ENUM_DOM_GROUPS r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open */ - if(!samr_io_q_enum_dom_groups("", &q_e, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. */ - if(!samr_reply_enum_dom_groups(&q_e, rdata)) + /* grab the samr open */ + if(!samr_io_q_enum_dom_groups("", &q_u, data, 0)) return False; - return True; -} - -/******************************************************************* - samr_reply_enum_dom_aliases - ********************************************************************/ -static BOOL samr_reply_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_u, - prs_struct *rdata) -{ - SAMR_R_ENUM_DOM_ALIASES r_e; - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]; - int num_entries = 0; - DOM_SID sid; - fstring sid_str; - fstring sam_sid_str; - struct group *grp; - - ZERO_STRUCT(r_e); - - /* find the policy handle. open a policy on it. */ - if (r_e.status == 0x0 && !get_lsa_policy_samr_sid(&q_u->pol, &sid)) - { - r_e.status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - sid_to_string(sid_str, &sid); - sid_to_string(sam_sid_str, &global_sam_sid); - - DEBUG(5,("samr_reply_enum_dom_aliases: sid %s\n", sid_str)); - - /* well-known aliases */ - if (strequal(sid_str, "S-1-5-32")) - { - char *name; - while (!lp_hide_local_users() && - num_entries < MAX_SAM_ENTRIES && - ((name = builtin_alias_rids[num_entries].name) != NULL)) - { - init_unistr2(&(pass[num_entries].uni_user_name), name, strlen(name)+1); - pass[num_entries].user_rid = builtin_alias_rids[num_entries].rid; - num_entries++; - } - } - else if (strequal(sid_str, sam_sid_str) && !lp_hide_local_users()) - { - char *name; - char *sep; - - sep = lp_winbind_separator(); - - /* local aliases */ - /* we return the UNIX groups here. This seems to be the right */ - /* thing to do, since NT member servers return their local */ - /* groups in the same situation. */ - setgrent(); - - while (num_entries < MAX_SAM_ENTRIES && ((grp = getgrent()) != NULL)) - { - int i; - uint32 trid; - name = grp->gr_name; - - /* Don't return winbind groups as they are not local! */ - - if (strchr(name, *sep) != NULL) { - continue; - } - - trid = pdb_gid_to_group_rid(grp->gr_gid); - for( i = 0; i < num_entries; i++) - if ( pass[i].user_rid == trid ) break; - if ( i < num_entries ) - continue; /* rid was there, dup! */ - - init_unistr2(&(pass[num_entries].uni_user_name), name, strlen(name)+1); - pass[num_entries].user_rid = trid; - num_entries++; - } - - endgrent(); - } - - init_samr_r_enum_dom_aliases(&r_e, num_entries, pass, r_e.status); + r_u.status = _samr_enum_dom_groups(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_enum_dom_aliases("", &r_e, rdata, 0)) + if(!samr_io_r_enum_dom_groups("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_enum_dom_aliases: %d\n", __LINE__)); - return True; } /******************************************************************* api_samr_enum_dom_aliases ********************************************************************/ + static BOOL api_samr_enum_dom_aliases(pipes_struct *p) { - SAMR_Q_ENUM_DOM_ALIASES q_e; + SAMR_Q_ENUM_DOM_ALIASES q_u; + SAMR_R_ENUM_DOM_ALIASES r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - ZERO_STRUCT(q_e); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); /* grab the samr open */ - if(!samr_io_q_enum_dom_aliases("", &q_e, data, 0)) + if(!samr_io_q_enum_dom_aliases("", &q_u, data, 0)) return False; - /* construct reply. */ - if(!samr_reply_enum_dom_aliases(&q_e, rdata)) - return False; - - return True; -} - - -/******************************************************************* - samr_reply_query_dispinfo - ********************************************************************/ -static BOOL samr_reply_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_u, prs_struct *rdata) -{ - SAMR_R_QUERY_DISPINFO r_e; - SAM_INFO_CTR ctr; - SAM_INFO_1 info1; - SAM_INFO_2 info2; - SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]; - int num_entries = 0; - int total_entries = 0; - BOOL got_pwds; - uint16 switch_level = 0x0; - - ZERO_STRUCT(r_e); - - DEBUG(5,("samr_reply_query_dispinfo: %d\n", __LINE__)); - - /* find the policy handle. open a policy on it. */ - if (r_e.status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - r_e.status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - DEBUG(5,("samr_reply_query_dispinfo: invalid handle\n")); - } - - if (r_e.status == 0x0) - { - /* decide how many entries to get depending on the max_entries - and max_size passed by client */ - uint32 retsize; - - if(q_u->max_entries > MAX_SAM_ENTRIES) - q_u->max_entries = MAX_SAM_ENTRIES; - - retsize = (q_u->max_entries * (sizeof(SAM_ENTRY1)+sizeof(SAM_STR1))) - + 3*sizeof(uint32); - - if(retsize > q_u->max_size) - { - /* determine max_entries based on max_size */ - q_u->max_entries = (q_u->max_size - 3*sizeof(uint32)) / - (sizeof(SAM_ENTRY1)+sizeof(SAM_STR1)); - q_u->max_entries = (q_u->max_entries>0?q_u->max_entries:1); - } - - DEBUG(10,("samr_reply_query_dispinfo: Setting q_u->max_entries to %u\n",q_u->max_entries)); - - become_root(); - got_pwds = get_passwd_entries(pass, q_u->start_idx, &total_entries, &num_entries, q_u->max_entries, 0); - unbecome_root(); - - /* more left - set resume handle */ - if(total_entries > num_entries) - { - r_e.status = 0x105; - } - - switch (q_u->switch_level) - { - case 0x1: - { - - /* query disp info is for users */ - ZERO_STRUCT (info1); - switch_level = 0x1; - init_sam_info_1(&info1, ACB_NORMAL, - q_u->start_idx, num_entries, pass); - - ctr.sam.info1 = &info1; - - break; - } - case 0x2: - { - /* query disp info is for servers */ - ZERO_STRUCT (info2); - switch_level = 0x2; - init_sam_info_2(&info2, ACB_WSTRUST, - q_u->start_idx, num_entries, pass); - - ctr.sam.info2 = &info2; - - break; - } - } - } - - /* more left - set resume handle */ - if(total_entries > num_entries) - { - r_e.status = 0x105; - } - - if (r_e.status == 0 || r_e.status == 0x105) - { - init_samr_r_query_dispinfo(&r_e, switch_level, &ctr, r_e.status); - } + r_u.status = _samr_enum_dom_aliases(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_query_dispinfo("", &r_e, rdata, 0)) + if(!samr_io_r_enum_dom_aliases("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_query_dispinfo: %d\n", __LINE__)); - return True; } /******************************************************************* api_samr_query_dispinfo ********************************************************************/ + static BOOL api_samr_query_dispinfo(pipes_struct *p) { - SAMR_Q_QUERY_DISPINFO q_e; + SAMR_Q_QUERY_DISPINFO q_u; + SAMR_R_QUERY_DISPINFO r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open */ - if(!samr_io_q_query_dispinfo("", &q_e, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. */ - if(!samr_reply_query_dispinfo(&q_e, rdata)) + if(!samr_io_q_query_dispinfo("", &q_u, data, 0)) return False; - return True; -} - + r_u.status = _samr_query_dispinfo(p, &q_u, &r_u); -/******************************************************************* - samr_reply_query_aliasinfo - ********************************************************************/ -static BOOL samr_reply_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_u, - prs_struct *rdata) -{ - SAMR_R_QUERY_ALIASINFO r_e; - fstring alias_desc = "Local Unix group"; - fstring alias=""; - enum SID_NAME_USE type; - uint32 alias_rid; - - ZERO_STRUCT(r_e); - - DEBUG(5,("samr_reply_query_aliasinfo: %d\n", __LINE__)); - - /* find the policy handle. open a policy on it. */ - if (r_e.status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - r_e.status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - alias_rid = get_lsa_policy_samr_rid(&q_u->pol); - if(alias_rid == 0xffffffff) - r_e.status = 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS; - - if(!local_lookup_rid(alias_rid, alias, &type)) - { - r_e.status = 0xC0000000 | NT_STATUS_NO_SUCH_ALIAS; - } - - init_samr_r_query_aliasinfo(&r_e, q_u->switch_level, alias, alias_desc); - - /* store the response in the SMB stream */ - if(!samr_io_r_query_aliasinfo("", &r_e, rdata, 0)) + /* store the response in the SMB stream */ + if(!samr_io_r_query_dispinfo("", &r_u, rdata, 0)) return False; - - DEBUG(5,("samr_query_aliasinfo: %d\n", __LINE__)); return True; } @@ -1020,1461 +257,878 @@ static BOOL samr_reply_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_u, /******************************************************************* api_samr_query_aliasinfo ********************************************************************/ + static BOOL api_samr_query_aliasinfo(pipes_struct *p) { - SAMR_Q_QUERY_ALIASINFO q_e; + SAMR_Q_QUERY_ALIASINFO q_u; + SAMR_R_QUERY_ALIASINFO r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + /* grab the samr open */ - if(!samr_io_q_query_aliasinfo("", &q_e, data, 0)) + if(!samr_io_q_query_aliasinfo("", &q_u, data, 0)) return False; - /* construct reply. */ - if(!samr_reply_query_aliasinfo(&q_e, rdata)) - return False; + r_u.status = _samr_query_aliasinfo(p, &q_u, &r_u); + /* store the response in the SMB stream */ + if(!samr_io_r_query_aliasinfo("", &r_u, rdata, 0)) + return False; + return True; } - /******************************************************************* - samr_reply_lookup_ids + api_samr_lookup_names ********************************************************************/ -static BOOL samr_reply_lookup_ids(SAMR_Q_LOOKUP_IDS *q_u, - prs_struct *rdata) -{ - uint32 rid[MAX_SAM_ENTRIES]; - uint32 status = 0; - int num_rids = q_u->num_sids1; - - SAMR_R_LOOKUP_IDS r_u; - - DEBUG(5,("samr_lookup_ids: %d\n", __LINE__)); - if (num_rids > MAX_SAM_ENTRIES) - { - num_rids = MAX_SAM_ENTRIES; - DEBUG(5,("samr_lookup_ids: truncating entries to %d\n", num_rids)); - } +static BOOL api_samr_lookup_names(pipes_struct *p) +{ + SAMR_Q_LOOKUP_NAMES q_u; + SAMR_R_LOOKUP_NAMES r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; -#if 0 - int i; - SMB_ASSERT_ARRAY(q_u->uni_user_name, num_rids); - - for (i = 0; i < num_rids && status == 0; i++) - { - SAM_ACCOUNT *sam_pass; - fstring user_name; - - - fstrcpy(user_name, unistrn2(q_u->uni_user_name[i].buffer, - q_u->uni_user_name[i].uni_str_len)); - - /* find the user account */ - become_root(); - sam_pass = pdb_getsampwnam(user_name); - unbecome_root(); - - if (sam_pass == NULL) - { - status = 0xC0000000 | NT_STATUS_NO_SUCH_USER; - rid[i] = 0; - } - else - { - rid[i] = pdb_get_user_rid(sam_pass); - } - } -#endif + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - num_rids = 1; - rid[0] = BUILTIN_ALIAS_RID_USERS; + /* grab the samr lookup names */ + if(!samr_io_q_lookup_names("", &q_u, data, 0)) + return False; - init_samr_r_lookup_ids(&r_u, num_rids, rid, status); + r_u.status = _samr_lookup_names(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_lookup_ids("", &r_u, rdata, 0)) + if(!samr_io_r_lookup_names("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_lookup_ids: %d\n", __LINE__)); - return True; } /******************************************************************* - api_samr_lookup_ids + api_samr_chgpasswd_user ********************************************************************/ -static BOOL api_samr_lookup_ids(pipes_struct *p) + +static BOOL api_samr_chgpasswd_user(pipes_struct *p) { - SAMR_Q_LOOKUP_IDS q_u; + SAMR_Q_CHGPASSWD_USER q_u; + SAMR_R_CHGPASSWD_USER r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr 0x10 */ - if(!samr_io_q_lookup_ids("", &q_u, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. always indicate success */ - if(!samr_reply_lookup_ids(&q_u, rdata)) + /* unknown 38 command */ + if (!samr_io_q_chgpasswd_user("", &q_u, data, 0)) { + DEBUG(0,("api_samr_chgpasswd_user: Failed to unmarshall SAMR_Q_CHGPASSWD_USER.\n")); return False; - - return True; -} - -/******************************************************************* - samr_reply_lookup_names - ********************************************************************/ - -static BOOL samr_reply_lookup_names(SAMR_Q_LOOKUP_NAMES *q_u, - prs_struct *rdata) -{ - uint32 rid[MAX_SAM_ENTRIES]; - enum SID_NAME_USE type[MAX_SAM_ENTRIES]; - uint32 status = 0; - int i; - int num_rids = q_u->num_names1; - DOM_SID pol_sid; - - SAMR_R_LOOKUP_NAMES r_u; - - DEBUG(5,("samr_lookup_names: %d\n", __LINE__)); - - ZERO_ARRAY(rid); - ZERO_ARRAY(type); - - if (!get_lsa_policy_samr_sid(&q_u->pol, &pol_sid)) { - status = 0xC0000000 | NT_STATUS_OBJECT_TYPE_MISMATCH; - init_samr_r_lookup_names(&r_u, 0, rid, type, status); - if(!samr_io_r_lookup_names("", &r_u, rdata, 0)) { - DEBUG(0,("samr_reply_lookup_names: failed to marshall SAMR_R_LOOKUP_NAMES.\n")); - return False; - } - return True; - } - - if (num_rids > MAX_SAM_ENTRIES) { - num_rids = MAX_SAM_ENTRIES; - DEBUG(5,("samr_lookup_names: truncating entries to %d\n", num_rids)); - } - - SMB_ASSERT_ARRAY(q_u->uni_name, num_rids); - - for (i = 0; i < num_rids; i++) { - fstring name; - - status = 0xC0000000 | NT_STATUS_NONE_MAPPED; - - rid [i] = 0xffffffff; - type[i] = SID_NAME_UNKNOWN; - - fstrcpy(name, dos_unistrn2(q_u->uni_name[i].buffer, - q_u->uni_name[i].uni_str_len)); - - if(sid_equal(&pol_sid, &global_sam_sid)) - { - DOM_SID sid; - if(local_lookup_name(global_myname, name, - &sid, &type[i])) - { - sid_split_rid( &sid, &rid[i]); - status = 0; } - } - } - init_samr_r_lookup_names(&r_u, num_rids, rid, type, status); + r_u.status = _samr_chgpasswd_user(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_lookup_names("", &r_u, rdata, 0)) { - DEBUG(0,("samr_reply_lookup_names: failed to marshall SAMR_R_LOOKUP_NAMES.\n")); - return False; - } - - DEBUG(5,("samr_lookup_names: %d\n", __LINE__)); + /* store the response in the SMB stream */ + if(!samr_io_r_chgpasswd_user("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_chgpasswd_user: Failed to marshall SAMR_R_CHGPASSWD_USER.\n" )); + return False; + } - return True; + return True; } /******************************************************************* - api_samr_lookup_names + api_samr_lookup_rids ********************************************************************/ -static BOOL api_samr_lookup_names(pipes_struct *p) +static BOOL api_samr_lookup_rids(pipes_struct *p) { - SAMR_Q_LOOKUP_NAMES q_u; + SAMR_Q_LOOKUP_RIDS q_u; + SAMR_R_LOOKUP_RIDS r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - memset(&q_u, '\0', sizeof(q_u)); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); /* grab the samr lookup names */ - if(!samr_io_q_lookup_names("", &q_u, data, 0)) { - DEBUG(0,("api_samr_lookup_names: failed to unmarshall SAMR_Q_LOOKUP_NAMES.\n")); + if(!samr_io_q_lookup_rids("", &q_u, data, 0)) return False; - } - /* construct reply. always indicate success */ - if(!samr_reply_lookup_names(&q_u, rdata)) + r_u.status = _samr_lookup_rids(p, &q_u, &r_u); + + /* store the response in the SMB stream */ + if(!samr_io_r_lookup_rids("", &r_u, rdata, 0)) return False; return True; } /******************************************************************* - samr_reply_chgpasswd_user + api_samr_open_user ********************************************************************/ -static BOOL samr_reply_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u, - prs_struct *rdata) +static BOOL api_samr_open_user(pipes_struct *p) { - SAMR_R_CHGPASSWD_USER r_u; - uint32 status = 0x0; - fstring user_name; - fstring wks; - - fstrcpy(user_name, dos_unistrn2(q_u->uni_user_name.buffer, q_u->uni_user_name.uni_str_len)); - fstrcpy(wks , dos_unistrn2(q_u->uni_dest_host.buffer, q_u->uni_dest_host.uni_str_len)); + SAMR_Q_OPEN_USER q_u; + SAMR_R_OPEN_USER r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - DEBUG(5,("samr_chgpasswd_user: user: %s wks: %s\n", user_name, wks)); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (!pass_oem_change(user_name, - q_u->lm_newpass.pass, q_u->lm_oldhash.hash, - q_u->nt_newpass.pass, q_u->nt_oldhash.hash)) - { - status = 0xC0000000 | NT_STATUS_WRONG_PASSWORD; - } + /* grab the samr unknown 22 */ + if(!samr_io_q_open_user("", &q_u, data, 0)) + return False; - init_samr_r_chgpasswd_user(&r_u, status); + r_u.status = _api_samr_open_user(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_chgpasswd_user("", &r_u, rdata, 0)) { - DEBUG(0,("samr_reply_chgpasswd_user: Failed to marshall SAMR_R_CHGPASSWD_USER struct.\n" )); + if(!samr_io_r_open_user("", &r_u, rdata, 0)) return False; - } - DEBUG(5,("samr_chgpasswd_user: %d\n", __LINE__)); + DEBUG(5,("samr_open_user: %d\n", __LINE__)); + return True; } /******************************************************************* - api_samr_chgpasswd_user + api_samr_query_userinfo ********************************************************************/ -static BOOL api_samr_chgpasswd_user(pipes_struct *p) +static BOOL api_samr_query_userinfo(pipes_struct *p) { - SAMR_Q_CHGPASSWD_USER q_u; + SAMR_Q_QUERY_USERINFO q_u; + SAMR_R_QUERY_USERINFO r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* unknown 38 command */ - if (!samr_io_q_chgpasswd_user("", &q_u, data, 0)) { - DEBUG(0,("api_samr_chgpasswd_user: samr_io_q_chgpasswd_user failed to parse RPC packet.\n")); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + /* grab the samr unknown 24 */ + if(!samr_io_q_query_userinfo("", &q_u, data, 0)) return False; - } - /* construct reply. */ - if(!samr_reply_chgpasswd_user(&q_u, rdata)) { - DEBUG(0,("api_samr_chgpasswd_user: samr_reply_chgpasswd_user failed to create reply packet.\n")); + r_u.status = _samr_query_userinfo(p, &q_u, &r_u); + + /* store the response in the SMB stream */ + if(!samr_io_r_query_userinfo("", &r_u, rdata, 0)) return False; - } return True; } - /******************************************************************* - samr_reply_unknown_38 + api_samr_query_usergroups ********************************************************************/ -static BOOL samr_reply_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, prs_struct *rdata) + +static BOOL api_samr_query_usergroups(pipes_struct *p) { - SAMR_R_UNKNOWN_38 r_u; + SAMR_Q_QUERY_USERGROUPS q_u; + SAMR_R_QUERY_USERGROUPS r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; + + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - DEBUG(5,("samr_unknown_38: %d\n", __LINE__)); + /* grab the samr unknown 32 */ + if(!samr_io_q_query_usergroups("", &q_u, data, 0)) + return False; - init_samr_r_unknown_38(&r_u); + r_u.status = _samr_query_usergroups(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_unknown_38("", &r_u, rdata, 0)) + if(!samr_io_r_query_usergroups("", &r_u, rdata, 0)) { return False; + } - DEBUG(5,("samr_unknown_38: %d\n", __LINE__)); return True; } /******************************************************************* - api_samr_unknown_38 + api_samr_query_dom_info ********************************************************************/ -static BOOL api_samr_unknown_38(pipes_struct *p) + +static BOOL api_samr_query_dom_info(pipes_struct *p) { - SAMR_Q_UNKNOWN_38 q_u; + SAMR_Q_QUERY_DOMAIN_INFO q_u; + SAMR_R_QUERY_DOMAIN_INFO r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* unknown 38 command */ - if(!samr_io_q_unknown_38("", &q_u, data, 0)) + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + /* grab the samr unknown 8 command */ + if(!samr_io_q_query_dom_info("", &q_u, data, 0)) return False; - /* construct reply. always indicate success */ - if(!samr_reply_unknown_38(&q_u, rdata)) + r_u.status = _samr_query_dom_info(p, &q_u, &r_u); + + /* store the response in the SMB stream */ + if(!samr_io_r_query_dom_info("", &r_u, rdata, 0)) return False; + DEBUG(5,("api_samr_query_dom_info: %d\n", __LINE__)); + return True; } - /******************************************************************* - samr_reply_lookup_rids + api_samr_create_user ********************************************************************/ -static BOOL samr_reply_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u, - prs_struct *rdata) -{ - fstring group_names[MAX_SAM_ENTRIES]; - uint32 group_attrs[MAX_SAM_ENTRIES]; - uint32 status = 0; - int num_gids = q_u->num_gids1; - SAMR_R_LOOKUP_RIDS r_u; +static BOOL api_samr_create_user(pipes_struct *p) +{ + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - DEBUG(5,("samr_reply_lookup_rids: %d\n", __LINE__)); + SAMR_Q_CREATE_USER q_u; + SAMR_R_CREATE_USER r_u; - /* find the policy handle. open a policy on it. */ - if (status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (status == 0x0) - { - int i; - if (num_gids > MAX_SAM_ENTRIES) - { - num_gids = MAX_SAM_ENTRIES; - DEBUG(5,("samr_reply_lookup_rids: truncating entries to %d\n", num_gids)); - } - - for (i = 0; i < num_gids && status == 0; i++) - { - fstrcpy(group_names[i], "dummy group"); - group_attrs[i] = 0x2; - } + /* grab the samr create user */ + if (!samr_io_q_create_user("", &q_u, data, 0)) { + DEBUG(0,("api_samr_create_user: Unable to unmarshall SAMR_Q_CREATE_USER.\n")); + return False; } - init_samr_r_lookup_rids(&r_u, num_gids, group_names, group_attrs, status); + r_u.status=_api_samr_create_user(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_lookup_rids("", &r_u, rdata, 0)) + if(!samr_io_r_create_user("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_create_user: Unable to marshall SAMR_R_CREATE_USER.\n")); return False; - - DEBUG(5,("samr_reply_lookup_rids: %d\n", __LINE__)); + } return True; } /******************************************************************* - api_samr_lookup_rids + api_samr_connect_anon ********************************************************************/ -static BOOL api_samr_lookup_rids(pipes_struct *p) + +static BOOL api_samr_connect_anon(pipes_struct *p) { - SAMR_Q_LOOKUP_RIDS q_u; + SAMR_Q_CONNECT_ANON q_u; + SAMR_R_CONNECT_ANON r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr lookup names */ - if(!samr_io_q_lookup_rids("", &q_u, data, 0)) + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + /* grab the samr open policy */ + if(!samr_io_q_connect_anon("", &q_u, data, 0)) return False; - /* construct reply. always indicate success */ - if(!samr_reply_lookup_rids(&q_u, rdata)) + r_u.status = _samr_connect_anon(p, &q_u, &r_u); + + /* store the response in the SMB stream */ + if(!samr_io_r_connect_anon("", &r_u, rdata, 0)) return False; return True; } - /******************************************************************* - _api_samr_open_user + api_samr_connect ********************************************************************/ -static uint32 _api_samr_open_user(POLICY_HND domain_pol, uint32 user_rid, POLICY_HND *user_pol) -{ - SAM_ACCOUNT *sam_pass; - DOM_SID sid; - - /* find the domain policy handle. */ - if (find_lsa_policy_by_hnd(&domain_pol) == -1) - return NT_STATUS_INVALID_HANDLE; - - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(user_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - - become_root(); - sam_pass = pdb_getsampwrid(user_rid); - unbecome_root(); - - /* check that the RID exists in our domain. */ - if (sam_pass == NULL) { - close_lsa_policy_hnd(user_pol); - return NT_STATUS_NO_SUCH_USER; - } - - /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(&domain_pol, &sid)) { - close_lsa_policy_hnd(user_pol); - return NT_STATUS_INVALID_HANDLE; - } - - /* append the user's RID to it */ - if(!sid_append_rid(&sid, user_rid)) { - close_lsa_policy_hnd(user_pol); - return NT_STATUS_NO_SUCH_USER; - } - /* associate the user's SID with the handle. */ - if (!set_lsa_policy_samr_sid(user_pol, &sid)) { - /* oh, whoops. don't know what error message to return, here */ - close_lsa_policy_hnd(user_pol); - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } - - return NT_STATUS_NO_PROBLEMO; -} - -/******************************************************************* - api_samr_open_user - ********************************************************************/ -static BOOL api_samr_open_user(pipes_struct *p) +static BOOL api_samr_connect(pipes_struct *p) { - SAMR_Q_OPEN_USER q_u; - SAMR_R_OPEN_USER r_u; + SAMR_Q_CONNECT q_u; + SAMR_R_CONNECT r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - /* grab the samr unknown 22 */ - if(!samr_io_q_open_user("", &q_u, data, 0)) + /* grab the samr open policy */ + if(!samr_io_q_connect("", &q_u, data, 0)) return False; - r_u.status = _api_samr_open_user(q_u.domain_pol, q_u.user_rid, &r_u.user_pol); + r_u.status = _samr_connect(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_open_user("", &r_u, rdata, 0)) + if(!samr_io_r_connect("", &r_u, rdata, 0)) return False; - DEBUG(5,("samr_open_user: %d\n", __LINE__)); - return True; } -/************************************************************************* - get_user_info_10 - *************************************************************************/ -static BOOL get_user_info_10(SAM_USER_INFO_10 *id10, uint32 user_rid) +/********************************************************************** + api_samr_lookup_domain + **********************************************************************/ + +static BOOL api_samr_lookup_domain(pipes_struct *p) { - SAM_ACCOUNT *sampass; + SAMR_Q_LOOKUP_DOMAIN q_u; + SAMR_R_LOOKUP_DOMAIN r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; + + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (!pdb_rid_is_user(user_rid)) - { - DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); + if(!samr_io_q_lookup_domain("", &q_u, data, 0)) { + DEBUG(0,("api_samr_lookup_domain: Unable to unmarshall SAMR_Q_LOOKUP_DOMAIN.\n")); return False; } - become_root(); - sampass = pdb_getsampwrid(user_rid); - unbecome_root(); - - if (sampass == NULL) - { - DEBUG(4,("User 0x%x not found\n", user_rid)); + r_u.status = _samr_lookup_domain(p, &q_u, &r_u); + + if(!samr_io_r_lookup_domain("", &r_u, rdata, 0)){ + DEBUG(0,("api_samr_lookup_domain: Unable to marshall SAMR_R_LOOKUP_DOMAIN.\n")); return False; } - - DEBUG(3,("User:[%s]\n", pdb_get_username(sampass))); - - init_sam_user_info10(id10, pdb_get_acct_ctrl(sampass)); - + return True; } -/************************************************************************* - get_user_info_21 - *************************************************************************/ -static BOOL get_user_info_21(SAM_USER_INFO_21 *id21, uint32 user_rid) +/********************************************************************** + api_samr_enum_domains + **********************************************************************/ + +static BOOL api_samr_enum_domains(pipes_struct *p) { - SAM_ACCOUNT *sam_pass; + SAMR_Q_ENUM_DOMAINS q_u; + SAMR_R_ENUM_DOMAINS r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; + + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (!pdb_rid_is_user(user_rid)) - { - DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); + if(!samr_io_q_enum_domains("", &q_u, data, 0)) { + DEBUG(0,("api_samr_enum_domains: Unable to unmarshall SAMR_Q_ENUM_DOMAINS.\n")); return False; } - become_root(); - sam_pass = pdb_getsampwrid(user_rid); - unbecome_root(); + r_u.status = _samr_enum_domains(p, &q_u, &r_u); - if (sam_pass == NULL) - { - DEBUG(4,("User 0x%x not found\n", user_rid)); + if(!samr_io_r_enum_domains("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_enum_domains: Unable to marshall SAMR_R_ENUM_DOMAINS.\n")); return False; } - - DEBUG(3,("User:[%s]\n", pdb_get_username(sam_pass))); - - init_sam_user_info21(id21, sam_pass); - + return True; } /******************************************************************* - samr_reply_query_userinfo + api_samr_open_alias ********************************************************************/ -static BOOL samr_reply_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u, - prs_struct *rdata) -{ - SAMR_R_QUERY_USERINFO r_u; -#if 0 - SAM_USER_INFO_11 id11; -#endif - SAM_USER_INFO_10 id10; - SAM_USER_INFO_21 id21; - void *info = NULL; - - uint32 status = 0x0; - uint32 rid = 0x0; - - DEBUG(5,("samr_reply_query_userinfo: %d\n", __LINE__)); - /* search for the handle */ - if (status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - status = NT_STATUS_INVALID_HANDLE; - } +static BOOL api_samr_open_alias(pipes_struct *p) +{ + SAMR_Q_OPEN_ALIAS q_u; + SAMR_R_OPEN_ALIAS r_u; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - /* find the user's rid */ - if (status == 0x0 && (rid = get_lsa_policy_samr_rid(&(q_u->pol))) == 0xffffffff) - { - status = NT_STATUS_OBJECT_TYPE_MISMATCH; - } + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - DEBUG(5,("samr_reply_query_userinfo: rid:0x%x\n", rid)); - - /* ok! user info levels (there are lots: see MSDEV help), off we go... */ - if (status == 0x0) - { - switch (q_u->switch_value) - { - case 0x10: - { - info = (void*)&id10; - status = get_user_info_10(&id10, rid) ? 0 : NT_STATUS_NO_SUCH_USER; - break; - } -#if 0 -/* whoops - got this wrong. i think. or don't understand what's happening. */ - case 0x11: - { - NTTIME expire; - info = (void*)&id11; - - expire.low = 0xffffffff; - expire.high = 0x7fffffff; - - make_sam_user_info11(&id11, &expire, "BROOKFIELDS$", 0x03ef, 0x201, 0x0080); - - break; - } -#endif - case 21: - { - info = (void*)&id21; - status = get_user_info_21(&id21, rid) ? 0 : NT_STATUS_NO_SUCH_USER; - break; - } - - default: - { - status = NT_STATUS_INVALID_INFO_CLASS; - - break; - } - } + /* grab the samr open policy */ + if(!samr_io_q_open_alias("", &q_u, data, 0)) { + DEBUG(0,("api_samr_open_alias: Unable to unmarshall SAMR_Q_OPEN_ALIAS.\n")); + return False; } - init_samr_r_query_userinfo(&r_u, q_u->switch_value, info, status); + r_u.status=_api_samr_open_alias(p, &q_u, &r_u); /* store the response in the SMB stream */ - if(!samr_io_r_query_userinfo("", &r_u, rdata, 0)) + if(!samr_io_r_open_alias("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_open_alias: Unable to marshall SAMR_R_OPEN_ALIAS.\n")); return False; - - DEBUG(5,("samr_reply_query_userinfo: %d\n", __LINE__)); - + } + return True; } /******************************************************************* - api_samr_query_userinfo + api_samr_set_userinfo ********************************************************************/ -static BOOL api_samr_query_userinfo(pipes_struct *p) + +static BOOL api_samr_set_userinfo(pipes_struct *p) { - SAMR_Q_QUERY_USERINFO q_u; + SAMR_Q_SET_USERINFO q_u; + SAMR_R_SET_USERINFO r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr unknown 24 */ - if(!samr_io_q_query_userinfo("", &q_u, data, 0)) - return False; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* construct reply. always indicate success */ - if(!samr_reply_query_userinfo(&q_u, rdata)) + if (!samr_io_q_set_userinfo("", &q_u, data, 0)) { + DEBUG(0,("api_samr_set_userinfo: Unable to unmarshall SAMR_Q_SET_USERINFO.\n")); return False; - - return True; -} - - -/******************************************************************* - samr_reply_query_usergroups - ********************************************************************/ -static BOOL samr_reply_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u, - prs_struct *rdata) -{ - SAMR_R_QUERY_USERGROUPS r_u; - uint32 status = 0x0; - - SAM_ACCOUNT *sam_pass; - DOM_GID *gids = NULL; - int num_groups = 0; - uint32 rid; - - DEBUG(5,("samr_query_usergroups: %d\n", __LINE__)); - - /* find the policy handle. open a policy on it. */ - if (status == 0x0 && (find_lsa_policy_by_hnd(&(q_u->pol)) == -1)) - { - status = 0xC0000000 | NT_STATUS_INVALID_HANDLE; - } - - /* find the user's rid */ - if (status == 0x0 && (rid = get_lsa_policy_samr_rid(&(q_u->pol))) == 0xffffffff) - { - status = NT_STATUS_OBJECT_TYPE_MISMATCH; - } - - if (status == 0x0) - { - become_root(); - sam_pass = pdb_getsampwrid(rid); - unbecome_root(); - - if (sam_pass == NULL) - { - status = 0xC0000000 | NT_STATUS_NO_SUCH_USER; - } - } - - if (status == 0x0) - { - pstring groups; - get_domain_user_groups(groups, pdb_get_username(sam_pass)); - gids = NULL; - num_groups = make_dom_gids(groups, &gids); } - /* construct the response. lkclXXXX: gids are not copied! */ - init_samr_r_query_usergroups(&r_u, num_groups, gids, status); + r_u.status = _samr_set_userinfo(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_query_usergroups("", &r_u, rdata, 0)) { - if (gids) - free((char *)gids); + if(!samr_io_r_set_userinfo("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_set_userinfo: Unable to marshall SAMR_R_SET_USERINFO.\n")); return False; } - if (gids) - free((char *)gids); - - DEBUG(5,("samr_query_usergroups: %d\n", __LINE__)); - return True; } /******************************************************************* - api_samr_query_usergroups + api_samr_set_userinfo2 ********************************************************************/ -static BOOL api_samr_query_usergroups(pipes_struct *p) + +static BOOL api_samr_set_userinfo2(pipes_struct *p) { - SAMR_Q_QUERY_USERGROUPS q_u; + SAMR_Q_SET_USERINFO2 q_u; + SAMR_R_SET_USERINFO2 r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr unknown 32 */ - if(!samr_io_q_query_usergroups("", &q_u, data, 0)) + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if (!samr_io_q_set_userinfo2("", &q_u, data, 0)) { + DEBUG(0,("api_samr_set_userinfo2: Unable to unmarshall SAMR_Q_SET_USERINFO2.\n")); return False; + } - /* construct reply. */ - if(!samr_reply_query_usergroups(&q_u, rdata)) + r_u.status = _samr_set_userinfo2(p, &q_u, &r_u); + + if(!samr_io_r_set_userinfo2("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_set_userinfo2: Unable to marshall SAMR_R_SET_USERINFO2.\n")); return False; + } return True; } - /******************************************************************* - api_samr_query_dom_info + api_samr_query_useraliases ********************************************************************/ -static BOOL api_samr_query_dom_info(pipes_struct *p) + +static BOOL api_samr_query_useraliases(pipes_struct *p) { - SAMR_Q_QUERY_DOMAIN_INFO q_u; - SAMR_R_QUERY_DOMAIN_INFO r_u; - SAM_UNK_CTR ctr; + SAMR_Q_QUERY_USERALIASES q_u; + SAMR_R_QUERY_USERALIASES r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - uint16 switch_value = 0x0; - uint32 status = 0x0; - ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - ZERO_STRUCT(ctr); - - DEBUG(5,("api_samr_query_dom_info: %d\n", __LINE__)); - /* grab the samr unknown 8 command */ - if(!samr_io_q_query_dom_info("", &q_u, data, 0)) + if (!samr_io_q_query_useraliases("", &q_u, data, 0)) { + DEBUG(0,("api_samr_query_useraliases: Unable to unmarshall SAMR_Q_QUERY_USERALIASES.\n")); return False; - - /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&q_u.domain_pol) == -1) { - status = NT_STATUS_INVALID_HANDLE; - DEBUG(5,("api_samr_query_dom_info: invalid handle\n")); } - if (status == 0x0) { - switch (q_u.switch_value) { - case 0x01: - switch_value = 0x1; - init_unk_info1(&ctr.info.inf1); - break; - case 0x02: - switch_value = 0x2; - init_unk_info2(&ctr.info.inf2, global_myworkgroup, global_myname); - break; - case 0x03: - switch_value = 0x3; - init_unk_info3(&ctr.info.inf3); - break; - case 0x06: - switch_value = 0x6; - init_unk_info6(&ctr.info.inf6); - break; - case 0x07: - switch_value = 0x7; - init_unk_info7(&ctr.info.inf7); - break; - case 0x0c: - switch_value = 0xc; - init_unk_info12(&ctr.info.inf12); - break; - default: - status = NT_STATUS_INVALID_INFO_CLASS; - break; - } - } - - init_samr_r_query_dom_info(&r_u, switch_value, &ctr, status); + r_u.status = _samr_query_useraliases(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_query_dom_info("", &r_u, rdata, 0)) + if (! samr_io_r_query_useraliases("", &r_u, rdata, 0)) { + DEBUG(0,("api_samr_query_useraliases: Unable to nmarshall SAMR_R_QUERY_USERALIASES.\n")); return False; - - DEBUG(5,("api_samr_query_dom_info: %d\n", __LINE__)); + } return True; } - /******************************************************************* - _api_samr_create_user + api_samr_query_aliasmem ********************************************************************/ -static BOOL _api_samr_create_user(POLICY_HND dom_pol, UNISTR2 user_account, uint32 acb_info, uint32 access_mask, - POLICY_HND *user_pol, uint32 *unknown0, uint32 *user_rid) + +static BOOL api_samr_query_aliasmem(pipes_struct *p) { - SAM_ACCOUNT *sam_pass; - fstring mach_acct; - pstring err_str; - pstring msg_str; - int local_flags=0; - DOM_SID sid; - - /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&dom_pol) == -1) - return NT_STATUS_INVALID_HANDLE; - - /* find the machine account: tell the caller if it exists. - lkclXXXX i have *no* idea if this is a problem or not - or even if you are supposed to construct a different - reply if the account already exists... - */ - - fstrcpy(mach_acct, dos_unistrn2(user_account.buffer, user_account.uni_str_len)); - strlower(mach_acct); - - become_root(); - sam_pass = pdb_getsampwnam(mach_acct); - unbecome_root(); - if (sam_pass != NULL) - { - /* machine account exists: say so */ - return NT_STATUS_USER_EXISTS; - } + SAMR_Q_QUERY_ALIASMEM q_u; + SAMR_R_QUERY_ALIASMEM r_u; - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(user_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - - local_flags=LOCAL_ADD_USER|LOCAL_DISABLE_USER|LOCAL_SET_NO_PASSWORD; - local_flags|= (acb_info & ACB_WSTRUST) ? LOCAL_TRUST_ACCOUNT:0; - - /* - * NB. VERY IMPORTANT ! This call must be done as the current pipe user, - * *NOT* surrounded by a become_root()/unbecome_root() call. This ensures - * that only people with write access to the smbpasswd file will be able - * to create a user. JRA. - */ - - /* add the user in the /etc/passwd file or the unix authority system */ - if (lp_adduser_script()) - smb_create_user(mach_acct,NULL); - - /* add the user in the smbpasswd file or the Samba authority database */ - if (!local_password_change(mach_acct, local_flags, NULL, err_str, - sizeof(err_str), msg_str, sizeof(msg_str))) - { - DEBUG(0, ("%s\n", err_str)); - close_lsa_policy_hnd(user_pol); - return NT_STATUS_ACCESS_DENIED; - } + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - become_root(); - sam_pass = pdb_getsampwnam(mach_acct); - unbecome_root(); - if (sam_pass == NULL) { - /* account doesn't exist: say so */ - close_lsa_policy_hnd(user_pol); - return NT_STATUS_ACCESS_DENIED; - } + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(&dom_pol, &sid)) { - close_lsa_policy_hnd(user_pol); - return NT_STATUS_INVALID_HANDLE; + if (!samr_io_q_query_aliasmem("", &q_u, data, 0)) { + return False; } - /* append the user's RID to it */ - if(!sid_append_rid(&sid, sam_pass->user_rid)) { - close_lsa_policy_hnd(user_pol); - return NT_STATUS_NO_SUCH_USER; - } + r_u.status = _samr_query_aliasmem(p, &q_u, &r_u); - /* associate the RID with the (unique) handle. */ - if (!set_lsa_policy_samr_sid(user_pol, &sid)) { - /* oh, whoops. don't know what error message to return, here */ - close_lsa_policy_hnd(user_pol); - return NT_STATUS_OBJECT_NAME_NOT_FOUND; + if (!samr_io_r_query_aliasmem("", &r_u, rdata, 0)) { + return False; } - *unknown0 = 0x000703ff; - *user_rid = pdb_get_user_rid(sam_pass); - - return NT_STATUS_NO_PROBLEMO; + return True; } /******************************************************************* - api_samr_create_user + api_samr_query_groupmem ********************************************************************/ -static BOOL api_samr_create_user(pipes_struct *p) + +static BOOL api_samr_query_groupmem(pipes_struct *p) { + SAMR_Q_QUERY_GROUPMEM q_u; + SAMR_R_QUERY_GROUPMEM r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - SAMR_Q_CREATE_USER q_u; - SAMR_R_CREATE_USER r_u; - ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - /* grab the samr create user */ - if (!samr_io_q_create_user("", &q_u, data, 0)) { - DEBUG(0,("api_samr_create_user: Unable to unmarshall SAMR_Q_CREATE_USER.\n")); + if (!samr_io_q_query_groupmem("", &q_u, data, 0)) { return False; } - r_u.status=_api_samr_create_user(q_u.pol, q_u.uni_mach_acct, q_u.acb_info, q_u.access_mask, - &r_u.pol, &r_u.unknown_0, &r_u.user_rid); + r_u.status = _samr_query_groupmem(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_create_user("", &r_u, rdata, 0)) { - DEBUG(0,("api_samr_create_user: Unable to marshall SAMR_R_CREATE_USER.\n")); + if (!samr_io_r_query_groupmem("", &r_u, rdata, 0)) { return False; } return True; } - /******************************************************************* - samr_reply_connect_anon + api_samr_add_aliasmem ********************************************************************/ -static BOOL samr_reply_connect_anon(SAMR_Q_CONNECT_ANON *q_u, prs_struct *rdata) -{ - SAMR_R_CONNECT_ANON r_u; - BOOL pol_open = False; - /* set up the SAMR connect_anon response */ +static BOOL api_samr_add_aliasmem(pipes_struct *p) +{ + SAMR_Q_ADD_ALIASMEM q_u; + SAMR_R_ADD_ALIASMEM r_u; - r_u.status = 0x0; - /* get a (unique) handle. open a policy on it. */ - if (r_u.status == 0x0 && !(pol_open = open_lsa_policy_hnd(&(r_u.connect_pol)))) - { - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND; - } + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - /* associate the domain SID with the (unique) handle. */ - if (r_u.status == 0x0 && !set_lsa_policy_samr_pol_status(&(r_u.connect_pol), q_u->unknown_0)) - { - /* oh, whoops. don't know what error message to return, here */ - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND; - } + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (r_u.status != 0 && pol_open) - { - close_lsa_policy_hnd(&(r_u.connect_pol)); + if (!samr_io_q_add_aliasmem("", &q_u, data, 0)) { + return False; } - DEBUG(5,("samr_connect_anon: %d\n", __LINE__)); + r_u.status = _samr_add_aliasmem(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_connect_anon("", &r_u, rdata, 0)) + if (!samr_io_r_add_aliasmem("", &r_u, rdata, 0)) { return False; - - DEBUG(5,("samr_connect_anon: %d\n", __LINE__)); + } return True; } /******************************************************************* - api_samr_connect_anon + api_samr_del_aliasmem ********************************************************************/ -static BOOL api_samr_connect_anon(pipes_struct *p) + +static BOOL api_samr_del_aliasmem(pipes_struct *p) { - SAMR_Q_CONNECT_ANON q_u; + SAMR_Q_DEL_ALIASMEM q_u; + SAMR_R_DEL_ALIASMEM r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open policy */ - if(!samr_io_q_connect_anon("", &q_u, data, 0)) + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if (!samr_io_q_del_aliasmem("", &q_u, data, 0)) { return False; + } + + r_u.status = _samr_del_aliasmem(p, &q_u, &r_u); - /* construct reply. always indicate success */ - if(!samr_reply_connect_anon(&q_u, rdata)) + if (!samr_io_r_del_aliasmem("", &r_u, rdata, 0)) { return False; + } return True; } /******************************************************************* - samr_reply_connect + api_samr_add_groupmem ********************************************************************/ -static BOOL samr_reply_connect(SAMR_Q_CONNECT *q_u, prs_struct *rdata) -{ - SAMR_R_CONNECT r_u; - BOOL pol_open = False; - /* set up the SAMR connect response */ +static BOOL api_samr_add_groupmem(pipes_struct *p) +{ + SAMR_Q_ADD_GROUPMEM q_u; + SAMR_R_ADD_GROUPMEM r_u; - r_u.status = 0x0; - /* get a (unique) handle. open a policy on it. */ - if (r_u.status == 0x0 && !(pol_open = open_lsa_policy_hnd(&(r_u.connect_pol)))) - { - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND; - } + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - /* associate the domain SID with the (unique) handle. */ - if (r_u.status == 0x0 && - !set_lsa_policy_samr_pol_status(&(r_u.connect_pol), - q_u->access_mask)) - { - /* oh, whoops. don't know what error message to return, here */ - r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_NOT_FOUND; - } + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (r_u.status != 0 && pol_open) - { - close_lsa_policy_hnd(&(r_u.connect_pol)); + if (!samr_io_q_add_groupmem("", &q_u, data, 0)) { + return False; } - DEBUG(5,("samr_connect: %d\n", __LINE__)); + r_u.status = _samr_add_groupmem(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_connect("", &r_u, rdata, 0)) + if (!samr_io_r_add_groupmem("", &r_u, rdata, 0)) { return False; - - DEBUG(5,("samr_connect: %d\n", __LINE__)); + } return True; } /******************************************************************* - api_samr_connect + api_samr_del_groupmem ********************************************************************/ -static BOOL api_samr_connect(pipes_struct *p) -{ - SAMR_Q_CONNECT q_u; - prs_struct *data = &p->in_data.data; - prs_struct *rdata = &p->out_data.rdata; - /* grab the samr open policy */ - if(!samr_io_q_connect("", &q_u, data, 0)) - return False; - - /* construct reply. always indicate success */ - if(!samr_reply_connect(&q_u, rdata)) - return False; - - return True; -} - - -/********************************************************************** - api_samr_lookup_domain - **********************************************************************/ -static BOOL api_samr_lookup_domain(pipes_struct *p) +static BOOL api_samr_del_groupmem(pipes_struct *p) { - SAMR_Q_LOOKUP_DOMAIN q_u; - SAMR_R_LOOKUP_DOMAIN r_u; + SAMR_Q_DEL_GROUPMEM q_u; + SAMR_R_DEL_GROUPMEM r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - + ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - if(!samr_io_q_lookup_domain("", &q_u, data, 0)) { - DEBUG(0,("api_samr_lookup_domain: Unable to unmarshall SAMR_Q_LOOKUP_DOMAIN.\n")); + if (!samr_io_q_del_groupmem("", &q_u, data, 0)) { return False; } - - r_u.status = 0x0; - if (find_lsa_policy_by_hnd(&q_u.connect_pol) == -1){ - r_u.status = NT_STATUS_INVALID_HANDLE; - DEBUG(5,("api_samr_lookup_domain: invalid handle\n")); - } - - /* assume the domain name sent is our global_myname and - send global_sam_sid */ - init_samr_r_lookup_domain(&r_u, &global_sam_sid, r_u.status); - - if(!samr_io_r_lookup_domain("", &r_u, rdata, 0)){ - DEBUG(0,("api_samr_lookup_domain: Unable to marshall SAMR_R_LOOKUP_DOMAIN.\n")); + r_u.status = _samr_del_groupmem(p, &q_u, &r_u); + + if (!samr_io_r_del_groupmem("", &r_u, rdata, 0)) { return False; } - + return True; } -/********************************************************************** - api_samr_enum_domains - **********************************************************************/ -static BOOL api_samr_enum_domains(pipes_struct *p) +/******************************************************************* + api_samr_delete_dom_user + ********************************************************************/ + +static BOOL api_samr_delete_dom_user(pipes_struct *p) { - SAMR_Q_ENUM_DOMAINS q_u; - SAMR_R_ENUM_DOMAINS r_u; + SAMR_Q_DELETE_DOM_USER q_u; + SAMR_R_DELETE_DOM_USER r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - - fstring dom[2]; ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - fstrcpy(dom[0],global_myworkgroup); - fstrcpy(dom[1],"Builtin"); - - if(!samr_io_q_enum_domains("", &q_u, data, 0)) { - DEBUG(0,("api_samr_enum_domains: Unable to unmarshall SAMR_Q_ENUM_DOMAINS.\n")); + if (!samr_io_q_delete_dom_user("", &q_u, data, 0)) { return False; } - r_u.status = NT_STATUS_NO_PROBLEMO; - - init_samr_r_enum_domains(&r_u, q_u.start_idx, dom, 2); + r_u.status = _samr_delete_dom_user(p, &q_u, &r_u); - if(!samr_io_r_enum_domains("", &r_u, rdata, 0)) { - DEBUG(0,("api_samr_enum_domains: Unable to marshall SAMR_R_ENUM_DOMAINS.\n")); - free(r_u.sam); - free(r_u.uni_dom_name); + if (!samr_io_r_delete_dom_user("", &r_u, rdata, 0)) { return False; } - free(r_u.sam); - free(r_u.uni_dom_name); - return True; } - /******************************************************************* - api_samr_open_alias + api_samr_delete_dom_group ********************************************************************/ -static uint32 _api_samr_open_alias(POLICY_HND domain_pol, uint32 alias_rid, POLICY_HND *alias_pol) -{ - DOM_SID sid; - - /* get the domain policy. */ - if (find_lsa_policy_by_hnd(&domain_pol) == -1) - return NT_STATUS_INVALID_HANDLE; - - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(alias_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - - /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(&domain_pol, &sid)) { - close_lsa_policy_hnd(alias_pol); - return NT_STATUS_INVALID_HANDLE; - } - - /* append the alias' RID to it */ - if(!sid_append_rid(&sid, alias_rid)) { - close_lsa_policy_hnd(alias_pol); - return NT_STATUS_NO_SUCH_USER; - } - /* associate a RID with the (unique) handle. */ - if (!set_lsa_policy_samr_sid(alias_pol, &sid)) { - /* oh, whoops. don't know what error message to return, here */ - close_lsa_policy_hnd(alias_pol); - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } - - return NT_STATUS_NO_PROBLEMO; -} - -/******************************************************************* - api_samr_open_alias - ********************************************************************/ -static BOOL api_samr_open_alias(pipes_struct *p) +static BOOL api_samr_delete_dom_group(pipes_struct *p) { - SAMR_Q_OPEN_ALIAS q_u; - SAMR_R_OPEN_ALIAS r_u; + SAMR_Q_DELETE_DOM_GROUP q_u; + SAMR_R_DELETE_DOM_GROUP r_u; + prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - /* grab the samr open policy */ - if(!samr_io_q_open_alias("", &q_u, data, 0)) { - DEBUG(0,("api_samr_open_alias: Unable to unmarshall SAMR_Q_OPEN_ALIAS.\n")); + if (!samr_io_q_delete_dom_group("", &q_u, data, 0)) { return False; } - r_u.status=_api_samr_open_alias(q_u.dom_pol, q_u.rid_alias, &r_u.pol); + r_u.status = _samr_delete_dom_group(p, &q_u, &r_u); - /* store the response in the SMB stream */ - if(!samr_io_r_open_alias("", &r_u, rdata, 0)) { - DEBUG(0,("api_samr_open_alias: Unable to marshall SAMR_R_OPEN_ALIAS.\n")); + if (!samr_io_r_delete_dom_group("", &r_u, rdata, 0)) { return False; } - + return True; } /******************************************************************* - set_user_info_10 + api_samr_delete_dom_alias ********************************************************************/ -static BOOL set_user_info_10(const SAM_USER_INFO_10 *id10, uint32 rid) + +static BOOL api_samr_delete_dom_alias(pipes_struct *p) { - SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); + SAMR_Q_DELETE_DOM_ALIAS q_u; + SAMR_R_DELETE_DOM_ALIAS r_u; - if (id10 == NULL) { - DEBUG(5, ("set_user_info_10: NULL id10\n")); - return False; - } + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - if (pwd == NULL) + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if (!samr_io_q_delete_dom_alias("", &q_u, data, 0)) { return False; + } - pdb_set_acct_ctrl(pwd, id10->acb_info); + r_u.status = _samr_delete_dom_alias(p, &q_u, &r_u); - if(!pdb_update_sam_account(pwd, True)) + if (!samr_io_r_delete_dom_alias("", &r_u, rdata, 0)) { return False; + } return True; } /******************************************************************* - set_user_info_12 + api_samr_create_dom_group ********************************************************************/ -static BOOL set_user_info_12(SAM_USER_INFO_12 *id12, uint32 rid) + +static BOOL api_samr_create_dom_group(pipes_struct *p) { - SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); + SAMR_Q_CREATE_DOM_GROUP q_u; + SAMR_R_CREATE_DOM_GROUP r_u; - if (pwd == NULL) - return False; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - if (id12 == NULL) { - DEBUG(2, ("set_user_info_12: id12 is NULL\n")); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); + + if (!samr_io_q_create_dom_group("", &q_u, data, 0)) { return False; } - pdb_set_lanman_passwd (pwd, id12->lm_pwd); - pdb_set_nt_passwd (pwd, id12->nt_pwd); + r_u.status = _samr_create_dom_group(p, &q_u, &r_u); - if(!pdb_update_sam_account(pwd, True)) + if (!samr_io_r_create_dom_group("", &r_u, rdata, 0)) { return False; + } return True; } /******************************************************************* - set_user_info_21 + api_samr_create_dom_alias ********************************************************************/ -static BOOL set_user_info_21 (SAM_USER_INFO_21 *id21, uint32 rid) -{ - SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); - SAM_ACCOUNT new_pwd; - if (id21 == NULL) { - DEBUG(5, ("set_user_info_21: NULL id21\n")); - return False; - } - - if (pwd == NULL) - return False; - - /* we make a copy so that we can modify stuff */ - copy_sam_passwd(&new_pwd, pwd); - copy_id21_to_sam_passwd(&new_pwd, id21); - - /* - * The funny part about the previous two calls is - * that pwd still has the password hashes from the - * passdb entry. These have not been updated from - * id21. I don't know if they need to be set. --jerry - */ +static BOOL api_samr_create_dom_alias(pipes_struct *p) +{ + SAMR_Q_CREATE_DOM_ALIAS q_u; + SAMR_R_CREATE_DOM_ALIAS r_u; - /* write the change out */ - if(!pdb_update_sam_account(&new_pwd, True)) - return False; - - return True; -} + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; -/******************************************************************* - set_user_info_23 - ********************************************************************/ -static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid) -{ - SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); - SAM_ACCOUNT new_pwd; - BYTE nt_hash[16]; - BYTE lm_hash[16]; - pstring buf; - uint32 len; + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (id23 == NULL) { - DEBUG(5, ("set_user_info_23: NULL id23\n")); + if (!samr_io_q_create_dom_alias("", &q_u, data, 0)) { return False; } - if (pwd == NULL) - return False; + r_u.status = _samr_create_dom_alias(p, &q_u, &r_u); - copy_sam_passwd(&new_pwd, pwd); - copy_id23_to_sam_passwd(&new_pwd, id23); - - if (!decode_pw_buffer((char*)id23->pass, buf, 256, &len)) + if (!samr_io_r_create_dom_alias("", &r_u, rdata, 0)) { return False; + } - nt_lm_owf_gen(buf, nt_hash, lm_hash); - - pdb_set_lanman_passwd (&new_pwd, lm_hash); - pdb_set_nt_passwd (&new_pwd, nt_hash); - - /* update the UNIX password */ - if (lp_unix_password_sync()) - if(!chgpasswd(pdb_get_username(&new_pwd), "", buf, True)) - return False; - - memset(buf, 0, sizeof(buf)); - - if(!pdb_update_sam_account(&new_pwd, True)) - return False; - return True; } /******************************************************************* - set_user_info_24 + api_samr_query_groupinfo ********************************************************************/ -static BOOL set_user_info_24(const SAM_USER_INFO_24 *id24, uint32 rid) + +static BOOL api_samr_query_groupinfo(pipes_struct *p) { - SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); - uchar nt_hash[16]; - uchar lm_hash[16]; - uint32 len; - pstring buf; + SAMR_Q_QUERY_GROUPINFO q_u; + SAMR_R_QUERY_GROUPINFO r_u; - if (pwd == NULL) - return False; + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - memset(buf, 0, sizeof(buf)); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (!decode_pw_buffer((char*)id24->pass, buf, 256, &len)) + if (!samr_io_q_query_groupinfo("", &q_u, data, 0)) { return False; + } - DEBUG(0,("set_user_info_24:nt_lm_owf_gen\n")); - - nt_lm_owf_gen(buf, nt_hash, lm_hash); - - pdb_set_lanman_passwd (pwd, lm_hash); - pdb_set_nt_passwd (pwd, nt_hash); - - /* update the UNIX password */ - if (lp_unix_password_sync()) - if(!chgpasswd(pdb_get_username(pwd), "", buf, True)) - return False; - - memset(buf, 0, sizeof(buf)); - - DEBUG(0,("set_user_info_24: pdb_update_sam_account()\n")); + r_u.status = _samr_query_groupinfo(p, &q_u, &r_u); - /* update the SAMBA password */ - if(!pdb_update_sam_account(pwd, True)) + if (!samr_io_r_query_groupinfo("", &r_u, rdata, 0)) { return False; + } return True; } /******************************************************************* - samr_reply_set_userinfo + api_samr_set_groupinfo ********************************************************************/ -static uint32 _samr_set_userinfo(POLICY_HND *pol, uint16 switch_value, - SAM_USERINFO_CTR *ctr, pipes_struct *p) -{ - uint32 rid = 0x0; - DOM_SID sid; - struct current_user user; - SAM_ACCOUNT *sam_pass; - unsigned char sess_key[16]; - - DEBUG(5, ("_samr_set_userinfo: %d\n", __LINE__)); - - if (p->ntlmssp_auth_validated) - { - memcpy(&user, &p->pipe_user, sizeof(user)); - } - else - { - extern struct current_user current_user; - memcpy(&user, ¤t_user, sizeof(user)); - } - - /* search for the handle */ - if (find_lsa_policy_by_hnd(pol) == -1) - return NT_STATUS_INVALID_HANDLE; - /* find the policy handle. open a policy on it. */ - if (!get_lsa_policy_samr_sid(pol, &sid)) - return NT_STATUS_INVALID_HANDLE; +static BOOL api_samr_set_groupinfo(pipes_struct *p) +{ + SAMR_Q_SET_GROUPINFO q_u; + SAMR_R_SET_GROUPINFO r_u; - sid_split_rid(&sid, &rid); + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - DEBUG(5, ("_samr_set_userinfo: rid:0x%x, level:%d\n", rid, switch_value)); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (ctr == NULL) { - DEBUG(5, ("_samr_set_userinfo: NULL info level\n")); - return NT_STATUS_INVALID_INFO_CLASS; + if (!samr_io_q_set_groupinfo("", &q_u, data, 0)) { + return False; } + r_u.status = _samr_set_groupinfo(p, &q_u, &r_u); - /* - * We need the NT hash of the user who is changing the user's password. - * This NT hash is used to generate a "user session key" - * This "user session key" is in turn used to encrypt/decrypt the user's password. - */ - - become_root(); - sam_pass = pdb_getsampwuid(user.uid); - unbecome_root(); - if(sam_pass == NULL) { - DEBUG(0,("_samr_set_userinfo: Unable to get passdb entry for uid %u\n", - (unsigned int)pdb_get_uid(sam_pass) )); - return NT_STATUS_ACCESS_DENIED; - } - - memset(sess_key, '\0', 16); - mdfour(sess_key, pdb_get_nt_passwd(sam_pass), 16); - - /* ok! user info levels (lots: see MSDEV help), off we go... */ - switch (switch_value) { - case 0x12: - if (!set_user_info_12(ctr->info.id12, rid)) - return NT_STATUS_ACCESS_DENIED; - break; - - case 24: - SamOEMhash(ctr->info.id24->pass, sess_key, 1); - if (!set_user_info_24(ctr->info.id24, rid)) - return NT_STATUS_ACCESS_DENIED; - break; - - case 23: - SamOEMhash(ctr->info.id23->pass, sess_key, 1); - if (!set_user_info_23(ctr->info.id23, rid)) - return NT_STATUS_ACCESS_DENIED; - break; - - default: - return NT_STATUS_INVALID_INFO_CLASS; + if (!samr_io_r_set_groupinfo("", &r_u, rdata, 0)) { + return False; } - return NT_STATUS_NOPROBLEMO; + return True; } /******************************************************************* - api_samr_set_userinfo + api_samr_get_dom_pwinfo ********************************************************************/ -static BOOL api_samr_set_userinfo(pipes_struct *p) + +static BOOL api_samr_get_dom_pwinfo(pipes_struct *p) { - SAMR_Q_SET_USERINFO q_u; - SAMR_R_SET_USERINFO r_u; + SAMR_Q_GET_DOM_PWINFO q_u; + SAMR_R_GET_DOM_PWINFO r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; - SAM_USERINFO_CTR ctr; - ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - q_u.ctr = &ctr; - - if (!samr_io_q_set_userinfo("", &q_u, data, 0)) { - DEBUG(0,("api_samr_set_userinfo: Unable to unmarshall SAMR_Q_SET_USERINFO.\n")); + if (!samr_io_q_get_dom_pwinfo("", &q_u, data, 0)) { return False; } - r_u.status = _samr_set_userinfo(&q_u.pol, q_u.switch_value, &ctr, p); + r_u.status = _samr_get_dom_pwinfo(p, &q_u, &r_u); - free_samr_q_set_userinfo(&q_u); - - if(!samr_io_r_set_userinfo("", &r_u, rdata, 0)) { - DEBUG(0,("api_samr_set_userinfo: Unable to marshall SAMR_R_SET_USERINFO.\n")); + if (!samr_io_r_get_dom_pwinfo("", &r_u, rdata, 0)) { return False; } @@ -2482,59 +1136,41 @@ static BOOL api_samr_set_userinfo(pipes_struct *p) } /******************************************************************* - samr_reply_set_userinfo2 + api_samr_open_group ********************************************************************/ -static uint32 _samr_set_userinfo2(POLICY_HND *pol, uint16 switch_value, SAM_USERINFO_CTR *ctr) -{ - DOM_SID sid; - uint32 rid = 0x0; - - DEBUG(5, ("samr_reply_set_userinfo2: %d\n", __LINE__)); - - /* search for the handle */ - if (find_lsa_policy_by_hnd(pol) == -1) - return NT_STATUS_INVALID_HANDLE; - /* find the policy handle. open a policy on it. */ - if (!get_lsa_policy_samr_sid(pol, &sid)) - return NT_STATUS_INVALID_HANDLE; +static BOOL api_samr_open_group(pipes_struct *p) +{ + SAMR_Q_OPEN_GROUP q_u; + SAMR_R_OPEN_GROUP r_u; - sid_split_rid(&sid, &rid); + prs_struct *data = &p->in_data.data; + prs_struct *rdata = &p->out_data.rdata; - DEBUG(5, ("samr_reply_set_userinfo2: rid:0x%x\n", rid)); + ZERO_STRUCT(q_u); + ZERO_STRUCT(r_u); - if (ctr == NULL) { - DEBUG(5, ("samr_reply_set_userinfo2: NULL info level\n")); - return NT_STATUS_INVALID_INFO_CLASS; + if (!samr_io_q_open_group("", &q_u, data, 0)) { + return False; } - ctr->switch_value = switch_value; - - /* ok! user info levels (lots: see MSDEV help), off we go... */ - switch (switch_value) { - case 21: - if (!set_user_info_21(ctr->info.id21, rid)) - return NT_STATUS_ACCESS_DENIED; - break; - case 16: - if (!set_user_info_10(ctr->info.id10, rid)) - return NT_STATUS_ACCESS_DENIED; - break; - default: - return NT_STATUS_INVALID_INFO_CLASS; + r_u.status = _samr_open_group(p, &q_u, &r_u); + + if (!samr_io_r_open_group("", &r_u, rdata, 0)) { + return False; } - return NT_STATUS_NOPROBLEMO; + return True; } /******************************************************************* - api_samr_set_userinfo2 + api_samr_unknown_2d ********************************************************************/ -static BOOL api_samr_set_userinfo2(pipes_struct *p) + +static BOOL api_samr_unknown_2d(pipes_struct *p) { - SAMR_Q_SET_USERINFO2 q_u; - SAMR_R_SET_USERINFO2 r_u; - SAM_USERINFO_CTR ctr; + SAMR_Q_UNKNOWN_2D q_u; + SAMR_R_UNKNOWN_2D r_u; prs_struct *data = &p->in_data.data; prs_struct *rdata = &p->out_data.rdata; @@ -2542,31 +1178,77 @@ static BOOL api_samr_set_userinfo2(pipes_struct *p) ZERO_STRUCT(q_u); ZERO_STRUCT(r_u); - q_u.ctr = &ctr; - - if (!samr_io_q_set_userinfo2("", &q_u, data, 0)) { - DEBUG(0,("api_samr_set_userinfo2: Unable to unmarshall SAMR_Q_SET_USERINFO2.\n")); + if (!samr_io_q_unknown_2d("", &q_u, data, 0)) { return False; } - r_u.status = _samr_set_userinfo2(&q_u.pol, q_u.switch_value, &ctr); + r_u.status = _samr_unknown_2d(p, &q_u, &r_u); - free_samr_q_set_userinfo2(&q_u); - - if(!samr_io_r_set_userinfo2("", &r_u, rdata, 0)) { - DEBUG(0,("api_samr_set_userinfo2: Unable to marshall SAMR_R_SET_USERINFO2.\n")); + if (!samr_io_r_unknown_2d("", &r_u, rdata, 0)) { return False; } return True; } - /******************************************************************* array of \PIPE\samr operations ********************************************************************/ + static struct api_struct api_samr_cmds [] = { + {"SAMR_CLOSE_HND", SAMR_CLOSE_HND, api_samr_close_hnd}, + {"SAMR_CONNECT", SAMR_CONNECT, api_samr_connect}, + {"SAMR_CONNECT_ANON", SAMR_CONNECT_ANON, api_samr_connect_anon}, + {"SAMR_ENUM_DOMAINS", SAMR_ENUM_DOMAINS, api_samr_enum_domains}, + {"SAMR_ENUM_DOM_USERS", SAMR_ENUM_DOM_USERS, api_samr_enum_dom_users}, + + {"SAMR_ENUM_DOM_GROUPS", SAMR_ENUM_DOM_GROUPS, api_samr_enum_dom_groups}, + {"SAMR_ENUM_DOM_ALIASES", SAMR_ENUM_DOM_ALIASES, api_samr_enum_dom_aliases}, + {"SAMR_QUERY_USERALIASES", SAMR_QUERY_USERALIASES, api_samr_query_useraliases}, + {"SAMR_QUERY_ALIASMEM", SAMR_QUERY_ALIASMEM, api_samr_query_aliasmem}, + {"SAMR_QUERY_GROUPMEM", SAMR_QUERY_GROUPMEM, api_samr_query_groupmem}, + {"SAMR_ADD_ALIASMEM", SAMR_ADD_ALIASMEM, api_samr_add_aliasmem}, + {"SAMR_DEL_ALIASMEM", SAMR_DEL_ALIASMEM, api_samr_del_aliasmem}, + {"SAMR_ADD_GROUPMEM", SAMR_ADD_GROUPMEM, api_samr_add_groupmem}, + {"SAMR_DEL_GROUPMEM", SAMR_DEL_GROUPMEM, api_samr_del_groupmem}, + + {"SAMR_DELETE_DOM_USER", SAMR_DELETE_DOM_USER, api_samr_delete_dom_user}, + {"SAMR_DELETE_DOM_GROUP", SAMR_DELETE_DOM_GROUP, api_samr_delete_dom_group}, + {"SAMR_DELETE_DOM_ALIAS", SAMR_DELETE_DOM_ALIAS, api_samr_delete_dom_alias}, + {"SAMR_CREATE_DOM_GROUP", SAMR_CREATE_DOM_GROUP, api_samr_create_dom_group}, + {"SAMR_CREATE_DOM_ALIAS", SAMR_CREATE_DOM_ALIAS, api_samr_create_dom_alias}, + {"SAMR_LOOKUP_NAMES", SAMR_LOOKUP_NAMES, api_samr_lookup_names}, + {"SAMR_OPEN_USER", SAMR_OPEN_USER, api_samr_open_user}, + {"SAMR_QUERY_USERINFO", SAMR_QUERY_USERINFO, api_samr_query_userinfo}, + {"SAMR_SET_USERINFO", SAMR_SET_USERINFO, api_samr_set_userinfo}, + {"SAMR_SET_USERINFO2", SAMR_SET_USERINFO2, api_samr_set_userinfo2}, + + {"SAMR_QUERY_DOMAIN_INFO", SAMR_QUERY_DOMAIN_INFO, api_samr_query_dom_info}, + {"SAMR_QUERY_USERGROUPS", SAMR_QUERY_USERGROUPS, api_samr_query_usergroups}, + {"SAMR_QUERY_DISPINFO", SAMR_QUERY_DISPINFO, api_samr_query_dispinfo}, + {"SAMR_QUERY_DISPINFO3", SAMR_QUERY_DISPINFO3, api_samr_query_dispinfo}, + {"SAMR_QUERY_DISPINFO4", SAMR_QUERY_DISPINFO4, api_samr_query_dispinfo}, + + {"SAMR_QUERY_ALIASINFO", SAMR_QUERY_ALIASINFO, api_samr_query_aliasinfo}, + {"SAMR_QUERY_GROUPINFO", SAMR_QUERY_GROUPINFO, api_samr_query_groupinfo}, + {"SAMR_SET_GROUPINFO", SAMR_SET_GROUPINFO, api_samr_set_groupinfo}, + {"SAMR_CREATE_USER", SAMR_CREATE_USER, api_samr_create_user}, + {"SAMR_LOOKUP_RIDS", SAMR_LOOKUP_RIDS, api_samr_lookup_rids}, + {"SAMR_GET_DOM_PWINFO", SAMR_GET_DOM_PWINFO, api_samr_get_dom_pwinfo}, + {"SAMR_CHGPASSWD_USER", SAMR_CHGPASSWD_USER, api_samr_chgpasswd_user}, + {"SAMR_OPEN_ALIAS", SAMR_OPEN_ALIAS, api_samr_open_alias}, + {"SAMR_OPEN_GROUP", SAMR_OPEN_GROUP, api_samr_open_group}, + {"SAMR_OPEN_DOMAIN", SAMR_OPEN_DOMAIN, api_samr_open_domain}, + {"SAMR_UNKNOWN_2D", SAMR_UNKNOWN_2D, api_samr_unknown_2d}, + {"SAMR_LOOKUP_DOMAIN", SAMR_LOOKUP_DOMAIN, api_samr_lookup_domain}, + + {"SAMR_QUERY_SEC_OBJECT", SAMR_QUERY_SEC_OBJECT, api_samr_query_sec_obj}, + {"SAMR_GET_USRDOM_PWINFO", SAMR_GET_USRDOM_PWINFO, api_samr_get_usrdom_pwinfo}, + {NULL, 0, NULL} + +#if 0 + { "SAMR_CLOSE_HND" , SAMR_CLOSE_HND , api_samr_close_hnd }, { "SAMR_CONNECT" , SAMR_CONNECT , api_samr_connect }, { "SAMR_CONNECT_ANON" , SAMR_CONNECT_ANON , api_samr_connect_anon }, @@ -2587,13 +1269,14 @@ static struct api_struct api_samr_cmds [] = { "SAMR_CHGPASSWD_USER" , SAMR_CHGPASSWD_USER , api_samr_chgpasswd_user }, { "SAMR_OPEN_ALIAS" , SAMR_OPEN_ALIAS , api_samr_open_alias }, { "SAMR_OPEN_DOMAIN" , SAMR_OPEN_DOMAIN , api_samr_open_domain }, - { "SAMR_UNKNOWN_3" , SAMR_UNKNOWN_3 , api_samr_unknown_3 }, - { "SAMR_UNKNOWN_2C" , SAMR_UNKNOWN_2C , api_samr_unknown_2c }, + { "SAMR_QUERY_SEC_OBJECT" , SAMR_QUERY_SEC_OBJECT , api_samr_query_sec_obj }, + { "SAMR_GET_USRDOM_PWINFO", SAMR_GET_USRDOM_PWINFO, api_samr_get_usrdom_pwinfo}, { "SAMR_LOOKUP_DOMAIN" , SAMR_LOOKUP_DOMAIN , api_samr_lookup_domain }, { "SAMR_ENUM_DOMAINS" , SAMR_ENUM_DOMAINS , api_samr_enum_domains }, { "SAMR_SET_USERINFO" , SAMR_SET_USERINFO , api_samr_set_userinfo }, { "SAMR_SET_USERINFO2" , SAMR_SET_USERINFO2 , api_samr_set_userinfo2 }, { NULL , 0 , NULL } +#endif }; /******************************************************************* @@ -2603,4 +1286,3 @@ BOOL api_samr_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_samr_rpc", api_samr_cmds); } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c index bd04b40c4d..ff484a8ff1 100644 --- a/source3/rpc_server/srv_samr_nt.c +++ b/source3/rpc_server/srv_samr_nt.c @@ -39,6 +39,23 @@ extern rid_name domain_group_rids[]; extern rid_name domain_alias_rids[]; extern rid_name builtin_alias_rids[]; +struct samr_info { + /* for use by the \PIPE\samr policy */ + DOM_SID sid; + uint32 status; /* some sort of flag. best to record it. comes from opnum 0x39 */ +}; + +/******************************************************************* + Function to free the per handle data. + ********************************************************************/ + +static void free_samr_info(void *ptr) +{ + struct samr_info *samr = (struct samr_info *)ptr; + + safe_free(samr); +} + /******************************************************************* This next function should be replaced with something that dynamically returns the correct user info..... JRA. @@ -48,8 +65,7 @@ static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, int *total_entries, int *num_entries, int max_num_entries, uint16 acb_mask) { - void *vp = NULL; - struct sam_passwd *pwd = NULL; + SAM_ACCOUNT *pwd = NULL; (*num_entries) = 0; (*total_entries) = 0; @@ -57,13 +73,12 @@ static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, if (pw_buf == NULL) return False; - vp = startsmbpwent(False); - if (!vp) { - DEBUG(0, ("get_sampwd_entries: Unable to open SMB password database.\n")); + if (!pdb_setsampwent(False)) { + DEBUG(0, ("get_sampwd_entries: Unable to open passdb.\n")); return False; } - while (((pwd = getsam21pwent(vp)) != NULL) && (*num_entries) < max_num_entries) { + while (((pwd = pdb_getsampwent()) != NULL) && (*num_entries) < max_num_entries) { int user_name_len; if (start_idx > 0) { @@ -74,21 +89,20 @@ static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, continue; } - user_name_len = strlen(pwd->smb_name)+1; - init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pwd->smb_name, user_name_len); + user_name_len = strlen(pdb_get_username(pwd))+1; + init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pdb_get_username(pwd), user_name_len); init_uni_hdr(&pw_buf[(*num_entries)].hdr_user_name, user_name_len); pw_buf[(*num_entries)].user_rid = pwd->user_rid; memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); /* Now check if the NT compatible password is available. */ - if (pwd->smb_nt_passwd != NULL) { - memcpy( pw_buf[(*num_entries)].nt_pwd , pwd->smb_nt_passwd, 16); - } + if (pdb_get_nt_passwd(pwd)) + memcpy( pw_buf[(*num_entries)].nt_pwd , pdb_get_nt_passwd(pwd), 16); - pw_buf[(*num_entries)].acb_info = (uint16)pwd->acct_ctrl; + pw_buf[(*num_entries)].acb_info = pdb_get_acct_ctrl(pwd); DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x", - (*num_entries), pwd->smb_name, pwd->user_rid, pwd->acct_ctrl)); + (*num_entries), pdb_get_username(pwd), pdb_get_user_rid(pwd), pdb_get_acct_ctrl(pwd) )); if (acb_mask == 0 || (pwd->acct_ctrl & acb_mask)) { DEBUG(5,(" acb_mask %x accepts\n", acb_mask)); @@ -100,17 +114,16 @@ static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, (*total_entries)++; } - endsmbpwent(vp); + pdb_endsampwent(); return (*num_entries) > 0; } static BOOL jf_get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, - int *total_entries, int *num_entries, + int *total_entries, uint32 *num_entries, int max_num_entries, uint16 acb_mask) { - void *vp = NULL; - struct sam_passwd *pwd = NULL; + SAM_ACCOUNT *pwd = NULL; *num_entries = 0; *total_entries = 0; @@ -118,17 +131,16 @@ static BOOL jf_get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, if (pw_buf == NULL) return False; - vp = startsmbpwent(False); - if (!vp) { - DEBUG(0, ("get_sampwd_entries: Unable to open SMB password database.\n")); - return False; - } + if (!pdb_setsampwent(False)) { + DEBUG(0, ("jf_get_sampwd_entries: Unable to open passdb.\n")); + return False; + } - while (((pwd = getsam21pwent(vp)) != NULL) && (*num_entries) < max_num_entries) { + while (((pwd = pdb_getsampwent()) != NULL) && (*num_entries) < max_num_entries) { int user_name_len; int full_name_len; - if (acb_mask != 0 && !(pwd->acct_ctrl & acb_mask)) + if (acb_mask != 0 && !(pdb_get_acct_ctrl(pwd) & acb_mask)) continue; if (start_idx > 0) { @@ -141,29 +153,29 @@ static BOOL jf_get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, ZERO_STRUCTP(&pw_buf[(*num_entries)]); - user_name_len = strlen(pwd->smb_name); - init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pwd->smb_name, user_name_len); + user_name_len = strlen(pdb_get_username(pwd)); + init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pdb_get_username(pwd), user_name_len); init_uni_hdr(&pw_buf[(*num_entries)].hdr_user_name, user_name_len); - full_name_len = strlen(pwd->full_name); - init_unistr2(&pw_buf[(*num_entries)].uni_full_name, pwd->full_name, full_name_len); + full_name_len = strlen(pdb_get_fullname(pwd)); + init_unistr2(&pw_buf[(*num_entries)].uni_full_name, pdb_get_fullname(pwd), full_name_len); init_uni_hdr(&pw_buf[(*num_entries)].hdr_full_name, full_name_len); - pw_buf[(*num_entries)].user_rid = pwd->user_rid; + pw_buf[(*num_entries)].user_rid = pdb_get_user_rid(pwd); memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); /* Now check if the NT compatible password is available. */ - if (pwd->smb_nt_passwd != NULL) { - memcpy( pw_buf[(*num_entries)].nt_pwd , pwd->smb_nt_passwd, 16); - } + if (pdb_get_nt_passwd(pwd)) + memcpy( pw_buf[(*num_entries)].nt_pwd , pdb_get_nt_passwd(pwd), 16); - pw_buf[(*num_entries)].acb_info = (uint16)pwd->acct_ctrl; + pw_buf[(*num_entries)].acb_info = pdb_get_acct_ctrl(pwd); - DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x\n", (*num_entries), pwd->smb_name, pwd->user_rid, pwd->acct_ctrl)); + DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x\n", (*num_entries), + pdb_get_username(pwd), pdb_get_user_rid(pwd), pdb_get_acct_ctrl(pwd) )); (*num_entries)++; } - endsmbpwent(vp); + pdb_endsampwent(); *total_entries = *num_entries; return True; @@ -425,7 +437,7 @@ uint32 _samr_close_hnd(pipes_struct *p, SAMR_Q_CLOSE_HND *q_u, SAMR_R_CLOSE_HND r_u->status = NT_STATUS_NOPROBLEMO; /* close the policy handle */ - if (!close_lsa_policy_hnd(&q_u->pol)) + if (!close_policy_hnd(p, &q_u->pol)) return NT_STATUS_OBJECT_NAME_INVALID; DEBUG(5,("samr_reply_close_hnd: %d\n", __LINE__)); @@ -439,42 +451,57 @@ uint32 _samr_close_hnd(pipes_struct *p, SAMR_Q_CLOSE_HND *q_u, SAMR_R_CLOSE_HND uint32 _samr_open_domain(pipes_struct *p, SAMR_Q_OPEN_DOMAIN *q_u, SAMR_R_OPEN_DOMAIN *r_u) { + struct samr_info *info; + r_u->status = NT_STATUS_NOPROBLEMO; /* find the connection policy handle. */ - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) return NT_STATUS_INVALID_HANDLE; - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(&r_u->domain_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - /* associate the domain SID with the (unique) handle. */ - if (!set_lsa_policy_samr_sid(&r_u->domain_pol, &q_u->dom_sid.sid)) { - close_lsa_policy_hnd(&r_u->domain_pol); + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(info); + info->sid = q_u->dom_sid.sid; + + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, &r_u->domain_pol, free_samr_info, (void *)info)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } DEBUG(5,("samr_open_domain: %d\n", __LINE__)); return r_u->status; } +static uint32 get_lsa_policy_samr_rid(struct samr_info *info) +{ + if (!info) { + DEBUG(3,("Error getting policy\n")); + return 0xffffffff; + } + + return info->sid.sub_auths[info->sid.num_auths-1]; +} + /******************************************************************* _samr_get_usrdom_pwinfo ********************************************************************/ uint32 _samr_get_usrdom_pwinfo(pipes_struct *p, SAMR_Q_GET_USRDOM_PWINFO *q_u, SAMR_R_GET_USRDOM_PWINFO *r_u) { + struct samr_info *info = NULL; + r_u->status = NT_STATUS_NOPROBLEMO; /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&q_u->user_pol) == -1) { + if (!find_policy_by_hnd(p, &q_u->user_pol, (void **)&info)) { return NT_STATUS_INVALID_HANDLE; } /* find the user's rid */ - if (get_lsa_policy_samr_rid(&q_u->user_pol) == 0xffffffff) { + if (get_lsa_policy_samr_rid(info) == 0xffffffff) { return NT_STATUS_OBJECT_TYPE_MISMATCH; } @@ -531,6 +558,21 @@ static uint32 samr_make_usr_obj_sd(TALLOC_CTX *ctx, SEC_DESC_BUF **buf, DOM_SID return NT_STATUS_NOPROBLEMO; } +static BOOL get_lsa_policy_samr_sid(pipes_struct *p, POLICY_HND *pol, DOM_SID *sid) +{ + struct samr_info *info = NULL; + + /* find the policy handle. open a policy on it. */ + if (!find_policy_by_hnd(p, pol, (void **)&info)) + return False; + + if (!info) + return False; + + *sid = info->sid; + return True; +} + /******************************************************************* _samr_query_sec_obj ********************************************************************/ @@ -541,13 +583,10 @@ uint32 _samr_query_sec_obj(pipes_struct *p, SAMR_Q_QUERY_SEC_OBJ *q_u, SAMR_R_QU r_u->status = NT_STATUS_NOPROBLEMO; - /* find the policy handle. open a policy on it. */ - if ((find_lsa_policy_by_hnd(&q_u->user_pol)) == -1) - return NT_STATUS_INVALID_HANDLE; - /* Get the SID. */ - if (!get_lsa_policy_samr_sid(&q_u->user_pol, &pol_sid)) - return NT_STATUS_OBJECT_TYPE_MISMATCH; + + if (!get_lsa_policy_samr_sid(p, &q_u->user_pol, &pol_sid)) + return NT_STATUS_INVALID_HANDLE; r_u->status = samr_make_usr_obj_sd(p->mem_ctx, &r_u->buf, &pol_sid); @@ -608,7 +647,7 @@ uint32 _samr_enum_dom_users(pipes_struct *p, SAMR_Q_ENUM_DOM_USERS *q_u, SAMR_R_ r_u->status = NT_STATUS_NOPROBLEMO; /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (!find_policy_by_hnd(p, &q_u->pol, NULL)) return NT_STATUS_INVALID_HANDLE; DEBUG(5,("_samr_enum_dom_users: %d\n", __LINE__)); @@ -808,12 +847,12 @@ static BOOL get_group_domain_entries(DOMAIN_GRP *d_grp, DOM_SID *sid, uint32 sta uint32 _samr_enum_dom_groups(pipes_struct *p, SAMR_Q_ENUM_DOM_GROUPS *q_u, SAMR_R_ENUM_DOM_GROUPS *r_u) { DOMAIN_GRP grp[2]; - int num_entries; + uint32 num_entries; DOM_SID sid; r_u->status = NT_STATUS_NOPROBLEMO; - if (!get_lsa_policy_samr_sid(&q_u->pol, &sid)) + if (!get_lsa_policy_samr_sid(p, &q_u->pol, &sid)) return NT_STATUS_INVALID_HANDLE; DEBUG(5,("samr_reply_enum_dom_groups: %d\n", __LINE__)); @@ -837,14 +876,13 @@ uint32 _samr_enum_dom_groups(pipes_struct *p, SAMR_Q_ENUM_DOM_GROUPS *q_u, SAMR_ uint32 _samr_enum_dom_aliases(pipes_struct *p, SAMR_Q_ENUM_DOM_ALIASES *q_u, SAMR_R_ENUM_DOM_ALIASES *r_u) { DOMAIN_GRP grp[MAX_SAM_ENTRIES]; - int num_entries = 0; + uint32 num_entries = 0; fstring sid_str; DOM_SID sid; r_u->status = NT_STATUS_NOPROBLEMO; - /* find the policy handle. open a policy on it. */ - if (!get_lsa_policy_samr_sid(&q_u->pol, &sid)) + if (!get_lsa_policy_samr_sid(p, &q_u->pol, &sid)) return NT_STATUS_INVALID_HANDLE; sid_to_string(sid_str, &sid); @@ -871,7 +909,7 @@ uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_ SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]; DOMAIN_GRP grps[MAX_SAM_ENTRIES]; uint16 acb_mask = ACB_NORMAL; - int num_entries = 0; + uint32 num_entries = 0; int orig_num_entries = 0; int total_entries = 0; uint32 data_size = 0; @@ -883,7 +921,7 @@ uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_ r_u->status = NT_STATUS_NOPROBLEMO; - if (!get_lsa_policy_samr_sid(&q_u->domain_pol, &sid)) + if (!get_lsa_policy_samr_sid(p, &q_u->domain_pol, &sid)) return NT_STATUS_INVALID_HANDLE; /* decide how many entries to get depending on the max_entries @@ -994,21 +1032,22 @@ uint32 _samr_query_aliasinfo(pipes_struct *p, SAMR_Q_QUERY_ALIASINFO *q_u, SAMR_ fstring alias=""; enum SID_NAME_USE type; uint32 alias_rid; + struct samr_info *info = NULL; r_u->status = NT_STATUS_NOPROBLEMO; DEBUG(5,("_samr_query_aliasinfo: %d\n", __LINE__)); /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) return NT_STATUS_INVALID_HANDLE; - alias_rid = get_lsa_policy_samr_rid(&q_u->pol); + alias_rid = get_lsa_policy_samr_rid(info); if(alias_rid == 0xffffffff) return NT_STATUS_NO_SUCH_ALIAS; if(!local_lookup_rid(alias_rid, alias, &type)) - return NT_STATUS_NO_SUCH_ALIAS; + return NT_STATUS_NO_SUCH_ALIAS; switch (q_u->switch_level) { case 3: @@ -1104,7 +1143,7 @@ uint32 _samr_lookup_names(pipes_struct *p, SAMR_Q_LOOKUP_NAMES *q_u, SAMR_R_LOOK ZERO_ARRAY(rid); ZERO_ARRAY(type); - if (!get_lsa_policy_samr_sid(&q_u->pol, &pol_sid)) { + if (!get_lsa_policy_samr_sid(p, &q_u->pol, &pol_sid)) { init_samr_r_lookup_names(p->mem_ctx, r_u, 0, NULL, NULL, NT_STATUS_OBJECT_TYPE_MISMATCH); return r_u->status; } @@ -1135,7 +1174,7 @@ uint32 _samr_lookup_names(pipes_struct *p, SAMR_Q_LOOKUP_NAMES *q_u, SAMR_R_LOOK } } - init_samr_r_lookup_names(p->mem_ctx, r_u, num_rids, rid, type, r_u->status); + init_samr_r_lookup_names(p->mem_ctx, r_u, num_rids, rid, (uint32 *)type, r_u->status); DEBUG(5,("_samr_lookup_names: %d\n", __LINE__)); @@ -1227,7 +1266,7 @@ uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP DEBUG(5,("_samr_lookup_rids: %d\n", __LINE__)); /* find the policy handle. open a policy on it. */ - if (!get_lsa_policy_samr_sid(&q_u->pol, &pol_sid)) + if (!get_lsa_policy_samr_sid(p, &q_u->pol, &pol_sid)) return NT_STATUS_INVALID_HANDLE; if (num_rids > MAX_SAM_ENTRIES) { @@ -1274,50 +1313,45 @@ uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP uint32 _api_samr_open_user(pipes_struct *p, SAMR_Q_OPEN_USER *q_u, SAMR_R_OPEN_USER *r_u) { - struct sam_passwd *sam_pass; + SAM_ACCOUNT *sampass; DOM_SID sid; POLICY_HND domain_pol = q_u->domain_pol; uint32 user_rid = q_u->user_rid; POLICY_HND *user_pol = &r_u->user_pol; + struct samr_info *info = NULL; r_u->status = NT_STATUS_NO_PROBLEMO; /* find the domain policy handle. */ - if (find_lsa_policy_by_hnd(&domain_pol) == -1) + if (!find_policy_by_hnd(p, &domain_pol, NULL)) return NT_STATUS_INVALID_HANDLE; - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(user_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - become_root(); - sam_pass = getsam21pwrid(user_rid); + sampass = pdb_getsampwrid(user_rid); unbecome_root(); /* check that the RID exists in our domain. */ - if (sam_pass == NULL) { - close_lsa_policy_hnd(user_pol); + if (sampass == NULL) return NT_STATUS_NO_SUCH_USER; - } /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(&domain_pol, &sid)) { - close_lsa_policy_hnd(user_pol); + if(!get_lsa_policy_samr_sid(p, &domain_pol, &sid)) return NT_STATUS_INVALID_HANDLE; - } /* append the user's RID to it */ - if(!sid_append_rid(&sid, user_rid)) { - close_lsa_policy_hnd(user_pol); + if(!sid_append_rid(&sid, user_rid)) return NT_STATUS_NO_SUCH_USER; - } - /* associate the user's SID with the handle. */ - if (!set_lsa_policy_samr_sid(user_pol, &sid)) { - /* oh, whoops. don't know what error message to return, here */ - close_lsa_policy_hnd(user_pol); + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(info); + info->sid = sid; + + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, user_pol, free_samr_info, (void *)info)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } return r_u->status; } @@ -1328,7 +1362,7 @@ uint32 _api_samr_open_user(pipes_struct *p, SAMR_Q_OPEN_USER *q_u, SAMR_R_OPEN_U static BOOL get_user_info_10(SAM_USER_INFO_10 *id10, uint32 user_rid) { - struct smb_passwd *smb_pass; + SAM_ACCOUNT *smbpass; if (!pdb_rid_is_user(user_rid)) { DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); @@ -1336,18 +1370,17 @@ static BOOL get_user_info_10(SAM_USER_INFO_10 *id10, uint32 user_rid) } become_root(); - smb_pass = getsmbpwrid(user_rid); + smbpass = pdb_getsampwrid(user_rid); unbecome_root(); - if (smb_pass == NULL) - { + if (smbpass == NULL) { DEBUG(4,("User 0x%x not found\n", user_rid)); return False; } - DEBUG(3,("User:[%s]\n", smb_pass->smb_name)); + DEBUG(3,("User:[%s]\n", pdb_get_username(smbpass) )); - init_sam_user_info10(id10, smb_pass->acct_ctrl); + init_sam_user_info10(id10, pdb_get_acct_ctrl(smbpass) ); return True; } @@ -1358,23 +1391,23 @@ static BOOL get_user_info_10(SAM_USER_INFO_10 *id10, uint32 user_rid) static BOOL get_user_info_12(SAM_USER_INFO_12 * id12, uint32 user_rid) { - struct smb_passwd *smb_pass; + SAM_ACCOUNT *smbpass; become_root(); - smb_pass = getsmbpwrid(user_rid); + smbpass = pdb_getsampwrid(user_rid); unbecome_root(); - if (smb_pass == NULL) { + if (smbpass == NULL) { DEBUG(4, ("User 0x%x not found\n", user_rid)); return False; } - DEBUG(3,("User:[%s] 0x%x\n", smb_pass->smb_name, smb_pass->acct_ctrl)); + DEBUG(3,("User:[%s] 0x%x\n", pdb_get_username(smbpass), pdb_get_acct_ctrl(smbpass) )); - if (smb_pass->acct_ctrl & ACB_DISABLED) + if ( pdb_get_acct_ctrl(smbpass) & ACB_DISABLED) return False; - init_sam_user_info12(id12, smb_pass->smb_passwd, smb_pass->smb_nt_passwd); + init_sam_user_info12(id12, pdb_get_lanman_passwd(smbpass), pdb_get_nt_passwd(smbpass)); return True; } @@ -1385,10 +1418,7 @@ static BOOL get_user_info_12(SAM_USER_INFO_12 * id12, uint32 user_rid) static BOOL get_user_info_21(SAM_USER_INFO_21 *id21, uint32 user_rid) { - NTTIME dummy_time; - struct sam_passwd *sam_pass; - LOGON_HRS hrs; - int i; + SAM_ACCOUNT *sampass; if (!pdb_rid_is_user(user_rid)) { DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); @@ -1396,56 +1426,17 @@ static BOOL get_user_info_21(SAM_USER_INFO_21 *id21, uint32 user_rid) } become_root(); - sam_pass = getsam21pwrid(user_rid); + sampass = pdb_getsampwrid(user_rid); unbecome_root(); - if (sam_pass == NULL) { + if (sampass == NULL) { DEBUG(4,("User 0x%x not found\n", user_rid)); return False; } - DEBUG(3,("User:[%s]\n", sam_pass->smb_name)); - - dummy_time.low = 0xffffffff; - dummy_time.high = 0x7fffffff; - - DEBUG(5,("get_user_info_21 - TODO: convert unix times to NTTIMEs\n")); - - /* create a LOGON_HRS structure */ - hrs.len = sam_pass->hours_len; - SMB_ASSERT_ARRAY(hrs.hours, hrs.len); - for (i = 0; i < hrs.len; i++) - hrs.hours[i] = sam_pass->hours[i]; - - init_sam_user_info21A(id21, - - &dummy_time, /* logon_time */ - &dummy_time, /* logoff_time */ - &dummy_time, /* kickoff_time */ - &dummy_time, /* pass_last_set_time */ - &dummy_time, /* pass_can_change_time */ - &dummy_time, /* pass_must_change_time */ - - sam_pass->smb_name, /* user_name */ - sam_pass->full_name, /* full_name */ - sam_pass->home_dir, /* home_dir */ - sam_pass->dir_drive, /* dir_drive */ - sam_pass->logon_script, /* logon_script */ - sam_pass->profile_path, /* profile_path */ - sam_pass->acct_desc, /* description */ - sam_pass->workstations, /* workstations user can log in from */ - sam_pass->unknown_str, /* don't know, yet */ - sam_pass->munged_dial, /* dialin info. contains dialin path and tel no */ - - sam_pass->user_rid, /* RID user_id */ - sam_pass->group_rid, /* RID group_id */ - sam_pass->acct_ctrl, - - sam_pass->unknown_3, /* unknown_3 */ - sam_pass->logon_divs, /* divisions per week */ - &hrs, /* logon hours */ - sam_pass->unknown_5, - sam_pass->unknown_6); + DEBUG(3,("User:[%s]\n", pdb_get_username(sampass) )); + + init_sam_user_info21A(id21, sampass); return True; } @@ -1458,15 +1449,16 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ { SAM_USERINFO_CTR *ctr; uint32 rid = 0; + struct samr_info *info = NULL; r_u->status=NT_STATUS_NO_PROBLEMO; /* search for the handle */ - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) return NT_STATUS_INVALID_HANDLE; /* find the user's rid */ - if ((rid = get_lsa_policy_samr_rid(&q_u->pol)) == 0xffffffff) + if ((rid = get_lsa_policy_samr_rid(info)) == 0xffffffff) return NT_STATUS_OBJECT_TYPE_MISMATCH; DEBUG(5,("_samr_query_userinfo: rid:0x%x\n", rid)); @@ -1554,27 +1546,28 @@ uint32 _samr_query_usergroups(pipes_struct *p, SAMR_Q_QUERY_USERGROUPS *q_u, SAM int num_groups = 0; pstring groups; uint32 rid; + struct samr_info *info = NULL; r_u->status = NT_STATUS_NO_PROBLEMO; DEBUG(5,("_samr_query_usergroups: %d\n", __LINE__)); /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&q_u->pol) == -1) + if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) return NT_STATUS_INVALID_HANDLE; /* find the user's rid */ - if ((rid = get_lsa_policy_samr_rid(&q_u->pol)) == 0xffffffff) + if ((rid = get_lsa_policy_samr_rid(info)) == 0xffffffff) return NT_STATUS_OBJECT_TYPE_MISMATCH; become_root(); - sam_pass = getsam21pwrid(rid); + sam_pass = pdb_getsampwrid(rid); unbecome_root(); if (sam_pass == NULL) return NT_STATUS_NO_SUCH_USER; - get_domain_user_groups(groups, sam_pass->smb_name); + get_domain_user_groups(groups, pdb_get_username(sam_pass)); gids = NULL; num_groups = make_dom_gids(p->mem_ctx, groups, &gids); @@ -1593,7 +1586,6 @@ uint32 _samr_query_usergroups(pipes_struct *p, SAMR_Q_QUERY_USERGROUPS *q_u, SAM uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR_R_QUERY_DOMAIN_INFO *r_u) { SAM_UNK_CTR *ctr; - uint16 switch_value = 0; if ((ctr = (SAM_UNK_CTR *)talloc(p->mem_ctx, sizeof(SAM_UNK_CTR))) == NULL) return NT_STATUS_NO_MEMORY; @@ -1605,38 +1597,31 @@ uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR DEBUG(5,("_samr_query_dom_info: %d\n", __LINE__)); /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&q_u->domain_pol) == -1) + if (!find_policy_by_hnd(p, &q_u->domain_pol, NULL)) return NT_STATUS_INVALID_HANDLE; switch (q_u->switch_value) { case 0x01: - switch_value = 0x1; init_unk_info1(&ctr->info.inf1); break; case 0x02: - switch_value = 0x2; /* The time call below is to get a sequence number for the sam. FIXME !!! JRA. */ init_unk_info2(&ctr->info.inf2, global_myworkgroup, global_myname, (uint32) time(NULL)); break; case 0x03: - switch_value = 0x3; init_unk_info3(&ctr->info.inf3); break; case 0x06: - switch_value = 0x6; init_unk_info6(&ctr->info.inf6); break; case 0x07: - switch_value = 0x7; init_unk_info7(&ctr->info.inf7); break; case 0x0c: - switch_value = 0xc; init_unk_info12(&ctr->info.inf12); break; default: return NT_STATUS_INVALID_INFO_CLASS; - break; } init_samr_r_query_dom_info(r_u, q_u->switch_value, ctr, NT_STATUS_NOPROBLEMO); @@ -1652,7 +1637,7 @@ uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CREATE_USER *r_u) { - struct sam_passwd *sam_pass; + SAM_ACCOUNT *sam_pass; fstring mach_acct; pstring err_str; pstring msg_str; @@ -1663,9 +1648,10 @@ uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CR UNISTR2 user_account = q_u->uni_name; uint16 acb_info = q_u->acb_info; POLICY_HND *user_pol = &r_u->user_pol; + struct samr_info *info = NULL; /* find the policy handle. open a policy on it. */ - if (find_lsa_policy_by_hnd(&dom_pol) == -1) + if (!find_policy_by_hnd(p, &dom_pol, NULL)) return NT_STATUS_INVALID_HANDLE; /* find the machine account: tell the caller if it exists. @@ -1678,17 +1664,13 @@ uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CR strlower(mach_acct); become_root(); - sam_pass = getsam21pwnam(mach_acct); + sam_pass = pdb_getsampwnam(mach_acct); unbecome_root(); if (sam_pass != NULL) { /* machine account exists: say so */ return NT_STATUS_USER_EXISTS; } - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(user_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - local_flags=LOCAL_ADD_USER|LOCAL_DISABLE_USER|LOCAL_SET_NO_PASSWORD; local_flags|= (acb_info & ACB_WSTRUST) ? LOCAL_TRUST_ACCOUNT:0; @@ -1720,37 +1702,41 @@ uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CR sizeof(err_str), msg_str, sizeof(msg_str))) { DEBUG(0, ("%s\n", err_str)); - close_lsa_policy_hnd(user_pol); + close_policy_hnd(p, user_pol); return NT_STATUS_ACCESS_DENIED; } become_root(); - sam_pass = getsam21pwnam(mach_acct); + sam_pass = pdb_getsampwnam(mach_acct); unbecome_root(); if (sam_pass == NULL) { /* account doesn't exist: say so */ - close_lsa_policy_hnd(user_pol); + close_policy_hnd(p, user_pol); return NT_STATUS_ACCESS_DENIED; } /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(&dom_pol, &sid)) { - close_lsa_policy_hnd(user_pol); + if(!get_lsa_policy_samr_sid(p, &dom_pol, &sid)) { + close_policy_hnd(p, user_pol); return NT_STATUS_INVALID_HANDLE; } /* append the user's RID to it */ - if(!sid_append_rid(&sid, sam_pass->user_rid)) { - close_lsa_policy_hnd(user_pol); + if(!sid_append_rid(&sid, pdb_get_user_rid(sam_pass) )) { + close_policy_hnd(p, user_pol); return NT_STATUS_NO_SUCH_USER; } - /* associate the SID with the (unique) handle. */ - if (!set_lsa_policy_samr_sid(user_pol, &sid)) { - /* oh, whoops. don't know what error message to return, here */ - close_lsa_policy_hnd(user_pol); + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(info); + info->sid = sid; + + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, user_pol, free_samr_info, (void *)info)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } r_u->user_rid=sam_pass->user_rid; r_u->unknown_0 = 0x000703ff; @@ -1764,19 +1750,22 @@ uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CR uint32 _samr_connect_anon(pipes_struct *p, SAMR_Q_CONNECT_ANON *q_u, SAMR_R_CONNECT_ANON *r_u) { + struct samr_info *info = NULL; + /* set up the SAMR connect_anon response */ r_u->status = NT_STATUS_NO_PROBLEMO; - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(&r_u->connect_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(info); + info->status = q_u->unknown_0; - /* associate the domain SID with the (unique) handle. */ - if (!set_lsa_policy_samr_pol_status(&r_u->connect_pol, q_u->unknown_0)) { - close_lsa_policy_hnd(&r_u->connect_pol); + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, &r_u->connect_pol, free_samr_info, (void *)info)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } return r_u->status; } @@ -1787,19 +1776,22 @@ uint32 _samr_connect_anon(pipes_struct *p, SAMR_Q_CONNECT_ANON *q_u, SAMR_R_CONN uint32 _samr_connect(pipes_struct *p, SAMR_Q_CONNECT *q_u, SAMR_R_CONNECT *r_u) { + struct samr_info *info = NULL; + DEBUG(5,("_samr_connect: %d\n", __LINE__)); r_u->status = NT_STATUS_NO_PROBLEMO; - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(&r_u->connect_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(info); + info->status = q_u->access_mask; - /* associate the domain SID with the (unique) handle. */ - if (!set_lsa_policy_samr_pol_status(&r_u->connect_pol, q_u->access_mask)) { - close_lsa_policy_hnd(&r_u->connect_pol); + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, &r_u->connect_pol, free_samr_info, (void *)info)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } DEBUG(5,("_samr_connect: %d\n", __LINE__)); @@ -1814,7 +1806,7 @@ uint32 _samr_lookup_domain(pipes_struct *p, SAMR_Q_LOOKUP_DOMAIN *q_u, SAMR_R_LO { r_u->status = NT_STATUS_NO_PROBLEMO; - if (find_lsa_policy_by_hnd(&q_u->connect_pol) == -1) + if (!find_policy_by_hnd(p, &q_u->connect_pol, NULL)) return NT_STATUS_INVALID_HANDLE; /* assume the domain name sent is our global_myname and @@ -1894,41 +1886,37 @@ uint32 _api_samr_open_alias(pipes_struct *p, SAMR_Q_OPEN_ALIAS *q_u, SAMR_R_OPEN POLICY_HND domain_pol = q_u->dom_pol; uint32 alias_rid = q_u->rid_alias; POLICY_HND *alias_pol = &r_u->pol; + struct samr_info *info = NULL; r_u->status = NT_STATUS_NO_PROBLEMO; /* get the domain policy. */ - if (find_lsa_policy_by_hnd(&domain_pol) == -1) + if (!find_policy_by_hnd(p, &domain_pol, NULL)) return NT_STATUS_INVALID_HANDLE; - /* get a (unique) handle. open a policy on it. */ - if (!open_lsa_policy_hnd(alias_pol)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; - /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(&domain_pol, &sid)) { - close_lsa_policy_hnd(alias_pol); + if(!get_lsa_policy_samr_sid(p, &domain_pol, &sid)) return NT_STATUS_INVALID_HANDLE; - } + + /* append the alias' RID to it */ + if(!sid_append_rid(&sid, alias_rid)) + return NT_STATUS_NO_SUCH_USER; /* * we should check if the rid really exist !!! * JFM. */ + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; - /* append the alias' RID to it */ - if(!sid_append_rid(&sid, alias_rid)) { - close_lsa_policy_hnd(alias_pol); - return NT_STATUS_NO_SUCH_USER; - } + ZERO_STRUCTP(info); + info->sid = sid; - /* associate a SID with the (unique) handle. */ - if (!set_lsa_policy_samr_sid(alias_pol, &sid)) { - /* oh, whoops. don't know what error message to return, here */ - close_lsa_policy_hnd(alias_pol); + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, alias_pol, free_samr_info, (void *)info)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - } return r_u->status; } @@ -1939,22 +1927,20 @@ uint32 _api_samr_open_alias(pipes_struct *p, SAMR_Q_OPEN_ALIAS *q_u, SAMR_R_OPEN static BOOL set_user_info_10(const SAM_USER_INFO_10 *id10, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; + SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); if (id10 == NULL) { DEBUG(5, ("set_user_info_10: NULL id10\n")); return False; } - if (pwd == NULL) + pwd = pdb_getsampwrid(rid); + if (!pwd) return False; - copy_sam_passwd(&new_pwd, pwd); - - new_pwd.acct_ctrl = id10->acb_info; + pdb_set_acct_ctrl(pwd, id10->acb_info); - if(!mod_sam21pwd_entry(&new_pwd, True)) + if(!pdb_update_sam_account(pwd, True)) return False; return True; @@ -1966,31 +1952,22 @@ static BOOL set_user_info_10(const SAM_USER_INFO_10 *id10, uint32 rid) static BOOL set_user_info_12(SAM_USER_INFO_12 *id12, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; - + SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); + if (pwd == NULL) return False; - + if (id12 == NULL) { DEBUG(2, ("set_user_info_12: id12 is NULL\n")); return False; } - - pdb_init_sam(&new_pwd); - copy_sam_passwd(&new_pwd, pwd); - - memcpy(nt_hash, id12->nt_pwd, sizeof(nt_hash)); - memcpy(lm_hash, id12->lm_pwd, sizeof(lm_hash)); - - new_pwd.smb_passwd = lm_hash; - new_pwd.smb_nt_passwd = nt_hash; - - if(!mod_sam21pwd_entry(&new_pwd, True)) + + pdb_set_lanman_passwd (pwd, id12->lm_pwd); + pdb_set_nt_passwd (pwd, id12->nt_pwd); + + if(!pdb_update_sam_account(pwd, True)) return False; - + return True; } @@ -1998,41 +1975,34 @@ static BOOL set_user_info_12(SAM_USER_INFO_12 *id12, uint32 rid) set_user_info_21 ********************************************************************/ -static BOOL set_user_info_21 (SAM_USER_INFO_21 *id21, uint32 rid) +static BOOL set_user_info_21(SAM_USER_INFO_21 *id21, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; - + SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); + SAM_ACCOUNT new_pwd; + if (id21 == NULL) { DEBUG(5, ("set_user_info_21: NULL id21\n")); return False; } - + if (pwd == NULL) return False; - - pdb_init_sam(&new_pwd); - /* we make a copy so that we can modify stuff */ + + /* we make a copy so that we can modify stuff */ copy_sam_passwd(&new_pwd, pwd); copy_id21_to_sam_passwd(&new_pwd, id21); - - if (pwd->smb_nt_passwd != NULL) { - memcpy(nt_hash, pwd->smb_nt_passwd, 16); - new_pwd.smb_nt_passwd = nt_hash; - } else - new_pwd.smb_nt_passwd = NULL; - - if (pwd->smb_nt_passwd != NULL) { - memcpy(lm_hash, pwd->smb_passwd, 16); - new_pwd.smb_passwd = lm_hash; - } else - new_pwd.smb_passwd = NULL; - - if(!mod_sam21pwd_entry(&new_pwd, True)) + + /* + * The funny part about the previous two calls is + * that pwd still has the password hashes from the + * passdb entry. These have not been updated from + * id21. I don't know if they need to be set. --jerry + */ + + /* write the change out */ + if(!pdb_update_sam_account(&new_pwd, True)) return False; - + return True; } @@ -2042,52 +2012,54 @@ static BOOL set_user_info_21 (SAM_USER_INFO_21 *id21, uint32 rid) static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; - pstring buf; - uint32 len; - - if (id23 == NULL) { - DEBUG(5, ("set_user_info_23: NULL id23\n")); - return False; - } - - if (pwd == NULL) - return False; - - pdb_init_sam(&new_pwd); - copy_sam_passwd(&new_pwd, pwd); - copy_id23_to_sam_passwd(&new_pwd, id23); - - memset(buf, 0, sizeof(pstring)); - - if (!decode_pw_buffer((char*)id23->pass, buf, 256, &len, nt_hash, lm_hash)) - return False; - - new_pwd.smb_passwd = lm_hash; - new_pwd.smb_nt_passwd = nt_hash; + SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); + SAM_ACCOUNT new_pwd; + BYTE nt_hash[16]; + BYTE lm_hash[16]; + pstring buf; + uint32 len; + uint16 acct_ctrl; + + if (id23 == NULL) { + DEBUG(5, ("set_user_info_23: NULL id23\n")); + return False; + } + + if (pwd == NULL) + return False; + + acct_ctrl = pdb_get_acct_ctrl(pwd); + copy_sam_passwd(&new_pwd, pwd); + copy_id23_to_sam_passwd(&new_pwd, id23); + + if (!decode_pw_buffer((char*)id23->pass, buf, 256, &len)) + return False; + + nt_lm_owf_gen(buf, nt_hash, lm_hash); + + pdb_set_lanman_passwd (&new_pwd, lm_hash); + pdb_set_nt_passwd (&new_pwd, nt_hash); + /* if it's a trust account, don't update /etc/passwd */ - if ( ( (new_pwd.acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || - ( (new_pwd.acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || - ( (new_pwd.acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { + if ( ( (acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || + ( (acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || + ( (acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { DEBUG(5, ("Changing trust account password, not updating /etc/passwd\n")); - } else { - + } else { + /* update the UNIX password */ /* update the UNIX password */ if (lp_unix_password_sync() ) - if(!chgpasswd(new_pwd.smb_name, "", buf, True)) + if(!chgpasswd(pdb_get_username(&new_pwd), "", buf, True)) return False; } - - memset(buf, 0, sizeof(buf)); - - if(!mod_sam21pwd_entry(&new_pwd, True)) - return False; - - return True; + + memset(buf, 0, sizeof(buf)); + + if(!pdb_update_sam_account(&new_pwd, True)) + return False; + + return True; } /******************************************************************* @@ -2096,49 +2068,51 @@ static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid) static BOOL set_user_info_24(SAM_USER_INFO_24 *id24, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; + SAM_ACCOUNT *pwd = pdb_getsampwrid(rid); + uchar nt_hash[16]; + uchar lm_hash[16]; uint32 len; pstring buf; - + uint16 acct_ctrl; + if (pwd == NULL) return False; + + acct_ctrl = pdb_get_acct_ctrl(pwd); - pdb_init_sam(&new_pwd); - copy_sam_passwd(&new_pwd, pwd); - - memset(buf, 0, sizeof(pstring)); - - if (!decode_pw_buffer((char*)id24->pass, buf, 256, &len, nt_hash, lm_hash)) + memset(buf, 0, sizeof(buf)); + + if (!decode_pw_buffer((char*)id24->pass, buf, 256, &len)) return False; - - new_pwd.smb_passwd = lm_hash; - new_pwd.smb_nt_passwd = nt_hash; - + + DEBUG(5,("set_user_info_24:nt_lm_owf_gen\n")); + + nt_lm_owf_gen(buf, nt_hash, lm_hash); + + pdb_set_lanman_passwd (pwd, lm_hash); + pdb_set_nt_passwd (pwd, nt_hash); + /* if it's a trust account, don't update /etc/passwd */ - if ( ( (new_pwd.acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || - ( (new_pwd.acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || - ( (new_pwd.acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { + if ( ( (acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || + ( (acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || + ( (acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { DEBUG(5, ("Changing trust account password, not updating /etc/passwd\n")); } else { - /* update the UNIX password */ - if (lp_unix_password_sync() ) - if(!chgpasswd(new_pwd.smb_name, "", buf, True)) + if (lp_unix_password_sync()) + if(!chgpasswd(pdb_get_username(pwd), "", buf, True)) return False; } - - memset(buf, 0, sizeof(buf)); - - DEBUG(5,("set_user_info_24: pdb_update_sam_account()\n")); - - /* update the SAMBA password */ - if(!mod_sam21pwd_entry(&new_pwd, True)) - return False; - - return True; + + memset(buf, 0, sizeof(buf)); + + DEBUG(0,("set_user_info_24: pdb_update_sam_account()\n")); + + /* update the SAMBA password */ + if(!pdb_update_sam_account(pwd, True)) + return False; + + return True; } /******************************************************************* @@ -2150,7 +2124,7 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ uint32 rid = 0x0; DOM_SID sid; struct current_user user; - struct smb_passwd *smb_pass; + SAM_ACCOUNT *sam_pass; unsigned char sess_key[16]; POLICY_HND *pol = &q_u->pol; uint16 switch_value = q_u->switch_value; @@ -2167,12 +2141,8 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ memcpy(&user, ¤t_user, sizeof(user)); } - /* search for the handle */ - if (find_lsa_policy_by_hnd(pol) == -1) - return NT_STATUS_INVALID_HANDLE; - /* find the policy handle. open a policy on it. */ - if (!get_lsa_policy_samr_sid(pol, &sid)) + if (!get_lsa_policy_samr_sid(p, pol, &sid)) return NT_STATUS_INVALID_HANDLE; sid_split_rid(&sid, &rid); @@ -2192,15 +2162,15 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ */ become_root(); - smb_pass = getsmbpwuid(user.uid); + sam_pass = pdb_getsampwuid(user.uid); unbecome_root(); - if(smb_pass == NULL) { + if(sam_pass == NULL) { DEBUG(0,("_samr_set_userinfo: Unable to get smbpasswd entry for uid %u\n", (unsigned int)user.uid )); return NT_STATUS_ACCESS_DENIED; } memset(sess_key, '\0', 16); - mdfour(sess_key, smb_pass->smb_nt_passwd, 16); + mdfour(sess_key, pdb_get_nt_passwd(sam_pass), 16); /* ok! user info levels (lots: see MSDEV help), off we go... */ switch (switch_value) { @@ -2236,7 +2206,7 @@ uint32 _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_SE { DOM_SID sid; uint32 rid = 0x0; - SAM_USERINFO_CTR *ctr = NULL; + SAM_USERINFO_CTR *ctr = q_u->ctr; POLICY_HND *pol = &q_u->pol; uint16 switch_value = q_u->switch_value; @@ -2244,18 +2214,8 @@ uint32 _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_SE r_u->status = NT_STATUS_NOPROBLEMO; - ctr = (SAM_USERINFO_CTR *)talloc(p->mem_ctx, sizeof(SAM_USERINFO_CTR)); - if (!ctr) - return NT_STATUS_NO_MEMORY; - - q_u->ctr = ctr; - - /* search for the handle */ - if (find_lsa_policy_by_hnd(pol) == -1) - return NT_STATUS_INVALID_HANDLE; - /* find the policy handle. open a policy on it. */ - if (!get_lsa_policy_samr_sid(pol, &sid)) + if (!get_lsa_policy_samr_sid(p, pol, &sid)) return NT_STATUS_INVALID_HANDLE; sid_split_rid(&sid, &rid); @@ -2267,7 +2227,7 @@ uint32 _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_SE return NT_STATUS_INVALID_INFO_CLASS; } - ctr->switch_value = switch_value; + switch_value=ctr->switch_value; /* ok! user info levels (lots: see MSDEV help), off we go... */ switch (switch_value) { diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c index 0cb72232f2..126581ba80 100755 --- a/source3/rpc_server/srv_spoolss.c +++ b/source3/rpc_server/srv_spoolss.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -249,7 +248,11 @@ static BOOL api_spoolss_rffpcnex(pipes_struct *p) * api_spoolss_rfnpcnex * ReplyFindNextPrinterChangeNotifyEx * called from the spoolss dispatcher - * + + * Note - this is the *ONLY* function that breaks the RPC call + * symmetry in all the other calls. We need to do this to fix + * the massive memory allocation problem with thousands of jobs... + * JRA. ********************************************************************/ static BOOL api_spoolss_rfnpcnex(pipes_struct *p) @@ -1188,5 +1191,3 @@ BOOL api_spoolss_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_spoolss_rpc", api_spoolss_cmds); } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 0fb38b84db..9fcf9930bf 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -40,14 +39,9 @@ extern pstring global_myname; /* and the notify info asked about */ /* that's the central struct */ typedef struct _Printer{ - ubi_dlNode Next; - ubi_dlNode Prev; - - BOOL open; BOOL document_started; BOOL page_started; int jobid; /* jobid in printing backend */ - POLICY_HND printer_hnd; BOOL printer_type; union { fstring handlename; @@ -78,14 +72,12 @@ typedef struct _counter_printer_0 { uint32 counter; } counter_printer_0; -static ubi_dlList Printer_list; static ubi_dlList counter_list; static struct cli_state cli; static uint32 smb_connections=0; -#define OPEN_HANDLE(pnum) ((pnum!=NULL) && (pnum->open!=False) && (IVAL(pnum->printer_hnd.data5,4)==(uint32)sys_getpid())) -#define OUR_HANDLE(pnum) ((pnum==NULL)?"NULL":(IVAL(pnum->data5,4)==(uint32)sys_getpid()?"OURS":"OTHER")) +#define OUR_HANDLE(hnd) ((hnd==NULL)?"NULL":(IVAL(hnd->data5,4)==(uint32)sys_getpid()?"OURS":"OTHER")) /* translate between internal status numbers and NT status numbers */ static int nt_printj_status(int v) @@ -151,6 +143,56 @@ static void free_spool_notify_option(SPOOL_NOTIFY_OPTION **pp) free(sp); } +/*************************************************************************** + Disconnect from the client +****************************************************************************/ + +static void srv_spoolss_replycloseprinter(POLICY_HND *handle) +{ + uint32 status; + + /* weird if the test succeds !!! */ + if (smb_connections==0) { + DEBUG(0,("srv_spoolss_replycloseprinter:Trying to close non-existant notify backchannel !\n")); + return; + } + + if(!cli_spoolss_reply_close_printer(&cli, handle, &status)) + DEBUG(0,("srv_spoolss_replycloseprinter: reply_close_printer failed.\n")); + + /* if it's the last connection, deconnect the IPC$ share */ + if (smb_connections==1) { + if(!spoolss_disconnect_from_client(&cli)) + return; + + message_deregister(MSG_PRINTER_NOTIFY); + } + + smb_connections--; +} + +/**************************************************************************** + Functions to free a printer entry datastruct. +****************************************************************************/ + +static void free_printer_entry(void *ptr) +{ + Printer_entry *Printer = (Printer_entry *)ptr; + + if (Printer->notify.client_connected==True) + srv_spoolss_replycloseprinter(&Printer->notify.client_hnd); + + Printer->notify.flags=0; + Printer->notify.options=0; + Printer->notify.localmachine[0]='\0'; + Printer->notify.printerlocal=0; + free_spool_notify_option(&Printer->notify.option); + Printer->notify.option=NULL; + Printer->notify.client_connected=False; + + safe_free(Printer); +} + /**************************************************************************** Functions to duplicate a SPOOL_NOTIFY_OPTION struct stored in Printer_entry. ****************************************************************************/ @@ -181,15 +223,6 @@ SPOOL_NOTIFY_OPTION *dup_spool_notify_option(SPOOL_NOTIFY_OPTION *sp) } /**************************************************************************** - initialise printer handle states... -****************************************************************************/ -void init_printer_hnd(void) -{ - ubi_dlInitList(&Printer_list); - ubi_dlInitList(&counter_list); -} - -/**************************************************************************** Return a user struct for a pipe user. ****************************************************************************/ @@ -206,108 +239,35 @@ static struct current_user *get_current_user(struct current_user *user, pipes_st } /**************************************************************************** - create a unique printer handle -****************************************************************************/ -static void create_printer_hnd(POLICY_HND *hnd) -{ - static uint32 prt_hnd_low = 0; - static uint32 prt_hnd_high = 0; - - if (hnd == NULL) return; - - create_policy_handle(hnd, &prt_hnd_low, &prt_hnd_high); -} - -/**************************************************************************** find printer index by handle ****************************************************************************/ -static Printer_entry *find_printer_index_by_hnd(const POLICY_HND *hnd) -{ - Printer_entry *find_printer; - find_printer = (Printer_entry *)ubi_dlFirst(&Printer_list); - - for(; find_printer; find_printer = (Printer_entry *)ubi_dlNext(find_printer)) { - - if (memcmp(&(find_printer->printer_hnd), hnd, sizeof(*hnd)) == 0) { - DEBUG(4,("Found printer handle \n")); - /*dump_data(4, hnd->data, sizeof(hnd->data));*/ - return find_printer; - } - } - - DEBUG(3,("Whoops, Printer handle not found: ")); - /*dump_data(4, hnd->data, sizeof(hnd->data));*/ - return NULL; -} - -/**************************************************************************** - clear an handle -****************************************************************************/ -static void clear_handle(POLICY_HND *hnd) -{ - ZERO_STRUCTP(hnd); -} - -/*************************************************************************** - Disconnect from the client -****************************************************************************/ -static BOOL srv_spoolss_replycloseprinter(POLICY_HND *handle) +static Printer_entry *find_printer_index_by_hnd(pipes_struct *p, POLICY_HND *hnd) { - uint32 status; - - /* weird if the test succeds !!! */ - if (smb_connections==0) { - DEBUG(0,("srv_spoolss_replycloseprinter:Trying to close non-existant notify backchannel !\n")); - return False; - } - - if(!cli_spoolss_reply_close_printer(&cli, handle, &status)) - return False; - - /* if it's the last connection, deconnect the IPC$ share */ - if (smb_connections==1) { - if(!spoolss_disconnect_from_client(&cli)) - return False; + Printer_entry *find_printer = NULL; - message_deregister(MSG_PRINTER_NOTIFY); + if(!find_policy_by_hnd(p,hnd,(void **)&find_printer)) { + DEBUG(3,("find_printer_index_by_hnd: Printer handle not found: ")); + return NULL; } - smb_connections--; - - return True; + return find_printer; } /**************************************************************************** close printer index by handle ****************************************************************************/ -static BOOL close_printer_handle(POLICY_HND *hnd) + +static BOOL close_printer_handle(pipes_struct *p, POLICY_HND *hnd) { - Printer_entry *Printer = find_printer_index_by_hnd(hnd); + Printer_entry *Printer = find_printer_index_by_hnd(p, hnd); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("close_printer_handle: Invalid handle (%s)\n", OUR_HANDLE(hnd))); return False; } - if (Printer->notify.client_connected==True) - if(!srv_spoolss_replycloseprinter(&Printer->notify.client_hnd)) - return ERROR_INVALID_HANDLE; - - Printer->open=False; - Printer->notify.flags=0; - Printer->notify.options=0; - Printer->notify.localmachine[0]='\0'; - Printer->notify.printerlocal=0; - free_spool_notify_option(&Printer->notify.option); - Printer->notify.option=NULL; - Printer->notify.client_connected=False; - - clear_handle(hnd); - - ubi_dlRemThis(&Printer_list, Printer); - - safe_free(Printer); + close_policy_hnd(p, hnd); return True; } @@ -315,11 +275,11 @@ static BOOL close_printer_handle(POLICY_HND *hnd) /**************************************************************************** delete a printer given a handle ****************************************************************************/ -static uint32 delete_printer_handle(POLICY_HND *hnd) +static uint32 delete_printer_handle(pipes_struct *p, POLICY_HND *hnd) { - Printer_entry *Printer = find_printer_index_by_hnd(hnd); + Printer_entry *Printer = find_printer_index_by_hnd(p, hnd); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("delete_printer_handle: Invalid handle (%s)\n", OUR_HANDLE(hnd))); return ERROR_INVALID_HANDLE; } @@ -387,11 +347,11 @@ static uint32 delete_printer_handle(POLICY_HND *hnd) /**************************************************************************** return the snum of a printer corresponding to an handle ****************************************************************************/ -static BOOL get_printer_snum(POLICY_HND *hnd, int *number) +static BOOL get_printer_snum(pipes_struct *p, POLICY_HND *hnd, int *number) { - Printer_entry *Printer = find_printer_index_by_hnd(hnd); + Printer_entry *Printer = find_printer_index_by_hnd(p, hnd); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("get_printer_snum: Invalid handle (%s)\n", OUR_HANDLE(hnd))); return False; } @@ -411,11 +371,11 @@ static BOOL get_printer_snum(POLICY_HND *hnd, int *number) /**************************************************************************** set printer handle type. ****************************************************************************/ -static BOOL set_printer_hnd_accesstype(POLICY_HND *hnd, uint32 access_required) +static BOOL set_printer_hnd_accesstype(pipes_struct *p, POLICY_HND *hnd, uint32 access_required) { - Printer_entry *Printer = find_printer_index_by_hnd(hnd); + Printer_entry *Printer = find_printer_index_by_hnd(p, hnd); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("set_printer_hnd_accesstype: Invalid handle (%s)", OUR_HANDLE(hnd))); return False; } @@ -581,38 +541,35 @@ static BOOL set_printer_hnd_name(Printer_entry *Printer, char *handlename) find first available printer slot. creates a printer handle for you. ****************************************************************************/ -static BOOL open_printer_hnd(POLICY_HND *hnd, char *name) +static BOOL open_printer_hnd(pipes_struct *p, POLICY_HND *hnd, char *name) { Printer_entry *new_printer; DEBUG(10,("open_printer_hnd: name [%s]\n", name)); - clear_handle(hnd); - create_printer_hnd(hnd); if((new_printer=(Printer_entry *)malloc(sizeof(Printer_entry))) == NULL) return False; ZERO_STRUCTP(new_printer); - new_printer->open = True; new_printer->notify.option=NULL; - memcpy(&new_printer->printer_hnd, hnd, sizeof(*hnd)); - - ubi_dlAddHead( &Printer_list, (ubi_dlNode *)new_printer); + if (!create_policy_hnd(p, hnd, free_printer_entry, new_printer)) { + safe_free(new_printer); + return False; + } if (!set_printer_hnd_printertype(new_printer, name)) { - close_printer_handle(hnd); + close_printer_handle(p, hnd); return False; } if (!set_printer_hnd_name(new_printer, name)) { - close_printer_handle(hnd); + close_printer_handle(p, hnd); return False; } - DEBUG(5, ("%d printer handles active\n", - (int)ubi_dlCount(&Printer_list))); + DEBUG(5, ("%d printer handles active\n", (int)p->pipe_handles.count )); return True; } @@ -620,11 +577,12 @@ static BOOL open_printer_hnd(POLICY_HND *hnd, char *name) /******************************************************************** Return True is the handle is a print server. ********************************************************************/ -static BOOL handle_is_printserver(const POLICY_HND *handle) + +static BOOL handle_is_printserver(pipes_struct *p, POLICY_HND *handle) { - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p,handle); - if (!OPEN_HANDLE(Printer)) + if (!Printer) return False; if (Printer->printer_type != PRINTER_HANDLE_IS_PRINTSERVER) @@ -670,11 +628,12 @@ static BOOL alloc_buffer_size(NEW_BUFFER *buffer, uint32 buffer_size) /*************************************************************************** receive the notify message ****************************************************************************/ + void srv_spoolss_receive_message(int msg_type, pid_t src, void *buf, size_t len) { fstring printer; uint32 status; - Printer_entry *find_printer; + struct pipes_struct *p; *printer = '\0'; fstrcpy(printer,buf); @@ -686,36 +645,45 @@ void srv_spoolss_receive_message(int msg_type, pid_t src, void *buf, size_t len) DEBUG(10,("srv_spoolss_receive_message: Got message about printer %s\n", printer )); - find_printer = (Printer_entry *)ubi_dlFirst(&Printer_list); + /* We need to enumerate all our pipes and all printers on them. */ + for ( p = get_first_pipe(); p; get_next_pipe(p)) { + struct policy *pol; - /* Iterate the printer list. */ - for(; find_printer; find_printer = (Printer_entry *)ubi_dlNext(find_printer)) { + if (!strequal(p->name, "spoolss")) + continue; - /* - * if the entry is the given printer or if it's a printerserver - * we send the message - */ + /* Iterate the printer list on this pipe. */ + for (pol = p->pipe_handles.Policy; pol; pol = pol->next ) { + Printer_entry *find_printer = (Printer_entry *)pol->data_ptr; - if (find_printer->printer_type==PRINTER_HANDLE_IS_PRINTER) - if (strcmp(find_printer->dev.handlename, printer)) + if (!find_printer) continue; - if (find_printer->notify.client_connected==True) - cli_spoolss_reply_rrpcn(&cli, &find_printer->notify.client_hnd, PRINTER_CHANGE_ALL, 0x0, &status); + /* + * if the entry is the given printer or if it's a printerserver + * we send the message + */ + + if (find_printer->printer_type==PRINTER_HANDLE_IS_PRINTER) + if (strcmp(find_printer->dev.handlename, printer)) + continue; + if (find_printer->notify.client_connected==True) + cli_spoolss_reply_rrpcn(&cli, &find_printer->notify.client_hnd, PRINTER_CHANGE_ALL, 0x0, &status); + } } } /*************************************************************************** send a notify event ****************************************************************************/ -static BOOL srv_spoolss_sendnotify(POLICY_HND *handle) +static BOOL srv_spoolss_sendnotify(pipes_struct *p, POLICY_HND *handle) { fstring printer; - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("srv_spoolss_sendnotify: Invalid handle (%s).\n", OUR_HANDLE(handle))); return False; } @@ -767,7 +735,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, DEBUGADD(3,("checking name: %s\n",name)); - if (!open_printer_hnd(handle, name)) + if (!open_printer_hnd(p, handle, name)) return ERROR_INVALID_PRINTER_NAME; /* @@ -780,8 +748,8 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, set_printer_hnd_datatype(handle, ""); */ - if (!set_printer_hnd_accesstype(handle, printer_default->access_required)) { - close_printer_handle(handle); + if (!set_printer_hnd_accesstype(p, handle, printer_default->access_required)) { + close_printer_handle(p, handle); return ERROR_ACCESS_DENIED; } @@ -810,7 +778,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, get_current_user(&user, p); - if (handle_is_printserver(handle)) { + if (handle_is_printserver(p, handle)) { if (printer_default->access_required == 0) { return NT_STATUS_NO_PROBLEMO; } @@ -820,14 +788,14 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, snum = -1; if (!lp_ms_add_printer_wizard()) { - close_printer_handle(handle); + close_printer_handle(p, handle); return ERROR_ACCESS_DENIED; } else if (user.uid == 0 || user_in_list(uidtoname(user.uid), lp_printer_admin(snum))) { return NT_STATUS_NO_PROBLEMO; } else { - close_printer_handle(handle); + close_printer_handle(p, handle); return ERROR_ACCESS_DENIED; } } @@ -837,7 +805,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, /* NT doesn't let us connect to a printer if the connecting user doesn't have print permission. */ - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; /* map an empty access mask to the minimum access mask */ @@ -846,7 +814,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, if (!print_access_check(&user, snum, printer_default->access_required)) { DEBUG(3, ("access DENIED for printer open\n")); - close_printer_handle(handle); + close_printer_handle(p, handle); return ERROR_ACCESS_DENIED; } @@ -919,7 +887,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, if (printer_default->devmode_cont.devmode != NULL) { result = printer_write_default_dev( snum, printer_default); if (result != 0) { - close_printer_handle(handle); + close_printer_handle(p, handle); return result; } } @@ -1038,11 +1006,11 @@ BOOL convert_devicemode(char *printername, const DEVICEMODE *devmode, * _spoolss_enddocprinter_internal. ********************************************************************/ -static uint32 _spoolss_enddocprinter_internal(POLICY_HND *handle) +static uint32 _spoolss_enddocprinter_internal(pipes_struct *p, POLICY_HND *handle) { - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_enddocprinter_internal: Invalid handle (%s)\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -1062,14 +1030,14 @@ uint32 _spoolss_closeprinter(pipes_struct *p, SPOOL_Q_CLOSEPRINTER *q_u, SPOOL_R { POLICY_HND *handle = &q_u->handle; - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); if (Printer && Printer->document_started) - _spoolss_enddocprinter_internal(handle); /* print job was not closed */ + _spoolss_enddocprinter_internal(p, handle); /* print job was not closed */ memcpy(&r_u->handle, &q_u->handle, sizeof(r_u->handle)); - if (!close_printer_handle(handle)) + if (!close_printer_handle(p, handle)) return ERROR_INVALID_HANDLE; return NT_STATUS_NO_PROBLEMO; @@ -1084,18 +1052,18 @@ uint32 _spoolss_deleteprinter(pipes_struct *p, SPOOL_Q_DELETEPRINTER *q_u, SPOOL { POLICY_HND *handle = &q_u->handle; - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); uint32 result; if (Printer && Printer->document_started) - _spoolss_enddocprinter_internal(handle); /* print job was not closed */ + _spoolss_enddocprinter_internal(p, handle); /* print job was not closed */ memcpy(&r_u->handle, &q_u->handle, sizeof(r_u->handle)); - result = delete_printer_handle(handle); + result = delete_printer_handle(p, handle); if (result == ERROR_SUCCESS) { - srv_spoolss_sendnotify(handle); + srv_spoolss_sendnotify(p, handle); } return result; @@ -1182,7 +1150,7 @@ static BOOL getprinterdata_printer_server(TALLOC_CTX *ctx, fstring value, uint32 /******************************************************************** GetPrinterData on a printer Handle. ********************************************************************/ -static BOOL getprinterdata_printer(TALLOC_CTX *ctx, POLICY_HND *handle, +static BOOL getprinterdata_printer(pipes_struct *p, TALLOC_CTX *ctx, POLICY_HND *handle, fstring value, uint32 *type, uint8 **data, uint32 *needed, uint32 in_size ) { @@ -1190,16 +1158,16 @@ static BOOL getprinterdata_printer(TALLOC_CTX *ctx, POLICY_HND *handle, int snum=0; uint8 *idata=NULL; uint32 len; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); DEBUG(5,("getprinterdata_printer\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("getprinterdata_printer: Invalid handle (%s).\n", OUR_HANDLE(handle))); return False; } - if(!get_printer_snum(handle, &snum)) + if(!get_printer_snum(p, handle, &snum)) return False; if(get_a_printer(&printer, 2, lp_servicename(snum)) != 0) @@ -1251,7 +1219,7 @@ uint32 _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO fstring value; BOOL found=False; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); /* * Reminder: when it's a string, the length is in BYTES @@ -1268,7 +1236,7 @@ uint32 _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO DEBUG(4,("_spoolss_getprinterdata\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { if((*data=(uint8 *)malloc(4*sizeof(uint8))) == NULL) return ERROR_NOT_ENOUGH_MEMORY; DEBUG(0,("_spoolss_getprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); @@ -1277,10 +1245,10 @@ uint32 _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO unistr2_to_ascii(value, valuename, sizeof(value)-1); - if (handle_is_printserver(handle)) + if (Printer->printer_type == PRINTER_HANDLE_IS_PRINTSERVER) found=getprinterdata_printer_server(p->mem_ctx, value, type, data, needed, *out_size); else - found= getprinterdata_printer(p->mem_ctx, handle, value, type, data, needed, *out_size); + found= getprinterdata_printer(p, p->mem_ctx, handle, value, type, data, needed, *out_size); if (found==False) { DEBUG(5, ("value not found, allocating %d\n", *out_size)); @@ -1351,9 +1319,9 @@ uint32 _spoolss_rffpcnex(pipes_struct *p, SPOOL_Q_RFFPCNEX *q_u, SPOOL_R_RFFPCNE /* store the notify value in the printer struct */ - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_rffpcnex: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -1786,13 +1754,11 @@ static void spoolss_notify_status(int snum, NT_PRINTER_INFO_LEVEL *printer, TALLOC_CTX *mem_ctx) { - int count; - print_queue_struct *q=NULL; print_status_struct status; memset(&status, 0, sizeof(status)); - count = print_queue_status(snum, &q, &status); + print_queue_status(snum, &q, &status); data->notify_data.value[0]=(uint32) status.status; safe_free(q); } @@ -2277,20 +2243,19 @@ static BOOL construct_notify_jobs_info(print_queue_struct *queue, * that's the print server case, the printer case is even worse. */ - - /******************************************************************* * * enumerate all printers on the printserver * fill a notify_info struct with info asked * ********************************************************************/ -static uint32 printserver_notify_info(const POLICY_HND *hnd, + +static uint32 printserver_notify_info(pipes_struct *p, POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info, TALLOC_CTX *mem_ctx) { int snum; - Printer_entry *Printer=find_printer_index_by_hnd(hnd); + Printer_entry *Printer=find_printer_index_by_hnd(p, hnd); int n_services=lp_numservices(); int i; uint32 id; @@ -2341,11 +2306,11 @@ static uint32 printserver_notify_info(const POLICY_HND *hnd, * fill a notify_info struct with info asked * ********************************************************************/ -static uint32 printer_notify_info(POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info, +static uint32 printer_notify_info(pipes_struct *p, POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info, TALLOC_CTX *mem_ctx) { int snum; - Printer_entry *Printer=find_printer_index_by_hnd(hnd); + Printer_entry *Printer=find_printer_index_by_hnd(p, hnd); int i; uint32 id; SPOOL_NOTIFY_OPTION *option; @@ -2362,7 +2327,7 @@ static uint32 printer_notify_info(POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info, info->data=NULL; info->count=0; - get_printer_snum(hnd, &snum); + get_printer_snum(p, hnd, &snum); for (i=0; i<option->count; i++) { option_type=&option->ctr.type[i]; @@ -2430,13 +2395,13 @@ uint32 _spoolss_rfnpcnex( pipes_struct *p, SPOOL_Q_RFNPCNEX *q_u, SPOOL_R_RFNPCN /* SPOOL_NOTIFY_OPTION *option = q_u->option; - notused. */ SPOOL_NOTIFY_INFO *info = &r_u->info; - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); uint32 result = ERROR_INVALID_HANDLE; /* we always have a NOTIFY_INFO struct */ r_u->info_ptr=0x1; - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_rfnpcnex: Invalid handle (%s).\n", OUR_HANDLE(handle))); goto done; @@ -2459,12 +2424,11 @@ uint32 _spoolss_rfnpcnex( pipes_struct *p, SPOOL_Q_RFNPCNEX *q_u, SPOOL_R_RFNPCN switch (Printer->printer_type) { case PRINTER_HANDLE_IS_PRINTSERVER: - result = printserver_notify_info(handle, info, - p->mem_ctx); + result = printserver_notify_info(p, handle, info, p->mem_ctx); break; case PRINTER_HANDLE_IS_PRINTER: - result = printer_notify_info(handle, info, p->mem_ctx); + result = printer_notify_info(p, handle, info, p->mem_ctx); break; } @@ -3312,7 +3276,7 @@ uint32 _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET *needed=0; - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; switch (level) { @@ -3831,7 +3795,7 @@ uint32 _spoolss_getprinterdriver2(pipes_struct *p, SPOOL_Q_GETPRINTERDRIVER2 *q_ pstrcpy(servername, global_myname); unistr2_to_ascii(architecture, uni_arch, sizeof(architecture)-1); - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; switch (level) { @@ -3855,9 +3819,9 @@ uint32 _spoolss_startpageprinter(pipes_struct *p, SPOOL_Q_STARTPAGEPRINTER *q_u, { POLICY_HND *handle = &q_u->handle; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); - if (OPEN_HANDLE(Printer)) { + if (Printer) { Printer->page_started=True; return 0x0; } @@ -3873,9 +3837,9 @@ uint32 _spoolss_endpageprinter(pipes_struct *p, SPOOL_Q_ENDPAGEPRINTER *q_u, SPO { POLICY_HND *handle = &q_u->handle; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_endpageprinter: Invalid handle (%s).\n",OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -3902,10 +3866,10 @@ uint32 _spoolss_startdocprinter(pipes_struct *p, SPOOL_Q_STARTDOCPRINTER *q_u, S int snum; pstring jobname; fstring datatype; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); struct current_user user; - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_startdocprinter: Invalid handle (%s)\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -3933,7 +3897,7 @@ uint32 _spoolss_startdocprinter(pipes_struct *p, SPOOL_Q_STARTDOCPRINTER *q_u, S } /* get the share number of the printer */ - if (!get_printer_snum(handle, &snum)) { + if (!get_printer_snum(p, handle, &snum)) { return ERROR_INVALID_HANDLE; } @@ -3964,7 +3928,7 @@ uint32 _spoolss_enddocprinter(pipes_struct *p, SPOOL_Q_ENDDOCPRINTER *q_u, SPOOL { POLICY_HND *handle = &q_u->handle; - return _spoolss_enddocprinter_internal(handle); + return _spoolss_enddocprinter_internal(p, handle); } /**************************************************************************** @@ -3977,9 +3941,9 @@ uint32 _spoolss_writeprinter(pipes_struct *p, SPOOL_Q_WRITEPRINTER *q_u, SPOOL_R uint8 *buffer = q_u->buffer; uint32 *buffer_written = &q_u->buffer_size2; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_writeprinter: Invalid handle (%s)\n",OUR_HANDLE(handle))); r_u->buffer_written = q_u->buffer_size2; return ERROR_INVALID_HANDLE; @@ -4003,16 +3967,16 @@ static uint32 control_printer(POLICY_HND *handle, uint32 command, { struct current_user user; int snum, errcode = ERROR_INVALID_FUNCTION; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); get_current_user(&user, p); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("control_printer: Invalid handle (%s)\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; switch (command) { @@ -4063,9 +4027,9 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level, uint32 result; int snum; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer) || !get_printer_snum(handle, &snum)) { + if (!Printer || !get_printer_snum(p, handle, &snum)) { DEBUG(0,("update_printer_sec: Invalid handle (%s)\n", OUR_HANDLE(handle))); @@ -4478,13 +4442,13 @@ static BOOL nt_printer_info_level_equal(NT_PRINTER_INFO_LEVEL *p1, * when updating a printer description ********************************************************************/ -static uint32 update_printer(POLICY_HND *handle, uint32 level, +static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, const SPOOL_PRINTER_INFO_LEVEL *info, DEVICEMODE *devmode) { int snum; NT_PRINTER_INFO_LEVEL *printer = NULL, *old_printer = NULL; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); uint32 result; DEBUG(8,("update_printer\n")); @@ -4498,12 +4462,12 @@ static uint32 update_printer(POLICY_HND *handle, uint32 level, goto done; } - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { result = ERROR_INVALID_HANDLE; goto done; } - if (!get_printer_snum(handle, &snum)) { + if (!get_printer_snum(p, handle, &snum)) { result = ERROR_INVALID_HANDLE; goto done; } @@ -4582,7 +4546,7 @@ static uint32 update_printer(POLICY_HND *handle, uint32 level, free_a_printer(&printer, 2); free_a_printer(&old_printer, 2); - srv_spoolss_sendnotify(handle); + srv_spoolss_sendnotify(p, handle); return result; } @@ -4599,9 +4563,9 @@ uint32 _spoolss_setprinter(pipes_struct *p, SPOOL_Q_SETPRINTER *q_u, SPOOL_R_SET SEC_DESC_BUF *secdesc_ctr = q_u->secdesc_ctr; uint32 command = q_u->command; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_setprinter: Invalid handle (%s)\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -4611,7 +4575,7 @@ uint32 _spoolss_setprinter(pipes_struct *p, SPOOL_Q_SETPRINTER *q_u, SPOOL_R_SET case 0: return control_printer(handle, command, p); case 2: - return update_printer(handle, level, info, devmode_ctr.devmode); + return update_printer(p, handle, level, info, devmode_ctr.devmode); case 3: return update_printer_sec(handle, level, info, p, secdesc_ctr); @@ -4627,16 +4591,15 @@ uint32 _spoolss_fcpn(pipes_struct *p, SPOOL_Q_FCPN *q_u, SPOOL_R_FCPN *r_u) { POLICY_HND *handle = &q_u->handle; - Printer_entry *Printer= find_printer_index_by_hnd(handle); + Printer_entry *Printer= find_printer_index_by_hnd(p, handle); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_fcpn: Invalid handle (%s)\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } if (Printer->notify.client_connected==True) - if(!srv_spoolss_replycloseprinter(&Printer->notify.client_hnd)) - return ERROR_INVALID_HANDLE; + srv_spoolss_replycloseprinter(&Printer->notify.client_hnd); Printer->notify.flags=0; Printer->notify.options=0; @@ -4872,7 +4835,7 @@ uint32 _spoolss_enumjobs( pipes_struct *p, SPOOL_Q_ENUMJOBS *q_u, SPOOL_R_ENUMJO *needed=0; *returned=0; - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; *returned = print_queue_status(snum, &queue, &prt_status); @@ -4920,7 +4883,7 @@ uint32 _spoolss_setjob(pipes_struct *p, SPOOL_Q_SETJOB *q_u, SPOOL_R_SETJOB *r_u memset(&prt_status, 0, sizeof(prt_status)); - if (!get_printer_snum(handle, &snum)) { + if (!get_printer_snum(p, handle, &snum)) { return ERROR_INVALID_HANDLE; } @@ -5647,7 +5610,7 @@ uint32 _spoolss_enumports( pipes_struct *p, SPOOL_Q_ENUMPORTS *q_u, SPOOL_R_ENUM /**************************************************************************** ****************************************************************************/ -static uint32 spoolss_addprinterex_level_2( const UNISTR2 *uni_srv_name, +static uint32 spoolss_addprinterex_level_2( pipes_struct *p, const UNISTR2 *uni_srv_name, const SPOOL_PRINTER_INFO_LEVEL *info, uint32 unk0, uint32 unk1, uint32 unk2, uint32 unk3, uint32 user_switch, const SPOOL_USER_CTR *user, @@ -5702,7 +5665,7 @@ static uint32 spoolss_addprinterex_level_2( const UNISTR2 *uni_srv_name, return ERROR_ACCESS_DENIED; } - if (!open_printer_hnd(handle, name)) { + if (!open_printer_hnd(p, handle, name)) { /* Handle open failed - remove addition. */ del_a_printer(printer->info_2->sharename); free_a_printer(&printer,2); @@ -5711,7 +5674,7 @@ static uint32 spoolss_addprinterex_level_2( const UNISTR2 *uni_srv_name, free_a_printer(&printer,2); - srv_spoolss_sendnotify(handle); + srv_spoolss_sendnotify(p, handle); return NT_STATUS_NO_PROBLEMO; } @@ -5738,7 +5701,7 @@ uint32 _spoolss_addprinterex( pipes_struct *p, SPOOL_Q_ADDPRINTEREX *q_u, SPOOL_ /* but I know what to do ... */ return ERROR_INVALID_LEVEL; case 2: - return spoolss_addprinterex_level_2(uni_srv_name, info, + return spoolss_addprinterex_level_2(p, uni_srv_name, info, unk0, unk1, unk2, unk3, user_switch, user, handle); default: @@ -5886,7 +5849,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S uint32 biggest_valuesize; uint32 biggest_datasize; uint32 data_len; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); int snum; uint8 *data=NULL; uint32 type; @@ -5905,12 +5868,12 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S DEBUG(5,("spoolss_enumprinterdata\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_enumprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p,handle, &snum)) return ERROR_INVALID_HANDLE; if (get_a_printer(&printer, 2, lp_servicename(snum)) != 0) @@ -6045,16 +6008,16 @@ uint32 _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP NT_PRINTER_PARAM *param = NULL, old_param; int snum=0; uint32 status = 0x0; - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); DEBUG(5,("spoolss_setprinterdata\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_setprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p,handle, &snum)) return ERROR_INVALID_HANDLE; status = get_a_printer(&printer, 2, lp_servicename(snum)); @@ -6117,16 +6080,16 @@ uint32 _spoolss_deleteprinterdata(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATA *q_ NT_PRINTER_PARAM param; int snum=0; uint32 status = 0x0; - Printer_entry *Printer=find_printer_index_by_hnd(handle); + Printer_entry *Printer=find_printer_index_by_hnd(p, handle); DEBUG(5,("spoolss_deleteprinterdata\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_deleteprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; if (!print_access_check(NULL, snum, PRINTER_ACCESS_ADMINISTER)) { @@ -6162,11 +6125,11 @@ uint32 _spoolss_addform( pipes_struct *p, SPOOL_Q_ADDFORM *q_u, SPOOL_R_ADDFORM int count=0; nt_forms_struct *list=NULL; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); DEBUG(5,("spoolss_addform\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_addform: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -6192,11 +6155,11 @@ uint32 _spoolss_deleteform( pipes_struct *p, SPOOL_Q_DELETEFORM *q_u, SPOOL_R_DE int count=0; uint32 ret = 0; nt_forms_struct *list=NULL; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); DEBUG(5,("spoolss_deleteform\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_deleteform: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -6222,11 +6185,11 @@ uint32 _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM * int count=0; nt_forms_struct *list=NULL; - Printer_entry *Printer = find_printer_index_by_hnd(handle); + Printer_entry *Printer = find_printer_index_by_hnd(p, handle); DEBUG(5,("spoolss_setform\n")); - if (!OPEN_HANDLE(Printer)) { + if (!Printer) { DEBUG(0,("_spoolss_setform: Invalid handle (%s).\n", OUR_HANDLE(handle))); return ERROR_INVALID_HANDLE; } @@ -6605,7 +6568,7 @@ uint32 _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_ *needed=0; - if (!get_printer_snum(handle, &snum)) + if (!get_printer_snum(p, handle, &snum)) return ERROR_INVALID_HANDLE; count = print_queue_status(snum, &queue, &prt_status); @@ -6623,4 +6586,3 @@ uint32 _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_ return ERROR_INVALID_LEVEL; } } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_srvsvc.c b/source3/rpc_server/srv_srvsvc.c index b530d66092..a3176bfd73 100644 --- a/source3/rpc_server/srv_srvsvc.c +++ b/source3/rpc_server/srv_srvsvc.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -248,5 +247,3 @@ BOOL api_srvsvc_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_srvsvc_rpc", api_srv_cmds); } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 80794609ea..6e0043b0bb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -695,6 +694,9 @@ uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R lp_default_server_announce(), string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); break; + case 100: + init_srv_info_100(&ctr->srv.sv100, 500, global_myname); + break; default: status = NT_STATUS_INVALID_INFO_CLASS; break; @@ -863,4 +865,3 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET return r_u->status; } -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_util.c b/source3/rpc_server/srv_util.c index 8349b7add6..82125a7085 100644 --- a/source3/rpc_server/srv_util.c +++ b/source3/rpc_server/srv_util.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -80,7 +78,7 @@ rid_name domain_group_rids[] = { 0 , NULL } }; -int make_dom_gids(char *gids_str, DOM_GID **ppgids) +int make_dom_gids(TALLOC_CTX *ctx, char *gids_str, DOM_GID **ppgids) { char *ptr; pstring s2; @@ -99,10 +97,10 @@ int make_dom_gids(char *gids_str, DOM_GID **ppgids) count++) ; - gids = (DOM_GID *)malloc( sizeof(DOM_GID) * count ); + gids = (DOM_GID *)talloc(ctx, sizeof(DOM_GID) * count ); if(!gids) { - DEBUG(0,("make_dom_gids: malloc fail !\n")); + DEBUG(0,("make_dom_gids: talloc fail !\n")); return 0; } @@ -192,11 +190,10 @@ void get_domain_user_groups(char *domain_groups, char *user) } } - /******************************************************************* - lookup_group_name + Look up a local (domain) rid and return a name and type. ********************************************************************/ -uint32 lookup_group_name(uint32 rid, char *group_name, uint32 *type) +uint32 local_lookup_group_name(uint32 rid, char *group_name, uint32 *type) { int i = 0; (*type) = SID_NAME_DOM_GRP; @@ -220,9 +217,9 @@ uint32 lookup_group_name(uint32 rid, char *group_name, uint32 *type) } /******************************************************************* - lookup_alias_name + Look up a local alias rid and return a name and type. ********************************************************************/ -uint32 lookup_alias_name(uint32 rid, char *alias_name, uint32 *type) +uint32 local_lookup_alias_name(uint32 rid, char *alias_name, uint32 *type) { int i = 0; (*type) = SID_NAME_WKN_GRP; @@ -246,11 +243,11 @@ uint32 lookup_alias_name(uint32 rid, char *alias_name, uint32 *type) } /******************************************************************* - lookup_user_name + Look up a local user rid and return a name and type. ********************************************************************/ -uint32 lookup_user_name(uint32 rid, char *user_name, uint32 *type) +uint32 local_lookup_user_name(uint32 rid, char *user_name, uint32 *type) { - struct sam_disp_info *disp_info; + SAM_ACCOUNT *sampwd; int i = 0; (*type) = SID_NAME_USER; @@ -271,12 +268,12 @@ uint32 lookup_user_name(uint32 rid, char *user_name, uint32 *type) /* ok, it's a user. find the user account */ become_root(); - disp_info = pdb_sam_to_dispinfo(pdb_getsampwrid(rid)); + sampwd = pdb_getsampwrid(rid); unbecome_root(); - if (disp_info != NULL) + if (sampwd != NULL) { - fstrcpy(user_name, disp_info->smb_name); + fstrcpy(user_name, pdb_get_username(sampwd) ); DEBUG(5,(" = %s\n", user_name)); return 0x0; } @@ -286,9 +283,9 @@ uint32 lookup_user_name(uint32 rid, char *user_name, uint32 *type) } /******************************************************************* - lookup_group_rid + Look up a local (domain) group name and return a rid ********************************************************************/ -uint32 lookup_group_rid(char *group_name, uint32 *rid) +uint32 local_lookup_group_rid(char *group_name, uint32 *rid) { char *grp_name; int i = -1; /* start do loop at -1 */ @@ -305,9 +302,9 @@ uint32 lookup_group_rid(char *group_name, uint32 *rid) } /******************************************************************* - lookup_alias_rid + Look up a local (BUILTIN) alias name and return a rid ********************************************************************/ -uint32 lookup_alias_rid(char *alias_name, uint32 *rid) +uint32 local_lookup_alias_rid(char *alias_name, uint32 *rid) { char *als_name; int i = -1; /* start do loop at -1 */ @@ -324,25 +321,23 @@ uint32 lookup_alias_rid(char *alias_name, uint32 *rid) } /******************************************************************* - lookup_user_rid + Look up a local user name and return a rid ********************************************************************/ -uint32 lookup_user_rid(char *user_name, uint32 *rid) +uint32 local_lookup_user_rid(char *user_name, uint32 *rid) { - SAM_ACCOUNT *sam_pass; + SAM_ACCOUNT *sampass; (*rid) = 0; /* find the user account */ become_root(); - sam_pass = pdb_getsampwnam(user_name); + sampass = pdb_getsampwnam(user_name); unbecome_root(); - if (sam_pass != NULL) + if (sampass != NULL) { - *rid = pdb_get_user_rid(sam_pass); + (*rid) = pdb_get_user_rid(sampass); return 0x0; } return NT_STATUS_NONE_MAPPED; } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_wkssvc.c b/source3/rpc_server/srv_wkssvc.c index e648c0f122..12e4a8f335 100644 --- a/source3/rpc_server/srv_wkssvc.c +++ b/source3/rpc_server/srv_wkssvc.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -72,5 +71,3 @@ BOOL api_wkssvc_rpc(pipes_struct *p) { return api_rpcTNP(p, "api_wkssvc_rpc", api_wks_cmds); } - -#undef OLD_NTDOMAIN diff --git a/source3/rpc_server/srv_wkssvc_nt.c b/source3/rpc_server/srv_wkssvc_nt.c index 688c7f1d01..40771d2fb9 100644 --- a/source3/rpc_server/srv_wkssvc_nt.c +++ b/source3/rpc_server/srv_wkssvc_nt.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -79,4 +78,3 @@ uint32 _wks_query_info(pipes_struct *p, WKS_Q_QUERY_INFO *q_u, WKS_R_QUERY_INFO return r_u->status; } -#undef OLD_NTDOMAIN diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index 23e2fab0e7..59830e7742 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -1,4 +1,3 @@ -#define NEW_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 2.2 @@ -454,5 +453,3 @@ struct cmd_set samr_commands[] = { { "querygroupmem", cmd_samr_query_groupmem, "Query group membership" }, { NULL, NULL, NULL } }; - -#undef NEW_NTDOMAIN diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index 16caf8b52e..e8dc29f80a 100644 --- a/source3/smbd/blocking.c +++ b/source3/smbd/blocking.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -633,5 +631,3 @@ void process_blocking_lock_queue(time_t t) blr = (blocking_lock_record *)ubi_slNext(blr); } } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/chgpasswd.c b/source3/smbd/chgpasswd.c index ba68557fdf..418ad6a675 100644 --- a/source3/smbd/chgpasswd.c +++ b/source3/smbd/chgpasswd.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -937,5 +935,3 @@ BOOL check_plaintext_password(char *user, char *old_passwd, else return (True); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 87bd313327..56aad64391 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -243,5 +241,3 @@ int close_file(files_struct *fsp, BOOL normal_close) return close_statfile(fsp, normal_close); return close_normal_file(fsp, normal_close); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c index cd4ca9ded4..e9f79fdf32 100644 --- a/source3/smbd/conn.c +++ b/source3/smbd/conn.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -200,5 +198,3 @@ void conn_free(connection_struct *conn) ZERO_STRUCTP(conn); free(conn); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index a7e05c5682..5bf0dec944 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -893,5 +891,3 @@ void DirCacheFlush(int snum) entry = (dir_cache_entry *)next; } } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index a4b4f65ad9..8b2c482b0a 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -334,5 +332,3 @@ BOOL set_filetime(connection_struct *conn, char *fname, time_t mtime) return(True); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/error.c b/source3/smbd/error.c index 49da44d68e..d879f9a93c 100644 --- a/source3/smbd/error.c +++ b/source3/smbd/error.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -146,5 +144,3 @@ int error_packet(char *inbuf,char *outbuf,int error_class,uint32 error_code,int return(outsize); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c index 35e2f1455e..c79f0aa89e 100644 --- a/source3/smbd/fileio.c +++ b/source3/smbd/fileio.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -584,4 +583,3 @@ void sync_file(connection_struct *conn, files_struct *fsp) conn->vfs_ops.fsync(fsp,fsp->fd); } } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index aedd2e820f..bdbcd81b64 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -514,6 +512,3 @@ static BOOL scan_directory(char *path, char *name,connection_struct *conn,BOOL d CloseDir(cur_dir); return(False); } - - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 2909d49a2a..a4837a1a8b 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -364,4 +363,3 @@ void file_chain_restore(void) { chain_fsp = oplock_save_chain_fsp; } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index 5ade667209..3b9e34b4d7 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -517,4 +516,3 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int END_PROFILE(SMBtrans); return(outsize); } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index c29f0df434..f5e1de1608 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -3330,6 +3329,3 @@ int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data,char * return -1; } - - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/message.c b/source3/smbd/message.c index ab3c841d9c..3afe7218e0 100644 --- a/source3/smbd/message.c +++ b/source3/smbd/message.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -235,5 +233,3 @@ int reply_sendend(connection_struct *conn, END_PROFILE(SMBsendend); return(outsize); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index c2026f46f9..e15af3f3ae 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -448,5 +446,3 @@ int reply_negprot(connection_struct *conn, END_PROFILE(SMBnegprot); return(outsize); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 912ab43e9e..429723c19e 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 3.0 @@ -224,6 +223,3 @@ BOOL init_change_notify(void) return True; } - - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/notify_hash.c b/source3/smbd/notify_hash.c index 5a2f865310..a0a61569a8 100644 --- a/source3/smbd/notify_hash.c +++ b/source3/smbd/notify_hash.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 3.0 @@ -195,5 +194,3 @@ struct cnotify_fns *hash_notify_init(void) uint16 vuid = (lp_security() == SEC_SHARE) ? UID_FIELD_INVALID : SVAL(cnbp->request_buf,smb_uid); */ - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/notify_kernel.c b/source3/smbd/notify_kernel.c index db823601f1..243a16a7f7 100644 --- a/source3/smbd/notify_kernel.c +++ b/source3/smbd/notify_kernel.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 3.0 @@ -207,5 +206,3 @@ struct cnotify_fns *kernel_notify_init(void) #else void notify_kernel_dummy(void) {} #endif /* HAVE_KERNEL_CHANGE_NOTIFY */ - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index d9a93f8d78..1ccac83b78 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -1974,4 +1973,3 @@ due to being in oplock break state.\n" )); calls have already sent it. If outsize != -1 then it is returning an error packet. */ } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 3665e7d20f..afcaeff1ae 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -1158,5 +1156,3 @@ free_and_exit: free((char *)old_shares); return(ret); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index 4f26eaf7f2..e0b494017a 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -978,7 +976,6 @@ should be %d\n", (int)pid, share_entry->op_port, global_oplock_port)); while(time_left >= 0) { char op_break_reply[OPBRK_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN]; - int32 reply_msg_len; uint16 reply_from_port; char *reply_msg_start; fd_set fds; @@ -1029,7 +1026,6 @@ should be %d\n", (int)pid, share_entry->op_port, global_oplock_port)); return False; } - reply_msg_len = IVAL(op_break_reply,OPBRK_CMD_LEN_OFFSET); reply_from_port = SVAL(op_break_reply,OPBRK_CMD_PORT_OFFSET); reply_msg_start = &op_break_reply[OPBRK_CMD_HEADER_LEN]; @@ -1234,5 +1230,3 @@ address %lx. Error was %s\n", (long)htonl(INADDR_LOOPBACK), strerror(errno))); return True; } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/oplock_irix.c b/source3/smbd/oplock_irix.c index cf1cbbb0fc..faf7e8e3c8 100644 --- a/source3/smbd/oplock_irix.c +++ b/source3/smbd/oplock_irix.c @@ -1,6 +1,4 @@ -#define OLD_NTDOMAIN 1 - -/* +/* Unix SMB/Netbios implementation. Version 2.x IRIX kernel oplock processing @@ -278,5 +276,3 @@ struct kernel_oplocks *irix_init_kernel_oplocks(void) #else void oplock_irix_dummy(void) {} #endif /* HAVE_KERNEL_OPLOCKS_IRIX */ - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/oplock_linux.c b/source3/smbd/oplock_linux.c index d97378ac5d..e070761f10 100644 --- a/source3/smbd/oplock_linux.c +++ b/source3/smbd/oplock_linux.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 3.0 @@ -302,6 +300,3 @@ struct kernel_oplocks *linux_init_kernel_oplocks(void) #else void oplock_linux_dummy(void) {} #endif /* HAVE_KERNEL_OPLOCKS_LINUX */ - -#undef OLD_NTDOMAIN - diff --git a/source3/smbd/password.c b/source3/smbd/password.c index 311a019506..849aa87a75 100644 --- a/source3/smbd/password.c +++ b/source3/smbd/password.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -1610,5 +1608,3 @@ BOOL domain_client_validate( char *user, char *domain, cli_shutdown(&cli); return True; } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/pipes.c b/source3/smbd/pipes.c index df7141764c..366707cd58 100644 --- a/source3/smbd/pipes.c +++ b/source3/smbd/pipes.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -262,5 +261,3 @@ int reply_pipe_close(connection_struct *conn, char *inbuf,char *outbuf) return(outsize); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index 9c5afad9c1..fe2974b235 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -1700,4 +1699,3 @@ int fchmod_acl(int fd, mode_t mode) sys_acl_free_acl(posix_acl); return ret; } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/process.c b/source3/smbd/process.c index f8fde41b77..a34555adc1 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -1256,5 +1255,3 @@ void smbd_process(void) } } } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index a505160b7d..04e7b4c101 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -4840,4 +4839,3 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, END_PROFILE(SMBgetattrE); return(outsize); } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/sec_ctx.c b/source3/smbd/sec_ctx.c index f3cc9e04e0..f604f6cce7 100644 --- a/source3/smbd/sec_ctx.c +++ b/source3/smbd/sec_ctx.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -459,4 +458,3 @@ void init_sec_ctx(void) current_user.vuid = UID_FIELD_INVALID; current_user.nt_user_token = NULL; } -#undef OLD_NTDOMAIN diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 6457dd6295..d2a7ad3be4 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -502,12 +501,6 @@ static void init_structs(void ) /* for RPC pipes */ init_rpc_pipe_hnd(); - /* for LSA handles */ - init_lsa_policy_hnd(); - - /* for SPOOLSS handles */ - init_printer_hnd(); - init_dptrs(); secrets_init(); @@ -804,5 +797,3 @@ static void usage(char *pname) exit_server("normal exit"); return(0); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/service.c b/source3/smbd/service.c index f0ab2ba771..02405e8dda 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -681,5 +679,3 @@ void close_cnum(connection_struct *conn, uint16 vuid) } conn_free(conn); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index d94a775846..6cc65d1b21 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -2511,5 +2509,3 @@ int reply_trans2(connection_struct *conn, call_trans2xxx calls have already sent it. If outsize != -1 then it is returning */ } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/uid.c b/source3/smbd/uid.c index db43106b77..3d37021fff 100644 --- a/source3/smbd/uid.c +++ b/source3/smbd/uid.c @@ -1,5 +1,3 @@ -#define OLD_NTDOMAIN 1 - /* Unix SMB/Netbios implementation. Version 1.9. @@ -521,5 +519,3 @@ BOOL sid_to_gid(DOM_SID *psid, gid_t *pgid, enum SID_NAME_USE *sidtype) return True; } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/vfs-wrap.c b/source3/smbd/vfs-wrap.c index ad4d4ddbef..8750f71151 100644 --- a/source3/smbd/vfs-wrap.c +++ b/source3/smbd/vfs-wrap.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -543,5 +542,3 @@ int vfswrap_fchmod_acl(files_struct *fsp, int fd, mode_t mode) { return fchmod_acl(fd, mode); } - -#undef OLD_NTDOMAIN diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 2cd83c37f3..b8aa290cab 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* Unix SMB/Netbios implementation. Version 1.9. @@ -895,4 +894,3 @@ BOOL reduce_name(connection_struct *conn, char *s,char *dir,BOOL widelinks) return(True); #endif } -#undef OLD_NTDOMAIN diff --git a/source3/utils/smbpasswd.c b/source3/utils/smbpasswd.c index d20760bee1..94bfe464e4 100644 --- a/source3/utils/smbpasswd.c +++ b/source3/utils/smbpasswd.c @@ -221,13 +221,12 @@ static BOOL password_change(const char *remote_machine, char *user_name, if (remote_machine != NULL) { if (local_flags & (LOCAL_ADD_USER|LOCAL_DELETE_USER|LOCAL_DISABLE_USER|LOCAL_ENABLE_USER| - LOCAL_TRUST_ACCOUNT|LOCAL_SET_NO_PASSWORD)) - { + LOCAL_TRUST_ACCOUNT|LOCAL_SET_NO_PASSWORD)) { /* these things can't be done remotely yet */ return False; } - ret = remote_password_change(remote_machine, user_name, old_passwd, - new_passwd, err_str, sizeof(err_str)); + ret = remote_password_change(remote_machine, user_name, + old_passwd, new_passwd, err_str, sizeof(err_str)); if(*err_str) fprintf(stderr, err_str); return ret; @@ -409,11 +408,9 @@ static int process_root(int argc, char *argv[]) * smbpasswd file) then we need to prompt for a new password. */ - if(local_flags & LOCAL_ENABLE_USER) - { + if(local_flags & LOCAL_ENABLE_USER) { SAM_ACCOUNT *sampass = pdb_getsampwnam(user_name); - if((sampass != NULL) && (pdb_get_lanman_passwd(sampass) != NULL)) - { + if((sampass != NULL) && (pdb_get_lanman_passwd(sampass) != NULL)) { new_passwd = xstrdup("XXXX"); /* Don't care. */ } } @@ -427,15 +424,13 @@ static int process_root(int argc, char *argv[]) } } - if (!password_change(remote_machine, user_name, old_passwd, new_passwd, local_flags)) - { + if (!password_change(remote_machine, user_name, old_passwd, new_passwd, local_flags)) { fprintf(stderr,"Failed to modify password entry for user %s\n", user_name); result = 1; goto done; } - if(!(local_flags & (LOCAL_ADD_USER|LOCAL_DISABLE_USER|LOCAL_ENABLE_USER|LOCAL_DELETE_USER|LOCAL_SET_NO_PASSWORD))) - { + if(!(local_flags & (LOCAL_ADD_USER|LOCAL_DISABLE_USER|LOCAL_ENABLE_USER|LOCAL_DELETE_USER|LOCAL_SET_NO_PASSWORD))) { SAM_ACCOUNT *sampass = pdb_getsampwnam(user_name); printf("Password changed for user %s.", user_name ); if( (sampass != NULL) && (pdb_get_acct_ctrl(sampass)&ACB_DISABLED) ) diff --git a/source3/utils/status.c b/source3/utils/status.c index edc861d267..06abd09d92 100644 --- a/source3/utils/status.c +++ b/source3/utils/status.c @@ -58,8 +58,8 @@ static BOOL processes_only=False; static int show_brl; /* we need these because we link to locking*.o */ - void become_root(BOOL save_dir) {} - void unbecome_root(BOOL restore_dir) {} + void become_root(void) {} + void unbecome_root(void) {} /* added by OH */ diff --git a/source3/web/cgi.c b/source3/web/cgi.c index f85ba7bebd..e4fda2d99c 100644 --- a/source3/web/cgi.c +++ b/source3/web/cgi.c @@ -332,7 +332,6 @@ static BOOL cgi_handle_authorization(char *line) { char *p, *user, *user_pass; struct passwd *pass = NULL; - BOOL ret = False; BOOL got_name = False; BOOL tested_pass = False; fstring default_user_lookup; @@ -378,7 +377,7 @@ static BOOL cgi_handle_authorization(char *line) tested_pass = True; - if((ret = pass_check(user, user_pass, strlen(user_pass), NULL, NULL)) == True) { + if(pass_check(user, user_pass, strlen(user_pass), NULL, NULL) == True) { /* * Password was ok. diff --git a/source3/web/swat.c b/source3/web/swat.c index d0a78fb243..1e8d23f6e3 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -50,8 +50,8 @@ static int iNumNonAutoPrintServices = 0; #define RHOST "remote_host" /* we need these because we link to locking*.o */ - void become_root(BOOL save_dir) {} - void unbecome_root(BOOL restore_dir) {} + void become_root(void) {} + void unbecome_root(void) {} /**************************************************************************** ****************************************************************************/ |