Changeset 740 for vendor/current/source4/ldap_server/ldap_extended.c
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source4/ldap_server/ldap_extended.c
r414 r740 21 21 #include "ldap_server/ldap_server.h" 22 22 #include "../lib/util/dlinklist.h" 23 #include "libcli/ldap/ldap.h"24 23 #include "lib/tls/tls.h" 25 24 #include "smbd/service_stream.h" 26 27 struct ldapsrv_starttls_context { 25 #include "../lib/util/tevent_ntstatus.h" 26 27 struct ldapsrv_starttls_postprocess_context { 28 28 struct ldapsrv_connection *conn; 29 struct socket_context *tls_socket; 30 }; 31 32 static void ldapsrv_start_tls(void *private_data) 33 { 34 struct ldapsrv_starttls_context *ctx = talloc_get_type(private_data, struct ldapsrv_starttls_context); 35 talloc_steal(ctx->conn->connection, ctx->tls_socket); 36 37 ctx->conn->sockets.tls = ctx->tls_socket; 38 ctx->conn->connection->socket = ctx->tls_socket; 39 packet_set_socket(ctx->conn->packet, ctx->conn->connection->socket); 40 packet_set_unreliable_select(ctx->conn->packet); 29 }; 30 31 struct ldapsrv_starttls_postprocess_state { 32 struct ldapsrv_connection *conn; 33 }; 34 35 static void ldapsrv_starttls_postprocess_done(struct tevent_req *subreq); 36 37 static struct tevent_req *ldapsrv_starttls_postprocess_send(TALLOC_CTX *mem_ctx, 38 struct tevent_context *ev, 39 void *private_data) 40 { 41 struct ldapsrv_starttls_postprocess_context *context = 42 talloc_get_type_abort(private_data, 43 struct ldapsrv_starttls_postprocess_context); 44 struct ldapsrv_connection *conn = context->conn; 45 struct tevent_req *req; 46 struct ldapsrv_starttls_postprocess_state *state; 47 struct tevent_req *subreq; 48 49 req = tevent_req_create(mem_ctx, &state, 50 struct ldapsrv_starttls_postprocess_state); 51 if (req == NULL) { 52 return NULL; 53 } 54 55 state->conn = conn; 56 57 subreq = tstream_tls_accept_send(conn, 58 conn->connection->event.ctx, 59 conn->sockets.raw, 60 conn->service->tls_params); 61 if (tevent_req_nomem(subreq, req)) { 62 return tevent_req_post(req, ev); 63 } 64 tevent_req_set_callback(subreq, ldapsrv_starttls_postprocess_done, req); 65 66 return req; 67 } 68 69 static void ldapsrv_starttls_postprocess_done(struct tevent_req *subreq) 70 { 71 struct tevent_req *req = 72 tevent_req_callback_data(subreq, 73 struct tevent_req); 74 struct ldapsrv_starttls_postprocess_state *state = 75 tevent_req_data(req, 76 struct ldapsrv_starttls_postprocess_state); 77 struct ldapsrv_connection *conn = state->conn; 78 int ret; 79 int sys_errno; 80 81 ret = tstream_tls_accept_recv(subreq, &sys_errno, 82 conn, &conn->sockets.tls); 83 TALLOC_FREE(subreq); 84 if (ret == -1) { 85 NTSTATUS status = map_nt_error_from_unix(sys_errno); 86 87 DEBUG(1,("ldapsrv_starttls_postprocess_done: accept_tls_loop: " 88 "tstream_tls_accept_recv() - %d:%s => %s", 89 sys_errno, strerror(sys_errno), nt_errstr(status))); 90 91 tevent_req_nterror(req, status); 92 return; 93 } 94 95 conn->sockets.active = conn->sockets.tls; 96 97 tevent_req_done(req); 98 } 99 100 static NTSTATUS ldapsrv_starttls_postprocess_recv(struct tevent_req *req) 101 { 102 return tevent_req_simple_recv_ntstatus(req); 41 103 } 42 104 … … 45 107 const char **errstr) 46 108 { 47 struct ldapsrv_starttls_ context *ctx;109 struct ldapsrv_starttls_; 48 110 49 111 (*errstr) = NULL; … … 60 122 } 61 123 62 ctx = talloc(call, struct ldapsrv_starttls_context); 63 NT_STATUS_HAVE_NO_MEMORY(ctx); 64 65 ctx->conn = call->conn; 66 ctx->tls_socket = tls_init_server(call->conn->service->tls_params, 67 call->conn->connection->socket, 68 call->conn->connection->event.fde, 69 NULL); 70 if (!ctx->tls_socket) { 71 (*errstr) = talloc_asprintf(reply, "START-TLS: Failed to setup TLS socket"); 124 if (call->conn->sockets.sasl) { 125 (*errstr) = talloc_asprintf(reply, "START-TLS: SASL is already enabled on this LDAP session"); 72 126 return NT_STATUS_LDAP(LDAP_OPERATIONS_ERROR); 73 127 } 74 128 75 call->send_callback = ldapsrv_start_tls; 76 call->send_private = ctx; 129 context = talloc(call, struct ldapsrv_starttls_postprocess_context); 130 NT_STATUS_HAVE_NO_MEMORY(context); 131 132 context->conn = call->conn; 133 134 call->postprocess_send = ldapsrv_starttls_postprocess_send; 135 call->postprocess_recv = ldapsrv_starttls_postprocess_recv; 136 call->postprocess_private = context; 77 137 78 138 reply->msg->r.ExtendedResponse.response.resultcode = LDAP_SUCCESS; … … 105 165 const char *error_str = NULL; 106 166 NTSTATUS status = NT_STATUS_OK; 107 u int32_t i;167 ut i; 108 168 109 169 DEBUG(10, ("Extended\n"));
Note:
See TracChangeset
for help on using the changeset viewer.
