// Remote
//
// Douglas
//
// Remote.java
/* Copyright 2011 Douglas Thrift
*
* This file is part of Big Screen Bot.
*
* Big Screen Bot 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 3 of the License, or
* (at your option) any later version.
*
* Big Screen Bot 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.
*
* You should have received a copy of the GNU General Public License
* along with Big Screen Bot. If not, see .
*/
package net.douglasthrift.bigscreenbot;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.security.KeyManagementException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import com.google.anymote.common.AnymoteFactory;
import com.google.anymote.common.ErrorListener;
import com.google.anymote.device.DeviceAdapter;
import com.google.anymote.device.MessageReceiver;
import com.google.polo.exception.PoloException;
import com.google.polo.pairing.PairingContext;
import com.google.polo.ssl.DummySSLSocketFactory;
import com.google.polo.ssl.SslUtil;
public class Remote
{
private static final String STORE = "bigscreenbot.keystore";
private static final char[] PASSWORD = "b1GsSC33Nb0T".toCharArray();
private static final char[] NULL = new char[]{};
private static final String TYPE = "_anymote._tcp.local.";
private static final String LOCAL_ALIAS = "anymote-remote";
private static final String REMOTE_ALIAS = "anymote-server-%1$X";
private Settings settings;
private JmDNS mdns;
private KeyStore store;
SSLSocketFactory factory;
public Remote(Settings settings) throws UnknownHostException, IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, KeyManagementException, GeneralSecurityException
{
this.settings = settings;
String interfaze = settings.getProperty("interface");
if (interfaze != null)
mdns = JmDNS.create(InetAddress.getByName(interfaze));
else
mdns = JmDNS.create();
store = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream stream = null;
try
{
stream = new FileInputStream(STORE);
store.load(stream, PASSWORD);
}
catch (FileNotFoundException exception)
{
store.load(null, PASSWORD);
}
finally
{
if (stream != null)
stream.close();
}
if (!store.containsAlias(LOCAL_ALIAS))
{
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
KeyPair pair = generator.generateKeyPair();
X509Certificate certificate = SslUtil.generateX509V3Certificate(pair, "CN=anymote-remote/bigscreenbot/" + System.getProperty("os.name") + "/" + System.getProperty("os.arch") + "/" + System.getProperty("user.name") + "@" + InetAddress.getLocalHost().getHostName());
store.setKeyEntry(LOCAL_ALIAS, pair.getPrivate(), NULL, new Certificate[]{ certificate });
store();
}
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
factory.init(store, NULL);
this.factory = DummySSLSocketFactory.fromKeyManagers(factory.getKeyManagers());
}
public List listDevices()
{
List devices = new ArrayList();
for (ServiceInfo info : mdns.list(TYPE))
devices.add(info.getName());
return devices;
}
public void startPairDevice(String device) throws MalformedURLException, UnknownHostException, IOException, PoloException
{
ServiceInfo info = mdns.getServiceInfo(TYPE, device);
InetAddress address;
int port;
if (info != null)
{
address = info.getInetAddresses()[0];
port = info.getPort();
}
else
{
URL url = new URL("http://" + device);
address = InetAddress.getByName(url.getHost());
port = url.getPort();
if (port == -1)
port = 9551;
}
SSLSocket socket = (SSLSocket)factory.createSocket(address, port);
PairingContext context = PairingContext.fromSslSocket(socket, false);
}
public void finishPairDevice(String device, String code)
{
}
public void fling(String url)
{
}
public void fling(String device, String url)
{
}
@Override
protected void finalize() throws IOException
{
mdns.close();
}
private void store() throws FileNotFoundException, IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException
{
FileOutputStream stream = null;
try
{
stream = new FileOutputStream(STORE);
store.store(stream, PASSWORD);
}
finally
{
if (stream != null)
stream.close();
}
}
}
// vim: expandtab