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


Reply via email to