Example #1
0
/*
  establish a new connection to the web server
*/
static void websrv_accept(struct stream_connection *conn)
{
    struct web_server_data *wdata = talloc_get_type(conn->private_data, struct web_server_data);
    struct websrv_context *web;
    struct socket_context *tls_socket;

    web = talloc_zero(conn, struct websrv_context);
    if (web == NULL) goto failed;

    web->task = wdata->task;
    web->conn = conn;
    conn->private_data = web;
    talloc_set_destructor(web, websrv_destructor);

    event_add_timed(conn->event.ctx, web,
                    timeval_current_ofs(HTTP_TIMEOUT, 0),
                    websrv_timeout, web);

    /* Overwrite the socket with a (possibly) TLS socket */
    tls_socket = tls_init_server(wdata->tls_params, conn->socket,
                                 conn->event.fde, "GPHO");
    /* We might not have TLS, or it might not have initilised */
    if (tls_socket) {
        talloc_unlink(conn, conn->socket);
        talloc_steal(conn, tls_socket);
        conn->socket = tls_socket;
    } else {
        DEBUG(3, ("TLS not available for web_server connections\n"));
    }

    return;

failed:
    talloc_free(conn);
}
  void OpenSSL_server::openssl_initialize(const std::string& certif,
                                          const std::string& key)
  {
    fs::memdisk().init_fs(
    [] (auto err, auto&) {
      assert(!err);
    });
    /** INIT OPENSSL **/
    openssl::init();
    /** SETUP CUSTOM RNG **/
    //openssl::setup_rng();
    /** VERIFY RNG **/
    openssl::verify_rng();

    this->m_ctx = tls_init_server(certif.c_str(), key.c_str());
    assert(ERR_get_error() == 0);
  }
Example #3
0
/*
  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 auth_session_info *session_info)
{
	struct ldapsrv_service *ldapsrv_service = 
		talloc_get_type(c->private_data, 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_data   = 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_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);

	if (conn->sockets.tls) {
		packet_set_unreliable_select(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;

	conn->session_info = talloc_move(conn, &session_info);

	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);

}