Author: nextgens
Date: 2007-04-15 16:59:40 +0000 (Sun, 15 Apr 2007)
New Revision: 12751
Modified:
trunk/freenet/src/freenet/clients/http/PageMaker.java
trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
Log:
Implement #1279: Themes external to the jar
Now there is a fproxy.CSSOverride setting
Modified: trunk/freenet/src/freenet/clients/http/PageMaker.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/PageMaker.java 2007-04-15
15:49:00 UTC (rev 12750)
+++ trunk/freenet/src/freenet/clients/http/PageMaker.java 2007-04-15
16:59:40 UTC (rev 12751)
@@ -1,6 +1,9 @@
package freenet.clients.http;
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
@@ -15,6 +18,7 @@
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
+import freenet.l10n.L10n;
import freenet.support.HTMLNode;
import freenet.support.Logger;
@@ -24,6 +28,7 @@
private static final String DEFAULT_THEME = "clean";
private String theme;
+ private File override;
private final List navigationLinkTexts = new ArrayList();
private final List navigationLinkTextsNonFull = new ArrayList();
private final Map navigationLinkTitles = new HashMap();
@@ -37,6 +42,10 @@
setTheme(t);
}
+ void setOverride(File f) {
+ this.override = f;
+ }
+
void setTheme(String theme) {
if (theme == null) {
this.theme = DEFAULT_THEME;
@@ -79,16 +88,20 @@
public HTMLNode getPageNode(String title, boolean
renderNavigationLinks, ToadletContext ctx) {
boolean fullAccess = ctx == null ? false :
ctx.isAllowedFullAccess();
HTMLNode pageNode = new HTMLNode.HTMLDoctype("html",
"-//W3C//DTD XHTML 1.1//EN");
- HTMLNode htmlNode = pageNode.addChild("html", "xml:lang", "en");
+ HTMLNode htmlNode = pageNode.addChild("html", "xml:lang",
L10n.getSelectedLanguage());
HTMLNode headNode = htmlNode.addChild("head");
headNode.addChild("title", title + " - Freenet");
headNode.addChild("meta", new String[] { "http-equiv",
"content" }, new String[] { "Content-Type", "text/html; charset=utf-8" });
- headNode.addChild("link", new String[] { "rel", "href", "type",
"title" }, new String[] { "stylesheet", "/static/themes/" + theme +
"/theme.css", "text/css", theme });
+ if(override == null)
+ headNode.addChild("link", new String[] { "rel", "href",
"type", "title" }, new String[] { "stylesheet", "/static/themes/" + theme +
"/theme.css", "text/css", theme });
+ else
+ headNode.addChild(getOverrideContent());
List themes = getThemes();
for (Iterator themesIterator = themes.iterator();
themesIterator.hasNext();) {
String themeName = (String) themesIterator.next();
headNode.addChild("link", new String[] { "rel", "href",
"type", "media", "title" }, new String[] { "alternate stylesheet",
"/static/themes/" + themeName + "/theme.css", "text/css", "screen", themeName
});
}
+
HTMLNode bodyNode = htmlNode.addChild("body");
HTMLNode pageDiv = bodyNode.addChild("div", "id", "page");
HTMLNode topBarDiv = pageDiv.addChild("div", "id", "topbar");
@@ -201,4 +214,22 @@
return themes;
}
+ private HTMLNode getOverrideContent() {
+ HTMLNode result = new HTMLNode("style", "type", "text/css");
+ try {
+ FileInputStream fis = new FileInputStream(override);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ DataInputStream dis = new DataInputStream(bis);
+
+ result.addChild("#", DataInputStream.readUTF(dis));
+
+ dis.close();
+ bis.close();
+ fis.close();
+ } catch (IOException e) {
+ Logger.error(this, "Got an IOE: " + e.getMessage(), e);
+ }
+
+ return result;
+ }
}
Modified: trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
2007-04-15 15:49:00 UTC (rev 12750)
+++ trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java
2007-04-15 16:59:40 UTC (rev 12751)
@@ -24,20 +24,15 @@
import freenet.config.InvalidConfigValueException;
import freenet.config.SubConfig;
-import freenet.crypt.DummyRandomSource;
import freenet.io.AllowedHosts;
import freenet.io.NetworkInterface;
import freenet.node.NodeClientCore;
-import freenet.support.FileLoggerHook;
-import freenet.support.FileLoggerHook.IntervalParseException;
import freenet.support.Logger;
import freenet.support.OOMHandler;
import freenet.support.api.BooleanCallback;
import freenet.support.api.BucketFactory;
import freenet.support.api.IntCallback;
import freenet.support.api.StringCallback;
-import freenet.support.io.FilenameGenerator;
-import freenet.support.io.TempBucketFactory;
public class SimpleToadletServer implements ToadletContainer, Runnable {
@@ -57,6 +52,7 @@
final NetworkInterface networkInterface;
private final LinkedList toadlets;
private String cssName;
+ private File cssOverride;
private Thread myThread;
private boolean advancedModeEnabled;
private boolean fProxyJavascriptEnabled;
@@ -125,6 +121,27 @@
}
}
+ class FProxyCSSOverrideCallback implements StringCallback {
+
+ public String get() {
+ return (cssOverride == null ? "" :
cssOverride.toString());
+ }
+
+ public void set(String val) throws InvalidConfigValueException {
+ if(val.equals(get()) || val.equals(""))
+ cssOverride = null;
+ else {
+ File tmp = new File(val.trim());
+ if(!core.allowUploadFrom(tmp))
+ throw new
InvalidConfigValueException("We can't let you set that setting: \"" + tmp + "\"
isn't in a directory from which uploads are allowed!");
+ else if(!tmp.canRead() || !tmp.isFile())
+ throw new
InvalidConfigValueException("We can't read the given file! (" + val + ')');
+ cssOverride = tmp.getAbsoluteFile();
+ }
+ pageMaker.setOverride(cssOverride);
+ }
+ }
+
class FProxyEnabledCallback implements BooleanCallback {
public boolean get() {
@@ -246,6 +263,8 @@
new FProxyBindtoCallback());
fproxyConfig.register("css", "clean", configItemOrder++, false,
false, "SimpleToadletServer.cssName", "SimpleToadletServer.cssNameLong",
new FProxyCSSNameCallback());
+ fproxyConfig.register("CSSOverride", "", configItemOrder++,
true, false, "SimpleToadletServer.cssOverride",
"SimpleToadletServer.cssOverrideLong",
+ new FProxyCSSOverrideCallback());
fproxyConfig.register("advancedModeEnabled", false,
configItemOrder++, false, false, "SimpleToadletServer.advancedMode",
"SimpleToadletServer.advancedModeLong",
new FProxyAdvancedModeEnabledCallback(this));
fproxyConfig.register("javascriptEnabled", false,
configItemOrder++, false, false, "SimpleToadletServer.enableJS",
"SimpleToadletServer.enableJSLong",
@@ -288,6 +307,12 @@
this.advancedModeEnabled =
fproxyConfig.getBoolean("advancedModeEnabled");
pageMaker = new PageMaker(cssName);
+ if(!fproxyConfig.getOption("CSSOverride").isDefault()) {
+ cssOverride = new
File(fproxyConfig.getString("CSSOverride"));
+ pageMaker.setOverride(cssOverride);
+ } else
+ cssOverride = null;
+
toadlets = new LinkedList();
core.setToadletContainer(this); // even if not enabled, because
of config
@@ -300,18 +325,6 @@
myThread.setDaemon(true);
}
}
-
- public SimpleToadletServer(int i, String newbindTo, String
allowedHosts, BucketFactory bf, String cssName, NodeClientCore core) throws
IOException {
- this.port = i;
- this.bindTo = newbindTo;
- allowedFullAccess = new AllowedHosts(allowedHosts);
- this.bf = bf;
- this.networkInterface = NetworkInterface.create(port,
this.bindTo, allowedHosts);
- toadlets = new LinkedList();
- this.cssName = cssName;
- pageMaker = new PageMaker(cssName);
- this.core = core;
- }
public void start() {
if(myThread != null) {
@@ -345,30 +358,6 @@
}
return null;
}
-
- public static void main(String[] args) throws IOException,
IntervalParseException {
- File logDir = new File("logs-toadlettest");
- logDir.mkdir();
- FileLoggerHook logger = new FileLoggerHook(true, new File(logDir,
"test-1111").getAbsolutePath(),
- "d (c, t, p): m", "MMM dd, yyyy HH:mm:ss:SSS",
Logger.MINOR, false, true,
- 1024*1024*1024 /* 1GB of old compressed logfiles */);
- logger.setInterval("5MINUTES");
- Logger.setupChain();
- Logger.globalSetThreshold(Logger.MINOR);
- Logger.globalAddHook(logger);
- logger.start();
- SimpleToadletServer server = new SimpleToadletServer(1111,
"127.0.0.1", "127.0.0.1", new TempBucketFactory(new FilenameGenerator(new
DummyRandomSource(), true, new File("temp-test"), "test-temp-")), "aqua", null);
- server.register(new TrivialToadlet(null), "", true, false);
- server.start();
- System.out.println("Bound to port 1111.");
- while(true) {
- try {
- Thread.sleep(100000);
- } catch (InterruptedException e) {
- // Ignore
- }
- }
- }
public void run() {
try {
Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-04-15
15:49:00 UTC (rev 12750)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-04-15
16:59:40 UTC (rev 12751)
@@ -184,6 +184,8 @@
SimpleToadletServer.allowedHostsLong=May be a comma-separated list of single
IPs and CIDR masked IPs like 192.168.0.0/24.
SimpleToadletServer.allowedFullAccess=Hosts having a full access to Fproxy
(read warning)
SimpleToadletServer.allowedFullAccessLong=Hosts granted full access (i.e.
change config settings, restart, access hard disk, etc) to the node. WARNING:
Be very careful who you give full fproxy access to!
+SimpleToadletServer.cssOverride=Override the CSS with a custom one (WARNING!)
+SimpleToadletServer.cssOverrideLong=That setting allows you to override the
node's CSS with a custom file. WARNING: CSSes can be dangerous and won't be
filtered! use at your own risks. (consider mailing devl at freenetproject to
get it included in the main distribution ;) )
LogConfigHandler.enabled=Enable logging?
LogConfigHandler.enabledLong=Set to false to completely disable logging
LogConfigHandler.dirName=Logging directory