refactor: tr session.blocklist (#2147)

* refactor: tr_session.blocklist
This commit is contained in:
Charles Kerr 2021-11-13 19:09:33 -06:00 committed by GitHub
parent 0be95b5074
commit 7ff6756ac5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 93 additions and 44 deletions

View File

@ -1604,7 +1604,7 @@ static char const* blocklistUpdate(
tr_variant* /*args_out*/,
struct tr_rpc_idle_data* idle_data)
{
tr_webRun(session, session->blocklist_url, gotNewBlocklist, idle_data);
tr_webRun(session, session->blocklistUrl().c_str(), gotNewBlocklist, idle_data);
return nullptr;
}
@ -1871,7 +1871,6 @@ static char const* sessionSet(
auto boolVal = bool{};
auto d = double{};
auto i = int64_t{};
char const* str = nullptr;
auto sv = std::string_view{};
if (tr_variantDictFindInt(args_in, TR_KEY_cache_size_mb, &i))
@ -1916,12 +1915,12 @@ static char const* sessionSet(
if (tr_variantDictFindBool(args_in, TR_KEY_blocklist_enabled, &boolVal))
{
tr_blocklistSetEnabled(session, boolVal);
session->useBlocklist(boolVal);
}
if (tr_variantDictFindStr(args_in, TR_KEY_blocklist_url, &str, nullptr))
if (tr_variantDictFindStrView(args_in, TR_KEY_blocklist_url, &sv))
{
tr_blocklistSetURL(session, str);
session->setBlocklistUrl(sv);
}
if (!std::empty(download_dir))
@ -2209,11 +2208,11 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
break;
case TR_KEY_blocklist_enabled:
tr_variantDictAddBool(d, key, tr_blocklistIsEnabled(s));
tr_variantDictAddBool(d, key, s->useBlocklist());
break;
case TR_KEY_blocklist_url:
tr_variantDictAddStr(d, key, tr_blocklistGetURL(s));
tr_variantDictAddStr(d, key, s->blocklistUrl());
break;
case TR_KEY_cache_size_mb:
@ -2229,7 +2228,7 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
break;
case TR_KEY_download_dir:
tr_variantDictAddStr(d, key, tr_sessionGetDownloadDir(s));
tr_variantDictAddStr(d, key, s->downloadDir());
break;
case TR_KEY_download_dir_free_space:
@ -2253,11 +2252,11 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
break;
case TR_KEY_incomplete_dir:
tr_variantDictAddStr(d, key, tr_sessionGetIncompleteDir(s));
tr_variantDictAddStr(d, key, s->incompleteDir());
break;
case TR_KEY_incomplete_dir_enabled:
tr_variantDictAddBool(d, key, tr_sessionIsIncompleteDirEnabled(s));
tr_variantDictAddBool(d, key, s->useIncompleteDir());
break;
case TR_KEY_pex_enabled:
@ -2441,8 +2440,9 @@ static char const* freeSpace(
tr_variant* args_out,
tr_rpc_idle_data* /*idle_data*/)
{
char const* path = nullptr;
if (!tr_variantDictFindStr(args_in, TR_KEY_path, &path, nullptr))
auto path = std::string_view{};
if (!tr_variantDictFindStrView(args_in, TR_KEY_path, &path))
{
return "directory path argument is missing";
}
@ -2460,11 +2460,7 @@ static char const* freeSpace(
errno = old_errno;
/* response */
if (path != nullptr)
{
tr_variantDictAddStr(args_out, TR_KEY_path, path);
}
tr_variantDictAddStr(args_out, TR_KEY_path, path);
tr_variantDictAddInt(args_out, TR_KEY_size_bytes, dir_space.free);
tr_variantDictAddInt(args_out, TR_KEY_total_size, dir_space.total);
return err;

View File

@ -337,7 +337,7 @@ void tr_sessionGetDefaultSettings(tr_variant* d)
tr_variantDictReserve(d, 69);
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, false);
tr_variantDictAddStr(d, TR_KEY_blocklist_url, "http://www.example.com/blocklist");
tr_variantDictAddStr(d, TR_KEY_blocklist_url, "http://www.example.com/blocklist"sv);
tr_variantDictAddInt(d, TR_KEY_cache_size_mb, DefaultCacheSizeMB);
tr_variantDictAddBool(d, TR_KEY_dht_enabled, true);
tr_variantDictAddBool(d, TR_KEY_utp_enabled, true);
@ -412,8 +412,8 @@ void tr_sessionGetSettings(tr_session* s, tr_variant* d)
TR_ASSERT(tr_variantIsDict(d));
tr_variantDictReserve(d, 68);
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, tr_blocklistIsEnabled(s));
tr_variantDictAddStr(d, TR_KEY_blocklist_url, tr_blocklistGetURL(s));
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, s->useBlocklist());
tr_variantDictAddStr(d, TR_KEY_blocklist_url, s->blocklistUrl());
tr_variantDictAddInt(d, TR_KEY_cache_size_mb, tr_sessionGetCacheLimit_MB(s));
tr_variantDictAddBool(d, TR_KEY_dht_enabled, s->isDHTEnabled);
tr_variantDictAddBool(d, TR_KEY_utp_enabled, s->isUTPEnabled);
@ -867,12 +867,12 @@ static void sessionSetImpl(void* vdata)
if (tr_variantDictFindBool(settings, TR_KEY_blocklist_enabled, &boolVal))
{
tr_blocklistSetEnabled(session, boolVal);
session->useBlocklist(boolVal);
}
if (tr_variantDictFindStr(settings, TR_KEY_blocklist_url, &strVal, nullptr))
if (tr_variantDictFindStrView(settings, TR_KEY_blocklist_url, &sv))
{
tr_blocklistSetURL(session, strVal);
session->setBlocklistUrl(sv);
}
if (tr_variantDictFindBool(settings, TR_KEY_start_added_torrents, &boolVal))
@ -2053,7 +2053,6 @@ void tr_sessionClose(tr_session* session)
tr_free(session->configDir);
tr_free(session->resumeDir);
tr_free(session->torrentDir);
tr_free(session->blocklist_url);
tr_free(session->peer_congestion_algorithm);
delete session;
}
@ -2343,7 +2342,7 @@ static bool tr_stringEndsWith(char const* strval, char const* end)
static void loadBlocklists(tr_session* session)
{
auto loadme = std::unordered_set<std::string>{};
auto const isEnabled = session->isBlocklistEnabled;
auto const isEnabled = session->useBlocklist();
/* walk the blocklist directory... */
auto const dirname = tr_strvPath(session->configDir, "blocklists"sv);
@ -2460,20 +2459,24 @@ bool tr_blocklistIsEnabled(tr_session const* session)
{
TR_ASSERT(tr_isSession(session));
return session->isBlocklistEnabled;
return session->useBlocklist();
}
void tr_session::useBlocklist(bool enabled)
{
this->blocklist_enabled_ = enabled;
std::for_each(
std::begin(blocklists),
std::end(blocklists),
[enabled](auto* blocklist) { tr_blocklistFileSetEnabled(blocklist, enabled); });
}
void tr_blocklistSetEnabled(tr_session* session, bool enabled)
{
TR_ASSERT(tr_isSession(session));
session->isBlocklistEnabled = enabled;
auto& src = session->blocklists;
std::for_each(
std::begin(src),
std::end(src),
[enabled](auto* blocklist) { tr_blocklistFileSetEnabled(blocklist, enabled); });
session->useBlocklist(enabled);
}
bool tr_blocklistExists(tr_session const* session)
@ -2498,7 +2501,7 @@ int tr_blocklistSetContent(tr_session* session, char const* contentFilename)
if (it == std::end(src))
{
auto path = tr_strvJoin(session->configDir, "blocklists"sv, name);
b = tr_blocklistFileNew(path.c_str(), session->isBlocklistEnabled);
b = tr_blocklistFileNew(path.c_str(), session->useBlocklist());
src.push_back(b);
}
else
@ -2523,16 +2526,12 @@ bool tr_sessionIsAddressBlocked(tr_session const* session, tr_address const* add
void tr_blocklistSetURL(tr_session* session, char const* url)
{
if (session->blocklist_url != url)
{
tr_free(session->blocklist_url);
session->blocklist_url = tr_strdup(url);
}
session->setBlocklistUrl(url ? url : "");
}
char const* tr_blocklistGetURL(tr_session const* session)
{
return session->blocklist_url;
return session->blocklistUrl().c_str();
}
/***

View File

@ -131,6 +131,8 @@ struct CaseInsensitiveStringCompare // case-insensitive string compare
struct tr_session
{
public:
// download dir
std::string const& downloadDir() const
{
return download_dir_;
@ -141,6 +143,8 @@ public:
download_dir_ = dir;
}
// incomplete dir
std::string const& incompleteDir() const
{
return incomplete_dir_;
@ -161,6 +165,8 @@ public:
incomplete_dir_enabled_ = enabled;
}
// scripts
void useScript(TrScript i, bool enabled)
{
scripts_enabled_[i] = enabled;
@ -181,13 +187,31 @@ public:
return scripts_[i];
}
// blocklist
bool useBlocklist() const
{
return blocklist_enabled_;
}
void useBlocklist(bool enabled);
std::string const& blocklistUrl() const
{
return blocklist_url_;
}
void setBlocklistUrl(std::string_view url)
{
blocklist_url_ = url;
}
public:
bool isPortRandom;
bool isPexEnabled;
bool isDHTEnabled;
bool isUTPEnabled;
bool isLPDEnabled;
bool isBlocklistEnabled;
bool isPrefetchEnabled;
bool isClosing;
bool isClosed;
@ -268,8 +292,6 @@ public:
char* resumeDir;
char* torrentDir;
char* blocklist_url;
std::list<tr_blocklistFile*> blocklists;
struct tr_peerMgr* peerMgr;
struct tr_shared* shared;
@ -307,10 +329,12 @@ public:
private:
std::array<std::string, TR_SCRIPT_N_TYPES> scripts_;
std::string incomplete_dir_;
std::string blocklist_url_;
std::string download_dir_;
std::string incomplete_dir_;
std::array<bool, TR_SCRIPT_N_TYPES> scripts_enabled_;
bool blocklist_enabled_ = false;
bool incomplete_dir_enabled_ = false;
};

View File

@ -110,6 +110,36 @@ TEST_F(SessionTest, properties)
EXPECT_EQ(value, session->useIncompleteDir());
EXPECT_EQ(value, tr_sessionIsIncompleteDirEnabled(session));
}
// blocklist url
for (auto const& value : { "foo"sv, "bar"sv, ""sv })
{
session->setBlocklistUrl(value);
EXPECT_EQ(value, session->blocklistUrl());
EXPECT_EQ(value, tr_blocklistGetURL(session));
tr_blocklistSetURL(session, std::string(value).c_str());
EXPECT_EQ(value, session->blocklistUrl());
EXPECT_EQ(value, tr_blocklistGetURL(session));
}
tr_blocklistSetURL(session, nullptr);
EXPECT_EQ(""sv, session->blocklistUrl());
EXPECT_EQ(""sv, tr_blocklistGetURL(session));
// blocklist enabled
for (auto const value : { true, false })
{
session->useBlocklist(value);
EXPECT_EQ(value, session->useBlocklist());
EXPECT_EQ(value, tr_blocklistIsEnabled(session));
tr_sessionSetIncompleteDirEnabled(session, value);
EXPECT_EQ(value, session->useBlocklist());
EXPECT_EQ(value, tr_blocklistIsEnabled(session));
}
}
TEST_F(SessionTest, peerId)