This file is indexed.

/usr/include/eiskaltdcpp/dcpp/ShareManager.h is in libeiskaltdcpp-dev 2.2.9-3+b2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/*
 * Copyright (C) 2001-2012 Jacek Sieka, arnetheduck on gmail point com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#pragma once

#include "TimerManager.h"
#include "SearchManager.h"
#include "SettingsManager.h"
#include "HashManagerListener.h"
#include "QueueManagerListener.h"
#include "Exception.h"
#include "CriticalSection.h"
#include "StringSearch.h"
#include "Singleton.h"
#include "BloomFilter.h"
#include "FastAlloc.h"
#include "MerkleTree.h"
#include "Pointer.h"
#include "Atomic.h"

#ifdef WITH_DHT
namespace dht {
    class IndexManager;
}
#endif

namespace dcpp {

STANDARD_EXCEPTION(ShareException);

class SimpleXML;
class Client;
class File;
class OutputStream;
class MemoryInputStream;

struct ShareLoader;
class ShareManager : public Singleton<ShareManager>, private SettingsManagerListener, private Thread, private TimerManagerListener,
    private HashManagerListener, private QueueManagerListener
{
public:
    /**
     * @param aDirectory Physical directory location
     * @param aName Virtual name
     */
    void addDirectory(const string& realPath, const string &virtualName);
    void removeDirectory(const string& realPath);
    void renameDirectory(const string& realPath, const string& virtualName);

    bool isRefreshing() { return refreshing; }

    string toVirtual(const TTHValue& tth) const;
    string toReal(const string& virtualFile);
    StringList getRealPaths(const string& virtualPath);
    TTHValue getTTH(const string& virtualFile) const;

    void refresh(bool dirs = false, bool aUpdate = true, bool block = false) noexcept;
    void setDirty() { xmlDirty = true; }

    void search(SearchResultList& l, const string& aString, int aSearchType, int64_t aSize, int aFileType, Client* aClient, StringList::size_type maxResults) noexcept;
    void search(SearchResultList& l, const StringList& params, StringList::size_type maxResults) noexcept;

    StringPairList getDirectories() const noexcept;

    MemoryInputStream* generatePartialList(const string& dir, bool recurse) const;
    MemoryInputStream* getTree(const string& virtualFile) const;

    AdcCommand getFileInfo(const string& aFile);

    int64_t getShareSize() const noexcept;
    int64_t getShareSize(const string& realPath) const noexcept;

    size_t getSharedFiles() const noexcept;

    string getShareSizeString() const { return Util::toString(getShareSize()); }
    string getShareSizeString(const string& aDir) const { return Util::toString(getShareSize(aDir)); }

    void getBloom(ByteVector& v, size_t k, size_t m, size_t h) const;

    SearchManager::TypeModes getType(const string& fileName) const noexcept;

    string validateVirtual(const string& /*aVirt*/) const noexcept;
    bool hasVirtual(const string& name) const noexcept;

    void addHits(uint32_t aHits) {
        hits += aHits;
    }

    string getOwnListFile() {
        generateXmlList();
        return getBZXmlFile();
    }

    bool isTTHShared(const TTHValue& tth){
        Lock l(cs);
        return tthIndex.find(tth) != tthIndex.end();
    }
    void publish();
    GETSET(uint32_t, hits, Hits);
    GETSET(string, bzXmlFile, BZXmlFile);
