s3:smbd: check the incoming session id for SMB2 requests
[ira/wip.git] / source3 / smbd / globals.h
index c5dd97c7c846f139d19930ab661742a1e432cf30..345f74880203a5819418041121c70d57d70a34c3 100644 (file)
@@ -201,6 +201,7 @@ extern int num_children;
 
 struct tstream_context;
 struct smbd_smb2_request;
+struct smbd_smb2_session;
 
 DATA_BLOB negprot_spnego(void);
 
@@ -214,10 +215,16 @@ NTSTATUS smbd_smb2_request_error_ex(struct smbd_smb2_request *req,
                                    NTSTATUS status, DATA_BLOB *info);
 NTSTATUS smbd_smb2_request_error(struct smbd_smb2_request *req,
                                 NTSTATUS status);
+NTSTATUS smbd_smb2_request_done_ex(struct smbd_smb2_request *req,
+                                  NTSTATUS status,
+                                  DATA_BLOB body, DATA_BLOB *dyn);
 NTSTATUS smbd_smb2_request_done(struct smbd_smb2_request *req,
                                DATA_BLOB body, DATA_BLOB *dyn);
 
+NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req);
+
 NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *req);
 NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req);
 
 struct smbd_smb2_request {
@@ -225,6 +232,9 @@ struct smbd_smb2_request {
 
        struct smbd_server_connection *conn;
 
+       /* the session the request operates on, maybe NULL */
+       struct smbd_smb2_session *session;
+
        int current_idx;
 
        struct {
@@ -273,6 +283,16 @@ struct smbd_smb2_request {
        } out;
 };
 
+struct smbd_server_connection;
+
+struct smbd_smb2_session {
+       struct smbd_smb2_session *prev, *next;
+       struct smbd_server_connection *conn;
+       NTSTATUS status;
+       uint64_t vuid;
+       AUTH_NTLMSSP_STATE *auth_ntlmssp_state;
+};
+
 struct smbd_server_connection {
        struct fd_event *fde;
        uint64_t num_requests;
@@ -283,6 +303,17 @@ struct smbd_server_connection {
                struct tevent_queue *recv_queue;
                struct tevent_queue *send_queue;
                struct tstream_context *stream;
+               struct {
+                       /* an id tree used to allocate vuids */
+                       /* this holds info on session vuids that are already
+                        * validated for this VC */
+                       struct idr_context *idtree;
+
+                       /* this is the limit of vuid values for this connection */
+                       uint64_t limit;
+
+                       struct smbd_smb2_session *list;
+               } sessions;
        } smb2;
 };