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