refactor: tr session.blocklist (#2147)
* refactor: tr_session.blocklist
This commit is contained in:
parent
0be95b5074
commit
7ff6756ac5
|
@ -1604,7 +1604,7 @@ static char const* blocklistUpdate(
|
||||||
tr_variant* /*args_out*/,
|
tr_variant* /*args_out*/,
|
||||||
struct tr_rpc_idle_data* idle_data)
|
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;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1871,7 +1871,6 @@ static char const* sessionSet(
|
||||||
auto boolVal = bool{};
|
auto boolVal = bool{};
|
||||||
auto d = double{};
|
auto d = double{};
|
||||||
auto i = int64_t{};
|
auto i = int64_t{};
|
||||||
char const* str = nullptr;
|
|
||||||
auto sv = std::string_view{};
|
auto sv = std::string_view{};
|
||||||
|
|
||||||
if (tr_variantDictFindInt(args_in, TR_KEY_cache_size_mb, &i))
|
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))
|
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))
|
if (!std::empty(download_dir))
|
||||||
|
@ -2209,11 +2208,11 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_blocklist_enabled:
|
case TR_KEY_blocklist_enabled:
|
||||||
tr_variantDictAddBool(d, key, tr_blocklistIsEnabled(s));
|
tr_variantDictAddBool(d, key, s->useBlocklist());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_blocklist_url:
|
case TR_KEY_blocklist_url:
|
||||||
tr_variantDictAddStr(d, key, tr_blocklistGetURL(s));
|
tr_variantDictAddStr(d, key, s->blocklistUrl());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_cache_size_mb:
|
case TR_KEY_cache_size_mb:
|
||||||
|
@ -2229,7 +2228,7 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_download_dir:
|
case TR_KEY_download_dir:
|
||||||
tr_variantDictAddStr(d, key, tr_sessionGetDownloadDir(s));
|
tr_variantDictAddStr(d, key, s->downloadDir());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_download_dir_free_space:
|
case TR_KEY_download_dir_free_space:
|
||||||
|
@ -2253,11 +2252,11 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_incomplete_dir:
|
case TR_KEY_incomplete_dir:
|
||||||
tr_variantDictAddStr(d, key, tr_sessionGetIncompleteDir(s));
|
tr_variantDictAddStr(d, key, s->incompleteDir());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_incomplete_dir_enabled:
|
case TR_KEY_incomplete_dir_enabled:
|
||||||
tr_variantDictAddBool(d, key, tr_sessionIsIncompleteDirEnabled(s));
|
tr_variantDictAddBool(d, key, s->useIncompleteDir());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR_KEY_pex_enabled:
|
case TR_KEY_pex_enabled:
|
||||||
|
@ -2441,8 +2440,9 @@ static char const* freeSpace(
|
||||||
tr_variant* args_out,
|
tr_variant* args_out,
|
||||||
tr_rpc_idle_data* /*idle_data*/)
|
tr_rpc_idle_data* /*idle_data*/)
|
||||||
{
|
{
|
||||||
char const* path = nullptr;
|
auto path = std::string_view{};
|
||||||
if (!tr_variantDictFindStr(args_in, TR_KEY_path, &path, nullptr))
|
|
||||||
|
if (!tr_variantDictFindStrView(args_in, TR_KEY_path, &path))
|
||||||
{
|
{
|
||||||
return "directory path argument is missing";
|
return "directory path argument is missing";
|
||||||
}
|
}
|
||||||
|
@ -2460,11 +2460,7 @@ static char const* freeSpace(
|
||||||
errno = old_errno;
|
errno = old_errno;
|
||||||
|
|
||||||
/* response */
|
/* 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_size_bytes, dir_space.free);
|
||||||
tr_variantDictAddInt(args_out, TR_KEY_total_size, dir_space.total);
|
tr_variantDictAddInt(args_out, TR_KEY_total_size, dir_space.total);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -337,7 +337,7 @@ void tr_sessionGetDefaultSettings(tr_variant* d)
|
||||||
|
|
||||||
tr_variantDictReserve(d, 69);
|
tr_variantDictReserve(d, 69);
|
||||||
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, false);
|
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_variantDictAddInt(d, TR_KEY_cache_size_mb, DefaultCacheSizeMB);
|
||||||
tr_variantDictAddBool(d, TR_KEY_dht_enabled, true);
|
tr_variantDictAddBool(d, TR_KEY_dht_enabled, true);
|
||||||
tr_variantDictAddBool(d, TR_KEY_utp_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_ASSERT(tr_variantIsDict(d));
|
||||||
|
|
||||||
tr_variantDictReserve(d, 68);
|
tr_variantDictReserve(d, 68);
|
||||||
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, tr_blocklistIsEnabled(s));
|
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, s->useBlocklist());
|
||||||
tr_variantDictAddStr(d, TR_KEY_blocklist_url, tr_blocklistGetURL(s));
|
tr_variantDictAddStr(d, TR_KEY_blocklist_url, s->blocklistUrl());
|
||||||
tr_variantDictAddInt(d, TR_KEY_cache_size_mb, tr_sessionGetCacheLimit_MB(s));
|
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_dht_enabled, s->isDHTEnabled);
|
||||||
tr_variantDictAddBool(d, TR_KEY_utp_enabled, s->isUTPEnabled);
|
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))
|
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))
|
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->configDir);
|
||||||
tr_free(session->resumeDir);
|
tr_free(session->resumeDir);
|
||||||
tr_free(session->torrentDir);
|
tr_free(session->torrentDir);
|
||||||
tr_free(session->blocklist_url);
|
|
||||||
tr_free(session->peer_congestion_algorithm);
|
tr_free(session->peer_congestion_algorithm);
|
||||||
delete session;
|
delete session;
|
||||||
}
|
}
|
||||||
|
@ -2343,7 +2342,7 @@ static bool tr_stringEndsWith(char const* strval, char const* end)
|
||||||
static void loadBlocklists(tr_session* session)
|
static void loadBlocklists(tr_session* session)
|
||||||
{
|
{
|
||||||
auto loadme = std::unordered_set<std::string>{};
|
auto loadme = std::unordered_set<std::string>{};
|
||||||
auto const isEnabled = session->isBlocklistEnabled;
|
auto const isEnabled = session->useBlocklist();
|
||||||
|
|
||||||
/* walk the blocklist directory... */
|
/* walk the blocklist directory... */
|
||||||
auto const dirname = tr_strvPath(session->configDir, "blocklists"sv);
|
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));
|
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)
|
void tr_blocklistSetEnabled(tr_session* session, bool enabled)
|
||||||
{
|
{
|
||||||
TR_ASSERT(tr_isSession(session));
|
TR_ASSERT(tr_isSession(session));
|
||||||
|
|
||||||
session->isBlocklistEnabled = enabled;
|
session->useBlocklist(enabled);
|
||||||
|
|
||||||
auto& src = session->blocklists;
|
|
||||||
std::for_each(
|
|
||||||
std::begin(src),
|
|
||||||
std::end(src),
|
|
||||||
[enabled](auto* blocklist) { tr_blocklistFileSetEnabled(blocklist, enabled); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tr_blocklistExists(tr_session const* session)
|
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))
|
if (it == std::end(src))
|
||||||
{
|
{
|
||||||
auto path = tr_strvJoin(session->configDir, "blocklists"sv, name);
|
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);
|
src.push_back(b);
|
||||||
}
|
}
|
||||||
else
|
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)
|
void tr_blocklistSetURL(tr_session* session, char const* url)
|
||||||
{
|
{
|
||||||
if (session->blocklist_url != url)
|
session->setBlocklistUrl(url ? url : "");
|
||||||
{
|
|
||||||
tr_free(session->blocklist_url);
|
|
||||||
session->blocklist_url = tr_strdup(url);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char const* tr_blocklistGetURL(tr_session const* session)
|
char const* tr_blocklistGetURL(tr_session const* session)
|
||||||
{
|
{
|
||||||
return session->blocklist_url;
|
return session->blocklistUrl().c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
|
|
|
@ -131,6 +131,8 @@ struct CaseInsensitiveStringCompare // case-insensitive string compare
|
||||||
struct tr_session
|
struct tr_session
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// download dir
|
||||||
|
|
||||||
std::string const& downloadDir() const
|
std::string const& downloadDir() const
|
||||||
{
|
{
|
||||||
return download_dir_;
|
return download_dir_;
|
||||||
|
@ -141,6 +143,8 @@ public:
|
||||||
download_dir_ = dir;
|
download_dir_ = dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// incomplete dir
|
||||||
|
|
||||||
std::string const& incompleteDir() const
|
std::string const& incompleteDir() const
|
||||||
{
|
{
|
||||||
return incomplete_dir_;
|
return incomplete_dir_;
|
||||||
|
@ -161,6 +165,8 @@ public:
|
||||||
incomplete_dir_enabled_ = enabled;
|
incomplete_dir_enabled_ = enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// scripts
|
||||||
|
|
||||||
void useScript(TrScript i, bool enabled)
|
void useScript(TrScript i, bool enabled)
|
||||||
{
|
{
|
||||||
scripts_enabled_[i] = enabled;
|
scripts_enabled_[i] = enabled;
|
||||||
|
@ -181,13 +187,31 @@ public:
|
||||||
return scripts_[i];
|
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:
|
public:
|
||||||
bool isPortRandom;
|
bool isPortRandom;
|
||||||
bool isPexEnabled;
|
bool isPexEnabled;
|
||||||
bool isDHTEnabled;
|
bool isDHTEnabled;
|
||||||
bool isUTPEnabled;
|
bool isUTPEnabled;
|
||||||
bool isLPDEnabled;
|
bool isLPDEnabled;
|
||||||
bool isBlocklistEnabled;
|
|
||||||
bool isPrefetchEnabled;
|
bool isPrefetchEnabled;
|
||||||
bool isClosing;
|
bool isClosing;
|
||||||
bool isClosed;
|
bool isClosed;
|
||||||
|
@ -268,8 +292,6 @@ public:
|
||||||
char* resumeDir;
|
char* resumeDir;
|
||||||
char* torrentDir;
|
char* torrentDir;
|
||||||
|
|
||||||
char* blocklist_url;
|
|
||||||
|
|
||||||
std::list<tr_blocklistFile*> blocklists;
|
std::list<tr_blocklistFile*> blocklists;
|
||||||
struct tr_peerMgr* peerMgr;
|
struct tr_peerMgr* peerMgr;
|
||||||
struct tr_shared* shared;
|
struct tr_shared* shared;
|
||||||
|
@ -307,10 +329,12 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::array<std::string, TR_SCRIPT_N_TYPES> scripts_;
|
std::array<std::string, TR_SCRIPT_N_TYPES> scripts_;
|
||||||
std::string incomplete_dir_;
|
std::string blocklist_url_;
|
||||||
std::string download_dir_;
|
std::string download_dir_;
|
||||||
|
std::string incomplete_dir_;
|
||||||
|
|
||||||
std::array<bool, TR_SCRIPT_N_TYPES> scripts_enabled_;
|
std::array<bool, TR_SCRIPT_N_TYPES> scripts_enabled_;
|
||||||
|
bool blocklist_enabled_ = false;
|
||||||
bool incomplete_dir_enabled_ = false;
|
bool incomplete_dir_enabled_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,36 @@ TEST_F(SessionTest, properties)
|
||||||
EXPECT_EQ(value, session->useIncompleteDir());
|
EXPECT_EQ(value, session->useIncompleteDir());
|
||||||
EXPECT_EQ(value, tr_sessionIsIncompleteDirEnabled(session));
|
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)
|
TEST_F(SessionTest, peerId)
|
||||||
|
|
Loading…
Reference in New Issue