added infrastructure to add a ignore list in shared files

This commit is contained in:
csoler 2017-09-10 19:58:57 +02:00
parent 160ab7b4f3
commit 884b3a6220
11 changed files with 216 additions and 11 deletions

View file

@ -232,12 +232,13 @@ void LocalDirectoryUpdater::recursUpdateSharedDir(const std::string& cumulated_p
// now go through list of subfiles and request the hash to hashcache // now go through list of subfiles and request the hash to hashcache
for(DirectoryStorage::FileIterator dit(mSharedDirectories,indx);dit;++dit) for(DirectoryStorage::FileIterator dit(mSharedDirectories,indx);dit;++dit)
if(filterFile(dit.name()))
{ {
// ask about the hash. If not present, ask HashCache. If not present, or different, the callback will update it. // ask about the hash. If not present, ask HashCache. If not present, or different, the callback will update it.
RsFileHash hash ; RsFileHash hash ;
// mSharedDirectories des two things: store H(F), and compute H(H(F)), which is used in FT. The later is always needed. // mSharedDirectories does two things: store H(F), and compute H(H(F)), which is used in FT. The later is always needed.
if(mHashCache->requestHash(cumulated_path + "/" + dit.name(),dit.size(),dit.modtime(),hash,this,*dit)) if(mHashCache->requestHash(cumulated_path + "/" + dit.name(),dit.size(),dit.modtime(),hash,this,*dit))
mSharedDirectories->updateHash(*dit,hash,hash != dit.hash()); mSharedDirectories->updateHash(*dit,hash,hash != dit.hash());
@ -259,6 +260,21 @@ void LocalDirectoryUpdater::recursUpdateSharedDir(const std::string& cumulated_p
} }
} }
bool LocalDirectoryUpdater::filterFile(const std::string& fname) const
{
if(mIgnoreFlags & RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES)
for(auto it(mIgnoredSuffixes.begin());it!=mIgnoredSuffixes.end();++it)
if(fname.size() >= (*it).size() && fname.substr( fname.size() - (*it).size()) == *it)
return false ;
if(mIgnoreFlags & RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES)
for(auto it(mIgnoredPrefixes.begin());it!=mIgnoredPrefixes.end();++it)
if(fname.size() >= (*it).size() && fname.substr( 0,(*it).size()) == *it)
return false ;
return true ;
}
bool LocalDirectoryUpdater::inDirectoryCheck() const bool LocalDirectoryUpdater::inDirectoryCheck() const
{ {
return mHashCache->isRunning(); return mHashCache->isRunning();
@ -301,5 +317,19 @@ bool LocalDirectoryUpdater::followSymLinks() const
return mFollowSymLinks ; return mFollowSymLinks ;
} }
void LocalDirectoryUpdater::setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes,uint32_t ignore_flags)
{
mIgnoredPrefixes = ignored_prefixes ;
mIgnoredSuffixes = ignored_suffixes ;
mIgnoreFlags = ignore_flags;
}
bool LocalDirectoryUpdater::getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes,uint32_t& ignore_flags) const
{
ignored_prefixes = mIgnoredPrefixes;
ignored_suffixes = mIgnoredSuffixes;
ignore_flags = mIgnoreFlags ;
return true;
}

View file

@ -53,6 +53,9 @@ public:
void setEnabled(bool b) ; void setEnabled(bool b) ;
bool isEnabled() const ; bool isEnabled() const ;
void setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes,uint32_t ignore_flags) ;
bool getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes,uint32_t& ignore_flags) const ;
protected: protected:
virtual void data_tick() ; virtual void data_tick() ;
@ -63,6 +66,8 @@ protected:
bool sweepSharedDirectories(); bool sweepSharedDirectories();
private: private:
bool filterFile(const std::string& fname) const ; // reponds true if the file passes the ignore lists test.
HashStorage *mHashCache ; HashStorage *mHashCache ;
LocalDirectoryStorage *mSharedDirectories ; LocalDirectoryStorage *mSharedDirectories ;
@ -77,5 +82,9 @@ private:
bool mNeedsFullRecheck ; bool mNeedsFullRecheck ;
bool mIsChecking ; bool mIsChecking ;
bool mForceUpdate ; bool mForceUpdate ;
uint32_t mIgnoreFlags ;
std::list<std::string> mIgnoredPrefixes ;
std::list<std::string> mIgnoredSuffixes ;
}; };

