package net.i2p.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import net.i2p.I2PAppContext;
/**
* Same as FileOutputStream but sets the file mode so it can only
* be read and written by the owner only (i.e. 600 on linux)
*
* @since 0.8.1
* @author zzz
*/
public class SecureFileOutputStream extends FileOutputStream {
private static final boolean oneDotSix = SystemVersion.isJava6();
/**
* Sets output file to mode 600
*/
public SecureFileOutputStream(String file) throws FileNotFoundException {
super(file);
setPerms(new File(file));
}
/**
* Sets output file to mode 600 whether append = true or false
*/
public SecureFileOutputStream(String file, boolean append) throws FileNotFoundException {
super(file, append);
//if (!append)
setPerms(new File(file));
}
/**
* Sets output file to mode 600
*/
public SecureFileOutputStream(File file) throws FileNotFoundException {
super(file);
setPerms(file);
}
/**
* Sets output file to mode 600 only if append = false
* (otherwise it is presumed to be 600 already)
*/
public SecureFileOutputStream(File file, boolean append) throws FileNotFoundException {
super(file, append);
//if (!append)
setPerms(file);
}
/** @since 0.8.2 */
static boolean canSetPerms() {
if (!oneDotSix)
return false;
I2PAppContext ctx = I2PAppContext.getCurrentContext();
if (ctx == null)
return true;
return !ctx.getBooleanProperty("i2p.insecureFiles");
}
/**
* Tries to set the permissions to 600,
* ignores errors
*/
public static void setPerms(File f) {
if (!canSetPerms())
return;
try {
f.setReadable(false, false);
f.setReadable(true, true);
f.setWritable(false, false);
f.setWritable(true, true);
} catch (Throwable t) {
// NoSuchMethodException or NoSuchMethodError if we somehow got the
// version detection wrong or the JVM doesn't support it
}
}
}