2017-06-02 13:49:20 +00:00
|
|
|
|
|
|
|
/*
|
2017-07-05 12:42:49 +00:00
|
|
|
* Odissey.
|
2017-06-02 13:49:20 +00:00
|
|
|
*
|
2017-07-05 12:42:49 +00:00
|
|
|
* Advanced PostgreSQL connection pooler.
|
2017-06-02 13:49:20 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
#include <machinarium.h>
|
2017-06-07 11:50:58 +00:00
|
|
|
#include <shapito.h>
|
2017-06-02 13:49:20 +00:00
|
|
|
|
2017-07-05 12:15:17 +00:00
|
|
|
#include "sources/macro.h"
|
|
|
|
#include "sources/version.h"
|
2017-08-08 13:50:50 +00:00
|
|
|
#include "sources/atomic.h"
|
2017-11-27 12:54:16 +00:00
|
|
|
#include "sources/util.h"
|
|
|
|
#include "sources/error.h"
|
2017-07-05 12:15:17 +00:00
|
|
|
#include "sources/list.h"
|
|
|
|
#include "sources/pid.h"
|
|
|
|
#include "sources/id.h"
|
2017-07-26 14:05:29 +00:00
|
|
|
#include "sources/logger.h"
|
2017-07-05 12:15:17 +00:00
|
|
|
#include "sources/daemon.h"
|
2018-03-06 15:23:52 +00:00
|
|
|
#include "sources/config.h"
|
|
|
|
#include "sources/config_mgr.h"
|
2018-03-05 14:24:30 +00:00
|
|
|
#include "sources/config_reader.h"
|
2017-07-05 12:15:17 +00:00
|
|
|
#include "sources/msg.h"
|
|
|
|
#include "sources/system.h"
|
|
|
|
#include "sources/server.h"
|
|
|
|
#include "sources/server_pool.h"
|
|
|
|
#include "sources/client.h"
|
|
|
|
#include "sources/client_pool.h"
|
|
|
|
#include "sources/route_id.h"
|
|
|
|
#include "sources/route.h"
|
|
|
|
#include "sources/route_pool.h"
|
|
|
|
#include "sources/io.h"
|
2017-09-15 12:58:29 +00:00
|
|
|
#include "sources/instance.h"
|
2018-02-22 13:43:52 +00:00
|
|
|
#include "sources/router_cancel.h"
|
2017-07-05 12:15:17 +00:00
|
|
|
#include "sources/router.h"
|
|
|
|
#include "sources/pooler.h"
|
2018-03-02 10:00:52 +00:00
|
|
|
#include "sources/worker.h"
|
2017-07-05 12:15:17 +00:00
|
|
|
#include "sources/tls.h"
|
|
|
|
#include "sources/frontend.h"
|
2017-06-02 13:49:20 +00:00
|
|
|
|
2017-06-13 11:57:54 +00:00
|
|
|
machine_tls_t*
|
2018-03-06 15:23:52 +00:00
|
|
|
od_tls_frontend(od_configlisten_t *config)
|
2017-06-02 13:49:20 +00:00
|
|
|
{
|
|
|
|
int rc;
|
2017-06-13 11:57:54 +00:00
|
|
|
machine_tls_t *tls;
|
2017-06-02 13:49:20 +00:00
|
|
|
tls = machine_tls_create();
|
|
|
|
if (tls == NULL)
|
|
|
|
return NULL;
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_mode == OD_TLS_ALLOW)
|
2017-06-02 13:49:20 +00:00
|
|
|
machine_tls_set_verify(tls, "none");
|
|
|
|
else
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_mode == OD_TLS_REQUIRE)
|
2017-06-02 13:49:20 +00:00
|
|
|
machine_tls_set_verify(tls, "peer");
|
|
|
|
else
|
|
|
|
machine_tls_set_verify(tls, "peer_strict");
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_ca_file) {
|
|
|
|
rc = machine_tls_set_ca_file(tls, config->tls_ca_file);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
machine_tls_free(tls);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_cert_file) {
|
|
|
|
rc = machine_tls_set_cert_file(tls, config->tls_cert_file);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
machine_tls_free(tls);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_key_file) {
|
|
|
|
rc = machine_tls_set_key_file(tls, config->tls_key_file);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
machine_tls_free(tls);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tls;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
od_tls_frontend_accept(od_client_t *client,
|
2017-07-26 14:05:29 +00:00
|
|
|
od_logger_t *logger,
|
2018-03-06 15:23:52 +00:00
|
|
|
od_configlisten_t *config,
|
2017-06-13 11:57:54 +00:00
|
|
|
machine_tls_t *tls)
|
2017-06-02 13:49:20 +00:00
|
|
|
{
|
2018-02-12 13:50:51 +00:00
|
|
|
shapito_stream_t *stream = client->stream;
|
2017-06-02 13:49:20 +00:00
|
|
|
|
|
|
|
if (client->startup.is_ssl_request)
|
|
|
|
{
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", client, NULL, "ssl request");
|
2017-07-06 13:36:14 +00:00
|
|
|
shapito_stream_reset(stream);
|
2017-06-02 13:49:20 +00:00
|
|
|
int rc;
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_mode == OD_TLS_DISABLE) {
|
2017-06-02 13:49:20 +00:00
|
|
|
/* not supported 'N' */
|
2017-07-06 13:36:14 +00:00
|
|
|
shapito_stream_write8(stream, 'N');
|
2017-06-02 13:49:20 +00:00
|
|
|
rc = od_write(client->io, stream);
|
|
|
|
if (rc == -1) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", client, NULL, "write error: %s",
|
|
|
|
machine_error(client->io));
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", client, NULL, "is disabled, ignoring");
|
2017-09-04 12:22:26 +00:00
|
|
|
return 0;
|
2017-06-02 13:49:20 +00:00
|
|
|
}
|
|
|
|
/* supported 'S' */
|
2017-07-06 13:36:14 +00:00
|
|
|
shapito_stream_write8(stream, 'S');
|
2017-06-02 13:49:20 +00:00
|
|
|
rc = od_write(client->io, stream);
|
|
|
|
if (rc == -1) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", client, NULL, "write error: %s",
|
|
|
|
machine_error(client->io));
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
rc = machine_set_tls(client->io, tls);
|
|
|
|
if (rc == -1) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", client, NULL, "error: %s",
|
|
|
|
machine_error(client->io));
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", client, NULL, "ok");
|
2017-06-02 13:49:20 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
switch (config->tls_mode) {
|
2017-07-28 13:16:46 +00:00
|
|
|
case OD_TLS_DISABLE:
|
|
|
|
case OD_TLS_ALLOW:
|
2017-06-02 13:49:20 +00:00
|
|
|
break;
|
|
|
|
default:
|
2017-09-21 13:44:19 +00:00
|
|
|
od_log(logger, "tls", client, NULL, "required, closing");
|
2017-07-06 13:36:14 +00:00
|
|
|
od_frontend_error(client, SHAPITO_PROTOCOL_VIOLATION,
|
2017-06-08 12:36:21 +00:00
|
|
|
"SSL is required");
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-06-13 11:57:54 +00:00
|
|
|
machine_tls_t*
|
2018-03-06 15:23:52 +00:00
|
|
|
od_tls_backend(od_configstorage_t *config)
|
2017-06-02 13:49:20 +00:00
|
|
|
{
|
|
|
|
int rc;
|
2017-06-13 11:57:54 +00:00
|
|
|
machine_tls_t *tls;
|
2017-06-02 13:49:20 +00:00
|
|
|
tls = machine_tls_create();
|
|
|
|
if (tls == NULL)
|
|
|
|
return NULL;
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_mode == OD_TLS_ALLOW)
|
2017-06-02 13:49:20 +00:00
|
|
|
machine_tls_set_verify(tls, "none");
|
|
|
|
else
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_mode == OD_TLS_REQUIRE)
|
2017-06-02 13:49:20 +00:00
|
|
|
machine_tls_set_verify(tls, "peer");
|
|
|
|
else
|
|
|
|
machine_tls_set_verify(tls, "peer_strict");
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_ca_file) {
|
|
|
|
rc = machine_tls_set_ca_file(tls, config->tls_ca_file);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
machine_tls_free(tls);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_cert_file) {
|
|
|
|
rc = machine_tls_set_cert_file(tls, config->tls_cert_file);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
machine_tls_free(tls);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_key_file) {
|
|
|
|
rc = machine_tls_set_key_file(tls, config->tls_key_file);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1) {
|
|
|
|
machine_tls_free(tls);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tls;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
od_tls_backend_connect(od_server_t *server,
|
2017-07-26 14:05:29 +00:00
|
|
|
od_logger_t *logger,
|
2018-02-13 13:33:40 +00:00
|
|
|
shapito_stream_t *stream,
|
2018-03-06 15:23:52 +00:00
|
|
|
od_configstorage_t *config)
|
2017-06-02 13:49:20 +00:00
|
|
|
{
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", NULL, server, "init");
|
2017-06-02 13:49:20 +00:00
|
|
|
|
|
|
|
/* SSL Request */
|
2017-07-06 13:36:14 +00:00
|
|
|
shapito_stream_reset(stream);
|
2017-06-02 13:49:20 +00:00
|
|
|
int rc;
|
2017-07-06 13:36:14 +00:00
|
|
|
rc = shapito_fe_write_ssl_request(stream);
|
2017-06-02 13:49:20 +00:00
|
|
|
if (rc == -1)
|
|
|
|
return -1;
|
|
|
|
rc = od_write(server->io, stream);
|
|
|
|
if (rc == -1) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", NULL, server, "write error: %s",
|
|
|
|
machine_error(server->io));
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* read server reply */
|
2017-07-06 13:36:14 +00:00
|
|
|
shapito_stream_reset(stream);
|
2017-07-04 13:27:42 +00:00
|
|
|
rc = machine_read(server->io, stream->pos, 1, UINT32_MAX);
|
2017-06-14 12:35:04 +00:00
|
|
|
if (rc == -1) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", NULL, server, "read error: %s",
|
|
|
|
machine_error(server->io));
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2017-07-04 13:27:42 +00:00
|
|
|
switch (*stream->pos) {
|
2017-06-02 13:49:20 +00:00
|
|
|
case 'S':
|
|
|
|
/* supported */
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", NULL, server, "supported");
|
2017-06-02 13:49:20 +00:00
|
|
|
rc = machine_set_tls(server->io, server->tls);
|
|
|
|
if (rc == -1) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", NULL, server, "error: %s",
|
|
|
|
machine_error(server->io));
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", NULL, server, "ok");
|
2017-06-02 13:49:20 +00:00
|
|
|
break;
|
|
|
|
case 'N':
|
|
|
|
/* not supported */
|
2018-03-06 15:23:52 +00:00
|
|
|
if (config->tls_mode == OD_TLS_ALLOW) {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_debug(logger, "tls", NULL, server,
|
|
|
|
"not supported, continue (allow)");
|
2017-06-02 13:49:20 +00:00
|
|
|
} else {
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", NULL, server, "not supported, closing");
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
2017-09-21 13:44:19 +00:00
|
|
|
od_error(logger, "tls", NULL, server, "unexpected status reply");
|
2017-06-02 13:49:20 +00:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|