Loading plugins/media/media.cpp +13 −6 Original line number Diff line number Diff line Loading @@ -826,6 +826,8 @@ namespace blogi { void initPlugin(){ _mdbUrl = Args->config->getMediaDBUrl(); _mdbTlsVerify = Args->config->getMediaTlsVerify(); _mdbTrustPolicy.verifyPeer = _mdbTlsVerify; _loadStores(0); Loading @@ -841,10 +843,10 @@ namespace blogi { // the synchronous dispatch path. _mdbGetImagePool = std::make_unique<CheckoutPool<mediadb::Client>>( static_cast<size_t>(Args->maxthreads), [url = _mdbUrl]() { return std::make_unique<mediadb::Client>(url, false, false); }); [url = _mdbUrl, verify = _mdbTlsVerify]() { return std::make_unique<mediadb::Client>(url, verify, false); }); _mdbStreamPool = std::make_unique<CheckoutPool<libhttppp::HttpClient>>( static_cast<size_t>(Args->maxthreads), [this]() { return std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, 0); }); [this]() { return std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, 0, 60, _mdbTrustPolicy); }); for (int i = 0; i < Args->maxthreads; ++i) _dbAvailableIdx.push_back(i); Loading Loading @@ -1005,7 +1007,7 @@ namespace blogi { // returning it to the pool for reuse. std::cerr << "media: upstream GetStream failed, retrying with fresh connection" << std::endl; streamClient = CheckoutPool<libhttppp::HttpClient>::Handle( *_mdbStreamPool, std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, true)); *_mdbStreamPool, std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, true, 60, _mdbTrustPolicy)); try { dataResPtr = std::make_unique<libhttppp::HttpResponse>(streamClient->GetStream(dataReq)); } catch(std::exception &e2) { Loading Loading @@ -1670,7 +1672,7 @@ namespace blogi { void _ensureMdbReady(int tid, const std::string &token = ""){ if(!_mdb[tid]){ try { _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, false, false); _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, _mdbTlsVerify, false); } catch(std::exception &e) { std::cerr << "media: _ensureMdbReady: new Client failed: " << e.what() << std::endl; throw; Loading @@ -1683,7 +1685,7 @@ namespace blogi { // Connection broken — recreate client and retry std::cerr << "media: _ensureMdbReady: set_token failed, reconnecting: " << e.what() << std::endl; try { _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, false, false); _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, _mdbTlsVerify, false); _mdb[tid]->set_token(token); } catch(std::exception &e2) { std::cerr << "media: _ensureMdbReady: reconnect failed: " << e2.what() << std::endl; Loading @@ -1693,7 +1695,7 @@ namespace blogi { } catch(...) { std::cerr << "media: _ensureMdbReady: set_token unknown error, reconnecting" << std::endl; try { _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, false, false); _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, _mdbTlsVerify, false); _mdb[tid]->set_token(token); } catch(...) { _mdb[tid].reset(); Loading Loading @@ -1919,6 +1921,11 @@ namespace blogi { // ---- member state ---- std::string _mdbUrl; // MEDIA_TLS_VERIFY-controlled; see DomainConfig::mediaTlsVerify. Kept as a member // so all mediadb::Client/HttpClient (re)construction sites (initPlugin, the // retry-with-fresh-connection path, and _ensureMdbReady) apply the same policy. bool _mdbTlsVerify = false; netplus::TlsTrustPolicy _mdbTrustPolicy; std::vector<std::string> _mdbStores; std::map<std::string, std::string> _mdbStoreIds; std::vector<std::unique_ptr<mediadb::Client>> _mdb; Loading src/auth.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ blogi::Auth::Auth(std::vector<std::unique_ptr<dbpp::ReplicatedDatabase>> &pcon,c authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authdb::client::Client clt(authcon); Loading Loading @@ -105,6 +106,7 @@ void blogi::Auth::_doLogin(const AuthSource &src, const char *username, const ch authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authdb::client::Client clt(authcon); Loading Loading @@ -257,6 +259,7 @@ bool blogi::Auth::isLoggedIn(const int tid,const uuid::uuid &authid){ authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authcon.setSessionID(authid); std::unique_ptr<authdb::client::Client> clt; Loading Loading @@ -307,6 +310,7 @@ std::string blogi::Auth::getAuthorId(const int tid, const uuid::uuid &authid) { authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authcon.setSessionID(authid); authdb::client::Client clt(authcon); Loading src/blogi.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -1206,6 +1206,7 @@ void blogi::Blogi::logoutPage(libhttppp::HttpRequest &curreq, const int tid, con authcon.setUrl(PlgArgs->config->getAuthUrl()); authcon.setClientName(PlgArgs->config->getClientName()); authcon.setClientSecret(PlgArgs->config->getClientSecret()); authcon.setTlsVerify(PlgArgs->config->getAuthTlsVerify()); authcon.setSessionID(sessid); authdb::client::Client clt(authcon); Loading src/conf.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,10 @@ blogi::Config::Config(const std::string &path) : confplus::Config(path), _Config try { dc.authUrl = getValue(getKey((base + "/AUTH_URL").c_str()), 0); } catch(...) {} try { dc.clientName = getValue(getKey((base + "/AUTH_CLIENTNAME").c_str()), 0); } catch(...) {} try { dc.clientSecret = getValue(getKey((base + "/AUTH_CLIENTSECRET").c_str()), 0); } catch(...) {} try { std::string v = getValue(getKey((base + "/AUTH_TLS_VERIFY").c_str()), 0); dc.authTlsVerify = !(v == "false" || v == "0" || v == "no"); } catch(...) {} try { dc.siteUrl = getValue(getKey((base + "/URL").c_str()), 0); } catch(...) {} dc.siteUrls.clear(); if (!dc.siteUrl.empty()) dc.siteUrls.push_back(dc.siteUrl); Loading @@ -121,6 +125,10 @@ blogi::Config::Config(const std::string &path) : confplus::Config(path), _Config try { dc.templatePath = getValue(getKey((base + "/TEMPLATE").c_str()), 0); } catch(...) {} try { dc.startPage = getValue(getKey((base + "/STARTPAGE").c_str()), 0); } catch(...) {} try { dc.mediaDBUrl = getValue(getKey((base + "/MEDIA_URL").c_str()), 0); } catch(...) {} try { std::string v = getValue(getKey((base + "/MEDIA_TLS_VERIFY").c_str()), 0); dc.mediaTlsVerify = (v == "true" || v == "1" || v == "yes"); } catch(...) {} try { dc.tmpDir = getValue(getKey((base + "/TMPDIR").c_str()), 0); } catch(...) { dc.tmpDir = "/tmp/blogi"; } try { Loading @@ -140,6 +148,7 @@ blogi::Config::Config(const std::string &path) : confplus::Config(path), _Config src.url = dc.authUrl; src.clientName = dc.clientName; src.clientSecret = dc.clientSecret; src.tlsVerify = dc.authTlsVerify; src.domain = dc.names[0]; dc.authSources.push_back(std::move(src)); } Loading @@ -162,6 +171,7 @@ void blogi::Config::applyDomain(const DomainConfig &dc){ _AuthUrl = dc.authUrl; _ClientName = dc.clientName; _ClientSecret = dc.clientSecret; _AuthTlsVerify = dc.authTlsVerify; _AuthSources = dc.authSources; _HttpUrl = dc.siteUrl; _HttpUrls = dc.siteUrls; Loading @@ -172,6 +182,7 @@ void blogi::Config::applyDomain(const DomainConfig &dc){ _StartPage = dc.startPage; _PlgDir = dc.plgDirs; _MediaDBUrl = dc.mediaDBUrl; _MediaTlsVerify = dc.mediaTlsVerify; _TmpDir = dc.tmpDir; } Loading Loading @@ -220,6 +231,10 @@ const std::string & blogi::Config::getClientSecret() const { return _ClientSecret; } bool blogi::Config::getAuthTlsVerify() const { return _AuthTlsVerify; } const std::string & blogi::Config::gethttpaddr() const { return _HttpBind; } Loading Loading @@ -273,6 +288,10 @@ const std::string & blogi::Config::getMediaDBUrl() const{ return _MediaDBUrl; } bool blogi::Config::getMediaTlsVerify() const { return _MediaTlsVerify; } size_t blogi::Config::getAuthSourceCount() const { return _AuthSources.size(); } Loading src/conf.h +12 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ namespace blogi { std::string clientName; std::string clientSecret; std::string domain; // See DomainConfig::authTlsVerify. bool tlsVerify = true; }; struct ReplicaConfig { Loading @@ -59,6 +61,9 @@ namespace blogi { std::string authUrl; std::string clientName; std::string clientSecret; // Peer verification for the authdb connection (AUTH_TLS_VERIFY). Defaults to on; // set false for an authdb endpoint reached by bare IP whose cert SAN doesn't cover it. bool authTlsVerify = true; std::vector<AuthSource> authSources; std::string siteUrl; std::vector<std::string> siteUrls; Loading @@ -67,6 +72,9 @@ namespace blogi { std::string startPage; std::vector<std::string> plgDirs; std::string mediaDBUrl; // Peer verification for the mediadb connection (MEDIA_TLS_VERIFY). Defaults to off, // matching mediadb's typical same-host/self-signed deployment. bool mediaTlsVerify = false; std::string tmpDir; const std::string buildurl(const std::string &url) const; Loading Loading @@ -99,6 +107,7 @@ namespace blogi { const std::string &getAuthUrl() const; const std::string &getClientName() const; const std::string &getClientSecret() const; bool getAuthTlsVerify() const; size_t getAuthSourceCount() const; const AuthSource &getAuthSource(size_t idx) const; Loading @@ -115,6 +124,7 @@ namespace blogi { const std::string &getTmpDir() const; const std::string &getMediaDBUrl() const; bool getMediaTlsVerify() const; // Multi-domain support size_t getDomainCount() const; Loading @@ -140,6 +150,7 @@ namespace blogi { std::string _AuthUrl; std::string _ClientName; std::string _ClientSecret; bool _AuthTlsVerify = true; std::vector<AuthSource> _AuthSources; std::string _HttpHost; std::string _HttpBind; Loading @@ -155,6 +166,7 @@ namespace blogi { std::string _SSLPassword; std::string _TmpDir; std::string _MediaDBUrl; bool _MediaTlsVerify = false; std::vector<DomainConfig> _Domains; }; Loading Loading
plugins/media/media.cpp +13 −6 Original line number Diff line number Diff line Loading @@ -826,6 +826,8 @@ namespace blogi { void initPlugin(){ _mdbUrl = Args->config->getMediaDBUrl(); _mdbTlsVerify = Args->config->getMediaTlsVerify(); _mdbTrustPolicy.verifyPeer = _mdbTlsVerify; _loadStores(0); Loading @@ -841,10 +843,10 @@ namespace blogi { // the synchronous dispatch path. _mdbGetImagePool = std::make_unique<CheckoutPool<mediadb::Client>>( static_cast<size_t>(Args->maxthreads), [url = _mdbUrl]() { return std::make_unique<mediadb::Client>(url, false, false); }); [url = _mdbUrl, verify = _mdbTlsVerify]() { return std::make_unique<mediadb::Client>(url, verify, false); }); _mdbStreamPool = std::make_unique<CheckoutPool<libhttppp::HttpClient>>( static_cast<size_t>(Args->maxthreads), [this]() { return std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, 0); }); [this]() { return std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, 0, 60, _mdbTrustPolicy); }); for (int i = 0; i < Args->maxthreads; ++i) _dbAvailableIdx.push_back(i); Loading Loading @@ -1005,7 +1007,7 @@ namespace blogi { // returning it to the pool for reuse. std::cerr << "media: upstream GetStream failed, retrying with fresh connection" << std::endl; streamClient = CheckoutPool<libhttppp::HttpClient>::Handle( *_mdbStreamPool, std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, true)); *_mdbStreamPool, std::make_unique<libhttppp::HttpClient>(*_mdbHttpUrl, true, 60, _mdbTrustPolicy)); try { dataResPtr = std::make_unique<libhttppp::HttpResponse>(streamClient->GetStream(dataReq)); } catch(std::exception &e2) { Loading Loading @@ -1670,7 +1672,7 @@ namespace blogi { void _ensureMdbReady(int tid, const std::string &token = ""){ if(!_mdb[tid]){ try { _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, false, false); _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, _mdbTlsVerify, false); } catch(std::exception &e) { std::cerr << "media: _ensureMdbReady: new Client failed: " << e.what() << std::endl; throw; Loading @@ -1683,7 +1685,7 @@ namespace blogi { // Connection broken — recreate client and retry std::cerr << "media: _ensureMdbReady: set_token failed, reconnecting: " << e.what() << std::endl; try { _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, false, false); _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, _mdbTlsVerify, false); _mdb[tid]->set_token(token); } catch(std::exception &e2) { std::cerr << "media: _ensureMdbReady: reconnect failed: " << e2.what() << std::endl; Loading @@ -1693,7 +1695,7 @@ namespace blogi { } catch(...) { std::cerr << "media: _ensureMdbReady: set_token unknown error, reconnecting" << std::endl; try { _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, false, false); _mdb[tid] = std::make_unique<mediadb::Client>(_mdbUrl, _mdbTlsVerify, false); _mdb[tid]->set_token(token); } catch(...) { _mdb[tid].reset(); Loading Loading @@ -1919,6 +1921,11 @@ namespace blogi { // ---- member state ---- std::string _mdbUrl; // MEDIA_TLS_VERIFY-controlled; see DomainConfig::mediaTlsVerify. Kept as a member // so all mediadb::Client/HttpClient (re)construction sites (initPlugin, the // retry-with-fresh-connection path, and _ensureMdbReady) apply the same policy. bool _mdbTlsVerify = false; netplus::TlsTrustPolicy _mdbTrustPolicy; std::vector<std::string> _mdbStores; std::map<std::string, std::string> _mdbStoreIds; std::vector<std::unique_ptr<mediadb::Client>> _mdb; Loading
src/auth.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ blogi::Auth::Auth(std::vector<std::unique_ptr<dbpp::ReplicatedDatabase>> &pcon,c authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authdb::client::Client clt(authcon); Loading Loading @@ -105,6 +106,7 @@ void blogi::Auth::_doLogin(const AuthSource &src, const char *username, const ch authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authdb::client::Client clt(authcon); Loading Loading @@ -257,6 +259,7 @@ bool blogi::Auth::isLoggedIn(const int tid,const uuid::uuid &authid){ authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authcon.setSessionID(authid); std::unique_ptr<authdb::client::Client> clt; Loading Loading @@ -307,6 +310,7 @@ std::string blogi::Auth::getAuthorId(const int tid, const uuid::uuid &authid) { authcon.setUrl(src.url); authcon.setClientName(src.clientName); authcon.setClientSecret(src.clientSecret); authcon.setTlsVerify(src.tlsVerify); authcon.setSessionID(authid); authdb::client::Client clt(authcon); Loading
src/blogi.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -1206,6 +1206,7 @@ void blogi::Blogi::logoutPage(libhttppp::HttpRequest &curreq, const int tid, con authcon.setUrl(PlgArgs->config->getAuthUrl()); authcon.setClientName(PlgArgs->config->getClientName()); authcon.setClientSecret(PlgArgs->config->getClientSecret()); authcon.setTlsVerify(PlgArgs->config->getAuthTlsVerify()); authcon.setSessionID(sessid); authdb::client::Client clt(authcon); Loading
src/conf.cpp +19 −0 Original line number Diff line number Diff line Loading @@ -113,6 +113,10 @@ blogi::Config::Config(const std::string &path) : confplus::Config(path), _Config try { dc.authUrl = getValue(getKey((base + "/AUTH_URL").c_str()), 0); } catch(...) {} try { dc.clientName = getValue(getKey((base + "/AUTH_CLIENTNAME").c_str()), 0); } catch(...) {} try { dc.clientSecret = getValue(getKey((base + "/AUTH_CLIENTSECRET").c_str()), 0); } catch(...) {} try { std::string v = getValue(getKey((base + "/AUTH_TLS_VERIFY").c_str()), 0); dc.authTlsVerify = !(v == "false" || v == "0" || v == "no"); } catch(...) {} try { dc.siteUrl = getValue(getKey((base + "/URL").c_str()), 0); } catch(...) {} dc.siteUrls.clear(); if (!dc.siteUrl.empty()) dc.siteUrls.push_back(dc.siteUrl); Loading @@ -121,6 +125,10 @@ blogi::Config::Config(const std::string &path) : confplus::Config(path), _Config try { dc.templatePath = getValue(getKey((base + "/TEMPLATE").c_str()), 0); } catch(...) {} try { dc.startPage = getValue(getKey((base + "/STARTPAGE").c_str()), 0); } catch(...) {} try { dc.mediaDBUrl = getValue(getKey((base + "/MEDIA_URL").c_str()), 0); } catch(...) {} try { std::string v = getValue(getKey((base + "/MEDIA_TLS_VERIFY").c_str()), 0); dc.mediaTlsVerify = (v == "true" || v == "1" || v == "yes"); } catch(...) {} try { dc.tmpDir = getValue(getKey((base + "/TMPDIR").c_str()), 0); } catch(...) { dc.tmpDir = "/tmp/blogi"; } try { Loading @@ -140,6 +148,7 @@ blogi::Config::Config(const std::string &path) : confplus::Config(path), _Config src.url = dc.authUrl; src.clientName = dc.clientName; src.clientSecret = dc.clientSecret; src.tlsVerify = dc.authTlsVerify; src.domain = dc.names[0]; dc.authSources.push_back(std::move(src)); } Loading @@ -162,6 +171,7 @@ void blogi::Config::applyDomain(const DomainConfig &dc){ _AuthUrl = dc.authUrl; _ClientName = dc.clientName; _ClientSecret = dc.clientSecret; _AuthTlsVerify = dc.authTlsVerify; _AuthSources = dc.authSources; _HttpUrl = dc.siteUrl; _HttpUrls = dc.siteUrls; Loading @@ -172,6 +182,7 @@ void blogi::Config::applyDomain(const DomainConfig &dc){ _StartPage = dc.startPage; _PlgDir = dc.plgDirs; _MediaDBUrl = dc.mediaDBUrl; _MediaTlsVerify = dc.mediaTlsVerify; _TmpDir = dc.tmpDir; } Loading Loading @@ -220,6 +231,10 @@ const std::string & blogi::Config::getClientSecret() const { return _ClientSecret; } bool blogi::Config::getAuthTlsVerify() const { return _AuthTlsVerify; } const std::string & blogi::Config::gethttpaddr() const { return _HttpBind; } Loading Loading @@ -273,6 +288,10 @@ const std::string & blogi::Config::getMediaDBUrl() const{ return _MediaDBUrl; } bool blogi::Config::getMediaTlsVerify() const { return _MediaTlsVerify; } size_t blogi::Config::getAuthSourceCount() const { return _AuthSources.size(); } Loading
src/conf.h +12 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ namespace blogi { std::string clientName; std::string clientSecret; std::string domain; // See DomainConfig::authTlsVerify. bool tlsVerify = true; }; struct ReplicaConfig { Loading @@ -59,6 +61,9 @@ namespace blogi { std::string authUrl; std::string clientName; std::string clientSecret; // Peer verification for the authdb connection (AUTH_TLS_VERIFY). Defaults to on; // set false for an authdb endpoint reached by bare IP whose cert SAN doesn't cover it. bool authTlsVerify = true; std::vector<AuthSource> authSources; std::string siteUrl; std::vector<std::string> siteUrls; Loading @@ -67,6 +72,9 @@ namespace blogi { std::string startPage; std::vector<std::string> plgDirs; std::string mediaDBUrl; // Peer verification for the mediadb connection (MEDIA_TLS_VERIFY). Defaults to off, // matching mediadb's typical same-host/self-signed deployment. bool mediaTlsVerify = false; std::string tmpDir; const std::string buildurl(const std::string &url) const; Loading Loading @@ -99,6 +107,7 @@ namespace blogi { const std::string &getAuthUrl() const; const std::string &getClientName() const; const std::string &getClientSecret() const; bool getAuthTlsVerify() const; size_t getAuthSourceCount() const; const AuthSource &getAuthSource(size_t idx) const; Loading @@ -115,6 +124,7 @@ namespace blogi { const std::string &getTmpDir() const; const std::string &getMediaDBUrl() const; bool getMediaTlsVerify() const; // Multi-domain support size_t getDomainCount() const; Loading @@ -140,6 +150,7 @@ namespace blogi { std::string _AuthUrl; std::string _ClientName; std::string _ClientSecret; bool _AuthTlsVerify = true; std::vector<AuthSource> _AuthSources; std::string _HttpHost; std::string _HttpBind; Loading @@ -155,6 +166,7 @@ namespace blogi { std::string _SSLPassword; std::string _TmpDir; std::string _MediaDBUrl; bool _MediaTlsVerify = false; std::vector<DomainConfig> _Domains; }; Loading