package de.dal33t.powerfolder.pro.encryption; import java.net.URI; import de.dal33t.powerfolder.Controller; import de.dal33t.powerfolder.disk.Folder; import de.dal33t.powerfolder.util.Debug; import de.dal33t.powerfolder.util.Reject; import de.schlichtherle.truezip.crypto.raes.RaesKeyException; import de.schlichtherle.truezip.crypto.raes.RaesParameters; import de.schlichtherle.truezip.crypto.raes.Type0RaesParameters; import de.schlichtherle.truezip.fs.FsController; import de.schlichtherle.truezip.fs.FsModel; import de.schlichtherle.truezip.fs.archive.zip.raes.SafeZipRaesDriver; import de.schlichtherle.truezip.key.sl.KeyManagerLocator; import de.schlichtherle.truezip.socket.sl.IOPoolLocator; public class CustomZipRaesDriver extends SafeZipRaesDriver { private CustomRaesParameters param; private Controller controller; public CustomZipRaesDriver(Controller controller) { super(IOPoolLocator.SINGLETON, KeyManagerLocator.SINGLETON); Reject.ifNull(controller, "Controller"); this.controller = controller; param = new CustomRaesParameters("xxx".toCharArray()); } @Override protected RaesParameters raesParameters(FsModel model) { // If you need the URI of the particular archive file, then call // model.getMountPoint().toUri(). // If you need a more user friendly form of this URI, then call // model.getMountPoint().toHierarchicalUri(). // Let's not use the key manager but instead our custom parameters. System.err.println(Thread.currentThread().toString()); System.err.println(Debug.getCurrentStackTrace()); System.err.println(getFolder(model.getMountPoint().toUri())); return param; } private Folder getFolder(URI baseURI) { System.err.println("baseURI: " + baseURI); for (Folder folder : controller.getFolderRepository().getFolders()) { URI folderURI = folder.getLocalBase().toURI(); System.err.println("folderURI: " + folderURI); if (folderURI.equals(baseURI)) { return folder; } } return null; } @Override public FsController<?> newController(FsModel model, FsController<?> parent) { // This is a minor improvement: The default implementation decorates // the default file system controller chain with a package private // file system controller which keeps track of the encryption keys. // Because we are not using the key manager, we don't need this // special purpose file system controller and can use the default // file system controller chain instead. return superNewController(model, parent); } private static final class CustomRaesParameters implements Type0RaesParameters { final char[] password; CustomRaesParameters(final char[] password) { this.password = password.clone(); } public char[] getWritePassword() throws RaesKeyException { System.err.println("getWritePassword"); return password.clone(); } public char[] getReadPassword(boolean invalid) throws RaesKeyException { System.err.println("getReadPassword"); if (invalid) throw new RaesKeyException("Invalid password!"); return password.clone(); } public KeyStrength getKeyStrength() throws RaesKeyException { return KeyStrength.BITS_256; } public void setKeyStrength(KeyStrength keyStrength) throws RaesKeyException { // We have been using only 128 bits to create archive entries. assert KeyStrength.BITS_256 == keyStrength; } } }