From a65dead017b3f52d7c2f753ce8ca876371183629 Mon Sep 17 00:00:00 2001 From: Luke Leighton Date: Sat, 27 May 2000 01:26:34 +0000 Subject: security descs in spoolss. needs parse_sec.c nttrans.c broken. (This used to be commit f9f2a04fdb7b2af1cfe5bf26ec6f0d955ea948b9) --- source3/include/nt_printing.h | 2 +- source3/include/proto.h | 1075 ++++++++++++++++++----------------- source3/include/rpc_secdes.h | 6 +- source3/include/rpc_spoolss.h | 28 +- source3/include/smb.h | 3 +- source3/printing/nt_printing.c | 4 +- source3/rpc_parse/parse_sec.c | 697 +++++++++++------------ source3/rpc_parse/parse_spoolss.c | 159 +++++- source3/rpc_server/srv_spoolss_nt.c | 80 ++- 9 files changed, 1152 insertions(+), 902 deletions(-) diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h index 9f89ed0568..8c63ba0da1 100644 --- a/source3/include/nt_printing.h +++ b/source3/include/nt_printing.h @@ -244,7 +244,7 @@ typedef struct nt_printer_info_level_2 fstring datatype; fstring parameters; NT_PRINTER_PARAM *specific; - /* SEC_DESC_BUF *secdesc; */ + SEC_DESC_BUF secdesc; /* not used but ... and how ??? */ uint32 changeid; uint32 c_setprinter; diff --git a/source3/include/proto.h b/source3/include/proto.h index a8608c47b5..320e0f1c5f 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -194,10 +194,252 @@ 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); +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/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); +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); +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_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(struct cli_state *cli,const char *Mask,uint16 attribute, + void (*fn)(file_info *, const char *)); +int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute, + void (*fn)(file_info *, const char *)); + +/*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, int pipe_name_len, + 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 *)); +BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype, + void (*fn)(const char *, uint32, const char *)); +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/clitrans.c */ + +BOOL cli_send_trans(struct cli_state *cli, int trans, + char *name, int pipe_name_len, + 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); + +/*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 */ + +BOOL name_status(int fd,char *name,int name_type,BOOL recurse, + struct in_addr to_ip,char *master,char *rname); +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 resolve_name(const char *name, struct in_addr *return_ip, int name_type); +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(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 */ + +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_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); + +/*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 */ @@ -292,41 +534,60 @@ struct passwd *Get_Pwnam(char *user,BOOL allow_change); 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); -BOOL in_group(gid_t group, gid_t current_gid, int ngroups, gid_t *groups); +BOOL in_group(gid_t group, gid_t current_gid, int ngroups, gid_t * groups); char *Atoic(char *p, int *n, char *c); char *get_numlist(char *p, uint32 **num, int *count); -BOOL file_exist(char *fname,SMB_STRUCT_STAT *sbuf); +BOOL file_exist(char *fname, SMB_STRUCT_STAT * sbuf); int file_rename(char *from, char *to); time_t file_modtime(char *fname); -BOOL directory_exist(char *dname,SMB_STRUCT_STAT *st); +BOOL directory_exist(char *dname, SMB_STRUCT_STAT * st); SMB_OFF_T get_file_size(char *file_name); char *attrib_string(uint16 mode); void show_msg(char *buf); -void smb_setlen(char *buf,int len); -int set_message(char *buf,int num_words,int num_bytes,BOOL zero); +void smb_setlen(char *buf, int len); +int set_message(char *buf, int num_words, int num_bytes, BOOL zero); void dos_clean_name(char *s); void unix_clean_name(char *s); -BOOL reduce_name(char *s,char *dir,BOOL widelinks); -void make_dir_struct(char *buf,char *mask,char *fname,SMB_OFF_T size,int mode,time_t date); +BOOL reduce_name(char *s, char *dir, BOOL widelinks); +void make_dir_struct(char *buf, char *mask, char *fname, SMB_OFF_T size, + int mode, time_t date); void close_low_fds(void); int set_blocking(int fd, BOOL set); -SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n,char *header,int headlen,int align); +SMB_OFF_T transfer_file(int infd, int outfd, SMB_OFF_T n, char *header, + int headlen, int align); void msleep(int t); void become_daemon(void); BOOL yesno(char *p); int set_filelen(int fd, SMB_OFF_T len); -void *Realloc(void *p,size_t size); +void *Realloc(void *p, size_t size); void safe_free(void *p); BOOL get_myname(char *my_name); -int interpret_protocol(char *str,int def); +int interpret_protocol(char *str, int def); BOOL is_ipaddress(const char *str); uint32 interpret_addr(char *str); struct in_addr *interpret_addr2(char *str); BOOL zero_ip(struct in_addr ip); -BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask); +BOOL same_net(struct in_addr ip1, struct in_addr ip2, struct in_addr mask); struct hostent *Get_Hostbyname(const char *name); BOOL process_exists(pid_t pid); char *uidtoname(uid_t uid); @@ -334,48 +595,31 @@ char *gidtoname(gid_t gid); uid_t nametouid(const char *name); gid_t nametogid(const char *name); void smb_panic(char *why); -char *readdirname(DIR *p); -BOOL is_in_path(char *name, name_compare_entry *namelist); -void set_namearray(name_compare_entry **ppname_array, char *namelist); -void free_namearray(name_compare_entry *name_array); +char *readdirname(DIR * p); +BOOL is_in_path(char *name, name_compare_entry * namelist); +void set_namearray(name_compare_entry ** ppname_array, char *namelist); +void free_namearray(name_compare_entry * name_array); BOOL fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type); BOOL is_myname(char *s); void set_remote_arch(enum remote_arch_types type); enum remote_arch_types get_remote_arch(void); -void out_ascii(FILE *f, unsigned char *buf,int len); -void out_data(FILE *f,char *buf1,int len, int per_line); -void print_asc(int level, unsigned char *buf,int len); -void dump_data(int level,char *buf1,int len); +void out_ascii(FILE * f, unsigned char *buf, int len); +void out_data(FILE * f, char *buf1, int len, int per_line); +void print_asc(int level, unsigned char *buf, int len); +void dump_data(int level, char *buf1, int len); char *tab_depth(int depth); int str_checksum(const char *s); void zero_free(void *p, size_t size); int set_maxfiles(int requested_max); BOOL reg_split_key(char *full_keyname, uint32 *reg_type, char *key_name); char *smbd_mktemp(char *template); -void *memdup(void *p, size_t size); -char *myhostname(void); -char *lock_path(char *name); -char *parent_dirname(const char *path); -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); +void *memdup(void *p, size_t size); +char *myhostname(void); +char *lock_path(char *name); +char *parent_dirname(const char *path); +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_file.c */ @@ -428,21 +672,24 @@ size_t sid_size(DOM_SID *sid); BOOL is_a_socket(int fd); void set_socket_options(int fd, char *options); -ssize_t read_udp_socket(int fd,char *buf,size_t len); -ssize_t read_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out); +ssize_t read_udp_socket(int fd, char *buf, size_t len); +ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt, + unsigned int time_out); BOOL send_keepalive(int client); -ssize_t read_data(int fd,char *buffer,size_t N); -ssize_t write_data(int fd,char *buffer,size_t N); -ssize_t write_socket_data(int fd,char *buffer,size_t N); -ssize_t write_socket(int fd,char *buf,size_t len); -ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout); -BOOL receive_smb(int fd,char *buffer, unsigned int timeout); -BOOL client_receive_smb(int fd,char *buffer, unsigned int timeout); +ssize_t read_data(int fd, char *buffer, size_t N); +ssize_t write_data(int fd, char *buffer, size_t N); +ssize_t write_socket_data(int fd, char *buffer, size_t N); +ssize_t write_socket(int fd, char *buf, size_t len); +ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout); +BOOL receive_smb(int fd, char *buffer, unsigned int timeout); +BOOL client_receive_smb(int fd, char *buffer, unsigned int timeout); BOOL send_null_session_msg(int fd); -BOOL send_smb(int fd,char *buffer); -BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type); -int open_socket_in(int type, int port, int dlevel,uint32 socket_addr, BOOL rebind); -int open_socket_out(int type, struct in_addr *addr, int port ,int timeout); +BOOL send_smb(int fd, char *buffer); +BOOL send_one_packet(char *buf, int len, struct in_addr ip, int port, + int type); +int open_socket_in(int type, int port, int dlevel, uint32 socket_addr, + BOOL rebind); +int open_socket_out(int type, struct in_addr *addr, int port, int timeout); void reset_globals_after_fork(void); void client_setfd(int fd); char *client_name(void); @@ -450,8 +697,7 @@ char *client_addr(void); char *get_socket_name(int fd); char *get_socket_addr(int fd); int open_pipe_sock(char *path); -int create_pipe_socket(char *dir, int dir_perms, - char *path, int path_perms); +int create_pipe_socket(char *dir, int dir_perms, char *path, int path_perms); /*The following definitions come from lib/util_str.c */ @@ -564,255 +810,13 @@ BOOL in_list_w(smb_ucs2_t *s,smb_ucs2_t *list,BOOL casesensitive); BOOL string_init_w(smb_ucs2_t **dest,const smb_ucs2_t *src); void string_free_w(smb_ucs2_t **s); BOOL string_set_w(smb_ucs2_t **dest,const smb_ucs2_t *src); -void string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len); -void fstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert); -void pstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,smb_ucs2_t *insert); -void all_string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len); -void split_at_last_component_w(smb_ucs2_t *path, smb_ucs2_t *front, smb_ucs2_t sep, smb_ucs2_t *back); -smb_ucs2_t *octal_string_w(int i); -smb_ucs2_t *string_truncate_w(smb_ucs2_t *s, size_t length); - -/*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); -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/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); -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); -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_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(struct cli_state *cli,const char *Mask,uint16 attribute, - void (*fn)(file_info *, const char *)); -int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute, - void (*fn)(file_info *, const char *)); - -/*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, int pipe_name_len, - 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 *)); -BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype, - void (*fn)(const char *, uint32, const char *)); -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/clitrans.c */ - -BOOL cli_send_trans(struct cli_state *cli, int trans, - char *name, int pipe_name_len, - 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); - -/*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 */ - -BOOL name_status(int fd,char *name,int name_type,BOOL recurse, - struct in_addr to_ip,char *master,char *rname); -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 resolve_name(const char *name, struct in_addr *return_ip, int name_type); -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(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 */ - -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_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); - -/*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); +void string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len); +void fstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert); +void pstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,smb_ucs2_t *insert); +void all_string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len); +void split_at_last_component_w(smb_ucs2_t *path, smb_ucs2_t *front, smb_ucs2_t sep, smb_ucs2_t *back); +smb_ucs2_t *octal_string_w(int i); +smb_ucs2_t *string_truncate_w(smb_ucs2_t *s, size_t length); /*The following definitions come from locking/brlock.c */ @@ -900,9 +904,6 @@ 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); @@ -933,6 +934,9 @@ 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); @@ -1630,11 +1634,6 @@ 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 @@ -1665,6 +1664,11 @@ BOOL print_queue_pause(int snum); BOOL print_queue_resume(int snum); BOOL print_queue_purge(int snum); +/*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 */ BOOL profile_setup(BOOL rdonly); @@ -1832,6 +1836,109 @@ 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 */ + +void cmd_lsa_query_info(struct client_info *info); +void cmd_lsa_lookup_sids(struct client_info *info); + +/*The following definitions come from rpcclient/cmd_netlogon.c */ + +void cmd_netlogon_login_test(struct client_info *info); + +/*The following definitions come from rpcclient/cmd_reg.c */ + +void cmd_reg_enum(struct client_info *info); +void cmd_reg_query_key(struct client_info *info); +void cmd_reg_create_val(struct client_info *info); +void cmd_reg_delete_val(struct client_info *info); +void cmd_reg_delete_key(struct client_info *info); +void cmd_reg_create_key(struct client_info *info); +void cmd_reg_test_key_sec(struct client_info *info); +void cmd_reg_get_key_sec(struct client_info *info); + +/*The following definitions come from rpcclient/cmd_samr.c */ + +void cmd_sam_ntchange_pwd(struct client_info *info); +void cmd_sam_test(struct client_info *info); +void cmd_sam_enum_users(struct client_info *info); +void cmd_sam_query_user(struct client_info *info); +void cmd_sam_query_groups(struct client_info *info); +void cmd_sam_enum_aliases(struct client_info *info); + +/*The following definitions come from rpcclient/cmd_srvsvc.c */ + +void cmd_srv_query_info(struct client_info *info); +void cmd_srv_enum_conn(struct client_info *info); +void cmd_srv_enum_shares(struct client_info *info); +void cmd_srv_enum_sess(struct client_info *info); +void cmd_srv_enum_files(struct client_info *info); + +/*The following definitions come from rpcclient/cmd_wkssvc.c */ + +void cmd_wks_query_info(struct client_info *info); + +/*The following definitions come from rpcclient/display.c */ + +char *get_file_mode_str(uint32 share_mode); +char *get_file_oplock_str(uint32 op_type); +char *get_share_type_str(uint32 type); +char *get_server_type_str(uint32 type); +void display_srv_info_101(FILE *out_hnd, enum action_type action, + SRV_INFO_101 *sv101); +void display_srv_info_102(FILE *out_hnd, enum action_type action,SRV_INFO_102 *sv102); +void display_srv_info_ctr(FILE *out_hnd, enum action_type action,SRV_INFO_CTR *ctr); +void display_conn_info_0(FILE *out_hnd, enum action_type action, + CONN_INFO_0 *info0); +void display_conn_info_1(FILE *out_hnd, enum action_type action, + CONN_INFO_1 *info1, CONN_INFO_1_STR *str1); +void display_srv_conn_info_0_ctr(FILE *out_hnd, enum action_type action, + SRV_CONN_INFO_0 *ctr); +void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action, + SRV_CONN_INFO_1 *ctr); +void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action, + SRV_CONN_INFO_CTR *ctr); +void display_share_info_1(FILE *out_hnd, enum action_type action, + SRV_SHARE_INFO_1 *info1); +void display_share_info_2(FILE *out_hnd, enum action_type action, + SRV_SHARE_INFO_2 *info2); +void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action, + SRV_SHARE_INFO_CTR *ctr); +void display_file_info_3(FILE *out_hnd, enum action_type action, + FILE_INFO_3 *info3, FILE_INFO_3_STR *str3); +void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action, + SRV_FILE_INFO_3 *ctr); +void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action, + SRV_FILE_INFO_CTR *ctr); +void display_server(FILE *out_hnd, enum action_type action, + char *sname, uint32 type, char *comment); +void display_share(FILE *out_hnd, enum action_type action, + char *sname, uint32 type, char *comment); +void display_share2(FILE *out_hnd, enum action_type action, + char *sname, uint32 type, char *comment, + uint32 perms, uint32 max_uses, uint32 num_uses, + char *path, char *passwd); +void display_name(FILE *out_hnd, enum action_type action, + char *sname); +void display_group_rid_info(FILE *out_hnd, enum action_type action, + uint32 num_gids, DOM_GID *gid); +void display_alias_name_info(FILE *out_hnd, enum action_type action, + uint32 num_aliases, fstring *alias_name, uint32 *num_als_usrs); +void display_sam_user_info_21(FILE *out_hnd, enum action_type action, SAM_USER_INFO_21 *usr); +char *get_sec_mask_str(uint32 type); +void display_sec_access(FILE *out_hnd, enum action_type action, SEC_ACCESS *info); +void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *ace); +void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *sec_acl); +void display_sec_desc(FILE *out_hnd, enum action_type action, SEC_DESC *sec); +char *get_reg_val_type_str(uint32 type); +void display_reg_value_info(FILE *out_hnd, enum action_type action, + char *val_name, uint32 val_type, BUFFER2 *value); +void display_reg_key_info(FILE *out_hnd, enum action_type action, + char *key_name, time_t key_mod_time); + +/*The following definitions come from rpcclient/rpcclient.c */ + +void rpcclient_init(void); + /*The following definitions come from rpc_parse/parse_creds.c */ BOOL make_creds_unix(CREDS_UNIX *r_u, const char* user_name, @@ -2447,26 +2554,22 @@ BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u, /*The following definitions come from rpc_parse/parse_sec.c */ -void init_sec_access(SEC_ACCESS *t, uint32 mask); +BOOL make_sec_access(SEC_ACCESS * t, uint32 mask); BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth); -void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag); -BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth); -SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list); +BOOL make_sec_ace(SEC_ACE * t, const DOM_SID *sid, uint8 type, + SEC_ACCESS mask, uint8 flag); +BOOL make_sec_acl(SEC_ACL * t, uint16 revision, int num_aces, SEC_ACE * ace); SEC_ACL *dup_sec_acl( SEC_ACL *src); -void free_sec_acl(SEC_ACL **ppsa); -BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth); -SEC_DESC *make_sec_desc(uint16 revision, uint16 type, - DOM_SID *owner_sid, DOM_SID *grp_sid, - SEC_ACL *sacl, SEC_ACL *dacl, size_t *sec_desc_size); -SEC_DESC *dup_sec_desc( SEC_DESC *src); -void free_sec_desc(SEC_DESC **ppsd); -SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid, - SEC_ACL *dacl, size_t *sec_desc_size); -BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth); -SEC_DESC_BUF *make_sec_desc_buf(int len, SEC_DESC *sec_desc); -SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src); -void free_sec_desc_buf(SEC_DESC_BUF **ppsdb); -BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth); +void free_sec_acl(SEC_ACL * t); +int make_sec_desc(SEC_DESC * t, uint16 revision, uint16 type, + DOM_SID *owner_sid, DOM_SID *grp_sid, + SEC_ACL * sacl, SEC_ACL * dacl); +void free_sec_desc(SEC_DESC * t); +BOOL sec_io_desc(char *desc, SEC_DESC * t, prs_struct *ps, int depth); +BOOL make_sec_desc_buf(SEC_DESC_BUF * buf, int len, SEC_DESC * data); +void free_sec_desc_buf(SEC_DESC_BUF * buf); +BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF * sec, prs_struct *ps, + int depth); /*The following definitions come from rpc_parse/parse_spoolss.c */ @@ -2505,6 +2608,7 @@ BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, in BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth); BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth); BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth); +BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth); BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) ; BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) ; BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth); @@ -2525,6 +2629,7 @@ BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 * uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info); uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info); uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info); +uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info); uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info); uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info); uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info); @@ -2578,6 +2683,7 @@ BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct * BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth); BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth); BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth); +BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth); BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth); BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth); BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth); @@ -2618,6 +2724,7 @@ BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth); BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth); void free_devmode(DEVICEMODE *devmode); +void free_printer_info_3(PRINTER_INFO_3 *printer); void free_printer_info_2(PRINTER_INFO_2 *printer); void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries); void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries); @@ -2932,109 +3039,6 @@ uint32 lookup_user_rid(char *user_name, uint32 *rid); BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data); #endif -/*The following definitions come from rpcclient/cmd_lsarpc.c */ - -void cmd_lsa_query_info(struct client_info *info); -void cmd_lsa_lookup_sids(struct client_info *info); - -/*The following definitions come from rpcclient/cmd_netlogon.c */ - -void cmd_netlogon_login_test(struct client_info *info); - -/*The following definitions come from rpcclient/cmd_reg.c */ - -void cmd_reg_enum(struct client_info *info); -void cmd_reg_query_key(struct client_info *info); -void cmd_reg_create_val(struct client_info *info); -void cmd_reg_delete_val(struct client_info *info); -void cmd_reg_delete_key(struct client_info *info); -void cmd_reg_create_key(struct client_info *info); -void cmd_reg_test_key_sec(struct client_info *info); -void cmd_reg_get_key_sec(struct client_info *info); - -/*The following definitions come from rpcclient/cmd_samr.c */ - -void cmd_sam_ntchange_pwd(struct client_info *info); -void cmd_sam_test(struct client_info *info); -void cmd_sam_enum_users(struct client_info *info); -void cmd_sam_query_user(struct client_info *info); -void cmd_sam_query_groups(struct client_info *info); -void cmd_sam_enum_aliases(struct client_info *info); - -/*The following definitions come from rpcclient/cmd_srvsvc.c */ - -void cmd_srv_query_info(struct client_info *info); -void cmd_srv_enum_conn(struct client_info *info); -void cmd_srv_enum_shares(struct client_info *info); -void cmd_srv_enum_sess(struct client_info *info); -void cmd_srv_enum_files(struct client_info *info); - -/*The following definitions come from rpcclient/cmd_wkssvc.c */ - -void cmd_wks_query_info(struct client_info *info); - -/*The following definitions come from rpcclient/display.c */ - -char *get_file_mode_str(uint32 share_mode); -char *get_file_oplock_str(uint32 op_type); -char *get_share_type_str(uint32 type); -char *get_server_type_str(uint32 type); -void display_srv_info_101(FILE *out_hnd, enum action_type action, - SRV_INFO_101 *sv101); -void display_srv_info_102(FILE *out_hnd, enum action_type action,SRV_INFO_102 *sv102); -void display_srv_info_ctr(FILE *out_hnd, enum action_type action,SRV_INFO_CTR *ctr); -void display_conn_info_0(FILE *out_hnd, enum action_type action, - CONN_INFO_0 *info0); -void display_conn_info_1(FILE *out_hnd, enum action_type action, - CONN_INFO_1 *info1, CONN_INFO_1_STR *str1); -void display_srv_conn_info_0_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_0 *ctr); -void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_1 *ctr); -void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action, - SRV_CONN_INFO_CTR *ctr); -void display_share_info_1(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_1 *info1); -void display_share_info_2(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_2 *info2); -void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action, - SRV_SHARE_INFO_CTR *ctr); -void display_file_info_3(FILE *out_hnd, enum action_type action, - FILE_INFO_3 *info3, FILE_INFO_3_STR *str3); -void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action, - SRV_FILE_INFO_3 *ctr); -void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action, - SRV_FILE_INFO_CTR *ctr); -void display_server(FILE *out_hnd, enum action_type action, - char *sname, uint32 type, char *comment); -void display_share(FILE *out_hnd, enum action_type action, - char *sname, uint32 type, char *comment); -void display_share2(FILE *out_hnd, enum action_type action, - char *sname, uint32 type, char *comment, - uint32 perms, uint32 max_uses, uint32 num_uses, - char *path, char *passwd); -void display_name(FILE *out_hnd, enum action_type action, - char *sname); -void display_group_rid_info(FILE *out_hnd, enum action_type action, - uint32 num_gids, DOM_GID *gid); -void display_alias_name_info(FILE *out_hnd, enum action_type action, - uint32 num_aliases, fstring *alias_name, uint32 *num_als_usrs); -void display_sam_user_info_21(FILE *out_hnd, enum action_type action, SAM_USER_INFO_21 *usr); -char *get_sec_mask_str(uint32 type); -void display_sec_access(FILE *out_hnd, enum action_type action, SEC_ACCESS *info); -void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *ace); -void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *sec_acl); -void display_sec_desc(FILE *out_hnd, enum action_type action, SEC_DESC *sec); -char *get_reg_val_type_str(uint32 type); -void display_reg_value_info(FILE *out_hnd, enum action_type action, - char *val_name, uint32 val_type, BUFFER2 *value); -void display_reg_key_info(FILE *out_hnd, enum action_type action, - char *key_name, time_t key_mod_time); - -/*The following definitions come from rpcclient/rpcclient.c */ - -void rpcclient_init(void); - /*The following definitions come from smbd/blocking.c */ #if OLD_NTDOMAIN @@ -3353,73 +3357,114 @@ void smbd_process(void); /*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); -int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_unknown(char *inbuf,char *outbuf); -int reply_ioctl(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_size, int dum_buffsize); -int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length, int dum_buffsiz); -int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int dum_buffsize); -int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_exit(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size, - int dum_buffsize); -int reply_writeclose(connection_struct *conn, - char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_lock(connection_struct *conn, - char *inbuf,char *outbuf, int length, int dum_buffsize); -int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -int reply_tdis(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_echo(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_printopen(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_printclose(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_printqueue(connection_struct *conn, - char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -BOOL rmdir_internals(connection_struct *conn, char *directory); -int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int rename_internals(connection_struct *conn, - char *inbuf, char *outbuf, char *name, +int reply_special(char *inbuf, char *outbuf); +int reply_tcon(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, int dum_buffsize); +int reply_tcon_and_X(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_unknown(char *inbuf, char *outbuf); +int reply_ioctl(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, int dum_buffsize); +int reply_sesssetup_and_X(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_chkpth(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_getatr(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_setatr(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_dskattr(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_search(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_fclose(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_open(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_open_and_X(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_ulogoffX(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_mknew(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_ctemp(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_unlink(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_readbraw(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_lockread(connection_struct * conn, char *inbuf, char *outbuf, + int length, int dum_buffsiz); +int reply_read(connection_struct * conn, char *inbuf, char *outbuf, int size, + int dum_buffsize); +int reply_read_and_X(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_writebraw(connection_struct * conn, char *inbuf, char *outbuf, + int size, int dum_buffsize); +int reply_writeunlock(connection_struct * conn, char *inbuf, char *outbuf, + int size, int dum_buffsize); +int reply_write(connection_struct * conn, char *inbuf, char *outbuf, int size, + int dum_buffsize); +int reply_write_and_X(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_lseek(connection_struct * conn, char *inbuf, char *outbuf, int size, + int dum_buffsize); +int reply_flush(connection_struct * conn, char *inbuf, char *outbuf, int size, + int dum_buffsize); +int reply_exit(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, int dum_buffsize); +int reply_close(connection_struct * conn, char *inbuf, char *outbuf, int size, + int dum_buffsize); +int reply_writeclose(connection_struct * conn, + char *inbuf, char *outbuf, int size, int dum_buffsize); +int reply_lock(connection_struct * conn, + char *inbuf, char *outbuf, int length, int dum_buffsize); +int reply_unlock(connection_struct * conn, char *inbuf, char *outbuf, + int size, int dum_buffsize); +int reply_tdis(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, int dum_buffsize); +int reply_echo(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, int dum_buffsize); +int reply_printopen(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, int dum_buffsize); +int reply_printclose(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, + int dum_buffsize); +int reply_printqueue(connection_struct * conn, + char *inbuf, char *outbuf, int dum_size, + int dum_buffsize); +int reply_printwrite(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_mkdir(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +BOOL rmdir_internals(connection_struct * conn, char *directory); +int reply_rmdir(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int rename_internals(connection_struct * conn, + char *inbuf, char *outbuf, char *name, char *newname, BOOL replace_if_exists); -int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize); -SMB_BIG_UINT get_lock_count( char *data, int data_offset, BOOL large_file_format); -SMB_BIG_UINT get_lock_offset( char *data, int data_offset, BOOL large_file_format, BOOL *err); -int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize); -int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize); -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); +int reply_mv(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_copy(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +int reply_setdir(connection_struct * conn, char *inbuf, char *outbuf, + int dum_size, int dum_buffsize); +SMB_BIG_UINT get_lock_count(char *data, int data_offset, + BOOL large_file_format); +SMB_BIG_UINT get_lock_offset(char *data, int data_offset, + BOOL large_file_format, BOOL *err); +int reply_lockingX(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_readbmpx(connection_struct * conn, char *inbuf, char *outbuf, + int length, int bufsize); +int reply_writebmpx(connection_struct * conn, char *inbuf, char *outbuf, + int size, int dum_buffsize); +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/server.c */ @@ -3483,6 +3528,19 @@ void become_root(BOOL save_dir) ; void unbecome_root(BOOL restore_dir); #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); +BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf); +ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N); +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); + /*The following definitions come from smbd/vfs-wrap.c */ int vfswrap_dummy_connect(struct vfs_connection_struct *conn, char *service, @@ -3512,19 +3570,6 @@ int vfswrap_utime(char *path, struct utimbuf *times); int vfswrap_ftruncate(int fd, SMB_OFF_T offset); BOOL vfswrap_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type); -/*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); -BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf); -ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N); -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); - /*The following definitions come from smbwrapper/realcalls.c */ int real_utime(const char *name, struct utimbuf *buf); diff --git a/source3/include/rpc_secdes.h b/source3/include/rpc_secdes.h index 05fca99903..9d54622758 100644 --- a/source3/include/rpc_secdes.h +++ b/source3/include/rpc_secdes.h @@ -2,9 +2,8 @@ Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup - 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 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 @@ -114,6 +113,7 @@ typedef struct security_acl_info } SEC_ACL; + /* SEC_DESC */ typedef struct security_descriptor_info { diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h index 504bc11ff0..67005b9d1b 100755 --- a/source3/include/rpc_spoolss.h +++ b/source3/include/rpc_spoolss.h @@ -151,6 +151,8 @@ #define PRINTER_ACCESS_USE 0x00000008 #define JOB_ACCESS_ADMINISTER 0x00000010 +#define PRINTER_MANAGE_DOCUMENTS 0x10000000 /* i think dis right ... */ + #define STANDARD_RIGHTS_READ 0x00020000 #define STANDARD_RIGHTS_WRITE STANDARD_RIGHTS_READ #define STANDARD_RIGHTS_EXECUTE STANDARD_RIGHTS_READ @@ -779,7 +781,7 @@ typedef struct printer_info_2 UNISTR printprocessor; UNISTR datatype; UNISTR parameters; - /*SECURITY_DESCRIPTOR securitydescriptor; */ + SEC_DESC *secdesc; uint32 attributes; uint32 priority; uint32 defaultpriority; @@ -791,6 +793,13 @@ typedef struct printer_info_2 } PRINTER_INFO_2; +typedef struct printer_info_3 +{ + uint32 flags; + SEC_DESC sec; +} +PRINTER_INFO_3; + typedef struct spool_q_enumprinters { uint32 flags; @@ -807,6 +816,7 @@ typedef struct printer_info_ctr_info PRINTER_INFO_0 *printers_0; PRINTER_INFO_1 *printers_1; PRINTER_INFO_2 *printers_2; + PRINTER_INFO_3 *printers_3; } PRINTER_INFO_CTR; @@ -1237,12 +1247,19 @@ typedef struct spool_printer_info_level_2 } SPOOL_PRINTER_INFO_LEVEL_2; +typedef struct spool_printer_info_level_3 +{ + uint32 secdesc_ptr; +} +SPOOL_PRINTER_INFO_LEVEL_3; + typedef struct spool_printer_info_level { uint32 level; uint32 info_ptr; SPOOL_PRINTER_INFO_LEVEL_1 *info_1; SPOOL_PRINTER_INFO_LEVEL_2 *info_2; + SPOOL_PRINTER_INFO_LEVEL_3 *info_3; } SPOOL_PRINTER_INFO_LEVEL; @@ -1350,16 +1367,9 @@ typedef struct spool_q_setprinter POLICY_HND handle; uint32 level; SPOOL_PRINTER_INFO_LEVEL info; + SEC_DESC_BUF secdesc_ctr; DEVMODE_CTR devmode_ctr; - /* lkclXXXX jean-francois, see SEC_DESC_BUF code */ - struct - { - uint32 size_of_buffer; - uint32 data; - } - security; - uint32 command; } diff --git a/source3/include/smb.h b/source3/include/smb.h index e6fee32b80..993d7626ef 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1683,8 +1683,9 @@ struct ntdom_info int max_xmit_frag; }; -#include "nt_printing.h" #include "rpc_creds.h" +#include "rpc_secdes.h" +#include "nt_printing.h" #include "ntdomain.h" #include "client.h" diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index f0f151aea5..5742b8cbec 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -41,9 +41,8 @@ int nt_printing_init(void) if (tdb && local_pid == sys_getpid()) return True; tdb = tdb_open(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); - if (!tdb) { DEBUG(0,("Failed to open nt drivers database\n")); - } + local_pid = sys_getpid(); /* handle a Samba upgrade */ @@ -757,6 +756,7 @@ static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr) DEBUG(106,("free_nt_printer_info_level_2: deleting info\n")); free_nt_devicemode(&info->devmode); + free_sec_desc_buf(&info->secdesc); for(param_ptr = info->specific; param_ptr; ) { NT_PRINTER_PARAM *tofree = param_ptr; diff --git a/source3/rpc_parse/parse_sec.c b/source3/rpc_parse/parse_sec.c index 5d4b56d745..57fd04e05d 100644 --- a/source3/rpc_parse/parse_sec.c +++ b/source3/rpc_parse/parse_sec.c @@ -2,10 +2,10 @@ * Unix SMB/Netbios implementation. * Version 1.9. * RPC Pipe client / server routines - * Copyright (C) Andrew Tridgell 1992-1998, - * Copyright (C) Jeremy R. Allison 1995-1998 - * Copyright (C) Luke Kenneth Casson Leighton 1996-1998, - * Copyright (C) Paul Ashton 1997-1998. + * Copyright (C) Andrew Tridgell 1992-1999, + * Copyright (C) Jeremy R. Allison 1995-1999 + * Copyright (C) Luke Kenneth Casson Leighton 1996-1999, + * Copyright (C) Paul Ashton 1997-1999. * * 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 @@ -24,18 +24,20 @@ #include "includes.h" +#include "rpc_parse.h" extern int DEBUGLEVEL; -#define SD_HEADER_SIZE 0x14 /******************************************************************* Sets up a SEC_ACCESS structure. ********************************************************************/ -void init_sec_access(SEC_ACCESS *t, uint32 mask) +BOOL make_sec_access(SEC_ACCESS * t, uint32 mask) { + ZERO_STRUCTP(t); t->mask = mask; + return True; } /******************************************************************* @@ -50,11 +52,9 @@ BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth) prs_debug(ps, depth, desc, "sec_io_access"); depth++; - if(!prs_align(ps)) - return False; - - if(!prs_uint32("mask", ps, depth, &(t->mask))) - return False; + prs_align(ps); + + prs_uint32("mask", ps, depth, &(t->mask)); return True; } @@ -64,555 +64,540 @@ BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth) Sets up a SEC_ACE structure. ********************************************************************/ -void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag) +static size_t sec_ace_get_size(const SEC_ACE *ace) +{ + if (ace == NULL) + return 0; + return sid_size(&ace->sid) + 8; +} + +BOOL make_sec_ace(SEC_ACE * t, const DOM_SID *sid, uint8 type, + SEC_ACCESS mask, uint8 flag) { + ZERO_STRUCTP(t); + t->type = type; t->flags = flag; - t->size = sid_size(sid) + 8; t->info = mask; - - ZERO_STRUCTP(&t->sid); sid_copy(&t->sid, sid); + + t->size = sec_ace_get_size(t); + + return True; } /******************************************************************* Reads or writes a SEC_ACE structure. ********************************************************************/ -BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth) +static BOOL sec_io_ace(char *desc, SEC_ACE * t, prs_struct *ps, int depth) { uint32 old_offset; uint32 offset_ace_size; - - if (psa == NULL) + if (t == NULL) return False; prs_debug(ps, depth, desc, "sec_io_ace"); depth++; - if(!prs_align(ps)) - return False; - - old_offset = prs_offset(ps); - - if(!prs_uint8("type ", ps, depth, &psa->type)) - return False; - - if(!prs_uint8("flags", ps, depth, &psa->flags)) - return False; - - if(!prs_uint16_pre("size ", ps, depth, &psa->size, &offset_ace_size)) - return False; + prs_align(ps); - if(!sec_io_access("info ", &psa->info, ps, depth)) - return False; + old_offset = prs_offset(ps); - if(!prs_align(ps)) - return False; + prs_uint8("type ", ps, depth, &(t->type)); + prs_uint8("flags", ps, depth, &(t->flags)); + prs_uint16_pre("size ", ps, depth, &(t->size), &offset_ace_size); - if(!smb_io_dom_sid("sid ", &psa->sid , ps, depth)) - return False; + sec_io_access("info ", &t->info, ps, depth); + prs_align(ps); + smb_io_dom_sid("sid ", &t->sid, ps, depth); + prs_align(ps); - if(!prs_uint16_post("size ", ps, depth, &psa->size, offset_ace_size, old_offset)) - return False; + prs_uint16_post("size ", ps, depth, &t->size, offset_ace_size, + old_offset); return True; } /******************************************************************* - Create a SEC_ACL structure. + Create a SEC_ACL structure. ********************************************************************/ - -SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list) +BOOL make_sec_acl(SEC_ACL * t, uint16 revision, int num_aces, SEC_ACE * ace) { - SEC_ACL *dst; int i; - if((dst = (SEC_ACL *)malloc(sizeof(SEC_ACL))) == NULL) - return NULL; + ZERO_STRUCTP(t); - ZERO_STRUCTP(dst); + t->revision = revision; + t->num_aces = num_aces; + t->size = 8; + t->ace = ace; - dst->revision = revision; - dst->num_aces = num_aces; - dst->size = 8; - - if((dst->ace = (SEC_ACE *)malloc( sizeof(SEC_ACE) * num_aces )) == NULL) { - free_sec_acl(&dst); - return NULL; + for (i = 0; i < num_aces; i++) + { + t->size += sec_ace_get_size(&ace[i]); } - for (i = 0; i < num_aces; i++) { - dst->ace[i] = ace_list[i]; /* Structure copy. */ - dst->size += ace_list[i].size; - } - - return dst; + return True; } /******************************************************************* - Duplicate a SEC_ACL structure. + Duplicate a SEC_ACL structure. ********************************************************************/ - SEC_ACL *dup_sec_acl( SEC_ACL *src) { if(src == NULL) return NULL; - return make_sec_acl( src->revision, src->num_aces, src->ace); + return NULL; } /******************************************************************* - Delete a SEC_ACL structure. +frees a structure. ********************************************************************/ - -void free_sec_acl(SEC_ACL **ppsa) +void free_sec_acl(SEC_ACL * t) { - SEC_ACL *psa; - - if(ppsa == NULL || *ppsa == NULL) + if (t == NULL) return; - - psa = *ppsa; - if (psa->ace != NULL) - free(psa->ace); - - free(psa); - *ppsa = NULL; + if (t->ace != NULL) + { + free(t->ace); + t->ace = NULL; + } + t->num_aces = 0; } /******************************************************************* - Reads or writes a SEC_ACL structure. + Reads or writes a structure. First of the xx_io_xx functions that allocates its data structures for you as it reads them. ********************************************************************/ -BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth) +static BOOL sec_io_acl(char *desc, SEC_ACL * t, prs_struct *ps, int depth) { - int i; + uint32 i; uint32 old_offset; uint32 offset_acl_size; - SEC_ACL *psa; - if (ppsa == NULL) + if (t == NULL) return False; - psa = *ppsa; - - if(UNMARSHALLING(ps) && psa == NULL) { - /* - * This is a read and we must allocate the stuct to read into. - */ - if((psa = (SEC_ACL *)malloc(sizeof(SEC_ACL))) == NULL) - return False; - ZERO_STRUCTP(psa); - *ppsa = psa; - } - prs_debug(ps, depth, desc, "sec_io_acl"); depth++; - if(!prs_align(ps)) - return False; - + prs_align(ps); + old_offset = prs_offset(ps); - if(!prs_uint16("revision", ps, depth, &psa->revision)) - return False; + prs_uint16("revision", ps, depth, &(t->revision)); + prs_uint16_pre("size ", ps, depth, &(t->size), &offset_acl_size); + prs_uint32("num_aces ", ps, depth, &(t->num_aces)); - if(!prs_uint16_pre("size ", ps, depth, &psa->size, &offset_acl_size)) - return False; + if (ps->io && t->num_aces != 0) + { + /* reading */ + t->ace = (SEC_ACE *) malloc(sizeof(t->ace[0]) * t->num_aces); + ZERO_STRUCTP(t->ace); + } - if(!prs_uint32("num_aces ", ps, depth, &psa->num_aces)) + if (t->ace == NULL && t->num_aces != 0) + { + DEBUG(0, ("INVALID ACL\n")); + prs_set_offset(ps, 0xfffffffe); return False; - - if (UNMARSHALLING(ps) && psa->num_aces != 0) { - /* reading */ - if((psa->ace = malloc(sizeof(psa->ace[0]) * psa->num_aces)) == NULL) - return False; - ZERO_STRUCTP(psa->ace); } - for (i = 0; i < psa->num_aces; i++) { + for (i = 0; i < MIN(t->num_aces, MAX_SEC_ACES); i++) + { fstring tmp; - slprintf(tmp, sizeof(tmp)-1, "ace_list[%02d]: ", i); - if(!sec_io_ace(tmp, &psa->ace[i], ps, depth)) + slprintf(tmp, sizeof(tmp) - 1, "ace[%02d]: ", i); + if(!sec_io_ace(tmp, &t->ace[i], ps, depth)) return False; } - if(!prs_align(ps)) - return False; + prs_align(ps); - if(!prs_uint16_post("size ", ps, depth, &psa->size, offset_acl_size, old_offset)) - return False; + prs_uint16_post("size ", ps, depth, &t->size, offset_acl_size, + old_offset); return True; } + /******************************************************************* Creates a SEC_DESC structure ********************************************************************/ - -SEC_DESC *make_sec_desc(uint16 revision, uint16 type, - DOM_SID *owner_sid, DOM_SID *grp_sid, - SEC_ACL *sacl, SEC_ACL *dacl, size_t *sec_desc_size) +int make_sec_desc(SEC_DESC * t, uint16 revision, uint16 type, + DOM_SID *owner_sid, DOM_SID *grp_sid, + SEC_ACL * sacl, SEC_ACL * dacl) { - SEC_DESC *dst; uint32 offset; - *sec_desc_size = 0; - - if(( dst = (SEC_DESC *)malloc(sizeof(SEC_DESC))) == NULL) - return NULL; + ZERO_STRUCTP(t); - ZERO_STRUCTP(dst); - - dst->revision = revision; - dst->type = type; - - dst->off_owner_sid = 0; - dst->off_grp_sid = 0; - dst->off_sacl = 0; - dst->off_dacl = 0; - - if(owner_sid && ((dst->owner_sid = sid_dup(owner_sid)) == NULL)) - goto error_exit; + t->revision = revision; + t->type = type; - if(grp_sid && ((dst->grp_sid = sid_dup(grp_sid)) == NULL)) - goto error_exit; + t->off_owner_sid = 0; + t->off_grp_sid = 0; + t->off_sacl = 0; + t->off_dacl = 0; - if(sacl && ((dst->sacl = dup_sec_acl(sacl)) == NULL)) - goto error_exit; + t->dacl = dacl; + t->sacl = sacl; + t->owner_sid = owner_sid; + t->grp_sid = grp_sid; - if(dacl && ((dst->dacl = dup_sec_acl(dacl)) == NULL)) - goto error_exit; - offset = 0x0; - /* - * Work out the linearization sizes. - */ - - if (dst->owner_sid != NULL) { - + if (dacl != NULL) + { if (offset == 0) - offset = SD_HEADER_SIZE; - - dst->off_owner_sid = offset; - offset += ((sid_size(dst->owner_sid) + 3) & ~3); + { + offset = 0x14; + } + t->off_dacl = offset; + offset += dacl->size; + offset = ((offset + 3) & ~3); } - if (dst->grp_sid != NULL) { - + if (sacl != NULL) + { if (offset == 0) - offset = SD_HEADER_SIZE; - - dst->off_grp_sid = offset; - offset += ((sid_size(dst->grp_sid) + 3) & ~3); + { + offset = 0x14; + } + t->off_sacl = offset; + offset += sacl->size; + offset = ((offset + 3) & ~3); } - if (dst->sacl != NULL) { - + if (owner_sid != NULL) + { if (offset == 0) - offset = SD_HEADER_SIZE; - - dst->off_sacl = offset; - offset += ((sacl->size + 3) & ~3); + { + offset = 0x14; + } + t->off_owner_sid = offset; + offset += sid_size(owner_sid); + offset = ((offset + 3) & ~3); } - if (dst->dacl != NULL) { - + if (grp_sid != NULL) + { if (offset == 0) - offset = SD_HEADER_SIZE; - - dst->off_dacl = offset; - offset += ((dacl->size + 3) & ~3); + { + offset = 0x14; + } + t->off_grp_sid = offset; + offset += sid_size(grp_sid); } - *sec_desc_size = (size_t)((offset == 0) ? SD_HEADER_SIZE : offset); - return dst; - -error_exit: - - *sec_desc_size = 0; - free_sec_desc(&dst); - return NULL; + return (offset == 0) ? 0x14 : offset; } -/******************************************************************* - Duplicate a SEC_DESC structure. -********************************************************************/ - -SEC_DESC *dup_sec_desc( SEC_DESC *src) -{ - size_t dummy; - - if(src == NULL) - return NULL; - - return make_sec_desc( src->revision, src->type, - src->owner_sid, src->grp_sid, src->sacl, - src->dacl, &dummy); -} /******************************************************************* - Deletes a SEC_DESC structure +frees a structure ********************************************************************/ - -void free_sec_desc(SEC_DESC **ppsd) +void free_sec_desc(SEC_DESC * t) { - SEC_DESC *psd; - - if(ppsd == NULL || *ppsd == NULL) - return; + if (t->dacl != NULL) + { + free_sec_acl(t->dacl); + } - psd = *ppsd; + if (t->sacl != NULL) + { + free_sec_acl(t->dacl); - free_sec_acl(&psd->dacl); - free_sec_acl(&psd->dacl); - free(psd->owner_sid); - free(psd->grp_sid); - free(psd); - *ppsd = NULL; -} + } -/******************************************************************* - Creates a SEC_DESC structure with typical defaults. -********************************************************************/ + if (t->owner_sid != NULL) + { + free(t->owner_sid); + t->owner_sid = NULL; + } -SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid, - SEC_ACL *dacl, size_t *sec_desc_size) -{ - return make_sec_desc(1, SEC_DESC_SELF_RELATIVE|SEC_DESC_DACL_PRESENT, - owner_sid, grp_sid, NULL, dacl, sec_desc_size); + if (t->grp_sid != NULL) + { + free(t->grp_sid); + t->grp_sid = NULL; + } } /******************************************************************* - Reads or writes a SEC_DESC structure. - If reading and the *ppsd = NULL, allocates the structure. +reads or writes a structure. ********************************************************************/ - -BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth) +BOOL sec_io_desc(char *desc, SEC_DESC * t, prs_struct *ps, int depth) { +#if 0 + uint32 off_owner_sid; + uint32 off_grp_sid; + uint32 off_sacl; + uint32 off_dacl; +#endif uint32 old_offset; - uint32 max_offset = 0; /* after we're done, move offset to end */ - SEC_DESC *psd; + uint32 max_offset = 0; /* after we're done, move offset to end */ - if (ppsd == NULL) + if (t == NULL) return False; - psd = *ppsd; - - if(UNMARSHALLING(ps) && psd == NULL) { - if((psd = (SEC_DESC *)malloc(sizeof(SEC_DESC))) == NULL) - return False; - ZERO_STRUCTP(psd); - *ppsd = psd; - } - prs_debug(ps, depth, desc, "sec_io_desc"); depth++; - if(!prs_align(ps)) - return False; - + prs_align(ps); + /* start of security descriptor stored for back-calc offset purposes */ old_offset = prs_offset(ps); - - if(!prs_uint16("revision ", ps, depth, &psd->revision)) - return False; - - if(!prs_uint16("type ", ps, depth, &psd->type)) - return False; - - if(!prs_uint32("off_owner_sid", ps, depth, &psd->off_owner_sid)) - return False; - - if(!prs_uint32("off_grp_sid ", ps, depth, &psd->off_grp_sid)) - return False; - - if(!prs_uint32("off_sacl ", ps, depth, &psd->off_sacl)) - return False; - - if(!prs_uint32("off_dacl ", ps, depth, &psd->off_dacl)) - return False; - + max_offset = old_offset; + + prs_uint16("revision ", ps, depth, &(t->revision)); + prs_uint16("type ", ps, depth, &(t->type)); + + prs_uint32("off_owner_sid", ps, depth, &(t->off_owner_sid)); + prs_uint32("off_grp_sid ", ps, depth, &(t->off_grp_sid)); + prs_uint32("off_sacl ", ps, depth, &(t->off_sacl)); + prs_uint32("off_dacl ", ps, depth, &(t->off_dacl)); +#if 0 + prs_uint32_pre("off_owner_sid", ps, depth, &(t->off_owner_sid), + &off_owner_sid); + prs_uint32_pre("off_grp_sid ", ps, depth, &(t->off_grp_sid), + &off_grp_sid); + prs_uint32_pre("off_sacl ", ps, depth, &(t->off_sacl), &off_sacl); + prs_uint32_pre("off_dacl ", ps, depth, &(t->off_dacl), &off_dacl); +#endif max_offset = MAX(max_offset, prs_offset(ps)); - if (psd->off_owner_sid != 0) { - - if (UNMARSHALLING(ps)) { - if(!prs_set_offset(ps, old_offset + psd->off_owner_sid)) - return False; + if (IS_BITS_SET_ALL(t->type, SEC_DESC_DACL_PRESENT)) + { +#if 0 + prs_uint32_post("off_dacl ", ps, depth, &(t->off_dacl), + off_dacl, prs_offset(ps) - old_offset); +#endif + if(!prs_set_offset(ps, old_offset + t->off_dacl)) + return False; + if (ps->io) + { /* reading */ - if((psd->owner_sid = malloc(sizeof(*psd->owner_sid))) == NULL) - return False; - ZERO_STRUCTP(psd->owner_sid); + t->dacl = (SEC_ACL *) malloc(sizeof(*t->dacl)); + ZERO_STRUCTP(t->dacl); } - if(!smb_io_dom_sid("owner_sid ", psd->owner_sid , ps, depth)) + if (t->dacl == NULL) + { + DEBUG(0, ("INVALID DACL\n")); + prs_set_offset(ps, 0xfffffffe); return False; - if(!prs_align(ps)) + } + + if(!sec_io_acl("dacl", t->dacl, ps, depth)) return False; + prs_align(ps); } +#if 0 + else + { + prs_uint32_post("off_dacl ", ps, depth, &(t->off_dacl), + off_dacl, 0); + } +#endif max_offset = MAX(max_offset, prs_offset(ps)); - if (psd->off_grp_sid != 0) { - - if (UNMARSHALLING(ps)) { + if (IS_BITS_SET_ALL(t->type, SEC_DESC_SACL_PRESENT)) + { +#if 0 + prs_uint32_post("off_sacl ", ps, depth, &(t->off_sacl), + off_sacl, prs_offset(ps) - old_offset); +#endif + if(!prs_set_offset(ps, old_offset + t->off_sacl)) + return False; + if (ps->io) + { /* reading */ - if(!prs_set_offset(ps, old_offset + psd->off_grp_sid)) - return False; - if((psd->grp_sid = malloc(sizeof(*psd->grp_sid))) == NULL) - return False; - ZERO_STRUCTP(psd->grp_sid); + t->sacl = (SEC_ACL *) malloc(sizeof(*t->sacl)); + ZERO_STRUCTP(t->sacl); } - if(!smb_io_dom_sid("grp_sid", psd->grp_sid, ps, depth)) + if (t->sacl == NULL) + { + DEBUG(0, ("INVALID SACL\n")); + prs_set_offset(ps, 0xfffffffe); return False; - if(!prs_align(ps)) + } + + if(!sec_io_acl("sacl", t->sacl, ps, depth)) return False; + prs_align(ps); + } +#if 0 + else + { + prs_uint32_post("off_sacl ", ps, depth, &(t->off_sacl), + off_sacl, 0); } +#endif max_offset = MAX(max_offset, prs_offset(ps)); - if (IS_BITS_SET_ALL(psd->type, SEC_DESC_SACL_PRESENT) && psd->off_sacl) { - if(!prs_set_offset(ps, old_offset + psd->off_sacl)) - return False; - if(!sec_io_acl("sacl", &psd->sacl, ps, depth)) - return False; - if(!prs_align(ps)) +#if 0 + prs_uint32_post("off_owner_sid", ps, depth, &(t->off_owner_sid), + off_owner_sid, prs_offset(ps) - old_offset); +#endif + if (t->off_owner_sid != 0) + { + if (ps->io) + { + if(!prs_set_offset(ps, old_offset + t->off_owner_sid)) + return False; + } + if (ps->io) + { + /* reading */ + t->owner_sid = + (DOM_SID *)malloc(sizeof(*t->owner_sid)); + ZERO_STRUCTP(t->owner_sid); + } + + if (t->owner_sid == NULL) + { + DEBUG(0, ("INVALID OWNER SID\n")); + prs_set_offset(ps, 0xfffffffe); return False; + } + + smb_io_dom_sid("owner_sid ", t->owner_sid, ps, depth); + prs_align(ps); } max_offset = MAX(max_offset, prs_offset(ps)); - if (IS_BITS_SET_ALL(psd->type, SEC_DESC_DACL_PRESENT) && psd->off_dacl != 0) { - if(!prs_set_offset(ps, old_offset + psd->off_dacl)) - return False; - if(!sec_io_acl("dacl", &psd->dacl, ps, depth)) - return False; - if(!prs_align(ps)) +#if 0 + prs_uint32_post("off_grp_sid ", ps, depth, &(t->off_grp_sid), + off_grp_sid, prs_offset(ps) - old_offset); +#endif + if (t->off_grp_sid != 0) + { + if (ps->io) + { + if(!prs_set_offset(ps, old_offset + t->off_grp_sid)) + return False; + } + if (ps->io) + { + /* reading */ + t->grp_sid = (DOM_SID *)malloc(sizeof(*t->grp_sid)); + ZERO_STRUCTP(t->grp_sid); + } + + if (t->grp_sid == NULL) + { + DEBUG(0, ("INVALID GROUP SID\n")); + prs_set_offset(ps, 0xfffffffe); return False; + } + + smb_io_dom_sid("grp_sid", t->grp_sid, ps, depth); + prs_align(ps); } max_offset = MAX(max_offset, prs_offset(ps)); if(!prs_set_offset(ps, max_offset)) return False; + return True; } /******************************************************************* - Creates a SEC_DESC_BUF structure. +creates a SEC_DESC_BUF structure. ********************************************************************/ - -SEC_DESC_BUF *make_sec_desc_buf(int len, SEC_DESC *sec_desc) +BOOL make_sec_desc_buf(SEC_DESC_BUF * buf, int len, SEC_DESC * data) { - SEC_DESC_BUF *dst; - - if((dst = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF))) == NULL) - return NULL; - - ZERO_STRUCTP(dst); + ZERO_STRUCTP(buf); /* max buffer size (allocated size) */ - dst->max_len = len; - dst->len = len; - - if(sec_desc && ((dst->sec = dup_sec_desc(sec_desc)) == NULL)) { - free_sec_desc_buf(&dst); - return NULL; - } - - return dst; -} - -/******************************************************************* - Duplicates a SEC_DESC_BUF structure. -********************************************************************/ - -SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src) -{ - if(src == NULL) - return NULL; + buf->max_len = len; + buf->undoc = 0; + buf->len = data != NULL ? len : 0; + buf->sec = data; - return make_sec_desc_buf( src->len, src->sec); + return True; } /******************************************************************* - Deletes a SEC_DESC_BUF structure. +frees a SEC_DESC_BUF structure. ********************************************************************/ - -void free_sec_desc_buf(SEC_DESC_BUF **ppsdb) +void free_sec_desc_buf(SEC_DESC_BUF * buf) { - SEC_DESC_BUF *psdb; - - if(ppsdb == NULL || *ppsdb == NULL) + if (buf == NULL) return; - - psdb = *ppsdb; - free_sec_desc(&psdb->sec); - free(psdb); - *ppsdb = NULL; + if (buf->sec != NULL) + { + free_sec_desc(buf->sec); + free(buf->sec); + buf->sec = NULL; + } } /******************************************************************* - Reads or writes a SEC_DESC_BUF structure. +reads or writes a SEC_DESC_BUF structure. ********************************************************************/ - -BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth) +BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF * sec, prs_struct *ps, + int depth) { uint32 off_len; uint32 off_max_len; uint32 old_offset; uint32 size; - SEC_DESC_BUF *psdb; - if (ppsdb == NULL) + if (sec == NULL) return False; - psdb = *ppsdb; - - if (UNMARSHALLING(ps) && psdb == NULL) { - if((psdb = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF))) == NULL) - return False; - ZERO_STRUCTP(psdb); - *ppsdb = psdb; - } - prs_debug(ps, depth, desc, "sec_io_desc_buf"); depth++; - if(!prs_align(ps)) - return False; - - if(!prs_uint32_pre("max_len", ps, depth, &psdb->max_len, &off_max_len)) - return False; - - if(!prs_uint32 ("undoc ", ps, depth, &psdb->undoc)) - return False; + prs_align(ps); - if(!prs_uint32_pre("len ", ps, depth, &psdb->len, &off_len)) - return False; + prs_uint32_pre("max_len", ps, depth, &(sec->max_len), &off_max_len); + prs_uint32("undoc ", ps, depth, &(sec->undoc)); + prs_uint32_pre("len ", ps, depth, &(sec->len), &off_len); old_offset = prs_offset(ps); - /* reading, length is non-zero; writing, descriptor is non-NULL */ - if ((psdb->len != 0 || MARSHALLING(ps)) && psdb->sec != NULL) { - if(!sec_io_desc("sec ", &psdb->sec, ps, depth)) + if (sec->len != 0 && ps->io) + { + /* reading */ + sec->sec = (SEC_DESC *) malloc(sizeof(*sec->sec)); + ZERO_STRUCTP(sec->sec); + + if (sec->sec == NULL) + { + DEBUG(0, ("INVALID SEC_DESC\n")); + prs_set_offset(ps, 0xfffffffe); return False; + } } - size = prs_offset(ps) - old_offset; - if(!prs_uint32_post("max_len", ps, depth, &psdb->max_len, off_max_len, size == 0 ? psdb->max_len : size)) - return False; + /* reading, length is non-zero; writing, descriptor is non-NULL */ + if ((sec->len != 0 || (!ps->io)) && sec->sec != NULL) + { + sec_io_desc("sec ", sec->sec, ps, depth); + } + + prs_align(ps); + + size = prs_offset(ps) - old_offset - 8; + prs_uint32_post("max_len", ps, depth, &(sec->max_len), off_max_len, + size == 0 ? sec->max_len : size + 8); + prs_uint32_post("len ", ps, depth, &(sec->len), off_len, + size == 0 ? 0 : size + 8); - if(!prs_uint32_post("len ", ps, depth, &psdb->len, off_len, size)) + if(!prs_set_offset(ps, old_offset + size + 8)) return False; return True; diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index 4a9c0d2645..c33cf58762 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -1295,6 +1295,14 @@ static uint32 size_of_relative_string(UNISTR *string) return size; } +/******************************************************************* + * return the length of a uint32 + sec desc + ********************************************************************/ +static uint32 size_of_sec_desc(SEC_DESC *sec) +{ + return 4+1024; +} + /******************************************************************* * return the length of a uint32 (obvious, but the code is clean) ********************************************************************/ @@ -1483,6 +1491,63 @@ static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, ui } +/******************************************************************* + Parse a DEVMODE structure and its relative pointer. +********************************************************************/ +static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, + SEC_DESC **secdesc) +{ + prs_struct *ps=&(buffer->prs); + + prs_debug(ps, depth, desc, "new_smb_io_relsecdesc"); + depth++; + + if (MARSHALLING(ps)) + { + uint32 struct_offset = prs_offset(ps); + uint32 relative_offset; + + if (*secdesc != NULL) + { + buffer->string_at_end -= 256; /* HACK! */ + + prs_set_offset(ps, buffer->string_at_end); + + /* write the secdesc */ + if (!sec_io_desc(desc, *secdesc, ps, depth)) + return False; + + prs_set_offset(ps, struct_offset); + } + + relative_offset=buffer->string_at_end - buffer->struct_start; + /* write its offset */ + if (!prs_uint32("offset", ps, depth, &relative_offset)) + return False; + } + else + { + uint32 old_offset; + + /* read the offset */ + if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end))) + return False; + + old_offset = prs_offset(ps); + prs_set_offset(ps, buffer->string_at_end + buffer->struct_start); + + /* read the sd */ + *secdesc = g_new(SEC_DESC, 1); + if (*secdesc == NULL) + return False; + if (!sec_io_desc(desc, *secdesc, ps, depth)) + return False; + + prs_set_offset(ps, old_offset); + } + return True; +} + /******************************************************************* Parse a DEVMODE structure and its relative pointer. ********************************************************************/ @@ -1663,9 +1728,6 @@ BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *i ********************************************************************/ BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth) { - /* hack for the SEC DESC */ - uint32 pipo=0; - prs_struct *ps=&(buffer->prs); prs_debug(ps, depth, desc, "new_smb_io_printer_info_2"); @@ -1701,8 +1763,9 @@ BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *i if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters)) return False; - if (!prs_uint32("security descriptor", ps, depth, &pipo)) + if (!new_smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc)) return False; + if (!prs_uint32("attributes", ps, depth, &info->attributes)) return False; if (!prs_uint32("priority", ps, depth, &info->priority)) @@ -1723,6 +1786,26 @@ BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *i return True; } +/******************************************************************* + Parse a PRINTER_INFO_3 structure. +********************************************************************/ +BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth) +{ + prs_struct *ps=&(buffer->prs); + + prs_debug(ps, depth, desc, "new_smb_io_printer_info_3"); + depth++; + + buffer->struct_start=prs_offset(ps); + + if (!prs_uint32("flags", ps, depth, &info->flags)) + return False; + if (!sec_io_desc("sec_desc", &info->sec, ps, depth)) + return False; + + return True; +} + /******************************************************************* Parse a DRIVER_INFO_1 structure. ********************************************************************/ @@ -2281,7 +2364,7 @@ uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info) { int size=0; - size+=4; /* the security descriptor */ + size += size_of_sec_desc( info->secdesc ); size+=size_of_device_mode( info->devmode ); @@ -2309,6 +2392,18 @@ uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info) return size; } +/******************************************************************* +return the size required by a struct in the stream +********************************************************************/ +uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info) +{ + /* well, we don't actually *know* the damn size of the + * security descriptor. spoolss is a stupidly designed + * api. + */ + return size_of_sec_desc( &info->sec ); +} + /******************************************************************* return the size required by a struct in the stream ********************************************************************/ @@ -2829,9 +2924,7 @@ BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth)) return False; - if(!prs_uint32("security.size_of_buffer", ps, depth, &q_u->security.size_of_buffer)) - return False; - if(!prs_uint32("security.data", ps, depth, &q_u->security.data)) + if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth)) return False; if(!prs_uint32("command", ps, depth, &q_u->command)) @@ -3289,6 +3382,23 @@ BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, p return True; } +/******************************************************************* + Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure. +********************************************************************/ +BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth) +{ + prs_debug(ps, depth, desc, "spool_io_printer_info_level_3"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr)) + return False; + + return True; +} + /******************************************************************* Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure. ********************************************************************/ @@ -3406,23 +3516,36 @@ BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_s * and by setprinter when updating printer's info */ case 1: + { if (UNMARSHALLING(ps)) { - il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1)); + il->info_1=g_new(SPOOL_PRINTER_INFO_LEVEL_1, 1); if(il->info_1 == NULL) return False; } if (!spool_io_printer_info_level_1("", il->info_1, ps, depth)) return False; break; + } case 2: if (UNMARSHALLING(ps)) { - il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2)); + il->info_2=g_new(SPOOL_PRINTER_INFO_LEVEL_2, 1); if(il->info_2 == NULL) return False; } if (!spool_io_printer_info_level_2("", il->info_2, ps, depth)) return False; break; + case 3: + { + if (UNMARSHALLING(ps)) { + il->info_3=g_new(SPOOL_PRINTER_INFO_LEVEL_3, 1); + if(il->info_3 == NULL) + return False; + } + if (!spool_io_printer_info_level_3("", il->info_3, ps, depth)) + return False; + break; + } } return True; @@ -4607,11 +4730,27 @@ void free_devmode(DEVICEMODE *devmode) } } +void free_printer_info_3(PRINTER_INFO_3 *printer) +{ + if (printer!=NULL) + { + free_sec_desc(&printer->sec); + free(printer); + } +} + void free_printer_info_2(PRINTER_INFO_2 *printer) { if (printer!=NULL) { free_devmode(printer->devmode); + printer->devmode = NULL; + if (printer->secdesc != NULL) + { + free_sec_desc(printer->secdesc); + free(printer->secdesc); + printer->secdesc = NULL; + } free(printer); } } diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 7c56a5f640..90a3a3e632 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -587,8 +587,8 @@ static BOOL convert_printer_driver_info(const SPOOL_PRINTER_DRIVER_INFO_LEVEL *u static BOOL convert_devicemode(DEVICEMODE devmode, NT_DEVICEMODE *nt_devmode) { - unistr_to_dos(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31); - unistr_to_dos(nt_devmode->formname, (char *)devmode.formname.buffer, 31); + unistr_to_ascii(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31); + unistr_to_ascii(nt_devmode->formname, (char *)devmode.formname.buffer, 31); nt_devmode->specversion=devmode.specversion; nt_devmode->driverversion=devmode.driverversion; @@ -1892,6 +1892,17 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer printer->devmode=devmode; + if (ntprinter.info_2->secdesc.len != 0) + { + /* steal the printer info sec_desc structure. [badly done]. */ + printer->secdesc = ntprinter.info_2->secdesc.sec; + ZERO_STRUCT(ntprinter.info_2->secdesc); + } + else + { + printer->secdesc = NULL; + } + safe_free(queue); free_a_printer(ntprinter, 2); return True; @@ -1903,6 +1914,31 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer return False; } +/******************************************************************** + * construct_printer_info_3 + * fill a printer_info_3 struct + ********************************************************************/ +static BOOL construct_printer_info_3(fstring servername, + PRINTER_INFO_3 *printer, int snum) +{ + NT_PRINTER_INFO_LEVEL ntprinter; + + if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0 ) + return False; + + printer->flags = 4; /* no idea, yet. see MSDN. */ + if (ntprinter.info_2->secdesc.len != 0) + { + /* steal the printer info sec_desc structure. [badly done]. */ + printer->sec = *ntprinter.info_2->secdesc.sec; + safe_free(ntprinter.info_2->secdesc.sec); + ZERO_STRUCT(ntprinter.info_2->secdesc); + } + + free_a_printer(ntprinter, 2); + return True; +} + /******************************************************************** Spoolss_enumprinters. ********************************************************************/ @@ -2337,6 +2373,41 @@ static uint32 getprinter_level_2(fstring servername, int snum, NEW_BUFFER *buffe return NT_STATUS_NO_PROBLEMO; } +/**************************************************************************** +****************************************************************************/ +static uint32 getprinter_level_3(fstring servername, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +{ + PRINTER_INFO_3 *printer=NULL; + fstring temp; + + if((printer=(PRINTER_INFO_3*)malloc(sizeof(PRINTER_INFO_3)))==NULL) + return ERROR_NOT_ENOUGH_MEMORY; + + fstrcpy(temp, "\\\\"); + fstrcat(temp, servername); + construct_printer_info_3(temp, printer, snum); + + /* check the required size. */ + *needed += spoolss_size_printer_info_3(printer); + + if (!alloc_buffer_size(buffer, *needed)) { + safe_free(printer); + return ERROR_INSUFFICIENT_BUFFER; + } + + /* fill the buffer with the structures */ + new_smb_io_printer_info_3("", buffer, printer, 0); + + /* clear memory */ + free_sec_desc(&printer->sec); + + if (*needed > offered) { + return ERROR_INSUFFICIENT_BUFFER; + } + else + return NT_STATUS_NO_PROBLEMO; +} + /**************************************************************************** ****************************************************************************/ uint32 _spoolss_getprinter(POLICY_HND *handle, uint32 level, @@ -2355,13 +2426,12 @@ uint32 _spoolss_getprinter(POLICY_HND *handle, uint32 level, switch (level) { case 0: return getprinter_level_0(servername, snum, buffer, offered, needed); - break; case 1: return getprinter_level_1(servername,snum, buffer, offered, needed); - break; case 2: return getprinter_level_2(servername,snum, buffer, offered, needed); - break; + case 3: + return getprinter_level_3(servername,snum, buffer, offered, needed); default: return ERROR_INVALID_LEVEL; break; -- cgit