* fine-tune DropToUnlock behaviour to better deal with app sandboxing
This commit is contained in:
parent
50fcec7e53
commit
a28ddede8b
|
@ -4,6 +4,7 @@ import static java.util.Collections.*;
|
||||||
import static javax.swing.BorderFactory.*;
|
import static javax.swing.BorderFactory.*;
|
||||||
import static net.filebot.UserFiles.*;
|
import static net.filebot.UserFiles.*;
|
||||||
import static net.filebot.mac.MacAppUtilities.*;
|
import static net.filebot.mac.MacAppUtilities.*;
|
||||||
|
import static net.filebot.ui.NotificationLogging.*;
|
||||||
import static net.filebot.util.FileUtilities.*;
|
import static net.filebot.util.FileUtilities.*;
|
||||||
import static net.filebot.util.ui.SwingUI.*;
|
import static net.filebot.util.ui.SwingUI.*;
|
||||||
|
|
||||||
|
@ -24,6 +25,8 @@ import java.awt.event.MouseEvent;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.attribute.PosixFilePermissions;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -37,6 +40,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.swing.DefaultListCellRenderer;
|
import javax.swing.DefaultListCellRenderer;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
@ -52,6 +56,9 @@ import net.filebot.ui.HeaderPanel;
|
||||||
import net.filebot.ui.transfer.DefaultTransferHandler;
|
import net.filebot.ui.transfer.DefaultTransferHandler;
|
||||||
import net.filebot.ui.transfer.FileTransferable;
|
import net.filebot.ui.transfer.FileTransferable;
|
||||||
import net.filebot.ui.transfer.TransferablePolicy;
|
import net.filebot.ui.transfer.TransferablePolicy;
|
||||||
|
import net.filebot.util.ui.GradientStyle;
|
||||||
|
import net.filebot.util.ui.notification.SeparatorBorder;
|
||||||
|
import net.filebot.util.ui.notification.SeparatorBorder.Position;
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
|
||||||
public class DropToUnlock extends JList<File> {
|
public class DropToUnlock extends JList<File> {
|
||||||
|
@ -159,12 +166,17 @@ public class DropToUnlock extends JList<File> {
|
||||||
h.getTitleLabel().setText("Folder Permissions Required");
|
h.getTitleLabel().setText("Folder Permissions Required");
|
||||||
h.getTitleLabel().setIcon(ResourceManager.getIcon("file.lock"));
|
h.getTitleLabel().setIcon(ResourceManager.getIcon("file.lock"));
|
||||||
h.getTitleLabel().setBorder(createEmptyBorder(0, 0, 0, 64));
|
h.getTitleLabel().setBorder(createEmptyBorder(0, 0, 0, 64));
|
||||||
|
|
||||||
|
JLabel help = new JLabel("<html>FileBot does not have permission to access the folder above. To allow FileBot access, drag and drop the folder from Finder onto the drop area above</b>. The permissions for this folder (and all the folders it contains) will be remembered and FileBot will not need to ask for it again.</html>");
|
||||||
|
help.setBorder(createCompoundBorder(new SeparatorBorder(1, new Color(0xB4B4B4), new Color(0xACACAC), GradientStyle.LEFT_TO_RIGHT, Position.TOP), createTitledBorder("About App Sandboxing")));
|
||||||
|
|
||||||
c.add(h, "wmin 150px, hmin 75px, growx, dock north");
|
c.add(h, "wmin 150px, hmin 75px, growx, dock north");
|
||||||
c.add(d, "wmin 150px, hmin 150px, grow");
|
c.add(d, "wmin 150px, hmin 150px, grow");
|
||||||
|
c.add(help, "wmin 150px, hmin 75px, growx, dock south");
|
||||||
|
|
||||||
dialog.setModal(true);
|
dialog.setModal(true);
|
||||||
dialog.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
|
dialog.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
|
||||||
dialog.setSize(new Dimension(540, 420));
|
dialog.setSize(new Dimension(540, 500));
|
||||||
dialog.setResizable(false);
|
dialog.setResizable(false);
|
||||||
dialog.setLocationByPlatform(true);
|
dialog.setLocationByPlatform(true);
|
||||||
dialog.setAlwaysOnTop(true);
|
dialog.setAlwaysOnTop(true);
|
||||||
|
@ -216,7 +228,19 @@ public class DropToUnlock extends JList<File> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateLockStatus(File... folder) {
|
public void updateLockStatus(File... folder) {
|
||||||
|
// update folder locked/unlocked icon
|
||||||
repaint();
|
repaint();
|
||||||
|
|
||||||
|
// show warning if permission have not been granted
|
||||||
|
Stream.of(folder).filter(f -> isLockedFolder(f)).forEach(f -> {
|
||||||
|
try {
|
||||||
|
String owner = Files.getOwner(f.toPath()).getName();
|
||||||
|
String permissions = PosixFilePermissions.toString(Files.getPosixFilePermissions(f.toPath()));
|
||||||
|
UILogger.severe(String.format("Permission denied: %s (%s %s)", f, permissions, owner));
|
||||||
|
} catch (Exception e) {
|
||||||
|
UILogger.severe(String.format("Permission denied: %s", f));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private final RoundRectangle2D dropArea = new RoundRectangle2D.Double(0, 0, 0, 0, 20, 20);
|
private final RoundRectangle2D dropArea = new RoundRectangle2D.Double(0, 0, 0, 0, 20, 20);
|
||||||
|
|
|
@ -83,7 +83,8 @@ public class MacAppUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isLockedFolder(File folder) {
|
public static boolean isLockedFolder(File folder) {
|
||||||
return folder.isDirectory() && !folder.canRead() && !folder.canWrite();
|
// write permissions my not be available even after sandbox has granted permission (e.g. when accessing files of another user)
|
||||||
|
return folder.isDirectory() && !folder.canRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean askUnlockFolders(final Window owner, final Collection<File> files) {
|
public static boolean askUnlockFolders(final Window owner, final Collection<File> files) {
|
||||||
|
|
Loading…
Reference in New Issue