Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source4/ldap_server/ldap_extended.c

    r414 r740  
    2121#include "ldap_server/ldap_server.h"
    2222#include "../lib/util/dlinklist.h"
    23 #include "libcli/ldap/ldap.h"
    2423#include "lib/tls/tls.h"
    2524#include "smbd/service_stream.h"
    26 
    27 struct ldapsrv_starttls_context {
     25#include "../lib/util/tevent_ntstatus.h"
     26
     27struct ldapsrv_starttls_postprocess_context {
    2828        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
     31struct ldapsrv_starttls_postprocess_state {
     32        struct ldapsrv_connection *conn;
     33};
     34
     35static void ldapsrv_starttls_postprocess_done(struct tevent_req *subreq);
     36
     37static 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
     69static 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
     100static NTSTATUS ldapsrv_starttls_postprocess_recv(struct tevent_req *req)
     101{
     102        return tevent_req_simple_recv_ntstatus(req);
    41103}
    42104
     
    45107                                 const char **errstr)
    46108{
    47         struct ldapsrv_starttls_context *ctx;
     109        struct ldapsrv_starttls_;
    48110
    49111        (*errstr) = NULL;
     
    60122        }
    61123
    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");
    72126                return NT_STATUS_LDAP(LDAP_OPERATIONS_ERROR);
    73127        }
    74128
    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;
    77137
    78138        reply->msg->r.ExtendedResponse.response.resultcode = LDAP_SUCCESS;
     
    105165        const char *error_str = NULL;
    106166        NTSTATUS status = NT_STATUS_OK;
    107         uint32_t i;
     167        ut i;
    108168
    109169        DEBUG(10, ("Extended\n"));
Note: See TracChangeset for help on using the changeset viewer.