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

Reply via email to