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