View file

@ -39,6 +39,9 @@ static const std::string WATCH_FILE_DURATION_SS = "WATCH_FILES_DELAY" ; // key
static const std::string WATCH_FILE_ENABLED_SS = "WATCH_FILES_ENABLED"; // key to store ON/OFF flags for file whatch static const std::string WATCH_FILE_ENABLED_SS = "WATCH_FILES_ENABLED"; // key to store ON/OFF flags for file whatch
static const std::string FOLLOW_SYMLINKS_SS = "FOLLOW_SYMLINKS"; // dereference symbolic links, or just ignore them. static const std::string FOLLOW_SYMLINKS_SS = "FOLLOW_SYMLINKS"; // dereference symbolic links, or just ignore them.
static const std::string WATCH_HASH_SALT_SS = "WATCH_HASH_SALT"; // Salt that is used to hash directory names static const std::string WATCH_HASH_SALT_SS = "WATCH_HASH_SALT"; // Salt that is used to hash directory names
static const std::string IGNORED_PREFIXES_SS = "IGNORED_PREFIXES"; // ignore file prefixes
static const std::string IGNORED_SUFFIXES_SS = "IGNORED_SUFFIXES"; // ignore file suffixes
static const std::string IGNORE_LIST_FLAGS_SS = "IGNORED_FLAGS"; // ignore file flags
static const std::string FILE_SHARING_DIR_NAME = "file_sharing" ; // hard-coded directory name to store friend file lists, hash cache, etc. static const std::string FILE_SHARING_DIR_NAME = "file_sharing" ; // hard-coded directory name to store friend file lists, hash cache, etc.
static const std::string HASH_CACHE_FILE_NAME = "hash_cache.bin" ; // hard-coded directory name to store encrypted hash cache. static const std::string HASH_CACHE_FILE_NAME = "hash_cache.bin" ; // hard-coded directory name to store encrypted hash cache.

View file

@ -81,6 +81,17 @@ p3FileDatabase::p3FileDatabase(p3ServiceControl *mpeers)
addSerialType(new RsFileListsSerialiser()) ; addSerialType(new RsFileListsSerialiser()) ;
} }
void p3FileDatabase::setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes, uint32_t ignore_flags)
{
RS_STACK_MUTEX(mFLSMtx) ;
mLocalDirWatcher->setIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ;
}
bool p3FileDatabase::getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes, uint32_t& ignore_flags)
{
RS_STACK_MUTEX(mFLSMtx) ;
return mLocalDirWatcher->getIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ;
}
RsSerialiser *p3FileDatabase::setupSerialiser() RsSerialiser *p3FileDatabase::setupSerialiser()
{ {
// This one is for saveList/loadList // This one is for saveList/loadList
@ -345,6 +356,28 @@ cleanup = true;
rskv->tlvkvs.pairs.push_back(kv); rskv->tlvkvs.pairs.push_back(kv);
} }
{
std::list<std::string> prefix_list,suffix_list;
uint32_t flags ;
mLocalDirWatcher->getIgnoreLists(prefix_list,suffix_list,flags) ;
std::string prefix_string, suffix_string ;
for(auto it(prefix_list.begin());it!=prefix_list.end();++it) prefix_string += *it + ";" ;
for(auto it(suffix_list.begin());it!=suffix_list.end();++it) suffix_string += *it + ";" ;
RsTlvKeyValue kv;
kv.key = IGNORED_PREFIXES_SS; kv.value = prefix_string; rskv->tlvkvs.pairs.push_back(kv);
kv.key = IGNORED_SUFFIXES_SS; kv.value = suffix_string; rskv->tlvkvs.pairs.push_back(kv);
std::string s ;
rs_sprintf(s, "%lu", flags) ;
kv.key = IGNORE_LIST_FLAGS_SS; kv.value = s; rskv->tlvkvs.pairs.push_back(kv);
}
/* Add KeyValue to saveList */ /* Add KeyValue to saveList */
sList.push_back(rskv); sList.push_back(rskv);
@ -363,6 +396,8 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
#endif #endif
std::list<SharedDirInfo> dirList; std::list<SharedDirInfo> dirList;
std::list<std::string> ignored_prefixes,ignored_suffixes ;
uint32_t ignore_flags ;
for(std::list<RsItem *>::iterator it = load.begin(); it != load.end(); ++it) for(std::list<RsItem *>::iterator it = load.begin(); it != load.end(); ++it)
{ {
@ -400,6 +435,31 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
std::cerr << "Initing directory watcher with saved secret salt..." << std::endl; std::cerr << "Initing directory watcher with saved secret salt..." << std::endl;
mLocalDirWatcher->setHashSalt(RsFileHash(kit->value)) ; mLocalDirWatcher->setHashSalt(RsFileHash(kit->value)) ;
} }
else if(kit->key == IGNORED_PREFIXES_SS)
{
std::string b ;
for(uint32_t i=0;i<kit->value.size();++i)
if(kit->value[i] == ';')
ignored_prefixes.push_back(b) ;
else
b.push_back(kit->value[i]) ;
}
else if(kit->key == IGNORED_SUFFIXES_SS)
{
std::string b ;
for(uint32_t i=0;i<kit->value.size();++i)
if(kit->value[i] == ';')
ignored_suffixes.push_back(b) ;
else
b.push_back(kit->value[i]) ;
}
else if(kit->key == IGNORE_LIST_FLAGS_SS)
{
int t=0 ;
if(sscanf(kit->value.c_str(),"%d",&t) == 1)
ignore_flags = (uint32_t)t ;
}
delete *it ; delete *it ;
continue ; continue ;
} }
@ -427,6 +487,8 @@ bool p3FileDatabase::loadList(std::list<RsItem *>& load)
/* set directories */ /* set directories */
mLocalSharedDirs->setSharedDirectoryList(dirList); mLocalSharedDirs->setSharedDirectoryList(dirList);
mLocalDirWatcher->setIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ;
load.clear() ; load.clear() ;
return true; return true;

