s4:rpc_server: add a min_auth_level to context handles
[samba.git] / source4 / rpc_server / dcerpc_server.h
index f2fb0f69434e47877052154411a2f87e94c26707..abfb5c0b8944f219b590d8dc29a1223bad6da8cc 100644 (file)
@@ -88,6 +88,7 @@ struct data_blob_list_item {
 /* the state of an ongoing dcerpc call */
 struct dcesrv_call_state {
        struct dcesrv_call_state *next, *prev;
+       struct dcesrv_auth *auth_state;
        struct dcesrv_connection *conn;
        struct dcesrv_connection_context *context;
        struct ncacn_packet pkt;
@@ -154,6 +155,32 @@ struct dcesrv_call_state {
        struct dcerpc_auth *out_auth_info;
 };
 
+/*
+* DCERPC Handles
+* --------------
+* The various handles that are used in the RPC servers should be
+* created and fetch using the dcesrv_handle_* functions.
+*
+* Use
+* dcesrv_handle_create(struct dcesrv_call_state \*, uint8 handle_type)
+* to obtain a new handle of the specified type. Handle types are
+* unique within each pipe.
+*
+* The handle can later be fetched again using:
+*
+* struct dcesrv_handle *dcesrv_handle_lookup(
+*         struct dcesrv_call_state *dce_call,
+*         struct policy_handle *p,
+*         uint8 handle_type)
+*
+* and destroyed by:
+*
+*      TALLOC_FREE(struct dcesrv_handle *).
+*
+* User data should be stored in the 'data' member of the dcesrv_handle
+* struct.
+*/
+
 #define DCESRV_HANDLE_ANY 255
 
 /* a dcerpc handle in internal format */
@@ -162,6 +189,7 @@ struct dcesrv_handle {
        struct dcesrv_assoc_group *assoc_group;
        struct policy_handle wire_handle;
        struct dom_sid *sid;
+       enum dcerpc_AuthLevel min_auth_level;
        const struct dcesrv_interface *iface;
        void *data;
 };
@@ -173,9 +201,10 @@ struct dcesrv_auth {
        uint32_t auth_context_id;
        struct gensec_security *gensec_security;
        struct auth_session_info *session_info;
-       NTSTATUS (*session_key)(struct dcesrv_connection *, DATA_BLOB *session_key);
+       NTSTATUS (*session_key_fn)(struct dcesrv_auth *, DATA_BLOB *session_key);
        bool client_hdr_signing;
        bool hdr_signing;
+       bool auth_started;
        bool auth_finished;
        bool auth_invalid;
 };
@@ -242,9 +271,6 @@ struct dcesrv_connection {
        /* the server_id that will be used for this connection */
        struct server_id server_id;
 
-       /* the transport level session key */
-       DATA_BLOB transport_session_key;
-
        /* is this connection pending termination?  If so, why? */
        const char *terminate;
 
@@ -265,15 +291,13 @@ struct dcesrv_connection {
        const struct tsocket_address *remote_address;
 
        /* the current authentication state */
-       struct dcesrv_auth auth_state;
+       struct dcesrv_auth *default_auth_state;
 
        /*
         * remember which pdu types are allowed
         */
        bool allow_bind;
-       bool allow_auth3;
        bool allow_alter;
-       bool allow_request;
 
        /* the association group the connection belongs to */
        struct dcesrv_assoc_group *assoc_group;
@@ -402,29 +426,35 @@ NTSTATUS dcerpc_register_ep_server(const struct dcesrv_endpoint_server *ep_serve
 NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx, 
                                      struct loadparm_context *lp_ctx,
                                      const char **endpoint_servers, struct dcesrv_context **_dce_ctx);
-NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce_ctx,
-                                TALLOC_CTX *mem_ctx,
-                                const struct dcesrv_endpoint *ep,
-                                struct auth_session_info *session_info,
-                                struct tevent_context *event_ctx,
-                                struct imessaging_context *msg_ctx,
-                                struct server_id server_id,
-                                uint32_t state_flags,
-                                struct dcesrv_connection **_p);
 
 NTSTATUS dcesrv_reply(struct dcesrv_call_state *call);
-struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_connection_context *context, 
-                                       uint8_t handle_type);
+struct dcesrv_handle *dcesrv_handle_create(struct dcesrv_call_state *call,
+                                          uint8_t handle_type);
 
-struct dcesrv_handle *dcesrv_handle_fetch(
-                                         struct dcesrv_connection_context *context, 
-                                         struct policy_handle *p,
-                                         uint8_t handle_type);
+struct dcesrv_handle *dcesrv_handle_lookup(struct dcesrv_call_state *call,
+                                          const struct policy_handle *p,
+                                          uint8_t handle_type);
 
 const struct tsocket_address *dcesrv_connection_get_local_address(struct dcesrv_connection *conn);
 const struct tsocket_address *dcesrv_connection_get_remote_address(struct dcesrv_connection *conn);
 
-NTSTATUS dcesrv_fetch_session_key(struct dcesrv_connection *p, DATA_BLOB *session_key);
+/*
+ * Fetch the authentication session key if available.
+ *
+ * This is the key generated by a gensec authentication.
+ */
+NTSTATUS dcesrv_auth_session_key(struct dcesrv_call_state *call,
+                                DATA_BLOB *session_key);
+
+/*
+ * Fetch the transport session key if available.
+ * Typically this is the SMB session key
+ * or a fixed key for local transports.
+ *
+ * The key is always truncated to 16 bytes.
+*/
+NTSTATUS dcesrv_transport_session_key(struct dcesrv_call_state *call,
+                                     DATA_BLOB *session_key);
 
 /* a useful macro for generating a RPC fault in the backend code */
 #define DCESRV_FAULT(code) do { \
@@ -446,7 +476,7 @@ NTSTATUS dcesrv_fetch_session_key(struct dcesrv_connection *p, DATA_BLOB *sessio
    invalid handle or retval if the handle is of the
    wrong type */
 #define DCESRV_PULL_HANDLE_RETVAL(h, inhandle, t, retval) do { \
-       (h) = dcesrv_handle_fetch(dce_call->context, (inhandle), DCESRV_HANDLE_ANY); \
+       (h) = dcesrv_handle_lookup(dce_call, (inhandle), DCESRV_HANDLE_ANY); \
        DCESRV_CHECK_HANDLE(h); \
        if ((t) != DCESRV_HANDLE_ANY && (h)->wire_handle.handle_type != (t)) { \
                return retval; \
@@ -456,7 +486,7 @@ NTSTATUS dcesrv_fetch_session_key(struct dcesrv_connection *p, DATA_BLOB *sessio
 /* this checks for a valid policy handle and gives a dcerpc fault 
    if its the wrong type of handle */
 #define DCESRV_PULL_HANDLE_FAULT(h, inhandle, t) do { \
-       (h) = dcesrv_handle_fetch(dce_call->context, (inhandle), t); \
+       (h) = dcesrv_handle_lookup(dce_call, (inhandle), t); \
        DCESRV_CHECK_HANDLE(h); \
 } while (0)
 
@@ -485,6 +515,18 @@ _PUBLIC_ bool dcesrv_call_authenticated(struct dcesrv_call_state *dce_call);
  */
 _PUBLIC_ const char *dcesrv_call_account_name(struct dcesrv_call_state *dce_call);
 
+/**
+ * retrieve session_info from a dce_call
+ */
+_PUBLIC_ struct auth_session_info *dcesrv_call_session_info(struct dcesrv_call_state *dce_call);
+
+/**
+ * retrieve auth type/level from a dce_call
+ */
+_PUBLIC_ void dcesrv_call_auth_info(struct dcesrv_call_state *dce_call,
+                                   enum dcerpc_AuthType *auth_type,
+                                   enum dcerpc_AuthLevel *auth_level);
+
 _PUBLIC_ NTSTATUS dcesrv_interface_bind_require_integrity(struct dcesrv_call_state *dce_call,
                                                          const struct dcesrv_interface *iface);
 _PUBLIC_ NTSTATUS dcesrv_interface_bind_require_privacy(struct dcesrv_call_state *dce_call,