package railo.runtime.net.mail; import railo.commons.lang.StringUtil; import railo.runtime.exp.ExpressionException; import railo.runtime.op.Caster; /** * */ public final class ServerImpl implements Server { private String hostName; private String username; private String password; private int port=DEFAULT_PORT; private boolean readOnly=false; private boolean tls; private boolean ssl; //private static Pattern[] patterns=new Pattern[3]; //[user:password@]server[:port],[ /*static { patterns[0]=Pattern.compile("^([^:\\s)]+)\\s*:\\s*([^@\\s)]+)\\s*@\\s*([^:\\s)]+)\\s*:\\s*(.+)$"); patterns[1]=Pattern.compile("^([^:\\s)]+)\\s*:\\s*([^@\\s)]+)\\s*@\\s*(.+)$"); patterns[2]=Pattern.compile("^([^:\\s)]+)\\s*:\\s*(.+)$"); }*/ public static ServerImpl getInstance(String host, int defaultPort,String defaultUsername,String defaultPassword, boolean defaultTls, boolean defaultSsl) throws MailException { String userpass,user=defaultUsername,pass=defaultPassword,tmp; int port=defaultPort; // [user:password@]server[:port] int index=host.indexOf('@'); // username:password if(index!=-1) { userpass=host.substring(0,index); host=host.substring(index+1); index=userpass.indexOf(':'); if(index!=-1) { user=userpass.substring(0,index).trim(); pass=userpass.substring(index+1).trim(); } else user=userpass.trim(); } // server:port index=host.indexOf(':'); if(index!=-1) { tmp=host.substring(index+1).trim(); if(!StringUtil.isEmpty(tmp)){ try { port=Caster.toIntValue(tmp); } catch (ExpressionException e) { throw new MailException("port definition is invalid ["+tmp+"]"); } } host=host.substring(0,index).trim(); } else host=host.trim(); return new ServerImpl(host,port,user,pass,defaultTls,defaultSsl); } /*public ServerImpl(String server,int port) { this.hostName=server; this.port=port; }*/ public ServerImpl(String hostName,int port,String username,String password, boolean tls, boolean ssl) { this.hostName=hostName; this.username=username; this.password=password; this.port=port; this.tls=tls; this.ssl=ssl; } /*public ServerImpl(String strServer) throws MailException { strServer=strServer.trim(); boolean hasMatch=false; outer:for(int i=0;i<patterns.length;i++) { Pattern p = patterns[i]; Matcher m = p.matcher(strServer); if(m.matches()) { try { switch(m.groupCount()) { case 2: hostName=m.group(1).trim(); port=Caster.toIntValue(m.group(2).trim()); break; case 4: username=m.group(1).trim(); password=m.group(2).trim(); hostName=m.group(3).trim(); port=Caster.toIntValue(m.group(4).trim()); break; } } catch(ExpressionException e) { throw new MailException(e.getMessage()); } hasMatch=true; break outer; } } if(!hasMatch) hostName=strServer; }*/ /*public static Server[] factory(String strServers) throws MailException { StringTokenizer tokens=new StringTokenizer(strServers,",;"); ArrayList list=new ArrayList(); while(tokens.hasMoreTokens()) { list.add(new ServerImpl(tokens.nextToken())); } Server[] pairs=(Server[])list.toArray(new Server[list.size()]); return pairs; }*/ @Override public String getPassword() { if(password==null && hasAuthentication()) return ""; return password; } @Override public int getPort() { return port; } @Override public String getHostName() { return hostName; } @Override public String getUsername() { return username; } @Override public boolean hasAuthentication() { return username!=null && username.length()>0; } @Override public String toString() { if(username!=null) { return username+":"+password+"@"+hostName+":"+port; } return hostName+":"+port; } @Override public Server cloneReadOnly() { ServerImpl s = new ServerImpl(hostName, port,username, password,tls,ssl); s.readOnly=true; return s; } @Override public boolean isReadOnly() { return readOnly; } @Override public boolean verify() throws SMTPException { return SMTPVerifier.verify(hostName,username,password,port); } public boolean isTLS() { return tls; } public boolean isSSL() { return ssl; } public void setSSL(boolean ssl) { this.ssl=ssl; } public void setTLS(boolean tls) { this.tls=tls; } }