View file

@ -127,6 +127,9 @@ class p3FileDatabase: public p3Service, public p3Config, public ftSearch //, pub
void updateShareFlags(const SharedDirInfo& info) ; void updateShareFlags(const SharedDirInfo& info) ;
bool convertSharedFilePath(const std::string& path,std::string& fullpath); bool convertSharedFilePath(const std::string& path,std::string& fullpath);
void setIgnoreLists(const std::list<std::string>& ignored_prefixes,const std::list<std::string>& ignored_suffixes, uint32_t ignore_flags) ;
bool getIgnoreLists(std::list<std::string>& ignored_prefixes,std::list<std::string>& ignored_suffixes, uint32_t& ignore_flags) ;
// computes/gathers statistics about shared directories // computes/gathers statistics about shared directories
int getSharedDirStatistics(const RsPeerId& pid,SharedDirStats& stats); int getSharedDirStatistics(const RsPeerId& pid,SharedDirStats& stats);

View file

@ -826,6 +826,16 @@ bool ftServer::removeSharedDirectory(std::string dir)
return true; return true;
} }
bool ftServer::getIgnoreLists(std::list<std::string>& ignored_prefixes, std::list<std::string>& ignored_suffixes,uint32_t& ignore_flags)
{
return mFileDatabase->getIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ;
}
void ftServer::setIgnoreLists(const std::list<std::string>& ignored_prefixes, const std::list<std::string>& ignored_suffixes, uint32_t ignore_flags)
{
mFileDatabase->setIgnoreLists(ignored_prefixes,ignored_suffixes,ignore_flags) ;
}
bool ftServer::watchEnabled() { return mFileDatabase->watchEnabled() ; } bool ftServer::watchEnabled() { return mFileDatabase->watchEnabled() ; }
int ftServer::watchPeriod() const { return mFileDatabase->watchPeriod()/60 ; } int ftServer::watchPeriod() const { return mFileDatabase->watchPeriod()/60 ; }
bool ftServer::followSymLinks() const { return mFileDatabase->followSymLinks() ; } bool ftServer::followSymLinks() const { return mFileDatabase->followSymLinks() ; }

View file

