⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldap_server.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
		int policy_value, s;		s = sscanf((const char *)el->values[i].data, "%255[^=]=%d", policy_name, &policy_value);		if (ret != 2 || policy_value == 0)			continue;				if (strcasecmp("InitRecvTimeout", policy_name) == 0) {			conn->limits.initial_timeout = policy_value;			continue;		}		if (strcasecmp("MaxConnIdleTime", policy_name) == 0) {			conn->limits.conn_idle_time = policy_value;			continue;		}		if (strcasecmp("MaxPageSize", policy_name) == 0) {			conn->limits.max_page_size = policy_value;			continue;		}		if (strcasecmp("MaxQueryDuration", policy_name) == 0) {			conn->limits.search_timeout = policy_value;			continue;		}	}	return 0;failed:	DEBUG(0, ("Failed to load ldap server query policies\n"));	talloc_free(tmp_ctx);	return -1;}/*  initialise a server_context from a open socket and register a event handler  for reading from that socket*/static void ldapsrv_accept(struct stream_connection *c){	struct ldapsrv_service *ldapsrv_service = 		talloc_get_type(c->private, struct ldapsrv_service);	struct ldapsrv_connection *conn;	struct cli_credentials *server_credentials;	struct socket_address *socket_address;	NTSTATUS status;	int port;	conn = talloc_zero(c, struct ldapsrv_connection);	if (!conn) {		stream_terminate_connection(c, "ldapsrv_accept: out of memory");		return;	}	conn->packet      = NULL;	conn->connection  = c;	conn->service     = ldapsrv_service;	conn->sockets.raw = c->socket;	conn->lp_ctx      = ldapsrv_service->task->lp_ctx;	c->private        = conn;	socket_address = socket_get_my_addr(c->socket, conn);	if (!socket_address) {		ldapsrv_terminate_connection(conn, "ldapsrv_accept: failed to obtain local socket address!");		return;	}	port = socket_address->port;	talloc_free(socket_address);	if (port == 636) {		struct socket_context *tls_socket = tls_init_server(ldapsrv_service->tls_params, c->socket, 								    c->event.fde, NULL);		if (!tls_socket) {			ldapsrv_terminate_connection(conn, "ldapsrv_accept: tls_init_server() failed");			return;		}		talloc_unlink(c, c->socket);		talloc_steal(c, tls_socket);		c->socket = tls_socket;		conn->sockets.tls = tls_socket;	} else if (port == 3268) /* Global catalog */ {		conn->global_catalog = true;	}	conn->packet = packet_init(conn);	if (conn->packet == NULL) {		ldapsrv_terminate_connection(conn, "out of memory");		return;	}	packet_set_private(conn->packet, conn);	packet_set_socket(conn->packet, c->socket);	packet_set_callback(conn->packet, ldapsrv_decode);	packet_set_full_request(conn->packet, ldap_full_packet);	packet_set_error_handler(conn->packet, ldapsrv_error_handler);	packet_set_event_context(conn->packet, c->event.ctx);	packet_set_fde(conn->packet, c->event.fde);	packet_set_serialise(conn->packet);		/* Ensure we don't get packets until the database is ready below */	packet_recv_disable(conn->packet);	server_credentials = cli_credentials_init(conn);	if (!server_credentials) {		stream_terminate_connection(c, "Failed to init server credentials\n");		return;	}		cli_credentials_set_conf(server_credentials, conn->lp_ctx);	status = cli_credentials_set_machine_account(server_credentials, conn->lp_ctx);	if (!NT_STATUS_IS_OK(status)) {		stream_terminate_connection(c, talloc_asprintf(conn, "Failed to obtain server credentials, perhaps a standalone server?: %s\n", nt_errstr(status)));		return;	}	conn->server_credentials = server_credentials;	/* Connections start out anonymous */	if (!NT_STATUS_IS_OK(auth_anonymous_session_info(conn, c->event.ctx, conn->lp_ctx, &conn->session_info))) {		ldapsrv_terminate_connection(conn, "failed to setup anonymous session info");		return;	}	if (!NT_STATUS_IS_OK(ldapsrv_backend_Init(conn))) {		ldapsrv_terminate_connection(conn, "backend Init failed");		return;	}	/* load limits from the conf partition */	ldapsrv_load_limits(conn); /* should we fail on error ? */	/* register the server */		irpc_add_name(c->msg_ctx, "ldap_server");	/* set connections limits */	conn->limits.ite = event_add_timed(c->event.ctx, conn, 					   timeval_current_ofs(conn->limits.initial_timeout, 0),					   ldapsrv_conn_init_timeout, conn);	packet_recv_enable(conn->packet);}static const struct stream_server_ops ldap_stream_ops = {	.name			= "ldap",	.accept_connection	= ldapsrv_accept,	.recv_handler		= ldapsrv_recv,	.send_handler		= ldapsrv_send,};/*  add a socket address to the list of events, one event per port*/static NTSTATUS add_socket(struct event_context *event_context,			   struct loadparm_context *lp_ctx, 			   const struct model_ops *model_ops,			   const char *address, struct ldapsrv_service *ldap_service){	uint16_t port = 389;	NTSTATUS status;	struct ldb_context *ldb;	status = stream_setup_socket(event_context, lp_ctx,				     model_ops, &ldap_stream_ops, 				     "ipv4", address, &port, 				     lp_socket_options(lp_ctx), 				     ldap_service);	if (!NT_STATUS_IS_OK(status)) {		DEBUG(0,("ldapsrv failed to bind to %s:%u - %s\n",			 address, port, nt_errstr(status)));	}	if (tls_support(ldap_service->tls_params)) {		/* add ldaps server */		port = 636;		status = stream_setup_socket(event_context, lp_ctx, 					     model_ops, &ldap_stream_ops, 					     "ipv4", address, &port, 					     lp_socket_options(lp_ctx), 					     ldap_service);		if (!NT_STATUS_IS_OK(status)) {			DEBUG(0,("ldapsrv failed to bind to %s:%u - %s\n",				 address, port, nt_errstr(status)));		}	}	/* Load LDAP database */	ldb = samdb_connect(ldap_service, ldap_service->task->event_ctx, 			    lp_ctx, system_session(ldap_service, lp_ctx));	if (!ldb) {		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}		if (samdb_is_gc(ldb)) {		port = 3268;		status = stream_setup_socket(event_context, lp_ctx,					     model_ops, &ldap_stream_ops, 					     "ipv4", address, &port, 				     	     lp_socket_options(lp_ctx), 					     ldap_service);		if (!NT_STATUS_IS_OK(status)) {			DEBUG(0,("ldapsrv failed to bind to %s:%u - %s\n",				 address, port, nt_errstr(status)));		}	}	return status;}/*  open the ldap server sockets*/static void ldapsrv_task_init(struct task_server *task){		char *ldapi_path;	struct ldapsrv_service *ldap_service;	NTSTATUS status;	const struct model_ops *model_ops;	switch (lp_server_role(task->lp_ctx)) {	case ROLE_STANDALONE:		task_server_terminate(task, "ldap_server: no LDAP server required in standalone configuration");		return;	case ROLE_DOMAIN_MEMBER:		task_server_terminate(task, "ldap_server: no LDAP server required in member server configuration");		return;	case ROLE_DOMAIN_CONTROLLER:		/* Yes, we want an LDAP server */		break;	}	task_server_set_title(task, "task[ldapsrv]");	/* run the ldap server as a single process */	model_ops = process_model_byname("single");	if (!model_ops) goto failed;	ldap_service = talloc_zero(task, struct ldapsrv_service);	if (ldap_service == NULL) goto failed;	ldap_service->task = task;	ldap_service->tls_params = tls_initialise(ldap_service, task->lp_ctx);	if (ldap_service->tls_params == NULL) goto failed;	if (lp_interfaces(task->lp_ctx) && lp_bind_interfaces_only(task->lp_ctx)) {		struct interface *ifaces;		int num_interfaces;		int i;		load_interfaces(task, lp_interfaces(task->lp_ctx), &ifaces);		num_interfaces = iface_count(ifaces);		/* We have been given an interfaces line, and been 		   told to only bind to those interfaces. Create a		   socket per interface and bind to only these.		*/		for(i = 0; i < num_interfaces; i++) {			const char *address = iface_n_ip(ifaces, i);			status = add_socket(task->event_ctx, task->lp_ctx, model_ops, address, ldap_service);			if (!NT_STATUS_IS_OK(status)) goto failed;		}	} else {		status = add_socket(task->event_ctx, task->lp_ctx, model_ops, 				    lp_socket_address(task->lp_ctx), ldap_service);		if (!NT_STATUS_IS_OK(status)) goto failed;	}	ldapi_path = private_path(ldap_service, task->lp_ctx, "ldapi");	if (!ldapi_path) {		goto failed;	}	status = stream_setup_socket(task->event_ctx, task->lp_ctx,				     model_ops, &ldap_stream_ops, 				     "unix", ldapi_path, NULL, 				     lp_socket_options(task->lp_ctx), 				     ldap_service);	talloc_free(ldapi_path);	if (!NT_STATUS_IS_OK(status)) {		DEBUG(0,("ldapsrv failed to bind to %s - %s\n",			 ldapi_path, nt_errstr(status)));	}	return;failed:	task_server_terminate(task, "Failed to startup ldap server task");	}NTSTATUS server_service_ldap_init(void){	return register_server_service("ldap", ldapsrv_task_init);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -