/** * Copyright (C) 2010 EdgyTech LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.edgytech.umongo; import com.edgytech.swingfast.FormDialog; import com.mongodb.MongoClientOptions; import com.mongodb.MongoClientOptions; import com.mongodb.ReadPreference; import com.mongodb.WriteConcern; import java.io.IOException; import java.net.*; import javax.net.SocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * * @author antoine */ public class ConnectDialog extends FormDialog { enum Item { name, uri, servers, connectionMode, databases, user, password, connectionsPerHost, blockingThreadMultiplier, maxWaitTime, socketType, connectTimeout, socketTimeout, safeWrites, secondaryReads, proxyType, proxyHost, proxyPort, proxyUser, proxyPassword } public ConnectDialog() { setEnumBinding(Item.values(), null); } MongoClientOptions getMongoClientOptions() { MongoClientOptions.Builder builder = MongoClientOptions.builder(); // moptions.connectionsPerHost = getIntFieldValue(Item.connectionsPerHost); // moptions.threadsAllowedToBlockForConnectionMultiplier = getIntFieldValue(Item.blockingThreadMultiplier); // moptions.maxWaitTime = getIntFieldValue(Item.maxWaitTime); builder.connectTimeout(getIntFieldValue(Item.connectTimeout)); builder.socketTimeout(getIntFieldValue(Item.socketTimeout)); // moptions.autoConnectRetry = getBooleanFieldValue(Item.autoConnectRetry); if (!getBooleanFieldValue(Item.safeWrites)) { builder.writeConcern(WriteConcern.NONE); } // moptions.slaveOk = getBooleanFieldValue(Item.secondaryReads); if (getBooleanFieldValue(Item.secondaryReads)) { builder.readPreference(ReadPreference.secondaryPreferred()); } int stype = getIntFieldValue(Item.socketType); int proxy = getIntFieldValue(Item.proxyType); if (proxy == 1) { // SOCKS proxy final String host = getStringFieldValue(Item.proxyHost); final int port = getIntFieldValue(Item.proxyPort); builder.socketFactory(new SocketFactory() { @Override public Socket createSocket() throws IOException { SocketAddress addr = new InetSocketAddress(host, port); Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); Socket socket = new Socket(proxy); return socket; } @Override public Socket createSocket(String string, int i) throws IOException, UnknownHostException { SocketAddress addr = new InetSocketAddress(host, port); Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); Socket socket = new Socket(proxy); InetSocketAddress dest = new InetSocketAddress(string, i); socket.connect(dest); return socket; } @Override public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException, UnknownHostException { throw new UnsupportedOperationException("Not supported yet."); } @Override public Socket createSocket(InetAddress ia, int i) throws IOException { SocketAddress addr = new InetSocketAddress(host, port); Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); Socket socket = new Socket(proxy); InetSocketAddress dest = new InetSocketAddress(ia, i); socket.connect(dest); return socket; } @Override public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException { throw new UnsupportedOperationException("Not supported yet."); } }); // // authentication.. only supports 1 global for all proxies :( // final String user = getStringFieldValue(Item.proxyUser); // final String pwd = getStringFieldValue(Item.proxyPassword); // if (!user.isEmpty()) { // Authenticator.setDefault(new Authenticator() { // @Override // protected PasswordAuthentication getPasswordAuthentication() { // PasswordAuthentication p = new PasswordAuthentication(user, pwd.toCharArray()); // return p; // } // }); // } } if (stype == 1) { builder.socketFactory(SSLSocketFactory.getDefault()); } else if (stype == 2) { // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) { } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) { } } }; try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); builder.socketFactory(sc.getSocketFactory()); } catch (Exception e) { } } return builder.build(); } void setName(String name) { setStringFieldValue(Item.name, name); } String getName() { return getStringFieldValue(Item.name); } }