[freenet-dev] [freenet-cvs] r16548 - in trunk/plugins: . KeyExplorer

Matthew Toseland toad at amphibian.dyndns.org
Sat Dec 15 14:59:56 UTC 2007


Also, metadata is recursive: you probably want to decompose it recursively, 
maybe as a tree. E.g. simple manifest -> simple manifest -> redirect.

On Friday 14 December 2007 20:56, you wrote:
> Author: saces
> Date: 2007-12-14 20:56:13 +0000 (Fri, 14 Dec 2007)
> New Revision: 16548
> 
> Added:
>    trunk/plugins/KeyExplorer/
>    trunk/plugins/KeyExplorer/KeyExplorer.java
> Log:
> new plugin: key info and debug tool
> 
> Added: trunk/plugins/KeyExplorer/KeyExplorer.java
> ===================================================================
> --- trunk/plugins/KeyExplorer/KeyExplorer.java	                        (rev 
0)
> +++ trunk/plugins/KeyExplorer/KeyExplorer.java	2007-12-14 20:56:13 UTC (rev 
16548)
> @@ -0,0 +1,243 @@
> +package plugins.KeyExplorer;
> +
> +import java.io.IOException;
> +import java.net.MalformedURLException;
> +
> +import freenet.client.Metadata;
> +import freenet.client.MetadataParseException;
> +import freenet.clients.http.PageMaker;
> +import freenet.config.Config;
> +import freenet.config.SubConfig;
> +import freenet.keys.BaseClientKey;
> +import freenet.keys.ClientKey;
> +import freenet.keys.ClientKeyBlock;
> +import freenet.keys.FreenetURI;
> +import freenet.keys.KeyDecodeException;
> +import freenet.node.LowLevelGetException;
> +import freenet.pluginmanager.FredPlugin;
> +import freenet.pluginmanager.FredPluginHTTP;
> +import freenet.pluginmanager.FredPluginThreadless;
> +import freenet.pluginmanager.PluginHTTPException;
> +import freenet.pluginmanager.PluginRespirator;
> +import freenet.support.HTMLNode;
> +import freenet.support.HexUtil;
> +import freenet.support.api.HTTPRequest;
> +import freenet.support.io.ArrayBucket;
> +import freenet.support.io.ArrayBucketFactory;
> +import freenet.support.io.BucketTools;
> +
> +public class KeyExplorer implements FredPlugin, FredPluginHTTP, 
FredPluginThreadless {
> +
> +	private PluginRespirator m_pr;
> +	private PageMaker m_pm;
> +
> +	public String handleHTTPGet(HTTPRequest request) throws 
PluginHTTPException {
> +		String uri = request.getParam("key");
> +		return makeMainPage(uri);
> +	}
> +
> +	public String handleHTTPPost(HTTPRequest request) throws 
PluginHTTPException {
> +		String uri = request.getPartAsString("key", 1024);
> +		return makeMainPage(uri);
> +	}
> +
> +	public String handleHTTPPut(HTTPRequest request) throws 
PluginHTTPException {
> +		return makeMainPage();
> +	}
> +
> +	public void runPlugin(PluginRespirator pr) {
> +		Config nc = pr.getNode().config;
> +		SubConfig fc = nc.get("fproxy");
> +		String cssName = fc.getString("css");
> +
> +		m_pm = new PageMaker(cssName);
> +		m_pr = pr;
> +	}
> +
> +	public void terminate() {
> +	}
> +
> +	private String makeMainPage() {
> +		return makeMainPage(null);
> +	}
> +
> +	private String makeMainPage(String key) {
> +		HTMLNode pageNode = m_pm.getPageNode("KeyExplorer", null);
> +		HTMLNode contentNode = m_pm.getContentNode(pageNode);
> +
> +		String error = null;
> +		byte[] data = null;
> +		ClientKeyBlock ckb = null;
> +
> +		try {
> +			if (key != null && (key.trim().length() > 0)) {
> +				FreenetURI furi = new FreenetURI(key);
> +				ClientKey ck = (ClientKey) BaseClientKey.getBaseKey(furi);
> +				ckb = m_pr.getNode().clientCore.realGetKey(ck, false, true, false);
> +				ArrayBucket a = (ArrayBucket) ckb.decode(new ArrayBucketFactory(), 32 * 
1024, false);
> +				data = BucketTools.toByteArray(a);
> +			}
> +		} catch (MalformedURLException e) {
> +			error = "MalformedURL";
> +		} catch (LowLevelGetException e) {
> +			error = "get failed";
> +		} catch (KeyDecodeException e) {
> +			error = "decode error";
> +		} catch (IOException e) {
> +			error = "io error";
> +		}
> +
> +		if (error != null) {
> +			contentNode.addChild(createErrorBox(error));
> +		}
> +
> +		contentNode.addChild(createUriBox());
> +
> +		if (data != null) {
> +			String title = "Key: " + key;
> +			if (ckb.isMetadata())
> +				title = title + "\u00a0(MetaData)";
> +			HTMLNode dataBox2 = m_pm.getInfobox(title);
> +			
> +			char[] asciibuf = new char[16];
> +			
> +			for (int j = 0; j < 16; j++) 
> +				asciibuf[j] = ' ';
> +			 
> +			dataBox2.addChild("%", "<PRE>\n");
> +			StringBuffer sb = new StringBuffer();
> +			int offset = 0;
> +
> +			for (int i = 0; i < data.length; i++) {
> +				offset = (i) % 16;
> +				HexUtil.bytesToHexAppend(data, i, 1, sb);
> +				sb.append(' ');
> +				if ((data[i] > 31) && (data[i] < 127)) {
> +					//int j = data[i];
> +					//sb.append((char) j);
> +					asciibuf[offset] =(char) data[i];
> +				} 
> +				
> +				if ((i > 1) && ((i + 1) % 16 == 0)) {
> +					sb.append(' ');
> +					sb.append(asciibuf);
> +					sb.append('\n');
> +					for (int k = 0; k < 16; k++) 
> +						asciibuf[k] = ' ';
> +				}
> +			}
> +			if (offset > 0) {
> +				int n = (15-offset)*3;
> +				for (int m = 0; m < n; m++) 
> +					sb.append(' ');
> +				sb.append(' ');
> +				sb.append(asciibuf);
> +			}
> +
> +			dataBox2.addChild("#", sb.toString());
> +			dataBox2.addChild("%", "\n</PRE>");
> +
> +			contentNode.addChild(dataBox2);
> +
> +			error = null;
> +
> +			if (ckb.isMetadata()) {
> +
> +				Metadata md = null;
> +				try {
> +					md = Metadata.construct(data);
> +				} catch (MetadataParseException e) {
> +					error = "Metadata parse error";
> +				}
> +
> +				if (error != null)
> +					contentNode.addChild(createErrorBox(error));
> +
> +				if (md != null) {
> +					HTMLNode metaBox = m_pm.getInfobox("Decomposed metadata");
> +
> +					metaBox.addChild("#", "Document type:");
> +					metaBox.addChild("%", "<BR />");
> +
> +					if (md.isSimpleManifest()) {
> +						metaBox.addChild("#", "Document type: SimpleManifest");
> +						metaBox.addChild("%", "<BR />");
> +					}
> +
> +					if (md.isSplitfile()) {
> +						metaBox.addChild("#", "Document type: Splitfile");
> +						metaBox.addChild("%", "<BR />");
> +					}
> +
> +					if (md.isSimpleSplitfile()) {
> +						metaBox.addChild("#", "Document type: SimpleSplitfile");
> +						metaBox.addChild("%", "<BR />");
> +					}
> +
> +					if (md.isSingleFileRedirect()) {
> +						metaBox.addChild("#", "Document type: SingleFileRedirect");
> +						metaBox.addChild("%", "<BR />");
> +						String sfrUri = md.getSingleTarget().toString();
> +						metaBox.addChild("#", sfrUri);
> +						metaBox.addChild("#", "\u00a0");
> +						metaBox.addChild(new HTMLNode("a", "href", "/?key="+sfrUri, "open"));
> +						metaBox.addChild("#", "\u00a0");
> +						metaBox.addChild(new 
HTMLNode("a", "href", "/plugins/plugins.KeyExplorer.KeyExplorer/?key="+sfrUri, "explore"));
> +						metaBox.addChild("%", "<BR />");
> +					}
> +
> +					if (md.isArchiveInternalRedirect()) {
> +						metaBox.addChild("#", "Document type: ArchiveInternalRedirect");
> +						metaBox.addChild("%", "<BR />");
> +					}
> +
> +					if (md.isArchiveManifest()) {
> +						metaBox.addChild("#", "Document type: ArchiveManifest");
> +						metaBox.addChild("%", "<BR />");
> +					}
> +
> +					if (!md.isCompressed()) {
> +						metaBox.addChild("#", "Uncompressed");
> +					} else {
> +						metaBox.addChild("#", "Compressed (codec " + md.getCompressionCodec() 
+ ")");
> +						metaBox.addChild("%", "<BR />");
> +						metaBox.addChild("#", "Decompressed size: " + 
md.uncompressedDataLength() + " bytes");
> +					}
> +					metaBox.addChild("%", "<BR />");
> +
> +					metaBox.addChild("#", "Data size\u00a0=\u00a0" + md.dataLength());
> +					metaBox.addChild("%", "<BR />");
> +
> +					if (md.isResolved()) {
> +						metaBox.addChild("#", "Resolved URI:\u00a0=\u00a0" + 
md.getResolvedURI());
> +						metaBox.addChild("%", "<BR />");
> +					}
> +					contentNode.addChild(metaBox);
> +				}
> +
> +			}
> +
> +		}
> +
> +		return pageNode.generate();
> +	}
> +
> +	private HTMLNode createUriBox() {
> +		HTMLNode browseBox = m_pm.getInfobox("Explore a freenet key");
> +		HTMLNode browseContent = m_pm.getContentNode(browseBox);
> +		browseContent.addChild("#", "Display the top level chunk as hexprint");
> +		HTMLNode browseForm = 
m_pr.addFormChild(browseContent, "/plugins/plugins.KeyExplorer.KeyExplorer/", "uriForm");
> +		browseForm.addChild("#", "Freenetkey to explore: \u00a0 ");
> +		browseForm.addChild("input", new String[] { "type", "name", "size" }, new 
String[] { "text", "key", "70" });
> +		browseForm.addChild("#", "\u00a0");
> +		browseForm.addChild("input", new String[] { "type", "name", "value" }, 
new String[] { "submit", "debug", "Explore!" });
> +		return browseBox;
> +	}
> +
> +	private HTMLNode createErrorBox(String errmsg) {
> +		HTMLNode errorBox = m_pm.getInfobox("infobox-alert", "ERROR");
> +		errorBox.addChild("#", errmsg);
> +		return errorBox;
> +	}
> +
> +}
> 
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://emu.freenetproject.org/pipermail/devl/attachments/20071215/766e0a97/attachment.pgp 


More information about the Devl mailing list