Class SalmonFile

java.lang.Object
com.mku.salmon.SalmonFile
All Implemented Interfaces:
IVirtualFile

public class SalmonFile extends Object implements IVirtualFile
A virtual file backed by an encrypted IRealFile on the real filesystem. Supports operations for retrieving SalmonStream for reading/decrypting and writing/encrypting contents.
  • Field Details

  • Constructor Details

    • SalmonFile

      public SalmonFile(IRealFile realFile)
      Provides a file handle that can be used to create encrypted files. Requires a virtual drive that supports the underlying filesystem, see JavaFile implementation.
      Parameters:
      realFile - The real file
    • SalmonFile

      public SalmonFile(IRealFile realFile, SalmonDrive drive)
      Provides a file handle that can be used to create encrypted files. Requires a virtual drive that supports the underlying filesystem, see JavaFile implementation.
      Parameters:
      drive - The file virtual system that will be used with file operations
      realFile - The real file
  • Method Details

    • getRequestedChunkSize

      public Integer getRequestedChunkSize()
      Return the current chunk size requested that will be used for integrity
      Returns:
      The requested chunk size
    • getFileChunkSize

      public Integer getFileChunkSize() throws IOException
      Get the file chunk size from the header.
      Returns:
      The chunk size.
      Throws:
      IOException - Throws exceptions if the format is corrupt.
    • getHeader

      public SalmonHeader getHeader() throws IOException
      Get the custom SalmonHeader from this file.
      Returns:
      The header
      Throws:
      IOException - Thrown if there is an IO error.
    • getInputStream

      public SalmonStream getInputStream() throws IOException
      Retrieves a SalmonStream that will be used for decrypting the file contents.
      Specified by:
      getInputStream in interface IVirtualFile
      Returns:
      The input stream
      Throws:
      IOException - Thrown if there is an IO error.
      SalmonSecurityException - Thrown if there is a security exception
      IntegrityException - Thrown if the data are corrupt or tampered with.
    • getOutputStream

      public RandomAccessStream getOutputStream() throws IOException
      Get a SalmonStream for encrypting/writing contents using the nonce in the header.
      Specified by:
      getOutputStream in interface IVirtualFile
      Returns:
      The output stream
      Throws:
      SalmonSecurityException - Thrown if there is a security exception
      IntegrityException - Thrown if the data are corrupt or tampered with.
      SequenceException - Thrown if there is an error with the nonce sequence
      IOException
    • getEncryptionKey

      public byte[] getEncryptionKey()
      Returns the current encryption key
      Returns:
      The encryption key
    • setEncryptionKey

      public void setEncryptionKey(byte[] encryptionKey)
      Sets the encryption key
      Parameters:
      encryptionKey - The AES encryption key to be used
    • setVerifyIntegrity

      public void setVerifyIntegrity(boolean integrity, byte[] hashKey) throws IOException
      Enabled verification of file integrity during read() and write()
      Parameters:
      integrity - True if enable integrity verification
      hashKey - The hash key to be used for verification
      Throws:
      IOException - Thrown if there is an IO error.
    • setApplyIntegrity

      public void setApplyIntegrity(boolean integrity, byte[] hashKey, Integer requestChunkSize) throws IOException
      Enable integrity with this file.
      Parameters:
      integrity - True to enable integrity
      hashKey - The hash key to use
      requestChunkSize - 0 use default file chunk. A positive number to specify integrity chunks.
      Throws:
      IOException - Thrown if there is an IO error.
    • setAllowOverwrite

      public void setAllowOverwrite(boolean value)
      Warning! Allow overwriting on a current stream. Overwriting is not a good idea because it will re-use the same IV. This is not recommended if you use the stream on storing files or generally data if prior version can be inspected by others. You should only use this setting for initial encryption with parallel streams and not for overwriting!
      Parameters:
      value - True to allow overwriting operations
    • getFileNonce

      public byte[] getFileNonce() throws IOException
      Returns the initial vector that is used for encryption / decryption
      Returns:
      The file nonce
      Throws:
      IOException - Thrown if there is an IO error.
    • setRequestedNonce

      public void setRequestedNonce(byte[] nonce)
      Set the nonce for encryption/decryption for this file.
      Parameters:
      nonce - Nonce to be used.
      Throws:
      SalmonSecurityException - Thrown if there is a security exception
    • getRequestedNonce

      public byte[] getRequestedNonce()
      Get the nonce that is used for encryption/decryption of this file.
      Returns:
      The requested nonce
    • getBlockSize

      public int getBlockSize()
      Return the AES block size for encryption / decryption
      Returns:
      The block size
    • getChildrenCount

      public int getChildrenCount()
      Get the count of files and subdirectories
      Returns:
      The children count
    • listFiles

      public SalmonFile[] listFiles()
      Lists files and directories under this directory
      Specified by:
      listFiles in interface IVirtualFile
    • getChild

      public SalmonFile getChild(String filename) throws IOException
      Get a child with this filename.
      Specified by:
      getChild in interface IVirtualFile
      Parameters:
      filename - The filename to search for
      Returns:
      The child file
      Throws:
      SalmonSecurityException - Thrown if there is a security exception
      IntegrityException - Thrown if the data are corrupt or tampered with.
      IOException - Thrown if there is an IO error.
      SalmonAuthException - Thrown if there is an Authorization error
    • createDirectory

      public SalmonFile createDirectory(String dirName) throws IOException
      Creates a directory under this directory
      Specified by:
      createDirectory in interface IVirtualFile
      Parameters:
      dirName - The name of the directory to be created
      Throws:
      IOException
    • createDirectory

      public SalmonFile createDirectory(String dirName, byte[] key, byte[] dirNameNonce) throws IOException
      Creates a directory under this directory
      Parameters:
      dirName - The name of the directory to be created
      key - The key that will be used to encrypt the directory name
      dirNameNonce - The nonce to be used for encrypting the directory name
      Returns:
      The directory that was created
      Throws:
      IOException - Thrown when error during IO
    • getRealFile

      public IRealFile getRealFile()
      Return the real file
      Specified by:
      getRealFile in interface IVirtualFile
    • isFile

      public boolean isFile()
      Returns true if this is a file
      Specified by:
      isFile in interface IVirtualFile
    • isDirectory

      public boolean isDirectory()
      Returns True if this is a directory
      Specified by:
      isDirectory in interface IVirtualFile
    • getPath

      public String getPath() throws IOException
      Return the path of the real file stored
      Specified by:
      getPath in interface IVirtualFile
      Throws:
      IOException
    • getRealPath

      public String getRealPath()
      Return the path of the real file
      Specified by:
      getRealPath in interface IVirtualFile
    • getBaseName

      public String getBaseName() throws IOException
      Returns the basename for the file
      Specified by:
      getBaseName in interface IVirtualFile
      Throws:
      IOException
    • getParent

      public SalmonFile getParent()
      Returns the virtual parent directory
      Specified by:
      getParent in interface IVirtualFile
    • delete

      public void delete()
      Delete this file.
      Specified by:
      delete in interface IVirtualFile
    • mkdir

      public void mkdir()
      Create this directory. Currently Not Supported
      Specified by:
      mkdir in interface IVirtualFile
    • getLastDateTimeModified

      public long getLastDateTimeModified()
      Returns the last date modified in milliseconds
      Specified by:
      getLastDateTimeModified in interface IVirtualFile
    • getSize

      public long getSize() throws IOException
      Return the virtual size of the file excluding the header and hash signatures.
      Specified by:
      getSize in interface IVirtualFile
      Throws:
      IOException
    • createFile

      public SalmonFile createFile(String realFilename) throws IOException
      Create a file under this directory
      Specified by:
      createFile in interface IVirtualFile
      Parameters:
      realFilename - The real file name of the file (encrypted)
      Throws:
      IOException
    • createFile

      public SalmonFile createFile(String realFilename, byte[] key, byte[] fileNameNonce, byte[] fileNonce) throws IOException
      Create a file under this directory
      Parameters:
      realFilename - The real file name of the file (encrypted)
      key - The key that will be used for encryption
      fileNameNonce - The nonce for the encrypting the filename
      fileNonce - The nonce for the encrypting the file contents
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • rename

      public void rename(String newFilename) throws IOException
      Rename the virtual file name
      Specified by:
      rename in interface IVirtualFile
      Parameters:
      newFilename - The new filename this file will be renamed to
      Throws:
      IOException
    • rename

      public void rename(String newFilename, byte[] nonce) throws IOException
      Rename the virtual file name
      Parameters:
      newFilename - The new filename this file will be renamed to
      nonce - The nonce to use
      Throws:
      IOException - Thrown when error during IO
    • exists

      public boolean exists()
      Returns true if this file exists
      Specified by:
      exists in interface IVirtualFile
    • getDecryptedFilename

      protected String getDecryptedFilename(String filename, byte[] key, byte[] nonce) throws IOException
      Return the decrypted filename of a real filename
      Parameters:
      filename - The filename of a real file
      key - The encryption key if the file doesn't belong to a drive
      nonce - The nonce if the file doesn't belong to a drive
      Returns:
      The decrypted filename
      Throws:
      IOException - Thrown if there is an IO error.
    • getEncryptedFilename

      protected String getEncryptedFilename(String filename, byte[] key, byte[] nonce) throws IOException
      Return the encrypted filename of a virtual filename
      Parameters:
      filename - The virtual filename
      key - The encryption key if the file doesn't belong to a drive
      nonce - The nonce if the file doesn't belong to a drive
      Returns:
      The encrypted file name
      Throws:
      IOException - Thrown if there is an IO error.
    • getDrive

      public SalmonDrive getDrive()
      Get the drive this file belongs to.
      Returns:
      The drive
    • setTag

      public void setTag(Object tag)
      Set the tag for this file.
      Parameters:
      tag - The file tag
    • getTag

      public Object getTag()
      Get the file tag.
      Returns:
      The file tag.
    • move

      public SalmonFile move(IVirtualFile dir, BiConsumer<Long,Long> OnProgressListener) throws IOException
      Move file to another directory.
      Specified by:
      move in interface IVirtualFile
      Parameters:
      dir - Target directory.
      OnProgressListener - Observer to notify when move progress changes.
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • copy

      public SalmonFile copy(IVirtualFile dir, BiConsumer<Long,Long> OnProgressListener) throws IOException
      Copy a file to another directory.
      Specified by:
      copy in interface IVirtualFile
      Parameters:
      dir - Target directory.
      OnProgressListener - Observer to notify when copy progress changes.
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • copyRecursively

      public void copyRecursively(IVirtualFile dest, TriConsumer<IVirtualFile,Long,Long> progressListener, Function<IVirtualFile,String> autoRename, boolean autoRenameFolders, BiConsumer<IVirtualFile,Exception> onFailed) throws IOException
      Copy a directory recursively
      Specified by:
      copyRecursively in interface IVirtualFile
      Parameters:
      dest - The destination directory
      progressListener - The progress listener
      autoRename - The autorename function
      onFailed - The callback when file copying has failed
      Throws:
      IOException
    • moveRecursively

      public void moveRecursively(IVirtualFile dest, TriConsumer<IVirtualFile,Long,Long> progressListener, Function<IVirtualFile,String> autoRename, boolean autoRenameFolders, BiConsumer<IVirtualFile,Exception> onFailed) throws IOException
      Move a directory recursively
      Specified by:
      moveRecursively in interface IVirtualFile
      Parameters:
      dest - The destination directory
      progressListener - The progress listener
      autoRename - The autorename function
      onFailed - Callback when move fails
      Throws:
      IOException
    • deleteRecursively

      public void deleteRecursively(TriConsumer<IVirtualFile,Long,Long> progressListener, BiConsumer<IVirtualFile,Exception> onFailed)
      Specified by:
      deleteRecursively in interface IVirtualFile
    • getMinimumPartSize

      public long getMinimumPartSize() throws IOException
      Returns the minimum part size that can be encrypted / decrypted in parallel aligning to the integrity chunk size if available.
      Returns:
      The minimum part size
      Throws:
      IOException - Thrown if there is an IO error.
    • autoRename

      public static String autoRename(SalmonFile file) throws Exception
      Throws:
      Exception