package org.zaproxy.zap.view.widgets; import java.io.File; import java.nio.file.Files; import java.text.MessageFormat; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import org.parosproxy.paros.Constant; import org.parosproxy.paros.model.Model; public class WritableFileChooser extends JFileChooser { private static final long serialVersionUID = -8600149638325315049L; private static final int MINIMUM_SPACE_REQUIREMENT_MB = 5000000; public WritableFileChooser() { super(); } public WritableFileChooser(File currentDirectory) { super(currentDirectory); } @Override public void approveSelection() { File selectedFile = getSelectedFile(); File checkFile = selectedFile; boolean fileExists = checkFile.exists(); if (!fileExists) { checkFile = checkFile.getParentFile(); } if (checkFile.getUsableSpace() < MINIMUM_SPACE_REQUIREMENT_MB) { int result = JOptionPane.showConfirmDialog(this, Constant.messages.getString("report.write.diskspace.warning.dialog.message"), Constant.messages.getString("report.write.diskspace.warning.dialog.title"), JOptionPane.YES_NO_OPTION); if (result != JOptionPane.YES_OPTION) { return; } } if (!Files.isWritable(selectedFile.getParentFile().toPath())) { warnNotWritable("report.write.permission.dir.dialog.message", selectedFile.getParentFile().getAbsolutePath()); return; } if (fileExists) { if (!Files.isWritable(selectedFile.toPath())) { warnNotWritable("report.write.permission.file.dialog.message", selectedFile.getAbsolutePath()); return; } int result = JOptionPane.showConfirmDialog(this, Constant.messages.getString("report.write.overwrite.dialog.message"), Constant.messages.getString("report.write.overwrite.dialog.title"), JOptionPane.YES_NO_OPTION); switch (result) { case JOptionPane.YES_OPTION: super.approveSelection(); return; case JOptionPane.NO_OPTION: case JOptionPane.CLOSED_OPTION: return; } } // Store the user directory as the currently selected one Model.getSingleton().getOptionsParam().setUserDirectory(getCurrentDirectory()); super.approveSelection(); } private void warnNotWritable(String i18nKeyMessage, String path) { JOptionPane.showMessageDialog(this, MessageFormat.format(Constant.messages.getString(i18nKeyMessage), path), Constant.messages.getString("report.write.permission.dialog.title"), JOptionPane.ERROR_MESSAGE); } }