"Fossies" - the Fresh Open Source Software Archive

Member "encfs-1.9.5/encfs/DirNode.h" (27 Apr 2018, 5563 Bytes) of package /linux/misc/encfs-1.9.5.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "DirNode.h" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.9.4_vs_1.9.5.

    1 /*****************************************************************************
    2  * Author:   Valient Gough <vgough@pobox.com>
    3  *
    4  *****************************************************************************
    5  * Copyright (c) 2003, Valient Gough
    6  *
    7  * This program is free software: you can redistribute it and/or modify it
    8  * under the terms of the GNU Lesser General Public License as published by the
    9  * Free Software Foundation, either version 3 of the License, or (at your
   10  * option) any later version.
   11  *
   12  * This program is distributed in the hope that it will be useful, but WITHOUT
   13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
   15  * for more details.
   16  *
   17  * You should have received a copy of the GNU Lesser General Public License
   18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   19  */
   20 
   21 #ifndef _DirNode_incl_
   22 #define _DirNode_incl_
   23 
   24 #include <dirent.h>
   25 #include <inttypes.h>
   26 #include <list>
   27 #include <map>
   28 #include <memory>
   29 #include <pthread.h>
   30 #include <stdint.h>
   31 #include <string>
   32 #include <sys/types.h>
   33 #include <vector>
   34 
   35 #include "CipherKey.h"
   36 #include "FSConfig.h"
   37 #include "FileNode.h"
   38 #include "NameIO.h"
   39 
   40 namespace encfs {
   41 
   42 class Cipher;
   43 class EncFS_Context;
   44 class FileNode;
   45 class NameIO;
   46 class RenameOp;
   47 struct RenameEl;
   48 
   49 class DirTraverse {
   50  public:
   51   DirTraverse(std::shared_ptr<DIR> dirPtr, uint64_t iv,
   52               std::shared_ptr<NameIO> naming, bool root);
   53   ~DirTraverse();
   54 
   55   DirTraverse &operator=(const DirTraverse &src);
   56 
   57   // returns FALSE to indicate an invalid DirTraverse (such as when
   58   // an invalid directory is requested for traversal)
   59   bool valid() const;
   60 
   61   // return next plaintext filename
   62   // If fileType is not 0, then it is used to return the filetype (or 0 if
   63   // unknown)
   64   std::string nextPlaintextName(int *fileType = 0, ino_t *inode = 0);
   65 
   66   /* Return cipher name of next undecodable filename..
   67      The opposite of nextPlaintextName(), as that skips undecodable names..
   68   */
   69   std::string nextInvalid();
   70 
   71  private:
   72   std::shared_ptr<DIR> dir;  // struct DIR
   73   // initialization vector to use.  Not very general purpose, but makes it
   74   // more efficient to support filename IV chaining..
   75   uint64_t iv;
   76   std::shared_ptr<NameIO> naming;
   77   bool root;
   78 };
   79 inline bool DirTraverse::valid() const { return dir.get() != 0; }
   80 
   81 class DirNode {
   82  public:
   83   // sourceDir points to where raw files are stored
   84   DirNode(EncFS_Context *ctx, const std::string &sourceDir,
   85           const FSConfigPtr &config);
   86   ~DirNode();
   87 
   88   // return the path to the root directory
   89   std::string rootDirectory();
   90 
   91   // recursive lookup check
   92   bool touchesMountpoint(const char *realPath) const;
   93 
   94   // find files
   95   std::shared_ptr<FileNode> lookupNode(const char *plaintextName,
   96                                        const char *requestor);
   97 
   98   /*
   99       Combined lookupNode + node->open() call.  If the open fails, then the
  100       node is not retained.  If the open succeeds, then the node is returned.
  101   */
  102   std::shared_ptr<FileNode> openNode(const char *plaintextName,
  103                                      const char *requestor, int flags,
  104                                      int *openResult);
  105 
  106   std::string cipherPath(const char *plaintextPath);
  107   std::string cipherPathWithoutRoot(const char *plaintextPath);
  108   std::string plainPath(const char *cipherPath);
  109 
  110   // relative cipherPath is the same as cipherPath except that it doesn't
  111   // prepent the mount point.  That it, it doesn't return a fully qualified
  112   // name, just a relative path within the encrypted filesystem.
  113   std::string relativeCipherPath(const char *plaintextPath);
  114 
  115   /*
  116       Returns true if file names are dependent on the parent directory name.
  117       If a directory name is changed, then all the filenames must also be
  118       changed.
  119   */
  120   bool hasDirectoryNameDependency() const;
  121 
  122   // unlink the specified file
  123   int unlink(const char *plaintextName);
  124 
  125   // traverse directory
  126   DirTraverse openDir(const char *plainDirName);
  127 
  128   // uid and gid are used as the directory owner, only if not zero
  129   int mkdir(const char *plaintextPath, mode_t mode, uid_t uid = 0,
  130             gid_t gid = 0);
  131 
  132   int rename(const char *fromPlaintext, const char *toPlaintext);
  133 
  134   int link(const char *to, const char *from);
  135 
  136   // returns idle time of filesystem in seconds
  137   int idleSeconds();
  138 
  139  protected:
  140   /*
  141       notify that a file is being renamed.
  142       This renames the internal node, if any.  If the file is not open, then
  143       this call has no effect.
  144       Returns the FileNode if it was found.
  145   */
  146   std::shared_ptr<FileNode> renameNode(const char *from, const char *to);
  147   std::shared_ptr<FileNode> renameNode(const char *from, const char *to,
  148                                        bool forwardMode);
  149 
  150   /*
  151       when directory IV chaining is enabled, a directory can't be renamed
  152       without renaming all its contents as well.  recursiveRename should be
  153       called after renaming the directory, passing in the plaintext from and
  154       to paths.
  155   */
  156   std::shared_ptr<RenameOp> newRenameOp(const char *from, const char *to);
  157 
  158  private:
  159   friend class RenameOp;
  160 
  161   bool genRenameList(std::list<RenameEl> &list, const char *fromP,
  162                      const char *toP);
  163 
  164   std::shared_ptr<FileNode> findOrCreate(const char *plainName);
  165 
  166   pthread_mutex_t mutex;
  167 
  168   EncFS_Context *ctx;
  169 
  170   // passed in as configuration
  171   std::string rootDir;
  172   FSConfigPtr fsConfig;
  173 
  174   std::shared_ptr<NameIO> naming;
  175 };
  176 
  177 }  // namespace encfs
  178 
  179 #endif