private:
    struct AdcSearch;
    class Directory : public FastAlloc<Directory>, public intrusive_ptr_base<Directory>, boost::noncopyable {
    public:
        typedef boost::intrusive_ptr<Directory> Ptr;
        typedef unordered_map<string, Ptr, CaseStringHash, CaseStringEq> Map;
        typedef Map::iterator MapIter;

        struct File {
            struct StringComp {
                StringComp(const string& s) : a(s) { }
                bool operator()(const File& b) const {
                if (BOOLSETTING(CASESENSITIVE_FILELIST))
                    return strcmp(a.c_str(), b.getName().c_str()) == 0;
                else
                    return Util::stricmp(a, b.getName()) == 0;
                }

                const string& a;
            private:
                StringComp& operator=(const StringComp&);
            };
            struct FileLess {
                bool operator()(const File& a, const File& b) const {
                    if (BOOLSETTING(CASESENSITIVE_FILELIST))
                        return (strcmp(a.getName().c_str(), b.getName().c_str()) < 0);
                    else
                        return (Util::stricmp(a.getName(), b.getName()) < 0);
                }
            };
            typedef set<File, FileLess> Set;

            File() : size(0), parent(0) { }
            File(const string& aName, int64_t aSize, const Directory::Ptr& aParent, const TTHValue& aRoot) :
            name(aName), tth(aRoot), size(aSize), parent(aParent.get()) { }
            File(const File& rhs) :
            name(rhs.getName()), tth(rhs.getTTH()), size(rhs.getSize()), parent(rhs.getParent()) { }

            ~File() { }

            File& operator=(const File& rhs) {
                name = rhs.name; size = rhs.size; parent = rhs.parent; tth = rhs.tth;
                return *this;
            }

            bool operator==(const File& rhs) const {
                if (BOOLSETTING(CASESENSITIVE_FILELIST))
                    return getParent() == rhs.getParent() && (strcmp(getName().c_str(), rhs.getName().c_str()) == 0);
                else
                    return getParent() == rhs.getParent() && (Util::stricmp(getName(), rhs.getName()) == 0);
            }

            string getADCPath() const { return parent->getADCPath() + name; }
            string getFullName() const { return parent->getFullName() + name; }
            string getRealPath() const { return parent->getRealPath(name); }

            GETSET(string, name, Name);
            GETSET(TTHValue, tth, TTH);
            GETSET(int64_t, size, Size);
            GETSET(Directory*, parent, Parent);
        };

        int64_t size;
        Map directories;
        File::Set files;

        static Ptr create(const string& aName, const Ptr& aParent = Ptr()) { return Ptr(new Directory(aName, aParent)); }

        bool hasType(uint32_t type) const noexcept {
            return ( (type == SearchManager::TYPE_ANY) || (fileTypes & (1 << type)) );
        }
        void addType(uint32_t type) noexcept;

        string getADCPath() const noexcept;
        string getFullName() const noexcept;
        string getRealPath(const std::string& path) const;

        int64_t getSize() const noexcept;

        void search(SearchResultList& aResults, StringSearch::List& aStrings, int aSearchType, int64_t aSize, int aFileType, Client* aClient, StringList::size_type maxResults) const noexcept;
        void search(SearchResultList& aResults, AdcSearch& aStrings, StringList::size_type maxResults) const noexcept;

        void toXml(OutputStream& xmlFile, string& indent, string& tmp2, bool fullList) const;
        void filesToXml(OutputStream& xmlFile, string& indent, string& tmp2) const;

        File::Set::const_iterator findFile(const string& aFile) const { return find_if(files.begin(), files.end(), Directory::File::StringComp(aFile)); }

        void merge(const Ptr& source);

        GETSET(string, name, Name);
        GETSET(Directory*, parent, Parent);
    private:
        friend void intrusive_ptr_release(intrusive_ptr_base<Directory>*);

        Directory(const string& aName, const Ptr& aParent);
        ~Directory() { }

        /** Set of flags that say which SearchManager::TYPE_* a directory contains */
        uint32_t fileTypes;

    };

    friend class Directory;
    friend struct ShareLoader;

    friend class Singleton<ShareManager>;
    ShareManager();

    virtual ~ShareManager();

    struct AdcSearch {
        AdcSearch(const StringList& params);

        bool isExcluded(const string& str);
        bool hasExt(const string& name);
        StringSearch::List* include;
        StringSearch::List includeX;
        StringSearch::List exclude;
        StringList ext;
        StringList noExt;

        int64_t gt;
        int64_t lt;

        TTHValue root;
        bool hasRoot;

        bool isDirectory;
    };

    int64_t xmlListLen;
    TTHValue xmlRoot;
    int64_t bzXmlListLen;
    TTHValue bzXmlRoot;
    unique_ptr<File> bzXmlRef;

    bool xmlDirty;
    bool forceXmlRefresh; /// bypass the 15-minutes guard
    bool refreshDirs;
    bool update;
    bool initial;

    int listN;

    Atomic<bool,memory_ordering_strong> refreshing;

    uint64_t lastXmlUpdate;
    uint64_t lastFullUpdate;

    mutable CriticalSection cs;

    // List of root directory items
    typedef std::list<Directory::Ptr> DirList;
    DirList directories;

    /** Map real name to virtual name - multiple real names may be mapped to a single virtual one */
    StringMap shares;

#ifdef WITH_DHT
    friend class ::dht::IndexManager;
#endif

    typedef unordered_map<TTHValue, Directory::File::Set::const_iterator> HashFileMap;
    typedef HashFileMap::iterator HashFileIter;

    HashFileMap tthIndex;

    BloomFilter<5> bloom;

    Directory::File::Set::const_iterator findFile(const string& virtualFile) const;

    Directory::Ptr buildTree(const string& aName, const Directory::Ptr& aParent);
    bool checkHidden(const string& aName) const;

    void rebuildIndices();

    void updateIndices(Directory& aDirectory);
    void updateIndices(Directory& dir, const Directory::File::Set::iterator& i);

    Directory::Ptr merge(const Directory::Ptr& directory);

    void generateXmlList();
    bool loadCache() noexcept;
    DirList::const_iterator getByVirtual(const string& virtualName) const noexcept;
    pair<Directory::Ptr, string> splitVirtual(const string& virtualPath) const;

    string findRealRoot(const string& virtualRoot, const string& virtualLeaf) const;

    Directory::Ptr getDirectory(const string& fname);

    virtual int run();

    // QueueManagerListener
    virtual void on(QueueManagerListener::FileMoved, const string& n) noexcept;
    // HashManagerListener
    virtual void on(HashManagerListener::TTHDone, const string& fname, const TTHValue& root) noexcept;

    // SettingsManagerListener
    virtual void on(SettingsManagerListener::Save, SimpleXML& xml) noexcept {
        save(xml);
    }
    virtual void on(SettingsManagerListener::Load, SimpleXML& xml) noexcept {
        load(xml);
    }

    // TimerManagerListener
    virtual void on(TimerManagerListener::Minute, uint64_t tick) noexcept;
    void load(SimpleXML& aXml);
    void save(SimpleXML& aXml);

};

} // namespace dcpp