Puh, this was hard. Had to dust of some Java knowledge and roll up my
sleeves..
So here is a way to create a secure xmp-rpc client that bypasses
certificate and hostname validation. I only used the jar files that is
available in openBD.
I think this code can be improved a lot. But it works.
What happens is that first we create a trust manager that does not
validate certificate chains, then we call loopiaAPI with the method
domainIsFree which checks if a domain is free and returns a status
code. Then you only have to create a object and pass it the domain you
want to check!
I have only tested it in openBDJam on a Ubuntu 10 server, don't know
if it works in GAE.
If one need to test punycode domains you only have to use:
<cfset jUrl = CreateObject( "java", "java.net.IDN" ).toASCII(strUrl)
>
<cfcomponent>
<cfscript language="java" jarlist="xmlrpc-client-3.1.2.jar,xmlrpc-
common-3.1.2.jar,ws-commons-util-1.0.2.jar">
import java.net.URL;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.util.Vector;
import java.net.URL;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
private static void install() throws Exception {
// Create a trust manager that does not validate certificate
chains
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[]
certs, String authType) {
// Trust always
}
public void checkServerTrusted(X509Certificate[]
certs, String authType) {
// Trust always
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
// Create empty HostnameVerifier
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};
sc.init(null, trustAllCerts, new
java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
public String call(String DomainName) throws Exception {
String USERNAME = "username";
String PASSWORD = "password";
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL("https://api.loopia.se/RPCSERV"));
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);
Vector params = new Vector();
params.addElement(USERNAME);
params.addElement(PASSWORD);
params.addElement(DomainName);
String result = (String) client.execute("domainIsFree",
params);
//System.out.println("Returned: " + result.get("title"));
return result;
}
public String check(String DomainName) throws Exception {
//String DomainName = "test.com";
install();
String result = (String) call(DomainName);
return result;
}
</cfscript>
</cfcomponent>
On Aug 18, 6:02 pm, Molnfront <[email protected]> wrote:
> Hi,
>
> I have to communicate to LoopiaAPI with XML-RPC over HTTPS. I have run
> a local test to see if it is possible first. My set up:
>
> - Lap top
> - M$ Vista
> - Open Desktop Server v 2.0.1
>
> My impression after the test I done below is that cfxmlprc is not
> supported on GAE and if I use it on Standard Edition Jetty the
> simplest solution is to use Tunnelier (like cfmail before ssl and tls
> was supported..)
>
> TEST CODE:
>
> <cfset strUrl = "åland.se" />
>
> <!--- Create a Java URL. CFXMLRPC--->
> <cfset jUrl = CreateObject( "java", "java.net.IDN" ).toASCII(strUrl) /
>
>
>
> <cfset myarray = ['user','password','#jUrl#']>
>
> <cfxmlrpc server="https://api.loopia.se/RPCSERV" method="domainIsFree"
> params="#myarray#">
>
> <cfdump var="#XMLRPC#">
>
> First run with Standard Engine:
>
> with HTTPS
>
> xmlrpc
> struct
> error Failed to read server's response: https
> method domainIsFree
> server https://api.loopia.se/RPCSERV
> success NO
>
> Second run with Standard Engine
>
> now with HTTP:
>
> xmlrpc
> struct
> error HTTP server returned unexpected status: Found
> method domainIsFree
> server http://api.loopia.se/RPCSERV
> success NO
>
> First run with GAE as run time engine (over HTTPS):
>
> Big Error:
>
> java.lang.StringIndexOutOfBoundsException: String index out of range:
> -1
> at java.lang.String.substring(Unknown Source)
> at com.naryx.tagfusion.cfx.cfCFX.defaultParameters(Unknown Source)
> at com.naryx.tagfusion.cfm.tag.cfParseTag.createTag(Unknown Source)
> at com.naryx.tagfusion.cfm.tag.cfParseTag.determineCFtag(Unknown
> Source)
> at com.naryx.tagfusion.cfm.tag.cfParseTag.readTag(Unknown Source)
> at com.naryx.tagfusion.cfm.tag.cfParseTag.readTag(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfFile.readFile(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfFile.(Unknown Source)
> at
> com.naryx.tagfusion.cfm.file.cfFileEncoding.findProcessingDirective(Unknown
> Source)
> at com.naryx.tagfusion.cfm.file.cfFileEncoding.init(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfFileEncoding.init(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfFileEncoding.init(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfFileEncoding.(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfFile.(Unknown Source)
> at com.naryx.tagfusion.cfm.file.cfmlFileCache._getCfmlFile2(Unknown
> Source)
> at com.naryx.tagfusion.cfm.file.cfmlFileCache._getCfmlFile(Unknown
> Source)
> at com.naryx.tagfusion.cfm.file.cfmlFileCache.getCfmlFile(Unknown
> Source)
> at com.naryx.tagfusion.cfm.engine.cfSession.getFile(Unknown Source)
> at com.naryx.tagfusion.cfm.engine.cfSession.getUriFile(Unknown
> Source)
> at com.naryx.tagfusion.cfm.engine.cfSession.getRequestFile(Unknown
> Source)
> at com.naryx.tagfusion.cfm.engine.cfEngine.service(Unknown Source)
> at com.naryx.tagfusion.cfm.cfServlet.service(Unknown Source)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
> at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
> 511)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1166)
> at
> com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(He
> aderVerificationFilter.java:
> 35)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFi
> lter.java:
> 58)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(Trans
> actionCleanupFilter.java:
> 43)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFile
> Filter.java:
> 122)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.appengine.tools.development.BackendServersFilter.doFilter(Backen
> dServersFilter.java:
> 94)
> at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1157)
> at
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
> 388)
> at
> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
> 216)
> at
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
> 182)
> at
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
> 765)
> at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
> 418)
> at
> com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEn
> gineWebAppContext.java:
> 70)
> at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
> 152)
> at com.google.appengine.tools.development.JettyContainerService
> $ApiProxyHandler.handle(JettyContainerService.java:351)
> at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
> 152)
> at org.mortbay.jetty.Server.handle(Server.java:326)
> at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
> 542)
> at org.mortbay.jetty.HttpConnection
> $RequestHandler.headerComplete(HttpConnection.java:923)
> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
> at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
> at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> at
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
> 409)
> at org.mortbay.thread.QueuedThreadPool
> $PoolThread.run(QueuedThreadPool.java:582)
--
official tag/function reference: http://openbd.org/manual/
mailing list - http://groups.google.com/group/openbd?hl=en