/*
* Copyright 2011 Future Systems
*
* 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 org.krakenapps.slpolicy;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
public class SilverlightPolicyHandler extends SimpleChannelUpstreamHandler {
private final Logger logger = LoggerFactory.getLogger(SilverlightPolicyHandler.class.getName());
private static final String REQUEST = "<policy-file-request/>";
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
ChannelBuffer buf = (ChannelBuffer) e.getMessage();
logger.debug("kraken webconsole: readable bytes [{}]", buf.readableBytes());
if (buf.readableBytes() < REQUEST.length())
return;
logger.debug("kraken webconsole: silverlight policy request");
Document xml = getPolicy();
String s = xmlToString(xml);
ChannelFuture f = ctx.getChannel().write(s);
f.addListener(ChannelFutureListener.CLOSE);
logger.debug("kraken webconsole: sent silverlight policy [{}]", s);
}
private Document getPolicy() {
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
Document d = builder.newDocument();
Element accessPolicyElement = d.createElement("access-policy");
Element crossDomainAccessElement = d.createElement("cross-domain-access");
Element policyElement = d.createElement("policy");
appendAllowFrom(d, policyElement);
appendGrantTo(d, policyElement);
crossDomainAccessElement.appendChild(policyElement);
accessPolicyElement.appendChild(crossDomainAccessElement);
d.appendChild(accessPolicyElement);
return d;
} catch (ParserConfigurationException e) {
return null;
}
}
public static String xmlToString(Node node) {
try {
Source source = new DOMSource(node);
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult(stringWriter);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(source, result);
return stringWriter.getBuffer().toString();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return null;
}
private void appendAllowFrom(Document d, Element policyElement) {
Element allowFromElement = d.createElement("allow-from");
Element domainElement = d.createElement("domain");
domainElement.setAttribute("uri", "*");
allowFromElement.appendChild(domainElement);
policyElement.appendChild(allowFromElement);
}
private void appendGrantTo(Document d, Element policyElement) {
Element grantToElement = d.createElement("grant-to");
Element socketResourceElement = d.createElement("socket-resource");
socketResourceElement.setAttribute("port", "4502");
socketResourceElement.setAttribute("protocol", "tcp");
grantToElement.appendChild(socketResourceElement);
policyElement.appendChild(grantToElement);
}
}