Skip to content

Commit

Permalink
bsock: improved cloning of a BareosSocket Object
Browse files Browse the repository at this point in the history
- improvements in clone()
- added test auth_works_with_tls_psk_cloned_socket
  • Loading branch information
franku committed Aug 16, 2018
1 parent a5ca64b commit ed57ed0
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 30 deletions.
21 changes: 11 additions & 10 deletions core/src/lib/bsock_tcp.cc
Expand Up @@ -82,8 +82,12 @@ BareosSocket *BareosSocketTCP::clone()
}

/* duplicate file descriptors */
clone->fd_ = dup(fd_);
spool_fd_ = dup(spool_fd_);
if (fd_ >= 0) {
clone->fd_ = dup(fd_);
}
if (spool_fd_ >= 0) {
clone->spool_fd_ = dup(spool_fd_);
}

clone->cloned_ = true;

Expand Down Expand Up @@ -906,19 +910,16 @@ int BareosSocketTCP::WaitDataIntr(int sec, int usec)

void BareosSocketTCP::close()
{
if (cloned_) {
return;
}
if (!cloned_) {
ClearLocking();

ClearLocking();

if (tls_conn) {
CloseTlsConnectionAndFreeMemory();
if (tls_conn) {
CloseTlsConnectionAndFreeMemory();
}
}

if (fd_ >= 0) {
if (IsTimedOut()) {
/* discard any pending I/O */
shutdown(fd_, SHUT_RDWR);
}
socketClose(fd_);
Expand Down
97 changes: 77 additions & 20 deletions core/src/lib/unittests/bsock_test.cc
Expand Up @@ -113,7 +113,7 @@ static bool check_cipher(const TlsResource &tls, const std::string &cipher)

void start_bareos_server(std::promise<bool> *promise, std::string console_name,
std::string console_password, std::string server_address, int server_port,
ConsoleResource *cons)
ConsoleResource *cons, bool clone_bareos_socket)

{
int newsockfd = create_accepted_server_socket(server_port);
Expand Down Expand Up @@ -160,6 +160,12 @@ void start_bareos_server(std::promise<bool> *promise, std::string console_name,
}
success = !bs->TlsEstablished();
}
if (clone_bareos_socket) {
BareosSocket *bs2 = bs->clone();
bs2->fsend("cloned-1234567890HALLO1234567890-cloned");
bs2->close();
delete bs2;
}
bs->fsend("1234567890HALLO1234567890");
}
}
Expand All @@ -173,7 +179,7 @@ int connect_to_server(std::string console_name, std::string console_password,
std::string server_address, int server_port, DirectorResource *dir)
#else
bool connect_to_server(std::string console_name, std::string console_password,
std::string server_address, int server_port, DirectorResource *dir)
std::string server_address, int server_port, DirectorResource *dir, bool clone_bareos_socket)
#endif
{
utime_t heart_beat = 0;
Expand Down Expand Up @@ -225,10 +231,20 @@ bool connect_to_server(std::string console_name, std::string console_password,
}
success = !UA_sock->TlsEstablished();
}
std::string received_msg;
if (clone_bareos_socket) {
std::string orig_msg2("cloned-1234567890HALLO1234567890-cloned");
BareosSocket *UA_sock2 = UA_sock->clone();
UA_sock2->recv();
received_msg = UA_sock2->msg;
EXPECT_TRUE(orig_msg2.compare(received_msg) == 0);
UA_sock2->close();
delete UA_sock2;
}
std::string orig_msg("1234567890HALLO1234567890");
UA_sock->recv();
std::string msg(UA_sock->msg);
std::string orig("1234567890HALLO1234567890");
EXPECT_TRUE(orig.compare(msg) == 0);
received_msg = UA_sock->msg;
EXPECT_TRUE(orig_msg.compare(received_msg) == 0);
}
}
if (UA_sock) {
Expand Down Expand Up @@ -296,10 +312,10 @@ TEST(bsock, auth_works)

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons);
HOST, port, cons, false);

Dmsg0(10, "connecting to server\n");
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir));
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, false));

server_thread.join();
EXPECT_TRUE(future.get());
Expand Down Expand Up @@ -328,10 +344,10 @@ TEST(bsock, auth_works_with_different_names)

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons);
HOST, port, cons, false);

Dmsg0(10, "connecting to server\n");
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir));
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, false));

server_thread.join();
EXPECT_TRUE(future.get());
Expand Down Expand Up @@ -359,10 +375,10 @@ TEST(bsock, auth_fails_with_different_passwords)

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons);
HOST, port, cons, false);

Dmsg0(10, "connecting to server\n");
EXPECT_FALSE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir));
EXPECT_FALSE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, false));

server_thread.join();
EXPECT_FALSE(future.get());
Expand Down Expand Up @@ -391,15 +407,15 @@ TEST(bsock, auth_works_with_tls_psk)

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons);
HOST, port, cons, false);

Dmsg0(10, "connecting to server\n");

#if CLIENT_AS_A_THREAD
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir);
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir, false);
client_thread.join();
#else
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir));
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, false));
#endif

server_thread.join();
Expand All @@ -408,6 +424,47 @@ TEST(bsock, auth_works_with_tls_psk)
EXPECT_TRUE(future.get());
}

TEST(bsock, auth_works_with_tls_psk_cloned_socket)
{
port++;
std::promise<bool> promise;
std::future<bool> future = promise.get_future();

client_cons_name = "clientname";
client_cons_password = "verysecretpassword";

server_cons_name = client_cons_name;
server_cons_password = client_cons_password;

ConsoleResource *cons = CreateAndInitializeNewConsoleResource();
DirectorResource *dir = CreateAndInitializeNewDirectorResource();

InitForTest();

dir->tls_psk.enable = true;
dir->tls_cert.enable = true;
cons->tls_psk.enable = true;

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons, true); /* send data on cloned bareos socket */

Dmsg0(10, "connecting to server\n");

#if CLIENT_AS_A_THREAD
/* send data on cloned bareos socket */
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir, true);
client_thread.join();
#else
/* send data on cloned bareos socket */
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, true));
#endif

server_thread.join();

EXPECT_TRUE(cipher_server == cipher_client);
EXPECT_TRUE(future.get());
}

TEST(bsock, auth_fails_with_different_names_with_tls_psk)
{
Expand All @@ -432,15 +489,15 @@ TEST(bsock, auth_fails_with_different_names_with_tls_psk)

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons);
HOST, port, cons, false);

Dmsg0(10, "connecting to server\n");

#if CLIENT_AS_A_THREAD
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir);
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir, false);
client_thread.join();
#else
EXPECT_FALSE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir));
EXPECT_FALSE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, false));
#endif

server_thread.join();
Expand Down Expand Up @@ -472,15 +529,15 @@ TEST(bsock, auth_works_with_tls_cert)

Dmsg0(10, "starting listen thread...\n");
std::thread server_thread(start_bareos_server, &promise, server_cons_name, server_cons_password,
HOST, port, cons);
HOST, port, cons, false);

Dmsg0(10, "connecting to server\n");

#if CLIENT_AS_A_THREAD
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir);
std::thread client_thread(connect_to_server, client_cons_name, client_cons_password, HOST, port, dir, false);
client_thread.join();
#else
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir));
EXPECT_TRUE(connect_to_server(client_cons_name, client_cons_password, HOST, port, dir, false));
#endif

server_thread.join();
Expand Down

0 comments on commit ed57ed0

Please sign in to comment.