/src/qpdf/libqpdf/QPDFCryptoProvider.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include <qpdf/QPDFCryptoProvider.hh> |
2 | | |
3 | | #include <qpdf/QUtil.hh> |
4 | | #include <qpdf/qpdf-config.h> |
5 | | #include <stdexcept> |
6 | | |
7 | | #ifdef USE_CRYPTO_NATIVE |
8 | | # include <qpdf/QPDFCrypto_native.hh> |
9 | | #endif |
10 | | #ifdef USE_CRYPTO_GNUTLS |
11 | | # include <qpdf/QPDFCrypto_gnutls.hh> |
12 | | #endif |
13 | | #ifdef USE_CRYPTO_OPENSSL |
14 | | # include <qpdf/QPDFCrypto_openssl.hh> |
15 | | #endif |
16 | | |
17 | | std::shared_ptr<QPDFCryptoImpl> |
18 | | QPDFCryptoProvider::getImpl() |
19 | 335k | { |
20 | 335k | QPDFCryptoProvider& p = getInstance(); |
21 | 335k | if (p.m->default_provider.empty()) { |
22 | 0 | throw std::logic_error("QPDFCryptoProvider::getImpl called with no default provider."); |
23 | 0 | } |
24 | 335k | return p.getImpl_internal(p.m->default_provider); |
25 | 335k | } |
26 | | |
27 | | std::shared_ptr<QPDFCryptoImpl> |
28 | | QPDFCryptoProvider::getImpl(std::string const& name) |
29 | 0 | { |
30 | 0 | return getInstance().getImpl_internal(name); |
31 | 0 | } |
32 | | |
33 | | void |
34 | | QPDFCryptoProvider::registerImpl(std::string const& name, provider_fn f) |
35 | 0 | { |
36 | 0 | getInstance().registerImpl_internal(name, std::move(f)); |
37 | 0 | } |
38 | | |
39 | | void |
40 | | QPDFCryptoProvider::setDefaultProvider(std::string const& name) |
41 | 0 | { |
42 | 0 | getInstance().setDefaultProvider_internal(name); |
43 | 0 | } |
44 | | |
45 | | QPDFCryptoProvider::QPDFCryptoProvider() : |
46 | 1 | m(std::make_shared<Members>()) |
47 | 1 | { |
48 | 1 | #ifdef USE_CRYPTO_NATIVE |
49 | 1 | registerImpl_internal("native", std::make_shared<QPDFCrypto_native>); |
50 | 1 | #endif |
51 | | #ifdef USE_CRYPTO_GNUTLS |
52 | | registerImpl_internal("gnutls", std::make_shared<QPDFCrypto_gnutls>); |
53 | | #endif |
54 | | #ifdef USE_CRYPTO_OPENSSL |
55 | | registerImpl_internal("openssl", std::make_shared<QPDFCrypto_openssl>); |
56 | | #endif |
57 | 1 | std::string default_crypto; |
58 | 1 | if (!QUtil::get_env("QPDF_CRYPTO_PROVIDER", &default_crypto)) { |
59 | 1 | default_crypto = DEFAULT_CRYPTO; |
60 | 1 | } |
61 | 1 | setDefaultProvider_internal(default_crypto); |
62 | 1 | } |
63 | | |
64 | | QPDFCryptoProvider& |
65 | | QPDFCryptoProvider::getInstance() |
66 | 335k | { |
67 | 335k | static QPDFCryptoProvider instance; |
68 | 335k | return instance; |
69 | 335k | } |
70 | | |
71 | | std::shared_ptr<QPDFCryptoImpl> |
72 | | QPDFCryptoProvider::getImpl_internal(std::string const& name) const |
73 | 335k | { |
74 | 335k | auto iter = m->providers.find(name); |
75 | 335k | if (iter == m->providers.end()) { |
76 | 0 | throw std::logic_error( |
77 | 0 | "QPDFCryptoProvider requested unknown implementation \"" + name + "\""); |
78 | 0 | } |
79 | 335k | return m->providers[name](); |
80 | 335k | } |
81 | | |
82 | | void |
83 | | QPDFCryptoProvider::registerImpl_internal(std::string const& name, provider_fn f) |
84 | 1 | { |
85 | 1 | m->providers[name] = std::move(f); |
86 | 1 | } |
87 | | |
88 | | void |
89 | | QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name) |
90 | 1 | { |
91 | 1 | if (!m->providers.contains(name)) { |
92 | 0 | throw std::logic_error( |
93 | 0 | "QPDFCryptoProvider: request to set default provider to unknown implementation \"" + |
94 | 0 | name + "\""); |
95 | 0 | } |
96 | 1 | m->default_provider = name; |
97 | 1 | } |
98 | | |
99 | | std::set<std::string> |
100 | | QPDFCryptoProvider::getRegisteredImpls() |
101 | 0 | { |
102 | 0 | std::set<std::string> result; |
103 | 0 | QPDFCryptoProvider& p = getInstance(); |
104 | 0 | for (auto const& iter: p.m->providers) { |
105 | 0 | result.insert(iter.first); |
106 | 0 | } |
107 | 0 | return result; |
108 | 0 | } |
109 | | |
110 | | std::string |
111 | | QPDFCryptoProvider::getDefaultProvider() |
112 | 0 | { |
113 | 0 | return getInstance().m->default_provider; |
114 | 0 | } |