From d76fda9bfd4b4b7f9d2debfee5de12cadf15417a Mon Sep 17 00:00:00 2001 From: Alexander Rosenberg Date: Sat, 14 Sep 2024 23:51:17 -0700 Subject: [PATCH 1/3] Support for ftps --- src/main/java/zander/library/Library.java | 3 +- src/main/java/zander/library/RemoteStore.java | 87 ++++++++++- .../library/secrets/PassSecretsFactory.java | 2 +- .../ui/library/LibraryCreateDialog.java | 20 ++- .../zander/ui/library/LibraryEditDialog.java | 141 ++++++++++-------- .../ui/library/LibraryImportDialog.java | 60 +++++--- .../zander/ui/library/LibrarySelectFrame.java | 47 ++++-- .../ui/media/map/OSMLocationEncoder.java | 11 +- 8 files changed, 262 insertions(+), 109 deletions(-) diff --git a/src/main/java/zander/library/Library.java b/src/main/java/zander/library/Library.java index a4ad2af..3fa86a2 100644 --- a/src/main/java/zander/library/Library.java +++ b/src/main/java/zander/library/Library.java @@ -117,8 +117,9 @@ public class Library { private LocalCache localCache; private RemoteStore remoteStore; - public Library(File local, URI remote, Secrets secrets) throws ManifestParseException, IOException { + public Library(File local, URI remote, boolean passiveMode, Secrets secrets) throws ManifestParseException, IOException { remoteStore = new RemoteStore(remote, secrets); + remoteStore.setPassiveMode(passiveMode); localCache = new LocalCache(local); } diff --git a/src/main/java/zander/library/RemoteStore.java b/src/main/java/zander/library/RemoteStore.java index 508ffb1..156ee12 100644 --- a/src/main/java/zander/library/RemoteStore.java +++ b/src/main/java/zander/library/RemoteStore.java @@ -7,6 +7,7 @@ import java.net.ProtocolException; import java.net.URI; import java.util.concurrent.atomic.AtomicReference; +import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; @@ -34,6 +35,7 @@ public class RemoteStore { private final FTPClient ftp; private int connectionLevel = 0; private boolean ignoreManifest = false; + private boolean passiveMode; public RemoteStoreFileTypeHandler fileTypeHandler = new RemoteStoreFileTypeHandler(); @@ -42,10 +44,13 @@ public class RemoteStore { if (!url.isAbsolute() || url.getScheme().equals("ftp")) { ftp = new FTPClient(); } else if (url.getScheme().equals("ftps")) { - ftp = new FTPSClient(false); + ftp = new FTPSClient("TLS", false); + ((FTPSClient) ftp).setEndpointCheckingEnabled(true); } else { throw new ProtocolException("unknown protocol: '" + url.getScheme() + "'"); } + ftp.addProtocolCommandListener(new PrintCommandListener(System.out, true)); + ftp.setListHiddenFiles(true); this.secrets = secrets; } @@ -61,6 +66,24 @@ public class RemoteStore { this.ignoreManifest = ignoreManifest; } + public boolean isPassiveMode() { + return passiveMode; + } + + public void setPassiveMode(boolean passiveMode) throws IOException { + this.passiveMode = passiveMode; + if (connectionLevel != 0) { + String modeString = passiveMode ? "passive" : "active"; + LOGGER.info("Switching to " + modeString + " mode"); + if (passiveMode) { + ftp.enterLocalPassiveMode(); + } else { + ftp.enterLocalActiveMode(); + } + checkFtpResponse("Failed to switch to " + modeString + " mode"); + } + } + public void fetchManifest() throws IOException { doFtpActions(() -> { FTPFile info = fileInformation(MANIFEST_PATH); @@ -199,10 +222,31 @@ public class RemoteStore { return fileInformation(path) != null; } + private boolean isRootDir(String path) { + return path.matches("^(/+\\.{0,2})+$"); + } + public FTPFile fileInformation(String path) throws IOException { + if (isRootDir(path)) { + return null; + } AtomicReference file = new AtomicReference(); doFtpActions(() -> { - file.set(ftp.mlistFile(resolvePath(path))); + String pp = getParentPath(path); + if (pp == null) { + pp = getBasePath(); + } + String name = getFileName(path); + FTPFile[] files = ftp.listFiles(pp); + System.out.println("STAT " + name + " in " + pp); + for (FTPFile f : files) { + System.out.println( + (f.isDirectory() ? "D " : "F ") + + f.getName()); + if (f.getName().equals(name)) { + file.set(f); + } + } }); return file.get(); } @@ -216,6 +260,14 @@ public class RemoteStore { throw new IOException("Invalid ftp secrets! Username: '" + secrets.getUsername() + "'"); } LOGGER.info("Logged info ftp as user '{}'", secrets.getUsername()); + if (ftp instanceof FTPSClient) { + FTPSClient ftps = (FTPSClient) ftp; + ftps.execPBSZ(0); + checkFtpResponse("Failed to send PBSZ command"); + ftps.execPROT("P"); + checkFtpResponse("Failed to send PROT command"); + } + setPassiveMode(passiveMode); } } @@ -307,7 +359,10 @@ public class RemoteStore { pb.append("/"); ftp.makeDirectory(pb.toString()); } - checkFtpResponse("Could not create directory: " + pp); + info = fileInformation(pp); + // if (info == null || !info.isDirectory()) { + // throw new IOException("Failed to create directory: " + pp); + // } LOGGER.info("Created directory: {}", pp); } else if (!info.isDirectory()) { throw new IOException("Not a directory: " + pp); @@ -319,8 +374,15 @@ public class RemoteStore { if (ftp.isConnected()) { int r = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(r)) { - LOGGER.info(error); - throw new IOException(error); + String replyString = ftp.getReplyString(); + if (replyString.endsWith("\n")) { + replyString = replyString.substring(0, replyString.length() - 1); + } + if (replyString.endsWith(".")) { + replyString = replyString.substring(0, replyString.length() - 1); + } + LOGGER.info("{}: {}", error, replyString); + throw new IOException(error + ": " + replyString); } } } @@ -365,6 +427,19 @@ public class RemoteStore { if (i == -1) { return null; } - return cp.substring(0, i); + String pp = cp.substring(0, i); + while (!pp.isEmpty() && pp.charAt(pp.length() - 1) == '/') { + pp = pp.substring(0, pp.length() - 1); + } + return pp; + } + + private static String getFileName(String path) { + String cp = cleanPath(path); + int i = cp.lastIndexOf("/"); + if (i == -1) { + return cp; + } + return cp.substring(i + 1); } } diff --git a/src/main/java/zander/library/secrets/PassSecretsFactory.java b/src/main/java/zander/library/secrets/PassSecretsFactory.java index 39180c2..4e1e380 100644 --- a/src/main/java/zander/library/secrets/PassSecretsFactory.java +++ b/src/main/java/zander/library/secrets/PassSecretsFactory.java @@ -33,7 +33,7 @@ public class PassSecretsFactory extends SecretsFactory { public static boolean isBackendSupported() { try { - Process p = Runtime.getRuntime().exec("which pass"); + Process p = Runtime.getRuntime().exec(new String[] {"which", "pass"}); if (!p.waitFor(1000, TimeUnit.MILLISECONDS)) { return false; } diff --git a/src/main/java/zander/ui/library/LibraryCreateDialog.java b/src/main/java/zander/ui/library/LibraryCreateDialog.java index b38239f..fa904c2 100644 --- a/src/main/java/zander/ui/library/LibraryCreateDialog.java +++ b/src/main/java/zander/ui/library/LibraryCreateDialog.java @@ -12,6 +12,7 @@ import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; @@ -44,6 +45,8 @@ public class LibraryCreateDialog extends JDialog { private final JTextField usernameField; private final JLabel passwordLabel; private final JPasswordField passwordField; + private final JLabel ftpModeLabel; + private final JComboBox ftpModeCombo; private final JCheckBox defaultPathCheck; private final JLabel pathLabel; private final FileChooserField pathField; @@ -66,6 +69,8 @@ public class LibraryCreateDialog extends JDialog { usernameField = new JTextField(10); passwordLabel = new JLabel("Password:"); passwordField = new JPasswordField(10); + ftpModeLabel = new JLabel("FTP Mode:"); + ftpModeCombo = new JComboBox(new String[] { "Active", "Passive" }); defaultPathCheck = new JCheckBox("Use default library location"); defaultPathCheck.setSelected(true); pathLabel = new JLabel("Library Path:"); @@ -223,12 +228,21 @@ public class LibraryCreateDialog extends JDialog { entryPanel.add(passwordField, gbc); gbc.gridy = 5; gbc.gridx = 0; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + entryPanel.add(ftpModeLabel, gbc); + gbc.gridx = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.LINE_START; + entryPanel.add(ftpModeCombo, gbc); + gbc.gridy = 6; + gbc.gridx = 0; gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.NONE; gbc.gridwidth = 2; entryPanel.add(defaultPathCheck, gbc); gbc.gridwidth = 1; - gbc.gridy = 6; + gbc.gridy = 7; gbc.gridx = 0; gbc.anchor = GridBagConstraints.LINE_END; entryPanel.add(pathLabel, gbc); @@ -266,4 +280,8 @@ public class LibraryCreateDialog extends JDialog { return pathField.getPathField().getText(); } + public boolean isFtpPassiveMode() { + return ftpModeCombo.getSelectedItem().equals("Passive"); + } + } diff --git a/src/main/java/zander/ui/library/LibraryEditDialog.java b/src/main/java/zander/ui/library/LibraryEditDialog.java index 92e9a58..8770768 100644 --- a/src/main/java/zander/ui/library/LibraryEditDialog.java +++ b/src/main/java/zander/ui/library/LibraryEditDialog.java @@ -12,6 +12,7 @@ import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; @@ -44,6 +45,8 @@ public class LibraryEditDialog extends JDialog { private final JTextField usernameField; private final JLabel passwordLabel; private final JPasswordField passwordField; + private final JLabel ftpModeLabel; + private final JComboBox ftpModeCombo; private final JCheckBox defaultPathCheck; private final JLabel pathLabel; private final FileChooserField pathField; @@ -55,7 +58,9 @@ public class LibraryEditDialog extends JDialog { private final JPanel buttonPanel; private final JPanel panel; - public LibraryEditDialog(Window parent, String name, String url, String ftp, String username, String password, String file, Runnable cacheClearCallback) { + public LibraryEditDialog(Window parent, String name, String url, String ftp, + String username, String password, boolean passiveMode, String file, + Runnable cacheClearCallback) { super(parent, "Edit Library"); nameLabel = new JLabel("Name:"); nameField = new JTextField(10); @@ -72,6 +77,9 @@ public class LibraryEditDialog extends JDialog { passwordLabel = new JLabel("Password:"); passwordField = new JPasswordField(10); passwordField.setText(password); + ftpModeLabel = new JLabel("FTP Mode:"); + ftpModeCombo = new JComboBox(new String[] { "Active", "Passive" }); + ftpModeCombo.setSelectedIndex(passiveMode ? 1 : 0); defaultPathCheck = new JCheckBox("Use default library location"); pathLabel = new JLabel("Library Path:"); pathField = new FileChooserField(10, file, new File(LibrarySelectFrame.DEFAULT_LIBRARY_PATH)); @@ -84,64 +92,64 @@ public class LibraryEditDialog extends JDialog { pathField.getChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); pathField.getChooser().setDialogTitle("Select Library Location"); nameField.getDocument().addDocumentListener(new DocumentListener(){ - @Override - public void insertUpdate(DocumentEvent e) { - update(); - } + @Override + public void insertUpdate(DocumentEvent e) { + update(); + } - @Override - public void removeUpdate(DocumentEvent e) { - update(); - } + @Override + public void removeUpdate(DocumentEvent e) { + update(); + } - @Override - public void changedUpdate(DocumentEvent e) { - update(); - } + @Override + public void changedUpdate(DocumentEvent e) { + update(); + } - private void update() { - if (defaultPathCheck.isSelected()) { - pathField.getPathField().setText(LibrarySelectFrame.DEFAULT_LIBRARY_PATH + "/" + nameField.getText()); - } - } - }); - defaultPathCheck.addItemListener((e) -> { + private void update() { if (defaultPathCheck.isSelected()) { pathField.getPathField().setText(LibrarySelectFrame.DEFAULT_LIBRARY_PATH + "/" + nameField.getText()); - pathField.setEnabled(false); - } else { - pathField.setEnabled(true); } - }); + } + }); + defaultPathCheck.addItemListener((e) -> { + if (defaultPathCheck.isSelected()) { + pathField.getPathField().setText(LibrarySelectFrame.DEFAULT_LIBRARY_PATH + "/" + nameField.getText()); + pathField.setEnabled(false); + } else { + pathField.setEnabled(true); + } + }); entryPanel = new JPanel(new GridBagLayout()); buildEntryPanel(); cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.addActionListener((e) -> { - dispose(); - }); + dispose(); + }); clearCacheButton = new JButton("Clear Cache"); clearCacheButton.setMnemonic(KeyEvent.VK_L); clearCacheButton.addActionListener((e) -> { - int c = JOptionPane.showConfirmDialog(this, "Are you sure you would like to clear this library's cache?", - "Clear Cahce", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - if (cacheClearCallback != null && c == JOptionPane.YES_OPTION) { - cacheClearCallback.run(); - } - }); + int c = JOptionPane.showConfirmDialog(this, "Are you sure you would like to clear this library's cache?", + "Clear Cahce", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (cacheClearCallback != null && c == JOptionPane.YES_OPTION) { + cacheClearCallback.run(); + } + }); helpButton = new JButton("?"); helpButton.addActionListener((e) -> DocumentationViewer.show(this, "Libraries/Local Library Settings")); saveButton = new JButton("Save"); saveButton.setMnemonic(KeyEvent.VK_S); saveButton.setEnabled(false); saveButton.addActionListener((e) -> { - if (nameField.getText().contains("/")) { - JOptionPane.showMessageDialog(this, "Library names cannot contain the '/' character!", "Library Error", JOptionPane.ERROR_MESSAGE); - } else { - dispose(); - response = RESPONSE_SAVE; - } - }); + if (nameField.getText().contains("/")) { + JOptionPane.showMessageDialog(this, "Library names cannot contain the '/' character!", "Library Error", JOptionPane.ERROR_MESSAGE); + } else { + dispose(); + response = RESPONSE_SAVE; + } + }); buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); buttonPanel.add(cancelButton); @@ -150,30 +158,30 @@ public class LibraryEditDialog extends JDialog { buttonPanel.add(clearCacheButton); buttonPanel.add(saveButton); final DocumentListener formFillListener = new DocumentListener(){ - @Override - public void insertUpdate(DocumentEvent e) { - update(); - } + @Override + public void insertUpdate(DocumentEvent e) { + update(); + } - @Override - public void removeUpdate(DocumentEvent e) { - update(); - } + @Override + public void removeUpdate(DocumentEvent e) { + update(); + } - @Override - public void changedUpdate(DocumentEvent e) { - update(); - } + @Override + public void changedUpdate(DocumentEvent e) { + update(); + } - private void update() { - if (!nameField.getText().isBlank() && !ftpField.getText().isBlank() - && !usernameField.getText().isBlank() && !pathField.getPathField().getText().isBlank()) { - saveButton.setEnabled(true); - } else { - saveButton.setEnabled(false); - } + private void update() { + if (!nameField.getText().isBlank() && !ftpField.getText().isBlank() + && !usernameField.getText().isBlank() && !pathField.getPathField().getText().isBlank()) { + saveButton.setEnabled(true); + } else { + saveButton.setEnabled(false); } - }; + } + }; nameField.getDocument().addDocumentListener(formFillListener); ftpField.getDocument().addDocumentListener(formFillListener); usernameField.getDocument().addDocumentListener(formFillListener); @@ -245,11 +253,20 @@ public class LibraryEditDialog extends JDialog { gbc.gridy = 5; gbc.gridx = 0; gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + entryPanel.add(ftpModeLabel, gbc); + gbc.gridx = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.LINE_START; + entryPanel.add(ftpModeCombo, gbc); + gbc.gridy = 6; + gbc.gridx = 0; + gbc.fill = GridBagConstraints.NONE; gbc.anchor = GridBagConstraints.CENTER; gbc.gridwidth = 2; entryPanel.add(defaultPathCheck, gbc); gbc.gridwidth = 1; - gbc.gridy = 6; + gbc.gridy = 7; gbc.gridx = 0; gbc.anchor = GridBagConstraints.LINE_END; entryPanel.add(pathLabel, gbc); @@ -287,4 +304,8 @@ public class LibraryEditDialog extends JDialog { return pathField.getPathField().getText(); } + public boolean isFtpPassiveMode() { + return ftpModeCombo.getSelectedItem().equals("Passive"); + } + } diff --git a/src/main/java/zander/ui/library/LibraryImportDialog.java b/src/main/java/zander/ui/library/LibraryImportDialog.java index 70dc3a4..98488e4 100644 --- a/src/main/java/zander/ui/library/LibraryImportDialog.java +++ b/src/main/java/zander/ui/library/LibraryImportDialog.java @@ -10,6 +10,7 @@ import java.awt.event.KeyEvent; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; +import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; @@ -39,6 +40,8 @@ public class LibraryImportDialog extends JDialog { private final JTextField usernameField; private final JLabel passwordLabel; private final JPasswordField passwordField; + private final JLabel ftpModeLabel; + private final JComboBox ftpModeCombo; private final JLabel fileLabel; private final FileChooserField fileField; private final JPanel entryPanel; @@ -58,6 +61,8 @@ public class LibraryImportDialog extends JDialog { usernameField = new JTextField(10); passwordLabel = new JLabel("Password:"); passwordField = new JPasswordField(10); + ftpModeLabel = new JLabel("FTP Mode:"); + ftpModeCombo = new JComboBox(new String[] { "Active", "Passive" }); fileLabel = new JLabel("Source:"); fileField = new FileChooserField(10); fileField.getChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); @@ -69,17 +74,17 @@ public class LibraryImportDialog extends JDialog { cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.addActionListener((e) -> { - dispose(); - }); + dispose(); + }); helpButton = new JButton("?"); helpButton.addActionListener((e) -> DocumentationViewer.show(this, "Libraries/Local Library Settings")); importButton = new JButton("Import"); importButton.setMnemonic(KeyEvent.VK_I); importButton.setEnabled(false); importButton.addActionListener((e) -> { - dispose(); - response = RESPONSE_IMPORT; - }); + dispose(); + response = RESPONSE_IMPORT; + }); buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); buttonPanel.add(cancelButton); @@ -87,26 +92,26 @@ public class LibraryImportDialog extends JDialog { buttonPanel.add(helpButton); buttonPanel.add(importButton); final DocumentListener formFillListener = new DocumentListener(){ - @Override - public void insertUpdate(DocumentEvent e) { - update(); - } + @Override + public void insertUpdate(DocumentEvent e) { + update(); + } - @Override - public void removeUpdate(DocumentEvent e) { - update(); - } + @Override + public void removeUpdate(DocumentEvent e) { + update(); + } - @Override - public void changedUpdate(DocumentEvent e) { - update(); - } + @Override + public void changedUpdate(DocumentEvent e) { + update(); + } - private void update() { - importButton.setEnabled(!ftpField.getText().isBlank() && !usernameField.getText().isBlank() && !fileField.getPathField().getText().isBlank()); - } - }; + private void update() { + importButton.setEnabled(!ftpField.getText().isBlank() && !usernameField.getText().isBlank() && !fileField.getPathField().getText().isBlank()); + } + }; ftpField.getDocument().addDocumentListener(formFillListener); usernameField.getDocument().addDocumentListener(formFillListener); fileField.getPathField().getDocument().addDocumentListener(formFillListener); @@ -167,6 +172,15 @@ public class LibraryImportDialog extends JDialog { gbc.gridx = 0; gbc.anchor = GridBagConstraints.LINE_END; gbc.fill = GridBagConstraints.NONE; + entryPanel.add(ftpModeLabel, gbc); + gbc.gridx = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.anchor = GridBagConstraints.LINE_START; + entryPanel.add(ftpModeCombo, gbc); + gbc.gridy = 5; + gbc.gridx = 0; + gbc.anchor = GridBagConstraints.LINE_END; + gbc.fill = GridBagConstraints.NONE; entryPanel.add(fileLabel, gbc); gbc.gridx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; @@ -198,4 +212,8 @@ public class LibraryImportDialog extends JDialog { return fileField.getPathField().getText(); } + public boolean isFtpPassiveMode() { + return ftpModeCombo.getSelectedItem().equals("Passive"); + } + } diff --git a/src/main/java/zander/ui/library/LibrarySelectFrame.java b/src/main/java/zander/ui/library/LibrarySelectFrame.java index cd122cc..27333f9 100644 --- a/src/main/java/zander/ui/library/LibrarySelectFrame.java +++ b/src/main/java/zander/ui/library/LibrarySelectFrame.java @@ -80,12 +80,15 @@ public class LibrarySelectFrame extends JFrame { public String name; public String url; public String ftp; + public boolean passiveMode; public File file; - public LibraryEntry(String name, String url, String ftp, File file) { + public LibraryEntry(String name, String url, String ftp, + boolean passiveMode, File file) { this.name = name; this.url = url; this.ftp = ftp; + this.passiveMode = passiveMode; this.file = file; } @@ -101,7 +104,9 @@ public class LibrarySelectFrame extends JFrame { public boolean equals(Object o) { if (o instanceof LibraryEntry) { LibraryEntry e = (LibraryEntry) o; - return e.name.equals(name) && e.url.equals(url) && e.file.getPath().equals(file.getPath()); + return e.name.equals(name) && e.url.equals(url) && + e.file.getPath().equals(file.getPath()) && + e.passiveMode == passiveMode; } return false; } @@ -201,7 +206,8 @@ public class LibrarySelectFrame extends JFrame { nld.setVisible(true); if (nld.getResponse() == LibraryCreateDialog.RESPONSE_CREATE) { createLibrary(nld.getLibraryName(), nld.getURL(), nld.getFTP(), - nld.getUsername(), nld.getPassword(), new File(nld.getLibraryFile())); + nld.getUsername(), nld.getPassword(), + nld.isFtpPassiveMode(), new File(nld.getLibraryFile())); } }); importItem = new JMenuItem("Import"); @@ -209,7 +215,8 @@ public class LibrarySelectFrame extends JFrame { LibraryImportDialog lid = new LibraryImportDialog(this); lid.setVisible(true); if (lid.getResponse() == LibraryImportDialog.RESPONSE_IMPORT) { - importLibrary(lid.getURL(), lid.getFTP(), lid.getUsername(), lid.getPassword(), new File(lid.getFile())); + importLibrary(lid.getURL(), lid.getFTP(), lid.getUsername(), + lid.getPassword(), lid.isFtpPassiveMode(), new File(lid.getFile())); } }); listPopup = new JPopupMenu(); @@ -287,7 +294,8 @@ public class LibrarySelectFrame extends JFrame { LibraryImportDialog lid = new LibraryImportDialog(this); lid.setVisible(true); if (lid.getResponse() == LibraryImportDialog.RESPONSE_IMPORT) { - importLibrary(lid.getURL(), lid.getFTP(), lid.getUsername(), lid.getPassword(), new File(lid.getFile())); + importLibrary(lid.getURL(), lid.getFTP(), lid.getUsername(), + lid.getPassword(), lid.isFtpPassiveMode(), new File(lid.getFile())); } }); newButton = new JButton("New"); @@ -297,7 +305,8 @@ public class LibrarySelectFrame extends JFrame { nld.setVisible(true); if (nld.getResponse() == LibraryCreateDialog.RESPONSE_CREATE) { createLibrary(nld.getLibraryName(), nld.getURL(), nld.getFTP(), - nld.getUsername(), nld.getPassword(), new File(nld.getLibraryFile())); + nld.getUsername(), nld.getPassword(), + nld.isFtpPassiveMode(), new File(nld.getLibraryFile())); } }); deleteButton = new JButton("Delete"); @@ -468,7 +477,9 @@ public class LibrarySelectFrame extends JFrame { } private String formatLibraryUrl(String url) { - if (!url.matches("^https?\\:\\/\\/.*")) { + if (url.isBlank()) { + return ""; + } else if (!url.matches("^https?\\:\\/\\/.*")) { return "https://" + url; } return url; @@ -476,9 +487,10 @@ public class LibrarySelectFrame extends JFrame { private void editLibrary(LibraryEntry en) { Secrets s = SECRETS_FACTORY.createSecrets(SECRETS_KEY + en.name); - LibraryEditDialog led = new LibraryEditDialog(this, en.name, en.url, en.ftp, - s.getUsername(), s.getPassword(), en.file.getPath(), - () -> clearLibraryCache(en)); + LibraryEditDialog led = new LibraryEditDialog(this, en.name, en.url, + en.ftp, s.getUsername(), s.getPassword(), + en.passiveMode, en.file.getPath(), + () -> clearLibraryCache(en)); led.setVisible(true); if (led.getResponse() == LibraryEditDialog.RESPONSE_SAVE) { String testName = ""; @@ -506,6 +518,7 @@ public class LibrarySelectFrame extends JFrame { en.name = led.getLibraryName(); en.url = formatLibraryUrl(led.getURL()); en.ftp = led.getFTP(); + en.passiveMode = led.isFtpPassiveMode(); en.file = nf; saveLibraryList(); list.repaint(); @@ -548,7 +561,7 @@ public class LibrarySelectFrame extends JFrame { settingsPutObject("last-library", en); Secrets s = SECRETS_FACTORY.createSecrets(SECRETS_KEY + en.name); try { - Library lib = new Library(en.file, new URI(en.ftp), s); + Library lib = new Library(en.file, new URI(en.ftp), en.passiveMode, s); LibrarySyncDialog lsd = new LibrarySyncDialog(null, lib); if (lsd.sync() == LibrarySyncDialog.STATUS_OK) { return lib; @@ -622,7 +635,8 @@ public class LibrarySelectFrame extends JFrame { } } - private void importLibrary(String url, String ftp, String username, String password, File dir) { + private void importLibrary(String url, String ftp, String username, + String password, boolean passiveMode, File dir) { File cf = null; try { cf = dir.getCanonicalFile(); @@ -640,7 +654,7 @@ public class LibrarySelectFrame extends JFrame { Secrets s = SECRETS_FACTORY.createSecrets(SECRETS_KEY + name); s.setUsername(username); s.setPassword(password); - LibraryEntry en = new LibraryEntry(name, url, ftp, cf); + LibraryEntry en = new LibraryEntry(name, url, ftp, passiveMode, cf); LIBRARY_ENTRIES.add(0, en); openLibrary(en, false); } @@ -702,7 +716,8 @@ public class LibrarySelectFrame extends JFrame { return true; } - private void createLibrary(String name, String url, String ftp, String username, String password, File file) { + private void createLibrary(String name, String url, String ftp, + String username, String password, boolean passiveMode, File file) { File cf = null; try { cf = file.getCanonicalFile(); @@ -726,7 +741,7 @@ public class LibrarySelectFrame extends JFrame { recursiveDelete(cf); break; case LibraryExistsDialog.RESPONSE_IMPORT: - importLibrary(url, ftp, username, password, file); + importLibrary(url, ftp, username, password, passiveMode, file); return; default: return; @@ -756,7 +771,7 @@ public class LibrarySelectFrame extends JFrame { Secrets s = SECRETS_FACTORY.createSecrets(SECRETS_KEY + name); s.setUsername(username); s.setPassword(password); - LibraryEntry en = new LibraryEntry(name, url, ftp, cf); + LibraryEntry en = new LibraryEntry(name, url, ftp, passiveMode, cf); LIBRARY_ENTRIES.add(0, en); openLibrary(en, false); } diff --git a/src/main/java/zander/ui/media/map/OSMLocationEncoder.java b/src/main/java/zander/ui/media/map/OSMLocationEncoder.java index 32be2b1..9a49e1e 100644 --- a/src/main/java/zander/ui/media/map/OSMLocationEncoder.java +++ b/src/main/java/zander/ui/media/map/OSMLocationEncoder.java @@ -3,6 +3,8 @@ package zander.ui.media.map; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; @@ -128,9 +130,12 @@ public class OSMLocationEncoder implements LocationEncoder { private static URL getURLForQuery(String query) { try { - final String encodedQuery = URLEncoder.encode(query, StandardCharsets.UTF_8); - return new URL("https://nominatim.openstreetmap.org/search.php?format=jsonv2&q=" + encodedQuery); - } catch (MalformedURLException e) { + final String encodedQuery = URLEncoder.encode(query, + StandardCharsets.UTF_8); + return new URI( + "https://nominatim.openstreetmap.org/search.php?format=jsonv2&q=" + + encodedQuery).toURL(); + } catch (URISyntaxException | MalformedURLException e) { LOGGER.error("Could not generate url for query: '{}'", query, e); throw new Error("Could not create URL!", e); } From 67ad3bf02400d0deb9aeb26e2ff5aa5591592bc0 Mon Sep 17 00:00:00 2001 From: Alexander Rosenberg Date: Sun, 15 Sep 2024 00:33:07 -0700 Subject: [PATCH 2/3] Update built in documentation system --- src/main/java/zander/Start.java | 3 -- .../ui/library/LibraryCreateDialog.java | 2 +- .../zander/ui/library/LibraryEditDialog.java | 4 +- .../ui/library/LibraryImportDialog.java | 2 +- .../resources/docs/library-create-dialog.png | Bin 7778 -> 28307 bytes .../resources/docs/library-edit-dialog.png | Bin 8501 -> 29312 bytes .../resources/docs/library-import-dialog.png | Bin 5429 -> 19906 bytes .../docs/local-library-settings.html | 45 +++++++++++------- 8 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/main/java/zander/Start.java b/src/main/java/zander/Start.java index a0be718..507d68e 100644 --- a/src/main/java/zander/Start.java +++ b/src/main/java/zander/Start.java @@ -12,9 +12,6 @@ public class Start { public static final String CURATOR_VERSION = "1.0"; public static void main(String[] args) { - // TODO debug - System.setProperty("sun.java2d.uiScale", "2"); - registerSecretsFactories(); SwingUtilities.invokeLater(() -> new LibrarySelectFrame(args)); } diff --git a/src/main/java/zander/ui/library/LibraryCreateDialog.java b/src/main/java/zander/ui/library/LibraryCreateDialog.java index fa904c2..7768425 100644 --- a/src/main/java/zander/ui/library/LibraryCreateDialog.java +++ b/src/main/java/zander/ui/library/LibraryCreateDialog.java @@ -70,7 +70,7 @@ public class LibraryCreateDialog extends JDialog { passwordLabel = new JLabel("Password:"); passwordField = new JPasswordField(10); ftpModeLabel = new JLabel("FTP Mode:"); - ftpModeCombo = new JComboBox(new String[] { "Active", "Passive" }); + ftpModeCombo = new JComboBox(new String[] { "Passive", "Active" }); defaultPathCheck = new JCheckBox("Use default library location"); defaultPathCheck.setSelected(true); pathLabel = new JLabel("Library Path:"); diff --git a/src/main/java/zander/ui/library/LibraryEditDialog.java b/src/main/java/zander/ui/library/LibraryEditDialog.java index 8770768..852ed4d 100644 --- a/src/main/java/zander/ui/library/LibraryEditDialog.java +++ b/src/main/java/zander/ui/library/LibraryEditDialog.java @@ -78,8 +78,8 @@ public class LibraryEditDialog extends JDialog { passwordField = new JPasswordField(10); passwordField.setText(password); ftpModeLabel = new JLabel("FTP Mode:"); - ftpModeCombo = new JComboBox(new String[] { "Active", "Passive" }); - ftpModeCombo.setSelectedIndex(passiveMode ? 1 : 0); + ftpModeCombo = new JComboBox(new String[] { "Passive", "Active" }); + ftpModeCombo.setSelectedIndex(passiveMode ? 0 : 1); defaultPathCheck = new JCheckBox("Use default library location"); pathLabel = new JLabel("Library Path:"); pathField = new FileChooserField(10, file, new File(LibrarySelectFrame.DEFAULT_LIBRARY_PATH)); diff --git a/src/main/java/zander/ui/library/LibraryImportDialog.java b/src/main/java/zander/ui/library/LibraryImportDialog.java index 98488e4..30fee9d 100644 --- a/src/main/java/zander/ui/library/LibraryImportDialog.java +++ b/src/main/java/zander/ui/library/LibraryImportDialog.java @@ -62,7 +62,7 @@ public class LibraryImportDialog extends JDialog { passwordLabel = new JLabel("Password:"); passwordField = new JPasswordField(10); ftpModeLabel = new JLabel("FTP Mode:"); - ftpModeCombo = new JComboBox(new String[] { "Active", "Passive" }); + ftpModeCombo = new JComboBox(new String[] { "Passive", "Active" }); fileLabel = new JLabel("Source:"); fileField = new FileChooserField(10); fileField.getChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); diff --git a/src/main/resources/docs/library-create-dialog.png b/src/main/resources/docs/library-create-dialog.png index d9a0909372bdfc6574d7e0864e28c51b1cc2a489..7238f5e2afa709143beb231f38332b4fd4e4e964 100644 GIT binary patch literal 28307 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 XxN4y%4SpM3HV3()cU`wo2Ojw^9q8J} literal 7778 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

^4%#J)yRL4^`t{!Q4sC*S+f_PZ4F z9yk8Dfj@LbQZ0D%zS3DqkdJR;9f%2oWk81Vu@9=5Bt+WNtWAsJeMO%gbSaR z2v4MoK9vtqqfJP${zVvNIB+>n!Q>hp)46BAHS?sVoDOM2mM;5;l%UMOZ48K$bi$95 zh{<1qL|jpf|567@$oS^8yIP~S){vEzRlvIg3B)mY(;tjf5OFoUZVNMwlR?Ap7E>QJ#UZa( zkDyceTc&?A;-I$L@|SBEwj!2qpQy?#7XI)c;?Iq+5iCif(3l}euAv`i)pGr)(P8ps z$5q(TEAY6(fkeV}>7qyIShU5$jJaV~{oCxBZ7R>e-o`eo!Z%%ppek?6V{+I|{~5%R z;%;W(;VIJu!%6YHkC@!KPkB}gpEr$)<`~ZLG(R>oQ~u!n#PQ^uzOUilXfsoF#>?0m z1FcS!2x;Wyd6Azsyr)mH!Kuo)IXEki)@puuis)$}4=?Pb_2dA?9k|D{8#yc1lRK~c zii6&a&dUB|a=gwkQqu3v{dfw8XUZ8#FHPC11`ouEDm4<-B08kZSRHfDH z-P>4dL$}KhE_uD`0S|I*kltgR7k`@^rSFJ`S_s}yP73LDAQAhIzNzPt;EBEYIVLCw z~V~To`a(w1~gZs?j%-h>xge!Ls@@@+Mr4!E=-Jv>Euo$b{ExV3PuJwZbuFt&6B7mEO5gGDiFV><0d%U)R%fry zlh=qXc!8h2J7!6){0!wbd&d2A5^0Wg0K$v%T|p z{EZ``XOTsxaXcR}RWf6TZzHe5>}=8owSYrXR-bE^Lb)|qdR7X;<*kzTyA?_lAH@kR zm4h2n`I1>fY_V`ySHB2KtjUe8&A+P%jofO3TGiu1aD+r~G;t=_8Li&Ft4CIo?=4B|hL3KJeO3VrP%FsGuh1#s`nH^8hInxEhiGZ!$k9%Z zkapl+IhYL;la>3P8Y0(3dU#K_|8B0uQtqo`Q!lD1F`ksx4{N&6?a6sJBj9zRvK~9$ z#dlP^trbaCE7Edl_0_lO@^(evmFhT`y&+G1>+0~H&KFMTR@-E^gRZ{4L9HB?3LMVe z-_!QqKE439`r60mzTipwwgs>!A_Uysj7)YpeWx*3jsJnY}KSgJmyWky-%k6*qJ7fhxxR z8f(n+U`ynB(Q7NeFO&4qshbG;(wmigHf3`p_p|05ZXfh^zXgBcx>zu8d6M{!X)-{+ zdtgA%<#=k~H$!!BUzRSZ0$zxG#b)hsLO34xnlLo!5*SyfIqkE5MQG5O3mRf_w-%1X zr2ZW65ysrdTD+)z`EPzz!Ca}0nX(r5lmoa-`*b}(r1l#x7^TWYU}SaK@(v`fJNvH} zAlUs@Yo`6wRO`3PiU|Xouj@WWeTdT0UiDe@Dqg8^uFaIxvk}ZW$HmEcDbOe+(dAD( zzOzI%X%(>pq%gZ+B>O{=eqONe~zW*1*J|j5O zR}k0R5yC1@In4`pcj>XgqRYYU%vxf)7y#k5R_i3zK%8e^dqB>uRa(TCP$ z{|lv`6AEdv{-T8&m&}CTJ2H?Gq>R(qu-ld%!Fm$)7m6GG4exdO{~hnID_3a$MHF}0 zVh+@ctM9EGiZkk!T$v+zRL0d diff --git a/src/main/resources/docs/library-edit-dialog.png b/src/main/resources/docs/library-edit-dialog.png index 7a47b0ef807e7ed2d9d89f86737fa18488046f94..93d6b92c69a1740715ef28a1c56900a41bc2647a 100644 GIT binary patch literal 29312 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 HNn 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 E1wUJDGynhq literal 5429 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 Library Settings

Overview

- These dialogs create, import or alter the settings of libraries. These settings are primarily - for use of Curator and will not affect the Art Museum website. + These dialogs create, import or alter the settings of libraries. These + settings are primarily for use of Curator and will not affect the Art + Museum website.

Local vs Remote Library
- Remore libraries are instances of the Art Museum website. They are connected to by FTP. - Any changes made to them will be reflected in their respective Art Museum instance. + Remore libraries are instances of the Art Museum website. They are + connected to by FTP. Any changes made to them will be reflected in their + respective Art Museum instance.
- Local libraries, or caches, are instances of libraries located on your computer. When you connect - to a remote library, a local library is automatically created and sync with its remote counterpart. - Every time you connect to a remote library, its local counterpart is updated in this way. + Local libraries, or caches, are instances of libraries located on your + computer. When you connect to a remote library, a local library is + automatically created and sync with its remote counterpart. Every time + you connect to a remote library, its local counterpart is updated in this + way.

The library creation and remote import dialog.

@@ -29,16 +33,25 @@

The local library import dialog.

Options

    -
  • Name: library name in the select dialog. Does not affect website.
  • -
  • URL: url in the select dialog. Can be blank. Does not affect the website.
  • -
  • FTP: FTP server to connect to. Must be in the format of 'ftp://hostname:port/path/to/library'. - Protocol can also be FTPS by replacing 'ftp://' with 'ftps://'.
  • -
  • Username & Password: username and password to use to connect to FTP server.
  • -
  • Library Location (Source): location to save caches in. If 'User default library location' - is checked, it will be stored in the directory set in the global settings menu. +
  • Name: library name in the select dialog. Does not affect + website.
  • +
  • URL: url in the select dialog. Can be blank. Does not affect + the website.
  • +
  • FTP: FTP server to connect to. Must be in the format of + 'ftp://hostname:port/path/to/library'. Encryption is supported via + FTPS. To enable it, replace 'ftp://' with 'ftps://'.
  • +
  • Username & Password: username and password to use to connect to + FTP server.
  • +
  • FTP Mode: Whether to use active (PORT) or passive (PASV) FTP + mode. If you are unsure, it's best to start with passive and change to + active if you are having trouble connecting.
  • +
  • Library Location (Source): location to save caches in. If 'User + default library location' is checked, it will be stored in the directory + set in the global settings menu. See: Global Settings
  • -
  • Clear Cahce: clear library cahce. This does NOT affect the remote library. It only - clears the local cache. Doing this will cause a full re-download of the remote library next time it is +
  • Clear Cahce: clear library cahce. This does NOT affect + the remote library. It only clears the local cache. Doing this will + cause a full re-download of the remote library next time it is oppened.
From 92b722b141636fddb1b0e2ad8dfc49ba44fa49ca Mon Sep 17 00:00:00 2001 From: Alexander Rosenberg Date: Mon, 28 Oct 2024 13:00:13 -0700 Subject: [PATCH 3/3] Remove debug statements --- src/main/java/zander/library/RemoteStore.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/zander/library/RemoteStore.java b/src/main/java/zander/library/RemoteStore.java index 156ee12..01bd132 100644 --- a/src/main/java/zander/library/RemoteStore.java +++ b/src/main/java/zander/library/RemoteStore.java @@ -49,7 +49,8 @@ public class RemoteStore { } else { throw new ProtocolException("unknown protocol: '" + url.getScheme() + "'"); } - ftp.addProtocolCommandListener(new PrintCommandListener(System.out, true)); + // Uncomment this to print all FTP commands + // ftp.addProtocolCommandListener(new PrintCommandListener(System.out, true)); ftp.setListHiddenFiles(true); this.secrets = secrets; } @@ -238,11 +239,7 @@ public class RemoteStore { } String name = getFileName(path); FTPFile[] files = ftp.listFiles(pp); - System.out.println("STAT " + name + " in " + pp); for (FTPFile f : files) { - System.out.println( - (f.isDirectory() ? "D " : "F ") + - f.getName()); if (f.getName().equals(name)) { file.set(f); }