Ignore:
Timestamp:
Nov 24, 2016, 1:14:11 PM (9 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to version 4.4.3

Location:
vendor/current/source4/ldap_server
Files:
31 added
6 edited

Legend:

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

    r740 r988  
    2424#include "auth/credentials/credentials.h"
    2525#include "auth/gensec/gensec.h"
     26#include "auth/gensec/gensec_internal.h" /* TODO: remove this */
    2627#include "param/param.h"
    2728#include "smbd/service_stream.h"
     
    170171
    171172        *errstring = talloc_asprintf(mem_ctx, "%08X: %s", W_ERROR_V(err),
    172                 ldb_strerror(ldb_err));
    173         if (add_err_string != NULL) {
    174                 *errstring = talloc_asprintf(mem_ctx, "%s - %s", *errstring,
    175                                              add_err_string);
    176         }
    177        
     173                add_err_string != NULL ? add_err_string : ldb_strerror(ldb_err));
     174
    178175        /* result is 1:1 for now */
    179176        return ldb_err;
     
    196193        if (conn->server_credentials) {
    197194                char **sasl_mechs = NULL;
    198                 struct gensec_security_ops **backends = gensec_security_all();
    199                 struct gensec_security_ops **ops
     195                const struct gensec_security_ops * const *backends = gensec_security_all();
     196                const struct gensec_security_ops **ops
    200197                        = gensec_use_kerberos_mechs(conn, backends, conn->server_credentials);
    201198                unsigned int i, j = 0;
     
    230227        }
    231228
     229        ldb_set_opaque(conn->ldb, "remoteAddress",
     230                       conn->connection->remote_address);
     231
    232232        return NT_STATUS_OK;
    233233}
     
    256256void ldapsrv_queue_reply(struct ldapsrv_call *call, struct ldapsrv_reply *reply)
    257257{
    258         DLIST_ADD_END(call->replies, reply, struct ldapsrv_reply *);
     258        DLIST_ADD_END(call->replies, reply);
    259259}
    260260
     
    286286                                     const struct ldb_message *message,
    287287                                     struct ldb_control **controls,
    288                                      void *context)
     288                                     struct ldb_result *res)
    289289{
    290290        struct ldb_context *ldb = call->conn->ldb;
     
    300300                                        message,
    301301                                        controls,
    302                                         context,
     302                                        res,
    303303                                        ldb_modify_default_callback,
    304304                                        NULL);
    305305
    306306        if (ret != LDB_SUCCESS) return ret;
     307
     308        if (call->conn->global_catalog) {
     309                return ldb_error(ldb, LDB_ERR_UNWILLING_TO_PERFORM, "modify forbidden on global catalog port");
     310        }
     311        ldb_request_add_control(req, DSDB_CONTROL_NO_GLOBAL_CATALOG, false, NULL);
    307312
    308313        ret = ldb_transaction_start(ldb);
     
    337342                                     const struct ldb_message *message,
    338343                                     struct ldb_control **controls,
    339                                      void *context)
     344                                     struct ldb_result *res)
    340345{
    341346        struct ldb_context *ldb = call->conn->ldb;
     
    351356                                        message,
    352357                                        controls,
    353                                         context,
     358                                        res,
    354359                                        ldb_modify_default_callback,
    355360                                        NULL);
     
    358363                return ret;
    359364        }
     365
     366        if (call->conn->global_catalog) {
     367                return ldb_error(ldb, LDB_ERR_UNWILLING_TO_PERFORM, "modify forbidden on global catalog port");
     368        }
     369        ldb_request_add_control(req, DSDB_CONTROL_NO_GLOBAL_CATALOG, false, NULL);
    360370
    361371        ret = ldb_transaction_start(ldb);
     
    390400                                     struct ldb_dn *dn,
    391401                                     struct ldb_control **controls,
    392                                      void *context)
     402                                     struct ldb_result *res)
    393403{
    394404        struct ldb_context *ldb = call->conn->ldb;
     
    399409                                        dn,
    400410                                        controls,
    401                                         context,
     411                                        res,
    402412                                        ldb_modify_default_callback,
    403413                                        NULL);
    404414
    405415        if (ret != LDB_SUCCESS) return ret;
     416
     417        if (call->conn->global_catalog) {
     418                return ldb_error(ldb, LDB_ERR_UNWILLING_TO_PERFORM, "modify forbidden on global catalog port");
     419        }
     420        ldb_request_add_control(req, DSDB_CONTROL_NO_GLOBAL_CATALOG, false, NULL);
    406421
    407422        ret = ldb_transaction_start(ldb);
     
    436451                                        struct ldb_dn *newdn,
    437452                                        struct ldb_control **controls,
    438                                         void *context)
     453                                        struct ldb_result *res)
    439454{
    440455        struct ldb_context *ldb = call->conn->ldb;
     
    445460                                        olddn,
    446461                                        newdn,
    447                                         NULL,
    448                                         context,
     462                                        controls,
     463                                        res,
    449464                                        ldb_modify_default_callback,
    450465                                        NULL);
    451466
    452467        if (ret != LDB_SUCCESS) return ret;
     468
     469        if (call->conn->global_catalog) {
     470                return ldb_error(ldb, LDB_ERR_UNWILLING_TO_PERFORM, "modify forbidden on global catalog port");
     471        }
     472        ldb_request_add_control(req, DSDB_CONTROL_NO_GLOBAL_CATALOG, false, NULL);
    453473
    454474        ret = ldb_transaction_start(ldb);
     
    583603                        ldb_request_add_control(lreq, LDB_CONTROL_SEARCH_OPTIONS_OID, false, search_options);
    584604                }
     605        } else {
     606                ldb_request_add_control(lreq, DSDB_CONTROL_NO_GLOBAL_CATALOG, false, NULL);
    585607        }
    586608
     
    11451167        unsigned int i;
    11461168        struct ldap_message *msg = call->request;
     1169        struct ldb_context *samdb = call->conn->ldb;
     1170        NTSTATUS status;
     1171        time_t *lastts;
    11471172        /* Check for undecoded critical extensions */
    11481173        for (i=0; msg->controls && msg->controls[i]; i++) {
     
    11631188                return ldapsrv_SearchRequest(call);
    11641189        case LDAP_TAG_ModifyRequest:
    1165                 return ldapsrv_ModifyRequest(call);
     1190                status = ldapsrv_ModifyRequest(call);
     1191                break;
    11661192        case LDAP_TAG_AddRequest:
    1167                 return ldapsrv_AddRequest(call);
     1193                status = ldapsrv_AddRequest(call);
     1194                break;
    11681195        case LDAP_TAG_DelRequest:
    11691196                return ldapsrv_DelRequest(call);
     
    11791206                return ldapsrv_unwilling(call, LDAP_PROTOCOL_ERROR);
    11801207        }
    1181 }
     1208
     1209        if (NT_STATUS_IS_OK(status)) {
     1210                lastts = (time_t *)ldb_get_opaque(samdb, DSDB_OPAQUE_LAST_SCHEMA_UPDATE_MSG_OPAQUE_NAME);
     1211                if (lastts && !*lastts) {
     1212                        DEBUG(10, ("Schema update now was requested, "
     1213                                "fullfilling the request ts = %d\n",
     1214                                (int)*lastts));
     1215                        /*
     1216                        * Just requesting the schema will do the trick
     1217                        * as the delay for reload is experied, we will have a reload
     1218                        * from the schema as expected as we are not yet in a transaction!
     1219                        */
     1220                        dsdb_get_schema(samdb, NULL);
     1221                        *lastts = time(NULL);
     1222                        ldb_set_opaque(samdb, DSDB_OPAQUE_LAST_SCHEMA_UPDATE_MSG_OPAQUE_NAME, lastts);
     1223                }
     1224        }
     1225        return status;
     1226}
  • vendor/current/source4/ldap_server/ldap_bind.c

    r740 r988  
    4646        DEBUG(10, ("BindSimple dn: %s\n",req->dn));
    4747
     48        reply = ldapsrv_init_reply(call, LDAP_TAG_BindResponse);
     49        if (!reply) {
     50                return NT_STATUS_NO_MEMORY;
     51        }
     52
     53        if (req->dn != NULL &&
     54            strlen(req->dn) != 0 &&
     55            call->conn->require_strong_auth > LDAP_SERVER_REQUIRE_STRONG_AUTH_NO &&
     56            call->conn->sockets.active != call->conn->sockets.tls)
     57        {
     58                status = NT_STATUS_NETWORK_ACCESS_DENIED;
     59                result = LDAP_STRONG_AUTH_REQUIRED;
     60                errstr = talloc_asprintf(reply,
     61                                         "BindSimple: Transport encryption required.");
     62                goto do_reply;
     63        }
     64
    4865        status = crack_auto_name_to_nt4_name(call, call->conn->connection->event.ctx, call->conn->lp_ctx, req->dn, &nt4_domain, &nt4_account);
    4966        if (NT_STATUS_IS_OK(status)) {
     
    5976        }
    6077
    61         reply = ldapsrv_init_reply(call, LDAP_TAG_BindResponse);
    62         if (!reply) {
    63                 return NT_STATUS_NO_MEMORY;
    64         }
    65 
    6678        if (NT_STATUS_IS_OK(status)) {
    6779                result = LDAP_SUCCESS;
     
    6981
    7082                talloc_unlink(call->conn, call->conn->session_info);
    71                 call->conn->session_info = session_info;
    72                 talloc_steal(call->conn, session_info);
     83                call->conn->session_info = talloc_steal(call->conn, session_info);
    7384
    7485                /* don't leak the old LDB */
     
    8899        }
    89100
     101do_reply:
    90102        resp = &reply->msg->r.BindResponse;
    91103        resp->response.resultcode = result;
     
    183195                        gensec_want_feature(conn->gensec, GENSEC_FEATURE_SEAL);
    184196                        gensec_want_feature(conn->gensec, GENSEC_FEATURE_ASYNC_REPLIES);
     197                        gensec_want_feature(conn->gensec, GENSEC_FEATURE_LDAP_STYLE);
    185198                       
    186199                        status = gensec_start_mech_by_sasl_name(conn->gensec, req->creds.SASL.mechanism);
     
    204217                }
    205218
    206                 status = gensec_update(conn->gensec, reply,
    207                                        input, &output);
     219                status = gensec_update_ev(conn->gensec, reply, conn->connection->event.ctx,
     220                                          input, &output);
    208221
    209222                /* Windows 2000 mmc doesn't like secblob == NULL and reports a decoding error */
     
    219232                errstr = NULL;
    220233        } else if (NT_STATUS_IS_OK(status)) {
    221                 struct auth_session_info *old_session_info=NULL;
    222234                struct ldapsrv_sasl_postprocess_context *context = NULL;
    223235
     
    264276                                }
    265277                        }
     278                } else {
     279                        switch (call->conn->require_strong_auth) {
     280                        case LDAP_SERVER_REQUIRE_STRONG_AUTH_NO:
     281                                break;
     282                        case LDAP_SERVER_REQUIRE_STRONG_AUTH_ALLOW_SASL_OVER_TLS:
     283                                if (call->conn->sockets.active == call->conn->sockets.tls) {
     284                                        break;
     285                                }
     286                                status = NT_STATUS_NETWORK_ACCESS_DENIED;
     287                                result = LDAP_STRONG_AUTH_REQUIRED;
     288                                errstr = talloc_asprintf(reply,
     289                                                "SASL:[%s]: not allowed if TLS is used.",
     290                                                 req->creds.SASL.mechanism);
     291                                break;
     292                        case LDAP_SERVER_REQUIRE_STRONG_AUTH_YES:
     293                                status = NT_STATUS_NETWORK_ACCESS_DENIED;
     294                                result = LDAP_STRONG_AUTH_REQUIRED;
     295                                errstr = talloc_asprintf(reply,
     296                                                 "SASL:[%s]: Sign or Seal are required.",
     297                                                 req->creds.SASL.mechanism);
     298                                break;
     299                        }
    266300                }
    267301
    268302                if (result != LDAP_SUCCESS) {
    269                         conn->session_info = old_session_info;
    270303                } else if (!NT_STATUS_IS_OK(status)) {
    271                         conn->session_info = old_session_info;
    272304                        result = LDAP_OPERATIONS_ERROR;
    273305                        errstr = talloc_asprintf(reply,
     
    275307                                                 req->creds.SASL.mechanism, nt_errstr(status));
    276308                } else {
     309                        struct auth_session_info *old_session_info=NULL;
    277310
    278311                        old_session_info = conn->session_info;
    279312                        conn->session_info = NULL;
    280                         status = gensec_session_info(conn->gensec, &conn->session_info);
     313                        status = gensec_session_info(conn->gensec, conn, &conn->session_info);
    281314                        if (!NT_STATUS_IS_OK(status)) {
    282315                                conn->session_info = old_session_info;
     
    287320                        } else {
    288321                                talloc_unlink(conn, old_session_info);
    289                                 talloc_steal(conn, conn->session_info);
    290322                               
    291323                                /* don't leak the old LDB */
  • vendor/current/source4/ldap_server/ldap_extended.c

    r740 r988  
    8383        TALLOC_FREE(subreq);
    8484        if (ret == -1) {
    85                 NTSTATUS status = map_nt_error_from_unix(sys_errno);
     85                NTSTATUS status = map_nt_error_from_unix_common(sys_errno);
    8686
    8787                DEBUG(1,("ldapsrv_starttls_postprocess_done: accept_tls_loop: "
     
    186186                 */
    187187                status = extended_ops[i].fn(call, reply, &error_str);
    188                 NT_STATUS_IS_OK_RETURN(status);
     188                if (NT_STATUS_IS_OK(status)) {
     189                        return status;
     190                }
    189191 
    190192                if (NT_STATUS_IS_LDAP(status)) {
  • vendor/current/source4/ldap_server/ldap_server.c

    r740 r988  
    4747#include "../lib/util/tevent_ntstatus.h"
    4848#include "../libcli/util/tstream.h"
     49#include "libds/common/roles.h"
    4950
    5051static void ldapsrv_terminate_connection_done(struct tevent_req *subreq);
     
    100101                tevent_req_callback_data(subreq,
    101102                struct ldapsrv_connection);
    102         int ret;
    103103        int sys_errno;
    104104
    105         ret = tstream_disconnect_recv(subreq, &sys_errno);
     105        tstream_disconnect_recv(subreq, &sys_errno);
    106106        TALLOC_FREE(subreq);
    107107
     
    219219
    220220                s = sscanf((const char *)el->values[i].data, "%255[^=]=%d", policy_name, &policy_value);
    221                 if (ret != 2 || policy_value == 0)
     221                if (s != 2 || policy_value == 0)
    222222                        continue;
    223 
    224223                if (strcasecmp("InitRecvTimeout", policy_name) == 0) {
    225224                        conn->limits.initial_timeout = policy_value;
     
    335334        conn->session_info = session_info;
    336335
     336        conn->sockets.active = conn->sockets.raw;
     337
     338        if (conn->is_privileged) {
     339                conn->require_strong_auth = LDAP_SERVER_REQUIRE_STRONG_AUTH_NO;
     340        } else {
     341                conn->require_strong_auth = lpcfg_ldap_server_require_strong_auth(conn->lp_ctx);
     342        }
     343
    337344        if (!NT_STATUS_IS_OK(ldapsrv_backend_Init(conn))) {
    338345                ldapsrv_terminate_connection(conn, "backend Init failed");
     
    345352        /* register the server */       
    346353        irpc_add_name(c->msg_ctx, "ldap_server");
    347 
    348         conn->sockets.active = conn->sockets.raw;
    349354
    350355        if (port != 636 && port != 3269) {
     
    709714                              ldapsrv_process_call_trigger, NULL);
    710715        if (!ok) {
    711                 tevent_req_nomem(NULL, req);
     716                tevent_req_oom(req);
    712717                return tevent_req_post(req, ev);
    713718        }
     
    816821        status = stream_setup_socket(task, task->event_ctx, lp_ctx,
    817822                                     model_ops, &ldap_stream_nonpriv_ops,
    818                                      "ipv4", address, &port,
     823                                     "ip", address, &port,
    819824                                     lpcfg_socket_options(lp_ctx),
    820825                                     ldap_service);
     
    831836                                             model_ops,
    832837                                             &ldap_stream_nonpriv_ops,
    833                                              "ipv4", address, &port,
     838                                             "ip", address, &port,
    834839                                             lpcfg_socket_options(lp_ctx),
    835840                                             ldap_service);
     
    853858                                             model_ops,
    854859                                             &ldap_stream_nonpriv_ops,
    855                                              "ipv4", address, &port,
     860                                             "ip", address, &port,
    856861                                             lpcfg_socket_options(lp_ctx),
    857862                                             ldap_service);
     
    867872                                                     model_ops,
    868873                                                     &ldap_stream_nonpriv_ops,
    869                                                      "ipv4", address, &port,
     874                                                     "ip", address, &port,
    870875                                                     lpcfg_socket_options(lp_ctx),
    871876                                                     ldap_service);
     
    908913                                      false);
    909914                return;
    910         case ROLE_DOMAIN_CONTROLLER:
     915        case ROLE_ACTIVE_DIRECTORY_DC:
    911916                /* Yes, we want an LDAP server */
    912917                break;
     
    937942                                           lpcfg_tls_crlfile(ldap_service, task->lp_ctx),
    938943                                           lpcfg_tls_dhpfile(ldap_service, task->lp_ctx),
     944                                           lpcfg_tls_priority(task->lp_ctx),
    939945                                           &ldap_service->tls_params);
    940946        if (!NT_STATUS_IS_OK(status)) {
    941                 DEBUG(0,("ldapsrv failed tstream_tls_patams_server - %s\n",
     947                DEBUG(0,("ldapsrv failed tstream_tls_params_server - %s\n",
    942948                         nt_errstr(status)));
    943949                goto failed;
     
    952958                int i;
    953959
    954                 load_interfaces(task, lpcfg_interfaces(task->lp_ctx), &ifaces);
    955                 num_interfaces = iface_count(ifaces);
     960                load_interface_list(task, task->lp_ctx, &ifaces);
     961                num_interfaces = iface_list_count(ifaces);
    956962
    957963                /* We have been given an interfaces line, and been
     
    960966                */
    961967                for(i = 0; i < num_interfaces; i++) {
    962                         const char *address = iface_n_ip(ifaces, i);
     968                        const char *address = iface_list_n_ip(ifaces, i);
    963969                        status = add_socket(task, task->lp_ctx, model_ops, address, ldap_service);
    964970                        if (!NT_STATUS_IS_OK(status)) goto failed;
    965971                }
    966972        } else {
    967                 status = add_socket(task, task->lp_ctx, model_ops,
    968                                     lpcfg_socket_address(task->lp_ctx), ldap_service);
    969                 if (!NT_STATUS_IS_OK(status)) goto failed;
    970         }
    971 
    972         ldapi_path = private_path(ldap_service, task->lp_ctx, "ldapi");
     973                char **wcard;
     974                int i;
     975                int num_binds = 0;
     976                wcard = iface_list_wildcard(task);
     977                if (wcard == NULL) {
     978                        DEBUG(0,("No wildcard addresses available\n"));
     979                        goto failed;
     980                }
     981                for (i=0; wcard[i]; i++) {
     982                        status = add_socket(task, task->lp_ctx, model_ops, wcard[i], ldap_service);
     983                        if (NT_STATUS_IS_OK(status)) {
     984                                num_binds++;
     985                        }
     986                }
     987                talloc_free(wcard);
     988                if (num_binds == 0) {
     989                        goto failed;
     990                }
     991        }
     992
     993        ldapi_path = lpcfg_private_path(ldap_service, task->lp_ctx, "ldapi");
    973994        if (!ldapi_path) {
    974995                goto failed;
     
    9871008
    9881009#ifdef WITH_LDAPI_PRIV_SOCKET
    989         priv_dir = private_path(ldap_service, task->lp_ctx, "ldap_priv");
     1010        priv_dir = lpcfg_private_path(ldap_service, task->lp_ctx, "ldap_priv");
    9901011        if (priv_dir == NULL) {
    9911012                goto failed;
     
    9951016         * is of the correct permissions
    9961017         */
    997         if (!directory_create_or_exist(priv_dir, geteuid(), 0750)) {
     1018        if (!directory_create_or_exist(priv_dir, 0750)) {
    9981019                task_server_terminate(task, "Cannot create ldap "
    9991020                                      "privileged ldapi directory", true);
     
    10181039
    10191040#endif
     1041
     1042        /* register the server */
     1043        irpc_add_name(task->msg_ctx, "ldap_server");
    10201044        return;
    10211045
  • vendor/current/source4/ldap_server/ldap_server.h

    r740 r988  
    2323#include "lib/stream/packet.h"
    2424#include "system/network.h"
     25#include "lib/param/loadparm.h"
    2526
    2627struct ldapsrv_connection {
     
    4344        bool global_catalog;
    4445        bool is_privileged;
     46        enum ldap_server_require_strong_auth require_strong_auth;
    4547
    4648        struct {
  • vendor/current/source4/ldap_server/wscript_build

    r740 r988  
    77        subsystem='service',
    88        init_function='server_service_ldap_init',
    9         deps='credentials cli-ldap samdb process_model gensec samba-hostconfig samba_server_gensec',
     9        deps='samba-credentials cli-ldap samdb process_model gensec samba-hostconfig samba_server_gensec',
    1010        internal_module=False,
     11        enabled=bld.AD_DC_BUILD_IS_ENABLED()
    1112        )
    1213
Note: See TracChangeset for help on using the changeset viewer.