1/* 2 Unix SMB/CIFS implementation. 3 SMB parameters and setup 4 Copyright (C) Andrew Tridgell 1992-1998 5 Copyright (C) Luke Kenneth Casson Leighton 1996-1998 6 Copyright (C) Jeremy Allison 1998 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20*/ 21 22#ifndef _CLIENT_H 23#define _CLIENT_H 24 25/* the client asks for a smaller buffer to save ram and also to get more 26 overlap on the wire. This size gives us a nice read/write size, which 27 will be a multiple of the page size on almost any system */ 28#define CLI_BUFFER_SIZE (0xFFFF) 29#define CLI_SAMBA_MAX_LARGE_READX_SIZE (127*1024) /* Works for Samba servers */ 30#define CLI_SAMBA_MAX_LARGE_WRITEX_SIZE (127*1024) /* Works for Samba servers */ 31#define CLI_WINDOWS_MAX_LARGE_READX_SIZE ((64*1024)-2) /* Windows servers are broken.... */ 32#define CLI_WINDOWS_MAX_LARGE_WRITEX_SIZE ((64*1024)-2) /* Windows servers are broken.... */ 33#define CLI_SAMBA_MAX_POSIX_LARGE_READX_SIZE (0xFFFF00) /* 24-bit len. */ 34#define CLI_SAMBA_MAX_POSIX_LARGE_WRITEX_SIZE (0xFFFF00) /* 24-bit len. */ 35 36/* 37 * These definitions depend on smb.h 38 */ 39 40struct print_job_info { 41 uint16 id; 42 uint16 priority; 43 size_t size; 44 fstring user; 45 fstring name; 46 time_t t; 47}; 48 49struct cli_pipe_auth_data { 50 enum pipe_auth_type auth_type; /* switch for the union below. Defined in ntdomain.h */ 51 enum dcerpc_AuthLevel auth_level; /* defined in ntdomain.h */ 52 53 char *domain; 54 char *user_name; 55 DATA_BLOB user_session_key; 56 57 union { 58 struct schannel_state *schannel_auth; 59 NTLMSSP_STATE *ntlmssp_state; 60 struct kerberos_auth_struct *kerberos_auth; 61 } a_u; 62}; 63 64/** 65 * rpc_cli_transport defines a transport mechanism to ship rpc requests 66 * asynchronously to a server and receive replies 67 */ 68 69struct rpc_cli_transport { 70 71 enum dcerpc_transport_t transport; 72 73 /** 74 * Trigger an async read from the server. May return a short read. 75 */ 76 struct tevent_req *(*read_send)(TALLOC_CTX *mem_ctx, 77 struct event_context *ev, 78 uint8_t *data, size_t size, 79 void *priv); 80 /** 81 * Get the result from the read_send operation. 82 */ 83 NTSTATUS (*read_recv)(struct tevent_req *req, ssize_t *preceived); 84 85 /** 86 * Trigger an async write to the server. May return a short write. 87 */ 88 struct tevent_req *(*write_send)(TALLOC_CTX *mem_ctx, 89 struct event_context *ev, 90 const uint8_t *data, size_t size, 91 void *priv); 92 /** 93 * Get the result from the read_send operation. 94 */ 95 NTSTATUS (*write_recv)(struct tevent_req *req, ssize_t *psent); 96 97 /** 98 * This is an optimization for the SMB transport. It models the 99 * TransactNamedPipe API call: Send and receive data in one round 100 * trip. The transport implementation is free to set this to NULL, 101 * cli_pipe.c will fall back to the explicit write/read routines. 102 */ 103 struct tevent_req *(*trans_send)(TALLOC_CTX *mem_ctx, 104 struct event_context *ev, 105 uint8_t *data, size_t data_len, 106 uint32_t max_rdata_len, 107 void *priv); 108 /** 109 * Get the result from the trans_send operation. 110 */ 111 NTSTATUS (*trans_recv)(struct tevent_req *req, TALLOC_CTX *mem_ctx, 112 uint8_t **prdata, uint32_t *prdata_len); 113 114 bool (*is_connected)(void *priv); 115 unsigned int (*set_timeout)(void *priv, unsigned int timeout); 116 117 void *priv; 118}; 119 120struct rpc_pipe_client { 121 struct rpc_pipe_client *prev, *next; 122 123 struct rpc_cli_transport *transport; 124 125 struct ndr_syntax_id abstract_syntax; 126 struct ndr_syntax_id transfer_syntax; 127 128 NTSTATUS (*dispatch) (struct rpc_pipe_client *cli, 129 TALLOC_CTX *mem_ctx, 130 const struct ndr_interface_table *table, 131 uint32_t opnum, void *r); 132 133 struct tevent_req *(*dispatch_send)( 134 TALLOC_CTX *mem_ctx, 135 struct tevent_context *ev, 136 struct rpc_pipe_client *cli, 137 const struct ndr_interface_table *table, 138 uint32_t opnum, 139 void *r); 140 NTSTATUS (*dispatch_recv)(struct tevent_req *req, 141 TALLOC_CTX *mem_ctx); 142 143 144 char *desthost; 145 char *srv_name_slash; 146 147 uint16 max_xmit_frag; 148 uint16 max_recv_frag; 149 150 struct cli_pipe_auth_data *auth; 151 152 /* The following is only non-null on a netlogon client pipe. */ 153 struct netlogon_creds_CredentialState *dc; 154 155 /* Used by internal rpc_pipe_client */ 156 pipes_struct *pipes_struct; 157}; 158 159/* Transport encryption state. */ 160enum smb_trans_enc_type { 161 SMB_TRANS_ENC_NTLM 162#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5) 163 , SMB_TRANS_ENC_GSS 164#endif 165}; 166 167#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5) 168struct smb_tran_enc_state_gss { 169 gss_ctx_id_t gss_ctx; 170 gss_cred_id_t creds; 171}; 172#endif 173 174struct smb_trans_enc_state { 175 enum smb_trans_enc_type smb_enc_type; 176 uint16 enc_ctx_num; 177 bool enc_on; 178 union { 179 NTLMSSP_STATE *ntlmssp_state; 180#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5) 181 struct smb_tran_enc_state_gss *gss_state; 182#endif 183 } s; 184}; 185 186struct cli_state_seqnum { 187 struct cli_state_seqnum *prev, *next; 188 uint16_t mid; 189 uint32_t seqnum; 190 bool persistent; 191}; 192 193struct cli_state { 194 /** 195 * A list of subsidiary connections for DFS. 196 */ 197 struct cli_state *prev, *next; 198 int port; 199 int fd; 200 /* Last read or write error. */ 201 enum smb_read_errors smb_rw_error; 202 uint16 cnum; 203 uint16 pid; 204 uint16 mid; 205 uint16 vuid; 206 int protocol; 207 int sec_mode; 208 int rap_error; 209 int privileges; 210 211 fstring desthost; 212 213 /* The credentials used to open the cli_state connection. */ 214 char *domain; 215 char *user_name; 216 char *password; /* Can be null to force use of zero NTLMSSP session key. */ 217 218 /* 219 * The following strings are the 220 * ones returned by the server if 221 * the protocol > NT1. 222 */ 223 fstring server_type; 224 fstring server_os; 225 fstring server_domain; 226 227 fstring share; 228 fstring dev; 229 struct nmb_name called; 230 struct nmb_name calling; 231 fstring full_dest_host_name; 232 struct sockaddr_storage dest_ss; 233 234 DATA_BLOB secblob; /* cryptkey or negTokenInit */ 235 uint32 sesskey; 236 int serverzone; 237 uint32 servertime; 238 int readbraw_supported; 239 int writebraw_supported; 240 int timeout; /* in milliseconds. */ 241 size_t max_xmit; 242 size_t max_mux; 243 char *outbuf; 244 struct cli_state_seqnum *seqnum; 245 char *inbuf; 246 unsigned int bufsize; 247 int initialised; 248 int win95; 249 bool is_samba; 250 uint32 capabilities; 251 uint32 posix_capabilities; 252 bool dfsroot; 253 254#if 0 255 TALLOC_CTX *longterm_mem_ctx; 256 TALLOC_CTX *call_mem_ctx; 257#endif 258 259 struct smb_signing_state *signing_state; 260 261 struct smb_trans_enc_state *trans_enc_state; /* Setup if we're encrypting SMB's. */ 262 263 /* the session key for this CLI, outside 264 any per-pipe authenticaion */ 265 DATA_BLOB user_session_key; 266 267 /* The list of pipes currently open on this connection. */ 268 struct rpc_pipe_client *pipe_list; 269 270 bool use_kerberos; 271 bool fallback_after_kerberos; 272 bool use_spnego; 273 bool use_ccache; 274 bool got_kerberos_mechanism; /* Server supports krb5 in SPNEGO. */ 275 276 bool use_oplocks; /* should we use oplocks? */ 277 bool use_level_II_oplocks; /* should we use level II oplocks? */ 278 279 /* a oplock break request handler */ 280 NTSTATUS (*oplock_handler)(struct cli_state *cli, uint16_t fnum, unsigned char level); 281 282 bool force_dos_errors; 283 bool case_sensitive; /* False by default. */ 284 285 /* Where (if anywhere) this is mounted under DFS. */ 286 char *dfs_mountpoint; 287 288 struct tevent_queue *outgoing; 289 struct tevent_req **pending; 290}; 291 292typedef struct file_info { 293 struct cli_state *cli; 294 uint64_t size; 295 uint16 mode; 296 uid_t uid; 297 gid_t gid; 298 /* these times are normally kept in GMT */ 299 struct timespec mtime_ts; 300 struct timespec atime_ts; 301 struct timespec ctime_ts; 302 char *name; 303 char short_name[13*3]; /* the *3 is to cope with multi-byte */ 304} file_info; 305 306#define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001 307#define CLI_FULL_CONNECTION_USE_KERBEROS 0x0002 308#define CLI_FULL_CONNECTION_ANONYMOUS_FALLBACK 0x0004 309#define CLI_FULL_CONNECTION_FALLBACK_AFTER_KERBEROS 0x0008 310#define CLI_FULL_CONNECTION_OPLOCKS 0x0010 311#define CLI_FULL_CONNECTION_LEVEL_II_OPLOCKS 0x0020 312#define CLI_FULL_CONNECTION_USE_CCACHE 0x0040 313 314#endif /* _CLIENT_H */ 315