package ch.cyberduck.core; /* * Copyright (c) 2007 David Kocher. All rights reserved. * http://cyberduck.ch/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Bug fixes, suggestions and comments should be sent to: * dkocher@cyberduck.ch */ import ch.cyberduck.core.i18n.Locale; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; //import org.jets3t.service.Constants; import java.util.ArrayList; import java.util.List; /** * @version $Id: Protocol.java 5842 2010-03-04 16:58:31Z dkocher $ */ public abstract class Protocol { private static Logger log = Logger.getLogger(Protocol.class); /** * @return The identifier for this protocol which is the scheme by default */ public String getIdentifier() { return this.getScheme(); } public String getName() { return this.getScheme().toUpperCase(); } /** * @return * @uml.property name="description" */ public abstract String getDescription(); /** * @return * @uml.property name="scheme" */ public abstract String getScheme(); public String[] getSchemes() { return new String[]{this.getScheme()}; } @Override public boolean equals(Object other) { if(other instanceof Protocol) { return ((Protocol) other).getIdentifier().equals(this.getIdentifier()); } return false; } @Override public String toString() { return this.getIdentifier(); } /** * @return A mounted disk icon to display */ public String disk() { return this.getIdentifier(); } /** * @return A small icon to display */ public String icon() { return this.getIdentifier() + "-icon"; } /** * @return */ public boolean isSecure() { return false; } public boolean isHostnameConfigurable() { return true; } public boolean isWebUrlConfigurable() { return true; } public boolean isEncodingConfigurable() { return false; } public boolean isConnectModeConfigurable() { return false; } public boolean isUTCTimezone() { return true; } public String getUsernamePlaceholder() { return ""; } public String getDefaultHostname() { return Preferences.instance().getProperty("connection.hostname.default"); } /** * @return The default port this protocol connects to */ public abstract int getDefaultPort(); /** * @uml.property name="sFTP" * @uml.associationEnd */ public static final Protocol SFTP = new Protocol() { @Override public String getDescription() { return Locale.localizedString("SFTP (SSH File Transfer Protocol)"); } @Override public int getDefaultPort() { return 22; } @Override public String getScheme() { return "sftp"; } @Override public boolean isSecure() { return true; } @Override public boolean isEncodingConfigurable() { return true; } }; /** * @uml.property name="sCP" * @uml.associationEnd */ public static final Protocol SCP = new Protocol() { @Override public String getDescription() { return Locale.localizedString("SCP (Secure Copy)"); } @Override public int getDefaultPort() { return 22; } @Override public String getScheme() { return "scp"; } @Override public boolean isSecure() { return true; } }; /** * @uml.property name="fTP" * @uml.associationEnd */ public static final Protocol FTP = new Protocol() { @Override public String getDescription() { return Locale.localizedString("FTP (File Transfer Protocol)"); } @Override public int getDefaultPort() { return 21; } @Override public String getScheme() { return "ftp"; } @Override public boolean isUTCTimezone() { return false; } @Override public boolean isEncodingConfigurable() { return true; } @Override public boolean isConnectModeConfigurable() { return true; } }; /** * @uml.property name="fTP_TLS" * @uml.associationEnd */ public static final Protocol FTP_TLS = new Protocol() { @Override public String getName() { return "FTP-SSL"; } @Override public String getDescription() { return Locale.localizedString("FTP-SSL (Explicit AUTH TLS)"); } @Override public int getDefaultPort() { return 21; } @Override public String getScheme() { return "ftps"; } @Override public boolean isSecure() { return true; } @Override public String disk() { return SFTP.disk(); } @Override public String icon() { return SFTP.icon(); } @Override public boolean isUTCTimezone() { return false; } @Override public boolean isEncodingConfigurable() { return true; } @Override public boolean isConnectModeConfigurable() { return true; } }; /** * @uml.property name="s3" * @uml.associationEnd */ public static final Protocol S3 = new Protocol() { @Override public String getName() { return "S3"; } @Override public String getDescription() { return Locale.localizedString("S3 (Amazon Simple Storage Service)", "S3"); } @Override public String getIdentifier() { return "s3"; } @Override public int getDefaultPort() { return 443; } @Override public String getScheme() { return "https"; } @Override public String[] getSchemes() { return new String[]{this.getScheme(), "s3"}; } @Override public boolean isSecure() { return true; } @Override public String getDefaultHostname() { // return Constants.S3_HOSTNAME; return ""; } @Override public boolean isWebUrlConfigurable() { return false; } @Override public String getUsernamePlaceholder() { return Locale.localizedString("Access Key ID", "S3"); } }; /** * @uml.property name="eUCALYPTUS" * @uml.associationEnd */ public static final Protocol EUCALYPTUS = new Protocol() { @Override public String getName() { return "S3"; } @Override public String getDescription() { return Locale.localizedString("Eucalyptus Walrus S3", "S3"); } @Override public String getIdentifier() { return "ec"; } @Override public int getDefaultPort() { return 8773; } @Override public String getScheme() { return "http"; } @Override public String[] getSchemes() { return new String[]{this.getScheme(), "walrus"}; } @Override public boolean isSecure() { return false; } @Override public boolean isHostnameConfigurable() { return true; } @Override public String getDefaultHostname() { return "mayhem9.cs.ucsb.edu"; } @Override public boolean isWebUrlConfigurable() { return false; } @Override public String disk() { return S3.disk(); } @Override public String icon() { return "eucalyptus-icon"; } }; /** * @uml.property name="wEBDAV" * @uml.associationEnd */ public static final Protocol WEBDAV = new Protocol() { @Override public String getName() { return "WebDAV (HTTP)"; } @Override public String getDescription() { return Locale.localizedString("WebDAV (Web-based Distributed Authoring and Versioning)"); } @Override public String getIdentifier() { return "dav"; } @Override public int getDefaultPort() { return 80; } @Override public String getScheme() { return "http"; } @Override public String[] getSchemes() { return new String[]{this.getScheme(), "dav"}; } }; /** * @uml.property name="wEBDAV_SSL" * @uml.associationEnd */ public static final Protocol WEBDAV_SSL = new Protocol() { @Override public String getName() { return "WebDAV (HTTPS)"; } @Override public String getDescription() { return Locale.localizedString("WebDAV (HTTP/SSL)"); } @Override public String getIdentifier() { return "davs"; } @Override public int getDefaultPort() { return 443; } @Override public String getScheme() { return "https"; } @Override public boolean isSecure() { return true; } @Override public String[] getSchemes() { return new String[]{this.getScheme(), "davs"}; } @Override public String disk() { return WEBDAV.disk(); } @Override public String icon() { return WEBDAV.icon(); } }; /** * @uml.property name="iDISK" * @uml.associationEnd */ public static final Protocol IDISK = new Protocol() { @Override public String getName() { return "MobileMe"; } @Override public String getDescription() { return Locale.localizedString("MobileMe iDisk (WebDAV)"); } @Override public String getIdentifier() { return "me"; } @Override public int getDefaultPort() { return 443; } @Override public String getScheme() { return "https"; } @Override public boolean isSecure() { return true; } @Override public String[] getSchemes() { return new String[]{this.getScheme(), "idisk"}; } @Override public boolean isHostnameConfigurable() { return false; } @Override public String getDefaultHostname() { return "idisk.me.com"; } @Override public boolean isWebUrlConfigurable() { return false; } @Override public String disk() { return WEBDAV_SSL.disk(); } @Override public String icon() { return "NSDotMac"; } }; /** * @uml.property name="cLOUDFILES" * @uml.associationEnd */ public static final Protocol CLOUDFILES = new Protocol() { @Override public String getName() { return "Cloud Files"; } @Override public String getDescription() { return "Rackspace Cloud Files"; } @Override public String getIdentifier() { return "cf"; } @Override public int getDefaultPort() { return 443; } @Override public String getScheme() { return "https"; } @Override public String[] getSchemes() { return new String[]{this.getScheme(), "mosso", "cloudfiles", "cf"}; } @Override public boolean isSecure() { return true; } @Override public boolean isHostnameConfigurable() { return false; } @Override public String getDefaultHostname() { return "storage.clouddrive.com"; } @Override public boolean isWebUrlConfigurable() { return false; } }; /** * @uml.property name="gDOCS" * @uml.associationEnd */ public static final Protocol GDOCS = new Protocol() { @Override public String getName() { return "Google Docs"; } @Override public String getDescription() { return Locale.localizedString("Google Docs"); } @Override public String getIdentifier() { return "g"; } @Override public String disk() { return SFTP.disk(); } @Override public boolean isSecure() { return true; } @Override public boolean isHostnameConfigurable() { return false; } @Override public String getDefaultHostname() { return "docs.google.com"; } @Override public String getScheme() { return "https"; } @Override public int getDefaultPort() { return 443; } @Override public boolean isWebUrlConfigurable() { return false; } @Override public String getUsernamePlaceholder() { return Locale.localizedString("Google Account Email"); } }; private static List<Protocol> enabled = new ArrayList<Protocol>(); static { // if(Preferences.instance().getBoolean("protocol.ftp.enable")) { enabled.add(FTP); // } // if(Preferences.instance().getBoolean("protocol.ftp.tls.enable")) { enabled.add(FTP_TLS); // } // if(Preferences.instance().getBoolean("protocol.sftp.enable")) { enabled.add(SFTP); // } // if(Preferences.instance().getBoolean("protocol.webdav.enable")) { enabled.add(WEBDAV); // } // if(Preferences.instance().getBoolean("protocol.webdav.tls.enable")) { enabled.add(WEBDAV_SSL); // } // if(Preferences.instance().getBoolean("protocol.idisk.enable")) { enabled.add(IDISK); // } // if(Preferences.instance().getBoolean("protocol.s3.enable")) { enabled.add(S3); // } // if(Preferences.instance().getBoolean("protocol.s3.eucalyptus.enable")) { enabled.add(EUCALYPTUS); // } // if(Preferences.instance().getBoolean("protocol.cf.enable")) { enabled.add(CLOUDFILES); // } // if(Preferences.instance().getBoolean("protocol.gdocs.enable")) { enabled.add(GDOCS); // } } public static List<Protocol> getKnownProtocols() { return enabled; } /** * @param port * @return The standard protocol for this port number */ public static Protocol getDefaultProtocol(int port) { for(Protocol protocol : getKnownProtocols()) { if(protocol.getDefaultPort() == port) { return protocol; } } log.warn("Cannot find default protocol for port:" + port); return Protocol.forName( Preferences.instance().getProperty("connection.protocol.default")); } /** * @param identifier * @return */ public static Protocol forName(final String identifier) { for(Protocol protocol : getKnownProtocols()) { if(protocol.getIdentifier().equals(identifier)) { return protocol; } } log.fatal("Unknown protocol:" + identifier); return Protocol.forScheme(identifier); } /** * @param scheme * @return */ public static Protocol forScheme(final String scheme) { for(Protocol protocol : getKnownProtocols()) { for(int k = 0; k < protocol.getSchemes().length; k++) { if(protocol.getSchemes()[k].equals(scheme)) { return protocol; } } } log.fatal("Unknown scheme:" + scheme); return Protocol.forName( Preferences.instance().getProperty("connection.protocol.default")); } /** * @param str * @return */ public static boolean isURL(String str) { if(StringUtils.isNotBlank(str)) { for(Protocol protocol : getKnownProtocols()) { String[] schemes = protocol.getSchemes(); for(String scheme : schemes) { if(str.startsWith(scheme + "://")) { return true; } } } } return false; } }