@ -213,6 +213,9 @@ public:
virtual bool updateShareFlags(const SharedDirInfo& dir); // updates the flags. The directory should already exist ! virtual bool updateShareFlags(const SharedDirInfo& dir); // updates the flags. The directory should already exist !
virtual bool removeSharedDirectory(std::string dir); virtual bool removeSharedDirectory(std::string dir);
virtual bool getIgnoreLists(std::list<std::string>& ignored_prefixes, std::list<std::string>& ignored_suffixes, uint32_t& ignore_flags) ;
virtual void setIgnoreLists(const std::list<std::string>& ignored_prefixes, const std::list<std::string>& ignored_suffixes,uint32_t ignore_flags) ;
virtual bool getShareDownloadDirectory(); virtual bool getShareDownloadDirectory();
virtual bool shareDownloadDirectory(bool share); virtual bool shareDownloadDirectory(bool share);

View file

@ -60,6 +60,9 @@ const uint32_t RS_FILE_RATE_STREAM_VIDEO = 0x00000006;
const uint32_t RS_FILE_PEER_ONLINE = 0x00001000; const uint32_t RS_FILE_PEER_ONLINE = 0x00001000;
const uint32_t RS_FILE_PEER_OFFLINE = 0x00002000; const uint32_t RS_FILE_PEER_OFFLINE = 0x00002000;
const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES = 0x0001 ;
const uint32_t RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES = 0x0002 ;
/************************************ /************************************
* Used To indicate where to search. * Used To indicate where to search.
* *
@ -251,6 +254,9 @@ class RsFiles
virtual bool updateShareFlags(const SharedDirInfo& dir) = 0; // updates the flags. The directory should already exist ! virtual bool updateShareFlags(const SharedDirInfo& dir) = 0; // updates the flags. The directory should already exist !
virtual bool removeSharedDirectory(std::string dir) = 0; virtual bool removeSharedDirectory(std::string dir) = 0;
virtual bool getIgnoreLists(std::list<std::string>& ignored_prefixes, std::list<std::string>& ignored_suffixes,uint32_t& flags) =0;
virtual void setIgnoreLists(const std::list<std::string>& ignored_prefixes, const std::list<std::string>& ignored_suffixes,uint32_t flags) =0;
virtual void setWatchPeriod(int minutes) =0; virtual void setWatchPeriod(int minutes) =0;
virtual void setWatchEnabled(bool b) =0; virtual void setWatchEnabled(bool b) =0;
virtual int watchPeriod() const =0; virtual int watchPeriod() const =0;

View file

@ -54,6 +54,30 @@ TransferPage::TransferPage(QWidget * parent, Qt::WindowFlags flags)
QObject::connect(ui.autoCheckDirectoriesDelay_SB,SIGNAL(valueChanged(int)),this,SLOT(updateAutoScanDirectoriesPeriod())) ; QObject::connect(ui.autoCheckDirectoriesDelay_SB,SIGNAL(valueChanged(int)),this,SLOT(updateAutoScanDirectoriesPeriod())) ;
QObject::connect(ui.shareDownloadDirectoryCB, SIGNAL(toggled(bool)), this,SLOT(updateShareDownloadDirectory())) ; QObject::connect(ui.shareDownloadDirectoryCB, SIGNAL(toggled(bool)), this,SLOT(updateShareDownloadDirectory())) ;
QObject::connect(ui.followSymLinks_CB, SIGNAL(toggled(bool)), this,SLOT(updateFollowSymLinks())) ; QObject::connect(ui.followSymLinks_CB, SIGNAL(toggled(bool)), this,SLOT(updateFollowSymLinks())) ;
QObject::connect(ui.prefixesIgnoreList_LE, SIGNAL(textChanged(QString)), this,SLOT(updateIgnoreLists())) ;
QObject::connect(ui.prefixesIgnoreList_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreLists())) ;
QObject::connect(ui.suffixesIgnoreList_LE, SIGNAL(textChanged(QString)), this,SLOT(updateIgnoreLists())) ;
QObject::connect(ui.suffixesIgnoreList_CB, SIGNAL(toggled(bool)), this,SLOT(updateIgnoreLists())) ;
}
void TransferPage::updateIgnoreLists()
{
uint32_t flags = 0 ;
if(ui.prefixesIgnoreList_CB->isChecked()) flags |= RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES ;
if(ui.suffixesIgnoreList_CB->isChecked()) flags |= RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES ;
std::list<std::string> lp,ls ;
{ QStringList L = ui.prefixesIgnoreList_LE->text().split(';') ; for(QStringList::const_iterator it(L.begin());it!=L.end();++it) lp.push_back((*it).toStdString()) ; }
{ QStringList L = ui.suffixesIgnoreList_LE->text().split(';') ; for(QStringList::const_iterator it(L.begin());it!=L.end();++it) ls.push_back((*it).toStdString()) ; }
rsFiles->setIgnoreLists(lp,ls,flags) ;
std::cerr << "Setting ignore lists: " << std::endl;
std::cerr << " flags: " << flags << std::endl;
std::cerr << " prefixes: " ; for(auto it(lp.begin());it!=lp.end();++it) std::cerr << "\"" << *it << "\" " ; std::cerr << std::endl;
std::cerr << " suffixes: " ; for(auto it(ls.begin());it!=ls.end();++it) std::cerr << "\"" << *it << "\" " ; std::cerr << std::endl;
} }
void TransferPage::updateMaxTRUpRate(int b) void TransferPage::updateMaxTRUpRate(int b)
@ -125,6 +149,32 @@ void TransferPage::load()
case RS_FILE_PERM_DIRECT_DL_NO: whileBlocking(ui._filePermDirectDL_CB)->setCurrentIndex(1) ; break ; case RS_FILE_PERM_DIRECT_DL_NO: whileBlocking(ui._filePermDirectDL_CB)->setCurrentIndex(1) ; break ;
default: whileBlocking(ui._filePermDirectDL_CB)->setCurrentIndex(2) ; break ; default: whileBlocking(ui._filePermDirectDL_CB)->setCurrentIndex(2) ; break ;
} }
std::list<std::string> suffixes, prefixes;
uint32_t ignore_flags ;
rsFiles->getIgnoreLists(prefixes,suffixes,ignore_flags) ;
QString ignore_prefixes_string,ignore_suffixes_string ;
for(auto it(prefixes.begin());it!=prefixes.end();)
{
ignore_prefixes_string += QString::fromStdString(*it) ;
if(++it != prefixes.end())
ignore_prefixes_string += ";" ;
}
for(auto it(suffixes.begin());it!=suffixes.end();)
{
ignore_suffixes_string += QString::fromStdString(*it) ;
if(++it != suffixes.end())
ignore_suffixes_string += ";" ;
}
whileBlocking(ui.prefixesIgnoreList_CB)->setChecked( ignore_flags & RS_FILE_SHARE_FLAGS_IGNORE_PREFIXES ) ;
whileBlocking(ui.suffixesIgnoreList_CB)->setChecked( ignore_flags & RS_FILE_SHARE_FLAGS_IGNORE_SUFFIXES ) ;
whileBlocking(ui.prefixesIgnoreList_LE)->setText( ignore_prefixes_string );
whileBlocking(ui.suffixesIgnoreList_LE)->setText( ignore_suffixes_string );
} }
void TransferPage::updateDefaultStrategy(int i) void TransferPage::updateDefaultStrategy(int i)

View file

@ -50,6 +50,7 @@ class TransferPage: public ConfigPage
void updateEncryptionPolicy(int); void updateEncryptionPolicy(int);
void updateMaxUploadSlots(int); void updateMaxUploadSlots(int);
void updateFilePermDirectDL(int); void updateFilePermDirectDL(int);
void updateIgnoreLists();
void editDirectories() ; void editDirectories() ;
void setIncomingDirectory(); void setIncomingDirectory();

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1126</width> <width>1126</width>
<height>1099</height> <height>1103</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="TransferPageVLayout"> <layout class="QVBoxLayout" name="TransferPageVLayout">
@ -16,7 +16,7 @@
<property name="title"> <property name="title">
<string>Shared Directories</string> <string>Shared Directories</string>
</property> </property>
<layout class="QVBoxLayout" name="sharedGBoxVLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="shareDownloadHLayout"> <layout class="QHBoxLayout" name="shareDownloadHLayout">
<item> <item>
@ -88,6 +88,34 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="suffixesIgnoreList_CB">
<property name="text">
<string>ignore files with these suffixes:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="suffixesIgnoreList_LE"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="prefixesIgnoreList_CB">
<property name="text">
<string>ignore files with these prefixes:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="prefixesIgnoreList_LE"/>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>