File: tls_system_trust_store.cpp

package info (click to toggle)
libfilezilla 0.54.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,504 kB
  • sloc: cpp: 31,105; sh: 4,241; makefile: 375; xml: 37
file content (54 lines) | stat: -rw-r--r-- 1,111 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "libfilezilla/tls_system_trust_store.hpp"
#include "tls_system_trust_store_impl.hpp"

namespace fz {

tls_system_trust_store_impl::tls_system_trust_store_impl(thread_pool& pool)
{
	task_ = pool.spawn([this]() {
		gnutls_certificate_credentials_t cred{};

		if (gnutls_certificate_allocate_credentials(&cred) >= 0) {
			if (gnutls_certificate_set_x509_system_trust(cred) < 0) {
				gnutls_certificate_free_credentials(cred);
				cred = nullptr;
			}
		}

		scoped_lock l(mtx_);
		credentials_ = cred;
		cond_.signal(l);
	});
}

tls_system_trust_store_impl::~tls_system_trust_store_impl()
{
	task_.join();

	if (credentials_) {
		gnutls_certificate_free_credentials(credentials_);
	}
}

std::tuple<gnutls_certificate_credentials_t, scoped_lock> tls_system_trust_store_impl::lease()
{
	scoped_lock l(mtx_);
	if (task_) {
		cond_.wait(l);
		task_.join();
	}

	return std::make_tuple(credentials_, std::move(l));
}


tls_system_trust_store::tls_system_trust_store(thread_pool& pool)
	: impl_(std::make_unique<tls_system_trust_store_impl>(pool))
{
}

tls_system_trust_store::~tls_system_trust_store()
{
}

}