/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pieShare.pieShareApp.service.fileService.fileEncryptionService;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileLock;
import java.security.InvalidKeyException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import org.apache.commons.codec.binary.Base64InputStream;
import org.apache.commons.codec.binary.Base64OutputStream;
import org.pieShare.pieShareApp.model.PieShareAppBeanNames;
import org.pieShare.pieShareApp.model.PieUser;
import org.pieShare.pieShareApp.model.pieFile.PieFile;
import org.pieShare.pieShareApp.service.fileService.api.IFileService;
import org.pieShare.pieTools.pieUtilities.service.base64Service.api.IBase64Service;
import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService;
import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger;
import org.pieShare.pieTools.pieUtilities.service.security.IProviderService;
import org.pieShare.pieTools.pieUtilities.service.security.encodeService.api.IEncodeService;
import org.pieShare.pieTools.pieUtilities.service.security.hashService.IHashService;
/**
*
* @author Svetoslav
*/
public class FileEncryptionService implements IFileEncryptionService {
IProviderService providerService;
IFileService fileService;
IBeanService beanService;
private IBase64Service base64Service;
public void setBeanService(IBeanService beanService) {
this.beanService = beanService;
}
public void setProviderService(IProviderService providerService) {
this.providerService = providerService;
}
public void setFileService(IFileService fileService) {
this.fileService = fileService;
}
private Cipher getCipher(int mode) throws InvalidKeyException {
Cipher cipher = this.providerService.getEnDeCryptCipher();
PieUser user = beanService.getBean(PieShareAppBeanNames.getPieUser());
cipher.init(mode, user.getPassword().getSecretKey());
return cipher;
}
private void rewriteFile(InputStream inStream, OutputStream outStream) throws IOException {
byte bytes[] = new byte[1024*4];
int length = 0;
while((length = inStream.read(bytes)) != -1) {
outStream.write(bytes, 0, length);
outStream.flush();
}
outStream.close();
inStream.close();
}
@Override
public void encryptFile(File source, File target) {
try {
FileInputStream stream = new FileInputStream(source);
FileOutputStream fileStream = new FileOutputStream(target);
CipherOutputStream outputStream = new CipherOutputStream(fileStream, this.getCipher(Cipher.ENCRYPT_MODE));
//Base64OutputStream base64OutStream = new Base64OutputStream(fileStream);
this.rewriteFile(stream, outputStream);
} catch (FileNotFoundException ex) {
PieLogger.error(this.getClass(), "Exception in FileEncrypterService!", ex);
} catch (IOException ex) {
PieLogger.error(this.getClass(), "Exception in FileEncrypterService!", ex);
} catch (InvalidKeyException ex) {
PieLogger.error(this.getClass(), "Exception in FileEncrypterService!", ex);
}
}
@Override
public void decryptFile(File source, File target) {
try {
//CipherInputStream stream = new CipherInputStream(new FileInputStream(this.fileService.getAbsolutePath(file).toFile()), this.getCipher(Cipher.DECRYPT_MODE));
FileInputStream fileStream = new FileInputStream(source);
CipherInputStream stream = new CipherInputStream(fileStream, this.getCipher(Cipher.DECRYPT_MODE));
//Base64InputStream base64Input = new Base64InputStream(fileStream);
//FileOutputStream outputStream = new FileOutputStream(this.fileService.getAbsolutePath(workingFile).toFile());
FileOutputStream outputStream = new FileOutputStream(target);
this.rewriteFile(stream, outputStream);
} catch (FileNotFoundException ex) {
PieLogger.error(this.getClass(), "Error!", ex);
} catch (IOException ex) {
PieLogger.error(this.getClass(), "Error!", ex);
} catch (InvalidKeyException ex) {
PieLogger.error(this.getClass(), "Error!", ex);
}
}
}